pet_home_server/src/server/game/mod/quest/Quest.go
2025-08-26 11:59:12 +08:00

134 lines
3.2 KiB
Go

package quest
import (
"fmt"
"server/GoUtil"
"server/msg"
"strconv"
"strings"
)
const (
QUEST_STATUS_UNFINISH = 0
QUEST_STATUS_FINISH = 1
QUEST_STATUS_REWARD = 2
)
const (
TRIGGER_LABEL_MERGELVTIME = "MergeLvTime"
TRIGGER_LABEL_FINISHORDER = "FinishOrder"
TRIGGER_LABEL_ENERGY = "Energy"
TRIGGER_LABEL_STAR = "Star" // 收集宠物币
TRIGGER_LABEL_DIAMOND = "Diamond" // 消耗钻石
TRIGGER_LABEL_MERGETIME = "MergeTime"
TRIGGER_LABEL_STOKECAT = "StokeCat"
TRIGGER_LABEL_TAKECAT = "TakeCat"
TRIGGER_LABEL_PLAYCAT = "PlayCat"
TRIGGER_LABEL_FEEDCAT = "FeedCat"
TRIGGER_LABEL_CLEANCAT = "CleanCat"
TRIGGER_LABEL_UPLV = "UpLv" // 升级
TRIGGER_LABEL_LOGIN = "Login" // 登录
TRIGGER_LABEL_INTERACT = "Interact" // 互动
TRIGGER_LABEL_PETDRESS = "PetDress" // 宠物换装
TRIGGER_LABEL_VISITROOM = "VisitRoom" // 参观房间
TRIGGER_LABEL_PETTREASURE = "PetTreasure" // 宠物寻宝
TRIGGER_LABEL_ROOMDEC = "RoomDec" // 房间装饰
TRIGGER_LABEL_PETWORK = "PetWork" // 宠物工作
TRIGGER_LABEL_DECORATE = "Decorate" // 装饰
TRIGGER_LABEL_PURCHASE = "Purchase" // 购买任意物品
TRIGGER_LABEL_BUBBLE = "Bubble" // 使用钻石打开气泡
)
type QuestProgress struct {
Label string
Num int
Target int
Status bool
A []interface{}
}
type Trigger struct {
Label string
A []interface{}
}
func ParseQuest(s string) (QuestProgress, error) {
sArr := strings.Split(s, "=")
if len(sArr) < 2 {
return QuestProgress{}, fmt.Errorf("quest string not legel")
}
target, _ := strconv.Atoi(sArr[1])
return QuestProgress{
Label: sArr[0],
Target: target,
A: GoUtil.ToInterfaceSlice(sArr[2:]),
}, nil
}
func TriggerQuestProgress(q *QuestProgress, Tr *Trigger) bool {
if q.Label != Tr.Label {
return false
}
if q.Status {
return false
}
switch q.Label {
case TRIGGER_LABEL_ENERGY,
TRIGGER_LABEL_STAR,
TRIGGER_LABEL_DIAMOND,
TRIGGER_LABEL_DECORATE: // 消耗x能量
AddNum := Tr.A[0].(int)
q.Num += AddNum
case TRIGGER_LABEL_MERGELVTIME: // 合成x级棋子y次
Lv, _ := Tr.A[0].(int)
TargetLv, _ := strconv.Atoi(q.A[0].(string))
if TargetLv == Lv {
q.Num += 1
}
case TRIGGER_LABEL_MERGETIME, // 合成x次
TRIGGER_LABEL_FINISHORDER,
TRIGGER_LABEL_BUBBLE: // 完成x次订单
q.Num += 1
case TRIGGER_LABEL_INTERACT: // 互动x类型y次
InteractId := Tr.A[0].(int)
Ids := make([]int, 0)
for _, v := range q.A {
Ids = append(Ids, GoUtil.Int(v))
}
if GoUtil.InArray(InteractId, Ids) {
q.Num += 1
}
case TRIGGER_LABEL_PETDRESS: // 换装x次
if len(q.A) == 0 {
return false
}
DressType := GoUtil.Int(q.A[0])
Ids := Tr.A[0].([]int)
if GoUtil.InArray(DressType, Ids) {
q.Num += 1
}
default:
q.Num += 1
}
if q.Num >= q.Target {
q.Num = q.Target
q.Status = true
}
return true
}
func QuestProgressToMsg(quest *QuestProgress) *msg.QuestProgress {
Param := 0
if len(quest.A) > 0 {
Param, _ = strconv.Atoi(quest.A[0].(string))
}
return &msg.QuestProgress{
Label: quest.Label,
Num: int32(quest.Num),
Target: int32(quest.Target),
Status: quest.Status,
Param: int32(Param),
}
}