atagen

jelq

public

an http based roguelike rpg about jelqing

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

Blame: src/game/cause.rs

8b8e83329a1datagen2026-10-12 12:01 UTC1
use axum::http::StatusCode;
8b8e83329a1datagen2026-10-12 12:01 UTC2
8b8e83329a1datagen2026-10-12 12:01 UTC3
use crate::problem::Problem;
8b8e83329a1datagen2026-10-12 12:01 UTC4
8b8e83329a1datagen2026-10-12 12:01 UTC5
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
8b8e83329a1datagen2026-10-12 12:01 UTC6
pub enum Cause {
8b8e83329a1datagen2026-10-12 12:01 UTC7
    Ruptured { ice_unused: bool },
8b8e83329a1datagen2026-10-12 12:01 UTC8
    Caught,
8b8e83329a1datagen2026-10-12 12:01 UTC9
    Opened,
8b8e83329a1datagen2026-10-12 12:01 UTC10
    Banned,
8b8e83329a1datagen2026-10-12 12:01 UTC11
    Degloved,
8b8e83329a1datagen2026-10-12 12:01 UTC12
    Zip,
8b8e83329a1datagen2026-10-12 12:01 UTC13
    Meloned,
3ac624339c98atagen2026-10-13 12:21 UTC14
    Overstayed,
8b8e83329a1datagen2026-10-12 12:01 UTC15
    Abandoned,
8b8e83329a1datagen2026-10-12 12:01 UTC16
    Lost,
8b8e83329a1datagen2026-10-12 12:01 UTC17
}
8b8e83329a1datagen2026-10-12 12:01 UTC18
8b8e83329a1datagen2026-10-12 12:01 UTC19
impl Cause {
3ac624339c98atagen2026-10-13 12:21 UTC20
    pub const ALL: [Self; 11] = [
8b8e83329a1datagen2026-10-12 12:01 UTC21
        Self::Ruptured { ice_unused: true },
8b8e83329a1datagen2026-10-12 12:01 UTC22
        Self::Ruptured { ice_unused: false },
8b8e83329a1datagen2026-10-12 12:01 UTC23
        Self::Caught,
8b8e83329a1datagen2026-10-12 12:01 UTC24
        Self::Opened,
8b8e83329a1datagen2026-10-12 12:01 UTC25
        Self::Banned,
8b8e83329a1datagen2026-10-12 12:01 UTC26
        Self::Degloved,
8b8e83329a1datagen2026-10-12 12:01 UTC27
        Self::Zip,
8b8e83329a1datagen2026-10-12 12:01 UTC28
        Self::Meloned,
3ac624339c98atagen2026-10-13 12:21 UTC29
        Self::Overstayed,
8b8e83329a1datagen2026-10-12 12:01 UTC30
        Self::Abandoned,
8b8e83329a1datagen2026-10-12 12:01 UTC31
        Self::Lost,
8b8e83329a1datagen2026-10-12 12:01 UTC32
    ];
8b8e83329a1datagen2026-10-12 12:01 UTC33
8b8e83329a1datagen2026-10-12 12:01 UTC34
    pub fn slug(self) -> &'static str {
8b8e83329a1datagen2026-10-12 12:01 UTC35
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC36
            Self::Ruptured { .. } => "vascular-event",
8b8e83329a1datagen2026-10-12 12:01 UTC37
            Self::Caught => "caught",
8b8e83329a1datagen2026-10-12 12:01 UTC38
            Self::Opened => "opened",
8b8e83329a1datagen2026-10-12 12:01 UTC39
            Self::Banned => "banned",
8b8e83329a1datagen2026-10-12 12:01 UTC40
            Self::Degloved => "degloved",
8b8e83329a1datagen2026-10-12 12:01 UTC41
            Self::Zip => "zip",
8b8e83329a1datagen2026-10-12 12:01 UTC42
            Self::Meloned => "watermelon",
3ac624339c98atagen2026-10-13 12:21 UTC43
            Self::Overstayed => "overstayed",
8b8e83329a1datagen2026-10-12 12:01 UTC44
            Self::Abandoned => "abandoned",
8b8e83329a1datagen2026-10-12 12:01 UTC45
            Self::Lost => "lost",
8b8e83329a1datagen2026-10-12 12:01 UTC46
        }
8b8e83329a1datagen2026-10-12 12:01 UTC47
    }
8b8e83329a1datagen2026-10-12 12:01 UTC48
8b8e83329a1datagen2026-10-12 12:01 UTC49
    pub fn detail(self) -> &'static str {
8b8e83329a1datagen2026-10-12 12:01 UTC50
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC51
            Self::Ruptured { ice_unused: true } => {
8b8e83329a1datagen2026-10-12 12:01 UTC52
                "A vessel has exceeded its rated pressure. The run has ended. An ice pack was available and was not used."
8b8e83329a1datagen2026-10-12 12:01 UTC53
            }
8b8e83329a1datagen2026-10-12 12:01 UTC54
            Self::Ruptured { ice_unused: false } => {
8b8e83329a1datagen2026-10-12 12:01 UTC55
                "A vessel has exceeded its rated pressure. The run has ended."
8b8e83329a1datagen2026-10-12 12:01 UTC56
            }
8b8e83329a1datagen2026-10-12 12:01 UTC57
            Self::Caught => {
8b8e83329a1datagen2026-10-12 12:01 UTC58
                "Mum has seen enough. The run has ended. Nobody will mention it at dinner."
8b8e83329a1datagen2026-10-12 12:01 UTC59
            }
8b8e83329a1datagen2026-10-12 12:01 UTC60
            Self::Opened => {
8b8e83329a1datagen2026-10-12 12:01 UTC61
                "Mum has stopped knocking and opened the door. The run has ended. Nobody will mention it at dinner."
8b8e83329a1datagen2026-10-12 12:01 UTC62
            }
8b8e83329a1datagen2026-10-12 12:01 UTC63
            Self::Banned => "Your account has been banned. The forum can tell. The run has ended.",
8b8e83329a1datagen2026-10-12 12:01 UTC64
            Self::Degloved => {
8b8e83329a1datagen2026-10-12 12:01 UTC65
                "The outer layer has been removed in one piece. It will not be returning. The run has ended."
8b8e83329a1datagen2026-10-12 12:01 UTC66
            }
8b8e83329a1datagen2026-10-12 12:01 UTC67
            Self::Zip => {
8b8e83329a1datagen2026-10-12 12:01 UTC68
                "The request conflicts with the current state of the zip. The run has ended."
8b8e83329a1datagen2026-10-12 12:01 UTC69
            }
8b8e83329a1datagen2026-10-12 12:01 UTC70
            Self::Meloned => {
8b8e83329a1datagen2026-10-12 12:01 UTC71
                "You have been caught with the watermelon. Nobody will mention it at dinner. The run has ended."
8b8e83329a1datagen2026-10-12 12:01 UTC72
            }
3ac624339c98atagen2026-10-13 12:21 UTC73
            Self::Overstayed => {
3ac624339c98atagen2026-10-13 12:21 UTC74
                "The floor ran long and somebody walked in. The run has ended. Nobody will mention it at dinner."
3ac624339c98atagen2026-10-13 12:21 UTC75
            }
8b8e83329a1datagen2026-10-12 12:01 UTC76
            Self::Abandoned => "The run was abandoned.",
8b8e83329a1datagen2026-10-12 12:01 UTC77
            Self::Lost => {
8b8e83329a1datagen2026-10-12 12:01 UTC78
                "The server fell over mid-stroke and the run went with it. Nobody will mention it at dinner."
8b8e83329a1datagen2026-10-12 12:01 UTC79
            }
8b8e83329a1datagen2026-10-12 12:01 UTC80
        }
8b8e83329a1datagen2026-10-12 12:01 UTC81
    }
8b8e83329a1datagen2026-10-12 12:01 UTC82
8b8e83329a1datagen2026-10-12 12:01 UTC83
    /// The records keep the slug and the ice, which is all a cause needs to be told again.
8b8e83329a1datagen2026-10-12 12:01 UTC84
    pub fn parse(slug: &str, ice_unused: bool) -> Option<Self> {
8b8e83329a1datagen2026-10-12 12:01 UTC85
        Self::ALL.into_iter().find(|cause| {
8b8e83329a1datagen2026-10-12 12:01 UTC86
            cause.slug() == slug
8b8e83329a1datagen2026-10-12 12:01 UTC87
                && !matches!(cause, Self::Ruptured { ice_unused: unused } if *unused != ice_unused)
8b8e83329a1datagen2026-10-12 12:01 UTC88
        })
8b8e83329a1datagen2026-10-12 12:01 UTC89
    }
8b8e83329a1datagen2026-10-12 12:01 UTC90
8b8e83329a1datagen2026-10-12 12:01 UTC91
    fn status(self) -> StatusCode {
8b8e83329a1datagen2026-10-12 12:01 UTC92
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC93
            Self::Ruptured { .. } | Self::Lost => StatusCode::INTERNAL_SERVER_ERROR,
3ac624339c98atagen2026-10-13 12:21 UTC94
            Self::Caught
3ac624339c98atagen2026-10-13 12:21 UTC95
            | Self::Opened
3ac624339c98atagen2026-10-13 12:21 UTC96
            | Self::Degloved
3ac624339c98atagen2026-10-13 12:21 UTC97
            | Self::Abandoned
3ac624339c98atagen2026-10-13 12:21 UTC98
            | Self::Meloned
3ac624339c98atagen2026-10-13 12:21 UTC99
            | Self::Overstayed => StatusCode::GONE,
8b8e83329a1datagen2026-10-12 12:01 UTC100
            Self::Banned => StatusCode::FORBIDDEN,
8b8e83329a1datagen2026-10-12 12:01 UTC101
            Self::Zip => StatusCode::CONFLICT,
8b8e83329a1datagen2026-10-12 12:01 UTC102
        }
8b8e83329a1datagen2026-10-12 12:01 UTC103
    }
8b8e83329a1datagen2026-10-12 12:01 UTC104
8b8e83329a1datagen2026-10-12 12:01 UTC105
    pub fn problem(self) -> Problem {
8b8e83329a1datagen2026-10-12 12:01 UTC106
        Problem::new(self.status(), self.slug(), self.detail())
8b8e83329a1datagen2026-10-12 12:01 UTC107
    }
8b8e83329a1datagen2026-10-12 12:01 UTC108
}
8b8e83329a1datagen2026-10-12 12:01 UTC109
8b8e83329a1datagen2026-10-12 12:01 UTC110
pub struct Ending {
8b8e83329a1datagen2026-10-12 12:01 UTC111
    pub(crate) cause: Cause,
8b8e83329a1datagen2026-10-12 12:01 UTC112
    pub(crate) turn: u32,
8b8e83329a1datagen2026-10-12 12:01 UTC113
}
8b8e83329a1datagen2026-10-12 12:01 UTC114
8b8e83329a1datagen2026-10-12 12:01 UTC115
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
8b8e83329a1datagen2026-10-12 12:01 UTC116
pub enum RunStatus {
8b8e83329a1datagen2026-10-12 12:01 UTC117
    Alive,
8b8e83329a1datagen2026-10-12 12:01 UTC118
    Prescribed,
8b8e83329a1datagen2026-10-12 12:01 UTC119
    /// The true ending, the clinic's `304`.
8b8e83329a1datagen2026-10-12 12:01 UTC120
    Normal,
8b8e83329a1datagen2026-10-12 12:01 UTC121
    Gone,
8b8e83329a1datagen2026-10-12 12:01 UTC122
}
8b8e83329a1datagen2026-10-12 12:01 UTC123
8b8e83329a1datagen2026-10-12 12:01 UTC124
impl RunStatus {
8b8e83329a1datagen2026-10-12 12:01 UTC125
    pub const ALL: [Self; 4] = [Self::Alive, Self::Prescribed, Self::Normal, Self::Gone];
8b8e83329a1datagen2026-10-12 12:01 UTC126
8b8e83329a1datagen2026-10-12 12:01 UTC127
    pub fn name(self) -> &'static str {
8b8e83329a1datagen2026-10-12 12:01 UTC128
        match self {
8b8e83329a1datagen2026-10-12 12:01 UTC129
            Self::Alive => "alive",
8b8e83329a1datagen2026-10-12 12:01 UTC130
            Self::Prescribed => "prescribed",
8b8e83329a1datagen2026-10-12 12:01 UTC131
            Self::Normal => "normal",
8b8e83329a1datagen2026-10-12 12:01 UTC132
            Self::Gone => "gone",
8b8e83329a1datagen2026-10-12 12:01 UTC133
        }
8b8e83329a1datagen2026-10-12 12:01 UTC134
    }
8b8e83329a1datagen2026-10-12 12:01 UTC135
8b8e83329a1datagen2026-10-12 12:01 UTC136
    pub fn parse(name: &str) -> Option<Self> {
8b8e83329a1datagen2026-10-12 12:01 UTC137
        Self::ALL.into_iter().find(|status| status.name() == name)
8b8e83329a1datagen2026-10-12 12:01 UTC138
    }
8b8e83329a1datagen2026-10-12 12:01 UTC139
8b8e83329a1datagen2026-10-12 12:01 UTC140
    pub fn finished(self) -> bool {
8b8e83329a1datagen2026-10-12 12:01 UTC141
        self != Self::Alive
8b8e83329a1datagen2026-10-12 12:01 UTC142
    }
8b8e83329a1datagen2026-10-12 12:01 UTC143
}