Spaces:
Running
Running
| """Deterministic world specification (V6). | |
| Meters, +Z up, origin at meadow center. Layout derives from seed; the spec | |
| dict is hashed (spec_hash) and persisted with every backup. | |
| """ | |
| import hashlib | |
| import json | |
| from typing import Any, Dict, List | |
| WORLD_SPEC_VERSION = "world3d_v1" | |
| WORLD_SIZE = 40.0 # 40 x 40 m ground | |
| def build_world_spec(seed: int = 7) -> Dict[str, Any]: | |
| import numpy as _np | |
| rng = _np.random.RandomState(seed) | |
| trees = [{"id": f"tree_{i}", "x": round(float(x), 2), "y": round(float(y), 2)} | |
| for i, (x, y) in enumerate([(-12.0, -9.0), (-9.5, -12.5), (11.0, -10.0), | |
| (13.5, 6.0), (-13.0, 8.0), (9.0, 12.0)])] | |
| rocks = [{"id": f"rock_{i}", "x": x, "y": y, "r": r} for i, (x, y, r) in | |
| enumerate([(6.0, -4.0, 0.7), (-5.0, 5.5, 0.5), (2.0, 10.0, 0.9)])] | |
| foods = [{"id": f"food_{i}", "x": round(float(rng.uniform(-14, 14)), 2), | |
| "y": round(float(rng.uniform(-14, 14)), 2), "energy": 0.25} | |
| for i in range(8)] | |
| spec = { | |
| "version": WORLD_SPEC_VERSION, "seed": int(seed), "size": WORLD_SIZE, | |
| "ground": {"size": WORLD_SIZE}, | |
| "home": {"cx": 0.0, "cy": 10.0, "w": 7.0, "d": 6.0, "wall_h": 2.4, | |
| "wall_t": 0.3, "door_w": 1.4, "door_side": "south"}, | |
| "furniture": [ | |
| {"id": "table", "kind": "static_box", "x": -1.5, "y": 10.5, | |
| "sx": 1.6, "sy": 0.9, "sz": 0.75}, | |
| {"id": "crate_1", "kind": "dynamic_box", "x": 1.8, "y": 9.0, | |
| "sx": 0.7, "sy": 0.7, "sz": 1.2, "mass": 4.0}, | |
| ], | |
| "trees": trees, "rocks": rocks, "foods": foods, | |
| "water": {"id": "lake", "cx": -9.0, "cy": -2.0, "sx": 6.0, "sy": 4.0, | |
| "note": "zone effect (thirst relief + speed factor), no fluid sim"}, | |
| "doors": [{"id": "home_door", "x": 0.0, "y": 7.0, "w": 1.4, "h": 2.0, | |
| "hinge": "west", "state": "closed"}], | |
| "spawn": {"x": 0.0, "y": 4.0, "heading": 0.0}, | |
| } | |
| spec["spec_hash"] = hashlib.sha256( | |
| json.dumps({k: v for k, v in spec.items() if k != "spec_hash"}, | |
| sort_keys=True).encode()).hexdigest() | |
| return spec | |