OSDN Git Service

renamed: ptmp0.pcx -> data/ptmp0.pcx
[proj16/16.git] / src / v2 / source / MAPED / MAPED.C
diff --git a/src/v2/source/MAPED/MAPED.C b/src/v2/source/MAPED/MAPED.C
new file mode 100644 (file)
index 0000000..9e17274
--- /dev/null
@@ -0,0 +1,1624 @@
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
+*/\r
+\r
+const char *const ME2_VERSION = "2.01a";\r
+\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+// CHANGELOG:\r
+// <vecna, may 14>\r
+// + erased valloc(), replaced with a_memory.c\r
+// + added Log() -- output to MAPED.LOG\r
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r
+\r
+#include <dos.h>\r
+#include <stdio.h>\r
+\r
+#include <malloc.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+\r
+#include "config.h"\r
+#include "gui.h"\r
+#include "keyboard.h"\r
+#include "mikmod.h"\r
+#include "mouse.h"\r
+#include "render.h"\r
+#include "timer.h"\r
+#include "vdriver.h"\r
+\r
+#include "ssaver.h"\r
+#include "smalfont.h"\r
+#include "tilesel.h"\r
+#include "minimap.h"\r
+#include "guicomp.h"\r
+#include "config.h"\r
+\r
+#define byte unsigned char\r
+#define word unsigned short\r
+\r
+// Includes for a_memory.c\r
+\r
+void *valloc(int amount, char *desc, int owner);\r
+void *qvalloc(int amount);\r
+int  vfree(void *pointer);\r
+void qvfree(void *pointer);\r
+void FreeByOwner(int owner);\r
+void MemReport(void);\r
+void CheckCorruption(void);\r
+\r
+// ================================= Data ====================================\r
+\r
+typedef struct\r
+{\r
+  unsigned short start;              // strand start\r
+  unsigned short finish;             // strand end\r
+  unsigned short delay;              // tile-switch delay\r
+  unsigned short mode;               // tile-animation mode\r
+} vspanim_r;\r
+\r
+typedef struct\r
+{\r
+  char pmultx,pdivx;                 // parallax multiplier/divisor for X\r
+  char pmulty,pdivy;                 // parallax multiplier/divisor for Y\r
+  unsigned short sizex, sizey;       // layer dimensions.\r
+  unsigned char trans, hline;        // transparency flag | hline (raster fx)\r
+} layer_r;\r
+\r
+typedef struct\r
+{\r
+  char name[40];                     // zone name/desc\r
+  unsigned short script;             // script to call thingy\r
+  unsigned short percent;            // chance of executing\r
+  unsigned short delay;              // step-delay\r
+  unsigned short aaa;                // Accept Adjacent Activation\r
+  unsigned short entityscript;       // script to call for entities\r
+} zoneinfo;\r
+\r
+typedef struct\r
+{\r
+  char zonename[16];                   // zone description\r
+  unsigned short int callevent;        // event number to call\r
+  unsigned char percent;               // chance (in 255) of event occurance\r
+  unsigned char delay;                 // step-delay before last occurance\r
+  unsigned char aaa;                   // accept adjacent activation\r
+  char savedesc[31];                   // savegame description\r
+} oldzone;\r
+\r
+typedef struct\r
+{\r
+  int x, y;                            // xwc, ywx position\r
+  word tx, ty;                         // xtc, ytc position\r
+  byte facing;                         // direction entity is facing\r
+  byte moving, movecnt;                // direction entity is moving\r
+  byte frame;                          // bottom-line frame to display\r
+  byte specframe;                      // special-frame set thingo\r
+  byte chrindex, reset;                // CHR index | Reset animation\r
+  byte obsmode1, obsmode2;             // can be obstructed | Is an obstruction\r
+  byte speed, speedct;                 // entity speed, speedcount :)\r
+  byte delayct;                        // animation frame-delay\r
+  char *animofs, *moveofs;             // anim script | move script\r
+  byte face, actm;                     // auto-face | activation mode\r
+  byte movecode, movescript;           // movement type | movement script\r
+  byte ctr, mode;                      // sub-tile move ctr, mode flag (internal)\r
+  word step, delay;                    // step, delay\r
+  word stepctr, delayctr;              // internal use counters\r
+  word data1, data2, data3;            //\r
+  word data4, data5, data6;            //\r
+  int  actscript;                      // activation script\r
+  int  expand1, expand2;               //\r
+  int  expand3, expand4;               //\r
+  char desc[20];                       // Entity description.\r
+} entity_r;\r
+\r
+typedef struct\r
+{\r
+  char t[60];\r
+} chrlist_r;\r
+\r
+typedef struct\r
+{\r
+  char t[200];\r
+} movescript;\r
+\r
+typedef struct\r
+{\r
+  unsigned short x;                    // xwc position\r
+  unsigned short y;                    // ywc position\r
+  unsigned char facing;                // direction entity is facing\r
+  unsigned char moving;                // direction entity is moving\r
+  unsigned char movcnt;                // how far left to move in this tile\r
+  unsigned char framectr;              // frame sequence counter\r
+  unsigned char specframe;             // special-frame set thingo\r
+  unsigned char chrindex, movecode;    // CHR index / movement pattern code\r
+  unsigned char activmode, obsmode;    // activation mode, obstruction mode\r
+  unsigned char v1,v2,v3;              // packing stuff.\r
+  unsigned int actscript, movescript;  // script references\r
+  unsigned char speed, speedct;        // entity speed, speedcount :)\r
+  unsigned short step, delay,          // Misc data entries\r
+                 data1, data2,         // More misc data\r
+                 data3, data4,         // yet more crappy misc data.\r
+                 delayct,adjactv;      // yet more internal crap\r
+  unsigned short x1,y1,x2,y2;          // bounding box coordinates\r
+  unsigned char curcmd, cmdarg;        // Script commands/arguments\r
+  unsigned char *scriptofs;            // offset in script parsing\r
+  unsigned char face,chasing,          // face player when activated | chasing\r
+                chasespeed, chasedist; // chasing variables\r
+  unsigned short cx,cy;                // current-tile pos (moving adjusted)\r
+  int expand1;                         // always room for improvement\r
+  char entitydesc[20];                 // Editing description\r
+} oldent_r;\r
+\r
+zoneinfo zones[256];                 // zone stuff.\r
+layer_r layer[6];                    // Array of layer data\r
+vspanim_r vspanim[100];              // tile animation data\r
+unsigned short vadelay[100];         // Tile animation delay ctr\r
+oldzone tzone;                       // zone for oldmap-to-v2 converting\r
+entity_r entity[256];                // Entity records.\r
+oldent_r oldent;                     // entity for oldmap-to-v2 converting\r
+byte entities=0;                     // number of allocated entities.\r
+chrlist_r chrlist[100];              // Max. 100 CHRs per map.\r
+movescript ms[100];                  // move scripts arrays\r
+byte nmchr=0;                        // number of active/loaded CHRs.\r
+byte nms=0;                          // number of movement scripts\r
+\r
+char mapname[60];                    // MAP filename\r
+char vspname[60];                    // VSP filemap\r
+char rstring[20];                    // render-order string\r
+char musname[60];                    // MAP default music\r
+char numlayers;                      // number of layers in map\r
+short xstart, ystart;                // MAP start locations\r
+char *obstruct, *zone;               // obstruction and zone buffers\r
+int numzones=0;                      // Number of active zones.\r
+unsigned short *layers[6];           // Raw layer data\r
+char wrap, soundokay=0;\r
+\r
+// -- vsp related data --\r
+\r
+unsigned short numtiles;             // number of allocated tiles in VSP\r
+unsigned char *vsp;                  // VSP ptr\r
+char vsp_locked=0;\r
+char vsp_pw[8];\r
+\r
+// -- map compression\r
+\r
+char *cb,*csrc;                      // compression workspace buffer\r
+int bufsize;                         // how many bytes need to be written\r
+\r
+// -- editing related data --\r
+\r
+int xwin=0, ywin=0;                  // Editing viewplane\r
+short lt=0, rt=0;                    // left-button tile, right-button tile\r
+char curzone=0;                      // current zone.\r
+char scrollmode=0;                   // tile or pixel scroll modes.\r
+char mouse_scroll=1;\r
+char layertoggle[10];                // layer visible toggles\r
+char el=0;                           // current editing layer.\r
+char modified=0;                     // Current buffer modified or not.\r
+\r
+// -- music stuff --\r
+\r
+char is_playing=0;\r
+char cmname[60];\r
+UNIMOD *mf=0;\r
+\r
+// -- copy/paste & block fill --\r
+\r
+word *copybuf=0;\r
+int copybuf_wide=0,copybuf_deep=0;\r
+int selx1=0, sely1=0, selx2=0, sely2=0;\r
+int shifted=0, pasting=0;\r
+extern char curtrack;\r
+\r
+char vcedprog[80];\r
+byte* translucency_table; //zero\r
+\r
+int moving_up=0,moving_down=0,moving_left=0,moving_right=0; // aen\r
+\r
+// ================================= Code ====================================\r
+\r
+//added by zero\r
+void LoadTransTable()\r
+{\r
+  FILE *fp;\r
+\r
+  if (!translucency_table)\r
+    translucency_table=(byte *) valloc(65536,"trans tbl",0);\r
+\r
+  fp=fopen("trans.tbl","rb");\r
+  if (!fp)\r
+  {\r
+    vfree(translucency_table);\r
+    translucency_table=0;\r
+    return;\r
+  }\r
+\r
+  fread(translucency_table, 65536, 1, fp);\r
+  fclose(fp);\r
+}\r
+\r
+int Exist(char *fname)\r
+{ FILE *tempf;\r
+\r
+  tempf=fopen(fname,"rb");\r
+  if (tempf)\r
+  {\r
+     fclose(tempf);\r
+     return 1;\r
+  }\r
+  else return 0;\r
+}\r
+\r
+void err(char *str, ...)\r
+{\r
+   va_list argptr;\r
+   char msg[256];\r
+\r
+   va_start(argptr, str);\r
+   vsprintf(msg, str, argptr);\r
+   va_end(argptr);\r
+\r
+  ShutdownVideo();\r
+  ShutdownTimer();\r
+  ShutdownKeyboard();\r
+  //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+               // Actually, Wat is by default case insensitive, so nyeh.;) <vec>\r
+  //if (curtrack != 1) //CD_Stop();\r
+\r
+  printf("%s \n",msg);\r
+  exit(-1);\r
+}\r
+\r
+void errf(char *str, char *str1)\r
+{\r
+  sprintf(strbuf,str,str1);\r
+  err(strbuf);\r
+}\r
+\r
+void errn(char *str, int n)\r
+{\r
+  sprintf(strbuf,str,n);\r
+  err(strbuf);\r
+}\r
+\r
+int random(int lo, int hi)\r
+{\r
+  int range=hi-lo+1;\r
+  int i=rand() % range;\r
+  return i+lo;\r
+}\r
+\r
+void PlayMusic(char *fname)\r
+{\r
+  if (!soundokay) return;\r
+  if (is_playing)\r
+  {\r
+    MD_PlayStop();\r
+    ML_Free(mf);\r
+    is_playing=0;\r
+  }\r
+  mf=ML_LoadFN(fname);\r
+  if (!mf)\r
+  {\r
+    Message("Could not load specified music.",500);\r
+    return;\r
+  }\r
+  MP_Init(mf);\r
+  md_numchn=mf->numchn; mp_loop=1;\r
+  MD_PlayStart();\r
+  is_playing=1;\r
+}\r
+\r
+void StopMusic()\r
+{\r
+  if (!soundokay) return;\r
+  MD_PlayStop();\r
+  ML_Free(mf);\r
+  is_playing=0;\r
+}\r
+\r
+void LoadVSP(char *fname)\r
+{ FILE *f;\r
+  short ver;\r
+\r
+  if (!(f=fopen(fname,"rb")))\r
+     errf("VSP file %s not found.",fname);\r
+\r
+  fread(&ver, 1, 2, f);\r
+  if (ver!=2 && ver!=3)\r
+     errf("VSP file %s is not the correct VSP format.",fname);\r
+  if (ver==2)\r
+  {\r
+    fread(&pal, 1, 768, f);\r
+    set_intensity(63);\r
+    fread(&numtiles, 1, 2, f);\r
+    vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+    fread(vsp, 256, numtiles, f);\r
+    fread(&vspanim, 8, 100, f);\r
+    fclose(f);\r
+  }\r
+  if (ver==3)\r
+  {\r
+    fread(&pal, 1, 768, f);\r
+    set_intensity(63);\r
+    fread(&numtiles, 1, 2, f);\r
+    vsp=(char *) valloc(256*numtiles, "vsp data", 0);\r
+    fread(&bufsize, 1, 4, f);\r
+    ReadCompressedLayer1(vsp, 256*numtiles, f);\r
+    fread(&vspanim, 8, 100, f);\r
+    fclose(f);\r
+  }\r
+}\r
+\r
+void SaveVSP(char *fname)\r
+{ FILE *f;\r
+  short ver;\r
+\r
+  f=fopen(fname,"wb");\r
+  ver=3;\r
+  fwrite(&ver, 1, 2, f);\r
+  fwrite(&pal, 1, 768, f);\r
+  fwrite(&numtiles, 1, 2, f);\r
+  cb=(char *) valloc(numtiles*256, "vsp tempbuf", 0);\r
+  bufsize=0;\r
+  WriteCompressedLayer1(vsp, numtiles*256);\r
+  fwrite(&bufsize, 1, 4, f);\r
+  fwrite(cb, 1, bufsize, f);\r
+  //free(bufsize); // what the hell??? @_@\r
+  fwrite(&vspanim, 8, 100, f);\r
+  fclose(f);\r
+}\r
+\r
+void EmitC (char c)\r
+{\r
+  *csrc=c;\r
+  csrc++;\r
+  bufsize++;\r
+}\r
+\r
+void EmitW (short int w)\r
+{\r
+  char *ptr;\r
+\r
+  ptr=(char *)&w;\r
+  *csrc=*ptr;\r
+  csrc++;\r
+  ptr++;\r
+  *csrc=*ptr;\r
+  csrc++;\r
+  bufsize+=2;\r
+}\r
+\r
+void WriteCompressedLayer1(unsigned char *p, int len)\r
+{ int i;\r
+  unsigned char byt,samect;\r
+  unsigned char repcode;\r
+\r
+  csrc=cb;\r
+  i=0; bufsize=0;\r
+  do\r
+  {   byt=p[i++];\r
+      samect=1;\r
+      while (samect<254 && i<len && byt==p[i])\r
+      {\r
+         samect++;\r
+         i++;\r
+      }\r
+      if (samect==2 && byt != 0xFF) { EmitC(byt); }\r
+      if (samect==3 && byt != 0xFF) { EmitC(byt); EmitC(byt); }\r
+      if (samect>3 || byt == 0xFF)\r
+      {\r
+         repcode=0xFF;\r
+         EmitC(repcode);\r
+         repcode=(char) samect;\r
+         EmitC(repcode);\r
+      }\r
+      EmitC(byt);\r
+  } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f)\r
+{ int j,n;\r
+  unsigned char run;\r
+  unsigned char w;\r
+\r
+  n=0;\r
+  do\r
+  {\r
+     fread(&w, 1, 1, f);\r
+     if (w==0xFF)\r
+     {\r
+         fread(&run, 1, 1, f);\r
+         fread(&w, 1, 1, f);\r
+         for (j=0; j<run; j++)\r
+             dest[n+j]=w;\r
+         n+=run;\r
+     }\r
+     else\r
+      {\r
+         dest[n]=w;\r
+         n++;\r
+      }\r
+  } while (n<len);\r
+}\r
+\r
+void WriteCompressedLayer2(unsigned short *p,int len)\r
+{ int i;\r
+  unsigned short byt,samect;\r
+  unsigned char repcode;\r
+\r
+  csrc=cb;\r
+  i=0; bufsize=0;\r
+  do\r
+  {   byt=p[i++];\r
+      samect=1;\r
+      while (samect<255 && i<len && byt==p[i])\r
+      {\r
+         samect++;\r
+         i++;\r
+      }\r
+      if (samect>1)\r
+      {\r
+         repcode=(char) samect;\r
+         EmitC(repcode);\r
+         repcode=0xFF;\r
+         EmitC(repcode);\r
+      }\r
+      EmitW(byt);\r
+  } while (i<len);\r
+}\r
+\r
+void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f)\r
+{ int j,n;\r
+  unsigned char run;\r
+  unsigned short w;\r
+\r
+  n=0;\r
+  do\r
+  {\r
+     fread(&w, 1, 2, f);\r
+     if ((w & 0xFF00)==0xFF00)\r
+     {\r
+        run=(char) (w & 0x00FF);\r
+        fread(&w, 1, 2, f);\r
+        for (j=0; j<run; j++)\r
+            dest[n+j]=w;\r
+        n+=run;\r
+     }\r
+     else\r
+     {\r
+        dest[n]=w;\r
+        n++;\r
+     }\r
+  } while (n<len);\r
+}\r
+\r
+void CountUsedZones()\r
+{ int i;\r
+\r
+  i=255;\r
+  while (i)\r
+  {\r
+     if (zones[i].script) break;\r
+     if (zones[i].percent) break;\r
+     if (zones[i].delay) break;\r
+     if (zones[i].aaa) break;\r
+     if (zones[i].entityscript) break;\r
+     if (strlen(zones[i].name)) break;\r
+     i--;\r
+  }\r
+  numzones=i+1;\r
+}\r
+\r
+void CountMoveScripts()\r
+{ int i;\r
+\r
+  i=99;\r
+  while (i)\r
+  {\r
+     if (strlen(ms[i].t)) break;\r
+     i--;\r
+  }\r
+  nms=i+1;\r
+}\r
+\r
+void CountCHRs()\r
+{ int i;\r
+\r
+  i=99;\r
+  while (i)\r
+  {\r
+     if (strlen(chrlist[i].t)) break;\r
+     i--;\r
+  }\r
+  nmchr=i+1;\r
+}\r
+\r
+void SaveMAP(char *fname)\r
+{ FILE *f;\r
+  int i, ofstbl[100], ct, t;\r
+\r
+  memcpy(strbuf, "MAPù5", 6);\r
+  f=fopen(fname, "wb");\r
+  fwrite(strbuf, 1, 6, f);\r
+  fwrite(strbuf, 1, 4, f);\r
+  fwrite(vspname, 1, 60, f);\r
+  fwrite(musname, 1, 60, f);\r
+  fwrite(rstring, 1, 20, f);\r
+  fwrite(&xstart, 1, 2, f);\r
+  fwrite(&ystart, 1, 2, f);\r
+  fwrite(&wrap, 1, 1, f);\r
+  fwrite(strbuf, 1, 50, f);\r
+  fwrite(&numlayers, 1, 1, f);\r
+  for (i=0; i<numlayers; i++)\r
+      fwrite(&layer[i], 1, 12, f);\r
+\r
+  for (i=0; i<numlayers; i++)\r
+  {\r
+     cb=(char *) valloc(layer[i].sizex*layer[i].sizey*2,"cmprs buf", 0);\r
+     WriteCompressedLayer2(layers[i],(layer[i].sizex*layer[i].sizey));\r
+     fwrite(&bufsize, 1, 4, f);\r
+     fwrite(cb, 1, bufsize, f);\r
+     vfree(cb);\r
+  }\r
+  // Compress and write Obstruction data\r
+\r
+  cb=(char *) valloc(layer[0].sizex*layer[0].sizey*2, "cmprs buf", 0);\r
+  WriteCompressedLayer1(obstruct, (layer[0].sizex*layer[0].sizey));\r
+  fwrite(&bufsize, 1, 4, f);\r
+  fwrite(cb, 1, bufsize, f);\r
+  WriteCompressedLayer1(zone, (layer[0].sizex*layer[0].sizey));\r
+  fwrite(&bufsize, 1, 4, f);\r
+  fwrite(cb, 1, bufsize, f);\r
+  vfree(cb);\r
+\r
+  CountUsedZones();\r
+  fwrite(&numzones, 1, 4, f);\r
+  fwrite(&zones, numzones, 50, f);\r
+\r
+  CountCHRs();\r
+  fwrite(&nmchr, 1, 1, f);\r
+  fwrite(&chrlist, 60, nmchr, f);\r
+\r
+  fwrite(&entities, 1, 1, f);\r
+  fwrite(&entity, sizeof(entity)/256, entities, f);\r
+\r
+  CountMoveScripts();\r
+  fwrite(&nms, 1, 1, f);     // Calc offset buffer\r
+  ct=0;\r
+  for (i=0; i<nms; i++)\r
+  {\r
+    ofstbl[i]=ct;\r
+    t=strlen(&ms[i].t)+1;\r
+    ct+=t;\r
+  }\r
+  fwrite(&ct, 1, 4, f);        // string table length\r
+  fwrite(&ofstbl, nms, 4, f);  // write offset buffer\r
+  for (i=0; i<nms; i++)        // write string table\r
+  {\r
+    fwrite(&ms[i].t, 1, strlen(&ms[i].t)+1, f);\r
+  }\r
+\r
+  ct=0;  // 0 Things\r
+  fwrite(&ct, 1, 4, f);\r
+  ct=ftell(f);\r
+\r
+  i=1; fwrite(&i, 1, 4, f);\r
+  i=0; fwrite(&i, 1, 4, f);\r
+  i=1; fwrite(&i, 1, 4, f);\r
+  i=9; fwrite(&i, 1, 1, f);\r
+\r
+  fseek(f,6,0);\r
+  fwrite(&ct, 1, 4, f);\r
+  fclose(f);\r
+}\r
+\r
+void LoadOldMAP(FILE *f)\r
+{ int i, j, ct, ofstbl[100];\r
+  char pm,pd,pc,c;\r
+\r
+  // Reads a VERGE 1 format version 4 MAP file.\r
+  fseek(f, 1, 0);\r
+  fread(&vspname, 1, 13, f);\r
+  fread(&musname, 1, 13, f);\r
+  fread(&pc, 1, 1, f);             // }\r
+  fread(&pm, 1, 1, f);             // } Parallax controls\r
+  fread(&pd, 1, 1, f);             // }\r
+  fread(strbuf, 1, 32, f);         // unused - misc\r
+  fread(&xstart, 1, 2, f);\r
+  fread(&ystart, 1, 2, f);\r
+  fread(strbuf, 1, 2, f);          // unused - misc\r
+  fread(&layer[0].sizex, 1, 2, f);\r
+  fread(&layer[0].sizey, 1, 2, f);\r
+  layer[1].sizex=layer[0].sizex;\r
+  layer[1].sizey=layer[0].sizey;\r
+  fread(strbuf, 1, 28, f);         // unused - header pad\r
+\r
+  layers[0]=(unsigned short *) valloc((layer[0].sizex*(layer[0].sizey+1)*2)+2, "layer data", 0);\r
+  layers[1]=(unsigned short *) valloc((layer[1].sizex*(layer[1].sizey+1)*2)+2, "layer data", 1);\r
+   obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "obstruct map", 0);\r
+       zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+         cb=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "comprs buf", 0);\r
+\r
+  fread(layers[0], 2, layer[0].sizex * layer[0].sizey, f);\r
+  fread(layers[1], 2, layer[1].sizex * layer[1].sizey, f);\r
+  fread(cb,        1, layer[0].sizex * layer[0].sizey, f);\r
+\r
+  // Convert MAP Properties layer to respective Zone and Obstruction layers\r
+\r
+  for (j=0; j<layer[0].sizey; j++)\r
+    for (i=0; i<layer[0].sizex; i++)\r
+    {\r
+      if ((cb[(j*layer[0].sizex)+i] & 1)==1)\r
+         c=1; else c=0;\r
+       obstruct[(j*layer[0].sizex)+i]=c;\r
+       c=cb[(j*layer[0].sizex)+i] >> 1;\r
+       zone[(j*layer[0].sizex)+i]=c;\r
+    }\r
+  vfree(cb);\r
+\r
+  // Load and convert zone data records.\r
+\r
+  for (i=0; i<128; i++)\r
+  {\r
+    fread(&tzone, 1, sizeof tzone, f);\r
+    zones[i].script=tzone.callevent;\r
+    zones[i].percent=tzone.percent;\r
+    zones[i].delay=tzone.delay;\r
+    zones[i].aaa=tzone.aaa;\r
+    zones[i].entityscript=0;\r
+    memcpy(zones[i].name, tzone.zonename, 16);\r
+  }\r
+\r
+  for (i=0; i<100; i++)                  // Load and convert CHR list\r
+    fread(&chrlist[i].t, 1, 13, f);\r
+//  DoCHRdealy();\r
+\r
+  fread(&entities, 1, 1, f); fseek(f, 3, 1);\r
+  memset(&entity, 0, sizeof entity);\r
+  for (i=0; i<entities; i++)             // Load and convert entity records\r
+  {\r
+    fread(&oldent, 1, 88, f);\r
+    entity[i].x=oldent.x;\r
+    entity[i].y=oldent.y;\r
+    entity[i].chrindex=oldent.chrindex-5;\r
+    entity[i].obsmode1=oldent.obsmode^1;\r
+    entity[i].obsmode2=1;\r
+    entity[i].movecode=oldent.movecode;\r
+    if (entity[i].movecode==3) entity[i].movecode=2;\r
+    else if (entity[i].movecode==2) entity[i].movecode=3;\r
+    entity[i].speed=oldent.speed;\r
+    entity[i].face=oldent.face;\r
+    entity[i].actm=oldent.activmode;\r
+    entity[i].movescript=oldent.movescript;\r
+    entity[i].step=oldent.step;\r
+    entity[i].delay=oldent.delay;\r
+    entity[i].data2=0;\r
+    entity[i].data3=0;\r
+    entity[i].data5=0;\r
+    entity[i].data6=0;\r
+    entity[i].actscript=oldent.actscript;\r
+    if (entity[i].movecode==2) entity[i].data2=oldent.data3;\r
+    if (entity[i].movecode==3)\r
+    {\r
+      entity[i].data2=oldent.x1;\r
+      entity[i].data3=oldent.y1;\r
+      entity[i].data5=oldent.x2;\r
+      entity[i].data6=oldent.y2;\r
+    }\r
+    memcpy(entity[i].desc, oldent.entitydesc, 20);\r
+  }\r
+\r
+  fread(&nms, 1, 1, f);\r
+  fread(&ct, 1, 4, f);\r
+  fread(&ofstbl, nms, 4, f);\r
+  ofstbl[nms]=ct;\r
+  for (i=0; i<nms; i++)\r
+   fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+  fclose(f);\r
+\r
+  numlayers=2;\r
+  layertoggle[0]=1; layertoggle[1]=1; layertoggle[2]=0; layertoggle[3]=0;\r
+  layertoggle[4]=0; layertoggle[5]=0; layertoggle[6]=0; layertoggle[7]=0;\r
+  memcpy(rstring,"1E2",3);\r
+  switch (pc)\r
+  {\r
+    case 0:\r
+    case 1: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+            layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+    case 2: layer[0].pmultx=pm; layer[0].pmulty=pm; layer[0].pdivx=pd; layer[0].pdivy=pd;\r
+            layer[1].pmultx=1; layer[1].pmulty=1; layer[1].pdivx=1; layer[1].pdivy=1; break;\r
+    case 3: layer[0].pmultx=1; layer[0].pmulty=1; layer[0].pdivx=1; layer[0].pdivy=1;\r
+            layer[1].pmultx=pm; layer[1].pmulty=pm; layer[1].pdivx=pd; layer[1].pdivy=pd; break;\r
+  }\r
+\r
+  LoadVSP(vspname);\r
+  sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+  Message(strbuf,700);\r
+  Message("Old VERGE format 4 MAP loaded.",300);\r
+  if (strlen(musname))\r
+    PlayMusic(musname);\r
+}\r
+\r
+void LoadMAP(char *fname)\r
+{ FILE *f;\r
+  int i, ct, ofstbl[100];\r
+\r
+  memcpy(strbuf, "MAPù5", 6);\r
+  if (!(f=fopen(fname, "rb"))) errf("Could not find %s.",fname);\r
+  fread(strbuf, 1, 6, f);\r
+  if (strcmp(strbuf,"MAPù5"))\r
+  {\r
+     if (strbuf[0]==4)\r
+     {\r
+        LoadOldMAP(f);\r
+        return;\r
+     }\r
+     errf("%s is not a recognized MAP file.",fname);\r
+  }\r
+\r
+  fread(&i, 1, 4, f);\r
+  fread(vspname, 1, 60, f);\r
+  fread(musname, 1, 60, f);\r
+  fread(rstring, 1, 20, f);\r
+  fread(&xstart, 1, 2, f);\r
+  fread(&ystart, 1, 2, f);\r
+  fread(&wrap, 1, 1, f);\r
+  fread(strbuf, 1, 50, f);\r
+  fread(&numlayers, 1, 1, f);\r
+  for (i=0; i<numlayers; i++)\r
+      fread(&layer[i], 1, 12, f);\r
+\r
+  for (i=0; i<numlayers; i++)\r
+  {\r
+     fread(&bufsize, 1, 4, f);\r
+     layers[i]=(unsigned short *) valloc(layer[i].sizex*(layer[i].sizey+2)*2, "layer data", i);\r
+     ReadCompressedLayer2(layers[i],(layer[i].sizex * layer[i].sizey),f);\r
+     layertoggle[i]=1;\r
+  }\r
+  while (i<10)\r
+  {\r
+     layertoggle[i]=0;\r
+     i++;\r
+  }\r
+  obstruct=(char *) valloc(layer[0].sizex*(layer[0].sizey+2),"obstruct map", 0);\r
+  zone=(char *) valloc(layer[0].sizex*(layer[0].sizey+2), "zone map", 0);\r
+\r
+  fread(&bufsize, 1, 4, f);\r
+  ReadCompressedLayer1(obstruct,(layer[0].sizex * layer[0].sizey), f);\r
+  fread(&bufsize, 1, 4, f);\r
+  ReadCompressedLayer1(zone,(layer[0].sizex * layer[0].sizey), f);\r
+\r
+  memset(&zones, 0, sizeof zones);\r
+  fread(&numzones, 1, 4, f);\r
+  fread(&zones, numzones, 50, f);\r
+\r
+  memset(&chrlist, 0, sizeof chrlist);\r
+  fread(&nmchr, 1, 1, f);\r
+  fread(&chrlist, 60, nmchr, f);\r
+//  DoCHRdealy();\r
+\r
+  fread(&entities, 1, 1, f);\r
+  fread(&entity, sizeof(entity)/256, entities, f);\r
+\r
+  fread(&nms, 1, 1, f);\r
+  fread(&ct, 1, 4, f);\r
+  fread(&ofstbl, nms, 4, f);\r
+  ofstbl[nms]=ct;\r
+  for (i=0; i<nms; i++)\r
+    fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);\r
+  fclose(f);\r
+\r
+  LoadVSP(vspname);\r
+  sprintf(strbuf, "MapEd %s Copyright (C)1998 vecna", ME2_VERSION);\r
+  Message(strbuf,700);\r
+  Message("V2 MAP loaded.",300);\r
+  if (strlen(musname))\r
+    PlayMusic(musname);\r
+}\r
+\r
+void InitTileIDX()\r
+{ short i;\r
+\r
+  memset(vadelay, 0, 200);\r
+  for (i=0; i<MAXTILES; i++)\r
+      tileidx[i]=i;\r
+}\r
+\r
+void CheckTimerStuff()\r
+{ static inss=0;\r
+\r
+  if (backupct>30000)\r
+  {\r
+    Message("Generating Auto-backup",150);\r
+    SaveMAP("$$BACKUP.MAP");\r
+    SaveVSP("$$BACKUP.VSP");\r
+    backupct=0;\r
+  }\r
+  if (idlect>8000 && !inss)\r
+  {\r
+    inss=1;\r
+    ScreenSaver();\r
+    idlect=0;\r
+    inss=0;\r
+  }\r
+}\r
+\r
+extern int difficulty;\r
+\r
+void SaveNewCFG()\r
+{ FILE *f;\r
+\r
+  f=fopen("maped.cfg","w");\r
+  //if (nocdaudio) fprintf(f,"nocdaudio\n");\r
+  fprintf(f,"vidmode %d \n", vm);\r
+  fprintf(f,"pad %d \n", pad);\r
+  fprintf(f,"scrollmode %d \n",scrollmode);\r
+  fprintf(f,"mouse_scroll %d \n",mouse_scroll&1); // aen\r
+  fprintf(f,"black %d \n",black);\r
+  fprintf(f,"white %d \n",brightw);\r
+  fprintf(f,"winbg %d \n",winbg);\r
+  fprintf(f,"shadow %d \n",darkw);\r
+  fprintf(f,"darkred %d \n",darkred);\r
+  fprintf(f,"titlebg %d \n",titlebg);\r
+  fprintf(f,"th %d \n", th);\r
+  fprintf(f,"mh %d \n", mh);\r
+  fprintf(f,"md_device %d \n", md_device==3?3:0);\r
+  fprintf(f,"amxofs %d \n",amxofs);\r
+  fprintf(f,"amyofs %d \n",amyofs);\r
+  fprintf(f,"mmxofs %d \n",mmxofs);\r
+  fprintf(f,"mmyofs %d \n",mmyofs);\r
+  fprintf(f,"cnxofs %d \n",cnxofs);\r
+  fprintf(f,"cnyofs %d \n",cnyofs);\r
+  fprintf(f,"lmxofs %d \n",lmxofs);\r
+  fprintf(f,"lmyofs %d \n",lmyofs);\r
+  fprintf(f,"lvxofs %d \n",lvxofs);\r
+  fprintf(f,"lvyofs %d \n",lvyofs);\r
+  fprintf(f,"mpxofs %d \n",mpxofs);\r
+  fprintf(f,"mpyofs %d \n",mpyofs);\r
+  fprintf(f,"vaxofs %d \n",vaxofs);\r
+  fprintf(f,"vayofs %d \n",vayofs);\r
+  fprintf(f,"zexofs %d \n",zexofs);\r
+  fprintf(f,"zeyofs %d \n",zeyofs);\r
+  fprintf(f,"exofs %d \n",exofs);\r
+  fprintf(f,"eyofs %d \n",eyofs);\r
+  fprintf(f,"prxofs %d \n",prxofs);\r
+  fprintf(f,"pryofs %d \n",pryofs);\r
+  fprintf(f,"rsxofs %d \n",rsxofs);\r
+  fprintf(f,"rsyofs %d \n",rsyofs);\r
+  fprintf(f,"vced %s \n",vcedprog);\r
+  fprintf(f,"difficulty %d \n",difficulty);\r
+  fclose(f);\r
+}\r
+\r
+#include "controls.c"\r
+\r
+void ShellToDOS()\r
+{\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  system("COMMAND.COM");\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+  InitVideo(vm);\r
+  set_intensity(63);\r
+  InitMouse();\r
+  InitKeyboard();\r
+  InitTimer();\r
+}\r
+\r
+void ShellVERGE()\r
+{\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  system("VERGE");\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+  InitVideo(vm);\r
+  set_intensity(63);\r
+  InitMouse();\r
+  InitKeyboard();\r
+  InitTimer();\r
+}\r
+\r
+void ShellMAP()\r
+{\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  sprintf(strbuf,"verge %s",mapname);\r
+  system(strbuf);\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+  InitVideo(vm);\r
+  set_intensity(63);\r
+  InitMouse();\r
+  InitKeyboard();\r
+  InitTimer();\r
+}\r
+\r
+void ShellEditMAP()\r
+{\r
+  char fn[80],*p;\r
+\r
+  key[SCAN_ALT]=0;\r
+  key[SCAN_V]=0;\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  sprintf(fn,"%s",mapname);\r
+  p=fn;\r
+  while (*p)\r
+  {\r
+    if (*p=='.') *p=0;\r
+    p++;\r
+  }\r
+  sprintf(strbuf,"%s %s.vc", vcedprog, fn);\r
+  system(strbuf);\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+  InitVideo(vm);\r
+  set_intensity(63);\r
+  InitMouse();\r
+  InitKeyboard();\r
+  InitTimer();\r
+}\r
+\r
+void ShellEditSystem()\r
+{\r
+  key[SCAN_ALT]=0;\r
+  key[SCAN_S]=0;\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  sprintf(strbuf,"%s system.vc", vcedprog);\r
+  system(strbuf);\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+  InitVideo(vm);\r
+  set_intensity(63);\r
+  InitMouse();\r
+  InitKeyboard();\r
+  InitTimer();\r
+}\r
+\r
+char s[256];\r
+\r
+void CompileAll()\r
+{\r
+  FILE *f;\r
+  char *p;\r
+\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  sprintf(strbuf,"vcc all q",mapname);\r
+  system(strbuf);\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+\r
+  if (!(f=fopen("error.txt","r")))\r
+  {\r
+    Message("All VC scripts sucessfully compiled.",300);\r
+    return;\r
+  }\r
+\r
+  fgets(s,99,f);\r
+  fclose(f);\r
+  p=s;\r
+  while (*p)\r
+  {\r
+    if (*p==13 || *p==10) *p=0;\r
+    p++;\r
+  }\r
+  VCNotify(s);\r
+}\r
+\r
+void CompileMAP()\r
+{\r
+  FILE *f;\r
+  char *p;\r
+\r
+  MD_PlayStop();\r
+  MD_Exit();\r
+\r
+  sprintf(strbuf,"vcc %s q",mapname);\r
+  system(strbuf);\r
+\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+  if (strlen(musname)) PlayMusic(musname);\r
+\r
+  if (!(f=fopen("error.txt","r"))) return;\r
+\r
+  fgets(s,99,f);\r
+  fclose(f);\r
+  p=s;\r
+  while (*p)\r
+  {\r
+    if (*p==13 || *p==10) *p=0;\r
+    p++;\r
+  }\r
+  VCNotify(s);\r
+}\r
+\r
+void tickhandler(void)\r
+{\r
+  MP_HandleTick();\r
+  MD_SetBPM(mp_bpm);\r
+}\r
+\r
+void RenderHighlight()\r
+{ int zx, zy;\r
+  int xw, yw;\r
+\r
+  if (mh)\r
+  {\r
+    xw=xwin&15;\r
+    yw=ywin&15;\r
+    zx=((mx+xw)&~15)-xw;\r
+    zy=((my+yw)&~15)-yw;\r
+\r
+    DrawHighlight(zx-1, zy-1);\r
+  }\r
+}\r
+\r
+int EntityThere(int xw, int yw)\r
+{ int i;\r
+\r
+  for (i=0; i<entities; i++)\r
+  {\r
+    if (entity[i].x==xw && entity[i].y==yw) return i+1;\r
+  }\r
+  return 0;\r
+}\r
+\r
+void AllocateEntity(int xw, int yw)\r
+{\r
+  memset(&entity[entities], 0, sizeof(entity) / 256);\r
+  entity[entities].x=xw;\r
+  entity[entities].y=yw;\r
+  entities++;\r
+}\r
+\r
+void ProcessEntity(int xw, int yw)\r
+{ int a;\r
+\r
+  a=EntityThere(xw,yw);\r
+  if (!a)\r
+  {\r
+     AllocateEntity(xw,yw);\r
+     while (mb)\r
+       ReadMouse(); // har! this was readmouse() @_@ <aen, apr 21>\r
+     mb=0;\r
+     return;\r
+  }\r
+  EntityEditor(a-1);\r
+}\r
+\r
+void DeleteEntity(int xw, int yw)\r
+{ int i,a;\r
+  char t[60];\r
+\r
+  a=EntityThere(xw,yw)-1;\r
+  sprintf(t,"Delete entity %d?",a);\r
+  if (!Confirm(t)) return;\r
+  for (i=a; i<entities; i++)\r
+  {\r
+    entity[i]=entity[i+1];\r
+  }\r
+  entities--;\r
+}\r
+\r
+int bxsize=130, bysize=170;\r
+int bxofs=80, byofs=25;\r
+int bmode=0;\r
+\r
+void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest)\r
+{ struct find_t *f;\r
+  char i, *d, mode;\r
+  char *blah;\r
+  int fc=0, ofs=0, cfs=0, a, b;\r
+  char done=0, moving=0;\r
+  int mxo, myo, cursorblink;\r
+  char ctf=0, cb=0, c, t, *str;\r
+  //int zx,zy,zw;\r
+  char dragging=0;\r
+\r
+  f=(struct find_t *) valloc(sizeof *f, "browse() tmp",0);\r
+  blah=(char *) valloc(13*256,"browse()tmp2", 0);\r
+  //memset(blah, 0, 13*256);\r
+  n++;\r
+\r
+  for (i=0; i<n; i++)\r
+  {\r
+    switch (i)\r
+    {\r
+      case 0: d="AJDLMMZZ.GAH"; mode=0xFF; break;\r
+      case 1: d=m1; mode=0xFF; break;\r
+      case 2: d=m2; mode=0xFF; break;\r
+      case 3: d=m3; mode=0xFF; break;\r
+      case 4: d=m4; mode=0xFF; break;\r
+      default: err("uhh..."); break;\r
+    }\r
+    if (_dos_findfirst(d, mode, f)) continue;\r
+    memcpy(blah+(fc*13), f->name, 13); fc++;\r
+    while (!_dos_findnext(f))\r
+    {\r
+      memcpy(blah+(fc*13), f->name, 13); fc++;\r
+    }\r
+  }\r
+  vfree(f);\r
+  last_pressed=0;\r
+  a=fc<22?117:2574/fc;\r
+//  errn("%d",fc);\r
+  do\r
+  {\r
+    if (!bmode)\r
+    {\r
+      RenderMap();\r
+      RenderGUI();\r
+    }\r
+    else\r
+    {\r
+      RenderSelector();\r
+      RenderMessages();\r
+    }\r
+    if (ctf && systemtime >= cursorblink)\r
+    {\r
+      cb ^= 1;\r
+      cursorblink = systemtime+40;\r
+    }\r
+    if (moving)\r
+    {\r
+      bxofs = (mx-mxo);\r
+      byofs = (my-myo);\r
+      if (!mb) moving=0;\r
+      if (bxofs<16) bxofs = 16;\r
+      if (byofs<16) byofs = 16;\r
+      if (bxofs+bxsize>335) bxofs = 336-bxsize;\r
+      if (byofs+bysize>sy+16) byofs = (sy+16)-bysize;\r
+    }\r
+\r
+    Window(bxofs, byofs, bxofs+bxsize, byofs+bysize, "Browse");\r
+    Button(bxofs+65, byofs+157, "OK");\r
+    Button(bxofs+96, byofs+157, "Cancel");\r
+    FilledBox(bxofs+20, byofs+15, 80, 135, black);\r
+    FilledBox(bxofs+100, byofs+15, 10, 135, 2);\r
+    HLine(bxofs+20, byofs+15, 90, darkw);\r
+    VLine(bxofs+20, byofs+15, 135, darkw);\r
+    VLine(bxofs+99, byofs+16, 134, white);\r
+    VLine(bxofs+109, byofs+16, 134, white);\r
+    HLine(bxofs+21, byofs+149, 89, white);\r
+    stdwindow(bxofs+100, byofs+16, bxofs+109, byofs+25);\r
+    stdwindow(bxofs+100, byofs+140, bxofs+109, byofs+149);\r
+    b=byofs+24+(fc != 22 ? ((117-a)*ofs)/(fc-22) : 0);\r
+\r
+    //draws the drag box\r
+    stdwindow(bxofs+100, b, bxofs+109, b+a);\r
+\r
+    FilledBox(bxofs+21, byofs+((cfs-ofs)*6)+16, 78, 6, darkw);\r
+\r
+    // Render actual filename thingies\r
+    i=0;\r
+    while (1)\r
+    {\r
+      if (i+ofs<fc && i<22)\r
+      {\r
+        GotoXY(bxofs+22, byofs+17+(i*6));\r
+        printstring(blah+((i+ofs)*13));\r
+      }\r
+      else break;\r
+      i++;\r
+    }\r
+\r
+    DrawMouse();\r
+    ShowPage();\r
+    CheckTimerStuff();\r
+\r
+    // input phase\r
+\r
+    if(dragging&&!mb)\r
+    {\r
+      dragging=0;\r
+    }\r
+\r
+    if((mb==1&&mx>bxofs+100&&mx<bxofs+110&&my>byofs+25&&my<byofs+135)||dragging)\r
+    {\r
+      if(my>b&&my<b+a)\r
+      {\r
+        dragging=1;\r
+      }\r
+      else\r
+      {\r
+        if(my<b)\r
+        {\r
+          if (ofs<22) ofs=0;\r
+          else ofs-=22;\r
+          cfs=ofs;\r
+        }\r
+        if(my>b+a)\r
+        {\r
+          if (ofs+45>fc) ofs=fc-22;\r
+          else ofs+=22;\r
+          cfs=ofs;\r
+        }\r
+      }\r
+    }\r
+    if(!dragging)\r
+    {\r
+    if (mb==1 && mx>bxofs+20 && mx<bxofs+100 && my>byofs+15 && my<byofs+149)\r
+    {\r
+      i=(my-byofs-16)/6;\r
+      i+=ofs;\r
+      memcpy(dest,blah+(i*13),13);\r
+      done=1;\r
+      break;\r
+    }\r
+    if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+15 && my<byofs+25)\r
+    {\r
+      WaitRelease();\r
+      key[SCAN_UP]=1;\r
+      last_pressed=SCAN_UP;\r
+    }\r
+    if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+139 && my<byofs+149)\r
+    {\r
+      WaitRelease();\r
+      key[SCAN_DOWN]=1;\r
+      last_pressed=SCAN_DOWN;\r
+    }\r
+    if (mb==1 && mx>bxofs+65 && mx<bxofs+30+65 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+    {\r
+      memcpy(dest, blah, 13); done=1;\r
+      ButtonPressed(bxofs+65, byofs+157, "OK");\r
+      DrawMouse();\r
+      while (mb)\r
+      {\r
+        ReadMouse();\r
+        ShowPage();\r
+        ReadMouse();\r
+      }\r
+      WaitRelease(); continue;\r
+    }\r
+\r
+    if (mb==1 && mx>bxofs+96 && mx<bxofs+30+96 && my>byofs+157 && my<byofs+10+157 && !moving)\r
+    {\r
+      *dest=0; done=1;\r
+      ButtonPressed(bxofs+96, byofs+157, "Cancel");\r
+      DrawMouse();\r
+      while (mb)\r
+      {\r
+        ReadMouse();\r
+        ShowPage();\r
+        ReadMouse();\r
+      }\r
+      WaitRelease(); continue;\r
+    }\r
+\r
+    if (mb==1 && mx>(bxofs+bxsize-9) && (mx<bxofs+bxsize-2)\r
+    && my>(byofs+1) && (my<byofs+8) && !moving)\r
+    {\r
+      done=1;\r
+      WaitRelease();\r
+      break;\r
+    }\r
+\r
+    if (mb==1 && mx>bxofs && mx<bxofs+bxsize && my>byofs && my<(byofs+9) && !moving)\r
+    {\r
+      moving=1;\r
+      mxo=mx-bxofs;\r
+      myo=my-byofs;\r
+      continue;\r
+    }\r
+\r
+    if (mb==1 && !moving)\r
+    {\r
+      ctf=0;\r
+      cb=0;\r
+      str=0;\r
+    }\r
+\r
+    if (last_pressed)\r
+    {\r
+      if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
+      else c=key_ascii_tbl[last_pressed];\r
+\r
+      if (last_pressed==SCAN_ESC)\r
+      {\r
+        key[SCAN_ESC]=0;\r
+        done=1;\r
+        break;\r
+      }\r
+      if (key[SCAN_PGUP])\r
+      {\r
+        if (ofs<22) ofs=0;\r
+        else ofs-=22;\r
+        cfs=ofs;\r
+        key[SCAN_PGUP]=0;\r
+        continue;\r
+      }\r
+      if (key[SCAN_PGDN])\r
+      {\r
+        if (ofs+45>fc) ofs=fc-22;\r
+        else ofs+=22;\r
+        if (fc<22) ofs=0;\r
+        cfs=ofs;\r
+        key[SCAN_PGDN]=0;\r
+        continue;\r
+      }\r
+      if (key[SCAN_UP])\r
+      {\r
+        if (cfs) cfs--;\r
+        if (ofs>cfs) ofs--;\r
+        key[SCAN_UP]=0;\r
+        last_pressed=0;\r
+        continue;\r
+      }\r
+      if (key[SCAN_DOWN])\r
+      {\r
+        if (cfs<fc-1) cfs++;\r
+        if (cfs-ofs>21) ofs++;\r
+        key[SCAN_DOWN]=0;\r
+        last_pressed=0;\r
+        continue;\r
+      }\r
+      if (last_pressed==SCAN_ENTER)\r
+      {\r
+        memcpy(dest,blah+(cfs*13),13);\r
+        key[SCAN_ENTER]=0;\r
+        done=1;\r
+        ctf=0;\r
+        str=0;\r
+        last_pressed=0;\r
+        break;\r
+      }\r
+\r
+      if (last_pressed==SCAN_TAB)\r
+      {\r
+        switch (ctf)\r
+        {\r
+          case 0: ctf=0; str=0; break;\r
+        }\r
+        key[SCAN_TAB]=0;\r
+        last_pressed=0;\r
+        cb=1; cursorblink=systemtime+40;\r
+        continue;\r
+      }\r
+\r
+      if (!ctf)\r
+        continue;\r
+\r
+      if (last_pressed==SCAN_BACKSP && strlen(str))\r
+      {\r
+        str[strlen(str)-1]=0;\r
+        key[SCAN_BACKSP]=0;\r
+        last_pressed=0;\r
+        continue;\r
+      }\r
+      else if (last_pressed==SCAN_BACKSP)\r
+      {\r
+        last_pressed=0;\r
+        continue;\r
+      }\r
+\r
+      t=strlen(str);\r
+      str[t]=c;\r
+      str[t+1]=0;\r
+      last_pressed=0;\r
+      }\r
+    }\r
+  } while (!done);\r
+  vfree(blah);\r
+}\r
+\r
+#include "vergepal.h"\r
+#define LOGFILE "maped.log"\r
+\r
+void Log(char *text, ...)\r
+{\r
+   va_list argptr;\r
+   char msg[256];\r
+   FILE *logf;\r
+\r
+   va_start(argptr, text);\r
+   vsprintf(msg, text, argptr);\r
+   va_end(argptr);\r
+\r
+   logf=fopen(LOGFILE,"aw");\r
+   fprintf(logf,"%s\n",msg);\r
+   fflush(logf);\r
+   fclose(logf);\r
+}\r
+\r
+int main(int argc, char *argv[])\r
+{\r
+\r
+  remove(LOGFILE);\r
+  md_mixfreq=44100;\r
+  md_dmabufsize=5000;\r
+  md_mode=DMODE_16BITS|DMODE_STEREO;\r
+  md_device=0;\r
+  memset(&chrs, 0, sizeof chrs);\r
+\r
+  Log("GetConfig");\r
+  GetConfig("maped.cfg");\r
+  Log("LoadTransTbl");\r
+  translucency_table=0; //zero\r
+  LoadTransTable(); //zero\r
+\r
+  Log("RegisterModLoaders");\r
+  ML_RegisterLoader(&load_mod);\r
+  ML_RegisterLoader(&load_s3m);\r
+  ML_RegisterLoader(&load_xm);\r
+  ML_RegisterLoader(&load_uni);\r
+\r
+  Log("RegisterSndDrivers");\r
+  MD_RegisterDriver(&drv_nos);\r
+  MD_RegisterDriver(&drv_sb);\r
+  MD_RegisterDriver(&drv_gus);\r
+  MD_RegisterPlayer(tickhandler);\r
+  soundokay=1;\r
+  Log("Initialize snd lib");\r
+  if (!MD_Init())\r
+  {\r
+    printf("Couldn't initialize sound: %s.\n", myerr);\r
+    delay(500);\r
+    soundokay=0;\r
+  }\r
+\r
+  //Log("Initialize CD audio");\r
+  //CD_Init();\r
+\r
+  Log("Initialize timer");\r
+  InitTimer();\r
+  Log("Initialize video");\r
+  InitVideo(vm);\r
+  Log("Initialize mouse");\r
+  InitMouse();\r
+  Log("Initialize keyboard IRQ handler");\r
+  InitKeyboard();\r
+\r
+  Log("Initializing map data");\r
+  if (argc==1 && !Exist("untitled.map"))\r
+  {\r
+    SetPalette(vergepal);\r
+    memcpy(pal, vergepal, 768);\r
+    memcpy(mapname,"UNTITLED.MAP",13);\r
+    memcpy(vspname,"UNTITLED.VSP",13);\r
+    memcpy(rstring,"1E",2);\r
+    numlayers=1;\r
+\r
+    // aen: default newmap dimensions set to 100x100\r
+    layer[0].pmultx=1;  layer[0].pmulty=1;\r
+    layer[0].pdivx=1;   layer[0].pdivy=1;\r
+    layer[0].sizex=100; layer[0].sizey=100;\r
+    layer[0].trans=0;   layer[0].hline=0;\r
+\r
+    layers[0]=(unsigned short *) valloc((layer[0].sizex*layer[0].sizey*2)+4,"layer data",0);\r
+    //memset(layers[0],0,(layer[0].sizex*layer[0].sizey)*2);\r
+    obstruct=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"obstruct map",0);\r
+    zone=(char *) valloc((layer[0].sizex*layer[0].sizey)+4,"zone map", 0);\r
+\r
+    // aen: default number of tiles set to 100\r
+    numtiles=100;\r
+    vsp=(char *) valloc(256 * numtiles,"vsp data", 0);\r
+    wrap=0; el=0; layertoggle[0]=1;\r
+    InitTileIDX();\r
+  }\r
+  else\r
+  {\r
+    if (argc==1) memcpy(mapname, "untitled.map",13);\r
+    else memcpy(mapname, argv[1], strlen(argv[1]));\r
+    LoadMAP(mapname);\r
+    InitTileIDX();\r
+ }\r
+Log("Entering main loop");\r
+thingy:\r
+  while (!(key[SCAN_ALT] && key[SCAN_X]))\r
+  {\r
+    ProcessControls();\r
+    while (tick)\r
+    {\r
+      tick--;\r
+      PollMovement();\r
+    }\r
+    RenderMap();\r
+    RenderHighlight();\r
+    RenderGUI();\r
+    ShowPage();\r
+  }\r
+  if (modified)\r
+     if (!Confirm("Lose unsaved changes?"))\r
+     {\r
+       key[SCAN_ALT]=0;\r
+       key[SCAN_X]=0;\r
+       goto thingy;\r
+     }\r
+\r
+  ShutdownVideo();\r
+  ShutdownKeyboard();\r
+  ShutdownTimer();\r
+  SaveNewCFG();\r
+  remove("$$BACKUP.MAP");\r
+  remove("$$BACKUP.VSP");\r
+\r
+  //if (curtrack != 1) CD_Stop();\r
+  //CD_DeInit(); // wasn't even valid! CD_Deinit() was incorrect <aen, apr 21>\r
+  MD_PlayStop(); // Mordred\r
+  ML_Free(mf);\r
+\r
+  MD_Exit();\r
+  if (translucency_table)\r
+    vfree(translucency_table); //zero\r
+  return 0;\r
+}\r