全站通知:

模块:Dialogue/data/accept birthday gift/doc

来自星露谷物语维基
跳到导航 跳到搜索
[ 刷新 ]
当前页面是文档页面,会被模块:Dialogue/data/accept birthday gift引入。查看模板:Documentation获取更多信息。

当前页面的数据通过以下 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()