summaryrefslogtreecommitdiff
path: root/jeu-test
diff options
context:
space:
mode:
authorDamien Appert <dappert>2010-09-12 09:42:01 +0000
committerDamien Appert <dappert>2010-09-12 09:42:01 +0000
commitc9f2bea22867f90e8e741504d67219cbcc261f88 (patch)
tree3666955d8afc54e6e8faa9da0825542a23f8ceb6 /jeu-test
parent6428b3ee1f7cefad0c9c8d238917901e1938153b (diff)
download2010-netlemmings-c9f2bea22867f90e8e741504d67219cbcc261f88.tar.gz
2010-netlemmings-c9f2bea22867f90e8e741504d67219cbcc261f88.tar.bz2
2010-netlemmings-c9f2bea22867f90e8e741504d67219cbcc261f88.zip
ajout d'un éditeur de niveau lemmings (1ere tentative :p)
git-svn-id: file:///var/svn/2010-netlemmings/trunk@11 077b3477-7977-48bd-8428-443f22f7bfda
Diffstat (limited to 'jeu-test')
-rw-r--r--jeu-test/lemmings_level_designer_source/ChangeLog7
-rw-r--r--jeu-test/lemmings_level_designer_source/copying.doc339
-rw-r--r--jeu-test/lemmings_level_designer_source/lem2tap.c234
-rw-r--r--jeu-test/lemmings_level_designer_source/lemmdes.txt138
-rw-r--r--jeu-test/lemmings_level_designer_source/tap2lem.c223
5 files changed, 941 insertions, 0 deletions
diff --git a/jeu-test/lemmings_level_designer_source/ChangeLog b/jeu-test/lemmings_level_designer_source/ChangeLog
new file mode 100644
index 0000000..e2626b2
--- /dev/null
+++ b/jeu-test/lemmings_level_designer_source/ChangeLog
@@ -0,0 +1,7 @@
+1999-11-10 Philip Kendall <pak21@cam.ac.uk>
+
+ * New version: now compiles on machines without itoa
+
+1997-07-18 Philip Kendall <pak21@cam.ac.uk>
+
+ * First version
diff --git a/jeu-test/lemmings_level_designer_source/copying.doc b/jeu-test/lemmings_level_designer_source/copying.doc
new file mode 100644
index 0000000..1839445
--- /dev/null
+++ b/jeu-test/lemmings_level_designer_source/copying.doc
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License. \ No newline at end of file
diff --git a/jeu-test/lemmings_level_designer_source/lem2tap.c b/jeu-test/lemmings_level_designer_source/lem2tap.c
new file mode 100644
index 0000000..68c858e
--- /dev/null
+++ b/jeu-test/lemmings_level_designer_source/lem2tap.c
@@ -0,0 +1,234 @@
+/* LEM2TAP.C: for converting a .LEM file and a .BMP file to a .TAP
+ file for use with the Spectrum version of Lemmings
+ Copyright (c) 1997,9 Philip Kendall
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Author contact information:
+
+ E-mail: pak21@cam.ac.uk (until at least June 2002)
+ Postal address: 15 Crescent Road, Wokingham, Berks, RG40 2DB, England
+
+*/
+
+#include <stdio.h> /* standard I/O routines */
+#include <stdlib.h> /* various standard routines */
+#include <string.h> /* string handling routines */
+
+#define BufLen 1024
+#define NameLen 32
+#define SkillNum 8
+#define HazardNum 10
+#define FNameLen 256
+#define BMPLen 8192
+#define LevelLen 8405
+
+int ReadBMP(char *FName,char *BMPData);
+void ReadLine(char *Buffer,FILE *f);
+unsigned int ReadInt(FILE *f);
+unsigned long ReadLong(FILE *f);
+
+int main(int argc, char** argv)
+{FILE *f;
+ char Buffer[BufLen],Name[NameLen+1],FName[FNameLen],*BMPData,*LevelData,*ptr;
+ unsigned Level,Rating,Number,Save,Rate,Time,Skills[SkillNum],StartX,StartY,
+ HomeX,HomeY,Colour,Hazard[HazardNum],HazardX[HazardNum],
+ HazardY[HazardNum],i,j;
+
+ if(argc<3)
+ {fprintf(stderr,"Usage: lem2tap filename.lem filename.tap\n"); return 2;}
+
+ f=fopen(argv[1],"rt");
+ if(ferror(f))
+ {fprintf(stderr,"Error opening %s for input\n",argv[1]); return 1;}
+
+ ReadLine(Buffer,f); sscanf(Buffer,"%u,%u",&Level,&Rating);
+ ReadLine(Buffer,f); sscanf(Buffer,"%u,%u",&Number,&Save);
+ ReadLine(Buffer,f); sscanf(Buffer,"%u",&Rate);
+ ReadLine(Buffer,f); sscanf(Buffer,"%u",&Time);
+ ReadLine(Buffer,f);
+ sscanf(Buffer,"%u,%u,%u,%u,%u,%u,%u,%u",&Skills[0],&Skills[1],&Skills[2],
+ &Skills[3],&Skills[4],&Skills[5],&Skills[6],&Skills[7]);
+ memset(Buffer,' ',NameLen); /* Fill Buffer with spaces */
+ ReadLine(Buffer,f); strncpy(Name,Buffer,NameLen); Name[NameLen]='\0';
+ ReadLine(Buffer,f);
+ sscanf(Buffer,"%u,%u,%u,%u",&StartX,&StartY,&HomeX,&HomeY);
+ ReadLine(Buffer,f); sscanf(Buffer,"%u",&Colour);
+ for(i=0;i<HazardNum;i++)
+ {ReadLine(Buffer,f);
+ sscanf(Buffer,"%u,%u,%u",&Hazard[i],&HazardX[i],&HazardY[i]);
+ }
+ ReadLine(Buffer,f); sscanf(Buffer,"%s",FName);
+
+ fclose(f);
+
+ BMPData=(char*)malloc(BMPLen);
+ if(!BMPData)
+ {fprintf(stderr,"Error allocating memory for BMPData\n"); return 3;}
+
+ if(ReadBMP(FName,BMPData)) {free(BMPData); return 6;}
+
+ LevelData=(char*)malloc(LevelLen);
+ if(!LevelData)
+ {fprintf(stderr,"Error allocating memory for LevelData\n");
+ free(BMPData); return 5;
+ }
+
+ f=fopen(argv[2],"ab");
+ if(ferror(f))
+ {fprintf(stderr,"Error opening %s for output\n",argv[2]);
+ free(BMPData); free(LevelData); return 4;
+ }
+
+ fputc(3,f); fputc(0,f); /* Length of the header */
+ fputc(0,f); /* Header ID byte */
+ fputc(Level,f); /* Level number */
+ fputc(Level,f); /* Checksum */
+
+ ptr=LevelData;
+ *ptr++=Level; /* Level number */
+ *ptr++=Number; /* Number of lemmings */
+ *ptr++=Rate; /* Initial/min release rate */
+ *ptr++=StartX%0x100; *ptr++=StartX/0x100;
+ *ptr++=StartY; /* Trapdoor position */
+ *ptr++=(Time-1); /* (Time available/min)-1 */
+ for(i=0;i<SkillNum;i++) *ptr++=Skills[i]; /* Skills available */
+ *ptr++=Colour; /* Level colours */
+ *ptr++=Save; /* Number to be saved */
+ *ptr++=HomeX%0x100; *ptr++=HomeX/0x100;
+ *ptr++=HomeY; /* Home position */
+ *ptr++=Rating; /* Level rating */
+ for(i=0;i<NameLen;i++) *ptr++=Name[i]; /* Level name */
+ for(i=0;i<HazardNum;i++) /* For each hazard: */
+ {*ptr++=Hazard[i]; /* Hazard type */
+ *ptr++=HazardX[i]%0x100; *ptr++=HazardX[i]/0x100;
+ *ptr++=HazardY[i]; /* and position */
+ }
+ for(i=0;i<120;i++) *ptr++='\0'; /* blank space */
+
+ /* finally, write out the graphics -- remember that the .BMP format has the
+ origin at the lower left corner, but we need the origin at the upper left
+ */
+ for(i=0;i<128;i++)
+ for(j=0;j<(512/8);j++)
+ *ptr++=BMPData[((127-i)*(512/8))+j];
+
+ /* Write out the prelims */
+ fputc((LevelLen+2)%0x100,f); fputc((LevelLen+2)/0x100,f); /* Length */
+ fputc(0xff,f); /* Datablock ID byte */
+
+ /* Calculate the checksum and write the level data out */
+ j=0xff; for(i=0;i<LevelLen;i++)
+ {j^=LevelData[i]; fputc(LevelData[i],f);}
+
+ /* Finally, write out the checksum */
+ fputc(j,f);
+
+ /* Close the file */
+ fclose(f);
+
+ /* Release memory */
+ free(BMPData); free(LevelData);
+
+ /* and go home :-) */
+ return 0;
+
+}
+
+int ReadBMP(char *FName,char *BMPData)
+{FILE *f; unsigned i; unsigned long l;
+ f=fopen(FName,"rb"); if(ferror(f))
+ {fprintf(stderr,"Unable to open %s for input\n",FName); return 1;}
+
+ i=ReadInt(f);
+ if( i != 'B' + 'M'*0x100 )
+ {fprintf(stderr,"Error: ID bytes are not \"BM\"\n");
+ fclose(f); return 2;
+ }
+ l=ReadLong(f);
+ if(l!=0x203e)
+ {fprintf(stderr,"Error: File size stored in %s is incorrect\n"
+ "Expected: 203eh; Found: %lxh\n",FName,l);
+ fclose(f); return 3;
+ }
+ l=ReadLong(f);
+ if(l) fprintf(stderr,"Warning: reserved bytes are non-zero\n");
+ l=ReadLong(f);
+ if(l!=0x3e)
+ {fprintf(stderr,"Error: Bitmap offset is incorrect\n"
+ "Expected: 3eh; Found: %lxh\n",l); fclose(f); return 4;}
+ l=ReadLong(f);
+ if(l!=40)
+ {fprintf(stderr,"Error: Size of the bitmap information is wrong\n"
+ "Expected: 40; Found: %lu\n",l); fclose(f); return 5;}
+ l=ReadLong(f);
+ if(l!=0x200)
+ {fprintf(stderr,"Error: Bitmap width is wrong\n"
+ "Expected: 0x200; Found: %lxh\n",l);
+ fclose(f); return 6;
+ }
+ l=ReadLong(f);
+ if(l!=0x80)
+ {fprintf(stderr,"Error: Bitmap height is wrong\n"
+ "Expected: 0x80; Found: %lxh\n",l);
+ fclose(f); return 7;
+ }
+ i=ReadInt(f);
+ if(i!=1)
+ {fprintf(stderr,"Error: Planes per pixel is wrong\n"
+ "Expected: 1; Found: %u\n",i); fclose(f); return 8;}
+ i=ReadInt(f);
+ if(i!=1)
+ {fprintf(stderr,"Error: Bits per pixel is wrong\n"
+ "Expected: 1; Found: %u\n",i); fclose(f); return 9;}
+ l=ReadLong(f);
+ if(l)
+ {fprintf(stderr,"Sorry -- Can't handle compressed images!\n");
+ fclose(f); return 10;
+ }
+ l=ReadLong(f);
+ if(l!=0x10000)
+ {fprintf(stderr,"Error: Number of pixels in image is wrong\n"
+ "Expected: 0x10000; Found: %lxh\n",l);
+ fclose(f); return 11;
+ }
+ fseek(f,8,SEEK_CUR); /* Skip pixels per metre */
+ l=ReadLong(f);
+ if(l!=2)
+ {fprintf(stderr,"Error: Number of colours used is wrong\n"
+ "Expected: 2; Found: %u\n",l); fclose(f); return 12;}
+ l=ReadLong(f);
+ if(l!=2)
+ {fprintf(stderr,"Error: Number of important colours is wrong\n"
+ "Expected: 2; Found: %u\n",l); fclose(f); return 13;}
+ fseek(f,8,SEEK_CUR); /* Skip colours */
+ fread(BMPData,BMPLen,1,f); /* Finally, actually read the data... */
+
+ fclose(f);
+
+ return 0;
+}
+
+void ReadLine(char *Buffer,FILE *f)
+{char *ptr=Buffer-1;
+ while( !ferror(f) && !feof(f) )
+ {*(++ptr)=fgetc(f); if(*ptr=='\n') break;}
+ *ptr='\0';
+}
+
+unsigned ReadInt(FILE *f) {return fgetc(f)+fgetc(f)*0x100;}
+
+unsigned long ReadLong(FILE *f)
+{return fgetc(f)+fgetc(f)*0x100+fgetc(f)*0x10000+fgetc(f)*0x1000000;}
diff --git a/jeu-test/lemmings_level_designer_source/lemmdes.txt b/jeu-test/lemmings_level_designer_source/lemmdes.txt
new file mode 100644
index 0000000..da6d5f9
--- /dev/null
+++ b/jeu-test/lemmings_level_designer_source/lemmdes.txt
@@ -0,0 +1,138 @@
+
+ Lemmings Level Designer
+ -------------------------
+
+ Copyright (c) 1997,9 Philip Kendall
+
+------------------------------------------------------------------------------
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+------------------------------------------------------------------------------
+
+0. Contents
+-----------
+
+ 1. Overview
+ 2. Tap2Lem
+ 3. Lem2Tap
+ 4. .lem Format
+ 5. Miscellaneous
+ 6. Author contact information
+ 7. Thanks
+
+1. Overview
+-----------
+
+ This set of two programs (Tap2Lem and Lem2Tap) are designed to allow you to
+ easily modify and create new levels for the ZX Spectrum version of Lemmings.
+ They work by converting between a .tap file (an image of a tape - this
+ format is used by many Spectrum emulators), a simple text file specifying
+ the information about the level (the .lem file) and a Windows bitmap (.bmp)
+ containing the graphics for the level.
+
+2. Tap2Lem
+----------
+
+ Syntax: Tap2Lem tapefile
+
+ Tap2Lem takes the .tap file given as tapefile, and for every Lemmings level
+ it finds within that file, it will output two files:
+
+ 1) levelnn.lem, where nn is the level number, which contains the
+ information on the level name, number of skills available, trapdoor and
+ home locations, etc. See Section 4 for a complete descripition of the .lem
+ format
+
+ 2) levelnn.bmp, a 512x128x2 Windows bitmap which contains the graphics for
+ the level.
+
+ Note that files already existing with the names given above will be
+ overwritten.
+
+3. Lem2Tap
+----------
+
+ Syntax: Lem2Tap textfile tapefile
+
+ Lem2Tap takes the .lem file given as textfile and using that (and the .bmp
+ file specified within it - see Section 4), appends the Lemmings level
+ specified to tapefile.
+
+ The .bmp file must be a 512x128x2 Windows bitmap; no other sizes or number
+ of colours are supported. Also, compressed bitmaps are not supported.
+
+4. .lem Format
+--------------
+
+ The .lem files used to specify the level information should be text files,
+ in your system's normal format for such files. How files which are not in
+ your system's normal format will depend on your compiler.
+
+ No blank lines are allowed in .lem files (except at the end and possibly if
+ you want a blank level name). Comments are permitted - these should begin
+ with a semicolon (;) and continue to the end of the line. Data items on the
+ same line should be separated with commas (,), and should be specified in
+ decimal.
+
+ 1st line: The level number and the rating of the level (1=Fun, 2=Tricky,
+ 3=Taxing, 4=Mayhem).
+ 2nd line: The number of lemmings are the number to be saved.
+ 3rd line: The initial (and minimum) release rate.
+ 4th line: The time in minutes available to finish the level.
+ 5th line: The number of each skill available (in the order climbers,
+ floaters, bombers, blockers, builders, bashers, miners, diggers)
+ 6th line: The level name (max 32 characters; only capitals, digits and
+ spaces will appear correctly). No comments are permitted within
+ the first 32 characters.
+ 7th line: The x and y locations of the trapdoor and home respectively.
+ 8th line: The colours used to display the levels (in standard Spectrum
+ attribute format - bit 7: flash, bit 6: bright, bits 5-3: paper
+ colour, bits 2-0: ink colour)
+ 9th-18th lines: The hazards on the level, one per line. Each line should
+ have three numbers: the hazard type (only 4, water, allowed)
+ and the x and y locations of the hazard.
+ 19th line: The name of the 512x128x2 Windows bitmap containing the level
+ graphics.
+
+5. Miscellaneous
+----------------
+
+ 1. The specification of the .tap file format can be found in either
+ FAQ for the comp.sys.sinclair newsgroup
+ (http://www.kendalls.demon.co.uk/cssfaq/).
+
+ 2. The Windows bitmap format, being a Microsoft format, isn't well
+ specified. Your best bet (and what I did) is to use a search engine with
+ something like "bmp format specification".
+
+ 3. Lemmings is available from
+ ftp://ftp.nvg.ntnu.no/pub/sinclair/tapes/l/lemmings.zip
+
+6. Author contact information
+-----------------------------
+
+ E-mail: pak21@cam.ac.uk (should last until at least June 2002)
+ Postal address: 15 Crescent Road, Wokingham, Berks, RG40 2DB, England
+
+7. Thanks
+---------
+
+ Darren Salt: for writing the first (and only) Lemmings editor that I found,
+ which inspired me to write this and also helped me to work out
+ the bits of the format which I hadn't done up to that point
+ (principally the hazards). Darren's editor is available from
+ ftp://ftp.nvg.unit.no/pub/sinclair/snaps/games/unsorted-new/
+ misc/DS_Own/LemmsEd.Z80.
diff --git a/jeu-test/lemmings_level_designer_source/tap2lem.c b/jeu-test/lemmings_level_designer_source/tap2lem.c
new file mode 100644
index 0000000..0d8c827
--- /dev/null
+++ b/jeu-test/lemmings_level_designer_source/tap2lem.c
@@ -0,0 +1,223 @@
+/* TAP2LEM.C: convert a .TAP file containing Lemmings levels to pairs
+ of .LEM and .BMP files
+ Copyright (c) 1997,9 Philip Kendall
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Author contact information:
+
+ E-mail: pak21@cam.ac.uk (until at least June 2002)
+ Postal address: 15 Crescent Road, Wokingham, Berks, RG40 2DB, England
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+const char *InFName="lemmings.tap";
+const unsigned LevelLen=8405;
+const char *OutFBase="level";
+const char *OutFExt1=".lem";
+const char *OutFExt2=".bmp";
+#define OutFLen 13
+#define BufLen 256
+const unsigned BMPHeight=128;
+const unsigned BMPWidth=512;
+
+const unsigned char BMPHeader[] = {
+
+0x42,0x4D,0x3E,0x20,0x00,0x00,0x00,0x00,
+0x00,0x00,0x3E,0x00,0x00,0x00,0x28,0x00,
+0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,
+0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
+0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0xFF,0xFF,0xFF,0x00
+
+};
+
+const unsigned BMPHeaderLen=sizeof(BMPHeader)/sizeof(unsigned char);
+
+int DoLevel(FILE *f);
+unsigned int ReadInt(FILE *f);
+unsigned long ReadLong(FILE *f);
+
+int main(int argc,char **argv)
+{FILE *f;
+
+ if(argc<2) {fprintf(stderr,"Syntax: tap2lem tapefile\n"); return 4;}
+
+ f=fopen(argv[1],"rb");
+ if(ferror(f))
+ {fprintf(stderr,"Error opening %s for input\n",argv[1]); return 1;}
+
+ while( !feof(f) && !ferror(f) ) if(DoLevel(f)) {fclose(f); return 2;}
+
+ if(ferror(f))
+ {fprintf(stderr,"Error reading from %s\n",InFName); fclose(f);
+ return 3;
+ }
+
+ fclose(f);
+
+ return 0;
+}
+
+int DoLevel(FILE *f)
+{unsigned Length,Good=0,i;
+ unsigned char ch,HLevel,*LevelData,CheckSum,OutFName[OutFLen],
+ OutFName2[OutFLen],Buffer[BufLen];
+ FILE *f2;
+
+ LevelData=(unsigned char*)malloc(LevelLen);
+ if(!LevelData)
+ {fprintf(stderr,"Not enough memory for LevelData\n"); return 1;}
+
+ /* For a Lemmings level, we're looking for a block of length 3 followed block
+ of length 8407
+ */
+
+ while(!Good && !feof(f) && !ferror(f))
+ {
+ /* If the first block doesn't have length 3, get the next block */
+ if((Length=ReadInt(f))!=3)
+ {if(!feof(f) && !ferror(f)) fseek(f,Length,SEEK_CUR); continue;}
+
+ /* If the flag byte isn't 00h (header), get the next block */
+ if((ch=fgetc(f))!=0)
+ {if(!feof(f) && !ferror(f)) fseek(f,2,SEEK_CUR); continue;}
+
+ /* Get the level number as stored in the header, and the checksum */
+ HLevel=fgetc(f); ch=fgetc(f);
+
+ /* See if the next block has the right length; if it has, assume we have
+ a Lemmings level */
+ if((Length=ReadInt(f))!=LevelLen+2)
+ {if(!feof(f) && !ferror(f)) fseek(f,Length,SEEK_CUR); continue;}
+
+ /* If header checksum is wrong, print a warning */
+ if(ch!=HLevel)
+ fprintf(stderr,"Warning: header checksum for level %u is wrong\n",
+ (unsigned)HLevel );
+
+ /* Read in the level data's flag byte, and give up if it is not 0xff */
+ if((ch=fgetc(f))!=0xff)
+ {if(!feof(f) && !ferror(f)) fseek(f,LevelLen+1,SEEK_CUR); continue;}
+
+ /* Read in the level data */
+ fread(LevelData,LevelLen,1,f);
+
+ /* Finally, read in the checksum */
+ CheckSum=fgetc(f); ch=0xff;
+ for(i=0;i<LevelLen;i++) ch^=LevelData[i];
+ if(ch!=CheckSum)
+ fprintf(stderr,"Warning: data checksum for level %u is wrong\n",
+ (unsigned)LevelData[0] );
+
+ /* And say we're happy with this level */
+ Good=1;
+
+ }
+
+ /* If we didn't find anything, return */
+ if(!Good) {free(LevelData); return 0;}
+
+ /* If the two level numbers don't match up, print a warning */
+ if(HLevel!=LevelData[0])
+ fprintf(stderr,"Warning: level numbers specified in header and in data"
+ "differ\n In header: %u\n In data: %u\nUsing %u\n",
+ (unsigned)HLevel,(unsigned)LevelData[0],(unsigned)LevelData[0] );
+
+ /* Set up the output filenames */
+ strcpy(OutFName,OutFBase);
+ if(LevelData[0]<10) strcat(OutFName,"0");
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x00]);
+ strcat(OutFName,Buffer); strcpy(OutFName2,OutFName);
+ strcat(OutFName,OutFExt1); strcat(OutFName2,OutFExt2);
+
+ /* Open the .LEM file */
+ f2=fopen(OutFName,"wt");
+ if(ferror(f2))
+ {fprintf(stderr,"Error opening %s for output\n",OutFName);
+ free(LevelData); return 2;
+ }
+
+ /* Buffer already contains the text version of the level number */
+ strcat(Buffer,","); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x14]); /* Rating */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x01]); /* Number of lemmings */
+ strcat(Buffer,","); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x10]); /* Number to save */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x02]); /* Initial release rate */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x06]+1); /* Time/minutes */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ for(i=0x07;i<=0x0e;i++) /* Skills */
+ {sprintf(Buffer,"%u",(unsigned)LevelData[i]);
+ strcat(Buffer,(i==0x0e?"\n":",")); fputs(Buffer,f2);
+ }
+ fwrite(&LevelData[0x15],32,1,f2); fputc('\n',f2); /* Level name */
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x04]*0x100+LevelData[0x03]);
+ strcat(Buffer,","); fputs(Buffer,f2); /* Trapdoor X */
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x05]); /* Trapdoor Y */
+ strcat(Buffer,","); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x12]*0x100+LevelData[0x11]);
+ strcat(Buffer,","); fputs(Buffer,f2); /* Home X */
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x13]); /* Home Y */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[0x0f]); /* Colours */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ for(i=0x35;i<0x5d;i+=4) /* Hazards */
+ {sprintf(Buffer,"%u",(unsigned)LevelData[i]); /* Type */
+ strcat(Buffer,","); fputs(Buffer,f2);
+ sprintf(Buffer,"%u",(unsigned)LevelData[i+2]*0x100+LevelData[i+1]);
+ strcat(Buffer,","); fputs(Buffer,f2); /* X */
+ sprintf(Buffer,"%u",(unsigned)LevelData[i+3]); /* Y */
+ strcat(Buffer,"\n"); fputs(Buffer,f2);
+ }
+ fputs(OutFName2,f2); /* .BMP file name */
+
+ fclose(f2);
+
+ /* Open the .BMP file */
+ f2=fopen(OutFName2,"wb");
+ if(ferror(f2))
+ {fprintf(stderr,"Error opening %s for output\n",OutFName2);
+ free(LevelData); return 3;
+ }
+
+ /* Write out the .BMP header */
+ for(i=0;i<BMPHeaderLen;i++) fputc(BMPHeader[i],f2);
+
+ /* And the data */
+ for(i=1;i<=BMPHeight;i++)
+ fwrite(&LevelData[0xd5+(BMPHeight-i)*(BMPWidth/8)],(BMPWidth/8),1,f2);
+
+ fclose(f2);
+
+ free(LevelData);
+
+ return 0;
+
+}
+
+unsigned ReadInt(FILE *f) {return fgetc(f)+fgetc(f)*0x100;}
+
+unsigned long ReadLong(FILE *f)
+{return fgetc(f)+fgetc(f)*0x100+fgetc(f)*0x10000+fgetc(f)*0x1000000;}