package game import ( "fmt" "strings" "thehouseoficarus/internal/net" ) type commandHandler func(g *Game, sess *net.Session, args []string, rawInput string) type commandDef struct { handler commandHandler class CommandClass } var commandRegistry = map[string]commandDef{ "get": {(*Game).executeGet, ClassActive}, "take": {(*Game).executeGet, ClassActive}, "grab": {(*Game).executeGet, ClassActive}, "pick": {(*Game).executeGet, ClassActive}, "drop": {(*Game).executeDrop, ClassActive}, "attack": {(*Game).executeAttack, ClassActive}, "kill": {(*Game).executeAttack, ClassActive}, "work": {(*Game).executeWork, ClassActive}, "style": {(*Game).executeStyle, ClassInstant}, "look": {(*Game).executeLook, ClassInstant}, "l": {(*Game).executeLook, ClassInstant}, "north": {(*Game).executeMove, ClassActive}, "n": {(*Game).executeMove, ClassActive}, "south": {(*Game).executeMove, ClassActive}, "s": {(*Game).executeMove, ClassActive}, "east": {(*Game).executeMove, ClassActive}, "e": {(*Game).executeMove, ClassActive}, "west": {(*Game).executeMove, ClassActive}, "w": {(*Game).executeMove, ClassActive}, "northeast": {(*Game).executeMove, ClassActive}, "ne": {(*Game).executeMove, ClassActive}, "northwest": {(*Game).executeMove, ClassActive}, "nw": {(*Game).executeMove, ClassActive}, "southeast": {(*Game).executeMove, ClassActive}, "se": {(*Game).executeMove, ClassActive}, "southwest": {(*Game).executeMove, ClassActive}, "sw": {(*Game).executeMove, ClassActive}, "up": {(*Game).executeMove, ClassActive}, "u": {(*Game).executeMove, ClassActive}, "down": {(*Game).executeMove, ClassActive}, "d": {(*Game).executeMove, ClassActive}, "say": {(*Game).executeSay, ClassInstant}, "global": {(*Game).executeGlobal, ClassInstant}, "who": {(*Game).executeWho, ClassInstant}, "sc": {(*Game).executeScore, ClassInstant}, "score": {(*Game).executeScore, ClassInstant}, "skills": {(*Game).executeSkills, ClassInstant}, "sk": {(*Game).executeSkills, ClassInstant}, "task": {(*Game).executeTask, ClassInstant}, "stats": {(*Game).executeStats, ClassInstant}, "tech": {(*Game).executeTech, ClassInstant}, "t": {(*Game).executeTech, ClassInstant}, "i": {(*Game).executeInventory, ClassInstant}, "inv": {(*Game).executeInventory, ClassInstant}, "inventory": {(*Game).executeInventory, ClassInstant}, "quit": {(*Game).executeQuit, ClassActive}, "description": {(*Game).executeDescription, ClassInstant}, "desc": {(*Game).executeDescription, ClassInstant}, "option": {(*Game).executeOption, ClassInstant}, "options": {(*Game).executeOption, ClassInstant}, "color": {(*Game).executeColor, ClassInstant}, "colors": {(*Game).executeColor, ClassInstant}, "colortable": {(*Game).executeColortable, ClassInstant}, "prompt": {(*Game).executePrompt, ClassInstant}, "exits": {(*Game).executeExits, ClassInstant}, "map": {(*Game).executeMap, ClassInstant}, "symbol": {(*Game).executeSymbol, ClassInstant}, "queued": {(*Game).executeQueued, ClassInstant}, "help": {(*Game).executeHelp, ClassInstant}, "mine": {(*Game).executeGather, ClassActive}, "chop": {(*Game).executeGather, ClassActive}, "fish": {(*Game).executeGather, ClassActive}, "cut": {(*Game).executeGather, ClassActive}, "pull": {(*Game).executeUse, ClassActive}, "push": {(*Game).executeUse, ClassActive}, "use": {(*Game).executeUse, ClassActive}, "cook": {(*Game).executeCook, ClassActive}, "smelt": {(*Game).executeSmelt, ClassActive}, "smith": {(*Game).executeSmith, ClassActive}, "craft": {(*Game).executeCraft, ClassActive}, "eat": {(*Game).executeEat, ClassFree}, "drink": {(*Game).executeDrink, ClassFree}, "fletch": {(*Game).executeFletch, ClassFree}, "clean": {(*Game).executeClean, ClassFree}, "mix": {(*Game).executeMix, ClassActive}, "id": {(*Game).executeIdentify, ClassActive}, "identify": {(*Game).executeIdentify, ClassActive}, "autotrigger": {(*Game).executeAutotrigger, ClassInstant}, "auto": {(*Game).executeAutotrigger, ClassInstant}, "mods": {(*Game).executeMods, ClassInstant}, "modlist": {(*Game).executeMods, ClassInstant}, "mod": {(*Game).executeMods, ClassInstant}, "modules": {(*Game).executeMods, ClassInstant}, "module": {(*Game).executeMods, ClassInstant}, "sneak": {(*Game).executeSneak, ClassInstant}, "trigger": {(*Game).executeTrigger, ClassActive}, "home": {(*Game).executeHome, ClassInstant}, "recall": {(*Game).executeHome, ClassInstant}, "talk": {(*Game).executeTalk, ClassActive}, "speak": {(*Game).executeTalk, ClassActive}, "ask": {(*Game).executeTalk, ClassActive}, "burn": {(*Game).executeBurn, ClassActive}, "stoke": {(*Game).executeStoke, ClassActive}, "alias": {(*Game).executeAlias, ClassInstant}, "unalias": {(*Game).executeUnalias, ClassInstant}, "search": {(*Game).executeSearch, ClassActive}, "steal": {(*Game).executeSteal, ClassActive}, "thieve": {(*Game).executeSteal, ClassActive}, "plant": {(*Game).executePlant, ClassActive}, "harvest": {(*Game).executeHarvest, ClassActive}, "rake": {(*Game).executeRake, ClassActive}, "water": {(*Game).executeWater, ClassActive}, "cure": {(*Game).executeCure, ClassActive}, "inspect": {(*Game).executeInspect, ClassInstant}, "walk": {(*Game).executeWalk, ClassActive}, "bank": {(*Game).executeBank, ClassActive}, "list": {(*Game).executeShopList, ClassInstant}, "browse": {(*Game).executeShopList, ClassInstant}, "buy": {(*Game).executeShopBuy, ClassInstant}, "sell": {(*Game).executeShopSell, ClassInstant}, "construct": {(*Game).executeConstruct, ClassActive}, "make": {(*Game).executeConstruct, ClassActive}, "jack": {(*Game).executeJack, ClassActive}, "jackin": {(*Game).executeJack, ClassActive}, "eq": {(*Game).executeWear, ClassFree}, "equipment": {(*Game).executeWear, ClassFree}, "equip": {(*Game).executeWear, ClassFree}, "wear": {(*Game).executeWear, ClassFree}, "wield": {(*Game).executeWear, ClassFree}, "remove": {(*Game).executeRemove, ClassFree}, "unwear": {(*Game).executeRemove, ClassFree}, "unwield": {(*Game).executeRemove, ClassFree}, "aps": {(*Game).executeAps, ClassActive}, "verbs": {(*Game).executeVerbs, ClassInstant}, "what": {(*Game).executeVerbs, ClassInstant}, "syntax": {(*Game).executeVerbs, ClassInstant}, "commands": {(*Game).executeVerbs, ClassInstant}, "stop": {(*Game).executeStop, ClassInstant}, "hide": {(*Game).executeHide, ClassActive}, "safespot": {(*Game).executeHide, ClassActive}, "unhide": {(*Game).executeUnhide, ClassActive}, "unsafespot": {(*Game).executeUnhide, ClassActive}, "goto": {(*Game).executeGoto, ClassInstant}, "summon": {(*Game).executeSummon, ClassInstant}, "dig": {(*Game).executeDig, ClassInstant}, "setflag": {(*Game).executeSetFlag, ClassInstant}, "setplayerflag": {(*Game).executeSetPlayerFlag, ClassInstant}, "reload": {(*Game).executeReload, ClassInstant}, "shutdown": {(*Game).executeShutdown, ClassInstant}, "room": {(*Game).executeRoom, ClassInstant}, "swapid": {(*Game).executeSwapID, ClassInstant}, "undig": {(*Game).executeUndig, ClassInstant}, "close": {(*Game).executeClose, ClassInstant}, "god": {(*Game).executeGod, ClassInstant}, "ungod": {(*Game).executeUnGod, ClassInstant}, "hideallexits": {(*Game).executeHideAllExits, ClassInstant}, } func classifyCommand(cmd string) CommandClass { if def, ok := commandRegistry[cmd]; ok { return def.class } if _, ok := verbAliases[cmd]; ok { return ClassActive } if obstacleVerbs[cmd] { return ClassActive } return ClassUnknown } func (g *Game) executeCommand(sess *net.Session, cmd string, args []string, rawInput string) { if def, ok := commandRegistry[cmd]; ok { def.handler(g, sess, args, rawInput) return } if obstacleVerbs[cmd] { g.doObstacle(sess, cmd) return } p := sess.Player if a, ok := verbAliases[cmd]; ok { g.cancelAction(p) switch a { case "gather": if len(args) == 0 { target := g.defaultTarget(p.RoomID, cmd) if target == "" { sess.WriteLine(fmt.Sprintf("%s what?", cmd)) return } g.startAction(sess, cmd, target) } else { g.startAction(sess, cmd, strings.Join(args, " ")) } case "talk": if len(args) == 0 { sess.WriteLine("Talk to whom?") } else { g.startAction(sess, "talk", strings.Join(args, " ")) } } return } sess.WriteLine("Unknown command.") } func (g *Game) executeGather(sess *net.Session, args []string, rawInput string) { verb := strings.Fields(rawInput)[0] p := sess.Player g.cancelAction(p) if len(args) == 0 { target := g.defaultTarget(p.RoomID, verb) if target == "" { sess.WriteLine(fmt.Sprintf("%s what?", verb)) return } g.startAction(sess, verb, target) } else { g.startAction(sess, verb, strings.Join(args, " ")) } } func (g *Game) executeTalk(sess *net.Session, args []string, rawInput string) { p := sess.Player g.cancelAction(p) if len(args) == 0 { sess.WriteLine("Talk to whom?") } else { g.startAction(sess, "talk", strings.Join(args, " ")) } }