#!/usr/bin/env python3 import json import os import sys if len(sys.argv) != 3: sys.exit('Usage: biomes.py ') biomes = {} for file in os.scandir(os.path.join(sys.argv[1], 'data/minecraft/worldgen/biome')): (name, ext) = os.path.splitext(file.name) if ext != '.json': continue with open(file) as f: data = json.load(f) biomes[name] = { 'downfall': data['downfall'], 'temperature': data['temperature'], 'foliage_color': data['effects'].get('foliage_color'), 'grass_color': data['effects'].get('grass_color'), 'grass_color_modifier': data['effects'].get('grass_color_modifier'), 'water_color': data['effects'].get('water_color'), } def color(v): return f'[{v>>16}, {(v>>8)&0xff}, {v&0xff}]' # Converts the snake_case grass color modifier to CamelCase def modify(v): return ''.join([s.capitalize() for s in v.split('_')]) def gen_biome(name, info, f): temp = round(100*info['temperature']) downfall = round(100*info['downfall']) foliage_color = info['foliage_color'] grass_color = info['grass_color'] grass_color_modifier = info['grass_color_modifier'] water_color = info['water_color'] print(f'\t("{name}", Biome::new({temp}, {downfall})', file=f) if foliage_color is not None: print(f'\t\t.foliage({color(foliage_color)})', file=f) if grass_color is not None: print(f'\t\t.grass({color(grass_color)})', file=f) if grass_color_modifier is not None: print(f'\t\t.modify({modify(grass_color_modifier)})', file=f) if water_color is not None and water_color != 0x3f76e4: print(f'\t\t.water({color(water_color)})', file=f) print('\t),', file=f) with open(sys.argv[2], 'w') as f: print('//! Biome data', file=f); print('//!', file=f); print('//! This file is generated using resource/biomes.py, do not edit', file=f); print('', file=f) print('use super::*;', file=f) print('use BiomeGrassColorModifier::*;', file=f) print('', file=f) print('/// List if known biomes and their properties', file=f); print('pub const BIOMES: &[(&str, Biome)] = &[', file=f) for name in sorted(biomes): gen_biome(name, biomes[name], f) print('];', file=f)