25 #include "common/events.h" 26 #include "common/list.h" 27 #include "common/ptr.h" 28 #include "common/random.h" 29 #include "common/rect.h" 30 #include "common/scummsys.h" 31 #include "common/serializer.h" 32 #include "common/str.h" 33 #include "common/stream.h" 34 #include "common/system.h" 35 #include "common/util.h" 37 #include "engines/engine.h" 39 #include "math/cosinetables.h" 40 #include "math/sinetables.h" 42 #include "startrek/action.h" 43 #include "startrek/awaymission.h" 44 #include "startrek/graphics.h" 45 #include "startrek/items.h" 46 #include "startrek/object.h" 47 #include "startrek/sound.h" 48 #include "startrek/space.h" 49 #include "startrek/detection.h" 66 typedef String(StarTrekEngine::*TextGetterFunc)(int, uintptr,
String *);
68 const int SAVEGAME_DESCRIPTION_LEN = 30;
72 char description[SAVEGAME_DESCRIPTION_LEN + 1];
81 void setSaveTimeAndDate(
TimeDate time) {
82 saveDate = ((time.
tm_mday & 0xFF) << 24) | (((time.
tm_mon + 1) & 0xFF) << 16) | ((time.
tm_year + 1900) & 0xFFFF);
83 saveTime = ((time.
tm_hour & 0xFF) << 8) | ((time.
tm_min) & 0xFF);
84 saveTimeSecs = time.
tm_sec & 0xFF;
88 return (saveDate >> 24) & 0xFF;
91 return (saveDate >> 16) & 0xFF;
94 return saveDate & 0xFFFF;
97 return (saveTime >> 8) & 0xFF;
100 return saveTime & 0xFF;
105 const int MAX_MENUBUTTONS = 32;
106 const int TEXTBOX_WIDTH = 26;
107 const int TEXT_CHARS_PER_LINE = TEXTBOX_WIDTH - 2;
108 const int MAX_TEXTBOX_LINES = 12;
110 const int TEXT_INPUT_BUFFER_SIZE = 134;
111 const int MAX_TEXT_INPUT_LEN = 20;
113 const int MAX_BUFFERED_WALK_ACTIONS = 32;
115 const int MAX_BAN_FILES = 16;
131 GAMEMODE_AWAYMISSION,
136 enum TextDisplayMode {
137 TEXTDISPLAY_WAIT = 0,
138 TEXTDISPLAY_SUBTITLES,
143 TEXTCOLOR_GREY = 0x88,
144 TEXTCOLOR_RED = 0xa1,
145 TEXTCOLOR_YELLOW = 0xb0,
146 TEXTCOLOR_BLUE = 0xc0
151 Sprite sprites[MAX_MENUBUTTONS];
152 uint16 retvals[MAX_MENUBUTTONS];
153 uint32 disabledButtons;
155 int16 selectedButton;
162 MENUEVENT_RCLICK_OFFBUTTON = -4,
163 MENUEVENT_ENABLEINPUT,
164 MENUEVENT_RCLICK_ONBUTTON,
165 MENUEVENT_LCLICK_OFFBUTTON
170 TEXTBUTTON_CONFIRM = 0,
172 TEXTBUTTON_SCROLLDOWN,
173 TEXTBUTTON_PREVCHOICE,
174 TEXTBUTTON_NEXTCHOICE,
175 TEXTBUTTON_SCROLLUP_ONELINE,
176 TEXTBUTTON_SCROLLDOWN_ONELINE,
178 TEXTBUTTON_GOTO_BOTTOM,
179 TEXTBUTTON_SPEECH_DONE
184 enum OptionMenuButtons {
188 OPTIONBUTTON_ENABLEMUSIC,
189 OPTIONBUTTON_DISABLEMUSIC,
190 OPTIONBUTTON_ENABLESFX,
191 OPTIONBUTTON_DISABLESFX,
197 TREKEVENT_LBUTTONDOWN = 1,
198 TREKEVENT_MOUSEMOVE = 2,
199 TREKEVENT_LBUTTONUP = 3,
200 TREKEVENT_RBUTTONDOWN = 4,
201 TREKEVENT_RBUTTONUP = 5,
202 TREKEVENT_KEYDOWN = 6
229 targetAnalysis =
false;
253 void initBridge(
bool b);
255 void loadBridgeActors();
256 void cleanupBridge();
258 void setBridgeMouseCursor();
259 void playBridgeSequence(
int sequenceId);
260 void handleBridgeEvents();
261 void handleBridgeComputer();
262 void showMissionPerformance(
int score,
int missionScoreTextId,
int missionId);
264 int _bridgeSequenceToLoad;
268 void showTextboxBridge(
int talker,
int textId);
274 void wrongDestinationRandomEncounter();
275 void bridgeCrewAction(
int crewId);
276 void contactTargetAction();
277 void orbitPlanetSequence(
int sequenceId);
278 void negotiateWithElasiCereth();
279 void hailTheMasada();
282 int16 _currentPlanet;
283 int _currentScreenTalker;
286 int _deadMasadaPrisoners;
287 bool _beamDownAllowed;
289 int16 _randomEncounterType;
290 int16 _lastMissionId;
291 int16 _missionPoints[7];
297 uint16 getRandomWord();
300 void initAwayMission();
301 void runAwayMission();
302 void cleanupAwayMission();
304 void initAwayCrewPositions(
int warpEntryIndex);
305 void handleAwayMissionEvents();
306 void awayMissionLeftClick();
311 void awayMissionSelectAction(
bool openActionMenu);
312 void awayMissionUseObject(int16 clickedObject);
313 void awayMissionGetLookOrTalk(int16 clickedObject);
319 int loadActorAnimWithRoomScaling(
int actorIndex,
const Common::String &animName, int16 x, int16 y);
320 Fixed8 getActorScaleAtPosition(int16 y);
321 void addAction(
const Action &action);
322 void addAction(int8 type, byte b1, byte b2, byte b3);
323 void handleAwayMissionAction();
325 void checkTouchedLoadingZone(int16 x, int16 y);
330 void updateAwayMissionTimers();
336 bool isPositionSolid(int16 x, int16 y);
337 void loadRoomIndex(
int roomIndex,
int spawnIndex);
344 void showCreditsScreen(
R3 *creditsBuffer,
int index,
bool deletePrevious =
true);
349 void initIntroR3ObjectToMove(
R3 *r3, int16 srcAngle, int16 srcDepth, int16 destAngle, int16 destDepth, int16 ticks);
350 void loadSubtitleSprite(
int index,
Sprite *sprite);
353 void initStarfieldPosition();
354 void initStarfield(int16 x, int16 y, int16 width, int16 height, int16 arg8);
357 void clearStarfieldPixels();
358 void drawStarfield();
359 void updateStarfieldAndShips(
bool arg0);
360 R3 *sub_19f24(
R3 *r3);
361 void drawR3Shape(
R3 *r3);
362 bool sub_1c022(
R3 *r3);
364 Point3 constructPoint3ForStarfield(int16 x, int16 y, int16 z);
367 int32 scaleSpacePosition(int32 x, int32 z);
382 int loadActorAnim(
int actorIndex,
const Common::String &animName, int16 x, int16 y,
Fixed8 scale);
388 bool actorWalkToPosition(
int actorIndex,
const Common::String &animFile, int16 srcX, int16 srcY, int16 destX, int16 destY);
389 void updateActorAnimations();
396 void renderBanBelowSprites();
397 void renderBan(byte *screenPixels, byte *bgPixels,
int banFileIndex);
398 void renderBanAboveSprites();
399 void removeActorFromScreen(
int actorIndex);
400 void removeDrawnActorsFromScreen();
402 void releaseAnim(
Actor *actor);
403 void initStandAnim(
int actorIndex);
404 void updateActorPositionWhileWalking(
Actor *actor, int16 x, int16 y);
409 void chooseActorDirectionForWalking(
Actor *actor, int16 srcX, int16 srcY, int16 destX, int16 destY);
414 bool directPathExists(int16 srcX, int16 srcY, int16 destX, int16 destY);
416 int findObjectAt(
int x,
int y);
418 return findObjectAt(p.
x, p.
y);
430 int selectObjectForUseAction();
435 void updateMouseBitmap();
440 bool walkActiveObjectToHotspot();
444 bool isObjectUnusable(
int objectIndex,
int action);
448 void updateCrewmanGetupTimers();
449 void showInventoryIcons(
bool showItem);
450 void hideInventoryIcons();
451 int showInventoryMenu(
int x,
int y,
bool restoreMouse);
459 void scaleBitmapRow(byte *src, byte *dest, uint16 origWidth, uint16 scaledWidth);
467 void pollEvents(
bool queueEvents =
true);
468 void waitForNextTick(
bool queueEvents =
true);
469 void initializeEventsAndMouse();
474 bool getNextEvent(
TrekEvent *e,
bool poll =
true);
475 void removeNextEvent();
476 bool popNextEvent(
TrekEvent *e,
bool poll =
true);
477 void addEventToQueue(
const TrekEvent &e);
485 bool _mouseMoveEventInQueue;
486 bool _tickEventInQueue;
487 uint32 _frameStartMillis;
496 const char *getNextTextLine(
const char *text,
char *line,
int lineWidth);
501 void drawTextLineToBitmap(
const char *text,
int textLen,
int x,
int y,
Bitmap *bitmap);
515 void showTextbox(
Common::String headerText,
const Common::String &mainText,
int xoffset,
int yoffset, byte textColor,
int maxTextLines);
528 int showText(TextGetterFunc textGetter, uintptr var,
int xoffset,
int yoffset,
int textColor,
bool loopChoices,
int maxTextLines,
bool rclickCancelsChoice);
539 TextBitmap *initTextSprite(
int *xoffsetPtr,
int *yoffsetPtr, byte textColor,
int numTextLines,
bool withHeader,
Sprite *sprite);
543 void drawMainText(
TextBitmap *bitmap,
int numTextLines,
int numTextboxLines,
const Common::String &text,
bool withHeader);
545 Common::String readLineFormattedText(TextGetterFunc textGetter, uintptr var,
int choiceIndex,
TextBitmap *textBitmap,
int numTextboxLines,
int *numLines);
556 String readTextFromArrayWithChoices(
int choiceIndex, uintptr data,
Common::String *headerTextOutput);
561 void redrawTextInput();
562 void addCharToTextInputBuffer(
char c);
567 void initTextInputSprite(int16 arg0, int16 arg2,
const Common::String &headerText);
568 void cleanupTextInputSprite();
571 char _textInputBuffer[TEXT_INPUT_BUFFER_SIZE];
572 int16 _textInputCursorPos;
573 char _textInputCursorChar;
581 int getMenuButtonAt(
Sprite *sprites,
int numSprites,
int x,
int y);
590 void chooseMousePositionFromSprites(
Sprite *sprites,
int numSprites,
int spriteIndex,
int mode);
595 void drawMenuButtonOutline(
Bitmap *bitmap, byte color);
596 void showOptionsMenu(
int x,
int y);
598 void handleBridgeMenu(
int menuEvent);
606 int showActionMenu();
610 void loadMenuButtons(
String mnuFilename,
int xpos,
int ypos);
614 void setVisibleMenuButtons(uint32 bits);
618 void disableMenuButtons(uint32 bits);
619 void enableMenuButtons(uint32 bits);
624 int handleMenuEvents(uint32 ticksUntilClickingEnabled,
bool inTextbox);
625 void unloadMenuButtons();
630 void chooseMouseBitmapForAction(
int action,
bool withRedOutline);
631 void showQuitGamePrompt(
int x,
int y);
632 void showGameOverMenu();
637 void showTextConfigurationMenu(
bool fromOptionMenu);
639 int loadTextDisplayMode();
640 void saveTextDisplayMode(
int value);
645 void showRepublicMap(int16 arg0, int16 turbolift);
649 int getRepublicMapAreaAtMouse();
654 int getRepublicMapAreaOrFailure(int16 turbolift);
658 int16 _textDisplayMode;
661 bool _textboxHasMultipleChoices;
664 bool _keyboardControlsMouseOutsideMenu;
672 bool loadGame(
int slot);
685 uint32 getFeatures()
const;
687 uint8 getGameType()
const;
692 return _missionName + (char)(_roomIndex +
'0');
705 int _roomIndexToLoad;
706 int _spawnIndexToLoad;
717 bool _warpHotspotsActive;
718 int16 _activeWarpHotspot;
719 int16 _activeDoorWarpHotspot;
720 int16 _lookActionBitmapIndex;
722 Item _itemList[NUM_OBJECTS];
724 Actor _actorList[NUM_ACTORS];
725 Actor *
const _kirkActor;
726 Actor *
const _spockActor;
727 Actor *
const _mccoyActor;
728 Actor *
const _redshirtActor;
733 uint16 _banFileOffsets[MAX_BAN_FILES];
735 Sprite _inventoryIconSprite;
740 bool _objectHasWalkPosition;
746 Action _actionOnWalkCompletion[MAX_BUFFERED_WALK_ACTIONS];
747 bool _actionOnWalkCompletionInUse[MAX_BUFFERED_WALK_ACTIONS];
753 uint32 _roomFrameCounter;
758 uint16 _musicWorking;
760 bool _finishedPlayingSpeech;
762 bool _mouseControllingShip;
767 bool _keyboardControlsMouse;
769 bool _inQuitGameMenu;
776 Star _starList[NUM_STARS];
777 Point3 _starfieldPosition;
778 int32 _starfieldPointDivisor;
779 int16 _starfieldXVar1, _starfieldYVar1;
780 int16 _starfieldXVar2, _starfieldYVar2;
783 R3 *_r3List[NUM_SPACE_OBJECTS];
784 R3 *_orderedR3List[NUM_SPACE_OBJECTS];
785 Matrix _starPositionMatrix;
797 int leftClickEvent();
798 int rightClickEvent();
799 int mouseMoveEvent();
800 int lookupNextAction(
const int *lookupArray,
int action);
801 void loadBridgeComputerTopics();
802 void bridgeLeftClick();
805 Math::SineTable _sineTable;
806 Math::CosineTable _cosineTable;
int tm_hour
Definition: system.h:112
int tm_mday
Definition: system.h:113
int tm_min
Definition: system.h:111
Definition: startrek.h:217
Definition: memstream.h:103
Definition: resource.h:54
Definition: startrek.h:212
int tm_sec
Definition: system.h:110
Definition: detection.h:39
Definition: algorithm.h:29
Definition: formatinfo.h:28
int tm_year
Definition: system.h:115
Definition: awaymission.h:27
int tm_mon
Definition: system.h:114
Definition: keyboard.h:294
Definition: startrek.h:237
Definition: startrek.h:205
Language
Definition: language.h:45