create-asciitorium 0.1.34 → 0.1.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +4 -4
  2. package/dist/index.js +2 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/templates/base/index.html +1 -1
  5. package/dist/templates/base/package.json +1 -1
  6. package/dist/templates/base/public/art/ART-DESIGN-SPEC.md +375 -0
  7. package/dist/templates/base/public/art/README.md +115 -0
  8. package/dist/templates/base/public/art/asciitorium.art +111 -0
  9. package/dist/templates/base/public/art/borders/bubbles.art +16 -0
  10. package/dist/templates/base/public/art/borders/dna.art +9 -0
  11. package/dist/templates/base/public/art/castle.art +4 -0
  12. package/dist/templates/base/public/art/computer.art +17 -0
  13. package/dist/templates/base/public/art/font/pencil.art +168 -0
  14. package/dist/templates/base/public/art/maps/README.md +251 -0
  15. package/dist/templates/base/public/art/maps/example/README.md +62 -0
  16. package/dist/templates/base/public/art/maps/example/legend.json +29 -0
  17. package/dist/templates/base/public/art/maps/example/map.art +21 -0
  18. package/dist/templates/base/public/art/materials/README.md +279 -0
  19. package/dist/templates/base/public/art/materials/bone.art +11 -0
  20. package/dist/templates/base/public/art/materials/door-wooden.art +154 -0
  21. package/dist/templates/base/public/art/materials/wall-brick.art +128 -0
  22. package/dist/templates/base/public/art/materials/wall-wireframe.art +128 -0
  23. package/dist/templates/base/public/art/mazes/example.art +21 -0
  24. package/dist/templates/base/public/art/sounds/door-close.mp3 +0 -0
  25. package/dist/templates/base/public/art/sounds/door-open.mp3 +0 -0
  26. package/dist/templates/base/public/art/sounds/taps.mp3 +0 -0
  27. package/dist/templates/base/public/art/sprites/asciitorium.art +6 -0
  28. package/dist/templates/base/public/art/sprites/balloon.art +126 -0
  29. package/dist/templates/base/public/art/sprites/beating-heart.art +49 -0
  30. package/dist/templates/base/public/art/sprites/castle.art +4 -0
  31. package/dist/templates/base/public/art/sprites/component-icon.art +6 -0
  32. package/dist/templates/base/public/art/sprites/eyes.art +61 -0
  33. package/dist/templates/base/public/art/sprites/firework.art +58 -0
  34. package/dist/templates/base/public/art/sprites/heart.art +5 -0
  35. package/dist/templates/base/public/art/sprites/multi-select-test.art +6 -0
  36. package/dist/templates/base/public/art/sprites/nav-basics.art +5 -0
  37. package/dist/templates/base/public/art/sprites/pyramid.art +5 -0
  38. package/dist/templates/base/public/art/sprites/tatooene.art +5 -0
  39. package/dist/templates/base/public/art/sprites/welcome.art +7 -0
  40. package/dist/templates/base/public/art/tatooene.txt +5 -0
  41. package/dist/templates/base/public/index.css +41 -0
  42. package/dist/templates/base/public/logo.png +0 -0
  43. package/dist/templates/base/scripts/gen-figlet-art.js +2 -2
  44. package/dist/templates/base/scripts/map-builder.js +294 -0
  45. package/dist/templates/base/src/main.tsx +22 -79
  46. package/package.json +1 -1
@@ -0,0 +1,279 @@
1
+ # Materials Directory
2
+
3
+ This directory contains ASCII art representations of various materials and textures that can be used in asciitorium games. Materials define the visual appearance of surfaces, walls, floors, and other environmental elements.
4
+
5
+ ## Contents
6
+
7
+ - `wireframe.art`: A complex wireframe pattern demonstrating layered first-person perspective rendering
8
+
9
+ ## Material File Format
10
+
11
+ Material files use a special format that combines ASCII art with JSON metadata to define how materials should be rendered in different contexts.
12
+
13
+ ### File Structure
14
+
15
+ Materials use paragraph markers (`¶`) to separate different layers or variants, with each section containing:
16
+
17
+ 1. **Metadata line**: JSON configuration starting with `¶`
18
+ 2. **ASCII art**: The visual representation using text characters
19
+
20
+ ### Example Material
21
+
22
+ Here's a section from `wireframe.art` showing the layered format:
23
+
24
+ ```text
25
+ § {"kind":"material","usage":"first-person"}
26
+ ¶ {"layer":"here","position":"left","x":-1}
27
+ |╲
28
+ | ╲
29
+ | ╲
30
+ | ╲
31
+ | ╲
32
+ | ╲
33
+ | ╲
34
+ | |
35
+ | |
36
+ ¶ {"layer":"near","position":"center","x":6}
37
+ ____________
38
+ | |
39
+ | |
40
+ | |
41
+ |____________|
42
+ ```
43
+
44
+ ### Example with Placement
45
+
46
+ Here's an example from `bone.art` showing placement for ground materials:
47
+
48
+ ```text
49
+ § {"kind":"material","usage":"first-person","placement":"ground"}
50
+ ¶ {"layer":"here","position":"center"}
51
+ ⎽ ⎽
52
+ (_'⎯⎯⎯⎯⎯'_)
53
+ (⎽.⎯⎯⎯⎯⎯.⎽)
54
+ ¶ {"layer":"near","position":"center"}
55
+ :‧‧:
56
+ ¶ {"layer":"middle","position":"center"}
57
+ ..
58
+ ¶ {"layer":"far","position":"center"}
59
+
60
+ ```
61
+
62
+ ## Metadata Properties
63
+
64
+ ### Section Header (`§`)
65
+
66
+ - **kind**: Type of asset (`"material"`)
67
+ - **usage**: Rendering context (`"first-person"`, `"top-down"`, `"side-scroller"`)
68
+ - **placement**: Surface placement (`"ground"`, `"ceiling"`) - optional property that indicates where the material should be applied. Use `"scenery"` for general background/wall materials (default)
69
+ - **onEnterSound**: Sound that triggers when the player steps onto this tile (optional)
70
+ - Value: `"filename.mp3"`
71
+ - Sound files should be placed in `art/sounds/` directory
72
+ - **onExitSound**: Sound that triggers when the player steps off this tile (optional)
73
+ - Value: `"filename.mp3"`
74
+ - Sound files should be placed in `art/sounds/` directory
75
+ - **ambientSound**: Looping sound while material is visible (optional, future feature)
76
+ - Value: `"filename.mp3"`
77
+ - Sound files should be placed in `art/sounds/` directory
78
+
79
+ ### Layer Configuration (`¶`)
80
+
81
+ - **layer**: Depth layer (`"here"`, `"near"`, `"middle"`, `"far"`)
82
+ - **position**: Horizontal alignment (`"left"`, `"center"`, `"right"`)
83
+ - **x**: Horizontal offset for precise positioning
84
+
85
+ ## Layer System
86
+
87
+ The wireframe material demonstrates a sophisticated layering system for first-person perspective:
88
+
89
+ - **here**: Immediate foreground elements (closest to viewer)
90
+ - **near**: Close objects with full detail
91
+ - **middle**: Mid-distance objects with moderate detail
92
+ - **far**: Distant objects with minimal detail
93
+
94
+ Each layer can have left, center, and right positioned elements with specific x-offsets for proper perspective alignment.
95
+
96
+ ## Visual Techniques
97
+
98
+ Materials can use various ASCII characters for different effects:
99
+
100
+ - **Box drawing**: `|`, `─`, `╱`, `╲`, `╭`, `╮`, `╯`, `╰` for structural lines
101
+ - **Perspective lines**: `╱`, `╲` for diagonal depth
102
+ - **Solid fills**: `_` for horizontal surfaces
103
+ - **Spacing**: Careful use of spaces for proper alignment and depth
104
+
105
+ ## Usage in Maps
106
+
107
+ Materials are referenced in map legends through the `asset` property:
108
+
109
+ ```json
110
+ {
111
+ "chars": ["#"],
112
+ "kind": "material",
113
+ "name": "wireframe-wall",
114
+ "solid": true,
115
+ "asset": "material/wireframe"
116
+ }
117
+ ```
118
+
119
+ The system will load the corresponding `wireframe.art` file and render the appropriate layer based on the viewing context and distance.
120
+
121
+ ## Relationship with Legend Entities
122
+
123
+ The architecture separates visual presentation (materials) from gameplay behavior (legend entities):
124
+
125
+ ### Materials Handle
126
+
127
+ - **Visual representation** at different distances (layer system)
128
+ - **Ambient sounds** tied to proximity (howling when near a wolf wall)
129
+ - **Transition sounds** when moving between layers (door creaking as you approach)
130
+ - **Distance-based events** (footsteps on different floor types)
131
+
132
+ ### Legend Entities Handle
133
+
134
+ - **Interactions** (opening doors, picking up items, talking to NPCs)
135
+ - **Game state** (is door locked/unlocked, enemy health, treasure quantity)
136
+ - **Collision detection** (solid vs passable)
137
+ - **Gameplay behaviors** (enemy AI, trap triggers, puzzle mechanics)
138
+
139
+ ### Example: Door Material + Entity
140
+
141
+ **Material file** (`door-wooden.art`):
142
+
143
+ ```text
144
+ § {"kind":"material","usage":"first-person","placement":"scenery","onEnterSound":"door-open.mp3","onExitSound":"door-close.mp3"}
145
+ ¶ {"layer":"here","position":"center"}
146
+ [ASCII art for door at immediate distance - plays open sound when player steps onto this tile, close sound when leaving]
147
+ ¶ {"layer":"near","position":"center"}
148
+ [ASCII art for door at near distance]
149
+ ```
150
+
151
+ **Legend entry** (references the material):
152
+
153
+ ```json
154
+ {
155
+ "chars": ["o"],
156
+ "kind": "material",
157
+ "entity": "door",
158
+ "variant": "wooden",
159
+ "name": "Wooden Door",
160
+ "solid": false,
161
+ "asset": "material/door-wooden",
162
+ "state": {
163
+ "locked": false,
164
+ "open": false
165
+ },
166
+ "interactions": {
167
+ "onInteract": "toggle-door",
168
+ "onMelee": "bash-door"
169
+ }
170
+ }
171
+ ```
172
+
173
+ This design allows:
174
+
175
+ - **Reusable materials**: Same door material can be used for locked/unlocked/magic doors
176
+ - **Instance-specific behavior**: Each door on the map can have different state (some locked, some open)
177
+ - **Separation of concerns**: Artists focus on materials, game designers focus on legend entities
178
+ - **Sensory cohesion**: Sounds/visuals stay together in material files
179
+
180
+ ### Example: Puddle with Sound
181
+
182
+ Ground materials can also use `onEnterSound` for footstep sounds:
183
+
184
+ **Material file** (`puddle.art`):
185
+
186
+ ```text
187
+ § {"kind":"material","usage":"first-person","placement":"ground","onEnterSound":"splash.mp3"}
188
+ ¶ {"layer":"here","position":"center"}
189
+ ~~~~
190
+ ~~~~~~
191
+ ~~~~~~~~
192
+ ~~~~~~
193
+ ~~~~
194
+ ¶ {"layer":"near","position":"center"}
195
+ ~~
196
+ ```
197
+
198
+ **Legend entry**:
199
+
200
+ ```json
201
+ {
202
+ "chars": ["~"],
203
+ "kind": "material",
204
+ "name": "puddle",
205
+ "solid": false,
206
+ "asset": "material/puddle"
207
+ }
208
+ ```
209
+
210
+ When the player steps onto a `~` tile, they'll hear a splash sound. This same pattern works for:
211
+
212
+ - Gravel paths (`crunch.mp3`)
213
+ - Creaky floorboards (`creak.mp3`)
214
+ - Grass (`rustle.mp3`)
215
+ - Snow (`snow-step.mp3`)
216
+
217
+ ## Sound System
218
+
219
+ Materials support sound playback through properties in the section header (`§`). Sounds are automatically triggered by the GameWorld when the player moves.
220
+
221
+ ### Sound File Requirements
222
+
223
+ - **Location**: Place sound files in `art/sounds/` directory relative to your project root
224
+ - **Formats**: MP3, WAV, and other browser-supported audio formats
225
+ - **Environment**: Sounds only play in web environments (browser), not in CLI mode
226
+ - **Reference**: Use filename in section header: `{"onEnterSound":"filename.mp3"}`
227
+
228
+ ### Sound Properties
229
+
230
+ - **onEnterSound**: Plays once when the player steps onto a tile with this material
231
+ - **onExitSound**: Plays once when the player steps off a tile with this material
232
+ - **ambientSound**: Looping sound while material is visible (future feature)
233
+
234
+ ### How Sound Triggering Works
235
+
236
+ When using `GameWorld` for game logic:
237
+
238
+ 1. Player moves to a new tile coordinate (x, y)
239
+ 2. GameWorld triggers `onExitSound` for the previous tile's material (if any)
240
+ 3. GameWorld checks the new tile's legend entry
241
+ 4. If the entry is a material, GameWorld loads the material asset
242
+ 5. If the material has `onEnterSound`, the sound plays
243
+ 6. When the player leaves the tile, `onExitSound` plays (if defined)
244
+ 7. Sounds play once per tile entry/exit (moving onto the same tile repeatedly will retrigger both sounds)
245
+
246
+ ### Controlling Sound Playback
247
+
248
+ You can control sound globally through the `SoundManager`:
249
+
250
+ ```typescript
251
+ import { SoundManager } from 'asciitorium';
252
+
253
+ // Disable all sounds
254
+ SoundManager.setEnabled(false);
255
+
256
+ // Re-enable sounds
257
+ SoundManager.setEnabled(true);
258
+
259
+ // Check if sounds are enabled
260
+ const enabled = SoundManager.isEnabled();
261
+
262
+ // Manually play a sound
263
+ SoundManager.playSound('custom-sound.mp3');
264
+
265
+ // Clear sound cache
266
+ SoundManager.clearCache();
267
+ ```
268
+
269
+ ## Creating New Materials
270
+
271
+ When creating new material files:
272
+
273
+ 1. Start with a section header (`§`) defining the material type and usage
274
+ 2. Define multiple layers for depth perception
275
+ 3. Use consistent positioning and x-offsets for alignment
276
+ 4. Test with different viewing distances and angles
277
+ 5. Follow ASCII art best practices for readability
278
+
279
+ Use this directory as a reference for creating rich, layered materials that enhance the visual depth of your asciitorium games.
@@ -0,0 +1,11 @@
1
+ § {"kind":"material","usage":"first-person","placement":"ground"}
2
+ ¶ {"layer":"here","position":"center"}
3
+ ⎽ ⎽
4
+ (_'⎯⎯⎯⎯⎯'_)
5
+ (⎽.⎯⎯⎯⎯⎯.⎽)
6
+ ¶ {"layer":"near","position":"center"}
7
+ :‧‧:
8
+ ¶ {"layer":"middle","position":"center"}
9
+ ..
10
+ ¶ {"layer":"far","position":"center"}
11
+
@@ -0,0 +1,154 @@
1
+ § {"kind":"material","usage":"first-person","placement":"scenery","onEnterSound":"door-open.mp3","onExitSound":"door-close.mp3"}
2
+ ¶ {"layer":"here","position":"left"}
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
+ ¶ {"layer":"here","position":"center"}
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
+ ¶ {"layer":"here","position":"right"}
55
+
56
+ ╱┊
57
+ ╱ ┊╱
58
+ ╱┊ ╱
59
+ ╱ ┊╱ ╱
60
+ ╱ ╱ ╱
61
+ ╱┊╱┊ ╱┊
62
+ ┊╱ ┊╱ ┊
63
+ ┊ ╱┋| ┊╱
64
+ ┊╱|┋|╱
65
+ ┊ |┋| ╱
66
+ ┊╱|┋| ╱
67
+ ┊┈|┋|┈
68
+ ┊╲|┋| ╲
69
+ ┊ |┋| ╲
70
+ ┊╲|┋|╲
71
+ ┊ |┋| ┊╲
72
+ ┊╲|┋| ┊
73
+ ╲┊|┋|╲┊
74
+ ╲|┋| ╲
75
+ ╲┋|╲ ╲
76
+ ╲| ╲
77
+ ╲ ┊╲
78
+ ╲┊
79
+
80
+ ¶ {"layer":"near","position":"left"}
81
+ ……… ………
82
+ ………┊… …┊╲
83
+ …┊………┊…┊“╲
84
+ ………┊… …┊““╲
85
+ …┊………┊…┊““┊
86
+ ………┊… …┊|\┊
87
+ …┊………┊…┊||┊
88
+ ………┊… …┊||┊
89
+ …┊………┊…┊||┊
90
+ ………┊… …┊||╱
91
+ …┊………┊…┊|╱
92
+ ………┊………┊╱
93
+ ¶ {"layer":"near","position":"center"}
94
+ …… ……… ……… …
95
+ ┊……┊………┊………┊…┊
96
+ ┊┊…╭───────╮…┊
97
+ ┊……|┋┋┋┋┋┋┋|…┊
98
+ ┊┊…|┉┉┉┉┉┉┉|…┊
99
+ ┊……|┋┋┋┋┋┋┋|…┊
100
+ ┊┊…|┋┋┋┋┋┋┋|…┊
101
+ ┊……|┋┋┋┋┋o┋|…┊
102
+ ┊┊…|┋┋┋┋┋┋┋|…┊
103
+ ┊……|┋┋┋┋┋┋┋|…┊
104
+ ┊┊…|┉┉┉┉┉┉┉|…┊
105
+ ┊……|┋┋┋┋┋┋┋|…┊
106
+ ¶ {"layer":"near","position":"right"}
107
+ …… …………
108
+ ╱┊……┊… …┊
109
+ ╱”┊┊………┊……
110
+ ╱””┊……┊… …┊
111
+ ┊””┊┊………┊……
112
+ ┊/|┊……┊… …┊
113
+ ┊||┊┊………┊……
114
+ ┊||┊……┊… …┊
115
+ ┊||┊┊………┊……
116
+ ╲||┊……┊… …┊
117
+ ╲|┊┊………┊……
118
+ ╲┊……┊………┊
119
+ ¶ {"layer":"middle","position":"left"}
120
+ … … … … …
121
+ ┊…┊…┊…┊…┊…┊╲
122
+ ┊┊…┊…┊…┊…┊┊“┊
123
+ ┊…┊…┊…┊…┊…┊|┊
124
+ ┊┊…┊…┊…┊…┊┊|┊
125
+ ┊…┊…┊…┊…┊…┊╱
126
+ ¶ {"layer":"middle","position":"center"}
127
+ … … ……
128
+ ┊…┊…┊……┊
129
+ ┊…╭──╮…┊
130
+ ┊…|┋┋|…┊
131
+ ┊…|┋┋|…┊
132
+ ┊…|┋┋|…┊
133
+ ¶ {"layer":"middle","position":"right"}
134
+ … … … … …
135
+ ╱┊…┊…┊…┊…┊…┊
136
+ ┊”┊┊…┊…┊…┊…┊┊
137
+ ┊|┊…┊…┊…┊…┊…┊
138
+ ┊|┊┊…┊…┊…┊…┊┊
139
+ ╲┊…┊…┊…┊…┊…┊
140
+ ¶ {"layer":"far","position":"left"}
141
+ …………
142
+ ┊…………┊
143
+ ┊…||…┊
144
+ ┊…||…┊
145
+ ¶ {"layer":"far","position":"center"}
146
+ ……
147
+ ┊……┊
148
+ ┊||┊
149
+ ┊||┊
150
+ ¶ {"layer":"far","position":"right"}
151
+ …………
152
+ ┊…………┊
153
+ ┊…||…┊
154
+ ┊…||…┊
@@ -0,0 +1,128 @@
1
+ § {"kind":"material","usage":"first-person","placement":"scenery"}
2
+ ¶ {"layer":"here","position":"left"}
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
+ ¶ {"layer":"here","position":"right"}
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
+ ¶ {"layer":"near","position":"left"}
55
+ ……… ………
56
+ ………┊… …┊╲
57
+ …┊………┊…┊“╲
58
+ ………┊… …┊““╲
59
+ …┊………┊…┊““┊
60
+ ………┊… …┊““┊
61
+ …┊………┊…┊””┊
62
+ ………┊… …┊””┊
63
+ …┊………┊…┊””┊
64
+ ………┊… …┊””╱
65
+ …┊………┊…┊”╱
66
+ ………┊………┊╱
67
+ ¶ {"layer":"near","position":"center"}
68
+ …… ……… ……… …
69
+ ┊……┊………┊………┊…┊
70
+ ┊┊………┊………┊………┊
71
+ ┊……┊………┊………┊…┊
72
+ ┊┊………┊………┊………┊
73
+ ┊……┊………┊………┊…┊
74
+ ┊┊………┊………┊………┊
75
+ ┊……┊………┊………┊…┊
76
+ ┊┊………┊………┊………┊
77
+ ┊……┊………┊………┊…┊
78
+ ┊┊………┊………┊………┊
79
+ ┊……┊………┊………┊…┊
80
+ ¶ {"layer":"near","position":"right"}
81
+ …… …………
82
+ ╱┊……┊… …┊
83
+ ╱”┊┊………┊……
84
+ ╱””┊……┊… …┊
85
+ ┊””┊┊………┊……
86
+ ┊””┊……┊… …┊
87
+ ┊””┊┊………┊……
88
+ ┊““┊……┊… …┊
89
+ ┊““┊┊………┊……
90
+ ╲““┊……┊… …┊
91
+ ╲“┊┊………┊……
92
+ ╲┊……┊………┊
93
+ ¶ {"layer":"middle","position":"left"}
94
+ … … … … …
95
+ ┊…┊…┊…┊…┊…┊╲
96
+ ┊┊…┊…┊…┊…┊┊“┊
97
+ ┊…┊…┊…┊…┊…┊”┊
98
+ ┊┊…┊…┊…┊…┊┊”┊
99
+ ┊…┊…┊…┊…┊…┊╱
100
+ ¶ {"layer":"middle","position":"center"}
101
+ … … ……
102
+ ┊…┊…┊……┊
103
+ ┊……┊…┊…┊
104
+ ┊…┊…┊……┊
105
+ ┊……┊…┊…┊
106
+ ┊…┊…┊……┊
107
+ ¶ {"layer":"middle","position":"right"}
108
+ … … … … …
109
+ ╱┊…┊…┊…┊…┊…┊
110
+ ┊”┊┊…┊…┊…┊…┊┊
111
+ ┊”┊…┊…┊…┊…┊…┊
112
+ ┊“┊┊…┊…┊…┊…┊┊
113
+ ╲┊…┊…┊…┊…┊…┊
114
+ ¶ {"layer":"far","position":"left"}
115
+ …………
116
+ ┊…………┊
117
+ ┊…………┊
118
+ ┊…………┊
119
+ ¶ {"layer":"far","position":"center"}
120
+ ……
121
+ ┊……┊
122
+ ┊……┊
123
+ ┊……┊
124
+ ¶ {"layer":"far","position":"right"}
125
+ …………
126
+ ┊…………┊
127
+ ┊…………┊
128
+ ┊…………┊
@@ -0,0 +1,128 @@
1
+ § {"kind":"material","usage":"first-person","placement":"scenery"}
2
+ ¶ {"layer":"here","position":"left"}
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
+ ¶ {"layer":"here","position":"right"}
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
+ ¶ {"layer":"near","position":"left"}
55
+ ______
56
+ | |╲
57
+ | | ╲
58
+ | | ╲
59
+ | | |
60
+ | | |
61
+ | | |
62
+ | | |
63
+ | | |
64
+ | | ╱
65
+ | | ╱
66
+ |______|╱
67
+ ¶ {"layer":"near","position":"center"}
68
+ ____________
69
+ | |
70
+ | |
71
+ | |
72
+ | |
73
+ | |
74
+ | |
75
+ | |
76
+ | |
77
+ | |
78
+ | |
79
+ |____________|
80
+ ¶ {"layer":"near","position":"right"}
81
+ ______
82
+ ╱| |
83
+ ╱ | |
84
+ ╱ | |
85
+ | | |
86
+ | | |
87
+ | | |
88
+ | | |
89
+ | | |
90
+ ╲ | |
91
+ ╲ | |
92
+ ╲|______|
93
+ ¶ {"layer":"middle","position":"left"}
94
+ _________
95
+ | |╲
96
+ | | |
97
+ | | |
98
+ | | |
99
+ |_________|╱
100
+ ¶ {"layer":"middle","position":"center"}
101
+ ______
102
+ | |
103
+ | |
104
+ | |
105
+ | |
106
+ |______|
107
+ ¶ {"layer":"middle","position":"right"}
108
+ _________
109
+ ╱| |
110
+ | | |
111
+ | | |
112
+ | | |
113
+ ╲|_________|
114
+ ¶ {"layer":"far","position":"left"}
115
+ ____
116
+ | |
117
+ | |
118
+ |____|
119
+ ¶ {"layer":"far","position":"center"}
120
+ __
121
+ | |
122
+ | |
123
+ |__|
124
+ ¶ {"layer":"far","position":"right"}
125
+ ____
126
+ | |
127
+ | |
128
+ |____|