diff --git a/assets/common/abilities/axe/doublestrike.ron b/assets/common/abilities/axe/doublestrike.ron
index 23449bd186..314cda35a8 100644
--- a/assets/common/abilities/axe/doublestrike.ron
+++ b/assets/common/abilities/axe/doublestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 8.0,
             range: 3.5,
             angle: 50.0,
-            base_buildup_duration: 350,
-            base_swing_duration: 75,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.35,
+            base_swing_duration: 0.075,
+            base_recover_duration: 0.4,
             forward_movement: 0.5,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 12.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 500,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.5,
             forward_movement: 0.25,
         ),
     ],
diff --git a/assets/common/abilities/axe/leap.ron b/assets/common/abilities/axe/leap.ron
index d4518b1b27..21717ff934 100644
--- a/assets/common/abilities/axe/leap.ron
+++ b/assets/common/abilities/axe/leap.ron
@@ -1,9 +1,9 @@
 LeapMelee(
     energy_cost: 450,
-    buildup_duration: 200,
-    movement_duration: 200,
-    swing_duration: 200,
-    recover_duration: 200,
+    buildup_duration: 0.2,
+    movement_duration: 0.2,
+    swing_duration: 0.2,
+    recover_duration: 0.2,
     base_damage: 240,
     base_poise_damage: 0,
     knockback: 12.0,
diff --git a/assets/common/abilities/axe/spin.ron b/assets/common/abilities/axe/spin.ron
index 3e21490f57..3d89fdb173 100644
--- a/assets/common/abilities/axe/spin.ron
+++ b/assets/common/abilities/axe/spin.ron
@@ -1,7 +1,7 @@
 SpinMelee(
-    buildup_duration: 200,
-    swing_duration: 400,
-    recover_duration: 200,
+    buildup_duration: 0.2,
+    swing_duration: 0.4,
+    recover_duration: 0.2,
     base_damage: 60,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/bow/basic.ron b/assets/common/abilities/bow/basic.ron
index ddef833ad9..cbc6e28040 100644
--- a/assets/common/abilities/bow/basic.ron
+++ b/assets/common/abilities/bow/basic.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 0,
-    buildup_duration: 500,
-    recover_duration: 300,
+    buildup_duration: 0.5,
+    recover_duration: 0.3,
     projectile: Arrow(
         damage: 70.0,
         knockback: 5.0,
diff --git a/assets/common/abilities/bow/charged.ron b/assets/common/abilities/bow/charged.ron
index cb098807d1..2bf5b53b7d 100644
--- a/assets/common/abilities/bow/charged.ron
+++ b/assets/common/abilities/bow/charged.ron
@@ -6,9 +6,9 @@ ChargedRanged(
     initial_knockback: 10.0,
     scaled_knockback: 10.0,
     speed: 1.0,
-    buildup_duration: 100,
-    charge_duration: 1500,
-    recover_duration: 500,
+    buildup_duration: 0.1,
+    charge_duration: 1.5,
+    recover_duration: 0.5,
     projectile_body: Object(MultiArrow),
     projectile_light: None,
     projectile_gravity: Some(Gravity(0.2)),
diff --git a/assets/common/abilities/bow/repeater.ron b/assets/common/abilities/bow/repeater.ron
index d494b639ed..2f691189bf 100644
--- a/assets/common/abilities/bow/repeater.ron
+++ b/assets/common/abilities/bow/repeater.ron
@@ -1,9 +1,9 @@
 RepeaterRanged(
     energy_cost: 450,
-    movement_duration: 300,
-    buildup_duration: 200,
-    shoot_duration: 200,
-    recover_duration: 800,
+    movement_duration: 0.3,
+    buildup_duration: 0.2,
+    shoot_duration: 0.2,
+    recover_duration: 0.8,
     leap: Some(5.0),
     projectile: Arrow(
         damage: 40.0,
diff --git a/assets/common/abilities/dagger/tempbasic.ron b/assets/common/abilities/dagger/tempbasic.ron
index 96f0bc4415..27bed0eca3 100644
--- a/assets/common/abilities/dagger/tempbasic.ron
+++ b/assets/common/abilities/dagger/tempbasic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 100,
-    swing_duration: 100,
-    recover_duration: 300,
+    buildup_duration: 0.1,
+    swing_duration: 0.1,
+    recover_duration: 0.3,
     base_damage: 50,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/debug/forwardboost.ron b/assets/common/abilities/debug/forwardboost.ron
index 81aefd978e..7c7c31703b 100644
--- a/assets/common/abilities/debug/forwardboost.ron
+++ b/assets/common/abilities/debug/forwardboost.ron
@@ -1,4 +1,4 @@
 Boost(
-    movement_duration: 50,
+    movement_duration: 0.05,
     only_up: false,
 )
\ No newline at end of file
diff --git a/assets/common/abilities/debug/possess.ron b/assets/common/abilities/debug/possess.ron
index 59de246057..92f722ee9a 100644
--- a/assets/common/abilities/debug/possess.ron
+++ b/assets/common/abilities/debug/possess.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 0,
-    buildup_duration: 1,
-    recover_duration: 10,
+    buildup_duration: 0.001,
+    recover_duration: 0.01,
     projectile: Possess,
     projectile_body: Object(ArrowSnake),
     /*projectile_light: Some(LightEmitter {
diff --git a/assets/common/abilities/debug/upboost.ron b/assets/common/abilities/debug/upboost.ron
index d0456d54ba..f6600130c8 100644
--- a/assets/common/abilities/debug/upboost.ron
+++ b/assets/common/abilities/debug/upboost.ron
@@ -1,4 +1,4 @@
 Boost(
-    movement_duration: 50,
+    movement_duration: 0.05,
     only_up: true,
 )
\ No newline at end of file
diff --git a/assets/common/abilities/empty/basic.ron b/assets/common/abilities/empty/basic.ron
index d4c8eee77a..e6c7d2f0ff 100644
--- a/assets/common/abilities/empty/basic.ron
+++ b/assets/common/abilities/empty/basic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 0,
-    swing_duration: 100,
-    recover_duration: 900,
+    buildup_duration: 0.0,
+    swing_duration: 0.1,
+    recover_duration: 0.9,
     base_damage: 20,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/farming/basic.ron b/assets/common/abilities/farming/basic.ron
index 91761c2515..2d8ff06774 100644
--- a/assets/common/abilities/farming/basic.ron
+++ b/assets/common/abilities/farming/basic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 600,
-    swing_duration: 100,
-    recover_duration: 150,
+    buildup_duration: 0.6,
+    swing_duration: 0.1,
+    recover_duration: 0.15,
     base_damage: 50,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/hammer/charged.ron b/assets/common/abilities/hammer/charged.ron
index 85d34ffd8b..dce676d2f2 100644
--- a/assets/common/abilities/hammer/charged.ron
+++ b/assets/common/abilities/hammer/charged.ron
@@ -10,8 +10,8 @@ ChargedMelee(
     range: 3.5,
     max_angle: 30.0,
     speed: 1.0,
-    charge_duration: 1200,
-    swing_duration: 200,
+    charge_duration: 1.2,
+    swing_duration: 0.2,
     hit_timing: 0.5,
-    recover_duration: 300,
+    recover_duration: 0.3,
 )
diff --git a/assets/common/abilities/hammer/leap.ron b/assets/common/abilities/hammer/leap.ron
index a407fae032..c0a0a12f99 100644
--- a/assets/common/abilities/hammer/leap.ron
+++ b/assets/common/abilities/hammer/leap.ron
@@ -1,9 +1,9 @@
 LeapMelee(
     energy_cost: 700,
-    buildup_duration: 100,
-    movement_duration: 800,
-    swing_duration: 150,
-    recover_duration: 200,
+    buildup_duration: 0.1,
+    movement_duration: 0.8,
+    swing_duration: 0.15,
+    recover_duration: 0.2,
     base_damage: 240,
     base_poise_damage: 0,
     knockback: 25.0,
diff --git a/assets/common/abilities/hammer/singlestrike.ron b/assets/common/abilities/hammer/singlestrike.ron
index e00e58a4a3..1332b94e67 100644
--- a/assets/common/abilities/hammer/singlestrike.ron
+++ b/assets/common/abilities/hammer/singlestrike.ron
@@ -8,9 +8,9 @@ ComboMelee(
         knockback: 10.0,
         range: 4.5,
         angle: 50.0,
-        base_buildup_duration: 600,
-        base_swing_duration: 150,
-        base_recover_duration: 300,
+        base_buildup_duration: 0.6,
+        base_swing_duration: 0.15,
+        base_recover_duration: 0.3,
         forward_movement: 0.0,
     )],
     initial_energy_gain: 50,
diff --git a/assets/common/abilities/sceptre/healingbeam.ron b/assets/common/abilities/sceptre/healingbeam.ron
index e107e03306..3c5822dbb2 100644
--- a/assets/common/abilities/sceptre/healingbeam.ron
+++ b/assets/common/abilities/sceptre/healingbeam.ron
@@ -1,7 +1,7 @@
 BasicBeam(
-    buildup_duration: 250,
-    recover_duration: 250,
-    beam_duration: 1000,
+    buildup_duration: 0.25,
+    recover_duration: 0.25,
+    beam_duration: 1.0,
     base_hps: 60,
     base_dps: 60,
     tick_rate: 2.0,
diff --git a/assets/common/abilities/sceptre/healingbomb.ron b/assets/common/abilities/sceptre/healingbomb.ron
index 731c259e80..a7d0be6de3 100644
--- a/assets/common/abilities/sceptre/healingbomb.ron
+++ b/assets/common/abilities/sceptre/healingbomb.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 450,
-    buildup_duration: 800,
-    recover_duration: 50,
+    buildup_duration: 0.8,
+    recover_duration: 0.05,
     projectile: Heal(
         heal: 80.0,
         damage: 60.0,
diff --git a/assets/common/abilities/shield/tempbasic.ron b/assets/common/abilities/shield/tempbasic.ron
index cd78ac1924..6998b394b5 100644
--- a/assets/common/abilities/shield/tempbasic.ron
+++ b/assets/common/abilities/shield/tempbasic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 100,
-    swing_duration: 100,
-    recover_duration: 300,
+    buildup_duration: 0.1,
+    swing_duration: 0.1,
+    recover_duration: 0.3,
     base_damage: 40,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/staff/firebomb.ron b/assets/common/abilities/staff/firebomb.ron
index 38eae4af48..16444d31a3 100644
--- a/assets/common/abilities/staff/firebomb.ron
+++ b/assets/common/abilities/staff/firebomb.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 0,
-    buildup_duration: 500,
-    recover_duration: 350,
+    buildup_duration: 0.5,
+    recover_duration: 0.35,
     projectile: Fireball(
         damage: 100.0,
         radius: 5.0,
diff --git a/assets/common/abilities/staff/fireshockwave.ron b/assets/common/abilities/staff/fireshockwave.ron
index 76631a94e6..962c821700 100644
--- a/assets/common/abilities/staff/fireshockwave.ron
+++ b/assets/common/abilities/staff/fireshockwave.ron
@@ -1,15 +1,15 @@
 Shockwave(
     energy_cost: 600,
-    buildup_duration: 700,
-    swing_duration: 100,
-    recover_duration: 300,
+    buildup_duration: 0.7,
+    swing_duration: 0.1,
+    recover_duration: 0.3,
     damage: 200,
     poise_damage: 0,
     knockback: ( strength: 25.0, direction: Away),
     shockwave_angle: 360.0,
     shockwave_vertical_angle: 90.0,
     shockwave_speed: 20.0,
-    shockwave_duration: 500,
+    shockwave_duration: 0.5,
     requires_ground: false,
     move_efficiency: 0.1,
 )
diff --git a/assets/common/abilities/staff/flamethrower.ron b/assets/common/abilities/staff/flamethrower.ron
index bc63f1d9a9..42a2571d4a 100644
--- a/assets/common/abilities/staff/flamethrower.ron
+++ b/assets/common/abilities/staff/flamethrower.ron
@@ -1,7 +1,7 @@
 BasicBeam(
-    buildup_duration: 250,
-    recover_duration: 250,
-    beam_duration: 500,
+    buildup_duration: 0.25,
+    recover_duration: 0.25,
+    beam_duration: 0.5,
     base_hps: 0,
     base_dps: 150,
     tick_rate: 3.0,
diff --git a/assets/common/abilities/sword/dash.ron b/assets/common/abilities/sword/dash.ron
index 355f9a44ee..4af6873b5f 100644
--- a/assets/common/abilities/sword/dash.ron
+++ b/assets/common/abilities/sword/dash.ron
@@ -10,10 +10,10 @@ DashMelee(
     angle: 45.0,
     energy_drain: 600,
     forward_speed: 4.0,
-    buildup_duration: 250,
-    charge_duration: 600,
-    swing_duration: 100,
-    recover_duration: 500,
+    buildup_duration: 0.25,
+    charge_duration: 0.6,
+    swing_duration: 0.1,
+    recover_duration: 0.5,
     infinite_charge: true,
     is_interruptible: true,
 )
diff --git a/assets/common/abilities/sword/spin.ron b/assets/common/abilities/sword/spin.ron
index 2b1e09dbcd..9e628e5253 100644
--- a/assets/common/abilities/sword/spin.ron
+++ b/assets/common/abilities/sword/spin.ron
@@ -1,7 +1,7 @@
 SpinMelee(
-    buildup_duration: 600,
-    swing_duration: 400,
-    recover_duration: 500,
+    buildup_duration: 0.6,
+    swing_duration: 0.4,
+    recover_duration: 0.5,
     base_damage: 160,
     base_poise_damage: 0,
     knockback: 10.0,
diff --git a/assets/common/abilities/sword/triplestrike.ron b/assets/common/abilities/sword/triplestrike.ron
index ad1cbd6c83..06bf0c8667 100644
--- a/assets/common/abilities/sword/triplestrike.ron
+++ b/assets/common/abilities/sword/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 4.0,
             angle: 30.0,
-            base_buildup_duration: 350,
-            base_swing_duration: 100,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.35,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.4,
             forward_movement: 0.5,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 12.0,
             range: 3.5,
             angle: 180.0,
-            base_buildup_duration: 400,
-            base_swing_duration: 600,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.4,
+            base_swing_duration: 0.6,
+            base_recover_duration: 0.4,
             forward_movement: 0.0,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 14.0,
             range: 6.0,
             angle: 10.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 200,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.2,
+            base_recover_duration: 0.3,
             forward_movement: 1.2,
         ),
     ],
diff --git a/assets/common/abilities/unique/beastclaws/basic.ron b/assets/common/abilities/unique/beastclaws/basic.ron
index cdc3a21430..bba42ea1cb 100644
--- a/assets/common/abilities/unique/beastclaws/basic.ron
+++ b/assets/common/abilities/unique/beastclaws/basic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 250,
-    swing_duration: 250,
-    recover_duration: 250,
+    buildup_duration: 0.25,
+    swing_duration: 0.25,
+    recover_duration: 0.25,
     knockback: 25.0,
     base_damage: 200,
     base_poise_damage: 0,
diff --git a/assets/common/abilities/unique/quadlowbasic/singlestrike.ron b/assets/common/abilities/unique/quadlowbasic/singlestrike.ron
index 7a3066bb06..81394686c5 100644
--- a/assets/common/abilities/unique/quadlowbasic/singlestrike.ron
+++ b/assets/common/abilities/unique/quadlowbasic/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 3.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadlowbasic/triplestrike.ron b/assets/common/abilities/unique/quadlowbasic/triplestrike.ron
index fa9e4bcf23..894f7e7dc3 100644
--- a/assets/common/abilities/unique/quadlowbasic/triplestrike.ron
+++ b/assets/common/abilities/unique/quadlowbasic/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 2.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.5,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.5,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadlowbreathe/dash.ron b/assets/common/abilities/unique/quadlowbreathe/dash.ron
index 57709273c7..75bc98c21e 100644
--- a/assets/common/abilities/unique/quadlowbreathe/dash.ron
+++ b/assets/common/abilities/unique/quadlowbreathe/dash.ron
@@ -10,10 +10,10 @@ DashMelee(
     angle: 45.0,
     energy_drain: 0,
     forward_speed: 4.0,
-    buildup_duration: 500,
-    charge_duration: 1000,
-    swing_duration: 100,
-    recover_duration: 800,
+    buildup_duration: 0.5,
+    charge_duration: 1.0,
+    swing_duration: 0.1,
+    recover_duration: 0.8,
     infinite_charge: true,
     is_interruptible: false,
 )
diff --git a/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron b/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron
index 9fb88a8edd..f8df4454c5 100644
--- a/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron
+++ b/assets/common/abilities/unique/quadlowbreathe/flamethrower.ron
@@ -1,7 +1,7 @@
 BasicBeam(
-    buildup_duration: 400,
-    recover_duration: 250,
-    beam_duration: 500,
+    buildup_duration: 0.4,
+    recover_duration: 0.25,
+    beam_duration: 0.5,
     base_hps: 0,
     base_dps: 150,
     tick_rate: 3.0,
diff --git a/assets/common/abilities/unique/quadlowbreathe/triplestrike.ron b/assets/common/abilities/unique/quadlowbreathe/triplestrike.ron
index 1d4512be9a..19002fa7e5 100644
--- a/assets/common/abilities/unique/quadlowbreathe/triplestrike.ron
+++ b/assets/common/abilities/unique/quadlowbreathe/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 4.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 2.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.5,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.5,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadlowquick/dash.ron b/assets/common/abilities/unique/quadlowquick/dash.ron
index 7a0faf4799..cf29972bc0 100644
--- a/assets/common/abilities/unique/quadlowquick/dash.ron
+++ b/assets/common/abilities/unique/quadlowquick/dash.ron
@@ -10,10 +10,10 @@ DashMelee(
     angle: 45.0,
     energy_drain: 0,
     forward_speed: 2.0,
-    buildup_duration: 500,
-    charge_duration: 300,
-    swing_duration: 100,
-    recover_duration: 500,
+    buildup_duration: 0.5,
+    charge_duration: 0.3,
+    swing_duration: 0.1,
+    recover_duration: 0.5,
     infinite_charge: true,
     is_interruptible: false,
 )
diff --git a/assets/common/abilities/unique/quadlowquick/quadstrike.ron b/assets/common/abilities/unique/quadlowquick/quadstrike.ron
index 0defac6e9b..8547f9ad20 100644
--- a/assets/common/abilities/unique/quadlowquick/quadstrike.ron
+++ b/assets/common/abilities/unique/quadlowquick/quadstrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 2.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 600,
-            base_swing_duration: 100,
-            base_recover_duration: 100,
+            base_buildup_duration: 0.6,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.1,
             forward_movement: 1.5,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 2.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 200,
-            base_swing_duration: 100,
-            base_recover_duration: 100,
+            base_buildup_duration: 0.2,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.1,
             forward_movement: 0.8,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 2.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 200,
-            base_swing_duration: 100,
-            base_recover_duration: 100,
+            base_buildup_duration: 0.2,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.1,
             forward_movement: 0.8,
         ),
         (
@@ -51,9 +51,9 @@ ComboMelee(
             knockback: 8.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 200,
-            base_swing_duration: 100,
-            base_recover_duration: 100,
+            base_buildup_duration: 0.2,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.1,
             forward_movement: 0.8,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadlowranged/firebomb.ron b/assets/common/abilities/unique/quadlowranged/firebomb.ron
index eb0d41a830..160e6def79 100644
--- a/assets/common/abilities/unique/quadlowranged/firebomb.ron
+++ b/assets/common/abilities/unique/quadlowranged/firebomb.ron
@@ -1,7 +1,7 @@
 BasicRanged(
     energy_cost: 0,
-    buildup_duration: 800,
-    recover_duration: 350,
+    buildup_duration: 0.8,
+    recover_duration: 0.35,
     projectile: Fireball(
         damage: 100.0,
         radius: 5.0,
diff --git a/assets/common/abilities/unique/quadlowranged/singlestrike.ron b/assets/common/abilities/unique/quadlowranged/singlestrike.ron
index d3711a4c46..d33d76a794 100644
--- a/assets/common/abilities/unique/quadlowranged/singlestrike.ron
+++ b/assets/common/abilities/unique/quadlowranged/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 3.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadlowtail/charged.ron b/assets/common/abilities/unique/quadlowtail/charged.ron
index b4a8c0006c..0c03daed43 100644
--- a/assets/common/abilities/unique/quadlowtail/charged.ron
+++ b/assets/common/abilities/unique/quadlowtail/charged.ron
@@ -10,8 +10,8 @@ ChargedMelee(
     range: 6.0,
     max_angle: 90.0,
     speed: 1.0,
-    charge_duration: 1200,
-    swing_duration: 700,
+    charge_duration: 1.2,
+    swing_duration: 0.7,
     hit_timing: 0.9,
-    recover_duration: 1200,
+    recover_duration: 1.2,
 )
diff --git a/assets/common/abilities/unique/quadlowtail/triplestrike.ron b/assets/common/abilities/unique/quadlowtail/triplestrike.ron
index 133304cba4..df16e28ff4 100644
--- a/assets/common/abilities/unique/quadlowtail/triplestrike.ron
+++ b/assets/common/abilities/unique/quadlowtail/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 200,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.2,
             forward_movement: 2.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 200,
-            base_swing_duration: 100,
-            base_recover_duration: 200,
+            base_buildup_duration: 0.2,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.2,
             forward_movement: 1.0,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 200,
-            base_swing_duration: 100,
-            base_recover_duration: 200,
+            base_buildup_duration: 0.2,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.2,
             forward_movement: 1.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadmedbasic/singlestrike.ron b/assets/common/abilities/unique/quadmedbasic/singlestrike.ron
index 3138f0e7cd..7646178bb5 100644
--- a/assets/common/abilities/unique/quadmedbasic/singlestrike.ron
+++ b/assets/common/abilities/unique/quadmedbasic/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 650,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.65,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 1.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadmedbasic/triplestrike.ron b/assets/common/abilities/unique/quadmedbasic/triplestrike.ron
index 7479271ed7..622ec06793 100644
--- a/assets/common/abilities/unique/quadmedbasic/triplestrike.ron
+++ b/assets/common/abilities/unique/quadmedbasic/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.4,
             forward_movement: 1.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 300,
-            base_swing_duration: 100,
-            base_recover_duration: 200,
+            base_buildup_duration: 0.3,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.2,
             forward_movement: 0.0,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 300,
-            base_swing_duration: 100,
-            base_recover_duration: 200,
+            base_buildup_duration: 0.3,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.2,
             forward_movement: 1.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadmedcharge/dash.ron b/assets/common/abilities/unique/quadmedcharge/dash.ron
index 9f4acc580f..485f073dcf 100644
--- a/assets/common/abilities/unique/quadmedcharge/dash.ron
+++ b/assets/common/abilities/unique/quadmedcharge/dash.ron
@@ -10,10 +10,10 @@ DashMelee(
     angle: 45.0,
     energy_drain: 0,
     forward_speed: 2.0,
-    buildup_duration: 500,
-    charge_duration: 1200,
-    swing_duration: 100,
-    recover_duration: 1100,
+    buildup_duration: 0.5,
+    charge_duration: 1.2,
+    swing_duration: 0.1,
+    recover_duration: 1.1,
     infinite_charge: true,
     is_interruptible: false,
 )
diff --git a/assets/common/abilities/unique/quadmedcharge/doublestrike.ron b/assets/common/abilities/unique/quadmedcharge/doublestrike.ron
index 850d652f47..e1361313bd 100644
--- a/assets/common/abilities/unique/quadmedcharge/doublestrike.ron
+++ b/assets/common/abilities/unique/quadmedcharge/doublestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 0.5,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadmedhoof/basic.ron b/assets/common/abilities/unique/quadmedhoof/basic.ron
index 8e517a4f7f..6d23313014 100644
--- a/assets/common/abilities/unique/quadmedhoof/basic.ron
+++ b/assets/common/abilities/unique/quadmedhoof/basic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 600,
-    swing_duration: 500,
-    recover_duration: 350,
+    buildup_duration: 0.6,
+    swing_duration: 0.5,
+    recover_duration: 0.35,
     base_damage: 130,
     base_poise_damage: 0,
     knockback: 25.0,
diff --git a/assets/common/abilities/unique/quadmedjump/doublestrike.ron b/assets/common/abilities/unique/quadmedjump/doublestrike.ron
index 68c8084ce9..eab589270c 100644
--- a/assets/common/abilities/unique/quadmedjump/doublestrike.ron
+++ b/assets/common/abilities/unique/quadmedjump/doublestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 8.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 8.0,
             range: 3.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 100,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.1,
+            base_recover_duration: 0.3,
             forward_movement: 1.5,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadmedjump/leap.ron b/assets/common/abilities/unique/quadmedjump/leap.ron
index bf6c78c3ce..b66583eb2c 100644
--- a/assets/common/abilities/unique/quadmedjump/leap.ron
+++ b/assets/common/abilities/unique/quadmedjump/leap.ron
@@ -1,9 +1,9 @@
 LeapMelee(
     energy_cost: 0,
-    buildup_duration: 500,
-    movement_duration: 400,
-    swing_duration: 75,
-    recover_duration: 200,
+    buildup_duration: 0.5,
+    movement_duration: 0.4,
+    swing_duration: 0.075,
+    recover_duration: 0.2,
     base_damage: 240,
     base_poise_damage: 0,
     knockback: 12.0,
diff --git a/assets/common/abilities/unique/quadmedjump/quickleap.ron b/assets/common/abilities/unique/quadmedjump/quickleap.ron
index 94b614ad12..b4963c1150 100644
--- a/assets/common/abilities/unique/quadmedjump/quickleap.ron
+++ b/assets/common/abilities/unique/quadmedjump/quickleap.ron
@@ -1,9 +1,9 @@
 LeapMelee(
     energy_cost: 0,
-    buildup_duration: 200,
-    movement_duration: 300,
-    swing_duration: 75,
-    recover_duration: 125,
+    buildup_duration: 0.2,
+    movement_duration: 0.3,
+    swing_duration: 0.075,
+    recover_duration: 0.125,
     base_damage: 120,
     base_poise_damage: 0,
     knockback: 7.0,
diff --git a/assets/common/abilities/unique/quadmedquick/dash.ron b/assets/common/abilities/unique/quadmedquick/dash.ron
index c0cd1dc9fc..f58c3059dc 100644
--- a/assets/common/abilities/unique/quadmedquick/dash.ron
+++ b/assets/common/abilities/unique/quadmedquick/dash.ron
@@ -10,10 +10,10 @@ DashMelee(
     angle: 45.0,
     energy_drain: 0,
     forward_speed: 2.0,
-    buildup_duration: 1200,
-    charge_duration: 300,
-    swing_duration: 100,
-    recover_duration: 500,
+    buildup_duration: 1.2,
+    charge_duration: 0.3,
+    swing_duration: 0.1,
+    recover_duration: 0.5,
     infinite_charge: true,
     is_interruptible: false,
 )
diff --git a/assets/common/abilities/unique/quadmedquick/triplestrike.ron b/assets/common/abilities/unique/quadmedquick/triplestrike.ron
index b396bedc0d..001aa3d68b 100644
--- a/assets/common/abilities/unique/quadmedquick/triplestrike.ron
+++ b/assets/common/abilities/unique/quadmedquick/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 800,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.8,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 0.3,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 600,
-            base_swing_duration: 150,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.6,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.3,
             forward_movement: 0.5,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 600,
-            base_swing_duration: 150,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.6,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.3,
             forward_movement: 0.5,
         ),
     ],
diff --git a/assets/common/abilities/unique/quadsmallbasic/singlestrike.ron b/assets/common/abilities/unique/quadsmallbasic/singlestrike.ron
index 0526899e60..eeef8f01ea 100644
--- a/assets/common/abilities/unique/quadsmallbasic/singlestrike.ron
+++ b/assets/common/abilities/unique/quadsmallbasic/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 3.5,
             angle: 60.0,
-            base_buildup_duration: 300,
-            base_swing_duration: 150,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.3,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.3,
             forward_movement: 1.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/stonegolemfist/basic.ron b/assets/common/abilities/unique/stonegolemfist/basic.ron
index 2dc89b8cac..49d111c38d 100644
--- a/assets/common/abilities/unique/stonegolemfist/basic.ron
+++ b/assets/common/abilities/unique/stonegolemfist/basic.ron
@@ -1,8 +1,8 @@
 BasicMelee(
     energy_cost: 0,
-    buildup_duration: 400,
-    swing_duration: 100,
-    recover_duration: 250,
+    buildup_duration: 0.4,
+    swing_duration: 0.1,
+    recover_duration: 0.25,
     knockback: 25.0,
     base_damage: 200,
     base_poise_damage: 0,
diff --git a/assets/common/abilities/unique/stonegolemfist/shockwave.ron b/assets/common/abilities/unique/stonegolemfist/shockwave.ron
index 791274dee7..e17d266d1a 100644
--- a/assets/common/abilities/unique/stonegolemfist/shockwave.ron
+++ b/assets/common/abilities/unique/stonegolemfist/shockwave.ron
@@ -1,15 +1,15 @@
 Shockwave(
     energy_cost: 0,
-    buildup_duration: 500,
-    swing_duration: 200,
-    recover_duration: 800,
+    buildup_duration: 0.5,
+    swing_duration: 0.2,
+    recover_duration: 0.8,
     damage: 500,
     poise_damage: 0,
     knockback: (strength: 40.0, direction: TowardsUp),
     shockwave_angle: 90.0,
     shockwave_vertical_angle: 90.0,
     shockwave_speed: 50.0,
-    shockwave_duration: 1000,
+    shockwave_duration: 1.0,
     requires_ground: true,
     move_efficiency: 0.05,
 )
diff --git a/assets/common/abilities/unique/stonegolemfist/spin.ron b/assets/common/abilities/unique/stonegolemfist/spin.ron
index fb106e851f..d33628d464 100644
--- a/assets/common/abilities/unique/stonegolemfist/spin.ron
+++ b/assets/common/abilities/unique/stonegolemfist/spin.ron
@@ -1,7 +1,7 @@
 SpinMelee(
-    buildup_duration: 100,
-    swing_duration: 300,
-    recover_duration: 100,
+    buildup_duration: 0.1,
+    swing_duration: 0.3,
+    recover_duration: 0.1,
     base_damage: 500,
     base_poise_damage: 0,
     knockback: 0.0,
diff --git a/assets/common/abilities/unique/theropodbasic/singlestrike.ron b/assets/common/abilities/unique/theropodbasic/singlestrike.ron
index 8c84abc5da..09f9bbd86b 100644
--- a/assets/common/abilities/unique/theropodbasic/singlestrike.ron
+++ b/assets/common/abilities/unique/theropodbasic/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 7.5,
             angle: 60.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 3.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/theropodbasic/triplestrike.ron b/assets/common/abilities/unique/theropodbasic/triplestrike.ron
index 839749b65b..43c3c68909 100644
--- a/assets/common/abilities/unique/theropodbasic/triplestrike.ron
+++ b/assets/common/abilities/unique/theropodbasic/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 7.5,
             angle: 30.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 150,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.3,
             forward_movement: 1.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 5.5,
             angle: 30.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 150,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.15,
             forward_movement: 1.0,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 5.5,
             angle: 30.0,
-            base_buildup_duration: 350,
-            base_swing_duration: 125,
-            base_recover_duration: 900,
+            base_buildup_duration: 0.35,
+            base_swing_duration: 0.125,
+            base_recover_duration: 0.9,
             forward_movement: 1.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/theropodbird/singlestrike.ron b/assets/common/abilities/unique/theropodbird/singlestrike.ron
index 56f8b3b137..3bb472cda9 100644
--- a/assets/common/abilities/unique/theropodbird/singlestrike.ron
+++ b/assets/common/abilities/unique/theropodbird/singlestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 5.0,
             range: 5.5,
             angle: 5.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 400,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.4,
             forward_movement: 3.0,
         ),
     ],
diff --git a/assets/common/abilities/unique/theropodbird/triplestrike.ron b/assets/common/abilities/unique/theropodbird/triplestrike.ron
index 853c2583a2..6fd4e976c5 100644
--- a/assets/common/abilities/unique/theropodbird/triplestrike.ron
+++ b/assets/common/abilities/unique/theropodbird/triplestrike.ron
@@ -9,9 +9,9 @@ ComboMelee(
             knockback: 10.0,
             range: 4.5,
             angle: 5.0,
-            base_buildup_duration: 900,
-            base_swing_duration: 150,
-            base_recover_duration: 300,
+            base_buildup_duration: 0.9,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.3,
             forward_movement: 1.0,
         ),
         (
@@ -23,9 +23,9 @@ ComboMelee(
             knockback: 10.0,
             range: 4.0,
             angle: 10.0,
-            base_buildup_duration: 500,
-            base_swing_duration: 150,
-            base_recover_duration: 150,
+            base_buildup_duration: 0.5,
+            base_swing_duration: 0.15,
+            base_recover_duration: 0.15,
             forward_movement: 1.0,
         ),
         (
@@ -37,9 +37,9 @@ ComboMelee(
             knockback: 10.0,
             range: 4.0,
             angle: 10.0,
-            base_buildup_duration: 350,
-            base_swing_duration: 125,
-            base_recover_duration: 900,
+            base_buildup_duration: 0.35,
+            base_swing_duration: 0.125,
+            base_recover_duration: 0.9,
             forward_movement: 1.0,
         ),
     ],
diff --git a/common/src/combat.rs b/common/src/combat.rs
index 610925b447..15262c96d8 100644
--- a/common/src/combat.rs
+++ b/common/src/combat.rs
@@ -201,7 +201,7 @@ impl Attack {
                         ..
                     }) = attacker_info
                     {
-                        let sufficient_energy = e.current() >= *r;
+                        let sufficient_energy = e.current() as f32 >= *r;
                         if sufficient_energy {
                             emit(ServerEvent::EnergyChange {
                                 entity,
@@ -347,7 +347,7 @@ pub enum CombatEffect {
     Heal(f32),
     Buff(CombatBuff),
     Knockback(Knockback),
-    EnergyReward(u32),
+    EnergyReward(f32),
     Lifesteal(f32),
     Poise(f32),
 }
@@ -355,7 +355,7 @@ pub enum CombatEffect {
 #[derive(Clone, Debug, Serialize, Deserialize)]
 pub enum CombatRequirement {
     AnyDamage,
-    SufficientEnergy(u32),
+    SufficientEnergy(f32),
 }
 
 #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
diff --git a/common/src/comp/ability.rs b/common/src/comp/ability.rs
index bf689049c1..993e41a7df 100644
--- a/common/src/comp/ability.rs
+++ b/common/src/comp/ability.rs
@@ -56,20 +56,20 @@ impl From<&CharacterState> for CharacterAbilityType {
 #[derive(Clone, PartialEq, Debug, Serialize, Deserialize)]
 pub enum CharacterAbility {
     BasicMelee {
-        energy_cost: u32,
-        buildup_duration: u64,
-        swing_duration: u64,
-        recover_duration: u64,
-        base_damage: u32,
-        base_poise_damage: u32,
+        energy_cost: f32,
+        buildup_duration: f32,
+        swing_duration: f32,
+        recover_duration: f32,
+        base_damage: f32,
+        base_poise_damage: f32,
         knockback: f32,
         range: f32,
         max_angle: f32,
     },
     BasicRanged {
-        energy_cost: u32,
-        buildup_duration: u64,
-        recover_duration: u64,
+        energy_cost: f32,
+        buildup_duration: f32,
+        recover_duration: f32,
         projectile: ProjectileConstructor,
         projectile_body: Body,
         projectile_light: Option<LightEmitter>,
@@ -78,11 +78,11 @@ pub enum CharacterAbility {
         can_continue: bool,
     },
     RepeaterRanged {
-        energy_cost: u32,
-        movement_duration: u64,
-        buildup_duration: u64,
-        shoot_duration: u64,
-        recover_duration: u64,
+        energy_cost: f32,
+        movement_duration: f32,
+        buildup_duration: f32,
+        shoot_duration: f32,
+        recover_duration: f32,
         leap: Option<f32>,
         projectile: ProjectileConstructor,
         projectile_body: Body,
@@ -92,55 +92,55 @@ pub enum CharacterAbility {
         reps_remaining: u32,
     },
     Boost {
-        movement_duration: u64,
+        movement_duration: f32,
         only_up: bool,
     },
     DashMelee {
-        energy_cost: u32,
-        base_damage: u32,
-        scaled_damage: u32,
-        base_poise_damage: u32,
-        scaled_poise_damage: u32,
+        energy_cost: f32,
+        base_damage: f32,
+        scaled_damage: f32,
+        base_poise_damage: f32,
+        scaled_poise_damage: f32,
         base_knockback: f32,
         scaled_knockback: f32,
         range: f32,
         angle: f32,
-        energy_drain: u32,
+        energy_drain: f32,
         forward_speed: f32,
-        buildup_duration: u64,
-        charge_duration: u64,
-        swing_duration: u64,
-        recover_duration: u64,
+        buildup_duration: f32,
+        charge_duration: f32,
+        swing_duration: f32,
+        recover_duration: f32,
         infinite_charge: bool,
         is_interruptible: bool,
     },
     BasicBlock,
     Roll {
-        energy_cost: u32,
-        buildup_duration: u64,
-        movement_duration: u64,
-        recover_duration: u64,
+        energy_cost: f32,
+        buildup_duration: f32,
+        movement_duration: f32,
+        recover_duration: f32,
         roll_strength: f32,
         immune_melee: bool,
     },
     ComboMelee {
-        stage_data: Vec<combo_melee::Stage<u64>>,
-        initial_energy_gain: u32,
-        max_energy_gain: u32,
-        energy_increase: u32,
+        stage_data: Vec<combo_melee::Stage<f32>>,
+        initial_energy_gain: f32,
+        max_energy_gain: f32,
+        energy_increase: f32,
         speed_increase: f32,
         max_speed_increase: f32,
         scales_from_combo: u32,
         is_interruptible: bool,
     },
     LeapMelee {
-        energy_cost: u32,
-        buildup_duration: u64,
-        movement_duration: u64,
-        swing_duration: u64,
-        recover_duration: u64,
-        base_damage: u32,
-        base_poise_damage: u32,
+        energy_cost: f32,
+        buildup_duration: f32,
+        movement_duration: f32,
+        swing_duration: f32,
+        recover_duration: f32,
+        base_damage: f32,
+        base_poise_damage: f32,
         range: f32,
         max_angle: f32,
         knockback: f32,
@@ -148,14 +148,14 @@ pub enum CharacterAbility {
         vertical_leap_strength: f32,
     },
     SpinMelee {
-        buildup_duration: u64,
-        swing_duration: u64,
-        recover_duration: u64,
-        base_damage: u32,
-        base_poise_damage: u32,
+        buildup_duration: f32,
+        swing_duration: f32,
+        recover_duration: f32,
+        base_damage: f32,
+        base_poise_damage: f32,
         knockback: f32,
         range: f32,
-        energy_cost: u32,
+        energy_cost: f32,
         is_infinite: bool,
         movement_behavior: spin_melee::MovementBehavior,
         is_interruptible: bool,
@@ -163,33 +163,33 @@ pub enum CharacterAbility {
         num_spins: u32,
     },
     ChargedMelee {
-        energy_cost: u32,
-        energy_drain: u32,
-        initial_damage: u32,
-        scaled_damage: u32,
-        initial_poise_damage: u32,
-        scaled_poise_damage: u32,
+        energy_cost: f32,
+        energy_drain: f32,
+        initial_damage: f32,
+        scaled_damage: f32,
+        initial_poise_damage: f32,
+        scaled_poise_damage: f32,
         initial_knockback: f32,
         scaled_knockback: f32,
         range: f32,
         max_angle: f32,
         speed: f32,
-        charge_duration: u64,
-        swing_duration: u64,
+        charge_duration: f32,
+        swing_duration: f32,
         hit_timing: f32,
-        recover_duration: u64,
+        recover_duration: f32,
     },
     ChargedRanged {
-        energy_cost: u32,
-        energy_drain: u32,
-        initial_damage: u32,
-        scaled_damage: u32,
+        energy_cost: f32,
+        energy_drain: f32,
+        initial_damage: f32,
+        scaled_damage: f32,
         initial_knockback: f32,
         scaled_knockback: f32,
         speed: f32,
-        buildup_duration: u64,
-        charge_duration: u64,
-        recover_duration: u64,
+        buildup_duration: f32,
+        charge_duration: f32,
+        recover_duration: f32,
         projectile_body: Body,
         projectile_light: Option<LightEmitter>,
         projectile_gravity: Option<Gravity>,
@@ -198,45 +198,45 @@ pub enum CharacterAbility {
         move_speed: f32,
     },
     Shockwave {
-        energy_cost: u32,
-        buildup_duration: u64,
-        swing_duration: u64,
-        recover_duration: u64,
-        damage: u32,
-        poise_damage: u32,
+        energy_cost: f32,
+        buildup_duration: f32,
+        swing_duration: f32,
+        recover_duration: f32,
+        damage: f32,
+        poise_damage: f32,
         knockback: Knockback,
         shockwave_angle: f32,
         shockwave_vertical_angle: f32,
         shockwave_speed: f32,
-        shockwave_duration: u64,
+        shockwave_duration: f32,
         requires_ground: bool,
         move_efficiency: f32,
     },
     BasicBeam {
-        buildup_duration: u64,
-        recover_duration: u64,
-        beam_duration: u64,
-        base_hps: u32,
-        base_dps: u32,
+        buildup_duration: f32,
+        recover_duration: f32,
+        beam_duration: f32,
+        base_hps: f32,
+        base_dps: f32,
         tick_rate: f32,
         range: f32,
         max_angle: f32,
         lifesteal_eff: f32,
-        energy_regen: u32,
-        energy_cost: u32,
-        energy_drain: u32,
+        energy_regen: f32,
+        energy_cost: f32,
+        energy_drain: f32,
     },
 }
 
 impl Default for CharacterAbility {
     fn default() -> Self {
         CharacterAbility::BasicMelee {
-            energy_cost: 0,
-            buildup_duration: 250,
-            swing_duration: 250,
-            recover_duration: 500,
-            base_damage: 10,
-            base_poise_damage: 0,
+            energy_cost: 0.0,
+            buildup_duration: 0.25,
+            swing_duration: 0.25,
+            recover_duration: 0.5,
+            base_damage: 10.0,
+            base_poise_damage: 0.0,
             knockback: 0.0,
             range: 3.5,
             max_angle: 15.0,
@@ -313,10 +313,10 @@ impl CharacterAbility {
 
     pub fn default_roll() -> CharacterAbility {
         CharacterAbility::Roll {
-            energy_cost: 150,
-            buildup_duration: 50,
-            movement_duration: 280,
-            recover_duration: 125,
+            energy_cost: 0.15,
+            buildup_duration: 0.05,
+            movement_duration: 0.28,
+            recover_duration: 0.125,
             roll_strength: 1.8,
             immune_melee: false,
         }
@@ -333,11 +333,11 @@ impl CharacterAbility {
                 ref mut base_poise_damage,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
-                *base_damage = (*base_damage as f32 * power) as u32;
-                *base_poise_damage = (*base_poise_damage as f32 * poise_strength) as u32;
+                *buildup_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
+                *base_damage *= power;
+                *base_poise_damage *= poise_strength;
             },
             BasicRanged {
                 ref mut buildup_duration,
@@ -345,8 +345,8 @@ impl CharacterAbility {
                 ref mut projectile,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *buildup_duration /= speed;
+                *recover_duration /= speed;
                 *projectile = projectile.modified_projectile(power, 1_f32, 1_f32, power);
             },
             RepeaterRanged {
@@ -357,17 +357,17 @@ impl CharacterAbility {
                 ref mut projectile,
                 ..
             } => {
-                *movement_duration = (*movement_duration as f32 / speed) as u64;
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *shoot_duration = (*shoot_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *movement_duration /= speed;
+                *buildup_duration /= speed;
+                *shoot_duration /= speed;
+                *recover_duration /= speed;
                 *projectile = projectile.modified_projectile(power, 1_f32, 1_f32, power);
             },
             Boost {
                 ref mut movement_duration,
                 ..
             } => {
-                *movement_duration = (*movement_duration as f32 / speed) as u64;
+                *movement_duration /= speed;
             },
             DashMelee {
                 ref mut base_damage,
@@ -379,13 +379,13 @@ impl CharacterAbility {
                 ref mut recover_duration,
                 ..
             } => {
-                *base_damage = (*base_damage as f32 * power) as u32;
-                *scaled_damage = (*scaled_damage as f32 * power) as u32;
-                *base_poise_damage = (*base_damage as f32 * poise_strength) as u32;
-                *scaled_poise_damage = (*scaled_poise_damage as f32 * poise_strength) as u32;
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *base_damage *= power;
+                *scaled_damage *= power;
+                *base_poise_damage *= poise_strength;
+                *scaled_poise_damage *= poise_strength;
+                *buildup_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
             },
             BasicBlock => {},
             Roll {
@@ -394,9 +394,9 @@ impl CharacterAbility {
                 ref mut recover_duration,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *movement_duration = (*movement_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *buildup_duration /= speed;
+                *movement_duration /= speed;
+                *recover_duration /= speed;
             },
             ComboMelee {
                 ref mut stage_data, ..
@@ -414,11 +414,11 @@ impl CharacterAbility {
                 ref mut base_poise_damage,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
-                *base_damage = (*base_damage as f32 * power) as u32;
-                *base_poise_damage = (*base_poise_damage as f32 * poise_strength) as u32;
+                *buildup_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
+                *base_damage *= power;
+                *base_poise_damage *= poise_strength;
             },
             SpinMelee {
                 ref mut buildup_duration,
@@ -428,11 +428,11 @@ impl CharacterAbility {
                 ref mut base_poise_damage,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
-                *base_damage = (*base_damage as f32 * power) as u32;
-                *base_poise_damage = (*base_poise_damage as f32 * poise_strength) as u32;
+                *buildup_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
+                *base_damage *= power;
+                *base_poise_damage *= poise_strength;
             },
             ChargedMelee {
                 ref mut initial_damage,
@@ -445,14 +445,14 @@ impl CharacterAbility {
                 ref mut recover_duration,
                 ..
             } => {
-                *initial_damage = (*initial_damage as f32 * power) as u32;
-                *scaled_damage = (*scaled_damage as f32 * power) as u32;
-                *initial_poise_damage = (*initial_poise_damage as f32 * poise_strength) as u32;
-                *scaled_poise_damage = (*scaled_poise_damage as f32 * poise_strength) as u32;
+                *initial_damage *= power;
+                *scaled_damage *= power;
+                *initial_poise_damage *= poise_strength;
+                *scaled_poise_damage *= poise_strength;
                 *ability_speed *= speed;
-                *charge_duration = (*charge_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *charge_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
             },
             ChargedRanged {
                 ref mut initial_damage,
@@ -463,12 +463,12 @@ impl CharacterAbility {
                 ref mut recover_duration,
                 ..
             } => {
-                *initial_damage = (*initial_damage as f32 * power) as u32;
-                *scaled_damage = (*scaled_damage as f32 * power) as u32;
+                *initial_damage *= power;
+                *scaled_damage *= power;
                 *ability_speed *= speed;
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *charge_duration = (*charge_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *buildup_duration /= speed;
+                *charge_duration /= speed;
+                *recover_duration /= speed;
             },
             Shockwave {
                 ref mut buildup_duration,
@@ -478,11 +478,11 @@ impl CharacterAbility {
                 ref mut poise_damage,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *swing_duration = (*swing_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
-                *damage = (*damage as f32 * power) as u32;
-                *poise_damage = (*poise_damage as f32 * poise_strength) as u32;
+                *buildup_duration /= speed;
+                *swing_duration /= speed;
+                *recover_duration /= speed;
+                *damage *= power;
+                *poise_damage *= poise_strength;
             },
             BasicBeam {
                 ref mut buildup_duration,
@@ -492,11 +492,11 @@ impl CharacterAbility {
                 ref mut tick_rate,
                 ..
             } => {
-                *buildup_duration = (*buildup_duration as f32 / speed) as u64;
-                *recover_duration = (*recover_duration as f32 / speed) as u64;
+                *buildup_duration /= speed;
+                *recover_duration /= speed;
                 // hps and dps adjusted by speed as they are normalized by tick rate already
-                *base_hps = (*base_hps as f32 * power * speed) as u32;
-                *base_dps = (*base_dps as f32 * power * speed) as u32;
+                *base_hps *= power * speed;
+                *base_dps *= power * speed;
                 *tick_rate *= speed;
             },
         }
@@ -516,7 +516,7 @@ impl CharacterAbility {
             | ChargedMelee { energy_cost, .. }
             | ChargedRanged { energy_cost, .. }
             | Shockwave { energy_cost, .. }
-            | BasicBeam { energy_cost, .. } => *energy_cost,
+            | BasicBeam { energy_cost, .. } => *energy_cost as u32,
             BasicBlock | Boost { .. } | ComboMelee { .. } => 0,
         }
     }
@@ -561,10 +561,10 @@ impl CharacterAbility {
                             } else {
                                 0
                             };
-                        *max_energy_gain = (*max_energy_gain as f32
+                        *max_energy_gain = *max_energy_gain
                             * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32
-                            / ((Sword(TsRegen).max_level().unwrap() + 1) * stage_data.len() as u16
-                                - 1) as f32) as u32;
+                            / (Sword(TsRegen).max_level().unwrap() + 1) as f32
+                            * (stage_data.len() - 1) as f32;
                         *scales_from_combo = skillset
                             .skill_level(Sword(TsDamage))
                             .unwrap_or(None)
@@ -583,20 +583,16 @@ impl CharacterAbility {
                     } => {
                         *is_interruptible = skillset.has_skill(Sword(InterruptingAttacks));
                         if let Ok(Some(level)) = skillset.skill_level(Sword(DCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.75_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sword(DDrain)) {
-                            *energy_drain =
-                                (*energy_drain as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_drain *= 0.75_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sword(DDamage)) {
-                            *base_damage =
-                                (*base_damage as f32 * 1.2_f32.powi(level.into())) as u32;
+                            *base_damage *= 1.2_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sword(DScaling)) {
-                            *scaled_damage =
-                                (*scaled_damage as f32 * 1.2_f32.powi(level.into())) as u32;
+                            *scaled_damage *= 1.2_f32.powi(level.into());
                         }
                         if skillset.has_skill(Sword(DSpeed)) {
                             *forward_speed *= 1.3;
@@ -613,16 +609,13 @@ impl CharacterAbility {
                     } => {
                         *is_interruptible = skillset.has_skill(Sword(InterruptingAttacks));
                         if let Ok(Some(level)) = skillset.skill_level(Sword(SDamage)) {
-                            *base_damage =
-                                (*base_damage as f32 * 1.4_f32.powi(level.into())) as u32;
+                            *base_damage *= 1.4_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sword(SSpeed)) {
-                            *swing_duration =
-                                (*swing_duration as f32 * 0.8_f32.powi(level.into())) as u64;
+                            *swing_duration *= 0.8_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sword(SCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.75_f32.powi(level.into());
                         }
                         *num_spins = skillset
                             .skill_level(Sword(SSpins))
@@ -662,10 +655,10 @@ impl CharacterAbility {
                             } else {
                                 0
                             };
-                        *max_energy_gain = (*max_energy_gain as f32
+                        *max_energy_gain = *max_energy_gain
                             * ((energy_level + 1) * stage_data.len() as u16 - 1) as f32
-                            / ((Axe(DsRegen).max_level().unwrap() + 1) * stage_data.len() as u16
-                                - 1) as f32) as u32;
+                            / (Axe(DsRegen).max_level().unwrap() + 1) as f32
+                            * (stage_data.len() - 1) as f32;
                         *scales_from_combo = skillset
                             .skill_level(Axe(DsDamage))
                             .unwrap_or(None)
@@ -687,16 +680,13 @@ impl CharacterAbility {
                             spin_melee::MovementBehavior::ForwardGround
                         };
                         if let Ok(Some(level)) = skillset.skill_level(Axe(SDamage)) {
-                            *base_damage =
-                                (*base_damage as f32 * 1.3_f32.powi(level.into())) as u32;
+                            *base_damage *= 1.3_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Axe(SSpeed)) {
-                            *swing_duration =
-                                (*swing_duration as f32 * 0.8_f32.powi(level.into())) as u64;
+                            *swing_duration *= 0.8_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Axe(SCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.75_f32.powi(level.into());
                         }
                     },
                     LeapMelee {
@@ -708,15 +698,13 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Axe(LDamage)) {
-                            *base_damage =
-                                (*base_damage as f32 * 1.35_f32.powi(level.into())) as u32;
+                            *base_damage *= 1.35_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Axe(LKnockback)) {
                             *knockback *= 1.4_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Axe(LCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.75_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Axe(LDistance)) {
                             *forward_leap_strength *= 1.2_f32.powi(level.into());
@@ -741,7 +729,7 @@ impl CharacterAbility {
                             *stage_data = (*stage_data)
                                 .iter()
                                 .map(|s| s.modify_strike(1.5_f32.powi(level.into())))
-                                .collect::<Vec<combo_melee::Stage<u64>>>();
+                                .collect::<Vec<combo_melee::Stage<f32>>>();
                         }
                         let speed_segments = Hammer(SsSpeed).max_level().unwrap_or(1) as f32;
                         let speed_level = skillset
@@ -758,10 +746,10 @@ impl CharacterAbility {
                             } else {
                                 0
                             };
-                        *max_energy_gain = (*max_energy_gain as f32
+                        *max_energy_gain = *max_energy_gain
                             * ((energy_level + 1) * stage_data.len() as u16) as f32
                             / ((Hammer(SsRegen).max_level().unwrap() + 1) * stage_data.len() as u16)
-                                as f32) as u32;
+                                as f32;
                         *scales_from_combo = skillset
                             .skill_level(Hammer(SsDamage))
                             .unwrap_or(None)
@@ -776,15 +764,13 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(CDamage)) {
-                            *scaled_damage =
-                                (*scaled_damage as f32 * 1.25_f32.powi(level.into())) as u32;
+                            *scaled_damage *= 1.25_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(CKnockback)) {
                             *scaled_knockback *= 1.5_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(CDrain)) {
-                            *energy_drain =
-                                (*energy_drain as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_drain *= 0.75_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(CSpeed)) {
                             *speed *= 1.25_f32.powi(level.into());
@@ -800,15 +786,13 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(LDamage)) {
-                            *base_damage =
-                                (*base_damage as f32 * 1.4_f32.powi(level.into())) as u32;
+                            *base_damage *= 1.4_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(LKnockback)) {
                             *knockback *= 1.5_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(LCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.75_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.75_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Hammer(LDistance)) {
                             *forward_leap_strength *= 1.25_f32.powi(level.into());
@@ -858,8 +842,7 @@ impl CharacterAbility {
                             *initial_projectile_speed *= 1.3_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(CDamage)) {
-                            *scaled_damage =
-                                (*scaled_damage as f32 * 1.2_f32.powi(level.into())) as u32;
+                            *scaled_damage *= 1.2_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(CKnockback)) {
                             *scaled_knockback *= 1.25_f32.powi(level.into());
@@ -868,8 +851,7 @@ impl CharacterAbility {
                             *scaled_projectile_speed *= 1.2_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(CDrain)) {
-                            *energy_drain =
-                                (*energy_drain as f32 * 0.85_f32.powi(level.into())) as u32;
+                            *energy_drain *= 0.85_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(CSpeed)) {
                             *speed *= 1.10_f32.powi(level.into());
@@ -895,14 +877,13 @@ impl CharacterAbility {
                                 projectile.modified_projectile(power, 1_f32, 1_f32, 1_f32);
                         }
                         if !skillset.has_skill(Bow(RGlide)) {
-                            *buildup_duration = 1;
+                            *buildup_duration = 0.001;
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(RArrows)) {
                             *reps_remaining += level as u32;
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Bow(RCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.70_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.70_f32.powi(level.into());
                         }
                     },
                     _ => {},
@@ -942,22 +923,21 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Staff(FDamage)) {
-                            *base_dps = (*base_dps as f32 * 1.3_f32.powi(level.into())) as u32;
+                            *base_dps *= 1.3_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(FRange)) {
                             let range_mod = 1.25_f32.powi(level.into());
                             *range *= range_mod;
                             // Duration modified to keep velocity constant
-                            *beam_duration = (*beam_duration as f32 * range_mod) as u64;
+                            *beam_duration *= range_mod;
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(FDrain)) {
-                            *energy_drain =
-                                (*energy_drain as f32 * 0.8_f32.powi(level.into())) as u32;
+                            *energy_drain *= 0.8_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(FVelocity)) {
                             let velocity_increase = 1.25_f32.powi(level.into());
                             let duration_mod = 1.0 / (1.0 + velocity_increase);
-                            *beam_duration = (*beam_duration as f32 * duration_mod) as u64;
+                            *beam_duration *= duration_mod;
                         }
                     },
                     Shockwave {
@@ -968,18 +948,16 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Staff(SDamage)) {
-                            *damage = (*damage as f32 * 1.3_f32.powi(level.into())) as u32;
+                            *damage *= 1.3_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(SKnockback)) {
                             *knockback = knockback.modify_strength(1.3_f32.powi(level.into()));
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(SRange)) {
-                            *shockwave_duration =
-                                (*shockwave_duration as f32 * 1.2_f32.powi(level.into())) as u64;
+                            *shockwave_duration *= 1.2_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Staff(SCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.8_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.8_f32.powi(level.into());
                         }
                     },
                     _ => {},
@@ -999,27 +977,25 @@ impl CharacterAbility {
                         ..
                     } => {
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BHeal)) {
-                            *base_hps = (*base_hps as f32 * 1.15_f32.powi(level.into())) as u32;
+                            *base_hps *= 1.15_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BDamage)) {
-                            *base_dps = (*base_dps as f32 * 1.25_f32.powi(level.into())) as u32;
+                            *base_dps *= 1.25_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BRange)) {
                             let range_mod = 1.20_f32.powi(level.into());
                             *range *= range_mod;
                             // Duration modified to keep velocity constant
-                            *beam_duration = (*beam_duration as f32 * range_mod) as u64;
+                            *beam_duration *= range_mod;
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BLifesteal)) {
                             *lifesteal_eff *= 1.25_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BRegen)) {
-                            *energy_regen =
-                                (*energy_regen as f32 * 1.1_f32.powi(level.into())) as u32;
+                            *energy_regen *= 1.1_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(BCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.9_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.9_f32.powi(level.into());
                         }
                     },
                     BasicRanged {
@@ -1047,8 +1023,7 @@ impl CharacterAbility {
                             *projectile = projectile.modified_projectile(power, 1_f32, range, heal);
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(PCost)) {
-                            *energy_cost =
-                                (*energy_cost as f32 * 0.85_f32.powi(level.into())) as u32;
+                            *energy_cost *= 0.85_f32.powi(level.into());
                         }
                         if let Ok(Some(level)) = skillset.skill_level(Sceptre(PProjSpeed)) {
                             *projectile_speed *= 1.25_f32.powi(level.into());
@@ -1069,14 +1044,13 @@ impl CharacterAbility {
                 {
                     *immune_melee = skillset.has_skill(Skill::Roll(ImmuneMelee));
                     if let Ok(Some(level)) = skillset.skill_level(Skill::Roll(Cost)) {
-                        *energy_cost = (*energy_cost as f32 * 0.8_f32.powi(level.into())) as u32;
+                        *energy_cost *= 0.8_f32.powi(level.into());
                     }
                     if let Ok(Some(level)) = skillset.skill_level(Skill::Roll(Strength)) {
                         *roll_strength *= 1.2_f32.powi(level.into());
                     }
                     if let Ok(Some(level)) = skillset.skill_level(Skill::Roll(Duration)) {
-                        *movement_duration =
-                            (*movement_duration as f32 * 1.2_f32.powi(level.into())) as u64;
+                        *movement_duration *= 1.2_f32.powi(level.into());
                     }
                 }
             },
@@ -1101,9 +1075,9 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 energy_cost: _,
             } => CharacterState::BasicMelee(basic_melee::Data {
                 static_data: basic_melee::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     base_damage: *base_damage,
                     base_poise_damage: *base_poise_damage,
                     knockback: *knockback,
@@ -1127,8 +1101,8 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 energy_cost: _,
             } => CharacterState::BasicRanged(basic_ranged::Data {
                 static_data: basic_ranged::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     projectile: *projectile,
                     projectile_body: *projectile_body,
                     projectile_light: *projectile_light,
@@ -1147,7 +1121,7 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 only_up,
             } => CharacterState::Boost(boost::Data {
                 static_data: boost::StaticData {
-                    movement_duration: Duration::from_millis(*movement_duration),
+                    movement_duration: Duration::from_secs_f32(*movement_duration),
                     only_up: *only_up,
                 },
                 timer: Duration::default(),
@@ -1183,10 +1157,10 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                     energy_drain: *energy_drain,
                     forward_speed: *forward_speed,
                     infinite_charge: *infinite_charge,
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    charge_duration: Duration::from_millis(*charge_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    charge_duration: Duration::from_secs_f32(*charge_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     is_interruptible: *is_interruptible,
                     ability_key: key,
                 },
@@ -1206,9 +1180,9 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 immune_melee,
             } => CharacterState::Roll(roll::Data {
                 static_data: roll::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    movement_duration: Duration::from_millis(*movement_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    movement_duration: Duration::from_secs_f32(*movement_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     roll_strength: *roll_strength,
                     immune_melee: *immune_melee,
                 },
@@ -1261,10 +1235,10 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 vertical_leap_strength,
             } => CharacterState::LeapMelee(leap_melee::Data {
                 static_data: leap_melee::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    movement_duration: Duration::from_millis(*movement_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    movement_duration: Duration::from_secs_f32(*movement_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     base_damage: *base_damage,
                     base_poise_damage: *base_poise_damage,
                     knockback: *knockback,
@@ -1294,9 +1268,9 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 num_spins,
             } => CharacterState::SpinMelee(spin_melee::Data {
                 static_data: spin_melee::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     base_damage: *base_damage,
                     base_poise_damage: *base_poise_damage,
                     knockback: *knockback,
@@ -1343,10 +1317,10 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                     speed: *speed,
                     range: *range,
                     max_angle: *max_angle,
-                    charge_duration: Duration::from_millis(*charge_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
+                    charge_duration: Duration::from_secs_f32(*charge_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
                     hit_timing: *hit_timing,
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     ability_key: key,
                 },
                 stage_section: StageSection::Charge,
@@ -1373,9 +1347,9 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 move_speed,
             } => CharacterState::ChargedRanged(charged_ranged::Data {
                 static_data: charged_ranged::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    charge_duration: Duration::from_millis(*charge_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    charge_duration: Duration::from_secs_f32(*charge_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     energy_drain: *energy_drain,
                     initial_damage: *initial_damage,
                     scaled_damage: *scaled_damage,
@@ -1409,10 +1383,10 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 reps_remaining,
             } => CharacterState::RepeaterRanged(repeater_ranged::Data {
                 static_data: repeater_ranged::StaticData {
-                    movement_duration: Duration::from_millis(*movement_duration),
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    shoot_duration: Duration::from_millis(*shoot_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    movement_duration: Duration::from_secs_f32(*movement_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    shoot_duration: Duration::from_secs_f32(*shoot_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     leap: *leap,
                     projectile: *projectile,
                     projectile_body: *projectile_body,
@@ -1441,16 +1415,16 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 move_efficiency,
             } => CharacterState::Shockwave(shockwave::Data {
                 static_data: shockwave::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    swing_duration: Duration::from_millis(*swing_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    swing_duration: Duration::from_secs_f32(*swing_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
                     damage: *damage,
                     poise_damage: *poise_damage,
                     knockback: *knockback,
                     shockwave_angle: *shockwave_angle,
                     shockwave_vertical_angle: *shockwave_vertical_angle,
                     shockwave_speed: *shockwave_speed,
-                    shockwave_duration: Duration::from_millis(*shockwave_duration),
+                    shockwave_duration: Duration::from_secs_f32(*shockwave_duration),
                     requires_ground: *requires_ground,
                     move_efficiency: *move_efficiency,
                     ability_key: key,
@@ -1473,9 +1447,9 @@ impl From<(&CharacterAbility, AbilityKey)> for CharacterState {
                 energy_drain,
             } => CharacterState::BasicBeam(basic_beam::Data {
                 static_data: basic_beam::StaticData {
-                    buildup_duration: Duration::from_millis(*buildup_duration),
-                    recover_duration: Duration::from_millis(*recover_duration),
-                    beam_duration: Duration::from_millis(*beam_duration),
+                    buildup_duration: Duration::from_secs_f32(*buildup_duration),
+                    recover_duration: Duration::from_secs_f32(*recover_duration),
+                    beam_duration: Duration::from_secs_f32(*beam_duration),
                     base_hps: *base_hps,
                     base_dps: *base_dps,
                     tick_rate: *tick_rate,
diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs
index 3ba9d8f3ae..5cfd6d72ac 100644
--- a/common/src/comp/body.rs
+++ b/common/src/comp/body.rs
@@ -535,82 +535,82 @@ impl Body {
     }
 
     #[allow(unreachable_patterns)]
-    pub fn base_dmg(&self) -> u32 {
+    pub fn base_dmg(&self) -> f32 {
         match self {
-            Body::Humanoid(_) => 50,
+            Body::Humanoid(_) => 50.0,
             Body::QuadrupedSmall(quadruped_small) => match quadruped_small.species {
-                quadruped_small::Species::Dodarock => 30,
-                quadruped_small::Species::Hyena => 40,
-                quadruped_small::Species::Holladon => 40,
-                quadruped_small::Species::Porcupine => 30,
-                _ => 20,
+                quadruped_small::Species::Dodarock => 30.0,
+                quadruped_small::Species::Hyena => 40.0,
+                quadruped_small::Species::Holladon => 40.0,
+                quadruped_small::Species::Porcupine => 30.0,
+                _ => 20.0,
             },
             Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species {
-                quadruped_medium::Species::Grolgar => 50,
-                quadruped_medium::Species::Lion => 60,
-                quadruped_medium::Species::Tarasque => 70,
-                quadruped_medium::Species::Mouflon => 30,
-                quadruped_medium::Species::Catoblepas => 20,
-                quadruped_medium::Species::Bonerattler => 50,
-                quadruped_medium::Species::Deer => 30,
-                quadruped_medium::Species::Hirdrasil => 50,
-                quadruped_medium::Species::Roshwalr => 60,
-                quadruped_medium::Species::Donkey => 40,
-                quadruped_medium::Species::Camel => 40,
-                quadruped_medium::Species::Zebra => 40,
-                quadruped_medium::Species::Antelope => 6,
-                quadruped_medium::Species::Kelpie => 60,
-                quadruped_medium::Species::Horse => 50,
-                _ => 40,
+                quadruped_medium::Species::Grolgar => 50.0,
+                quadruped_medium::Species::Lion => 60.0,
+                quadruped_medium::Species::Tarasque => 70.0,
+                quadruped_medium::Species::Mouflon => 30.0,
+                quadruped_medium::Species::Catoblepas => 20.0,
+                quadruped_medium::Species::Bonerattler => 50.0,
+                quadruped_medium::Species::Deer => 30.0,
+                quadruped_medium::Species::Hirdrasil => 50.0,
+                quadruped_medium::Species::Roshwalr => 60.0,
+                quadruped_medium::Species::Donkey => 40.0,
+                quadruped_medium::Species::Camel => 40.0,
+                quadruped_medium::Species::Zebra => 40.0,
+                quadruped_medium::Species::Antelope => 6.0,
+                quadruped_medium::Species::Kelpie => 60.0,
+                quadruped_medium::Species::Horse => 50.0,
+                _ => 40.0,
             },
             Body::BirdMedium(bird_medium) => match bird_medium.species {
-                bird_medium::Species::Chicken => 10,
-                bird_medium::Species::Duck => 10,
-                bird_medium::Species::Goose => 10,
-                bird_medium::Species::Parrot => 20,
-                bird_medium::Species::Peacock => 40,
-                bird_medium::Species::Cockatrice => 60,
-                bird_medium::Species::Eagle => 60,
-                _ => 30,
+                bird_medium::Species::Chicken => 10.0,
+                bird_medium::Species::Duck => 10.0,
+                bird_medium::Species::Goose => 10.0,
+                bird_medium::Species::Parrot => 20.0,
+                bird_medium::Species::Peacock => 40.0,
+                bird_medium::Species::Cockatrice => 60.0,
+                bird_medium::Species::Eagle => 60.0,
+                _ => 30.0,
             },
-            Body::FishMedium(_) => 10,
-            Body::Dragon(_) => 5000,
-            Body::BirdSmall(_) => 10,
-            Body::FishSmall(_) => 10,
+            Body::FishMedium(_) => 10.0,
+            Body::Dragon(_) => 5000.0,
+            Body::BirdSmall(_) => 10.0,
+            Body::FishSmall(_) => 10.0,
             Body::BipedLarge(biped_large) => match biped_large.species {
-                biped_large::Species::Ogre => 60,
-                biped_large::Species::Cyclops => 60,
-                biped_large::Species::Wendigo => 60,
-                biped_large::Species::Troll => 60,
-                biped_large::Species::Dullahan => 80,
-                biped_large::Species::Mindflayer => 200,
-                _ => 60,
+                biped_large::Species::Ogre => 60.0,
+                biped_large::Species::Cyclops => 60.0,
+                biped_large::Species::Wendigo => 60.0,
+                biped_large::Species::Troll => 60.0,
+                biped_large::Species::Dullahan => 80.0,
+                biped_large::Species::Mindflayer => 200.0,
+                _ => 60.0,
             },
-            Body::Object(_) => 0,
-            Body::Golem(_) => 250,
+            Body::Object(_) => 0.0,
+            Body::Golem(_) => 250.0,
             Body::Theropod(theropod) => match theropod.species {
-                theropod::Species::Archaeos => 150,
-                theropod::Species::Odonto => 130,
-                _ => 70,
+                theropod::Species::Archaeos => 150.0,
+                theropod::Species::Odonto => 130.0,
+                _ => 70.0,
             },
             Body::QuadrupedLow(quadruped_low) => match quadruped_low.species {
-                quadruped_low::Species::Crocodile => 50,
-                quadruped_low::Species::Alligator => 50,
-                quadruped_low::Species::Salamander => 50,
-                quadruped_low::Species::Monitor => 30,
-                quadruped_low::Species::Asp => 35,
-                quadruped_low::Species::Tortoise => 10,
-                quadruped_low::Species::Rocksnapper => 80,
-                quadruped_low::Species::Pangolin => 10,
-                quadruped_low::Species::Maneater => 40,
-                quadruped_low::Species::Sandshark => 60,
-                quadruped_low::Species::Hakulaq => 40,
-                _ => 20,
+                quadruped_low::Species::Crocodile => 50.0,
+                quadruped_low::Species::Alligator => 50.0,
+                quadruped_low::Species::Salamander => 50.0,
+                quadruped_low::Species::Monitor => 30.0,
+                quadruped_low::Species::Asp => 35.0,
+                quadruped_low::Species::Tortoise => 10.0,
+                quadruped_low::Species::Rocksnapper => 80.0,
+                quadruped_low::Species::Pangolin => 10.0,
+                quadruped_low::Species::Maneater => 40.0,
+                quadruped_low::Species::Sandshark => 60.0,
+                quadruped_low::Species::Hakulaq => 40.0,
+                _ => 20.0,
             },
         }
     }
 
-    pub fn base_poise_dmg(&self) -> u32 { 0 }
+    pub fn base_poise_dmg(&self) -> f32 { 0.0 }
 
     pub fn base_range(&self) -> f32 {
         match self {
diff --git a/common/src/comp/inventory/item/mod.rs b/common/src/comp/inventory/item/mod.rs
index 1db48c8b6c..e294f944e4 100644
--- a/common/src/comp/inventory/item/mod.rs
+++ b/common/src/comp/inventory/item/mod.rs
@@ -347,10 +347,10 @@ impl Item {
             quality: empty_def.quality,
             item_config: Some(ItemConfig {
                 ability1: Some(CharacterAbility::BasicMelee {
-                    energy_cost: 10,
-                    buildup_duration: 500,
-                    swing_duration: 100,
-                    recover_duration: 100,
+                    energy_cost: 0.010,
+                    buildup_duration: 0.5,
+                    swing_duration: 0.1,
+                    recover_duration: 0.1,
                     base_damage: body.base_dmg(),
                     base_poise_damage: body.base_poise_dmg(),
                     knockback: 0.0,
diff --git a/common/src/comp/projectile.rs b/common/src/comp/projectile.rs
index ac80d554ff..cd7a6ad56d 100644
--- a/common/src/comp/projectile.rs
+++ b/common/src/comp/projectile.rs
@@ -42,16 +42,16 @@ pub enum ProjectileConstructor {
     Arrow {
         damage: f32,
         knockback: f32,
-        energy_regen: u32,
+        energy_regen: f32,
     },
     Fireball {
         damage: f32,
         radius: f32,
-        energy_regen: u32,
+        energy_regen: f32,
     },
     Firebolt {
         damage: f32,
-        energy_regen: u32,
+        energy_regen: f32,
     },
     Heal {
         heal: f32,
@@ -207,7 +207,7 @@ impl ProjectileConstructor {
                 ..
             } => {
                 *damage *= power;
-                *energy_regen = (*energy_regen as f32 * regen) as u32;
+                *energy_regen *= regen;
             },
             Fireball {
                 ref mut damage,
@@ -216,7 +216,7 @@ impl ProjectileConstructor {
                 ..
             } => {
                 *damage *= power;
-                *energy_regen = (*energy_regen as f32 * regen) as u32;
+                *energy_regen *= regen;
                 *radius *= range;
             },
             Firebolt {
@@ -225,7 +225,7 @@ impl ProjectileConstructor {
                 ..
             } => {
                 *damage *= power;
-                *energy_regen = (*energy_regen as f32 * regen) as u32;
+                *energy_regen *= regen;
             },
             Heal {
                 ref mut damage,
@@ -251,7 +251,7 @@ impl ProjectileConstructor {
         {
             ProjectileConstructor::Firebolt {
                 damage,
-                energy_regen: energy_regen * 2,
+                energy_regen: energy_regen * 2.0,
             }
         } else {
             self
diff --git a/common/src/states/basic_beam.rs b/common/src/states/basic_beam.rs
index f5b127fed7..2ee6ae5eb8 100644
--- a/common/src/states/basic_beam.rs
+++ b/common/src/states/basic_beam.rs
@@ -25,9 +25,9 @@ pub struct StaticData {
     /// How long each beam segment persists for
     pub beam_duration: Duration,
     /// Base healing per second
-    pub base_hps: u32,
+    pub base_hps: f32,
     /// Base damage per second
-    pub base_dps: u32,
+    pub base_dps: f32,
     /// Ticks of damage/healing per second
     pub tick_rate: f32,
     /// Max range
@@ -38,11 +38,11 @@ pub struct StaticData {
     /// 100% conversion of damage to health)
     pub lifesteal_eff: f32,
     /// Energy regened per second for damage ticks
-    pub energy_regen: u32,
+    pub energy_regen: f32,
     /// Energy consumed per second for heal ticks
-    pub energy_cost: u32,
+    pub energy_cost: f32,
     /// Energy drained per
-    pub energy_drain: u32,
+    pub energy_drain: f32,
     /// What key is used to press ability
     pub ability_key: AbilityKey,
 }
@@ -120,7 +120,8 @@ impl CharacterBehavior for Data {
             },
             StageSection::Cast => {
                 if ability_key_is_pressed(data, self.static_data.ability_key)
-                    && (self.static_data.energy_drain == 0 || update.energy.current() > 0)
+                    && (self.static_data.energy_drain <= f32::EPSILON
+                        || update.energy.current() > 0)
                 {
                     let speed =
                         self.static_data.range / self.static_data.beam_duration.as_secs_f32();
diff --git a/common/src/states/basic_melee.rs b/common/src/states/basic_melee.rs
index 38c7a0972f..fa645229c2 100644
--- a/common/src/states/basic_melee.rs
+++ b/common/src/states/basic_melee.rs
@@ -20,9 +20,9 @@ pub struct StaticData {
     /// How long the state has until exiting
     pub recover_duration: Duration,
     /// Base damage
-    pub base_damage: u32,
+    pub base_damage: f32,
     /// Base poise reduction
-    pub base_poise_damage: u32,
+    pub base_poise_damage: f32,
     /// Knockback
     pub knockback: f32,
     /// Max range
@@ -103,7 +103,7 @@ impl CharacterBehavior for Data {
                         }),
                     )
                     .with_requirement(CombatRequirement::AnyDamage);
-                    let energy = AttackEffect::new(None, CombatEffect::EnergyReward(50))
+                    let energy = AttackEffect::new(None, CombatEffect::EnergyReward(50.0))
                         .with_requirement(CombatRequirement::AnyDamage);
                     let buff = CombatEffect::Buff(CombatBuff::default_physical());
                     let damage = AttackDamage::new(
diff --git a/common/src/states/charged_melee.rs b/common/src/states/charged_melee.rs
index 8ebc6749d6..ed1e752c75 100644
--- a/common/src/states/charged_melee.rs
+++ b/common/src/states/charged_melee.rs
@@ -14,17 +14,17 @@ use std::time::Duration;
 /// Separated out to condense update portions of character state
 pub struct StaticData {
     /// How much energy is drained per second when charging
-    pub energy_drain: u32,
+    pub energy_drain: f32,
     /// Energy cost per attack
-    pub energy_cost: u32,
+    pub energy_cost: f32,
     /// How much damage is dealt with no charge
-    pub initial_damage: u32,
+    pub initial_damage: f32,
     /// How much the damage is scaled by
-    pub scaled_damage: u32,
+    pub scaled_damage: f32,
     /// How much poise damage is dealt with no charge
-    pub initial_poise_damage: u32,
+    pub initial_poise_damage: f32,
     /// How much poise damage is scaled by
-    pub scaled_poise_damage: u32,
+    pub scaled_poise_damage: f32,
     /// How much knockback there is with no charge
     pub initial_knockback: f32,
     /// How much the knockback is scaled by
@@ -81,7 +81,7 @@ impl CharacterBehavior for Data {
         match self.stage_section {
             StageSection::Charge => {
                 if ability_key_is_pressed(data, self.static_data.ability_key)
-                    && update.energy.current() >= self.static_data.energy_cost
+                    && update.energy.current() as f32 >= self.static_data.energy_cost
                     && self.timer < self.static_data.charge_duration
                 {
                     let charge = (self.timer.as_secs_f32()
@@ -108,7 +108,7 @@ impl CharacterBehavior for Data {
                         source: EnergySource::Ability,
                     });
                 } else if ability_key_is_pressed(data, self.static_data.ability_key)
-                    && update.energy.current() >= self.static_data.energy_cost
+                    && update.energy.current() as f32 >= self.static_data.energy_cost
                 {
                     // Maintains charge
                     update.character = CharacterState::ChargedMelee(Data {
diff --git a/common/src/states/charged_ranged.rs b/common/src/states/charged_ranged.rs
index 9e6e16995b..eb96d2907f 100644
--- a/common/src/states/charged_ranged.rs
+++ b/common/src/states/charged_ranged.rs
@@ -26,11 +26,11 @@ pub struct StaticData {
     /// How long the state has until exiting
     pub recover_duration: Duration,
     /// How much energy is drained per second when charging
-    pub energy_drain: u32,
+    pub energy_drain: f32,
     /// How much damage is dealt with no charge
-    pub initial_damage: u32,
+    pub initial_damage: f32,
     /// How much the damage scales as it is charged
-    pub scaled_damage: u32,
+    pub scaled_damage: f32,
     /// How much knockback there is with no charge
     pub initial_knockback: f32,
     /// How much the knockback scales as it is charged
diff --git a/common/src/states/combo_melee.rs b/common/src/states/combo_melee.rs
index caffd8d35a..7c5d88c45a 100644
--- a/common/src/states/combo_melee.rs
+++ b/common/src/states/combo_melee.rs
@@ -15,13 +15,13 @@ pub struct Stage<T> {
     /// Specifies which stage the combo attack is in
     pub stage: u32,
     /// Initial damage of stage
-    pub base_damage: u32,
+    pub base_damage: f32,
     /// Damage scaling per combo
-    pub damage_increase: u32,
+    pub damage_increase: f32,
     /// Initial poise damage of stage
-    pub base_poise_damage: u32,
+    pub base_poise_damage: f32,
     /// Poise damage scaling per combo
-    pub poise_damage_increase: u32,
+    pub poise_damage_increase: f32,
     /// Knockback of stage
     pub knockback: f32,
     /// Range of attack
@@ -39,7 +39,7 @@ pub struct Stage<T> {
     pub forward_movement: f32,
 }
 
-impl Stage<u64> {
+impl Stage<f32> {
     pub fn to_duration(self) -> Stage<Duration> {
         Stage::<Duration> {
             stage: self.stage,
@@ -50,21 +50,21 @@ impl Stage<u64> {
             knockback: self.knockback,
             range: self.range,
             angle: self.angle,
-            base_buildup_duration: Duration::from_millis(self.base_buildup_duration),
-            base_swing_duration: Duration::from_millis(self.base_swing_duration),
-            base_recover_duration: Duration::from_millis(self.base_recover_duration),
+            base_buildup_duration: Duration::from_secs_f32(self.base_buildup_duration),
+            base_swing_duration: Duration::from_secs_f32(self.base_swing_duration),
+            base_recover_duration: Duration::from_secs_f32(self.base_recover_duration),
             forward_movement: self.forward_movement,
         }
     }
 
     pub fn adjusted_by_stats(mut self, power: f32, poise_strength: f32, speed: f32) -> Self {
-        self.base_damage = (self.base_damage as f32 * power) as u32;
-        self.damage_increase = (self.damage_increase as f32 * power) as u32;
-        self.base_poise_damage = (self.base_poise_damage as f32 * poise_strength) as u32;
-        self.poise_damage_increase = (self.poise_damage_increase as f32 * poise_strength) as u32;
-        self.base_buildup_duration = (self.base_buildup_duration as f32 / speed) as u64;
-        self.base_swing_duration = (self.base_swing_duration as f32 / speed) as u64;
-        self.base_recover_duration = (self.base_recover_duration as f32 / speed) as u64;
+        self.base_damage *= power;
+        self.damage_increase *= power;
+        self.base_poise_damage *= poise_strength;
+        self.poise_damage_increase *= poise_strength;
+        self.base_buildup_duration /= speed;
+        self.base_swing_duration /= speed;
+        self.base_recover_duration /= speed;
         self
     }
 
@@ -82,11 +82,11 @@ pub struct StaticData {
     /// Data for each stage
     pub stage_data: Vec<Stage<Duration>>,
     /// Initial energy gain per strike
-    pub initial_energy_gain: u32,
+    pub initial_energy_gain: f32,
     /// Max energy gain per strike
-    pub max_energy_gain: u32,
+    pub max_energy_gain: f32,
     /// Energy gain increase per combo
-    pub energy_increase: u32,
+    pub energy_increase: f32,
     /// (100% - speed_increase) is percentage speed increases from current to
     /// max per combo increase
     pub speed_increase: f32,
@@ -167,20 +167,23 @@ impl CharacterBehavior for Data {
 
                     // Hit attempt
                     let damage = self.static_data.stage_data[stage_index].base_damage
-                        + self
+                        + (self
                             .static_data
                             .scales_from_combo
                             .min(self.combo / self.static_data.num_stages)
+                            as f32)
                             * self.static_data.stage_data[stage_index].damage_increase;
+
                     let poise = self.static_data.stage_data[stage_index].base_poise_damage
-                        + self
+                        + (self
                             .static_data
                             .scales_from_combo
                             .min(self.combo / self.static_data.num_stages)
+                            as f32)
                             * self.static_data.stage_data[stage_index].poise_damage_increase;
                     let poise = AttackEffect::new(
                         Some(GroupTarget::OutOfGroup),
-                        CombatEffect::Poise(poise as f32),
+                        CombatEffect::Poise(poise),
                     )
                     .with_requirement(CombatRequirement::AnyDamage);
                     let knockback = AttackEffect::new(
@@ -193,7 +196,7 @@ impl CharacterBehavior for Data {
                     .with_requirement(CombatRequirement::AnyDamage);
                     let energy = self.static_data.max_energy_gain.min(
                         self.static_data.initial_energy_gain
-                            + self.combo * self.static_data.energy_increase,
+                            + self.combo as f32 * self.static_data.energy_increase,
                     );
                     let energy = AttackEffect::new(None, CombatEffect::EnergyReward(energy))
                         .with_requirement(CombatRequirement::AnyDamage);
diff --git a/common/src/states/dash_melee.rs b/common/src/states/dash_melee.rs
index c7875efe91..0f8bce5273 100644
--- a/common/src/states/dash_melee.rs
+++ b/common/src/states/dash_melee.rs
@@ -15,13 +15,13 @@ use vek::Vec3;
 #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
 pub struct StaticData {
     /// How much damage the attack initially does
-    pub base_damage: u32,
+    pub base_damage: f32,
     /// How much the attack scales in damage
-    pub scaled_damage: u32,
+    pub scaled_damage: f32,
     /// Initial poise damage
-    pub base_poise_damage: u32,
+    pub base_poise_damage: f32,
     /// How much the attac scales in poise damage
-    pub scaled_poise_damage: u32,
+    pub scaled_poise_damage: f32,
     /// How much the attack knocks the target back initially
     pub base_knockback: f32,
     /// How much the attack scales in knockback
@@ -31,7 +31,7 @@ pub struct StaticData {
     /// Angle of the attack
     pub angle: f32,
     /// Rate of energy drain
-    pub energy_drain: u32,
+    pub energy_drain: f32,
     /// How quickly dasher moves forward
     pub forward_speed: f32,
     /// Whether state keeps charging after reaching max charge duration
diff --git a/common/src/states/leap_melee.rs b/common/src/states/leap_melee.rs
index 7c970282dd..76779906df 100644
--- a/common/src/states/leap_melee.rs
+++ b/common/src/states/leap_melee.rs
@@ -22,9 +22,9 @@ pub struct StaticData {
     /// How long the state has until exiting
     pub recover_duration: Duration,
     /// Base damage
-    pub base_damage: u32,
+    pub base_damage: f32,
     /// Base poise damage
-    pub base_poise_damage: u32,
+    pub base_poise_damage: f32,
     /// Knockback
     pub knockback: f32,
     /// Max range
diff --git a/common/src/states/shockwave.rs b/common/src/states/shockwave.rs
index cb73d6aafa..b77c2e283a 100644
--- a/common/src/states/shockwave.rs
+++ b/common/src/states/shockwave.rs
@@ -23,9 +23,9 @@ pub struct StaticData {
     /// How long the state has until exiting
     pub recover_duration: Duration,
     /// Base damage
-    pub damage: u32,
+    pub damage: f32,
     /// Base poise damage
-    pub poise_damage: u32,
+    pub poise_damage: f32,
     /// Knockback
     pub knockback: Knockback,
     /// Angle of the shockwave
diff --git a/common/src/states/spin_melee.rs b/common/src/states/spin_melee.rs
index 75ad25649c..42f0822afa 100644
--- a/common/src/states/spin_melee.rs
+++ b/common/src/states/spin_melee.rs
@@ -22,15 +22,15 @@ pub struct StaticData {
     /// How long until state ends
     pub recover_duration: Duration,
     /// Base damage
-    pub base_damage: u32,
+    pub base_damage: f32,
     /// Base poise damage
-    pub base_poise_damage: u32,
+    pub base_poise_damage: f32,
     /// Knockback
     pub knockback: f32,
     /// Range
     pub range: f32,
     /// Energy cost per attack
-    pub energy_cost: u32,
+    pub energy_cost: f32,
     /// Whether spin state is infinite
     pub is_infinite: bool,
     /// Used to dictate how movement functions in this state
@@ -173,7 +173,7 @@ impl CharacterBehavior for Data {
                             .unwrap_or_default(),
                         ..*self
                     });
-                } else if update.energy.current() >= self.static_data.energy_cost
+                } else if update.energy.current() as f32 >= self.static_data.energy_cost
                     && (self.spins_remaining != 0
                         || (self.static_data.is_infinite
                             && ability_key_is_pressed(data, self.static_data.ability_key)))
diff --git a/voxygen/src/audio/sfx/event_mapper/combat/tests.rs b/voxygen/src/audio/sfx/event_mapper/combat/tests.rs
index c78f85ea96..45a6e47c1c 100644
--- a/voxygen/src/audio/sfx/event_mapper/combat/tests.rs
+++ b/voxygen/src/audio/sfx/event_mapper/combat/tests.rs
@@ -73,8 +73,8 @@ fn maps_basic_melee() {
                 buildup_duration: Duration::default(),
                 swing_duration: Duration::default(),
                 recover_duration: Duration::default(),
-                base_damage: 10,
-                base_poise_damage: 10,
+                base_damage: 10.0,
+                base_poise_damage: 10.0,
                 knockback: 0.0,
                 range: 1.0,
                 max_angle: 1.0,
@@ -113,10 +113,10 @@ fn matches_ability_stage() {
                 num_stages: 1,
                 stage_data: vec![states::combo_melee::Stage {
                     stage: 1,
-                    base_damage: 100,
-                    base_poise_damage: 100,
-                    damage_increase: 10,
-                    poise_damage_increase: 10,
+                    base_damage: 100.0,
+                    base_poise_damage: 100.0,
+                    damage_increase: 10.0,
+                    poise_damage_increase: 10.0,
                     knockback: 10.0,
                     range: 4.0,
                     angle: 30.0,
@@ -125,9 +125,9 @@ fn matches_ability_stage() {
                     base_recover_duration: Duration::from_millis(400),
                     forward_movement: 0.5,
                 }],
-                initial_energy_gain: 0,
-                max_energy_gain: 100,
-                energy_increase: 20,
+                initial_energy_gain: 0.0,
+                max_energy_gain: 100.0,
+                energy_increase: 20.0,
                 speed_increase: 0.05,
                 max_speed_increase: 0.8,
                 scales_from_combo: 2,
@@ -172,10 +172,10 @@ fn ignores_different_ability_stage() {
                 num_stages: 1,
                 stage_data: vec![states::combo_melee::Stage {
                     stage: 1,
-                    base_damage: 100,
-                    base_poise_damage: 100,
-                    damage_increase: 10,
-                    poise_damage_increase: 10,
+                    base_damage: 100.0,
+                    base_poise_damage: 100.0,
+                    damage_increase: 100.0,
+                    poise_damage_increase: 10.0,
                     knockback: 10.0,
                     range: 4.0,
                     angle: 30.0,
@@ -184,9 +184,9 @@ fn ignores_different_ability_stage() {
                     base_recover_duration: Duration::from_millis(400),
                     forward_movement: 0.5,
                 }],
-                initial_energy_gain: 0,
-                max_energy_gain: 100,
-                energy_increase: 20,
+                initial_energy_gain: 0.0,
+                max_energy_gain: 100.0,
+                energy_increase: 20.0,
                 speed_increase: 0.05,
                 max_speed_increase: 0.8,
                 scales_from_combo: 2,
diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs
index b9b4b8cf21..09ccd98023 100644
--- a/voxygen/src/scene/particle.rs
+++ b/voxygen/src/scene/particle.rs
@@ -377,7 +377,7 @@ impl ParticleMgr {
             if let CharacterState::BasicBeam(b) = character_state {
                 let particle_ori = b.particle_ori.unwrap_or(*ori.vec());
                 if b.stage_section == StageSection::Cast {
-                    if b.static_data.base_hps > 0 {
+                    if b.static_data.base_hps > 0.0 {
                         // Emit a light when using healing
                         lights.push(Light::new(pos.0 + b.offset, Rgb::new(0.1, 1.0, 0.15), 1.0));
                         for i in 0..self.scheduler.heartbeats(Duration::from_millis(1)) {