asciitorium
Version:
an ASCII CLUI framework
154 lines (118 loc) • 4.26 kB
Markdown
This directory contains ASCII art material files for the **FirstPersonView** and
**MapView** components. Materials define the visual appearance of walls, floors,
and other environmental surfaces with depth-based layering.
Material files use the `.art` extension and follow a structured format with
metadata separators:
```txt
§ {"kind":"material","usage":"first-person"}
¶ {"layer":"here","position":"left","x":-1}
|╲
| ╲
| ╲
| ╲
| ╲
| ╲
| ╲
| |
| |
¶ {"layer":"near","position":"center","x":6}
____________
| |
| |
| |
|____________|
```
```txt
§ {"kind":"material","usage":"first-person","placement":"ground"}
¶ {"layer":"here","position":"center"}
⎽ ⎽
(_'⎯⎯⎯⎯⎯'_)
(⎽.⎯⎯⎯⎯⎯.⎽)
¶ {"layer":"near","position":"center"}
:‧‧:
¶ {"layer":"middle","position":"center"}
..
¶ {"layer":"far","position":"center"}
‥
```
1. **File Header** (`§` separator)
- Must start with `§ {"kind":"material"}`
- Indicates this is a material asset
- Defines material properties:
- `usage`: Rendering context (`"first-person"`, `"top-down"`,
`"side-scroller"`)
- `placement`: Surface type (`"scenery"` [default], `"ground"`,
`"ceiling"`)
- `onEnterSound`: Sound file to play when player enters tile (e.g.,
`"splash.mp3"`)
- `onExitSound`: Sound file to play when player exits tile
- `ambientSound`: Looping sound while visible (future feature)
2. **Layer Sections** (`¶` separator)
- Each layer begins with `¶` followed by JSON metadata
- Layer metadata:
- `layer`: Depth layer (`"here"`, `"near"`, `"middle"`, `"far"`)
- `position`: Horizontal alignment (`"left"`, `"center"`, `"right"`)
- `x`: Horizontal offset for precise positioning
- Layer content follows immediately after the metadata line
3. **Layer Content**
- ASCII art representation of the material at that depth
- Each layer can be any width/height
- Blank lines are preserved
- Multiple layers create perspective depth
**Tips:**
- `"here"` layer is closest to viewer (immediate foreground)
- `"far"` layer is furthest (distant background)
- Use box drawing characters for structure: `|`, `─`, `╱`, `╲`, `╭`, `╮`, `╯`,
`╰`
- Each layer can have left/center/right positioned elements with x-offsets for
perspective alignment
## Using Materials in Your App
Materials are referenced in map legends through the `asset` property:
### Map Legend Entry
```json
{
"chars": ["#"],
"name": "wireframe-wall",
"solid": true,
"material": "wireframe"
}
```
The system loads the corresponding `wireframe.art` file and renders the
appropriate layer based on viewing context and distance.
Materials are loaded asynchronously via the `AssetManager`:
```typescript
const materialAsset = await AssetManager.getMaterial('wireframe');
```
Material assets are cached on first load - subsequent uses of the same material
reuse the cached data.
Materials support sound playback through properties in the file header (`§`):
- **Sound files location**: `art/sounds/` directory
- **Supported formats**: MP3
- **Environment**: Sounds only play in web mode (not CLI)
- **onEnterSound**: Plays once when player steps onto tile with this material
- **onExitSound**: Plays once when player steps off tile
Control sounds globally via `SoundManager`:
```typescript
import { SoundManager } from 'asciitorium';
SoundManager.setEnabled(false); // Disable all sounds
SoundManager.setEnabled(true); // Re-enable sounds
SoundManager.playSound('custom-sound.mp3'); // Play manually
```
The layering system creates first-person perspective depth:
- **here**: Immediate foreground (closest to viewer)
- **near**: Close objects with full detail
- **middle**: Mid-distance objects with moderate detail
- **far**: Distant objects with minimal detail
Each layer can have left, center, and right positioned elements with specific
x-offsets for proper perspective alignment.