Files
perfect_dark/port/src/main.c
T

150 lines
4.0 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <PR/ultratypes.h>
#include <PR/ultrasched.h>
#include <PR/os_message.h>
#include "lib/main.h"
#include "bss.h"
#include "data.h"
#include "video.h"
#include "audio.h"
#include "input.h"
#include "fs.h"
#include "romdata.h"
#include "config.h"
#include "mod.h"
#include "system.h"
u32 g_OsMemSize = 0;
u8 g_Is4Mb = 0;
s8 g_Resetting = false;
OSSched g_Sched;
OSMesgQueue g_MainMesgQueue;
OSMesg g_MainMesgBuf[32];
u8 *g_MempHeap = NULL;
u32 g_MempHeapSize = 0;
u32 g_VmNumTlbMisses = 0;
u32 g_VmNumPageMisses = 0;
u32 g_VmNumPageReplaces = 0;
u8 g_VmShowStats = 0;
extern s32 g_StageNum;
s32 bootGetMemSize(void)
{
return (s32)g_OsMemSize;
}
void *bootAllocateStack(s32 threadid, s32 size)
{
static u8 bruh[0x1000];
return bruh;
}
void bootCreateSched(void)
{
osCreateMesgQueue(&g_MainMesgQueue, g_MainMesgBuf, ARRAYCOUNT(g_MainMesgBuf));
if (osTvType == OS_TV_MPAL) {
osCreateScheduler(&g_Sched, NULL, OS_VI_MPAL_LAN1, 1);
} else {
osCreateScheduler(&g_Sched, NULL, OS_VI_NTSC_LAN1, 1);
}
}
static void gameLoadConfig(void)
{
osMemSize = configGetIntClamped("Game.MemorySize", 16, 4, 2048) * 1024 * 1024;
g_PlayerCrosshairSway = configGetFloatClamped("Game.CrosshairSway", g_PlayerCrosshairSway, 0.f, 10.f);
g_PlayerDefaultFovY = configGetFloatClamped("Game.FovY", g_PlayerDefaultFovY, 5.f, 175.f);
g_PlayerMouseAimMode = configGetIntClamped("Game.MouseAimMode", g_PlayerMouseAimMode, 0, 1);
g_PlayerMouseAimSpeedX = configGetFloatClamped("Game.MouseAimSpeedX", g_PlayerMouseAimSpeedX, 0.f, 10.f);
g_PlayerMouseAimSpeedY = configGetFloatClamped("Game.MouseAimSpeedY", g_PlayerMouseAimSpeedY, 0.f, 10.f);
g_PlayerRadialMenuSpeed = configGetFloatClamped("Game.RadialMenuSpeed", g_PlayerRadialMenuSpeed, 0.f, 10.f);
g_PlayerFovAffectsZoom = configGetIntClamped("Game.FovAffectsZoom", g_PlayerFovAffectsZoom, 0, 1);
g_PlayerFovZoomMultiplier = g_PlayerFovAffectsZoom ? g_PlayerDefaultFovY / 60.0f : 1.0f;
g_PlayerClassicCrouch = configGetIntClamped("Game.ClassicCrouch", 0, 0, 1);
g_ViShakeIntensityMult = configGetFloatClamped("Game.ScreenShakeIntensity", 1.f, 0.f, 100.f);
const s32 center = configGetIntClamped("Game.CenterHUD", 0, 0, 1);
if (center) {
g_HudAlignModeL = G_ASPECT_CENTER_EXT;
g_HudAlignModeR = G_ASPECT_CENTER_EXT;
}
}
static void gameSaveConfig(void)
{
configSetFloat("Game.FovY", g_PlayerDefaultFovY);
configSetInt("Game.CenterHUD", g_HudAlignModeL == G_ASPECT_CENTER_EXT);
configSetInt("Game.ClassicCrouch", g_PlayerClassicCrouch);
configSetInt("Game.MouseAimMode", g_PlayerMouseAimMode);
configSetFloat("Game.MouseAimSpeedX", g_PlayerMouseAimSpeedX);
configSetFloat("Game.MouseAimSpeedY", g_PlayerMouseAimSpeedY);
configSetFloat("Game.RadialMenuSpeed", g_PlayerRadialMenuSpeed);
configSetFloat("Game.CrosshairSway", g_PlayerCrosshairSway);
configSetFloat("Game.ScreenShakeIntensity", g_ViShakeIntensityMult);
}
static void cleanup(void)
{
sysLogPrintf(LOG_NOTE, "shutdown");
inputSaveConfig();
videoSaveConfig();
gameSaveConfig();
configSave(CONFIG_PATH);
crashShutdown();
// TODO: actually shut down all subsystems
}
int main(int argc, const char **argv)
{
sysInitArgs(argc, argv);
if (!sysArgCheck("--no-crash-handler")) {
crashInit();
}
sysInit();
fsInit();
configInit();
videoInit();
inputInit();
audioInit();
romdataInit();
gameLoadConfig();
if (fsGetModDir()) {
modConfigLoad(MOD_CONFIG_FNAME);
}
atexit(cleanup);
bootCreateSched();
g_OsMemSize = osGetMemSize();
g_MempHeapSize = g_OsMemSize;
g_MempHeap = sysMemZeroAlloc(g_MempHeapSize);
if (!g_MempHeap) {
sysFatalError("Could not alloc %u bytes for memp heap.", g_MempHeapSize);
}
sysLogPrintf(LOG_NOTE, "memp heap at %p - %p", g_MempHeap, g_MempHeap + g_MempHeapSize);
sysLogPrintf(LOG_NOTE, "rom file at %p - %p", g_RomFile, g_RomFile + g_RomFileSize);
g_SndDisabled = sysArgCheck("--no-sound");
g_StageNum = sysArgGetInt("--boot-stage", STAGE_TITLE);
if (g_StageNum != STAGE_TITLE) {
sysLogPrintf(LOG_NOTE, "boot stage set to 0x%02x", g_StageNum);
}
mainProc();
return 0;
}