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.
- package/dist/templates/base/ASCIITORIUM_REFERENCE.md +45 -30
- package/dist/templates/base/public/art/README.md +82 -83
- package/dist/templates/base/public/art/fonts/README.md +115 -0
- package/dist/templates/base/public/art/maps/README.md +89 -190
- package/dist/templates/base/public/art/materials/README.md +82 -206
- package/dist/templates/base/public/art/sounds/README.md +11 -0
- package/dist/templates/base/public/art/sprites/README.md +138 -0
- package/dist/templates/base/src/main.tsx +4 -4
- package/dist/templates/base/vite.config.ts +12 -1
- package/package.json +1 -1
- package/dist/templates/base/public/art/ART-DESIGN-SPEC.md +0 -375
- package/dist/templates/base/public/art/font/pencil.art +0 -168
- package/dist/templates/base/public/art/maps/example/README.md +0 -62
- package/dist/templates/base/public/art/maps/example/legend.json +0 -29
- package/dist/templates/base/public/art/maps/example/map.art +0 -21
- package/dist/templates/base/public/art/materials/bone.art +0 -11
- package/dist/templates/base/public/art/materials/door-wooden.art +0 -154
- package/dist/templates/base/public/art/materials/wall-brick.art +0 -128
- package/dist/templates/base/public/art/materials/wall-wireframe.art +0 -128
- 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 +0 -6
- package/dist/templates/base/public/art/sprites/balloon.art +0 -126
- package/dist/templates/base/public/art/sprites/beating-heart.art +0 -49
- package/dist/templates/base/public/art/sprites/castle.art +0 -4
- package/dist/templates/base/public/art/sprites/component-icon.art +0 -6
- package/dist/templates/base/public/art/sprites/eyes.art +0 -61
- package/dist/templates/base/public/art/sprites/firework.art +0 -58
- package/dist/templates/base/public/art/sprites/heart.art +0 -5
- package/dist/templates/base/public/art/sprites/multi-select-test.art +0 -6
- package/dist/templates/base/public/art/sprites/nav-basics.art +0 -5
- package/dist/templates/base/public/art/sprites/pyramid.art +0 -5
- package/dist/templates/base/public/art/sprites/welcome.art +0 -7
- 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
|
-
‥
|