diff --git a/game/task/events.go b/game/task/events.go new file mode 100644 index 0000000..00dd3eb --- /dev/null +++ b/game/task/events.go @@ -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) + } +} diff --git a/game/task/options.go b/game/task/options.go new file mode 100644 index 0000000..16d949e --- /dev/null +++ b/game/task/options.go @@ -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 + } +} diff --git a/game/task/state.go b/game/task/state.go new file mode 100644 index 0000000..75d6d07 --- /dev/null +++ b/game/task/state.go @@ -0,0 +1,10 @@ +package task + +const ( + StateDoing State = iota // 进行中 + StateDone // 已完成 + StateReward // 已领取 +) + +// State 任务状态 +type State byte diff --git a/game/task/task.go b/game/task/task.go new file mode 100644 index 0000000..361b245 --- /dev/null +++ b/game/task/task.go @@ -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 +}