"""Art parameters only; combat statistics remain in Godot's DataCatalog. Edit HEIGHTS, FOOTPRINT or individual specs to change proportions. Upgraded models switch geometry in their builder; they are never only enlarged copies. """ import json from pathlib import Path ROOT = Path(__file__).resolve().parent PROJECT = ROOT.parents[2] SOURCE = ROOT.parent DEFAULT_EXPORT_DIR = PROJECT / 'assets' / 'models' DEFAULT_BLEND_DIR = SOURCE / 'blend' FOOTPRINT = 1.85 # Fits inside a 2m construction cell, including weapons. HEIGHTS = {'melee': 1.35, 'tank': 1.35, 'ranged': 1.45, 'artillery': 1.35, 'support': 1.45} def specs(): plan = json.loads((PROJECT / 'assets-source/phase3/asset_plan.json').read_text())['assets'] result = [] for asset in plan: if asset['kind'] not in ('unit_icon', 'mercenary_icon'): continue number = int(asset['id'][1:]) if asset['kind'] == 'unit_icon': roles = ['melee', 'tank', 'ranged', 'artillery', 'support'] if asset['faction'] in ('nietenkonvent', 'nebelchor'): roles[0], roles[1] = roles[1], roles[0] role = roles[(number - 1) // 2] upgraded = number % 2 == 0 height = HEIGHTS[role] + (0.15 if upgraded else 0) else: role, upgraded, height = 'mercenary', False, 1.4 + (0.15 if number == 5 else 0) result.append({'id': asset['id'], 'name': asset['display_name'], 'faction': asset['faction'], 'palette': asset['faction'], 'role': role, 'upgraded': upgraded, 'height': height, 'footprint': FOOTPRINT, 'file': 'unit_' + asset['id'] + '.glb'}) result.extend([ {'id': 'worker', 'name': 'Funkenleser', 'faction': 'neutral', 'palette': 'worker', 'role': 'worker', 'upgraded': False, 'height': 1.1, 'footprint': 1.4, 'file': 'worker.glb'}, {'id': 'map_lane_segment', 'name': 'Lane-Segment', 'faction': 'terrain', 'palette': 'terrain', 'role': 'lane', 'upgraded': False, 'height': 0, 'file': 'map_lane_segment.glb'}, *[{'id': 'core_team' + str(team), 'name': 'Saumkern · Team ' + str(team), 'faction': 'team' + str(team), 'palette': 'team' + str(team), 'role': 'core', 'team': team, 'upgraded': False, 'height': 2.2, 'footprint': 3.2, 'file': 'core_team' + str(team) + '.glb'} for team in (0, 1)] ]) enemies=[('e01','Splitterling',1.05,1.85),('e02','Schalenläufer',1.42,1.85),('e03','Nebelrest',1.9,1.55),('e04','Fadenschütze',1.8,1.85),('e05','Bruchstampfer',2.0,2.1),('e06','Knotenrufer',2.0,1.9),('e07','Bruchhirsch',2.6,2.5),('e08','Riegelkoloss',2.6,2.7),('e09','Maskenrichter',2.9,2.6),('e10','Schlundkrone',2.9,3.1)] for id,name,height,footprint in enemies: result.append({'id':id,'name':name,'faction':'rift','palette':'neutral','role':'enemy','upgraded':False,'height':height,'footprint':footprint,'file':'enemy_'+id+'.glb'}) for spec in result: if spec['faction'] in ('glutpakt','wurzelbund','rift','neutral') or spec['role'] in ('lane','core'): spec['triangle_budget'] = 180000 spec['detail_level'] = 'high' return result def get_spec(asset_id): for spec in specs(): if spec['id'] == asset_id: return dict(spec) raise ValueError('Unknown asset ID: ' + asset_id)