152 lines
3.7 KiB
Go
152 lines
3.7 KiB
Go
package linestory
|
|
|
|
import (
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/lego/sys/log"
|
|
"go_dreamfactory/pb"
|
|
"go_dreamfactory/utils"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
func (this *apiComp) DotaskCheck(session comm.IUserSession, req *pb.LinestoryDotaskReq) (code pb.ErrorCode) {
|
|
if req.TaskId == 0 || req.SubtaskId == 0 {
|
|
code = pb.ErrorCode_ReqParameterError
|
|
}
|
|
return
|
|
}
|
|
|
|
func (this *apiComp) Dotask(session comm.IUserSession, req *pb.LinestoryDotaskReq) (code pb.ErrorCode, data proto.Message) {
|
|
if code = this.DotaskCheck(session, req); code != pb.ErrorCode_Success {
|
|
return
|
|
}
|
|
|
|
rsp := &pb.LinestoryDotaskResp{}
|
|
|
|
defer func() {
|
|
if err := session.SendMsg(string(this.moduleLinestory.GetType()), LinestorySubTypeDotask, rsp); err != nil {
|
|
code = pb.ErrorCode_SystemError
|
|
return
|
|
}
|
|
}()
|
|
|
|
// task conf
|
|
conf := this.moduleLinestory.configure.getLinestoryTaskCfgById(req.TaskId)
|
|
if conf == nil {
|
|
code = pb.ErrorCode_ConfigNoFound
|
|
return
|
|
}
|
|
|
|
// stage conf
|
|
stageConf := this.moduleLinestory.configure.getLinestoryStageCfgById(req.SubtaskId)
|
|
if stageConf == nil {
|
|
code = pb.ErrorCode_ConfigNoFound
|
|
return
|
|
}
|
|
|
|
// 查询当前玩家的支线任务数据
|
|
dbLinestory := &pb.DBLinestory{}
|
|
if err := this.moduleLinestory.modelLinestory.Get(session.GetUserId(), dbLinestory); err != nil {
|
|
code = pb.ErrorCode_DBError
|
|
return
|
|
}
|
|
|
|
var curTask *pb.TaskNode //当前任务
|
|
|
|
if dbLinestory.Tasks == nil {
|
|
dbLinestory.Tasks = make(map[int32]*pb.TaskNode)
|
|
curTask = &pb.TaskNode{}
|
|
dbLinestory.Tasks[req.TaskId] = curTask
|
|
} else {
|
|
if v, ok := dbLinestory.Tasks[req.TaskId]; ok {
|
|
curTask = v
|
|
// 是否被禁止进入
|
|
if v.Status == 3 {
|
|
code = pb.ErrorCode_LinestoryTaskDisabledEnter
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
//校验前置
|
|
if conf.PreTId != -1 {
|
|
if tn, ok := dbLinestory.Tasks[conf.PreTId]; !ok {
|
|
code = pb.ErrorCode_LinestoryPreTaskNoFinished
|
|
return
|
|
} else {
|
|
if tn.Status != 2 {
|
|
code = pb.ErrorCode_LinestoryPreTaskNoFinished
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// 判此任务是否是结局
|
|
if conf.Ending == 0 && conf.Resetto != -1 {
|
|
// 重置任务
|
|
for k, _ := range dbLinestory.Tasks {
|
|
if k >= conf.Resetto {
|
|
delete(dbLinestory.Tasks, k)
|
|
}
|
|
}
|
|
// 设置当前任务为禁止
|
|
dbLinestory.Tasks[req.TaskId] = &pb.TaskNode{Status: 3}
|
|
}
|
|
|
|
// 校验子任务是否完成
|
|
if _, ok := utils.Findx(curTask.SubtaskIds, req.SubtaskId); ok {
|
|
code = pb.ErrorCode_LinestorySubTaskFinished
|
|
return
|
|
}
|
|
|
|
// 校验子任务前置是否完成
|
|
if stageConf.PreTId != -1 {
|
|
if _, ok := utils.Findx(curTask.SubtaskIds, stageConf.PreTId); !ok {
|
|
code = pb.ErrorCode_LinestoryPreTaskNoFinished
|
|
return
|
|
}
|
|
}
|
|
|
|
module, err := this.service.GetModule(comm.ModuleRtask)
|
|
if err != nil {
|
|
code = pb.ErrorCode_SystemError
|
|
return
|
|
}
|
|
//校验子任务完成条件
|
|
if m, ok := module.(comm.IRtask); ok {
|
|
for _, condiId := range stageConf.Cond {
|
|
if code = m.CheckCondi(session.GetUserId(), condiId); code != pb.ErrorCode_Success {
|
|
return
|
|
}
|
|
}
|
|
|
|
// 全部符合条件
|
|
curTask.SubtaskIds = append(curTask.SubtaskIds, req.SubtaskId)
|
|
if len(conf.StageTId) == len(curTask.SubtaskIds) {
|
|
curTask.Status = 2 //完成
|
|
// 发任务奖励
|
|
if code = this.moduleLinestory.DispenseRes(session, conf.Reward, true); code != pb.ErrorCode_Success {
|
|
log.Errorf("%v", code)
|
|
}
|
|
} else {
|
|
curTask.Status = 1 //进行中
|
|
}
|
|
dbLinestory.Tasks[conf.Id] = curTask
|
|
}
|
|
|
|
// 更新子任务
|
|
update := map[string]interface{}{
|
|
"tasks": dbLinestory.Tasks,
|
|
}
|
|
|
|
if err := this.moduleLinestory.modelLinestory.Change(session.GetUserId(), update); err != nil {
|
|
code = pb.ErrorCode_DBError
|
|
return
|
|
}
|
|
|
|
//派发子任务奖励
|
|
code = this.moduleLinestory.DispenseRes(session, stageConf.Reward, true)
|
|
|
|
return
|
|
}
|