216 lines
4.6 KiB
Go
216 lines
4.6 KiB
Go
package item
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"server/msg"
|
|
)
|
|
|
|
type Item struct {
|
|
Id int `json:"Id"`
|
|
Num int `json:"Num"`
|
|
}
|
|
|
|
type ItemMod struct {
|
|
Data map[int]int
|
|
Cache map[int]int
|
|
}
|
|
|
|
const (
|
|
ITEM_ENERGY_ID = 100001
|
|
ITEM_STAR_ID = 100002
|
|
ITEM_DIAMOND_ID = 100003
|
|
ITEM_FIVE_STAR_CARD_PACK = 100008
|
|
ITEM_RACING_BATTERY_ID = 100027
|
|
ITEM_LAUNCHER_ID = 1602
|
|
ITEM_LAUNCHER_LOW_ID = 1601
|
|
ITEM_ENERGY_GIFT_ID = 562
|
|
ITEM_DIAMOND_LV2_ID = 502
|
|
ITEM_PLAYROOM_BOX_LOW_ID = 101445
|
|
ITEM_PLAYROOM_BOX_MID_ID = 101446
|
|
ITEM_PLAYROOM_BOX_HIGH_ID = 101447
|
|
)
|
|
|
|
const (
|
|
// 资源类型
|
|
ITEM_TYPE_ENERGY = 1
|
|
ITEM_TYPE_STAR = 2
|
|
ITEM_TYPE_DIAMOND = 3
|
|
|
|
// 物品类型
|
|
ITEM_TYPE_PLAYROOM_PET = 97 // 宠物道具
|
|
ITEM_TYPE_CARD = 98 // 卡牌
|
|
ITEM_TYPE_BAG = 99 // 背包
|
|
ITEM_TYPE_CHESS = 100 // 棋子
|
|
ITEM_TYPE_CARD_PACK = 101 // 卡包
|
|
ITEM_TYPE_LIMITED_TIME_EVENT = 102 //限时事件
|
|
ITEM_TYPE_PIGGY_BANK = 103 // 猪猪银行
|
|
ITEM_TYPE_MASTER_CARD = 104 // 万能卡
|
|
ITEM_TYPE_AVATAR = 105 // 头像框
|
|
ITEM_TYPE_ACTIVITY = 106 // 活动道具
|
|
ITEM_TYPE_ACTIVITY_RACE = 107 // 竞赛活动道具
|
|
ITEM_TYPE_PLAYROOM_VISIT = 108 // playroom拜访道具
|
|
ITEM_TYPE_EMOJI = 109 // 表情
|
|
ITEM_TYPE_FACE = 110 // 头像
|
|
ITEM_TYPE_PLAYROOM_DECORATION = 111 // playroom装饰
|
|
ITEM_TYPE_PLAYROOM_DRESS = 112 // playroom服饰
|
|
ITEM_TYPE_PLAYROOM_DECORATION_SET = 113 // playroom装饰套装
|
|
ITEM_TYPE_PLAYROOM_DRESS_SET = 114 // playroom服饰套装
|
|
ITEM_TYPE_PLAYROOM_BOX = 115 // playroom宝箱
|
|
ITEM_TYPE_ACT_PASS = 116 // 通行证活动道具
|
|
ITEM_TYPE_PET_FUR = 117 // 宠物毛皮
|
|
)
|
|
|
|
func (i *ItemMod) InitData() {
|
|
if i.Data == nil {
|
|
i.Data = make(map[int]int)
|
|
}
|
|
if i.Cache == nil {
|
|
i.Cache = make(map[int]int)
|
|
}
|
|
}
|
|
|
|
func (i *ItemMod) AddItem(id, num int) error {
|
|
if i.Data[id]+num < 0 {
|
|
return fmt.Errorf("item %d not enough", id)
|
|
}
|
|
i.Data[id] += num
|
|
i.Cache[id] += num
|
|
return nil
|
|
}
|
|
|
|
func (i *ItemMod) DelItem(id, num int) error {
|
|
if i.Data[id] < num {
|
|
return fmt.Errorf("item %d not enough", id)
|
|
}
|
|
i.Data[id] -= num
|
|
i.Cache[id] -= num
|
|
return nil
|
|
}
|
|
|
|
func (i *ItemMod) GetItem(id int) int {
|
|
return i.Data[id]
|
|
}
|
|
|
|
func (i *ItemMod) GetItemNumByList(IdList []int) int {
|
|
var num int
|
|
for _, id := range IdList {
|
|
num += i.Data[id]
|
|
}
|
|
return num
|
|
}
|
|
|
|
func (i *ItemMod) CheckItem(id, num int) bool {
|
|
return i.Data[id] >= num
|
|
}
|
|
|
|
func (i *ItemMod) BackData() *msg.ResItem {
|
|
data := make(map[int32]int32, len(i.Data))
|
|
for k, v := range i.Data {
|
|
data[int32(k)] = int32(v)
|
|
}
|
|
return &msg.ResItem{
|
|
Item: data,
|
|
}
|
|
}
|
|
|
|
func (i *ItemMod) NotifyItem() *msg.ItemNotify {
|
|
data := make(map[int32]int32, len(i.Cache))
|
|
for k, v := range i.Cache {
|
|
data[int32(k)] = int32(v)
|
|
}
|
|
i.Cache = make(map[int]int)
|
|
return &msg.ItemNotify{
|
|
Item: data,
|
|
}
|
|
}
|
|
|
|
// 新建item
|
|
func NewItem(id int, num int) *Item {
|
|
return &Item{
|
|
Id: id,
|
|
Num: num,
|
|
}
|
|
}
|
|
|
|
// 解析Item
|
|
func ParseItem(item interface{}) []*Item {
|
|
if item == nil {
|
|
return nil
|
|
}
|
|
raw := item.([]interface{})
|
|
itemList := make([]*Item, 0, len(raw))
|
|
for _, v := range raw {
|
|
v1 := v.(map[string]interface{})
|
|
itemList = append(itemList, NewItem(int(v1["Id"].(float64)), int(v1["Num"].(float64))))
|
|
}
|
|
return itemList
|
|
}
|
|
|
|
// 构造返回
|
|
func ItemToMsg(items []*Item) []*msg.ItemInfo {
|
|
if items == nil {
|
|
return nil
|
|
}
|
|
itemList := make([]*msg.ItemInfo, 0, len(items))
|
|
for _, v := range items {
|
|
itemList = append(itemList, &msg.ItemInfo{
|
|
Id: int32(v.Id),
|
|
Num: int32(v.Num),
|
|
})
|
|
}
|
|
return itemList
|
|
}
|
|
|
|
// 道具叠加
|
|
func Merge(Item1, Item2 []*Item) []*Item {
|
|
if Item1 == nil {
|
|
return Item2
|
|
}
|
|
if Item2 == nil {
|
|
return Item1
|
|
}
|
|
l := make(map[int]int)
|
|
for _, v := range Item1 {
|
|
l[v.Id] += v.Num
|
|
}
|
|
for _, v := range Item2 {
|
|
l[v.Id] += v.Num
|
|
}
|
|
res := make([]*Item, 0, len(l))
|
|
for k, v := range l {
|
|
res = append(res, &Item{
|
|
Id: k,
|
|
Num: v,
|
|
})
|
|
}
|
|
return res
|
|
}
|
|
func MutilItem(i []*Item, num int) []*Item {
|
|
if i == nil {
|
|
return nil
|
|
}
|
|
res := make([]*Item, 0, len(i))
|
|
for _, v := range i {
|
|
res = append(res, &Item{
|
|
Id: v.Id,
|
|
Num: v.Num * num,
|
|
})
|
|
}
|
|
return res
|
|
}
|
|
|
|
func MutilItemFloat(i []*Item, num float64) []*Item {
|
|
if i == nil {
|
|
return nil
|
|
}
|
|
res := make([]*Item, 0, len(i))
|
|
for _, v := range i {
|
|
res = append(res, &Item{
|
|
Id: v.Id,
|
|
Num: int(math.Round(float64(v.Num) * num)),
|
|
})
|
|
}
|
|
return res
|
|
}
|