1use crate::game::state::GameState;
2
3#[derive(Clone, Copy)]
4pub enum UpgradeReq {
5 OwnedFingerer(&'static str, u32),
7 TotalClicks(u64),
8 LifetimeCuques(f64),
9}
10
11impl UpgradeReq {
12 pub fn met(&self, s: &GameState) -> bool {
13 match *self {
14 UpgradeReq::OwnedFingerer(id, n) => s.fingerer_count(id) >= n,
15 UpgradeReq::TotalClicks(n) => s.total_clicks >= n,
16 UpgradeReq::LifetimeCuques(n) => s.lifetime_cuques >= n,
17 }
18 }
19}
20
21#[derive(Clone, Copy)]
22#[allow(clippy::enum_variant_names)]
25pub enum UpgradeEffect {
26 FingererMult(&'static str, f64),
28 ClickMult(f64),
29 AllFingerersMult(f64),
30}
31
32pub struct UpgradeKind {
33 pub id: &'static str,
37 pub cost: f64,
38 pub req: UpgradeReq,
39 pub effect: UpgradeEffect,
40}
41
42pub const UPGRADES: &[UpgradeKind] = &[
50 UpgradeKind {
51 id: "click_mult_1",
52 cost: 100.0,
53 req: UpgradeReq::TotalClicks(50),
54 effect: UpgradeEffect::ClickMult(2.0),
55 },
56 UpgradeKind {
57 id: "click_mult_2",
58 cost: 5_000.0,
59 req: UpgradeReq::TotalClicks(200),
60 effect: UpgradeEffect::ClickMult(2.0),
61 },
62 UpgradeKind {
63 id: "click_mult_3",
64 cost: 100_000.0,
65 req: UpgradeReq::TotalClicks(1_000),
66 effect: UpgradeEffect::ClickMult(2.0),
67 },
68 UpgradeKind {
69 id: "index_finger_mult_1",
70 cost: 150.0,
71 req: UpgradeReq::OwnedFingerer("index_finger", 1),
72 effect: UpgradeEffect::FingererMult("index_finger", 2.0),
73 },
74 UpgradeKind {
75 id: "index_finger_mult_2",
76 cost: 1_500.0,
77 req: UpgradeReq::OwnedFingerer("index_finger", 25),
78 effect: UpgradeEffect::FingererMult("index_finger", 2.0),
79 },
80 UpgradeKind {
81 id: "index_finger_mult_3",
82 cost: 15_000.0,
83 req: UpgradeReq::OwnedFingerer("index_finger", 50),
84 effect: UpgradeEffect::FingererMult("index_finger", 2.0),
85 },
86 UpgradeKind {
87 id: "whole_hand_mult_1",
88 cost: 1_000.0,
89 req: UpgradeReq::OwnedFingerer("whole_hand", 1),
90 effect: UpgradeEffect::FingererMult("whole_hand", 2.0),
91 },
92 UpgradeKind {
93 id: "whole_hand_mult_2",
94 cost: 10_000.0,
95 req: UpgradeReq::OwnedFingerer("whole_hand", 25),
96 effect: UpgradeEffect::FingererMult("whole_hand", 2.0),
97 },
98 UpgradeKind {
99 id: "whole_hand_mult_3",
100 cost: 100_000.0,
101 req: UpgradeReq::OwnedFingerer("whole_hand", 50),
102 effect: UpgradeEffect::FingererMult("whole_hand", 2.0),
103 },
104 UpgradeKind {
105 id: "latex_glove_mult_1",
106 cost: 11_000.0,
107 req: UpgradeReq::OwnedFingerer("latex_glove", 1),
108 effect: UpgradeEffect::FingererMult("latex_glove", 2.0),
109 },
110 UpgradeKind {
111 id: "latex_glove_mult_2",
112 cost: 110_000.0,
113 req: UpgradeReq::OwnedFingerer("latex_glove", 25),
114 effect: UpgradeEffect::FingererMult("latex_glove", 2.0),
115 },
116 UpgradeKind {
117 id: "latex_glove_mult_3",
118 cost: 1_100_000.0,
119 req: UpgradeReq::OwnedFingerer("latex_glove", 50),
120 effect: UpgradeEffect::FingererMult("latex_glove", 2.0),
121 },
122 UpgradeKind {
123 id: "robotic_finger_mult_1",
124 cost: 120_000.0,
125 req: UpgradeReq::OwnedFingerer("robotic_finger", 1),
126 effect: UpgradeEffect::FingererMult("robotic_finger", 2.0),
127 },
128 UpgradeKind {
129 id: "robotic_finger_mult_2",
130 cost: 1_200_000.0,
131 req: UpgradeReq::OwnedFingerer("robotic_finger", 25),
132 effect: UpgradeEffect::FingererMult("robotic_finger", 2.0),
133 },
134 UpgradeKind {
135 id: "robotic_finger_mult_3",
136 cost: 12_000_000.0,
137 req: UpgradeReq::OwnedFingerer("robotic_finger", 50),
138 effect: UpgradeEffect::FingererMult("robotic_finger", 2.0),
139 },
140 UpgradeKind {
141 id: "all_fingerers_boost",
142 cost: 1_000_000.0,
143 req: UpgradeReq::LifetimeCuques(500_000.0),
144 effect: UpgradeEffect::AllFingerersMult(1.5),
145 },
146 UpgradeKind {
147 id: "tentacle_mult_1",
148 cost: 1_300_000.0,
149 req: UpgradeReq::OwnedFingerer("tentacle", 1),
150 effect: UpgradeEffect::FingererMult("tentacle", 2.0),
151 },
152 UpgradeKind {
153 id: "tentacle_mult_2",
154 cost: 13_000_000.0,
155 req: UpgradeReq::OwnedFingerer("tentacle", 25),
156 effect: UpgradeEffect::FingererMult("tentacle", 2.0),
157 },
158 UpgradeKind {
159 id: "tentacle_mult_3",
160 cost: 130_000_000.0,
161 req: UpgradeReq::OwnedFingerer("tentacle", 50),
162 effect: UpgradeEffect::FingererMult("tentacle", 2.0),
163 },
164 UpgradeKind {
165 id: "finger_vortex_mult_1",
166 cost: 14_000_000.0,
167 req: UpgradeReq::OwnedFingerer("finger_vortex", 1),
168 effect: UpgradeEffect::FingererMult("finger_vortex", 2.0),
169 },
170 UpgradeKind {
171 id: "finger_vortex_mult_2",
172 cost: 140_000_000.0,
173 req: UpgradeReq::OwnedFingerer("finger_vortex", 25),
174 effect: UpgradeEffect::FingererMult("finger_vortex", 2.0),
175 },
176 UpgradeKind {
177 id: "finger_vortex_mult_3",
178 cost: 1_400_000_000.0,
179 req: UpgradeReq::OwnedFingerer("finger_vortex", 50),
180 effect: UpgradeEffect::FingererMult("finger_vortex", 2.0),
181 },
182 UpgradeKind {
183 id: "dimensional_hole_mult_1",
184 cost: 200_000_000.0,
185 req: UpgradeReq::OwnedFingerer("dimensional_hole", 1),
186 effect: UpgradeEffect::FingererMult("dimensional_hole", 2.0),
187 },
188 UpgradeKind {
189 id: "dimensional_hole_mult_2",
190 cost: 2_000_000_000.0,
191 req: UpgradeReq::OwnedFingerer("dimensional_hole", 25),
192 effect: UpgradeEffect::FingererMult("dimensional_hole", 2.0),
193 },
194 UpgradeKind {
195 id: "dimensional_hole_mult_3",
196 cost: 20_000_000_000.0,
197 req: UpgradeReq::OwnedFingerer("dimensional_hole", 50),
198 effect: UpgradeEffect::FingererMult("dimensional_hole", 2.0),
199 },
200 UpgradeKind {
201 id: "cosmic_finger_mult_1",
202 cost: 3_300_000_000.0,
203 req: UpgradeReq::OwnedFingerer("cosmic_finger", 1),
204 effect: UpgradeEffect::FingererMult("cosmic_finger", 2.0),
205 },
206 UpgradeKind {
207 id: "cosmic_finger_mult_2",
208 cost: 33_000_000_000.0,
209 req: UpgradeReq::OwnedFingerer("cosmic_finger", 25),
210 effect: UpgradeEffect::FingererMult("cosmic_finger", 2.0),
211 },
212 UpgradeKind {
213 id: "cosmic_finger_mult_3",
214 cost: 330_000_000_000.0,
215 req: UpgradeReq::OwnedFingerer("cosmic_finger", 50),
216 effect: UpgradeEffect::FingererMult("cosmic_finger", 2.0),
217 },
218 UpgradeKind {
219 id: "hand_of_god_mult_1",
220 cost: 51_000_000_000.0,
221 req: UpgradeReq::OwnedFingerer("hand_of_god", 1),
222 effect: UpgradeEffect::FingererMult("hand_of_god", 2.0),
223 },
224 UpgradeKind {
225 id: "hand_of_god_mult_2",
226 cost: 510_000_000_000.0,
227 req: UpgradeReq::OwnedFingerer("hand_of_god", 25),
228 effect: UpgradeEffect::FingererMult("hand_of_god", 2.0),
229 },
230 UpgradeKind {
231 id: "hand_of_god_mult_3",
232 cost: 5_100_000_000_000.0,
233 req: UpgradeReq::OwnedFingerer("hand_of_god", 50),
234 effect: UpgradeEffect::FingererMult("hand_of_god", 2.0),
235 },
236 UpgradeKind {
237 id: "greek_kiss_mult_1",
238 cost: 35_000.0,
239 req: UpgradeReq::OwnedFingerer("greek_kiss", 1),
240 effect: UpgradeEffect::FingererMult("greek_kiss", 2.0),
241 },
242 UpgradeKind {
243 id: "greek_kiss_mult_2",
244 cost: 350_000.0,
245 req: UpgradeReq::OwnedFingerer("greek_kiss", 25),
246 effect: UpgradeEffect::FingererMult("greek_kiss", 2.0),
247 },
248 UpgradeKind {
249 id: "greek_kiss_mult_3",
250 cost: 3_500_000.0,
251 req: UpgradeReq::OwnedFingerer("greek_kiss", 50),
252 effect: UpgradeEffect::FingererMult("greek_kiss", 2.0),
253 },
254];
255
256pub fn available_ids(state: &GameState) -> Vec<usize> {
257 UPGRADES
258 .iter()
259 .enumerate()
260 .filter(|(_, u)| !state.has_upgrade(u.id) && u.req.met(state))
261 .map(|(i, _)| i)
262 .collect()
263}