fp: Integrate new merchants

This commit is contained in:
doyle 2023-10-01 17:50:32 +11:00
parent abe646e0eb
commit dce637d804
28 changed files with 273 additions and 123 deletions

BIN
Data/Textures/atlas.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas.txt (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/club_terry_alive_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_graveyard_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_graveyard_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_gym_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_gym_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_phone_company_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_phone_company_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_terry_1.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/merchant_terry_2.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/shadow_long_circle.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/shadow_tight_circle.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_1.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_2.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_3.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_4.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_5.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_6.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/smoochie_death_7.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/terry_merchant_01.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/atlas/terry_merchant_02.png (Stored with Git LFS)

Binary file not shown.

BIN
Data/Textures/sprite_spec.txt (Stored with Git LFS)

Binary file not shown.

View File

@ -142,12 +142,16 @@ static void FP_Game_MoveEntity(FP_Game *game, FP_GameEntityHandle entity_handle,
entity_collides_with_collider = false;
} break;
case FP_EntityType_Nil: /*FALLTRHU*/
case FP_EntityType_Terry: /*FALLTRHU*/
case FP_EntityType_Merchant: /*FALLTRHU*/
case FP_EntityType_Count: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_Nil: break;
case FP_EntityType_Terry: break;
case FP_EntityType_MerchantTerry: break;
case FP_EntityType_Count: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_MerchantGraveyard: break;
case FP_EntityType_MerchantGym: break;
case FP_EntityType_MerchantPhoneCompany: break;
case FP_EntityType_Heart: break;
}
if (!entity_collides_with_collider)
@ -302,54 +306,26 @@ void TELY_DLL_Init(void *user_data)
game->player = terry;
}
FP_Entity_CreateMerchant(game, Dqn_V2_InitNx2(1018, -351), "Merchant");
FP_Entity_CreateClubTerry(game, Dqn_V2_InitNx2(1000, 400), "Club Terry");
{
Dqn_V2 base_top_left_pos = Dqn_V2_InitNx2(1018, -335);
Dqn_V2 base_bottom_right_pos = Dqn_V2_InitNx2(2118, +351);
Dqn_V2 base_top_left = base_top_left_pos;
Dqn_V2 base_top_right = Dqn_V2_InitNx2(base_bottom_right_pos.x, base_top_left_pos.y);
Dqn_V2 base_bottom_left = Dqn_V2_InitNx2(base_top_left_pos.x, base_bottom_right_pos.y);
Dqn_V2 base_bottom_right = Dqn_V2_InitNx2(base_bottom_right_pos.x, base_bottom_right_pos.y);
FP_Entity_CreateMerchantTerry(game, base_top_left, "Merchant");
FP_Entity_CreateMerchantGraveyard(game, base_bottom_left, "Graveyard");
FP_Entity_CreateMerchantGym(game, base_bottom_right, "Gym");
FP_Entity_CreateMerchantPhoneCompany(game, base_top_right, "PhoneCompany");
}
FP_Entity_CreateClubTerry(game, Dqn_V2_InitNx2(567, -191), "Club Terry");
game->tile_size = 37;
Dqn_V2I max_tile = platform->core.window_size / game->tile_size;
// NOTE: Wall ==================================================================================
if (0) {
Dqn_V2I vert_wall_tile_size = Dqn_V2I_InitNx2(1, 12);
Dqn_V2I right_wall_tile_pos = Dqn_V2I_InitNx2(max_tile.x - vert_wall_tile_size.x - 0, (max_tile.y / 2.f) - (vert_wall_tile_size.y * .5f));
Dqn_V2I left_wall_top_tile = Dqn_V2I_InitNx2(max_tile.x - vert_wall_tile_size.x - 12, (max_tile.y / 2.f) - (vert_wall_tile_size.y * .5f));
Dqn_V2I left_wall_bottom_tile = Dqn_V2I_InitNx2(left_wall_top_tile.x, left_wall_top_tile.y + vert_wall_tile_size.y);
{
Dqn_V2I const vert_wall_part_tile_size = Dqn_V2I_InitNx2(1, (vert_wall_tile_size.y / 2) - 2);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base left-top wall"), left_wall_top_tile, vert_wall_part_tile_size);
Dqn_V2I bottom_part_tile = Dqn_V2I_InitNx2(left_wall_top_tile.x, left_wall_top_tile.y + vert_wall_tile_size.y - vert_wall_part_tile_size.y);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base left-bottom wall"), bottom_part_tile, vert_wall_part_tile_size);
}
FP_GameEntityHandle right_wall = FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base right wall"), right_wall_tile_pos, vert_wall_tile_size);
Dqn_Rect right_wall_box = FP_Game_CalcEntityWorldHitBox(game, right_wall);
Dqn_V2I right_wall_bottom_tile = FP_Game_WorldPosToTilePos(game, right_wall_box.pos + Dqn_V2_InitNx2(0, right_wall_box.size.y));
Dqn_V2I right_wall_top_left_tile = FP_Game_WorldPosToTilePos(game, right_wall_box.pos);
{
Dqn_V2I hori_wall_tile_size = Dqn_V2I_InitNx2((right_wall_tile_pos.x - left_wall_top_tile.x - 1) / 2 - 1, 1);
{
Dqn_V2I bottom_left_wall_tile_pos = Dqn_V2I_InitNx2(left_wall_bottom_tile.x + 1, left_wall_bottom_tile.y - 1);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base bottom-left wall"), bottom_left_wall_tile_pos, hori_wall_tile_size);
Dqn_V2I bottom_right_wall_tile_pos = Dqn_V2I_InitNx2(right_wall_bottom_tile.x - hori_wall_tile_size.x, right_wall_bottom_tile.y - 1);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base bottom-right wall"), bottom_right_wall_tile_pos, hori_wall_tile_size);
}
{
Dqn_V2I top_left_wall_tile_pos = Dqn_V2I_InitNx2(left_wall_top_tile.x + 1, left_wall_top_tile.y);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base top-left wall"), top_left_wall_tile_pos, hori_wall_tile_size);
Dqn_V2I top_right_wall_tile_pos = Dqn_V2I_InitNx2(right_wall_top_left_tile.x - hori_wall_tile_size.x, right_wall_top_left_tile.y);
FP_Entity_CreateWallAtTile(game, DQN_STRING8("Base top-right wall"), top_right_wall_tile_pos, hori_wall_tile_size);
}
}
}
// NOTE: Mid lane mob spawner ==================================================================
Dqn_V2 base_mid_p = Dqn_V2_InitNx2(1580, 0.f);
Dqn_V2 mid_lane_mob_spawner_pos = Dqn_V2_InitNx2(game->map->local_hit_box_size.w * -0.5f, 0.f);
@ -858,16 +834,69 @@ void FP_EntityActionStateMachine(FP_Game *game, TELY_Audio *audio, TELY_Platform
}
} break;
case FP_EntityType_Merchant: {
FP_EntityTerryMerchantState *state = DQN_CAST(FP_EntityTerryMerchantState *)&action->state;
case FP_EntityType_MerchantTerry: {
FP_EntityMerchantTerryState *state = DQN_CAST(FP_EntityMerchantTerryState *)&action->state;
switch (*state) {
case FP_EntityTerryMerchantState_Nil: {
action->next_state = FP_EntityTerryMerchantState_Idle;
case FP_EntityMerchantTerryState_Nil: {
action->next_state = FP_EntityMerchantTerryState_Idle;
} break;
case FP_EntityTerryMerchantState_Idle: {
case FP_EntityMerchantTerryState_Idle: {
if (entering_new_state) {
TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, g_anim_names.terry_merchant, TELY_AssetFlip_No);
TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, g_anim_names.merchant_terry, TELY_AssetFlip_No);
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
FP_Game_EntityActionReset(game, entity->handle, duration_ms, sprite);
}
} break;
}
} break;
case FP_EntityType_MerchantPhoneCompany: {
FP_EntityMerchantPhoneCompanyState *state = DQN_CAST(FP_EntityMerchantPhoneCompanyState *)&action->state;
switch (*state) {
case FP_EntityMerchantPhoneCompanyState_Nil: {
action->next_state = FP_EntityMerchantPhoneCompanyState_Idle;
} break;
case FP_EntityMerchantPhoneCompanyState_Idle: {
if (entering_new_state) {
TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, g_anim_names.merchant_phone_company, TELY_AssetFlip_No);
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
FP_Game_EntityActionReset(game, entity->handle, duration_ms, sprite);
}
} break;
}
} break;
case FP_EntityType_MerchantGym: {
FP_EntityMerchantGymState *state = DQN_CAST(FP_EntityMerchantGymState *)&action->state;
switch (*state) {
case FP_EntityMerchantGymState_Nil: {
action->next_state = FP_EntityMerchantGymState_Idle;
} break;
case FP_EntityMerchantGymState_Idle: {
if (entering_new_state) {
TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, g_anim_names.merchant_gym, TELY_AssetFlip_No);
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
FP_Game_EntityActionReset(game, entity->handle, duration_ms, sprite);
}
} break;
}
} break;
case FP_EntityType_MerchantGraveyard: {
FP_EntityMerchantGraveyardState *state = DQN_CAST(FP_EntityMerchantGraveyardState *)&action->state;
switch (*state) {
case FP_EntityMerchantGraveyardState_Nil: {
action->next_state = FP_EntityMerchantGraveyardState_Idle;
} break;
case FP_EntityMerchantGraveyardState_Idle: {
if (entering_new_state) {
TELY_AssetAnimatedSprite sprite = TELY_Asset_MakeAnimatedSprite(sheet, g_anim_names.merchant_graveyard, TELY_AssetFlip_No);
uint64_t duration_ms = FP_GAME_ENTITY_ACTION_INFINITE_TIMER;
FP_Game_EntityActionReset(game, entity->handle, duration_ms, sprite);
}
@ -1032,11 +1061,14 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
move_entity = *state == FP_EntityClingerState_Run || *state == FP_EntityClingerState_Idle;
} break;
case FP_EntityType_Merchant: break;
case FP_EntityType_Nil: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Count: break;
case FP_EntityType_Map: break;
case FP_EntityType_Nil: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Count: break;
case FP_EntityType_Map: break;
case FP_EntityType_MerchantTerry: break;
case FP_EntityType_MerchantGraveyard: break;
case FP_EntityType_MerchantPhoneCompany: break;
case FP_EntityType_Heart: break;
}
if (move_entity) {
@ -1259,9 +1291,6 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
}
switch (entity->type) {
case FP_EntityType_Nil: /*FALLTHRU*/
case FP_EntityType_Merchant: break;
case FP_EntityType_Terry: /*FALLTHRU*/
case FP_EntityType_Smoochie: /*FALLTHRU*/
case FP_EntityType_Clinger: {
@ -1280,9 +1309,15 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
} break;
case FP_EntityType_Count: DQN_INVALID_CODE_PATH; break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_Heart: break;
case FP_EntityType_Nil: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_Heart: break;
case FP_EntityType_MerchantTerry: break;
case FP_EntityType_MerchantGraveyard: break;
case FP_EntityType_MerchantGym: break;
case FP_EntityType_MerchantPhoneCompany: break;
}
}
@ -1422,12 +1457,16 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
permit_attack = false;
} break;
case FP_EntityType_Nil: /*FALLTRHU*/
case FP_EntityType_Terry: /*FALLTRHU*/
case FP_EntityType_Merchant: /*FALLTRHU*/
case FP_EntityType_Count: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_Nil: break;
case FP_EntityType_Terry: break;
case FP_EntityType_Count: break;
case FP_EntityType_ClubTerry: break;
case FP_EntityType_Map: break;
case FP_EntityType_MerchantTerry: break;
case FP_EntityType_MerchantGraveyard: break;
case FP_EntityType_MerchantGym: break;
case FP_EntityType_MerchantPhoneCompany: break;
case FP_EntityType_Heart: break;
}
if (!permit_attack)

View File

@ -23,28 +23,10 @@ struct FP_Meters
struct FP_GlobalAnimations
{
Dqn_String8 terry_walk_idle = DQN_STRING8("terry_walk_idle");
Dqn_String8 terry_walk_up = DQN_STRING8("terry_walk_up");
Dqn_String8 terry_walk_down = DQN_STRING8("terry_walk_down");
Dqn_String8 terry_walk_left = DQN_STRING8("terry_walk_left");
Dqn_String8 terry_walk_right = DQN_STRING8("terry_walk_right");
Dqn_String8 terry_attack_up = DQN_STRING8("terry_attack_up");
Dqn_String8 terry_attack_side = DQN_STRING8("terry_attack_side");
Dqn_String8 terry_attack_down = DQN_STRING8("terry_attack_down");
Dqn_String8 terry_merchant = DQN_STRING8("terry_merchant");
Dqn_String8 smoochie_walk_up = DQN_STRING8("smoochie_walk_up");
Dqn_String8 smoochie_walk_down = DQN_STRING8("smoochie_walk_down");
Dqn_String8 smoochie_walk_left = DQN_STRING8("smoochie_walk_left");
Dqn_String8 smoochie_walk_right = DQN_STRING8("smoochie_walk_right");
Dqn_String8 smoochie_attack_down = DQN_STRING8("smoochie_attack_down");
Dqn_String8 smoochie_hurt_side = DQN_STRING8("smoochie_hurt_side");
Dqn_String8 smoochie_attack_heart = DQN_STRING8("smoochie_attack_heart");
Dqn_String8 smoochie_death = DQN_STRING8("smoochie_death");
Dqn_String8 clinger_attack_down = DQN_STRING8("clinger_attack_down");
Dqn_String8 clinger_attack_side = DQN_STRING8("clinger_attack_side");
Dqn_String8 clinger_attack_up = DQN_STRING8("clinger_attack_up");
Dqn_String8 clinger_death = DQN_STRING8("clinger_death");
Dqn_String8 clinger_walk_up = DQN_STRING8("clinger_walk_up");
Dqn_String8 clinger_walk_down = DQN_STRING8("clinger_walk_down");
@ -56,6 +38,33 @@ struct FP_GlobalAnimations
Dqn_String8 heart_bleed = DQN_STRING8("heart_bleed");
Dqn_String8 map = DQN_STRING8("map");
Dqn_String8 merchant_graveyard = DQN_STRING8("merchant_graveyard");
Dqn_String8 merchant_gym = DQN_STRING8("merchant_gym");
Dqn_String8 merchant_phone_company= DQN_STRING8("merchant_phone_company");
Dqn_String8 merchant_terry = DQN_STRING8("merchant_terry");
Dqn_String8 shadow_long_circle = DQN_STRING8("shadow_long_circle");
Dqn_String8 shadow_tight_circle = DQN_STRING8("shadow_tight_circle");
Dqn_String8 smoochie_walk_up = DQN_STRING8("smoochie_walk_up");
Dqn_String8 smoochie_walk_down = DQN_STRING8("smoochie_walk_down");
Dqn_String8 smoochie_walk_left = DQN_STRING8("smoochie_walk_left");
Dqn_String8 smoochie_walk_right = DQN_STRING8("smoochie_walk_right");
Dqn_String8 smoochie_attack_down = DQN_STRING8("smoochie_attack_down");
Dqn_String8 smoochie_hurt_side = DQN_STRING8("smoochie_hurt_side");
Dqn_String8 smoochie_attack_heart = DQN_STRING8("smoochie_attack_heart");
Dqn_String8 smoochie_death = DQN_STRING8("smoochie_death");
Dqn_String8 terry_attack_up = DQN_STRING8("terry_attack_up");
Dqn_String8 terry_attack_side = DQN_STRING8("terry_attack_side");
Dqn_String8 terry_attack_down = DQN_STRING8("terry_attack_down");
Dqn_String8 terry_walk_idle = DQN_STRING8("terry_walk_idle");
Dqn_String8 terry_walk_up = DQN_STRING8("terry_walk_up");
Dqn_String8 terry_walk_down = DQN_STRING8("terry_walk_down");
Dqn_String8 terry_walk_left = DQN_STRING8("terry_walk_left");
Dqn_String8 terry_walk_right = DQN_STRING8("terry_walk_right");
}
g_anim_names;

View File

@ -9,7 +9,10 @@ enum FP_EntityType
FP_EntityType_Map,
FP_EntityType_Terry,
FP_EntityType_Smoochie,
FP_EntityType_Merchant,
FP_EntityType_MerchantTerry,
FP_EntityType_MerchantGraveyard,
FP_EntityType_MerchantGym,
FP_EntityType_MerchantPhoneCompany,
FP_EntityType_ClubTerry,
FP_EntityType_Clinger,
FP_EntityType_Heart,
@ -45,10 +48,28 @@ enum FP_EntityClingerState
FP_EntityClingerState_Run,
};
enum FP_EntityTerryMerchantState
enum FP_EntityMerchantTerryState
{
FP_EntityTerryMerchantState_Nil,
FP_EntityTerryMerchantState_Idle,
FP_EntityMerchantTerryState_Nil,
FP_EntityMerchantTerryState_Idle,
};
enum FP_EntityMerchantGymState
{
FP_EntityMerchantGymState_Nil,
FP_EntityMerchantGymState_Idle,
};
enum FP_EntityMerchantPhoneCompanyState
{
FP_EntityMerchantPhoneCompanyState_Nil,
FP_EntityMerchantPhoneCompanyState_Idle,
};
enum FP_EntityMerchantGraveyardState
{
FP_EntityMerchantGraveyardState_Nil,
FP_EntityMerchantGraveyardState_Idle,
};
enum FP_EntityClubTerryState

View File

@ -150,7 +150,7 @@ static FP_GameEntityHandle FP_Entity_CreateTerry(FP_Game *game, Dqn_V2 pos, DQN_
return result;
}
static FP_GameEntityHandle FP_Entity_CreateMerchant(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...)
static FP_GameEntityHandle FP_Entity_CreateMerchantTerry(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...)
{
va_list args;
va_start(args, fmt);
@ -158,7 +158,61 @@ static FP_GameEntityHandle FP_Entity_CreateMerchant(FP_Game *game, Dqn_V2 pos, D
FP_GameEntityHandle result = entity->handle;
va_end(args);
entity->type = FP_EntityType_Merchant;
entity->type = FP_EntityType_MerchantTerry;
entity->local_pos = pos;
entity->local_hit_box_size = Dqn_V2_InitNx2(50, 50);
entity->sprite_height.meters = 3.66f;
FP_Entity_AddDebugEditorFlags(game, result);
entity->flags |= FP_GameEntityFlag_NonTraversable;
return result;
}
static FP_GameEntityHandle FP_Entity_CreateMerchantGraveyard(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...)
{
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;
entity->local_hit_box_size = Dqn_V2_InitNx2(50, 50);
entity->sprite_height.meters = 3.66f;
FP_Entity_AddDebugEditorFlags(game, result);
entity->flags |= FP_GameEntityFlag_NonTraversable;
return result;
}
static FP_GameEntityHandle FP_Entity_CreateMerchantGym(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...)
{
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_MerchantGym;
entity->local_pos = pos;
entity->local_hit_box_size = Dqn_V2_InitNx2(50, 50);
entity->sprite_height.meters = 3.66f;
FP_Entity_AddDebugEditorFlags(game, result);
entity->flags |= FP_GameEntityFlag_NonTraversable;
return result;
}
static FP_GameEntityHandle FP_Entity_CreateMerchantPhoneCompany(FP_Game *game, Dqn_V2 pos, DQN_FMT_STRING_ANNOTATE char const *fmt, ...)
{
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;
entity->local_pos = pos;
entity->local_hit_box_size = Dqn_V2_InitNx2(50, 50);
entity->sprite_height.meters = 3.66f;