File size: 2,195 Bytes
3865888
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""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