diff options
Diffstat (limited to 'src/uqm/setup.c')
-rw-r--r-- | src/uqm/setup.c | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/src/uqm/setup.c b/src/uqm/setup.c new file mode 100644 index 0000000..bfdf90a --- /dev/null +++ b/src/uqm/setup.c @@ -0,0 +1,332 @@ +//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; +STRING GameStrings; +QUEUE disp_q; + +uio_Repository *repository; +uio_DirHandle *rootDir; + +BOOLEAN usingSpeech; + + +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. */ + if (loadIndices (contentDir) == 0) + return FALSE; // Must have at least one index in content dir + + /* Load addons demanded by the current configuration. */ + if (opt3doMusic) + { + loadAddon ("3domusic"); + } + + usingSpeech = optSpeech; + if (optSpeech && !loadAddon ("3dovoice")) + { + usingSpeech = FALSE; + } + + 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)); + if (ColorMapTab == NULL) + return FALSE; // The most basic resource is missing + 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 (); +} + |