--- /dev/null
+/*\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