装饰优化
This commit is contained in:
parent
e00a2292ae
commit
25a9032e6d
@ -5,6 +5,7 @@ import (
|
||||
"server/gamedata"
|
||||
"server/pkg/github.com/name5566/leaf/log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -88,21 +89,21 @@ func GetProgressReward(Scene, Lv int) []*item.Item {
|
||||
}
|
||||
for _, v := range value {
|
||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
return gamedata.GetItemList(v, "Item")
|
||||
return gamedata.GetItemList(v, "AreaReward")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDecoarteReward(Scene int) []*item.Item {
|
||||
func GetDecoarteReward(Scene int, Lv int) []*item.Item {
|
||||
value, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("IndoorProgress GetDecoarteReward not found")
|
||||
return nil
|
||||
}
|
||||
for _, v := range value {
|
||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == 1 {
|
||||
return gamedata.GetItemList(v, "AreaReward")
|
||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
return gamedata.GetItemList(v, "Item")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@ -150,3 +151,52 @@ func GetDecoratePExp(AreaId, SortId int) int {
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetAllPartId() []int {
|
||||
data, err := gamedata.GetDataByKey(DECORATE_COST, "AllPartId")
|
||||
if err != nil {
|
||||
log.Debug("DecorateCost GetAllPartId not found")
|
||||
return []int{1, 2, 3, 4}
|
||||
}
|
||||
var PartIdList []int
|
||||
str := gamedata.GetStringValue(data, "Value")
|
||||
r1 := strings.Split(str, ",")
|
||||
for _, v := range r1 {
|
||||
id, _ := strconv.Atoi(v)
|
||||
PartIdList = append(PartIdList, id)
|
||||
}
|
||||
return PartIdList
|
||||
}
|
||||
|
||||
func GetIdBySenceAndLv(Sence, Lv int) int {
|
||||
data, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||
if err != nil {
|
||||
log.Debug("DecorateArea GetIdBySenceAndLv not found")
|
||||
return 0
|
||||
}
|
||||
for k, v := range data {
|
||||
if gamedata.GetIntValue(v, "Scene") == Sence && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||
id, _ := strconv.Atoi(k)
|
||||
return id
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func GetPartNumByAreaId(AreaId int) map[int]int {
|
||||
data, err := gamedata.GetDataByIntKey(INDOOR_PROGRESS, AreaId)
|
||||
if err != nil {
|
||||
log.Debug("DecorateArea GetPartNumByAreaId not found AreaId:%v", AreaId)
|
||||
return nil
|
||||
}
|
||||
res := make(map[int]int)
|
||||
for k, v := range data {
|
||||
Sence := gamedata.GetIntValue(v, "Scene")
|
||||
if Sence != AreaId {
|
||||
continue
|
||||
}
|
||||
id, _ := strconv.Atoi(k)
|
||||
res[id] = gamedata.GetIntValue(v, "Part")
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
@ -404,7 +404,7 @@ func ReqDecorate(player *Player, buf []byte) error {
|
||||
DecorateId := int(req.DecorateId)
|
||||
AreaId := int(req.AreaId)
|
||||
CostItem, PetExp := DecorateMod.GetDecorateCostItem(AreaId, DecorateId)
|
||||
err := player.HandleItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
|
||||
err := player.HandleLoseItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
|
||||
if err != nil {
|
||||
player.SendErrClienRes(&msg.ResDecorate{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
@ -481,7 +481,7 @@ func ReqDecorateAll(player *Player, buf []byte) error {
|
||||
}
|
||||
PlayerBaseMod := player.GetPlayerBaseMod()
|
||||
CostItem, AddItem, DecorateNum, DecorateList, Log, PetExp := DecorateMod.DecorateAll(PlayerBaseMod.GetStar())
|
||||
err := player.HandleItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
|
||||
err := player.HandleLoseItem(CostItem, msg.ITEM_POP_LABEL_DecorateCost.String()) // 扣除道具
|
||||
if err != nil {
|
||||
player.SendErrClienRes(&msg.ResDecorateAll{
|
||||
Code: msg.RES_CODE_FAIL,
|
||||
|
||||
@ -15,6 +15,14 @@ type Decorate struct {
|
||||
Progress int
|
||||
DecorateNum int
|
||||
AreaReward []int
|
||||
PartPool map[int]int
|
||||
PartClassPool []int
|
||||
PartCost map[int]*PartCostInfo
|
||||
LastPart []int
|
||||
}
|
||||
|
||||
type PartCostInfo struct {
|
||||
Items []*item.Item
|
||||
}
|
||||
|
||||
func (d *Decorate) InitData() {
|
||||
@ -22,6 +30,15 @@ func (d *Decorate) InitData() {
|
||||
d.AreaId = 1
|
||||
d.FinishList = make(map[int]struct{})
|
||||
}
|
||||
if d.PartCost == nil {
|
||||
d.PartCost = make(map[int]*PartCostInfo)
|
||||
}
|
||||
if d.PartPool == nil {
|
||||
d.PartPool = make(map[int]int)
|
||||
}
|
||||
if len(d.PartCost) == 0 {
|
||||
d.initPartCost(d.AreaId)
|
||||
}
|
||||
}
|
||||
|
||||
// 装饰
|
||||
@ -39,11 +56,14 @@ func (d *Decorate) Decorate(areaId int, decorateId int) ([]*item.Item, error) {
|
||||
d.FinishList[decorateId] = struct{}{}
|
||||
d.Progress += 1
|
||||
Item := decorateCfg.GetProgressReward(areaId, d.Progress)
|
||||
Item1 := decorateCfg.GetDecoarteReward(areaId, decorateId)
|
||||
Item = append(Item, Item1...)
|
||||
if d.Progress >= len(SortList) {
|
||||
d.AreaId++
|
||||
d.Progress = 0
|
||||
d.FinishList = make(map[int]struct{})
|
||||
}
|
||||
|
||||
d.DecorateNum++
|
||||
return Item, nil
|
||||
}
|
||||
@ -58,7 +78,17 @@ func (d *Decorate) GetDecorateAddEnergy(cnt int) []*item.Item {
|
||||
func (d *Decorate) GetDecorateCostItem(AreaId, DecorateId int) ([]*item.Item, int) {
|
||||
Item := decorateCfg.GetStarCost(AreaId, DecorateId)
|
||||
PetExp := decorateCfg.GetDecoratePExp(AreaId, DecorateId)
|
||||
return []*item.Item{item.NewItem(item.ITEM_STAR_ID, -Item)}, PetExp
|
||||
Id := decorateCfg.GetIdBySenceAndLv(AreaId, DecorateId)
|
||||
Items := []*item.Item{item.NewItem(item.ITEM_STAR_ID, Item)}
|
||||
PartItem := d.PartCost[Id]
|
||||
if PartItem != nil {
|
||||
Items = append(Items, PartItem.Items...)
|
||||
delete(d.PartCost, Id)
|
||||
}
|
||||
if len(d.PartCost) == 0 {
|
||||
d.initPartCost(d.AreaId)
|
||||
}
|
||||
return Items, PetExp
|
||||
}
|
||||
|
||||
func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int, []interface{}, int) {
|
||||
@ -66,6 +96,7 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
|
||||
SubAlice := GoUtil.SubSlices(DecorateAll, GoUtil.MapIntToIntSlice(d.FinishList))
|
||||
sort.Ints(SubAlice)
|
||||
SubItem := 0
|
||||
SubItems := make([]*item.Item, 0)
|
||||
AddItem := make([]*item.Item, 0)
|
||||
DecorateList := make([]int, 0)
|
||||
Log := make([]interface{}, 0)
|
||||
@ -79,10 +110,17 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
|
||||
Star -= NeedStar
|
||||
SubItem += NeedStar
|
||||
d.FinishList[v] = struct{}{}
|
||||
Id := decorateCfg.GetIdBySenceAndLv(d.AreaId, d.Progress)
|
||||
PartItem := d.PartCost[Id]
|
||||
if PartItem != nil {
|
||||
SubItems = append(SubItems, PartItem.Items...)
|
||||
delete(d.PartCost, Id)
|
||||
}
|
||||
d.Progress++
|
||||
d.DecorateNum++
|
||||
Num++
|
||||
Item := decorateCfg.GetProgressReward(d.AreaId, d.Progress)
|
||||
Item = append(Item, decorateCfg.GetDecoarteReward(d.AreaId, v)...)
|
||||
if len(Item) > 0 {
|
||||
if d.Progress >= len(DecorateAll) {
|
||||
Log = append(Log, map[string]interface{}{
|
||||
@ -107,16 +145,27 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
|
||||
d.Progress = 0
|
||||
d.FinishList = make(map[int]struct{})
|
||||
}
|
||||
|
||||
return []*item.Item{item.NewItem(item.ITEM_STAR_ID, -SubItem)}, AddItem, Num, DecorateList, Log, PetExp
|
||||
if len(d.PartCost) == 0 {
|
||||
d.initPartCost(d.AreaId)
|
||||
}
|
||||
SubItems = append(SubItems, item.NewItem(item.ITEM_STAR_ID, SubItem))
|
||||
return SubItems, AddItem, Num, DecorateList, Log, PetExp
|
||||
}
|
||||
|
||||
// 获取装饰信息
|
||||
func (d *Decorate) BackData() *msg.ResDecorateInfo {
|
||||
PartRes := []*msg.DecoratePart{}
|
||||
for k, v := range d.PartCost {
|
||||
PartRes = append(PartRes, &msg.DecoratePart{
|
||||
Id: int32(k),
|
||||
Items: item.ItemToMsg(v.Items),
|
||||
})
|
||||
}
|
||||
return &msg.ResDecorateInfo{
|
||||
AreaId: int32(d.AreaId),
|
||||
MFinishList: GoUtil.MapIntToSlice(d.FinishList),
|
||||
RewardArea: GoUtil.IntToInt32(d.AreaReward),
|
||||
Parts: PartRes,
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,7 +174,7 @@ func (d *Decorate) GetDecorateReward(areaId int) ([]*item.Item, error) {
|
||||
return nil, fmt.Errorf("areaId already rewarded")
|
||||
}
|
||||
d.AreaReward = append(d.AreaReward, areaId)
|
||||
return decorateCfg.GetDecoarteReward(areaId), nil
|
||||
return decorateCfg.GetDecoarteReward(areaId, 20), nil
|
||||
}
|
||||
|
||||
func (d *Decorate) GetAreaId() int {
|
||||
@ -139,3 +188,94 @@ func (d *Decorate) GetProgress() int {
|
||||
func (d *Decorate) GetDecorateNum() int {
|
||||
return d.DecorateNum
|
||||
}
|
||||
|
||||
func (d *Decorate) GetPart(Num int) map[int]int {
|
||||
d.initPartPool()
|
||||
res := make(map[int]int, 0)
|
||||
ClassNum := min(Num, 3)
|
||||
ClassList := d.GetPartClass(ClassNum)
|
||||
NewClassList := d.sortClass(ClassList)
|
||||
for i := range Num {
|
||||
Class := NewClassList[i%ClassNum]
|
||||
d.PartPool[Class]--
|
||||
res[Class]++
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (d *Decorate) sortClass(Class []int) []int {
|
||||
d.initPartPool()
|
||||
type sortClass struct {
|
||||
Id int
|
||||
Num int
|
||||
}
|
||||
sortList := make([]sortClass, 0)
|
||||
for _, v := range Class {
|
||||
sortList = append(sortList, sortClass{
|
||||
Id: v,
|
||||
Num: d.PartPool[v],
|
||||
})
|
||||
}
|
||||
sort.Slice(sortList, func(i, j int) bool {
|
||||
return sortList[i].Num > sortList[j].Num
|
||||
})
|
||||
res := make([]int, 0)
|
||||
for _, v := range sortList {
|
||||
res = append(res, v.Id)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (d *Decorate) GetPartClass(Num int) []int {
|
||||
res := []int{}
|
||||
Id := 0
|
||||
for range Num {
|
||||
if len(d.PartClassPool) == 0 {
|
||||
d.initPartClassPool()
|
||||
}
|
||||
Id, d.PartClassPool = GoUtil.PopSlice(d.PartClassPool)
|
||||
res = append(res, Id)
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (d *Decorate) initPartClassPool() {
|
||||
if len(d.PartClassPool) == 0 {
|
||||
ClassList := decorateCfg.GetAllPartId()
|
||||
r1 := GoUtil.SubSlices(ClassList, d.LastPart)
|
||||
c1 := GoUtil.RandSlice(r1)
|
||||
r2 := GoUtil.SubSlices(ClassList, []int{c1})
|
||||
r3 := GoUtil.ShuffleArray(r2)
|
||||
d.PartClassPool = append([]int{c1}, r3...)
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Decorate) initPartPool() {
|
||||
IsEmpty := true
|
||||
for _, v := range d.PartPool {
|
||||
if v > 0 {
|
||||
IsEmpty = false
|
||||
break
|
||||
}
|
||||
}
|
||||
if IsEmpty {
|
||||
PartList := decorateCfg.GetAllPartId()
|
||||
for _, v := range PartList {
|
||||
d.PartPool[v] = 7
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Decorate) initPartCost(AreaId int) {
|
||||
PartList := decorateCfg.GetPartNumByAreaId(AreaId)
|
||||
for k, v := range PartList {
|
||||
PartList := d.GetPart(v)
|
||||
Items := make([]*item.Item, 0)
|
||||
for k1, v1 := range PartList {
|
||||
Items = append(Items, item.NewItem(k1, v1))
|
||||
}
|
||||
d.PartCost[k] = &PartCostInfo{
|
||||
Items: Items,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user