装饰优化

This commit is contained in:
hahwu 2025-08-26 17:21:39 +08:00
parent e00a2292ae
commit 25a9032e6d
4 changed files with 2020 additions and 1754 deletions

View File

@ -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
}

View File

@ -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,

View File

@ -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