Input system notes Code that reads the input state defines a routine that goes through the DoInput routine. This is handled in a pseudo-OOP style. An "INPUT_STATE_DESC" has the following members: BOOLEAN (*InputFunc) (PVOID pInputState); COUNT MenuRepeatDelay; Although a "PVOID", pInputState has to be safely castable to INPUT_STATE_DESC. There are various "subclasses" that are used for this purpose throughout the code. They are also pased to the first argument of DoInput. The InputFunc returns TRUE if it still will be keeping control next frame. MenuRepeatDelay is an "internal" variable for making keyrepeat work right. "Subclasses": MENU_STATE - in starbase.h. The "pMenuState" global is usually the element referenced. This is used by: encount.c: DoSelectAction gameopt.c: DoGameOptions, DoSettings, DoTextEntry, DoNaming, DoQuitMenu, DoPickGame outfit.c: DoOutfit pickship.c: DoPickBattleShip restart.c: DoRestart shipyard.c: DoModifyShips, DoShipYard starbase.c: DoStarBase cargo.c: DoDiscardCargo devices.c: DoManipulateDevices lander.c: DoPlanetSide pstarmap.c: DoMoveCursor, DoFlagshipCommands roster.c: DoModifyRoster scan.c: DoScan, PickPlanetSide VIDEO_INPUT_STATE - in vidplayer.c. Used by TFB_DoVideoInput. ENCOUNTER_STATE - in comm.c. Used by DoCommunication. MELEE_STATE - in melee.h. Used by DoPickShip, DoLoadTeam, DoEdit, DoMelee. The game logic itself that uses DoInput treats it as a stack of state machines. The "current state" is in the InputFunc field of the argument. The state machines are (with the calls that initialize and allocate them): InitCommunication: DoCommunication DoMenuOptions, ExploreSolarSys: DoFlagshipCommands <-> DoDiscardCargo <-> DoManipulateDevices Roster: DoModifyRoster DoMelee <-> DoEdit <-> DoLoadTeam <-> DoPickShip VisitStarBase: DoStarBase <-> DoOutfit <-> DoInstallModule <-> DoShipyard <-> DoModifyShips DoStarMap: DoMoveCursor GameOptions: DoGameOptions <-> DoNaming <-> DoSettings <-> DoQuitMenu <-> DoPickGame GetArmadaStarShip: DoPickBattleShip StartGame: DoRestart ScanSystem: DoScan <-> PickPlanetSide <-> DoPlanetSide InitEncounter: DoSelectAction TFB_VideoInput: TFB_DoVideoInput These are called from the following points: InitCommunication: Called by the outtakes, the starbase, and the gen* files; generally anywhere where you need to transfer over to a conversation sequence. RaceCommunication () is the toplevel call for starcon.c. DoMenuOptions: Called by the postprocess operation for the sis_ship. ExploreSolarSys: Called by Starcon2Main. VisitStarBase: Called by Starcon2Main. DoStarMap: Called internally by DoFlagshipCommands. GameOptions: Called internally by DoOutfit, DoShipyard, DoSelectAction, and DoFlagshipCommands. Basically handles the GAME menu wherever it appears. GetArmadaStarShip: Called internally by GetEncounterStarShip. UninitShips calls GetEncounterStarShip, apparently to do cleanup. Everyone else calls GetNextStarShip. This is done by the Battle() routine, and by the new_ship function, which is assigned as a "death_func" for normal ships, and a "preprocess_func" for dead ships. StartGame: Called by Starcon2Main. ScanSystem: Called by DoFlagshipCommands InitEncounter: Called by InitCommunication when the player has an option. TFB_VideoInput: UQM's game logic will reach it by calling DoFMV. Starcon2Main ------------ This is a loop for the game. Right now I just have a list of top-level calls, and a list of checks made against GLOBAL(CurrentActivity). The actual significance of these things comes later. Activities: CHECK_LOAD, START_ENCOUNTER, CHECK_ABORT, IN_INTERPLANETARY, START_INTERPLANETARY, WON_LAST_BATTLE, CHECK_RESTART, IN_HYPERSPACE Game states: CHMMR_BOMB_STATE, GLOBAL_FLAGS_AND_DATA, KOHR_AH_KILLED_ALL Functions: Logo(), StartGame(), VisitStarBase(), RaceCommunication(), ExploreSolarSys(), Battle(). Note that Battle() here is actually for hyperspace travel. Super Melee combat is handled in DoMelee, and full-game combat is handled by EncounterBattle, called by InitCommunication.