1 //-------------------------------------------------------------------------
2 /*
3 Copyright (C) 2010-2019 EDuke32 developers and contributors
4 Copyright (C) 2019 Nuke.YKT
5
6 This file is part of NBlood.
7
8 NBlood is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License version 2
10 as published by the Free Software Foundation.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
16 See the GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22 //-------------------------------------------------------------------------
23
24 #include "build.h"
25 #include "baselayer.h"
26 #include "keyboard.h"
27 #include "control.h"
28 #include "osd.h"
29 #include "compat.h"
30 #include "mmulti.h"
31 #include "sndcards.h"
32 #include "fx_man.h"
33 #include "common_game.h"
34 #include "config.h"
35 #include "blood.h"
36 #include "demo.h"
37 #include "gamemenu.h"
38 #include "globals.h"
39 #include "levels.h"
40 #include "messages.h"
41 #include "network.h"
42 #include "osdcmds.h"
43 #include "screen.h"
44 #include "sound.h"
45 #include "sfx.h"
46 #include "view.h"
47
48
osdcmd_quit(osdcmdptr_t UNUSED (parm))49 static inline int osdcmd_quit(osdcmdptr_t UNUSED(parm))
50 {
51 UNREFERENCED_CONST_PARAMETER(parm);
52 OSD_ShowDisplay(0);
53 QuitGame();
54 return OSDCMD_OK;
55 }
56
osdcmd_changelevel(osdcmdptr_t parm)57 static int osdcmd_changelevel(osdcmdptr_t parm)
58 {
59 int32_t volume,level;
60 char *p;
61
62 if (parm->numparms != 2) return OSDCMD_SHOWHELP;
63
64 volume = strtol(parm->parms[0], &p, 10) - 1;
65 if (p[0]) return OSDCMD_SHOWHELP;
66 level = strtol(parm->parms[1], &p, 10) - 1;
67 if (p[0]) return OSDCMD_SHOWHELP;
68
69 if (volume < 0) return OSDCMD_SHOWHELP;
70 if (level < 0) return OSDCMD_SHOWHELP;
71
72 if (volume >= 6)
73 {
74 OSD_Printf("changelevel: invalid volume number (range 1-%d)\n",6);
75 return OSDCMD_OK;
76 }
77
78 if (level >= gEpisodeInfo[volume].nLevels)
79 {
80 OSD_Printf("changelevel: invalid level number\n");
81 return OSDCMD_SHOWHELP;
82 }
83
84 if (gDemo.at1)
85 gDemo.StopPlayback();
86
87 if (numplayers > 1)
88 {
89 gPacketStartGame.episodeId = volume;
90 gPacketStartGame.levelId = level;
91 netBroadcastNewGame();
92 gStartNewGame = 1;
93 gGameMenuMgr.Deactivate();
94 return OSDCMD_OK;
95 }
96 levelSetupOptions(volume, level);
97 StartLevel(&gGameOptions);
98 viewResizeView(gViewSize);
99 gGameMenuMgr.Deactivate();
100
101 return OSDCMD_OK;
102 }
103
osdcmd_map(osdcmdptr_t parm)104 static int osdcmd_map(osdcmdptr_t parm)
105 {
106 char filename[BMAX_PATH];
107
108 const int32_t wildcardp = parm->numparms==1 &&
109 (Bstrchr(parm->parms[0], '*') != NULL);
110
111 if (parm->numparms != 1 || wildcardp)
112 {
113 BUILDVFS_FIND_REC *r;
114 fnlist_t fnlist = FNLIST_INITIALIZER;
115 int32_t maxwidth = 0;
116
117 if (wildcardp)
118 maybe_append_ext(filename, sizeof(filename), parm->parms[0], ".map");
119 else
120 Bstrcpy(filename, "*.MAP");
121
122 fnlist_getnames(&fnlist, "/", filename, -1, 0);
123 gSysRes.FNAddFiles(&fnlist, filename);
124
125 for (r=fnlist.findfiles; r; r=r->next)
126 maxwidth = max<int>(maxwidth, Bstrlen(r->name));
127
128 if (maxwidth > 0)
129 {
130 int32_t x = 0;
131 maxwidth += 3;
132 OSD_Printf(OSDTEXT_RED "Map listing:\n");
133 for (r=fnlist.findfiles; r; r=r->next)
134 {
135 OSD_Printf("%-*s",maxwidth,r->name);
136 x += maxwidth;
137 if (x > OSD_GetCols() - maxwidth)
138 {
139 x = 0;
140 OSD_Printf("\n");
141 }
142 }
143 if (x) OSD_Printf("\n");
144 OSD_Printf(OSDTEXT_RED "Found %d maps\n", fnlist.numfiles);
145 }
146
147 fnlist_clearnames(&fnlist);
148
149 return OSDCMD_SHOWHELP;
150 }
151
152 strcpy(filename, parm->parms[0]);
153 ChangeExtension(filename, "");
154
155 if (!gSysRes.Lookup(filename, "MAP"))
156 {
157 OSD_Printf(OSD_ERROR "map: file \"%s\" not found.\n", filename);
158 return OSDCMD_OK;
159 }
160
161 if (gDemo.at1)
162 gDemo.StopPlayback();
163
164 int bFound = 0;
165 for (int i = 0; i < gEpisodeCount; i++)
166 {
167 auto pEpisodeInfo = &gEpisodeInfo[i];
168 for (int j = 0; j < pEpisodeInfo->nLevels; j++)
169 {
170 auto pLevelInfo = &pEpisodeInfo->levelsInfo[j];
171 if (!Bstrcasecmp(pLevelInfo->Filename, filename))
172 {
173 gGameOptions.nEpisode = i;
174 gGameOptions.nLevel = j;
175 bFound = 1;
176 }
177 }
178 }
179 if (!bFound)
180 levelAddUserMap(filename);
181
182 if (numplayers > 1)
183 {
184 gPacketStartGame.episodeId = gGameOptions.nEpisode;
185 gPacketStartGame.levelId = gGameOptions.nLevel;
186 netBroadcastNewGame();
187 gStartNewGame = 1;
188 gGameMenuMgr.Deactivate();
189 return OSDCMD_OK;
190 }
191 levelSetupOptions(gGameOptions.nEpisode, gGameOptions.nLevel);
192 StartLevel(&gGameOptions);
193 viewResizeView(gViewSize);
194 gGameMenuMgr.Deactivate();
195
196 return OSDCMD_OK;
197 }
198
osdcmd_demo(osdcmdptr_t parm)199 static int osdcmd_demo(osdcmdptr_t parm)
200 {
201 if (numplayers > 1)
202 {
203 OSD_Printf("Command not allowed in multiplayer\n");
204 return OSDCMD_OK;
205 }
206
207 //if (g_player[myconnectindex].ps->gm & MODE_GAME)
208 //{
209 // OSD_Printf("demo: Must not be in a game.\n");
210 // return OSDCMD_OK;
211 //}
212
213 if (parm->numparms != 1/* && parm->numparms != 2*/)
214 return OSDCMD_SHOWHELP;
215
216 gDemo.SetupPlayback(parm->parms[0]);
217 gGameStarted = 0;
218 gDemo.Playback();
219
220 return OSDCMD_OK;
221 }
222
osdcmd_restartvid(osdcmdptr_t UNUSED (parm))223 int osdcmd_restartvid(osdcmdptr_t UNUSED(parm))
224 {
225 UNREFERENCED_CONST_PARAMETER(parm);
226 videoResetMode();
227 if (videoSetGameMode(gSetup.fullscreen,gSetup.xdim,gSetup.ydim,gSetup.bpp,0))
228 ThrowError("restartvid: Reset failed...\n");
229 onvideomodechange(gSetup.bpp>8);
230 viewResizeView(gViewSize);
231
232 return OSDCMD_OK;
233 }
234
osdcmd_music(osdcmdptr_t parm)235 static int osdcmd_music(osdcmdptr_t parm)
236 {
237 char buffer[128];
238 if (parm->numparms == 1)
239 {
240 int32_t sel = levelGetMusicIdx(parm->parms[0]);
241
242 if (sel == -1)
243 return OSDCMD_SHOWHELP;
244
245 if (sel == -2)
246 {
247 OSD_Printf("%s is not a valid episode/level number pair\n", parm->parms[0]);
248 return OSDCMD_OK;
249 }
250
251 int nEpisode = sel/kMaxLevels;
252 int nLevel = sel%kMaxLevels;
253
254 if (!levelTryPlayMusic(nEpisode, nLevel))
255 {
256 if (CDAudioToggle)
257 snprintf(buffer, sizeof(buffer), "Playing %i track", gEpisodeInfo[nEpisode].levelsInfo[nLevel].SongId);
258 else
259 snprintf(buffer, sizeof(buffer), "Playing %s", gEpisodeInfo[nEpisode].levelsInfo[nLevel].Song);
260 viewSetMessage(buffer);
261 }
262 else
263 {
264 OSD_Printf("No music defined for %s\n", parm->parms[0]);
265 }
266
267 return OSDCMD_OK;
268 }
269
270 return OSDCMD_SHOWHELP;
271 }
272
osdcmd_vidmode(osdcmdptr_t parm)273 static int osdcmd_vidmode(osdcmdptr_t parm)
274 {
275 int32_t newbpp = gSetup.bpp, newwidth = gSetup.xdim,
276 newheight = gSetup.ydim, newfs = gSetup.fullscreen;
277 int32_t tmp;
278
279 if (parm->numparms < 1 || parm->numparms > 4) return OSDCMD_SHOWHELP;
280
281 switch (parm->numparms)
282 {
283 case 1: // bpp switch
284 tmp = Batol(parm->parms[0]);
285 if (!(tmp==8 || tmp==16 || tmp==32))
286 return OSDCMD_SHOWHELP;
287 newbpp = tmp;
288 break;
289 case 2: // res switch
290 newwidth = Batol(parm->parms[0]);
291 newheight = Batol(parm->parms[1]);
292 break;
293 case 3: // res & bpp switch
294 case 4:
295 newwidth = Batol(parm->parms[0]);
296 newheight = Batol(parm->parms[1]);
297 tmp = Batol(parm->parms[2]);
298 if (!(tmp==8 || tmp==16 || tmp==32))
299 return OSDCMD_SHOWHELP;
300 newbpp = tmp;
301 if (parm->numparms == 4)
302 newfs = (Batol(parm->parms[3]) != 0);
303 break;
304 }
305
306 if (videoSetGameMode(newfs,newwidth,newheight,newbpp,upscalefactor))
307 {
308 initprintf("vidmode: Mode change failed!\n");
309 if (videoSetGameMode(gSetup.fullscreen, gSetup.xdim, gSetup.ydim, gSetup.bpp, upscalefactor))
310 ThrowError("vidmode: Reset failed!\n");
311 }
312 gSetup.bpp = newbpp;
313 gSetup.xdim = newwidth;
314 gSetup.ydim = newheight;
315 gSetup.fullscreen = newfs;
316 onvideomodechange(gSetup.bpp>8);
317 viewResizeView(gViewSize);
318 return OSDCMD_OK;
319 }
320
osdcmd_crosshaircolor(osdcmdptr_t parm)321 static int osdcmd_crosshaircolor(osdcmdptr_t parm)
322 {
323 if (parm->numparms != 3)
324 {
325 OSD_Printf("crosshaircolor: r:%d g:%d b:%d\n",CrosshairColors.r,CrosshairColors.g,CrosshairColors.b);
326 return OSDCMD_SHOWHELP;
327 }
328
329 uint8_t const r = Batol(parm->parms[0]);
330 uint8_t const g = Batol(parm->parms[1]);
331 uint8_t const b = Batol(parm->parms[2]);
332
333 g_isAlterDefaultCrosshair = true;
334 viewSetCrosshairColor(r,g,b);
335
336 if (!OSD_ParsingScript())
337 OSD_Printf("%s\n", parm->raw);
338
339 return OSDCMD_OK;
340 }
341
osdcmd_resetcrosshair(osdcmdptr_t UNUSED (parm))342 static int osdcmd_resetcrosshair(osdcmdptr_t UNUSED(parm))
343 {
344 UNREFERENCED_CONST_PARAMETER(parm);
345 g_isAlterDefaultCrosshair = false;
346 viewResetCrosshairToDefault();
347
348 return OSDCMD_OK;
349 }
350
osdcmd_give(osdcmdptr_t parm)351 static int osdcmd_give(osdcmdptr_t parm)
352 {
353 if (numplayers != 1 || !gGameStarted || gMe->pXSprite->health == 0)
354 {
355 OSD_Printf("give: Cannot give while dead or not in a single-player game.\n");
356 return OSDCMD_OK;
357 }
358
359 if (parm->numparms != 1) return OSDCMD_SHOWHELP;
360
361 if (!Bstrcasecmp(parm->parms[0], "all"))
362 {
363 SetWeapons(true);
364 SetAmmo(true);
365 SetToys(true);
366 SetArmor(true);
367 SetKeys(true);
368 gCheatMgr.m_bPlayerCheated = true;
369 return OSDCMD_OK;
370 }
371 else if (!Bstrcasecmp(parm->parms[0], "health"))
372 {
373 actHealDude(gMe->pXSprite, 200, 200);
374 gCheatMgr.m_bPlayerCheated = true;
375 return OSDCMD_OK;
376 }
377 else if (!Bstrcasecmp(parm->parms[0], "weapons"))
378 {
379 SetWeapons(true);
380 gCheatMgr.m_bPlayerCheated = true;
381 return OSDCMD_OK;
382 }
383 else if (!Bstrcasecmp(parm->parms[0], "ammo"))
384 {
385 SetAmmo(true);
386 gCheatMgr.m_bPlayerCheated = true;
387 return OSDCMD_OK;
388 }
389 else if (!Bstrcasecmp(parm->parms[0], "armor"))
390 {
391 SetArmor(true);
392 gCheatMgr.m_bPlayerCheated = true;
393 return OSDCMD_OK;
394 }
395 else if (!Bstrcasecmp(parm->parms[0], "keys"))
396 {
397 SetKeys(true);
398 gCheatMgr.m_bPlayerCheated = true;
399 return OSDCMD_OK;
400 }
401 else if (!Bstrcasecmp(parm->parms[0], "inventory"))
402 {
403 SetToys(true);
404 gCheatMgr.m_bPlayerCheated = true;
405 return OSDCMD_OK;
406 }
407 return OSDCMD_SHOWHELP;
408 }
409
osdcmd_god(osdcmdptr_t UNUSED (parm))410 static int osdcmd_god(osdcmdptr_t UNUSED(parm))
411 {
412 UNREFERENCED_CONST_PARAMETER(parm);
413 if (numplayers == 1 && gGameStarted)
414 {
415 SetGodMode(!gMe->godMode);
416 gCheatMgr.m_bPlayerCheated = true;
417 }
418 else
419 OSD_Printf("god: Not in a single-player game.\n");
420
421 return OSDCMD_OK;
422 }
423
osdcmd_noclip(osdcmdptr_t UNUSED (parm))424 static int osdcmd_noclip(osdcmdptr_t UNUSED(parm))
425 {
426 UNREFERENCED_CONST_PARAMETER(parm);
427
428 if (numplayers == 1 && gGameStarted)
429 {
430 SetClipMode(!gNoClip);
431 gCheatMgr.m_bPlayerCheated = true;
432 }
433 else
434 {
435 OSD_Printf("noclip: Not in a single-player game.\n");
436 }
437
438 return OSDCMD_OK;
439 }
440
osdcmd_restartsound(osdcmdptr_t UNUSED (parm))441 static int osdcmd_restartsound(osdcmdptr_t UNUSED(parm))
442 {
443 UNREFERENCED_CONST_PARAMETER(parm);
444 sfxTerm();
445 sndTerm();
446
447 sndInit();
448 sfxInit();
449
450 if (MusicToggle && (gGameStarted || gDemo.at1))
451 sndPlaySong(gGameOptions.zLevelSong, true);
452
453 return OSDCMD_OK;
454 }
455
onvideomodechange(int32_t newmode)456 void onvideomodechange(int32_t newmode)
457 {
458 #if 0
459 uint8_t palid;
460
461 // XXX?
462 if (!newmode || g_player[screenpeek].ps->palette < BASEPALCOUNT)
463 palid = g_player[screenpeek].ps->palette;
464 else
465 palid = BASEPAL;
466
467 #ifdef POLYMER
468 if (videoGetRenderMode() == REND_POLYMER)
469 {
470 int32_t i = 0;
471
472 while (i < MAXSPRITES)
473 {
474 if (actor[i].lightptr)
475 {
476 polymer_deletelight(actor[i].lightId);
477 actor[i].lightptr = NULL;
478 actor[i].lightId = -1;
479 }
480 i++;
481 }
482 }
483 #endif
484
485 videoSetPalette(ud.brightness>>2, palid, 0);
486 g_restorePalette = -1;
487 #endif
488
489 #ifdef POLYMER
490 if (videoGetRenderMode() == REND_POLYMER)
491 {
492 int32_t i = 0;
493
494 while (i < MAXSPRITES)
495 {
496 if (gPolymerLight[i].lightptr)
497 {
498 polymer_deletelight(gPolymerLight[i].lightId);
499 gPolymerLight[i].lightptr = NULL;
500 gPolymerLight[i].lightId = -1;
501 }
502 i++;
503 }
504 }
505 #endif
506 if (newmode)
507 scrResetPalette();
508 UpdateDacs(gLastPal, false);
509 }
510
osdcmd_button(osdcmdptr_t parm)511 static int osdcmd_button(osdcmdptr_t parm)
512 {
513 static char const s_gamefunc_[] = "gamefunc_";
514 int constexpr strlen_gamefunc_ = ARRAY_SIZE(s_gamefunc_) - 1;
515
516 char const *p = parm->name + strlen_gamefunc_;
517
518 // if (g_player[myconnectindex].ps->gm == MODE_GAME) // only trigger these if in game
519 if (gInputMode == INPUT_MODE_0)
520 CONTROL_ButtonFlags[CONFIG_FunctionNameToNum(p)] = 1; // FIXME
521
522 return OSDCMD_OK;
523 }
524
525 const char *const ConsoleButtons[] =
526 {
527 "mouse1", "mouse2", "mouse3", "mouse4", "mwheelup",
528 "mwheeldn", "mouse5", "mouse6", "mouse7", "mouse8"
529 };
530
osdcmd_bind(osdcmdptr_t parm)531 static int osdcmd_bind(osdcmdptr_t parm)
532 {
533 char buffer[256];
534 if (parm->numparms==1 && !Bstrcasecmp(parm->parms[0],"showkeys"))
535 {
536 for (auto & s : sctokeylut)
537 OSD_Printf("%s\n", s.key);
538 for (auto ConsoleButton : ConsoleButtons)
539 OSD_Printf("%s\n",ConsoleButton);
540 return OSDCMD_OK;
541 }
542
543 if (parm->numparms==0)
544 {
545 int j=0;
546
547 OSD_Printf("Current key bindings:\n");
548
549 for (int i=0; i<MAXBOUNDKEYS+MAXMOUSEBUTTONS; i++)
550 if (CONTROL_KeyIsBound(i))
551 {
552 j++;
553 OSD_Printf("%-9s %s\"%s\"\n", CONTROL_KeyBinds[i].key, CONTROL_KeyBinds[i].repeat?"":"norepeat ",
554 CONTROL_KeyBinds[i].cmdstr);
555 }
556
557 if (j == 0)
558 OSD_Printf("No binds found.\n");
559
560 return OSDCMD_OK;
561 }
562
563 int i, j, repeat;
564
565 for (i=0; i < ARRAY_SSIZE(sctokeylut); i++)
566 {
567 if (!Bstrcasecmp(parm->parms[0], sctokeylut[i].key))
568 break;
569 }
570
571 // didn't find the key
572 if (i == ARRAY_SSIZE(sctokeylut))
573 {
574 for (i=0; i<MAXMOUSEBUTTONS; i++)
575 if (!Bstrcasecmp(parm->parms[0],ConsoleButtons[i]))
576 break;
577
578 if (i >= MAXMOUSEBUTTONS)
579 return OSDCMD_SHOWHELP;
580
581 if (parm->numparms < 2)
582 {
583 if (CONTROL_KeyBinds[MAXBOUNDKEYS + i].cmdstr && CONTROL_KeyBinds[MAXBOUNDKEYS + i ].key)
584 OSD_Printf("%-9s %s\"%s\"\n", ConsoleButtons[i], CONTROL_KeyBinds[MAXBOUNDKEYS + i].repeat?"":"norepeat ",
585 CONTROL_KeyBinds[MAXBOUNDKEYS + i].cmdstr);
586 else OSD_Printf("%s is unbound\n", ConsoleButtons[i]);
587 return OSDCMD_OK;
588 }
589
590 j = 1;
591
592 repeat = 1;
593 if (!Bstrcasecmp(parm->parms[j],"norepeat"))
594 {
595 repeat = 0;
596 j++;
597 }
598
599 Bstrcpy(buffer,parm->parms[j++]);
600 for (; j<parm->numparms; j++)
601 {
602 Bstrcat(buffer," ");
603 Bstrcat(buffer,parm->parms[j++]);
604 }
605
606 CONTROL_BindMouse(i, buffer, repeat, ConsoleButtons[i]);
607
608 if (!OSD_ParsingScript())
609 OSD_Printf("%s\n",parm->raw);
610 return OSDCMD_OK;
611 }
612
613 if (parm->numparms < 2)
614 {
615 if (CONTROL_KeyIsBound(sctokeylut[i].sc))
616 OSD_Printf("%-9s %s\"%s\"\n", sctokeylut[i].key, CONTROL_KeyBinds[sctokeylut[i].sc].repeat?"":"norepeat ",
617 CONTROL_KeyBinds[sctokeylut[i].sc].cmdstr);
618 else OSD_Printf("%s is unbound\n", sctokeylut[i].key);
619
620 return OSDCMD_OK;
621 }
622
623 j = 1;
624
625 repeat = 1;
626 if (!Bstrcasecmp(parm->parms[j],"norepeat"))
627 {
628 repeat = 0;
629 j++;
630 }
631
632 Bstrcpy(buffer,parm->parms[j++]);
633 for (; j<parm->numparms; j++)
634 {
635 Bstrcat(buffer," ");
636 Bstrcat(buffer,parm->parms[j++]);
637 }
638
639 CONTROL_BindKey(sctokeylut[i].sc, buffer, repeat, sctokeylut[i].key);
640
641 char *cp = buffer;
642
643 // Populate the keyboard config menu based on the bind.
644 // Take care of processing one-to-many bindings properly, too.
645 static char const s_gamefunc_[] = "gamefunc_";
646 int constexpr strlen_gamefunc_ = ARRAY_SIZE(s_gamefunc_) - 1;
647
648 while ((cp = Bstrstr(cp, s_gamefunc_)))
649 {
650 cp += strlen_gamefunc_;
651
652 char *semi = Bstrchr(cp, ';');
653
654 if (semi)
655 *semi = 0;
656
657 j = CONFIG_FunctionNameToNum(cp);
658
659 if (semi)
660 cp = semi+1;
661
662 if (j != -1)
663 {
664 KeyboardKeys[j][1] = KeyboardKeys[j][0];
665 KeyboardKeys[j][0] = sctokeylut[i].sc;
666 // CONTROL_MapKey(j, sctokeylut[i].sc, ud.config.KeyboardKeys[j][0]);
667
668 if (j == gamefunc_Show_Console)
669 OSD_CaptureKey(sctokeylut[i].sc);
670 }
671 }
672
673 if (!OSD_ParsingScript())
674 OSD_Printf("%s\n",parm->raw);
675
676 return OSDCMD_OK;
677 }
678
osdcmd_unbindall(osdcmdptr_t UNUSED (parm))679 static int osdcmd_unbindall(osdcmdptr_t UNUSED(parm))
680 {
681 UNREFERENCED_CONST_PARAMETER(parm);
682
683 for (int i = 0; i < MAXBOUNDKEYS; ++i)
684 CONTROL_FreeKeyBind(i);
685
686 for (int i = 0; i < MAXMOUSEBUTTONS; ++i)
687 CONTROL_FreeMouseBind(i);
688
689 for (auto &KeyboardKey : KeyboardKeys)
690 KeyboardKey[0] = KeyboardKey[1] = 0xff;
691
692 if (!OSD_ParsingScript())
693 OSD_Printf("unbound all controls\n");
694
695 return OSDCMD_OK;
696 }
697
osdcmd_unbind(osdcmdptr_t parm)698 static int osdcmd_unbind(osdcmdptr_t parm)
699 {
700 if (parm->numparms != 1)
701 return OSDCMD_SHOWHELP;
702
703 for (auto ConsoleKey : sctokeylut)
704 {
705 if (ConsoleKey.key && !Bstrcasecmp(parm->parms[0], ConsoleKey.key))
706 {
707 CONTROL_FreeKeyBind(ConsoleKey.sc);
708 OSD_Printf("unbound key %s\n", ConsoleKey.key);
709 return OSDCMD_OK;
710 }
711 }
712
713 for (int i = 0; i < MAXMOUSEBUTTONS; i++)
714 {
715 if (!Bstrcasecmp(parm->parms[0], ConsoleButtons[i]))
716 {
717 CONTROL_FreeMouseBind(i);
718 OSD_Printf("unbound %s\n", ConsoleButtons[i]);
719 return OSDCMD_OK;
720 }
721 }
722
723 return OSDCMD_SHOWHELP;
724 }
725
osdcmd_unbound(osdcmdptr_t parm)726 static int osdcmd_unbound(osdcmdptr_t parm)
727 {
728 if (parm->numparms != 1)
729 return OSDCMD_OK;
730
731 int const gameFunc = CONFIG_FunctionNameToNum(parm->parms[0]);
732
733 if (gameFunc != -1)
734 KeyboardKeys[gameFunc][0] = 0;
735
736 return OSDCMD_OK;
737 }
738
osdcmd_quicksave(osdcmdptr_t UNUSED (parm))739 static int osdcmd_quicksave(osdcmdptr_t UNUSED(parm))
740 {
741 UNREFERENCED_CONST_PARAMETER(parm);
742 if (!gGameStarted || gDemo.at1 || gGameMenuMgr.m_bActive)
743 OSD_Printf("quicksave: not in a game.\n");
744 else gDoQuickSave = 1;
745 return OSDCMD_OK;
746 }
747
osdcmd_quickload(osdcmdptr_t UNUSED (parm))748 static int osdcmd_quickload(osdcmdptr_t UNUSED(parm))
749 {
750 UNREFERENCED_CONST_PARAMETER(parm);
751 if (!gGameStarted || gDemo.at1 || gGameMenuMgr.m_bActive)
752 OSD_Printf("quickload: not in a game.\n");
753 else gDoQuickSave = 2;
754 return OSDCMD_OK;
755 }
756
osdcmd_screenshot(osdcmdptr_t parm)757 static int osdcmd_screenshot(osdcmdptr_t parm)
758 {
759 static const char *fn = "blud0000.png";
760
761 if (parm->numparms == 1 && !Bstrcasecmp(parm->parms[0], "tga"))
762 videoCaptureScreenTGA(fn, 0);
763 else videoCaptureScreen(fn, 0);
764
765 return OSDCMD_OK;
766 }
767
768 #if 0
769 static int osdcmd_savestate(osdcmdptr_t UNUSED(parm))
770 {
771 UNREFERENCED_PARAMETER(parm);
772 G_SaveMapState();
773 return OSDCMD_OK;
774 }
775
776 static int osdcmd_restorestate(osdcmdptr_t UNUSED(parm))
777 {
778 UNREFERENCED_PARAMETER(parm);
779 G_RestoreMapState();
780 return OSDCMD_OK;
781 }
782 #endif
783
784 #if 0
785 #ifdef DEBUGGINGAIDS
786 static int osdcmd_inittimer(osdcmdptr_t parm)
787 {
788 if (parm->numparms != 1)
789 {
790 OSD_Printf("%dHz timer\n",g_timerTicsPerSecond);
791 return OSDCMD_SHOWHELP;
792 }
793
794 G_InitTimer(Batol(parm->parms[0]));
795
796 OSD_Printf("%s\n",parm->raw);
797 return OSDCMD_OK;
798 }
799 #endif
800 #endif
801
osdcmd_cvar_set_game(osdcmdptr_t parm)802 static int osdcmd_cvar_set_game(osdcmdptr_t parm)
803 {
804 int const r = osdcmd_cvar_set(parm);
805
806 if (r != OSDCMD_OK) return r;
807
808 if (!Bstrcasecmp(parm->name, "r_upscalefactor"))
809 {
810 if (in3dmode())
811 {
812 videoSetGameMode(fullscreen, xres, yres, bpp, gUpscaleFactor);
813 viewResizeView(gViewSize);
814 }
815 }
816 else if (!Bstrcasecmp(parm->name, "r_size"))
817 {
818 //ud.statusbarmode = (ud.screen_size < 8);
819 viewResizeView(gViewSize);
820 }
821 else if (!Bstrcasecmp(parm->name, "r_maxfps") || !Bstrcasecmp(parm->name, "r_maxfpsoffset"))
822 {
823 if (r_maxfps != 0) r_maxfps = clamp(r_maxfps, 30, 1000);
824 g_frameDelay = calcFrameDelay(r_maxfps + r_maxfpsoffset);
825 }
826 else if (!Bstrcasecmp(parm->name, "r_ambientlight"))
827 {
828 if (r_ambientlight == 0)
829 r_ambientlightrecip = 256.f;
830 else r_ambientlightrecip = 1.f/r_ambientlight;
831 }
832 else if (!Bstrcasecmp(parm->name, "in_mouse"))
833 {
834 CONTROL_MouseEnabled = (gSetup.usemouse && CONTROL_MousePresent);
835 }
836 else if (!Bstrcasecmp(parm->name, "in_joystick"))
837 {
838 CONTROL_JoystickEnabled = (gSetup.usejoystick && CONTROL_JoyPresent);
839 }
840 else if (!Bstrcasecmp(parm->name, "vid_gamma"))
841 {
842 gBrightness = GAMMA_CALC;
843 gBrightness <<= 2;
844 videoSetPalette(gBrightness>>2,gLastPal,0);
845 }
846 else if (!Bstrcasecmp(parm->name, "vid_brightness") || !Bstrcasecmp(parm->name, "vid_contrast"))
847 {
848 videoSetPalette(gBrightness>>2,gLastPal,0);
849 }
850 #if 0
851 else if (!Bstrcasecmp(parm->name, "hud_scale")
852 || !Bstrcasecmp(parm->name, "hud_statusbarmode")
853 || !Bstrcasecmp(parm->name, "r_rotatespritenowidescreen"))
854 {
855 G_UpdateScreenArea();
856 }
857 else if (!Bstrcasecmp(parm->name, "skill"))
858 {
859 if (numplayers > 1)
860 return r;
861
862 ud.player_skill = ud.m_player_skill;
863 }
864 else if (!Bstrcasecmp(parm->name, "color"))
865 {
866 ud.color = G_CheckPlayerColor(ud.color);
867 g_player[0].ps->palookup = g_player[0].pcolor = ud.color;
868 }
869 else if (!Bstrcasecmp(parm->name, "osdscale"))
870 {
871 osdrscale = 1.f/osdscale;
872
873 if (xdim && ydim)
874 OSD_ResizeDisplay(xdim, ydim);
875 }
876 else if (!Bstrcasecmp(parm->name, "wchoice"))
877 {
878 if (parm->numparms == 1)
879 {
880 if (g_forceWeaponChoice) // rewrite ud.wchoice because osdcmd_cvar_set already changed it
881 {
882 int j = 0;
883
884 while (j < 10)
885 {
886 ud.wchoice[j] = g_player[myconnectindex].wchoice[j] + '0';
887 j++;
888 }
889
890 ud.wchoice[j] = 0;
891 }
892 else
893 {
894 char const *c = parm->parms[0];
895
896 if (*c)
897 {
898 int j = 0;
899
900 while (*c && j < 10)
901 {
902 g_player[myconnectindex].wchoice[j] = *c - '0';
903 c++;
904 j++;
905 }
906
907 while (j < 10)
908 {
909 if (j == 9)
910 g_player[myconnectindex].wchoice[9] = 1;
911 else
912 g_player[myconnectindex].wchoice[j] = 2;
913
914 j++;
915 }
916 }
917 }
918
919 g_forceWeaponChoice = 0;
920 }
921
922 /* Net_SendClientInfo();*/
923 }
924 #endif
925
926 return r;
927 }
928
osdcmd_cvar_set_multi(osdcmdptr_t parm)929 static int osdcmd_cvar_set_multi(osdcmdptr_t parm)
930 {
931 int const r = osdcmd_cvar_set_game(parm);
932
933 if (r != OSDCMD_OK) return r;
934
935 //G_UpdatePlayerFromMenu();
936
937 return r;
938 }
939
registerosdcommands(void)940 int32_t registerosdcommands(void)
941 {
942 FX_InitCvars();
943
944 char buffer[256];
945 static osdcvardata_t cvars_game[] =
946 {
947 { "crosshair", "enable/disable crosshair", (void *)&gAimReticle, CVAR_BOOL, 0, 1 },
948
949 { "cl_autoaim", "enable/disable weapon autoaim", (void *)&gAutoAim, CVAR_INT|CVAR_MULTI, 0, 2 },
950 // { "cl_automsg", "enable/disable automatically sending messages to all players", (void *)&ud.automsg, CVAR_BOOL, 0, 1 },
951 { "cl_autorun", "enable/disable autorun", (void *)&gAutoRun, CVAR_BOOL, 0, 1 },
952 //
953 // { "cl_autosave", "enable/disable autosaves", (void *) &ud.autosave, CVAR_BOOL, 0, 1 },
954 // { "cl_autosavedeletion", "enable/disable automatic deletion of autosaves", (void *) &ud.autosavedeletion, CVAR_BOOL, 0, 1 },
955 // { "cl_maxautosaves", "number of autosaves to keep before deleting the oldest", (void *) &ud.maxautosaves, CVAR_INT, 1, 100 },
956 //
957 // { "cl_autovote", "enable/disable automatic voting", (void *)&ud.autovote, CVAR_INT, 0, 2 },
958 //
959 // { "cl_cheatmask", "configure what cheats show in the cheats menu", (void *)&cl_cheatmask, CVAR_UINT, 0, ~0 },
960 //
961 // { "cl_obituaries", "enable/disable multiplayer death messages", (void *)&ud.obituaries, CVAR_BOOL, 0, 1 },
962 // { "cl_democams", "enable/disable demo playback cameras", (void *)&ud.democams, CVAR_BOOL, 0, 1 },
963 //
964 // { "cl_idplayers", "enable/disable name display when aiming at opponents", (void *)&ud.idplayers, CVAR_BOOL, 0, 1 },
965 //
966
967 { "cl_interpolate", "enable/disable view interpolation", (void *)&gViewInterpolate, CVAR_BOOL, 0, 1 },
968 { "cl_viewhbob", "enable/disable view horizontal bobbing", (void *)&gViewHBobbing, CVAR_BOOL, 0, 1 },
969 { "cl_viewvbob", "enable/disable view vertical bobbing", (void *)&gViewVBobbing, CVAR_BOOL, 0, 1 },
970 { "cl_slopetilting", "enable/disable slope tilting", (void *)&gSlopeTilting, CVAR_BOOL, 0, 1 },
971 { "cl_showplayernames", "enable/disable showing player names in multiplayer when looking at other players", (void *)&gShowPlayerNames, CVAR_BOOL, 0, 1 },
972 { "cl_showweapon", "enable/disable show weapons (0: disable, 1: sprite, 2: voxel)", (void *)&gShowWeapon, CVAR_INT, 0, 2 },
973
974 { "cl_runmode", "enable/disable modernized run key operation", (void *)&gRunKeyMode, CVAR_BOOL, 0, 1 },
975 //
976 // { "cl_showcoords", "show your position in the game world", (void *)&ud.coords, CVAR_INT, 0,
977 //#ifdef USE_OPENGL
978 // 2
979 //#else
980 // 1
981 //#endif
982 // },
983 //
984 // { "cl_viewbob", "enable/disable player head bobbing", (void *)&ud.viewbob, CVAR_BOOL, 0, 1 },
985 //
986 // { "cl_weaponsway", "enable/disable player weapon swaying", (void *)&ud.weaponsway, CVAR_BOOL, 0, 1 },
987 { "cl_weaponswitch", "enable/disable auto weapon switching", (void *)&gWeaponSwitch, CVAR_INT|CVAR_MULTI, 0, 3 },
988 //
989 // { "color", "changes player palette", (void *)&ud.color, CVAR_INT|CVAR_MULTI, 0, MAXPALOOKUPS-1 },
990 //
991 // { "crosshairscale","changes the size of the crosshair", (void *)&ud.crosshairscale, CVAR_INT, 10, 100 },
992 //
993 // { "demorec_diffs","enable/disable diff recording in demos",(void *)&demorec_diffs_cvar, CVAR_BOOL, 0, 1 },
994 // { "demorec_force","enable/disable forced demo recording",(void *)&demorec_force_cvar, CVAR_BOOL|CVAR_NOSAVE, 0, 1 },
995 // {
996 // "demorec_difftics","sets game tic interval after which a diff is recorded",
997 // (void *)&demorec_difftics_cvar, CVAR_INT, 2, 60*REALGAMETICSPERSEC
998 // },
999 // { "demorec_diffcompress","Compression method for diffs. (0: none, 1: KSLZW)",(void *)&demorec_diffcompress_cvar, CVAR_INT, 0, 1 },
1000 // { "demorec_synccompress","Compression method for input. (0: none, 1: KSLZW)",(void *)&demorec_synccompress_cvar, CVAR_INT, 0, 1 },
1001 // { "demorec_seeds","enable/disable recording of random seed for later sync checking",(void *)&demorec_seeds_cvar, CVAR_BOOL, 0, 1 },
1002 // { "demoplay_diffs","enable/disable application of diffs in demo playback",(void *)&demoplay_diffs, CVAR_BOOL, 0, 1 },
1003 // { "demoplay_showsync","enable/disable display of sync status",(void *)&demoplay_showsync, CVAR_BOOL, 0, 1 },
1004 //
1005 // { "hud_althud", "enable/disable alternate mini-hud", (void *)&ud.althud, CVAR_BOOL, 0, 1 },
1006 // { "hud_custom", "change the custom hud", (void *)&ud.statusbarcustom, CVAR_INT, 0, ud.statusbarrange },
1007 // { "hud_position", "aligns the status bar to the bottom/top", (void *)&ud.hudontop, CVAR_BOOL, 0, 1 },
1008 // { "hud_bgstretch", "enable/disable background image stretching in wide resolutions", (void *)&ud.bgstretch, CVAR_BOOL, 0, 1 },
1009 { "hud_messages", "enable/disable showing messages", (void *)&gMessageState, CVAR_BOOL, 0, 1 },
1010 // { "hud_messagetime", "length of time to display multiplayer chat messages", (void *)&ud.msgdisptime, CVAR_INT, 0, 3600 },
1011 // { "hud_numbertile", "first tile in alt hud number set", (void *)&althud_numbertile, CVAR_INT, 0, MAXUSERTILES-10 },
1012 // { "hud_numberpal", "pal for alt hud numbers", (void *)&althud_numberpal, CVAR_INT, 0, MAXPALOOKUPS-1 },
1013 // { "hud_shadows", "enable/disable althud shadows", (void *)&althud_shadows, CVAR_BOOL, 0, 1 },
1014 // { "hud_flashing", "enable/disable althud flashing", (void *)&althud_flashing, CVAR_BOOL, 0, 1 },
1015 // { "hud_glowingquotes", "enable/disable \"glowing\" quote text", (void *)&hud_glowingquotes, CVAR_BOOL, 0, 1 },
1016 // { "hud_scale","changes the hud scale", (void *)&ud.statusbarscale, CVAR_INT|CVAR_FUNCPTR, 36, 100 },
1017 // { "hud_showmapname", "enable/disable map name display on load", (void *)&hud_showmapname, CVAR_BOOL, 0, 1 },
1018 { "hud_stats", "enable/disable level statistics display", (void *)&gLevelStats, CVAR_BOOL, 0, 1 },
1019 { "hud_powerupduration", "enable/disable displaying the remaining seconds for power-ups", (void *)&gPowerupDuration, CVAR_BOOL, 0, 1 },
1020 { "hud_showmaptitle", "enable/disable displaying the map title at the beginning of the maps", (void*)& gShowMapTitle, CVAR_BOOL, 0, 1 },
1021 // { "hud_textscale", "sets multiplayer chat message size", (void *)&ud.textscale, CVAR_INT, 100, 400 },
1022 // { "hud_weaponscale","changes the weapon scale", (void *)&ud.weaponscale, CVAR_INT, 10, 100 },
1023 // { "hud_statusbarmode", "change overlay mode of status bar", (void *)&ud.statusbarmode, CVAR_BOOL|CVAR_FUNCPTR, 0, 1 },
1024 //
1025 //#ifdef EDUKE32_TOUCH_DEVICES
1026 // { "hud_hidestick", "hide the touch input stick", (void *)&droidinput.hideStick, CVAR_BOOL, 0, 1 },
1027 //#endif
1028 //
1029 { "horizcenter", "enable/disable centered horizon line", (void *)&gCenterHoriz, CVAR_BOOL, 0, 1 },
1030 { "deliriumblur", "enable/disable delirium blur effect(polymost)", (void *)&gDeliriumBlur, CVAR_BOOL, 0, 1 },
1031 { "fov", "change the field of view", (void *)&gFov, CVAR_INT|CVAR_FUNCPTR, 75, 120 },
1032 { "in_joystick","enables input from the joystick if it is present",(void *)&gSetup.usejoystick, CVAR_BOOL|CVAR_FUNCPTR, 0, 1 },
1033 { "in_mouse","enables input from the mouse if it is present",(void *)&gSetup.usemouse, CVAR_BOOL|CVAR_FUNCPTR, 0, 1 },
1034
1035 { "in_aimmode", "0:toggle, 1:hold to aim", (void *)&gMouseAiming, CVAR_BOOL, 0, 1 },
1036 {
1037 "in_mousebias", "emulates the original mouse code's weighting of input towards whichever axis is moving the most at any given time",
1038 (void *)&MouseBias, CVAR_INT, 0, 32
1039 },
1040 { "in_mousedeadzone", "amount of mouse movement to filter out", (void *)&MouseDeadZone, CVAR_INT, 0, 512 },
1041 { "in_mouseflip", "invert vertical mouse movement", (void *)&gMouseAimingFlipped, CVAR_BOOL, 0, 1 },
1042 { "in_mousemode", "toggles vertical mouse view", (void *)&gMouseAim, CVAR_BOOL, 0, 1 },
1043
1044 { "in_mousexscale", "scale modifier for mouse x axis", (void *)&CONTROL_MouseAxesScale[0], CVAR_INT, 1, 65536 },
1045 { "in_mouseyscale", "scale modifier for mouse y axis", (void *)&CONTROL_MouseAxesScale[1], CVAR_INT, 1, 65536 },
1046 //
1047 { "mus_enabled", "enables/disables music", (void *)&MusicToggle, CVAR_BOOL, 0, 1 },
1048 { "mus_restartonload", "restart the music when loading a saved game with the same map or not", (void *)&MusicRestartsOnLoadToggle, CVAR_BOOL, 0, 1 },
1049 { "mus_volume", "controls music volume", (void *)&MusicVolume, CVAR_INT, 0, 255 },
1050 { "mus_device", "music device", (void *)&MusicDevice, CVAR_INT, 0, ASS_NumSoundCards },
1051 { "mus_redbook", "enables/disables redbook audio", (void *)&CDAudioToggle, CVAR_BOOL, 0, 1 },
1052 //
1053 // { "osdhightile", "enable/disable hires art replacements for console text", (void *)&osdhightile, CVAR_BOOL, 0, 1 },
1054 // { "osdscale", "adjust console text size", (void *)&osdscale, CVAR_FLOAT|CVAR_FUNCPTR, 1, 4 },
1055 //
1056 // { "r_camrefreshdelay", "minimum delay between security camera sprite updates, 120 = 1 second", (void *)&ud.camera_time, CVAR_INT, 1, 240 },
1057 // { "r_drawweapon", "enable/disable weapon drawing", (void *)&ud.drawweapon, CVAR_INT, 0, 2 },
1058 { "r_showfps", "show the frame rate counter", (void *)&gShowFps, CVAR_INT, 0, 3 },
1059 { "r_showfpsperiod", "time in seconds before averaging min and max stats for r_showfps 2+", (void *)&gFramePeriod, CVAR_INT, 0, 5 },
1060 // { "r_shadows", "enable/disable sprite and model shadows", (void *)&ud.shadows, CVAR_BOOL, 0, 1 },
1061 { "r_size", "change size of viewable area", (void *)&gViewSize, CVAR_INT|CVAR_FUNCPTR, 0, 7 },
1062 // { "r_rotatespritenowidescreen", "pass bit 1024 to all CON rotatesprite calls", (void *)&g_rotatespriteNoWidescreen, CVAR_BOOL|CVAR_FUNCPTR, 0, 1 },
1063 { "r_upscalefactor", "increase performance by rendering at upscalefactor less than the screen resolution and upscale to the full resolution in the software renderer", (void *)&gUpscaleFactor, CVAR_INT|CVAR_FUNCPTR, 1, 16 },
1064 { "r_precache", "enable/disable the pre-level caching routine", (void *)&useprecache, CVAR_BOOL, 0, 1 },
1065 //
1066 { "r_ambientlight", "sets the global map light level",(void *)&r_ambientlight, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
1067 { "r_maxfps", "limit the frame rate",(void *)&r_maxfps, CVAR_INT|CVAR_FUNCPTR, 0, 1000 },
1068 { "r_maxfpsoffset", "menu-controlled offset for r_maxfps",(void *)&r_maxfpsoffset, CVAR_INT|CVAR_FUNCPTR, -10, 10 },
1069
1070 { "sensitivity","changes the mouse sensitivity", (void *)&CONTROL_MouseSensitivity, CVAR_FLOAT|CVAR_FUNCPTR, 0, 25 },
1071 //
1072 // { "skill","changes the game skill setting", (void *)&ud.m_player_skill, CVAR_INT|CVAR_FUNCPTR|CVAR_NOSAVE/*|CVAR_NOMULTI*/, 0, 5 },
1073 //
1074 // { "snd_ambience", "enables/disables ambient sounds", (void *)&ud.config.AmbienceToggle, CVAR_BOOL, 0, 1 },
1075 { "snd_enabled", "enables/disables sound effects", (void *)&SoundToggle, CVAR_BOOL, 0, 1 },
1076 { "snd_fxvolume", "controls volume for sound effects", (void *)&FXVolume, CVAR_INT, 0, 255 },
1077 { "snd_mixrate", "sound mixing rate", (void *)&MixRate, CVAR_INT, 0, 48000 },
1078 { "snd_numchannels", "the number of sound channels", (void *)&NumChannels, CVAR_INT, 0, 2 },
1079 { "snd_numvoices", "the number of concurrent sounds", (void *)&NumVoices, CVAR_INT, 1, 128 },
1080 #ifdef ASS_REVERSESTEREO
1081 { "snd_reversestereo", "reverses the stereo channels", (void *)&ReverseStereo, CVAR_BOOL, 0, 1 },
1082 #endif
1083 { "snd_doppler", "enable/disable 3d sound", (void *)&gDoppler, CVAR_BOOL, 0, 1 },
1084 // { "snd_speech", "enables/disables player speech", (void *)&ud.config.VoiceToggle, CVAR_INT, 0, 5 },
1085 //
1086 // { "team","change team in multiplayer", (void *)&ud.team, CVAR_INT|CVAR_MULTI, 0, 3 },
1087 //
1088 //#ifdef EDUKE32_TOUCH_DEVICES
1089 // { "touch_sens_move_x","touch input sensitivity for moving forward/back", (void *)&droidinput.forward_sens, CVAR_FLOAT, 1, 9 },
1090 // { "touch_sens_move_y","touch input sensitivity for strafing", (void *)&droidinput.strafe_sens, CVAR_FLOAT, 1, 9 },
1091 // { "touch_sens_look_x", "touch input sensitivity for turning left/right", (void *) &droidinput.yaw_sens, CVAR_FLOAT, 1, 9 },
1092 // { "touch_sens_look_y", "touch input sensitivity for looking up/down", (void *) &droidinput.pitch_sens, CVAR_FLOAT, 1, 9 },
1093 // { "touch_invert", "invert look up/down touch input", (void *) &droidinput.invertLook, CVAR_INT, 0, 1 },
1094 //#endif
1095 //
1096 { "vid_gamma","adjusts gamma component of gamma ramp",(void *)&g_videoGamma, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
1097 { "vid_contrast","adjusts contrast component of gamma ramp",(void *)&g_videoContrast, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
1098 { "vid_brightness","adjusts brightness component of gamma ramp",(void *)&g_videoBrightness, CVAR_FLOAT|CVAR_FUNCPTR, 0, 10 },
1099 // { "wchoice","sets weapon autoselection order", (void *)ud.wchoice, CVAR_STRING|CVAR_FUNCPTR, 0, MAX_WEAPONS },
1100 };
1101 //
1102 // osdcmd_cheatsinfo_stat.cheatnum = -1;
1103 //
1104 for (auto & cv : cvars_game)
1105 {
1106 switch (cv.flags & (CVAR_FUNCPTR|CVAR_MULTI))
1107 {
1108 case CVAR_FUNCPTR:
1109 OSD_RegisterCvar(&cv, osdcmd_cvar_set_game); break;
1110 case CVAR_MULTI:
1111 case CVAR_FUNCPTR|CVAR_MULTI:
1112 OSD_RegisterCvar(&cv, osdcmd_cvar_set_multi); break;
1113 default:
1114 OSD_RegisterCvar(&cv, osdcmd_cvar_set); break;
1115 }
1116 }
1117 //
1118 // if (VOLUMEONE)
1119 // OSD_RegisterFunction("changelevel","changelevel <level>: warps to the given level", osdcmd_changelevel);
1120 // else
1121 // {
1122 OSD_RegisterFunction("changelevel","changelevel <volume> <level>: warps to the given level", osdcmd_changelevel);
1123 OSD_RegisterFunction("map","map <mapfile>: loads the given user map", osdcmd_map);
1124 OSD_RegisterFunction("demo","demo <demofile or demonum>: starts the given demo", osdcmd_demo);
1125 // }
1126 //
1127 // OSD_RegisterFunction("addpath","addpath <path>: adds path to game filesystem", osdcmd_addpath);
1128 OSD_RegisterFunction("bind",R"(bind <key> <string>: associates a keypress with a string of console input. Type "bind showkeys" for a list of keys and "listsymbols" for a list of valid console commands.)", osdcmd_bind);
1129 // OSD_RegisterFunction("cmenu","cmenu <#>: jumps to menu", osdcmd_cmenu);
1130 OSD_RegisterFunction("crosshaircolor","crosshaircolor: changes the crosshair color", osdcmd_crosshaircolor);
1131 OSD_RegisterFunction("crosshairreset", "crosshairreset: restores the original crosshair", osdcmd_resetcrosshair);
1132 //
1133 //#if !defined NETCODE_DISABLE
1134 // OSD_RegisterFunction("connect","connect: connects to a multiplayer game", osdcmd_connect);
1135 // OSD_RegisterFunction("disconnect","disconnect: disconnects from the local multiplayer game", osdcmd_disconnect);
1136 //#endif
1137
1138 for (auto & func : gamefunctions)
1139 {
1140 if (func[0] == '\0')
1141 continue;
1142
1143 // if (!Bstrcmp(gamefunctions[i],"Show_Console")) continue;
1144
1145 Bsprintf(buffer, "gamefunc_%s", func);
1146
1147 char *const t = Bstrtolower(Xstrdup(buffer));
1148
1149 Bstrcat(buffer, ": game button");
1150
1151 OSD_RegisterFunction(t, Xstrdup(buffer), osdcmd_button);
1152 }
1153
1154 OSD_RegisterFunction("give","give <all|health|weapons|ammo|armor|keys|inventory>: gives requested item", osdcmd_give);
1155 OSD_RegisterFunction("god","god: toggles god mode", osdcmd_god);
1156 // OSD_RegisterFunction("activatecheat","activatecheat <id>: activates a cheat code", osdcmd_activatecheat);
1157 //
1158 // OSD_RegisterFunction("initgroupfile","initgroupfile <path>: adds a grp file into the game filesystem", osdcmd_initgroupfile);
1159 //#ifdef DEBUGGINGAIDS
1160 // OSD_RegisterFunction("inittimer","debug", osdcmd_inittimer);
1161 //#endif
1162 //#if !defined NETCODE_DISABLE
1163 // OSD_RegisterFunction("kick","kick <id>: kicks a multiplayer client. See listplayers.", osdcmd_kick);
1164 // OSD_RegisterFunction("kickban","kickban <id>: kicks a multiplayer client and prevents them from reconnecting. See listplayers.", osdcmd_kickban);
1165 //
1166 // OSD_RegisterFunction("listplayers","listplayers: lists currently connected multiplayer clients", osdcmd_listplayers);
1167 //#endif
1168 OSD_RegisterFunction("music","music E<ep>L<lev>: change music", osdcmd_music);
1169 //
1170 //#if !defined NETCODE_DISABLE
1171 // OSD_RegisterFunction("name","name: change your multiplayer nickname", osdcmd_name);
1172 //#endif
1173 //
1174 OSD_RegisterFunction("noclip","noclip: toggles clipping mode", osdcmd_noclip);
1175 //
1176 //#if !defined NETCODE_DISABLE
1177 // OSD_RegisterFunction("password","password: sets multiplayer game password", osdcmd_password);
1178 //#endif
1179 //
1180 // OSD_RegisterFunction("printtimes", "printtimes: prints VM timing statistics", osdcmd_printtimes);
1181 //
1182 // OSD_RegisterFunction("purgesaves", "purgesaves: deletes obsolete and unreadable save files", osdcmd_purgesaves);
1183 //
1184 OSD_RegisterFunction("quicksave","quicksave: performs a quick save", osdcmd_quicksave);
1185 OSD_RegisterFunction("quickload","quickload: performs a quick load", osdcmd_quickload);
1186 OSD_RegisterFunction("quit","quit: exits the game immediately", osdcmd_quit);
1187 OSD_RegisterFunction("exit","exit: exits the game immediately", osdcmd_quit);
1188 //
1189 // OSD_RegisterFunction("restartmap", "restartmap: restarts the current map", osdcmd_restartmap);
1190 OSD_RegisterFunction("restartsound","restartsound: reinitializes the sound system",osdcmd_restartsound);
1191 OSD_RegisterFunction("restartvid","restartvid: reinitializes the video mode",osdcmd_restartvid);
1192 //#if !defined LUNATIC
1193 // OSD_RegisterFunction("addlogvar","addlogvar <gamevar>: prints the value of a gamevar", osdcmd_addlogvar);
1194 // OSD_RegisterFunction("setvar","setvar <gamevar> <value>: sets the value of a gamevar", osdcmd_setvar);
1195 // OSD_RegisterFunction("setvarvar","setvarvar <gamevar1> <gamevar2>: sets the value of <gamevar1> to <gamevar2>", osdcmd_setvar);
1196 // OSD_RegisterFunction("setactorvar","setactorvar <actor#> <gamevar> <value>: sets the value of <actor#>'s <gamevar> to <value>", osdcmd_setactorvar);
1197 //#else
1198 // OSD_RegisterFunction("lua", "lua \"Lua code...\": runs Lunatic code", osdcmd_lua);
1199 //#endif
1200 OSD_RegisterFunction("screenshot","screenshot [format]: takes a screenshot.", osdcmd_screenshot);
1201 //
1202 // OSD_RegisterFunction("spawn","spawn <picnum> [palnum] [cstat] [ang] [x y z]: spawns a sprite with the given properties",osdcmd_spawn);
1203
1204 OSD_RegisterFunction("unbind","unbind <key>: unbinds a key", osdcmd_unbind);
1205 OSD_RegisterFunction("unbindall","unbindall: unbinds all keys", osdcmd_unbindall);
1206 OSD_RegisterFunction("unbound", NULL, osdcmd_unbound);
1207
1208 OSD_RegisterFunction("vidmode","vidmode <xdim> <ydim> <bpp> <fullscreen>: change the video mode",osdcmd_vidmode);
1209 #ifdef USE_OPENGL
1210 baselayer_osdcmd_vidmode_func = osdcmd_vidmode;
1211 #endif
1212 //
1213 //#ifndef NETCODE_DISABLE
1214 // OSD_RegisterFunction("dumpmapstates", "Dumps current snapshots to CL/Srv_MapStates.bin", osdcmd_dumpmapstate);
1215 // OSD_RegisterFunction("playerinfo", "Prints information about the current player", osdcmd_playerinfo);
1216 //#endif
1217
1218 return 0;
1219 }
1220
GAME_onshowosd(int shown)1221 void GAME_onshowosd(int shown)
1222 {
1223 // G_UpdateScreenArea();
1224
1225 mouseLockToWindow((!shown) + 2);
1226
1227 //osdshown = shown;
1228
1229 // XXX: it's weird to fake a keypress like this.
1230 // if (numplayers == 1 && ((shown && !ud.pause_on) || (!shown && ud.pause_on)))
1231 // KB_KeyDown[sc_Pause] = 1;
1232 }
1233
GAME_clearbackground(int numcols,int numrows)1234 void GAME_clearbackground(int numcols, int numrows)
1235 {
1236 COMMON_clearbackground(numcols, numrows);
1237 }
1238
1239