Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4158674031 | |||
| 1de986b6ac | |||
| 395e8dc58a | |||
| 0044b05130 |
+57
-16
@@ -480,7 +480,7 @@ static void FP_PlayReset(FP_Game *game, TELY_Platform *platform)
|
||||
FP_Entity_CreateBillboard(game, Dqn_V2_InitNx2(1898, 771), FP_EntityBillboardState_Strafe, "Strafe Billboard");
|
||||
|
||||
// NOTE: Camera ================================================================================
|
||||
play->camera.world_pos = base_mid_p - Dqn_V2_InitV2I(platform->core.window_size * .5f);
|
||||
play->camera.world_pos = {};
|
||||
play->camera.scale = Dqn_V2_InitNx1(1);
|
||||
play->camera.size = Dqn_V2_InitNx2(1826, 1046);
|
||||
}
|
||||
@@ -1995,8 +1995,26 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
|
||||
}
|
||||
|
||||
if (entity->flags & FP_GameEntityFlag_CameraTracking) {
|
||||
FP_GameCamera *camera = &game->play.camera;
|
||||
camera->world_pos = FP_Game_CalcEntityWorldPos(game, entity->handle) * camera->scale;
|
||||
FP_GameCamera *camera = &game->play.camera;
|
||||
|
||||
// NOTE: calculate camera position based on camera shake
|
||||
Dqn_V2 camera_position = camera->world_pos;
|
||||
if (camera->shake_duration > 0) {
|
||||
Dqn_f32 offset_x = (Dqn_PCG32_NextF32(&game->play.rng) * 1000 - 500) * camera->shake_intensity;
|
||||
Dqn_f32 offset_y = (Dqn_PCG32_NextF32(&game->play.rng) * 1000 - 500) * camera->shake_intensity;
|
||||
|
||||
camera_position.x += offset_x;
|
||||
camera_position.y += offset_y;
|
||||
|
||||
camera->shake_duration -= input->delta_s;
|
||||
}
|
||||
|
||||
Dqn_f64 camera_smoothing = 5.0f;
|
||||
|
||||
camera->world_pos.x += (camera_position.x - camera->world_pos.x) * (camera_smoothing * input->delta_s);
|
||||
camera->world_pos.y += (camera_position.y - camera->world_pos.y) * (camera_smoothing * input->delta_s);
|
||||
|
||||
camera->world_pos_target = FP_Game_CalcEntityWorldPos(game, entity->handle) * camera->scale;
|
||||
}
|
||||
|
||||
FP_GamePlaceableBuilding placeable_building = PLACEABLE_BUILDINGS[game->play.build_mode_building_index];
|
||||
@@ -2244,13 +2262,20 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
|
||||
continue;
|
||||
}
|
||||
|
||||
defender->hp = defender->hp >= attacker->base_attack ? defender->hp - attacker->base_attack : 0;
|
||||
defender->hp = defender->hp >= attacker->base_attack ? defender->hp - attacker->base_attack : 0;
|
||||
defender->hit_on_frame = game->play.update_counter;
|
||||
|
||||
if (game->play.player == defender->handle) {
|
||||
game->play.camera.shake_intensity = 0.1f;
|
||||
game->play.camera.shake_duration = 0.25f;
|
||||
}
|
||||
|
||||
if (defender->hp <= 0) {
|
||||
if (!defender->is_dying) {
|
||||
FP_GameEntity *coin_receiver = FP_Game_GetEntity(game, attacker->projectile_owner);
|
||||
if (FP_Game_IsNilEntity(coin_receiver))
|
||||
coin_receiver = attacker;
|
||||
coin_receiver->coins += 1;
|
||||
coin_receiver->coins += 2;
|
||||
}
|
||||
defender->is_dying = true;
|
||||
}
|
||||
@@ -2290,11 +2315,12 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: Camera ================================================================================
|
||||
FP_GamePlay *play = &game->play;
|
||||
FP_GameCamera *camera = &play->camera;
|
||||
if (!FP_Game_IsNilEntityHandle(game, game->play.clicked_entity)) {
|
||||
Dqn_V2 window_size = Dqn_V2_InitV2I(platform->core.window_size);
|
||||
FP_GamePlay *play = &game->play;
|
||||
|
||||
FP_GameCamera *camera = &play->camera;
|
||||
camera->scale = window_size / camera->size;
|
||||
Dqn_V2 camera_size_screen = camera->size * camera->scale;
|
||||
|
||||
@@ -2302,12 +2328,13 @@ void FP_Update(TELY_Platform *platform, FP_Game *game, TELY_PlatformInput *input
|
||||
Dqn_V2 map_screen_size = map_world_size * camera->scale;
|
||||
Dqn_V2 half_map_screen_size = map_screen_size * .5f;
|
||||
|
||||
camera->world_pos.x = DQN_MIN(camera->world_pos.x, half_map_screen_size.w - (camera_size_screen.w * .5f));
|
||||
camera->world_pos.x = DQN_MAX(camera->world_pos.x, -half_map_screen_size.w + (camera_size_screen.w * .5f));
|
||||
camera->world_pos.y = DQN_MAX(camera->world_pos.y, -half_map_screen_size.h + (camera_size_screen.h * .5f));
|
||||
camera->world_pos.y = DQN_MIN(camera->world_pos.y, half_map_screen_size.h - (camera_size_screen.h * .5f));
|
||||
camera->world_pos_target.x = DQN_MIN(camera->world_pos_target.x, half_map_screen_size.w - (camera_size_screen.w * .5f));
|
||||
camera->world_pos_target.x = DQN_MAX(camera->world_pos_target.x, -half_map_screen_size.w + (camera_size_screen.w * .5f));
|
||||
camera->world_pos_target.y = DQN_MAX(camera->world_pos_target.y, -half_map_screen_size.h + (camera_size_screen.h * .5f));
|
||||
camera->world_pos_target.y = DQN_MIN(camera->world_pos_target.y, half_map_screen_size.h - (camera_size_screen.h * .5f));
|
||||
}
|
||||
|
||||
camera->world_pos += (camera->world_pos_target - camera->world_pos) * (5.f * DQN_CAST(Dqn_f32)input->delta_s);
|
||||
Dqn_Profiler_EndZone(update_zone);
|
||||
}
|
||||
|
||||
@@ -2431,13 +2458,26 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
||||
if (sprite.flip & TELY_AssetFlip_Y)
|
||||
dest_rect.size.h *= -1.f; // NOTE: Flip the texture vertically
|
||||
|
||||
Dqn_V4 sprite_colour = TELY_COLOUR_WHITE_V4;
|
||||
if (entity->hit_on_frame) {
|
||||
DQN_ASSERT(game->play.update_counter >= entity->hit_on_frame);
|
||||
Dqn_usize frames_elapsed_since_hit = game->play.update_counter - entity->hit_on_frame;
|
||||
Dqn_usize const HIT_CONFIRM_DURATION = 8;
|
||||
if (frames_elapsed_since_hit < HIT_CONFIRM_DURATION) {
|
||||
sprite_colour = TELY_COLOUR_RED_V4;
|
||||
sprite_colour.g = ((1.f / HIT_CONFIRM_DURATION) * frames_elapsed_since_hit);
|
||||
sprite_colour.b = ((1.f / HIT_CONFIRM_DURATION) * frames_elapsed_since_hit);
|
||||
}
|
||||
}
|
||||
|
||||
sprite_colour.a *= entity->action.sprite_alpha;
|
||||
TELY_Render_TextureColourV4(renderer,
|
||||
sprite.sheet->tex_handle,
|
||||
src_rect,
|
||||
dest_rect,
|
||||
Dqn_V2_Zero /*rotate origin*/,
|
||||
0.f /*rotate radians*/,
|
||||
TELY_Colour_V4Alpha(TELY_COLOUR_WHITE_V4, entity->action.sprite_alpha));
|
||||
sprite_colour);
|
||||
|
||||
if (entity->converted_faction) {
|
||||
Dqn_V2 label_p = Dqn_Rect_InterpolatedPoint(dest_rect, Dqn_V2_InitNx2(0, -0.25f));
|
||||
@@ -3600,8 +3640,8 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F9 %s god mode", game->play.god_mode ? "Disable" : "Enable"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F10 %s noclip", player->flags & FP_GameEntityFlag_NoClip ? "Disable" : "Enable"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F11 Building inventory +1"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " F12 %s by enemies", player->faction == FP_GameEntityFaction_Nil ? "Attacked" : "Ignored"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " 1 %s HUD", game->play.debug_hide_hud ? "Show" : "Hide"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_TextF(renderer, draw_p, Dqn_V2_Zero, " 2 %s by enemies", player->faction == FP_GameEntityFaction_Nil ? "Attacked" : "Ignored"); draw_p.y += TELY_Render_FontHeight(renderer, assets);
|
||||
TELY_Render_PopFont(renderer);
|
||||
TELY_Render_PopColourV4(renderer);
|
||||
|
||||
@@ -3656,14 +3696,15 @@ void FP_Render(FP_Game *game, TELY_Platform *platform, TELY_Renderer *renderer,
|
||||
player->inventory.kennels += 1;
|
||||
}
|
||||
|
||||
if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_F12)) {
|
||||
if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_1))
|
||||
game->play.debug_hide_hud = !game->play.debug_hide_hud;
|
||||
|
||||
if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_2)) {
|
||||
player->faction = player->faction == FP_GameEntityFaction_Nil
|
||||
? FP_GameEntityFaction_Friendly
|
||||
: FP_GameEntityFaction_Nil;
|
||||
}
|
||||
|
||||
if (TELY_Platform_InputScanCodeIsPressed(input, TELY_PlatformInputScanCode_1))
|
||||
game->play.debug_hide_hud = !game->play.debug_hide_hud;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -195,6 +195,7 @@ struct FP_GameEntity
|
||||
Dqn_V2 attack_box_size;
|
||||
Dqn_V2 attack_box_offset;
|
||||
bool attack_processed;
|
||||
Dqn_usize hit_on_frame;
|
||||
bool is_dying;
|
||||
uint64_t last_attack_timestamp;
|
||||
uint64_t attack_cooldown_ms;
|
||||
@@ -257,8 +258,11 @@ struct FP_GameCamera
|
||||
{
|
||||
Dqn_V2 size;
|
||||
Dqn_V2 world_pos;
|
||||
Dqn_V2 world_pos_target;
|
||||
Dqn_f32 rotate_rads;
|
||||
Dqn_V2 scale;
|
||||
Dqn_f32 shake_intensity;
|
||||
Dqn_f64 shake_duration;
|
||||
};
|
||||
|
||||
enum FP_GameAudio
|
||||
|
||||
Reference in New Issue
Block a user