game/server/characters/manager.go
2026-04-20 16:07:22 +08:00

112 lines
3.7 KiB
Go
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}