blob: 3b72840d62210bc8a655367e98c4d03570bb7dbe (
plain)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
## Hazards
A **hazard** is an environmental threat attached to a room — a sandstorm, solar
radiation, falling rocks, toxic spores. Define it once in
`data/hazards/<id>.yaml`, then reference it from any number of rooms with
`hazard: <id>` (see `rooms.md`).
**The filename is the ID** (`solar_radiation.yaml` → reference it as `hazard: solar_radiation`); the loader derives it from the filename. Do not put an `id:` field in the file — it is ignored.
```yaml
name: scorching solar radiation
description: "Unfiltered sunlight pounds down through a gap in the atmospheric dome."
combat:
attack_types: [science] # list: exactly one melee (stab/slash/crush) + optional ranged/science
stats:
attack: 40 # accuracy level
strength: 0
ranged: 0
science: 0
speed: 5 # ticks between hazard rolls
max_melee_hit: 0
max_ranged_hit: 0
max_science_hit: 6 # maximum science damage per hit
bonuses:
attack_bonus: 0 # equipment-equivalent accuracy bonus
strength_bonus: 0
ranged_bonus: 0
ranged_strength_bonus: 0
science_bonus: 0
science_percent_bonus: 0
warn_message: "The dome shielding fails here — raw solar radiation pours in."
hit_message: "Solar radiation sears you for %d damage." # optional single %d for the damage
miss_message: "You shield your eyes and weather a wave of solar glare."
required_item: "" # optional: an equipped item that NEGATES the hazard entirely
```
### Combat Fields
The `combat:` block mirrors a mob's combat block exactly — same stats, same bonuses,
same per-type max hits. Hazards have **no defense stats** because they are never
attacked — they only attack the player.
| Field | Description |
|---|---|
| `combat.attack_types` | List of attack types. At least one melee (`stab`/`slash`/`crush`) plus optional `ranged`/`science`. The first melee type is used as the primary attack type. |
| `combat.stats.attack` | Attack level (base accuracy) |
| `combat.stats.strength` | Strength level (melee max-hit base) |
| `combat.stats.ranged` | Ranged level (ranged accuracy base) |
| `combat.stats.science` | Science level (science accuracy base) |
| `combat.stats.speed` | Ticks between hazard rolls (default 5) |
| `combat.stats.max_melee_hit` | Maximum melee damage per hit |
| `combat.stats.max_ranged_hit` | Maximum ranged damage per hit |
| `combat.stats.max_science_hit` | Maximum science damage per hit (a set value — not level-derived) |
#### Bonuses (`combat.stats.bonuses:`)
| Field | Description |
|---|---|
| `attack_bonus` | Equipment-equivalent attack bonus (added to accuracy roll) |
| `strength_bonus` | Equipment-equivalent strength bonus (added to melee max hit) |
| `science_bonus` | Equipment-equivalent science attack bonus |
| `science_percent_bonus` | Percent boost to science damage (applied to `max_science_hit`) |
| `ranged_bonus` | Equipment-equivalent ranged attack bonus |
| `ranged_strength_bonus` | Equipment-equivalent ranged strength bonus (added to ranged max hit) |
### General Fields
| Field | Description |
|---|---|
| `name` | Display name used in warnings and default messages |
| `description` | Flavour text for the hazard |
| `warn_message` | Shown when warning the player about the area |
| `hit_message` | Message on a hit; include a single `%d` to show the damage |
| `miss_message` | Message on a miss |
| `required_item` | If set and equipped, the hazard is fully negated for that player |
|