atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
e807266c323bcc1fd00f59aa160b3b94d8168beb
1
ssh://brewery@pls.lobotomise.me:33/atagen/jelq.git

Blame: src/game/items.rs

782069860236atagen2026-10-10 12:44 UTC1
use super::balance::STARTING_ICE_PACKS;
782069860236atagen2026-10-10 12:44 UTC2
782069860236atagen2026-10-10 12:44 UTC3
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
782069860236atagen2026-10-10 12:44 UTC4
pub enum Item {
782069860236atagen2026-10-10 12:44 UTC5
    WarmTowel,
782069860236atagen2026-10-10 12:44 UTC6
    IcePack,
782069860236atagen2026-10-10 12:44 UTC7
    Ruler,
782069860236atagen2026-10-10 12:44 UTC8
    DoorLock,
782069860236atagen2026-10-10 12:44 UTC9
    DndSign,
782069860236atagen2026-10-10 12:44 UTC10
    Blinds,
782069860236atagen2026-10-10 12:44 UTC11
    Pump,
782069860236atagen2026-10-10 12:44 UTC12
    PumpPro,
782069860236atagen2026-10-10 12:44 UTC13
    Extender,
782069860236atagen2026-10-10 12:44 UTC14
    Ring,
782069860236atagen2026-10-10 12:44 UTC15
    Supplement,
782069860236atagen2026-10-10 12:44 UTC16
    Cage,
782069860236atagen2026-10-10 12:44 UTC17
    CageKey,
782069860236atagen2026-10-10 12:44 UTC18
    Spreadsheet,
782069860236atagen2026-10-10 12:44 UTC19
    TeapotSpout,
0a0bfee8329eatagen2026-10-11 05:11 UTC20
    BabyOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC21
    CoconutOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC22
    Lotion,
0a0bfee8329eatagen2026-10-11 05:11 UTC23
    Vaseline,
0a0bfee8329eatagen2026-10-11 05:11 UTC24
    EnergyDrink,
782069860236atagen2026-10-10 12:44 UTC25
}
782069860236atagen2026-10-10 12:44 UTC26
0a0bfee8329eatagen2026-10-11 05:11 UTC27
pub const SHOP: [Item; 15] = [
782069860236atagen2026-10-10 12:44 UTC28
    Item::Pump,
782069860236atagen2026-10-10 12:44 UTC29
    Item::PumpPro,
782069860236atagen2026-10-10 12:44 UTC30
    Item::Extender,
782069860236atagen2026-10-10 12:44 UTC31
    Item::Ring,
782069860236atagen2026-10-10 12:44 UTC32
    Item::Supplement,
782069860236atagen2026-10-10 12:44 UTC33
    Item::DoorLock,
782069860236atagen2026-10-10 12:44 UTC34
    Item::DndSign,
782069860236atagen2026-10-10 12:44 UTC35
    Item::Blinds,
782069860236atagen2026-10-10 12:44 UTC36
    Item::Ruler,
782069860236atagen2026-10-10 12:44 UTC37
    Item::IcePack,
782069860236atagen2026-10-10 12:44 UTC38
    Item::CageKey,
0a0bfee8329eatagen2026-10-11 05:11 UTC39
    Item::BabyOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC40
    Item::CoconutOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC41
    Item::Lotion,
0a0bfee8329eatagen2026-10-11 05:11 UTC42
    Item::Vaseline,
782069860236atagen2026-10-10 12:44 UTC43
];
782069860236atagen2026-10-10 12:44 UTC44
782069860236atagen2026-10-10 12:44 UTC45
impl Item {
0a0bfee8329eatagen2026-10-11 05:11 UTC46
    const ALL: [Self; 20] = [
782069860236atagen2026-10-10 12:44 UTC47
        Self::WarmTowel,
782069860236atagen2026-10-10 12:44 UTC48
        Self::IcePack,
782069860236atagen2026-10-10 12:44 UTC49
        Self::Ruler,
782069860236atagen2026-10-10 12:44 UTC50
        Self::DoorLock,
782069860236atagen2026-10-10 12:44 UTC51
        Self::DndSign,
782069860236atagen2026-10-10 12:44 UTC52
        Self::Blinds,
782069860236atagen2026-10-10 12:44 UTC53
        Self::Pump,
782069860236atagen2026-10-10 12:44 UTC54
        Self::PumpPro,
782069860236atagen2026-10-10 12:44 UTC55
        Self::Extender,
782069860236atagen2026-10-10 12:44 UTC56
        Self::Ring,
782069860236atagen2026-10-10 12:44 UTC57
        Self::Supplement,
782069860236atagen2026-10-10 12:44 UTC58
        Self::Cage,
782069860236atagen2026-10-10 12:44 UTC59
        Self::CageKey,
782069860236atagen2026-10-10 12:44 UTC60
        Self::Spreadsheet,
782069860236atagen2026-10-10 12:44 UTC61
        Self::TeapotSpout,
0a0bfee8329eatagen2026-10-11 05:11 UTC62
        Self::BabyOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC63
        Self::CoconutOil,
0a0bfee8329eatagen2026-10-11 05:11 UTC64
        Self::Lotion,
0a0bfee8329eatagen2026-10-11 05:11 UTC65
        Self::Vaseline,
0a0bfee8329eatagen2026-10-11 05:11 UTC66
        Self::EnergyDrink,
782069860236atagen2026-10-10 12:44 UTC67
    ];
782069860236atagen2026-10-10 12:44 UTC68
782069860236atagen2026-10-10 12:44 UTC69
    pub fn slug(self) -> &'static str {
782069860236atagen2026-10-10 12:44 UTC70
        match self {
782069860236atagen2026-10-10 12:44 UTC71
            Self::WarmTowel => "warm-towel",
782069860236atagen2026-10-10 12:44 UTC72
            Self::IcePack => "ice-pack",
782069860236atagen2026-10-10 12:44 UTC73
            Self::Ruler => "ruler",
782069860236atagen2026-10-10 12:44 UTC74
            Self::DoorLock => "door-lock",
782069860236atagen2026-10-10 12:44 UTC75
            Self::DndSign => "do-not-disturb-sign",
782069860236atagen2026-10-10 12:44 UTC76
            Self::Blinds => "window-blinds",
782069860236atagen2026-10-10 12:44 UTC77
            Self::Pump => "pump",
782069860236atagen2026-10-10 12:44 UTC78
            Self::PumpPro => "pump-pro",
782069860236atagen2026-10-10 12:44 UTC79
            Self::Extender => "extender",
782069860236atagen2026-10-10 12:44 UTC80
            Self::Ring => "cock-ring",
782069860236atagen2026-10-10 12:44 UTC81
            Self::Supplement => "supplement",
782069860236atagen2026-10-10 12:44 UTC82
            Self::Cage => "chastity-cage",
782069860236atagen2026-10-10 12:44 UTC83
            Self::CageKey => "cage-key",
782069860236atagen2026-10-10 12:44 UTC84
            Self::Spreadsheet => "spreadsheet",
782069860236atagen2026-10-10 12:44 UTC85
            Self::TeapotSpout => "teapot-spout",
0a0bfee8329eatagen2026-10-11 05:11 UTC86
            Self::BabyOil => "baby-oil",
0a0bfee8329eatagen2026-10-11 05:11 UTC87
            Self::CoconutOil => "coconut-oil",
0a0bfee8329eatagen2026-10-11 05:11 UTC88
            Self::Lotion => "lotion",
0a0bfee8329eatagen2026-10-11 05:11 UTC89
            Self::Vaseline => "vaseline",
0a0bfee8329eatagen2026-10-11 05:11 UTC90
            Self::EnergyDrink => "energy-drink",
782069860236atagen2026-10-10 12:44 UTC91
        }
782069860236atagen2026-10-10 12:44 UTC92
    }
782069860236atagen2026-10-10 12:44 UTC93
782069860236atagen2026-10-10 12:44 UTC94
    pub fn parse(slug: &str) -> Option<Self> {
782069860236atagen2026-10-10 12:44 UTC95
        Self::ALL.into_iter().find(|item| item.slug() == slug)
782069860236atagen2026-10-10 12:44 UTC96
    }
782069860236atagen2026-10-10 12:44 UTC97
782069860236atagen2026-10-10 12:44 UTC98
    pub fn description(self) -> &'static str {
782069860236atagen2026-10-10 12:44 UTC99
        match self {
782069860236atagen2026-10-10 12:44 UTC100
            Self::WarmTowel => {
782069860236atagen2026-10-10 12:44 UTC101
                "Reusable. Satisfies the warm-up precondition. Use technique=warmup."
782069860236atagen2026-10-10 12:44 UTC102
            }
782069860236atagen2026-10-10 12:44 UTC103
            Self::IcePack => "Lowers EQ by 40. Use technique=ice.",
782069860236atagen2026-10-10 12:44 UTC104
            Self::Ruler => "Measures honestly. The length resource now carries a Content-Length.",
7d3fb63208bfatagen2026-10-11 04:38 UTC105
            Self::DoorLock => "Keeps your brother out once.",
9683736a2c5eatagen2026-10-10 13:15 UTC106
            Self::DndSign => "Works on housekeeping. Mum does not read signs.",
782069860236atagen2026-10-10 12:44 UTC107
            Self::Blinds => "The neighbour has a good camera. The blinds are better.",
782069860236atagen2026-10-10 12:44 UTC108
            Self::Pump => "A pump.",
782069860236atagen2026-10-10 12:44 UTC109
            Self::PumpPro => "Use technique=pump. Gains are temporary.",
782069860236atagen2026-10-10 12:44 UTC110
            Self::Extender => "Passive gains each turn. Takes up room. Can be removed with DELETE.",
782069860236atagen2026-10-10 12:44 UTC111
            Self::Ring => {
782069860236atagen2026-10-10 12:44 UTC112
                "Girth gains doubled. Rupture risk raised. Responses are compressed if you accept gzip. Can be removed with DELETE."
782069860236atagen2026-10-10 12:44 UTC113
            }
782069860236atagen2026-10-10 12:44 UTC114
            Self::Supplement => "Use technique=supplement.",
782069860236atagen2026-10-10 12:44 UTC115
            Self::Cage => "Locked.",
782069860236atagen2026-10-10 12:44 UTC116
            Self::CageKey => "Pump-Bro does not ask.",
782069860236atagen2026-10-10 12:44 UTC117
            Self::Spreadsheet => "Charts your progress. Every line is flat.",
782069860236atagen2026-10-10 12:44 UTC118
            Self::TeapotSpout => "Does nothing. Cannot be dropped.",
0a0bfee8329eatagen2026-10-11 05:11 UTC119
            Self::BabyOil => "Smooth. +1. One unit per jelq.",
0a0bfee8329eatagen2026-10-11 05:11 UTC120
            Self::CoconutOil => "+3. Solid until it matters. Suspicious at Nan's.",
0a0bfee8329eatagen2026-10-11 05:11 UTC121
            Self::Lotion => "Handy. +0, and it chafes, so each jelq costs an extra stamina.",
0a0bfee8329eatagen2026-10-11 05:11 UTC122
            Self::Vaseline => "+2. Raises suspicion everywhere.",
0a0bfee8329eatagen2026-10-11 05:11 UTC123
            Self::EnergyDrink => "technique=energy. +3 stamina. Tastes like a battery.",
782069860236atagen2026-10-10 12:44 UTC124
        }
782069860236atagen2026-10-10 12:44 UTC125
    }
782069860236atagen2026-10-10 12:44 UTC126
782069860236atagen2026-10-10 12:44 UTC127
    pub fn pitch(self) -> &'static str {
782069860236atagen2026-10-10 12:44 UTC128
        match self {
782069860236atagen2026-10-10 12:44 UTC129
            Self::PumpPro => "A pump, but professional.",
782069860236atagen2026-10-10 12:44 UTC130
            Self::Extender => "Passive gains every turn. Takes up room.",
782069860236atagen2026-10-10 12:44 UTC131
            Self::Ring => "Doubles girth gains. Pump-Bro does not discuss the risks.",
782069860236atagen2026-10-10 12:44 UTC132
            Self::Supplement => "Clinically formulated. Ships from overseas.",
782069860236atagen2026-10-10 12:44 UTC133
            Self::DndSign => "Housekeeping respects it.",
782069860236atagen2026-10-10 12:44 UTC134
            Self::Blinds => "The neighbour has a good camera.",
782069860236atagen2026-10-10 12:44 UTC135
            Self::Ruler => "Pump-Bro does not recommend it.",
782069860236atagen2026-10-10 12:44 UTC136
            Self::IcePack => "Cold.",
782069860236atagen2026-10-10 12:44 UTC137
            _ => self.description(),
782069860236atagen2026-10-10 12:44 UTC138
        }
782069860236atagen2026-10-10 12:44 UTC139
    }
782069860236atagen2026-10-10 12:44 UTC140
782069860236atagen2026-10-10 12:44 UTC141
    pub fn price(self) -> Option<u32> {
782069860236atagen2026-10-10 12:44 UTC142
        match self {
782069860236atagen2026-10-10 12:44 UTC143
            Self::Pump => Some(10),
782069860236atagen2026-10-10 12:44 UTC144
            Self::PumpPro | Self::Extender | Self::CageKey => Some(15),
782069860236atagen2026-10-10 12:44 UTC145
            Self::Ring => Some(8),
782069860236atagen2026-10-10 12:44 UTC146
            Self::Supplement | Self::DoorLock | Self::DndSign | Self::Blinds | Self::Ruler => {
782069860236atagen2026-10-10 12:44 UTC147
                Some(5)
782069860236atagen2026-10-10 12:44 UTC148
            }
0a0bfee8329eatagen2026-10-11 05:11 UTC149
            Self::BabyOil | Self::CoconutOil | Self::Lotion | Self::Vaseline => Some(4),
782069860236atagen2026-10-10 12:44 UTC150
            Self::IcePack => Some(3),
0a0bfee8329eatagen2026-10-11 05:11 UTC151
            Self::WarmTowel
0a0bfee8329eatagen2026-10-11 05:11 UTC152
            | Self::Cage
0a0bfee8329eatagen2026-10-11 05:11 UTC153
            | Self::Spreadsheet
0a0bfee8329eatagen2026-10-11 05:11 UTC154
            | Self::TeapotSpout
0a0bfee8329eatagen2026-10-11 05:11 UTC155
            | Self::EnergyDrink => None,
782069860236atagen2026-10-10 12:44 UTC156
        }
782069860236atagen2026-10-10 12:44 UTC157
    }
782069860236atagen2026-10-10 12:44 UTC158
}
782069860236atagen2026-10-10 12:44 UTC159
782069860236atagen2026-10-10 12:44 UTC160
pub struct Items {
782069860236atagen2026-10-10 12:44 UTC161
    pub ruler: bool,
782069860236atagen2026-10-10 12:44 UTC162
    pub ice_packs: u32,
782069860236atagen2026-10-10 12:44 UTC163
    pub door_locks: u32,
782069860236atagen2026-10-10 12:44 UTC164
    pub dnd_sign: bool,
782069860236atagen2026-10-10 12:44 UTC165
    pub blinds: bool,
782069860236atagen2026-10-10 12:44 UTC166
    pub pump_pro: bool,
782069860236atagen2026-10-10 12:44 UTC167
    pub extender: bool,
782069860236atagen2026-10-10 12:44 UTC168
    pub ring: bool,
782069860236atagen2026-10-10 12:44 UTC169
    pub supplements: u32,
782069860236atagen2026-10-10 12:44 UTC170
    pub cage: bool,
782069860236atagen2026-10-10 12:44 UTC171
    pub spreadsheet: bool,
782069860236atagen2026-10-10 12:44 UTC172
    pub teapot_spout: bool,
0a0bfee8329eatagen2026-10-11 05:11 UTC173
    pub baby_oil: u32,
0a0bfee8329eatagen2026-10-11 05:11 UTC174
    pub coconut_oil: u32,
0a0bfee8329eatagen2026-10-11 05:11 UTC175
    pub lotion: u32,
0a0bfee8329eatagen2026-10-11 05:11 UTC176
    pub vaseline: u32,
0a0bfee8329eatagen2026-10-11 05:11 UTC177
    pub energy_drinks: u32,
782069860236atagen2026-10-10 12:44 UTC178
}
782069860236atagen2026-10-10 12:44 UTC179
782069860236atagen2026-10-10 12:44 UTC180
impl Default for Items {
782069860236atagen2026-10-10 12:44 UTC181
    fn default() -> Self {
782069860236atagen2026-10-10 12:44 UTC182
        Self {
782069860236atagen2026-10-10 12:44 UTC183
            ruler: false,
782069860236atagen2026-10-10 12:44 UTC184
            ice_packs: STARTING_ICE_PACKS,
782069860236atagen2026-10-10 12:44 UTC185
            door_locks: 0,
782069860236atagen2026-10-10 12:44 UTC186
            dnd_sign: false,
782069860236atagen2026-10-10 12:44 UTC187
            blinds: false,
782069860236atagen2026-10-10 12:44 UTC188
            pump_pro: false,
782069860236atagen2026-10-10 12:44 UTC189
            extender: false,
782069860236atagen2026-10-10 12:44 UTC190
            ring: false,
782069860236atagen2026-10-10 12:44 UTC191
            supplements: 0,
782069860236atagen2026-10-10 12:44 UTC192
            cage: false,
782069860236atagen2026-10-10 12:44 UTC193
            spreadsheet: false,
782069860236atagen2026-10-10 12:44 UTC194
            teapot_spout: false,
0a0bfee8329eatagen2026-10-11 05:11 UTC195
            baby_oil: 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC196
            coconut_oil: 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC197
            lotion: 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC198
            vaseline: 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC199
            energy_drinks: 0,
782069860236atagen2026-10-10 12:44 UTC200
        }
782069860236atagen2026-10-10 12:44 UTC201
    }
782069860236atagen2026-10-10 12:44 UTC202
}
782069860236atagen2026-10-10 12:44 UTC203
782069860236atagen2026-10-10 12:44 UTC204
impl Items {
782069860236atagen2026-10-10 12:44 UTC205
    pub fn has(&self, item: Item) -> bool {
782069860236atagen2026-10-10 12:44 UTC206
        match item {
782069860236atagen2026-10-10 12:44 UTC207
            Item::WarmTowel => true,
782069860236atagen2026-10-10 12:44 UTC208
            Item::IcePack => self.ice_packs > 0,
782069860236atagen2026-10-10 12:44 UTC209
            Item::Ruler => self.ruler,
782069860236atagen2026-10-10 12:44 UTC210
            Item::DoorLock => self.door_locks > 0,
782069860236atagen2026-10-10 12:44 UTC211
            Item::DndSign => self.dnd_sign,
782069860236atagen2026-10-10 12:44 UTC212
            Item::Blinds => self.blinds,
782069860236atagen2026-10-10 12:44 UTC213
            Item::PumpPro => self.pump_pro,
782069860236atagen2026-10-10 12:44 UTC214
            Item::Extender => self.extender,
782069860236atagen2026-10-10 12:44 UTC215
            Item::Ring => self.ring,
782069860236atagen2026-10-10 12:44 UTC216
            Item::Supplement => self.supplements > 0,
782069860236atagen2026-10-10 12:44 UTC217
            Item::Cage => self.cage,
782069860236atagen2026-10-10 12:44 UTC218
            Item::Spreadsheet => self.spreadsheet,
782069860236atagen2026-10-10 12:44 UTC219
            Item::TeapotSpout => self.teapot_spout,
0a0bfee8329eatagen2026-10-11 05:11 UTC220
            Item::BabyOil => self.baby_oil > 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC221
            Item::CoconutOil => self.coconut_oil > 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC222
            Item::Lotion => self.lotion > 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC223
            Item::Vaseline => self.vaseline > 0,
0a0bfee8329eatagen2026-10-11 05:11 UTC224
            Item::EnergyDrink => self.energy_drinks > 0,
782069860236atagen2026-10-10 12:44 UTC225
            Item::Pump | Item::CageKey => false,
782069860236atagen2026-10-10 12:44 UTC226
        }
782069860236atagen2026-10-10 12:44 UTC227
    }
782069860236atagen2026-10-10 12:44 UTC228
782069860236atagen2026-10-10 12:44 UTC229
    pub fn owned(&self) -> Vec<Item> {
782069860236atagen2026-10-10 12:44 UTC230
        Item::ALL
782069860236atagen2026-10-10 12:44 UTC231
            .into_iter()
782069860236atagen2026-10-10 12:44 UTC232
            .filter(|&item| self.has(item))
782069860236atagen2026-10-10 12:44 UTC233
            .collect()
782069860236atagen2026-10-10 12:44 UTC234
    }
782069860236atagen2026-10-10 12:44 UTC235
782069860236atagen2026-10-10 12:44 UTC236
    pub fn grant(&mut self, item: Item) {
782069860236atagen2026-10-10 12:44 UTC237
        match item {
782069860236atagen2026-10-10 12:44 UTC238
            Item::IcePack => self.ice_packs += 1,
782069860236atagen2026-10-10 12:44 UTC239
            Item::Ruler => self.ruler = true,
782069860236atagen2026-10-10 12:44 UTC240
            Item::DoorLock => self.door_locks += 1,
782069860236atagen2026-10-10 12:44 UTC241
            Item::DndSign => self.dnd_sign = true,
782069860236atagen2026-10-10 12:44 UTC242
            Item::Blinds => self.blinds = true,
782069860236atagen2026-10-10 12:44 UTC243
            Item::PumpPro => self.pump_pro = true,
782069860236atagen2026-10-10 12:44 UTC244
            Item::Extender => self.extender = true,
782069860236atagen2026-10-10 12:44 UTC245
            Item::Ring => self.ring = true,
782069860236atagen2026-10-10 12:44 UTC246
            Item::Supplement => self.supplements += 1,
782069860236atagen2026-10-10 12:44 UTC247
            Item::Cage => self.cage = true,
782069860236atagen2026-10-10 12:44 UTC248
            Item::CageKey => self.cage = false,
782069860236atagen2026-10-10 12:44 UTC249
            Item::Spreadsheet => self.spreadsheet = true,
782069860236atagen2026-10-10 12:44 UTC250
            Item::TeapotSpout => self.teapot_spout = true,
0a0bfee8329eatagen2026-10-11 05:11 UTC251
            Item::BabyOil => self.baby_oil += 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC252
            Item::CoconutOil => self.coconut_oil += 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC253
            Item::Lotion => self.lotion += 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC254
            Item::Vaseline => self.vaseline += 1,
0a0bfee8329eatagen2026-10-11 05:11 UTC255
            Item::EnergyDrink => self.energy_drinks += 1,
782069860236atagen2026-10-10 12:44 UTC256
            Item::WarmTowel | Item::Pump => {}
782069860236atagen2026-10-10 12:44 UTC257
        }
782069860236atagen2026-10-10 12:44 UTC258
    }
782069860236atagen2026-10-10 12:44 UTC259
}