diff --git a/CHANGELOG.md b/CHANGELOG.md
index b05a709f68..2acc3447d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Harvester boss now has new abilities and AI
 - Death particles and SFX
 - Default keybindings were made more consistent
+- Adjust Yeti difficulty
 
 ### Removed
 
diff --git a/assets/common/abilities/custom/yeti/frostbreath.ron b/assets/common/abilities/custom/yeti/frostbreath.ron
index 67e16b78ff..7f35a26ae7 100644
--- a/assets/common/abilities/custom/yeti/frostbreath.ron
+++ b/assets/common/abilities/custom/yeti/frostbreath.ron
@@ -1,20 +1,20 @@
 BasicBeam(
-    buildup_duration: 0.4,
+    buildup_duration: 0.8,
     recover_duration: 0.25,
     beam_duration: 0.25,
-    damage: 50,
-    tick_rate: 1.0,
+    damage: 10,
+    tick_rate: 5.0,
     range: 15.0,
     max_angle: 30.0,
     damage_effect: Some(Buff((
         kind: Frozen,
         dur_secs: 3.0,
-        strength: Value(1.5),
-        chance: 1.0,
+        strength: Value(0.5),
+        chance: 0.2,
     ))),
     energy_regen: 0,
     energy_drain: 0,
-    orientation_behavior: Normal,
-    ori_rate: 0.6,
+    orientation_behavior: FromOri,
+    ori_rate: 0.1,
     specifier: Frost,
 )
diff --git a/assets/common/abilities/custom/yeti/icespikes.ron b/assets/common/abilities/custom/yeti/icespikes.ron
index 3b99b3af93..ad3d0c87c5 100644
--- a/assets/common/abilities/custom/yeti/icespikes.ron
+++ b/assets/common/abilities/custom/yeti/icespikes.ron
@@ -1,17 +1,17 @@
 Shockwave(
     energy_cost: 0,
     buildup_duration: 0.6,
-    swing_duration: 0.12,
-    recover_duration: 0.3,
+    swing_duration: 0.15,
+    recover_duration: 1.0,
     damage: 100,
     poise_damage: 10,
     knockback: (strength: 25.0, direction: Up),
     shockwave_angle: 90.0,
     shockwave_vertical_angle: 15.0,
-    shockwave_speed: 50.0,
-    shockwave_duration: 0.5,
+    shockwave_speed: 15.0,
+    shockwave_duration: 3.0,
     requires_ground: true,
-    move_efficiency: 0.5,
+    move_efficiency: 0.2,
     damage_kind: Piercing,
     specifier: IceSpikes,
-)
\ No newline at end of file
+)
diff --git a/assets/common/abilities/custom/yeti/snowball.ron b/assets/common/abilities/custom/yeti/snowball.ron
index 7cd3348c8e..918622f706 100644
--- a/assets/common/abilities/custom/yeti/snowball.ron
+++ b/assets/common/abilities/custom/yeti/snowball.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 0,
     buildup_duration: 0.5,
-    recover_duration: 0.4,
+    recover_duration: 0.9,
     projectile: Snowball(
         damage: 200.0,
         radius: 5.0,
diff --git a/assets/common/abilities/custom/yeti/strike.ron b/assets/common/abilities/custom/yeti/strike.ron
index 1624a3c6e2..fc8cb528ee 100644
--- a/assets/common/abilities/custom/yeti/strike.ron
+++ b/assets/common/abilities/custom/yeti/strike.ron
@@ -1,11 +1,11 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 0.6,
+    buildup_duration: 0.8,
     swing_duration: 0.1,
-    recover_duration: 0.5,
+    recover_duration: 1.0,
     base_damage: 100,
     base_poise_damage: 50,
-    knockback: ( strength: 40.0, direction: Away),
+    knockback: ( strength: 70.0, direction: Away),
     range: 4.0,
     max_angle: 20.0,
     damage_effect: None,
diff --git a/server/src/sys/agent.rs b/server/src/sys/agent.rs
index 2810a7cd40..f141b59cca 100644
--- a/server/src/sys/agent.rs
+++ b/server/src/sys/agent.rs
@@ -3659,17 +3659,17 @@ impl<'a> AgentData<'a> {
         tgt_data: &TargetData,
         read_data: &ReadData,
     ) {
-        const ICE_SPIKES_RANGE: f32 = 20.0;
-        const ICE_BREATH_RANGE: f32 = 15.0;
+        const ICE_SPIKES_RANGE: f32 = 15.0;
+        const ICE_BREATH_RANGE: f32 = 10.0;
         const ICE_BREATH_TIMER: f32 = 10.0;
         const SNOWBALL_MAX_RANGE: f32 = 50.0;
 
         agent.action_state.counter += read_data.dt.0;
 
-        if attack_data.dist_sqrd < ICE_BREATH_RANGE.powi(2) && attack_data.angle < 60.0 {
-            if matches!(self.char_state, CharacterState::BasicBeam(c) if c.timer < Duration::from_secs(1))
+        if attack_data.dist_sqrd < ICE_BREATH_RANGE.powi(2) {
+            if matches!(self.char_state, CharacterState::BasicBeam(c) if c.timer < Duration::from_secs(2))
             {
-                // Keep using ice breath until a second has passed
+                // Keep using ice breath for 2 second
                 controller
                     .actions
                     .push(ControlAction::basic_input(InputKind::Ability(0)));