fp: Solve the menu problem for multiple players
This commit is contained in:
parent
3e47bbd704
commit
815d7aa808
@ -2589,24 +2589,31 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
|||||||
play->merchant_phone_company,
|
play->merchant_phone_company,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// NOTE: Calculate which merchant sound trigger flags to reset =============================
|
||||||
|
FP_GameEntityHandle merchant_with_more_than_2_menus_open = {};
|
||||||
static bool sound_played_flags[DQN_ARRAY_UCOUNT(merchant_handles)] = {false, false, false, false};
|
static bool sound_played_flags[DQN_ARRAY_UCOUNT(merchant_handles)] = {false, false, false, false};
|
||||||
DQN_FOR_UINDEX (merchant_index, DQN_ARRAY_UCOUNT(merchant_handles)) {
|
DQN_FOR_UINDEX (merchant_index, DQN_ARRAY_UCOUNT(merchant_handles)) {
|
||||||
FP_GameEntityHandle merchant = merchant_handles[merchant_index];
|
FP_GameEntityHandle merchant = merchant_handles[merchant_index];
|
||||||
Dqn_V2 merchant_pos = FP_Game_CalcEntityWorldPos(game, merchant);
|
Dqn_V2 merchant_pos = FP_Game_CalcEntityWorldPos(game, merchant);
|
||||||
|
Dqn_usize menu_activation_count = 0;
|
||||||
bool all_players_are_far_away_from_merchant_menu_trigger = true;
|
bool all_players_are_far_away_from_merchant_menu_trigger = true;
|
||||||
DQN_FOR_UINDEX (player_index, game->play.players.size) {
|
DQN_FOR_UINDEX (player_index, game->play.players.size) {
|
||||||
FP_GameEntityHandle player_handle = game->play.players.data[player_index];
|
FP_GameEntityHandle player_handle = game->play.players.data[player_index];
|
||||||
Dqn_V2 player_pos = FP_Game_CalcEntityWorldPos(game, player_handle);
|
Dqn_V2 player_pos = FP_Game_CalcEntityWorldPos(game, player_handle);
|
||||||
Dqn_f32 dist_squared = Dqn_V2_LengthSq_V2x2(merchant_pos, player_pos);
|
Dqn_f32 dist_squared = Dqn_V2_LengthSq_V2x2(merchant_pos, player_pos);
|
||||||
if (dist_squared < DQN_SQUARED(FP_Game_MetersToPixelsNx1(game->play, 4))) {
|
if (dist_squared < DQN_SQUARED(FP_Game_MetersToPixelsNx1(game->play, 4))) {
|
||||||
all_players_are_far_away_from_merchant_menu_trigger = false;
|
all_players_are_far_away_from_merchant_menu_trigger = false;
|
||||||
break;
|
menu_activation_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (all_players_are_far_away_from_merchant_menu_trigger)
|
if (all_players_are_far_away_from_merchant_menu_trigger)
|
||||||
sound_played_flags[merchant_index] = false;
|
sound_played_flags[merchant_index] = false;
|
||||||
|
|
||||||
|
if (menu_activation_count >= 2) {
|
||||||
|
DQN_ASSERT(merchant_with_more_than_2_menus_open.id == 0);
|
||||||
|
merchant_with_more_than_2_menus_open = merchant;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dqn_Rect first_player_avatar_rect = {};
|
Dqn_Rect first_player_avatar_rect = {};
|
||||||
@ -2629,10 +2636,10 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
|||||||
FP_GameAudio audio_type;
|
FP_GameAudio audio_type;
|
||||||
bool *sound_played;
|
bool *sound_played;
|
||||||
} merchants[] = {
|
} merchants[] = {
|
||||||
{play->merchant_terry, &play->merchant_terry_menu_pos, g_anim_names.icon_attack, g_anim_names.merchant_terry_menu, g_anim_names.club_terry_dark, Dqn_V2_InitNx2(0.015f, +0.04f), &invent->clubs, &invent->clubs_base_price, &invent->health_base_price, FP_GameAudio_MerchantTerry, &sound_played_flags[0]},
|
{play->merchant_terry, &player->merchant_terry_menu_pos, g_anim_names.icon_attack, g_anim_names.merchant_terry_menu, g_anim_names.club_terry_dark, Dqn_V2_InitNx2(0.015f, +0.04f), &invent->clubs, &invent->clubs_base_price, &invent->health_base_price, FP_GameAudio_MerchantTerry, &sound_played_flags[0]},
|
||||||
{play->merchant_graveyard, &play->merchant_graveyard_menu_pos, g_anim_names.icon_stamina, g_anim_names.merchant_graveyard_menu, g_anim_names.church_terry_dark, Dqn_V2_InitNx2(0.04f, -0.15f), &invent->churchs, &invent->churchs_base_price, &invent->stamina_base_price, FP_GameAudio_MerchantGhost, &sound_played_flags[1]},
|
{play->merchant_graveyard, &player->merchant_graveyard_menu_pos, g_anim_names.icon_stamina, g_anim_names.merchant_graveyard_menu, g_anim_names.church_terry_dark, Dqn_V2_InitNx2(0.04f, -0.15f), &invent->churchs, &invent->churchs_base_price, &invent->stamina_base_price, FP_GameAudio_MerchantGhost, &sound_played_flags[1]},
|
||||||
{play->merchant_gym, &play->merchant_gym_menu_pos, g_anim_names.icon_health, g_anim_names.merchant_gym_menu, g_anim_names.kennel_terry, Dqn_V2_InitNx2(0, +0), &invent->kennels, &invent->kennels_base_price, &invent->attack_base_price, FP_GameAudio_MerchantGym, &sound_played_flags[2]},
|
{play->merchant_gym, &player->merchant_gym_menu_pos, g_anim_names.icon_health, g_anim_names.merchant_gym_menu, g_anim_names.kennel_terry, Dqn_V2_InitNx2(0, +0), &invent->kennels, &invent->kennels_base_price, &invent->attack_base_price, FP_GameAudio_MerchantGym, &sound_played_flags[2]},
|
||||||
{play->merchant_phone_company, &play->merchant_phone_company_menu_pos, g_anim_names.icon_phone, g_anim_names.merchant_phone_company_menu, g_anim_names.airport_terry, Dqn_V2_InitNx2(0, -0.1f), &invent->airports, &invent->airports_base_price, &invent->mobile_plan_base_price, FP_GameAudio_MerchantPhone, &sound_played_flags[3]},
|
{play->merchant_phone_company, &player->merchant_phone_company_menu_pos, g_anim_names.icon_phone, g_anim_names.merchant_phone_company_menu, g_anim_names.airport_terry, Dqn_V2_InitNx2(0, -0.1f), &invent->airports, &invent->airports_base_price, &invent->mobile_plan_base_price, FP_GameAudio_MerchantPhone, &sound_played_flags[3]},
|
||||||
};
|
};
|
||||||
|
|
||||||
bool activated_merchant = false;
|
bool activated_merchant = false;
|
||||||
@ -2668,9 +2675,20 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
|||||||
Dqn_Rect top_rect = Dqn_Rect_InitV2x2(world_pos - (src_rect.size * .5f) - Dqn_V2_InitNx2(0.f, src_rect.size.h), src_rect.size);
|
Dqn_Rect top_rect = Dqn_Rect_InitV2x2(world_pos - (src_rect.size * .5f) - Dqn_V2_InitNx2(0.f, src_rect.size.h), src_rect.size);
|
||||||
Dqn_Rect bottom_rect = Dqn_Rect_InitV2x2(world_pos - (src_rect.size * .5f) + Dqn_V2_InitNx2(0.f, src_rect.size.h), src_rect.size);
|
Dqn_Rect bottom_rect = Dqn_Rect_InitV2x2(world_pos - (src_rect.size * .5f) + Dqn_V2_InitNx2(0.f, src_rect.size.h), src_rect.size);
|
||||||
|
|
||||||
// NOTE: Move the merchant menu if we overlap with it so as to not occlude the player
|
// NOTE: Position the merchant menu ========================================
|
||||||
{
|
if (merchant_with_more_than_2_menus_open == mapping.merchant) {
|
||||||
Dqn_V2 target_pos = {};
|
// NOTE: More than 2 players have activated the same merchant, we just
|
||||||
|
// draw the menus and overlap with the players.
|
||||||
|
if (player_index == 0)
|
||||||
|
*mapping.menu_pos = top_rect.pos;
|
||||||
|
else
|
||||||
|
*mapping.menu_pos = bottom_rect.pos;
|
||||||
|
} else {
|
||||||
|
// NOTE: Move the merchant menu if we overlap with it so as to not
|
||||||
|
// occlude the player. We *only* do this if the merchant is activated
|
||||||
|
// by 1 player only. If multiple players activate it, we just draw the
|
||||||
|
// menus-as-is.
|
||||||
|
Dqn_V2 target_pos = {};
|
||||||
Dqn_Rect camera_entity_hit_box = FP_Game_CalcEntityWorldHitBox(game, player->handle);
|
Dqn_Rect camera_entity_hit_box = FP_Game_CalcEntityWorldHitBox(game, player->handle);
|
||||||
if (Dqn_Rect_Intersects(top_rect, camera_entity_hit_box)) {
|
if (Dqn_Rect_Intersects(top_rect, camera_entity_hit_box)) {
|
||||||
target_pos = bottom_rect.pos;
|
target_pos = bottom_rect.pos;
|
||||||
|
@ -274,6 +274,11 @@ struct FP_GameEntity
|
|||||||
Dqn_usize build_mode_building_index;
|
Dqn_usize build_mode_building_index;
|
||||||
|
|
||||||
FP_GameControls controls;
|
FP_GameControls controls;
|
||||||
|
|
||||||
|
Dqn_V2 merchant_terry_menu_pos;
|
||||||
|
Dqn_V2 merchant_graveyard_menu_pos;
|
||||||
|
Dqn_V2 merchant_gym_menu_pos;
|
||||||
|
Dqn_V2 merchant_phone_company_menu_pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FP_GameEntityIterator
|
struct FP_GameEntityIterator
|
||||||
|
Loading…
Reference in New Issue
Block a user