scummvm/engines/startrek/awaymission.h
2021-12-26 18:48:43 +01:00

808 lines
27 KiB
C

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef STARTREK_AWAYMISSION_H
#define STARTREK_AWAYMISSION_H
// All variables here get cleared to 0 upon starting an away mission.
// NOTE: Any changes here must be reflected in the corresponding serializer functions.
struct AwayMission {
// These timers count down automatically when nonzero. When they reach 0,
// ACTION_TIMER_EXPIRED is invoked with the corresponding index (0-7).
int16 timers[8]; // 0x00-0x0f
int16 mouseX; // 0x10
int16 mouseY; // 0x12
int16 crewGetupTimers[4]; // 0x14
bool disableWalking; // 0x1c
// 0 / false: input enabled
// 1 / true: input disabled, turns back on after walking or beaming into a room
// 2: input disabled, doesn't turn back on after walking or beaming into room
byte disableInput; // 0x1d
bool redshirtDead; // 0x1e
char activeAction; // 0x1f
byte activeObject; // 0x20; The item that is going to be used on something
byte passiveObject; // 0x21; The item that the active item is used on (or the item looked at, etc).
// If this is true after calling room-specific RDF code, the game will continue to run
// any "default" code for the event, if any.
bool rdfStillDoDefaultAction; // 0x23
// If a bit in "crewDownBitset" is set, the corresponding timer in "crewGetupTimers"
// begins counting down. When it reaches 0, they get up.
byte crewDownBitset; // 0x24
int8 crewDirectionsAfterWalk[4]; // 0x25: Sets an object's direction after they finish walking somewhere?
// Mission-specific variables
union {
// Demon World (TODO: label remaining generic variables)
struct {
bool wasRudeToPrelate; // 0x29
bool insultedStephen; // 0x2b
bool field2d; // 0x2d
bool beatKlingons; // 0x2f
bool tookKlingonHand; // 0x31
bool talkedToPrelate; // 0x33
bool stephenWelcomedToStudy; // 0x34
bool prelateWelcomedCrew; // 0x35
bool askedPrelateAboutSightings; // 0x36
byte field37; // 0x37
bool mccoyMentionedFlora; // 0x38
byte numBouldersGone; // 0x39
byte enteredFrom; // 0x3a
bool repairedHand; // 0x3b
bool healedMiner; // 0x3c
bool curedChub; // 0x3d
bool field3e; // 0x3e
bool knowAboutHypoDytoxin; // 0x3f
bool minerDead; // 0x40
byte field41; // 0x41
bool foundMiner; // 0x43
bool field45; // 0x45
bool gaveSkullToNauian; // 0x47
bool warpsDisabled; // 0x48
bool boulder1Gone; // 0x49
bool boulder2Gone; // 0x4a
bool boulder3Gone; // 0x4b
bool boulder4Gone; // 0x4c
bool doorOpened; // 0x4d
bool solvedSunPuzzle; // 0x4e
byte itemsTakenFromCase; // 0x4f
bool gotBerries; // 0x50
bool madeHypoDytoxin; // 0x51
bool metNauian; // 0x53
bool gavePointsForDytoxin; // 0x54
bool lookedAtComputer; // 0x55
byte field56; // 0x56
bool foundAlienRoom; // 0x57
int16 missionScore; // 0x58
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(wasRudeToPrelate);
ser.syncAsByte(insultedStephen);
ser.syncAsByte(field2d);
ser.syncAsByte(beatKlingons);
ser.syncAsByte(tookKlingonHand);
ser.syncAsByte(talkedToPrelate);
ser.syncAsByte(stephenWelcomedToStudy);
ser.syncAsByte(prelateWelcomedCrew);
ser.syncAsByte(askedPrelateAboutSightings);
ser.syncAsByte(field37);
ser.syncAsByte(mccoyMentionedFlora);
ser.syncAsByte(numBouldersGone);
ser.syncAsByte(enteredFrom);
ser.syncAsByte(repairedHand);
ser.syncAsByte(healedMiner);
ser.syncAsByte(curedChub);
ser.syncAsByte(field3e);
ser.syncAsByte(knowAboutHypoDytoxin);
ser.syncAsByte(minerDead);
ser.syncAsByte(field41);
ser.syncAsByte(foundMiner);
ser.syncAsByte(field45);
ser.syncAsByte(gaveSkullToNauian);
ser.syncAsByte(warpsDisabled);
ser.syncAsByte(boulder1Gone);
ser.syncAsByte(boulder2Gone);
ser.syncAsByte(boulder3Gone);
ser.syncAsByte(boulder4Gone);
ser.syncAsByte(doorOpened);
ser.syncAsByte(solvedSunPuzzle);
ser.syncAsByte(itemsTakenFromCase);
ser.syncAsByte(gotBerries);
ser.syncAsByte(madeHypoDytoxin);
ser.syncAsByte(metNauian);
ser.syncAsByte(gavePointsForDytoxin);
ser.syncAsByte(lookedAtComputer);
ser.syncAsByte(field56);
ser.syncAsByte(foundAlienRoom);
ser.syncAsSint16LE(missionScore);
}
} demon;
// Hijacked
struct {
int16 missionScore; // 0x29
int16 field2b; // 0x2b
int16 field2d; // 0x2d
bool engineerConscious; // 0x30
byte field35; // 0x35
bool gotWires; // 0x37
byte orbitalDecayCounter; // 0x3b
bool bridgeElasiDrewPhasers; // 0x3d
bool talkedToCereth; // 0x3e
bool gotJunkPile; // 0x3f
bool gotTransmogrifier; // 0x43
bool transporterRepaired; // 0x44
bool spockExaminedTransporter; // 0x45
bool usedTransmogrifierOnTransporter; // 0x46
bool bridgeForceFieldDown; // 0x47
bool savedPrisoners; // 0x48
bool haveBomb; // 0x49
bool brigElasiPhasersOnKill; // 0x4a
byte elasiTargetIndex; // 0x4b
byte guard1Status; // 0x4c
byte guard2Status; // 0x4d
byte field4e; // 0x4e
byte crewmanKilled[4]; // 0x4f
byte bridgeElasi1Status; // 0x53
byte bridgeElasi2Status; // 0x54
byte bridgeElasi3Status; // 0x55
byte bridgeElasi4Status; // 0x56
bool brigForceFieldDown; // 0x58
byte field59; // 0x59
byte field5b; // 0x5b
bool elasiSurrendered; // 0x5c
byte kirkPhaserDrawn; // 0x5d
// 1: Decided to shoot them
// 2: Talked, and they surrendered immediately
// 3: They deorbited the ship (and perhaps surrendered after)
byte bridgeWinMethod; // 0x5e
bool talkedToBrigCrewman; // 0x5f
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsSint16LE(missionScore);
ser.syncAsSint16LE(field2b);
ser.syncAsSint16LE(field2d);
ser.syncAsByte(engineerConscious);
ser.syncAsByte(field35);
ser.syncAsByte(gotWires);
ser.syncAsByte(orbitalDecayCounter);
ser.syncAsByte(bridgeElasiDrewPhasers);
ser.syncAsByte(talkedToCereth);
ser.syncAsByte(gotJunkPile);
ser.syncAsByte(gotTransmogrifier);
ser.syncAsByte(transporterRepaired);
ser.syncAsByte(spockExaminedTransporter);
ser.syncAsByte(usedTransmogrifierOnTransporter);
ser.syncAsByte(bridgeForceFieldDown);
ser.syncAsByte(savedPrisoners);
ser.syncAsByte(haveBomb);
ser.syncAsByte(brigElasiPhasersOnKill);
ser.syncAsByte(elasiTargetIndex);
ser.syncAsByte(guard1Status);
ser.syncAsByte(guard2Status);
ser.syncAsByte(field4e);
ser.syncBytes(crewmanKilled, 4);
ser.syncAsByte(bridgeElasi1Status);
ser.syncAsByte(bridgeElasi2Status);
ser.syncAsByte(bridgeElasi3Status);
ser.syncAsByte(bridgeElasi4Status);
ser.syncAsByte(brigForceFieldDown);
ser.syncAsByte(field59);
ser.syncAsByte(field5b);
ser.syncAsByte(elasiSurrendered);
ser.syncAsByte(kirkPhaserDrawn);
ser.syncAsByte(bridgeWinMethod);
ser.syncAsByte(talkedToBrigCrewman);
}
} tug;
// Love's Labor Jeopardized
struct {
bool alreadyStartedMission; // 0x29
bool knowAboutVirus; // 0x2a
bool romulansUnconsciousFromLaughingGas; // 0x2b
bool releasedHumanLaughingGas; // 0x2c
bool releasedRomulanLaughingGas; // 0x2d
bool chamberHasCure; // 0x2e
bool freezerOpen; // 0x2f
bool chamberHasDish; // 0x30
byte bottleInNozzle; // 0x31
bool cabinetOpen; // 0x32
bool gasFeedOn; // 0x33
byte synthesizerBottleIndex; // 0x34
byte synthesizerContents; // 0x35
byte canister1; // 0x36
byte canister2; // 0x37
bool servicePanelOpen; // 0x38
bool gasTankUnscrewed; // 0x39
bool wrenchTaken; // 0x3a
bool tookN2TankFromServicePanel; // 0x3b
bool field3c; // 0x3c
bool grateRemoved; // 0x3d
bool insulationOnGround; // 0x3e
bool visitedRoomWithRomulans; // 0x3f
bool romulansCured; // 0x40
bool romulansUnconsciousFromVirus; // 0x41
bool freedMarcusAndCheever; // 0x42
bool preaxCured; // 0x43
byte spockInfectionCounter; // 0x45: When this reached 100, Spock dies.
bool spockCured; // 0x46
bool contactedEnterpriseBeforeCure; // 0x47
bool contactedEnterpriseAfterCure; // 0x48
bool spockAccessedConsole; // 0x49
bool mccoyAccessedConsole; // 0x4a
bool gotPolyberylcarbonate; // 0x4b
bool gotTLDH; // 0x4c (Got romulan laughing gas)
bool gotPointsForOpeningGrate; // 0x4d
bool gotPointsForGassingRomulans; // 0x4e
bool gotCure; // 0x4f
bool gotPointsForHydratingPreax; // 0x50
bool gotPointsForHydratingRomulans; // 0x51
int16 missionScore; // 0x52
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(alreadyStartedMission);
ser.syncAsByte(knowAboutVirus);
ser.syncAsByte(romulansUnconsciousFromLaughingGas);
ser.syncAsByte(releasedHumanLaughingGas);
ser.syncAsByte(releasedRomulanLaughingGas);
ser.syncAsByte(chamberHasCure);
ser.syncAsByte(freezerOpen);
ser.syncAsByte(chamberHasDish);
ser.syncAsByte(bottleInNozzle);
ser.syncAsByte(cabinetOpen);
ser.syncAsByte(gasFeedOn);
ser.syncAsByte(synthesizerBottleIndex);
ser.syncAsByte(synthesizerContents);
ser.syncAsByte(canister1);
ser.syncAsByte(canister2);
ser.syncAsByte(servicePanelOpen);
ser.syncAsByte(gasTankUnscrewed);
ser.syncAsByte(wrenchTaken);
ser.syncAsByte(tookN2TankFromServicePanel);
ser.syncAsByte(field3c);
ser.syncAsByte(grateRemoved);
ser.syncAsByte(insulationOnGround);
ser.syncAsByte(visitedRoomWithRomulans);
ser.syncAsByte(romulansCured);
ser.syncAsByte(romulansUnconsciousFromVirus);
ser.syncAsByte(freedMarcusAndCheever);
ser.syncAsByte(preaxCured);
ser.syncAsByte(spockInfectionCounter);
ser.syncAsByte(spockCured);
ser.syncAsByte(contactedEnterpriseBeforeCure);
ser.syncAsByte(contactedEnterpriseAfterCure);
ser.syncAsByte(spockAccessedConsole);
ser.syncAsByte(mccoyAccessedConsole);
ser.syncAsByte(gotPolyberylcarbonate);
ser.syncAsByte(gotTLDH);
ser.syncAsByte(gotPointsForOpeningGrate);
ser.syncAsByte(gotPointsForGassingRomulans);
ser.syncAsByte(gotCure);
ser.syncAsByte(gotPointsForHydratingPreax);
ser.syncAsByte(gotPointsForHydratingRomulans);
ser.syncAsSint16LE(missionScore);
}
} love;
struct {
// 0: Haven't entered first room yet
// 1: Have entered first room once
// 2: Mudd is gone from first room
byte muddFirstRoomState; // 0x29
bool torpedoLoaded; // 0x33
bool knowAboutTorpedo; // 0x34
bool discoveredBase3System; // 0x35
bool translatedAlienLanguage; // 0x36
bool databaseDestroyed; // 0x37
bool muddInDatabaseRoom; // 0x38
bool muddCurrentlyInsane; // 0x39
bool computerDataErasedOrDestroyed; // 0x3a
bool muddErasedDatabase; // 0x3b
// True if you've combined the lense + degrimer and fired it off, discovering
// it's a weapon
bool discoveredLenseAndDegrimerFunction; // 0x3c
int16 torpedoStatus; // 0x3d
bool muddUnavailable; // 0x3f
bool muddVisitedDatabaseRoom; // 0x40
bool accessedAlienDatabase; // 0x41
bool tookRepairTool; // 0x42
bool gotPointsForDownloadingData; // 0x43
bool contactedEnterpriseFirstTime; // 0x44
bool viewScreenEnabled; // 0x45
bool lifeSupportMalfunctioning; // 0x46
byte numTimesEnteredRoom5; // 0x47
bool gotMemoryDisk; // 0x48
bool gotLense; // 0x49
bool gotDegrimer; // 0x4a
bool putCapsuleInMedicalMachine; // 0x4c
bool muddUnconscious; // 0x4d
// 0: haven't entered room yet
// 1: will go insane next time room is entered (if he's available)
// 2: currently insane (or unconscious)
// 3: cured
byte muddInsanityState; // 0x4e
bool muddInhaledGas; // 0x4f (mostly the same as "muddCurrentlyInsane"?)
int16 lifeSupportTimer; // 0x50
bool startedLifeSupportTimer; // 0x52
bool enteredRoom0ForFirstTime; // 0x54
bool gotPointsForLoadingTorpedo; // 0x55
bool gotPointsForPressingRedButton; // 0x56
bool gotPointsForEnablingViewscreen; // 0x57
bool enteredRoom1ForFirstTime; // 0x58
bool repairedLifeSupportGenerator; // 0x59
int16 missionScore; // 0x5a
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(muddFirstRoomState);
ser.syncAsByte(torpedoLoaded);
ser.syncAsByte(knowAboutTorpedo);
ser.syncAsByte(discoveredBase3System);
ser.syncAsByte(translatedAlienLanguage);
ser.syncAsByte(databaseDestroyed);
ser.syncAsByte(muddInDatabaseRoom);
ser.syncAsByte(muddCurrentlyInsane);
ser.syncAsByte(computerDataErasedOrDestroyed);
ser.syncAsByte(muddErasedDatabase);
ser.syncAsByte(discoveredLenseAndDegrimerFunction);
ser.syncAsSint16LE(torpedoStatus);
ser.syncAsByte(muddUnavailable);
ser.syncAsByte(muddVisitedDatabaseRoom);
ser.syncAsByte(accessedAlienDatabase);
ser.syncAsByte(tookRepairTool);
ser.syncAsByte(gotPointsForDownloadingData);
ser.syncAsByte(contactedEnterpriseFirstTime);
ser.syncAsByte(viewScreenEnabled);
ser.syncAsByte(lifeSupportMalfunctioning);
ser.syncAsByte(numTimesEnteredRoom5);
ser.syncAsByte(gotMemoryDisk);
ser.syncAsByte(gotLense);
ser.syncAsByte(gotDegrimer);
ser.syncAsByte(putCapsuleInMedicalMachine);
ser.syncAsByte(muddUnconscious);
ser.syncAsByte(muddInsanityState);
ser.syncAsByte(muddInhaledGas);
ser.syncAsSint16LE(lifeSupportTimer);
ser.syncAsByte(startedLifeSupportTimer);
ser.syncAsByte(enteredRoom0ForFirstTime);
ser.syncAsByte(gotPointsForLoadingTorpedo);
ser.syncAsByte(gotPointsForPressingRedButton);
ser.syncAsByte(gotPointsForEnablingViewscreen);
ser.syncAsByte(enteredRoom1ForFirstTime);
ser.syncAsByte(repairedLifeSupportGenerator);
ser.syncAsSint16LE(missionScore);
}
} mudd;
struct {
bool diedFromStalactites; // 0x29
// 0: initial state
// 1: one rock thrown at it
// 2: two rocks thrown at it (low enough to climb up)
byte vineState; // 0x2a
bool gotRock; // 0x2b
bool gotSnake; // 0x2c
bool tookKnife; // 0x2d
bool field2e; // 0x2e
byte numRocksThrownAtTlaoxac; // 0x2f
bool gotFern; // 0x30
bool holeBlocked; // 0x31
bool tlaoxacTestPassed; // 0x32
bool knockedOutTlaoxac; // 0x33
bool waterMonsterRetreated; // 0x34
bool showedSnakeToTlaoxac; // 0x35
int16 missionScore; // 0x36
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(diedFromStalactites);
ser.syncAsByte(vineState);
ser.syncAsByte(gotRock);
ser.syncAsByte(gotSnake);
ser.syncAsByte(tookKnife);
ser.syncAsByte(field2e);
ser.syncAsByte(numRocksThrownAtTlaoxac);
ser.syncAsByte(gotFern);
ser.syncAsByte(holeBlocked);
ser.syncAsByte(tlaoxacTestPassed);
ser.syncAsByte(knockedOutTlaoxac);
ser.syncAsByte(waterMonsterRetreated);
ser.syncAsByte(showedSnakeToTlaoxac);
ser.syncAsSint16LE(missionScore);
}
} feather;
struct {
int16 missionScore; // 0x29
int16 field2b; // 0x2b
bool entityDefeated; // 0x31: Used iron rod on the energy being
bool doorOpen; // 0x32
bool scannedLock; // 0x33
// 0: Don't know the door code yet
// 2: Will just open the door when the keypad is used
// 5: Will activate the unknown program when the keypad is used
byte doorCodeBehaviour; // 0x34
bool globSplitInTwo; // 0x35
bool globDefeated; // 0x36
byte globEnergyLevels[3]; // 0x37
bool enteredTrial3FirstTime; // 0x3a
byte klingonShootIndex; // 0x3b
byte shotKlingons; // 0x3c
// 0: Hasn't appeared yet
// 21: Is conscious
// 22: Is stunned
// 23: Is dead
int16 shotKlingonState; // 0x3d
bool neuralInterfaceActive; // 0x43
int16 holeContents[3]; // 0x44 (Holes to put gems in for TRIAL5)
bool enteredGlobRoom; // 0x5c
bool forceFieldDown; // 0x5d
bool uhuraAnalyzedCode; // 0x5e
// 0: Gave up in court, letting Quetzecoatl die
// 1: Beamed to enterprise after calling Uhura
// 2: Lost the court battle after beaming back to the courtroom
// 3: Quetzecoatl goes free and Vlict doesn't die
// 4: Quetzecoatl goes free and Vlict dies
int16 missionEndMethod; // 0x5f
bool gotPointsForGettingRod; // 0x61
bool gotPointsForCoatingRodWithIron; // 0x62
bool gotPointsForActivatingInterface; // 0x63
bool gotPointsForScanningGlob; // 0x64
bool gotPointsForBeamingOut;
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsSint16LE(missionScore);
ser.syncAsSint16LE(field2b);
ser.syncAsByte(entityDefeated);
ser.syncAsByte(doorOpen);
ser.syncAsByte(scannedLock);
ser.syncAsByte(doorCodeBehaviour);
ser.syncAsByte(globSplitInTwo);
ser.syncAsByte(globDefeated);
ser.syncBytes(globEnergyLevels, 3);
ser.syncAsByte(enteredTrial3FirstTime);
ser.syncAsByte(klingonShootIndex);
ser.syncAsByte(shotKlingons);
ser.syncAsSint16LE(shotKlingonState);
ser.syncAsByte(neuralInterfaceActive);
for (int i = 0; i < 3; i++)
ser.syncAsSint16LE(holeContents[i]);
ser.syncAsByte(enteredGlobRoom);
ser.syncAsByte(forceFieldDown);
ser.syncAsByte(uhuraAnalyzedCode);
ser.syncAsSint16LE(missionEndMethod);
ser.syncAsByte(gotPointsForGettingRod);
ser.syncAsByte(gotPointsForCoatingRodWithIron);
ser.syncAsByte(gotPointsForActivatingInterface);
ser.syncAsByte(gotPointsForScanningGlob);
ser.syncAsByte(gotPointsForBeamingOut);
}
} trial;
struct {
byte field31; // 0x31
byte field32; // 0x32
bool field33; // 0x33
bool doorLaserFiredOnce; // 0x34
bool gotPointsForAccessingTerminal; // 0x35
bool scannedKeycardLock; // 0x36
byte laserSetting; // 0x37
// 0 if the laser hasn't been programmed with the keycard template;
// 1 if it has been programmed with the template;
// 2 if the rock has been placed on the wall.
byte laserPattern; // 0x38
// bit 0: got a rock, or at least scanned the ground outside
// bit 1: entered mineshaft room
// bit 2: scanned the ID card panel
// bit 3: set after all 3 clues are obtained and Spock explains how to make
// the keycard
byte gatheredClues; // 0x39
// bit 0: scanned left computer
// bit 1: scanned right computer
// bit 2: accessed left computer
// bit 3: accessed right computer
byte scannedAndUsedComputers; // 0x3a
bool wireConnected1; // 0x3b
bool wireConnected2; // 0x3c
bool openedOuterDoor; // 0x3d
bool openedInnerDoor; // 0x3e
bool unlockedIDCardDoor; // 0x3f
// 0: mold hasn't been created
// 2: mold for the keycard has been etched into the rock
// 3: rock placed top of the mold
// 4: a keycard is there
int8 moldState; // 0x40
// 0: box closed
// 1: box open
// 2: box empty
byte boxState; // 0x41
bool enteredRoom0FirstTime; // 0x42
bool scottyInformedKirkAboutVirus; // 0x43
bool enteredRoom2FirstTime; // 0x44
bool enteredRoom3FirstTime; // 0x45
bool enteredRoom4FirstTime; // 0x46
bool enteredRoom5FirstTime; // 0x47
bool gotPointsForScanningStatue; // 0x48
bool gotPointsForScanningRoom4; // 0x49
bool gotPointsForScanningRoom5; // 0x4a
bool gotPointsForScanningRightComputer; // 0x4b
bool gotPointsForScanningLeftComputer; // 0x4c
bool gotPointsForUsingRightComputer; // 0x4d
bool gotPointsForUsingLeftComputer; // 0x4e
bool discoveredComputersOutOfSync; // 0x4f
bool enteredRoom1FirstTime; // 0x50
bool playedMusicUponEnteringRoom5FirstTime; // 0x51
int16 missionScore; // 0x52
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(field31);
ser.syncAsByte(field32);
ser.syncAsByte(field33);
ser.syncAsByte(doorLaserFiredOnce);
ser.syncAsByte(gotPointsForAccessingTerminal);
ser.syncAsByte(scannedKeycardLock);
ser.syncAsByte(laserSetting);
ser.syncAsByte(laserPattern);
ser.syncAsByte(gatheredClues);
ser.syncAsByte(scannedAndUsedComputers);
ser.syncAsByte(wireConnected1);
ser.syncAsByte(wireConnected2);
ser.syncAsByte(openedOuterDoor);
ser.syncAsByte(openedInnerDoor);
ser.syncAsByte(unlockedIDCardDoor);
ser.syncAsByte(moldState);
ser.syncAsByte(boxState);
ser.syncAsByte(enteredRoom0FirstTime);
ser.syncAsByte(scottyInformedKirkAboutVirus);
ser.syncAsByte(enteredRoom2FirstTime);
ser.syncAsByte(enteredRoom3FirstTime);
ser.syncAsByte(enteredRoom4FirstTime);
ser.syncAsByte(enteredRoom5FirstTime);
ser.syncAsByte(gotPointsForScanningStatue);
ser.syncAsByte(gotPointsForScanningRoom4);
ser.syncAsByte(gotPointsForScanningRoom5);
ser.syncAsByte(gotPointsForScanningRightComputer);
ser.syncAsByte(gotPointsForScanningLeftComputer);
ser.syncAsByte(gotPointsForUsingRightComputer);
ser.syncAsByte(gotPointsForUsingLeftComputer);
ser.syncAsByte(discoveredComputersOutOfSync);
ser.syncAsByte(enteredRoom1FirstTime);
ser.syncAsByte(playedMusicUponEnteringRoom5FirstTime);
ser.syncAsSint16LE(missionScore);
}
} sins;
struct {
bool usedMedkitOnBrittany; // 0x29
bool talkedToBrittany; // 0x2a
bool brittanyDead; // 0x2b
bool lookedAtBrittany; // 0x2c
bool enteredRoom0FirstTime; // 0x2d
int16 missionScore; // 0x2e
bool bridgeCrewmanDead; // 0x30
bool scannedCaptainsChair; // 0x31
bool scannedComputerBank; // 0x32
bool showedRepublicMapFirstTime; // 0x33
bool impulseEnginesOn; // 0x34
// 0: beam still in place
// 1: used saw on beam
// 2: beam taken
byte beamState; // 0x35
bool enterpriseLeftForDistressCall; // 0x36
bool openedPanel; // 0x37
bool clearedPanelDebris; // 0x38
bool removedPanelDebris; // 0x39
bool oilInHypo; // 0x3a
bool loosenedDebrisWithOil; // 0x3b
// 0: no power allocated
// 1: power to weapons
// 2: power to shields
// 3: power to transporter
byte poweredSystem; // 0x3c
// 0: no tricorders plugged in
// 1: med tricorder plugged in
// 2: sci tricorder plugged in
// 3: both plugged in
byte tricordersPluggedIntoComputer; // 0x3d
byte captainsLogIndex; // 0x3e
bool elasiShieldsDown; // 0x40
bool torpedoLoaded; // 0x41
bool firedTorpedo; // 0x42
bool elasiShipDecloaked; // 0x43
bool countdownStarted; // 0x44
bool toldElasiToBeamOver; // 0x45
bool scannedMainComputer; // 0x46
bool elasiHailedRepublic; // 0x47
bool tookRecordDeckFromAuxilaryControl; // 0x48
// Counter used when shields are down and Elasi are present
int16 counterUntilElasiBoardWithShieldsDown; // 0x49
// Counter used after talking with Elasi and they give you time to recover the
// data
int16 counterUntilElasiAttack; // 0x4b
// Counter used after telling Elasi you'll turn off shields (initial warning)
int16 counterUntilElasiNagToDisableShields; // 0x4d
// Counter used after telling Elasi you'll turn off shields (they destroy the
// ship this time)
int16 counterUntilElasiDestroyShip; // 0x4f
// Counter used after telling Elasi to beam over
int16 counterUntilElasiBoardWithInvitation; // 0x51
bool putSupportBeamInSickbayHallway; // 0x53
bool clearedDebris; // 0x54
bool lookedAtTurbolift2Door; // 0x55
bool kirkShouldSuggestReestablishingPower; // 0x56
bool tookHypoFromSickbay; // 0x57
bool tookDrillFromSickbay; // 0x58
bool clearedDebrisInRoom5; // 0x59
bool havePowerPack; // 0x5a
bool enteredRoom5FirstTime; // 0x5b
bool askedSpockAboutFire; // 0x5c
// bits 0-1 are set for each of the 2 cables that can be connected to the
// junction box in engineering.
byte junctionCablesConnected; // 0x5d
bool tookCableFromTransporterRoomHallway; // 0x5e
bool tookCableFromSickbayHallway; // 0x5f
bool tookMolecularSaw; // 0x60
bool readEngineeringJournal; // 0x61
bool tookEngineeringJournal; // 0x62
bool engineeringCabinetOpen; // 0x63
bool setTransporterCoordinates; // 0x65
bool examinedTorpedoControl; // 0x66
bool powerPackPluggedIntoTransporter; // 0x67
bool field68; // 0x68
bool getPointsForHealingBrittany; // 0x69
bool readAllLogs; // 0x6a
bool field6b; // 0x6b
bool field6c; // 0x6c
void saveLoadWithSerializer(Common::Serializer &ser) {
ser.syncAsByte(usedMedkitOnBrittany);
ser.syncAsByte(talkedToBrittany);
ser.syncAsByte(brittanyDead);
ser.syncAsByte(lookedAtBrittany);
ser.syncAsByte(enteredRoom0FirstTime);
ser.syncAsSint16LE(missionScore);
ser.syncAsByte(bridgeCrewmanDead);
ser.syncAsByte(scannedCaptainsChair);
ser.syncAsByte(scannedComputerBank);
ser.syncAsByte(impulseEnginesOn);
ser.syncAsByte(beamState);
ser.syncAsByte(enterpriseLeftForDistressCall);
ser.syncAsByte(openedPanel);
ser.syncAsByte(clearedPanelDebris);
ser.syncAsByte(removedPanelDebris);
ser.syncAsByte(oilInHypo);
ser.syncAsByte(loosenedDebrisWithOil);
ser.syncAsByte(poweredSystem);
ser.syncAsByte(tricordersPluggedIntoComputer);
ser.syncAsByte(captainsLogIndex);
ser.syncAsByte(elasiShieldsDown);
ser.syncAsByte(torpedoLoaded);
ser.syncAsByte(firedTorpedo);
ser.syncAsByte(elasiShipDecloaked);
ser.syncAsByte(countdownStarted);
ser.syncAsByte(toldElasiToBeamOver);
ser.syncAsByte(scannedMainComputer);
ser.syncAsByte(elasiHailedRepublic);
ser.syncAsByte(tookRecordDeckFromAuxilaryControl);
ser.syncAsSint16LE(counterUntilElasiBoardWithShieldsDown);
ser.syncAsSint16LE(counterUntilElasiAttack);
ser.syncAsSint16LE(counterUntilElasiNagToDisableShields);
ser.syncAsSint16LE(counterUntilElasiDestroyShip);
ser.syncAsSint16LE(counterUntilElasiBoardWithInvitation);
ser.syncAsByte(clearedDebris);
ser.syncAsByte(lookedAtTurbolift2Door);
ser.syncAsByte(kirkShouldSuggestReestablishingPower);
ser.syncAsByte(tookHypoFromSickbay);
ser.syncAsByte(tookDrillFromSickbay);
ser.syncAsByte(clearedDebrisInRoom5);
ser.syncAsByte(havePowerPack);
ser.syncAsByte(enteredRoom5FirstTime);
ser.syncAsByte(askedSpockAboutFire);
ser.syncAsByte(junctionCablesConnected);
ser.syncAsByte(tookCableFromTransporterRoomHallway);
ser.syncAsByte(tookCableFromSickbayHallway);
ser.syncAsByte(tookMolecularSaw);
ser.syncAsByte(readEngineeringJournal);
ser.syncAsByte(tookEngineeringJournal);
ser.syncAsByte(engineeringCabinetOpen);
ser.syncAsByte(setTransporterCoordinates);
ser.syncAsByte(examinedTorpedoControl);
ser.syncAsByte(powerPackPluggedIntoTransporter);
ser.syncAsByte(field68);
ser.syncAsByte(getPointsForHealingBrittany);
ser.syncAsByte(readAllLogs);
ser.syncAsByte(field6b);
ser.syncAsByte(field6c);
}
} veng;
};
};
// Size: 0x129 bytes
// Bottle types for Love's Labor Jeopardized
enum BottleTypes {
BOTTLETYPE_NONE = 0,
BOTTLETYPE_N2O = 1,
BOTTLETYPE_NH3 = 2,
BOTTLETYPE_H2O = 3,
BOTTLETYPE_RLG = 4 // Romulan Laughing Gas
};
// Canister types for Love's Labor Jeopardized
enum CanisterTypes {
CANTYPE_NONE = 0,
CANTYPE_O2 = 1,
CANTYPE_H2 = 2,
CANTYPE_N2 = 3
};
// Synthesizer contents for Love's Labor Jeopardized (values for synthesizerContents)
enum SynthesizerContent {
SYNTHITEM_NONE = 0,
SYNTHITEM_PBC = 1,
SYNTHITEM_VIRUS_SAMPLE = 2,
SYNTHITEM_CURE_SAMPLE = 3,
SYNTHITEM_BOTTLE = 9 // Contents of bottle determined by "synthesizerBottleIndex" variable
};
#endif