finish animal and plants

This commit is contained in:
bridge
2025-09-11 23:21:06 +08:00
parent f2938bf8d8
commit ccdcc590f4
15 changed files with 412 additions and 50 deletions

View File

@@ -98,6 +98,7 @@
### 🌿 生态系统
- ✅ 动植物
- ✅ 狩猎、采集、材料系统
- [ ] 魔兽系统
- [ ] 兽潮

View File

@@ -7,8 +7,9 @@ import inspect
from src.classes.essence import Essence, EssenceType
from src.classes.root import Root, corres_essence_type
from src.classes.region import Region, CultivateRegion
from src.classes.region import Region, CultivateRegion, NormalRegion
from src.classes.event import Event, NULL_EVENT
from src.classes.item import Item
if TYPE_CHECKING:
from src.classes.avatar import Avatar
@@ -319,7 +320,118 @@ class Play(DefineAction, ActualActionMixin):
def is_doable(self) -> bool:
return True
ALL_ACTION_CLASSES = [Move, Cultivate, Breakthrough, MoveToRegion, Play]
ALL_ACTUAL_ACTION_CLASSES = [Cultivate, Breakthrough, MoveToRegion, Play]
ALL_ACTION_NAMES = ["Move", "Cultivate", "Breakthrough", "MoveToRegion", "Play"]
ALL_ACTUAL_ACTION_NAMES = ["Cultivate", "Breakthrough", "MoveToRegion", "Play"]
@long_action(step_month=6)
class Hunt(DefineAction, ActualActionMixin):
"""
狩猎动作在有动物的区域进行狩猎持续6个月
可以获得动物对应的物品
"""
COMMENT = "在当前区域狩猎动物,获取动物材料"
PARAMS = {}
def _execute(self) -> None:
"""
执行狩猎动作
"""
region = self.avatar.tile.region
success_rate = self.get_success_rate()
if random.random() < success_rate:
# 成功狩猎从avatar境界足够的动物中随机选择一种
avatar_realm = self.avatar.cultivation_progress.realm
available_animals = [animal for animal in region.animals if avatar_realm >= animal.realm]
target_animal = random.choice(available_animals)
# 随机选择该动物的一种物品
item = random.choice(target_animal.items)
self.avatar.add_item(item, 1)
def get_success_rate(self) -> float:
"""
获取狩猎成功率预留接口目前固定为100%
"""
return 1.0 # 100%成功率
def get_event(self) -> Event:
"""
获取狩猎动作开始时的事件
"""
region = self.avatar.tile.region
return Event(self.world.month_stamp, f"{self.avatar.name}{region.name} 开始狩猎")
@property
def is_doable(self) -> bool:
"""
判断是否可以狩猎必须在有动物的普通区域且avatar的境界必须大于等于动物的境界
"""
region = self.avatar.tile.region
if not isinstance(region, NormalRegion) or len(region.animals) == 0:
return False
# 检查avatar的境界是否足够狩猎区域内的动物
avatar_realm = self.avatar.cultivation_progress.realm
for animal in region.animals:
if avatar_realm >= animal.realm:
return True
return False
@long_action(step_month=6)
class Harvest(DefineAction, ActualActionMixin):
"""
采集动作在有植物的区域进行采集持续6个月
可以获得植物对应的物品
"""
COMMENT = "在当前区域采集植物,获取植物材料"
PARAMS = {}
def _execute(self) -> None:
"""
执行采集动作
"""
region = self.avatar.tile.region
success_rate = self.get_success_rate()
if random.random() < success_rate:
# 成功采集从avatar境界足够的植物中随机选择一种
avatar_realm = self.avatar.cultivation_progress.realm
available_plants = [plant for plant in region.plants if avatar_realm >= plant.realm]
target_plant = random.choice(available_plants)
# 随机选择该植物的一种物品
item = random.choice(target_plant.items)
self.avatar.add_item(item, 1)
def get_success_rate(self) -> float:
"""
获取采集成功率预留接口目前固定为100%
"""
return 1.0 # 100%成功率
def get_event(self) -> Event:
"""
获取采集动作开始时的事件
"""
region = self.avatar.tile.region
return Event(self.world.month_stamp, f"{self.avatar.name}{region.name} 开始采集")
@property
def is_doable(self) -> bool:
"""
判断是否可以采集必须在有植物的普通区域且avatar的境界必须大于等于植物的境界
"""
region = self.avatar.tile.region
if not isinstance(region, NormalRegion) or len(region.plants) == 0:
return False
# 检查avatar的境界是否足够采集区域内的植物
avatar_realm = self.avatar.cultivation_progress.realm
for plant in region.plants:
if avatar_realm >= plant.realm:
return True
return False
ALL_ACTION_CLASSES = [Move, Cultivate, Breakthrough, MoveToRegion, Play, Hunt, Harvest]
ALL_ACTUAL_ACTION_CLASSES = [Cultivate, Breakthrough, MoveToRegion, Play, Hunt, Harvest]
ALL_ACTION_NAMES = ["Move", "Cultivate", "Breakthrough", "MoveToRegion", "Play", "Hunt", "Harvest"]
ALL_ACTUAL_ACTION_NAMES = ["Cultivate", "Breakthrough", "MoveToRegion", "Play", "Hunt", "Harvest"]

View File

@@ -1,6 +1,10 @@
from dataclasses import dataclass
from dataclasses import dataclass, field
from typing import Optional
from src.utils.df import game_configs
from src.utils.config import CONFIG
from src.classes.item import Item, items_by_id
from src.classes.cultivation import Realm
@dataclass
class Animal:
@@ -10,13 +14,35 @@ class Animal:
id: int
name: str
desc: str
grade: int
realm: Realm
item_ids: list[int] = field(default_factory=list) # 该动物对应的物品IDs
# 这些字段将在__post_init__中设置
items: list[Item] = field(init=False, default_factory=list) # 该动物对应的物品实例
def __post_init__(self):
"""初始化物品实例"""
for item_id in self.item_ids:
if item_id in items_by_id:
self.items.append(items_by_id[item_id])
def __hash__(self) -> int:
return hash(self.id)
def __str__(self) -> str:
return self.name
def get_info(self) -> str:
"""
获取动物的详细信息,包括名字、描述、境界和材料
"""
info_parts = [f"{self.name}】({self.realm.value})", self.desc]
if self.items:
item_names = [item.name for item in self.items]
info_parts.append(f"可获得材料:{', '.join(item_names)}")
return " - ".join(info_parts)
def _load_animals() -> tuple[dict[int, Animal], dict[str, Animal]]:
"""从配表加载animal数据"""
@@ -25,11 +51,19 @@ def _load_animals() -> tuple[dict[int, Animal], dict[str, Animal]]:
animal_df = game_configs["animal"]
for _, row in animal_df.iterrows():
# 处理item_ids
item_ids_list = []
item_ids = row.get("item_ids")
if item_ids is not None and str(item_ids).strip() and str(item_ids) != 'nan':
for item_id_str in str(item_ids).split(CONFIG.df.ids_separator):
item_ids_list.append(int(float(item_id_str.strip())))
animal = Animal(
id=int(row["id"]),
name=str(row["name"]),
desc=str(row["desc"]),
grade=int(row["grade"])
realm=Realm.from_id(int(row["stage_id"])),
item_ids=item_ids_list
)
animals_by_id[animal.id] = animal
animals_by_name[animal.name] = animal

View File

@@ -26,6 +26,14 @@ level_to_stage = {
20: Stage.Late_Stage,
}
# realm_id到Realm的映射用于物品等级系统
realm_id_to_realm = {
1: Realm.Qi_Refinement,
2: Realm.Foundation_Establishment,
3: Realm.Core_Formation,
4: Realm.Nascent_Soul,
}
level_to_break_through = {
30: Realm.Foundation_Establishment,
60: Realm.Core_Formation,
@@ -57,9 +65,9 @@ class CultivationProgress:
return realm
return Realm.Qi_Refinement
def get_stage(self, level: int) -> str:
def get_stage(self, level: int) -> Stage:
"""获取阶段"""
_level = self.level % levels_per_realm
_level = level % levels_per_realm
for level_threshold, stage in reversed(list(level_to_stage.items())):
if _level >= level_threshold:
return stage
@@ -155,4 +163,65 @@ class CultivationProgress:
return self.exp >= exp_required
def __str__(self) -> str:
return f"{self.realm.value}{self.stage.value}({self.level}级)。可以突破:{self.can_break_through()}"
return f"{self.realm.value}{self.stage.value}({self.level}级)。可以突破:{self.can_break_through()}"
# 为Realm类添加from_id类方法
def _realm_from_id(cls, realm_id: int) -> Realm:
"""
根据realm_id获取对应的Realm
Args:
realm_id: 境界ID (1-4)
Returns:
对应的Realm枚举值
Raises:
ValueError: 如果realm_id不存在
"""
if realm_id not in realm_id_to_realm:
raise ValueError(f"Unknown realm_id: {realm_id}")
return realm_id_to_realm[realm_id]
# 将from_id方法绑定到Realm类
Realm.from_id = classmethod(_realm_from_id)
# 境界顺序映射
_realm_order = {
Realm.Qi_Refinement: 1,
Realm.Foundation_Establishment: 2,
Realm.Core_Formation: 3,
Realm.Nascent_Soul: 4,
}
# 为Realm类添加比较操作符
def _realm_ge(self, other):
"""大于等于比较"""
if not isinstance(other, Realm):
return NotImplemented
return _realm_order[self] >= _realm_order[other]
def _realm_le(self, other):
"""小于等于比较"""
if not isinstance(other, Realm):
return NotImplemented
return _realm_order[self] <= _realm_order[other]
def _realm_gt(self, other):
"""大于比较"""
if not isinstance(other, Realm):
return NotImplemented
return _realm_order[self] > _realm_order[other]
def _realm_lt(self, other):
"""小于比较"""
if not isinstance(other, Realm):
return NotImplemented
return _realm_order[self] < _realm_order[other]
# 将比较方法绑定到Realm类
Realm.__ge__ = _realm_ge
Realm.__le__ = _realm_le
Realm.__gt__ = _realm_gt
Realm.__lt__ = _realm_lt

View File

@@ -1,6 +1,7 @@
from dataclasses import dataclass
from src.utils.df import game_configs
from src.classes.cultivation import Realm
@dataclass
class Item:
@@ -10,7 +11,7 @@ class Item:
id: int
name: str
desc: str
grade: int
realm: Realm
def __hash__(self) -> int:
return hash(self.id)
@@ -29,7 +30,7 @@ def _load_items() -> tuple[dict[int, Item], dict[str, Item]]:
id=int(row["id"]),
name=str(row["name"]),
desc=str(row["desc"]),
grade=int(row["grade"])
realm=Realm.from_id(int(row["stage_id"]))
)
items_by_id[item.id] = item
items_by_name[item.name] = item

View File

@@ -1,6 +1,10 @@
from dataclasses import dataclass
from dataclasses import dataclass, field
from typing import Optional
from src.utils.df import game_configs
from src.utils.config import CONFIG
from src.classes.item import Item, items_by_id
from src.classes.cultivation import Realm
@dataclass
class Plant:
@@ -10,13 +14,35 @@ class Plant:
id: int
name: str
desc: str
grade: int
realm: Realm
item_ids: list[int] = field(default_factory=list) # 该植物对应的物品IDs
# 这些字段将在__post_init__中设置
items: list[Item] = field(init=False, default_factory=list) # 该植物对应的物品实例
def __post_init__(self):
"""初始化物品实例"""
for item_id in self.item_ids:
if item_id in items_by_id:
self.items.append(items_by_id[item_id])
def __hash__(self) -> int:
return hash(self.id)
def __str__(self) -> str:
return self.name
def get_info(self) -> str:
"""
获取植物的详细信息,包括名字、描述、境界和材料
"""
info_parts = [f"{self.name}】({self.realm.value})", self.desc]
if self.items:
item_names = [item.name for item in self.items]
info_parts.append(f"可获得材料:{', '.join(item_names)}")
return " - ".join(info_parts)
def _load_plants() -> tuple[dict[int, Plant], dict[str, Plant]]:
"""从配表加载plant数据"""
@@ -25,11 +51,19 @@ def _load_plants() -> tuple[dict[int, Plant], dict[str, Plant]]:
plant_df = game_configs["plant"]
for _, row in plant_df.iterrows():
# 处理item_ids
item_ids_list = []
item_ids = row.get("item_ids")
if item_ids is not None and str(item_ids).strip() and str(item_ids) != 'nan':
for item_id_str in str(item_ids).split(CONFIG.df.ids_separator):
item_ids_list.append(int(float(item_id_str.strip())))
plant = Plant(
id=int(row["id"]),
name=str(row["name"]),
desc=str(row["desc"]),
grade=int(row["grade"])
realm=Realm.from_id(int(row["stage_id"])),
item_ids=item_ids_list
)
plants_by_id[plant.id] = plant
plants_by_name[plant.name] = plant

View File

@@ -1,10 +1,13 @@
from dataclasses import dataclass, field
from typing import Union, TypeVar, Type
from typing import Union, TypeVar, Type, Optional
from enum import Enum
from abc import ABC, abstractmethod
from src.utils.df import game_configs
from src.utils.config import CONFIG
from src.classes.essence import EssenceType, Essence
from src.classes.animal import Animal, animals_by_id
from src.classes.plant import Plant, plants_by_id
def get_tiles_from_shape(shape: 'Shape', north_west_cor: str, south_east_cor: str) -> list[tuple[int, int]]:
@@ -182,13 +185,59 @@ class Shape(Enum):
class NormalRegion(Region):
"""
普通区域 - 平原、大河之类的,没有灵气或灵气很低
包含该区域分布的动植物物种信息
"""
animal_ids: list[int] = field(default_factory=list) # 该区域分布的动物物种IDs
plant_ids: list[int] = field(default_factory=list) # 该区域分布的植物物种IDs
# 这些字段将在__post_init__中设置
animals: list[Animal] = field(init=False, default_factory=list) # 该区域的动物实例
plants: list[Plant] = field(init=False, default_factory=list) # 该区域的植物实例
def __post_init__(self):
"""初始化动植物实例"""
# 先调用父类的__post_init__
super().__post_init__()
# 加载动物实例
for animal_id in self.animal_ids:
if animal_id in animals_by_id:
self.animals.append(animals_by_id[animal_id])
# 加载植物实例
for plant_id in self.plant_ids:
if plant_id in plants_by_id:
self.plants.append(plants_by_id[plant_id])
def get_region_type(self) -> str:
return "normal"
def get_species_info(self) -> str:
"""获取该区域动植物物种的描述信息"""
info_parts = []
if self.animals:
animal_infos = [animal.get_info() for animal in self.animals]
info_parts.extend(animal_infos)
if self.plants:
plant_infos = [plant.get_info() for plant in self.plants]
info_parts.extend(plant_infos)
return "; ".join(info_parts) if info_parts else "暂无特色物种"
def __str__(self) -> str:
return f"普通区域:{self.name} - {self.desc}"
species_info = self.get_species_info()
return f"普通区域:{self.name} - {self.desc} | 物种分布:{species_info}"
@property
def is_huntable(self) -> bool:
# 如果该区域有动物,则可以狩猎
return len(self.animals) > 0
@property
def is_harvestable(self) -> bool:
# 如果该区域有植物,则可以采集
return len(self.plants) > 0
@dataclass
@@ -262,6 +311,24 @@ def _load_regions(region_type: Type[T], config_name: str) -> tuple[dict[int, T],
base_params["essence_type"] = EssenceType.from_str(str(row["root_type"]))
base_params["essence_density"] = int(row["root_density"])
# 如果是普通区域添加动植物ID参数
elif region_type == NormalRegion:
# 处理动物IDs
animal_ids_list = []
animal_ids = row.get("animal_ids")
if animal_ids is not None and str(animal_ids).strip() and str(animal_ids) != 'nan':
for animal_id_str in str(animal_ids).split(CONFIG.df.ids_separator):
animal_ids_list.append(int(float(animal_id_str.strip())))
base_params["animal_ids"] = animal_ids_list
# 处理植物IDs
plant_ids_list = []
plant_ids = row.get("plant_ids")
if plant_ids is not None and str(plant_ids).strip() and str(plant_ids) != 'nan':
for plant_id_str in str(plant_ids).split(CONFIG.df.ids_separator):
plant_ids_list.append(int(float(plant_id_str.strip())))
base_params["plant_ids"] = plant_ids_list
region = region_type(**base_params)
regions_by_id[region.id] = region
regions_by_name[region.name] = region

View File

@@ -467,15 +467,25 @@ class Front:
f"描述: {region.desc}",
]
# 根据region类型添加灵气信息
from src.classes.region import CultivateRegion
# 根据region类型添加特殊信息
from src.classes.region import CultivateRegion, NormalRegion
if isinstance(region, CultivateRegion):
# 修炼区域:显示最高灵气类型和密度
# 修炼区域:显示灵气信息
stars = "" * region.essence_density + "" * (10 - region.essence_density)
lines.append(f"主要灵气: {region.essence_type} {stars}")
elif isinstance(region, NormalRegion):
# 普通区域:显示物种信息
species_info = region.get_species_info()
if species_info and species_info != "暂无特色物种":
lines.append("物种分布:")
# 将详细的物种信息按分号分割,每个物种信息作为单独一行
for species in species_info.split("; "):
lines.append(f" {species}")
else:
lines.append("物种分布: 暂无特色物种")
# 普通区域和城市区域不显示灵气信息
# 城市区域不显示额外信息
self._draw_tooltip(lines, mouse_x, mouse_y, self.tooltip_font)

View File

@@ -112,6 +112,8 @@ class Logger:
# 记录日志
log_message = f"LLM_INTERACTION: {json.dumps(log_data, ensure_ascii=False)}"
# 将JSON中的\n替换为真正的换行符使日志更易读
log_message = log_message.replace('\\n', '\n')
self.logger.info(log_message)
def log_error(self, error_message: str, prompt: str = None):
@@ -129,6 +131,8 @@ class Logger:
}
log_message = f"LLM_ERROR: {json.dumps(log_data, ensure_ascii=False)}"
# 将JSON中的\n替换为真正的换行符使日志更易读
log_message = log_message.replace('\\n', '\n')
self.logger.error(log_message)
def get_today_stats(self) -> dict:

View File

@@ -15,3 +15,5 @@ game:
init_npc_num: 3
npc_birth_rate_per_month: 0.001
df:
ids_separator: ""

View File

@@ -1,4 +1,11 @@
id,name,desc,grade
,,,
1,灵兔,天性机敏的灵性兔子,毛色雪白,蕴含微弱灵力,性情温和易驯服,1
2,魔狼,凶猛的魔性狼族,体型巨大,拥有强大的魔力和锋利的爪牙,2
id,name,desc,stage_id,item_ids
,,,"该动物对应的物品ID"
1,灵兔,天性机敏的灵性兔子,毛色雪白,蕴含微弱灵力,性情温和易驯服,1,1
2,魔狼,凶猛的魔性狼族,体型巨大,拥有强大的魔力和锋利的爪牙,2,2
3,青云鹿,栖息于平原地带的温和灵兽,通体青色,角如玉石,善于感知灵气变化,1,3
4,暗影豹,南疆蛮荒中的敏捷猎手,身形如影,爪牙锋利,擅长潜行狩猎,2,4
5,碧海龙龟,无边碧海的古老灵兽,龟甲如碧玉,能操控海水,寿命极长,3,5
6,石甲山熊,青峰山脉的强壮守护者,皮毛坚如磐石,力大无穷,性情憨厚,2,6
7,风速马,驰骋于碧野千里的神骏灵兽,四蹄生风,速度如电,鬃毛飘逸,2,7
8,熔岩蜥蜴,炎狱火山中的火系灵兽,鳞片赤红如火,能在岩浆中游泳,喷吐烈焰,3,8
9,毒瘴蛙,迷雾沼泽的剧毒生物,体色斑斓,能释放致命毒气,善于隐匿,2,9
1 id name desc grade stage_id item_ids
2 该动物对应的物品ID
3 1 灵兔 天性机敏的灵性兔子,毛色雪白,蕴含微弱灵力,性情温和易驯服 1 1 1
4 2 魔狼 凶猛的魔性狼族,体型巨大,拥有强大的魔力和锋利的爪牙 2 2 2
5 3 青云鹿 栖息于平原地带的温和灵兽,通体青色,角如玉石,善于感知灵气变化 1 3
6 4 暗影豹 南疆蛮荒中的敏捷猎手,身形如影,爪牙锋利,擅长潜行狩猎 2 4
7 5 碧海龙龟 无边碧海的古老灵兽,龟甲如碧玉,能操控海水,寿命极长 3 5
8 6 石甲山熊 青峰山脉的强壮守护者,皮毛坚如磐石,力大无穷,性情憨厚 2 6
9 7 风速马 驰骋于碧野千里的神骏灵兽,四蹄生风,速度如电,鬃毛飘逸 2 7
10 8 熔岩蜥蜴 炎狱火山中的火系灵兽,鳞片赤红如火,能在岩浆中游泳,喷吐烈焰 3 8
11 9 毒瘴蛙 迷雾沼泽的剧毒生物,体色斑斓,能释放致命毒气,善于隐匿 2 9

View File

@@ -1,6 +1,19 @@
id,name,desc,grade
id,name,desc,stage_id
,,,
1,灵兔,灵性充沛的兔子毛,质地柔软,常用于制作防护装备,1
2,魔狼皮毛,蕴含魔力的狼族皮毛,坚韧耐用,适合制作高级护甲,2
3,奇草,生长在灵气充沛之地的奇异草药,具有神奇的治愈效果,1
4,灵木,吸收天地灵气生长的珍贵木材,是制作法器的上等材料,2
1,灵兔毛,灵性充沛的兔子毛,质地柔软温暖,适合编织防寒衣物,1
2,魔狼,凶猛魔狼的锋利狼牙,蕴含魔力,是锻造利器的珍贵材料,2
3,青云鹿角,青云鹿的羼玉之角,蕴含清灵之气,是炼丹的上品药材,1
4,暗影豹爪,暗影豹的锋利爪子,轻盈而德,能增强武器的敏捷度,2
5,龙龟甲片,碧海龙龟的古老甲片,坚不可摧,蕴含海洋灵力,是顶级防具材料,3
6,山熊胆,石甲山熊的珍贵熊胆,能增强体质和力量,是体修者的珍贵药材,2
7,风速马鬃,风速马的飘逸鬃毛,轻如风羽,能用于炼制速度类法器,2
8,熔岩鳞片,熔岩蜥蜴的赤红鳞片,耐高温且蕴含火系灵力,是火属性法器的核心材料,3
9,毒瘴囊,毒瘴蛙的毒素囊袋,内含剧毒,是炼制毒类丹药的稀有材料,2
10,奇草精华,奇草提炼的精华,具有神奇的治愈效果,1
11,灵木心,灵木的珍贵木心,蕴含浓郁灵力,是制作法器的核心材料,2
12,仙人掌刺,沙漠仙人掌的灵药刻刺,能解百毒,制成针剂后效果显著,1
13,雪莲花瓣,寒霜雪莲的洁白花瓣,蕴含极寒之气,是寒性药材的最佳选择,2
14,灵芝孢子,水灵芝的蓝色孢子,能增强水行修炼者的灵力流通,2
15,雪绒花蕊,雪绒花的纯白花蕊,具有安神镇静功效,是冥想辅助的理想药材,1
16,古松松脂,千年古松的珍贵松脂,晶莹如琥珀,蕴含浓郁灵力,是高级炼器的稀有材料,3
17,灵稻精华,五谷灵稻提炼的精华,能快速强化体质,是体修丹药的主要成分,1
1 id name desc grade stage_id
2
3 1 灵兔皮毛 灵兔毛 灵性充沛的兔子皮毛,质地柔软,常用于制作防护装备 灵性充沛的兔子细毛,质地柔软温暖,适合编织防寒衣物 1 1
4 2 魔狼皮毛 魔狼牙 蕴含魔力的狼族皮毛,坚韧耐用,适合制作高级护甲 凶猛魔狼的锋利狼牙,蕴含魔力,是锻造利器的珍贵材料 2 2
5 3 奇草 青云鹿角 生长在灵气充沛之地的奇异草药,具有神奇的治愈效果 青云鹿的羼玉之角,蕴含清灵之气,是炼丹的上品药材 1 1
6 4 灵木 暗影豹爪 吸收天地灵气生长的珍贵木材,是制作法器的上等材料 暗影豹的锋利爪子,轻盈而德,能增强武器的敏捷度 2 2
7 5 龙龟甲片 碧海龙龟的古老甲片,坚不可摧,蕴含海洋灵力,是顶级防具材料 3
8 6 山熊胆 石甲山熊的珍贵熊胆,能增强体质和力量,是体修者的珍贵药材 2
9 7 风速马鬃 风速马的飘逸鬃毛,轻如风羽,能用于炼制速度类法器 2
10 8 熔岩鳞片 熔岩蜥蜴的赤红鳞片,耐高温且蕴含火系灵力,是火属性法器的核心材料 3
11 9 毒瘴囊 毒瘴蛙的毒素囊袋,内含剧毒,是炼制毒类丹药的稀有材料 2
12 10 奇草精华 奇草提炼的精华,具有神奇的治愈效果 1
13 11 灵木心 灵木的珍贵木心,蕴含浓郁灵力,是制作法器的核心材料 2
14 12 仙人掌刺 沙漠仙人掌的灵药刻刺,能解百毒,制成针剂后效果显著 1
15 13 雪莲花瓣 寒霜雪莲的洁白花瓣,蕴含极寒之气,是寒性药材的最佳选择 2
16 14 灵芝孢子 水灵芝的蓝色孢子,能增强水行修炼者的灵力流通 2
17 15 雪绒花蕊 雪绒花的纯白花蕊,具有安神镇静功效,是冥想辅助的理想药材 1
18 16 古松松脂 千年古松的珍贵松脂,晶莹如琥珀,蕴含浓郁灵力,是高级炼器的稀有材料 3
19 17 灵稻精华 五谷灵稻提炼的精华,能快速强化体质,是体修丹药的主要成分 1

View File

@@ -1,15 +1,15 @@
id,name,desc,shape,north-west-cor,south-east-cor
"ID必须以1开头",,,,
101,平原地带,地势平坦,灵气平和。是初学修炼者打基础和建立宗门的理想之地。,rectangle,"19,9","64,34"
102,西域流沙,茫茫大漠,黄沙漫天。此地气候干燥,日夜温差极大,是沙漠商队的必经之路。,rectangle,"0,0","18,49"
103,南疆蛮荒,古木参天,藤蔓缠绕。此地森林茂密,野兽众多,是采集药材和狩猎的危险之地。,rectangle,"19,35","64,45"
104,极北冰原,千里冰封,万年不化。此地严寒刺骨,风雪交加,只有最坚韧的冒险者才能在此生存。,rectangle,"19,0","64,8"
105,无边碧海,浩瀚无垠,波涛汹涌。此地风浪险恶,暗礁密布,是海商和渔民的挑战之海。,rectangle,"65,0","69,49"
106,天河奔流,一江春水向东流,奔腾不息入东海。此河贯穿东西,水流湍急,是重要的交通要道。,meandering,"18,25","67,47"
107,青峰山脉,连绵起伏,直插云霄。此地山势险峻,多有奇石异洞,是探险者寻宝的热门之地。,rectangle,"28,5","32,20"
108,万丈雪峰,雪峰皑皑,寒风刺骨。此地终年积雪,山路崎岖,是登山者的终极挑战。,rectangle,"25,2","34,7"
109,碧野千里,芳草萋萋,一望无际。此地水草丰美,牛羊成群,是游牧民族的天然牧场。,rectangle,"20,12","39,24"
110,青云林海,古树参天,绿意盎然。此地森林广袤,物产丰富,是伐木工和猎人的主要活动区域。,rectangle,"40,10","59,29"
111,炎狱火山,烈焰冲天,岩浆奔流。此地火山活跃,地热丰富,是铁匠锻造的理想之地,但也极其危险。,square,"52,32","54,34"
112,沃土良田,土地肥沃,五谷丰登。此地土壤深厚,雨水充沛,是农民耕种的黄金宝地。,rectangle,"33,25","37,29"
113,迷雾沼泽,雾气缭绕,泥泞不堪。此地地形复杂,瘴气丛生,是盗贼和亡命之徒的藏身之所。,rectangle,"42,30","45,33"
id,name,desc,shape,north-west-cor,south-east-cor,animal_ids,plant_ids
"ID必须以1开头",,,,,"该区域分布的动物物种IDs","该区域分布的植物物种IDs"
101,平原地带,地势平坦,灵气平和。是初学修炼者打基础和建立宗门的理想之地。,rectangle,"19,9","64,34",3,
102,西域流沙,茫茫大漠,黄沙漫天。此地气候干燥,日夜温差极大,是沙漠商队的必经之路。,rectangle,"0,0","18,49",,3
103,南疆蛮荒,古木参天,藤蔓缠绕。此地森林茂密,野兽众多,是采集药材和狩猎的危险之地。,rectangle,"19,35","64,45",4,
104,极北冰原,千里冰封,万年不化。此地严寒刺骨,风雪交加,只有最坚韧的冒险者才能在此生存。,rectangle,"19,0","64,8",,4
105,无边碧海,浩瀚无垠,波涛汹涌。此地风浪险恶,暗礁密布,是海商和渔民的挑战之海。,rectangle,"65,0","69,49",5,
106,天河奔流,一江春水向东流,奔腾不息入东海。此河贯穿东西,水流湍急,是重要的交通要道。,meandering,"18,25","67,47",,5
107,青峰山脉,连绵起伏,直插云霄。此地山势险峻,多有奇石异洞,是探险者寻宝的热门之地。,rectangle,"28,5","32,20",6,
108,万丈雪峰,雪峰皑皑,寒风刺骨。此地终年积雪,山路崎岖,是登山者的终极挑战。,rectangle,"25,2","34,7",,6
109,碧野千里,芳草萋萋,一望无际。此地水草丰美,牛羊成群,是游牧民族的天然牧场。,rectangle,"20,12","39,24",7,
110,青云林海,古树参天,绿意盎然。此地森林广袤,物产丰富,是伐木工和猎人的主要活动区域。,rectangle,"40,10","59,29",,7
111,炎狱火山,烈焰冲天,岩浆奔流。此地火山活跃,地热丰富,是铁匠锻造的理想之地,但也极其危险。,square,"52,32","54,34",8,
112,沃土良田,土地肥沃,五谷丰登。此地土壤深厚,雨水充沛,是农民耕种的黄金宝地。,rectangle,"33,25","37,29",,8
113,迷雾沼泽,雾气缭绕,泥泞不堪。此地地形复杂,瘴气丛生,是盗贼和亡命之徒的藏身之所。,rectangle,"42,30","45,33",9,
1 id name desc shape north-west-cor south-east-cor animal_ids plant_ids
2 ID必须以1开头 该区域分布的动物物种IDs 该区域分布的植物物种IDs
3 101 平原地带 地势平坦,灵气平和。是初学修炼者打基础和建立宗门的理想之地。 rectangle 19,9 64,34 3
4 102 西域流沙 茫茫大漠,黄沙漫天。此地气候干燥,日夜温差极大,是沙漠商队的必经之路。 rectangle 0,0 18,49 3
5 103 南疆蛮荒 古木参天,藤蔓缠绕。此地森林茂密,野兽众多,是采集药材和狩猎的危险之地。 rectangle 19,35 64,45 4
6 104 极北冰原 千里冰封,万年不化。此地严寒刺骨,风雪交加,只有最坚韧的冒险者才能在此生存。 rectangle 19,0 64,8 4
7 105 无边碧海 浩瀚无垠,波涛汹涌。此地风浪险恶,暗礁密布,是海商和渔民的挑战之海。 rectangle 65,0 69,49 5
8 106 天河奔流 一江春水向东流,奔腾不息入东海。此河贯穿东西,水流湍急,是重要的交通要道。 meandering 18,25 67,47 5
9 107 青峰山脉 连绵起伏,直插云霄。此地山势险峻,多有奇石异洞,是探险者寻宝的热门之地。 rectangle 28,5 32,20 6
10 108 万丈雪峰 雪峰皑皑,寒风刺骨。此地终年积雪,山路崎岖,是登山者的终极挑战。 rectangle 25,2 34,7 6
11 109 碧野千里 芳草萋萋,一望无际。此地水草丰美,牛羊成群,是游牧民族的天然牧场。 rectangle 20,12 39,24 7
12 110 青云林海 古树参天,绿意盎然。此地森林广袤,物产丰富,是伐木工和猎人的主要活动区域。 rectangle 40,10 59,29 7
13 111 炎狱火山 烈焰冲天,岩浆奔流。此地火山活跃,地热丰富,是铁匠锻造的理想之地,但也极其危险。 square 52,32 54,34 8
14 112 沃土良田 土地肥沃,五谷丰登。此地土壤深厚,雨水充沛,是农民耕种的黄金宝地。 rectangle 33,25 37,29 8
15 113 迷雾沼泽 雾气缭绕,泥泞不堪。此地地形复杂,瘴气丛生,是盗贼和亡命之徒的藏身之所。 rectangle 42,30 45,33 9

View File

@@ -6,3 +6,5 @@ id,name,prompt
4,冒险,你是一个冒险的人,你总是会冒险,喜欢刺激,总想放手一搏。
5,随性,你是一个随性的人,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。
6,贪财,你是一个贪财的人,你对灵石和财富有着强烈的渴望。
7,采药,你是一个热爱采集的人,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。你认为大自然的恩赐需要用心去发现和珍惜。
8,猎者,你是一个热爱狩猎的人,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌。你相信通过狩猎能够磨练自己的意志和技能,获得更强大的力量。
1 id name prompt
6 4 冒险 你是一个冒险的人,你总是会冒险,喜欢刺激,总想放手一搏。
7 5 随性 你是一个随性的人,你总是会随机应变,性子到哪里了就是哪里,没有一定之规。
8 6 贪财 你是一个贪财的人,你对灵石和财富有着强烈的渴望。
9 7 采药 你是一个热爱采集的人,喜欢在山林中寻找各种奇花异草和灵药,对植物有着敏锐的直觉和深厚的兴趣。你认为大自然的恩赐需要用心去发现和珍惜。
10 8 猎者 你是一个热爱狩猎的人,享受在野外追踪猎物的刺激感,对各种动物的习性了如指掌。你相信通过狩猎能够磨练自己的意志和技能,获得更强大的力量。

View File

@@ -1,4 +1,10 @@
id,name,desc,grade
,,,
1,奇草,生长在灵气充沛之地的奇异草药,叶片呈淡蓝色,具有神奇的治愈效果,1
2,灵木,千年古树吸收天地灵气而成,木质坚硬且蕴含浓郁灵力,2
id,name,desc,stage_id,item_ids
,,,"该植物对应的物品ID"
1,奇草,生长在灵气充沛之地的奇异草药,叶片呈淡蓝色,具有神奇的治愈效果,1,10
2,灵木,千年古树吸收天地灵气而成,木质坚硬且蕴含浓郁灵力,2,11
3,沙漠仙人掌,生长于西域流沙的神奇植物,能储存大量灵气和水分,刺中含灵药,1,12
4,寒霜雪莲,极北冰原的珍贵灵药,花瓣洁白如雪,蕴含极寒之气,能清热解毒,2,13
5,水灵芝,生长于天河河底的水系灵药,呈半透明蓝色,能增强修炼者水行灵力,2,14
6,雪绒花,万丈雪峰的高山植物,花瓣细小洁白,能抗严寒,具有安神镇静功效,1,15
7,千年古松,青云林海中的古老巨树,树龄超过千年,树脂含有丰富灵力,3,16
8,五谷灵稻,沃土良田中培育的灵性稻谷,粒粒饱满灵气,能增强修炼者体质,1,17
1 id name desc grade stage_id item_ids
2 该植物对应的物品ID
3 1 奇草 生长在灵气充沛之地的奇异草药,叶片呈淡蓝色,具有神奇的治愈效果 1 1 10
4 2 灵木 千年古树吸收天地灵气而成,木质坚硬且蕴含浓郁灵力 2 2 11
5 3 沙漠仙人掌 生长于西域流沙的神奇植物,能储存大量灵气和水分,刺中含灵药 1 12
6 4 寒霜雪莲 极北冰原的珍贵灵药,花瓣洁白如雪,蕴含极寒之气,能清热解毒 2 13
7 5 水灵芝 生长于天河河底的水系灵药,呈半透明蓝色,能增强修炼者水行灵力 2 14
8 6 雪绒花 万丈雪峰的高山植物,花瓣细小洁白,能抗严寒,具有安神镇静功效 1 15
9 7 千年古松 青云林海中的古老巨树,树龄超过千年,树脂含有丰富灵力 3 16
10 8 五谷灵稻 沃土良田中培育的灵性稻谷,粒粒饱满灵气,能增强修炼者体质 1 17