]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/verge/MAPED/TILESEL.C
wwww
[16.git] / 16 / v2 / source / verge / MAPED / TILESEL.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 #include <stdio.h>\r
18 #include <string.h>\r
19 #include <malloc.h>\r
20 #include <stdlib.h>\r
21 \r
22 #include "config.h"\r
23 #include "keyboard.h"\r
24 #include "maped.h"\r
25 #include "mouse.h"\r
26 #include "render.h"\r
27 #include "tileed.h"\r
28 #include "timer.h"\r
29 #include "vdriver.h"\r
30 \r
31 #include "smalfont.h"\r
32 #include "guicomp.h"\r
33 #include "gui.h"\r
34 \r
35 extern byte TileCmp(byte *one, byte *two); //zero\r
36 \r
37 // ================================= Data ====================================\r
38 \r
39 int selofs=0;\r
40 char ttile[256], ttile2[256];\r
41 char curastd=0;\r
42 char curmode=0;\r
43 \r
44 // ================================= Code ====================================\r
45 \r
46 int curtileptr(int row)\r
47 {\r
48   int jumper,wide;\r
49   int x,y;\r
50 \r
51   jumper=16+pad;\r
52   wide=320/jumper;\r
53 \r
54   x=(mx-16)/jumper;\r
55   y=((my-16)/jumper)*wide;\r
56 \r
57   return x+y+row;\r
58 }\r
59 \r
60 void NormalButton(int x1, int y1, int x2, int y2, char *str)\r
61 {\r
62   FilledBox(x1, y1, x2, y2, winbg);\r
63   HLine(x1, y1, x2, black);\r
64   VLine(x1, y1, y2, black);\r
65   HLine(x1+1, y1+y2-1, x2-1, black);\r
66   VLine(x1+x2-1, y1+1, y2-1, black);\r
67 \r
68   HLine(x1+1, y1+1, x2-2, brightw);\r
69   VLine(x1+1, y1+1, y2-2, brightw);\r
70   HLine(x1+2, y1+y2-2, x2-3, darkw);\r
71   VLine(x1+x2-2, y1+2, y2-3, darkw);\r
72   GotoXY(x1+((x2-pixels(str))/2), y1+3);\r
73   printstring(str);\r
74 }\r
75 \r
76 void PressdButton(int x1, int y1, int x2, int y2, char *str)\r
77 {\r
78   FilledBox(x1, y1, x2, y2, winbg);\r
79   HLine(x1, y1, x2, black);\r
80   VLine(x1, y1, y2, black);\r
81   HLine(x1+1, y1+y2-1, x2-1, black);\r
82   VLine(x1+x2-1, y1+1, y2-1, black);\r
83 \r
84   HLine(x1+1, y1+1, x2-2, darkw);\r
85   VLine(x1+1, y1+1, y2-2, darkw);\r
86   GotoXY(x1+((x2-pixels(str))/2)+1, y1+4);\r
87   printstring(str);\r
88 }\r
89 \r
90 void RenderSelector()\r
91 { unsigned char *img,i,j;\r
92   int z;\r
93   int tskip=16+pad;\r
94   int twide=320/tskip;\r
95   int tdeep=((200+15)&~15)/tskip;\r
96 \r
97   ClearScreen();\r
98 \r
99   for (i=0; i<tdeep; ++i)\r
100     for (j=0; j<twide; ++j)\r
101     {\r
102       img=vsp+(256*((i*twide)+j+selofs));\r
103       if (((i*twide)+j+selofs)>=numtiles) img=vsp;\r
104       CopyTile((j*tskip)+16,(i*tskip)+16,img);\r
105     }\r
106   if (th)\r
107   {\r
108     if (my<(tsy-40))\r
109     DrawHighlight( ((mx/tskip)*tskip)-(1+pad),\r
110                    ((my/tskip)*tskip)-(1+pad));\r
111   }\r
112   z=tsy-40;\r
113   sprintf(strbuf,"MapEd %s Tile Selector - Tile %d/%d",ME2_VERSION,curtileptr(selofs),numtiles);\r
114   Window(16,z,336,z+40,strbuf);\r
115   HLine(278, z+11, 53, darkw);\r
116   VLine(278, z+11, 25, darkw);\r
117   VLine(330, z+12, 24, brightw);\r
118   HLine(279, z+35, 51, brightw);\r
119   if (curmode==0) PressdButton(290, z+12, 40, 12, "Select");\r
120              else NormalButton(290, z+12, 40, 12, "Select");\r
121   if (curmode==1) PressdButton(290, z+23, 40, 12, "Edit");\r
122              else NormalButton(290, z+23, 40, 12, "Edit");\r
123   if (th)         PressdButton(279, z+12, 12, 12, "H");\r
124              else NormalButton(279, z+12, 12, 12, "H");\r
125   if (pad)        PressdButton(279, z+23, 12, 12, "P");\r
126              else NormalButton(279, z+23, 12, 12, "P");\r
127 \r
128   HLine(219, z+11, 52, darkw);\r
129   VLine(219, z+11, 25, darkw);\r
130   VLine(270, z+12, 24, brightw);\r
131   HLine(220, z+35, 50, brightw);\r
132   NormalButton(220, z+12, 50, 12, "Import VSP");\r
133   NormalButton(220, z+23, 50, 12, "Import PCX");\r
134 \r
135   HLine(160, z+11, 52, darkw);\r
136   VLine(160, z+11, 25, darkw);\r
137   VLine(211, z+12, 24, brightw);\r
138   HLine(161, z+35, 50, brightw);\r
139   NormalButton(161, z+12, 50, 12, "Add Tiles");\r
140   NormalButton(161, z+23, 50, 12, "Animation");\r
141 \r
142   HLine(26, z+10, 20, darkw);\r
143   VLine(26, z+10, 20, darkw);\r
144   HLine(27, z+29, 19, brightw);\r
145   VLine(45, z+11, 19, brightw);\r
146   FilledBox(27, z+11, 18, 18, black);\r
147   CopyTile(28, z+12, ttile2);\r
148   GotoXY(20, z+32); printstring("Clipboard");\r
149 }\r
150 \r
151 void FlipX(unsigned short edtile)\r
152 { int i,j;\r
153 \r
154   key[SCAN_X]=0;\r
155   if (edtile>=numtiles) return;\r
156   memcpy(ttile,&vsp[edtile*256],256);\r
157   modified=1;\r
158 \r
159   for (i=0;i<16;i++)\r
160       for (j=0;j<16;j++)\r
161           vsp[((edtile)*256)+(j*16)+i]=ttile[(j*16)+(15-i)];\r
162 }\r
163 \r
164 void FlipY(unsigned short edtile)\r
165 { int i,j;\r
166 \r
167   key[SCAN_Y]=0;\r
168   if (edtile>=numtiles) return;\r
169   memcpy(ttile,&vsp[edtile*256],256);\r
170   modified=1;\r
171 \r
172   for (i=0;i<16;i++)\r
173       for (j=0;j<16;j++)\r
174           vsp[((edtile)*256)+(j*16)+i]=ttile[((15-j)*16)+i];\r
175 }\r
176 \r
177 void FlipZ(unsigned short edtile)\r
178 { int i,j;\r
179 \r
180   key[SCAN_Z]=0;\r
181   if (edtile>=numtiles) return;\r
182   memcpy(ttile,&vsp[edtile*256],256);\r
183   modified=1;\r
184 \r
185   for (i=0;i<16;i++)\r
186       for (j=0;j<16;j++)\r
187           vsp[((edtile)*256)+(j*16)+i]=ttile[(i*16)+j];\r
188 }\r
189 \r
190 void DrawHighlight(int x, int y)\r
191 {\r
192   if (x<10 || y<10 || x>330 || y>sy+10) return;\r
193   HLine(x, y, 18, white);\r
194   HLine(x, y+17, 18, white);\r
195   VLine(x, y, 18, white);\r
196   VLine(x+17, y, 18, white);\r
197 }\r
198 \r
199 void TileSelector()\r
200 { int z, ct, k,j,m;\r
201   char *s, *d;\r
202 \r
203   int ms_down=0; // aen\r
204   int ms_up=0;\r
205 \r
206   while (!key[SCAN_ESC])\r
207   {\r
208      RenderSelector();\r
209      RenderMessages();\r
210      DrawMouse();\r
211      ShowPage();\r
212 \r
213      ms_down=0;\r
214      ms_up=0;\r
215      if (mouse_scroll)\r
216      {\r
217        if (my>tsy-2) ms_down=1;\r
218        if (my<18) ms_up=1;\r
219      }\r
220 \r
221      if ((key[SCAN_DOWN] || (ms_down && (!(systemtime%10)))) && selofs<65319)\r
222      {\r
223        if (!pad) selofs=selofs+20;\r
224        else selofs+=18;\r
225        key[SCAN_DOWN]=0;\r
226        systemtime++;\r
227      }\r
228      if ((key[SCAN_UP] || (ms_up && (!(systemtime%10)))) && selofs>17)\r
229      {\r
230        if (!pad) selofs-=20;\r
231        else selofs-=18;\r
232        key[SCAN_UP]=0;\r
233        systemtime++;\r
234      }\r
235      if (key[SCAN_P])\r
236      {\r
237         key[SCAN_P]=0;\r
238         pad=pad ^ 1;\r
239         selofs=0;\r
240         if (pad) Message("Tile padding enabled.",100);\r
241             else Message("Tile padding disabled.",100);\r
242      }\r
243      if (key[SCAN_H])\r
244      {\r
245        key[SCAN_H]=0;\r
246        th=th ^ 1;\r
247        if (th) Message("Tile Highlight enabled.",100);\r
248           else Message("Tile Highlight disabled.",100);\r
249      }\r
250 \r
251      if (key[SCAN_X]) FlipX(curtileptr(selofs));\r
252      if (key[SCAN_Y]) FlipY(curtileptr(selofs));\r
253      if (key[SCAN_Z]) FlipZ(curtileptr(selofs));\r
254      if (key[SCAN_V]) VSPAnimDialog();\r
255      if (key[SCAN_CTRL] && key[SCAN_C])\r
256      {\r
257        memcpy(ttile2, (char *) (vsp+(256*curtileptr(selofs))), 256);\r
258        key[SCAN_C]=0;\r
259      }\r
260      if (key[SCAN_CTRL] && key[SCAN_S])\r
261      {\r
262        if (curtileptr(selofs) >= numtiles) return;\r
263        memcpy((char *) (vsp+(256*curtileptr(selofs))), ttile2, 256);\r
264        modified=1;\r
265        key[SCAN_S]=0;\r
266      }\r
267      if (key[SCAN_CTRL] && key[SCAN_T])\r
268      {\r
269        if (curtileptr(selofs) >= numtiles) return;\r
270        modified=1;\r
271        s=ttile2;\r
272        d=(char *) (vsp+(256*curtileptr(selofs)));\r
273        for (z=0; z<256; z++)\r
274        {\r
275          if (*s) *d=*s;\r
276          d++;\r
277          s++;\r
278        }\r
279        key[SCAN_T]=0;\r
280      }\r
281      if (key[SCAN_CTRL] && key[SCAN_D] && !key[SCAN_ALT])\r
282      {\r
283         key[SCAN_D]=0;\r
284         modified=1;\r
285         z=curtileptr(selofs);\r
286         if (z<numtiles)\r
287         {\r
288           memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
289           numtiles--;\r
290         }\r
291      }\r
292 // zero: Super Delete Mode!\r
293 // wimpy delete irks me.\r
294      if (key[SCAN_CTRL] && key[SCAN_D] && key[SCAN_ALT])\r
295      {\r
296        key[SCAN_D]=0;\r
297        modified=1;\r
298        z=curtileptr(selofs);\r
299        if(ct<numtiles)\r
300        {\r
301          if(z<numtiles)\r
302          {\r
303            memcpy(vsp+(z*256),vsp+((z+1)*256),((numtiles-z-1)*256));\r
304            numtiles--;\r
305            for(k=0;k<numlayers;k++)\r
306            {\r
307              for(j=0; j<layer[k].sizey; j++)\r
308              {\r
309                for(m=0; m<layer[k].sizex; m++)\r
310                {\r
311                  if(layers[k][j*layer[k].sizex+m]==z) layers[k][j*layer[k].sizex+m]=0;\r
312                  if(layers[k][j*layer[k].sizex+m]>z) layers[k][j*layer[k].sizex+m]--;\r
313                }\r
314              }\r
315            }\r
316          }\r
317        }\r
318      }\r
319 // zero: Super Insert Mode!\r
320 // wimpy insert irks me.\r
321      if (key[SCAN_CTRL] && key[SCAN_I] && key[SCAN_ALT])\r
322      {\r
323        key[SCAN_I]=0;\r
324        ct=curtileptr(selofs);\r
325        if (ct <= numtiles)\r
326        {\r
327          modified=1;\r
328          s=(char *) valloc((numtiles+1)*256, "s_ins",0);\r
329          memcpy(s, vsp, (numtiles*256));\r
330          vfree(vsp); vsp=s; s=0;\r
331          for (z=numtiles-1; z>=ct; z--)\r
332            memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
333          memset(vsp+(ct*256), 0, 256);\r
334          numtiles++;\r
335        }\r
336        for(k=0;k<numlayers;k++)\r
337        {\r
338          for(j=0; j<layer[k].sizey; j++)\r
339          {\r
340            for(m=0; m<layer[k].sizex; m++)\r
341            {\r
342              if(layers[k][j*layer[k].sizex+m]>=ct) layers[k][j*layer[k].sizex+m]++;\r
343            }\r
344          }\r
345        }\r
346      }\r
347 \r
348      if (key[SCAN_CTRL] && key[SCAN_I] && !key[SCAN_ALT])\r
349      {\r
350        key[SCAN_I]=0;\r
351        ct=curtileptr(selofs);\r
352        if (ct <= numtiles)\r
353        {\r
354          modified=1;\r
355          s=(char *)valloc((numtiles+1)*256,"s_ins",0);\r
356          memcpy(s, vsp, (numtiles*256));\r
357          vfree(vsp); vsp=s; s=0;\r
358          for (z=numtiles-1; z>=ct; z--)\r
359            memcpy(vsp+((z+1)*256),vsp+(z*256),256);\r
360          memset(vsp+(ct*256), 0, 256);\r
361          numtiles++;\r
362        }\r
363      }\r
364      if (key[SCAN_E])\r
365      {\r
366        modified=1;\r
367        TEtile=curtileptr(selofs); // middle tile initially\r
368        if (TEtile<numtiles)\r
369        {\r
370          TEtype=TETILE;\r
371          TEsource=vsp+(256*TEtile);\r
372          TExsize=16;\r
373          TEysize=16;\r
374          TileEdit();\r
375        }\r
376      }\r
377 \r
378      if (mb==1 && my<(tsy-40) && !curmode)\r
379      {\r
380         if (curtileptr(selofs)<numtiles)\r
381         {\r
382           lt=curtileptr(selofs);\r
383           key[SCAN_ESC]=1;\r
384         }\r
385         WaitRelease();\r
386       }\r
387      if (mb==2 && my<(tsy-40) && !curmode)\r
388      {\r
389         if (curtileptr(selofs)<numtiles)\r
390         {\r
391           rt=curtileptr(selofs);\r
392           key[SCAN_ESC]=1;\r
393         }\r
394         WaitRelease();\r
395      }\r
396      if (mb && my<(tsy-40) && curmode)\r
397      {\r
398        WaitRelease();\r
399        TEtile=curtileptr(selofs); // middle tile initially\r
400        if (TEtile<numtiles)\r
401        {\r
402          modified=1;\r
403          TEtype=TETILE;\r
404          TEsource=vsp+(256*TEtile);\r
405          TExsize=16;\r
406          TEysize=16;\r
407          TileEdit();\r
408        }\r
409      }\r
410      z=tsy-40;\r
411      if (mb && mx>290 && mx<330 && my>z+12 && my<z+23)\r
412      {\r
413        curmode=0;\r
414        WaitRelease();\r
415        Message("Tile select mode.",100);\r
416      }\r
417      if (mb && mx>290 && mx<330 && my>z+23 && my<z+47)\r
418      {\r
419        curmode=1;\r
420        WaitRelease();\r
421        Message("Tile edit mode.",100);\r
422      }\r
423      if (mb && mx>278 && mx<289 && my>z+12 && my<z+23)\r
424      {\r
425        WaitRelease();\r
426        th=th ^ 1;\r
427        if (th) Message("Tile Highlight enabled.",100);\r
428           else Message("Tile Highlight disabled.",100);\r
429         mb=0;\r
430      }\r
431      if (mb && mx>278 && mx<289 && my>z+23 && my<z+47)\r
432      {\r
433        WaitRelease();\r
434        selofs=0;\r
435        pad=pad ^ 1;\r
436        if (pad) Message("Tile padding enabled.",100);\r
437            else Message("Tile padding disabled.",100);\r
438         mb=0;\r
439      }\r
440      if (mb && mx>161 && mx<210 && my>z+12 && my<z+23)\r
441      {\r
442         modified=1;\r
443         PressdButton(161, z+12, 50, 12, "Add Tiles");\r
444         while (mb)\r
445         {\r
446           ReadMouse();\r
447           ShowPage();\r
448         }\r
449         WaitRelease();\r
450         AddTilesDialog();\r
451         mb=0;\r
452      }\r
453      if (mb && mx>161 && mx<210 && my>z+23 && my<z+47)\r
454      {\r
455         PressdButton(161, z+23, 50, 12, "Animation");\r
456         while (mb)\r
457         {\r
458           ReadMouse();\r
459           ShowPage();\r
460         }\r
461         WaitRelease();\r
462         VSPAnimDialog();\r
463         mb=0;\r
464      }\r
465      if (mb && mx>220 && mx<270 && my>z+12 && my<z+24)\r
466      {\r
467         PressdButton(220, z+12, 50, 12, "Import VSP");\r
468         while (mb)\r
469         {\r
470           ReadMouse();\r
471           ShowPage();\r
472         }\r
473         WaitRelease();\r
474         ImportVSP();\r
475         modified=1;\r
476         mb=0;\r
477      }\r
478      if (mb && mx>220 && mx<270 && my>z+23 && my<z+47)\r
479      {\r
480         PressdButton(220, z+23, 50, 12, "Import PCX");\r
481         while (mb)\r
482         {\r
483           ReadMouse();\r
484           ShowPage();\r
485         }\r
486         WaitRelease();\r
487         ImportPCX();\r
488         modified=1;\r
489         mb=0;\r
490      }\r
491      if (key[SCAN_F10])\r
492      {\r
493       key[SCAN_F10]=0;\r
494       SaveMAP(mapname);\r
495       SaveVSP(vspname);\r
496       Message("MAP/VSP saved.",100);\r
497       modified=0;\r
498     }\r
499   }\r
500   key[SCAN_ESC]=0;\r
501 }\r
502 \r
503 int vaxsize=150, vaysize=66;\r
504 int vaxofs=20, vayofs=20;\r
505 \r
506 void VSPAnimDialog()\r
507 { char done=0, moving=0, i=0;\r
508   int mxo, myo, cursorblink;\r
509   char ctf=0, cb=0, c, t, *str, bleh;\r
510   char nstr1[80], nstr2[80], nstr3[80], nstr4[80];\r
511 \r
512   bleh=th;\r
513   th=0;\r
514   i=curastd;\r
515   sprintf(nstr1, "%d", vspanim[i].start);\r
516   sprintf(nstr2, "%d", vspanim[i].finish);\r
517   sprintf(nstr3, "%d", vspanim[i].delay);\r
518   sprintf(nstr4, "%d", vspanim[i].mode);\r
519   last_pressed=0;\r
520   do\r
521   {\r
522     RenderSelector();\r
523     RenderMessages();\r
524 \r
525     if (ctf && systemtime >= cursorblink)\r
526     {\r
527       cb ^= 1;\r
528       cursorblink = systemtime+40;\r
529     }\r
530     if (moving)\r
531     {\r
532       vaxofs = (mx-mxo);\r
533       vayofs = (my-myo);\r
534       if (!mb) moving=0;\r
535       if (vaxofs<16) vaxofs = 16;\r
536       if (vayofs<16) vayofs = 16;\r
537       if (vaxofs+vaxsize>335) vaxofs = 336-vaxsize;\r
538       if (vayofs+vaysize>sy+16) vayofs = (sy+16)-vaysize;\r
539     }\r
540 \r
541     Window(vaxofs, vayofs, vaxofs+vaxsize, vayofs+vaysize, "VSP Animation Editor");\r
542     CopyTile(vaxofs+110, vayofs+16, (char *) (vsp+(256*tileidx[vspanim[i].start])));\r
543     GotoXY(vaxofs+4, vayofs+12); printstring("Start");\r
544     TextField(vaxofs+25, vayofs+11, 60, nstr1, ctf == 1 ? cb : 0);\r
545     GotoXY(vaxofs+11, vayofs+22); printstring("End");\r
546     TextField(vaxofs+25, vayofs+21, 60, nstr2, ctf == 2 ? cb : 0);\r
547     GotoXY(vaxofs+4, vayofs+32); printstring("Delay");\r
548     TextField(vaxofs+25, vayofs+31, 60, nstr3, ctf == 3 ? cb : 0);\r
549     GotoXY(vaxofs+6, vayofs+42); printstring("Mode");\r
550     TextField(vaxofs+25, vayofs+41, 60, nstr4, ctf == 4 ? cb : 0);\r
551     GotoXY(vaxofs+2, vayofs+56); printstring("Strand");\r
552     GotoXY(vaxofs+104, vayofs+33); printstring("Preview");\r
553     HLine(vaxofs+1, vayofs+51, 148, white);\r
554     Button(vaxofs+85, vayofs+54, "OK");\r
555     Button(vaxofs+117, vayofs+54, "Update");\r
556     GotoXY(vaxofs+30, vayofs+56);\r
557     sprintf(strbuf, "%d", i); printstring(strbuf);\r
558 \r
559     DrawMouse();\r
560     ShowPage();\r
561     CheckTimerStuff();\r
562 \r
563     // input phase\r
564     if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+11 && my<vayofs+9+11 && !moving)\r
565     {\r
566       ctf=1; str=nstr1; cb=1;\r
567       cursorblink=systemtime+40; continue;\r
568     }\r
569 \r
570     if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+21 && my<vayofs+9+21 && !moving)\r
571     {\r
572       ctf=2; str=nstr2; cb=1;\r
573       cursorblink=systemtime+40; continue;\r
574     }\r
575 \r
576     if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+31 && my<vayofs+9+31 && !moving)\r
577     {\r
578       ctf=3; str=nstr3; cb=1;\r
579       cursorblink=systemtime+40; continue;\r
580     }\r
581 \r
582     if (mb==1 && mx>vaxofs+25 && mx<vaxofs+60+25 && my>vayofs+41 && my<vayofs+9+41 && !moving)\r
583     {\r
584       ctf=4; str=nstr4; cb=1;\r
585       cursorblink=systemtime+40; continue;\r
586     }\r
587 \r
588     if ((mb==1 && mx>vaxofs+85 && mx<vaxofs+30+85 && my>vayofs+54 && my<vayofs+10+54 && !moving) || (key[SCAN_ENTER] && !ctf))\r
589     {\r
590       // insert code for button "OK" here\r
591       done=1;\r
592       ButtonPressed(vaxofs+85, vayofs+54, "OK");\r
593       DrawMouse();\r
594       while (mb)\r
595       {\r
596         ReadMouse();\r
597         ShowPage();\r
598         ReadMouse();\r
599       }\r
600       WaitRelease(); continue;\r
601     }\r
602 \r
603     if (mb==1 && mx>vaxofs+117 && mx<vaxofs+30+117 && my>vayofs+54 && my<vayofs+10+54 && !moving)\r
604     {\r
605       // insert code for button "Update" here\r
606       vspanim[i].start=atoi(nstr1);\r
607       vspanim[i].finish=atoi(nstr2);\r
608       vspanim[i].delay=atoi(nstr3);\r
609       vspanim[i].mode=atoi(nstr4);\r
610       InitTileIDX();\r
611       ButtonPressed(vaxofs+117, vayofs+54, "Update");\r
612       DrawMouse();\r
613       while (mb)\r
614       {\r
615         ReadMouse();\r
616         ShowPage();\r
617         ReadMouse();\r
618       }\r
619       WaitRelease(); continue;\r
620     }\r
621 \r
622     if (mb==1 && mx>(vaxofs+vaxsize-9) && (mx<vaxofs+vaxsize-2)\r
623     && my>(vayofs+1) && (my<vayofs+8) && !moving)\r
624     {\r
625       done=1;\r
626       WaitRelease();\r
627       break;\r
628     }\r
629 \r
630     if (mb==1 && mx>vaxofs && mx<vaxofs+vaxsize && my>vayofs && my<(vayofs+9) && !moving)\r
631     {\r
632       moving=1;\r
633       mxo=mx-vaxofs;\r
634       myo=my-vayofs;\r
635       continue;\r
636     }\r
637 \r
638     if (mb==1 && !moving)\r
639     {\r
640       ctf=0;\r
641       cb=0;\r
642       str=0;\r
643       WaitRelease();\r
644     }\r
645 \r
646     if (last_pressed)\r
647     {\r
648       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
649       else c=key_ascii_tbl[last_pressed];\r
650 \r
651       if (last_pressed==SCAN_UP)\r
652       {\r
653         vspanim[i].start=atoi(nstr1);\r
654         vspanim[i].finish=atoi(nstr2);\r
655         vspanim[i].delay=atoi(nstr3);\r
656         vspanim[i].mode=atoi(nstr4);\r
657         if (i<99) i++; else i=0;\r
658         last_pressed=0; key[SCAN_UP]=0;\r
659         sprintf(nstr1, "%d", vspanim[i].start);\r
660         sprintf(nstr2, "%d", vspanim[i].finish);\r
661         sprintf(nstr3, "%d", vspanim[i].delay);\r
662         sprintf(nstr4, "%d", vspanim[i].mode);\r
663         continue;\r
664       }\r
665       if (last_pressed==SCAN_DOWN)\r
666       {\r
667         vspanim[i].start=atoi(nstr1);\r
668         vspanim[i].finish=atoi(nstr2);\r
669         vspanim[i].delay=atoi(nstr3);\r
670         vspanim[i].mode=atoi(nstr4);\r
671         if (i) i--; else i=99;\r
672         last_pressed=0; key[SCAN_DOWN]=0;\r
673         sprintf(nstr1, "%d", vspanim[i].start);\r
674         sprintf(nstr2, "%d", vspanim[i].finish);\r
675         sprintf(nstr3, "%d", vspanim[i].delay);\r
676         sprintf(nstr4, "%d", vspanim[i].mode);\r
677         continue;\r
678       }\r
679       if (last_pressed==SCAN_ESC)\r
680       {\r
681         key[SCAN_ESC]=0;\r
682         done=1;\r
683         break;\r
684       }\r
685 \r
686       if (last_pressed==SCAN_ENTER)\r
687       {\r
688         key[SCAN_ENTER]=0;\r
689         ctf=0;\r
690         str=0;\r
691         last_pressed=0;\r
692         continue;\r
693       }\r
694 \r
695       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
696       {\r
697         switch (ctf)\r
698         {\r
699           case 0: ctf=1; str=nstr1; break;\r
700           case 1: ctf=2; str=nstr2; break;\r
701           case 2: ctf=3; str=nstr3; break;\r
702           case 3: ctf=4; str=nstr4; break;\r
703           case 4: ctf=0; str=0; break;\r
704         }\r
705         key[SCAN_TAB]=0;\r
706         last_pressed=0;\r
707         cb=1; cursorblink=systemtime+40;\r
708         continue;\r
709       }\r
710 \r
711       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
712       {\r
713         switch (ctf)\r
714         {\r
715           case 0: ctf=4; str=nstr4; break;\r
716           case 1: ctf=0; str=0; break;\r
717           case 2: ctf=1; str=nstr1; break;\r
718           case 3: ctf=2; str=nstr2; break;\r
719           case 4: ctf=3; str=nstr3; break;\r
720         }\r
721         key[SCAN_TAB]=0;\r
722         last_pressed=0;\r
723         cb=1; cursorblink=systemtime+40;\r
724         continue;\r
725       }\r
726 \r
727       if (!ctf)\r
728         continue;\r
729 \r
730       if (last_pressed==SCAN_BACKSP && strlen(str))\r
731       {\r
732         str[strlen(str)-1]=0;\r
733         key[SCAN_BACKSP]=0;\r
734         last_pressed=0;\r
735         continue;\r
736       }\r
737       else if (last_pressed==SCAN_BACKSP)\r
738       {\r
739         last_pressed=0;\r
740         continue;\r
741       }\r
742 \r
743       t=strlen(str);\r
744       str[t]=c;\r
745       str[t+1]=0;\r
746       last_pressed=0;\r
747     }\r
748   } while (!done);\r
749 //  memset(&vadelay, 0, 100);\r
750 //  for (i=0; i<numtiles; i++)\r
751 //    tileidx[i]=i;\r
752   vspanim[i].start=atoi(nstr1);\r
753   vspanim[i].finish=atoi(nstr2);\r
754   vspanim[i].delay=atoi(nstr3);\r
755   vspanim[i].mode=atoi(nstr4);\r
756   curastd=i;\r
757   th=bleh;\r
758 }\r
759 \r
760 int atxsize=150, atysize=39;\r
761 int atxofs=80, atyofs=50;\r
762 \r
763 void AddTilesDialog()\r
764 { char done=0, moving=0;\r
765   int mxo, myo, cursorblink, at=0; //, i;\r
766   char ctf=0, cb=0, c, t, *str, bleh;\r
767   char nstr1[80];\r
768 \r
769   bleh=th;\r
770   th=0;\r
771   sprintf(nstr1, "%d", at);\r
772   last_pressed=0;\r
773   do\r
774   {\r
775     RenderSelector();\r
776     RenderMessages();\r
777 \r
778     if (ctf && systemtime >= cursorblink)\r
779     {\r
780       cb ^= 1;\r
781       cursorblink = systemtime+40;\r
782     }\r
783     if (moving)\r
784     {\r
785       atxofs = (mx-mxo);\r
786       atyofs = (my-myo);\r
787       if (!mb) moving=0;\r
788       if (atxofs<16) atxofs = 16;\r
789       if (atyofs<16) atyofs = 16;\r
790       if (atxofs+atxsize>335) atxofs = 336-atxsize;\r
791       if (atyofs+atysize>sy+16) atyofs = (sy+16)-atysize;\r
792     }\r
793 \r
794     Window(atxofs, atyofs, atxofs+atxsize, atyofs+atysize, "Allocate Additional Tiles");\r
795     GotoXY(atxofs+12, atyofs+15); printstring("Alloc Tiles:");\r
796     TextField(atxofs+56, atyofs+13, 80, nstr1, ctf == 1 ? cb : 0);\r
797     Button(atxofs+85, atyofs+26, "OK");\r
798     Button(atxofs+117, atyofs+26, "Cancel");\r
799 \r
800     DrawMouse();\r
801     ShowPage();\r
802     CheckTimerStuff();\r
803 \r
804     // input phase\r
805     if (mb==1 && mx>atxofs+56 && mx<atxofs+80+56 && my>atyofs+13 && my<atyofs+9+13 && !moving)\r
806     {\r
807       ctf=1; str=nstr1; cb=1;\r
808       cursorblink=systemtime+40; continue;\r
809     }\r
810 \r
811     if ((mb==1 && mx>atxofs+85 && mx<atxofs+30+85 && my>atyofs+26 && my<atyofs+10+26 && !moving) || (key[SCAN_ENTER] && !ctf))\r
812     {\r
813       // insert code for button "OK" here\r
814       done=1;\r
815       at=atoi(nstr1);\r
816       str=(char *) valloc((numtiles+at)*256,"vsp data",0);\r
817       memcpy(str,vsp,(numtiles*256));\r
818       vfree(vsp); vsp=str; str=0; ctf=0;\r
819       memset(vsp+(numtiles*256), 0, at*256);\r
820       numtiles+=at;\r
821       ButtonPressed(atxofs+85, atyofs+26, "OK");\r
822       DrawMouse();\r
823       while (mb)\r
824       {\r
825         ReadMouse();\r
826         ShowPage();\r
827         ReadMouse();\r
828       }\r
829       WaitRelease(); continue;\r
830     }\r
831 \r
832     if (mb==1 && mx>atxofs+117 && mx<atxofs+30+117 && my>atyofs+26 && my<atyofs+10+26 && !moving)\r
833     {\r
834       // insert code for button "Cancel" here\r
835       done=1;\r
836       ButtonPressed(atxofs+117, atyofs+26, "Cancel");\r
837       DrawMouse();\r
838       while (mb)\r
839       {\r
840         ReadMouse();\r
841         ShowPage();\r
842         ReadMouse();\r
843       }\r
844       WaitRelease(); continue;\r
845     }\r
846 \r
847     if (mb==1 && mx>(atxofs+atxsize-9) && (mx<atxofs+atxsize-2)\r
848     && my>(atyofs+1) && (my<atyofs+8) && !moving)\r
849     {\r
850       done=1;\r
851       WaitRelease();\r
852       break;\r
853     }\r
854 \r
855     if (mb==1 && mx>atxofs && mx<atxofs+atxsize && my>atyofs && my<(atyofs+9) && !moving)\r
856     {\r
857       moving=1;\r
858       mxo=mx-atxofs;\r
859       myo=my-atyofs;\r
860       continue;\r
861     }\r
862 \r
863     if (mb==1 && !moving)\r
864     {\r
865       ctf=0;\r
866       cb=0;\r
867       str=0;\r
868       WaitRelease();\r
869     }\r
870 \r
871     if (last_pressed)\r
872     {\r
873       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
874       else c=key_ascii_tbl[last_pressed];\r
875 \r
876       if (last_pressed==SCAN_ESC)\r
877       {\r
878         key[SCAN_ESC]=0;\r
879         done=1;\r
880         break;\r
881       }\r
882 \r
883       if (last_pressed==SCAN_ENTER)\r
884       {\r
885         key[SCAN_ENTER]=0;\r
886         ctf=0;\r
887         str=0;\r
888         last_pressed=0;\r
889         continue;\r
890       }\r
891 \r
892       if (last_pressed==SCAN_TAB && !key[SCAN_LSHIFT])\r
893       {\r
894         switch (ctf)\r
895         {\r
896           case 0: ctf=1; str=nstr1; break;\r
897           case 1: ctf=0; str=0; break;\r
898         }\r
899         key[SCAN_TAB]=0;\r
900         last_pressed=0;\r
901         cb=1; cursorblink=systemtime+40;\r
902         continue;\r
903       }\r
904 \r
905       if (last_pressed==SCAN_TAB && key[SCAN_LSHIFT])\r
906       {\r
907         switch (ctf)\r
908         {\r
909           case 0: ctf=1; str=nstr1; break;\r
910           case 1: ctf=0; str=0; break;\r
911         }\r
912         key[SCAN_TAB]=0;\r
913         last_pressed=0;\r
914         cb=1; cursorblink=systemtime+40;\r
915         continue;\r
916       }\r
917 \r
918       if (!ctf)\r
919         continue;\r
920 \r
921       if (last_pressed==SCAN_BACKSP && strlen(str))\r
922       {\r
923         str[strlen(str)-1]=0;\r
924         key[SCAN_BACKSP]=0;\r
925         last_pressed=0;\r
926         continue;\r
927       }\r
928       else if (last_pressed==SCAN_BACKSP)\r
929       {\r
930         last_pressed=0;\r
931         continue;\r
932       }\r
933 \r
934       t=strlen(str);\r
935       str[t]=c;\r
936       str[t+1]=0;\r
937       last_pressed=0;\r
938     }\r
939   } while (!done);\r
940   at=atoi(nstr1);\r
941   th=bleh;\r
942 //  memset(&vadelay, 0, 100);\r
943 //  for (i=0; i<numtiles; i++)\r
944 //    tileidx[i]=i;\r
945 }\r
946 \r
947 // ========================= Import *** Data/Code ============================\r
948 \r
949 char *ovsp, op, oh, openas;\r
950 word ontiles;\r
951 word sofs=0;\r
952 word tilesrippedthissession;\r
953 byte *implist; //zero\r
954 \r
955 void RenderImport()\r
956 { unsigned char *img,i,j;\r
957   int z, jumper,wide,deep;\r
958   int at;\r
959 \r
960   jumper=16+pad;\r
961   wide=320/jumper;\r
962   deep=((200+15)&~15)/jumper;\r
963 \r
964   ClearScreen();\r
965 \r
966   for (i=0; i<deep; i++)\r
967     for (j=0; j<wide; j++)\r
968     {\r
969       at=(i*wide)+j+sofs;\r
970       img=ovsp+(256*at);\r
971       if (at>=ontiles) img=ovsp;\r
972       CopyTile((j*jumper)+16,(i*jumper)+16,img);\r
973       if(at<ontiles) if(implist[at]) ColorGrid((j*jumper)+16,(i*jumper)+16,7); //zero\r
974     }\r
975   if (th)\r
976   {\r
977     if (my<(tsy-40))\r
978     DrawHighlight(((mx/jumper)*jumper)-(1+pad),\r
979       ((my/jumper)*jumper)-(1+pad));\r
980   }\r
981   z=tsy-40;\r
982   sprintf(strbuf,"Import Tiles %d/%d",curtileptr(sofs),ontiles);\r
983   Window(16,z,336,z+40,strbuf);\r
984   sprintf(strbuf,"Tiles imported this session: %d",tilesrippedthissession);\r
985   GotoXY(176-(pixels(strbuf)/2),z+20); printstring(strbuf);\r
986 }\r
987 \r
988 void ImportTiles()\r
989 { //int tp;\r
990   char *str;\r
991   int bloop1,bloop2;\r
992 \r
993   op=pad; oh=th;\r
994   pad=1; th=1;\r
995   tilesrippedthissession=0;\r
996   implist=(byte *)malloc(ontiles); //zero\r
997   memset(implist,0,ontiles); //zero\r
998   while (!key[SCAN_ESC])\r
999   {\r
1000     RenderImport();\r
1001     RenderMessages();\r
1002     DrawMouse();\r
1003     ShowPage();\r
1004 \r
1005      if (key[SCAN_DOWN] && sofs<65319)\r
1006      {\r
1007        if (!pad) sofs=sofs+20;\r
1008        else sofs+=18;\r
1009        key[SCAN_DOWN]=0;\r
1010      }\r
1011      if (key[SCAN_UP] && sofs>17)\r
1012      {\r
1013        if (!pad) sofs-=20;\r
1014        else sofs-=18;\r
1015        key[SCAN_UP]=0;\r
1016      }\r
1017 /*all by zero here in this scan_b thing*/\r
1018      if (key[SCAN_B])\r
1019      {\r
1020        key[SCAN_B]=0;\r
1021        Message("Building duplicate import list",200);\r
1022        for(bloop1=0; bloop1<ontiles; bloop1++)\r
1023        {\r
1024          for(bloop2=0; bloop2<numtiles; bloop2++)\r
1025          {\r
1026            if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
1027            {\r
1028              implist[bloop1]=1;\r
1029              bloop2=numtiles;\r
1030            }\r
1031          }\r
1032        }\r
1033      }\r
1034 //all by zero here in this scan_a thing\r
1035      if (key[SCAN_A])\r
1036      {\r
1037        Message("Importing all tiles",200);\r
1038        key[SCAN_A]=0;\r
1039        for(bloop1=0; bloop1<ontiles; bloop1++)\r
1040        {\r
1041          str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
1042          memcpy(str, vsp, (numtiles*256));\r
1043          vfree(vsp); vsp=str; str=0;\r
1044          memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
1045          numtiles+=1;\r
1046        }\r
1047        goto DIE;\r
1048      }\r
1049 \r
1050 //all by zero here in this scan_n thing\r
1051      if (key[SCAN_N])\r
1052      {\r
1053        Message("Importing all new tiles",200);\r
1054        key[SCAN_N]=0;\r
1055        for(bloop1=0; bloop1<ontiles; bloop1++)\r
1056        {\r
1057          for(bloop2=0; bloop2<numtiles; bloop2++)\r
1058          {\r
1059            if(TileCmp(vsp+bloop2*256,ovsp+bloop1*256))\r
1060            {\r
1061              implist[bloop1]=1;\r
1062              bloop2=numtiles;\r
1063            }\r
1064          }\r
1065        }\r
1066        for(bloop1=0; bloop1<ontiles; bloop1++)\r
1067        {\r
1068          if(!implist[bloop1])\r
1069          {\r
1070            str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
1071            memcpy(str, vsp, (numtiles*256));\r
1072            vfree(vsp); vsp=str; str=0;\r
1073            memcpy(vsp+(numtiles*256), ovsp+(bloop1*256), 256);\r
1074            numtiles+=1;\r
1075          }\r
1076        }\r
1077        goto DIE;\r
1078      }\r
1079 \r
1080      if (mb==1 && my<(tsy-40) && curtileptr(sofs)<ontiles)\r
1081      {\r
1082         lt=curtileptr(sofs);\r
1083         implist[lt]=1; //zero\r
1084         str=(char *) valloc((numtiles+1)*256,"vsp data",0);\r
1085         memcpy(str, vsp, (numtiles*256));\r
1086         vfree(vsp); vsp=str; str=0;\r
1087         memcpy(vsp+(numtiles*256), ovsp+(lt*256), 256);\r
1088         numtiles+=1;\r
1089         tilesrippedthissession++;\r
1090         WaitRelease();\r
1091         sprintf(strbuf,"Tile %d imported.",lt);\r
1092         Message(strbuf, 200);\r
1093      }\r
1094   }\r
1095   DIE: //zero\r
1096   pad=op; th=oh;\r
1097   vfree(implist); //zero\r
1098 }\r
1099 \r
1100 void ImportVSP()\r
1101 { FILE *f;\r
1102   word ver;\r
1103   char fname[60];\r
1104   int bsize;\r
1105 \r
1106   memset(fname, 0, 60);\r
1107   bmode=1; oh=th; th=0;\r
1108   Browse(1,"*.vsp","","","",&fname);\r
1109   if (strlen(fname)<3) return;\r
1110   if (!(f=fopen(fname,"rb")))\r
1111      errf("VSP file %s not found.",fname);\r
1112   WaitRelease(); th=oh; bmode=0;\r
1113 \r
1114   fread(&ver, 1, 2, f);\r
1115   if (ver!=2 && ver!=3)\r
1116      errf("VSP file %s is not the correct VSP format.",fname);\r
1117   fread(strbuf, 1, 768, f);\r
1118   fread(&ontiles, 1, 2, f);\r
1119   ovsp=(char *) valloc(256*ontiles,"ovsp",0);\r
1120 \r
1121   if (ver==2)\r
1122     fread(ovsp, 256, ontiles, f);\r
1123   if (ver==3)\r
1124   {\r
1125     fread(&bsize, 1, 4, f);\r
1126     ReadCompressedLayer1(ovsp, 256*ontiles, f);\r
1127   }\r
1128 \r
1129   fclose(f);\r
1130 \r
1131   ImportTiles();\r
1132   vfree(ovsp);\r
1133   key[SCAN_ESC]=0;\r
1134 \r
1135 }\r
1136 \r
1137 int OPxsize=100, OPysize=40;\r
1138 int OPxofs=100, OPyofs=70;\r
1139 \r
1140 void OpenPCXas()\r
1141 { char done=0, moving=0;\r
1142   int mxo, myo, cursorblink;\r
1143   char ctf=0, cb=0, c, t, *str;\r
1144 \r
1145   last_pressed=0;\r
1146   do\r
1147   {\r
1148     RenderSelector();\r
1149     RenderMessages();\r
1150 \r
1151     if (ctf && systemtime >= cursorblink)\r
1152     {\r
1153       cb ^= 1;\r
1154       cursorblink = systemtime+40;\r
1155     }\r
1156     if (moving)\r
1157     {\r
1158       OPxofs = (mx-mxo);\r
1159       OPyofs = (my-myo);\r
1160       if (!mb) moving=0;\r
1161       if (OPxofs<16) OPxofs = 16;\r
1162       if (OPyofs<16) OPyofs = 16;\r
1163       if (OPxofs+OPxsize>335) OPxofs = 336-OPxsize;\r
1164       if (OPyofs+OPysize>sy+16) OPyofs = (sy+16)-OPysize;\r
1165     }\r
1166 \r
1167     Window(OPxofs, OPyofs, OPxofs+OPxsize, OPyofs+OPysize, "Open PCX As");\r
1168     Button(OPxofs+21, OPyofs+18, "Tileset");\r
1169     Button(OPxofs+50, OPyofs+18, "Image");\r
1170 \r
1171     DrawMouse();\r
1172     ShowPage();\r
1173     CheckTimerStuff();\r
1174 \r
1175     // input phase\r
1176     if (mb==1 && mx>OPxofs+21 && mx<OPxofs+30+21 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
1177     {\r
1178       // insert code for button "Tileset" here\r
1179       ButtonPressed(OPxofs+21, OPyofs+18, "Tileset");\r
1180       DrawMouse();\r
1181       while (mb)\r
1182       {\r
1183         ReadMouse();\r
1184         ShowPage();\r
1185         ReadMouse();\r
1186       }\r
1187       openas=0; done=1;\r
1188       WaitRelease(); continue;\r
1189     }\r
1190 \r
1191     if (mb==1 && mx>OPxofs+50 && mx<OPxofs+30+50 && my>OPyofs+18 && my<OPyofs+10+18 && !moving)\r
1192     {\r
1193       // insert code for button "Image" here\r
1194       ButtonPressed(OPxofs+50, OPyofs+18, "Image");\r
1195       DrawMouse();\r
1196       while (mb)\r
1197       {\r
1198         ReadMouse();\r
1199         ShowPage();\r
1200         ReadMouse();\r
1201       }\r
1202       openas=1; done=1;\r
1203       WaitRelease(); continue;\r
1204     }\r
1205 \r
1206     if (mb==1 && mx>(OPxofs+OPxsize-9) && (mx<OPxofs+OPxsize-2)\r
1207     && my>(OPyofs+1) && (my<OPyofs+8) && !moving)\r
1208     {\r
1209       done=1;\r
1210       WaitRelease();\r
1211       break;\r
1212     }\r
1213 \r
1214     if (mb==1 && mx>OPxofs && mx<OPxofs+OPxsize && my>OPyofs && my<(OPyofs+9) && !moving)\r
1215     {\r
1216       moving=1;\r
1217       mxo=mx-OPxofs;\r
1218       myo=my-OPyofs;\r
1219       continue;\r
1220     }\r
1221 \r
1222     if (mb==1 && !moving)\r
1223     {\r
1224       ctf=0;\r
1225       cb=0;\r
1226       str=0;\r
1227       WaitRelease();\r
1228     }\r
1229 \r
1230     if (last_pressed)\r
1231     {\r
1232       if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT]) c=key_shift_tbl[last_pressed];\r
1233       else c=key_ascii_tbl[last_pressed];\r
1234 \r
1235       if (last_pressed==SCAN_ESC)\r
1236       {\r
1237         key[SCAN_ESC]=0;\r
1238         done=1;\r
1239         break;\r
1240       }\r
1241 \r
1242       if (last_pressed==SCAN_ENTER)\r
1243       {\r
1244         key[SCAN_ENTER]=0;\r
1245         ctf=0;\r
1246         str=0;\r
1247         last_pressed=0;\r
1248         continue;\r
1249       }\r
1250 \r
1251       if (!ctf)\r
1252         continue;\r
1253 \r
1254       if (last_pressed==SCAN_BACKSP && strlen(str))\r
1255       {\r
1256         str[strlen(str)-1]=0;\r
1257         key[SCAN_BACKSP]=0;\r
1258         last_pressed=0;\r
1259         continue;\r
1260       }\r
1261       else if (last_pressed==SCAN_BACKSP)\r
1262       {\r
1263         last_pressed=0;\r
1264         continue;\r
1265       }\r
1266 \r
1267       t=strlen(str);\r
1268       str[t]=c;\r
1269       str[t+1]=0;\r
1270       last_pressed=0;\r
1271     }\r
1272   } while (!done);\r
1273 }\r
1274 \r
1275 char manufacturer;\r
1276 char version;\r
1277 char encoding;\r
1278 char bits_per_pixel;\r
1279 short xmin,ymin;\r
1280 short xmax,ymax;\r
1281 short hres;\r
1282 short vres;\r
1283 char palette[48];\r
1284 char reserved;\r
1285 char color_planes;\r
1286 short bytes_per_line;\r
1287 short palette_type;\r
1288 char filler[58];\r
1289 char *t;\r
1290 \r
1291 int width,depth;\r
1292 int bytes;\r
1293 int vidoffset;\r
1294 FILE *pcxf;\r
1295 \r
1296 void ReadPCXLine(unsigned char *dest)\r
1297 { int i, n;\r
1298   char c, run;\r
1299 \r
1300   n=0;\r
1301   do {\r
1302     c=fgetc(pcxf) & 0xff;\r
1303 \r
1304     if ((c & 0xc0)==0xc0)\r
1305     { run=c & 0x3f;\r
1306       c=fgetc(pcxf);\r
1307       for (i=0; i<run; i++)\r
1308         dest[vidoffset+n+i]=c;\r
1309       n+=run;\r
1310     }\r
1311     else {\r
1312       dest[vidoffset+n]=c;\r
1313       n++;\r
1314     }\r
1315   } while (n<bytes);\r
1316 }\r
1317 \r
1318 void LoadPCXHeader(char *fname)\r
1319 {\r
1320   int i;\r
1321 \r
1322   if (!(pcxf=fopen(fname,"rb"))) err("Could not open specified PCX file.");\r
1323   fread(&manufacturer,1,1,pcxf);\r
1324   fread(&version,1,1,pcxf);\r
1325   fread(&encoding,1,1,pcxf);\r
1326   fread(&bits_per_pixel,1,1,pcxf);\r
1327   fread(&xmin,1,2,pcxf);\r
1328   fread(&ymin,1,2,pcxf);\r
1329   fread(&xmax,1,2,pcxf);\r
1330   fread(&ymax,1,2,pcxf);\r
1331   fread(&hres,1,2,pcxf);\r
1332   fread(&vres,1,2,pcxf);\r
1333   fread(&palette,1,48,pcxf);\r
1334   fread(&reserved,1,1,pcxf);\r
1335   fread(&color_planes,1,1,pcxf);\r
1336   fread(&bytes_per_line,1,2,pcxf);\r
1337   fread(&palette_type,1,2,pcxf);\r
1338   fread(&filler,1,58,pcxf);\r
1339   fseek(pcxf,-768L,SEEK_END);\r
1340   fread(pal,1,768,pcxf);\r
1341   fseek(pcxf,128L,SEEK_SET);\r
1342   width=xmax-xmin+1;\r
1343   depth=ymax-ymin+1;\r
1344   bytes=bytes_per_line;\r
1345 \r
1346   for (i=0; i<768; i++)\r
1347     pal[i]=pal[i] >> 2;\r
1348   set_intensity(63);\r
1349 }\r
1350 \r
1351 void LoadPCXHeaderNP(char *fname)\r
1352 {\r
1353   pcxf=fopen(fname,"rb");\r
1354   if (!pcxf) err("Could not open specified PCX file.");\r
1355   fread(&manufacturer,1,1,pcxf);\r
1356   fread(&version,1,1,pcxf);\r
1357   fread(&encoding,1,1,pcxf);\r
1358   fread(&bits_per_pixel,1,1,pcxf);\r
1359   fread(&xmin,1,2,pcxf);\r
1360   fread(&ymin,1,2,pcxf);\r
1361   fread(&xmax,1,2,pcxf);\r
1362   fread(&ymax,1,2,pcxf);\r
1363   fread(&hres,1,2,pcxf);\r
1364   fread(&vres,1,2,pcxf);\r
1365   fread(&palette,1,48,pcxf);\r
1366   fread(&reserved,1,1,pcxf);\r
1367   fread(&color_planes,1,1,pcxf);\r
1368   fread(&bytes_per_line,1,2,pcxf);\r
1369   fread(&palette_type,1,2,pcxf);\r
1370   fread(&filler,1,58,pcxf);\r
1371   width=xmax-xmin+1;\r
1372   depth=ymax-ymin+1;\r
1373   bytes=bytes_per_line;\r
1374 }\r
1375 \r
1376 // grabs a tile from the ovsp buffer (transit tile bay)\r
1377 int GrabTileAt(int x, int y, int z, int check_dup)\r
1378 { int a;\r
1379   char tvsp[256];\r
1380   char *s;\r
1381 \r
1382   s=t+(y*width)+x;\r
1383 \r
1384   for (a=0; a<16; a++)\r
1385   {\r
1386     memcpy(tvsp+(a*16), s, 16);\r
1387     s+=width;\r
1388   }\r
1389 \r
1390   if (check_dup)\r
1391   {\r
1392   for (a=0; a<z; a++)\r
1393     if (!memcmp(tvsp, ovsp+(a*256), 256)) return 0;\r
1394   }\r
1395 \r
1396   memcpy(ovsp+(z*256), tvsp, 256);\r
1397   return 1;\r
1398 }\r
1399 \r
1400 void ImportPCX()\r
1401 { char fname[60];\r
1402   int i,j,z;\r
1403   int wide,deep; // grabbable x&y tiles\r
1404   int add,jumper; // related to grab coords\r
1405 \r
1406   bmode=1; oh=th; th=0;\r
1407   Browse(1,"*.pcx","","","",fname);\r
1408   WaitRelease();\r
1409   if (strlen(fname)<3) return;\r
1410   OpenPCXas();\r
1411   th=oh; bmode=0;\r
1412 \r
1413   add=!openas;\r
1414   jumper=16+add;\r
1415 \r
1416   LoadPCXHeader(fname);\r
1417 \r
1418   // temp pcx buffer for grabs\r
1419   t=(char *) valloc(width*depth,"pcx buf",0);\r
1420 \r
1421   for (i=0; i<depth; i++)\r
1422   {\r
1423     vidoffset=width*i;\r
1424     ReadPCXLine(t);\r
1425   }\r
1426 \r
1427   fclose(pcxf);\r
1428 \r
1429   deep=((depth&~15)+add)/jumper;\r
1430   wide=(width+add)/jumper;\r
1431 \r
1432   ontiles=wide*deep;\r
1433   ovsp=(char *) valloc(ontiles*256,"ovsp",0); // temp tilebay\r
1434 \r
1435   z=0;\r
1436   for (i=0; i<deep; i++) // grab all tiles\r
1437     for (j=0; j<wide; j++)\r
1438     {\r
1439       z+=GrabTileAt((j*jumper)+add, (i*jumper)+add, z, openas);\r
1440     }\r
1441 \r
1442   ontiles = z; // tiles successfully grabbed\r
1443   vfree(t);\r
1444 \r
1445   ImportTiles();\r
1446   vfree(ovsp);\r
1447   key[SCAN_ESC]=0;\r
1448 }\r