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.
- package/README.md +4 -4
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/templates/base/index.html +1 -1
- package/dist/templates/base/package.json +1 -1
- package/dist/templates/base/public/art/ART-DESIGN-SPEC.md +375 -0
- package/dist/templates/base/public/art/README.md +115 -0
- package/dist/templates/base/public/art/asciitorium.art +111 -0
- package/dist/templates/base/public/art/borders/bubbles.art +16 -0
- package/dist/templates/base/public/art/borders/dna.art +9 -0
- package/dist/templates/base/public/art/castle.art +4 -0
- package/dist/templates/base/public/art/computer.art +17 -0
- package/dist/templates/base/public/art/font/pencil.art +168 -0
- package/dist/templates/base/public/art/maps/README.md +251 -0
- package/dist/templates/base/public/art/maps/example/README.md +62 -0
- package/dist/templates/base/public/art/maps/example/legend.json +29 -0
- package/dist/templates/base/public/art/maps/example/map.art +21 -0
- package/dist/templates/base/public/art/materials/README.md +279 -0
- package/dist/templates/base/public/art/materials/bone.art +11 -0
- package/dist/templates/base/public/art/materials/door-wooden.art +154 -0
- package/dist/templates/base/public/art/materials/wall-brick.art +128 -0
- package/dist/templates/base/public/art/materials/wall-wireframe.art +128 -0
- package/dist/templates/base/public/art/mazes/example.art +21 -0
- package/dist/templates/base/public/art/sounds/door-close.mp3 +0 -0
- package/dist/templates/base/public/art/sounds/door-open.mp3 +0 -0
- package/dist/templates/base/public/art/sounds/taps.mp3 +0 -0
- package/dist/templates/base/public/art/sprites/asciitorium.art +6 -0
- package/dist/templates/base/public/art/sprites/balloon.art +126 -0
- package/dist/templates/base/public/art/sprites/beating-heart.art +49 -0
- package/dist/templates/base/public/art/sprites/castle.art +4 -0
- package/dist/templates/base/public/art/sprites/component-icon.art +6 -0
- package/dist/templates/base/public/art/sprites/eyes.art +61 -0
- package/dist/templates/base/public/art/sprites/firework.art +58 -0
- package/dist/templates/base/public/art/sprites/heart.art +5 -0
- package/dist/templates/base/public/art/sprites/multi-select-test.art +6 -0
- package/dist/templates/base/public/art/sprites/nav-basics.art +5 -0
- package/dist/templates/base/public/art/sprites/pyramid.art +5 -0
- package/dist/templates/base/public/art/sprites/tatooene.art +5 -0
- package/dist/templates/base/public/art/sprites/welcome.art +7 -0
- package/dist/templates/base/public/art/tatooene.txt +5 -0
- package/dist/templates/base/public/index.css +41 -0
- package/dist/templates/base/public/logo.png +0 -0
- package/dist/templates/base/scripts/gen-figlet-art.js +2 -2
- package/dist/templates/base/scripts/map-builder.js +294 -0
- package/dist/templates/base/src/main.tsx +22 -79
- 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
|
+
|____|
|