284 lines
9.3 KiB
C
284 lines
9.3 KiB
C
#ifndef ANIMATION_H
|
|
#define ANIMATION_H
|
|
|
|
#include "art.h"
|
|
#include "combat_defs.h"
|
|
#include "obj_types.h"
|
|
#include "sound.h"
|
|
|
|
#define ANIMATION_SEQUENCE_LIST_CAPACITY (32)
|
|
#define ANIMATION_DESCRIPTION_LIST_CAPACITY (55)
|
|
|
|
typedef enum AnimKind {
|
|
ANIM_KIND_OBJ_MOVE_TO_OBJ = 0,
|
|
ANIM_KIND_OBJ_MOVE_TO_TILE = 1,
|
|
ANIM_KIND_2 = 2,
|
|
ANIM_KIND_KNOCKDOWN = 3,
|
|
ANIM_KIND_ANIMATE = 4,
|
|
ANIM_KIND_ANIMATE_REVERSE = 5,
|
|
ANIM_KIND_6 = 6,
|
|
ANIM_KIND_SET_ROTATION_TO_TILE = 7,
|
|
ANIM_KIND_ROTATE_CLOCKWISE = 8,
|
|
ANIM_KIND_ROTATE_COUNTER_CLOCKWISE = 9,
|
|
ANIM_KIND_HIDE = 10,
|
|
ANIM_KIND_EXEC = 11,
|
|
ANIM_KIND_EXEC_2 = 12,
|
|
ANIM_KIND_14 = 14,
|
|
ANIM_KIND_15 = 15,
|
|
ANIM_KIND_16 = 16,
|
|
ANIM_KIND_17 = 17,
|
|
ANIM_KIND_18 = 18,
|
|
ANIM_KIND_19 = 19,
|
|
ANIM_KIND_20 = 20,
|
|
ANIM_KIND_23 = 23,
|
|
ANIM_KIND_24 = 24,
|
|
ANIM_KIND_ANIMATE_FOREVER = 25,
|
|
ANIM_KIND_26 = 26,
|
|
ANIM_KIND_27 = 27,
|
|
ANIM_KIND_28 = 28,
|
|
} AnimKind;
|
|
|
|
// Basic animations: 0-19
|
|
// Knockdown and death: 20-35
|
|
// Change positions: 36-37
|
|
// Weapon: 38-47
|
|
// Single-frame death animations (the last frame of knockdown and death animations): 48-63
|
|
typedef enum AnimationType {
|
|
ANIM_STAND = 0,
|
|
ANIM_WALK = 1,
|
|
ANIM_JUMP_BEGIN = 2,
|
|
ANIM_JUMP_END = 3,
|
|
ANIM_CLIMB_LADDER = 4,
|
|
ANIM_FALLING = 5,
|
|
ANIM_UP_STAIRS_RIGHT = 6,
|
|
ANIM_UP_STAIRS_LEFT = 7,
|
|
ANIM_DOWN_STAIRS_RIGHT = 8,
|
|
ANIM_DOWN_STAIRS_LEFT = 9,
|
|
ANIM_MAGIC_HANDS_GROUND = 10,
|
|
ANIM_MAGIC_HANDS_MIDDLE = 11,
|
|
ANIM_MAGIC_HANDS_UP = 12,
|
|
ANIM_DODGE_ANIM = 13,
|
|
ANIM_HIT_FROM_FRONT = 14,
|
|
ANIM_HIT_FROM_BACK = 15,
|
|
ANIM_THROW_PUNCH = 16,
|
|
ANIM_KICK_LEG = 17,
|
|
ANIM_THROW_ANIM = 18,
|
|
ANIM_RUNNING = 19,
|
|
ANIM_FALL_BACK = 20,
|
|
ANIM_FALL_FRONT = 21,
|
|
ANIM_BAD_LANDING = 22,
|
|
ANIM_BIG_HOLE = 23,
|
|
ANIM_CHARRED_BODY = 24,
|
|
ANIM_CHUNKS_OF_FLESH = 25,
|
|
ANIM_DANCING_AUTOFIRE = 26,
|
|
ANIM_ELECTRIFY = 27,
|
|
ANIM_SLICED_IN_HALF = 28,
|
|
ANIM_BURNED_TO_NOTHING = 29,
|
|
ANIM_ELECTRIFIED_TO_NOTHING = 30,
|
|
ANIM_EXPLODED_TO_NOTHING = 31,
|
|
ANIM_MELTED_TO_NOTHING = 32,
|
|
ANIM_FIRE_DANCE = 33,
|
|
ANIM_FALL_BACK_BLOOD = 34,
|
|
ANIM_FALL_FRONT_BLOOD = 35,
|
|
ANIM_PRONE_TO_STANDING = 36,
|
|
ANIM_BACK_TO_STANDING = 37,
|
|
ANIM_TAKE_OUT = 38,
|
|
ANIM_PUT_AWAY = 39,
|
|
ANIM_PARRY_ANIM = 40,
|
|
ANIM_THRUST_ANIM = 41,
|
|
ANIM_SWING_ANIM = 42,
|
|
ANIM_POINT = 43,
|
|
ANIM_UNPOINT = 44,
|
|
ANIM_FIRE_SINGLE = 45,
|
|
ANIM_FIRE_BURST = 46,
|
|
ANIM_FIRE_CONTINUOUS = 47,
|
|
ANIM_FALL_BACK_SF = 48,
|
|
ANIM_FALL_FRONT_SF = 49,
|
|
ANIM_BAD_LANDING_SF = 50,
|
|
ANIM_BIG_HOLE_SF = 51,
|
|
ANIM_CHARRED_BODY_SF = 52,
|
|
ANIM_CHUNKS_OF_FLESH_SF = 53,
|
|
ANIM_DANCING_AUTOFIRE_SF = 54,
|
|
ANIM_ELECTRIFY_SF = 55,
|
|
ANIM_SLICED_IN_HALF_SF = 56,
|
|
ANIM_BURNED_TO_NOTHING_SF = 57,
|
|
ANIM_ELECTRIFIED_TO_NOTHING_SF = 58,
|
|
ANIM_EXPLODED_TO_NOTHING_SF = 59,
|
|
ANIM_MELTED_TO_NOTHING_SF = 60,
|
|
ANIM_FIRE_DANCE_SF = 61,
|
|
ANIM_FALL_BACK_BLOOD_SF = 62,
|
|
ANIM_FALL_FRONT_BLOOD_SF = 63,
|
|
ANIM_CALLED_SHOT_PIC = 64,
|
|
ANIM_COUNT = 65,
|
|
FIRST_KNOCKDOWN_AND_DEATH_ANIM = ANIM_FALL_BACK,
|
|
LAST_KNOCKDOWN_AND_DEATH_ANIM = ANIM_FALL_FRONT_BLOOD,
|
|
FIRST_SF_DEATH_ANIM = ANIM_FALL_BACK_SF,
|
|
LAST_SF_DEATH_ANIM = ANIM_FALL_FRONT_BLOOD_SF,
|
|
} AnimationType;
|
|
|
|
typedef int AnimationProc(Object*, Object*);
|
|
typedef int AnimationSoundProc(Sound*);
|
|
typedef int AnimationProc2(Object*, Object*, void*);
|
|
|
|
typedef struct AnimationDescription {
|
|
int type;
|
|
Object* owner;
|
|
union {
|
|
Object* destinationObj;
|
|
Sound* sound;
|
|
};
|
|
union {
|
|
int tile;
|
|
int fid; // for type == 17
|
|
int weaponAnimationCode; // for type == 18
|
|
int lightDistance; // for type == 19
|
|
};
|
|
int elevation;
|
|
int anim; // anim
|
|
int delay; // delay
|
|
union {
|
|
AnimationProc* proc;
|
|
AnimationSoundProc* soundProc;
|
|
};
|
|
AnimationProc2* field_20; // func
|
|
int field_24;
|
|
union {
|
|
int field_28; // actionPoints
|
|
Object* field_28_obj; // obj in type == 12
|
|
void* field_28_void;
|
|
};
|
|
CacheEntry* field_2C;
|
|
} AnimationDescription;
|
|
|
|
typedef struct AnimationSequence {
|
|
int field_0;
|
|
// Index of current animation in [animations] array or -1 if animations in
|
|
// this sequence is not playing.
|
|
int animationIndex;
|
|
// Number of scheduled animations in [animations] array.
|
|
int length;
|
|
int flags;
|
|
AnimationDescription animations[ANIMATION_DESCRIPTION_LIST_CAPACITY];
|
|
} AnimationSequence;
|
|
|
|
typedef struct PathNode {
|
|
int tile;
|
|
int from;
|
|
// actual type is likely char
|
|
int rotation;
|
|
int field_C;
|
|
int field_10;
|
|
} PathNode;
|
|
|
|
typedef struct STRUCT_530014_28 {
|
|
int tile;
|
|
int elevation;
|
|
int x;
|
|
int y;
|
|
} STRUCT_530014_28;
|
|
|
|
typedef struct STRUCT_530014 {
|
|
int flags; // flags
|
|
Object* obj;
|
|
int fid; // fid
|
|
int field_C;
|
|
int field_10;
|
|
int field_14; // animation speed?
|
|
int animationSequenceIndex;
|
|
int field_1C; // length of field_28
|
|
int field_20; // current index in field_28
|
|
int field_24;
|
|
union {
|
|
unsigned char rotations[3200];
|
|
STRUCT_530014_28 field_28[200];
|
|
};
|
|
} STRUCT_530014;
|
|
|
|
typedef Object* PathBuilderCallback(Object* object, int tile, int elevation);
|
|
|
|
extern int _curr_sad;
|
|
extern int gAnimationSequenceCurrentIndex;
|
|
extern int _anim_in_init;
|
|
extern bool _anim_in_anim_stop;
|
|
extern bool _anim_in_bk;
|
|
extern int _lastDestination;
|
|
extern unsigned int _last_time_;
|
|
extern unsigned int _next_time;
|
|
|
|
extern STRUCT_530014 _sad[24];
|
|
extern PathNode gClosedPathNodeList[2000];
|
|
extern AnimationSequence gAnimationSequences[32];
|
|
extern unsigned char gPathfinderProcessedTiles[5000];
|
|
extern PathNode gOpenPathNodeList[2000];
|
|
extern int gAnimationDescriptionCurrentIndex;
|
|
extern Object* dword_56C7E0[100];
|
|
|
|
void animationInit();
|
|
void animationReset();
|
|
void animationExit();
|
|
int reg_anim_begin(int a1);
|
|
int _anim_free_slot(int a1);
|
|
int _register_priority(int a1);
|
|
int reg_anim_clear(Object* a1);
|
|
int reg_anim_end();
|
|
void _anim_cleanup();
|
|
int _check_registry(Object* obj);
|
|
int animationIsBusy(Object* a1);
|
|
int reg_anim_obj_move_to_obj(Object* a1, Object* a2, int actionPoints, int delay);
|
|
int reg_anim_obj_run_to_obj(Object* owner, Object* destination, int actionPoints, int delay);
|
|
int reg_anim_obj_move_to_tile(Object* obj, int tile_num, int elev, int actionPoints, int delay);
|
|
int reg_anim_obj_run_to_tile(Object* obj, int tile_num, int elev, int actionPoints, int delay);
|
|
int reg_anim_2(Object* obj, int tile_num, int elev, int a4, int a5);
|
|
int reg_anim_knockdown(Object* obj, int tile, int elev, int anim, int delay);
|
|
int reg_anim_animate(Object* obj, int anim, int delay);
|
|
int reg_anim_animate_reverse(Object* obj, int anim, int delay);
|
|
int reg_anim_6(Object* obj, int anim, int delay);
|
|
int reg_anim_set_rotation_to_tile(Object* owner, int tile);
|
|
int reg_anim_rotate_clockwise(Object* obj);
|
|
int reg_anim_rotate_counter_clockwise(Object* obj);
|
|
int reg_anim_hide(Object* obj);
|
|
int reg_anim_11_0(Object* a1, Object* a2, AnimationProc* proc, int delay);
|
|
int reg_anim_12(Object* a1, Object* a2, void* a3, AnimationProc2* proc, int delay);
|
|
int reg_anim_11_1(Object* a1, Object* a2, AnimationProc* proc, int delay);
|
|
int reg_anim_15(Object* obj, int a2, int a3);
|
|
int reg_anim_17(Object* obj, int fid, int a3);
|
|
int reg_anim_18(Object* obj, int a2, int a3);
|
|
int reg_anim_update_light(Object* obj, int fid, int a3);
|
|
int reg_anim_play_sfx(Object* obj, const char* a2, int a3);
|
|
int reg_anim_animate_forever(Object* obj, int a2, int a3);
|
|
int reg_anim_26(int a1, int a2);
|
|
int animationRunSequence(int a1);
|
|
int _anim_set_continue(int a1, int a2);
|
|
int _anim_set_end(int a1);
|
|
bool canUseDoor(Object* critter, Object* door);
|
|
int _make_path(Object* object, int from, int to, unsigned char* a4, int a5);
|
|
int pathfinderFindPath(Object* object, int from, int to, unsigned char* rotations, int a5, PathBuilderCallback* callback);
|
|
int _idist(int a1, int a2, int a3, int a4);
|
|
int _tile_idistance(int tile1, int tile2);
|
|
int _make_straight_path(Object* a1, int from, int to, STRUCT_530014_28* pathNodes, Object** a5, int a6);
|
|
int _make_straight_path_func(Object* a1, int from, int to, STRUCT_530014_28* a4, Object** a5, int a6, Object* (*a7)(Object*, int, int));
|
|
int animateMoveObjectToObject(Object* from, Object* to, int a3, int anim, int animationSequenceIndex);
|
|
int animateMoveObjectToTile(Object* obj, int tile_num, int elev, int a4, int anim, int animationSequenceIndex);
|
|
int _anim_move(Object* obj, int tile, int elev, int a3, int anim, int a5, int animationSequenceIndex);
|
|
int _anim_move_straight_to_tile(Object* obj, int tile, int elevation, int anim, int animationSequenceIndex, int flags);
|
|
int _anim_move_on_stairs(Object* obj, int tile, int elevation, int anim, int animationSequenceIndex);
|
|
int _check_for_falling(Object* obj, int anim, int a3);
|
|
void _object_move(int index);
|
|
void _object_straight_move(int index);
|
|
int _anim_animate(Object* obj, int anim, int animationSequenceIndex, int flags);
|
|
void _object_animate();
|
|
void _object_anim_compact();
|
|
int _check_move(int* a1);
|
|
int _dude_move(int a1);
|
|
int _dude_run(int a1);
|
|
void _dude_fidget();
|
|
void _dude_stand(Object* obj, int rotation, int fid);
|
|
void _dude_standup(Object* a1);
|
|
int actionRotate(Object* obj, int delta, int animationSequenceIndex);
|
|
int _anim_change_fid(Object* obj, int animationSequenceIndex, int fid);
|
|
void _anim_stop();
|
|
int _check_gravity(int tile, int elevation);
|
|
unsigned int _compute_tpf(Object* object, int fid);
|
|
|
|
#endif /* ANIMATION_H */
|