327 lines
6.9 KiB
C
327 lines
6.9 KiB
C
//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 "setup.h"
|
|
|
|
#include "coderes.h"
|
|
#include "controls.h"
|
|
#include "options.h"
|
|
#include "nameref.h"
|
|
#ifdef NETPLAY
|
|
# include "supermelee/netplay/netmelee.h"
|
|
#endif
|
|
#include "init.h"
|
|
#include "intel.h"
|
|
#include "status.h"
|
|
#include "resinst.h"
|
|
#include "sounds.h"
|
|
#include "libs/compiler.h"
|
|
#include "libs/uio.h"
|
|
#include "libs/file.h"
|
|
#include "libs/graphics/gfx_common.h"
|
|
#include "libs/sound/sound.h"
|
|
#include "libs/threadlib.h"
|
|
#include "libs/vidlib.h"
|
|
#include "libs/log.h"
|
|
#include "libs/misc.h"
|
|
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
|
|
|
|
ACTIVITY LastActivity;
|
|
BYTE PlayerControl[NUM_PLAYERS];
|
|
|
|
// XXX: These declarations should really go to the file they belong to.
|
|
RESOURCE_INDEX hResIndex;
|
|
CONTEXT ScreenContext;
|
|
CONTEXT SpaceContext;
|
|
CONTEXT StatusContext;
|
|
CONTEXT OffScreenContext;
|
|
SIZE screen_width, screen_height;
|
|
FRAME Screen;
|
|
FONT StarConFont;
|
|
FONT MicroFont;
|
|
FONT TinyFont;
|
|
QUEUE race_q[NUM_PLAYERS];
|
|
FRAME ActivityFrame;
|
|
FRAME StatusFrame;
|
|
FRAME FlagStatFrame;
|
|
FRAME MiscDataFrame;
|
|
FRAME FontGradFrame;
|
|
Mutex GraphicsLock;
|
|
STRING GameStrings;
|
|
QUEUE disp_q;
|
|
|
|
uio_Repository *repository;
|
|
uio_DirHandle *rootDir;
|
|
|
|
|
|
static void
|
|
InitPlayerInput (void)
|
|
{
|
|
}
|
|
|
|
void
|
|
UninitPlayerInput (void)
|
|
{
|
|
#if DEMO_MODE
|
|
DestroyInputDevice (ReleaseInputDevice (DemoInput));
|
|
#endif /* DEMO_MODE */
|
|
}
|
|
|
|
BOOLEAN
|
|
LoadKernel (int argc, char *argv[])
|
|
{
|
|
InitSound (argc, argv);
|
|
InitVideoPlayer (TRUE);
|
|
|
|
ScreenContext = CreateContext ("ScreenContext");
|
|
if (ScreenContext == NULL)
|
|
return FALSE;
|
|
|
|
Screen = CaptureDrawable (CreateDisplay (WANT_MASK | WANT_PIXMAP,
|
|
&screen_width, &screen_height));
|
|
if (Screen == NULL)
|
|
return FALSE;
|
|
|
|
SetContext (ScreenContext);
|
|
SetContextFGFrame (Screen);
|
|
SetContextOrigin (MAKE_POINT (0, 0));
|
|
|
|
hResIndex = (RESOURCE_INDEX) InitResourceSystem ();
|
|
if (hResIndex == 0)
|
|
return FALSE;
|
|
|
|
/* Load base content. */
|
|
loadIndices (contentDir);
|
|
|
|
/* Load addons demanded by the current configuration. */
|
|
if (opt3doMusic)
|
|
{
|
|
loadAddon ("3domusic");
|
|
}
|
|
|
|
/* Always try to use voice data */
|
|
if (!loadAddon ("3dovoice"))
|
|
speechVolumeScale = 0.0f; // XXX: need better no-speech indicator
|
|
|
|
if (optRemixMusic)
|
|
{
|
|
loadAddon ("remix");
|
|
}
|
|
|
|
if (optWhichIntro == OPT_3DO)
|
|
{
|
|
loadAddon ("3dovideo");
|
|
}
|
|
|
|
/* Now load the rest of the addons, in order. */
|
|
prepareAddons (optAddons);
|
|
|
|
{
|
|
COLORMAP ColorMapTab;
|
|
|
|
ColorMapTab = CaptureColorMap (LoadColorMap (STARCON_COLOR_MAP));
|
|
SetColorMap (GetColorMapAddress (ColorMapTab));
|
|
DestroyColorMap (ReleaseColorMap (ColorMapTab));
|
|
}
|
|
|
|
InitPlayerInput ();
|
|
|
|
GLOBAL (CurrentActivity) = (ACTIVITY)~0;
|
|
return TRUE;
|
|
}
|
|
|
|
BOOLEAN
|
|
InitContexts (void)
|
|
{
|
|
RECT r;
|
|
|
|
StatusContext = CreateContext ("StatusContext");
|
|
if (StatusContext == NULL)
|
|
return FALSE;
|
|
|
|
SetContext (StatusContext);
|
|
SetContextFGFrame (Screen);
|
|
r.corner.x = SPACE_WIDTH + SAFE_X;
|
|
r.corner.y = SAFE_Y;
|
|
r.extent.width = STATUS_WIDTH;
|
|
r.extent.height = STATUS_HEIGHT;
|
|
SetContextClipRect (&r);
|
|
|
|
SpaceContext = CreateContext ("SpaceContext");
|
|
if (SpaceContext == NULL)
|
|
return FALSE;
|
|
|
|
OffScreenContext = CreateContext ("OffScreenContext");
|
|
if (OffScreenContext == NULL)
|
|
return FALSE;
|
|
|
|
if (!InitQueue (&disp_q, MAX_DISPLAY_ELEMENTS, sizeof (ELEMENT)))
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static BOOLEAN
|
|
InitKernel (void)
|
|
{
|
|
COUNT counter;
|
|
|
|
for (counter = 0; counter < NUM_PLAYERS; ++counter)
|
|
InitQueue (&race_q[counter], MAX_SHIPS_PER_SIDE, sizeof (STARSHIP));
|
|
|
|
StarConFont = LoadFont (STARCON_FONT);
|
|
if (StarConFont == NULL)
|
|
return FALSE;
|
|
|
|
TinyFont = LoadFont (TINY_FONT);
|
|
if (TinyFont == NULL)
|
|
return FALSE;
|
|
|
|
ActivityFrame = CaptureDrawable (LoadGraphic (ACTIVITY_ANIM));
|
|
if (ActivityFrame == NULL)
|
|
return FALSE;
|
|
|
|
StatusFrame = CaptureDrawable (LoadGraphic (STATUS_MASK_PMAP_ANIM));
|
|
if (StatusFrame == NULL)
|
|
return FALSE;
|
|
|
|
GameStrings = CaptureStringTable (LoadStringTable (STARCON_GAME_STRINGS));
|
|
if (GameStrings == 0)
|
|
return FALSE;
|
|
|
|
MicroFont = LoadFont (MICRO_FONT);
|
|
if (MicroFont == NULL)
|
|
return FALSE;
|
|
|
|
MenuSounds = CaptureSound (LoadSound (MENU_SOUNDS));
|
|
if (MenuSounds == 0)
|
|
return FALSE;
|
|
|
|
InitStatusOffsets ();
|
|
InitSpace ();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOLEAN
|
|
InitGameKernel (void)
|
|
{
|
|
if (ActivityFrame == 0)
|
|
{
|
|
InitKernel ();
|
|
InitContexts ();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool
|
|
SetPlayerInput (COUNT playerI)
|
|
{
|
|
assert (PlayerInput[playerI] == NULL);
|
|
|
|
switch (PlayerControl[playerI] & CONTROL_MASK) {
|
|
case HUMAN_CONTROL:
|
|
PlayerInput[playerI] =
|
|
(InputContext *) HumanInputContext_new (playerI);
|
|
break;
|
|
case COMPUTER_CONTROL:
|
|
case CYBORG_CONTROL:
|
|
// COMPUTER_CONTROL is used in SuperMelee; the computer chooses
|
|
// the ships and fights the battles.
|
|
// CYBORG_CONTROL is used in the full game; the computer only
|
|
// fights the battles. XXX: This will need to be handled
|
|
// separately in the future if we want to remove the special
|
|
// cases for ship selection with CYBORG_CONTROL from the
|
|
// computer handlers.
|
|
PlayerInput[playerI] =
|
|
(InputContext *) ComputerInputContext_new (playerI);
|
|
break;
|
|
#ifdef NETPLAY
|
|
case NETWORK_CONTROL:
|
|
PlayerInput[playerI] =
|
|
(InputContext *) NetworkInputContext_new (playerI);
|
|
break;
|
|
#endif
|
|
default:
|
|
log_add (log_Fatal,
|
|
"Invalid control method in SetPlayerInput().");
|
|
explode (); /* Does not return */
|
|
}
|
|
|
|
return PlayerInput[playerI] != NULL;
|
|
}
|
|
|
|
bool
|
|
SetPlayerInputAll (void)
|
|
{
|
|
COUNT playerI;
|
|
for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
|
|
if (!SetPlayerInput (playerI))
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
void
|
|
ClearPlayerInput (COUNT playerI)
|
|
{
|
|
if (PlayerInput[playerI] == NULL) {
|
|
log_add (log_Debug, "ClearPlayerInput(): PlayerInput[%d] was NULL.",
|
|
playerI);
|
|
return;
|
|
}
|
|
|
|
PlayerInput[playerI]->handlers->deleteContext (PlayerInput[playerI]);
|
|
PlayerInput[playerI] = NULL;
|
|
}
|
|
|
|
void
|
|
ClearPlayerInputAll (void)
|
|
{
|
|
COUNT playerI;
|
|
for (playerI = 0; playerI < NUM_PLAYERS; playerI++)
|
|
ClearPlayerInput (playerI);
|
|
}
|
|
|
|
int
|
|
initIO (void)
|
|
{
|
|
uio_init ();
|
|
repository = uio_openRepository (0);
|
|
|
|
rootDir = uio_openDir (repository, "/", 0);
|
|
if (rootDir == NULL)
|
|
{
|
|
log_add (log_Fatal, "Could not open '/' dir.");
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
uninitIO (void)
|
|
{
|
|
uio_closeDir (rootDir);
|
|
uio_closeRepository (repository);
|
|
uio_unInit ();
|
|
}
|
|
|