]> 4ch.mooo.com Git - 16.git/blob - src/v2/source/ENGINE/CONSOLE.C
wwww
[16.git] / src / v2 / source / ENGINE / CONSOLE.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 #define CONSOLE_H\r
18 #include "verge.h"\r
19 #define conwidth 40\r
20 \r
21 // ================================= Data ====================================\r
22 \r
23 byte *consolebg;                           // Console background image\r
24 char *consoletext;                         // Console text buffer\r
25 byte *cmd, *cmd2, cmdlen=0;                // command line buffer\r
26 char *lastcmds, numcmds=0, cmdpos=0;       // last-command memory\r
27 byte *args[10], numargs;                   // command argument pointers\r
28 char cursor=1;                             // flag on/off cursor visible\r
29 int cswtime=0;                             // cursor switch time.\r
30 int conlines=1;                            // Number of visible lines\r
31 int lines=0;                               // number of lines entered since last draw\r
32 char startln=36;                           // Start display ofs (for scrollback)\r
33 char allowconsole=1;\r
34 char consoleoverride=0;\r
35 \r
36 byte key_ascii_tbl[128] =\r
37 {\r
38   0,   0,   '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 8,   9,\r
39   'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 13,  0,   'a', 's',\r
40   'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 39,  0,   0,   92,  'z', 'x', 'c', 'v',\r
41   'b', 'n', 'm', ',', '.', '/', 0,   '*', 0,   ' ', 0,   3,   3,   3,   3,   8,\r
42   3,   3,   3,   3,   3,   0,   0,   0,   0,   0,   '-', 0,   0,   0,   '+', 0,\r
43   0,   0,   0,   127, 0,   0,   92,  3,   3,   0,   0,   0,   0,   0,   0,   0,\r
44   13,  0,   '/', 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   127,\r
45   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   '/', 0,   0,   0,   0,   0\r
46 };\r
47 \r
48 byte key_shift_tbl[128] =\r
49 {\r
50    0,   0,   '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', 126, 126,\r
51    'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 126, 0,   'A', 'S',\r
52    'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', 34,  0,   0,   '|', 'Z', 'X', 'C', 'V',\r
53    'B', 'N', 'M', '<', '>', '?', 0,   '*', 0,   1,   0,   1,   1,   1,   1,   1,\r
54    1,   1,   1,   1,   1,   0,   0,   0,   0,   0,   '-', 0,   0,   0,   '+', 0,\r
55    0,   0,   1,   127, 0,   0,   0,   1,   1,   0,   0,   0,   0,   0,   0,   0,\r
56    13,  0,   '/', 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   127,\r
57    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   '/', 0,   0,   0,   0,   0\r
58 };\r
59 \r
60 #define NUMCMDS 31\r
61 char *concmds[] = {\r
62   "CONSOLEBG","LISTMOUNTS","PACKINFO","LISTCMDS","CD_PLAY","CD_STOP",\r
63   "CD_OPEN","CD_CLOSE","EXIT","VID_MODE","CPU_USAGE","MOUNT","MAP",\r
64   "VER","BROWSETILES","WARP","CAMERATRACKING","RSTRING","SHOWOBS",\r
65   "PHANTOM","ENTITYSTAT","ACTIVEENTS","ENTITY","CURPOS","PLAYERSPEED",\r
66   "SPEEDDEMON","RV","SV","PLAYER","SPAWNENTITY","SHOWZONES"\r
67   };\r
68 byte sortedcmds[NUMCMDS];\r
69 \r
70 // ================================= Code ====================================\r
71 \r
72 void SortConCmds(void)\r
73 /* -- ric: 03/Jun/98 --\r
74  * creates the sorted index into concmds\r
75  */\r
76 {\r
77   int i,j;\r
78   int temp;\r
79 \r
80   for (i=0; i<NUMCMDS; i++)\r
81     sortedcmds[i]=i;\r
82   for (i=1; i<NUMCMDS; i++)\r
83   {\r
84     for (j=NUMCMDS-1; j>=i; j--)\r
85       if (strcmp(concmds[sortedcmds[j-1]],concmds[sortedcmds[j]])>0)\r
86       {\r
87         // swap the indices\r
88         temp=sortedcmds[j-1];\r
89         sortedcmds[j-1]=sortedcmds[j];\r
90         sortedcmds[j]=temp;\r
91       }\r
92   }\r
93 }\r
94 \r
95 void InitConsole(void)\r
96 {\r
97   Logp("Initialize console.");\r
98   LoadFont("system.fnt");\r
99   consolebg=VLoadImageBuf("console.gif");\r
100 \r
101   consoletext=(char *) valloc(45*50, "consoletext", OID_MISC);\r
102   cmd=(byte *) valloc(40, "InitConsole:cmd", OID_MISC);\r
103   cmd2=(byte *) valloc(40, "InitConsole:cmd2", OID_MISC);\r
104   memset(cmd, 0, 40);\r
105   memset(cmd2, 0, 40);\r
106   memset(consoletext, 0, 2250);\r
107 \r
108   lastcmds=(char *) valloc(400, "InitConsole:lastcmds", OID_MISC);\r
109   memset(lastcmds, 0, 400);\r
110 \r
111   SortConCmds();\r
112   LogDone();\r
113 }\r
114 \r
115 void DrawConsole();\r
116 \r
117 void Con_Printf(char *str)\r
118 { char tbuf[2250];\r
119 \r
120   // move buffer up a line\r
121   memcpy(tbuf, consoletext+50, 2200);\r
122   memcpy(consoletext, tbuf, 2200);\r
123 \r
124   memcpy(consoletext+2200, str, strlen(str)+1);\r
125   lines++;\r
126 }\r
127 \r
128 void Con_NextLine(void)\r
129 {\r
130   Con_Printf("");\r
131   lines=0;\r
132 }\r
133 \r
134 int ShowConsole(void)\r
135 {\r
136   conlines+=2;\r
137   if (conlines > 120)\r
138   {\r
139     callback=0;\r
140     conlines=120;\r
141   }\r
142   return 0;\r
143 }\r
144 \r
145 int HideConsole(void)\r
146 {\r
147   if (conlines > 3)\r
148   {\r
149     conlines-=2;\r
150   }\r
151   else\r
152   {\r
153     conlines=1;\r
154     callback=0;\r
155   }\r
156   return 0;\r
157 }\r
158 \r
159 void DrawConsole(void)\r
160 { int i;\r
161   int tagline=0;\r
162 \r
163   lines=0;\r
164   tagline=conlines;\r
165 \r
166   Render();\r
167   CopySpriteZoomClip(0,-120+tagline, 320,120, sx,120, consolebg);\r
168 \r
169   // write console text\r
170 \r
171   for (i=0; i<9; i++)\r
172   {\r
173     GotoXY(1, 1+(i*10)-(120-tagline));\r
174     printstring(0,consoletext+((startln+i)*50));\r
175   }\r
176 \r
177   GotoXY(1,101-(120-tagline));\r
178   printstring(0,"]");\r
179   printstring(0,(char *) cmd);\r
180 \r
181   if (systemtime>=cswtime)\r
182   {\r
183     cursor ^= 1;\r
184     cswtime = systemtime+40;\r
185   }\r
186 \r
187   if (cursor) printstring(0, "&");\r
188 \r
189   if (startln<36)\r
190   {\r
191     GotoXY(1, 91-(120-tagline));\r
192     printstring(0, "^   ^   ^   ^   ^   ^   ^   ^   ^   ^");\r
193   }\r
194 }\r
195 \r
196 int Args(int num)\r
197 {\r
198   if (numargs>=num) return 1;\r
199   sprintf(strbuf,"This function needs \81%d~ arguments.",num-1);\r
200   Con_Printf(strbuf);\r
201   return 0;\r
202 }\r
203 \r
204 void ListCmds(void)\r
205 { int i;\r
206 \r
207   Con_NextLine();\r
208   for (i=0; i<NUMCMDS; i++)\r
209     Con_Printf(concmds[sortedcmds[i]]);\r
210 }\r
211 \r
212 void ConsoleBackground()\r
213 {\r
214   vfree(consolebg);\r
215   consolebg=VLoadImageBuf((char *) args[1]);\r
216 }\r
217 \r
218 void ExecuteCommand(int i)\r
219 {\r
220   switch(i)\r
221   {\r
222     case 0: if (Args(2)) ConsoleBackground(); break;\r
223     case 1: ListMounts(); break;\r
224     case 2: if (Args(2)) PackInfo(); break;\r
225     case 3: ListCmds(); break;\r
226     case 4: break; //if (Args(2)) CD_Play(atoi((char *) args[1])); break;\r
227     case 5: break; //CD_Stop(); break;\r
228     case 6: break; //CD_Open_Door(); break;\r
229     case 7: break; //CD_Close_Door(); break;\r
230     case 8: err(""); break;\r
231     case 9: if (Args(3)) vid_mode(); break;\r
232     case 10: CPU_Usage(); break;\r
233     case 11: if (Args(2)) Mount(); break;\r
234     case 12: if (numargs<2) MAPstats(); else MAPswitch(); break;\r
235     case 13: ver(); break;\r
236     case 14: ZeroConBrowseTiles(); break;\r
237     case 15: if (numargs==3) ZeroConWarp((char**)args); else { Con_Printf("\82syntax:"); Con_Printf("Warp <x> <y>~"); } break;\r
238     case 16: CameraTracking(); break;\r
239     case 17: if (numargs==1) ZeroGetRString();\r
240              if (numargs==2) ZeroSetRString((char**)args); break;\r
241     case 18: Obstructions(); break;\r
242     case 19: Phantom(); break;\r
243     case 20: EntityStat(); break;\r
244     case 21: ListActiveEnts(); break;\r
245     case 22: if (Args(2)) EntityS(); break;\r
246     case 23: CurPos(); break;\r
247     case 24: PlayerSpeed(); break;\r
248     case 25: speeddemon=1; break;\r
249     case 26: ReadVCVar(); break;\r
250     case 27: WriteVCVar(); break;\r
251     case 28: if (Args(2)) Player(); break;\r
252     case 29: if (Args(4)) SpawnEntity(); break;\r
253     case 30: ShowZones(); break;\r
254     case NUMCMDS: Con_Printf((char *) cmd); break;\r
255   }\r
256 }\r
257 \r
258 void ParseCommand(void)\r
259 { byte *src;\r
260   // breaks the command string into arguements and stuff. (in cmd2)\r
261 \r
262   numargs=0;\r
263   src=(byte *) cmd2;\r
264   args[0]=src;\r
265 \r
266   while (*src==' ') src++;\r
267 \r
268   if (!*src) return;\r
269 \r
270   while (1)\r
271   {\r
272     if (*src==' ')\r
273     {\r
274       while (*src== ' ')\r
275       {\r
276         *src=0;\r
277         src++;\r
278       }\r
279       if (*src)\r
280       {\r
281         numargs++;\r
282         args[numargs]=src;\r
283       }\r
284       src--;\r
285     }\r
286     src++;\r
287     if (!*src)\r
288     {\r
289       numargs++;\r
290       return;\r
291     }\r
292   }\r
293 }\r
294 \r
295 void ProcessCommand(void)\r
296 { byte i;\r
297 \r
298   memcpy(cmd2, cmd, 40);\r
299   strupr((char *) cmd2);\r
300   ParseCommand();\r
301 \r
302   i=0;\r
303   while (i<NUMCMDS)\r
304   {\r
305     if (!strcmp(concmds[i], (char *) args[0])) break;\r
306     i++;\r
307   }\r
308   ExecuteCommand(i);\r
309   memcpy(lastcmds, lastcmds+40, 360);\r
310   memcpy(lastcmds+360, cmd, 40);\r
311   if (numcmds<10) numcmds++;\r
312   cmdpos=0;\r
313   memset(cmd, 0, 40);\r
314   cmdlen=0;\r
315 }\r
316 \r
317 void CommandInput(void)\r
318 { byte c, len, cc;\r
319 \r
320   UpdateControls();\r
321   if (!last_pressed) return;\r
322 \r
323   // Handle the Shift key\r
324 \r
325   if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])\r
326   {\r
327     c=key_shift_tbl[last_pressed];\r
328   }\r
329   else\r
330   {\r
331     c=key_ascii_tbl[last_pressed];\r
332   }\r
333 \r
334   // Handle special cases first\r
335   if (last_pressed == SCAN_PGUP)\r
336   {\r
337     if (startln) startln--;\r
338     last_pressed=0;\r
339     return;\r
340   }\r
341 \r
342   if (last_pressed == SCAN_PGDN)\r
343   {\r
344     if (startln < 36) startln++;\r
345     last_pressed=0;\r
346     return;\r
347   }\r
348 \r
349   if (last_pressed == SCAN_UP)\r
350   {\r
351     if (cmdpos<numcmds)\r
352     {\r
353       cmdpos++;\r
354       memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
355       cmdlen=strlen((char *) cmd);\r
356     }\r
357     last_pressed=0;\r
358     return;\r
359   }\r
360 \r
361   if (last_pressed == SCAN_DOWN)\r
362   {\r
363     if (cmdpos)\r
364     {\r
365       cmdpos--;\r
366       if (!cmdpos)\r
367       {\r
368         memset(cmd, 0, 40);\r
369         cmdlen=0;\r
370       }\r
371       else\r
372       {\r
373         memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);\r
374         cmdlen=strlen((char *) cmd);\r
375       }\r
376     }\r
377     last_pressed=0;\r
378     return;\r
379   }\r
380 \r
381   if (!c)\r
382   {\r
383     last_pressed=0;\r
384     return;\r
385   }\r
386 \r
387   if (last_pressed == SCAN_BACKSP)\r
388   {\r
389     if (cmdlen)\r
390     {\r
391       cmdlen--;\r
392       cmd[cmdlen]=0;\r
393     }\r
394     last_pressed=0;\r
395     return;\r
396   }\r
397 \r
398   if (last_pressed == SCAN_TAB)\r
399   {\r
400     last_pressed=0;\r
401     len=strlen((char *) cmd);\r
402     if (!len) return;\r
403     for (cc=0; cc<NUMCMDS; cc++)\r
404         if (!strncasecmp((char *) cmd, concmds[sortedcmds[cc]], len))\r
405         {\r
406           memcpy((char *) cmd, concmds[sortedcmds[cc]], strlen(concmds[sortedcmds[cc]])+1);\r
407           strlwr((char *) cmd);\r
408           cmdlen=strlen((char *) cmd);\r
409           return;\r
410         }\r
411     return;\r
412   }\r
413 \r
414   if (last_pressed == SCAN_ENTER)\r
415   {\r
416     ProcessCommand();\r
417     last_pressed=0;\r
418     return;\r
419   }\r
420 \r
421   if (cmdlen<38)\r
422   {\r
423     cmd[cmdlen++]=c;\r
424     cmd[cmdlen]=0;\r
425   }\r
426 \r
427   last_pressed=0;\r
428 }\r
429 \r
430 void ActivateConsole(void)\r
431 {\r
432   if (!allowconsole && !consoleoverride) return;\r
433   conlines=1;\r
434   callback=ShowConsole;\r
435   cswtime=systemtime+40;\r
436 \r
437   while (!key[SCAN_RQUOTA])\r
438   {\r
439     DrawConsole();\r
440     ShowPage();\r
441     CheckMessages();\r
442     CommandInput();\r
443   }\r
444 \r
445   callback=HideConsole;\r
446   while (conlines > 1)\r
447   {\r
448     CheckMessages();\r
449     DrawConsole();\r
450     ShowPage();\r
451   }\r
452   conlines=0;\r
453   key[SCAN_RQUOTA]=0;\r
454   timer_count=0;\r
455 }\r