package characters import ( "math/rand" "wuziqi-server/core" ) var CharacterData = map[string]struct { MaxHP int Avatar string Desc string }{ "elephant": {MaxHP: 5, Avatar: "🐘", Desc: "High HP, can't use some items"}, "cat": {MaxHP: 3, Avatar: "🐱", Desc: "Max dmg taken is 1"}, "dog": {MaxHP: 4, Avatar: "🐶", Desc: "Periodic magnifier"}, "monkey": {MaxHP: 4, Avatar: "🐒", Desc: "Get banana (heal) chance"}, "chicken": {MaxHP: 4, Avatar: "🐔", Desc: "Get item on dmg chance"}, "sloth": {MaxHP: 4, Avatar: "🦥", Desc: "Immune poison, bomb dmg reduced"}, "hippo": {MaxHP: 4, Avatar: "🦛", Desc: "Cant pick items, resist death chance"}, "tiger": {MaxHP: 4, Avatar: "🐯", Desc: "Stronger knife"}, } type CharacterManager struct { HPConfig map[string]int } func NewCharacterManager(hpConfig map[string]int) *CharacterManager { return &CharacterManager{ HPConfig: hpConfig, } } func (m *CharacterManager) GetInitialHP(charType string, defaultHP int) int { // ★ 优先级: // 1. 配置化的角色HP(从管理后台设置) if configHP, ok := m.HPConfig[charType]; ok && configHP > 0 { return configHP } // 2. 硬编码的角色默认值(CharacterData) if data, ok := CharacterData[charType]; ok && data.MaxHP > 0 { return data.MaxHP } // 3. 全局默认值 if defaultHP > 0 { return defaultHP } return 4 // Fallback } func (m *CharacterManager) GetAvatar(charType string) string { if data, ok := CharacterData[charType]; ok { return data.Avatar } return "❓" } // OnDamageTaken 根据角色特质(例如猫)修改伤害 func (m *CharacterManager) OnDamageTaken(target *core.Player, amount int, isItemEffect bool) int { // 猫咪天赋: 所有伤害强制为1点(诅咒加成也无效) if target.Character == "cat" { return 1 } // 树懒减少受到的炸弹伤害(不是道具?原来的代码说"bomb dmg reduced") // 原始代码逻辑: // 在 handleMove(炸弹)中:如果是树懒 dmg = 1(定时炸弹) // 在 resolveItem(定时炸弹)中:爆炸 -> applyDamage // 等等,原始 applyDamage 没有检查树懒对普通伤害的减免。 // 它只在 handleMove 中检查了炸弹格子:`dmg := 2`(没检查?等下) // 原始 `handleMove`: // if cell.Type == "bomb" { dmg := 2 } 这里没有检查树懒? // 等等,让我重读原始 `handleMove`。 // 第 1106 行:`dmg := 2`。没有树懒检查。 // 第 1426 行(定时炸弹):`if nextPlayer.Character == "sloth" { dmg = 1 }` // 所以树懒只抵抗定时炸弹?还是我查错地方了? // 让我们检查原来的 applyDamage。 // `applyDamage` 处理护盾、猫、诅咒。 // 树懒的抵抗是在 `handleMove` 逻辑中针对定时炸弹爆炸处理的。 // 所以这里的 OnDamageTaken 应该只处理猫。 return amount } // ShouldResistPoison 检查角色是否抵抗毒药 func (m *CharacterManager) ShouldResistPoison(charType string) bool { return charType == "sloth" } // ChickenAbility 处理鸡的"受伤获得道具"技能 // 如果触发则返回 itemID,否则返回空字符串 func (m *CharacterManager) TryTriggerChickenAbility(target *core.Player) (string, bool) { if target.Character == "chicken" && target.ChickenItemCount < 2 { if rand.Float32() < 0.08 { target.ChickenItemCount++ items := []string{"skip", "shield", "magnifier"} return items[rand.Intn(len(items))], true } } return "", false } // HippoDeathResist 检查河马是否幸免于难 func (m *CharacterManager) TryTriggerHippoResist(target *core.Player) bool { if target.Character == "hippo" && !target.HippoDeathImmune { // 55% chance to survive death (once per game) if rand.Float32() < 0.55 { target.HippoDeathImmune = true return true } } return false }