You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
5.0 KiB
Go

package validevents
import (
"joybuywork/internal/repository/dbcheck"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/repository/withdefault"
"joybuywork/internal/service/cmm"
"joybuywork/internal/utils/timez"
"joybuywork/proto/go_proto/workerr"
"fmt"
"time"
"gorm.io/gen/field"
)
type grow struct {
base
}
func (s *grow) Event(user *model.FissionUser) (targetNum int32, setHelp bool, err error) {
fc := cmm.NewFirstCreate(s.Ctx, s.GetDao())
player, err := fc.FissionGrow(user)
if err != nil {
return
}
data, err := s._event(user)
if err != nil {
return
}
targetNum = data.targetNum
playerM := s.GetDao().FissionGrow
var upData []field.AssignExpr
for mark, num := range data.props {
switch mark {
case mtype.FissionCampaignTaskPropMarkChance:
upData = append(upData, playerM.GrowNum.Add(num), playerM.TaskNum.Add(num))
}
}
if len(upData) > 0 {
_, err = playerM.WithContext(s.Ctx).Where(playerM.ID.Eq(player.ID)).UpdateSimple(upData...)
if err != nil {
err = s.BE().MysqlError(err)
return
}
}
return
}
func (s *grow) Register(helper, beHelper *model.FissionUser) (setHelp bool, err error) {
tasks, setHelp, err := s._getRegisterTasks(helper.CampaignID)
if err != nil || len(tasks) == 0 {
return
}
err = s._fixTaskDo(beHelper, helper, tasks)
if err != nil {
return
}
return
}
func (s *grow) Install(helper, beHelper *model.FissionUser) (setHelp bool, err error) {
tasks, setHelp, err := s._getInstallTasks(helper.CampaignID)
if err != nil || len(tasks) == 0 {
return
}
err = s._fixTaskDo(beHelper, helper, tasks)
if err != nil {
return
}
return
}
// 用户固定事件任务
func (s *grow) _fixTaskDo(user, helper *model.FissionUser, tasks []*model.FissionCampaignTask) (err error) {
fc := cmm.NewFirstCreate(s.Ctx, s.GetDao())
player, err := fc.FissionGrow(user)
if err != nil {
return
}
for _, task := range tasks {
switch task.PropMark {
case mtype.FissionCampaignTaskPropMarkChance:
err = s._taskEffectDo(user, task, s._addGrow(player.ID, task.Chance))
if err != nil {
return
}
case mtype.FissionCampaignTaskPropMarkRevive:
//判断是否需要复活
err = s._revive(user, helper, task)
if err != nil {
return
}
}
}
return
}
// 复活
func (s *grow) _revive(user, helper *model.FissionUser, task *model.FissionCampaignTask) (err error) {
//判断是否死亡
lifeM := s.GetDao().FissionGrowLife
life, err := lifeM.WithContext(s.Ctx).Where(
lifeM.IsGrow.Eq(mtype.Yes),
lifeM.UserID.Eq(user.ID),
lifeM.CampaignID.Eq(user.CampaignID),
).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if life == nil {
return
}
// 对应时区的时间
now, dieTime := timez.GMTTime(s.tOffset), timez.GMTTime(s.tOffset, life.DieTime)
if dieTime.After(now) { // 没有死
return
}
// 不是死亡状态要修改成死亡状态
if life.IsDie == mtype.No {
err = cmm.NewCMM(s.Ctx, s.GetDao()).LifeStatus(life, true, 0)
if err != nil {
return
}
}
//死亡,判断是否复活
//死亡之后邀请的历史人数,当前
m := s.GetDao().FissionUserTaskValid
valid := withdefault.FissionUserTaskValid(&model.FissionUserTaskValid{
CampaignID: user.CampaignID,
UserID: user.ID,
TaskID: task.ID,
})
valid.SetIdeq(mtype.FissionCampaignTaskPropMarkRevive, fmt.Sprint(helper.ID))
has, err := m.WithContext(s.Ctx).Where(m.Ideq.Eq(valid.Ideq)).Count()
if err != nil {
err = s.BE().MysqlError(err)
return
}
if has == 0 {
if err = m.WithContext(s.Ctx).Create(valid); err != nil {
err = s.BE().MysqlError(err)
return
}
}
num, err := m.WithContext(s.Ctx).Where(
m.CampaignID.Eq(user.CampaignID),
m.UserID.Eq(user.ID),
m.TaskID.Eq(task.ID),
m.CreatedAt.Gt(life.DieTime),
).Count()
if err != nil {
return
}
if num < int64(task.Num) { // 不能完成复活
return
}
//邀请到足够的人复活
indicatorData := &mtype.IndicatorData{
InstallNum: num,
}
confM := s.GetDao().FissionCampaignGrow
conf, err := confM.WithContext(s.Ctx).Where(confM.CampaignID.Eq(user.CampaignID)).Take()
if err = dbcheck.DbError(err); err != nil {
err = s.BE().MysqlError(err)
return
}
if conf == nil {
return workerr.NotFound("conf not found")
}
err = cmm.NewCMM(s.Ctx, s.GetDao()).LifeStatus(life, true, 0)
if err != nil {
return
}
_, err = lifeM.WithContext(s.Ctx).Where(lifeM.ID.Eq(life.ID)).UpdateSimple(
lifeM.IsDie.Value(mtype.No),
lifeM.DieTime.Value(now.Add(time.Duration(conf.DieHour)*time.Hour).Unix()),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
err = s._taskRecord(user, task, indicatorData, mtype.No)
if err != nil {
return
}
return
}
// 增加养料
func (s *grow) _addGrow(playerId int64, chance int32) taskEffectDo {
return func() (err error) {
playerM := s.GetDao().FissionGrow
_, err = playerM.WithContext(s.Ctx).Where(playerM.ID.Eq(playerId)).UpdateSimple(
playerM.GrowNum.Add(chance),
playerM.TaskNum.Add(chance),
)
if err != nil {
err = s.BE().MysqlError(err)
return
}
return
}
}