diff --git a/src/Entities/Player.php b/src/Entities/Player.php index 04b0f91..7dec19c 100644 --- a/src/Entities/Player.php +++ b/src/Entities/Player.php @@ -24,6 +24,9 @@ class Player extends Actor public int $maxPartners = 2; // 最多可携带同伴数 public array $partners = []; // 已招募的同伴 + // Player特有的小绿瓶回复池 + public int $potionPool = 1000; // 小绿瓶初始回复量 + /** * 增加灵石 */ @@ -44,6 +47,32 @@ class Player extends Actor return false; } + /** + * 添加小绿瓶回复量 + */ + public function addPotionPool(int $amount): void + { + $this->potionPool += $amount; + } + + /** + * 从小绿瓶扣除回复量(返回实际扣除的量) + */ + public function consumePotionPool(int $amount): int + { + $consumed = min($amount, $this->potionPool); + $this->potionPool -= $consumed; + return $consumed; + } + + /** + * 检查小绿瓶是否有足够的回复量 + */ + public function hasPotionPool(int $amount): bool + { + return $this->potionPool >= $amount; + } + /** * Player特有的经验获取,升级时会恢复生命值 diff --git a/src/Modules/Battle.php b/src/Modules/Battle.php index 04d008c..6bd7074 100644 --- a/src/Modules/Battle.php +++ b/src/Modules/Battle.php @@ -1082,8 +1082,22 @@ class Battle // 掉落 - 从掉落表中随机掉落物品 foreach ($enemy->dropTable as $drop) { if (rand(1, 100) <= $drop['rate']) { - $this->player->addItem($drop['item']); - $allDrops[] = $drop['item']; + $item = $drop['item']; + // 如果是回复品(消耗品且有heal属性),直接添加到小绿瓶池 + if ($item['type'] === 'consume' && isset($item['heal']) && $item['heal'] > 0) { + $this->player->addPotionPool($item['heal']); + // 显示为小绿瓶增加 + $allDrops[] = [ + 'name' => '小绿瓶', + 'type' => 'potion_pool', + 'heal' => $item['heal'], + 'quantity' => 1 + ]; + } else { + // 其他物品正常添加到背包 + $this->player->addItem($item); + $allDrops[] = $item; + } } } } diff --git a/src/Modules/InventoryPanel.php b/src/Modules/InventoryPanel.php index 0e2c4f1..d20a5ee 100644 --- a/src/Modules/InventoryPanel.php +++ b/src/Modules/InventoryPanel.php @@ -69,6 +69,8 @@ class InventoryPanel $out->writeln("╔════════════════════════════╗"); $out->writeln("║ 背 包 [{$categoryName}] ║"); $out->writeln("║ 第 {$page} / {$totalPages} 页 ║"); + $out->writeln("╠════════════════════════════╣"); + $out->writeln("║ 🟢 小绿瓶: {$player->potionPool} ║"); $out->writeln("╚════════════════════════════╝"); if (empty($items)) { @@ -238,14 +240,22 @@ class InventoryPanel // 使用消耗品进行恢复 if ($target === 'player') { - $actualHeal = $player->heal($item['heal']); - $out->writeln("你使用了 {$item['name']},恢复了 {$actualHeal} HP!(当前: {$player->hp}/{$maxHp})"); + // 从小绿瓶池获取实际恢复量 + $healAmount = $item['heal']; + $actualPotionHeal = $player->consumePotionPool($healAmount); + $actualHeal = $player->heal($actualPotionHeal); + $out->writeln("你使用了 {$item['name']},从小绿瓶中恢复了 {$actualHeal} HP!(当前: {$player->hp}/{$maxHp})"); + $out->writeln("小绿瓶剩余: {$player->potionPool}"); } else { // 恢复队友 $partnerStats = $target->getStats(); $partnerMaxHp = $partnerStats['maxHp']; - $actualHeal = $target->heal($item['heal']); - $out->writeln("你使用了 {$item['name']} 来恢复 {$target->name},恢复了 {$actualHeal} HP!(当前: {$target->hp}/{$partnerMaxHp})"); + // 从小绿瓶池获取实际恢复量 + $healAmount = $item['heal']; + $actualPotionHeal = $player->consumePotionPool($healAmount); + $actualHeal = $target->heal($actualPotionHeal); + $out->writeln("你使用了 {$item['name']} 来恢复 {$target->name},从小绿瓶中恢复了 {$actualHeal} HP!(当前: {$target->hp}/{$partnerMaxHp})"); + $out->writeln("小绿瓶剩余: {$player->potionPool}"); } // Decrease quantity or remove @@ -426,8 +436,9 @@ class InventoryPanel $inventoryIndex = $selected['index']; $item = $selected['item']; - // 使用药品 - $actualHeal = $player->heal($item['heal']); + // 使用药品,从小绿瓶池里扣除 + $actualPotionHeal = $player->consumePotionPool($item['heal']); + $actualHeal = $player->heal($actualPotionHeal); $totalHealed += $actualHeal; $itemsUsed++; $healLog[] = "玩家: +{$actualHeal} HP"; @@ -490,8 +501,9 @@ class InventoryPanel $inventoryIndex = $selected['index']; $item = $selected['item']; - // 使用药品回复队友 - $actualHeal = $partner->heal($item['heal']); + // 使用药品回复队友,从小绿瓶池里扣除 + $actualPotionHeal = $player->consumePotionPool($item['heal']); + $actualHeal = $partner->heal($actualPotionHeal); $totalHealed += $actualHeal; $itemsUsed++; $healLog[] = "{$partner->name}: +{$actualHeal} HP"; @@ -739,7 +751,7 @@ class InventoryPanel $reset = Colors::RESET; $out->writeln("╔════════════════════════════════════════════════════════╗"); - $out->writeln("║ {$cyan}角色属性{$reset} Lv.{$player->level} | {$green}💰 {$player->spiritStones}{$reset} 灵石 ║"); + $out->writeln("║ {$cyan}角色属性{$reset} Lv.{$player->level} | {$green}💰 {$player->spiritStones}{$reset} 灵石 | 🟢 {$player->potionPool} ║"); $out->writeln("╠════════════════════════════════════════════════════════╣"); // First row: HP (current/max), patk, matk