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
21 // ================================= Data ====================================
\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
36 byte key_ascii_tbl[128] =
\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
48 byte key_shift_tbl[128] =
\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
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
68 byte sortedcmds[NUMCMDS];
\r
70 // ================================= Code ====================================
\r
72 void SortConCmds(void)
\r
73 /* -- ric: 03/Jun/98 --
\r
74 * creates the sorted index into concmds
\r
80 for (i=0; i<NUMCMDS; i++)
\r
82 for (i=1; i<NUMCMDS; i++)
\r
84 for (j=NUMCMDS-1; j>=i; j--)
\r
85 if (strcmp(concmds[sortedcmds[j-1]],concmds[sortedcmds[j]])>0)
\r
88 temp=sortedcmds[j-1];
\r
89 sortedcmds[j-1]=sortedcmds[j];
\r
95 void InitConsole(void)
\r
97 Logp("Initialize console.");
\r
98 LoadFont("system.fnt");
\r
99 consolebg=VLoadImageBuf("console.gif");
\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
108 lastcmds=(char *) valloc(400, "InitConsole:lastcmds", OID_MISC);
\r
109 memset(lastcmds, 0, 400);
\r
115 void DrawConsole();
\r
117 void Con_Printf(char *str)
\r
120 // move buffer up a line
\r
121 memcpy(tbuf, consoletext+50, 2200);
\r
122 memcpy(consoletext, tbuf, 2200);
\r
124 memcpy(consoletext+2200, str, strlen(str)+1);
\r
128 void Con_NextLine(void)
\r
134 int ShowConsole(void)
\r
137 if (conlines > 120)
\r
145 int HideConsole(void)
\r
159 void DrawConsole(void)
\r
167 CopySpriteZoomClip(0,-120+tagline, 320,120, sx,120, consolebg);
\r
169 // write console text
\r
171 for (i=0; i<9; i++)
\r
173 GotoXY(1, 1+(i*10)-(120-tagline));
\r
174 printstring(0,consoletext+((startln+i)*50));
\r
177 GotoXY(1,101-(120-tagline));
\r
178 printstring(0,"]");
\r
179 printstring(0,(char *) cmd);
\r
181 if (systemtime>=cswtime)
\r
184 cswtime = systemtime+40;
\r
187 if (cursor) printstring(0, "&");
\r
191 GotoXY(1, 91-(120-tagline));
\r
192 printstring(0, "^ ^ ^ ^ ^ ^ ^ ^ ^ ^");
\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
204 void ListCmds(void)
\r
208 for (i=0; i<NUMCMDS; i++)
\r
209 Con_Printf(concmds[sortedcmds[i]]);
\r
212 void ConsoleBackground()
\r
215 consolebg=VLoadImageBuf((char *) args[1]);
\r
218 void ExecuteCommand(int i)
\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
258 void ParseCommand(void)
\r
260 // breaks the command string into arguements and stuff. (in cmd2)
\r
266 while (*src==' ') src++;
\r
295 void ProcessCommand(void)
\r
298 memcpy(cmd2, cmd, 40);
\r
299 strupr((char *) cmd2);
\r
305 if (!strcmp(concmds[i], (char *) args[0])) break;
\r
309 memcpy(lastcmds, lastcmds+40, 360);
\r
310 memcpy(lastcmds+360, cmd, 40);
\r
311 if (numcmds<10) numcmds++;
\r
313 memset(cmd, 0, 40);
\r
317 void CommandInput(void)
\r
321 if (!last_pressed) return;
\r
323 // Handle the Shift key
\r
325 if (key[SCAN_LSHIFT] || key[SCAN_RSHIFT])
\r
327 c=key_shift_tbl[last_pressed];
\r
331 c=key_ascii_tbl[last_pressed];
\r
334 // Handle special cases first
\r
335 if (last_pressed == SCAN_PGUP)
\r
337 if (startln) startln--;
\r
342 if (last_pressed == SCAN_PGDN)
\r
344 if (startln < 36) startln++;
\r
349 if (last_pressed == SCAN_UP)
\r
351 if (cmdpos<numcmds)
\r
354 memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);
\r
355 cmdlen=strlen((char *) cmd);
\r
361 if (last_pressed == SCAN_DOWN)
\r
368 memset(cmd, 0, 40);
\r
373 memcpy(cmd, lastcmds+(400-(cmdpos*40)), 40);
\r
374 cmdlen=strlen((char *) cmd);
\r
387 if (last_pressed == SCAN_BACKSP)
\r
398 if (last_pressed == SCAN_TAB)
\r
401 len=strlen((char *) cmd);
\r
403 for (cc=0; cc<NUMCMDS; cc++)
\r
404 if (!strncasecmp((char *) cmd, concmds[sortedcmds[cc]], len))
\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
414 if (last_pressed == SCAN_ENTER)
\r
430 void ActivateConsole(void)
\r
432 if (!allowconsole && !consoleoverride) return;
\r
434 callback=ShowConsole;
\r
435 cswtime=systemtime+40;
\r
437 while (!key[SCAN_RQUOTA])
\r
445 callback=HideConsole;
\r
446 while (conlines > 1)
\r
453 key[SCAN_RQUOTA]=0;
\r