1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-12-01 15:35:47 +00:00
Aquaria/Aquaria/Avatar.h
2017-01-17 11:15:47 +01:00

476 lines
10 KiB
C++

/*
Copyright (C) 2007, 2010 - Bit-Blot
This file is part of Aquaria.
Aquaria 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 2
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, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef AVATAR_H
#define AVATAR_H
#include "../BBGE/Particles.h"
#include "Entity.h"
class TileVector;
class SongIcon;
class Web;
class Hair;
struct Target
{
public:
Target() { e = 0; targetPt = -1; }
Entity *e;
Vector pos;
int targetPt;
Vector getWorldPosition();
};
enum BurstType
{
BURST_NONE = 0,
BURST_NORMAL = 1,
BURST_WALL = 2
};
enum EnableInputType
{
AVATARINPUT_DEFAULT = 0,
AVATARINPUT_NOCURSOR = 1,
AVATARINPUT_MAX
};
enum AvatarAnimLayers
{
ANIMLAYER_FLOURISH = 3,
ANIMLAYER_OVERRIDE = 4,
ANIMLAYER_ARMOVERRIDE = 5,
ANIMLAYER_UPPERBODYIDLE = 6,
ANIMLAYER_HEADOVERRIDE = 7,
ANIMLAYER_MAX
};
enum SeeMapMode
{
SEE_MAP_NEVER = 0,
SEE_MAP_DEFAULT = 1,
SEE_MAP_ALWAYS = 2,
};
class SongIconParticle : public Quad
{
public:
SongIconParticle(Vector color, Vector pos, size_t note);
int note;
SongIcon *toIcon;
protected:
void onUpdate(float dt);
};
class SongIcon : public Quad
{
public:
SongIcon(size_t note);
void destroy();
size_t note;
void openNote();
void closeNote();
void openInterface();
void closeInterface();
static int notesOpen;
Vector noteColor;
bool open;
protected:
Quad *glow;
float rippleTimer;
float len;
float ptimer;
void spawnParticles(float dt);
void *channel;
float delay, counter, minTime;
bool cursorIsIn;
void onUpdate(float dt);
};
class AvatarState
{
public:
AvatarState();
Timer blindTimer;
float abilityDelay;
bool blind;
bool wasUnderWater;
float shotDelay;
Timer useItemDelay;
Timer lockToWallDelay;
float spellCharge;
bool lockedToWall;
float leachTimer;
bool nearWall;
float swimTimer, rollTimer;
float updateLookAtTime;
float blinkTimer;
Entity *lookAtEntity;
Vector outOfWaterVel;
float outOfWaterTimer;
bool backFlip;
};
class Avatar : public Entity, public ActionMapper
{
public:
Avatar();
virtual ~Avatar();
void destroy();
void action(int actionID, int state, int source, InputDevice device);
AvatarState state;
float burst, burstTimer;
float burstDelay;
bool bursting;
BurstType lastBurstType;
bool isCharging();
void setBlind(float time);
void revive();
bool canWarp;
void entityDied(Entity *e);
void onCollide(Entity *e);
bool zoomOverriden;
void clampPosition();
void splash(bool down);
InterpolatedVector myZoom;
Entity *entityToActivate;
Path *pathToActivate;
void applyWorldEffects(WorldType type);
void toggleMovement(bool on);
void refreshModel(std::string file, const std::string &skin, bool forceIdle=false);
void refreshDualFormModel();
void switchDualFormMode();
void enableInput();
void disableInput();
void clearTargets();
bool singing;
Vector getKeyDir();
void startBurstCommon();
void openSingingInterface(InputDevice device);
void closeSingingInterface();
void updateSingingInterface(float dt);
void playHitSound();
void changeForm(FormType form, bool effects=true, bool onInit=false, FormType lastForm=FORM_NONE);
void singNote(int note);
std::vector<SongIcon*> songIcons;
Song currentSong;
int currentSongIdx;
Entity *pullTarget;
void setNearestPullTarget();
void formAbility();
bool isMouseInputEnabled();
void startCharge();
int currentMaxSpeed;
Vector getFakeCursorPosition();
Vector getVectorToCursor(bool trueMouse=false);
Vector getVectorToCursorFromScreenCentre();
bool canDie;
Vector warpInLocal;
float biteDelay, urchinDelay, jellyDelay;
bool movingOn;
void render();
void activateAura(AuraType aura);
void stopAura();
void setHeadTexture(const std::string &name, float t=0);
float headTextureTimer;
void updateDamageVisualEffects();
int chargeLevelAttained;
void chargeVisualEffect(const std::string &tex);
void updateFormVisualEffects(float dt);
bool isSinging();
bool isLockable();
int getCursorQuadrant();
void onWarp();
int getBurstDistance();
int getStopDistance();
int looking;
std::string getIdleAnimName();
bool isRolling() { return rolling; }
int rollDir;
std::string getBurstAnimName();
std::string getRollAnimName();
void updateDualFormChargeEffects();
TileVector wallLockTile;
Vector wallNormal;
void fallOffWall();
float fireDelay;
AuraType activeAura;
float auraTimer;
bool fireAtNearestValidEntity(const std::string &shot);
void checkNearWall();
Vector getAim();
Vector getForwardAim();
void setWasUnderWater();
Quad *lightFormGlow, *lightFormGlowCone;
void setBlockSinging(bool v);
Vector headPosition;
void updatePosition();
float quickSongCastDelay;
void onAnimationKeyPassed(int key);
bool isSwimming();
bool isBlockSinging() { return blockSinging; }
float songInterfaceTimer;
void removeEatData(int idx);
typedef std::list<Entity*> BittenEntities;
BittenEntities bittenEntities;
Target getNearestTarget(const Vector &checkPos, const Vector &distPos, Entity *source, DamageType dt, bool override=false, std::vector<Target> *ignore=0);
void toggleCape(bool on);
void updateLookAt(float dt);
void updateFoodParticleEffects();
void endOfGameState();
bool canQuickSong();
bool canActivateStuff();
void setCanActivateStuff(bool on);
bool hasThingToActivate();
float biteTimer;
Timer flourishTimer;
Timer flourishPowerTimer;
Timer stillTimer;
void refreshNormalForm();
bool canChangeForm;
void bindInput();
Vector getHeadPosition();
Bone *boneLeftArm, *boneFish2, *bone_head, *bone_dualFormGlow;
Bone *boneLeftHand, *boneRightHand;
void startFlourish();
void applyTripEffects();
void removeTripEffects();
void stopBurst();
void createWeb();
void clearWeb();
Web *web;
float rollDelay;
bool canSetBoneLock();
void revert();
void doBindSong();
void doShieldSong();
bool canBurst() const { return _canBurst; }
void setCanBurst(bool b) { _canBurst = b; }
bool canLockToWall() const { return _canLockToWall; }
void setCanLockToWall(bool b) { _canLockToWall = b; }
bool canSwimAgainstCurrents() const { return _canSwimAgainstCurrents; }
void setCanSwimAgainstCurrents(bool b) { _canSwimAgainstCurrents = b; }
bool canCollideWithShots() const { return _canCollideWithShots; }
void setCollideWithShots(bool b) { _canCollideWithShots = b; }
void setCollisionAvoidanceData(int range, float mod);
void setSeeMapMode(SeeMapMode mode) { _seeMapMode = mode; }
SeeMapMode getSeeMapMode() const { return _seeMapMode; }
int leaches;
float shieldPoints;
float elementEffectMult;
bool blockBackFlip;
int getLastActionSourceID() const { return _lastActionSourceID; }
InputDevice getLastActionInputDevice() const { return _lastActionInputDevice; }
protected:
void setSongIconPositions();
Timer webBitTimer;
int curWebPoint;
void checkUpgradeForShot(Shot *s);
size_t getNumShots();
void lockToWallCommon();
void onSetBoneLock();
void onUpdateBoneLock();
void adjustHeadRot();
std::string lastHeadTexture;
void updateDualFormGlow(float dt);
Vector getTendrilAimVector(int i, int max);
void applyRidingPosition();
void stopWallJump();
void updateWallJump(float dt);
float wallBurstTimer;
float targetUpdateDelay;
std::vector<Target> targets;
void updateTargets(float dt, bool override);
void updateTargetQuads(float dt);
Vector bodyOffset;
bool flourish;
bool blockSinging;
bool _isUnderWater;
Path *lastWaterBubble;
bool lastJumpOutFromWaterBubble;
int spiritEnergyAbsorbed;
float formAbilityDelay;
Vector bodyPosition;
bool joystickMove;
bool ripples;
float rippleDelay, tripDelay;
float formTimer;
float fallGravityTimer;
Vector fallGravity;
int lastOutOfWaterMaxSpeed;
void onIdle();
void onHeal(int type);
ParticleEffect biteLeftEmitter, biteRightEmitter, swimEmitter, auraHitEmitter;
ParticleEffect auraEmitter, auraLowEmitter, wakeEmitter, healEmitter, hitEmitter, rollLeftEmitter, rollRightEmitter, spiritBeaconEmitter, plungeEmitter;
ParticleEffect speedEmitter, defenseEmitter, invincibleEmitter, regenEmitter;
ParticleEffect *leftHandEmitter, *rightHandEmitter;
ParticleEffect *chargingEmitter, *chargeEmitter;
void updateCursor(float dt);
bool rolling;
int rollDidOne;
void startRoll(int dir);
void stopRoll();
int getQuadrantDirection(int lastQuad, int quad);
void updateRoll(float dt);
int lastQuad, lastQuadDir;
void onDamage(DamageData &d);
void updateHair(float dt);
void lostTarget(int i, Entity *e);
Vector shieldPosition;
void updateAura(float dt);
void onHealthChange(float change);
void startWallBurst(bool useCursor=true);
void startBurst();
void startBackFlip();
void stopBackFlip();
void clampVelocity();
bool canCharge();
void formAbilityUpdate(float dt);
float revertTimer;
void endCharge();
Entity *activateEntity;
bool canMove;
void onEnterState(int action);
void onExitState(int action);
std::vector<ParticleEffect*>targetQuads;
Quad *blinder, *fader, *tripper;
void applyBlindEffects();
void removeBlindEffects();
float zoomVel;
Vector getWallNormal(TileVector t);
bool checkWarpAreas();
float splashDelay;
void onUpdate(float dt);
void onRender();
Quad *glow;
bool swimming;
void lmbd(int source, InputDevice device);
void lmbu(int source, InputDevice device);
void rmbd(int source, InputDevice device);
void rmbu(int source, InputDevice device);
bool charging;
float pushingOffWallEffect;
float lockToWallFallTimer;
Vector wallPushVec;
void lockToWall();
void doShock(const std::string &shotName);
bool _canActivateStuff;
bool _canBurst;
bool _canLockToWall;
bool _canSwimAgainstCurrents;
bool _canCollideWithShots;
SeeMapMode _seeMapMode;
int _collisionAvoidRange;
float _collisionAvoidMod;
int _lastActionSourceID;
InputDevice _lastActionInputDevice;
};
#endif