fp: Render the current wave
This commit is contained in:
		
							parent
							
								
									8ebbb64877
								
							
						
					
					
						commit
						b758a05809
					
				@ -1824,6 +1824,14 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
 | 
				
			|||||||
        FP_Game_MoveEntity(game, entity_handle, acceleration_meters_per_s);
 | 
					        FP_Game_MoveEntity(game, entity_handle, acceleration_meters_per_s);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // NOTE: If all enemies for the current wave have been spawned and the cooldown has elapsed
 | 
				
			||||||
 | 
					    // start the next wave.
 | 
				
			||||||
 | 
					    if (game->enemies_spawned_this_wave >= game->enemies_per_wave && game->clock_ms >= game->wave_cooldown_timestamp_ms) {
 | 
				
			||||||
 | 
					        game->enemies_per_wave           = DQN_MAX(5 * DQN_CAST(uint32_t)game->mob_spawners.size, DQN_CAST(uint32_t)(game->enemies_per_wave * 1.5f));
 | 
				
			||||||
 | 
					        game->enemies_spawned_this_wave  = 0;
 | 
				
			||||||
 | 
					        game->current_wave++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // NOTE: Update entity =========================================================================
 | 
					    // NOTE: Update entity =========================================================================
 | 
				
			||||||
    for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, game->root_entity); ) {
 | 
					    for (FP_GameEntityIterator it = {}; FP_Game_DFSPostOrderWalkEntityTree(game, &it, game->root_entity); ) {
 | 
				
			||||||
        FP_GameEntity *entity  = it.entity;
 | 
					        FP_GameEntity *entity  = it.entity;
 | 
				
			||||||
@ -1878,18 +1886,9 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
 | 
				
			|||||||
                    link = FP_SentinelList_Erase(&entity->spawn_list, link, game->chunk_pool);
 | 
					                    link = FP_SentinelList_Erase(&entity->spawn_list, link, game->chunk_pool);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (entity->enemies_spawned_this_wave >= entity->enemies_per_wave) {
 | 
					            if (game->enemies_spawned_this_wave < game->enemies_per_wave && entity->spawn_list.size < entity->spawn_cap) { // NOTE: Spawn new entities
 | 
				
			||||||
                // NOTE: If all enemies for the current wave have been spawned,
 | 
					 | 
				
			||||||
                // wait for the cooldown period before starting next wave
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (input->timer_s >= entity->wave_cooldown_timestamp_s) {
 | 
					 | 
				
			||||||
                    entity->current_wave++;
 | 
					 | 
				
			||||||
                    entity->enemies_per_wave         *= 2; // NOTE: Double the enemies for the next wave
 | 
					 | 
				
			||||||
                    entity->enemies_spawned_this_wave = 0;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } else if (entity->spawn_list.size < entity->spawn_cap) { // NOTE: Spawn new entities
 | 
					 | 
				
			||||||
                if (input->timer_s >= entity->next_spawn_timestamp_s) {
 | 
					                if (input->timer_s >= entity->next_spawn_timestamp_s) {
 | 
				
			||||||
                    uint16_t hp_adjustment = DQN_CAST(uint16_t)entity->current_wave - 1;
 | 
					                    uint16_t hp_adjustment         = DQN_CAST(uint16_t)game->current_wave;
 | 
				
			||||||
                    entity->next_spawn_timestamp_s = DQN_CAST(uint64_t)(input->timer_s + 5.f);
 | 
					                    entity->next_spawn_timestamp_s = DQN_CAST(uint64_t)(input->timer_s + 5.f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    Dqn_V2 entity_world_pos                        = FP_Game_CalcEntityWorldPos(game, entity->handle);
 | 
					                    Dqn_V2 entity_world_pos                        = FP_Game_CalcEntityWorldPos(game, entity->handle);
 | 
				
			||||||
@ -1921,13 +1920,10 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
 | 
				
			|||||||
                        waypoint->data.arrive                          = FP_GameWaypointArrive_WhenWithinEntitySize;
 | 
					                        waypoint->data.arrive                          = FP_GameWaypointArrive_WhenWithinEntitySize;
 | 
				
			||||||
                        waypoint->data.value                           = 1.5f;
 | 
					                        waypoint->data.value                           = 1.5f;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    entity->enemies_spawned_this_wave++;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // NOTE: If all enemies for the current wave have been spawned
 | 
					                    game->enemies_spawned_this_wave++;
 | 
				
			||||||
                    // set the cooldown time for the next wave
 | 
					                    if (game->enemies_spawned_this_wave >= game->enemies_per_wave)
 | 
				
			||||||
                    if (entity->enemies_spawned_this_wave >= entity->enemies_per_wave) {
 | 
					                        game->wave_cooldown_timestamp_ms = game->clock_ms + 30'000;
 | 
				
			||||||
                        entity->wave_cooldown_timestamp_s = DQN_CAST(uint64_t)(input->timer_s + 30.f); // NOTE: 30s cooldown
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -2603,6 +2599,33 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer)
 | 
				
			|||||||
        TELY_Render_TextF(renderer, next_pos, Dqn_V2_Zero, "[J|K] Melee/Range");
 | 
					        TELY_Render_TextF(renderer, next_pos, Dqn_V2_Zero, "[J|K] Melee/Range");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // NOTE: Render the wave ===================================================
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        TELY_Render_PushTransform(renderer, Dqn_M2x3_Identity());
 | 
				
			||||||
 | 
					        DQN_DEFER { TELY_Render_PopTransform(renderer); };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        TELY_Render_PushFont(renderer, game->talkco_font_large);
 | 
				
			||||||
 | 
					        DQN_DEFER { TELY_Render_PopFont(renderer); };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint64_t time_until_next_wave_ms = 0;
 | 
				
			||||||
 | 
					        if (game->enemies_spawned_this_wave >= game->enemies_per_wave) {
 | 
				
			||||||
 | 
					            if (game->wave_cooldown_timestamp_ms > game->clock_ms) {
 | 
				
			||||||
 | 
					                time_until_next_wave_ms = game->wave_cooldown_timestamp_ms - game->clock_ms;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Dqn_f32 mid_x = platform->core.window_size.x * .5f;
 | 
				
			||||||
 | 
					        if (time_until_next_wave_ms) {
 | 
				
			||||||
 | 
					            TELY_Render_TextF(renderer,
 | 
				
			||||||
 | 
					                              Dqn_V2_InitNx2(mid_x, player_avatar_rect.pos.y),
 | 
				
			||||||
 | 
					                              Dqn_V2_InitNx1(0.5f),
 | 
				
			||||||
 | 
					                              "%.1fs remaining until Wave %u!",
 | 
				
			||||||
 | 
					                              (time_until_next_wave_ms / 1000.f), game->current_wave + 1);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            TELY_Render_TextF(renderer, Dqn_V2_InitNx2(mid_x, player_avatar_rect.pos.y), Dqn_V2_InitNx1(0.5f), "Wave %u", game->current_wave);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!FP_Game_IsNilEntityHandle(game, game->clicked_entity)) {
 | 
					    if (!FP_Game_IsNilEntityHandle(game, game->clicked_entity)) {
 | 
				
			||||||
        // NOTE: Render building blueprint =========================================================
 | 
					        // NOTE: Render building blueprint =========================================================
 | 
				
			||||||
        if (game->active_menu == FP_GameActiveMenu_Build) {
 | 
					        if (game->active_menu == FP_GameActiveMenu_Build) {
 | 
				
			||||||
 | 
				
			|||||||
@ -410,11 +410,6 @@ static FP_GameEntityHandle FP_Entity_CreateMobSpawner(FP_Game *game, Dqn_V2 pos,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    entity->spawn_cap                  = spawn_cap;
 | 
					    entity->spawn_cap                  = spawn_cap;
 | 
				
			||||||
    entity->spawn_list                 = FP_SentinelList_Init<FP_GameEntityHandle>(game->chunk_pool);
 | 
					    entity->spawn_list                 = FP_SentinelList_Init<FP_GameEntityHandle>(game->chunk_pool);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    entity->current_wave               = 1;
 | 
					 | 
				
			||||||
    entity->enemies_per_wave           = 5;
 | 
					 | 
				
			||||||
    entity->enemies_spawned_this_wave  = 0;
 | 
					 | 
				
			||||||
    entity->wave_cooldown_timestamp_s  = 0;
 | 
					 | 
				
			||||||
    return result;
 | 
					    return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -209,11 +209,6 @@ struct FP_GameEntity
 | 
				
			|||||||
    uint64_t                              next_spawn_timestamp_s;
 | 
					    uint64_t                              next_spawn_timestamp_s;
 | 
				
			||||||
    uint64_t                              spawn_cap;
 | 
					    uint64_t                              spawn_cap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uint64_t                              current_wave;
 | 
					 | 
				
			||||||
    uint64_t                              enemies_per_wave;
 | 
					 | 
				
			||||||
    uint64_t                              enemies_spawned_this_wave;
 | 
					 | 
				
			||||||
    uint64_t                              wave_cooldown_timestamp_s;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    uint64_t                              flags;
 | 
					    uint64_t                              flags;
 | 
				
			||||||
    FP_GameDirection                      direction;
 | 
					    FP_GameDirection                      direction;
 | 
				
			||||||
    Dqn_V2                                local_pos;
 | 
					    Dqn_V2                                local_pos;
 | 
				
			||||||
@ -328,6 +323,11 @@ struct FP_Game
 | 
				
			|||||||
    Dqn_usize                             build_mode_building_index;
 | 
					    Dqn_usize                             build_mode_building_index;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Dqn_FArray<FP_GameEntityHandle, 4>    mob_spawners;
 | 
					    Dqn_FArray<FP_GameEntityHandle, 4>    mob_spawners;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint32_t                              current_wave;
 | 
				
			||||||
 | 
					    uint32_t                              enemies_per_wave;
 | 
				
			||||||
 | 
					    uint32_t                              enemies_spawned_this_wave;
 | 
				
			||||||
 | 
					    uint64_t                              wave_cooldown_timestamp_ms;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct FP_GameAStarNode
 | 
					struct FP_GameAStarNode
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user