scummvm/backends/morphos/morphos_start.cpp
2002-12-25 11:47:16 +00:00

375 lines
9.1 KiB
C++

/* ScummVM - Scumm Interpreter
* Copyright (C) 2002 Rüdiger Hanke (MorphOS port)
*
* 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.
*
* MorphOS startup handling
*
* $Header$
*
*/
#include <exec/types.h>
#include <exec/devices.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/cdda.h>
#include <proto/icon.h>
#include "stdafx.h"
#include "scumm/scumm.h"
#include "sound/mididrv.h"
#include "morphos.h"
#include "morphos_scaler.h"
#include "morphos_sound.h"
extern "C" WBStartup *_WBenchMsg;
// For command line parsing
static STRPTR usageTemplate = "STORY,DATAPATH/K,WINDOW/S,SCALER/K,AMIGA/S,MIDIUNIT/K/N,MUSIC/K,MUSICVOL/K/N,SFXVOL/K/N,TEMPO/K/N,TALKSPEED/K/N,NOSUBTITLES=NST/S";
typedef enum { USG_STORY = 0, USG_DATAPATH, USG_WINDOW, USG_SCALER, USG_AMIGA, USG_MIDIUNIT, USG_MUSIC, USG_MUSICVOL, USG_SFXVOL, USG_TEMPO, USG_TALKSPEED, USG_NOSUBTITLES } usageFields;
static LONG args[13] = { (ULONG) NULL, (ULONG) NULL, FALSE, (ULONG) NULL, false, (ULONG) NULL, (ULONG) NULL, (ULONG) NULL, (ULONG) NULL, (ULONG) NULL, (ULONG) NULL, false };
static RDArgs *ScummArgs = NULL;
static char*ScummStory = NULL;
static char*ScummPath = NULL;
STRPTR ScummMusicDriver = NULL;
MidiDriver* EtudeMidiDriver = NULL;
LONG ScummMidiUnit = 0;
static LONG ScummMidiVolume = 0;
static LONG ScummMidiTempo = 0;
static LONG ScummSfxVolume = 0;
static LONG ScummTalkSpeed = 0;
static SCALERTYPE ScummGfxScaler = ST_INVALID;
static BPTR OrigDirLock = 0;
Library *CDDABase = NULL;
Library *TimerBase = NULL;
OSystem_MorphOS *TheSystem = NULL;
OSystem *OSystem_MorphOS_create(int game_id, int gfx_mode, bool full_screen)
{
if (TheSystem)
delete TheSystem;
SCALERTYPE gfx_scaler = ST_NONE;
switch (gfx_mode)
{
case GFX_DOUBLESIZE:
gfx_scaler = ST_POINT;
break;
case GFX_SUPEREAGLE:
gfx_scaler = ST_SUPEREAGLE;
break;
case GFX_SUPER2XSAI:
gfx_scaler = ST_SUPER2XSAI;
break;
}
TheSystem = OSystem_MorphOS::create(game_id, gfx_scaler, full_screen);
return TheSystem;
}
void close_resources()
{
if (EtudeMidiDriver)
EtudeMidiDriver->close();
if (TheSystem)
delete TheSystem;
if (g_scumm)
delete g_scumm;
if (ScummPath)
FreeVec(ScummPath);
if (ScummStory)
FreeVec(ScummStory);
if (ScummArgs)
FreeArgs(ScummArgs);
if (OrigDirLock)
CurrentDir(OrigDirLock);
if (CDDABase)
CloseLibrary(CDDABase);
}
static STRPTR FindMusicDriver(STRPTR argval)
{
if (!stricmp(argval, "off")) return "-enull";
if (!stricmp(argval, "midi")) return "-eetude";
if (!stricmp(argval, "adlib")) return "-eadlib";
error("No such music driver supported. Possible values are off, Midi and Adlib.");
return NULL;
}
static void ReadToolTypes(WBArg *OfFile)
{
DiskObject *dobj;
char *ToolValue;
char IconPath[256];
NameFromLock(OfFile->wa_Lock, IconPath, 256);
AddPart(IconPath, (STRPTR) OfFile->wa_Name, 256);
dobj = GetDiskObject(IconPath);
if (dobj == NULL)
return;
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "STORY");
if (ToolValue)
{
if (ScummStory)
FreeVec(ScummStory);
ScummStory = (char *) AllocVec(strlen(ToolValue)+1, MEMF_PUBLIC);
strcpy(ScummStory, ToolValue);
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "DATAPATH");
if (ToolValue)
{
if (ScummPath)
FreeVec(ScummPath);
ScummPath = (char *) AllocVec(strlen(ToolValue)+4, MEMF_PUBLIC);
strcpy(ScummPath, "-p");
strcat(ScummPath, ToolValue);
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "WINDOW");
if (ToolValue)
{
if (MatchToolValue(ToolValue, "YES"))
args[USG_WINDOW] = TRUE;
else if (MatchToolValue(ToolValue, "NO"))
args[USG_WINDOW] = FALSE;
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "SCALER");
if (ToolValue)
{
if ((ScummGfxScaler = MorphOSScaler::FindByName(ToolValue)) == ST_INVALID)
{
FreeDiskObject(dobj);
exit(1);
}
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "MUSIC");
if (ToolValue)
{
if (!(ScummMusicDriver = FindMusicDriver(ToolValue)))
{
FreeDiskObject(dobj);
exit(1);
}
args[USG_MUSIC] = (ULONG) &ScummMusicDriver;
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "MIDIUNIT");
if (ToolValue)
ScummMidiUnit = atoi(ToolValue);
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "MUSICVOL");
if (ToolValue)
{
int vol = atoi(ToolValue);
if (vol >= 0 && vol <= 100)
{
ScummMidiVolume = vol;
args[USG_MUSICVOL] = (ULONG) &ScummMidiVolume;
}
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "SFXVOL");
if (ToolValue)
{
int vol = atoi(ToolValue);
if (vol >= 0 && vol <= 255)
{
ScummSfxVolume = vol;
args[USG_SFXVOL] = (ULONG) &ScummSfxVolume;
}
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "TEMPO");
if (ToolValue)
{
ScummMidiTempo = atoi(ToolValue);
args[USG_TEMPO] = (ULONG) &ScummMidiTempo;
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "TALKSPEED");
if (ToolValue)
{
ScummTalkSpeed = atoi(ToolValue);
args[USG_TALKSPEED] = (ULONG) &ScummMidiTempo;
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "SUBTITLES");
if (ToolValue)
{
if (MatchToolValue(ToolValue, "YES"))
args[USG_NOSUBTITLES] = FALSE;
else if (MatchToolValue(ToolValue, "NO"))
args[USG_NOSUBTITLES] = TRUE;
}
ToolValue = (char *) FindToolType(dobj->do_ToolTypes, "AMIGA");
if (ToolValue)
{
if (MatchToolValue(ToolValue, "YES"))
args[USG_AMIGA] = FALSE;
else if (MatchToolValue(ToolValue, "NO"))
args[USG_AMIGA] = TRUE;
}
FreeDiskObject(dobj);
}
#undef main
int main()
{
char *argv[20];
char musicvol[6], sfxvol[6], talkspeed[12], tempo[12], scaler[14];
int argc = 0;
InitSemaphore(&ScummSoundThreadRunning);
InitSemaphore(&ScummMusicThreadRunning);
g_scumm = NULL;
atexit(&close_resources);
if (_WBenchMsg == NULL)
{
/* Parse the command line here */
ScummArgs = ReadArgs(usageTemplate, args, NULL);
if (ScummArgs == NULL)
{
puts("Error in command line - type \"ScummVM ?\" for usage.");
exit(1);
}
if (args[USG_STORY])
{
ScummStory = (char *) AllocVec(strlen((char *) args[USG_STORY])+1, MEMF_PUBLIC);
strcpy(ScummStory, (char *) args[USG_STORY]);
}
if (args[USG_DATAPATH])
{
ScummPath = (char *) AllocVec(strlen((char *) args[USG_DATAPATH])+4, MEMF_PUBLIC);
strcpy(ScummPath, "-p");
strcat(ScummPath, (char *) args[USG_DATAPATH]);
}
if (args[USG_SCALER])
{
if ((ScummGfxScaler = MorphOSScaler::FindByName((char *) args[USG_SCALER])) == ST_INVALID)
exit(1);
}
if (args[USG_MUSIC])
{
if (!(ScummMusicDriver = FindMusicDriver((char *) args[USG_MUSIC])))
exit(1);
}
if (args[USG_MIDIUNIT])
ScummMidiUnit = *((LONG *) args[USG_MIDIUNIT]);
if (args[USG_TEMPO])
ScummMidiTempo = *((LONG *) args[USG_TEMPO]);
if (args[USG_MUSICVOL])
ScummMidiVolume = *((LONG *) args[USG_MUSICVOL]);
if (args[USG_SFXVOL])
ScummSfxVolume = *((LONG *) args[USG_SFXVOL]);
if (args[USG_TALKSPEED])
ScummTalkSpeed = *((LONG *) args[USG_TALKSPEED]);
}
else
{
/* We've been started from Workbench */
ReadToolTypes(&_WBenchMsg->sm_ArgList[0]);
if (_WBenchMsg->sm_NumArgs > 1)
{
ReadToolTypes(&_WBenchMsg->sm_ArgList[1]);
OrigDirLock = CurrentDir(_WBenchMsg->sm_ArgList[1].wa_Lock);
}
}
if (ScummPath)
{
char c = ScummPath[strlen(ScummPath)-1];
if (c != '/' && c != ':')
strcat(ScummPath, "/");
}
argv[argc++] = "ScummVM";
if (ScummPath) argv[argc++] = ScummPath;
if (!args[USG_WINDOW]) argv[argc++] = "-f";
if (args[USG_NOSUBTITLES]) argv[argc++] = "-n";
if (args[USG_AMIGA]) argv[argc++] = "-a";
if (args[USG_MUSIC]) argv[argc++] = ScummMusicDriver;
if (ScummGfxScaler != ST_INVALID)
{
sprintf(scaler, "-g%s", MorphOSScaler::GetParamName(ScummGfxScaler));
argv[argc++] = scaler;
}
else
argv[argc++] = "-gsuper2xsai";
if (args[USG_MUSICVOL] && ScummMidiVolume >= 0 && ScummMidiVolume <= 100)
{
sprintf(musicvol, "-m%ld", ScummMidiVolume);
argv[argc++] = musicvol;
}
if (args[USG_SFXVOL] && ScummSfxVolume >= 0 && ScummSfxVolume <= 255)
{
sprintf(sfxvol, "-s%ld", ScummSfxVolume);
argv[argc++] = sfxvol;
}
if (args[USG_TEMPO] && ScummMidiTempo > 0)
{
sprintf(tempo, "-t%lx", ScummMidiTempo);
argv[argc++] = tempo;
}
if (args[USG_TALKSPEED] && ScummTalkSpeed >= 0 && ScummTalkSpeed <= 255)
{
sprintf(talkspeed, "-y%ld", ScummTalkSpeed);
argv[argc++] = talkspeed;
}
if (ScummStory)
argv[argc++] = ScummStory;
return morphos_main(argc, argv);
}