Files
perfect-dark/src/game/gamefile.c
T

550 lines
19 KiB
C

#include <ultra64.h>
#include "constants.h"
#include "constants.h"
#include "game/camdraw.h"
#include "game/cheats.h"
#include "game/player.h"
#include "game/savebuffer.h"
#include "game/bg.h"
#include "game/challenge.h"
#include "game/lang.h"
#include "game/training.h"
#include "game/gamefile.h"
#include "game/mplayer/mplayer.h"
#include "game/pak.h"
#include "game/options.h"
#include "game/utils.h"
#include "bss.h"
#include "lib/fault.h"
#include "lib/snd.h"
#include "lib/str.h"
#include "data.h"
#include "types.h"
u8 *gamefileGetFlags(void)
{
return g_GameFile.flags;
}
void gamefileSetFlag(u32 value)
{
pakSetBitflag(value, g_GameFile.flags, true);
}
void gamefileUnsetFlag(u32 value)
{
pakSetBitflag(value, g_GameFile.flags, false);
}
u32 gamefileHasFlag(u32 value)
{
return pakHasBitflag(value, g_GameFile.flags);
}
void gamefilePrintFlags(void)
{
s32 i;
for (i = 0x23; i != 0x4f; i++) {
osSyncPrintf("Flag %d = %s", i,
pakHasBitflag(i, g_GameFile.flags) ? "TRUE" : "FALSE");
}
}
void gamefileApplyOptions(struct gamefile *file)
{
s32 player1 = (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) ? 0 : 4;
s32 player2 = (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) ? 1 : 5;
optionsSetForwardPitch(player1, pakHasBitflag(GAMEFILEFLAG_P1_FORWARDPITCH, file->flags));
optionsSetAutoAim(player1, pakHasBitflag(GAMEFILEFLAG_P1_AUTOAIM, file->flags));
optionsSetAimControl(player1, pakHasBitflag(GAMEFILEFLAG_P1_AIMCONTROL, file->flags));
optionsSetSightOnScreen(player1, pakHasBitflag(GAMEFILEFLAG_P1_SIGHTONSCREEN, file->flags));
optionsSetLookAhead(player1, pakHasBitflag(GAMEFILEFLAG_P1_LOOKAHEAD, file->flags));
optionsSetAmmoOnScreen(player1, pakHasBitflag(GAMEFILEFLAG_P1_AMMOONSCREEN, file->flags));
optionsSetHeadRoll(player1, pakHasBitflag(GAMEFILEFLAG_P1_HEADROLL, file->flags));
optionsSetShowGunFunction(player1, pakHasBitflag(GAMEFILEFLAG_P1_SHOWGUNFUNCTION, file->flags));
optionsSetAlwaysShowTarget(player1, pakHasBitflag(GAMEFILEFLAG_P1_ALWAYSSHOWTARGET, file->flags));
optionsSetShowZoomRange(player1, pakHasBitflag(GAMEFILEFLAG_P1_SHOWZOOMRANGE, file->flags));
optionsSetShowMissionTime(player1, pakHasBitflag(GAMEFILEFLAG_P1_SHOWMISSIONTIME, file->flags));
optionsSetPaintball(player1, pakHasBitflag(GAMEFILEFLAG_P1_PAINTBALL, file->flags));
optionsSetForwardPitch(player2, pakHasBitflag(GAMEFILEFLAG_P2_FORWARDPITCH, file->flags));
optionsSetAutoAim(player2, pakHasBitflag(GAMEFILEFLAG_P2_AUTOAIM, file->flags));
optionsSetAimControl(player2, pakHasBitflag(GAMEFILEFLAG_P2_AIMCONTROL, file->flags));
optionsSetSightOnScreen(player2, pakHasBitflag(GAMEFILEFLAG_P2_SIGHTONSCREEN, file->flags));
optionsSetLookAhead(player2, pakHasBitflag(GAMEFILEFLAG_P2_LOOKAHEAD, file->flags));
optionsSetAmmoOnScreen(player2, pakHasBitflag(GAMEFILEFLAG_P2_AMMOONSCREEN, file->flags));
optionsSetHeadRoll(player2, pakHasBitflag(GAMEFILEFLAG_P2_HEADROLL, file->flags));
optionsSetShowGunFunction(player2, pakHasBitflag(GAMEFILEFLAG_P2_SHOWGUNFUNCTION, file->flags));
optionsSetAlwaysShowTarget(player2, pakHasBitflag(GAMEFILEFLAG_P2_ALWAYSSHOWTARGET, file->flags));
optionsSetShowZoomRange(player2, pakHasBitflag(GAMEFILEFLAG_P2_SHOWZOOMRANGE, file->flags));
optionsSetShowMissionTime(player2, pakHasBitflag(GAMEFILEFLAG_P2_SHOWMISSIONTIME, file->flags));
optionsSetPaintball(player2, pakHasBitflag(GAMEFILEFLAG_P2_PAINTBALL, file->flags));
optionsSetInGameSubtitles(pakHasBitflag(GAMEFILEFLAG_INGAMESUBTITLES, file->flags));
optionsSetCutsceneSubtitles(pakHasBitflag(GAMEFILEFLAG_CUTSCENESUBTITLES, file->flags));
// Duplicate
optionsSetPaintball(player2, pakHasBitflag(GAMEFILEFLAG_P2_PAINTBALL, file->flags));
g_Vars.langfilteron = pakHasBitflag(GAMEFILEFLAG_LANGFILTERON, file->flags);
if (pakHasBitflag(GAMEFILEFLAG_HIRES, file->flags)) {
if (IS4MB()) {
playerSetHiResEnabled(false);
} else {
playerSetHiResEnabled(true);
}
} else {
playerSetHiResEnabled(false);
}
if (IS4MB()) {
optionsSetScreenSplit(SCREENSPLIT_HORIZONTAL);
optionsSetScreenRatio(SCREENRATIO_NORMAL);
} else {
optionsSetScreenSplit(pakHasBitflag(GAMEFILEFLAG_SCREENSPLIT, file->flags));
optionsSetScreenRatio(pakHasBitflag(GAMEFILEFLAG_SCREENRATIO, file->flags));
}
if (pakHasBitflag(GAMEFILEFLAG_SCREENSIZE_CINEMA, file->flags)) {
optionsSetScreenSize(SCREENSIZE_CINEMA);
} else if (pakHasBitflag(GAMEFILEFLAG_SCREENSIZE_WIDE, file->flags)) {
optionsSetScreenSize(SCREENSIZE_WIDE);
} else {
optionsSetScreenSize(SCREENSIZE_FULL);
}
g_Vars.pendingantiplayernum = pakHasBitflag(GAMEFILEFLAG_ANTIPLAYERNUM, file->flags) ? 1 : 0;
g_Vars.coopradaron = pakHasBitflag(GAMEFILEFLAG_COOPRADARON, file->flags) ? 1 : 0;
g_Vars.coopfriendlyfire = pakHasBitflag(GAMEFILEFLAG_COOPFRIENDLYFIRE, file->flags) ? 1 : 0;
g_Vars.antiradaron = pakHasBitflag(GAMEFILEFLAG_ANTIRADARON, file->flags) ? 1 : 0;
#if VERSION >= VERSION_PAL_BETA
g_Vars.language = 0;
if (pakHasBitflag(GAMEFILEFLAG_LANGBIT1, file->flags)) {
g_Vars.language |= 0x01;
}
if (pakHasBitflag(GAMEFILEFLAG_LANGBIT2, file->flags)) {
g_Vars.language |= 0x02;
}
if (pakHasBitflag(GAMEFILEFLAG_LANGBIT3, file->flags)) {
g_Vars.language |= 0x04;
}
langSetEuropean(g_Vars.language);
#endif
}
void gamefileLoadDefaults(struct gamefile *file)
{
s32 player1 = (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) ? 0 : 4;
s32 player2 = (g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0) ? 1 : 5;
s32 i;
s32 j;
strcpy(file->name, "Dark");
file->thumbnail = 0;
file->autodifficulty = 0;
file->autostageindex = 0;
file->totaltime = 0;
#if VERSION >= VERSION_NTSC_1_0
sndSetSfxVolume(0x5000);
optionsSetMusicVolume(0x5000);
#else
sndSetSfxVolume(0x7f80);
optionsSetMusicVolume(0x7f80);
#endif
sndSetSoundMode(SOUNDMODE_STEREO);
optionsSetControlMode(player1, CONTROLMODE_11);
optionsSetControlMode(player2, CONTROLMODE_11);
pakClearAllBitflags(file->flags);
pakSetBitflag(GAMEFILEFLAG_P1_FORWARDPITCH, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_P1_AUTOAIM, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_AIMCONTROL, file->flags, AIMCONTROL_HOLD);
pakSetBitflag(GAMEFILEFLAG_P1_SIGHTONSCREEN, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_LOOKAHEAD, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_AMMOONSCREEN, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_HEADROLL, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_SHOWGUNFUNCTION, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_INGAMESUBTITLES, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_ALWAYSSHOWTARGET, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_SHOWZOOMRANGE, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P1_SHOWMISSIONTIME, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_P1_PAINTBALL, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_P2_FORWARDPITCH, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_P2_AUTOAIM, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_AIMCONTROL, file->flags, AIMCONTROL_HOLD);
pakSetBitflag(GAMEFILEFLAG_P2_SIGHTONSCREEN, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_LOOKAHEAD, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_AMMOONSCREEN, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_HEADROLL, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_SHOWGUNFUNCTION, file->flags, true);
#if VERSION >= VERSION_JPN_FINAL
pakSetBitflag(GAMEFILEFLAG_CUTSCENESUBTITLES, file->flags, true);
#else
pakSetBitflag(GAMEFILEFLAG_CUTSCENESUBTITLES, file->flags, false);
#endif
pakSetBitflag(GAMEFILEFLAG_P2_ALWAYSSHOWTARGET, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_SHOWZOOMRANGE, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_P2_SHOWMISSIONTIME, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_P2_PAINTBALL, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_SCREENSPLIT, file->flags, SCREENSPLIT_HORIZONTAL);
pakSetBitflag(GAMEFILEFLAG_SCREENRATIO, file->flags, SCREENRATIO_NORMAL);
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_CINEMA, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_WIDE, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_HIRES, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_LANGFILTERON, file->flags, false);
#if VERSION >= VERSION_NTSC_1_0
pakSetBitflag(GAMEFILEFLAG_FOUNDTIMEDMINE, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_FOUNDPROXYMINE, file->flags, false);
pakSetBitflag(GAMEFILEFLAG_FOUNDREMOTEMINE, file->flags, false);
#endif
pakSetBitflag(GAMEFILEFLAG_COOPRADARON, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_COOPFRIENDLYFIRE, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_ANTIRADARON, file->flags, true);
pakSetBitflag(GAMEFILEFLAG_ANTIPLAYERNUM, file->flags, 1);
#if VERSION >= VERSION_PAL_BETA
pakSetBitflag(GAMEFILEFLAG_LANGBIT1, g_GameFile.flags, ((g_Vars.language & 0x01) == 0x01));
pakSetBitflag(GAMEFILEFLAG_LANGBIT2, g_GameFile.flags, ((g_Vars.language & 0x02) == 0x02));
pakSetBitflag(GAMEFILEFLAG_LANGBIT3, g_GameFile.flags, ((g_Vars.language & 0x04) == 0x04));
#endif
file->unk1e = 0;
for (i = 0; i < ARRAYCOUNT(file->besttimes); i++) {
for (j = 0; j < ARRAYCOUNT(file->besttimes[0]); j++) {
file->besttimes[i][j] = 0;
}
}
for (i = 0; i < 30; i++) {
for (j = 1; j != 5; j++) {
challengeSetCompletedByAnyPlayerWithNumPlayers(i, j, false);
}
}
challengeDetermineUnlockedFeatures();
for (i = 0; i < ARRAYCOUNT(g_GameFile.coopcompletions); i++) {
g_GameFile.coopcompletions[i] = 0;
}
for (i = 0; i < ARRAYCOUNT(g_GameFile.firingrangescores); i++) {
g_GameFile.firingrangescores[i] = 0;
}
#if VERSION >= VERSION_NTSC_1_0
for (i = 0; i < ARRAYCOUNT(g_GameFile.weaponsfound); i++)
#else
for (i = 0; i < ARRAYCOUNT(g_GameFile.weaponsfound) - 2; i++)
#endif
{
g_GameFile.weaponsfound[i] = 0;
}
gamefileApplyOptions(file);
}
const char var7f1b38e8[] = "MAX_FUDGE_DATA_SIZE>=sizeof(PakFileTypeGameSetup_s)";
const char var7f1b391c[] = "pdoptions.c";
const char var7f1b3928[] = "MAX_FUDGE_DATA_SIZE>=sizeof(PakFileTypeGameSetup_s)";
const char var7f1b395c[] = "pdoptions.c";
const char var7f1b3968[] = "MAX_FUDGE_DATA_SIZE>=sizeof(PakFileTypeGameSetup_s)";
const char var7f1b399c[] = "pdoptions.c";
s32 gamefileLoad(s32 device)
{
s32 p1index;
s32 p2index;
u32 volume;
s32 i;
s32 j;
struct savebuffer buffer;
s32 ret;
u32 stack;
p1index = g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0 ? 0 : 4;
p2index = g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0 ? 1 : 5;
if (device >= 0) {
savebufferClear(&buffer);
ret = pakReadBodyAtGuid(device, g_GameFileGuid.fileid, buffer.bytes, 0);
g_FilemgrLastPakError = ret;
if (ret == 0) {
cheatsInit();
savebufferReadString(&buffer, g_GameFile.name, 0);
g_GameFile.thumbnail = savebufferReadBits(&buffer, 5);
g_GameFile.totaltime = savebufferReadBits(&buffer, 32);
g_GameFile.autodifficulty = savebufferReadBits(&buffer, 2);
g_GameFile.autostageindex = savebufferReadBits(&buffer, 5);
volume = savebufferReadBits(&buffer, 6) * 4;
if (volume >= 252) {
volume = 255;
}
sndSetSfxVolume((volume & 0x1ff) * 128);
volume = savebufferReadBits(&buffer, 6) * 4;
if (volume >= 252) {
volume = 255;
}
optionsSetMusicVolume((volume & 0x1ff) * 128);
sndSetSoundMode(savebufferReadBits(&buffer, 2));
optionsSetControlMode(p1index, savebufferReadBits(&buffer, 3));
optionsSetControlMode(p2index, savebufferReadBits(&buffer, 3));
for (i = 0; i < 10; i++) {
g_GameFile.flags[i] = savebufferReadBits(&buffer, 8);
}
g_GameFile.unk1e = savebufferReadBits(&buffer, 16);
for (i = 0; i < NUM_SOLOSTAGES; i++) {
for (j = 0; j < 3; j++) {
g_GameFile.besttimes[i][j] = savebufferReadBits(&buffer, 12);
}
}
for (i = 0; i < 30; i++) {
for (j = 1; j < 5; j++) {
challengeSetCompletedByAnyPlayerWithNumPlayers(i, j, savebufferReadBits(&buffer, 1));
}
}
challengeDetermineUnlockedFeatures();
for (i = 0; i < 3; i++) {
g_GameFile.coopcompletions[i] = savebufferReadBits(&buffer, 21);
}
for (i = 0; i < 9; i++) {
s32 numbits = i == 8 ? 2 : 8;
g_GameFile.firingrangescores[i] = savebufferReadBits(&buffer, numbits);
}
for (i = 0; i < 4; i++) {
g_GameFile.weaponsfound[i] = savebufferReadBits(&buffer, 8);
}
#if VERSION >= VERSION_NTSC_1_0
if (pakHasBitflag(GAMEFILEFLAG_FOUNDTIMEDMINE, g_GameFile.flags)) {
frSetWeaponFound(WEAPON_TIMEDMINE);
}
if (pakHasBitflag(GAMEFILEFLAG_FOUNDPROXYMINE, g_GameFile.flags)) {
frSetWeaponFound(WEAPON_PROXIMITYMINE);
}
if (pakHasBitflag(GAMEFILEFLAG_FOUNDREMOTEMINE, g_GameFile.flags)) {
frSetWeaponFound(WEAPON_REMOTEMINE);
}
#endif
func0f0d54c4(&buffer);
gamefileApplyOptions(&g_GameFile);
return 0;
}
return -1;
}
return -1;
}
s32 gamefileSave(s32 device, s32 fileid, u16 deviceserial)
{
u32 value;
s32 newfileid;
s32 ret;
s32 i;
s32 j;
s32 p1index;
s32 p2index;
struct savebuffer buffer;
p1index = g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0 ? 0 : 4;
p2index = g_Vars.coopplayernum >= 0 || g_Vars.antiplayernum >= 0 ? 1 : 5;
var80075bd0[0] = 1;
pakSetBitflag(GAMEFILEFLAG_P1_FORWARDPITCH, g_GameFile.flags, optionsGetForwardPitch(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_AUTOAIM, g_GameFile.flags, optionsGetAutoAim(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_AIMCONTROL, g_GameFile.flags, optionsGetAimControl(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_SIGHTONSCREEN, g_GameFile.flags, optionsGetSightOnScreen(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_LOOKAHEAD, g_GameFile.flags, optionsGetLookAhead(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_AMMOONSCREEN, g_GameFile.flags, optionsGetAmmoOnScreen(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_HEADROLL, g_GameFile.flags, optionsGetHeadRoll(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_SHOWGUNFUNCTION, g_GameFile.flags, optionsGetShowGunFunction(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_ALWAYSSHOWTARGET, g_GameFile.flags, optionsGetAlwaysShowTarget(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_SHOWZOOMRANGE, g_GameFile.flags, optionsGetShowZoomRange(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_SHOWMISSIONTIME, g_GameFile.flags, optionsGetShowMissionTime(p1index));
pakSetBitflag(GAMEFILEFLAG_P1_PAINTBALL, g_GameFile.flags, optionsGetPaintball(p1index));
pakSetBitflag(GAMEFILEFLAG_P2_FORWARDPITCH, g_GameFile.flags, optionsGetForwardPitch(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_AUTOAIM, g_GameFile.flags, optionsGetAutoAim(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_AIMCONTROL, g_GameFile.flags, optionsGetAimControl(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_SIGHTONSCREEN, g_GameFile.flags, optionsGetSightOnScreen(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_LOOKAHEAD, g_GameFile.flags, optionsGetLookAhead(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_AMMOONSCREEN, g_GameFile.flags, optionsGetAmmoOnScreen(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_HEADROLL, g_GameFile.flags, optionsGetHeadRoll(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_SHOWGUNFUNCTION, g_GameFile.flags, optionsGetShowGunFunction(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_ALWAYSSHOWTARGET, g_GameFile.flags, optionsGetAlwaysShowTarget(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_SHOWZOOMRANGE, g_GameFile.flags, optionsGetShowZoomRange(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_SHOWMISSIONTIME, g_GameFile.flags, optionsGetShowMissionTime(p2index));
pakSetBitflag(GAMEFILEFLAG_P2_PAINTBALL, g_GameFile.flags, optionsGetPaintball(p2index));
pakSetBitflag(GAMEFILEFLAG_SCREENSPLIT, g_GameFile.flags, optionsGetScreenSplit());
pakSetBitflag(GAMEFILEFLAG_SCREENRATIO, g_GameFile.flags, optionsGetScreenRatio());
#if VERSION >= VERSION_NTSC_1_0
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_WIDE, g_GameFile.flags, optionsGetScreenSize() == SCREENSIZE_WIDE);
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_CINEMA, g_GameFile.flags, optionsGetScreenSize() == SCREENSIZE_CINEMA);
#else
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_WIDE, g_GameFile.flags, optionsGetEffectiveScreenSize() == SCREENSIZE_WIDE);
pakSetBitflag(GAMEFILEFLAG_SCREENSIZE_CINEMA, g_GameFile.flags, optionsGetEffectiveScreenSize() == SCREENSIZE_CINEMA);
#endif
pakSetBitflag(GAMEFILEFLAG_HIRES, g_GameFile.flags, g_ViRes == VIRES_HI);
pakSetBitflag(GAMEFILEFLAG_INGAMESUBTITLES, g_GameFile.flags, optionsGetInGameSubtitles());
pakSetBitflag(GAMEFILEFLAG_CUTSCENESUBTITLES, g_GameFile.flags, optionsGetCutsceneSubtitles());
pakSetBitflag(GAMEFILEFLAG_LANGFILTERON, g_GameFile.flags, g_Vars.langfilteron);
#if VERSION >= VERSION_NTSC_1_0
pakSetBitflag(GAMEFILEFLAG_FOUNDTIMEDMINE, g_GameFile.flags, frIsWeaponFound(WEAPON_TIMEDMINE));
pakSetBitflag(GAMEFILEFLAG_FOUNDPROXYMINE, g_GameFile.flags, frIsWeaponFound(WEAPON_PROXIMITYMINE));
pakSetBitflag(GAMEFILEFLAG_FOUNDREMOTEMINE, g_GameFile.flags, frIsWeaponFound(WEAPON_REMOTEMINE));
#endif
#if VERSION >= VERSION_NTSC_1_0
switch (optionsGetScreenSize())
#else
switch (optionsGetEffectiveScreenSize())
#endif
{
case SCREENSIZE_FULL:
break;
case SCREENSIZE_WIDE:
break;
case SCREENSIZE_CINEMA:
break;
}
pakSetBitflag(GAMEFILEFLAG_ANTIPLAYERNUM, g_GameFile.flags, g_Vars.pendingantiplayernum == 1);
pakSetBitflag(GAMEFILEFLAG_COOPRADARON, g_GameFile.flags, g_Vars.coopradaron == 1);
pakSetBitflag(GAMEFILEFLAG_COOPFRIENDLYFIRE, g_GameFile.flags, g_Vars.coopfriendlyfire == 1);
pakSetBitflag(GAMEFILEFLAG_ANTIRADARON, g_GameFile.flags, g_Vars.antiradaron == 1);
#if VERSION >= VERSION_PAL_BETA
pakSetBitflag(GAMEFILEFLAG_LANGBIT1, g_GameFile.flags, (g_Vars.language & 0x01) == 0x01);
pakSetBitflag(GAMEFILEFLAG_LANGBIT2, g_GameFile.flags, (g_Vars.language & 0x02) == 0x02);
pakSetBitflag(GAMEFILEFLAG_LANGBIT3, g_GameFile.flags, (g_Vars.language & 0x04) == 0x04);
#endif
if (device >= 0) {
savebufferClear(&buffer);
func0f0d55a4(&buffer, g_GameFile.name);
savebufferOr(&buffer, g_GameFile.thumbnail, 5);
savebufferOr(&buffer, g_GameFile.totaltime, 32);
savebufferOr(&buffer, g_GameFile.autodifficulty, 2);
savebufferOr(&buffer, g_GameFile.autostageindex, 5);
value = VOLUME(g_SfxVolume) >> 7;
savebufferOr(&buffer, value >> 2, 6);
value = optionsGetMusicVolume() >> 7;
savebufferOr(&buffer, value >> 2, 6);
value = g_SoundMode;
savebufferOr(&buffer, value, 2);
savebufferOr(&buffer, optionsGetControlMode(p1index), 3);
savebufferOr(&buffer, optionsGetControlMode(p2index), 3);
for (i = 0; i < 10; i++) {
savebufferOr(&buffer, g_GameFile.flags[i], 8);
}
savebufferOr(&buffer, g_GameFile.unk1e, 16);
for (i = 0; i < NUM_SOLOSTAGES; i++) {
for (j = 0; j < 3; j++) {
savebufferOr(&buffer, g_GameFile.besttimes[i][j], 12);
}
}
for (i = 0; i < 30; i++) {
for (j = 1; j < 5; j++) {
savebufferOr(&buffer, challengeIsCompletedByAnyPlayerWithNumPlayers(i, j), 1);
}
}
for (i = 0; i < 3; i++) {
savebufferOr(&buffer, g_GameFile.coopcompletions[i], 21);
}
for (i = 0; i < 9; i++) {
savebufferOr(&buffer, g_GameFile.firingrangescores[i], i == 8 ? 2 : 8);
}
for (i = 0; i < 4; i++) {
savebufferOr(&buffer, g_GameFile.weaponsfound[i], 8);
}
func0f0d54c4(&buffer);
ret = pakSaveAtGuid(device, fileid, PAKFILETYPE_GAME, buffer.bytes, &newfileid, 0);
g_FilemgrLastPakError = ret;
if (ret == 0) {
g_GameFileGuid.fileid = newfileid;
g_GameFileGuid.deviceserial = deviceserial;
return 0;
}
return -1;
}
return -1;
}
void gamefileGetOverview(char *arg0, char *name, u8 *stage, u8 *difficulty, u32 *time)
{
struct savebuffer buffer;
func0f0d5484(&buffer, arg0, 15);
savebufferReadString(&buffer, name, false);
*stage = savebufferReadBits(&buffer, 5);
#if VERSION >= VERSION_NTSC_1_0
*time = savebufferReadBits(&buffer, 32);
#else
*time = (u16) savebufferReadBits(&buffer, 32);
#endif
*difficulty = savebufferReadBits(&buffer, 2);
}