全站通知:
模块:Dialogue/data/accept birthday gift/doc
刷
历
编
跳到导航
跳到搜索
当前页面的数据通过以下 Python 代码生成,后续如果游戏版本更新,可重新执行脚本,导出最新的数据。
import os
import json
from pathlib import Path
def load_fallback_dialogues():
strings_file = Path(r"\Content (unpacked)\Strings\StringsFromCSFiles.zh-CN.json")
fallback_dialogues = {}
if strings_file.exists():
try:
with open(strings_file, 'r', encoding='utf-8') as f:
strings_data = json.load(f)
keys = [
"NPC.cs.4274", "NPC.cs.4275", "NPC.cs.4276", "NPC.cs.4277",
"NPC.cs.4278", "NPC.cs.4279", "NPC.cs.4280", "NPC.cs.4281"
]
for key in keys:
if key in strings_data:
fallback_dialogues[key] = strings_data[key]
except Exception as e:
print(f"加载 StringsFromCSFiles 时出错: {e}")
return fallback_dialogues
def process_stardew_birthday_dialogue():
dialogue_dir = Path(r"\Content (unpacked)\Characters\Dialogue")
if not dialogue_dir.exists():
return
all_birthday_gifts = {}
for file_path in dialogue_dir.glob("*.zh-CN.json"):
character_name = file_path.stem.replace(".zh-CN", "")
try:
with open(file_path, 'r', encoding='utf-8') as f:
dialogue_data = json.load(f)
birthday_gift_data = {}
for key, value in dialogue_data.items():
if key.startswith("AcceptBirthdayGift_"):
birthday_gift_data[key] = value
if birthday_gift_data:
all_birthday_gifts[character_name] = birthday_gift_data
except Exception as e:
continue
return all_birthday_gifts
def add_fallback_dialogues(birthday_data, fallback_dialogues):
rude_dialogues = {
"AcceptBirthdayGift_Positive_1": fallback_dialogues.get("NPC.cs.4276", ""),
"AcceptBirthdayGift_Positive_2": fallback_dialogues.get("NPC.cs.4274", ""),
"AcceptBirthdayGift_Negative": fallback_dialogues.get("NPC.cs.4278", ""),
"AcceptBirthdayGift_Neutral": fallback_dialogues.get("NPC.cs.4280", "")
}
polite_dialogues = {
"AcceptBirthdayGift_Positive_1": fallback_dialogues.get("NPC.cs.4277", ""),
"AcceptBirthdayGift_Positive_2": fallback_dialogues.get("NPC.cs.4275", ""),
"AcceptBirthdayGift_Negative": fallback_dialogues.get("NPC.cs.4279", ""),
"AcceptBirthdayGift_Neutral": fallback_dialogues.get("NPC.cs.4281", "")
}
if rude_dialogues and any(rude_dialogues.values()):
birthday_data["_FallbackDialogues_Rude"] = rude_dialogues
if polite_dialogues and any(polite_dialogues.values()):
birthday_data["_FallbackDialogues_Polite"] = polite_dialogues
return birthday_data
def generate_lua_table(data, output_file="Birthday_Dialogue_Data.lua"):
def dict_to_lua(obj, indent=0):
spaces = " " * indent
if isinstance(obj, dict):
if not obj:
return "{}"
lines = ["{"]
for key, value in obj.items():
key_str = key if key.isidentifier() else f'["{key}"]'
value_str = dict_to_lua(value, indent + 1)
lines.append(f"{spaces} {key_str} = {value_str},")
lines.append(f"{spaces}}}")
return "\n".join(lines)
elif isinstance(obj, str):
escaped = obj.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n")
return f'"{escaped}"'
elif isinstance(obj, (int, float)):
return str(obj)
elif isinstance(obj, bool):
return "true" if obj else "false"
elif obj is None:
return "nil"
else:
return f'"{str(obj)}"'
try:
lua_content = f"""-- Stardew Valley AcceptBirthdayGift 对话数据
-- 生成时间: {__import__('datetime').datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
-- 总角色数: {len(data)}
-- 数据结构: [角色名][对话键] = "对话内容"
-- 特殊键 _FallbackDialogues_Rude 包含 Manner=2 (Rude) 的通用生日对话
-- 特殊键 _FallbackDialogues_Polite 包含 Manner≠2 (Polite) 的通用生日对话
local birthday_dialogue_data = {dict_to_lua(data)}
return birthday_dialogue_data
"""
with open(output_file, 'w', encoding='utf-8') as f:
f.write(lua_content)
print(f"成功生成 Lua 文件: {Path(output_file).absolute()}")
return True
except Exception as e:
print(f"生成 Lua 文件时出错: {e}")
return False
def main():
print("开始处理 Stardew Valley 生日对话数据...")
fallback_dialogues = load_fallback_dialogues()
result = process_stardew_birthday_dialogue()
if result:
result = add_fallback_dialogues(result, fallback_dialogues)
if generate_lua_table(result):
print("处理完成!")
total_dialogues = sum(len(dialogues) for dialogues in result.values())
print(f"总对话数: {total_dialogues}")
else:
print("生成 Lua 文件失败")
else:
print("没有提取到对话数据")
if __name__ == "__main__":
main()