112 lines
3.7 KiB
Go
112 lines
3.7 KiB
Go
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
|
||
}
|