package sim // Stats är spelarens multiplikatorer: 1,0 = normalt. Debuffar (och i M8 // items/skills) ändrar dem. type Stats [5]float64 // Statindex. const ( StatSpeed = iota // gångfart StatThirst // hur fort dryckesmätaren sjunker (>1 = fortare) StatFocus // chans att lära av skyltar, hjälptid (>1 = bättre) StatToilet // hur fort toamätaren sjunker (>1 = fortare) StatLuck // omskanning, trängsel (>1 = bättre; items i M8) ) // DefaultStats är allt på 1,0. func DefaultStats() Stats { return Stats{1, 1, 1, 1, 1} } // DebuffKind är en typ av debuff (textnyckel: "debuff."). type DebuffKind string // Debuffar. De fyra första uppstår av spelandet (M7), resten delas ut av // sidouppdrag (M10) och varar 1–4 banor. const ( SoreFeet DebuffKind = "sore_feet" // många steg Tired DebuffKind = "tired" // lång bana Hangry DebuffKind = "hangry" // tom matmätare FoodPoisoning DebuffKind = "food_poisoning" // otur vid kiosken DOMS DebuffKind = "doms" // träningsvärk Blisters DebuffKind = "blisters" // skoskav HeavyBag DebuffKind = "heavy_bag" // köpt något tungt/stort Stuffed DebuffKind = "stuffed" // proppmätt Sweaty DebuffKind = "sweaty" // svettig och varm ) // DebuffEffects är vad varje debuff gör med statsen. var DebuffEffects = map[DebuffKind]Stats{ SoreFeet: {0.85, 1, 1, 1, 1}, Tired: {0.9, 1, 0.8, 1, 1}, Hangry: {1, 1.2, 0.7, 1, 1}, FoodPoisoning: {1, 1, 1, 2.0, 1}, DOMS: {0.9, 1, 1, 1, 1}, Blisters: {0.8, 1, 1, 1, 1}, HeavyBag: {0.9, 1.2, 1, 1, 1}, Stuffed: {0.9, 1, 1, 1.3, 1}, Sweaty: {1, 1.5, 0.9, 1, 1}, } // Utlösare för de spelgenererade debuffarna. const ( SoreFeetSteps = 150 TiredSec = 300.0 FoodPoisonChance = 0.05 FoodPoisonLevels = 2 ) // Debuff är en aktiv debuff med återstående antal banor. type Debuff struct { Kind DebuffKind `json:"kind"` LevelsLeft int `json:"levelsLeft"` } // CombinedStats multiplicerar ihop effekterna av alla debuffar. func CombinedStats(debuffs []Debuff) Stats { st := DefaultStats() for _, d := range debuffs { if e, ok := DebuffEffects[d.Kind]; ok { for i := range st { st[i] *= e[i] } } } return st } // Profile är det som följer spelaren mellan banor och inte hör till // kunskap eller plånbok: aktiva debuffar (items och skills i M8). type Profile struct { Debuffs []Debuff `json:"debuffs"` } // Add lägger till en debuff; finns den redan förlängs den till det längsta. func (p *Profile) Add(kind DebuffKind, levels int) { for i := range p.Debuffs { if p.Debuffs[i].Kind == kind { p.Debuffs[i].LevelsLeft = max(p.Debuffs[i].LevelsLeft, levels) return } } p.Debuffs = append(p.Debuffs, Debuff{Kind: kind, LevelsLeft: levels}) } // Has rapporterar om debuffen är aktiv. func (p *Profile) Has(kind DebuffKind) bool { for _, d := range p.Debuffs { if d.Kind == kind { return true } } return false } // EndLevel räknar ned alla debuffar en bana och tar bort de som gått ut. // Returnerar de som försvann. func (p *Profile) EndLevel() []DebuffKind { var expired []DebuffKind kept := p.Debuffs[:0] for _, d := range p.Debuffs { d.LevelsLeft-- if d.LevelsLeft <= 0 { expired = append(expired, d.Kind) continue } kept = append(kept, d) } p.Debuffs = kept return expired } // Stats är de sammanlagda multiplikatorerna just nu. func (p *Profile) Stats() Stats { return CombinedStats(p.Debuffs) }