Files
2026-02-02 04:50:13 +01:00

229 lines
5.8 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 DGDS_MINIGAMES_DRAGON_ARCADE_H
#define DGDS_MINIGAMES_DRAGON_ARCADE_H
#include "common/types.h"
#include "engines/dgds/minigames/dragon_arcade_ttm.h"
namespace Dgds {
enum DragonBulletState {
kBulletInactive = 0,
kBulletFlying = 1,
kBulletHittingBlade = 2,
kBulletHittingEnemy = 3,
};
enum DragonBladeMoveFlag {
kBladeMoveNone = 0,
kBladeMoveUp = 1,
kBladeMoveDown = 2,
kBladeMoveRight = 4,
kBladeMoveLeft = 8,
};
class ArcadeNPCState {
public:
ArcadeNPCState() : xx(0), yy(0), x(0), y(0), x_11(0), y_11(0), x_12(0), y_12(0),
ttmPage(0), byte12(0), byte13(0), health(0), ttmNum(0), x_21(0), y_21(0),
x_22(0), y_22(0) {}
int16 xx;
int16 yy;
int16 x;
int16 y;
int16 x_11;
int16 y_11;
int16 x_12;
int16 y_12;
int16 ttmPage;
int8 byte12;
int8 byte13;
int8 health;
int8 ttmNum; /* Set to 0, 1 or 2 */
int16 x_21;
int16 y_21;
int16 x_22;
int16 y_22;
};
class DragonArcadeBullet {
public:
DragonArcadeBullet() : _x(0), _y(0), _state(kBulletInactive),
_flipMode(kImageFlipNone), _bulletType(0), _ySpeed(0) {}
int16 _x;
int16 _y;
DragonBulletState _state;
ImageFlipMode _flipMode;
int16 _bulletType;
uint16 _ySpeed;
// these fields are in the original but seem to not be used.
// int16 _var2;
// int16 _var3;
};
class DragonArcade {
public:
DragonArcade();
void arcadeTick();
void onKeyDown(Common::KeyState kbd);
void onKeyUp(Common::KeyState kbd);
private:
void initIfNeeded();
void drawBackgroundAndWeapons();
void checkToOpenMenu();
void clearAllBulletStates();
void clearAllNPCStates();
void createBullet(int16 x, int16 y, ImageFlipMode flipMode, int16 bulletType);
void bladeTakeHitAndCheck();
void enemyTakeHit() { _npcState[1].health--; }
void enemyTakeHitAndCheck();
void playSfx(int16 num) const;
void drawBulletHitCircles(uint16 x, uint16 y, bool colorFlag);
void drawHealthBars();
void runThenDrawBulletsInFlight();
void redraw();
void finish();
void loadTTMScriptsForStage(uint16 stage);
void fadeInAndClearScreen();
bool doTickUpdate();
void resetStageState();
void initValuesForStage();
void initValuesForStage0();
void initValuesForStage2();
void initValuesForStage3();
void initValuesForStage4();
void initValuesForStage6();
void setFinishCountdownIfLessThan0(int16 val);
void updateBladeWithInputs();
void updateBlade();
void updateBoss();
void updateBoss2();
void decBossHealth();
void decBossHealthAndCheck();
void bladeTakeHit();
void arcade16bc();
void arcade16de(int16 param);
void arcade1e83();
void arcade2445();
void arcade2754(int16 findResult);
void arcade34b4();
void arcade3e96();
void arcade4085();
void updateXScrollOffset();
bool isNpcInsideXRange(int16 num);
void updateBullets();
void checkBladeFireAllStages();
void checkEnemyFireStage0124();
void checkBossFireStage3();
void checkBossFireStage6();
void updateMouseAndJoystickStates();
int16 findFloorUnderBlade();
int16 checkBulletCollision(int16 num);
void mouseUpdate();
void keyboardUpdate();
void limitToCenterOfScreenAndUpdateCursor();
uint16 moveToNextStage();
void findFloorMatch();
void findFloorMinGT();
void findFloorMinGE();
void findFloorMatchOrMinOrMax();
void findFloorMax();
void updateFloorsUnderBlade();
bool isFloorNotFound();
void playSFX55AndStuff();
void moveBladeX();
void handleMouseStates();
void drawScrollBmp();
int16 _lastDrawnBladeHealth;
int16 _lastDrawnBossHealth;
uint16 _nextRandomVal;
int16 _loadedArcadeStage;
int16 _nextStage;
int16 _attemptCounter;
int16 _shouldUpdateState;
int16 _finishCountdown;
int16 _bladeState1;
int16 _bladePageOffset;
uint16 _mouseButtonWentDown;
int16 _scrollXOffset;
int32 _nTickUpdates;
int16 _startDifficultyMaybe;
int16 _bossStateUpdateCounter;
int16 _npcStateResetCounter;
int16 _scrollVelocityX;
uint16 _uint0a17;
int16 _currentYOffset;
int16 _int0b58;
int16 _int0b5a;
int16 _int0b60;
int16 _ttmYAdjust;
uint16 _uint0be6;
bool _dontMoveBladeFlag;
int16 _scrollXIncrement;
bool _lMouseButtonState;
bool _rMouseButtonState;
bool _lastLMouseButtonState;
bool _lastRMouseButtonState;
int16 _bladeXMove;
int16 _currentArrowNum;
int16 _foundFloorY;
bool _foundFloorFlag;
int16 _lastFloorY;
bool _haveBigGun;
bool _haveBomb;
bool _enemyHasSmallGun;
bool _dontRedrawBgndAndWeapons;
// maybe don't need these
//bool _arcadeNeedsBufferCopy;
//bool _flagInventoryOpened;
bool _initFinished;
bool _stillLoadingScriptsMaybe;
bool _flag40ee;
bool _flag40ef;
int16 _someMoveDirection;
bool _bladeHasFired;
bool _mouseIsAvailable;
bool _isMovingStage;
DragonBladeMoveFlag _bladeMoveFlag;
DragonBladeMoveFlag _keyStateFlags;
DragonBladeMoveFlag _bladeMoveFlagBeforeRButton;
DragonBladeMoveFlag _bladeHorizMoveAttempt;
DragonArcadeBullet _bullets[20];
ArcadeNPCState _npcState[20];
Common::SharedPtr<Image> _bulletImg;
Common::SharedPtr<Image> _arrowImg;
Common::SharedPtr<Image> _scrollImg;
DragonArcadeTTM _arcadeTTM;
Common::Array<int16> _floorY;
Common::Array<bool> _floorFlag;
};
} // end namespace Dgds
#endif // DGDS_MINIGAMES_DRAGON_ARCADE_H