screeps_utils/math/
tower.rs1use screeps::constants::*;
2
3pub fn tower_attack_power_at_range(mut range: u8) -> u32 {
8 let mut amount = TOWER_POWER_ATTACK as f64;
9 if range > TOWER_FALLOFF_RANGE {
10 range = TOWER_FALLOFF_RANGE;
11 }
12 amount -= amount * TOWER_FALLOFF * range.saturating_sub(TOWER_OPTIMAL_RANGE) as f64
13 / (TOWER_FALLOFF_RANGE - TOWER_OPTIMAL_RANGE) as f64;
14 amount as u32
15}
16
17pub fn tower_heal_power_at_range(mut range: u8) -> u32 {
22 let mut amount = TOWER_POWER_HEAL as f64;
23 if range > TOWER_FALLOFF_RANGE {
24 range = TOWER_FALLOFF_RANGE;
25 }
26 amount -= amount * TOWER_FALLOFF * range.saturating_sub(TOWER_OPTIMAL_RANGE) as f64
27 / (TOWER_FALLOFF_RANGE - TOWER_OPTIMAL_RANGE) as f64;
28 amount as u32
29}
30
31pub fn tower_repair_power_at_range(mut range: u8) -> u32 {
36 let mut amount = TOWER_POWER_REPAIR as f64;
37 if range > TOWER_FALLOFF_RANGE {
38 range = TOWER_FALLOFF_RANGE;
39 }
40 amount -= amount * TOWER_FALLOFF * range.saturating_sub(TOWER_OPTIMAL_RANGE) as f64
41 / (TOWER_FALLOFF_RANGE - TOWER_OPTIMAL_RANGE) as f64;
42 amount as u32
43}
44
45#[cfg(test)]
46mod test {
47 use super::*;
48
49 #[test]
50 fn tower_attack_power_formula() {
51 assert_eq!(
53 tower_attack_power_at_range(TOWER_OPTIMAL_RANGE),
54 TOWER_POWER_ATTACK
55 );
56 assert_eq!(
58 tower_attack_power_at_range(TOWER_FALLOFF_RANGE),
59 (TOWER_POWER_ATTACK as f64 * (1. - TOWER_FALLOFF)) as u32
60 );
61 assert_eq!(tower_attack_power_at_range(5), 600);
63 assert_eq!(tower_attack_power_at_range(6), 570);
64 assert_eq!(tower_attack_power_at_range(7), 540);
65 assert_eq!(tower_attack_power_at_range(8), 510);
66 assert_eq!(tower_attack_power_at_range(9), 480);
67 assert_eq!(tower_attack_power_at_range(10), 450);
68 assert_eq!(tower_attack_power_at_range(11), 420);
69 assert_eq!(tower_attack_power_at_range(12), 390);
70 assert_eq!(tower_attack_power_at_range(13), 360);
71 assert_eq!(tower_attack_power_at_range(14), 330);
72 assert_eq!(tower_attack_power_at_range(15), 300);
73 assert_eq!(tower_attack_power_at_range(16), 270);
74 assert_eq!(tower_attack_power_at_range(17), 240);
75 assert_eq!(tower_attack_power_at_range(18), 210);
76 assert_eq!(tower_attack_power_at_range(19), 180);
77 assert_eq!(tower_attack_power_at_range(20), 150);
78 assert_eq!(tower_attack_power_at_range(25), 150);
80 assert_eq!(tower_attack_power_at_range(0), 600);
82 }
83
84 #[test]
85 fn tower_heal_power_formula() {
86 assert_eq!(
88 tower_heal_power_at_range(TOWER_OPTIMAL_RANGE),
89 TOWER_POWER_HEAL
90 );
91 assert_eq!(
93 tower_heal_power_at_range(TOWER_FALLOFF_RANGE),
94 (TOWER_POWER_HEAL as f64 * (1. - TOWER_FALLOFF)) as u32
95 );
96 assert_eq!(tower_heal_power_at_range(5), 400);
98 assert_eq!(tower_heal_power_at_range(6), 380);
99 assert_eq!(tower_heal_power_at_range(7), 360);
100 assert_eq!(tower_heal_power_at_range(8), 340);
101 assert_eq!(tower_heal_power_at_range(9), 320);
102 assert_eq!(tower_heal_power_at_range(10), 300);
103 assert_eq!(tower_heal_power_at_range(11), 280);
104 assert_eq!(tower_heal_power_at_range(12), 260);
105 assert_eq!(tower_heal_power_at_range(13), 240);
106 assert_eq!(tower_heal_power_at_range(14), 220);
107 assert_eq!(tower_heal_power_at_range(15), 200);
108 assert_eq!(tower_heal_power_at_range(16), 180);
109 assert_eq!(tower_heal_power_at_range(17), 160);
110 assert_eq!(tower_heal_power_at_range(18), 140);
111 assert_eq!(tower_heal_power_at_range(19), 120);
112 assert_eq!(tower_heal_power_at_range(20), 100);
113 assert_eq!(tower_heal_power_at_range(25), 100);
115 assert_eq!(tower_heal_power_at_range(0), 400);
117 }
118
119 #[test]
120 fn tower_repair_power_formula() {
121 assert_eq!(
123 tower_repair_power_at_range(TOWER_OPTIMAL_RANGE),
124 TOWER_POWER_REPAIR
125 );
126 assert_eq!(
128 tower_repair_power_at_range(TOWER_FALLOFF_RANGE),
129 (TOWER_POWER_REPAIR as f64 * (1. - TOWER_FALLOFF)) as u32
130 );
131 assert_eq!(tower_repair_power_at_range(5), 800);
133 assert_eq!(tower_repair_power_at_range(6), 760);
134 assert_eq!(tower_repair_power_at_range(7), 720);
135 assert_eq!(tower_repair_power_at_range(8), 680);
136 assert_eq!(tower_repair_power_at_range(9), 640);
137 assert_eq!(tower_repair_power_at_range(10), 600);
138 assert_eq!(tower_repair_power_at_range(11), 560);
139 assert_eq!(tower_repair_power_at_range(12), 520);
140 assert_eq!(tower_repair_power_at_range(13), 480);
141 assert_eq!(tower_repair_power_at_range(14), 440);
142 assert_eq!(tower_repair_power_at_range(15), 400);
143 assert_eq!(tower_repair_power_at_range(16), 360);
144 assert_eq!(tower_repair_power_at_range(17), 320);
145 assert_eq!(tower_repair_power_at_range(18), 280);
146 assert_eq!(tower_repair_power_at_range(19), 240);
147 assert_eq!(tower_repair_power_at_range(20), 200);
148 assert_eq!(tower_repair_power_at_range(25), 200);
150 assert_eq!(tower_repair_power_at_range(0), 800);
152 }
153}