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
17 const char *const ME2_VERSION = "2.01a";
\r
19 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\r
22 // + erased valloc(), replaced with a_memory.c
\r
23 // + added Log() -- output to MAPED.LOG
\r
24 // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\r
36 #include "keyboard.h"
\r
41 #include "vdriver.h"
\r
44 #include "smalfont.h"
\r
45 #include "tilesel.h"
\r
46 #include "minimap.h"
\r
47 #include "guicomp.h"
\r
50 #define byte unsigned char
\r
51 #define word unsigned short
\r
53 // Includes for a_memory.c
\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
63 // ================================= Data ====================================
\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
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
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
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
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
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
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
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
189 // -- vsp related data --
\r
191 unsigned short numtiles; // number of allocated tiles in VSP
\r
192 unsigned char *vsp; // VSP ptr
\r
196 // -- map compression
\r
198 char *cb,*csrc; // compression workspace buffer
\r
199 int bufsize; // how many bytes need to be written
\r
201 // -- editing related data --
\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
212 // -- music stuff --
\r
218 // -- copy/paste & block fill --
\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
227 byte* translucency_table; //zero
\r
229 int moving_up=0,moving_down=0,moving_left=0,moving_right=0; // aen
\r
231 // ================================= Code ====================================
\r
234 void LoadTransTable()
\r
238 if (!translucency_table)
\r
239 translucency_table=(byte *) valloc(65536,"trans tbl",0);
\r
241 fp=fopen("trans.tbl","rb");
\r
244 vfree(translucency_table);
\r
245 translucency_table=0;
\r
249 fread(translucency_table, 65536, 1, fp);
\r
253 int Exist(char *fname)
\r
256 tempf=fopen(fname,"rb");
\r
265 void err(char *str, ...)
\r
270 va_start(argptr, str);
\r
271 vsprintf(msg, str, argptr);
\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
281 printf("%s \n",msg);
\r
285 void errf(char *str, char *str1)
\r
287 sprintf(strbuf,str,str1);
\r
291 void errn(char *str, int n)
\r
293 sprintf(strbuf,str,n);
\r
297 int random(int lo, int hi)
\r
300 int i=rand() % range;
\r
304 void PlayMusic(char *fname)
\r
306 if (!soundokay) return;
\r
313 mf=ML_LoadFN(fname);
\r
316 Message("Could not load specified music.",500);
\r
320 md_numchn=mf->numchn; mp_loop=1;
\r
327 if (!soundokay) return;
\r
333 void LoadVSP(char *fname)
\r
337 if (!(f=fopen(fname,"rb")))
\r
338 errf("VSP file %s not found.",fname);
\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
345 fread(&pal, 1, 768, f);
\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
355 fread(&pal, 1, 768, f);
\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
366 void SaveVSP(char *fname)
\r
370 f=fopen(fname,"wb");
\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
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
385 void EmitC (char c)
\r
392 void EmitW (short int w)
\r
405 void WriteCompressedLayer1(unsigned char *p, int len)
\r
407 unsigned char byt,samect;
\r
408 unsigned char repcode;
\r
415 while (samect<254 && i<len && byt==p[i])
\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
426 repcode=(char) samect;
\r
433 void ReadCompressedLayer1(unsigned char *dest, int len, FILE *f)
\r
441 fread(&w, 1, 1, f);
\r
444 fread(&run, 1, 1, f);
\r
445 fread(&w, 1, 1, f);
\r
446 for (j=0; j<run; j++)
\r
458 void WriteCompressedLayer2(unsigned short *p,int len)
\r
460 unsigned short byt,samect;
\r
461 unsigned char repcode;
\r
468 while (samect<255 && i<len && byt==p[i])
\r
475 repcode=(char) samect;
\r
484 void ReadCompressedLayer2(unsigned short *dest, int len, FILE *f)
\r
492 fread(&w, 1, 2, f);
\r
493 if ((w & 0xFF00)==0xFF00)
\r
495 run=(char) (w & 0x00FF);
\r
496 fread(&w, 1, 2, f);
\r
497 for (j=0; j<run; j++)
\r
509 void CountUsedZones()
\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
526 void CountMoveScripts()
\r
532 if (strlen(ms[i].t)) break;
\r
544 if (strlen(chrlist[i].t)) break;
\r
550 void SaveMAP(char *fname)
\r
552 int i, ofstbl[100], ct, t;
\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
569 for (i=0; i<numlayers; i++)
\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
577 // Compress and write Obstruction data
\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
589 fwrite(&numzones, 1, 4, f);
\r
590 fwrite(&zones, numzones, 50, f);
\r
593 fwrite(&nmchr, 1, 1, f);
\r
594 fwrite(&chrlist, 60, nmchr, f);
\r
596 fwrite(&entities, 1, 1, f);
\r
597 fwrite(&entity, sizeof(entity)/256, entities, f);
\r
599 CountMoveScripts();
\r
600 fwrite(&nms, 1, 1, f); // Calc offset buffer
\r
602 for (i=0; i<nms; i++)
\r
605 t=strlen(&ms[i].t)+1;
\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
612 fwrite(&ms[i].t, 1, strlen(&ms[i].t)+1, f);
\r
616 fwrite(&ct, 1, 4, f);
\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
625 fwrite(&ct, 1, 4, f);
\r
629 void LoadOldMAP(FILE *f)
\r
630 { int i, j, ct, ofstbl[100];
\r
633 // Reads a VERGE 1 format version 4 MAP file.
\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
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
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
660 // Convert MAP Properties layer to respective Zone and Obstruction layers
\r
662 for (j=0; j<layer[0].sizey; j++)
\r
663 for (i=0; i<layer[0].sizex; i++)
\r
665 if ((cb[(j*layer[0].sizex)+i] & 1)==1)
\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
673 // Load and convert zone data records.
\r
675 for (i=0; i<128; i++)
\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
686 for (i=0; i<100; i++) // Load and convert CHR list
\r
687 fread(&chrlist[i].t, 1, 13, f);
\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
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
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
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
722 memcpy(entity[i].desc, oldent.entitydesc, 20);
\r
725 fread(&nms, 1, 1, f);
\r
726 fread(&ct, 1, 4, f);
\r
727 fread(&ofstbl, nms, 4, f);
\r
729 for (i=0; i<nms; i++)
\r
730 fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);
\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
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
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
756 void LoadMAP(char *fname)
\r
758 int i, ct, ofstbl[100];
\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
770 errf("%s is not a recognized MAP file.",fname);
\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
785 for (i=0; i<numlayers; i++)
\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
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
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
805 memset(&zones, 0, sizeof zones);
\r
806 fread(&numzones, 1, 4, f);
\r
807 fread(&zones, numzones, 50, f);
\r
809 memset(&chrlist, 0, sizeof chrlist);
\r
810 fread(&nmchr, 1, 1, f);
\r
811 fread(&chrlist, 60, nmchr, f);
\r
814 fread(&entities, 1, 1, f);
\r
815 fread(&entity, sizeof(entity)/256, entities, f);
\r
817 fread(&nms, 1, 1, f);
\r
818 fread(&ct, 1, 4, f);
\r
819 fread(&ofstbl, nms, 4, f);
\r
821 for (i=0; i<nms; i++)
\r
822 fread(&ms[i].t, 1, (ofstbl[i+1]-ofstbl[i]), f);
\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
836 memset(vadelay, 0, 200);
\r
837 for (i=0; i<MAXTILES; i++)
\r
841 void CheckTimerStuff()
\r
844 if (backupct>30000)
\r
846 Message("Generating Auto-backup",150);
\r
847 SaveMAP("$$BACKUP.MAP");
\r
848 SaveVSP("$$BACKUP.VSP");
\r
851 if (idlect>8000 && !inss)
\r
860 extern int difficulty;
\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
907 #include "controls.c"
\r
912 ShutdownKeyboard();
\r
917 system("COMMAND.COM");
\r
921 printf("Couldn't initialize sound: %s.\n", myerr);
\r
925 if (strlen(musname)) PlayMusic(musname);
\r
936 ShutdownKeyboard();
\r
945 printf("Couldn't initialize sound: %s.\n", myerr);
\r
949 if (strlen(musname)) PlayMusic(musname);
\r
960 ShutdownKeyboard();
\r
965 sprintf(strbuf,"verge %s",mapname);
\r
970 printf("Couldn't initialize sound: %s.\n", myerr);
\r
974 if (strlen(musname)) PlayMusic(musname);
\r
982 void ShellEditMAP()
\r
989 ShutdownKeyboard();
\r
994 sprintf(fn,"%s",mapname);
\r
1001 sprintf(strbuf,"%s %s.vc", vcedprog, fn);
\r
1006 printf("Couldn't initialize sound: %s.\n", myerr);
\r
1010 if (strlen(musname)) PlayMusic(musname);
\r
1012 set_intensity(63);
\r
1018 void ShellEditSystem()
\r
1023 ShutdownKeyboard();
\r
1028 sprintf(strbuf,"%s system.vc", vcedprog);
\r
1033 printf("Couldn't initialize sound: %s.\n", myerr);
\r
1037 if (strlen(musname)) PlayMusic(musname);
\r
1039 set_intensity(63);
\r
1055 sprintf(strbuf,"vcc all q",mapname);
\r
1060 printf("Couldn't initialize sound: %s.\n", myerr);
\r
1064 if (strlen(musname)) PlayMusic(musname);
\r
1066 if (!(f=fopen("error.txt","r")))
\r
1068 Message("All VC scripts sucessfully compiled.",300);
\r
1077 if (*p==13 || *p==10) *p=0;
\r
1091 sprintf(strbuf,"vcc %s q",mapname);
\r
1096 printf("Couldn't initialize sound: %s.\n", myerr);
\r
1100 if (strlen(musname)) PlayMusic(musname);
\r
1102 if (!(f=fopen("error.txt","r"))) return;
\r
1109 if (*p==13 || *p==10) *p=0;
\r
1115 void tickhandler(void)
\r
1118 MD_SetBPM(mp_bpm);
\r
1121 void RenderHighlight()
\r
1129 zx=((mx+xw)&~15)-xw;
\r
1130 zy=((my+yw)&~15)-yw;
\r
1132 DrawHighlight(zx-1, zy-1);
\r
1136 int EntityThere(int xw, int yw)
\r
1139 for (i=0; i<entities; i++)
\r
1141 if (entity[i].x==xw && entity[i].y==yw) return i+1;
\r
1146 void AllocateEntity(int xw, int yw)
\r
1148 memset(&entity[entities], 0, sizeof(entity) / 256);
\r
1149 entity[entities].x=xw;
\r
1150 entity[entities].y=yw;
\r
1154 void ProcessEntity(int xw, int yw)
\r
1157 a=EntityThere(xw,yw);
\r
1160 AllocateEntity(xw,yw);
\r
1162 ReadMouse(); // har! this was readmouse() @_@ <aen, apr 21>
\r
1166 EntityEditor(a-1);
\r
1169 void DeleteEntity(int xw, int yw)
\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
1178 entity[i]=entity[i+1];
\r
1183 int bxsize=130, bysize=170;
\r
1184 int bxofs=80, byofs=25;
\r
1187 void Browse(char n, char *m1, char *m2, char *m3, char *m4, char *dest)
\r
1188 { struct find_t *f;
\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
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
1203 for (i=0; i<n; i++)
\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
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
1218 memcpy(blah+(fc*13), f->name, 13); fc++;
\r
1223 a=fc<22?117:2574/fc;
\r
1237 if (ctf && systemtime >= cursorblink)
\r
1240 cursorblink = systemtime+40;
\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
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
1267 //draws the drag box
\r
1268 stdwindow(bxofs+100, b, bxofs+109, b+a);
\r
1270 FilledBox(bxofs+21, byofs+((cfs-ofs)*6)+16, 78, 6, darkw);
\r
1272 // Render actual filename thingies
\r
1276 if (i+ofs<fc && i<22)
\r
1278 GotoXY(bxofs+22, byofs+17+(i*6));
\r
1279 printstring(blah+((i+ofs)*13));
\r
1287 CheckTimerStuff();
\r
1296 if((mb==1&&mx>bxofs+100&&mx<bxofs+110&&my>byofs+25&&my<byofs+135)||dragging)
\r
1306 if (ofs<22) ofs=0;
\r
1312 if (ofs+45>fc) ofs=fc-22;
\r
1320 if (mb==1 && mx>bxofs+20 && mx<bxofs+100 && my>byofs+15 && my<byofs+149)
\r
1322 i=(my-byofs-16)/6;
\r
1324 memcpy(dest,blah+(i*13),13);
\r
1328 if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+15 && my<byofs+25)
\r
1332 last_pressed=SCAN_UP;
\r
1334 if (mb==1 && mx>bxofs+100 && mx<bxofs+110 && my>byofs+139 && my<byofs+149)
\r
1338 last_pressed=SCAN_DOWN;
\r
1340 if (mb==1 && mx>bxofs+65 && mx<bxofs+30+65 && my>byofs+157 && my<byofs+10+157 && !moving)
\r
1342 memcpy(dest, blah, 13); done=1;
\r
1343 ButtonPressed(bxofs+65, byofs+157, "OK");
\r
1351 WaitRelease(); continue;
\r
1354 if (mb==1 && mx>bxofs+96 && mx<bxofs+30+96 && my>byofs+157 && my<byofs+10+157 && !moving)
\r
1357 ButtonPressed(bxofs+96, byofs+157, "Cancel");
\r
1365 WaitRelease(); continue;
\r
1368 if (mb==1 && mx>(bxofs+bxsize-9) && (mx<bxofs+bxsize-2)
\r
1369 && my>(byofs+1) && (my<byofs+8) && !moving)
\r
1376 if (mb==1 && mx>bxofs && mx<bxofs+bxsize && my>byofs && my<(byofs+9) && !moving)
\r
1384 if (mb==1 && !moving)
\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
1396 if (last_pressed==SCAN_ESC)
\r
1402 if (key[SCAN_PGUP])
\r
1404 if (ofs<22) ofs=0;
\r
1410 if (key[SCAN_PGDN])
\r
1412 if (ofs+45>fc) ofs=fc-22;
\r
1422 if (ofs>cfs) ofs--;
\r
1427 if (key[SCAN_DOWN])
\r
1429 if (cfs<fc-1) cfs++;
\r
1430 if (cfs-ofs>21) ofs++;
\r
1435 if (last_pressed==SCAN_ENTER)
\r
1437 memcpy(dest,blah+(cfs*13),13);
\r
1438 key[SCAN_ENTER]=0;
\r
1446 if (last_pressed==SCAN_TAB)
\r
1450 case 0: ctf=0; str=0; break;
\r
1454 cb=1; cursorblink=systemtime+40;
\r
1461 if (last_pressed==SCAN_BACKSP && strlen(str))
\r
1463 str[strlen(str)-1]=0;
\r
1464 key[SCAN_BACKSP]=0;
\r
1468 else if (last_pressed==SCAN_BACKSP)
\r
1484 #include "vergepal.h"
\r
1485 #define LOGFILE "maped.log"
\r
1487 void Log(char *text, ...)
\r
1493 va_start(argptr, text);
\r
1494 vsprintf(msg, text, argptr);
\r
1497 logf=fopen(LOGFILE,"aw");
\r
1498 fprintf(logf,"%s\n",msg);
\r
1503 int main(int argc, char *argv[])
\r
1508 md_dmabufsize=5000;
\r
1509 md_mode=DMODE_16BITS|DMODE_STEREO;
\r
1511 memset(&chrs, 0, sizeof chrs);
\r
1514 GetConfig("maped.cfg");
\r
1515 Log("LoadTransTbl");
\r
1516 translucency_table=0; //zero
\r
1517 LoadTransTable(); //zero
\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
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
1531 Log("Initialize snd lib");
\r
1534 printf("Couldn't initialize sound: %s.\n", myerr);
\r
1539 //Log("Initialize CD audio");
\r
1542 Log("Initialize timer");
\r
1544 Log("Initialize video");
\r
1546 Log("Initialize mouse");
\r
1548 Log("Initialize keyboard IRQ handler");
\r
1551 Log("Initializing map data");
\r
1552 if (argc==1 && !Exist("untitled.map"))
\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
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
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
1572 // aen: default number of tiles set to 100
\r
1574 vsp=(char *) valloc(256 * numtiles,"vsp data", 0);
\r
1575 wrap=0; el=0; layertoggle[0]=1;
\r
1580 if (argc==1) memcpy(mapname, "untitled.map",13);
\r
1581 else memcpy(mapname, argv[1], strlen(argv[1]));
\r
1585 Log("Entering main loop");
\r
1587 while (!(key[SCAN_ALT] && key[SCAN_X]))
\r
1589 ProcessControls();
\r
1596 RenderHighlight();
\r
1601 if (!Confirm("Lose unsaved changes?"))
\r
1609 ShutdownKeyboard();
\r
1612 remove("$$BACKUP.MAP");
\r
1613 remove("$$BACKUP.VSP");
\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
1621 if (translucency_table)
\r
1622 vfree(translucency_table); //zero
\r