package game import ( "fmt" "strings" "thehouseoficarus/internal/combat" "thehouseoficarus/internal/net" "thehouseoficarus/internal/player" ) func (g *Game) executeTrigger(sess *net.Session, args []string, rawInput string) { g.doTrigger(sess, strings.Join(args, " ")) } func (g *Game) doTrigger(sess *net.Session, input string) { p := sess.Player input = strings.TrimSpace(input) if input == "" { sess.WriteLine("Trigger what? Type 'mods' to see available mods.") return } mod, targetArg := g.parseTriggerArgs(input, p.Level(player.Science)) if mod == nil { sess.WriteLine("Unknown mod. Type 'mods' to see available mods.") return } if p.Level(player.Science) < mod.Level { sess.WriteLine(fmt.Sprintf("You need level %d science to trigger %s.", mod.Level, mod.Name)) return } if !g.hasJunkCost(p, mod) { sess.WriteLine(fmt.Sprintf("You don't have enough junk to trigger %s.", mod.Name)) return } switch mod.Category { case ModCombat: g.triggerCombatMod(sess, p, mod, targetArg) case ModTransport: g.triggerTransport(sess, p, mod) case ModUtility: g.triggerUtility(sess, p, mod, targetArg) case ModEnchant: g.triggerEnchant(sess, p, mod, targetArg) } } func (g *Game) parseTriggerArgs(input string, sciLevel int) (*ModDef, string) { lower := strings.ToLower(input) words := strings.Fields(lower) for i := len(words); i > 0; i-- { candidate := strings.Join(words[:i], " ") mod := FindModForPlayer(candidate, sciLevel) if mod != nil { target := strings.TrimSpace(strings.Join(words[i:], " ")) return mod, target } } return nil, "" } func (g *Game) triggerCombatMod(sess *net.Session, p *player.Player, mod *ModDef, targetArg string) { if cs := combat.GetCombat(p.Name); cs != nil { p.QueuedTrigger = mod.ID sess.WriteLine(fmt.Sprintf("You queue %s for your next attack.", mod.Name)) return } if p.Action != nil { g.cancelAction(p) } var mobTarget string if targetArg == "" { mobTarget = g.resolveDefaultMob(p.RoomID) if mobTarget == "" { sess.WriteLine("Trigger on what?") return } } else { mobTarget = targetArg } mob := g.findMob(sess, mobTarget, p.RoomID) if mob == nil { return } if mob.HP <= 0 { sess.WriteLine("That is already dead.") return } if mob.Protected { sess.WriteLine(fmt.Sprintf("You can't attack %s!", mobDisplayName(mob, true))) return } if combat.IsMobInCombat(mob.InstanceID) { sess.WriteLine(fmt.Sprintf("%s is already engaged in combat!", mobDisplayName(mob, false))) return } if g.hasDeckEquipped(p) { p.AutotriggerMod = mod.ID } else { p.QueuedTrigger = mod.ID } g.startCombat(sess, p, mob) }