示例#1
0
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
}
示例#2
0
文件: engine.go 项目: Cristofori/kmud
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
				}
			}
		}
	}()
}
示例#3
0
文件: engine.go 项目: Cristofori/kmud
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()
			}
		}
	}()
}
示例#4
0
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
}