package model import ( "blazing/cool" "encoding/json" ) // ------------------------------ // 1. BOSS主表结构(核心ID与关联) // ------------------------------ const TableNameBoss = "boss" // Boss 主表仅存储核心索引和JSON数据 type Boss struct { *cool.Model PlanetID int32 `gorm:"not null;index:idx_boss_planet;comment:'所属星球/地图ID'" json:"planet_id"` BossID int32 `gorm:"not null;comment:'BOSS序号(同星球内唯一)'" json:"boss_id"` Data string `gorm:"type:text;not null;comment:'BOSS详细数据(JSON格式)'" json:"data"` Galaxy string `gorm:"type:varchar(50);comment:'所属星系(如帕诺星系)'" json:"galaxy"` } // 联合唯一索引:确保星球+BOSS序号唯一 func (b *Boss) Indexes() map[string]string { return map[string]string{ "idx_planet_boss_unique": "planet_id,boss_id", } } // TableName 定义表名 func (*Boss) TableName() string { return TableNameBoss } // GroupName 定义分组名 func (*Boss) GroupName() string { return "default" } // GroupName 定义分组名 func (s *Boss) GetData() string { return s.Data } // NewBoss 创建新的BOSS主表实例 func NewBoss() *Boss { return &Boss{ Model: cool.NewModel(), } } // ------------------------------ // 2. BOSS详细数据结构(JSON存储) // ------------------------------ // BossData 封装BOSS所有详细属性,用于JSON序列化 type BossData struct { // 基础信息 EncyclopediaID int32 `json:"encyclopedia_id"` // BOSS图鉴ID Desc string `json:"desc"` // BOSS名称描述 Level int32 `json:"level"` // 等级 Capturable bool `json:"capturable"` // 是否可捕捉 // 战斗属性 MaxHP int32 `json:"max_hp"` // 最大血量(-1使用默认公式) Attack int32 `json:"attack"` // 攻击属性 Defense int32 `json:"defense"` // 防御属性 SpecialAttack int32 `json:"special_attack"` // 特攻属性 SpecialDefense int32 `json:"special_defense"` // 特防属性 Speed int32 `json:"speed"` // 速度属性 Definitely int32 `json:"definitely"` // 必定命中率(默认5) Dodge int32 `json:"dodge"` // 闪避率(默认5) Stat string `json:"stat"` // 开局属性变化(攻击,特攻,防御,特防,速度,命中) // 技能列表 Skills []BossSkill `json:"skills"` // 免疫效果 ImmunityEffectIDs []int32 `json:"immunity_effect_ids"` // 免疫效果ID列表 ImmunityBuffNames []string `json:"immunity_buff_names"` // 免疫Buff名称列表 // 特殊Buff SpecialBuffs []SpecialBuff `json:"special_buffs"` } // BossSkill 技能详情结构 type BossSkill struct { ID int32 `json:"id"` // 技能ID Desc string `json:"desc"` // 技能描述 InfinityPP bool `json:"infinity_pp"` // 是否PP无限 } // SpecialBuff 特殊Buff结构 type SpecialBuff struct { Value string `json:"value"` // Buff标识(如boss://map314-boss0) Params string `json:"params"` // 附加参数(空格分隔) } // ------------------------------ // 3. JSON序列化/反序列化工具方法 // ------------------------------ // ToJSON 将BossData转为JSON字符串 func (d *BossData) ToJSON() (string, error) { data, err := json.Marshal(d) if err != nil { return "", err } return string(data), nil } // ParseBossData 从JSON字符串解析BossData func ParseBossData(jsonStr string) (*BossData, error) { var data BossData if err := json.Unmarshal([]byte(jsonStr), &data); err != nil { return nil, err } return &data, nil } // ------------------------------ // 4. 表初始化 // ------------------------------ func init() { // 创建BOSS主表 cool.CreateTable(&Boss{}) } // ------------------------------ // 5. 使用示例 // ------------------------------ /* // 存储BOSS数据示例 func ExampleSaveBoss() { // 1. 构建详细数据 skills := []BossSkill{ {ID: 10001, Desc: "撞击", InfinityPP: true}, {ID: 20020, Desc: "毒粉", InfinityPP: true}, } immunityEffects := []int32{7, 36} immunityBuffs := []string{"condition://brun", "condition://poison"} specialBuffs := []SpecialBuff{ {Value: "boss://map59-boss0", Params: ""}, } bossData := &BossData{ EncyclopediaID: 347, Desc: "远古鱼龙", Level: 100, Capturable: false, MaxHP: 3000, Attack: 280, SpecialAttack: 417, Defense: 350, SpecialDefense: 317, Speed: 264, Definitely: 45, Stat: "0 0 0 0 0 0", Skills: skills, ImmunityEffectIDs: immunityEffects, ImmunityBuffNames: immunityBuffs, SpecialBuffs: specialBuffs, } // 2. 序列化为JSON dataJSON, _ := bossData.ToJSON() // 3. 存储到主表 boss := NewBoss() boss.PlanetID = 59 boss.BossID = 0 boss.Galaxy = "卡兰星系" boss.Data = dataJSON // 实际项目中使用GORM保存 // db.Create(boss) } // 查询BOSS数据示例 func ExampleGetBoss() { // 1. 从数据库查询主表 var boss Boss // db.Where("planet_id = ? AND boss_id = ?", 59, 0).First(&boss) // 2. 解析JSON数据 bossData, _ := ParseBossData(boss.Data) // 3. 使用数据 println("BOSS名称:", bossData.Desc) println("等级:", bossData.Level) println("技能数量:", len(bossData.Skills)) } */