atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0

Commit e2727527c151

tarball

atagen <boss@atagen.co>2026-10-13 12:40 UTC

3 files changed+27-13
game: let ice treat a burn through priapism, and reword lotion

Priapism returned before the burn check, so ice spent the pack and left the burn alone, even though only the EQ drop is what priapism should block. Lotion's chafing was really its stamina cost, which read oddly beside soothing a burn.
Modified file: src/game/items.rs+1 additions−1 deletions
@@ -117,7 +117,7 @@ impl Item {
117117 Self::BabyOil => "Smooth. +1. One unit per jelq.",
118118 Self::CoconutOil => "+3. Solid until it matters. Suspicious at Nan's.",
119119 Self::Lotion => {
120- "Handy. +0, and it chafes, so each jelq costs an extra stamina. Soothes a friction burn."
120+ "Handy. +0, and it soaks in fast, so each jelq costs an extra stamina. Soothes a friction burn."
121121 }
122122 Self::Vaseline => "+2. Raises suspicion everywhere.",
123123 Self::EnergyDrink => "technique=energy. +3 stamina. Tastes like a battery.",
Modified file: src/game/utility.rs+13 additions−12 deletions
@@ -76,19 +76,20 @@ impl Run {
7676 self.touch();
7777 self.step_away();
7878 self.items.stores.ice_packs -= 1;
79- if self.body.conditions.priapism_turns > 0 {
80- return Ok(Outcome::json(
81- StatusCode::OK,
82- json!({ "detail": "The ice has no effect. The condition persists. The ice pack is gone." }),
83- ));
84- }
85- self.body.eq = (self.body.eq - ICE_EQ).max(0);
86- let detail = if self.body.conditions.friction_burn {
87- self.body.conditions.friction_burn = false;
88- "The friction burn is treated. EQ has been reduced. The ice pack is gone."
89- } else {
90- "EQ has been reduced. The ice pack is gone."
79+ let treated = std::mem::take(&mut self.body.conditions.friction_burn);
80+ let detail = match (self.body.conditions.priapism_turns > 0, treated) {
81+ (true, true) => {
82+ "The friction burn is treated. EQ has not moved. The condition persists. The ice pack is gone."
83+ }
84+ (true, false) => "The ice has no effect. The condition persists. The ice pack is gone.",
85+ (false, true) => {
86+ "The friction burn is treated. EQ has been reduced. The ice pack is gone."
87+ }
88+ (false, false) => "EQ has been reduced. The ice pack is gone.",
9189 };
90+ if self.body.conditions.priapism_turns == 0 {
91+ self.body.eq = (self.body.eq - ICE_EQ).max(0);
92+ }
9293 Ok(Outcome::json(StatusCode::OK, json!({ "detail": detail })))
9394 }
9495
Modified file: src/tests/turns.rs+13 additions
@@ -342,3 +342,16 @@ async fn friction_at_the_limit_tears_the_foreskin() {
342342 assert_eq!(header(&gone, "x-foreskin"), "gone");
343343 assert_eq!(json(gone).await["foreskin"], -0.05);
344344 }
345+
346+#[tokio::test]
347+async fn ice_treats_a_burn_even_through_priapism() {
348+ let app = seeded_with(Floor::ChangingRoom, |run| {
349+ run.body.eq = 80;
350+ run.body.conditions.priapism_turns = 3;
351+ run.body.conditions.friction_burn = true;
352+ run.items.stores.ice_packs = 1;
353+ });
354+ let iced = send(&app, "JELQ", "/runs/cafebabe?technique=ice", &[], "").await;
355+ assert_eq!(header(&iced, "x-eq"), "80");
356+ assert!(warnings(&iced).iter().all(|w| !w.contains("friction burn")));
357+}