mirror of https://github.com/jonthysell/MacLO.git
81 lines
2.1 KiB
C
81 lines
2.1 KiB
C
|
// Copyright (c) Jon Thysell <http://jonthysell.com>
|
||
|
// Licensed under the MIT License.
|
||
|
|
||
|
/**
|
||
|
* @file GameSave.c
|
||
|
*
|
||
|
* This file provides implementations for GameSave.h.
|
||
|
*/
|
||
|
|
||
|
#include "GameSave.h"
|
||
|
#include "MacCommon.h"
|
||
|
|
||
|
/** The save resource type. */
|
||
|
#define SaveResType 'SAVE'
|
||
|
|
||
|
/** The save resource ID. */
|
||
|
#define SaveResID 128
|
||
|
|
||
|
/** The save resource ID. */
|
||
|
#define SaveResSize (sizeof(uint8_t) * SetCount * LevelCount)
|
||
|
|
||
|
void GameSave_Init(GameSave *pGameSave)
|
||
|
{
|
||
|
pGameSave->Save = GetOrAddResource(SaveResType, SaveResID, SaveResSize, EmptyString);
|
||
|
if (pGameSave->Save == nil)
|
||
|
{
|
||
|
ShowError("\pGame's SAVE resource couldn't be created!", true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void GameSave_LoadData(const GameSave *pSaveGame, GameEngine *pGameEngine)
|
||
|
{
|
||
|
int8_t level, scoreA, scoreB;
|
||
|
bool resetA, resetB;
|
||
|
|
||
|
HLock(pSaveGame->Save);
|
||
|
|
||
|
resetA = false;
|
||
|
resetB = false;
|
||
|
|
||
|
for (level = 0; level < LevelCount; level++)
|
||
|
{
|
||
|
scoreA = min(MaxHalfStars, (*pSaveGame->Save)[level]);
|
||
|
resetA = resetA || (scoreA < MinHalfStars);
|
||
|
pGameEngine->ScoresA[level] = resetA ? 0 : scoreA;
|
||
|
|
||
|
scoreB = min(MaxHalfStars, (*pSaveGame->Save)[LevelCount + level]);
|
||
|
resetB = resetB || (scoreB < MinHalfStars);
|
||
|
pGameEngine->ScoresB[level] = resetB ? 0 : scoreB;
|
||
|
}
|
||
|
|
||
|
HUnlock(pSaveGame->Save);
|
||
|
}
|
||
|
|
||
|
void GameSave_SaveData(GameSave *pSaveGame, const GameEngine *pGameEngine)
|
||
|
{
|
||
|
int8_t level;
|
||
|
bool dataChanged;
|
||
|
|
||
|
HLock(pSaveGame->Save);
|
||
|
|
||
|
dataChanged = false;
|
||
|
for (level = 0; level < LevelCount; level++)
|
||
|
{
|
||
|
dataChanged = dataChanged
|
||
|
|| ((*pSaveGame->Save)[level] != pGameEngine->ScoresA[level])
|
||
|
|| ((*pSaveGame->Save)[LevelCount + level] != pGameEngine->ScoresB[level]);
|
||
|
|
||
|
(*pSaveGame->Save)[level] = pGameEngine->ScoresA[level];
|
||
|
(*pSaveGame->Save)[LevelCount + level] = pGameEngine->ScoresB[level];
|
||
|
}
|
||
|
|
||
|
HUnlock(pSaveGame->Save);
|
||
|
|
||
|
if (dataChanged)
|
||
|
{
|
||
|
ChangedResource(pSaveGame->Save);
|
||
|
WriteResource(pSaveGame->Save);
|
||
|
}
|
||
|
}
|