func NewSession(conn io.ReadWriter, user types.User, pc types.PC) *Session { var session Session session.conn = conn session.user = user session.pc = pc session.prompt = "%h/%H> " session.states = map[string]string{} session.userInputChannel = make(chan string) session.inputModeChannel = make(chan userInputMode) session.prompterChannel = make(chan utils.Prompter) session.panicChannel = make(chan interface{}) session.eventChannel = events.Register(pc) session.silentMode = false // file, err := os.OpenFile(pc.GetName()+".log", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.ModePerm) // utils.PanicIfError(err) // session.logger = log.New(file, pc.GetName()+" ", log.LstdFlags) model.Login(pc) return &session }
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 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() } } }() }
func (s *CombatSuite) TestCombatLoop(c *C) { char1 := testutils.NewMockPC() char2 := testutils.NewMockPC() char1.RoomId = char2.RoomId eventChannel1 := events.Register(char1) eventChannel2 := events.Register(char2) StartFight(char1, nil, char2) c.Assert(InCombat(char1), Equals, true) c.Assert(InCombat(char2), Equals, true) verifyEvents := func(channel chan events.Event) { gotCombatEvent := false gotStartEvent := false Loop: for { select { case event := <-channel: switch event.(type) { case events.TickEvent: case events.CombatEvent: gotCombatEvent = true case events.CombatStartEvent: gotStartEvent = true default: c.FailNow() } case <-time.After(30 * time.Millisecond): c.Fatalf("Timed out waiting for combat event") break Loop } if gotCombatEvent && gotStartEvent { break } } } verifyEvents(eventChannel1) verifyEvents(eventChannel2) StopFight(char1) e := <-eventChannel1 switch e.(type) { case events.CombatStopEvent: default: c.Fatalf("Didn't get a combat stop event (channel 1)") } e = <-eventChannel2 switch e.(type) { case events.CombatStopEvent: default: c.Fatalf("Didn't get a combat stop event (channel 1)") } select { case e := <-eventChannel1: c.Fatalf("Shouldn't have gotten any combat events after stopping combat (channel 1) - %s", e) case e := <-eventChannel2: c.Fatalf("Shouldn't have gotten any combat events after stopping combat (channel 2) - %s", e) case <-time.After(20 * time.Millisecond): } StartFight(char1, nil, char2) <-eventChannel1 <-eventChannel2 }