#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 从weapons.json生成Excel配置表 确保Excel配置与JSON配置保持同步 """ import json import os from pathlib import Path from datetime import datetime try: import pandas as pd PANDAS_AVAILABLE = True except ImportError: PANDAS_AVAILABLE = False print("错误: pandas未安装,无法生成Excel文件") print("请运行: pip install pandas openpyxl") exit(1) class WeaponExcelGenerator: """从weapons.json生成Excel配置表的工具类""" def __init__(self, json_file_path=None, excel_output_path=None): """初始化生成器 Args: json_file_path: weapons.json文件路径 excel_output_path: 输出Excel文件路径 """ self.script_dir = Path(__file__).parent # 设置默认路径 if json_file_path is None: self.json_file = self.script_dir.parent / "weapons.json" else: self.json_file = Path(json_file_path) if excel_output_path is None: self.excel_file = self.script_dir / "方块武器配置" / "方块武器配置表.xlsx" else: self.excel_file = Path(excel_output_path) print(f"JSON文件路径: {self.json_file}") print(f"Excel输出路径: {self.excel_file}") # 确保输出目录存在 self.excel_file.parent.mkdir(parents=True, exist_ok=True) def load_weapons_json(self): """加载weapons.json文件""" try: if not self.json_file.exists(): raise FileNotFoundError(f"JSON文件不存在: {self.json_file}") with open(self.json_file, 'r', encoding='utf-8') as f: config = json.load(f) print(f"成功加载JSON配置,包含 {len(config.get('weapons', []))} 个武器") return config except Exception as e: print(f"加载JSON配置失败: {e}") raise def create_weapon_base_config_sheet(self, weapons_data): """创建武器基础配置工作表""" base_config_data = [] # 表头 headers = [ 'ID', '名称', '类型', '稀有度', '权重', '伤害', '射速', '射程', '子弹速度', '子弹数量', '子弹轨迹类型', '子弹速度值', '穿透数', '反弹次数', '精灵路径', '音效路径' ] for weapon in weapons_data: # 提取基础信息 weapon_id = weapon.get('id', '') name = weapon.get('name', '') weapon_type = weapon.get('type', '') rarity = weapon.get('rarity', '') weight = weapon.get('weight', 0) # 提取统计信息 stats = weapon.get('stats', {}) damage = stats.get('damage', 0) fire_rate = stats.get('fireRate', 0.0) weapon_range = stats.get('range', 0) bullet_speed = stats.get('bulletSpeed', 0) # 提取子弹配置 bullet_config = weapon.get('bulletConfig', {}) bullet_count = bullet_config.get('bulletCount', 1) # 提取轨迹配置 trajectory = bullet_config.get('trajectory', {}) trajectory_type = trajectory.get('type', '') trajectory_speed = trajectory.get('speed', 0) pierce_count = trajectory.get('pierceCount', 0) bounce_count = trajectory.get('bounceCount', 0) # 提取视觉配置 visuals = weapon.get('visuals', {}) sprite_path = visuals.get('spritePath', '') sound_path = visuals.get('soundPath', '') base_config_data.append([ weapon_id, name, weapon_type, rarity, weight, damage, fire_rate, weapon_range, bullet_speed, bullet_count, trajectory_type, trajectory_speed, pierce_count, bounce_count, sprite_path, sound_path ]) # 创建DataFrame df = pd.DataFrame(base_config_data, columns=headers) return df def create_upgrade_cost_sheet(self, weapons_data): """创建武器升级费用配置工作表""" upgrade_data = [] # 表头:武器ID + 等级1-10费用 + 等级1-10伤害 headers = ['武器ID', '武器名称', '基础伤害', '最大伤害'] # 添加等级1-10的费用列 for level in range(1, 11): headers.append(f'等级{level}费用') # 添加等级1-10的伤害列 for level in range(1, 11): headers.append(f'等级{level}伤害') for weapon in weapons_data: weapon_id = weapon.get('id', '') weapon_name = weapon.get('name', '') base_damage = weapon.get('stats', {}).get('damage', 0) # 获取升级配置 upgrade_config = weapon.get('upgradeConfig', {}) levels = upgrade_config.get('levels', {}) row_data = [weapon_id, weapon_name, base_damage] # 计算最大伤害 max_damage = base_damage for level in range(1, 11): level_config = levels.get(str(level), {}) level_damage = level_config.get('damage', base_damage) if level_damage > max_damage: max_damage = level_damage row_data.append(max_damage) # 添加等级1-10的费用 for level in range(1, 11): level_config = levels.get(str(level), {}) cost = level_config.get('cost', '') row_data.append(cost) # 添加等级1-10的伤害 for level in range(1, 11): level_config = levels.get(str(level), {}) damage = level_config.get('damage', base_damage) row_data.append(damage) upgrade_data.append(row_data) # 创建DataFrame df = pd.DataFrame(upgrade_data, columns=headers) return df def create_game_cost_sheet(self, weapons_data): """创建游戏内成本配置工作表""" cost_data = [] # 表头 headers = [ '武器ID', '武器名称', '武器基础售价', 'I形状成本', 'H-I形状成本', 'L形状成本', 'S形状成本', 'D-T形状成本', 'O形状成本', 'T形状成本', 'Z形状成本', 'J形状成本', 'U形状成本' ] for weapon in weapons_data: weapon_id = weapon.get('id', '') weapon_name = weapon.get('name', '') # 获取游戏内成本配置 cost_config = weapon.get('inGameCostConfig', {}) base_cost = cost_config.get('baseCost', 5) shape_costs = cost_config.get('shapeCosts', {}) row_data = [weapon_id, weapon_name, base_cost] # 添加各形状成本 shape_keys = ['I', 'H-I', 'L', 'S', 'D-T', 'O', 'T', 'Z', 'J', 'U'] for shape_key in shape_keys: cost = shape_costs.get(shape_key, '') row_data.append(cost) cost_data.append(row_data) # 创建DataFrame df = pd.DataFrame(cost_data, columns=headers) return df def create_rarity_weights_sheet(self, config_data): """创建稀有度权重配置工作表""" rarity_weights = config_data.get('rarityWeights', {}) rarity_data = [] headers = ['稀有度', '权重', '描述'] # 稀有度描述映射 rarity_descriptions = { 'common': '普通', 'uncommon': '不常见', 'rare': '稀有', 'epic': '史诗' } for rarity, weight in rarity_weights.items(): description = rarity_descriptions.get(rarity, '') rarity_data.append([rarity, weight, description]) # 创建DataFrame df = pd.DataFrame(rarity_data, columns=headers) return df def create_rarity_damage_multipliers_sheet(self, config_data): """创建稀有度伤害倍率配置工作表""" rarity_damage_multipliers = config_data.get('rarityDamageMultipliers', []) multiplier_data = [] headers = ['配置项', '值', '描述'] # 将数组转换为逗号分隔的字符串 multipliers_str = ', '.join(map(str, rarity_damage_multipliers)) # 添加配置行 multiplier_data.append([ 'rarityDamageMultipliers', multipliers_str, '稀有度伤害倍率数组,按等级顺序:[普通, 不常见, 稀有, 史诗]' ]) # 添加说明行 rarity_level_names = ['普通(common)', '不常见(uncommon)', '稀有(rare)', '史诗(epic)'] for i, multiplier in enumerate(rarity_damage_multipliers): if i < len(rarity_level_names): multiplier_data.append([ f'等级{i}', str(multiplier), f'{rarity_level_names[i]} - {multiplier}倍伤害' ]) # 创建DataFrame df = pd.DataFrame(multiplier_data, columns=headers) return df def create_block_shapes_sheet(self, config_data): """创建方块形状配置工作表""" block_sizes = config_data.get('blockSizes', []) shape_data = [] headers = ['ID', '名称', '形状矩阵', '占用格数', '成本倍数', '描述'] for shape in block_sizes: shape_id = shape.get('id', '') name = shape.get('name', '') shape_matrix = str(shape.get('shape', [])) grid_count = shape.get('gridCount', 0) cost_multiplier = shape.get('costMultiplier', 1) description = shape.get('description', '') shape_data.append([ shape_id, name, shape_matrix, grid_count, cost_multiplier, description ]) # 创建DataFrame df = pd.DataFrame(shape_data, columns=headers) return df def generate_excel_file(self): """生成Excel配置文件""" try: # 加载JSON配置 config_data = self.load_weapons_json() weapons_data = config_data.get('weapons', []) if not weapons_data: print("警告: 没有找到武器数据") return False print(f"开始生成Excel文件,包含 {len(weapons_data)} 个武器...") # 创建Excel写入器 with pd.ExcelWriter(self.excel_file, engine='openpyxl') as writer: # 创建武器基础配置工作表 base_config_df = self.create_weapon_base_config_sheet(weapons_data) base_config_df.to_excel(writer, sheet_name='武器基础配置', index=False) print("✓ 创建武器基础配置工作表") # 创建武器升级费用配置工作表 upgrade_cost_df = self.create_upgrade_cost_sheet(weapons_data) upgrade_cost_df.to_excel(writer, sheet_name='武器升级费用配置', index=False) print("✓ 创建武器升级费用配置工作表") # 创建游戏内成本配置工作表 game_cost_df = self.create_game_cost_sheet(weapons_data) game_cost_df.to_excel(writer, sheet_name='游戏内成本配置', index=False) print("✓ 创建游戏内成本配置工作表") # 创建稀有度权重配置工作表 rarity_weights_df = self.create_rarity_weights_sheet(config_data) rarity_weights_df.to_excel(writer, sheet_name='稀有度权重配置', index=False) print("✓ 创建稀有度权重配置工作表") # 创建稀有度伤害倍率配置工作表 rarity_damage_multipliers_df = self.create_rarity_damage_multipliers_sheet(config_data) rarity_damage_multipliers_df.to_excel(writer, sheet_name='稀有度伤害倍率配置', index=False) print("✓ 创建稀有度伤害倍率配置工作表") # 创建方块形状配置工作表 block_shapes_df = self.create_block_shapes_sheet(config_data) block_shapes_df.to_excel(writer, sheet_name='方块形状配置', index=False) print("✓ 创建方块形状配置工作表") print(f"\n✅ Excel文件生成成功: {self.excel_file}") print(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") return True except Exception as e: print(f"❌ 生成Excel文件失败: {e}") return False def main(): """主函数""" print("=== 从weapons.json生成Excel配置表 ===") print(f"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print() # 创建生成器 generator = WeaponExcelGenerator() # 生成Excel文件 success = generator.generate_excel_file() if success: print("\n🎉 Excel配置表生成完成!") print("\n生成的工作表包括:") print(" 1. 武器基础配置 - 包含所有武器的基本属性") print(" 2. 武器升级费用配置 - 包含武器升级的费用和伤害配置") print(" 3. 游戏内成本配置 - 包含武器在游戏中的购买成本") print(" 4. 稀有度权重配置 - 包含武器稀有度的权重分布") print(" 5. 稀有度伤害倍率配置 - 包含不同稀有度的伤害倍率") print(" 6. 方块形状配置 - 包含所有方块形状的定义") else: print("\n❌ Excel配置表生成失败!") return 1 return 0 if __name__ == '__main__': exit(main())