Skip to main content

cuqueclicker_lib/game/
upgrade.rs

1use crate::game::state::GameState;
2
3#[derive(Clone, Copy)]
4pub enum UpgradeReq {
5    /// Player owns at least `n` of the fingerer identified by this stable id.
6    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// The postfix repetition ("Mult") is intentional — each variant is a kind
23// of multiplicative modifier. Renaming would be worse.
24#[allow(clippy::enum_variant_names)]
25pub enum UpgradeEffect {
26    /// Multiplies the output of the fingerer identified by this stable id.
27    FingererMult(&'static str, f64),
28    ClickMult(f64),
29    AllFingerersMult(f64),
30}
31
32pub struct UpgradeKind {
33    /// Stable identifier used as the save-file key. Survives reorders, cost
34    /// rebalancing, and renames — flipping an upgrade's position never turns
35    /// an already-earned upgrade back into an unearned one.
36    pub id: &'static str,
37    pub cost: f64,
38    pub req: UpgradeReq,
39    pub effect: UpgradeEffect,
40}
41
42/// Per-fingerer upgrades: 3 tiers (own 1, own 25, own 50) each doubles output.
43/// Click upgrades: 3 tiers (50 / 200 / 1000 clicks) each doubles click power.
44/// All-fingerer upgrades: lifetime cuques milestones, small boosts.
45///
46/// Since migration to stable IDs, array order is purely cosmetic — the save
47/// records earned upgrades by id, so reordering this list doesn't affect any
48/// existing save.
49pub 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}