protected void SaveLoadGame()
{
GetResult();
var a = GetVarOrDirectByte(OpCodeParameter.Param1);
var result = 0;
var slot = a & 0x1F;
// Slot numbers in older games start with 0, in newer games with 1
if (Game.Version <= 2)
slot++;
_opCode = (byte)(a & 0xE0);
switch (_opCode)
{
case 0x00: // num slots available
result = 100;
break;
case 0x20: // drive
if (Game.Version <= 3)
{
// 0 = ???
// [1,2] = disk drive [A:,B:]
// 3 = hard drive
result = 3;
}
else
{
// set current drive
result = 1;
}
break;
case 0x40: // load
if (LoadState(slot, false))
result = 3; // sucess
else
result = 5; // failed to load
break;
case 0x80: // save
if (Game.Version <= 3)
{
string name;
if (Game.Version <= 2)
{
// use generic name
name = string.Format("Game {0}", (char)('A' + slot - 1));
}
else
{
// use name entered by the user
var firstSlot = StringIdSavename1;
name = _strings[slot + firstSlot - 1].GetText();
}
if (SavePreparedSavegame(slot, name))
result = 0;
else
result = 2;
}
else
{
result = 2; // failed to save
}
break;
case 0xC0: // test if save exists
{
var availSaves = ListSavegames(100);
var filename = MakeSavegameName(slot, false);
var directory = ServiceLocator.FileStorage.GetDirectoryName(Game.Path);
if (availSaves[slot] && (ServiceLocator.FileStorage.FileExists(ServiceLocator.FileStorage.Combine(directory, filename))))
{
result = 6; // save file exists
}
else
{
result = 7; // save file does not exist
}
}
break;
// default:
// error("o4_saveLoadGame: unknown subopcode %d", _opcode);
}
SetResult(result);
}