]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/MAPED/MAPED.C
cleaned up the repo from debugging watcom2 ^^
[16.git] / 16 / v2 / source / MAPED / MAPED.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 const char *const ME2_VERSION = "2.01a";\r
18 \r
19 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
20 // CHANGELOG:\r
21 // <vecna, may 14>\r
22 // + erased valloc(), replaced with a_memory.c\r
23 // + added Log() -- output to MAPED.LOG\r
24 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
25 \r
26 #include <dos.h>\r
27 #include <stdio.h>\r
28 \r
29 #include <malloc.h>\r
30 #include <stdlib.h>\r
31 #include <string.h>\r
32 #include <stdarg.h>\r
33 \r
34 #include "config.h"\r
35 #include "gui.h"\r
36 #include "keyboard.h"\r
37 #include "mikmod.h"\r
38 #include "mouse.h"\r
39 #include "render.h"\r
40 #include "timer.h"\r
41 #include "vdriver.h"\r
42 \r
43 #include "ssaver.h"\r
44 #include "smalfont.h"\r
45 #include "tilesel.h"\r
46 #include "minimap.h"\r
47 #include "guicomp.h"\r
48 #include "config.h"\r
49 \r
50 #define byte unsigned char\r
51 #define word unsigned short\r
52 \r
53 // Includes for a_memory.c\r
54 \r
55 void *valloc(int amount, char *desc, int owner);\r
56 void *qvalloc(int amount);\r
57 int  vfree(void *pointer);\r
58 void qvfree(void *pointer);\r
59 void FreeByOwner(int owner);\r
60 void MemReport(void);\r
61 void CheckCorruption(void);\r
62 \r
63 // ================================= Data ====================================\r
64 \r
65 typedef struct\r
66 {\r
67   unsigned short start;              // strand start\r
68   unsigned short finish;             // strand end\r
69   unsigned short delay;              // tile-switch delay\r
70   unsigned short mode;               // tile-animation mode\r
71 } vspanim_r;\r
72 \r
73 typedef struct\r
74 {\r
75   char pmultx,pdivx;                 // parallax multiplier/divisor for X\r
76   char pmulty,pdivy;                 // parallax multiplier/divisor for Y\r
77   unsigned short sizex, sizey;       // layer dimensions.\r
78   unsigned char trans, hline;        // transparency flag | hline (raster fx)\r
79 } layer_r;\r
80 \r
81 typedef struct\r
82 {\r
83   char name[40];                     // zone name/desc\r
84   unsigned short script;             // script to call thingy\r
85   unsigned short percent;            // chance of executing\r
86   unsigned short delay;              // step-delay\r
87   unsigned short aaa;                // Accept Adjacent Activation\r
88   unsigned short entityscript;       // script to call for entities\r
89 } zoneinfo;\r
90 \r
91 typedef struct\r
92 {\r
93   char zonename[16];                   // zone description\r
94   unsigned short int callevent;        // event number to call\r
95   unsigned char percent;               // chance (in 255) of event occurance\r
96   unsigned char delay;                 // step-delay before last occurance\r
97   unsigned char aaa;                   // accept adjacent activation\r
98   char savedesc[31];                   // savegame description\r
99 } oldzone;\r
100 \r
101 typedef struct\r
102 {\r
103   int x, y;                            // xwc, ywx position\r
104   word tx, ty;                         // xtc, ytc position\r
105   byte facing;                         // direction entity is facing\r
106   byte moving, movecnt;                // direction entity is moving\r
107   byte frame;                          // bottom-line frame to display\r
108   byte specframe;                      // special-frame set thingo\r
109   byte chrindex, reset;                // CHR index | Reset animation\r
110   byte obsmode1, obsmode2;             // can be obstructed | Is an obstruction\r
111   byte speed, speedct;                 // entity speed, speedcount :)\r
112   byte delayct;                        // animation frame-delay\r
113   char *animofs, *moveofs;             // anim script | move script\r
114   byte face, actm;                     // auto-face | activation mode\r
115   byte movecode, movescript;           // movement type | movement script\r
116   byte ctr, mode;                      // sub-tile move ctr, mode flag (internal)\r
117   word step, delay;                    // step, delay\r
118   word stepctr, delayctr;              // internal use counters\r
119   word data1, data2, data3;            //\r
120   word data4, data5, data6;            //\r
121   int  actscript;                      // activation script\r
122   int  expand1, expand2;               //\r
123   int  expand3, expand4;               //\r
124   char desc[20];                       // Entity description.\r
125 } entity_r;\r
126 \r
127 typedef struct\r
128 {\r
129   char t[60];\r
130 } chrlist_r;\r
131 \r
132 typedef struct\r
133 {\r
134   char t[200];\r
135 } movescript;\r
136 \r
137 typedef struct\r
138 {\r
139   unsigned short x;                    // xwc position\r
140   unsigned short y;                    // ywc position\r
141   unsigned char facing;                // direction entity is facing\r
142   unsigned char moving;                // direction entity is moving\r
143   unsigned char movcnt;                // how far left to move in this tile\r
144   unsigned char framectr;              // frame sequence counter\r
145   unsigned char specframe;             // special-frame set thingo\r
146   unsigned char chrindex, movecode;    // CHR index / movement pattern code\r
147   unsigned char activmode, obsmode;    // activation mode, obstruction mode\r
148   unsigned char v1,v2,v3;              // packing stuff.\r
149   unsigned int actscript, movescript;  // script references\r
150   unsigned char speed, speedct;        // entity speed, speedcount :)\r
151   unsigned short step, delay,          // Misc data entries\r
152                  data1, data2,         // More misc data\r
153                  data3, data4,         // yet more crappy misc data.\r
154                  delayct,adjactv;      // yet more internal crap\r
155   unsigned short x1,y1,x2,y2;          // bounding box coordinates\r
156   unsigned char curcmd, cmdarg;        // Script commands/arguments\r
157   unsigned char *scriptofs;            // offset in script parsing\r
158   unsigned char face,chasing,          // face player when activated | chasing\r
159                 chasespeed, chasedist; // chasing variables\r
160   unsigned short cx,cy;                // current-tile pos (moving adjusted)\r
161   int expand1;                         // always room for improvement\r
162   char entitydesc[20];                 // Editing description\r
163 } oldent_r;\r
164 \r
165 zoneinfo zones[256];                 // zone stuff.\r
166 layer_r layer[6];                    // Array of layer data\r
167 vspanim_r vspanim[100];              // tile animation data\r
168 unsigned short vadelay[100];         // Tile animation delay ctr\r
169 oldzone tzone;                       // zone for oldmap-to-v2 converting\r
170 entity_r entity[256];                // Entity records.\r
171 oldent_r oldent;                     // entity for oldmap-to-v2 converting\r
172 byte entities=0;                     // number of allocated entities.\r
173 chrlist_r chrlist[100];              // Max. 100 CHRs per map.\r
174 movescript ms[100];                  // move scripts arrays\r
175 byte nmchr=0;                        // number of active/loaded CHRs.\r
176 byte nms=0;                          // number of movement scripts\r
177 \r
178 char mapname[60];                    // MAP filename\r
179 char vspname[60];                    // VSP filemap\r
180 char rstring[20];                    // render-order string\r
181 char musname[60];                    // MAP default music\r
182 char numlayers;                      // number of layers in map\r
183 short xstart, ystart;                // MAP start locations\r
184 char *obstruct, *zone;               // obstruction and zone buffers\r
185 int numzones=0;                      // Number of active zones.\r
186 unsigned short *layers[6];           // Raw layer data\r
187 char wrap, soundokay=0;\r
188 \r
189 // -- vsp related data --\r
190 \r
191 unsigned short numtiles;             // number of allocated tiles in VSP\r
192 unsigned char *vsp;                  // VSP ptr\r
193 char vsp_locked=0;\r
194 char vsp_pw[8];\r
195 \r
196 // -- map compression\r
197 \r
198 char *cb,*csrc;                      // compression workspace buffer\r
199 int bufsize;                         // how many bytes need to be written\r
200 \r
201 // -- editing related data --\r
202 \r
203 int xwin=0, ywin=0;                  // Editing viewplane\r
204 short lt=0, rt=0;                    // left-button tile, right-button tile\r
205 char curzone=0;                      // current zone.\r
206 char scrollmode=0;                   // tile or pixel scroll modes.\r
207 char mouse_scroll=1;\r
208 char layertoggle[10];                // layer visible toggles\r
209 char el=0;                           // current editing layer.\r
210 char modified=0;                     // Current buffer modified or not.\r
211 \r
212 // -- music stuff --\r
213 \r
214 char is_playing=0;\r
215 char cmname[60];\r
216 UNIMOD *mf=0;\r
217 \r
218 // -- copy/paste & block fill --\r
219 \r
220 word *copybuf=0;\r
221 int copybuf_wide=0,copybuf_deep=0;\r
222 int selx1=0, sely1=0, selx2=0, sely2=0;\r
223 int shifted=0, pasting=0;\r
224 extern char curtrack;\r
225 \r
226 char vcedprog[80];\r
227 byte* translucency_table; //zero\r
228 \r
229 int moving_up=0,moving_down=0,moving_left=0,moving_right=0; // aen\r
230 \r
231 // ================================= Code ====================================\r
232 \r
233 //added by zero\r
234 void LoadTransTable()\r
235 {\r
236   FILE *fp;\r
237 \r
238   if (!translucency_table)\r
239     translucency_table=(byte *) valloc(65536,"trans tbl",0);\r
240 \r
241   fp=fopen("trans.tbl","rb");\r
242   if (!fp)\r
243   {\r
244     vfree(translucency_table);\r
245     translucency_table=0;\r
246     return;\r
247   }\r
248 \r
249   fread(translucency_table, 65536, 1, fp);\r
250   fclose(fp);\r
251 }\r
252 \r
253 int Exist(char *fname)\r
254 { FILE *tempf;\r
255 \r
256   tempf=fopen(fname,"rb");\r
257   if (tempf)\r
258   {\r
259      fclose(tempf);\r
260      return 1;\r
261   }\r
262   else return 0;\r
263 }\r
264 \r
265 void err(char *str, ...)\r
266 {\r
267    va_list argptr;\r
268    char msg[256];\r
269 \r
270    va_start(argptr, str);\r
271    vsprintf(msg, str, argptr);\r
272    va_end(argptr);\r
273 \r
274   ShutdownVideo();\r
275   ShutdownTimer();\r
276   ShutdownKeyboard();\r
277   //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
278                // Actually, Wat is by default case insensitive, so nyeh.;) <vec>\r
279   //if (curtrack != 1) //CD_Stop();\r
280 \r
281   printf("%s \n",msg);\r
282   exit(-1);\r
283 }\r
284 \r
285 void errf(char *str, char *str1)\r
286 {\r
287   sprintf(strbuf,str,str1);\r
288   err(strbuf);\r
289 }\r
290 \r
291 void errn(char *str, int n)\r
292 {\r
293   sprintf(strbuf,str,n);\r
294   err(strbuf);\r
295 }\r
296 \r
297 int random(int lo, int hi)\r
298 {\r
299   int range=hi-lo+1;\r
300   int i=rand() % range;\r
301   return i+lo;\r
302 }\r
303 \r
304 void PlayMusic(char *fname)\r
305 {\r
306   if (!soundokay) return;\r
307   if (is_playing)\r
308   {\r
309     MD_PlayStop();\r
310     ML_Free(mf);\r
311     is_playing=0;\r
312   }\r
313   mf=ML_LoadFN(fname);\r
314   if (!mf)\r
315   {\r
316     Message("Could not load specified music.",500);\r
317     return;\r
318   }\r
319   MP_Init(mf);\r
320   md_numchn=mf->numchn; mp_loop=1;\r
321   MD_PlayStart();\r
322   is_playing=1;\r
323 }\r
324 \r
325 void StopMusic()\r
326 {\r
327   if (!soundokay) return;\r
328   MD_PlayStop();\r
329   ML_Free(mf);\r
330   is_playing=0;\r
331 }\r
332 \r
333 void LoadVSP(char *fname)\r
334 { FILE *f;\r
335   short ver;\r
336 \r
337   if (!(f=fopen(fname,"rb")))\r
338      errf("VSP file %s not found.",fname);\r
339 \r
340   fread(&ver, 1, 2, f);\r
341   if (ver!=2 && ver!=3)\r
342      errf("VSP file %s is not the correct VSP format.",fname);\r
343   if (ver==2)\r
344   {\r
345     fread(&pal, 1, 768, f);\r
346     set_intensity(63);\r
347     fread(&numtiles, 1, 2, f);\r
348     vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
349     fread(vsp, 256, numtiles, f);\r
350     fread(&vspanim, 8, 100, f);\r
351     fclose(f);\r
352   }\r
353   if (ver==3)\r
354   {\r
355     fread(&pal, 1, 768, f);\r
356     set_intensity(63);\r
357     fread(&numtiles, 1, 2, f);\r
358     vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
359     fread(&bufsize, 1, 4, f);\r
360     ReadCompressedLayer1(vsp, 256*numtiles, f);\r
361     fread(&vspanim, 8, 100, f);\r
362     fclose(f);\r
363   }\r
364 }\r
365 \r
366 void SaveVSP(char *fname)\r
367 { FILE *f;\r
368   short ver;\r
369 \r
370   f=fopen(fname,"wb");\r
371   ver=3;\r
372   fwrite(&ver, 1, 2, f);\r
373   fwrite(&pal, 1, 768, f);\r
374   fwrite(&numtiles, 1, 2, f);\r
375   cb=(char *) valloc(numtiles*256, "vsp tempbuf", 0);\r
376   bufsize=0;\r
377   WriteCompressedLayer1(vsp, numtiles*256);\r
378   fwrite(&bufsize, 1, 4, f);\r
379   fwrite(cb, 1, bufsize, f);\r
380   //free(bufsize); // what the hell??? @_@\r
381   fwrite(&vspanim, 8, 100, f);\r
382   fclose(f);\r
383 }\r
384 \r
385 void EmitC (char c)\r
386 {\r
387   *csrc=c;\r
388   csrc++;\r
389   bufsize++;\r
390 }\r
391 \r
392 void EmitW (short int w)\r
393 {\r
394   char *ptr;\r
395 \r
396   ptr=(char *)&w;\r
397   *csrc=*ptr;\r
398   csrc++;\r
399   ptr++;\r
400   *csrc=*ptr;\r
401   csrc++;\r
402   bufsize+=2;\r
403 }\r
404 \r
405 void WriteCompressedLayer1(unsigned char *p, int len)\r
406 { int i;\r
407   unsigned char byt,samect;\r
408   unsigned char repcode;\r
409 \r
410   csrc=cb;\r
411   i=0; bufsize=0;\r
412   do\r
413   {   byt=p[i++];\r
414       samect=1;\r
415       while (samect<254 && i<len && byt==p[i])\r
416       {\r
417          samect++;\r
418          i++;\r
419       }\r
420       if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
421       if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
422       if (samect>3 || byt == 0xFF)\r
423       {\r
424          repcode=0xFF;\r
425          EmitC(repcode);\r
426          repcode=(char) samect;\r
427          EmitC(repcode);\r
428       }\r
429       EmitC(byt);\r
430   } while (i<len);\r
431 }\r
432 \r
433 void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f)\r
434 { int j,n;\r
435   unsigned char run;\r
436   unsigned char w;\r
437 \r
438   n=0;\r
439   do\r
440   {\r
441      fread(&w, 1, 1, f);\r
442      if (w==0xFF)\r
443      {\r
444          fread(&run, 1, 1, f);\r
445          fread(&w, 1, 1, f);\r
446          for (j=0; j<run; j++)\r
447              dest[n+j]=w;\r
448          n+=run;\r
449      }\r
450      else\r
451       {\r
452          dest[n]=w;\r
453          n++;\r
454       }\r
455   } while (n<len);\r
456 }\r
457 \r
458 void WriteCompressedLayer2(unsigned short *p,int len)\r
459 { int i;\r
460   unsigned short byt,samect;\r
461   unsigned char repcode;\r
462 \r
463   csrc=cb;\r
464   i=0; bufsize=0;\r
465   do\r
466   {   byt=p[i++];\r
467       samect=1;\r
468       while (samect<255 && i<len && byt==p[i])\r
469       {\r
470          samect++;\r
471          i++;\r
472       }\r
473       if (samect>1)\r
474       {\r
475          repcode=(char) samect;\r
476          EmitC(repcode);\r
477          repcode=0xFF;\r
478          EmitC(repcode);\r
479       }\r
480       EmitW(byt);\r
481   } while (i<len);\r
482 }\r
483 \r
484 void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f)\r
485 { int j,n;\r
486   unsigned char run;\r
487   unsigned short w;\r
488 \r
489   n=0;\r
490   do\r
491   {\r
492      fread(&w, 1, 2, f);\r
493      if ((w & 0xFF00)==0xFF00)\r
494      {\r
495         run=(char) (w & 0x00FF);\r
496         fread(&w, 1, 2, f);\r
497         for (j=0; j<run; j++)\r
498             dest[n+j]=w;\r
499         n+=run;\r
500      }\r
501      else\r
502      {\r
503         dest[n]=w;\r
504         n++;\r
505      }\r
506   } while (n<len);\r
507 }\r
508 \r
509 void CountUsedZones()\r
510 { int i;\r
511 \r
512   i=255;\r
513   while (i)\r
514   {\r
515      if (zones[i].script) break;\r
516      if (zones[i].percent) break;\r
517      if (zones[i].delay) break;\r
518      if (zones[i].aaa) break;\r
519      if (zones[i].entityscript) break;\r
520      if (strlen(zones[i].name)) break;\r
521      i--;\r
522   }\r
523   numzones=i+1;\r
524 }\r
525 \r
526 void CountMoveScripts()\r
527 { int i;\r
528 \r
529   i=99;\r
530   while (i)\r
531   {\r
532      if (strlen(ms[i].t)) break;\r
533      i--;\r
534   }\r
535   nms=i+1;\r
536 }\r
537 \r
538 void CountCHRs()\r
539 { int i;\r
540 \r
541   i=99;\r
542   while (i)\r
543   {\r
544      if (strlen(chrlist[i].t)) break;\r
545      i--;\r
546   }\r
547   nmchr=i+1;\r
548 }\r
549 \r
550 void SaveMAP(char *fname)\r
551 { FILE *f;\r
552   int i, ofstbl[100], ct, t;\r
553 \r
554   memcpy(strbuf, "MAPù5", 6);\r
555   f=fopen(fname, "wb");\r
556   fwrite(strbuf, 1, 6, f);\r
557   fwrite(strbuf, 1, 4, f);\r
558   fwrite(vspname, 1, 60, f);\r
559   fwrite(musname, 1, 60, f);\r
560   fwrite(rstring, 1, 20, f);\r
561   fwrite(&xstart, 1, 2, f);\r
562   fwrite(&ystart, 1, 2, f);\r
563   fwrite(&wrap, 1, 1, f);\r
564   fwrite(strbuf, 1, 50, f);\r
565   fwrite(&numlayers, 1, 1, f);\r
566   for (i=0; i<numlayers; i++)\r
567       fwrite(&layer[i], 1, 12, f);\r
568 \r
569   for (i=0; i<numlayers; i++)\r
570   {\r
571      cb=(char *) valloc(layer[i].sizex*layer[i].sizey*2,"cmprs buf", 0);\r
572      WriteCompressedLayer2(layers[i],(layer[i].sizex*layer[i].sizey));\r
573      fwrite(&bufsize, 1, 4, f);\r
574      fwrite(cb, 1, bufsize, f);\r
575      vfree(cb);\r
576   }\r
577   // Compress and write Obstruction data\r
578 \r
579   cb=(char *) valloc(layer[0].sizex*layer[0].sizey*2, "cmprs buf", 0);\r
580   WriteCompressedLayer1(obstruct, (layer[0].sizex*layer[0].sizey));\r
581   fwrite(&bufsize, 1, 4, f);\r
582   fwrite(cb, 1, bufsize, f);\r
583   WriteCompressedLayer1(zone, (layer[0].sizex*layer[0].sizey));\r
584   fwrite(&bufsize, 1, 4, f);\r
585   fwrite(cb, 1, bufsize, f);\r
586   vfree(cb);\r
587 \r
588   CountUsedZones();\r
589   fwrite(&numzones, 1, 4, f);\r
590   fwrite(&zones, numzones, 50, f);\r
591 \r
592   CountCHRs();\r
593   fwrite(&nmchr, 1, 1, f);\r
594   fwrite(&chrlist, 60, nmchr, f);\r
595 \r
596   fwrite(&entities, 1, 1, f);\r
597   fwrite(&entity, sizeof(entity)/256, entities, f);\r
598 \r
599   CountMoveScripts();\r
600   fwrite(&nms, 1, 1, f);     // Calc offset buffer\r
601   ct=0;\r
602   for (i=0; i<nms; i++)\r
603   {\r
604     ofstbl[i]=ct;\r
605     t=strlen(&ms[i].t)+1;\r
606     ct+=t;\r
607   }\r
608   fwrite(&ct, 1, 4, f);        // string table length\r
609   fwrite(&ofstbl, nms, 4, f);  // write offset buffer\r
610   for (i=0; i<nms; i++)        // write string table\r
611   {\r
612     fwrite(&ms[i].t, 1, strlen(&ms[i].t)+1, f);\r
613   }\r
614 \r
615   ct=0;  // 0 Things\r
616   fwrite(&ct, 1, 4, f);\r
617   ct=ftell(f);\r
618 \r
619   i=1; fwrite(&i, 1, 4, f);\r
620   i=0; fwrite(&i, 1, 4, f);\r
621   i=1; fwrite(&i, 1, 4, f);\r
622   i=9; fwrite(&i, 1, 1, f);\r
623 \r
624   fseek(f,6,0);\r
625   fwrite(&ct, 1, 4, f);\r
626   fclose(f);\r
627 }\r
628 \r
629 void LoadOldMAP(FILE *f)\r
630 { int i, j, ct, ofstbl[100];\r
631   char pm,pd,pc,c;\r
632 \r
633   // Reads a VERGE 1 format version 4 MAP file.\r
634   fseek(f, 1, 0);\r
635   fread(&vspname, 1, 13, f);\r
636   fread(&musname, 1, 13, f);\r
637   fread(&pc, 1, 1, f);             // }\r
638   fread(&pm, 1, 1, f);             // } Parallax controls\r
639   fread(&pd, 1, 1, f);             // }\r
640   fread(strbuf, 1, 32, f);         // unused - misc\r
641   fread(&xstart, 1, 2, f);\r
642   fread(&ystart, 1, 2, f);\r
643   fread(strbuf, 1, 2, f);          // unused - misc\r
644   fread(&layer[0].sizex, 1, 2, f);\r
645   fread(&layer[0].sizey, 1, 2, f);\r
646   layer[1].sizex=layer[0].sizex;\r
647   layer[1].sizey=layer[0].sizey;\r
648   fread(strbuf, 1, 28, f);         // unused - header pad\r
649 \r
650   layers[0]=(unsigned short *) valloc((layer[0].sizex*(layer[0].sizey+1)*2)+2, "layer data", 0);\r
651   layers[1]=(unsigned short *) valloc((layer[1].sizex*(layer[1].sizey+1)*2)+2, "layer data", 1);\r
652    obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct map", 0);\r
653        zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
654          cb=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "comprs buf", 0);\r
655 \r
656   fread(layers[0], 2, layer[0].sizex * layer[0].sizey, f);\r
657   fread(layers[1], 2, layer[1].sizex * layer[1].sizey, f);\r
658   fread(cb,        1, layer[0].sizex * layer[0].sizey, f);\r
659 \r
660   // Convert MAP Properties layer to respective Zone and Obstruction layers\r
661 \r
662   for (j=0; j<layer[0].sizey; j++)\r
663     for (i=0; i<layer[0].sizex; i++)\r
664     {\r
665       if ((cb[(j*layer[0].sizex)+i] & 1)==1)\r
666          c=1; else c=0;\r
667        obstruct[(j*layer[0].sizex)+i]=c;\r
668        c=cb[(j*layer[0].sizex)+i] >> 1;\r
669        zone[(j*layer[0].sizex)+i]=c;\r
670     }\r
671   vfree(cb);\r
672 \r
673   // Load and convert zone data records.\r
674 \r
675   for (i=0; i<128; i++)\r
676   {\r
677     fread(&tzone, 1, sizeof tzone, f);\r
678     zones[i].script=tzone.callevent;\r
679     zones[i].percent=tzone.percent;\r
680     zones[i].delay=tzone.delay;\r
681     zones[i].aaa=tzone.aaa;\r
682     zones[i].entityscript=0;\r
683     memcpy(zones[i].name, tzone.zonename, 16);\r
684   }\r
685 \r
686   for (i=0; i<100; i++)                  // Load and convert CHR list\r
687     fread(&chrlist[i].t, 1, 13, f);\r
688 //  DoCHRdealy();\r
689 \r
690   fread(&entities, 1, 1, f); fseek(f, 3, 1);\r
691   memset(&entity, 0, sizeof entity);\r
692   for (i=0; i<entities; i++)             // Load and convert entity records\r
693   {\r
694     fread(&oldent, 1, 88, f);\r
695     entity[i].x=oldent.x;\r
696     entity[i].y=oldent.y;\r
697     entity[i].chrindex=oldent.chrindex-5;\r
698     entity[i].obsmode1=oldent.obsmode^1;\r
699     entity[i].obsmode2=1;\r
700     entity[i].movecode=oldent.movecode;\r
701     if (entity[i].movecode==3) entity[i].movecode=2;\r
702     else if (entity[i].movecode==2) entity[i].movecode=3;\r
703     entity[i].speed=oldent.speed;\r
704     entity[i].face=oldent.face;\r
705     entity[i].actm=oldent.activmode;\r
706     entity[i].movescript=oldent.movescript;\r
707     entity[i].step=oldent.step;\r
708     entity[i].delay=oldent.delay;\r
709     entity[i].data2=0;\r
710     entity[i].data3=0;\r
711     entity[i].data5=0;\r
712     entity[i].data6=0;\r
713     entity[i].actscript=oldent.actscript;\r
714     if (entity[i].movecode==2) entity[i].data2=oldent.data3;\r
715     if (entity[i].movecode==3)\r
716     {\r
717       entity[i].data2=oldent.x1;\r
718       entity[i].data3=oldent.y1;\r
719       entity[i].data5=oldent.x2;\r
720       entity[i].data6=oldent.y2;\r
721     }\r
722     memcpy(entity[i].desc, oldent.entitydesc, 20);\r
723   }\r
724 \r
725   fread(&nms, 1, 1, f);\r
726   fread(&ct, 1, 4, f);\r
727   fread(&ofstbl, nms, 4, f);\r
728   ofstbl[nms]=ct;\r
729   for (i=0; i<nms; i++)\r
730    fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
731   fclose(f);\r
732 \r
733   numlayers=2;\r
734   layertoggle[0]=1; layertoggle[1]=1; layertoggle[2]=0; layertoggle[3]=0;\r
735   layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
736   memcpy(rstring,"1E2",3);\r
737   switch (pc)\r
738   {\r
739     case 0:\r
740     case 1: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
741             layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
742     case 2: layer[0].pmultx=pm; layer[0].pmulty=pm; layer[0].pdivx=pd; layer[0].pdivy=pd;\r
743             layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
744     case 3: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
745             layer[1].pmultx=pm; layer[1].pmulty=pm; layer[1].pdivx=pd; layer[1].pdivy=pd; break;\r
746   }\r
747 \r
748   LoadVSP(vspname);\r
749   sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
750   Message(strbuf,700);\r
751   Message("Old VERGE format 4 MAP loaded.",300);\r
752   if (strlen(musname))\r
753     PlayMusic(musname);\r
754 }\r
755 \r
756 void LoadMAP(char *fname)\r
757 { FILE *f;\r
758   int i, ct, ofstbl[100];\r
759 \r
760   memcpy(strbuf, "MAPù5", 6);\r
761   if (!(f=fopen(fname, "rb"))) errf("Could not find %s.",fname);\r
762   fread(strbuf, 1, 6, f);\r
763   if (strcmp(strbuf,"MAPù5"))\r
764   {\r
765      if (strbuf[0]==4)\r
766      {\r
767         LoadOldMAP(f);\r
768         return;\r
769      }\r
770      errf("%s is not a recognized MAP file.",fname);\r
771   }\r
772 \r
773   fread(&i, 1, 4, f);\r
774   fread(vspname, 1, 60, f);\r
775   fread(musname, 1, 60, f);\r
776   fread(rstring, 1, 20, f);\r
777   fread(&xstart, 1, 2, f);\r
778   fread(&ystart, 1, 2, f);\r
779   fread(&wrap, 1, 1, f);\r
780   fread(strbuf, 1, 50, f);\r
781   fread(&numlayers, 1, 1, f);\r
782   for (i=0; i<numlayers; i++)\r
783       fread(&layer[i], 1, 12, f);\r
784 \r
785   for (i=0; i<numlayers; i++)\r
786   {\r
787      fread(&bufsize, 1, 4, f);\r
788      layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "layer data", i);\r
789      ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey),f);\r
790      layertoggle[i]=1;\r
791   }\r
792   while (i<10)\r
793   {\r
794      layertoggle[i]=0;\r
795      i++;\r
796   }\r
797   obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2),"obstruct map", 0);\r
798   zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
799 \r
800   fread(&bufsize, 1, 4, f);\r
801   ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), f);\r
802   fread(&bufsize, 1, 4, f);\r
803   ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), f);\r
804 \r
805   memset(&zones, 0, sizeof zones);\r
806   fread(&numzones, 1, 4, f);\r
807   fread(&zones, numzones, 50, f);\r
808 \r
809   memset(&chrlist, 0, sizeof chrlist);\r
810   fread(&nmchr, 1, 1, f);\r
811   fread(&chrlist, 60, nmchr, f);\r
812 //  DoCHRdealy();\r
813 \r
814   fread(&entities, 1, 1, f);\r
815   fread(&entity, sizeof(entity)/256, entities, f);\r
816 \r
817   fread(&nms, 1, 1, f);\r
818   fread(&ct, 1, 4, f);\r
819   fread(&ofstbl, nms, 4, f);\r
820   ofstbl[nms]=ct;\r
821   for (i=0; i<nms; i++)\r
822     fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
823   fclose(f);\r
824 \r
825   LoadVSP(vspname);\r
826   sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
827   Message(strbuf,700);\r
828   Message("V2 MAP loaded.",300);\r
829   if (strlen(musname))\r
830     PlayMusic(musname);\r
831 }\r
832 \r
833 void InitTileIDX()\r
834 { short i;\r
835 \r
836   memset(vadelay, 0, 200);\r
837   for (i=0; i<MAXTILES; i++)\r
838       tileidx[i]=i;\r
839 }\r
840 \r
841 void CheckTimerStuff()\r
842 { static inss=0;\r
843 \r
844   if (backupct>30000)\r
845   {\r
846     Message("Generating Auto-backup",150);\r
847     SaveMAP("$$BACKUP.MAP");\r
848     SaveVSP("$$BACKUP.VSP");\r
849     backupct=0;\r
850   }\r
851   if (idlect>8000 && !inss)\r
852   {\r
853     inss=1;\r
854     ScreenSaver();\r
855     idlect=0;\r
856     inss=0;\r
857   }\r
858 }\r
859 \r
860 extern int difficulty;\r
861 \r
862 void SaveNewCFG()\r
863 { FILE *f;\r
864 \r
865   f=fopen("maped.cfg","w");\r
866   //if (nocdaudio) fprintf(f,"nocdaudio\n");\r
867   fprintf(f,"vidmode %d \n", vm);\r
868   fprintf(f,"pad %d \n", pad);\r
869   fprintf(f,"scrollmode %d \n",scrollmode);\r
870   fprintf(f,"mouse_scroll %d \n",mouse_scroll&1); // aen\r
871   fprintf(f,"black %d \n",black);\r
872   fprintf(f,"white %d \n",brightw);\r
873   fprintf(f,"winbg %d \n",winbg);\r
874   fprintf(f,"shadow %d \n",darkw);\r
875   fprintf(f,"darkred %d \n",darkred);\r
876   fprintf(f,"titlebg %d \n",titlebg);\r
877   fprintf(f,"th %d \n", th);\r
878   fprintf(f,"mh %d \n", mh);\r
879   fprintf(f,"md_device %d \n", md_device==3?3:0);\r
880   fprintf(f,"amxofs %d \n",amxofs);\r
881   fprintf(f,"amyofs %d \n",amyofs);\r
882   fprintf(f,"mmxofs %d \n",mmxofs);\r
883   fprintf(f,"mmyofs %d \n",mmyofs);\r
884   fprintf(f,"cnxofs %d \n",cnxofs);\r
885   fprintf(f,"cnyofs %d \n",cnyofs);\r
886   fprintf(f,"lmxofs %d \n",lmxofs);\r
887   fprintf(f,"lmyofs %d \n",lmyofs);\r
888   fprintf(f,"lvxofs %d \n",lvxofs);\r
889   fprintf(f,"lvyofs %d \n",lvyofs);\r
890   fprintf(f,"mpxofs %d \n",mpxofs);\r
891   fprintf(f,"mpyofs %d \n",mpyofs);\r
892   fprintf(f,"vaxofs %d \n",vaxofs);\r
893   fprintf(f,"vayofs %d \n",vayofs);\r
894   fprintf(f,"zexofs %d \n",zexofs);\r
895   fprintf(f,"zeyofs %d \n",zeyofs);\r
896   fprintf(f,"exofs %d \n",exofs);\r
897   fprintf(f,"eyofs %d \n",eyofs);\r
898   fprintf(f,"prxofs %d \n",prxofs);\r
899   fprintf(f,"pryofs %d \n",pryofs);\r
900   fprintf(f,"rsxofs %d \n",rsxofs);\r
901   fprintf(f,"rsyofs %d \n",rsyofs);\r
902   fprintf(f,"vced %s \n",vcedprog);\r
903   fprintf(f,"difficulty %d \n",difficulty);\r
904   fclose(f);\r
905 }\r
906 \r
907 #include "controls.c"\r
908 \r
909 void ShellToDOS()\r
910 {\r
911   ShutdownVideo();\r
912   ShutdownKeyboard();\r
913   ShutdownTimer();\r
914   MD_PlayStop();\r
915   MD_Exit();\r
916 \r
917   system("COMMAND.COM");\r
918 \r
919   if (!MD_Init())\r
920   {\r
921     printf("Couldn't initialize sound: %s.\n", myerr);\r
922     delay(500);\r
923     soundokay=0;\r
924   }\r
925   if (strlen(musname)) PlayMusic(musname);\r
926   InitVideo(vm);\r
927   set_intensity(63);\r
928   InitMouse();\r
929   InitKeyboard();\r
930   InitTimer();\r
931 }\r
932 \r
933 void ShellVERGE()\r
934 {\r
935   ShutdownVideo();\r
936   ShutdownKeyboard();\r
937   ShutdownTimer();\r
938   MD_PlayStop();\r
939   MD_Exit();\r
940 \r
941   system("VERGE");\r
942 \r
943   if (!MD_Init())\r
944   {\r
945     printf("Couldn't initialize sound: %s.\n", myerr);\r
946     delay(500);\r
947     soundokay=0;\r
948   }\r
949   if (strlen(musname)) PlayMusic(musname);\r
950   InitVideo(vm);\r
951   set_intensity(63);\r
952   InitMouse();\r
953   InitKeyboard();\r
954   InitTimer();\r
955 }\r
956 \r
957 void ShellMAP()\r
958 {\r
959   ShutdownVideo();\r
960   ShutdownKeyboard();\r
961   ShutdownTimer();\r
962   MD_PlayStop();\r
963   MD_Exit();\r
964 \r
965   sprintf(strbuf,"verge %s",mapname);\r
966   system(strbuf);\r
967 \r
968   if (!MD_Init())\r
969   {\r
970     printf("Couldn't initialize sound: %s.\n", myerr);\r
971     delay(500);\r
972     soundokay=0;\r
973   }\r
974   if (strlen(musname)) PlayMusic(musname);\r
975   InitVideo(vm);\r
976   set_intensity(63);\r
977   InitMouse();\r
978   InitKeyboard();\r
979   InitTimer();\r
980 }\r
981 \r
982 void ShellEditMAP()\r
983 {\r
984   char fn[80],*p;\r
985 \r
986   key[SCAN_ALT]=0;\r
987   key[SCAN_V]=0;\r
988   ShutdownVideo();\r
989   ShutdownKeyboard();\r
990   ShutdownTimer();\r
991   MD_PlayStop();\r
992   MD_Exit();\r
993 \r
994   sprintf(fn,"%s",mapname);\r
995   p=fn;\r
996   while (*p)\r
997   {\r
998     if (*p=='.') *p=0;\r
999     p++;\r
1000   }\r
1001   sprintf(strbuf,"%s %s.vc", vcedprog, fn);\r
1002   system(strbuf);\r
1003 \r
1004   if (!MD_Init())\r
1005   {\r
1006     printf("Couldn't initialize sound: %s.\n", myerr);\r
1007     delay(500);\r
1008     soundokay=0;\r
1009   }\r
1010   if (strlen(musname)) PlayMusic(musname);\r
1011   InitVideo(vm);\r
1012   set_intensity(63);\r
1013   InitMouse();\r
1014   InitKeyboard();\r
1015   InitTimer();\r
1016 }\r
1017 \r
1018 void ShellEditSystem()\r
1019 {\r
1020   key[SCAN_ALT]=0;\r
1021   key[SCAN_S]=0;\r
1022   ShutdownVideo();\r
1023   ShutdownKeyboard();\r
1024   ShutdownTimer();\r
1025   MD_PlayStop();\r
1026   MD_Exit();\r
1027 \r
1028   sprintf(strbuf,"%s system.vc", vcedprog);\r
1029   system(strbuf);\r
1030 \r
1031   if (!MD_Init())\r
1032   {\r
1033     printf("Couldn't initialize sound: %s.\n", myerr);\r
1034     delay(500);\r
1035     soundokay=0;\r
1036   }\r
1037   if (strlen(musname)) PlayMusic(musname);\r
1038   InitVideo(vm);\r
1039   set_intensity(63);\r
1040   InitMouse();\r
1041   InitKeyboard();\r
1042   InitTimer();\r
1043 }\r
1044 \r
1045 char s[256];\r
1046 \r
1047 void CompileAll()\r
1048 {\r
1049   FILE *f;\r
1050   char *p;\r
1051 \r
1052   MD_PlayStop();\r
1053   MD_Exit();\r
1054 \r
1055   sprintf(strbuf,"vcc all q",mapname);\r
1056   system(strbuf);\r
1057 \r
1058   if (!MD_Init())\r
1059   {\r
1060     printf("Couldn't initialize sound: %s.\n", myerr);\r
1061     delay(500);\r
1062     soundokay=0;\r
1063   }\r
1064   if (strlen(musname)) PlayMusic(musname);\r
1065 \r
1066   if (!(f=fopen("error.txt","r")))\r
1067   {\r
1068     Message("All VC scripts sucessfully compiled.",300);\r
1069     return;\r
1070   }\r
1071 \r
1072   fgets(s,99,f);\r
1073   fclose(f);\r
1074   p=s;\r
1075   while (*p)\r
1076   {\r
1077     if (*p==13 || *p==10) *p=0;\r
1078     p++;\r
1079   }\r
1080   VCNotify(s);\r
1081 }\r
1082 \r
1083 void CompileMAP()\r
1084 {\r
1085   FILE *f;\r
1086   char *p;\r
1087 \r
1088   MD_PlayStop();\r
1089   MD_Exit();\r
1090 \r
1091   sprintf(strbuf,"vcc %s q",mapname);\r
1092   system(strbuf);\r
1093 \r
1094   if (!MD_Init())\r
1095   {\r
1096     printf("Couldn't initialize sound: %s.\n", myerr);\r
1097     delay(500);\r
1098     soundokay=0;\r
1099   }\r
1100   if (strlen(musname)) PlayMusic(musname);\r
1101 \r
1102   if (!(f=fopen("error.txt","r"))) return;\r
1103 \r
1104   fgets(s,99,f);\r
1105   fclose(f);\r
1106   p=s;\r
1107   while (*p)\r
1108   {\r
1109     if (*p==13 || *p==10) *p=0;\r
1110     p++;\r
1111   }\r
1112   VCNotify(s);\r
1113 }\r
1114 \r
1115 void tickhandler(void)\r
1116 {\r
1117   MP_HandleTick();\r
1118   MD_SetBPM(mp_bpm);\r
1119 }\r
1120 \r
1121 void RenderHighlight()\r
1122 { int zx, zy;\r
1123   int xw, yw;\r
1124 \r
1125   if (mh)\r
1126   {\r
1127     xw=xwin&15;\r
1128     yw=ywin&15;\r
1129     zx=((mx+xw)&~15)-xw;\r
1130     zy=((my+yw)&~15)-yw;\r
1131 \r
1132     DrawHighlight(zx-1, zy-1);\r
1133   }\r
1134 }\r
1135 \r
1136 int EntityThere(int xw, int yw)\r
1137 { int i;\r
1138 \r
1139   for (i=0; i<entities; i++)\r
1140   {\r
1141     if (entity[i].x==xw && entity[i].y==yw) return i+1;\r
1142   }\r
1143   return 0;\r
1144 }\r
1145 \r
1146 void AllocateEntity(int xw, int yw)\r
1147 {\r
1148   memset(&entity[entities], 0, sizeof(entity) / 256);\r
1149   entity[entities].x=xw;\r
1150   entity[entities].y=yw;\r
1151   entities++;\r
1152 }\r
1153 \r
1154 void ProcessEntity(int xw, int yw)\r
1155 { int a;\r
1156 \r
1157   a=EntityThere(xw,yw);\r
1158   if (!a)\r
1159   {\r
1160      AllocateEntity(xw,yw);\r
1161      while (mb)\r
1162        ReadMouse(); // har! this was readmouse() @_@ <aen, apr 21>\r
1163      mb=0;\r
1164      return;\r
1165   }\r
1166   EntityEditor(a-1);\r
1167 }\r
1168 \r
1169 void DeleteEntity(int xw, int yw)\r
1170 { int i,a;\r
1171   char t[60];\r
1172 \r
1173   a=EntityThere(xw,yw)-1;\r
1174   sprintf(t,"Delete entity %d?",a);\r
1175   if (!Confirm(t)) return;\r
1176   for (i=a; i<entities; i++)\r
1177   {\r
1178     entity[i]=entity[i+1];\r
1179   }\r
1180   entities--;\r
1181 }\r
1182 \r
1183 int bxsize=130, bysize=170;\r
1184 int bxofs=80, byofs=25;\r
1185 int bmode=0;\r
1186 \r
1187 void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest)\r
1188 { struct find_t *f;\r
1189   char i, *d, mode;\r
1190   char *blah;\r
1191   int fc=0, ofs=0, cfs=0, a, b;\r
1192   char done=0, moving=0;\r
1193   int mxo, myo, cursorblink;\r
1194   char ctf=0, cb=0, c, t, *str;\r
1195   //int zx,zy,zw;\r
1196   char dragging=0;\r
1197 \r
1198   f=(struct find_t *) valloc(sizeof *f, "browse() tmp",0);\r
1199   blah=(char *) valloc(13*256,"browse()tmp2", 0);\r
1200   //memset(blah, 0, 13*256);\r
1201   n++;\r
1202 \r
1203   for (i=0; i<n; i++)\r
1204   {\r
1205     switch (i)\r
1206     {\r
1207       case 0: d="AJDLMMZZ.GAH"; mode=0xFF; break;\r
1208       case 1: d=m1; mode=0xFF; break;\r
1209       case 2: d=m2; mode=0xFF; break;\r
1210       case 3: d=m3; mode=0xFF; break;\r
1211       case 4: d=m4; mode=0xFF; break;\r
1212       default: err("uhh..."); break;\r
1213     }\r
1214     if (_dos_findfirst(d, mode, f)) continue;\r
1215     memcpy(blah+(fc*13), f->name, 13); fc++;\r
1216     while (!_dos_findnext(f))\r
1217     {\r
1218       memcpy(blah+(fc*13), f->name, 13); fc++;\r
1219     }\r
1220   }\r
1221   vfree(f);\r
1222   last_pressed=0;\r
1223   a=fc<22?117:2574/fc;\r
1224 //  errn("%d",fc);\r
1225   do\r
1226   {\r
1227     if (!bmode)\r
1228     {\r
1229       RenderMap();\r
1230       RenderGUI();\r
1231     }\r
1232     else\r
1233     {\r
1234       RenderSelector();\r
1235       RenderMessages();\r
1236     }\r
1237     if (ctf && systemtime >= cursorblink)\r
1238     {\r
1239       cb ^= 1;\r
1240       cursorblink = systemtime+40;\r
1241     }\r
1242     if (moving)\r
1243     {\r
1244       bxofs = (mx-mxo);\r
1245       byofs = (my-myo);\r
1246       if (!mb) moving=0;\r
1247       if (bxofs<16) bxofs = 16;\r
1248       if (byofs<16) byofs = 16;\r
1249       if (bxofs+bxsize>335) bxofs = 336-bxsize;\r
1250       if (byofs+bysize>sy+16) byofs = (sy+16)-bysize;\r
1251     }\r
1252 \r
1253     Window(bxofs, byofs, bxofs+bxsize, byofs+bysize, "Browse");\r
1254     Button(bxofs+65, byofs+157, "OK");\r
1255     Button(bxofs+96, byofs+157, "Cancel");\r
1256     FilledBox(bxofs+20, byofs+15, 80, 135, black);\r
1257     FilledBox(bxofs+100, byofs+15, 10, 135, 2);\r
1258     HLine(bxofs+20, byofs+15, 90, darkw);\r
1259     VLine(bxofs+20, byofs+15, 135, darkw);\r
1260     VLine(bxofs+99, byofs+16, 134, white);\r
1261     VLine(bxofs+109, byofs+16, 134, white);\r
1262     HLine(bxofs+21, byofs+149, 89, white);\r
1263     stdwindow(bxofs+100, byofs+16, bxofs+109, byofs+25);\r
1264     stdwindow(bxofs+100, byofs+140, bxofs+109, byofs+149);\r
1265     b=byofs+24+(fc != 22 ? ((117-a)*ofs)/(fc-22) : 0);\r
1266 \r
1267     //draws the drag box\r
1268     stdwindow(bxofs+100, b, bxofs+109, b+a);\r
1269 \r
1270     FilledBox(bxofs+21, byofs+((cfs-ofs)*6)+16, 78, 6, darkw);\r
1271 \r
1272     // Render actual filename thingies\r
1273     i=0;\r
1274     while (1)\r
1275     {\r
1276       if (i+ofs<fc && i<22)\r
1277       {\r
1278         GotoXY(bxofs+22, byofs+17+(i*6));\r
1279         printstring(blah+((i+ofs)*13));\r
1280       }\r
1281       else break;\r
1282       i++;\r
1283     }\r
1284 \r
1285     DrawMouse();\r
1286     ShowPage();\r
1287     CheckTimerStuff();\r
1288 \r
1289     // input phase\r
1290 \r
1291     if(dragging&&!mb)\r
1292     {\r
1293       dragging=0;\r
1294     }\r
1295 \r
1296     if((mb==1&&mx>bxofs+100&&mx<bxofs+110&&my>byofs+25&&my<byofs+135)||dragging)\r
1297     {\r
1298       if(my>b&&my<b+a)\r
1299       {\r
1300         dragging=1;\r
1301       }\r
1302       else\r
1303       {\r
1304         if(my<b)\r
1305         {\r
1306           if (ofs<22) ofs=0;\r
1307           else ofs-=22;\r
1308           cfs=ofs;\r
1309         }\r
1310         if(my>b+a)\r
1311         {\r
1312           if (ofs+45>fc) ofs=fc-22;\r
1313           else ofs+=22;\r
1314           cfs=ofs;\r
1315         }\r
1316       }\r
1317     }\r
1318     if(!dragging)\r
1319     {\r
1320     if (mb==1 && mx>bxofs+20 && mx<bxofs+100 && my>byofs+15 && my<byofs+149)\r
1321     {\r
1322       i=(my-byofs-16)/6;\r
1323       i+=ofs;\r
1324       memcpy(dest,blah+(i*13),13);\r
1325       done=1;\r
1326       break;\r
1327     }\r
1328     if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+15 && my<byofs+25)\r
1329     {\r
1330       WaitRelease();\r
1331       key[SCAN_UP]=1;\r
1332       last_pressed=SCAN_UP;\r
1333     }\r
1334     if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+139 && my<byofs+149)\r
1335     {\r
1336       WaitRelease();\r
1337       key[SCAN_DOWN]=1;\r
1338       last_pressed=SCAN_DOWN;\r
1339     }\r
1340     if (mb==1 && mx>bxofs+65 && mx<bxofs+30+65 && my>byofs+157 && my<byofs+10+157 && !moving)\r
1341     {\r
1342       memcpy(dest, blah, 13); done=1;\r
1343       ButtonPressed(bxofs+65, byofs+157, "OK");\r
1344       DrawMouse();\r
1345       while (mb)\r
1346       {\r
1347         ReadMouse();\r
1348         ShowPage();\r
1349         ReadMouse();\r
1350       }\r
1351       WaitRelease(); continue;\r
1352     }\r
1353 \r
1354     if (mb==1 && mx>bxofs+96 && mx<bxofs+30+96 && my>byofs+157 && my<byofs+10+157 && !moving)\r
1355     {\r
1356       *dest=0; done=1;\r
1357       ButtonPressed(bxofs+96, byofs+157, "Cancel");\r
1358       DrawMouse();\r
1359       while (mb)\r
1360       {\r
1361         ReadMouse();\r
1362         ShowPage();\r
1363         ReadMouse();\r
1364       }\r
1365       WaitRelease(); continue;\r
1366     }\r
1367 \r
1368     if (mb==1 && mx>(bxofs+bxsize-9) && (mx<bxofs+bxsize-2)\r
1369     && my>(byofs+1) && (my<byofs+8) && !moving)\r
1370     {\r
1371       done=1;\r
1372       WaitRelease();\r
1373       break;\r
1374     }\r
1375 \r
1376     if (mb==1 && mx>bxofs && mx<bxofs+bxsize && my>byofs && my<(byofs+9) && !moving)\r
1377     {\r
1378       moving=1;\r
1379       mxo=mx-bxofs;\r
1380       myo=my-byofs;\r
1381       continue;\r
1382     }\r
1383 \r
1384     if (mb==1 && !moving)\r
1385     {\r
1386       ctf=0;\r
1387       cb=0;\r
1388       str=0;\r
1389     }\r
1390 \r
1391     if (last_pressed)\r
1392     {\r
1393       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1394       else c=key_ascii_tbl[last_pressed];\r
1395 \r
1396       if (last_pressed==SCAN_ESC)\r
1397       {\r
1398         key[SCAN_ESC]=0;\r
1399         done=1;\r
1400         break;\r
1401       }\r
1402       if (key[SCAN_PGUP])\r
1403       {\r
1404         if (ofs<22) ofs=0;\r
1405         else ofs-=22;\r
1406         cfs=ofs;\r
1407         key[SCAN_PGUP]=0;\r
1408         continue;\r
1409       }\r
1410       if (key[SCAN_PGDN])\r
1411       {\r
1412         if (ofs+45>fc) ofs=fc-22;\r
1413         else ofs+=22;\r
1414         if (fc<22) ofs=0;\r
1415         cfs=ofs;\r
1416         key[SCAN_PGDN]=0;\r
1417         continue;\r
1418       }\r
1419       if (key[SCAN_UP])\r
1420       {\r
1421         if (cfs) cfs--;\r
1422         if (ofs>cfs) ofs--;\r
1423         key[SCAN_UP]=0;\r
1424         last_pressed=0;\r
1425         continue;\r
1426       }\r
1427       if (key[SCAN_DOWN])\r
1428       {\r
1429         if (cfs<fc-1) cfs++;\r
1430         if (cfs-ofs>21) ofs++;\r
1431         key[SCAN_DOWN]=0;\r
1432         last_pressed=0;\r
1433         continue;\r
1434       }\r
1435       if (last_pressed==SCAN_ENTER)\r
1436       {\r
1437         memcpy(dest,blah+(cfs*13),13);\r
1438         key[SCAN_ENTER]=0;\r
1439         done=1;\r
1440         ctf=0;\r
1441         str=0;\r
1442         last_pressed=0;\r
1443         break;\r
1444       }\r
1445 \r
1446       if (last_pressed==SCAN_TAB)\r
1447       {\r
1448         switch (ctf)\r
1449         {\r
1450           case 0: ctf=0; str=0; break;\r
1451         }\r
1452         key[SCAN_TAB]=0;\r
1453         last_pressed=0;\r
1454         cb=1; cursorblink=systemtime+40;\r
1455         continue;\r
1456       }\r
1457 \r
1458       if (!ctf)\r
1459         continue;\r
1460 \r
1461       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1462       {\r
1463         str[strlen(str)-1]=0;\r
1464         key[SCAN_BACKSP]=0;\r
1465         last_pressed=0;\r
1466         continue;\r
1467       }\r
1468       else if (last_pressed==SCAN_BACKSP)\r
1469       {\r
1470         last_pressed=0;\r
1471         continue;\r
1472       }\r
1473 \r
1474       t=strlen(str);\r
1475       str[t]=c;\r
1476       str[t+1]=0;\r
1477       last_pressed=0;\r
1478       }\r
1479     }\r
1480   } while (!done);\r
1481   vfree(blah);\r
1482 }\r
1483 \r
1484 #include "vergepal.h"\r
1485 #define LOGFILE "maped.log"\r
1486 \r
1487 void Log(char *text, ...)\r
1488 {\r
1489    va_list argptr;\r
1490    char msg[256];\r
1491    FILE *logf;\r
1492 \r
1493    va_start(argptr, text);\r
1494    vsprintf(msg, text, argptr);\r
1495    va_end(argptr);\r
1496 \r
1497    logf=fopen(LOGFILE,"aw");\r
1498    fprintf(logf,"%s\n",msg);\r
1499    fflush(logf);\r
1500    fclose(logf);\r
1501 }\r
1502 \r
1503 int main(int argc, char *argv[])\r
1504 {\r
1505 \r
1506   remove(LOGFILE);\r
1507   md_mixfreq=44100;\r
1508   md_dmabufsize=5000;\r
1509   md_mode=DMODE_16BITS|DMODE_STEREO;\r
1510   md_device=0;\r
1511   memset(&chrs, 0, sizeof chrs);\r
1512 \r
1513   Log("GetConfig");\r
1514   GetConfig("maped.cfg");\r
1515   Log("LoadTransTbl");\r
1516   translucency_table=0; //zero\r
1517   LoadTransTable(); //zero\r
1518 \r
1519   Log("RegisterModLoaders");\r
1520   ML_RegisterLoader(&load_mod);\r
1521   ML_RegisterLoader(&load_s3m);\r
1522   ML_RegisterLoader(&load_xm);\r
1523   ML_RegisterLoader(&load_uni);\r
1524 \r
1525   Log("RegisterSndDrivers");\r
1526   MD_RegisterDriver(&drv_nos);\r
1527   MD_RegisterDriver(&drv_sb);\r
1528   MD_RegisterDriver(&drv_gus);\r
1529   MD_RegisterPlayer(tickhandler);\r
1530   soundokay=1;\r
1531   Log("Initialize snd lib");\r
1532   if (!MD_Init())\r
1533   {\r
1534     printf("Couldn't initialize sound: %s.\n", myerr);\r
1535     delay(500);\r
1536     soundokay=0;\r
1537   }\r
1538 \r
1539   //Log("Initialize CD audio");\r
1540   //CD_Init();\r
1541 \r
1542   Log("Initialize timer");\r
1543   InitTimer();\r
1544   Log("Initialize video");\r
1545   InitVideo(vm);\r
1546   Log("Initialize mouse");\r
1547   InitMouse();\r
1548   Log("Initialize keyboard IRQ handler");\r
1549   InitKeyboard();\r
1550 \r
1551   Log("Initializing map data");\r
1552   if (argc==1 && !Exist("untitled.map"))\r
1553   {\r
1554     SetPalette(vergepal);\r
1555     memcpy(pal, vergepal, 768);\r
1556     memcpy(mapname,"UNTITLED.MAP",13);\r
1557     memcpy(vspname,"UNTITLED.VSP",13);\r
1558     memcpy(rstring,"1E",2);\r
1559     numlayers=1;\r
1560 \r
1561     // aen: default newmap dimensions set to 100x100\r
1562     layer[0].pmultx=1;  layer[0].pmulty=1;\r
1563     layer[0].pdivx=1;   layer[0].pdivy=1;\r
1564     layer[0].sizex=100; layer[0].sizey=100;\r
1565     layer[0].trans=0;   layer[0].hline=0;\r
1566 \r
1567     layers[0]=(unsigned short *) valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
1568     //memset(layers[0],0,(layer[0].sizex*layer[0].sizey)*2);\r
1569     obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct map",0);\r
1570     zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone map", 0);\r
1571 \r
1572     // aen: default number of tiles set to 100\r
1573     numtiles=100;\r
1574     vsp=(char *) valloc(256 * numtiles,"vsp data", 0);\r
1575     wrap=0; el=0; layertoggle[0]=1;\r
1576     InitTileIDX();\r
1577   }\r
1578   else\r
1579   {\r
1580     if (argc==1) memcpy(mapname, "untitled.map",13);\r
1581     else memcpy(mapname, argv[1], strlen(argv[1]));\r
1582     LoadMAP(mapname);\r
1583     InitTileIDX();\r
1584  }\r
1585 Log("Entering main loop");\r
1586 thingy:\r
1587   while (!(key[SCAN_ALT] && key[SCAN_X]))\r
1588   {\r
1589     ProcessControls();\r
1590     while (tick)\r
1591     {\r
1592       tick--;\r
1593       PollMovement();\r
1594     }\r
1595     RenderMap();\r
1596     RenderHighlight();\r
1597     RenderGUI();\r
1598     ShowPage();\r
1599   }\r
1600   if (modified)\r
1601      if (!Confirm("Lose unsaved changes?"))\r
1602      {\r
1603        key[SCAN_ALT]=0;\r
1604        key[SCAN_X]=0;\r
1605        goto thingy;\r
1606      }\r
1607 \r
1608   ShutdownVideo();\r
1609   ShutdownKeyboard();\r
1610   ShutdownTimer();\r
1611   SaveNewCFG();\r
1612   remove("$$BACKUP.MAP");\r
1613   remove("$$BACKUP.VSP");\r
1614 \r
1615   //if (curtrack != 1) CD_Stop();\r
1616   //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
1617   MD_PlayStop(); // Mordred\r
1618   ML_Free(mf);\r
1619 \r
1620   MD_Exit();\r
1621   if (translucency_table)\r
1622     vfree(translucency_table); //zero\r
1623   return 0;\r
1624 }\r