func manageNpc(npc types.NPC) { eventChannel := events.Register(npc) go func() { defer events.Unregister(npc) for { event := <-eventChannel switch e := event.(type) { case events.TickEvent: if npc.GetRoaming() { room := model.GetRoom(npc.GetRoomId()) exits := room.GetExits() exitToTake := utils.Random(0, len(exits)-1) model.MoveCharacter(npc, exits[exitToTake]) } case events.CombatStartEvent: if npc == e.Defender { combat.StartFight(npc, nil, e.Attacker) } case events.CombatStopEvent: if npc == e.Defender { combat.StopFight(npc) } case events.DeathEvent: if npc == e.Character { model.DeleteCharacter(npc.GetId()) return } } } }() }
"a": aAlias("attack"), "attack": { exec: func(s *Session, arg string) { charList := model.CharactersIn(s.pc.GetRoomId()) index := utils.BestMatch(arg, charList.Names()) if index == -1 { s.printError("Not found") } else if index == -2 { s.printError("Which one do you mean?") } else { defender := charList[index] if defender.GetId() == s.pc.GetId() { s.printError("You can't attack yourself") } else { combat.StartFight(s.pc, nil, defender) } } }, }, "c": aAlias("cast"), "cast": { exec: func(s *Session, arg string) { usage := func() { s.printError("Usage: cast <spell> [target]") } spell, targetName := utils.Argify(arg) if spell == "" { usage()