vRp.CD2g_test/game/fight
kercylan98 22449ff5c3 docs: 优化 README.md 可读性 2024-01-15 17:27:02 +08:00
..
README.md docs: 优化 README.md 可读性 2024-01-15 17:27:02 +08:00
turn_based.go feat: fight.TurnBased 支持监听回合变更以及刷新当前操作回合超时时间 2023-10-17 15:47:15 +08:00
turn_based_controller.go feat: fight.TurnBased 支持监听回合变更以及刷新当前操作回合超时时间 2023-10-17 15:47:15 +08:00
turn_based_events.go feat: fight.TurnBased 支持监听回合变更以及刷新当前操作回合超时时间 2023-10-17 15:47:15 +08:00
turn_based_test.go feat: fight.TurnBased 支持监听回合变更以及刷新当前操作回合超时时间 2023-10-17 15:47:15 +08:00

README.md

Fight

Go doc

暂无介绍...

目录导航

列出了该 package 下所有的函数及类型定义,可通过目录导航进行快捷跳转 ❤️

展开 / 折叠目录导航

包级函数定义

函数名称 描述
NewTurnBased 创建一个新的回合制

类型定义

类型 名称 描述
STRUCT TurnBased 回合制
INTERFACE TurnBasedControllerInfo 暂无描述...
INTERFACE TurnBasedControllerAction 暂无描述...
STRUCT TurnBasedController 回合制控制器
STRUCT TurnBasedEntitySwitchEventHandler 暂无描述...

详情信息

func NewTurnBased[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]](calcNextTurnDuration func ( Camp, Entity) time.Duration) *TurnBased[CampID, EntityID, Camp, Entity]

创建一个新的回合制

  • calcNextTurnDuration 将返回下一次行动时间间隔,适用于按照速度计算下一次行动时间间隔的情况。当返回 0 时,将使用默认的行动超时时间

TurnBased STRUCT

回合制

type TurnBased[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]] struct {
	*turnBasedEvents[CampID, EntityID, Camp, Entity]
	controller           *TurnBasedController[CampID, EntityID, Camp, Entity]
	ticker               *time.Ticker
	actionWaitTicker     *time.Ticker
	actioning            bool
	actionMutex          sync.RWMutex
	entities             []Entity
	campRel              map[EntityID]Camp
	calcNextTurnDuration func(Camp, Entity) time.Duration
	actionTimeoutHandler func(Camp, Entity) time.Duration
	signal               chan signal
	round                int
	currCamp             Camp
	currEntity           Entity
	currActionTimeout    time.Duration
	currStart            time.Time
	closeMutex           sync.RWMutex
	closed               bool
}

func (*TurnBased) Close()

关闭回合制


func (*TurnBased) AddCamp(camp Camp, entity Entity, entities ...Entity)

添加阵营


func (*TurnBased) SetActionTimeout(actionTimeoutHandler func ( Camp, Entity) time.Duration)

设置行动超时时间处理函数

  • 默认情况下行动超时时间函数将始终返回 0

func (*TurnBased) Run()

运行

查看 / 收起单元测试

func TestTurnBased_Run(t *testing.T) {
	tbi := fight.NewTurnBased[string, string, *Camp, *Entity](func(camp *Camp, entity *Entity) time.Duration {
		return time.Duration(float64(time.Second) / entity.speed)
	})
	tbi.SetActionTimeout(func(camp *Camp, entity *Entity) time.Duration {
		return time.Second * 5
	})
	tbi.RegTurnBasedEntityActionTimeoutEvent(func(controller fight.TurnBasedControllerInfo[string, string, *Camp, *Entity]) {
		t.Log("时间", time.Now().Unix(), "回合", controller.GetRound(), "阵营", controller.GetCamp().GetId(), "实体", controller.GetEntity().GetId(), "超时")
	})
	tbi.RegTurnBasedRoundChangeEvent(func(controller fight.TurnBasedControllerInfo[string, string, *Camp, *Entity]) {
		t.Log("时间", time.Now().Unix(), "回合", controller.GetRound(), "回合切换")
	})
	tbi.RegTurnBasedEntitySwitchEvent(func(controller fight.TurnBasedControllerAction[string, string, *Camp, *Entity]) {
		switch controller.GetEntity().GetId() {
		case "1":
			go func() {
				time.Sleep(time.Second * 2)
				controller.Finish()
			}()
		case "2":
			controller.Refresh(time.Second)
		case "4":
			controller.Stop()
		}
		t.Log("时间", time.Now().Unix(), "回合", controller.GetRound(), "阵营", controller.GetCamp().GetId(), "实体", controller.GetEntity().GetId(), "开始行动")
	})
	tbi.AddCamp(&Camp{id: "1"}, &Entity{id: "1", speed: 1}, &Entity{id: "2", speed: 1})
	tbi.AddCamp(&Camp{id: "2"}, &Entity{id: "3", speed: 1}, &Entity{id: "4", speed: 1})
	tbi.Run()
}


TurnBasedControllerInfo INTERFACE

type TurnBasedControllerInfo[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]] interface {
	GetRound() int
	GetCamp() Camp
	GetEntity() Entity
	GetActionTimeoutDuration() time.Duration
	GetActionStartTime() time.Time
	GetActionEndTime() time.Time
	Stop()
}

TurnBasedControllerAction INTERFACE

type TurnBasedControllerAction[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]] interface {
	TurnBasedControllerInfo[CampID, EntityID, Camp, Entity]
	Finish()
	Refresh(duration time.Duration) time.Time
}

TurnBasedController STRUCT

回合制控制器

type TurnBasedController[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]] struct {
	tb *TurnBased[CampID, EntityID, Camp, Entity]
}

func (*TurnBasedController) GetRound() int

获取当前回合数


func (*TurnBasedController) GetCamp() Camp

获取当前操作阵营


func (*TurnBasedController) GetEntity() Entity

获取当前操作实体


func (*TurnBasedController) GetActionTimeoutDuration() time.Duration

获取当前行动超时时长


func (*TurnBasedController) GetActionStartTime() time.Time

获取当前行动开始时间


func (*TurnBasedController) GetActionEndTime() time.Time

获取当前行动结束时间


func (*TurnBasedController) Finish()

结束当前操作,将立即切换到下一个操作实体


func (*TurnBasedController) Stop()

在当前回合执行完毕后停止回合进程


func (*TurnBasedController) Refresh(duration time.Duration) time.Time

刷新当前操作实体的行动超时时间

  • 当不在行动阶段时,将返回 time.Time 零值

TurnBasedEntitySwitchEventHandler STRUCT

type TurnBasedEntitySwitchEventHandler[CampID comparable, EntityID comparable, Camp generic.IdR[CampID], Entity generic.IdR[EntityID]] func(controller TurnBasedControllerAction[CampID, EntityID, Camp, Entity])