| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!/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('chaseRange', 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()
|