2023-10-14 06:21:23 +00:00
|
|
|
#if defined(_CLANGD)
|
|
|
|
#pragma once
|
|
|
|
#include "feely_pona_unity.h"
|
2023-09-25 12:13:32 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
static void FP_Entity_AddDebugEditorFlags(FP_Game *game, FP_GameEntityHandle handle)
|
|
|
|
{
|
|
|
|
FP_GameEntity *entity = FP_Game_GetEntity(game, handle);
|
|
|
|
if (!FP_Game_IsNilEntity(entity)) {
|
|
|
|
entity->flags |= FP_GameEntityFlag_Clickable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_MoveByKeyboard;
|
|
|
|
entity->flags |= FP_GameEntityFlag_MoveByMouse;
|
|
|
|
entity->flags |= FP_GameEntityFlag_MoveByGamepad;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateWaypointF(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-09-25 12:13:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx1(32);
|
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
entity->flags |= FP_GameEntityFlag_MobSpawnerWaypoint;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateClinger(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-09-27 04:47:27 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
2023-10-07 06:55:34 +00:00
|
|
|
entity->type = FP_EntityType_Clinger;
|
|
|
|
entity->is_dying = false;
|
|
|
|
entity->base_acceleration_per_s.meters = 8.f;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
2023-10-07 06:55:34 +00:00
|
|
|
entity->attack_cooldown_ms = 1000;
|
2023-10-07 08:14:09 +00:00
|
|
|
entity->faction = FP_GameEntityFaction_Foe;
|
2023-09-29 11:42:27 +00:00
|
|
|
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.7f, entity->sprite_height.meters * .5f);
|
2023-09-27 04:47:27 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_Attackable;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
2023-09-27 04:47:27 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateSmoochie(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-09-25 12:13:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
2023-09-30 06:51:59 +00:00
|
|
|
entity->type = FP_EntityType_Smoochie;
|
|
|
|
entity->base_acceleration_per_s.meters = 8.f;
|
2023-10-05 21:49:04 +00:00
|
|
|
entity->is_dying = false;
|
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->attack_cooldown_ms = 1000;
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.7f, entity->sprite_height.meters * .6f);
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-05 21:49:04 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_Attackable;
|
2023-10-07 08:14:09 +00:00
|
|
|
entity->faction = FP_GameEntityFaction_Foe;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
2023-10-05 21:49:04 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateCatfish(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-04 12:50:31 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_Catfish;
|
|
|
|
entity->base_acceleration_per_s.meters = 8.f;
|
|
|
|
entity->is_dying = false;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-04 12:50:31 +00:00
|
|
|
entity->attack_cooldown_ms = 1000;
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.7f, entity->sprite_height.meters * .6f);
|
2023-10-04 12:50:31 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_Attackable;
|
2023-10-07 08:14:09 +00:00
|
|
|
entity->faction = FP_GameEntityFaction_Foe;
|
2023-10-04 12:50:31 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateWallAtPos(FP_Game *game, Dqn_Str8 name, Dqn_V2 pos, Dqn_V2 size)
|
2023-09-25 12:13:32 +00:00
|
|
|
{
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerF(game, name.data);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
2023-10-01 10:15:05 +00:00
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->local_hit_box_size = size;
|
2023-09-25 12:13:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
|
|
|
FP_GameShape *wall = Dqn_FArray_Make(&entity->shapes, Dqn_ZeroMem_Yes);
|
|
|
|
wall->type = FP_GameShapeType_Rect;
|
|
|
|
wall->p2 = entity->local_hit_box_size;
|
|
|
|
wall->colour = TELY_COLOUR_GREEN_DARK_KHAKI_V4;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreatePermittedBuildZone(FP_Game *game, Dqn_V2 pos, Dqn_V2 size, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-02 12:41:08 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->local_hit_box_size = size;
|
|
|
|
entity->type = FP_EntityType_Nil;
|
|
|
|
entity->flags |= FP_GameEntityFlag_BuildZone;
|
|
|
|
FP_Entity_AddDebugEditorFlags(game, entity->handle);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-09-25 12:13:32 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateMobSpawner(FP_Game *game, Dqn_V2 pos, Dqn_usize spawn_cap, char const *fmt, ...)
|
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
2023-10-01 21:42:23 +00:00
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
2023-09-25 12:13:32 +00:00
|
|
|
va_end(args);
|
|
|
|
|
2023-10-07 14:29:50 +00:00
|
|
|
entity->type = FP_EntityType_MobSpawner;
|
2023-10-01 21:42:23 +00:00
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx1(32);
|
2023-09-25 12:13:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
2023-10-01 21:42:23 +00:00
|
|
|
|
2023-10-08 02:22:08 +00:00
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 21:42:23 +00:00
|
|
|
entity->spawn_cap = spawn_cap;
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->spawn_list = FP_SentinelList_Init<FP_GameEntityHandle>(game->play.chunk_pool);
|
2023-09-25 12:13:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateTerryInternal(FP_Game *game, Dqn_V2 pos, bool is_perry, DQN_FMT_ATTRIB char const *fmt, va_list args)
|
2023-09-25 12:13:32 +00:00
|
|
|
{
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
|
2023-10-21 05:30:15 +00:00
|
|
|
entity->type = is_perry ? FP_EntityType_Perry : FP_EntityType_Terry;
|
2023-09-30 06:51:59 +00:00
|
|
|
entity->local_pos = pos;
|
2023-09-30 12:27:25 +00:00
|
|
|
entity->base_acceleration_per_s.meters = 16.f;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 05:47:40 +00:00
|
|
|
entity->attack_cooldown_ms = 500;
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->local_hit_box_size = FP_Game_MetersToPixelsNx2(game->play, 0.5f, entity->sprite_height.meters * .6f);
|
2023-10-07 06:55:34 +00:00
|
|
|
entity->hp_cap = FP_DEFAULT_DAMAGE * 3;
|
|
|
|
entity->hp = entity->hp_cap;
|
2023-09-25 12:13:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
2023-10-06 10:48:05 +00:00
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_Attackable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_CameraTracking;
|
2023-10-08 06:25:08 +00:00
|
|
|
entity->flags |= FP_GameEntityFlag_RecoversHP;
|
2023-10-22 06:24:40 +00:00
|
|
|
entity->flags |= FP_GameEntityFlag_HasShadow;
|
2023-10-07 06:55:34 +00:00
|
|
|
entity->terry_mobile_data_plan_cap = DQN_KILOBYTES(6);
|
2023-10-06 10:48:05 +00:00
|
|
|
entity->terry_mobile_data_plan = entity->terry_mobile_data_plan_cap;
|
2023-10-07 08:14:09 +00:00
|
|
|
entity->faction = FP_GameEntityFaction_Friendly;
|
2023-09-25 12:13:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-21 05:30:15 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntityHandle result = FP_Entity_CreateTerryInternal(game, pos, false /*is_perry*/, fmt, args);
|
|
|
|
va_end(args);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreatePerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-21 05:30:15 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntityHandle result = FP_Entity_CreateTerryInternal(game, pos, true /*is_perry*/, fmt, args);
|
|
|
|
va_end(args);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateMerchantTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-09-25 12:13:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
2023-10-01 06:50:32 +00:00
|
|
|
entity->type = FP_EntityType_MerchantTerry;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 06:50:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.merchant_graveyard);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .15f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
2023-10-01 06:50:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateMerchantGraveyard(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-01 06:50:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_MerchantGraveyard;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 06:50:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.merchant_graveyard);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w - (sprite_rect_scaled.w * .3f), sprite_rect_scaled.h - (sprite_rect_scaled.h * .5f));
|
2023-10-01 06:50:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateMerchantGym(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-01 06:50:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
2023-10-02 11:38:36 +00:00
|
|
|
entity->type = FP_EntityType_MerchantGym;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 06:50:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
2023-10-02 11:38:36 +00:00
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
2023-10-01 06:50:32 +00:00
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.merchant_gym);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .3f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w - (sprite_rect_scaled.w * .3f), sprite_rect_scaled.h - (sprite_rect_scaled.h * .6f));
|
2023-10-01 06:50:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateMerchantPhoneCompany(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-01 06:50:32 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_MerchantPhoneCompany;
|
2023-09-25 14:07:39 +00:00
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-09-25 12:13:32 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.merchant_phone_company);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .15f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w - (sprite_rect_scaled.w * .3f), sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
2023-09-25 12:13:32 +00:00
|
|
|
return result;
|
|
|
|
}
|
2023-09-29 07:42:58 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateClubTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-09-29 07:42:58 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_ClubTerry;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
2023-09-29 11:42:27 +00:00
|
|
|
|
2023-10-01 05:55:48 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.club_terry_alive);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
2023-09-29 11:42:27 +00:00
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f);
|
2023-09-29 11:42:27 +00:00
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
2023-09-29 07:42:58 +00:00
|
|
|
return result;
|
|
|
|
}
|
2023-10-01 05:11:08 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateHeart(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-01 05:11:08 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_Heart;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-01 11:16:49 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
2023-10-08 08:04:11 +00:00
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_Attackable;
|
|
|
|
entity->flags |= FP_GameEntityFlag_RecoversHP;
|
|
|
|
entity->hp_cap = FP_DEFAULT_DAMAGE * 16;
|
|
|
|
entity->hp = entity->hp_cap;
|
|
|
|
entity->faction = FP_GameEntityFaction_Friendly;
|
|
|
|
entity->hp_recover_every_n_ticks *= 4;
|
2023-10-01 05:11:08 +00:00
|
|
|
|
2023-10-01 05:55:48 +00:00
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.heart);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
2023-10-01 05:11:08 +00:00
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
2023-10-01 05:20:05 +00:00
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .15f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w - (sprite_rect_scaled.w * .3f), sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
2023-10-01 05:11:08 +00:00
|
|
|
return result;
|
|
|
|
}
|
2023-10-04 12:50:31 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateChurchTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-04 12:50:31 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_ChurchTerry;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-04 12:50:31 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateKennelTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-04 12:50:31 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_KennelTerry;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-04 12:50:31 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateAirportTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-04 12:50:31 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_AirportTerry;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-04 12:50:31 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_NonTraversable;
|
|
|
|
|
|
|
|
TELY_AssetSpriteAnimation *sprite_anim = TELY_Asset_GetSpriteAnimation(&game->atlas_sprite_sheet, g_anim_names.church_terry_alive);
|
|
|
|
Dqn_Rect sprite_rect = game->atlas_sprite_sheet.rects.data[sprite_anim->index];
|
|
|
|
Dqn_f32 size_scale = FP_Entity_CalcSpriteScaleForDesiredHeight(game, entity->sprite_height, sprite_rect);
|
|
|
|
Dqn_V2 sprite_rect_scaled = sprite_rect.size * size_scale;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, sprite_rect_scaled.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(sprite_rect_scaled.w, sprite_rect_scaled.h - (sprite_rect_scaled.h * .4f));
|
|
|
|
return result;
|
|
|
|
}
|
2023-10-05 10:10:50 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreatePhoneMessageProjectile(FP_Game *game, FP_GameEntityHandle owner, Dqn_V2 pos, Dqn_V2 velocity, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-05 10:10:50 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_PhoneMessageProjectile;
|
|
|
|
|
|
|
|
entity->constant_acceleration_per_s = velocity;
|
|
|
|
entity->local_pos = pos;
|
2023-10-08 02:22:08 +00:00
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
2023-10-05 10:10:50 +00:00
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
entity->flags |= FP_GameEntityFlag_TTL;
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, render_data.render_size.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(render_data.render_size.w, render_data.render_size.h - (render_data.render_size.h * .4f));
|
|
|
|
entity->attack_box_offset = entity->local_hit_box_offset;
|
|
|
|
entity->attack_box_size = entity->local_hit_box_size;
|
2023-10-08 05:14:31 +00:00
|
|
|
entity->ttl_end_timestamp = game->play.clock_ms + 1000;
|
2023-10-06 10:57:34 +00:00
|
|
|
entity->projectile_owner = owner;
|
2023-10-07 08:14:09 +00:00
|
|
|
entity->faction = FP_GameEntityFaction_Friendly;
|
2023-10-05 10:10:50 +00:00
|
|
|
return result;
|
|
|
|
}
|
2023-10-07 09:31:01 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreatePortalMonkey(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-07 14:29:50 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
2023-10-08 02:22:08 +00:00
|
|
|
entity->type = FP_EntityType_PortalMonkey;
|
|
|
|
entity->local_pos = pos;
|
|
|
|
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
2023-10-07 14:29:50 +00:00
|
|
|
|
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, render_data.render_size.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(render_data.render_size.w, render_data.render_size.h - (render_data.render_size.h * .4f));
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateAirportTerryPlane(FP_Game *game, Dqn_V2 pos, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-07 09:31:01 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->type = FP_EntityType_AirportTerryPlane;
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, 0, FP_GameDirection_Down);
|
2023-10-08 02:22:08 +00:00
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
2023-10-07 09:31:01 +00:00
|
|
|
|
|
|
|
entity->local_pos = pos;
|
|
|
|
entity->flags |= FP_GameEntityFlag_NoClip;
|
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, render_data.render_size.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(render_data.render_size.w, render_data.render_size.h - (render_data.render_size.h * .4f));
|
|
|
|
entity->base_acceleration_per_s.meters = 32.f;
|
|
|
|
return result;
|
|
|
|
}
|
2023-10-16 13:35:41 +00:00
|
|
|
|
2023-10-24 12:41:15 +00:00
|
|
|
static FP_GameEntityHandle FP_Entity_CreateBillboard(FP_Game *game, Dqn_V2 pos, FP_EntityBillboardState state, DQN_FMT_ATTRIB char const *fmt, ...)
|
2023-10-16 13:35:41 +00:00
|
|
|
{
|
|
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
|
|
FP_GameEntity *entity = FP_Game_MakeEntityPointerFV(game, fmt, args);
|
|
|
|
FP_GameEntityHandle result = entity->handle;
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
entity->action.state = state;
|
|
|
|
entity->action.next_state = state;
|
|
|
|
entity->type = FP_EntityType_Billboard;
|
|
|
|
FP_EntityRenderData render_data = FP_Entity_GetRenderData(game, entity->type, state, FP_GameDirection_Down);
|
|
|
|
entity->sprite_height = render_data.height;
|
|
|
|
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
|
|
|
|
FP_Game_EntityActionReset(game, result, duration_ms, render_data.sprite);
|
|
|
|
|
|
|
|
entity->local_pos = pos;
|
|
|
|
FP_Entity_AddDebugEditorFlags(game, result);
|
|
|
|
|
|
|
|
entity->local_hit_box_offset = Dqn_V2_InitNx2(0, render_data.render_size.h * .1f);
|
|
|
|
entity->local_hit_box_size = Dqn_V2_InitNx2(render_data.render_size.w, render_data.render_size.h - (render_data.render_size.h * .4f));
|
|
|
|
return result;
|
|
|
|
}
|