create-asciitorium 0.1.46 → 0.1.48

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 (35) hide show
  1. package/dist/templates/base/ASCIITORIUM_REFERENCE.md +45 -30
  2. package/dist/templates/base/public/art/README.md +82 -83
  3. package/dist/templates/base/public/art/fonts/README.md +115 -0
  4. package/dist/templates/base/public/art/maps/README.md +89 -190
  5. package/dist/templates/base/public/art/materials/README.md +82 -206
  6. package/dist/templates/base/public/art/sounds/README.md +11 -0
  7. package/dist/templates/base/public/art/sprites/README.md +138 -0
  8. package/dist/templates/base/src/main.tsx +4 -4
  9. package/dist/templates/base/vite.config.ts +12 -1
  10. package/package.json +1 -1
  11. package/dist/templates/base/public/art/ART-DESIGN-SPEC.md +0 -375
  12. package/dist/templates/base/public/art/font/pencil.art +0 -168
  13. package/dist/templates/base/public/art/maps/example/README.md +0 -62
  14. package/dist/templates/base/public/art/maps/example/legend.json +0 -29
  15. package/dist/templates/base/public/art/maps/example/map.art +0 -21
  16. package/dist/templates/base/public/art/materials/bone.art +0 -11
  17. package/dist/templates/base/public/art/materials/door-wooden.art +0 -154
  18. package/dist/templates/base/public/art/materials/wall-brick.art +0 -128
  19. package/dist/templates/base/public/art/materials/wall-wireframe.art +0 -128
  20. package/dist/templates/base/public/art/sounds/door-close.mp3 +0 -0
  21. package/dist/templates/base/public/art/sounds/door-open.mp3 +0 -0
  22. package/dist/templates/base/public/art/sounds/taps.mp3 +0 -0
  23. package/dist/templates/base/public/art/sprites/asciitorium.art +0 -6
  24. package/dist/templates/base/public/art/sprites/balloon.art +0 -126
  25. package/dist/templates/base/public/art/sprites/beating-heart.art +0 -49
  26. package/dist/templates/base/public/art/sprites/castle.art +0 -4
  27. package/dist/templates/base/public/art/sprites/component-icon.art +0 -6
  28. package/dist/templates/base/public/art/sprites/eyes.art +0 -61
  29. package/dist/templates/base/public/art/sprites/firework.art +0 -58
  30. package/dist/templates/base/public/art/sprites/heart.art +0 -5
  31. package/dist/templates/base/public/art/sprites/multi-select-test.art +0 -6
  32. package/dist/templates/base/public/art/sprites/nav-basics.art +0 -5
  33. package/dist/templates/base/public/art/sprites/pyramid.art +0 -5
  34. package/dist/templates/base/public/art/sprites/welcome.art +0 -7
  35. package/dist/templates/base/src/reference-validation.tsx +0 -307
@@ -1,375 +0,0 @@
1
- # Art Asset Format Specification
2
-
3
- This document defines the metadata format for ASCII art assets in asciitorium, including fonts, materials, and sprites.
4
-
5
- ## Overview
6
-
7
- Art assets use a text-based format that combines:
8
-
9
- - **Section headers** (`§`) defining global asset properties
10
- - **Layer/frame separators** (`¶`) with metadata for each section
11
- - **ASCII art content** following each separator
12
-
13
- ## Design Goals
14
-
15
- 1. **Human-readable**: Artists should be able to read and write metadata without tooling
16
- 2. **Simple**: Use standard JSON format with flat key-value structure
17
- 3. **No nesting**: Flat data structures only - no nested objects or arrays
18
- 4. **Consistent**: Same format works for materials, sprites, and font asset types
19
- 5. **Extensible**: Easy to add new properties without breaking existing assets
20
-
21
- ## Format Syntax
22
-
23
- ### File Header (`§`)
24
-
25
- The file header appears once at the beginning of the file and defines the asset type and global properties.
26
-
27
- **Format:**
28
-
29
- ```json
30
- § {"key":"value","key":"value"}
31
- ```
32
-
33
- **Example:**
34
-
35
- ```json
36
- § {"kind":"material","usage":"first-person","placement":"scenery"}
37
- ```
38
-
39
- ### Layer/Frame Separator (`¶`)
40
-
41
- Separates different layers (materials), characters (fonts) or frames (sprites) with section-specific metadata.
42
-
43
- **Format:**
44
-
45
- ```json
46
- ¶ {"key":"value","key":"value"}
47
- [ASCII art content follows]
48
- ```
49
-
50
- **Example:**
51
-
52
- ```json
53
- ¶ {"layer":"here","pos":"center"}
54
- |‽‽‽‽‽‽‽|
55
- |‽‽‽‽‽‽‽|
56
- ```
57
-
58
- ## Parsing Rules
59
-
60
- ### JSON Format
61
-
62
- 1. **Parse as JSON**: Standard JSON.parse() after removing separator character
63
- 2. **Primitive values only**: All values must be strings, numbers, or booleans
64
- 3. **No nesting**: Objects must be flat - no nested objects or arrays
65
- 4. **Empty metadata**: Empty separator `¶` or `§` is valid (inherits defaults)
66
-
67
- ### Single-Frame Sprites
68
-
69
- If a file does not start with a `§` file header, it is assumed to be a single-frame sprite with no metadata:
70
-
71
- ```txt
72
- ___
73
- / \
74
- | o |
75
- \___/
76
- ```
77
-
78
- This is equivalent to:
79
-
80
- ```json
81
- § {"kind":"sprite","loop":"false"}
82
-
83
- ___
84
- / \
85
- | o |
86
- \___/
87
- ```
88
-
89
- ### Empty Separators
90
-
91
- A separator with no metadata is valid for sprites:
92
-
93
- ```txt
94
-
95
- [ASCII art content]
96
- ```
97
-
98
- This inherits defaults or indicates a frame with no special properties.
99
-
100
- ## Font Assets
101
-
102
- Fonts define ASCII art representations of characters for rendering text in stylized formats.
103
-
104
- ### File Header Properties
105
-
106
- | Key | Values | Required | Description |
107
- | ------ | ------ | -------- | --------------------- |
108
- | `kind` | `font` | Yes | Asset type identifier |
109
-
110
- ### Character Separator Properties
111
-
112
- | Key | Values | Required | Description |
113
- | ----------- | ------ | -------- | ----------------------------------- |
114
- | `character` | string | Yes | The character this glyph represents |
115
-
116
- ### Font Example
117
-
118
- ``` json
119
- § {"kind":"font"}
120
- ¶ {"character":"a"}
121
-
122
- ╭─╮
123
- ╭─┤
124
- ╰─╰
125
-
126
- ¶ {"character":"b"}
127
-
128
- ├─╮
129
- │ │
130
- ╯─╯
131
-
132
- ¶ {"character":"c"}
133
-
134
- ╭─╮
135
-
136
- ╰─╯
137
- ```
138
-
139
- ### Font Design Rules
140
-
141
- - Each character glyph should have consistent height (including leading/trailing blank lines)
142
- - Characters can have variable width
143
- - Blank lines before/after the glyph art create vertical spacing
144
- - The `character` property must be a single character (letter, number, punctuation, etc.)
145
- - Fonts are typically loaded by name and used to render styled text
146
-
147
- ## Sprite Assets
148
-
149
- Sprites define animated ASCII art with multiple frames.
150
-
151
- ### File Header Properties
152
-
153
- | Key | Values | Required | Description |
154
- | -------------------- | --------------- | -------- | ------------------------------------------ |
155
- | `kind` | `sprite` | Yes | Asset type identifier |
156
- | `loop` | `true`, `false` | No | Whether animation loops (default: `false`) |
157
- | `default-frame-rate` | number (ms) | No | Default frame duration in milliseconds (default is 250 if none is supplied) |
158
-
159
- ### Frame Separator Properties
160
-
161
- | Key | Values | Required | Description |
162
- | ---------- | ----------- | -------- | ---------------------------------- |
163
- | `duration` | number (ms) | No | Frame duration (overrides default) |
164
- | `sound` | filename | No | Sound to play when frame displays |
165
- | `event` | string | No | Custom event name to trigger |
166
-
167
- ### Sprite Example
168
-
169
- ```
170
- § {"kind":"sprite","loop":true,"default-frame-rate":120}
171
- ¶ {"duration":1000}
172
- _ _ _ _
173
- __ _ ___ ___(_|_) |_ ___ _ __(_)_ _ _ __ ___
174
- / _` / __|/ __| | | __/ _ \| '__| | | | | '_ ` _ \
175
- | (_| \__ \ (__| | | || (_) | | | | |_| | | | | | |
176
- \__,_|___/\___|_|_|\__\___/|_| |_|\__,_|_| |_| |_|
177
- ¶ {"duration":500}
178
- . _ * _ * .
179
- __ _ ___ ___(_|_).|_ * _ __(_)_ _ * __
180
- / _` / __|/ _ . | __/ . \ '__| | | | ' ` \ .
181
- | (_| \__ (__| *|.| || (_) | * | | |_| *| | | │ .
182
- \__,_|___/\__ ._|_|\__\ * /|_| .|\__ |_| |_│
183
-
184
- * _ * . * . *
185
- __ * (_|_) . * _ __ . . __
186
- / ` __| | __/ * \ '__| * ` \
187
- | * * \__ | | || (_) | . | * * | | │
188
- . .|___/ |_| \__\___/|_| . . |_| . |_│
189
- ```
190
-
191
- ### Animation Control
192
-
193
- - **loop:true**: Animation repeats from first frame after last frame
194
- - **loop:false**: Animation plays once and stops on last frame
195
-
196
- ## Material Assets
197
-
198
- Materials define visual representations at different distances in first-person view.
199
-
200
- ### File Header Properties
201
-
202
- | Key | Values | Required | Description |
203
- | -------------- | ------------------------------------------- | -------- | --------------------------------- |
204
- | `kind` | `material` | Yes | Asset type identifier |
205
- | `usage` | `first-person`, `top-down`, `side-scroller` | Yes | Rendering context |
206
- | `placement` | `scenery`, `ground`, `ceiling` | No | Surface type (default: `scenery`) |
207
- | `onEnterSound` | filename | No | Sound when player enters tile |
208
- | `onExitSound` | filename | No | Sound when player exits tile |
209
- | `ambientSound` | filename | No | Looping sound near this material |
210
-
211
- ### Layer Separator Properties
212
-
213
- | Key | Values | Required | Description |
214
- | ------- | ------------------------------- | -------- | ------------------------------- |
215
- | `layer` | `here`, `near`, `middle`, `far` | Yes | Distance layer |
216
- | `pos` | `left`, `center`, `right` | Yes | Horizontal position |
217
- | `x` | number | No | Horizontal offset for alignment |
218
-
219
- ### Material Example
220
-
221
- ```
222
- § {"kind":"material","usage":"first-person","placement":"scenery","onEnterSound":"door-open.mp3","onExitSound":"door-close.mp3"}
223
- ¶ {"layer":"here","pos":"left"}
224
-
225
- ┊╲
226
- ╲┊ ╲
227
- ¶ {"layer":"here","pos":"center"}
228
- |‽‽‽‽‽‽‽‽‽‽|
229
- |‽‽‽‽‽‽‽‽‽‽|
230
- |‽‽‽‽‽‽‽‽‽‽|
231
- ¶ {"layer":"here","pos":"right"}
232
-
233
- ╱┊
234
- ╱ ┊╱
235
- ¶ {"layer":"near","pos":"center"}
236
- …… ……… ……… …
237
- ┊……┊………┊………┊…┊
238
- ┊┊…╭───────╮…┊
239
- ┊……|┋┋┋┋┋┋┋|…┊
240
- ¶ {"layer":"middle","pos":"center"}
241
- … … ……
242
- ┊…┊…┊……┊
243
- ┊…╭──╮…┊
244
- ┊…|┋┋|…┊
245
- ¶ {"layer":"far","pos":"center"}
246
- ……
247
- ┊……┊
248
- ┊||┊
249
- ```
250
-
251
- ### Layer System
252
-
253
- Materials use a layered perspective system that adapts to different usage contexts:
254
-
255
- #### First-Person Usage
256
-
257
- - **here**: Immediate foreground (player is on this tile)
258
- - **near**: Close distance (1-2 tiles away)
259
- - **middle**: Mid distance (3-5 tiles away)
260
- - **far**: Far distance (6+ tiles away)
261
-
262
- #### Side-Scroller Usage (Parallax Layers)
263
-
264
- - **here**: Interactive elements (platforms player stands on, walls player collides with)
265
- - **near**: Foreground elements (close platforms, foreground decorations)
266
- - **middle**: Midground elements (trees, buildings, mid-distance scenery)
267
- - **far**: Background elements (mountains, clouds, distant scenery)
268
-
269
- #### Top-Down Usage
270
-
271
- - **here**: Ground level elements (floors, paths the player walks on)
272
- - **near**: Low obstacles and ground decorations
273
- - **middle**: Medium height elements (furniture, props)
274
- - **far**: Tall elements and ceiling details
275
-
276
- Each layer can have `left`, `center`, and `right` positioned elements for additional composition control.
277
-
278
- ### Sound Triggers
279
-
280
- Sound properties are defined once in the file header and apply to the entire material:
281
-
282
- - **onEnterSound**: Plays once when player steps onto the tile
283
- - **onExitSound**: Plays once when player leaves the tile
284
- - **ambientSound**: Looping sound while material is visible (future feature)
285
-
286
- Sound files must be placed in `art/sounds/` directory.
287
-
288
- ### Side-Scroller Material Example
289
-
290
- Here's an example of materials for a side-scrolling platformer game:
291
-
292
- **Ground Platform:**
293
-
294
- ```
295
- § {"kind":"material","usage":"side-scroller","placement":"ground","onEnterSound":"step.mp3"}
296
- ¶ {"layer":"here","pos":"center"}
297
- ═══════════════════════
298
- ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
299
- ```
300
-
301
- **Brick Wall:**
302
-
303
- ```
304
- § {"kind":"material","usage":"side-scroller","placement":"scenery"}
305
- ¶ {"layer":"here","pos":"center"}
306
- █▓▒░█▓▒░█▓▒░
307
- ░▒▓█░▒▓█░▒▓█
308
- █▓▒░█▓▒░█▓▒░
309
- ░▒▓█░▒▓█░▒▓█
310
- ```
311
-
312
- **Background Mountain (Parallax):**
313
-
314
- ```
315
- § {"kind":"material","usage":"side-scroller","placement":"scenery"}
316
- ¶ {"layer":"far","pos":"center"}
317
- /\
318
- / \
319
- / \
320
- / \
321
- / \
322
- ¶ {"layer":"middle","pos":"center"}
323
- /\ /\
324
- / \/ \
325
- / \
326
- ¶ {"layer":"near","pos":"center"}
327
- /\/\
328
- / \
329
- ```
330
-
331
- In side-scrollers, the layer system naturally supports parallax scrolling where `far` layers move slower than `here` layers, creating depth perception.
332
-
333
- ## Validation Rules
334
-
335
- ### Required Properties
336
-
337
- - File header MUST have `kind` property
338
- - Material layers MUST have `layer` and `pos` properties
339
- - Sprite frames MAY omit all properties (inherits defaults)
340
-
341
- ### No Nesting Rule
342
-
343
- - All values MUST be primitives (string, number, or boolean)
344
- - Nested objects are NOT allowed
345
- - Arrays are NOT allowed
346
- - This keeps the format simple and predictable
347
-
348
- **Invalid (nested object):**
349
-
350
- ```json
351
- { "onEnter": { "sound": "door.mp3" } }
352
- ```
353
-
354
- **Valid (flat structure with primitives):**
355
-
356
- ```json
357
- { "onEnterSound": "door.mp3", "duration": 1000, "loop": true }
358
- ```
359
-
360
- ### Value Constraints
361
-
362
- - **layer**: Must be one of `here`, `near`, `middle`, `far`
363
- - **pos**: Must be one of `left`, `center`, `right`
364
- - **placement**: Must be one of `scenery`, `ground`, `ceiling`
365
- - **usage**: Must be one of `first-person`, `top-down`, `side-scroller`
366
- - **loop**: Must be boolean `true` or `false`
367
- - **duration**: Must be positive number (milliseconds)
368
- - **default-frame-rate**: Must be positive number (milliseconds)
369
- - **x**: Must be number (integer)
370
-
371
- ### Sound File References
372
-
373
- - Sound properties contain filename only (no path)
374
- - Files resolved relative to `art/sounds/` directory
375
- - Format: `"onEnterSound":"door-open.mp3"` not `"onEnterSound":"art/sounds/door-open.mp3"`
@@ -1,168 +0,0 @@
1
- § {"kind":"font"}
2
- ¶ {"character":"a"}
3
-
4
- ╭─╮
5
- ╭─┤
6
- ╰─╰
7
-
8
- ¶ {"character":"b"}
9
-
10
- ├─╮
11
- │ │
12
- ╯─╯
13
-
14
- ¶ {"character":"c"}
15
-
16
- ╭─╮
17
-
18
- ╰─╯
19
-
20
- ¶ {"character":"d"}
21
-
22
- ╭─┤
23
- │ │
24
- ╰─╰
25
-
26
- ¶ {"character":"e"}
27
-
28
- ╭─╮
29
- ├─╯
30
- ╰─╯
31
-
32
- ¶ {"character":"f"}
33
- ╭─
34
- ├─
35
-
36
-
37
-
38
- ¶ {"character":"g"}
39
-
40
-
41
- ╭─╮
42
- ╰─┤
43
- ╰─╯
44
- ¶ {"character":"h"}
45
-
46
-
47
- ├─╮
48
- ╵ ╵
49
-
50
- ¶ {"character":"i"}
51
-
52
-
53
-
54
-
55
-
56
- ¶ {"character":"j"}
57
-
58
-
59
-
60
-
61
- ╰─╯
62
- ¶ {"character":"k"}
63
-
64
- │╱
65
- ├╮
66
- ╵╵
67
-
68
- ¶ {"character":"l"}
69
-
70
-
71
-
72
-
73
-
74
- ¶ {"character":"m"}
75
-
76
- ╭─┬─╮
77
- │ │ │
78
- ╵ ╵ ╵
79
-
80
- ¶ {"character":"n"}
81
-
82
- ┌─╮
83
- │ │
84
- ╵ ╵
85
-
86
- ¶ {"character":"o"}
87
-
88
- ╭─╮
89
- │ │
90
- ╰─╯
91
-
92
- ¶ {"character":"p"}
93
-
94
- ╭─╮
95
- │ │
96
- ├─╯
97
-
98
- ¶ {"character":"q"}
99
-
100
- ╭─╮
101
- │ │
102
- ╰─┤
103
-
104
- ¶ {"character":"r"}
105
-
106
- ╭─╮
107
-
108
-
109
-
110
- ¶ {"character":"s"}
111
-
112
- ╭─╮
113
- ╰─╮
114
- ╰─╯
115
-
116
- ¶ {"character":"t"}
117
-
118
- ╶┼╴
119
-
120
-
121
-
122
- ¶ {"character":"u"}
123
-
124
- ╷ ╷
125
- │ │
126
- ╰─┘
127
-
128
- ¶ {"character":"v"}
129
-
130
-
131
- \ /
132
- V
133
-
134
- ¶ {"character":"w"}
135
-
136
-
137
- │ ╷ │
138
- ╰─┴─╯
139
-
140
- ¶ {"character":"x"}
141
-
142
-
143
- ╲╱
144
- ╱╲
145
-
146
- ¶ {"character":"y"}
147
-
148
-
149
- ╷ ╷
150
- ╰─┤
151
- ─╯
152
-
153
- ¶ {"character":"z"}
154
-
155
- ──╮
156
-
157
- ╰──
158
-
159
- ¶ {"character":"!"}
160
-
161
-
162
-
163
-
164
- ¶ {"character":"W"}
165
- ╷ ╷
166
- │ ╷ │
167
- │ │ │
168
- ╰─┴─╯
@@ -1,62 +0,0 @@
1
- # Example Map Directory
2
-
3
- This folder demonstrates how to create a basic game level map for asciitorium.
4
-
5
- ## Contents
6
-
7
- - `example.art`: The ASCII map layout showing a dungeon with rooms and corridors
8
- - `legend.json`: Maps characters in the map to materials and sprites
9
-
10
- ## Map Example
11
-
12
- Here's a portion of the example map (`example.art`):
13
-
14
- ```text
15
- ╭───────────────────────────────────┬───╮
16
- │ │ │
17
- │ ╷ ╭───────────────┬───────╮ ╰─o─┤
18
- │ │ │ │ │ │
19
- │ │ ╵ ╶───────╮ ├─o─╮ ╰───╮ │
20
- │ │ │ │ │ │ │
21
- │ ╰───────┬───────╯ ├───┤ ╭───╯ │
22
- │ │ │ │ │ │
23
- ├───────────╯ ╭───────┴─o─┤ │ ╶───┤
24
- ```
25
-
26
- This represents a game layout with:
27
-
28
- - **Walls**: Various box-drawing characters (`╭`, `╮`, `╯`, `╰`, `│`, `─`, `├`, `┤`, `┬`, `┴`)
29
- - **Doors**: `o` characters at strategic connection points
30
- - **Open spaces**: Regular spaces for walkable areas
31
- - **Partial walls**: `╷`, `╵`, `╶`, `╴` for incomplete barriers
32
-
33
- ## Legend Format
34
-
35
- The `legend.json` file defines what each character represents:
36
-
37
- ```json
38
- {
39
- "╭": { "kind": "material", "name": "wall", "solid": true, "asset": "wall" },
40
- "╮": { "kind": "material", "name": "wall", "solid": true, "asset": "wall" },
41
- "│": { "kind": "material", "name": "wall", "solid": true, "asset": "wall" },
42
- "─": { "kind": "material", "name": "wall", "solid": true, "asset": "wall" },
43
- "o": {
44
- "kind": "material",
45
- "name": "door",
46
- "solid": true,
47
- "tag": "door",
48
- "asset": "door"
49
- },
50
- " ": { "kind": "material", "name": "floor", "solid": false, "asset": "floor" }
51
- }
52
- ```
53
-
54
- ### Legend Properties
55
-
56
- - **kind**: Type of object (`"material"` for terrain, `"sprite"` for entities)
57
- - **name**: Descriptive name for the object
58
- - **solid**: Whether the object blocks movement (`true`/`false`)
59
- - **tag**: Optional category for gameplay logic (e.g., `"door"`, `"enemy"`)
60
- - **asset**: Reference to the visual asset file to use for rendering (all asset files assumed to end in .art)
61
-
62
- Use this example as a reference for organizing your own maps, materials, and sprites in asciitorium.
@@ -1,29 +0,0 @@
1
- {
2
- "legend": [
3
- {
4
- "chars": ["╭", "╮", "╯", "╰", "│", "─", "├", "┤", "┬", "┴", "╷", "╵", "╶", "╴"],
5
- "kind": "material",
6
- "name": "wall",
7
- "solid": true,
8
- "asset": "material/wall-brick"
9
- },
10
- {
11
- "chars": ["o"],
12
- "kind": "material",
13
- "name": "door",
14
- "solid": false,
15
- "entity": "door",
16
- "asset": "material/door-wooden"
17
- },
18
- {
19
- "chars": ["b"],
20
- "kind": "material",
21
- "name": "bone",
22
- "solid": false,
23
- "visible": false,
24
- "entity": "item",
25
- "variant": "bone",
26
- "asset": "material/bone"
27
- }
28
- ]
29
- }
@@ -1,21 +0,0 @@
1
- ╭───────────────────────────────────┬───╮
2
- │ │ │
3
- │ ╷ ╭───────────────┬───────╮ ╰─o─┤
4
- │ │ │ │ │ │
5
- │ │ ╵ ╶───────╮ ├─o─╮ ╰───╮ │
6
- │ │ │ │ │ │ │
7
- │ ╰───────┬───────╯ ├───┤ ╭───╯ │
8
- │ b │ │ │ │ │
9
- ├───────────╯ ┴─o─┤ │ ╶───┤
10
- │ │ │ │
11
- │ ╭───────┬ ╭───────╯ ├───╮ │
12
- │ │ │ │ │ │
13
- │ ╰───┬─o─┤ ╭───┤───────╮ ├─o─┤ │
14
- │ │ │ │ │ │ │ │ │
15
- ├───╮ ╰───╯ ├─o─╯ ╷ │ ╵ │ │
16
- │ │ │ │ │ │ │
17
- ├─o─┴───────────┤ ╭───╯ ├───────┤ │
18
- │ │ │ │ │ │
19
- │ ╶───╮ ╶───╯ │ ╶───╯ ╷ ╵ │
20
- │ │ │ │ │
21
- ╰───────┴───────────┴───────────┴───────╯
@@ -1,11 +0,0 @@
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
-