482 lines
11 KiB
C
482 lines
11 KiB
C
/*
|
|
* inGameOp.c
|
|
* ingame options screen.
|
|
* Pumpkin Studios. 98
|
|
*/
|
|
|
|
#include "frame.h"
|
|
#include "widget.h"
|
|
#include "display3d.h"
|
|
#include "intdisplay.h"
|
|
#include "hci.h" // for wFont def.& intmode.
|
|
#include "loop.h"
|
|
#include "text.h"
|
|
#include "piestate.h" // for getrendertype
|
|
#include "resource.h"
|
|
//#include "display.h" // for gammaValue.
|
|
#include "frontend.h" // for textdisplay function
|
|
#include "loadsave.h" // for textdisplay function
|
|
#include "console.h" // to add console message
|
|
|
|
#include "scriptextern.h" // for tutorial
|
|
#include "rendmode.h"
|
|
#include "keybind.h"
|
|
|
|
#include "audio.h" // for sound.
|
|
|
|
#include "cdaudio.h"
|
|
#include "mixer.h"
|
|
#include "multiplay.h"
|
|
|
|
|
|
#include "csnap.h"
|
|
#include "ingameop.h"
|
|
#include "mission.h"
|
|
#include "transporter.h"
|
|
#include "netplay.h"
|
|
|
|
|
|
extern char SaveGamePath[];
|
|
|
|
//extern W_SCREEN *psWScreen;
|
|
extern CURSORSNAP InterfaceSnap;
|
|
extern void addText(int FontID,UDWORD FormID,UDWORD id, UDWORD PosX, UDWORD PosY, STRING *txt, UDWORD attachID,BOOL *State);
|
|
|
|
//status bools.(for hci.h)
|
|
BOOL ClosingInGameOp = FALSE;
|
|
BOOL InGameOpUp = FALSE;
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
// functions
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
void AddMaxStringWidth(STR_RES *psRes, UDWORD StringID);
|
|
UDWORD GetMaxStringWidth(void);
|
|
void ResetMaxStringWidth(void);
|
|
|
|
|
|
|
|
static BOOL addQuitOptions(VOID)
|
|
{
|
|
W_FORMINIT sFormInit;
|
|
// UWORD WindowWidth;
|
|
|
|
DisableCursorSnapsExcept(INTINGAMEOP);
|
|
|
|
if (widgGetFromID(psWScreen,INTINGAMEOP))
|
|
{
|
|
widgDelete(psWScreen, INTINGAMEOP); // get rid of the old stuff.
|
|
}
|
|
|
|
memset(&sFormInit,0, sizeof(W_FORMINIT));
|
|
|
|
|
|
sFormInit.width = INTINGAMEOP3_W;
|
|
|
|
// add form
|
|
sFormInit.formID = 0;
|
|
sFormInit.id = INTINGAMEOP;
|
|
sFormInit.style = WFORM_PLAIN;
|
|
sFormInit.x = (SWORD)INTINGAMEOP3_X;
|
|
sFormInit.y = (SWORD)INTINGAMEOP3_Y;
|
|
sFormInit.height = INTINGAMEOP3_H;
|
|
|
|
sFormInit.pDisplay = intOpenPlainForm;
|
|
sFormInit.disableChildren= TRUE;
|
|
|
|
widgAddForm(psWScreen, &sFormInit);
|
|
|
|
//resume
|
|
addIGTextButton(INTINGAMEOP_RESUME,INTINGAMEOP_1_Y,STR_GAME_RESUME,OPALIGN);
|
|
|
|
|
|
SetCurrentSnapID(&InterfaceSnap,INTINGAMEOP_RESUME);
|
|
|
|
// quit
|
|
addIGTextButton(INTINGAMEOP_QUIT_CONFIRM,INTINGAMEOP_2_Y,STR_GAME_QUIT,OPALIGN);
|
|
|
|
SetMousePos(0,INTINGAMEOP3_X+INTINGAMEOP_1_X,INTINGAMEOP3_Y+INTINGAMEOP_1_Y); // move mouse to resume.
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static BOOL _addSlideOptions()
|
|
{
|
|
W_FORMINIT sFormInit;
|
|
|
|
DisableCursorSnapsExcept(INTINGAMEOP);
|
|
|
|
if (widgGetFromID(psWScreen,INTINGAMEOP))
|
|
{
|
|
widgDelete(psWScreen, INTINGAMEOP); // get rid of the old stuff.
|
|
}
|
|
|
|
memset(&sFormInit,0, sizeof(W_FORMINIT));
|
|
|
|
|
|
// add form
|
|
sFormInit.formID = 0;
|
|
sFormInit.id = INTINGAMEOP;
|
|
sFormInit.style = WFORM_PLAIN;
|
|
sFormInit.x = (SWORD)INTINGAMEOP2_X;
|
|
sFormInit.y = (SWORD)INTINGAMEOP2_Y;
|
|
sFormInit.width = INTINGAMEOP2_W;
|
|
sFormInit.height = INTINGAMEOP2_H;
|
|
|
|
sFormInit.pDisplay = intOpenPlainForm;
|
|
sFormInit.disableChildren= TRUE;
|
|
|
|
widgAddForm(psWScreen, &sFormInit);
|
|
|
|
|
|
|
|
|
|
addIGTextButton(INTINGAMEOP_RESUME,INTINGAMEOP_4_Y,STR_GAME_RESUME,WBUT_PLAIN);
|
|
|
|
// fx vol
|
|
addIGTextButton(INTINGAMEOP_FXVOL,INTINGAMEOP_1_Y,STR_FE_FX,WBUT_PLAIN);
|
|
addFESlider(INTINGAMEOP_FXVOL_S, INTINGAMEOP , INTINGAMEOP_MID, INTINGAMEOP_1_Y-5,
|
|
AUDIO_VOL_MAX,mixer_GetWavVolume(),INTINGAMEOP_FXVOL);
|
|
|
|
// fx vol
|
|
addIGTextButton(INTINGAMEOP_3DFXVOL,INTINGAMEOP_2_Y,STR_FE_3D_FX,WBUT_PLAIN);
|
|
addFESlider(INTINGAMEOP_3DFXVOL_S, INTINGAMEOP , INTINGAMEOP_MID, INTINGAMEOP_2_Y-5,
|
|
AUDIO_VOL_MAX,mixer_Get3dWavVolume(),INTINGAMEOP_3DFXVOL);
|
|
|
|
// cd vol
|
|
addIGTextButton(INTINGAMEOP_CDVOL,INTINGAMEOP_3_Y,STR_FE_MUSIC,WBUT_PLAIN);
|
|
addFESlider(INTINGAMEOP_CDVOL_S,INTINGAMEOP , INTINGAMEOP_MID,INTINGAMEOP_3_Y-5,
|
|
AUDIO_VOL_MAX,mixer_GetCDVolume(),INTINGAMEOP_CDVOL);
|
|
|
|
|
|
SetCurrentSnapID(&InterfaceSnap,INTINGAMEOP_RESUME);
|
|
|
|
|
|
|
|
/*
|
|
#ifndef PSX
|
|
// gamma
|
|
if (pie_GetRenderEngine() == ENGINE_GLIDE)
|
|
{
|
|
addIGTextButton(INTINGAMEOP_GAMMA,INTINGAMEOP_3_Y,STR_FE_GAMMA,WBUT_PLAIN);
|
|
|
|
if(gammaValue>3) gammaValue = (float)2.9;
|
|
if(gammaValue<0.5) gammaValue = (float).5;
|
|
|
|
addFESlider(INTINGAMEOP_GAMMA_S,INTINGAMEOP , INTINGAMEOP_MID,INTINGAMEOP_3_Y-5,60,(UDWORD)(gammaValue*25),INTINGAMEOP_GAMMA );
|
|
|
|
}
|
|
#endif
|
|
*/
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static BOOL addSlideOptions(void)
|
|
{
|
|
|
|
return _addSlideOptions();
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
|
|
static UDWORD MaxStringWidth;
|
|
|
|
void ResetMaxStringWidth(void)
|
|
{
|
|
MaxStringWidth=0;
|
|
}
|
|
|
|
void AddMaxStringWidth(STR_RES *psRes, UDWORD StringID)
|
|
{
|
|
UDWORD StringWidth;
|
|
StringWidth=iV_GetTextWidth(strresGetString(psRes,StringID));
|
|
if (StringWidth>MaxStringWidth) MaxStringWidth=StringWidth;
|
|
|
|
}
|
|
UDWORD GetMaxStringWidth(void)
|
|
{
|
|
return MaxStringWidth;
|
|
}
|
|
|
|
|
|
|
|
static BOOL _intAddInGameOptions(void)
|
|
{
|
|
// UWORD WindowWidth;
|
|
W_FORMINIT sFormInit;
|
|
|
|
|
|
audio_StopAll();
|
|
|
|
//clear out any mission widgets - timers etc that may be on the screen
|
|
clearMissionWidgets();
|
|
|
|
|
|
setWidgetsStatus(TRUE);
|
|
DisableCursorSnapsExcept(INTINGAMEOP);
|
|
|
|
//if already open, then close!
|
|
if (widgGetFromID(psWScreen,INTINGAMEOP))
|
|
{
|
|
intCloseInGameOptions(FALSE, TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
intResetScreen(FALSE);
|
|
|
|
|
|
// Pause the game.
|
|
if(!gamePaused())
|
|
{
|
|
kf_TogglePauseMode();
|
|
}
|
|
|
|
|
|
memset(&sFormInit,0, sizeof(W_FORMINIT));
|
|
|
|
|
|
|
|
sFormInit.width = INTINGAMEOP_W;
|
|
|
|
// add form
|
|
sFormInit.formID = 0;
|
|
sFormInit.id = INTINGAMEOP;
|
|
sFormInit.style = WFORM_PLAIN;
|
|
sFormInit.x = (SWORD)INTINGAMEOP_X;
|
|
sFormInit.y = (SWORD)INTINGAMEOP_Y;
|
|
sFormInit.height = INTINGAMEOP_H;
|
|
|
|
|
|
if ( (!bMultiPlayer || (NetPlay.bComms==0) ) && !bInTutorial)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
sFormInit.height = INTINGAMEOP_HS;
|
|
}
|
|
|
|
|
|
|
|
sFormInit.pDisplay = intOpenPlainForm;
|
|
sFormInit.disableChildren= TRUE;
|
|
|
|
widgAddForm(psWScreen, &sFormInit);
|
|
|
|
// add 'quit' text
|
|
|
|
if ( (!bMultiPlayer || (NetPlay.bComms==0) ) && !bInTutorial)
|
|
{
|
|
addIGTextButton(INTINGAMEOP_QUIT,INTINGAMEOP_5_Y,STR_GAME_QUIT,OPALIGN);
|
|
|
|
}
|
|
else
|
|
{
|
|
addIGTextButton(INTINGAMEOP_QUIT,INTINGAMEOP_3_Y,STR_GAME_QUIT,OPALIGN);
|
|
}
|
|
|
|
// add 'resume'
|
|
addIGTextButton(INTINGAMEOP_RESUME,INTINGAMEOP_1_Y,STR_GAME_RESUME,OPALIGN);
|
|
|
|
SetCurrentSnapID(&InterfaceSnap,INTINGAMEOP_RESUME);
|
|
|
|
// add 'options'
|
|
addIGTextButton(INTINGAMEOP_OPTIONS,INTINGAMEOP_2_Y,STR_FE_OPTIONS,OPALIGN);
|
|
|
|
|
|
if ( (!bMultiPlayer || (NetPlay.bComms==0) ) && !bInTutorial)
|
|
{ // add 'load'
|
|
addIGTextButton(INTINGAMEOP_LOAD,INTINGAMEOP_3_Y,STR_MISC_LOADGAME,OPALIGN);
|
|
// add 'save'
|
|
addIGTextButton(INTINGAMEOP_SAVE,INTINGAMEOP_4_Y,STR_MISC_SAVEGAME,OPALIGN);
|
|
}
|
|
|
|
|
|
intMode = INT_INGAMEOP; // change interface mode.
|
|
InGameOpUp = TRUE; // inform interface.
|
|
SetMousePos(0,INTINGAMEOP_X+INTINGAMEOP_1_X,INTINGAMEOP_Y+INTINGAMEOP_1_Y); // move mouse to resume.
|
|
|
|
pie_SetMouse(IntImages,IMAGE_CURSOR_DEFAULT); // reset cursor (hw)
|
|
frameSetCursorFromRes(IDC_DEFAULT); // reset cursor (sw)
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL intAddInGameOptions(void)
|
|
{
|
|
|
|
return _intAddInGameOptions();
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
|
|
void ProcessOptionFinished(void)
|
|
{
|
|
intMode = INT_NORMAL;
|
|
|
|
|
|
|
|
//unpause.
|
|
if(gamePaused())
|
|
{
|
|
kf_TogglePauseMode();
|
|
}
|
|
|
|
|
|
EnableAllCursorSnaps();
|
|
}
|
|
|
|
void intCloseInGameOptionsNoAnim(BOOL bResetMissionWidgets)
|
|
{
|
|
widgDelete(psWScreen, INTINGAMEOP);
|
|
InGameOpUp = FALSE;
|
|
|
|
ProcessOptionFinished();
|
|
|
|
//don't add the widgets if the load/save screen is put up or exiting to front end
|
|
if (bResetMissionWidgets)
|
|
{
|
|
//put any widgets back on for the missions
|
|
resetMissionWidgets();
|
|
}
|
|
}
|
|
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
BOOL intCloseInGameOptions(BOOL bPutUpLoadSave, BOOL bResetMissionWidgets)
|
|
{
|
|
|
|
W_TABFORM *Form;
|
|
WIDGET *widg;
|
|
|
|
if(bPutUpLoadSave)
|
|
{
|
|
widg = widgGetFromID(psWScreen,INTINGAMEOP);
|
|
if(widg)
|
|
{
|
|
widgDelete(psWScreen,INTINGAMEOP);
|
|
}
|
|
|
|
InGameOpUp = FALSE;
|
|
ClosingInGameOp = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// close the form.
|
|
// Start the window close animation.
|
|
Form = (W_TABFORM*)widgGetFromID(psWScreen,INTINGAMEOP);
|
|
if(Form) {
|
|
Form->display = intClosePlainForm;
|
|
Form->pUserData = (void*)0; // Used to signal when the close anim has finished.
|
|
Form->disableChildren= TRUE;
|
|
ClosingInGameOp = TRUE; // like orderup/closingorder
|
|
InGameOpUp = FALSE;
|
|
}
|
|
}
|
|
|
|
ProcessOptionFinished();
|
|
|
|
//don't add the widgets if the load/save screen is put up or exiting to front end
|
|
if (bResetMissionWidgets)
|
|
{
|
|
//put any widgets back on for the missions
|
|
resetMissionWidgets();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
// In Game Options house keeping stuff.
|
|
BOOL intRunInGameOptions(void)
|
|
{
|
|
|
|
processFrontendSnap(FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ////////////////////////////////////////////////////////////////////////////
|
|
// process clicks made by user.
|
|
void intProcessInGameOptions(UDWORD id)
|
|
{
|
|
|
|
|
|
switch(id)
|
|
{
|
|
// NORMAL KEYS
|
|
case INTINGAMEOP_QUIT: //quit was pressed
|
|
addQuitOptions();
|
|
break;
|
|
|
|
case INTINGAMEOP_QUIT_CONFIRM: //quit was confirmed.
|
|
intCloseInGameOptions(FALSE, FALSE);
|
|
break;
|
|
|
|
case INTINGAMEOP_OPTIONS: //game options was pressed
|
|
addSlideOptions();
|
|
break;
|
|
|
|
case INTINGAMEOP_RESUME: //resume was pressed.
|
|
intCloseInGameOptions(FALSE, TRUE);
|
|
break;
|
|
|
|
|
|
// case INTINGAMEOP_REPLAY:
|
|
// intCloseInGameOptions(TRUE, FALSE);
|
|
// if(0!=strcmp(getLevelName(),"CAM_1A"))
|
|
// {
|
|
// loopMissionState = LMS_LOADGAME;
|
|
// strcpy(saveGameName, "replay\\replay.gam");
|
|
// addConsoleMessage(strresGetString(psStringRes, STR_GAME_SAVED), LEFT_JUSTIFY);
|
|
// }
|
|
// break;
|
|
case INTINGAMEOP_LOAD:
|
|
intCloseInGameOptions(TRUE, FALSE);
|
|
addLoadSave(LOAD_INGAME,SaveGamePath,"gam",strresGetString(psStringRes,STR_MR_LOAD_GAME)); // change mode when loadsave returns// if(runLoadSave())// check for file name.
|
|
break;
|
|
case INTINGAMEOP_SAVE:
|
|
intCloseInGameOptions(TRUE, FALSE);
|
|
addLoadSave(SAVE_INGAME,SaveGamePath,"gam", strresGetString(psStringRes,STR_MR_SAVE_GAME) );
|
|
break;
|
|
|
|
|
|
// GAME OPTIONS KEYS
|
|
case INTINGAMEOP_FXVOL:
|
|
case INTINGAMEOP_3DFXVOL:
|
|
case INTINGAMEOP_CDVOL:
|
|
// case INTINGAMEOP_GAMMA:
|
|
SetMousePos(0,INTINGAMEOP2_X+INTINGAMEOP_MID+5 ,mouseY()); // move mouse
|
|
break;
|
|
|
|
|
|
case INTINGAMEOP_FXVOL_S:
|
|
mixer_SetWavVolume(widgGetSliderPos(psWScreen,INTINGAMEOP_FXVOL_S));
|
|
break;
|
|
case INTINGAMEOP_3DFXVOL_S:
|
|
mixer_Set3dWavVolume(widgGetSliderPos(psWScreen,INTINGAMEOP_3DFXVOL_S));
|
|
break;
|
|
case INTINGAMEOP_CDVOL_S:
|
|
mixer_SetCDVolume(widgGetSliderPos(psWScreen,INTINGAMEOP_CDVOL_S));
|
|
break;
|
|
|
|
// case INTINGAMEOP_GAMMA_S:
|
|
// gammaValue = (float)(widgGetSliderPos(psWScreen,INTINGAMEOP_GAMMA_S))/25 ;
|
|
// if(gammaValue<0.5) gammaValue = (float).5;
|
|
// pie_SetGammaValue(gammaValue);
|
|
// break;
|
|
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|