feat: 增加任务功能

This commit is contained in:
kercylan98 2023-07-08 14:35:47 +08:00
parent b151de3f00
commit bdeaa5aeb3
4 changed files with 126 additions and 0 deletions

32
game/task/events.go Normal file
View File

@ -0,0 +1,32 @@
package task
type (
TaskDoneEventHandle func(eventId int64, task *Task)
)
var taskDoneEventHandles = make(map[int64]map[int64]TaskDoneEventHandle)
// RegTaskDoneEvent 注册任务完成事件
func RegTaskDoneEvent(id int64, eventId int64, handle TaskDoneEventHandle) {
events, exist := taskDoneEventHandles[id]
if !exist {
events = map[int64]TaskDoneEventHandle{}
taskDoneEventHandles[id] = events
}
events[eventId] = handle
}
// UnRegTaskDoneEvent 取消注册任务完成事件
func UnRegTaskDoneEvent(id int64, eventId int64) {
events, exist := taskDoneEventHandles[id]
if exist {
delete(events, eventId)
}
}
// OnTaskDoneEvent 任务完成事件
func OnTaskDoneEvent(task *Task) {
for eventId, handle := range taskDoneEventHandles[task.id] {
handle(eventId, task)
}
}

17
game/task/options.go Normal file
View File

@ -0,0 +1,17 @@
package task
type Option func(task *Task)
// WithInitCount 通过初始化计数的方式创建任务
func WithInitCount(count int) Option {
return func(task *Task) {
task.count = count
}
}
// WithDone 通过指定任务完成计数的方式创建任务
func WithDone(done int) Option {
return func(task *Task) {
task.done = done
}
}

10
game/task/state.go Normal file
View File

@ -0,0 +1,10 @@
package task
const (
StateDoing State = iota // 进行中
StateDone // 已完成
StateReward // 已领取
)
// State 任务状态
type State byte

67
game/task/task.go Normal file
View File

@ -0,0 +1,67 @@
package task
// NewTask 新建任务
func NewTask(id int64, options ...Option) *Task {
task := &Task{
id: id,
}
for _, option := range options {
option(task)
}
if task.count > task.done {
task.count = task.done
}
task.Add(0)
return task
}
type Task struct {
id int64 // 任务ID
count int // 任务计数
done int // 任务完成计数
reward bool // 是否已领取奖励
}
// Reset 重置任务
func (slf *Task) Reset() {
slf.count = 0
slf.reward = false
switch slf.GetState() {
case StateDone:
OnTaskDoneEvent(slf)
}
}
// Add 增加任务计数
func (slf *Task) Add(count int) {
if count != 0 {
slf.count += count
if slf.count < 0 {
slf.count = 0
} else if slf.count > slf.done {
slf.count = slf.done
}
}
switch slf.GetState() {
case StateDone:
OnTaskDoneEvent(slf)
}
}
// GetState 获取任务状态
func (slf *Task) GetState() State {
if slf.count >= slf.done {
if slf.reward {
return StateReward
}
return StateDone
}
return StateDoing
}
// Reward 返回是否领取过奖励,并且设置任务为领取过奖励的状态
func (slf *Task) Reward() bool {
reward := slf.reward
slf.reward = true
return reward
}