#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 将JSON配置文件转换为Excel格式的工具 专门用于将enemies.json转换为敌人配置表.xlsx 作者: AI Assistant 日期: 2024 """ import json import pandas as pd from pathlib import Path import sys from datetime import datetime def load_enemies_json(json_path): """加载enemies.json文件""" try: with open(json_path, 'r', encoding='utf-8') as f: data = json.load(f) return data except Exception as e: print(f"加载JSON文件失败: {e}") return None def convert_enemies_to_excel_data(enemies_data): """将敌人JSON数据转换为Excel表格数据""" excel_data = [] for enemy in enemies_data.get('enemies', []): # 基础信息 row = { 'ID': enemy.get('id', ''), '敌人名称': enemy.get('name', ''), '敌人类型': enemy.get('type', ''), '稀有度': enemy.get('rarity', ''), } # 基础属性 stats = enemy.get('stats', {}) row.update({ '生命值': stats.get('health', 0), '最大生命值': stats.get('maxHealth', 0), '防御力': stats.get('defense', 0), '移动速度': stats.get('speed', 0), }) # 移动配置 movement = enemy.get('movement', {}) row.update({ '移动模式': movement.get('pattern', ''), '移动速度值': movement.get('speed', 0), '巡逻范围': movement.get('patrolRange', 0), '旋转速度': movement.get('rotationSpeed', 0), }) # 战斗配置 combat = enemy.get('combat', {}) row.update({ '攻击伤害': combat.get('attackDamage', 0), '攻击范围': combat.get('attackRange', 0), '攻击速度': combat.get('attackSpeed', 0), '可以格挡': combat.get('canBlock', False), '格挡几率': combat.get('blockChance', 0), '格挡伤害减免': combat.get('blockDamageReduction', 0), '攻击冷却': combat.get('attackCooldown', 0), }) # 视觉配置 visual = enemy.get('visualConfig', {}) row.update({ '精灵路径': visual.get('spritePath', ''), '缩放': visual.get('scale', 1.0), '动画速度': visual.get('animationSpeed', 1.0), }) # 音频配置 audio = enemy.get('audioConfig', {}) row.update({ '攻击音效': audio.get('attackSound', ''), '死亡音效': audio.get('deathSound', ''), '受击音效': audio.get('hitSound', ''), }) # 特殊配置 stealth_config = enemy.get('stealthConfig', {}) if stealth_config: row.update({ '可隐身': stealth_config.get('canStealth', False), '隐身持续时间': stealth_config.get('stealthDuration', 0), '隐身冷却时间': stealth_config.get('stealthCooldown', 0), '隐身透明度': stealth_config.get('stealthAlpha', 1.0), }) else: row.update({ '可隐身': False, '隐身持续时间': 0, '隐身冷却时间': 0, '隐身透明度': 1.0, }) # BOSS配置 boss_config = enemy.get('bossConfig', {}) if boss_config: row.update({ '是否BOSS': boss_config.get('isBoss', False), 'BOSS阶段数': boss_config.get('phases', 1), '狂暴阈值': boss_config.get('enrageThreshold', 0), '狂暴伤害倍数': boss_config.get('enrageDamageMultiplier', 1.0), '狂暴速度倍数': boss_config.get('enrageSpeedMultiplier', 1.0), }) else: row.update({ '是否BOSS': False, 'BOSS阶段数': 1, '狂暴阈值': 0, '狂暴伤害倍数': 1.0, '狂暴速度倍数': 1.0, }) # 特殊技能 special_abilities = enemy.get('specialAbilities', []) abilities_text = '' if special_abilities: abilities_list = [] for ability in special_abilities: ability_str = f"{ability.get('type', '')}(伤害:{ability.get('damage', 0)},范围:{ability.get('range', ability.get('radius', 0))},冷却:{ability.get('cooldown', 0)})" abilities_list.append(ability_str) abilities_text = '; '.join(abilities_list) row['特殊技能'] = abilities_text excel_data.append(row) return excel_data def save_to_excel(excel_data, output_path): """保存数据到Excel文件""" try: # 创建DataFrame df = pd.DataFrame(excel_data) # 创建Excel写入器 with pd.ExcelWriter(output_path, engine='openpyxl') as writer: # 写入敌人基础配置工作表 df.to_excel(writer, sheet_name='敌人基础配置', index=False) # 获取工作表对象进行格式化 worksheet = writer.sheets['敌人基础配置'] # 调整列宽 for column in worksheet.columns: max_length = 0 column_letter = column[0].column_letter for cell in column: try: if len(str(cell.value)) > max_length: max_length = len(str(cell.value)) except: pass adjusted_width = min(max_length + 2, 50) worksheet.column_dimensions[column_letter].width = adjusted_width print(f"Excel文件已保存到: {output_path}") return True except Exception as e: print(f"保存Excel文件失败: {e}") return False def main(): """主函数""" # 设置文件路径 script_dir = Path(__file__).parent json_path = script_dir.parent / 'enemies.json' excel_path = script_dir / '敌人配置表.xlsx' print(f"JSON文件路径: {json_path}") print(f"Excel文件路径: {excel_path}") # 检查JSON文件是否存在 if not json_path.exists(): print(f"错误: JSON文件不存在: {json_path}") return False # 加载JSON数据 print("正在加载JSON数据...") enemies_data = load_enemies_json(json_path) if not enemies_data: return False # 转换数据 print("正在转换数据格式...") excel_data = convert_enemies_to_excel_data(enemies_data) print(f"成功转换 {len(excel_data)} 个敌人配置") # 保存到Excel print("正在保存Excel文件...") success = save_to_excel(excel_data, excel_path) if success: print("\n转换完成!") print(f"已将 {len(excel_data)} 个敌人配置保存到Excel文件") print(f"文件位置: {excel_path}") return True else: print("\n转换失败!") return False if __name__ == "__main__": main()