Files
scummvm-cursorfix/engines/hadesch/rooms/monster.h
2026-02-02 04:50:13 +01:00

206 lines
4.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/>.
*
* Copyright 2020 Google
*
*/
namespace Hadesch {
enum {
// Splits of 15269 as we don't support intermediate anim callbacks
kCyclopsShootingEyeOpenMidAnim = 1015001,
kCyclopsShootingEyeClosedMidAnim = 1015002,
kHitReceived = 1015003
};
enum Monster {
kCyclops = 1,
kTyphoon = 2,
kIllusion = 3
};
struct FlightPosition {
Common::Point centerPos;
int scale;
};
class Projectile : Common::NonCopyable {
public:
Projectile(int id, int level, Monster monster, int startScale, Common::Point startPoint, int xmomentum);
~Projectile();
void handleEvent(int ev);
void stop();
void makeFlightParams(int xmomentum);
FlightPosition getFlightPosition(double t);
void handleAbsoluteClick(Common::SharedPtr <Projectile> backRef, Common::Point p);
// Event 15051
bool tick(Common::SharedPtr <Projectile> backRef);
private:
int getProjectileFlightLength(int level);
int getProjectileHitChance();
int _level;
bool _isMiss;
int _flightCounterMs;
int _flightStart;
int _projectileId;
int _pending;
bool _isFlightFinished;
LayerId _pendingAnim;
Common::String _flyAnim;
Common::String _interceptAnim;
Common::String _hitAnim;
int _startScale;
int _flightLengthMs;
Common::Point _start, _target, _attractor1, _attractor2;
};
class Battleground {
public:
Battleground();
int getNumOfProjectiles();
void launchProjectile(int startScale, Common::Point startPoint, int xmomentum);
void handleAbsoluteClick(Common::Point p);
void tick();
void stopFight();
int _level;
int _leavesRemaining;
Monster _monsterNum;
bool _isInFight;
private:
void stopProjectiles();
Common::Array <Common::SharedPtr<Projectile> > _projectiles;
int _projectileId;
};
struct Typhoon {
Typhoon(Common::SharedPtr<Battleground> battleground);
void handleEvent(int eventId);
void enterTyphoon(int level);
void handleClick(Common::SharedPtr<Typhoon> backRef,
const Common::String &name);
void hideHead(int idx);
void typhoonA();
void schedule15154();
int typhonGetNumAliveHeads();
void hitTyphoonHead(Common::SharedPtr<Typhoon> backRef, int idx);
void showHeadNormal(int idx);
static void stopAnims();
static void disableHotzones();
bool _headIsAlive[18];
bool _playingTyphoonRespawnSound;
bool _playingTyphoonDieSound;
bool _isKilled;
Common::SharedPtr<Battleground> _battleground;
};
class Cyclops {
public:
Cyclops(Common::SharedPtr<Battleground> battleground);
void handleEvent(int eventId);
void handleClick(Common::Point p);
void enterCyclops(int level);
private:
bool cyclopsIsHit(Common::Point p, int frame);
bool cyclopsIsHitBA0(Common::Point p, int frame);
unsigned getSquareOfPrecision();
void cyclopsState0();
void cyclopsState1();
void cyclopsState2();
void cyclopsState3();
void cyclopsState4();
void cyclopsState5();
void cyclopsState6();
Common::SharedPtr<Battleground> _battleground;
bool _cyclopsIsHiding;
int _cyclopsProximityCheckCountdown;
int _currentCyclopsState;
};
class Bird : Common::NonCopyable {
public:
Bird(int id);
void launch(int level);
void stop();
FlightPosition getFlightPosition(double t);
void handleAbsoluteClick(Common::Point p);
// Event 15201
void tick(Common::SharedPtr <Bird> backRef, Common::SharedPtr<Battleground> battleground);
void makeFlightParams();
int _id;
int _level;
bool _isActive;
Common::Point _startPos;
int _flightLengthMs;
int _flightStart;
int _flightCounterMs;
int _flightShootAnimFrame;
int _flightShootProjectileFrame;
int _flightShootEndFrame;
bool _hasShot;
Common::Point _targetPos;
Common::Point _attractor1;
Common::Point _attractor2;
int _birdType;
int _field84; // ?
};
class Illusion {
public:
Illusion(Common::SharedPtr<Battleground> battleground);
void handleEvent(int eventId);
void handleAbsoluteClick(Common::Point p);
void handleClick(const Common::String &name);
void enterIllusion(int level);
void tick();
static void stopAnims();
private:
void movePhil();
void launchBird();
Common::SharedPtr<Bird> _birds[3];
int _philPosition;
bool _illusionIsKilled;
Common::SharedPtr<Battleground> _battleground;
};
}