|
|
@@ -1 +1,496 @@
|
|
|
-# 作物的生长周期
|
|
|
+# 作物生长周期系统逻辑梳理
|
|
|
+
|
|
|
+## 概述
|
|
|
+
|
|
|
+本文档梳理农场游戏中作物生长周期系统的完整逻辑实现,包括6个生长阶段的转换规则、时间计算、特性处理等核心机制。
|
|
|
+
|
|
|
+## 系统架构
|
|
|
+
|
|
|
+### 生长阶段定义
|
|
|
+系统实现了完整的6阶段生长周期,阶段值来自protobuf定义:
|
|
|
+
|
|
|
+1. **种子期** (SEED_STAGE = 1)
|
|
|
+2. **发芽期** (SPROUTING_STAGE = 20)
|
|
|
+3. **生长期** (GROWING_STAGE = 30)
|
|
|
+4. **果实期** (FRUIT_STAGE = 35)
|
|
|
+5. **成熟期** (MATURE_STAGE = 40)
|
|
|
+6. **枯萎期** (WITHERED_STAGE = 50)
|
|
|
+
|
|
|
+**阶段转换顺序**: 1 → 20 → 30 → 35 → 40 → 50
|
|
|
+
|
|
|
+### 核心实现文件
|
|
|
+- **枚举定义**: `app/Module/Farm/Enums/GROWTH_STAGE.php`
|
|
|
+- **核心逻辑**: `app/Module/Farm/Logics/CropLogic.php`
|
|
|
+- **作物模型**: `app/Module/Farm/Models/FarmCrop.php`
|
|
|
+- **种子模型**: `app/Module/Farm/Models/FarmSeed.php`
|
|
|
+- **果实生长周期模型**: `app/Module/Farm/Models/FarmFruitGrowthCycle.php`
|
|
|
+
|
|
|
+## 生长阶段详细逻辑
|
|
|
+
|
|
|
+### 阶段转换机制
|
|
|
+
|
|
|
+#### 核心转换逻辑 (`CropLogic::calculateNextStage()`)
|
|
|
+```php
|
|
|
+// 阶段映射表(按protobuf数值顺序)
|
|
|
+$stageMap = [
|
|
|
+ GROWTH_STAGE::SEED->value => GROWTH_STAGE::SPROUT->value, // 1 → 20
|
|
|
+ GROWTH_STAGE::SPROUT->value => GROWTH_STAGE::GROWTH->value, // 20 → 30
|
|
|
+ GROWTH_STAGE::GROWTH->value => GROWTH_STAGE::FRUIT->value, // 30 → 35
|
|
|
+ GROWTH_STAGE::FRUIT->value => GROWTH_STAGE::MATURE->value, // 35 → 40
|
|
|
+ GROWTH_STAGE::MATURE->value => GROWTH_STAGE::WITHERED->value, // 40 → 50
|
|
|
+ GROWTH_STAGE::WITHERED->value => GROWTH_STAGE::WITHERED->value, // 50 → 50
|
|
|
+];
|
|
|
+```
|
|
|
+
|
|
|
+**特殊处理**:
|
|
|
+- 成熟期需要检查是否超时才进入枯萎期
|
|
|
+- 枯萎期保持不变,需要手动清理
|
|
|
+
|
|
|
+### 各阶段特性详解
|
|
|
+
|
|
|
+#### 1. 种子期 (SEED_STAGE = 1)
|
|
|
+**时间计算**:
|
|
|
+- 固定使用种子配置的 `seed_time`
|
|
|
+- 不受果实生长周期配置影响
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- 不能产生灾害 (`can_disaster = false`)
|
|
|
+- 可以使用化肥
|
|
|
+- 设置 `stage_start_time` 和 `stage_end_time`
|
|
|
+
|
|
|
+#### 2. 发芽期 (SPROUTING_STAGE = 20)
|
|
|
+**时间计算**:
|
|
|
+- 优先使用果实生长周期配置的 `sprout_time`
|
|
|
+- 备选使用种子配置的 `sprout_time`
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- **关键逻辑**:确定最终产出果实ID (`final_output_item_id`)
|
|
|
+- 可以产生灾害 (`can_disaster = true`)
|
|
|
+- 可以使用化肥
|
|
|
+- 重置施肥状态 (`fertilized = false`)
|
|
|
+
|
|
|
+#### 3. 生长期 (GROWING_STAGE = 30)
|
|
|
+**时间计算**:
|
|
|
+- 优先使用果实生长周期配置的 `growth_time`
|
|
|
+- 备选使用种子配置的 `growth_time`
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- 可以产生灾害
|
|
|
+- 可以使用化肥
|
|
|
+- 重置施肥状态
|
|
|
+
|
|
|
+#### 4. 果实期 (FRUIT_STAGE = 35)
|
|
|
+**时间计算**:
|
|
|
+- 优先使用果实生长周期配置的 `fruit_time`
|
|
|
+- 备选使用种子配置的 `fruit_time`
|
|
|
+- 如果时间为0,则跳过此阶段
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- **不可收获**:保持现有逻辑一致性
|
|
|
+- **不可采摘**:`canPickFruit()` 方法返回 `false`
|
|
|
+- 可以产生灾害(影响最终产量)
|
|
|
+- 可以使用化肥
|
|
|
+- 重置施肥状态
|
|
|
+- 主要用于视觉展示和增加游戏节奏感
|
|
|
+
|
|
|
+#### 5. 成熟期 (MATURE_STAGE = 40)
|
|
|
+**时间计算**:
|
|
|
+- 优先使用果实生长周期配置的 `mature_time`
|
|
|
+- 备选使用种子配置的 `mature_time`
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- **关键逻辑**:确定最终产出数量 (`final_output_amount`)
|
|
|
+- **唯一可收获阶段**:`canHarvest()` 方法仅对此阶段返回 `true`
|
|
|
+- 不能使用化肥
|
|
|
+- 超过结束时间后自动进入枯萎期
|
|
|
+
|
|
|
+#### 6. 枯萎期 (WITHERED_STAGE = 50)
|
|
|
+**时间计算**:
|
|
|
+- 检查果实生长周期配置的 `wither_time`
|
|
|
+- 默认无结束时间 (`stage_end_time = null`)
|
|
|
+
|
|
|
+**阶段特性**:
|
|
|
+- 需要手动清理
|
|
|
+- 不能进行任何操作
|
|
|
+- 土地状态变为枯萎状态 (`LAND_STATUS::WITHERED`)
|
|
|
+
|
|
|
+## 时间配置系统
|
|
|
+
|
|
|
+### 单一时间配置机制
|
|
|
+
|
|
|
+系统采用**职责分离配置机制**:
|
|
|
+
|
|
|
+1. **种子配置** (`farm_seeds` 表) - 仅负责种子期时间
|
|
|
+2. **果实生长周期配置** (`farm_fruit_growth_cycles` 表) - 负责其他所有阶段时间
|
|
|
+
|
|
|
+#### 时间配置规则
|
|
|
+
|
|
|
+**各阶段时间配置**:
|
|
|
+- **种子期**:使用种子配置 `seed_time`
|
|
|
+- **发芽期**:使用果实生长周期配置 `sprout_time`
|
|
|
+- **生长期**:使用果实生长周期配置 `growth_time`
|
|
|
+- **果实期**:使用果实生长周期配置 `fruit_time`
|
|
|
+- **成熟期**:使用果实生长周期配置 `mature_time`
|
|
|
+- **枯萎期**:使用果实生长周期配置 `wither_time`
|
|
|
+
|
|
|
+#### 配置验证机制
|
|
|
+
|
|
|
+系统强制要求除种子期外的所有阶段都必须有对应的果实生长周期配置:
|
|
|
+
|
|
|
+```php
|
|
|
+if (!$fruitGrowthCycle) {
|
|
|
+ throw new \Exception("作物ID {$crop->id} 缺少果实生长周期配置,无法计算阶段时间");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 数据库表结构
|
|
|
+
|
|
|
+#### farm_fruit_growth_cycles 表
|
|
|
+```sql
|
|
|
+CREATE TABLE `kku_farm_fruit_growth_cycles` (
|
|
|
+ `id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
|
+ `fruit_item_id` bigint unsigned NOT NULL COMMENT '果实物品ID',
|
|
|
+ `sprout_time` int unsigned NOT NULL COMMENT '发芽期时间(秒)',
|
|
|
+ `growth_time` int unsigned NOT NULL COMMENT '成长期时间(秒)',
|
|
|
+ `fruit_time` int unsigned NOT NULL DEFAULT '0' COMMENT '果实期时间(秒)',
|
|
|
+ `mature_time` int unsigned NOT NULL DEFAULT '0' COMMENT '成熟期时间(秒,0表示无限)',
|
|
|
+ `wither_time` int unsigned NOT NULL DEFAULT '0' COMMENT '枯萎期时间(秒,0表示无限)',
|
|
|
+ -- ...
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+#### farm_seeds 表
|
|
|
+```sql
|
|
|
+CREATE TABLE `kku_farm_seeds` (
|
|
|
+ `id` bigint unsigned NOT NULL AUTO_INCREMENT,
|
|
|
+ `name` varchar(50) NOT NULL COMMENT '种子名称',
|
|
|
+ `type` tinyint unsigned NOT NULL DEFAULT '1' COMMENT '种子类型:1普通,2神秘,3巨化',
|
|
|
+ `seed_time` int unsigned NOT NULL COMMENT '种子期时间(秒)',
|
|
|
+ `min_output` int unsigned NOT NULL COMMENT '最小产出',
|
|
|
+ `max_output` int unsigned NOT NULL COMMENT '最大产出',
|
|
|
+ `disaster_min_output` int unsigned NOT NULL DEFAULT '500' COMMENT '有灾害时最小产出',
|
|
|
+ `disaster_max_output` int unsigned NOT NULL DEFAULT '2000' COMMENT '有灾害时最大产出',
|
|
|
+ `item_id` bigint unsigned NOT NULL COMMENT '对应的物品ID',
|
|
|
+ -- ...
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 实际配置数据示例
|
|
|
+
|
|
|
+**果实生长周期配置**:
|
|
|
+```sql
|
|
|
+-- 草莓果实配置
|
|
|
+fruit_item_id: 2, sprout_time: 10800, growth_time: 10800, fruit_time: 5400, mature_time: 10800
|
|
|
+
|
|
|
+-- 南瓜果实配置
|
|
|
+fruit_item_id: 3, sprout_time: 10800, growth_time: 10800, fruit_time: 9000, mature_time: 10800
|
|
|
+
|
|
|
+-- 核桃果实配置
|
|
|
+fruit_item_id: 4, sprout_time: 14400, growth_time: 14400, fruit_time: 12600, mature_time: 14400
|
|
|
+```
|
|
|
+
|
|
|
+**种子配置**:
|
|
|
+```sql
|
|
|
+-- 神秘种子(只配置种子期时间)
|
|
|
+name: "神秘种子", seed_time: 3600
|
|
|
+
|
|
|
+-- 草莓种子(只配置种子期时间)
|
|
|
+name: "草莓种子", seed_time: 7200
|
|
|
+
|
|
|
+-- 南瓜种子(只配置种子期时间)
|
|
|
+name: "南⽠种⼦", seed_time: 10800
|
|
|
+```
|
|
|
+
|
|
|
+## 业务功能集成
|
|
|
+
|
|
|
+### 化肥系统集成
|
|
|
+
|
|
|
+#### 化肥使用规则 (`GROWTH_STAGE::canUseFertilizer()`)
|
|
|
+```php
|
|
|
+public static function canUseFertilizer(GROWTH_STAGE $stage): bool
|
|
|
+{
|
|
|
+ return in_array($stage->value, [
|
|
|
+ self::SEED->value, // 种子期可用化肥
|
|
|
+ self::SPROUT->value, // 发芽期可用化肥
|
|
|
+ self::GROWTH->value, // 生长期可用化肥
|
|
|
+ self::FRUIT->value // 果实期可用化肥
|
|
|
+ ]);
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**化肥使用逻辑**:
|
|
|
+- 每个阶段转换时重置施肥状态 (`fertilized = false`)
|
|
|
+- 成熟期和枯萎期不可使用化肥
|
|
|
+- 化肥效果影响最终产量计算
|
|
|
+
|
|
|
+### 灾害系统集成
|
|
|
+
|
|
|
+#### 灾害检查范围 (`DisasterLogic::checkCropsForDisaster()`)
|
|
|
+```php
|
|
|
+// 获取需要检查灾害的作物:发芽期、生长期、果实期
|
|
|
+$crops = FarmCrop::whereIn('growth_stage', [
|
|
|
+ GROWTH_STAGE::SPROUT,
|
|
|
+ GROWTH_STAGE::GROWTH,
|
|
|
+ GROWTH_STAGE::FRUIT
|
|
|
+])
|
|
|
+->where('can_disaster', true)
|
|
|
+->get();
|
|
|
+```
|
|
|
+
|
|
|
+**灾害影响机制**:
|
|
|
+- 种子期:不产生灾害 (`can_disaster = false`)
|
|
|
+- 发芽期、生长期、果实期:可产生灾害
|
|
|
+- 成熟期、枯萎期:不产生新灾害
|
|
|
+- 灾害影响最终产量和品质
|
|
|
+
|
|
|
+### 收获系统集成
|
|
|
+
|
|
|
+#### 收获权限控制 (`GROWTH_STAGE::canHarvest()`)
|
|
|
+```php
|
|
|
+public static function canHarvest(int $stage): bool
|
|
|
+{
|
|
|
+ return $stage === self::MATURE->value; // 只有成熟期可以收获
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 果实期采摘控制 (`GROWTH_STAGE::canPickFruit()`)
|
|
|
+```php
|
|
|
+public static function canPickFruit(int $stage): bool
|
|
|
+{
|
|
|
+ // 当前方案:果实期不可采摘,保持逻辑一致性
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // 预留接口:如果未来需要果实期采摘功能
|
|
|
+ // return $stage === self::FRUIT->value;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 产量计算系统
|
|
|
+
|
|
|
+#### 关键节点产量确定
|
|
|
+1. **发芽期进入时**:确定 `final_output_item_id`
|
|
|
+2. **成熟期进入时**:确定 `final_output_amount`
|
|
|
+3. **收获时**:使用确定的产量进行收获
|
|
|
+
|
|
|
+**产量计算逻辑保持不变**:
|
|
|
+- 果实期不参与产量计算,仅作为过渡阶段
|
|
|
+- 灾害和化肥效果在成熟期统一计算最终产量
|
|
|
+
|
|
|
+## 系统状态监控
|
|
|
+
|
|
|
+### 作物阶段统计
|
|
|
+
|
|
|
+#### 当前系统状态查询
|
|
|
+```sql
|
|
|
+-- 查看各阶段作物分布
|
|
|
+SELECT growth_stage, COUNT(*) as count
|
|
|
+FROM kku_farm_crops
|
|
|
+WHERE deleted_at IS NULL
|
|
|
+GROUP BY growth_stage
|
|
|
+ORDER BY growth_stage;
|
|
|
+```
|
|
|
+
|
|
|
+#### 阶段名称映射 (`GROWTH_STAGE::getAll()`)
|
|
|
+```php
|
|
|
+return [
|
|
|
+ self::SEED->value => '种子期', // 1
|
|
|
+ self::SPROUT->value => '发芽期', // 20
|
|
|
+ self::GROWTH->value => '生长期', // 30
|
|
|
+ self::FRUIT->value => '果实期', // 35
|
|
|
+ self::MATURE->value => '成熟期', // 40
|
|
|
+ self::WITHERED->value => '枯萎期', // 50
|
|
|
+];
|
|
|
+```
|
|
|
+
|
|
|
+### 配置数据验证
|
|
|
+
|
|
|
+#### 果实生长周期配置检查
|
|
|
+```sql
|
|
|
+-- 检查果实期时间配置
|
|
|
+SELECT fruit_item_id, sprout_time, growth_time, fruit_time, mature_time
|
|
|
+FROM kku_farm_fruit_growth_cycles
|
|
|
+ORDER BY fruit_item_id;
|
|
|
+```
|
|
|
+
|
|
|
+#### 种子配置检查
|
|
|
+```sql
|
|
|
+-- 检查种子果实期配置
|
|
|
+SELECT id, name, fruit_time
|
|
|
+FROM kku_farm_seeds
|
|
|
+ORDER BY id;
|
|
|
+```
|
|
|
+
|
|
|
+### 关键业务指标
|
|
|
+
|
|
|
+#### 阶段转换监控
|
|
|
+- 监控各阶段作物数量分布
|
|
|
+- 检查阶段转换是否正常
|
|
|
+- 验证时间配置是否合理
|
|
|
+
|
|
|
+#### 异常情况检测
|
|
|
+- 检查是否有作物卡在某个阶段
|
|
|
+- 验证 `final_output_item_id` 是否正确设置
|
|
|
+- 监控灾害生成和化肥使用情况
|
|
|
+
|
|
|
+## 技术实现要点
|
|
|
+
|
|
|
+### 关键代码逻辑
|
|
|
+
|
|
|
+#### 阶段更新核心方法 (`CropLogic::updateGrowthStage()`)
|
|
|
+```php
|
|
|
+public function updateGrowthStage(int $cropId): bool
|
|
|
+{
|
|
|
+ // 1. 检查是否需要更新(时间是否到达)
|
|
|
+ if (!$crop->stage_end_time || $crop->stage_end_time > now()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 计算新的生长阶段
|
|
|
+ $newStage = $this->calculateNextStage($crop);
|
|
|
+
|
|
|
+ // 3. 发芽期特殊处理:确定最终产出果实ID
|
|
|
+ if ($newStage === GROWTH_STAGE::SPROUT->value) {
|
|
|
+ if (!$crop->final_output_item_id) {
|
|
|
+ // 确定最终产出果实ID的逻辑
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 成熟期特殊处理:确定最终产出数量
|
|
|
+ if ($newStage === GROWTH_STAGE::MATURE->value && !$crop->final_output_amount) {
|
|
|
+ $finalAmount = $this->calculateMatureOutput($crop);
|
|
|
+ $crop->final_output_amount = $finalAmount;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 更新作物状态
|
|
|
+ $crop->growth_stage = $newStage;
|
|
|
+ $crop->stage_start_time = now();
|
|
|
+ $crop->stage_end_time = $this->calculateStageEndTime($crop, $newStage);
|
|
|
+ $crop->fertilized = false; // 重置施肥状态
|
|
|
+
|
|
|
+ // 6. 枯萎期特殊处理:更新土地状态
|
|
|
+ if ($newStage === GROWTH_STAGE::WITHERED->value) {
|
|
|
+ $land->status = LAND_STATUS::WITHERED;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+#### 时间计算核心方法 (`CropLogic::calculateStageEndTime()`)
|
|
|
+```php
|
|
|
+private function calculateStageEndTime(FarmCrop $crop, int $stage)
|
|
|
+{
|
|
|
+ $seed = $crop->seed;
|
|
|
+ $fruitGrowthCycle = null;
|
|
|
+
|
|
|
+ // 获取果实生长周期配置(如果存在)
|
|
|
+ if ($crop->final_output_item_id) {
|
|
|
+ $fruitGrowthCycle = FarmFruitGrowthCycle::where('fruit_item_id', $crop->final_output_item_id)->first();
|
|
|
+ }
|
|
|
+
|
|
|
+ switch ($stage) {
|
|
|
+ case GROWTH_STAGE::SEED->value:
|
|
|
+ return now()->addSeconds($seed->seed_time);
|
|
|
+
|
|
|
+ case GROWTH_STAGE::SPROUT->value:
|
|
|
+ $time = $fruitGrowthCycle ? $fruitGrowthCycle->sprout_time : $seed->sprout_time;
|
|
|
+ return now()->addSeconds($time);
|
|
|
+
|
|
|
+ case GROWTH_STAGE::GROWTH->value:
|
|
|
+ $time = $fruitGrowthCycle ? $fruitGrowthCycle->growth_time : $seed->growth_time;
|
|
|
+ return now()->addSeconds($time);
|
|
|
+
|
|
|
+ case GROWTH_STAGE::FRUIT->value:
|
|
|
+ $time = $fruitGrowthCycle ? $fruitGrowthCycle->fruit_time : ($seed->fruit_time ?? 0);
|
|
|
+ return $time > 0 ? now()->addSeconds($time) : null;
|
|
|
+
|
|
|
+ case GROWTH_STAGE::MATURE->value:
|
|
|
+ $time = $fruitGrowthCycle ? $fruitGrowthCycle->mature_time : ($seed->mature_time ?? 0);
|
|
|
+ return $time > 0 ? now()->addSeconds($time) : null;
|
|
|
+
|
|
|
+ case GROWTH_STAGE::WITHERED->value:
|
|
|
+ if ($fruitGrowthCycle && $fruitGrowthCycle->wither_time > 0) {
|
|
|
+ return now()->addSeconds($fruitGrowthCycle->wither_time);
|
|
|
+ }
|
|
|
+ return null; // 枯萎期默认无时间限制
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### 数据一致性保证
|
|
|
+
|
|
|
+#### 关键验证点
|
|
|
+1. **发芽期验证**:确保 `final_output_item_id` 已设置
|
|
|
+2. **成熟期验证**:确保 `final_output_amount` 已计算
|
|
|
+3. **阶段转换验证**:确保阶段按正确顺序转换
|
|
|
+4. **时间配置验证**:确保时间配置合理且不为负数
|
|
|
+
|
|
|
+#### 异常处理机制
|
|
|
+```php
|
|
|
+// 严重错误:作物进入成熟期但没有确定最终产出果实ID
|
|
|
+if ($newStage === GROWTH_STAGE::MATURE->value && !$crop->final_output_item_id) {
|
|
|
+ Log::error('严重错误:作物进入成熟期但没有确定最终产出果实ID', [
|
|
|
+ 'crop_id' => $crop->id,
|
|
|
+ 'user_id' => $crop->user_id,
|
|
|
+ 'seed_id' => $crop->seed_id,
|
|
|
+ ]);
|
|
|
+ throw new \Exception("作物ID {$crop->id} 进入成熟期但没有确定最终产出果实ID,这是系统错误");
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## 系统运行状态
|
|
|
+
|
|
|
+### 当前实现状态
|
|
|
+
|
|
|
+#### ✅ 已完成功能
|
|
|
+1. **枚举定义完整**:`GROWTH_STAGE` 枚举包含所有6个阶段
|
|
|
+2. **数据库表结构完整**:
|
|
|
+ - `farm_fruit_growth_cycles` 表已包含 `fruit_time` 字段
|
|
|
+ - `farm_seeds` 表已包含 `fruit_time` 字段
|
|
|
+3. **核心逻辑实现**:
|
|
|
+ - 阶段转换逻辑支持果实期 (30 → 35 → 40)
|
|
|
+ - 时间计算逻辑支持果实期配置
|
|
|
+4. **业务系统集成**:
|
|
|
+ - 化肥系统支持果实期使用
|
|
|
+ - 灾害系统支持果实期检查
|
|
|
+ - 收获系统正确限制果实期操作
|
|
|
+
|
|
|
+#### 📊 配置数据状态
|
|
|
+**果实生长周期配置示例**:
|
|
|
+- 草莓果实:`fruit_time = 5400` (1.5小时)
|
|
|
+- 南瓜果实:`fruit_time = 9000` (2.5小时)
|
|
|
+- 核桃果实:`fruit_time = 12600` (3.5小时)
|
|
|
+
|
|
|
+**种子配置示例**:
|
|
|
+- 神秘种子:`fruit_time = 7200` (2小时)
|
|
|
+- 草莓种子:`fruit_time = 10800` (3小时)
|
|
|
+- 核桃种子:`fruit_time = 0` (跳过果实期)
|
|
|
+
|
|
|
+### 系统特性总结
|
|
|
+
|
|
|
+#### 🎯 设计原则
|
|
|
+1. **逻辑一致性**:果实期不可采摘,保持"只有成熟期可收获"的设计
|
|
|
+2. **职责分离**:种子只负责种子期,果实生长周期负责其他所有阶段
|
|
|
+3. **配置强制性**:除种子期外,所有阶段都必须有果实生长周期配置
|
|
|
+4. **系统完整性**:与protobuf定义完全一致,支持完整的6阶段生长周期
|
|
|
+
|
|
|
+#### 🔧 技术特点
|
|
|
+1. **非连续阶段值处理**:正确处理protobuf中的非连续数值 (1,20,30,35,40,50)
|
|
|
+2. **强制配置验证**:除种子期外,所有阶段都强制要求果实生长周期配置
|
|
|
+3. **异常处理完善**:关键节点有完整的验证和错误处理
|
|
|
+4. **日志记录详细**:每个阶段转换都有详细的日志记录
|
|
|
+
|
|
|
+#### 🎮 游戏体验
|
|
|
+1. **节奏感增强**:果实期增加了生长过程的层次感
|
|
|
+2. **视觉丰富性**:为前端提供了更多的视觉展示阶段
|
|
|
+3. **策略深度**:化肥和灾害系统在果实期的应用增加了策略选择
|
|
|
+4. **操作简洁性**:保持了简单的收获操作,避免了复杂的采摘机制
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+**文档类型**: 逻辑梳理文档
|
|
|
+**文档版本**: v2.0
|
|
|
+**创建时间**: 2025-01-27
|
|
|
+**最后更新**: 2025-06-27
|
|
|
+**维护人**: AI Assistant
|
|
|
+**状态**: 基于实际代码实现整理
|