/* 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 . * */ #ifndef DGDS_MINIGAMES_CHINA_TRAIN_H #define DGDS_MINIGAMES_CHINA_TRAIN_H namespace Dgds { enum PlayerType { kPlayerLucky, kPlayerTong, }; enum PlayerAction { // The list of actions is not directly referenced in the game, but is in // the exe just after the "Heart of China Train Game" copyright kActionStandRight = 0, kActionWalkRight = 1, kActionWalkLeft = 2, kActionJumpRight = 3, kActionJumpLeft = 4, kActionDuckRight = 5, kActionFallRight = 6, kActionFallLeft = 7, kActionStagger = 8, kActionDeathScene = 9, kActionClub = 10, kActionClubHit = 11, kActionSwing = 12, kActionSwingHit = 13, kActionStab = 14, kActionStabHit = 15, kActionBlock = 16, kActionHeroicJump = 17, kActionBlockUp = 18, kActionFree6 = 19, kActionStandLeft = 20, kActionDuckLeft = 21, kActionFree7 = 22, kActionFree8 = 23, kActionERROR = 24, }; enum PlayerIntent { kIntentDuck = 0, kIntentRest = 1, kIntentPursue = 2, kIntentAttack = 3, kIntentRetreat = 4, kIntentQ = 5, kIntentInvalid = 255, }; class TrainPlayers; struct PlayerData { int16 _frame; // field 0 ImageFlipMode _flipMode; // field 1 int16 _xstep; // field 2 int16 _ystep; // field 3 int16 _xoff; // field 4 int16 _yoff; // field 5 int16 _val6; // field 6 }; struct TunnelData { TunnelData() : _start(0), _end(0) {} int32 _start; int32 _end; }; class TrainPlayer { public: friend class TrainPlayers; TrainPlayer(PlayerType type); bool isBlocking() const { return _action == kActionBlock || _action == kActionBlockUp; } bool isDucking() const { return _action == kActionDuckRight || _action == kActionDuckLeft; } bool isFalling() const { return _action == kActionFallRight || _action == kActionFallLeft; } bool isJumping() const { return _action == kActionJumpRight || _action == kActionJumpLeft; } bool isStaggering() const { return _action == kActionStagger; } bool isStanding() const { return _action == kActionStandRight || _action == kActionStandLeft; } bool isWalking() const { return _action == kActionWalkLeft || _action == kActionWalkRight; } bool isTong() const { return _type == kPlayerTong; } bool isLucky() const { return _type == kPlayerLucky; } void checkLives(); void doAttack(TrainPlayer &other); void doBlock(); void doClub(int16 damage); void doPursue(const TrainPlayer &other); void doRun(); void doJump(); void setAction(PlayerAction state, bool flag); bool inRange(const TrainPlayer &other); void hit(int16 damage); void startStagger(const TrainPlayer &other); void readStuff(const Common::String &path); void computerDucks(); void checkDuck(const TunnelData ¤tTunnel); void doProcess(); PlayerType _type; int16 _xpos; int16 _ypos; PlayerAction _action; int16 _fatigue; int16 _hitpoints; PlayerIntent _intent; int16 _ferocity; int16 _val7; Common::Array> _allData; Common::Array *_currentActionData; PlayerData *_data; private: TrainPlayer &chooseEnemy(); PlayerData *endOfCurrentAction(); PlayerData *startOfCurrentAction(); static int16 _blockSoundFlag; }; class TrainPlayers { public: TrainPlayers(); void initPlayers(); void checkLives(); void readAnims(); void freeAnims(); void doScroll(int16 jumpOffset); TrainPlayer _lucky; TrainPlayer _tong; }; /** Train fight mini-game for Heart of China */ class ChinaTrain { public: ChinaTrain(); void init(); // aka arcadeInit int16 tick(); // aka arcadeLoop void end(); // aka aracdeReset //int16 currentCar() const { return _currentCar; } void checkTongFall(int16 xpos, int16 car); TrainPlayers &getPlayers() { return _players; } const TunnelData &getCurrentTunnel() const { return _currentTunnel; } void leaveArcade(); bool checkGap(int16 xpos, int16 offset); void onKeyDown(Common::KeyState kbd); void onKeyUp(Common::KeyState kbd); void setMenuResult(bool yes); int16 _jumpOffset; private: void arcadeFadeout(); void getUserInput(); void getNpcInput(); void processInput(); void handleVariables(); void drawFrame(); int16 trainArcade(); void trainRestart(); void lost(); void makeNewTunnel(); //void setupArcade(); // just sets fill=1 and _clipWin. void initScoreWindow(); void drawBorder(); void shadeLabel(int16 x, int16 y, int16 w, int16 h, const char *label); void shadeBox(Graphics::ManagedSurface &buf, byte backCol, byte foreCol, byte fill, int16 x, int16 y, int16 w, int16 h); void fixBorder(); void drawCommandButtons(); void drawBmps(); void drawTunnel(); void drawMountains(int16 num); void drawBlock(int16 x1, int16 x2, int16 param_3, int16 y1, int16 y2, int16 param_6, int16 param_7, int16 param_8); void drawButtons(int16 *buttons); void shadePressButton(int16 x, int16 y); void shadeButton(int16 x, int16 y); void drawScoreWindow(); void drawScore(); void drawSnow(); void drawTrain(); void drawActors(); void drawCar(int16 xoff, int16 frame, int16 yoff); void fixUpTunnel(); bool calcBounce(int16 car); void checkRegions(TrainPlayer &player); void processOrders(TrainPlayer &player, TrainPlayer &enemy); int16 readButtons(); void cabooseLost(); int16 _arcadeCount; int16 _arcadeFlag; bool _arcadeInitFlag; int16 _arcadeDrawFlag; int16 _failCounter; int16 _lastMaskedArcadeFlag; int16 _int3036; int16 _tongAttackCounter; int16 _tongInjuredCounter; int16 _tongRestTarget; int16 _lastTongHP; int16 _lastTongFatigue; TrainPlayers _players; int16 _currentCar; int32 _trackPos; int32 _frameCnt; int16 _xOffset; int16 _tunnelNum; TunnelData _currentTunnel; int16 _cabooseTrail; int16 _lastBtn; const Common::Rect _clipWin; //Common::SharedPtr _simChars; Common::SharedPtr _rectShape; Common::SharedPtr _luckyMaps; Common::SharedPtr _test; int16 _pressedCommandButton; bool _leftButtonDown; bool _rightButtonDown; int16 _lastKeycode; bool _playedTunnelSFX; }; } // end namespace Dgds #endif // DGDS_MINIGAMES_CHINA_TRAIN_H