forked from len0rd/rockbox
This is a port of Wolf4SDL, which is derived from the original id software source release. The port runs on top of the SDL plugin runtime and is loaded as an overlay. Licensing of the game code is not an issue, as discussed below (essentially, the Debian project treats Wolf4SDL as GPLv2, with an email from John Carmack backing it up): http://forums.rockbox.org/index.php?topic=52872 Included is a copy of MAME's Yamaha OPL sound chip emulator (fmopl_gpl.c). This file was not part of the original Wolf4SDL source (which includes a non-GPL'd version), but was rather rebased from from a later MAME source which had been relicensed to GPLv2. Change-Id: I64c2ba035e0be7e2f49252f40640641416613439
4160 lines
97 KiB
C
4160 lines
97 KiB
C
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// WL_MENU.C
|
|
// by John Romero (C) 1992 Id Software, Inc.
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#include "wl_def.h"
|
|
#pragma hdrstop
|
|
|
|
extern int lastgamemusicoffset;
|
|
extern int numEpisodesMissing;
|
|
|
|
//
|
|
// PRIVATE PROTOTYPES
|
|
//
|
|
int CP_ReadThis (int);
|
|
|
|
#ifdef SPEAR
|
|
#define STARTITEM newgame
|
|
|
|
#else
|
|
#ifdef GOODTIMES
|
|
#define STARTITEM newgame
|
|
|
|
#else
|
|
#define STARTITEM readthis
|
|
#endif
|
|
#endif
|
|
|
|
// ENDSTRx constants are defined in foreign.h
|
|
char endStrings[9][80] = {
|
|
ENDSTR1,
|
|
ENDSTR2,
|
|
ENDSTR3,
|
|
ENDSTR4,
|
|
ENDSTR5,
|
|
ENDSTR6,
|
|
ENDSTR7,
|
|
ENDSTR8,
|
|
ENDSTR9
|
|
};
|
|
|
|
CP_itemtype MainMenu[] = {
|
|
#ifdef JAPAN
|
|
{1, "", CP_NewGame},
|
|
{1, "", CP_Sound},
|
|
{1, "", CP_Control},
|
|
{1, "", CP_LoadGame},
|
|
{0, "", CP_SaveGame},
|
|
{1, "", CP_ChangeView},
|
|
{2, "", CP_ReadThis},
|
|
{1, "", CP_ViewScores},
|
|
{1, "", 0},
|
|
{1, "", 0}
|
|
#else
|
|
|
|
{1, STR_NG, CP_NewGame},
|
|
{1, STR_SD, CP_Sound},
|
|
{1, STR_CL, CP_Control},
|
|
{1, STR_LG, CP_LoadGame},
|
|
{0, STR_SG, CP_SaveGame},
|
|
{1, STR_CV, CP_ChangeView},
|
|
|
|
#ifndef GOODTIMES
|
|
#ifndef SPEAR
|
|
|
|
#ifdef SPANISH
|
|
{2, "Ve esto!", CP_ReadThis},
|
|
#else
|
|
{2, "Read This!", CP_ReadThis},
|
|
#endif
|
|
|
|
#endif
|
|
#endif
|
|
|
|
{1, STR_VS, CP_ViewScores},
|
|
{1, STR_BD, 0},
|
|
{1, STR_QT, 0}
|
|
#endif
|
|
};
|
|
|
|
CP_itemtype SndMenu[] = {
|
|
#ifdef JAPAN
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
#else
|
|
{1, STR_NONE, 0},
|
|
{0, STR_PC, 0},
|
|
{1, STR_ALSB, 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, STR_NONE, 0},
|
|
{0, STR_DISNEY, 0},
|
|
{1, STR_SB, 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, STR_NONE, 0},
|
|
{1, STR_ALSB, 0}
|
|
#endif
|
|
};
|
|
|
|
enum { CTL_MOUSEENABLE, CTL_MOUSESENS, CTL_JOYENABLE, CTL_CUSTOMIZE };
|
|
|
|
CP_itemtype CtlMenu[] = {
|
|
#ifdef JAPAN
|
|
{0, "", 0},
|
|
{0, "", MouseSensitivity},
|
|
{0, "", 0},
|
|
{1, "", CustomControls}
|
|
#else
|
|
{0, STR_MOUSEEN, 0},
|
|
{0, STR_SENS, MouseSensitivity},
|
|
{0, STR_JOYEN, 0},
|
|
{1, STR_CUSTOM, CustomControls}
|
|
#endif
|
|
};
|
|
|
|
#ifndef SPEAR
|
|
CP_itemtype NewEmenu[] = {
|
|
#ifdef JAPAN
|
|
#ifdef JAPDEMO
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
#else
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0}
|
|
#endif
|
|
#else
|
|
#ifdef SPANISH
|
|
{1, "Episodio 1\n" "Fuga desde Wolfenstein", 0},
|
|
{0, "", 0},
|
|
{3, "Episodio 2\n" "Operacion Eisenfaust", 0},
|
|
{0, "", 0},
|
|
{3, "Episodio 3\n" "Muere, Fuhrer, Muere!", 0},
|
|
{0, "", 0},
|
|
{3, "Episodio 4\n" "Un Negro Secreto", 0},
|
|
{0, "", 0},
|
|
{3, "Episodio 5\n" "Huellas del Loco", 0},
|
|
{0, "", 0},
|
|
{3, "Episodio 6\n" "Confrontacion", 0}
|
|
#else
|
|
{1, "Episode 1\n" "Escape from Wolfenstein", 0},
|
|
{0, "", 0},
|
|
{3, "Episode 2\n" "Operation: Eisenfaust", 0},
|
|
{0, "", 0},
|
|
{3, "Episode 3\n" "Die, Fuhrer, Die!", 0},
|
|
{0, "", 0},
|
|
{3, "Episode 4\n" "A Dark Secret", 0},
|
|
{0, "", 0},
|
|
{3, "Episode 5\n" "Trail of the Madman", 0},
|
|
{0, "", 0},
|
|
{3, "Episode 6\n" "Confrontation", 0}
|
|
#endif
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
|
|
CP_itemtype NewMenu[] = {
|
|
#ifdef JAPAN
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0}
|
|
#else
|
|
{1, STR_DADDY, 0},
|
|
{1, STR_HURTME, 0},
|
|
{1, STR_BRINGEM, 0},
|
|
{1, STR_DEATH, 0}
|
|
#endif
|
|
};
|
|
|
|
CP_itemtype LSMenu[] = {
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0},
|
|
{1, "", 0}
|
|
};
|
|
|
|
CP_itemtype CusMenu[] = {
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0},
|
|
{0, "", 0},
|
|
{1, "", 0}
|
|
};
|
|
|
|
// CP_iteminfo struct format: short x, y, amount, curpos, indent;
|
|
CP_iteminfo MainItems = { MENU_X, MENU_Y, lengthof(MainMenu), STARTITEM, 24 },
|
|
SndItems = { SM_X, SM_Y1, lengthof(SndMenu), 0, 52 },
|
|
LSItems = { LSM_X, LSM_Y, lengthof(LSMenu), 0, 24 },
|
|
CtlItems = { CTL_X, CTL_Y, lengthof(CtlMenu), -1, 56 },
|
|
CusItems = { 8, CST_Y + 13 * 2, lengthof(CusMenu), -1, 0},
|
|
#ifndef SPEAR
|
|
NewEitems = { NE_X, NE_Y, lengthof(NewEmenu), 0, 88 },
|
|
#endif
|
|
NewItems = { NM_X, NM_Y, lengthof(NewMenu), 2, 24 };
|
|
|
|
int color_hlite[] = {
|
|
DEACTIVE,
|
|
HIGHLIGHT,
|
|
READHCOLOR,
|
|
0x67
|
|
};
|
|
|
|
int color_norml[] = {
|
|
DEACTIVE,
|
|
TEXTCOLOR,
|
|
READCOLOR,
|
|
0x6b
|
|
};
|
|
|
|
int EpisodeSelect[6] = { 1 };
|
|
|
|
|
|
static int SaveGamesAvail[10];
|
|
static int StartGame;
|
|
static int SoundStatus = 1;
|
|
static int pickquick;
|
|
static char SaveGameNames[10][32];
|
|
static char SaveName[13] = "savegam?.";
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// INPUT MANAGER SCANCODE TABLES
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#if 0
|
|
static const char *ScanNames[] = // Scan code names with single chars
|
|
{
|
|
"?", "?", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "+", "?", "?",
|
|
"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]", "|", "?", "A", "S",
|
|
"D", "F", "G", "H", "J", "K", "L", ";", "\"", "?", "?", "?", "Z", "X", "C", "V",
|
|
"B", "N", "M", ",", ".", "/", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
|
|
"?", "?", "?", "?", "?", "?", "?", "?", "\xf", "?", "-", "\x15", "5", "\x11", "+", "?",
|
|
"\x13", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
|
|
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
|
|
"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"
|
|
}; // DEBUG - consolidate these
|
|
static ScanCode ExtScanCodes[] = // Scan codes with >1 char names
|
|
{
|
|
1, 0xe, 0xf, 0x1d, 0x2a, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
|
|
0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x59, 0x46, 0x1c, 0x36,
|
|
0x37, 0x38, 0x47, 0x49, 0x4f, 0x51, 0x52, 0x53, 0x45, 0x48,
|
|
0x50, 0x4b, 0x4d, 0x00
|
|
};
|
|
static const char *ExtScanNames[] = // Names corresponding to ExtScanCodes
|
|
{
|
|
"Esc", "BkSp", "Tab", "Ctrl", "LShft", "Space", "CapsLk", "F1", "F2", "F3", "F4",
|
|
"F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "ScrlLk", "Enter", "RShft",
|
|
"PrtSc", "Alt", "Home", "PgUp", "End", "PgDn", "Ins", "Del", "NumLk", "Up",
|
|
"Down", "Left", "Right", ""
|
|
};
|
|
|
|
/*#pragma warning 737 9
|
|
static byte
|
|
*ScanNames[] = // Scan code names with single chars
|
|
{
|
|
"?","?","1","2","3","4","5","6","7","8","9","0","-","+","?","?",
|
|
"Q","W","E","R","T","Y","U","I","O","P","[","]","|","?","A","S",
|
|
"D","F","G","H","J","K","L",";","\"","?","?","?","Z","X","C","V",
|
|
"B","N","M",",",".","/","?","?","?","?","?","?","?","?","?","?",
|
|
"?","?","?","?","?","?","?","?","\xf","?","-","\x15","5","\x11","+","?",
|
|
"\x13","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
|
|
"?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?",
|
|
"?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"
|
|
}; // DEBUG - consolidate these
|
|
static byte ExtScanCodes[] = // Scan codes with >1 char names
|
|
{
|
|
1,0xe,0xf,0x1d,0x2a,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,
|
|
0x3f,0x40,0x41,0x42,0x43,0x44,0x57,0x59,0x46,0x1c,0x36,
|
|
0x37,0x38,0x47,0x49,0x4f,0x51,0x52,0x53,0x45,0x48,
|
|
0x50,0x4b,0x4d,0x00
|
|
};
|
|
static byte *ExtScanNames[] = // Names corresponding to ExtScanCodes
|
|
{
|
|
"Esc","BkSp","Tab","Ctrl","LShft","Space","CapsLk","F1","F2","F3","F4",
|
|
"F5","F6","F7","F8","F9","F10","F11","F12","ScrlLk","Enter","RShft",
|
|
"PrtSc","Alt","Home","PgUp","End","PgDn","Ins","Del","NumLk","Up",
|
|
"Down","Left","Right",""
|
|
};*/
|
|
|
|
#else
|
|
static const char* const ScanNames[SDLK_LAST] =
|
|
{
|
|
"?","?","?","?","?","?","?","?", // 0
|
|
"BkSp","Tab","?","?","?","Return","?","?", // 8
|
|
"?","?","?","Pause","?","?","?","?", // 16
|
|
"?","?","?","Esc","?","?","?","?", // 24
|
|
"Space","!","\"","#","$","?","&","'", // 32
|
|
"(",")","*","+",",","-",".","/", // 40
|
|
"0","1","2","3","4","5","6","7", // 48
|
|
"8","9",":",";","<","=",">","?", // 56
|
|
"@","A","B","C","D","E","F","G", // 64
|
|
"H","I","J","K","L","M","N","O", // 72
|
|
"P","Q","R","S","T","U","V","W", // 80
|
|
"X","Y","Z","[","\\","]","^","_", // 88
|
|
"`","a","b","c","d","e","f","h", // 96
|
|
"h","i","j","k","l","m","n","o", // 104
|
|
"p","q","r","s","t","u","v","w", // 112
|
|
"x","y","z","{","|","}","~","?", // 120
|
|
"?","?","?","?","?","?","?","?", // 128
|
|
"?","?","?","?","?","?","?","?", // 136
|
|
"?","?","?","?","?","?","?","?", // 144
|
|
"?","?","?","?","?","?","?","?", // 152
|
|
"?","?","?","?","?","?","?","?", // 160
|
|
"?","?","?","?","?","?","?","?", // 168
|
|
"?","?","?","?","?","?","?","?", // 176
|
|
"?","?","?","?","?","?","?","?", // 184
|
|
"?","?","?","?","?","?","?","?", // 192
|
|
"?","?","?","?","?","?","?","?", // 200
|
|
"?","?","?","?","?","?","?","?", // 208
|
|
"?","?","?","?","?","?","?","?", // 216
|
|
"?","?","?","?","?","?","?","?", // 224
|
|
"?","?","?","?","?","?","?","?", // 232
|
|
"?","?","?","?","?","?","?","?", // 240
|
|
"?","?","?","?","?","?","?","?", // 248
|
|
"?","?","?","?","?","?","?","?", // 256
|
|
"?","?","?","?","?","?","?","Enter", // 264
|
|
"?","Up","Down","Right","Left","Ins","Home","End", // 272
|
|
"PgUp","PgDn","F1","F2","F3","F4","F5","F6", // 280
|
|
"F7","F8","F9","F10","F11","F12","?","?", // 288
|
|
"?","?","?","?","NumLk","CapsLk","ScrlLk","RShft", // 296
|
|
"Shift","RCtrl","Ctrl","RAlt","Alt","?","?","?", // 304
|
|
"?","?","?","?","PrtSc","?","?","?", // 312
|
|
"?","?" // 320
|
|
};
|
|
|
|
#endif
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Wolfenstein Control Panel! Ta Da!
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
US_ControlPanel (ScanCode scancode)
|
|
{
|
|
int which;
|
|
|
|
#ifdef _arch_dreamcast
|
|
DC_StatusClearLCD();
|
|
#endif
|
|
|
|
if (ingame)
|
|
{
|
|
if (CP_CheckQuick (scancode))
|
|
return;
|
|
lastgamemusicoffset = StartCPMusic (MENUSONG);
|
|
}
|
|
else
|
|
StartCPMusic (MENUSONG);
|
|
SetupControlPanel ();
|
|
|
|
//
|
|
// F-KEYS FROM WITHIN GAME
|
|
//
|
|
switch (scancode)
|
|
{
|
|
case sc_F1:
|
|
#ifdef SPEAR
|
|
BossKey ();
|
|
#else
|
|
#ifdef GOODTIMES
|
|
BossKey ();
|
|
#else
|
|
HelpScreens ();
|
|
#endif
|
|
#endif
|
|
goto finishup;
|
|
|
|
case sc_F2:
|
|
CP_SaveGame (0);
|
|
goto finishup;
|
|
|
|
case sc_F3:
|
|
CP_LoadGame (0);
|
|
goto finishup;
|
|
|
|
case sc_F4:
|
|
CP_Sound (0);
|
|
goto finishup;
|
|
|
|
case sc_F5:
|
|
CP_ChangeView (0);
|
|
goto finishup;
|
|
|
|
case sc_F6:
|
|
CP_Control (0);
|
|
goto finishup;
|
|
|
|
finishup:
|
|
CleanupControlPanel ();
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
#ifdef SPEAR
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
|
|
DrawMainMenu ();
|
|
MenuFadeIn ();
|
|
StartGame = 0;
|
|
|
|
//
|
|
// MAIN MENU LOOP
|
|
//
|
|
do
|
|
{
|
|
which = HandleMenu (&MainItems, &MainMenu[0], NULL);
|
|
|
|
#ifdef SPEAR
|
|
#ifndef SPEARDEMO
|
|
IN_ProcessEvents();
|
|
|
|
//
|
|
// EASTER EGG FOR SPEAR OF DESTINY!
|
|
//
|
|
if (Keyboard[sc_I] && Keyboard[sc_D])
|
|
{
|
|
VW_FadeOut ();
|
|
StartCPMusic (XJAZNAZI_MUS);
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
UnCacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
ClearMemory ();
|
|
|
|
|
|
CA_CacheGrChunk (IDGUYS1PIC);
|
|
VWB_DrawPic (0, 0, IDGUYS1PIC);
|
|
UNCACHEGRCHUNK (IDGUYS1PIC);
|
|
|
|
CA_CacheGrChunk (IDGUYS2PIC);
|
|
VWB_DrawPic (0, 80, IDGUYS2PIC);
|
|
UNCACHEGRCHUNK (IDGUYS2PIC);
|
|
|
|
VW_UpdateScreen ();
|
|
|
|
SDL_Color pal[256];
|
|
CA_CacheGrChunk (IDGUYSPALETTE);
|
|
VL_ConvertPalette(grsegs[IDGUYSPALETTE], pal, 256);
|
|
VL_FadeIn (0, 255, pal, 30);
|
|
UNCACHEGRCHUNK (IDGUYSPALETTE);
|
|
|
|
while (Keyboard[sc_I] || Keyboard[sc_D])
|
|
IN_WaitAndProcessEvents();
|
|
IN_ClearKeysDown ();
|
|
IN_Ack ();
|
|
|
|
VW_FadeOut ();
|
|
|
|
CacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
DrawMainMenu ();
|
|
StartCPMusic (MENUSONG);
|
|
MenuFadeIn ();
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
switch (which)
|
|
{
|
|
case viewscores:
|
|
if (MainMenu[viewscores].routine == NULL)
|
|
{
|
|
if (CP_EndGame (0))
|
|
StartGame = 1;
|
|
}
|
|
else
|
|
{
|
|
DrawMainMenu();
|
|
MenuFadeIn ();
|
|
}
|
|
break;
|
|
|
|
case backtodemo:
|
|
StartGame = 1;
|
|
if (!ingame)
|
|
StartCPMusic (INTROSONG);
|
|
VL_FadeOut (0, 255, 0, 0, 0, 10);
|
|
break;
|
|
|
|
case -1:
|
|
case quit:
|
|
CP_Quit (0);
|
|
break;
|
|
|
|
default:
|
|
if (!StartGame)
|
|
{
|
|
DrawMainMenu ();
|
|
MenuFadeIn ();
|
|
}
|
|
}
|
|
|
|
//
|
|
// "EXIT OPTIONS" OR "NEW GAME" EXITS
|
|
//
|
|
}
|
|
while (!StartGame);
|
|
|
|
//
|
|
// DEALLOCATE EVERYTHING
|
|
//
|
|
CleanupControlPanel ();
|
|
|
|
//
|
|
// CHANGE MAINMENU ITEM
|
|
//
|
|
if (startgame || loadedgame)
|
|
EnableEndGameMenuItem();
|
|
|
|
// RETURN/START GAME EXECUTION
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
}
|
|
|
|
void EnableEndGameMenuItem()
|
|
{
|
|
MainMenu[viewscores].routine = NULL;
|
|
#ifndef JAPAN
|
|
strcpy (MainMenu[viewscores].string, STR_EG);
|
|
#endif
|
|
}
|
|
|
|
////////////////////////
|
|
//
|
|
// DRAW MAIN MENU SCREEN
|
|
//
|
|
void
|
|
DrawMainMenu (void)
|
|
{
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_OPTIONSPIC);
|
|
#else
|
|
ClearMScreen ();
|
|
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
DrawStripes (10);
|
|
VWB_DrawPic (84, 0, C_OPTIONSPIC);
|
|
|
|
#ifdef SPANISH
|
|
DrawWindow (MENU_X - 8, MENU_Y - 3, MENU_W + 8, MENU_H, BKGDCOLOR);
|
|
#else
|
|
DrawWindow (MENU_X - 8, MENU_Y - 3, MENU_W, MENU_H, BKGDCOLOR);
|
|
#endif
|
|
#endif
|
|
|
|
//
|
|
// CHANGE "GAME" AND "DEMO"
|
|
//
|
|
if (ingame)
|
|
{
|
|
#ifndef JAPAN
|
|
|
|
#ifdef SPANISH
|
|
strcpy (&MainMenu[backtodemo].string, STR_GAME);
|
|
#else
|
|
strcpy (&MainMenu[backtodemo].string[8], STR_GAME);
|
|
#endif
|
|
|
|
#else
|
|
CA_CacheGrChunk (C_MRETGAMEPIC);
|
|
VWB_DrawPic (12 * 8, 20 * 8, C_MRETGAMEPIC);
|
|
UNCACHEGRCHUNK (C_MRETGAMEPIC);
|
|
CA_CacheGrChunk (C_MENDGAMEPIC);
|
|
VWB_DrawPic (12 * 8, 18 * 8, C_MENDGAMEPIC);
|
|
UNCACHEGRCHUNK (C_MENDGAMEPIC);
|
|
#endif
|
|
MainMenu[backtodemo].active = 2;
|
|
}
|
|
else
|
|
{
|
|
#ifndef JAPAN
|
|
#ifdef SPANISH
|
|
strcpy (&MainMenu[backtodemo].string, STR_BD);
|
|
#else
|
|
strcpy (&MainMenu[backtodemo].string[8], STR_DEMO);
|
|
#endif
|
|
#else
|
|
CA_CacheGrChunk (C_MRETDEMOPIC);
|
|
VWB_DrawPic (12 * 8, 20 * 8, C_MRETDEMOPIC);
|
|
UNCACHEGRCHUNK (C_MRETDEMOPIC);
|
|
CA_CacheGrChunk (C_MSCORESPIC);
|
|
VWB_DrawPic (12 * 8, 18 * 8, C_MSCORESPIC);
|
|
UNCACHEGRCHUNK (C_MSCORESPIC);
|
|
#endif
|
|
MainMenu[backtodemo].active = 1;
|
|
}
|
|
|
|
DrawMenu (&MainItems, &MainMenu[0]);
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
#ifndef GOODTIMES
|
|
#ifndef SPEAR
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// READ THIS!
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_ReadThis (int)
|
|
{
|
|
StartCPMusic (CORNER_MUS);
|
|
HelpScreens ();
|
|
StartCPMusic (MENUSONG);
|
|
return true;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef GOODTIMES
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// BOSS KEY
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
BossKey (void)
|
|
{
|
|
#ifdef NOTYET
|
|
byte palette1[256][3];
|
|
SD_MusicOff ();
|
|
/* _AX = 3;
|
|
geninterrupt(0x10); */
|
|
_asm
|
|
{
|
|
mov eax, 3 int 0x10}
|
|
puts ("C>");
|
|
SetTextCursor (2, 0);
|
|
// while (!Keyboard[sc_Escape])
|
|
IN_Ack ();
|
|
IN_ClearKeysDown ();
|
|
|
|
SD_MusicOn ();
|
|
VL_SetVGAPlaneMode ();
|
|
for (int i = 0; i < 768; i++)
|
|
palette1[0][i] = 0;
|
|
|
|
VL_SetPalette (&palette1[0][0]);
|
|
LoadLatchMem ();
|
|
#endif
|
|
}
|
|
#else
|
|
#ifdef SPEAR
|
|
void
|
|
BossKey (void)
|
|
{
|
|
#ifdef NOTYET
|
|
byte palette1[256][3];
|
|
SD_MusicOff ();
|
|
/* _AX = 3;
|
|
geninterrupt(0x10); */
|
|
_asm
|
|
{
|
|
mov eax, 3 int 0x10}
|
|
puts ("C>");
|
|
SetTextCursor (2, 0);
|
|
// while (!Keyboard[sc_Escape])
|
|
IN_Ack ();
|
|
IN_ClearKeysDown ();
|
|
|
|
SD_MusicOn ();
|
|
VL_SetVGAPlaneMode ();
|
|
for (int i = 0; i < 768; i++)
|
|
palette1[0][i] = 0;
|
|
|
|
VL_SetPalette (&palette1[0][0]);
|
|
LoadLatchMem ();
|
|
#endif
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CHECK QUICK-KEYS & QUIT (WHILE IN A GAME)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_CheckQuick (ScanCode scancode)
|
|
{
|
|
switch (scancode)
|
|
{
|
|
//
|
|
// END GAME
|
|
//
|
|
case sc_F7:
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
|
|
WindowH = 160;
|
|
#ifdef JAPAN
|
|
if (GetYorN (7, 8, C_JAPQUITPIC))
|
|
#else
|
|
if (Confirm (ENDGAMESTR))
|
|
#endif
|
|
{
|
|
playstate = ex_died;
|
|
killerobj = NULL;
|
|
pickquick = gamestate.lives = 0;
|
|
}
|
|
|
|
WindowH = 200;
|
|
fontnumber = 0;
|
|
MainMenu[savegame].active = 0;
|
|
return 1;
|
|
|
|
//
|
|
// QUICKSAVE
|
|
//
|
|
case sc_F8:
|
|
if (SaveGamesAvail[LSItems.curpos] && pickquick)
|
|
{
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
fontnumber = 1;
|
|
Message (STR_SAVING "...");
|
|
CP_SaveGame (1);
|
|
fontnumber = 0;
|
|
}
|
|
else
|
|
{
|
|
#ifndef SPEAR
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
CA_CacheGrChunk (C_CURSOR1PIC);
|
|
CA_CacheGrChunk (C_CURSOR2PIC);
|
|
CA_CacheGrChunk (C_DISKLOADING1PIC);
|
|
CA_CacheGrChunk (C_DISKLOADING2PIC);
|
|
CA_CacheGrChunk (C_SAVEGAMEPIC);
|
|
CA_CacheGrChunk (C_MOUSELBACKPIC);
|
|
#else
|
|
CacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
CA_CacheGrChunk (C_CURSOR1PIC);
|
|
#endif
|
|
|
|
VW_FadeOut ();
|
|
if(screenHeight % 200 != 0)
|
|
VL_ClearScreen(0);
|
|
|
|
lastgamemusicoffset = StartCPMusic (MENUSONG);
|
|
pickquick = CP_SaveGame (0);
|
|
|
|
SETFONTCOLOR (0, 15);
|
|
IN_ClearKeysDown ();
|
|
VW_FadeOut();
|
|
if(viewsize != 21)
|
|
DrawPlayScreen ();
|
|
|
|
if (!startgame && !loadedgame)
|
|
ContinueMusic (lastgamemusicoffset);
|
|
|
|
if (loadedgame)
|
|
playstate = ex_abort;
|
|
lasttimecount = GetTimeCount ();
|
|
|
|
if (MousePresent && IN_IsInputGrabbed())
|
|
IN_CenterMouse(); // Clear accumulated mouse movement
|
|
|
|
#ifndef SPEAR
|
|
UNCACHEGRCHUNK (C_CURSOR1PIC);
|
|
UNCACHEGRCHUNK (C_CURSOR2PIC);
|
|
UNCACHEGRCHUNK (C_DISKLOADING1PIC);
|
|
UNCACHEGRCHUNK (C_DISKLOADING2PIC);
|
|
UNCACHEGRCHUNK (C_SAVEGAMEPIC);
|
|
UNCACHEGRCHUNK (C_MOUSELBACKPIC);
|
|
#else
|
|
UnCacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
#endif
|
|
}
|
|
return 1;
|
|
|
|
//
|
|
// QUICKLOAD
|
|
//
|
|
case sc_F9:
|
|
if (SaveGamesAvail[LSItems.curpos] && pickquick)
|
|
{
|
|
char string[100] = STR_LGC;
|
|
|
|
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
fontnumber = 1;
|
|
|
|
strcat (string, SaveGameNames[LSItems.curpos]);
|
|
strcat (string, "\"?");
|
|
|
|
if (Confirm (string))
|
|
CP_LoadGame (1);
|
|
|
|
fontnumber = 0;
|
|
}
|
|
else
|
|
{
|
|
#ifndef SPEAR
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
CA_CacheGrChunk (C_CURSOR1PIC);
|
|
CA_CacheGrChunk (C_CURSOR2PIC);
|
|
CA_CacheGrChunk (C_DISKLOADING1PIC);
|
|
CA_CacheGrChunk (C_DISKLOADING2PIC);
|
|
CA_CacheGrChunk (C_LOADGAMEPIC);
|
|
CA_CacheGrChunk (C_MOUSELBACKPIC);
|
|
#else
|
|
CA_CacheGrChunk (C_CURSOR1PIC);
|
|
CacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
#endif
|
|
|
|
VW_FadeOut ();
|
|
if(screenHeight % 200 != 0)
|
|
VL_ClearScreen(0);
|
|
|
|
lastgamemusicoffset = StartCPMusic (MENUSONG);
|
|
pickquick = CP_LoadGame (0); // loads lastgamemusicoffs
|
|
|
|
SETFONTCOLOR (0, 15);
|
|
IN_ClearKeysDown ();
|
|
VW_FadeOut();
|
|
if(viewsize != 21)
|
|
DrawPlayScreen ();
|
|
|
|
if (!startgame && !loadedgame)
|
|
ContinueMusic (lastgamemusicoffset);
|
|
|
|
if (loadedgame)
|
|
playstate = ex_abort;
|
|
|
|
lasttimecount = GetTimeCount ();
|
|
|
|
if (MousePresent && IN_IsInputGrabbed())
|
|
IN_CenterMouse(); // Clear accumulated mouse movement
|
|
|
|
#ifndef SPEAR
|
|
UNCACHEGRCHUNK (C_CURSOR1PIC);
|
|
UNCACHEGRCHUNK (C_CURSOR2PIC);
|
|
UNCACHEGRCHUNK (C_DISKLOADING1PIC);
|
|
UNCACHEGRCHUNK (C_DISKLOADING2PIC);
|
|
UNCACHEGRCHUNK (C_LOADGAMEPIC);
|
|
UNCACHEGRCHUNK (C_MOUSELBACKPIC);
|
|
#else
|
|
UnCacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
#endif
|
|
}
|
|
return 1;
|
|
|
|
//
|
|
// QUIT
|
|
//
|
|
case sc_F10:
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
|
|
WindowX = WindowY = 0;
|
|
WindowW = 320;
|
|
WindowH = 160;
|
|
#ifdef JAPAN
|
|
if (GetYorN (7, 8, C_QUITMSGPIC))
|
|
#else
|
|
#ifdef SPANISH
|
|
if (Confirm (ENDGAMESTR))
|
|
#else
|
|
if (Confirm (endStrings[US_RndT () & 0x7 + (US_RndT () & 1)]))
|
|
#endif
|
|
#endif
|
|
{
|
|
VW_UpdateScreen ();
|
|
SD_MusicOff ();
|
|
SD_StopSound ();
|
|
MenuFadeOut ();
|
|
|
|
Quit (NULL);
|
|
}
|
|
|
|
DrawPlayBorder ();
|
|
WindowH = 200;
|
|
fontnumber = 0;
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// END THE CURRENT GAME
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_EndGame (int a)
|
|
{
|
|
int res;
|
|
#ifdef JAPAN
|
|
res = GetYorN (7, 8, C_JAPQUITPIC);
|
|
#else
|
|
res = Confirm (ENDGAMESTR);
|
|
#endif
|
|
DrawMainMenu();
|
|
if(!res) return 0;
|
|
|
|
pickquick = gamestate.lives = 0;
|
|
playstate = ex_died;
|
|
killerobj = NULL;
|
|
|
|
MainMenu[savegame].active = 0;
|
|
MainMenu[viewscores].routine = CP_ViewScores;
|
|
#ifndef JAPAN
|
|
strcpy (MainMenu[viewscores].string, STR_VS);
|
|
#endif
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// VIEW THE HIGH SCORES
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_ViewScores (int a)
|
|
{
|
|
fontnumber = 0;
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
StartCPMusic (XAWARD_MUS);
|
|
#else
|
|
StartCPMusic (ROSTER_MUS);
|
|
#endif
|
|
|
|
DrawHighScores ();
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
fontnumber = 1;
|
|
|
|
IN_Ack ();
|
|
|
|
StartCPMusic (MENUSONG);
|
|
MenuFadeOut ();
|
|
|
|
#ifdef SPEAR
|
|
CacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// START A NEW GAME
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_NewGame (int a)
|
|
{
|
|
int which, episode;
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
|
|
|
|
#ifndef SPEAR
|
|
firstpart:
|
|
|
|
DrawNewEpisode ();
|
|
do
|
|
{
|
|
which = HandleMenu (&NewEitems, &NewEmenu[0], NULL);
|
|
switch (which)
|
|
{
|
|
case -1:
|
|
MenuFadeOut ();
|
|
return 0;
|
|
|
|
default:
|
|
if (!EpisodeSelect[which / 2])
|
|
{
|
|
SD_PlaySound (NOWAYSND);
|
|
Message ("Please select \"Read This!\"\n"
|
|
"from the Options menu to\n"
|
|
"find out how to order this\n" "episode from Apogee.");
|
|
IN_ClearKeysDown ();
|
|
IN_Ack ();
|
|
DrawNewEpisode ();
|
|
which = 0;
|
|
}
|
|
else
|
|
{
|
|
episode = which / 2;
|
|
which = 1;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
while (!which);
|
|
|
|
ShootSnd ();
|
|
|
|
//
|
|
// ALREADY IN A GAME?
|
|
//
|
|
if (ingame)
|
|
#ifdef JAPAN
|
|
if (!GetYorN (7, 8, C_JAPNEWGAMEPIC))
|
|
#else
|
|
if (!Confirm (CURGAME))
|
|
#endif
|
|
{
|
|
MenuFadeOut ();
|
|
return 0;
|
|
}
|
|
|
|
MenuFadeOut ();
|
|
|
|
#else
|
|
episode = 0;
|
|
|
|
//
|
|
// ALREADY IN A GAME?
|
|
//
|
|
CacheLump (NEWGAME_LUMP_START, NEWGAME_LUMP_END);
|
|
DrawNewGame ();
|
|
if (ingame)
|
|
if (!Confirm (CURGAME))
|
|
{
|
|
MenuFadeOut ();
|
|
UnCacheLump (NEWGAME_LUMP_START, NEWGAME_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
DrawNewGame ();
|
|
which = HandleMenu (&NewItems, &NewMenu[0], DrawNewGameDiff);
|
|
if (which < 0)
|
|
{
|
|
MenuFadeOut ();
|
|
#ifndef SPEAR
|
|
goto firstpart;
|
|
#else
|
|
UnCacheLump (NEWGAME_LUMP_START, NEWGAME_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
ShootSnd ();
|
|
NewGame (which, episode);
|
|
StartGame = 1;
|
|
MenuFadeOut ();
|
|
|
|
//
|
|
// CHANGE "READ THIS!" TO NORMAL COLOR
|
|
//
|
|
#ifndef SPEAR
|
|
#ifndef GOODTIMES
|
|
MainMenu[readthis].active = 1;
|
|
#endif
|
|
#endif
|
|
|
|
pickquick = 0;
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (NEWGAME_LUMP_START, NEWGAME_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
#ifndef SPEAR
|
|
/////////////////////
|
|
//
|
|
// DRAW NEW EPISODE MENU
|
|
//
|
|
void
|
|
DrawNewEpisode (void)
|
|
{
|
|
int i;
|
|
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_EPISODEPIC);
|
|
#else
|
|
ClearMScreen ();
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
|
|
DrawWindow (NE_X - 4, NE_Y - 4, NE_W + 8, NE_H + 8, BKGDCOLOR);
|
|
SETFONTCOLOR (READHCOLOR, BKGDCOLOR);
|
|
PrintY = 2;
|
|
WindowX = 0;
|
|
#ifdef SPANISH
|
|
US_CPrint ("Cual episodio jugar?");
|
|
#else
|
|
US_CPrint ("Which episode to play?");
|
|
#endif
|
|
#endif
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
DrawMenu (&NewEitems, &NewEmenu[0]);
|
|
|
|
for (i = 0; i < 6; i++)
|
|
VWB_DrawPic (NE_X + 32, NE_Y + i * 26, C_EPISODE1PIC + i);
|
|
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
}
|
|
#endif
|
|
|
|
/////////////////////
|
|
//
|
|
// DRAW NEW GAME MENU
|
|
//
|
|
void
|
|
DrawNewGame (void)
|
|
{
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_SKILLPIC);
|
|
#else
|
|
ClearMScreen ();
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
|
|
SETFONTCOLOR (READHCOLOR, BKGDCOLOR);
|
|
PrintX = NM_X + 20;
|
|
PrintY = NM_Y - 32;
|
|
|
|
#ifndef SPEAR
|
|
#ifdef SPANISH
|
|
US_Print ("Eres macho?");
|
|
#else
|
|
US_Print ("How tough are you?");
|
|
#endif
|
|
#else
|
|
VWB_DrawPic (PrintX, PrintY, C_HOWTOUGHPIC);
|
|
#endif
|
|
|
|
DrawWindow (NM_X - 5, NM_Y - 10, NM_W, NM_H, BKGDCOLOR);
|
|
#endif
|
|
|
|
DrawMenu (&NewItems, &NewMenu[0]);
|
|
DrawNewGameDiff (NewItems.curpos);
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DRAW NEW GAME GRAPHIC
|
|
//
|
|
void
|
|
DrawNewGameDiff (int w)
|
|
{
|
|
VWB_DrawPic (NM_X + 185, NM_Y + 7, w + C_BABYMODEPIC);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// HANDLE SOUND MENU
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_Sound (int a)
|
|
{
|
|
int which;
|
|
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
CacheLump (SOUND_LUMP_START, SOUND_LUMP_END);
|
|
#endif
|
|
|
|
DrawSoundMenu ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
|
|
do
|
|
{
|
|
which = HandleMenu (&SndItems, &SndMenu[0], NULL);
|
|
//
|
|
// HANDLE MENU CHOICES
|
|
//
|
|
switch (which)
|
|
{
|
|
//
|
|
// SOUND EFFECTS
|
|
//
|
|
case 0:
|
|
if (SoundMode != sdm_Off)
|
|
{
|
|
SD_WaitSoundDone ();
|
|
SD_SetSoundMode (sdm_Off);
|
|
DrawSoundMenu ();
|
|
}
|
|
break;
|
|
case 1:
|
|
if (SoundMode != sdm_PC)
|
|
{
|
|
SD_WaitSoundDone ();
|
|
SD_SetSoundMode (sdm_PC);
|
|
CA_LoadAllSounds ();
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
}
|
|
break;
|
|
case 2:
|
|
if (SoundMode != sdm_AdLib)
|
|
{
|
|
SD_WaitSoundDone ();
|
|
SD_SetSoundMode (sdm_AdLib);
|
|
CA_LoadAllSounds ();
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
}
|
|
break;
|
|
|
|
//
|
|
// DIGITIZED SOUND
|
|
//
|
|
case 5:
|
|
if (DigiMode != sds_Off)
|
|
{
|
|
SD_SetDigiDevice (sds_Off);
|
|
DrawSoundMenu ();
|
|
}
|
|
break;
|
|
case 6:
|
|
/* if (DigiMode != sds_SoundSource)
|
|
{
|
|
SD_SetDigiDevice (sds_SoundSource);
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
}*/
|
|
break;
|
|
case 7:
|
|
if (DigiMode != sds_SoundBlaster)
|
|
{
|
|
SD_SetDigiDevice (sds_SoundBlaster);
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
}
|
|
break;
|
|
|
|
//
|
|
// MUSIC
|
|
//
|
|
case 10:
|
|
if (MusicMode != smm_Off)
|
|
{
|
|
SD_SetMusicMode (smm_Off);
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
}
|
|
break;
|
|
case 11:
|
|
if (MusicMode != smm_AdLib)
|
|
{
|
|
SD_SetMusicMode (smm_AdLib);
|
|
DrawSoundMenu ();
|
|
ShootSnd ();
|
|
StartCPMusic (MENUSONG);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
while (which >= 0);
|
|
|
|
MenuFadeOut ();
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (SOUND_LUMP_START, SOUND_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
//////////////////////
|
|
//
|
|
// DRAW THE SOUND MENU
|
|
//
|
|
void
|
|
DrawSoundMenu (void)
|
|
{
|
|
int i, on;
|
|
|
|
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_SOUNDPIC);
|
|
#else
|
|
//
|
|
// DRAW SOUND MENU
|
|
//
|
|
ClearMScreen ();
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
|
|
DrawWindow (SM_X - 8, SM_Y1 - 3, SM_W, SM_H1, BKGDCOLOR);
|
|
DrawWindow (SM_X - 8, SM_Y2 - 3, SM_W, SM_H2, BKGDCOLOR);
|
|
DrawWindow (SM_X - 8, SM_Y3 - 3, SM_W, SM_H3, BKGDCOLOR);
|
|
#endif
|
|
|
|
//
|
|
// IF NO ADLIB, NON-CHOOSENESS!
|
|
//
|
|
if (!AdLibPresent && !SoundBlasterPresent)
|
|
{
|
|
SndMenu[2].active = SndMenu[10].active = SndMenu[11].active = 0;
|
|
}
|
|
|
|
if (!SoundBlasterPresent)
|
|
SndMenu[7].active = 0;
|
|
|
|
if (!SoundBlasterPresent)
|
|
SndMenu[5].active = 0;
|
|
|
|
DrawMenu (&SndItems, &SndMenu[0]);
|
|
#ifndef JAPAN
|
|
VWB_DrawPic (100, SM_Y1 - 20, C_FXTITLEPIC);
|
|
VWB_DrawPic (100, SM_Y2 - 20, C_DIGITITLEPIC);
|
|
VWB_DrawPic (100, SM_Y3 - 20, C_MUSICTITLEPIC);
|
|
#endif
|
|
|
|
for (i = 0; i < SndItems.amount; i++)
|
|
#ifdef JAPAN
|
|
if (i != 3 && i != 4 && i != 8 && i != 9)
|
|
#else
|
|
if (SndMenu[i].string[0])
|
|
#endif
|
|
{
|
|
//
|
|
// DRAW SELECTED/NOT SELECTED GRAPHIC BUTTONS
|
|
//
|
|
on = 0;
|
|
switch (i)
|
|
{
|
|
//
|
|
// SOUND EFFECTS
|
|
//
|
|
case 0:
|
|
if (SoundMode == sdm_Off)
|
|
on = 1;
|
|
break;
|
|
case 1:
|
|
if (SoundMode == sdm_PC)
|
|
on = 1;
|
|
break;
|
|
case 2:
|
|
if (SoundMode == sdm_AdLib)
|
|
on = 1;
|
|
break;
|
|
|
|
//
|
|
// DIGITIZED SOUND
|
|
//
|
|
case 5:
|
|
if (DigiMode == sds_Off)
|
|
on = 1;
|
|
break;
|
|
case 6:
|
|
// if (DigiMode == sds_SoundSource)
|
|
// on = 1;
|
|
break;
|
|
case 7:
|
|
if (DigiMode == sds_SoundBlaster)
|
|
on = 1;
|
|
break;
|
|
|
|
//
|
|
// MUSIC
|
|
//
|
|
case 10:
|
|
if (MusicMode == smm_Off)
|
|
on = 1;
|
|
break;
|
|
case 11:
|
|
if (MusicMode == smm_AdLib)
|
|
on = 1;
|
|
break;
|
|
}
|
|
|
|
if (on)
|
|
VWB_DrawPic (SM_X + 24, SM_Y1 + i * 13 + 2, C_SELECTEDPIC);
|
|
else
|
|
VWB_DrawPic (SM_X + 24, SM_Y1 + i * 13 + 2, C_NOTSELECTEDPIC);
|
|
}
|
|
|
|
DrawMenuGun (&SndItems);
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
|
|
//
|
|
// DRAW LOAD/SAVE IN PROGRESS
|
|
//
|
|
void
|
|
DrawLSAction (int which)
|
|
{
|
|
#define LSA_X 96
|
|
#define LSA_Y 80
|
|
#define LSA_W 130
|
|
#define LSA_H 42
|
|
|
|
DrawWindow (LSA_X, LSA_Y, LSA_W, LSA_H, TEXTCOLOR);
|
|
DrawOutline (LSA_X, LSA_Y, LSA_W, LSA_H, 0, HIGHLIGHT);
|
|
VWB_DrawPic (LSA_X + 8, LSA_Y + 5, C_DISKLOADING1PIC);
|
|
|
|
fontnumber = 1;
|
|
SETFONTCOLOR (0, TEXTCOLOR);
|
|
PrintX = LSA_X + 46;
|
|
PrintY = LSA_Y + 13;
|
|
|
|
if (!which)
|
|
US_Print (STR_LOADING "...");
|
|
else
|
|
US_Print (STR_SAVING "...");
|
|
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LOAD SAVED GAMES
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_LoadGame (int quick)
|
|
{
|
|
FILE *file;
|
|
int which, exit = 0;
|
|
char name[13];
|
|
char loadpath[300];
|
|
|
|
strcpy (name, SaveName);
|
|
|
|
//
|
|
// QUICKLOAD?
|
|
//
|
|
if (quick)
|
|
{
|
|
which = LSItems.curpos;
|
|
|
|
if (SaveGamesAvail[which])
|
|
{
|
|
name[7] = which + '0';
|
|
|
|
#ifdef _arch_dreamcast
|
|
DC_LoadFromVMU(name);
|
|
#endif
|
|
|
|
if(configdir[0])
|
|
snprintf(loadpath, sizeof(loadpath), "%s/%s", configdir, name);
|
|
else
|
|
strcpy(loadpath, name);
|
|
|
|
file = fopen (loadpath, "rb");
|
|
fseek (file, 32, SEEK_SET);
|
|
loadedgame = true;
|
|
LoadTheGame (file, 0, 0);
|
|
loadedgame = false;
|
|
fclose (file);
|
|
|
|
DrawFace ();
|
|
DrawHealth ();
|
|
DrawLives ();
|
|
DrawLevel ();
|
|
DrawAmmo ();
|
|
DrawKeys ();
|
|
DrawWeapon ();
|
|
DrawScore ();
|
|
ContinueMusic (lastgamemusicoffset);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
CacheLump (LOADSAVE_LUMP_START, LOADSAVE_LUMP_END);
|
|
#endif
|
|
|
|
DrawLoadSaveScreen (0);
|
|
|
|
do
|
|
{
|
|
which = HandleMenu (&LSItems, &LSMenu[0], TrackWhichGame);
|
|
if (which >= 0 && SaveGamesAvail[which])
|
|
{
|
|
ShootSnd ();
|
|
name[7] = which + '0';
|
|
|
|
#ifdef _arch_dreamcast
|
|
DC_LoadFromVMU(name);
|
|
#endif
|
|
|
|
if(configdir[0])
|
|
snprintf(loadpath, sizeof(loadpath), "%s/%s", configdir, name);
|
|
else
|
|
strcpy(loadpath, name);
|
|
|
|
file = fopen (loadpath, "rb");
|
|
fseek (file, 32, SEEK_SET);
|
|
|
|
DrawLSAction (0);
|
|
loadedgame = true;
|
|
|
|
LoadTheGame (file, LSA_X + 8, LSA_Y + 5);
|
|
fclose (file);
|
|
|
|
StartGame = 1;
|
|
ShootSnd ();
|
|
//
|
|
// CHANGE "READ THIS!" TO NORMAL COLOR
|
|
//
|
|
|
|
#ifndef SPEAR
|
|
#ifndef GOODTIMES
|
|
MainMenu[readthis].active = 1;
|
|
#endif
|
|
#endif
|
|
|
|
exit = 1;
|
|
break;
|
|
}
|
|
|
|
}
|
|
while (which >= 0);
|
|
|
|
MenuFadeOut ();
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (LOADSAVE_LUMP_START, LOADSAVE_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
|
|
return exit;
|
|
}
|
|
|
|
|
|
///////////////////////////////////
|
|
//
|
|
// HIGHLIGHT CURRENT SELECTED ENTRY
|
|
//
|
|
void
|
|
TrackWhichGame (int w)
|
|
{
|
|
static int lastgameon = 0;
|
|
|
|
PrintLSEntry (lastgameon, TEXTCOLOR);
|
|
PrintLSEntry (w, HIGHLIGHT);
|
|
|
|
lastgameon = w;
|
|
}
|
|
|
|
|
|
////////////////////////////
|
|
//
|
|
// DRAW THE LOAD/SAVE SCREEN
|
|
//
|
|
void
|
|
DrawLoadSaveScreen (int loadsave)
|
|
{
|
|
#define DISKX 100
|
|
#define DISKY 0
|
|
|
|
int i;
|
|
|
|
|
|
ClearMScreen ();
|
|
fontnumber = 1;
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
DrawWindow (LSM_X - 10, LSM_Y - 5, LSM_W, LSM_H, BKGDCOLOR);
|
|
DrawStripes (10);
|
|
|
|
if (!loadsave)
|
|
VWB_DrawPic (60, 0, C_LOADGAMEPIC);
|
|
else
|
|
VWB_DrawPic (60, 0, C_SAVEGAMEPIC);
|
|
|
|
for (i = 0; i < 10; i++)
|
|
PrintLSEntry (i, TEXTCOLOR);
|
|
|
|
DrawMenu (&LSItems, &LSMenu[0]);
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////
|
|
//
|
|
// PRINT LOAD/SAVE GAME ENTRY W/BOX OUTLINE
|
|
//
|
|
void
|
|
PrintLSEntry (int w, int color)
|
|
{
|
|
SETFONTCOLOR (color, BKGDCOLOR);
|
|
DrawOutline (LSM_X + LSItems.indent, LSM_Y + w * 13, LSM_W - LSItems.indent - 15, 11, color,
|
|
color);
|
|
PrintX = LSM_X + LSItems.indent + 2;
|
|
PrintY = LSM_Y + w * 13 + 1;
|
|
fontnumber = 0;
|
|
|
|
if (SaveGamesAvail[w])
|
|
US_Print (SaveGameNames[w]);
|
|
else
|
|
US_Print (" - " STR_EMPTY " -");
|
|
|
|
fontnumber = 1;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SAVE CURRENT GAME
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_SaveGame (int quick)
|
|
{
|
|
int which, exit = 0;
|
|
FILE *file;
|
|
char name[13];
|
|
char savepath[300];
|
|
char input[32];
|
|
|
|
strcpy (name, SaveName);
|
|
|
|
//
|
|
// QUICKSAVE?
|
|
//
|
|
if (quick)
|
|
{
|
|
which = LSItems.curpos;
|
|
|
|
if (SaveGamesAvail[which])
|
|
{
|
|
name[7] = which + '0';
|
|
|
|
if(configdir[0])
|
|
snprintf(savepath, sizeof(savepath), "%s/%s", configdir, name);
|
|
else
|
|
strcpy(savepath, name);
|
|
|
|
unlink (savepath);
|
|
file = fopen (savepath, "wb");
|
|
|
|
strcpy (input, &SaveGameNames[which][0]);
|
|
|
|
fwrite (input, 1, 32, file);
|
|
fseek (file, 32, SEEK_SET);
|
|
SaveTheGame (file, 0, 0);
|
|
fclose (file);
|
|
|
|
#ifdef _arch_dreamcast
|
|
DC_SaveToVMU(name, input);
|
|
#endif
|
|
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
CacheLump (LOADSAVE_LUMP_START, LOADSAVE_LUMP_END);
|
|
#endif
|
|
|
|
DrawLoadSaveScreen (1);
|
|
|
|
do
|
|
{
|
|
which = HandleMenu (&LSItems, &LSMenu[0], TrackWhichGame);
|
|
if (which >= 0)
|
|
{
|
|
//
|
|
// OVERWRITE EXISTING SAVEGAME?
|
|
//
|
|
if (SaveGamesAvail[which])
|
|
{
|
|
#ifdef JAPAN
|
|
if (!GetYorN (7, 8, C_JAPSAVEOVERPIC))
|
|
#else
|
|
if (!Confirm (GAMESVD))
|
|
#endif
|
|
{
|
|
DrawLoadSaveScreen (1);
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
DrawLoadSaveScreen (1);
|
|
PrintLSEntry (which, HIGHLIGHT);
|
|
VW_UpdateScreen ();
|
|
}
|
|
}
|
|
|
|
ShootSnd ();
|
|
|
|
strcpy (input, &SaveGameNames[which][0]);
|
|
name[7] = which + '0';
|
|
|
|
fontnumber = 0;
|
|
if (!SaveGamesAvail[which])
|
|
VWB_Bar (LSM_X + LSItems.indent + 1, LSM_Y + which * 13 + 1,
|
|
LSM_W - LSItems.indent - 16, 10, BKGDCOLOR);
|
|
VW_UpdateScreen ();
|
|
|
|
if (US_LineInput
|
|
(LSM_X + LSItems.indent + 2, LSM_Y + which * 13 + 1, input, input, true, 31,
|
|
LSM_W - LSItems.indent - 30))
|
|
{
|
|
SaveGamesAvail[which] = 1;
|
|
strcpy (&SaveGameNames[which][0], input);
|
|
|
|
if(configdir[0])
|
|
snprintf(savepath, sizeof(savepath), "%s/%s", configdir, name);
|
|
else
|
|
strcpy(savepath, name);
|
|
|
|
unlink (savepath);
|
|
file = fopen (savepath, "wb");
|
|
fwrite (input, 32, 1, file);
|
|
fseek (file, 32, SEEK_SET);
|
|
|
|
DrawLSAction (1);
|
|
SaveTheGame (file, LSA_X + 8, LSA_Y + 5);
|
|
|
|
fclose (file);
|
|
|
|
#ifdef _arch_dreamcast
|
|
DC_SaveToVMU(name, input);
|
|
#endif
|
|
|
|
ShootSnd ();
|
|
exit = 1;
|
|
}
|
|
else
|
|
{
|
|
VWB_Bar (LSM_X + LSItems.indent + 1, LSM_Y + which * 13 + 1,
|
|
LSM_W - LSItems.indent - 16, 10, BKGDCOLOR);
|
|
PrintLSEntry (which, HIGHLIGHT);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
continue;
|
|
}
|
|
|
|
fontnumber = 1;
|
|
break;
|
|
}
|
|
|
|
}
|
|
while (which >= 0);
|
|
|
|
MenuFadeOut ();
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (LOADSAVE_LUMP_START, LOADSAVE_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
|
|
return exit;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DEFINE CONTROLS
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_Control (int a)
|
|
{
|
|
int which;
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
CacheLump (CONTROL_LUMP_START, CONTROL_LUMP_END);
|
|
#endif
|
|
|
|
DrawCtlScreen ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
|
|
do
|
|
{
|
|
which = HandleMenu (&CtlItems, CtlMenu, NULL);
|
|
switch (which)
|
|
{
|
|
case CTL_MOUSEENABLE:
|
|
mouseenabled ^= 1;
|
|
if(IN_IsInputGrabbed())
|
|
IN_CenterMouse();
|
|
DrawCtlScreen ();
|
|
CusItems.curpos = -1;
|
|
ShootSnd ();
|
|
break;
|
|
|
|
case CTL_JOYENABLE:
|
|
joystickenabled ^= 1;
|
|
DrawCtlScreen ();
|
|
CusItems.curpos = -1;
|
|
ShootSnd ();
|
|
break;
|
|
|
|
case CTL_MOUSESENS:
|
|
case CTL_CUSTOMIZE:
|
|
DrawCtlScreen ();
|
|
MenuFadeIn ();
|
|
WaitKeyUp ();
|
|
break;
|
|
}
|
|
}
|
|
while (which >= 0);
|
|
|
|
MenuFadeOut ();
|
|
|
|
#ifdef SPEAR
|
|
UnCacheLump (CONTROL_LUMP_START, CONTROL_LUMP_END);
|
|
CacheLump (OPTIONS_LUMP_START, OPTIONS_LUMP_END);
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
////////////////////////////////
|
|
//
|
|
// DRAW MOUSE SENSITIVITY SCREEN
|
|
//
|
|
void
|
|
DrawMouseSens (void)
|
|
{
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_MOUSESENSPIC);
|
|
#else
|
|
ClearMScreen ();
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
#ifdef SPANISH
|
|
DrawWindow (10, 80, 300, 43, BKGDCOLOR);
|
|
#else
|
|
DrawWindow (10, 80, 300, 30, BKGDCOLOR);
|
|
#endif
|
|
|
|
WindowX = 0;
|
|
WindowW = 320;
|
|
PrintY = 82;
|
|
SETFONTCOLOR (READCOLOR, BKGDCOLOR);
|
|
US_CPrint (STR_MOUSEADJ);
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
#ifdef SPANISH
|
|
PrintX = 14;
|
|
PrintY = 95 + 13;
|
|
US_Print (STR_SLOW);
|
|
PrintX = 252;
|
|
US_Print (STR_FAST);
|
|
#else
|
|
PrintX = 14;
|
|
PrintY = 95;
|
|
US_Print (STR_SLOW);
|
|
PrintX = 269;
|
|
US_Print (STR_FAST);
|
|
#endif
|
|
#endif
|
|
|
|
VWB_Bar (60, 97, 200, 10, TEXTCOLOR);
|
|
DrawOutline (60, 97, 200, 10, 0, HIGHLIGHT);
|
|
DrawOutline (60 + 20 * mouseadjustment, 97, 20, 10, 0, READCOLOR);
|
|
VWB_Bar (61 + 20 * mouseadjustment, 98, 19, 9, READHCOLOR);
|
|
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
}
|
|
|
|
|
|
///////////////////////////
|
|
//
|
|
// ADJUST MOUSE SENSITIVITY
|
|
//
|
|
int
|
|
MouseSensitivity (int a)
|
|
{
|
|
ControlInfo ci;
|
|
int exit = 0, oldMA;
|
|
|
|
|
|
oldMA = mouseadjustment;
|
|
DrawMouseSens ();
|
|
do
|
|
{
|
|
SDL_Delay(5);
|
|
ReadAnyControl (&ci);
|
|
switch (ci.dir)
|
|
{
|
|
case dir_North:
|
|
case dir_West:
|
|
if (mouseadjustment)
|
|
{
|
|
mouseadjustment--;
|
|
VWB_Bar (60, 97, 200, 10, TEXTCOLOR);
|
|
DrawOutline (60, 97, 200, 10, 0, HIGHLIGHT);
|
|
DrawOutline (60 + 20 * mouseadjustment, 97, 20, 10, 0, READCOLOR);
|
|
VWB_Bar (61 + 20 * mouseadjustment, 98, 19, 9, READHCOLOR);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (MOVEGUN1SND);
|
|
TicDelay(20);
|
|
}
|
|
break;
|
|
|
|
case dir_South:
|
|
case dir_East:
|
|
if (mouseadjustment < 9)
|
|
{
|
|
mouseadjustment++;
|
|
VWB_Bar (60, 97, 200, 10, TEXTCOLOR);
|
|
DrawOutline (60, 97, 200, 10, 0, HIGHLIGHT);
|
|
DrawOutline (60 + 20 * mouseadjustment, 97, 20, 10, 0, READCOLOR);
|
|
VWB_Bar (61 + 20 * mouseadjustment, 98, 19, 9, READHCOLOR);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (MOVEGUN1SND);
|
|
TicDelay(20);
|
|
}
|
|
break;
|
|
}
|
|
|
|
if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
|
|
exit = 1;
|
|
else if (ci.button1 || Keyboard[sc_Escape])
|
|
exit = 2;
|
|
|
|
}
|
|
while (!exit);
|
|
|
|
if (exit == 2)
|
|
{
|
|
mouseadjustment = oldMA;
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
}
|
|
else
|
|
SD_PlaySound (SHOOTSND);
|
|
|
|
WaitKeyUp ();
|
|
MenuFadeOut ();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
///////////////////////////
|
|
//
|
|
// DRAW CONTROL MENU SCREEN
|
|
//
|
|
void
|
|
DrawCtlScreen (void)
|
|
{
|
|
int i, x, y;
|
|
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_CONTROLPIC);
|
|
#else
|
|
ClearMScreen ();
|
|
DrawStripes (10);
|
|
VWB_DrawPic (80, 0, C_CONTROLPIC);
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
DrawWindow (CTL_X - 8, CTL_Y - 5, CTL_W, CTL_H, BKGDCOLOR);
|
|
#endif
|
|
WindowX = 0;
|
|
WindowW = 320;
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
|
|
if (IN_JoyPresent())
|
|
CtlMenu[CTL_JOYENABLE].active = 1;
|
|
|
|
if (MousePresent)
|
|
{
|
|
CtlMenu[CTL_MOUSESENS].active = CtlMenu[CTL_MOUSEENABLE].active = 1;
|
|
}
|
|
|
|
CtlMenu[CTL_MOUSESENS].active = mouseenabled;
|
|
|
|
|
|
DrawMenu (&CtlItems, CtlMenu);
|
|
|
|
|
|
x = CTL_X + CtlItems.indent - 24;
|
|
y = CTL_Y + 3;
|
|
if (mouseenabled)
|
|
VWB_DrawPic (x, y, C_SELECTEDPIC);
|
|
else
|
|
VWB_DrawPic (x, y, C_NOTSELECTEDPIC);
|
|
|
|
y = CTL_Y + 29;
|
|
if (joystickenabled)
|
|
VWB_DrawPic (x, y, C_SELECTEDPIC);
|
|
else
|
|
VWB_DrawPic (x, y, C_NOTSELECTEDPIC);
|
|
|
|
//
|
|
// PICK FIRST AVAILABLE SPOT
|
|
//
|
|
if (CtlItems.curpos < 0 || !CtlMenu[CtlItems.curpos].active)
|
|
{
|
|
for (i = 0; i < CtlItems.amount; i++)
|
|
{
|
|
if (CtlMenu[i].active)
|
|
{
|
|
CtlItems.curpos = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
DrawMenuGun (&CtlItems);
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUSTOMIZE CONTROLS
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
enum
|
|
{ FIRE, STRAFE, RUN, OPEN };
|
|
char mbarray[4][3] = { "b0", "b1", "b2", "b3" };
|
|
int8_t order[4] = { RUN, OPEN, FIRE, STRAFE };
|
|
|
|
|
|
int
|
|
CustomControls (int a)
|
|
{
|
|
int which;
|
|
|
|
DrawCustomScreen ();
|
|
do
|
|
{
|
|
which = HandleMenu (&CusItems, &CusMenu[0], FixupCustom);
|
|
switch (which)
|
|
{
|
|
case 0:
|
|
DefineMouseBtns ();
|
|
DrawCustMouse (1);
|
|
break;
|
|
case 3:
|
|
DefineJoyBtns ();
|
|
DrawCustJoy (0);
|
|
break;
|
|
case 6:
|
|
DefineKeyBtns ();
|
|
DrawCustKeybd (0);
|
|
break;
|
|
case 8:
|
|
DefineKeyMove ();
|
|
DrawCustKeys (0);
|
|
}
|
|
}
|
|
while (which >= 0);
|
|
|
|
MenuFadeOut ();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DEFINE THE MOUSE BUTTONS
|
|
//
|
|
void
|
|
DefineMouseBtns (void)
|
|
{
|
|
CustomCtrls mouseallowed = { 0, 1, 1, 1 };
|
|
EnterCtrlData (2, &mouseallowed, DrawCustMouse, PrintCustMouse, MOUSE);
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DEFINE THE JOYSTICK BUTTONS
|
|
//
|
|
void
|
|
DefineJoyBtns (void)
|
|
{
|
|
CustomCtrls joyallowed = { 1, 1, 1, 1 };
|
|
EnterCtrlData (5, &joyallowed, DrawCustJoy, PrintCustJoy, JOYSTICK);
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DEFINE THE KEYBOARD BUTTONS
|
|
//
|
|
void
|
|
DefineKeyBtns (void)
|
|
{
|
|
CustomCtrls keyallowed = { 1, 1, 1, 1 };
|
|
EnterCtrlData (8, &keyallowed, DrawCustKeybd, PrintCustKeybd, KEYBOARDBTNS);
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DEFINE THE KEYBOARD BUTTONS
|
|
//
|
|
void
|
|
DefineKeyMove (void)
|
|
{
|
|
CustomCtrls keyallowed = { 1, 1, 1, 1 };
|
|
EnterCtrlData (10, &keyallowed, DrawCustKeys, PrintCustKeys, KEYBOARDMOVE);
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// ENTER CONTROL DATA FOR ANY TYPE OF CONTROL
|
|
//
|
|
enum
|
|
{ FWRD, RIGHT, BKWD, LEFT };
|
|
int moveorder[4] = { LEFT, RIGHT, FWRD, BKWD };
|
|
|
|
void
|
|
EnterCtrlData (int index, CustomCtrls * cust, void (*DrawRtn) (int), void (*PrintRtn) (int),
|
|
int type)
|
|
{
|
|
int j, exit, tick, redraw, which, x, picked, lastFlashTime;
|
|
ControlInfo ci;
|
|
|
|
|
|
ShootSnd ();
|
|
PrintY = CST_Y + 13 * index;
|
|
IN_ClearKeysDown ();
|
|
exit = 0;
|
|
redraw = 1;
|
|
//
|
|
// FIND FIRST SPOT IN ALLOWED ARRAY
|
|
//
|
|
for (j = 0; j < 4; j++)
|
|
if (cust->allowed[j])
|
|
{
|
|
which = j;
|
|
break;
|
|
}
|
|
|
|
do
|
|
{
|
|
if (redraw)
|
|
{
|
|
x = CST_START + CST_SPC * which;
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
|
|
DrawRtn (1);
|
|
DrawWindow (x - 2, PrintY, CST_SPC, 11, TEXTCOLOR);
|
|
DrawOutline (x - 2, PrintY, CST_SPC, 11, 0, HIGHLIGHT);
|
|
SETFONTCOLOR (0, TEXTCOLOR);
|
|
PrintRtn (which);
|
|
PrintX = x;
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
VW_UpdateScreen ();
|
|
WaitKeyUp ();
|
|
redraw = 0;
|
|
}
|
|
|
|
SDL_Delay(5);
|
|
ReadAnyControl (&ci);
|
|
|
|
if (type == MOUSE || type == JOYSTICK)
|
|
if (IN_KeyDown (sc_Enter) || IN_KeyDown (sc_Control) || IN_KeyDown (sc_Alt))
|
|
{
|
|
IN_ClearKeysDown ();
|
|
ci.button0 = ci.button1 = false;
|
|
}
|
|
|
|
//
|
|
// CHANGE BUTTON VALUE?
|
|
//
|
|
if ((type != KEYBOARDBTNS && type != KEYBOARDMOVE) && (ci.button0 | ci.button1 | ci.button2 | ci.button3) ||
|
|
((type == KEYBOARDBTNS || type == KEYBOARDMOVE) && LastScan == sc_Enter))
|
|
{
|
|
lastFlashTime = GetTimeCount();
|
|
tick = picked = 0;
|
|
SETFONTCOLOR (0, TEXTCOLOR);
|
|
|
|
if (type == KEYBOARDBTNS || type == KEYBOARDMOVE)
|
|
IN_ClearKeysDown ();
|
|
|
|
while(1)
|
|
{
|
|
int button, result = 0;
|
|
|
|
//
|
|
// FLASH CURSOR
|
|
//
|
|
if (GetTimeCount() - lastFlashTime > 10)
|
|
{
|
|
switch (tick)
|
|
{
|
|
case 0:
|
|
VWB_Bar (x, PrintY + 1, CST_SPC - 2, 10, TEXTCOLOR);
|
|
break;
|
|
case 1:
|
|
PrintX = x;
|
|
US_Print ("?");
|
|
SD_PlaySound (HITWALLSND);
|
|
}
|
|
tick ^= 1;
|
|
lastFlashTime = GetTimeCount();
|
|
VW_UpdateScreen ();
|
|
}
|
|
else SDL_Delay(5);
|
|
|
|
//
|
|
// WHICH TYPE OF INPUT DO WE PROCESS?
|
|
//
|
|
switch (type)
|
|
{
|
|
case MOUSE:
|
|
button = IN_MouseButtons();
|
|
switch (button)
|
|
{
|
|
case 1:
|
|
result = 1;
|
|
break;
|
|
case 2:
|
|
result = 2;
|
|
break;
|
|
case 4:
|
|
result = 3;
|
|
break;
|
|
}
|
|
|
|
if (result)
|
|
{
|
|
for (int z = 0; z < 4; z++)
|
|
if (order[which] == buttonmouse[z])
|
|
{
|
|
buttonmouse[z] = bt_nobutton;
|
|
break;
|
|
}
|
|
|
|
buttonmouse[result - 1] = order[which];
|
|
picked = 1;
|
|
SD_PlaySound (SHOOTDOORSND);
|
|
}
|
|
break;
|
|
|
|
case JOYSTICK:
|
|
if (ci.button0)
|
|
result = 1;
|
|
else if (ci.button1)
|
|
result = 2;
|
|
else if (ci.button2)
|
|
result = 3;
|
|
else if (ci.button3)
|
|
result = 4;
|
|
|
|
if (result)
|
|
{
|
|
for (int z = 0; z < 4; z++)
|
|
{
|
|
if (order[which] == buttonjoy[z])
|
|
{
|
|
buttonjoy[z] = bt_nobutton;
|
|
break;
|
|
}
|
|
}
|
|
|
|
buttonjoy[result - 1] = order[which];
|
|
picked = 1;
|
|
SD_PlaySound (SHOOTDOORSND);
|
|
}
|
|
break;
|
|
|
|
case KEYBOARDBTNS:
|
|
if (LastScan && LastScan != sc_Escape)
|
|
{
|
|
buttonscan[order[which]] = LastScan;
|
|
picked = 1;
|
|
ShootSnd ();
|
|
IN_ClearKeysDown ();
|
|
}
|
|
break;
|
|
|
|
case KEYBOARDMOVE:
|
|
if (LastScan && LastScan != sc_Escape)
|
|
{
|
|
dirscan[moveorder[which]] = LastScan;
|
|
picked = 1;
|
|
ShootSnd ();
|
|
IN_ClearKeysDown ();
|
|
}
|
|
break;
|
|
}
|
|
|
|
//
|
|
// EXIT INPUT?
|
|
//
|
|
if (IN_KeyDown (sc_Escape) || type != JOYSTICK && ci.button1)
|
|
{
|
|
picked = 1;
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
}
|
|
|
|
if(picked) break;
|
|
|
|
ReadAnyControl (&ci);
|
|
}
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
redraw = 1;
|
|
WaitKeyUp ();
|
|
continue;
|
|
}
|
|
|
|
if (ci.button1 || IN_KeyDown (sc_Escape))
|
|
exit = 1;
|
|
|
|
//
|
|
// MOVE TO ANOTHER SPOT?
|
|
//
|
|
switch (ci.dir)
|
|
{
|
|
case dir_West:
|
|
do
|
|
{
|
|
which--;
|
|
if (which < 0)
|
|
which = 3;
|
|
}
|
|
while (!cust->allowed[which]);
|
|
redraw = 1;
|
|
SD_PlaySound (MOVEGUN1SND);
|
|
while (ReadAnyControl (&ci), ci.dir != dir_None) SDL_Delay(5);
|
|
IN_ClearKeysDown ();
|
|
break;
|
|
|
|
case dir_East:
|
|
do
|
|
{
|
|
which++;
|
|
if (which > 3)
|
|
which = 0;
|
|
}
|
|
while (!cust->allowed[which]);
|
|
redraw = 1;
|
|
SD_PlaySound (MOVEGUN1SND);
|
|
while (ReadAnyControl (&ci), ci.dir != dir_None) SDL_Delay(5);
|
|
IN_ClearKeysDown ();
|
|
break;
|
|
case dir_North:
|
|
case dir_South:
|
|
exit = 1;
|
|
}
|
|
}
|
|
while (!exit);
|
|
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
WaitKeyUp ();
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// FIXUP GUN CURSOR OVERDRAW SHIT
|
|
//
|
|
void
|
|
FixupCustom (int w)
|
|
{
|
|
static int lastwhich = -1;
|
|
int y = CST_Y + 26 + w * 13;
|
|
|
|
|
|
VWB_Hlin (7, 32, y - 1, DEACTIVE);
|
|
VWB_Hlin (7, 32, y + 12, BORD2COLOR);
|
|
#ifndef SPEAR
|
|
VWB_Hlin (7, 32, y - 2, BORDCOLOR);
|
|
VWB_Hlin (7, 32, y + 13, BORDCOLOR);
|
|
#else
|
|
VWB_Hlin (7, 32, y - 2, BORD2COLOR);
|
|
VWB_Hlin (7, 32, y + 13, BORD2COLOR);
|
|
#endif
|
|
|
|
switch (w)
|
|
{
|
|
case 0:
|
|
DrawCustMouse (1);
|
|
break;
|
|
case 3:
|
|
DrawCustJoy (1);
|
|
break;
|
|
case 6:
|
|
DrawCustKeybd (1);
|
|
break;
|
|
case 8:
|
|
DrawCustKeys (1);
|
|
}
|
|
|
|
|
|
if (lastwhich >= 0)
|
|
{
|
|
y = CST_Y + 26 + lastwhich * 13;
|
|
VWB_Hlin (7, 32, y - 1, DEACTIVE);
|
|
VWB_Hlin (7, 32, y + 12, BORD2COLOR);
|
|
#ifndef SPEAR
|
|
VWB_Hlin (7, 32, y - 2, BORDCOLOR);
|
|
VWB_Hlin (7, 32, y + 13, BORDCOLOR);
|
|
#else
|
|
VWB_Hlin (7, 32, y - 2, BORD2COLOR);
|
|
VWB_Hlin (7, 32, y + 13, BORD2COLOR);
|
|
#endif
|
|
|
|
if (lastwhich != w)
|
|
switch (lastwhich)
|
|
{
|
|
case 0:
|
|
DrawCustMouse (0);
|
|
break;
|
|
case 3:
|
|
DrawCustJoy (0);
|
|
break;
|
|
case 6:
|
|
DrawCustKeybd (0);
|
|
break;
|
|
case 8:
|
|
DrawCustKeys (0);
|
|
}
|
|
}
|
|
|
|
lastwhich = w;
|
|
}
|
|
|
|
|
|
////////////////////////
|
|
//
|
|
// DRAW CUSTOMIZE SCREEN
|
|
//
|
|
void
|
|
DrawCustomScreen (void)
|
|
{
|
|
int i;
|
|
|
|
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_CUSTOMPIC);
|
|
fontnumber = 1;
|
|
|
|
PrintX = CST_START;
|
|
PrintY = CST_Y + 26;
|
|
DrawCustMouse (0);
|
|
|
|
PrintX = CST_START;
|
|
US_Print ("\n\n\n");
|
|
DrawCustJoy (0);
|
|
|
|
PrintX = CST_START;
|
|
US_Print ("\n\n\n");
|
|
DrawCustKeybd (0);
|
|
|
|
PrintX = CST_START;
|
|
US_Print ("\n\n\n");
|
|
DrawCustKeys (0);
|
|
#else
|
|
ClearMScreen ();
|
|
WindowX = 0;
|
|
WindowW = 320;
|
|
VWB_DrawPic (112, 184, C_MOUSELBACKPIC);
|
|
DrawStripes (10);
|
|
VWB_DrawPic (80, 0, C_CUSTOMIZEPIC);
|
|
|
|
//
|
|
// MOUSE
|
|
//
|
|
SETFONTCOLOR (READCOLOR, BKGDCOLOR);
|
|
WindowX = 0;
|
|
WindowW = 320;
|
|
|
|
#ifndef SPEAR
|
|
PrintY = CST_Y;
|
|
US_CPrint ("Mouse\n");
|
|
#else
|
|
PrintY = CST_Y + 13;
|
|
VWB_DrawPic (128, 48, C_MOUSEPIC);
|
|
#endif
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
#ifdef SPANISH
|
|
PrintX = CST_START - 16;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START - 16 + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START - 16 + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START - 16 + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#else
|
|
PrintX = CST_START;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#endif
|
|
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
DrawCustMouse (0);
|
|
US_Print ("\n");
|
|
|
|
|
|
//
|
|
// JOYSTICK/PAD
|
|
//
|
|
#ifndef SPEAR
|
|
SETFONTCOLOR (READCOLOR, BKGDCOLOR);
|
|
US_CPrint ("Joystick/Gravis GamePad\n");
|
|
#else
|
|
PrintY += 13;
|
|
VWB_DrawPic (40, 88, C_JOYSTICKPIC);
|
|
#endif
|
|
|
|
#ifdef SPEAR
|
|
VWB_DrawPic (112, 120, C_KEYBOARDPIC);
|
|
#endif
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
#ifdef SPANISH
|
|
PrintX = CST_START - 16;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START - 16 + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START - 16 + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START - 16 + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#else
|
|
PrintX = CST_START;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#endif
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
DrawCustJoy (0);
|
|
US_Print ("\n");
|
|
|
|
|
|
//
|
|
// KEYBOARD
|
|
//
|
|
#ifndef SPEAR
|
|
SETFONTCOLOR (READCOLOR, BKGDCOLOR);
|
|
US_CPrint ("Keyboard\n");
|
|
#else
|
|
PrintY += 13;
|
|
#endif
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
#ifdef SPANISH
|
|
PrintX = CST_START - 16;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START - 16 + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START - 16 + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START - 16 + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#else
|
|
PrintX = CST_START;
|
|
US_Print (STR_CRUN);
|
|
PrintX = CST_START + CST_SPC * 1;
|
|
US_Print (STR_COPEN);
|
|
PrintX = CST_START + CST_SPC * 2;
|
|
US_Print (STR_CFIRE);
|
|
PrintX = CST_START + CST_SPC * 3;
|
|
US_Print (STR_CSTRAFE "\n");
|
|
#endif
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
DrawCustKeybd (0);
|
|
US_Print ("\n");
|
|
|
|
|
|
//
|
|
// KEYBOARD MOVE KEYS
|
|
//
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
#ifdef SPANISH
|
|
PrintX = 4;
|
|
US_Print (STR_LEFT);
|
|
US_Print ("/");
|
|
US_Print (STR_RIGHT);
|
|
US_Print ("/");
|
|
US_Print (STR_FRWD);
|
|
US_Print ("/");
|
|
US_Print (STR_BKWD "\n");
|
|
#else
|
|
PrintX = CST_START;
|
|
US_Print (STR_LEFT);
|
|
PrintX = CST_START + CST_SPC * 1;
|
|
US_Print (STR_RIGHT);
|
|
PrintX = CST_START + CST_SPC * 2;
|
|
US_Print (STR_FRWD);
|
|
PrintX = CST_START + CST_SPC * 3;
|
|
US_Print (STR_BKWD "\n");
|
|
#endif
|
|
DrawWindow (5, PrintY - 1, 310, 13, BKGDCOLOR);
|
|
DrawCustKeys (0);
|
|
#endif
|
|
//
|
|
// PICK STARTING POINT IN MENU
|
|
//
|
|
if (CusItems.curpos < 0)
|
|
for (i = 0; i < CusItems.amount; i++)
|
|
if (CusMenu[i].active)
|
|
{
|
|
CusItems.curpos = i;
|
|
break;
|
|
}
|
|
|
|
|
|
VW_UpdateScreen ();
|
|
MenuFadeIn ();
|
|
}
|
|
|
|
|
|
void
|
|
PrintCustMouse (int i)
|
|
{
|
|
int j;
|
|
|
|
for (j = 0; j < 4; j++)
|
|
if (order[i] == buttonmouse[j])
|
|
{
|
|
PrintX = CST_START + CST_SPC * i;
|
|
US_Print (mbarray[j]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
DrawCustMouse (int hilight)
|
|
{
|
|
int i, color;
|
|
|
|
|
|
color = TEXTCOLOR;
|
|
if (hilight)
|
|
color = HIGHLIGHT;
|
|
SETFONTCOLOR (color, BKGDCOLOR);
|
|
|
|
if (!mouseenabled)
|
|
{
|
|
SETFONTCOLOR (DEACTIVE, BKGDCOLOR);
|
|
CusMenu[0].active = 0;
|
|
}
|
|
else
|
|
CusMenu[0].active = 1;
|
|
|
|
PrintY = CST_Y + 13 * 2;
|
|
for (i = 0; i < 4; i++)
|
|
PrintCustMouse (i);
|
|
}
|
|
|
|
void
|
|
PrintCustJoy (int i)
|
|
{
|
|
for (int j = 0; j < 4; j++)
|
|
{
|
|
if (order[i] == buttonjoy[j])
|
|
{
|
|
PrintX = CST_START + CST_SPC * i;
|
|
US_Print (mbarray[j]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
DrawCustJoy (int hilight)
|
|
{
|
|
int i, color;
|
|
|
|
color = TEXTCOLOR;
|
|
if (hilight)
|
|
color = HIGHLIGHT;
|
|
SETFONTCOLOR (color, BKGDCOLOR);
|
|
|
|
if (!joystickenabled)
|
|
{
|
|
SETFONTCOLOR (DEACTIVE, BKGDCOLOR);
|
|
CusMenu[3].active = 0;
|
|
}
|
|
else
|
|
CusMenu[3].active = 1;
|
|
|
|
PrintY = CST_Y + 13 * 5;
|
|
for (i = 0; i < 4; i++)
|
|
PrintCustJoy (i);
|
|
}
|
|
|
|
|
|
void
|
|
PrintCustKeybd (int i)
|
|
{
|
|
PrintX = CST_START + CST_SPC * i;
|
|
US_Print ((const char *) IN_GetScanName (buttonscan[order[i]]));
|
|
}
|
|
|
|
void
|
|
DrawCustKeybd (int hilight)
|
|
{
|
|
int i, color;
|
|
|
|
|
|
color = TEXTCOLOR;
|
|
if (hilight)
|
|
color = HIGHLIGHT;
|
|
SETFONTCOLOR (color, BKGDCOLOR);
|
|
|
|
PrintY = CST_Y + 13 * 8;
|
|
for (i = 0; i < 4; i++)
|
|
PrintCustKeybd (i);
|
|
}
|
|
|
|
void
|
|
PrintCustKeys (int i)
|
|
{
|
|
PrintX = CST_START + CST_SPC * i;
|
|
US_Print ((const char *) IN_GetScanName (dirscan[moveorder[i]]));
|
|
}
|
|
|
|
void
|
|
DrawCustKeys (int hilight)
|
|
{
|
|
int i, color;
|
|
|
|
|
|
color = TEXTCOLOR;
|
|
if (hilight)
|
|
color = HIGHLIGHT;
|
|
SETFONTCOLOR (color, BKGDCOLOR);
|
|
|
|
PrintY = CST_Y + 13 * 10;
|
|
for (i = 0; i < 4; i++)
|
|
PrintCustKeys (i);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CHANGE SCREEN VIEWING SIZE
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_ChangeView (int a)
|
|
{
|
|
int exit = 0, oldview, newview;
|
|
ControlInfo ci;
|
|
|
|
WindowX = WindowY = 0;
|
|
WindowW = 320;
|
|
WindowH = 200;
|
|
newview = oldview = viewsize;
|
|
DrawChangeView (oldview);
|
|
MenuFadeIn ();
|
|
|
|
do
|
|
{
|
|
CheckPause ();
|
|
SDL_Delay(5);
|
|
ReadAnyControl (&ci);
|
|
switch (ci.dir)
|
|
{
|
|
case dir_South:
|
|
case dir_West:
|
|
newview--;
|
|
if (newview < 4)
|
|
newview = 4;
|
|
if(newview >= 19) DrawChangeView(newview);
|
|
else ShowViewSize (newview);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (HITWALLSND);
|
|
TicDelay (10);
|
|
break;
|
|
|
|
case dir_North:
|
|
case dir_East:
|
|
newview++;
|
|
if (newview >= 21)
|
|
{
|
|
newview = 21;
|
|
DrawChangeView(newview);
|
|
}
|
|
else ShowViewSize (newview);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (HITWALLSND);
|
|
TicDelay (10);
|
|
break;
|
|
}
|
|
|
|
if (ci.button0 || Keyboard[sc_Enter])
|
|
exit = 1;
|
|
else if (ci.button1 || Keyboard[sc_Escape])
|
|
{
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
MenuFadeOut ();
|
|
if(screenHeight % 200 != 0)
|
|
VL_ClearScreen(0);
|
|
return 0;
|
|
}
|
|
}
|
|
while (!exit);
|
|
|
|
if (oldview != newview)
|
|
{
|
|
SD_PlaySound (SHOOTSND);
|
|
Message (STR_THINK "...");
|
|
NewViewSize (newview);
|
|
}
|
|
|
|
ShootSnd ();
|
|
MenuFadeOut ();
|
|
if(screenHeight % 200 != 0)
|
|
VL_ClearScreen(0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/////////////////////////////
|
|
//
|
|
// DRAW THE CHANGEVIEW SCREEN
|
|
//
|
|
void
|
|
DrawChangeView (int view)
|
|
{
|
|
int rescaledHeight = screenHeight / scaleFactor;
|
|
if(view != 21) VWB_Bar (0, rescaledHeight - 40, 320, 40, bordercol);
|
|
|
|
#ifdef JAPAN
|
|
CA_CacheScreen (S_CHANGEPIC);
|
|
|
|
ShowViewSize (view);
|
|
#else
|
|
ShowViewSize (view);
|
|
|
|
PrintY = (screenHeight / scaleFactor) - 39;
|
|
WindowX = 0;
|
|
WindowY = 320; // TODO: Check this!
|
|
SETFONTCOLOR (HIGHLIGHT, BKGDCOLOR);
|
|
|
|
US_CPrint (STR_SIZE1 "\n");
|
|
US_CPrint (STR_SIZE2 "\n");
|
|
US_CPrint (STR_SIZE3);
|
|
#endif
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// QUIT THIS INFERNAL GAME!
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
CP_Quit (int a)
|
|
{
|
|
#ifdef JAPAN
|
|
if (GetYorN (7, 11, C_QUITMSGPIC))
|
|
#else
|
|
|
|
#ifdef SPANISH
|
|
if (Confirm (ENDGAMESTR))
|
|
#else
|
|
if (Confirm (endStrings[US_RndT () & 0x7 + (US_RndT () & 1)]))
|
|
#endif
|
|
|
|
#endif
|
|
{
|
|
VW_UpdateScreen ();
|
|
SD_MusicOff ();
|
|
SD_StopSound ();
|
|
MenuFadeOut ();
|
|
Quit (NULL);
|
|
}
|
|
|
|
DrawMainMenu ();
|
|
return 0;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// HANDLE INTRO SCREEN (SYSTEM CONFIG)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
IntroScreen (void)
|
|
{
|
|
#ifdef SPEAR
|
|
|
|
#define MAINCOLOR 0x4f
|
|
#define EMSCOLOR 0x4f
|
|
#define XMSCOLOR 0x4f
|
|
|
|
#else
|
|
|
|
#define MAINCOLOR 0x6c
|
|
#define EMSCOLOR 0x6c // 0x4f
|
|
#define XMSCOLOR 0x6c // 0x7f
|
|
|
|
#endif
|
|
#define FILLCOLOR 14
|
|
|
|
// long memory;
|
|
// long emshere,xmshere;
|
|
int i;
|
|
/* int ems[10]={100,200,300,400,500,600,700,800,900,1000},
|
|
xms[10]={100,200,300,400,500,600,700,800,900,1000};
|
|
int main[10]={32,64,96,128,160,192,224,256,288,320};*/
|
|
|
|
|
|
//
|
|
// DRAW MAIN MEMORY
|
|
//
|
|
#ifdef ABCAUS
|
|
memory = (1023l + mminfo.nearheap + mminfo.farheap) / 1024l;
|
|
for (i = 0; i < 10; i++)
|
|
if (memory >= main[i])
|
|
VWB_Bar (49, 163 - 8 * i, 6, 5, MAINCOLOR - i);
|
|
|
|
//
|
|
// DRAW EMS MEMORY
|
|
//
|
|
if (EMSPresent)
|
|
{
|
|
emshere = 4l * EMSPagesAvail;
|
|
for (i = 0; i < 10; i++)
|
|
if (emshere >= ems[i])
|
|
VWB_Bar (89, 163 - 8 * i, 6, 5, EMSCOLOR - i);
|
|
}
|
|
|
|
//
|
|
// DRAW XMS MEMORY
|
|
//
|
|
if (XMSPresent)
|
|
{
|
|
xmshere = 4l * XMSPagesAvail;
|
|
for (i = 0; i < 10; i++)
|
|
if (xmshere >= xms[i])
|
|
VWB_Bar (129, 163 - 8 * i, 6, 5, XMSCOLOR - i);
|
|
}
|
|
#else
|
|
for (i = 0; i < 10; i++)
|
|
VWB_Bar (49, 163 - 8 * i, 6, 5, MAINCOLOR - i);
|
|
for (i = 0; i < 10; i++)
|
|
VWB_Bar (89, 163 - 8 * i, 6, 5, EMSCOLOR - i);
|
|
for (i = 0; i < 10; i++)
|
|
VWB_Bar (129, 163 - 8 * i, 6, 5, XMSCOLOR - i);
|
|
#endif
|
|
|
|
|
|
//
|
|
// FILL BOXES
|
|
//
|
|
if (MousePresent)
|
|
VWB_Bar (164, 82, 12, 2, FILLCOLOR);
|
|
|
|
if (IN_JoyPresent())
|
|
VWB_Bar (164, 105, 12, 2, FILLCOLOR);
|
|
|
|
if (AdLibPresent && !SoundBlasterPresent)
|
|
VWB_Bar (164, 128, 12, 2, FILLCOLOR);
|
|
|
|
if (SoundBlasterPresent)
|
|
VWB_Bar (164, 151, 12, 2, FILLCOLOR);
|
|
|
|
// if (SoundSourcePresent)
|
|
// VWB_Bar (164, 174, 12, 2, FILLCOLOR);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SUPPORT ROUTINES
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Clear Menu screens to dark red
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
ClearMScreen (void)
|
|
{
|
|
#ifndef SPEAR
|
|
VWB_Bar (0, 0, 320, 200, BORDCOLOR);
|
|
#else
|
|
VWB_DrawPic (0, 0, C_BACKDROPPIC);
|
|
#endif
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Un/Cache a LUMP of graphics
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
CacheLump (int lumpstart, int lumpend)
|
|
{
|
|
int i;
|
|
|
|
for (i = lumpstart; i <= lumpend; i++)
|
|
CA_CacheGrChunk (i);
|
|
}
|
|
|
|
|
|
void
|
|
UnCacheLump (int lumpstart, int lumpend)
|
|
{
|
|
int i;
|
|
|
|
for (i = lumpstart; i <= lumpend; i++)
|
|
if (grsegs[i])
|
|
UNCACHEGRCHUNK (i);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Draw a window for a menu
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
DrawWindow (int x, int y, int w, int h, int wcolor)
|
|
{
|
|
VWB_Bar (x, y, w, h, wcolor);
|
|
DrawOutline (x, y, w, h, BORD2COLOR, DEACTIVE);
|
|
}
|
|
|
|
|
|
void
|
|
DrawOutline (int x, int y, int w, int h, int color1, int color2)
|
|
{
|
|
VWB_Hlin (x, x + w, y, color2);
|
|
VWB_Vlin (y, y + h, x, color2);
|
|
VWB_Hlin (x, x + w, y + h, color1);
|
|
VWB_Vlin (y, y + h, x + w, color1);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Setup Control Panel stuff - graphics, etc.
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
SetupControlPanel (void)
|
|
{
|
|
//
|
|
// CACHE GRAPHICS & SOUNDS
|
|
//
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
#ifndef SPEAR
|
|
CacheLump (CONTROLS_LUMP_START, CONTROLS_LUMP_END);
|
|
#else
|
|
CacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
#endif
|
|
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
fontnumber = 1;
|
|
WindowH = 200;
|
|
if(screenHeight % 200 != 0)
|
|
VL_ClearScreen(0);
|
|
|
|
if (!ingame)
|
|
CA_LoadAllSounds ();
|
|
else
|
|
MainMenu[savegame].active = 1;
|
|
|
|
//
|
|
// CENTER MOUSE
|
|
//
|
|
if(IN_IsInputGrabbed())
|
|
IN_CenterMouse();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SEE WHICH SAVE GAME FILES ARE AVAILABLE & READ STRING IN
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void SetupSaveGames()
|
|
{
|
|
char name[13];
|
|
char savepath[300];
|
|
|
|
strcpy(name, SaveName);
|
|
for(int i = 0; i < 10; i++)
|
|
{
|
|
name[7] = '0' + i;
|
|
#ifdef _arch_dreamcast
|
|
// Try to unpack file
|
|
if(DC_LoadFromVMU(name))
|
|
{
|
|
#endif
|
|
if(configdir[0])
|
|
snprintf(savepath, sizeof(savepath), "%s/%s", configdir, name);
|
|
else
|
|
strcpy(savepath, name);
|
|
|
|
const int handle = open(savepath, O_RDONLY | O_BINARY);
|
|
if(handle >= 0)
|
|
{
|
|
char temp[32];
|
|
|
|
SaveGamesAvail[i] = 1;
|
|
read(handle, temp, 32);
|
|
close(handle);
|
|
strcpy(&SaveGameNames[i][0], temp);
|
|
}
|
|
#ifdef _arch_dreamcast
|
|
// Remove unpacked version of file
|
|
fs_unlink(name);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Clean up all the Control Panel stuff
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
CleanupControlPanel (void)
|
|
{
|
|
#ifndef SPEAR
|
|
UnCacheLump (CONTROLS_LUMP_START, CONTROLS_LUMP_END);
|
|
#else
|
|
UnCacheLump (BACKDROP_LUMP_START, BACKDROP_LUMP_END);
|
|
#endif
|
|
|
|
fontnumber = 0;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Handle moving gun around a menu
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
HandleMenu (CP_iteminfo * item_i, CP_itemtype * items, void (*routine) (int w))
|
|
{
|
|
char key;
|
|
static int redrawitem = 1, lastitem = -1;
|
|
int i, x, y, basey, exit, which, shape;
|
|
int32_t lastBlinkTime, timer;
|
|
ControlInfo ci;
|
|
|
|
|
|
which = item_i->curpos;
|
|
x = item_i->x & -8;
|
|
basey = item_i->y - 2;
|
|
y = basey + which * 13;
|
|
|
|
VWB_DrawPic (x, y, C_CURSOR1PIC);
|
|
SetTextColor (items + which, 1);
|
|
if (redrawitem)
|
|
{
|
|
PrintX = item_i->x + item_i->indent;
|
|
PrintY = item_i->y + which * 13;
|
|
US_Print ((items + which)->string);
|
|
}
|
|
//
|
|
// CALL CUSTOM ROUTINE IF IT IS NEEDED
|
|
//
|
|
if (routine)
|
|
routine (which);
|
|
VW_UpdateScreen ();
|
|
|
|
shape = C_CURSOR1PIC;
|
|
timer = 8;
|
|
exit = 0;
|
|
lastBlinkTime = GetTimeCount ();
|
|
IN_ClearKeysDown ();
|
|
|
|
|
|
do
|
|
{
|
|
//
|
|
// CHANGE GUN SHAPE
|
|
//
|
|
if ((int32_t)GetTimeCount () - lastBlinkTime > timer)
|
|
{
|
|
lastBlinkTime = GetTimeCount ();
|
|
if (shape == C_CURSOR1PIC)
|
|
{
|
|
shape = C_CURSOR2PIC;
|
|
timer = 8;
|
|
}
|
|
else
|
|
{
|
|
shape = C_CURSOR1PIC;
|
|
timer = 70;
|
|
}
|
|
VWB_DrawPic (x, y, shape);
|
|
if (routine)
|
|
routine (which);
|
|
VW_UpdateScreen ();
|
|
}
|
|
else SDL_Delay(5);
|
|
|
|
CheckPause ();
|
|
|
|
//
|
|
// SEE IF ANY KEYS ARE PRESSED FOR INITIAL CHAR FINDING
|
|
//
|
|
key = LastASCII;
|
|
if (key)
|
|
{
|
|
int ok = 0;
|
|
|
|
if (key >= 'a')
|
|
key -= 'a' - 'A';
|
|
|
|
for (i = which + 1; i < item_i->amount; i++)
|
|
if ((items + i)->active && (items + i)->string[0] == key)
|
|
{
|
|
EraseGun (item_i, items, x, y, which);
|
|
which = i;
|
|
DrawGun (item_i, items, x, &y, which, basey, routine);
|
|
ok = 1;
|
|
IN_ClearKeysDown ();
|
|
break;
|
|
}
|
|
|
|
//
|
|
// DIDN'T FIND A MATCH FIRST TIME THRU. CHECK AGAIN.
|
|
//
|
|
if (!ok)
|
|
{
|
|
for (i = 0; i < which; i++)
|
|
if ((items + i)->active && (items + i)->string[0] == key)
|
|
{
|
|
EraseGun (item_i, items, x, y, which);
|
|
which = i;
|
|
DrawGun (item_i, items, x, &y, which, basey, routine);
|
|
IN_ClearKeysDown ();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// GET INPUT
|
|
//
|
|
ReadAnyControl (&ci);
|
|
switch (ci.dir)
|
|
{
|
|
////////////////////////////////////////////////
|
|
//
|
|
// MOVE UP
|
|
//
|
|
case dir_North:
|
|
|
|
EraseGun (item_i, items, x, y, which);
|
|
|
|
//
|
|
// ANIMATE HALF-STEP
|
|
//
|
|
if (which && (items + which - 1)->active)
|
|
{
|
|
y -= 6;
|
|
DrawHalfStep (x, y);
|
|
}
|
|
|
|
//
|
|
// MOVE TO NEXT AVAILABLE SPOT
|
|
//
|
|
do
|
|
{
|
|
if (!which)
|
|
which = item_i->amount - 1;
|
|
else
|
|
which--;
|
|
}
|
|
while (!(items + which)->active);
|
|
|
|
DrawGun (item_i, items, x, &y, which, basey, routine);
|
|
//
|
|
// WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
|
|
//
|
|
TicDelay (20);
|
|
break;
|
|
|
|
////////////////////////////////////////////////
|
|
//
|
|
// MOVE DOWN
|
|
//
|
|
case dir_South:
|
|
|
|
EraseGun (item_i, items, x, y, which);
|
|
//
|
|
// ANIMATE HALF-STEP
|
|
//
|
|
if (which != item_i->amount - 1 && (items + which + 1)->active)
|
|
{
|
|
y += 6;
|
|
DrawHalfStep (x, y);
|
|
}
|
|
|
|
do
|
|
{
|
|
if (which == item_i->amount - 1)
|
|
which = 0;
|
|
else
|
|
which++;
|
|
}
|
|
while (!(items + which)->active);
|
|
|
|
DrawGun (item_i, items, x, &y, which, basey, routine);
|
|
|
|
//
|
|
// WAIT FOR BUTTON-UP OR DELAY NEXT MOVE
|
|
//
|
|
TicDelay (20);
|
|
break;
|
|
}
|
|
|
|
if (ci.button0 || Keyboard[sc_Space] || Keyboard[sc_Enter])
|
|
exit = 1;
|
|
|
|
if (ci.button1 && !Keyboard[sc_Alt] || Keyboard[sc_Escape])
|
|
exit = 2;
|
|
|
|
}
|
|
while (!exit);
|
|
|
|
|
|
IN_ClearKeysDown ();
|
|
|
|
//
|
|
// ERASE EVERYTHING
|
|
//
|
|
if (lastitem != which)
|
|
{
|
|
VWB_Bar (x - 1, y, 25, 16, BKGDCOLOR);
|
|
PrintX = item_i->x + item_i->indent;
|
|
PrintY = item_i->y + which * 13;
|
|
US_Print ((items + which)->string);
|
|
redrawitem = 1;
|
|
}
|
|
else
|
|
redrawitem = 0;
|
|
|
|
if (routine)
|
|
routine (which);
|
|
VW_UpdateScreen ();
|
|
|
|
item_i->curpos = which;
|
|
|
|
lastitem = which;
|
|
switch (exit)
|
|
{
|
|
case 1:
|
|
//
|
|
// CALL THE ROUTINE
|
|
//
|
|
if ((items + which)->routine != NULL)
|
|
{
|
|
ShootSnd ();
|
|
MenuFadeOut ();
|
|
(items + which)->routine (0);
|
|
}
|
|
return which;
|
|
|
|
case 2:
|
|
SD_PlaySound (ESCPRESSEDSND);
|
|
return -1;
|
|
}
|
|
|
|
return 0; // JUST TO SHUT UP THE ERROR MESSAGES!
|
|
}
|
|
|
|
|
|
//
|
|
// ERASE GUN & DE-HIGHLIGHT STRING
|
|
//
|
|
void
|
|
EraseGun (CP_iteminfo * item_i, CP_itemtype * items, int x, int y, int which)
|
|
{
|
|
VWB_Bar (x - 1, y, 25, 16, BKGDCOLOR);
|
|
SetTextColor (items + which, 0);
|
|
|
|
PrintX = item_i->x + item_i->indent;
|
|
PrintY = item_i->y + which * 13;
|
|
US_Print ((items + which)->string);
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
|
|
//
|
|
// DRAW HALF STEP OF GUN TO NEXT POSITION
|
|
//
|
|
void
|
|
DrawHalfStep (int x, int y)
|
|
{
|
|
VWB_DrawPic (x, y, C_CURSOR1PIC);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (MOVEGUN1SND);
|
|
SDL_Delay (8 * 100 / 7);
|
|
}
|
|
|
|
|
|
//
|
|
// DRAW GUN AT NEW POSITION
|
|
//
|
|
void
|
|
DrawGun (CP_iteminfo * item_i, CP_itemtype * items, int x, int *y, int which, int basey,
|
|
void (*routine) (int w))
|
|
{
|
|
VWB_Bar (x - 1, *y, 25, 16, BKGDCOLOR);
|
|
*y = basey + which * 13;
|
|
VWB_DrawPic (x, *y, C_CURSOR1PIC);
|
|
SetTextColor (items + which, 1);
|
|
|
|
PrintX = item_i->x + item_i->indent;
|
|
PrintY = item_i->y + which * 13;
|
|
US_Print ((items + which)->string);
|
|
|
|
//
|
|
// CALL CUSTOM ROUTINE IF IT IS NEEDED
|
|
//
|
|
if (routine)
|
|
routine (which);
|
|
VW_UpdateScreen ();
|
|
SD_PlaySound (MOVEGUN2SND);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DELAY FOR AN AMOUNT OF TICS OR UNTIL CONTROLS ARE INACTIVE
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
TicDelay (int count)
|
|
{
|
|
ControlInfo ci;
|
|
|
|
int32_t startTime = GetTimeCount ();
|
|
do
|
|
{
|
|
SDL_Delay(5);
|
|
ReadAnyControl (&ci);
|
|
}
|
|
while ((int32_t) GetTimeCount () - startTime < count && ci.dir != dir_None);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Draw a menu
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
DrawMenu (CP_iteminfo * item_i, CP_itemtype * items)
|
|
{
|
|
int i, which = item_i->curpos;
|
|
|
|
|
|
WindowX = PrintX = item_i->x + item_i->indent;
|
|
WindowY = PrintY = item_i->y;
|
|
WindowW = 320;
|
|
WindowH = 200;
|
|
|
|
for (i = 0; i < item_i->amount; i++)
|
|
{
|
|
SetTextColor (items + i, which == i);
|
|
|
|
PrintY = item_i->y + i * 13;
|
|
if ((items + i)->active)
|
|
US_Print ((items + i)->string);
|
|
else
|
|
{
|
|
SETFONTCOLOR (DEACTIVE, BKGDCOLOR);
|
|
US_Print ((items + i)->string);
|
|
SETFONTCOLOR (TEXTCOLOR, BKGDCOLOR);
|
|
}
|
|
|
|
US_Print ("\n");
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// SET TEXT COLOR (HIGHLIGHT OR NO)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
SetTextColor (CP_itemtype * items, int hlight)
|
|
{
|
|
if (hlight)
|
|
{
|
|
SETFONTCOLOR (color_hlite[items->active], BKGDCOLOR);
|
|
}
|
|
else
|
|
{
|
|
SETFONTCOLOR (color_norml[items->active], BKGDCOLOR);
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// WAIT FOR CTRLKEY-UP OR BUTTON-UP
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
WaitKeyUp (void)
|
|
{
|
|
ControlInfo ci;
|
|
while (ReadAnyControl (&ci), ci.button0 |
|
|
ci.button1 |
|
|
ci.button2 | ci.button3 | Keyboard[sc_Space] | Keyboard[sc_Enter] | Keyboard[sc_Escape])
|
|
{
|
|
IN_WaitAndProcessEvents();
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// READ KEYBOARD, JOYSTICK AND MOUSE FOR INPUT
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
ReadAnyControl (ControlInfo * ci)
|
|
{
|
|
int mouseactive = 0;
|
|
|
|
IN_ReadControl (0, ci);
|
|
#if 0
|
|
if (mouseenabled && IN_IsInputGrabbed())
|
|
{
|
|
int mousex, mousey, buttons;
|
|
buttons = SDL_GetMouseState(&mousex, &mousey);
|
|
int middlePressed = buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE);
|
|
int rightPressed = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT);
|
|
buttons &= ~(SDL_BUTTON(SDL_BUTTON_MIDDLE) | SDL_BUTTON(SDL_BUTTON_RIGHT));
|
|
if(middlePressed) buttons |= 1 << 2;
|
|
if(rightPressed) buttons |= 1 << 1;
|
|
|
|
if(mousey - CENTERY < -SENSITIVE)
|
|
{
|
|
ci->dir = dir_North;
|
|
mouseactive = 1;
|
|
}
|
|
else if(mousey - CENTERY > SENSITIVE)
|
|
{
|
|
ci->dir = dir_South;
|
|
mouseactive = 1;
|
|
}
|
|
|
|
if(mousex - CENTERX < -SENSITIVE)
|
|
{
|
|
ci->dir = dir_West;
|
|
mouseactive = 1;
|
|
}
|
|
else if(mousex - CENTERX > SENSITIVE)
|
|
{
|
|
ci->dir = dir_East;
|
|
mouseactive = 1;
|
|
}
|
|
|
|
if(mouseactive)
|
|
IN_CenterMouse();
|
|
|
|
if (buttons)
|
|
{
|
|
ci->button0 = buttons & 1;
|
|
ci->button1 = buttons & 2;
|
|
ci->button2 = buttons & 4;
|
|
ci->button3 = false;
|
|
mouseactive = 1;
|
|
}
|
|
}
|
|
|
|
if (joystickenabled && !mouseactive)
|
|
{
|
|
int jx, jy, jb;
|
|
|
|
IN_GetJoyDelta (&jx, &jy);
|
|
if (jy < -SENSITIVE)
|
|
ci->dir = dir_North;
|
|
else if (jy > SENSITIVE)
|
|
ci->dir = dir_South;
|
|
|
|
if (jx < -SENSITIVE)
|
|
ci->dir = dir_West;
|
|
else if (jx > SENSITIVE)
|
|
ci->dir = dir_East;
|
|
|
|
jb = IN_JoyButtons ();
|
|
if (jb)
|
|
{
|
|
ci->button0 = jb & 1;
|
|
ci->button1 = jb & 2;
|
|
ci->button2 = jb & 4;
|
|
ci->button3 = jb & 8;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DRAW DIALOG AND CONFIRM YES OR NO TO QUESTION
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
Confirm (const char *string)
|
|
{
|
|
int xit = 0, x, y, tick = 0, lastBlinkTime;
|
|
int whichsnd[2] = { ESCPRESSEDSND, SHOOTSND };
|
|
ControlInfo ci;
|
|
|
|
Message (string);
|
|
IN_ClearKeysDown ();
|
|
WaitKeyUp ();
|
|
|
|
//
|
|
// BLINK CURSOR
|
|
//
|
|
x = PrintX;
|
|
y = PrintY;
|
|
lastBlinkTime = GetTimeCount();
|
|
|
|
do
|
|
{
|
|
ReadAnyControl(&ci);
|
|
|
|
if (GetTimeCount() - lastBlinkTime >= 10)
|
|
{
|
|
switch (tick)
|
|
{
|
|
case 0:
|
|
VWB_Bar (x, y, 8, 13, TEXTCOLOR);
|
|
break;
|
|
case 1:
|
|
PrintX = x;
|
|
PrintY = y;
|
|
US_Print ("_");
|
|
}
|
|
VW_UpdateScreen ();
|
|
tick ^= 1;
|
|
lastBlinkTime = GetTimeCount();
|
|
}
|
|
else SDL_Delay(5);
|
|
|
|
#ifdef SPANISH
|
|
}
|
|
while (!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
|
|
#else
|
|
}
|
|
while (!Keyboard[sc_Return] && !Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape] && !ci.button0 && !ci.button1);
|
|
#endif
|
|
|
|
#ifdef SPANISH
|
|
if (Keyboard[sc_S] || ci.button0)
|
|
{
|
|
xit = 1;
|
|
ShootSnd ();
|
|
}
|
|
#else
|
|
if (Keyboard[sc_Y] || Keyboard[sc_Return] || ci.button0)
|
|
{
|
|
xit = 1;
|
|
ShootSnd ();
|
|
}
|
|
#endif
|
|
|
|
IN_ClearKeysDown ();
|
|
WaitKeyUp ();
|
|
|
|
SD_PlaySound ((soundnames) whichsnd[xit]);
|
|
|
|
return xit;
|
|
}
|
|
|
|
#ifdef JAPAN
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DRAW MESSAGE & GET Y OR N
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
int
|
|
GetYorN (int x, int y, int pic)
|
|
{
|
|
int xit = 0, whichsnd[2] = { ESCPRESSEDSND, SHOOTSND };
|
|
|
|
|
|
CA_CacheGrChunk (pic);
|
|
VWB_DrawPic (x * 8, y * 8, pic);
|
|
UNCACHEGRCHUNK (pic);
|
|
VW_UpdateScreen ();
|
|
IN_ClearKeysDown ();
|
|
|
|
do
|
|
{
|
|
IN_WaitAndProcessEvents();
|
|
#ifndef SPEAR
|
|
if (Keyboard[sc_Tab] && Keyboard[sc_P] && param_debugmode)
|
|
PicturePause ();
|
|
#endif
|
|
|
|
#ifdef SPANISH
|
|
}
|
|
while (!Keyboard[sc_S] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
|
|
#else
|
|
}
|
|
while (!Keyboard[sc_Y] && !Keyboard[sc_N] && !Keyboard[sc_Escape]);
|
|
#endif
|
|
|
|
#ifdef SPANISH
|
|
if (Keyboard[sc_S])
|
|
{
|
|
xit = 1;
|
|
ShootSnd ();
|
|
}
|
|
|
|
while (Keyboard[sc_S] || Keyboard[sc_N] || Keyboard[sc_Escape])
|
|
IN_WaitAndProcessEvents();
|
|
|
|
#else
|
|
|
|
if (Keyboard[sc_Y])
|
|
{
|
|
xit = 1;
|
|
ShootSnd ();
|
|
}
|
|
|
|
while (Keyboard[sc_Y] || Keyboard[sc_N] || Keyboard[sc_Escape])
|
|
IN_WaitAndProcessEvents();
|
|
#endif
|
|
|
|
IN_ClearKeysDown ();
|
|
SD_PlaySound (whichsnd[xit]);
|
|
return xit;
|
|
}
|
|
#endif
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PRINT A MESSAGE IN A WINDOW
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
void
|
|
Message (const char *string)
|
|
{
|
|
int h = 0, w = 0, mw = 0, i, len = (int) strlen(string);
|
|
fontstruct *font;
|
|
|
|
|
|
CA_CacheGrChunk (STARTFONT + 1);
|
|
fontnumber = 1;
|
|
font = (fontstruct *) grsegs[STARTFONT + fontnumber];
|
|
h = font->height;
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if (string[i] == '\n')
|
|
{
|
|
if (w > mw)
|
|
mw = w;
|
|
w = 0;
|
|
h += font->height;
|
|
}
|
|
else
|
|
w += font->width[string[i]];
|
|
}
|
|
|
|
if (w + 10 > mw)
|
|
mw = w + 10;
|
|
|
|
PrintY = (WindowH / 2) - h / 2;
|
|
PrintX = WindowX = 160 - mw / 2;
|
|
|
|
DrawWindow (WindowX - 5, PrintY - 5, mw + 10, h + 10, TEXTCOLOR);
|
|
DrawOutline (WindowX - 5, PrintY - 5, mw + 10, h + 10, 0, HIGHLIGHT);
|
|
SETFONTCOLOR (0, TEXTCOLOR);
|
|
US_Print (string);
|
|
VW_UpdateScreen ();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// THIS MAY BE FIXED A LITTLE LATER...
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
static int lastmusic;
|
|
|
|
int
|
|
StartCPMusic (int song)
|
|
{
|
|
int lastoffs;
|
|
|
|
lastmusic = song;
|
|
lastoffs = SD_MusicOff ();
|
|
UNCACHEAUDIOCHUNK (STARTMUSIC + lastmusic);
|
|
|
|
SD_StartMusic(STARTMUSIC + song);
|
|
return lastoffs;
|
|
}
|
|
|
|
void
|
|
FreeMusic (void)
|
|
{
|
|
UNCACHEAUDIOCHUNK (STARTMUSIC + lastmusic);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// IN_GetScanName() - Returns a string containing the name of the
|
|
// specified scan code
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
const char *
|
|
IN_GetScanName (ScanCode scan)
|
|
{
|
|
/* const char **p;
|
|
ScanCode *s;
|
|
|
|
for (s = ExtScanCodes, p = ExtScanNames; *s; p++, s++)
|
|
if (*s == scan)
|
|
return (*p);*/
|
|
|
|
return (ScanNames[scan]);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CHECK FOR PAUSE KEY (FOR MUSIC ONLY)
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
void
|
|
CheckPause (void)
|
|
{
|
|
if (Paused)
|
|
{
|
|
switch (SoundStatus)
|
|
{
|
|
case 0:
|
|
SD_MusicOn ();
|
|
break;
|
|
case 1:
|
|
SD_MusicOff ();
|
|
break;
|
|
}
|
|
|
|
SoundStatus ^= 1;
|
|
VW_WaitVBL (3);
|
|
IN_ClearKeysDown ();
|
|
Paused = false;
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DRAW GUN CURSOR AT CORRECT POSITION IN MENU
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
void
|
|
DrawMenuGun (CP_iteminfo * iteminfo)
|
|
{
|
|
int x, y;
|
|
|
|
|
|
x = iteminfo->x;
|
|
y = iteminfo->y + iteminfo->curpos * 13 - 2;
|
|
VWB_DrawPic (x, y, C_CURSOR1PIC);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// DRAW SCREEN TITLE STRIPES
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
void
|
|
DrawStripes (int y)
|
|
{
|
|
#ifndef SPEAR
|
|
VWB_Bar (0, y, 320, 24, 0);
|
|
VWB_Hlin (0, 319, y + 22, STRIPE);
|
|
#else
|
|
VWB_Bar (0, y, 320, 22, 0);
|
|
VWB_Hlin (0, 319, y + 23, 0);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
ShootSnd (void)
|
|
{
|
|
SD_PlaySound (SHOOTSND);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CHECK FOR EPISODES
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
|
|
#define stat my_stat
|
|
void *my_stat(const char *path, int *buf)
|
|
{
|
|
if(rb->file_exists(path))
|
|
return NULL;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
void
|
|
CheckForEpisodes (void)
|
|
{
|
|
int statbuf;
|
|
|
|
// On Linux like systems, the configdir defaults to $HOME/.wolf4sdl
|
|
#if !defined(_WIN32) && !defined(_arch_dreamcast)
|
|
if(configdir[0] == 0)
|
|
{
|
|
// Set config location to home directory for multi-user support
|
|
char *homedir = "/";
|
|
if(homedir == NULL)
|
|
{
|
|
Quit("Your $HOME directory is not defined. You must set this before playing.");
|
|
}
|
|
#define WOLFDIR "/.wolf4sdl"
|
|
if(strlen(homedir) + sizeof(WOLFDIR) > sizeof(configdir))
|
|
{
|
|
Quit("Your $HOME directory path is too long. It cannot be used for saving games.");
|
|
}
|
|
snprintf(configdir, sizeof(configdir), "%s" WOLFDIR, homedir);
|
|
}
|
|
#endif
|
|
|
|
if(configdir[0] != 0)
|
|
{
|
|
// Ensure config directory exists and create if necessary
|
|
if(stat(configdir, &statbuf) != 0)
|
|
{
|
|
#ifdef _WIN32
|
|
if(_mkdir(configdir) != 0)
|
|
#else
|
|
if(mkdir(configdir) != 0)
|
|
#endif
|
|
{
|
|
Quit("The configuration directory \"%s\" could not be created.", configdir);
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// JAPANESE VERSION
|
|
//
|
|
#ifdef JAPAN
|
|
#ifdef JAPDEMO
|
|
if(!stat(DATADIR "vswap.wj1", &statbuf))
|
|
{
|
|
strcpy (extension, "wj1");
|
|
numEpisodesMissing = 5;
|
|
#else
|
|
if(!stat(DATADIR "vswap.wj6", &statbuf))
|
|
{
|
|
strcpy (extension, "wj6");
|
|
#endif
|
|
strcat (configname, extension);
|
|
strcat (SaveName, extension);
|
|
strcat (demoname, extension);
|
|
EpisodeSelect[1] =
|
|
EpisodeSelect[2] = EpisodeSelect[3] = EpisodeSelect[4] = EpisodeSelect[5] = 1;
|
|
}
|
|
else
|
|
Quit ("NO JAPANESE WOLFENSTEIN 3-D DATA FILES to be found!");
|
|
#else
|
|
|
|
//
|
|
// ENGLISH
|
|
//
|
|
#ifdef UPLOAD
|
|
if(!stat(DATADIR "vswap.wl1", &statbuf))
|
|
{
|
|
strcpy (extension, "wl1");
|
|
numEpisodesMissing = 5;
|
|
}
|
|
else
|
|
Quit ("NO WOLFENSTEIN 3-D DATA FILES to be found! %s", DATADIR"vswap.wl1");
|
|
#else
|
|
#ifndef SPEAR
|
|
if(!stat(DATADIR "vswap.wl6", &statbuf))
|
|
{
|
|
strcpy (extension, "wl6");
|
|
NewEmenu[2].active =
|
|
NewEmenu[4].active =
|
|
NewEmenu[6].active =
|
|
NewEmenu[8].active =
|
|
NewEmenu[10].active =
|
|
EpisodeSelect[1] =
|
|
EpisodeSelect[2] = EpisodeSelect[3] = EpisodeSelect[4] = EpisodeSelect[5] = 1;
|
|
}
|
|
else
|
|
{
|
|
if(!stat(DATADIR "vswap.wl3", &statbuf))
|
|
{
|
|
strcpy (extension, "wl3");
|
|
numEpisodesMissing = 3;
|
|
NewEmenu[2].active = NewEmenu[4].active = EpisodeSelect[1] = EpisodeSelect[2] = 1;
|
|
}
|
|
else
|
|
{
|
|
if(!stat(DATADIR "vswap.wl1", &statbuf))
|
|
{
|
|
strcpy (extension, "wl1");
|
|
numEpisodesMissing = 5;
|
|
}
|
|
else
|
|
Quit ("NO WOLFENSTEIN 3-D DATA FILES to be found!"DATADIR"vswap.wl[6,3,1]");
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef SPEAR
|
|
#ifndef SPEARDEMO
|
|
if(param_mission == 0)
|
|
{
|
|
if(!stat(DATADIR "vswap.sod", &statbuf))
|
|
strcpy (extension, "sod");
|
|
else
|
|
Quit ("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
|
|
}
|
|
else if(param_mission == 1)
|
|
{
|
|
if(!stat(DATADIR "vswap.sd1", &statbuf))
|
|
strcpy (extension, "sd1");
|
|
else
|
|
Quit ("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
|
|
}
|
|
else if(param_mission == 2)
|
|
{
|
|
if(!stat(DATADIR "vswap.sd2", &statbuf))
|
|
strcpy (extension, "sd2");
|
|
else
|
|
Quit ("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
|
|
}
|
|
else if(param_mission == 3)
|
|
{
|
|
if(!stat(DATADIR "vswap.sd3", &statbuf))
|
|
strcpy (extension, "sd3");
|
|
else
|
|
Quit ("NO SPEAR OF DESTINY DATA FILES TO BE FOUND!");
|
|
}
|
|
else
|
|
Quit ("UNSUPPORTED MISSION!");
|
|
strcpy (graphext, "sod");
|
|
strcpy (audioext, "sod");
|
|
#else
|
|
if(!stat(DATADIR "vswap.sdm", &statbuf))
|
|
{
|
|
strcpy (extension, "sdm");
|
|
}
|
|
else
|
|
Quit ("NO SPEAR OF DESTINY DEMO DATA FILES TO BE FOUND!");
|
|
strcpy (graphext, "sdm");
|
|
strcpy (audioext, "sdm");
|
|
#endif
|
|
#else
|
|
strcpy (graphext, extension);
|
|
strcpy (audioext, extension);
|
|
#endif
|
|
|
|
strcat (configname, extension);
|
|
strcat (SaveName, extension);
|
|
strcat (demoname, extension);
|
|
|
|
#ifndef SPEAR
|
|
#ifndef GOODTIMES
|
|
strcat (helpfilename, extension);
|
|
#endif
|
|
strcat (endfilename, extension);
|
|
#endif
|
|
#endif
|
|
}
|