装饰优化
This commit is contained in:
parent
e00a2292ae
commit
25a9032e6d
@ -5,6 +5,7 @@ import (
|
|||||||
"server/gamedata"
|
"server/gamedata"
|
||||||
"server/pkg/github.com/name5566/leaf/log"
|
"server/pkg/github.com/name5566/leaf/log"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -88,21 +89,21 @@ func GetProgressReward(Scene, Lv int) []*item.Item {
|
|||||||
}
|
}
|
||||||
for _, v := range value {
|
for _, v := range value {
|
||||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||||
return gamedata.GetItemList(v, "Item")
|
return gamedata.GetItemList(v, "AreaReward")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetDecoarteReward(Scene int) []*item.Item {
|
func GetDecoarteReward(Scene int, Lv int) []*item.Item {
|
||||||
value, err := gamedata.GetData(INDOOR_PROGRESS)
|
value, err := gamedata.GetData(INDOOR_PROGRESS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debug("IndoorProgress GetDecoarteReward not found")
|
log.Debug("IndoorProgress GetDecoarteReward not found")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for _, v := range value {
|
for _, v := range value {
|
||||||
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == 1 {
|
if gamedata.GetIntValue(v, "Scene") == Scene && gamedata.GetIntValue(v, "Lv") == Lv {
|
||||||
return gamedata.GetItemList(v, "AreaReward")
|
return gamedata.GetItemList(v, "Item")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -150,3 +151,52 @@ func GetDecoratePExp(AreaId, SortId int) int {
|
|||||||
}
|
}
|
||||||
return 0
|
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)
|
DecorateId := int(req.DecorateId)
|
||||||
AreaId := int(req.AreaId)
|
AreaId := int(req.AreaId)
|
||||||
CostItem, PetExp := DecorateMod.GetDecorateCostItem(AreaId, DecorateId)
|
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 {
|
if err != nil {
|
||||||
player.SendErrClienRes(&msg.ResDecorate{
|
player.SendErrClienRes(&msg.ResDecorate{
|
||||||
Code: msg.RES_CODE_FAIL,
|
Code: msg.RES_CODE_FAIL,
|
||||||
@ -481,7 +481,7 @@ func ReqDecorateAll(player *Player, buf []byte) error {
|
|||||||
}
|
}
|
||||||
PlayerBaseMod := player.GetPlayerBaseMod()
|
PlayerBaseMod := player.GetPlayerBaseMod()
|
||||||
CostItem, AddItem, DecorateNum, DecorateList, Log, PetExp := DecorateMod.DecorateAll(PlayerBaseMod.GetStar())
|
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 {
|
if err != nil {
|
||||||
player.SendErrClienRes(&msg.ResDecorateAll{
|
player.SendErrClienRes(&msg.ResDecorateAll{
|
||||||
Code: msg.RES_CODE_FAIL,
|
Code: msg.RES_CODE_FAIL,
|
||||||
|
|||||||
@ -10,11 +10,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Decorate struct {
|
type Decorate struct {
|
||||||
AreaId int
|
AreaId int
|
||||||
FinishList map[int]struct{}
|
FinishList map[int]struct{}
|
||||||
Progress int
|
Progress int
|
||||||
DecorateNum int
|
DecorateNum int
|
||||||
AreaReward []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() {
|
func (d *Decorate) InitData() {
|
||||||
@ -22,6 +30,15 @@ func (d *Decorate) InitData() {
|
|||||||
d.AreaId = 1
|
d.AreaId = 1
|
||||||
d.FinishList = make(map[int]struct{})
|
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.FinishList[decorateId] = struct{}{}
|
||||||
d.Progress += 1
|
d.Progress += 1
|
||||||
Item := decorateCfg.GetProgressReward(areaId, d.Progress)
|
Item := decorateCfg.GetProgressReward(areaId, d.Progress)
|
||||||
|
Item1 := decorateCfg.GetDecoarteReward(areaId, decorateId)
|
||||||
|
Item = append(Item, Item1...)
|
||||||
if d.Progress >= len(SortList) {
|
if d.Progress >= len(SortList) {
|
||||||
d.AreaId++
|
d.AreaId++
|
||||||
d.Progress = 0
|
d.Progress = 0
|
||||||
d.FinishList = make(map[int]struct{})
|
d.FinishList = make(map[int]struct{})
|
||||||
}
|
}
|
||||||
|
|
||||||
d.DecorateNum++
|
d.DecorateNum++
|
||||||
return Item, nil
|
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) {
|
func (d *Decorate) GetDecorateCostItem(AreaId, DecorateId int) ([]*item.Item, int) {
|
||||||
Item := decorateCfg.GetStarCost(AreaId, DecorateId)
|
Item := decorateCfg.GetStarCost(AreaId, DecorateId)
|
||||||
PetExp := decorateCfg.GetDecoratePExp(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) {
|
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))
|
SubAlice := GoUtil.SubSlices(DecorateAll, GoUtil.MapIntToIntSlice(d.FinishList))
|
||||||
sort.Ints(SubAlice)
|
sort.Ints(SubAlice)
|
||||||
SubItem := 0
|
SubItem := 0
|
||||||
|
SubItems := make([]*item.Item, 0)
|
||||||
AddItem := make([]*item.Item, 0)
|
AddItem := make([]*item.Item, 0)
|
||||||
DecorateList := make([]int, 0)
|
DecorateList := make([]int, 0)
|
||||||
Log := make([]interface{}, 0)
|
Log := make([]interface{}, 0)
|
||||||
@ -79,10 +110,17 @@ func (d *Decorate) DecorateAll(Star int) ([]*item.Item, []*item.Item, int, []int
|
|||||||
Star -= NeedStar
|
Star -= NeedStar
|
||||||
SubItem += NeedStar
|
SubItem += NeedStar
|
||||||
d.FinishList[v] = struct{}{}
|
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.Progress++
|
||||||
d.DecorateNum++
|
d.DecorateNum++
|
||||||
Num++
|
Num++
|
||||||
Item := decorateCfg.GetProgressReward(d.AreaId, d.Progress)
|
Item := decorateCfg.GetProgressReward(d.AreaId, d.Progress)
|
||||||
|
Item = append(Item, decorateCfg.GetDecoarteReward(d.AreaId, v)...)
|
||||||
if len(Item) > 0 {
|
if len(Item) > 0 {
|
||||||
if d.Progress >= len(DecorateAll) {
|
if d.Progress >= len(DecorateAll) {
|
||||||
Log = append(Log, map[string]interface{}{
|
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.Progress = 0
|
||||||
d.FinishList = make(map[int]struct{})
|
d.FinishList = make(map[int]struct{})
|
||||||
}
|
}
|
||||||
|
if len(d.PartCost) == 0 {
|
||||||
return []*item.Item{item.NewItem(item.ITEM_STAR_ID, -SubItem)}, AddItem, Num, DecorateList, Log, PetExp
|
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 {
|
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{
|
return &msg.ResDecorateInfo{
|
||||||
AreaId: int32(d.AreaId),
|
AreaId: int32(d.AreaId),
|
||||||
MFinishList: GoUtil.MapIntToSlice(d.FinishList),
|
MFinishList: GoUtil.MapIntToSlice(d.FinishList),
|
||||||
RewardArea: GoUtil.IntToInt32(d.AreaReward),
|
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")
|
return nil, fmt.Errorf("areaId already rewarded")
|
||||||
}
|
}
|
||||||
d.AreaReward = append(d.AreaReward, areaId)
|
d.AreaReward = append(d.AreaReward, areaId)
|
||||||
return decorateCfg.GetDecoarteReward(areaId), nil
|
return decorateCfg.GetDecoarteReward(areaId, 20), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decorate) GetAreaId() int {
|
func (d *Decorate) GetAreaId() int {
|
||||||
@ -139,3 +188,94 @@ func (d *Decorate) GetProgress() int {
|
|||||||
func (d *Decorate) GetDecorateNum() int {
|
func (d *Decorate) GetDecorateNum() int {
|
||||||
return d.DecorateNum
|
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