#if defined(__clang__) #pragma once #include "feely_pona_unity.h" #endif enum TELY_EntityFlag { TELY_EntityFlag_Clickable = 1 << 0, TELY_EntityFlag_MoveByKeyboard = 1 << 1, TELY_EntityFlag_MoveByMouse = 1 << 2, TELY_EntityFlag_DrawHitBox = 1 << 3, TELY_EntityFlag_DeriveHitBoxFromChildrenBoundingBox = 1 << 4, }; enum TELY_GameShapeType { TELY_GameShapeType_None, TELY_GameShapeType_Circle, TELY_GameShapeType_Rect, TELY_GameShapeType_Line, }; struct TELY_GameShape { TELY_GameShapeType type; Dqn_V2 p1; Dqn_V2 p2; Dqn_V4 colour; Dqn_f32 line_thickness; Dqn_f32 circle_radius; TELY_RenderShapeMode render_mode; }; const uint64_t TELY_GAME_ENTITY_HANDLE_GENERATION_MASK = 0xFFFF'0000'0000'0000; const uint64_t TELY_GAME_ENTITY_HANDLE_GENERATION_RSHIFT = 48; const uint64_t TELY_GAME_ENTITY_HANDLE_GENERATION_MAX = TELY_GAME_ENTITY_HANDLE_GENERATION_MASK >> TELY_GAME_ENTITY_HANDLE_GENERATION_RSHIFT; const uint64_t TELY_GAME_ENTITY_HANDLE_INDEX_MASK = 0x0000'FFFF'FFFF'FFFF; const uint64_t TELY_GAME_ENTITY_HANDLE_INDEX_MAX = TELY_GAME_ENTITY_HANDLE_INDEX_MASK - 1; struct TELY_GameEntityHandle { uint64_t id; }; enum TELY_GameEntityState { TELY_GameEntityState_Nil, TELY_GameEntityState_Idle, TELY_GameEntityState_Attack, TELY_GameEntityState_Run, }; struct TELY_GameEntityAnimation { uint16_t index; uint16_t frame; uint16_t ticks; uint16_t ticks_per_frame; }; struct TELY_GameWaypoint { Dqn_V2I pos; TELY_GameWaypoint *next; TELY_GameWaypoint *prev; }; struct TELY_GameEntity { Dqn_String8 name; TELY_GameEntityHandle handle; TELY_AssetSpriteSheet *sprite_sheet; Dqn_Slice sprite_anims; Dqn_V2 size_scale; TELY_GameEntityAnimation anim; TELY_GameEntityState state; Dqn_V2 velocity; TELY_GameEntityHandle stalk_entity; Dqn_V2I stalk_entity_last_known_tile; TELY_GameWaypoint *waypoints; // NOTE: The entity hit box is positioned at the center of the entity. Dqn_V2 local_hit_box_size; Dqn_V2 local_hit_box_offset; Dqn_V2 attack_box_size; Dqn_V2 attack_box_offset; uint64_t flags; bool facing_left; Dqn_V2 local_pos; Dqn_f64 alive_time_s; Dqn_FArray shapes; TELY_GameEntity *next; TELY_GameEntity *prev; TELY_GameEntity *first_child; TELY_GameEntity *last_child; TELY_GameEntity *parent; }; struct TELY_GameEntityIterator { bool init; Dqn_usize iteration_count; TELY_GameEntity *entity; TELY_GameEntity *last_visited; TELY_GameEntity *entity_parent; TELY_GameEntity *entity_next; TELY_GameEntity *entity_first_child; }; struct TELY_FreyaGameMath { TELY_GameEntityHandle lec01_group_box; TELY_GameEntityHandle lec01_axis; TELY_GameEntityHandle lec01_point_a; TELY_GameEntityHandle lec01_point_b; TELY_GameEntityHandle lec01_task01_group_box; TELY_GameEntityHandle lec01_task01_radial_trigger; Dqn_f32 lec01_task01_radial_trigger_radius; TELY_GameEntityHandle lec01_task01_player; TELY_GameEntityHandle lec01_task02_group_box; TELY_GameEntityHandle lec01_task02_ray_begin; TELY_GameEntityHandle lec01_task02_ray_end; TELY_GameEntityHandle lec01_task02_surface; }; struct TELY_GameCamera { Dqn_V2 world_pos; Dqn_f32 rotate_rads; Dqn_V2 scale; }; struct TELY_Game { TELY_Platform *platform; TELY_RFui rfui; TELY_UI ui; TELY_ChunkPool chunk_pool; TELY_AssetFontHandle inter_regular_font; TELY_AssetFontHandle inter_italic_font; TELY_AssetFontHandle jetbrains_mono_font; TELY_AssetAudioHandle test_audio; Dqn_Slice hero_sprite_anims; TELY_AssetSpriteSheet hero_sprite_sheet; Dqn_FArray parent_entity_stack; Dqn_VArray entities; TELY_GameEntity *root_entity; TELY_GameEntity *entity_free_list; TELY_GameEntityHandle clicked_entity; TELY_GameEntityHandle hot_entity; TELY_GameEntityHandle active_entity; TELY_GameEntityHandle prev_clicked_entity; TELY_GameEntityHandle prev_hot_entity; TELY_GameEntityHandle prev_active_entity; TELY_FreyaGameMath freya_game_math; TELY_GameCamera camera; };