-Updated menu system to support multiple hierarchies.
- fixed the PCmenu hierarchy for The Main Starmap, Manifest, and Scan menus - most menu functions now reside in menu.c (new file) instead of sis.c git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@551 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -3075,6 +3075,10 @@ SOURCE=..\sc2code\melee.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\sc2code\menu.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\sc2code\misc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -4,7 +4,7 @@ uqm_CFILES="battle.c border.c build.c cleanup.c clock.c collide.c comm.c
|
||||
dummy.c encount.c fmv.c galaxy.c gameinp.c gameopt.c
|
||||
gendef.c getchar.c globdata.c gravity.c gravwell.c grpinfo.c
|
||||
hyper.c init.c intel.c intro.c ipdisp.c load.c loadship.c
|
||||
master.c melee.c misc.c oscill.c outfit.c pickmele.c
|
||||
master.c melee.c menu.c misc.c oscill.c outfit.c pickmele.c
|
||||
pickship.c plandata.c process.c restart.c save.c settings.c
|
||||
setup.c ship.c shipstat.c shipyard.c sis.c starbase.c
|
||||
starcon.c starmap.c state.c status.c tactrans.c
|
||||
|
||||
@@ -26,7 +26,6 @@ DoSelectAction (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
pMS->CurState = ATTACK + 1;
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
if (!pMS->Initialized)
|
||||
{
|
||||
pMS->Initialized = TRUE;
|
||||
@@ -51,33 +50,11 @@ DoSelectAction (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
return ((BOOLEAN)pMS->Initialized);
|
||||
default:
|
||||
printf ("Unknown option: %d\n", pMS->CurState);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE NewState;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState-- == HAIL)
|
||||
NewState = ATTACK + 1;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState++ == ATTACK + 1)
|
||||
NewState = HAIL;
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_CONVERSE, NewState);
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
}
|
||||
|
||||
DoMenuChooser (InputState, pMS, PM_CONVERSE);
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -511,60 +511,8 @@ DoSettings (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
|
||||
FeedbackSetting (pMS->CurState);
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE NewState;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (NewState-- == SOUND_ON_SETTING)
|
||||
NewState = EXIT_MENU_SETTING;
|
||||
} while ((NewState == SOUND_ON_SETTING
|
||||
&& (GLOBAL (glob_flags) & SOUND_DISABLED))
|
||||
|| (NewState == SOUND_OFF_SETTING
|
||||
&& !(GLOBAL (glob_flags) & SOUND_DISABLED))
|
||||
|| (NewState == MUSIC_ON_SETTING
|
||||
&& (GLOBAL (glob_flags) & MUSIC_DISABLED))
|
||||
|| (NewState == MUSIC_OFF_SETTING
|
||||
&& !(GLOBAL (glob_flags) & MUSIC_DISABLED))
|
||||
|| (NewState >= CYBORG_OFF_SETTING
|
||||
&& NewState <= CYBORG_SUPER_SETTING
|
||||
&& NewState != cur_speed + CYBORG_OFF_SETTING)
|
||||
);
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
do
|
||||
{
|
||||
if (NewState++ == EXIT_MENU_SETTING)
|
||||
NewState = SOUND_ON_SETTING;
|
||||
} while ((NewState == SOUND_ON_SETTING
|
||||
&& (GLOBAL (glob_flags) & SOUND_DISABLED))
|
||||
|| (NewState == SOUND_OFF_SETTING
|
||||
&& !(GLOBAL (glob_flags) & SOUND_DISABLED))
|
||||
|| (NewState == MUSIC_ON_SETTING
|
||||
&& (GLOBAL (glob_flags) & MUSIC_DISABLED))
|
||||
|| (NewState == MUSIC_OFF_SETTING
|
||||
&& !(GLOBAL (glob_flags) & MUSIC_DISABLED))
|
||||
|| (NewState >= CYBORG_OFF_SETTING
|
||||
&& NewState <= CYBORG_SUPER_SETTING
|
||||
&& NewState != cur_speed + CYBORG_OFF_SETTING)
|
||||
);
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_SOUND_ON, NewState);
|
||||
pMS->CurState = NewState;
|
||||
|
||||
else if (DoMenuChooser (InputState, pMS, PM_SOUND_ON))
|
||||
FeedbackSetting (pMS->CurState);
|
||||
}
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
@@ -1293,29 +1241,7 @@ DoGameOptions
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE NewState;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState-- == SAVE_GAME)
|
||||
NewState = SETTINGS + 1;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState++ == SETTINGS + 1)
|
||||
NewState = SAVE_GAME;
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_SAVE_GAME, NewState);
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
}
|
||||
DoMenuChooser (InputState, pMS, PM_SAVE_GAME);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,617 @@
|
||||
//Copyright Paul Reiche, Fred Ford. 1992-2002
|
||||
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "starcon.h"
|
||||
#include "commglue.h"
|
||||
#include "libs/graphics/gfx_common.h"
|
||||
#include "libs/tasklib.h"
|
||||
#include "options.h"
|
||||
|
||||
extern Task flash_task;
|
||||
extern RECT flash_rect;
|
||||
|
||||
/* Draw the blue background for PC Menu Text */
|
||||
static void
|
||||
DrawPCMenuFrame (RECT *r)
|
||||
{
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0F, 0x0F, 0x0F), 0x08));
|
||||
DrawRectangle (r);
|
||||
r->corner.x++;
|
||||
r->corner.y++;
|
||||
r->extent.height--;
|
||||
r->extent.width--;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x06, 0x06, 0x06), 0x08));
|
||||
DrawRectangle (r);
|
||||
r->extent.height--;
|
||||
r->extent.width--;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x08));
|
||||
DrawFilledRectangle (r);
|
||||
}
|
||||
|
||||
#define ALT_MANIFEST 0x80
|
||||
#define ALT_EXIT_MENU0 0x81
|
||||
|
||||
/* Define all menu text. There is 1 item for each PM_* enum*/
|
||||
static char menu_string[][11] = {
|
||||
"scan",
|
||||
"starmap",
|
||||
"devices",
|
||||
"cargo",
|
||||
"roster",
|
||||
"game",
|
||||
"navigate",
|
||||
|
||||
"mineral",
|
||||
"energy",
|
||||
"biological",
|
||||
"exit menu",
|
||||
"autoscan",
|
||||
"dispatch",
|
||||
|
||||
"save game",
|
||||
"load game",
|
||||
"settings",
|
||||
"exit menu",
|
||||
|
||||
"converse",
|
||||
"attack!",
|
||||
"game",
|
||||
|
||||
"fuel",
|
||||
"module",
|
||||
"game",
|
||||
"exit menu",
|
||||
|
||||
"crew",
|
||||
"game",
|
||||
"exit menu",
|
||||
|
||||
"sound",
|
||||
"music",
|
||||
"cyborg",
|
||||
"captain",
|
||||
"flagship",
|
||||
"exit menu",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
//PM_ALTSCAN
|
||||
"scan",
|
||||
"starmap",
|
||||
"manifest",
|
||||
"game",
|
||||
"navigate",
|
||||
//PM_ALTERNATE_2
|
||||
"cargo",
|
||||
"devices",
|
||||
"roster",
|
||||
"exit menu",
|
||||
//PM_ALTERNATE3 replaces PM_MIN_SCAN
|
||||
"mineral",
|
||||
"energy",
|
||||
"biological",
|
||||
"autoscan",
|
||||
"dispatch",
|
||||
"exit menu"
|
||||
|
||||
};
|
||||
|
||||
/* Actually display the menu text */
|
||||
static void
|
||||
DrawPCMenu (BYTE beg_index, BYTE end_index, BYTE NewState, BYTE hilite, RECT *r)
|
||||
{
|
||||
#define PC_MENU_HEIGHT 8
|
||||
BYTE pos;
|
||||
COUNT i;
|
||||
int num_items;
|
||||
FONT OldFont;
|
||||
TEXT t;
|
||||
UNICODE buf[40];
|
||||
pos = beg_index + NewState;
|
||||
num_items = 1 + end_index - beg_index;
|
||||
r->corner.x -= 1;
|
||||
r->extent.width += 1;
|
||||
DrawFilledRectangle (r);
|
||||
if (num_items * PC_MENU_HEIGHT > r->extent.height)
|
||||
fprintf (stderr, "Warning, no room for all menu items!\n");
|
||||
else
|
||||
r->corner.y += (r->extent.height - num_items * PC_MENU_HEIGHT) / 2;
|
||||
r->extent.height = num_items * PC_MENU_HEIGHT + 4;
|
||||
DrawPCMenuFrame (r);
|
||||
OldFont = SetContextFont (StarConFont);
|
||||
t.align = ALIGN_LEFT;
|
||||
t.baseline.x = r->corner.x + 2;
|
||||
t.baseline.y = r->corner.y + PC_MENU_HEIGHT -1;
|
||||
t.pStr = buf;
|
||||
t.CharCount = (COUNT)~0;
|
||||
r->corner.x++;
|
||||
r->extent.width -= 2;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x15, 0x15), 0x08));
|
||||
for (i = beg_index; i <= end_index; i++)
|
||||
{
|
||||
wsprintf (buf, menu_string[i]);
|
||||
if (hilite && pos == i)
|
||||
{
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x08));
|
||||
r->corner.y = t.baseline.y - PC_MENU_HEIGHT + 2;
|
||||
r->extent.height = PC_MENU_HEIGHT - 1;
|
||||
DrawFilledRectangle (r);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x08));
|
||||
font_DrawText (&t);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x15, 0x15), 0x08));
|
||||
}
|
||||
else
|
||||
font_DrawText (&t);
|
||||
t.baseline.y += PC_MENU_HEIGHT;
|
||||
}
|
||||
}
|
||||
|
||||
/* Determine the last text item to display */
|
||||
BYTE
|
||||
GetEndMenuState (BYTE BaseState)
|
||||
{
|
||||
switch (BaseState)
|
||||
{
|
||||
case PM_SCAN:
|
||||
case PM_STARMAP:
|
||||
return PM_NAVIGATE;
|
||||
break;
|
||||
case PM_MIN_SCAN:
|
||||
return PM_LAUNCH_LANDER;
|
||||
break;
|
||||
case PM_SAVE_GAME:
|
||||
return PM_EXIT_MENU1;
|
||||
break;
|
||||
case PM_CONVERSE:
|
||||
return PM_SAVE_LOAD1;
|
||||
break;
|
||||
case PM_FUEL:
|
||||
return PM_EXIT_MENU2;
|
||||
break;
|
||||
case PM_CREW:
|
||||
return PM_EXIT_MENU3;
|
||||
break;
|
||||
case PM_SOUND_ON:
|
||||
return PM_EXIT_MENU4;
|
||||
break;
|
||||
case PM_ALT_SCAN:
|
||||
case PM_ALT_STARMAP:
|
||||
return PM_ALT_NAVIGATE;
|
||||
break;
|
||||
case PM_ALT_CARGO:
|
||||
return PM_ALT_EXITMENU0;
|
||||
break;
|
||||
case PM_ALT_MSCAN:
|
||||
return PM_ALT_EXITMENU1;
|
||||
break;
|
||||
}
|
||||
return BaseState;
|
||||
}
|
||||
|
||||
BYTE
|
||||
GetBeginMenuState (BYTE BaseState)
|
||||
{
|
||||
return BaseState;
|
||||
}
|
||||
|
||||
/* Correct Menu State for cases where the Menu shouldn't move */
|
||||
BYTE
|
||||
FixMenuState (BYTE BadState)
|
||||
{
|
||||
switch (BadState)
|
||||
{
|
||||
case PM_SOUND_ON:
|
||||
if (GLOBAL (glob_flags) & SOUND_DISABLED)
|
||||
return (PM_SOUND_OFF);
|
||||
else
|
||||
return (PM_SOUND_ON);
|
||||
case PM_MUSIC_ON:
|
||||
if (GLOBAL (glob_flags) & MUSIC_DISABLED)
|
||||
return (PM_MUSIC_OFF);
|
||||
else
|
||||
return (PM_MUSIC_ON);
|
||||
case PM_CYBORG_OFF:
|
||||
return (PM_CYBORG_OFF +
|
||||
((BYTE)(GLOBAL (glob_flags) & COMBAT_SPEED_MASK) >> COMBAT_SPEED_SHIFT));
|
||||
}
|
||||
return (BadState);
|
||||
}
|
||||
|
||||
/* Choose the next menu to hilight in the 'forward' direction */
|
||||
BYTE
|
||||
NextMenuState (BYTE BaseState, BYTE CurState)
|
||||
{
|
||||
BYTE NextState;
|
||||
BYTE AdjBase = BaseState;
|
||||
|
||||
if (BaseState == PM_STARMAP)
|
||||
AdjBase--;
|
||||
|
||||
switch (AdjBase + CurState)
|
||||
{
|
||||
case PM_SOUND_ON:
|
||||
case PM_SOUND_OFF:
|
||||
NextState = PM_MUSIC_ON;
|
||||
break;
|
||||
case PM_MUSIC_ON:
|
||||
case PM_MUSIC_OFF:
|
||||
NextState = PM_CYBORG_OFF;
|
||||
break;
|
||||
case PM_CYBORG_OFF:
|
||||
case PM_CYBORG_NORMAL:
|
||||
case PM_CYBORG_DOUBLE:
|
||||
case PM_CYBORG_SUPER:
|
||||
NextState = PM_CHANGE_CAPTAIN;
|
||||
break;
|
||||
default:
|
||||
NextState = AdjBase + CurState + 1;
|
||||
}
|
||||
if (NextState > GetEndMenuState (BaseState))
|
||||
NextState = GetBeginMenuState (BaseState);
|
||||
return (FixMenuState (NextState) - AdjBase);
|
||||
}
|
||||
|
||||
/* Choose the next menu to hilight in the 'back' direction */
|
||||
BYTE
|
||||
PreviousMenuState (BYTE BaseState, BYTE CurState)
|
||||
{
|
||||
SWORD NextState;
|
||||
BYTE AdjBase = BaseState;
|
||||
|
||||
if (BaseState == PM_STARMAP)
|
||||
AdjBase--;
|
||||
|
||||
switch (AdjBase + CurState)
|
||||
{
|
||||
case PM_SOUND_OFF:
|
||||
NextState = PM_EXIT_MENU4;
|
||||
break;
|
||||
case PM_MUSIC_ON:
|
||||
case PM_MUSIC_OFF:
|
||||
NextState = PM_SOUND_ON;
|
||||
break;
|
||||
case PM_CYBORG_OFF:
|
||||
case PM_CYBORG_NORMAL:
|
||||
case PM_CYBORG_DOUBLE:
|
||||
case PM_CYBORG_SUPER:
|
||||
NextState = PM_MUSIC_ON;
|
||||
break;
|
||||
case PM_CHANGE_CAPTAIN:
|
||||
NextState = PM_CYBORG_OFF;
|
||||
break;
|
||||
default:
|
||||
NextState = AdjBase + CurState - 1;
|
||||
}
|
||||
if (NextState < GetBeginMenuState (BaseState))
|
||||
NextState = GetEndMenuState (BaseState);
|
||||
return (FixMenuState ((BYTE)NextState) - AdjBase);
|
||||
}
|
||||
|
||||
|
||||
/* When using PC hierarchy, convert 3do->PC */
|
||||
BOOLEAN
|
||||
GetAlternateMenu (BYTE *BaseState, BYTE *CurState)
|
||||
{
|
||||
BYTE AdjBase = *BaseState;
|
||||
BYTE adj = 0;
|
||||
if (*BaseState == PM_STARMAP)
|
||||
{
|
||||
AdjBase--;
|
||||
adj = 1;
|
||||
}
|
||||
if (*CurState & 0x80)
|
||||
{
|
||||
switch (*CurState)
|
||||
{
|
||||
case ALT_MANIFEST:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_MANIFEST - PM_ALT_SCAN - adj;
|
||||
return (TRUE);
|
||||
case ALT_EXIT_MENU0:
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_EXITMENU0 - PM_ALT_CARGO;
|
||||
return (TRUE);
|
||||
}
|
||||
fprintf (stderr, "Unknown state combination: %d, %d\n",*BaseState, *CurState);
|
||||
return (FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (AdjBase + *CurState)
|
||||
{
|
||||
case PM_SCAN:
|
||||
*BaseState = PM_ALT_SCAN;
|
||||
*CurState = PM_ALT_SCAN - PM_ALT_SCAN;
|
||||
return (TRUE);
|
||||
case PM_STARMAP:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_STARMAP - PM_ALT_SCAN - adj;
|
||||
return (TRUE);
|
||||
case PM_DEVICES:
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_DEVICES - PM_ALT_CARGO;
|
||||
return (TRUE);
|
||||
case PM_CARGO:
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_CARGO - PM_ALT_CARGO;
|
||||
return (TRUE);
|
||||
case PM_ROSTER:
|
||||
*BaseState = PM_ALT_CARGO;
|
||||
*CurState = PM_ALT_ROSTER - PM_ALT_CARGO;
|
||||
return (TRUE);
|
||||
case PM_SAVE_LOAD0:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_SAVE0 - PM_ALT_SCAN - adj;
|
||||
return (TRUE);
|
||||
case PM_NAVIGATE:
|
||||
*BaseState = PM_ALT_SCAN + adj;
|
||||
*CurState = PM_ALT_NAVIGATE - PM_ALT_SCAN - adj;
|
||||
return (TRUE);
|
||||
case PM_MIN_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_MSCAN - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
case PM_ENE_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_ESCAN - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
case PM_BIO_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_BSCAN - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
case PM_EXIT_MENU0:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_EXITMENU1 - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
case PM_AUTO_SCAN:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_ASCAN - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
case PM_LAUNCH_LANDER:
|
||||
*BaseState = PM_ALT_MSCAN;
|
||||
*CurState = PM_ALT_DISPATCH - PM_ALT_MSCAN;
|
||||
return (TRUE);
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/* When using PC hierarchy, convert PC->3DO */
|
||||
BYTE
|
||||
ConvertAlternateMenu (BYTE BaseState, BYTE NewState)
|
||||
{
|
||||
switch (BaseState + NewState)
|
||||
{
|
||||
case PM_ALT_SCAN:
|
||||
return (PM_SCAN - PM_SCAN);
|
||||
case PM_ALT_STARMAP:
|
||||
return (PM_STARMAP - PM_SCAN);
|
||||
case PM_ALT_MANIFEST:
|
||||
return (ALT_MANIFEST);
|
||||
case PM_ALT_SAVE0:
|
||||
return (PM_SAVE_LOAD0 - PM_SCAN);
|
||||
case PM_ALT_NAVIGATE:
|
||||
return (PM_NAVIGATE - PM_SCAN);
|
||||
case PM_ALT_CARGO:
|
||||
return (PM_CARGO - PM_SCAN);
|
||||
case PM_ALT_DEVICES:
|
||||
return (PM_DEVICES - PM_SCAN);
|
||||
case PM_ALT_ROSTER:
|
||||
return (PM_ROSTER - PM_SCAN);
|
||||
case PM_ALT_EXITMENU0:
|
||||
return (ALT_EXIT_MENU0);
|
||||
case PM_ALT_MSCAN:
|
||||
return (PM_MIN_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_ESCAN:
|
||||
return (PM_ENE_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_BSCAN:
|
||||
return (PM_BIO_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_ASCAN:
|
||||
return (PM_AUTO_SCAN - PM_MIN_SCAN);
|
||||
case PM_ALT_DISPATCH:
|
||||
return (PM_LAUNCH_LANDER - PM_MIN_SCAN);
|
||||
case PM_ALT_EXITMENU1:
|
||||
return (PM_EXIT_MENU0 - PM_MIN_SCAN);
|
||||
}
|
||||
return (NewState);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DoMenuChooser (INPUT_STATE InputState, PMENU_STATE pMS, BYTE BaseState)
|
||||
{
|
||||
{
|
||||
|
||||
BYTE NewState = pMS->CurState;
|
||||
BYTE OrigBase = BaseState;
|
||||
BOOLEAN useAltMenu = FALSE;
|
||||
if (optWhichMenu == OPT_PC)
|
||||
useAltMenu = GetAlternateMenu (&BaseState, &NewState);
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
NewState = PreviousMenuState (BaseState, NewState);
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
NewState = NextMenuState (BaseState, NewState);
|
||||
else if (useAltMenu && InputState & DEVICE_BUTTON1)
|
||||
{
|
||||
NewState = ConvertAlternateMenu (BaseState, NewState);
|
||||
if (NewState == ALT_MANIFEST)
|
||||
{
|
||||
DrawMenuStateStrings (PM_ALT_CARGO, 0);
|
||||
pMS->CurState = PM_CARGO - PM_SCAN;
|
||||
return (TRUE);
|
||||
}
|
||||
if (NewState == ALT_EXIT_MENU0)
|
||||
{
|
||||
if (OrigBase == PM_SCAN)
|
||||
DrawMenuStateStrings (PM_ALT_SCAN, PM_ALT_MANIFEST - PM_ALT_SCAN);
|
||||
else
|
||||
DrawMenuStateStrings (PM_ALT_STARMAP, PM_ALT_MANIFEST - PM_ALT_STARMAP);
|
||||
pMS->CurState = ALT_MANIFEST;
|
||||
return (TRUE);
|
||||
}
|
||||
return (FALSE);
|
||||
}
|
||||
else
|
||||
return (FALSE);
|
||||
DrawMenuStateStrings (BaseState, NewState);
|
||||
if (useAltMenu)
|
||||
NewState = ConvertAlternateMenu (BaseState, NewState);
|
||||
pMS->CurState = NewState;
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
DrawMenuStateStrings (BYTE beg_index, SWORD NewState)
|
||||
{
|
||||
BYTE end_index;
|
||||
RECT r;
|
||||
STAMP s;
|
||||
CONTEXT OldContext;
|
||||
BYTE hilite = 1;
|
||||
extern FRAME PlayFrame;
|
||||
|
||||
if (NewState < 0)
|
||||
{
|
||||
NewState = - NewState;
|
||||
hilite = 0;
|
||||
}
|
||||
|
||||
if (optWhichMenu == OPT_PC)
|
||||
{
|
||||
BYTE tmpState = (BYTE)NewState;
|
||||
GetAlternateMenu (&beg_index, &tmpState);
|
||||
NewState = tmpState;
|
||||
}
|
||||
|
||||
if (beg_index == PM_STARMAP)
|
||||
NewState--;
|
||||
end_index = GetEndMenuState (beg_index);
|
||||
|
||||
s.frame = 0;
|
||||
if (NewState <= end_index - beg_index)
|
||||
s.frame = SetAbsFrameIndex (PlayFrame, beg_index + NewState);
|
||||
|
||||
SetSemaphore (GraphicsSem);
|
||||
OldContext = SetContext (StatusContext);
|
||||
GetContextClipRect (&r);
|
||||
s.origin.x = RADAR_X - r.corner.x;
|
||||
s.origin.y = RADAR_Y - r.corner.y;
|
||||
r.corner.x = s.origin.x - 1;
|
||||
r.corner.y = s.origin.y - 11;
|
||||
r.extent.width = RADAR_WIDTH + 2;
|
||||
BatchGraphics ();
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08));
|
||||
if (s.frame && optWhichMenu == OPT_PC)
|
||||
{
|
||||
if (beg_index == PM_CREW)
|
||||
sprintf (menu_string[PM_CREW], "crew(%d)", GLOBAL (CrewCost));
|
||||
if (beg_index == PM_FUEL)
|
||||
sprintf (menu_string[PM_FUEL], "fuel(%d)", GLOBAL (FuelCost));
|
||||
if (beg_index == PM_SOUND_ON)
|
||||
{
|
||||
end_index = beg_index + 5;
|
||||
switch (beg_index + NewState)
|
||||
{
|
||||
case PM_SOUND_ON:
|
||||
case PM_SOUND_OFF:
|
||||
NewState = 0;
|
||||
break;
|
||||
case PM_MUSIC_ON:
|
||||
case PM_MUSIC_OFF:
|
||||
NewState = 1;
|
||||
break;
|
||||
case PM_CYBORG_OFF:
|
||||
case PM_CYBORG_NORMAL:
|
||||
case PM_CYBORG_DOUBLE:
|
||||
case PM_CYBORG_SUPER:
|
||||
NewState = 2;
|
||||
break;
|
||||
case PM_CHANGE_CAPTAIN:
|
||||
NewState = 3;
|
||||
break;
|
||||
case PM_CHANGE_SHIP:
|
||||
NewState = 4;
|
||||
break;
|
||||
case PM_EXIT_MENU4:
|
||||
NewState = 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
r.extent.height = RADAR_HEIGHT + 11;
|
||||
DrawPCMenu (beg_index, end_index, (BYTE)NewState, hilite, &r);
|
||||
s.frame = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(optWhichMenu == OPT_PC)
|
||||
{
|
||||
r.corner.x -= 1;
|
||||
r.extent.width += 1;
|
||||
r.extent.height = RADAR_HEIGHT + 11;
|
||||
}
|
||||
else
|
||||
r.extent.height = 11;
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
if (s.frame)
|
||||
{
|
||||
DrawStamp (&s);
|
||||
switch (beg_index + NewState)
|
||||
{
|
||||
TEXT t;
|
||||
UNICODE buf[4];
|
||||
|
||||
case PM_CREW:
|
||||
t.baseline.x = s.origin.x + RADAR_WIDTH - 2;
|
||||
t.baseline.y = s.origin.y + RADAR_HEIGHT - 2;
|
||||
t.align = ALIGN_RIGHT;
|
||||
t.CharCount = (COUNT)~0;
|
||||
t.pStr = buf;
|
||||
wsprintf (buf, "%u", GLOBAL (CrewCost));
|
||||
SetContextFont (TinyFont);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02));
|
||||
font_DrawText (&t);
|
||||
break;
|
||||
case PM_FUEL:
|
||||
t.baseline.x = s.origin.x + RADAR_WIDTH - 2;
|
||||
t.baseline.y = s.origin.y + RADAR_HEIGHT - 2;
|
||||
t.align = ALIGN_RIGHT;
|
||||
t.CharCount = (COUNT)~0;
|
||||
t.pStr = buf;
|
||||
wsprintf (buf, "%u", GLOBAL (FuelCost));
|
||||
SetContextFont (TinyFont);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02));
|
||||
font_DrawText (&t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
UnbatchGraphics ();
|
||||
if (flash_task
|
||||
&& flash_rect.corner.x == RADAR_X
|
||||
&& flash_rect.corner.y == RADAR_Y
|
||||
&& flash_rect.extent.width == RADAR_WIDTH
|
||||
&& flash_rect.extent.height == RADAR_HEIGHT)
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
SetContext (OldContext);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
|
||||
+71
-81
@@ -219,7 +219,7 @@ DoInstallModule (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
|
||||
SetContext (SpaceContext);
|
||||
SetContextDrawState (DEST_PIXMAP | DRAW_REPLACE);
|
||||
|
||||
ClearSISRect (CLEAR_SIS_RADAR);
|
||||
SetFlashRect (NULL_PTR, (FRAME)0);
|
||||
goto InitFlash;
|
||||
}
|
||||
@@ -507,6 +507,64 @@ InitFlash:
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
void
|
||||
ChangeFuelQuantity (INPUT_STATE InputState)
|
||||
{
|
||||
RECT r;
|
||||
|
||||
r.extent.height = 1;
|
||||
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetContext (SpaceContext);
|
||||
if (GetFTankCapacity (&r.corner) > GLOBAL_SIS (FuelOnBoard)
|
||||
&& GLOBAL_SIS (ResUnits) >=
|
||||
(DWORD)GLOBAL (FuelCost))
|
||||
{
|
||||
if (GLOBAL_SIS (FuelOnBoard) >=
|
||||
FUEL_RESERVE - FUEL_TANK_SCALE)
|
||||
{
|
||||
r.extent.width = 3;
|
||||
DrawPoint (&r.corner);
|
||||
r.corner.x += r.extent.width + 1;
|
||||
DrawPoint (&r.corner);
|
||||
r.corner.x -= r.extent.width;
|
||||
SetContextForeGroundColor (SetContextBackGroundColor (BLACK_COLOR));
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
DeltaSISGauges (0, FUEL_TANK_SCALE, -GLOBAL (FuelCost));
|
||||
SetContext (StatusContext);
|
||||
GetGaugeRect (&r, FALSE);
|
||||
SetFlashRect (&r, (FRAME)0);
|
||||
}
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetContext (SpaceContext);
|
||||
if (GLOBAL_SIS (FuelOnBoard))
|
||||
{
|
||||
DeltaSISGauges (0, -FUEL_TANK_SCALE,
|
||||
GLOBAL (FuelCost));
|
||||
if (GLOBAL_SIS (FuelOnBoard)
|
||||
% FUEL_VOLUME_PER_ROW == 0)
|
||||
{
|
||||
GetFTankCapacity (&r.corner);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E));
|
||||
r.extent.width = 5;
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
}
|
||||
SetContext (StatusContext);
|
||||
GetGaugeRect (&r, FALSE);
|
||||
SetFlashRect (&r, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
DoOutfit (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
@@ -602,15 +660,15 @@ DoOutfit (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
DrawFlagshipName (FALSE);
|
||||
ClearSemaphore(GraphicsSem);
|
||||
|
||||
{
|
||||
RECT r;
|
||||
{
|
||||
RECT r;
|
||||
|
||||
r.corner.x = 0;
|
||||
r.corner.y = 0;
|
||||
r.extent.width = SCREEN_WIDTH;
|
||||
r.extent.height = SCREEN_HEIGHT;
|
||||
ScreenTransition (3, &r);
|
||||
}
|
||||
r.corner.x = 0;
|
||||
r.corner.y = 0;
|
||||
r.extent.width = SCREEN_WIDTH;
|
||||
r.extent.height = SCREEN_HEIGHT;
|
||||
ScreenTransition (3, &r);
|
||||
}
|
||||
PlayMusic (pMS->hMusic, TRUE, 1);
|
||||
UnbatchGraphics ();
|
||||
|
||||
@@ -693,78 +751,10 @@ ExitOutfit:
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE NewState;
|
||||
RECT r;
|
||||
|
||||
r.extent.height = 1;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState == OUTFIT_DOFUEL)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetContext (SpaceContext);
|
||||
if (GetFTankCapacity (&r.corner) > GLOBAL_SIS (FuelOnBoard)
|
||||
&& GLOBAL_SIS (ResUnits) >=
|
||||
(DWORD)GLOBAL (FuelCost))
|
||||
{
|
||||
if (GLOBAL_SIS (FuelOnBoard) >=
|
||||
FUEL_RESERVE - FUEL_TANK_SCALE)
|
||||
{
|
||||
r.extent.width = 3;
|
||||
DrawPoint (&r.corner);
|
||||
r.corner.x += r.extent.width + 1;
|
||||
DrawPoint (&r.corner);
|
||||
r.corner.x -= r.extent.width;
|
||||
SetContextForeGroundColor (SetContextBackGroundColor (BLACK_COLOR));
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
DeltaSISGauges (0, FUEL_TANK_SCALE, -GLOBAL (FuelCost));
|
||||
SetContext (StatusContext);
|
||||
GetGaugeRect (&r, FALSE);
|
||||
SetFlashRect (&r, (FRAME)0);
|
||||
}
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
else if (NewState-- == OUTFIT_FUEL)
|
||||
NewState = OUTFIT_EXIT;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState == OUTFIT_DOFUEL)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetContext (SpaceContext);
|
||||
if (GLOBAL_SIS (FuelOnBoard))
|
||||
{
|
||||
DeltaSISGauges (0, -FUEL_TANK_SCALE,
|
||||
GLOBAL (FuelCost));
|
||||
if (GLOBAL_SIS (FuelOnBoard)
|
||||
% FUEL_VOLUME_PER_ROW == 0)
|
||||
{
|
||||
GetFTankCapacity (&r.corner);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xB, 0x00, 0x00), 0x2E));
|
||||
r.extent.width = 5;
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
}
|
||||
SetContext (StatusContext);
|
||||
GetGaugeRect (&r, FALSE);
|
||||
SetFlashRect (&r, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
else if (NewState++ == OUTFIT_EXIT)
|
||||
NewState = OUTFIT_FUEL;
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_FUEL, NewState);
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
if (pMS->CurState == OUTFIT_DOFUEL)
|
||||
ChangeFuelQuantity(InputState);
|
||||
else
|
||||
DoMenuChooser (InputState, pMS, PM_FUEL);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
|
||||
+141
-162
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "starcon.h"
|
||||
#include "libs/graphics/gfx_common.h"
|
||||
#include "options.h"
|
||||
|
||||
//Added by Chris
|
||||
|
||||
@@ -1166,189 +1167,167 @@ DoFlagshipCommands (INPUT_STATE InputState, PMENU_STATE pMS)
|
||||
|
||||
if (pMS->CurState)
|
||||
{
|
||||
BOOLEAN DoMenu;
|
||||
BYTE NewState;
|
||||
// For some reason, DoFlagshipCommands uses CurState a bit differently
|
||||
pMS->CurState --;
|
||||
DoMenu = DoMenuChooser (InputState, pMS,
|
||||
(BYTE)(pMS->Initialized <= 1 ? PM_STARMAP : PM_SCAN));
|
||||
pMS->CurState ++;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if ((InputState & DEVICE_BUTTON1) || LastActivity == CHECK_LOAD)
|
||||
{
|
||||
CONTEXT OldContext;
|
||||
if (NewState != SCAN + 1 && NewState != (GAME_MENU) + 1)
|
||||
if (!DoMenu) {
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if ((InputState & DEVICE_BUTTON1) || LastActivity == CHECK_LOAD)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect (NULL_PTR, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
|
||||
switch (NewState - 1)
|
||||
{
|
||||
case SCAN:
|
||||
ScanSystem ();
|
||||
break;
|
||||
case EQUIP_DEVICE:
|
||||
CONTEXT OldContext;
|
||||
if (NewState != SCAN + 1 && NewState != (GAME_MENU) + 1)
|
||||
{
|
||||
extern BOOLEAN Devices (PMENU_STATE pMS);
|
||||
|
||||
pMenuState = pMS;
|
||||
if (!Devices (pMS))
|
||||
InputState &= ~DEVICE_BUTTON1;
|
||||
pMenuState = 0;
|
||||
if (GET_GAME_STATE (PORTAL_COUNTER))
|
||||
return (FALSE);
|
||||
break;
|
||||
}
|
||||
case CARGO:
|
||||
{
|
||||
extern void Cargo
|
||||
(PMENU_STATE
|
||||
pMS);
|
||||
|
||||
Cargo (pMS);
|
||||
break;
|
||||
}
|
||||
case ROSTER:
|
||||
{
|
||||
|
||||
extern
|
||||
BOOLEAN
|
||||
Roster
|
||||
(void);
|
||||
|
||||
if (!Roster ())
|
||||
InputState &= ~DEVICE_BUTTON1;
|
||||
break;
|
||||
}
|
||||
case GAME_MENU:
|
||||
if (GameOptions () == 0)
|
||||
return (FALSE);
|
||||
|
||||
if (LOBYTE (GLOBAL(CurrentActivity)) == IN_INTERPLANETARY)
|
||||
{
|
||||
SetSemaphore(GraphicsSem);
|
||||
ClearSISRect(DRAW_SIS_DISPLAY);
|
||||
ClearSemaphore(GraphicsSem);
|
||||
DrawSISFrame();
|
||||
SetSemaphore(GraphicsSem);
|
||||
RepairSISBorder();
|
||||
DrawSISMessage(NULL_PTR);
|
||||
DrawSISTitle(GLOBAL_SIS(PlanetName));
|
||||
DrawStarBackGround(TRUE);
|
||||
OldContext = SetContext(SpaceContext);
|
||||
SetContextDrawState(DEST_PIXMAP | DRAW_REPLACE);
|
||||
BatchGraphics();
|
||||
DrawPlanet(SIS_SCREEN_WIDTH - MAP_WIDTH, SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, 0);
|
||||
UnbatchGraphics();
|
||||
SetContext(OldContext);
|
||||
ClearSemaphore(GraphicsSem);
|
||||
}
|
||||
// else
|
||||
// DrawMenuStateStrings (PM_SCAN, ROSTER + 1);
|
||||
break;
|
||||
case STARMAP:
|
||||
{
|
||||
BOOLEAN AutoPilotSet;
|
||||
|
||||
SetSemaphore (GraphicsSem);
|
||||
if (++pMS->Initialized > 3) {
|
||||
pSolarSysState->PauseRotate = 1;
|
||||
RepairSISBorder ();
|
||||
}
|
||||
|
||||
AutoPilotSet = DoStarMap ();
|
||||
|
||||
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE
|
||||
|| (GLOBAL (CurrentActivity) & CHECK_ABORT))
|
||||
{
|
||||
ClearSemaphore (GraphicsSem);
|
||||
return (FALSE);
|
||||
}
|
||||
else if (pMS->Initialized <= 3)
|
||||
{
|
||||
ZoomSystem ();
|
||||
--pMS->Initialized;
|
||||
}
|
||||
SetFlashRect (NULL_PTR, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
|
||||
if (!AutoPilotSet && pMS->Initialized >= 3)
|
||||
switch (NewState - 1)
|
||||
{
|
||||
case SCAN:
|
||||
ScanSystem ();
|
||||
break;
|
||||
case EQUIP_DEVICE:
|
||||
{
|
||||
LoadPlanet (FALSE);
|
||||
--pMS->Initialized;
|
||||
pSolarSysState->PauseRotate = 0;
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
extern BOOLEAN Devices (PMENU_STATE pMS);
|
||||
|
||||
pMenuState = pMS;
|
||||
if (!Devices (pMS))
|
||||
InputState &= ~DEVICE_BUTTON1;
|
||||
pMenuState = 0;
|
||||
if (GET_GAME_STATE (PORTAL_COUNTER))
|
||||
return (FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case NAVIGATION:
|
||||
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)
|
||||
return (FALSE);
|
||||
case CARGO:
|
||||
{
|
||||
extern void Cargo (PMENU_STATE pMS);
|
||||
|
||||
if (pMS->Initialized <= 1)
|
||||
{
|
||||
pMS->Initialized = 1;
|
||||
ResumeGameClock ();
|
||||
Cargo (pMS);
|
||||
break;
|
||||
}
|
||||
else if (pMS->flash_task)
|
||||
case ROSTER:
|
||||
{
|
||||
FreePlanet ();
|
||||
extern BOOLEAN Roster (void);
|
||||
|
||||
if (!Roster ())
|
||||
InputState &= ~DEVICE_BUTTON1;
|
||||
break;
|
||||
}
|
||||
case GAME_MENU:
|
||||
if (GameOptions () == 0)
|
||||
return (FALSE);
|
||||
|
||||
if (LOBYTE (GLOBAL(CurrentActivity)) == IN_INTERPLANETARY)
|
||||
{
|
||||
SetSemaphore(GraphicsSem);
|
||||
ClearSISRect(DRAW_SIS_DISPLAY);
|
||||
ClearSemaphore(GraphicsSem);
|
||||
DrawSISFrame();
|
||||
SetSemaphore(GraphicsSem);
|
||||
RepairSISBorder();
|
||||
DrawSISMessage(NULL_PTR);
|
||||
DrawSISTitle(GLOBAL_SIS(PlanetName));
|
||||
DrawStarBackGround(TRUE);
|
||||
OldContext = SetContext(SpaceContext);
|
||||
SetContextDrawState(DEST_PIXMAP | DRAW_REPLACE);
|
||||
BatchGraphics();
|
||||
DrawPlanet(SIS_SCREEN_WIDTH - MAP_WIDTH, SIS_SCREEN_HEIGHT - MAP_HEIGHT, 0, 0);
|
||||
UnbatchGraphics();
|
||||
SetContext(OldContext);
|
||||
ClearSemaphore(GraphicsSem);
|
||||
}
|
||||
// else
|
||||
// DrawMenuStateStrings (PM_SCAN, ROSTER + 1);
|
||||
break;
|
||||
case STARMAP:
|
||||
{
|
||||
BOOLEAN AutoPilotSet;
|
||||
|
||||
SetSemaphore (GraphicsSem);
|
||||
LoadSolarSys ();
|
||||
ZoomSystem ();
|
||||
if (++pMS->Initialized > 3) {
|
||||
pSolarSysState->PauseRotate = 1;
|
||||
RepairSISBorder ();
|
||||
}
|
||||
|
||||
AutoPilotSet = DoStarMap ();
|
||||
|
||||
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE
|
||||
|| (GLOBAL (CurrentActivity) & CHECK_ABORT))
|
||||
{
|
||||
ClearSemaphore (GraphicsSem);
|
||||
return (FALSE);
|
||||
}
|
||||
else if (pMS->Initialized <= 3)
|
||||
{
|
||||
ZoomSystem ();
|
||||
--pMS->Initialized;
|
||||
}
|
||||
ClearSemaphore (GraphicsSem);
|
||||
|
||||
if (!AutoPilotSet && pMS->Initialized >= 3)
|
||||
{
|
||||
LoadPlanet (FALSE);
|
||||
--pMS->Initialized;
|
||||
pSolarSysState->PauseRotate = 0;
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case NAVIGATION:
|
||||
if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE)
|
||||
return (FALSE);
|
||||
|
||||
if (pMS->Initialized <= 1)
|
||||
{
|
||||
pMS->Initialized = 1;
|
||||
ResumeGameClock ();
|
||||
}
|
||||
else if (pMS->flash_task)
|
||||
{
|
||||
FreePlanet ();
|
||||
SetSemaphore (GraphicsSem);
|
||||
LoadSolarSys ();
|
||||
ZoomSystem ();
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
|
||||
SetSemaphore (GraphicsSem);
|
||||
pMS->CurState = 0;
|
||||
ClearSemaphore (GraphicsSem);
|
||||
break;
|
||||
}
|
||||
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
;
|
||||
else if (pMS->CurState)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
pMS->CurState = 0;
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
break;
|
||||
}
|
||||
|
||||
if (GLOBAL (CurrentActivity) & CHECK_ABORT)
|
||||
;
|
||||
else if (pMS->CurState)
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
if (InputState & DEVICE_BUTTON1)
|
||||
if (InputState & DEVICE_BUTTON1)
|
||||
{
|
||||
if (optWhichMenu != OPT_PC)
|
||||
pMS->CurState = (NAVIGATION) + 1;
|
||||
DrawMenuStateStrings ((BYTE)(pMS->Initialized <= 1 ? PM_STARMAP : PM_SCAN),
|
||||
pMS->CurState - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pMS->CurState = (NAVIGATION) + 1;
|
||||
DrawMenuStateStrings ((BYTE)(pMS->Initialized <= 1 ? PM_STARMAP : PM_SCAN),
|
||||
NAVIGATION);
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect (NULL_PTR, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
DrawMenuStateStrings (PM_STARMAP, -NAVIGATION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSemaphore (GraphicsSem);
|
||||
SetFlashRect (NULL_PTR, (FRAME)0);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
DrawMenuStateStrings (PM_STARMAP, -NAVIGATION);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE FirstState;
|
||||
|
||||
FirstState = (BYTE)(pMS->Initialized <= 1 ? STARMAP : SCAN);
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState-- == (BYTE)(FirstState + 1))
|
||||
NewState = (NAVIGATION) + 1;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState++ == (NAVIGATION) + 1)
|
||||
NewState = (BYTE)(FirstState + 1);
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings ((BYTE)(pMS->Initialized <= 1 ? PM_STARMAP : PM_SCAN),
|
||||
(BYTE)(NewState - 1));
|
||||
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1154,29 +1154,7 @@ DoScan (INPUT_STATE InputState, PMENU_STATE
|
||||
else if (!(pSolarSysState->pOrbitalDesc->data_index & PLANET_SHIELDED)
|
||||
&& pSolarSysState->SysInfo.PlanetInfo.AtmoDensity !=
|
||||
GAS_GIANT_ATMOSPHERE)
|
||||
{
|
||||
BYTE NewState;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState-- == MINERAL_SCAN)
|
||||
NewState = DISPATCH_SHUTTLE;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState++ == DISPATCH_SHUTTLE)
|
||||
NewState = MINERAL_SCAN;
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_MIN_SCAN, NewState);
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
}
|
||||
DoMenuChooser (InputState, pMS, PM_MIN_SCAN);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
@@ -1139,30 +1139,7 @@ ExitShipyard:
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BYTE NewState;
|
||||
|
||||
NewState = pMS->CurState;
|
||||
if (GetInputXComponent (InputState) < 0
|
||||
|| GetInputYComponent (InputState) < 0)
|
||||
{
|
||||
if (NewState-- == SHIPYARD_CREW)
|
||||
NewState = SHIPYARD_EXIT;
|
||||
}
|
||||
else if (GetInputXComponent (InputState) > 0
|
||||
|| GetInputYComponent (InputState) > 0)
|
||||
{
|
||||
if (NewState++ == SHIPYARD_EXIT)
|
||||
NewState = SHIPYARD_CREW;
|
||||
}
|
||||
|
||||
if (NewState != pMS->CurState)
|
||||
{
|
||||
DrawMenuStateStrings (PM_CREW, NewState);
|
||||
|
||||
pMS->CurState = NewState;
|
||||
}
|
||||
}
|
||||
DoMenuChooser (InputState, pMS, PM_CREW);
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
+2
-264
@@ -990,8 +990,8 @@ CountSISPieces (BYTE piece_type)
|
||||
return (num_pieces);
|
||||
}
|
||||
|
||||
static Task flash_task;
|
||||
static RECT flash_rect;
|
||||
Task flash_task = 0;
|
||||
RECT flash_rect;
|
||||
static FRAME flash_frame;
|
||||
|
||||
int flash_rect_func(void *data)
|
||||
@@ -1163,268 +1163,6 @@ SetFlashRect (PRECT pRect, FRAME f)
|
||||
SetContext (OldContext);
|
||||
}
|
||||
|
||||
static void
|
||||
DrawPCMenuFrame (RECT *r)
|
||||
{
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0F, 0x0F, 0x0F), 0x08));
|
||||
DrawRectangle (r);
|
||||
r->corner.x++;
|
||||
r->corner.y++;
|
||||
r->extent.height--;
|
||||
r->extent.width--;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x06, 0x06, 0x06), 0x08));
|
||||
DrawRectangle (r);
|
||||
r->extent.height--;
|
||||
r->extent.width--;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x00, 0x15), 0x08));
|
||||
DrawFilledRectangle (r);
|
||||
}
|
||||
|
||||
static char menu_string[][11] = {
|
||||
"scan",
|
||||
"starmap",
|
||||
"devices",
|
||||
"cargo",
|
||||
"roster",
|
||||
"game",
|
||||
"navigate",
|
||||
|
||||
"mineral",
|
||||
"energy",
|
||||
"biological",
|
||||
"exit menu",
|
||||
"autoscan",
|
||||
"dispatch",
|
||||
|
||||
"save game",
|
||||
"load game",
|
||||
"settings",
|
||||
"exit menu",
|
||||
|
||||
"converse",
|
||||
"attack!",
|
||||
"game",
|
||||
|
||||
"fuel",
|
||||
"module",
|
||||
"game",
|
||||
"exit menu",
|
||||
|
||||
"crew",
|
||||
"game",
|
||||
"exit menu",
|
||||
|
||||
"sound",
|
||||
"music",
|
||||
"cyborg",
|
||||
"captain",
|
||||
"flagship",
|
||||
"exit menu"
|
||||
};
|
||||
|
||||
static void
|
||||
DrawPCMenu (BYTE beg_index, BYTE end_index, BYTE NewState, BYTE hilite, RECT *r)
|
||||
{
|
||||
#define PC_MENU_HEIGHT 8
|
||||
BYTE pos;
|
||||
COUNT i;
|
||||
int num_items;
|
||||
FONT OldFont;
|
||||
TEXT t;
|
||||
UNICODE buf[40];
|
||||
pos = beg_index + NewState;
|
||||
num_items = 1 + end_index - beg_index;
|
||||
r->corner.x -= 1;
|
||||
r->extent.width += 1;
|
||||
DrawFilledRectangle (r);
|
||||
if (num_items * PC_MENU_HEIGHT > r->extent.height)
|
||||
fprintf (stderr, "Warning, no room for all menu items!\n");
|
||||
else
|
||||
r->corner.y += (r->extent.height - num_items * PC_MENU_HEIGHT) / 2;
|
||||
r->extent.height = num_items * PC_MENU_HEIGHT + 4;
|
||||
DrawPCMenuFrame (r);
|
||||
OldFont = SetContextFont (StarConFont);
|
||||
t.align = ALIGN_LEFT;
|
||||
t.baseline.x = r->corner.x + 2;
|
||||
t.baseline.y = r->corner.y + PC_MENU_HEIGHT -1;
|
||||
t.pStr = buf;
|
||||
t.CharCount = (COUNT)~0;
|
||||
r->corner.x++;
|
||||
r->extent.width -= 2;
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x15, 0x15), 0x08));
|
||||
for (i = beg_index; i <= end_index; i++)
|
||||
{
|
||||
wsprintf (buf, menu_string[i]);
|
||||
if (hilite && pos == i)
|
||||
{
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0A, 0x0A, 0x1F), 0x08));
|
||||
r->corner.y = t.baseline.y - PC_MENU_HEIGHT + 2;
|
||||
r->extent.height = PC_MENU_HEIGHT - 1;
|
||||
DrawFilledRectangle (r);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x0A, 0x1F, 0x1F), 0x08));
|
||||
font_DrawText (&t);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x15, 0x15), 0x08));
|
||||
}
|
||||
else
|
||||
font_DrawText (&t);
|
||||
t.baseline.y += PC_MENU_HEIGHT;
|
||||
}
|
||||
}
|
||||
void
|
||||
DrawMenuStateStrings (BYTE beg_index, SWORD NewState)
|
||||
{
|
||||
BYTE end_index;
|
||||
RECT r;
|
||||
STAMP s;
|
||||
CONTEXT OldContext;
|
||||
BYTE hilite = 1;
|
||||
extern FRAME PlayFrame;
|
||||
|
||||
if (NewState < 0)
|
||||
{
|
||||
NewState = - NewState;
|
||||
hilite = 0;
|
||||
}
|
||||
switch (beg_index)
|
||||
{
|
||||
case PM_SCAN:
|
||||
end_index = PM_NAVIGATE;
|
||||
break;
|
||||
case PM_STARMAP:
|
||||
NewState--;
|
||||
end_index = PM_NAVIGATE;
|
||||
break;
|
||||
case PM_MIN_SCAN:
|
||||
end_index = PM_LAUNCH_LANDER;
|
||||
break;
|
||||
case PM_SAVE_GAME:
|
||||
end_index = PM_EXIT_MENU1;
|
||||
break;
|
||||
case PM_CONVERSE:
|
||||
end_index = PM_SAVE_LOAD1;
|
||||
break;
|
||||
case PM_FUEL:
|
||||
end_index = PM_EXIT_MENU2;
|
||||
break;
|
||||
case PM_CREW:
|
||||
end_index = PM_EXIT_MENU3;
|
||||
break;
|
||||
case PM_SOUND_ON:
|
||||
end_index = PM_EXIT_MENU4;
|
||||
break;
|
||||
default:
|
||||
end_index = beg_index;
|
||||
break;
|
||||
}
|
||||
|
||||
s.frame = 0;
|
||||
if (NewState <= end_index - beg_index)
|
||||
s.frame = SetAbsFrameIndex (PlayFrame, beg_index + NewState);
|
||||
|
||||
SetSemaphore (GraphicsSem);
|
||||
OldContext = SetContext (StatusContext);
|
||||
GetContextClipRect (&r);
|
||||
s.origin.x = RADAR_X - r.corner.x;
|
||||
s.origin.y = RADAR_Y - r.corner.y;
|
||||
r.corner.x = s.origin.x - 1;
|
||||
r.corner.y = s.origin.y - 11;
|
||||
r.extent.width = RADAR_WIDTH + 2;
|
||||
BatchGraphics ();
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0xA, 0xA, 0xA), 0x08));
|
||||
if (s.frame && optWhichMenu == OPT_PC)
|
||||
{
|
||||
if (beg_index == PM_CREW)
|
||||
sprintf (menu_string[PM_CREW], "crew(%d)", GLOBAL (CrewCost));
|
||||
if (beg_index == PM_FUEL)
|
||||
sprintf (menu_string[PM_FUEL], "fuel(%d)", GLOBAL (FuelCost));
|
||||
if (beg_index == PM_SOUND_ON)
|
||||
{
|
||||
end_index = beg_index + 5;
|
||||
switch (beg_index + NewState)
|
||||
{
|
||||
case PM_SOUND_ON:
|
||||
case PM_SOUND_OFF:
|
||||
NewState = 0;
|
||||
break;
|
||||
case PM_MUSIC_ON:
|
||||
case PM_MUSIC_OFF:
|
||||
NewState = 1;
|
||||
break;
|
||||
case PM_CYBORG_OFF:
|
||||
case PM_CYBORG_NORMAL:
|
||||
case PM_CYBORG_DOUBLE:
|
||||
case PM_CYBORG_SUPER:
|
||||
NewState = 2;
|
||||
break;
|
||||
case PM_CHANGE_CAPTAIN:
|
||||
NewState = 3;
|
||||
break;
|
||||
case PM_CHANGE_SHIP:
|
||||
NewState = 4;
|
||||
break;
|
||||
case PM_EXIT_MENU4:
|
||||
NewState = 5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
r.extent.height = RADAR_HEIGHT + 11;
|
||||
DrawPCMenu (beg_index, end_index, (BYTE)NewState, hilite, &r);
|
||||
s.frame = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(optWhichMenu == OPT_PC)
|
||||
{
|
||||
r.corner.x -= 1;
|
||||
r.extent.width += 1;
|
||||
r.extent.height = RADAR_HEIGHT + 11;
|
||||
}
|
||||
else
|
||||
r.extent.height = 11;
|
||||
DrawFilledRectangle (&r);
|
||||
}
|
||||
if (s.frame)
|
||||
{
|
||||
DrawStamp (&s);
|
||||
switch (beg_index + NewState)
|
||||
{
|
||||
TEXT t;
|
||||
UNICODE buf[4];
|
||||
|
||||
case PM_CREW:
|
||||
t.baseline.x = s.origin.x + RADAR_WIDTH - 2;
|
||||
t.baseline.y = s.origin.y + RADAR_HEIGHT - 2;
|
||||
t.align = ALIGN_RIGHT;
|
||||
t.CharCount = (COUNT)~0;
|
||||
t.pStr = buf;
|
||||
wsprintf (buf, "%u", GLOBAL (CrewCost));
|
||||
SetContextFont (TinyFont);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02));
|
||||
font_DrawText (&t);
|
||||
break;
|
||||
case PM_FUEL:
|
||||
t.baseline.x = s.origin.x + RADAR_WIDTH - 2;
|
||||
t.baseline.y = s.origin.y + RADAR_HEIGHT - 2;
|
||||
t.align = ALIGN_RIGHT;
|
||||
t.CharCount = (COUNT)~0;
|
||||
t.pStr = buf;
|
||||
wsprintf (buf, "%u", GLOBAL (FuelCost));
|
||||
SetContextFont (TinyFont);
|
||||
SetContextForeGroundColor (BUILD_COLOR (MAKE_RGB15 (0x00, 0x1F, 0x00), 0x02));
|
||||
font_DrawText (&t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
UnbatchGraphics ();
|
||||
if (flash_task
|
||||
&& flash_rect.corner.x == RADAR_X
|
||||
&& flash_rect.corner.y == RADAR_Y
|
||||
&& flash_rect.extent.width == RADAR_WIDTH
|
||||
&& flash_rect.extent.height == RADAR_HEIGHT)
|
||||
SetFlashRect ((PRECT)~0L, (FRAME)0);
|
||||
SetContext (OldContext);
|
||||
ClearSemaphore (GraphicsSem);
|
||||
}
|
||||
|
||||
void
|
||||
SaveFlagshipState (void)
|
||||
|
||||
+19
-1
@@ -48,7 +48,25 @@ enum
|
||||
PM_CYBORG_SUPER,
|
||||
PM_CHANGE_CAPTAIN,
|
||||
PM_CHANGE_SHIP,
|
||||
PM_EXIT_MENU4
|
||||
PM_EXIT_MENU4,
|
||||
|
||||
PM_ALT_SCAN,
|
||||
PM_ALT_STARMAP,
|
||||
PM_ALT_MANIFEST,
|
||||
PM_ALT_SAVE0,
|
||||
PM_ALT_NAVIGATE,
|
||||
|
||||
PM_ALT_CARGO,
|
||||
PM_ALT_DEVICES,
|
||||
PM_ALT_ROSTER,
|
||||
PM_ALT_EXITMENU0,
|
||||
|
||||
PM_ALT_MSCAN,
|
||||
PM_ALT_ESCAN,
|
||||
PM_ALT_BSCAN,
|
||||
PM_ALT_ASCAN,
|
||||
PM_ALT_DISPATCH,
|
||||
PM_ALT_EXITMENU1
|
||||
};
|
||||
|
||||
#define CLEAR_SIS_RADAR (1 << 2)
|
||||
|
||||
Reference in New Issue
Block a user