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 } } } }() }
func (self *Session) Exec() { defer events.Unregister(self.pc) defer model.Logout(self.pc) self.WriteLine("Welcome, " + self.pc.GetName()) self.PrintRoom() // Main routine in charge of actually reading input from the connection object, // also has built in throttling to limit how fast we are allowed to process // commands from the user. go func() { defer func() { self.panicChannel <- recover() }() throttler := utils.NewThrottler(200 * time.Millisecond) for { mode := <-self.inputModeChannel prompter := <-self.prompterChannel input := "" switch mode { case CleanUserInput: input = utils.GetUserInputP(self.conn, prompter, self.user.GetColorMode()) case RawUserInput: input = utils.GetRawUserInputP(self.conn, prompter, self.user.GetColorMode()) default: panic("Unhandled case in switch statement (userInputMode)") } throttler.Sync() self.userInputChannel <- input } }() // Main loop for { input := self.getUserInputP(RawUserInput, self) if input == "" || input == "logout" || input == "quit" { return } if input == "." { input = self.lastInput } self.lastInput = input if strings.HasPrefix(input, "/") { self.handleCommand(utils.Argify(input[1:])) } else { self.handleAction(utils.Argify(input)) } } }
func manageWorld() { world := model.GetWorld() wer := &events.SimpleReceiver{} eventChannel := events.Register(wer) go func() { defer events.Unregister(wer) for { event := <-eventChannel switch event.(type) { case events.TickEvent: world.AdvanceTime() } } }() }