#pragma once #include "raylib.h" #include "entity.h" #include "array.h" typedef enum { AA_IDLE = 0, AA_CHARGE = 1, AA_ATTACK = 2, } AttackAnimState; typedef enum { C_IDLE = 0, C_OBSERVE = 1, C_PATROL = 2, C_FOLLOW = 3, C_AGGRO = 4, C_HIT = 5, C_DEAD = 6 } CharState; typedef enum { AI_NONE = 0, AI_IDLE = 1, AI_PATROL = 2, AI_DETECT = 3, AI_ATTACK = 4, } AIState; typedef enum { HA_IDLE = 0, HA_PLAY = 1, } HitAnimState; typedef enum { PATROL_TOP = 0, PATROL_LEFT = 1, PATROL_DOWN = 2, PATROL_RIGHT = 3, } PatrolDir; typedef struct Entity AttackedEntity; typedef struct Entity AggroEntity; typedef struct Entity FriendEntity; struct Character { bool isburning; EntityType type; // TROLL / BANDIT int entity_id; CharState state; // CharState int tile_id; // MapSymbol int home_tile_id; // MapSymbol AIState ai_state; int health; float speed_multiplier; float move_speed; float detection_threshold; float attack_threshold; // improved idle behavior PatrolDir patrol_dir; bool to_core_pos; Vector2 core_position; // this is the main position characters will stick to double t_idle_start; // time spent at core position, useful to rotate them out // of positions float t_idle_duration; // max allowed duration they should be idle Vector2 position; Vector2 last_enemy_position; Vector2 move_dir; Vector2 target_position; Rectangle target_rect; Rectangle render_rect; Color tint_color_base; Color tint_color_active; Color tint_color; Texture2D *sprite; // AggroEntity attackers[2]; EntityArrayList attackers; // FriendEntity friends[2]; EntityArrayList friends; // // Animation // // getting hit HitAnimState anim_hit_state; float anim_hit_speed; double t_anim_hit_start; float t_anim_hit_duration; // getting burned double t_anim_burn_start; // attacking int anim_attack_state; float anim_attack_speed; float t_anim_charge_duration; float t_anim_attack_duration; double t_anim_charge_start; double t_anim_attack_start; };