| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- #!/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())
|