hascii
v0.1.1
Published
YAML-based fantasy console for the terminal
Readme
YAML ベースのファンタジーコンソール。ターミナルで動作する。
Install
bun add -g hasciiUsage
# TUI コンソールを起動
hascii
# カートリッジファイルを実行
hascii game.yaml
# エディタで開く
hascii -e game.yamlControls
| Key | Action | |-----|--------| | Arrow keys / WASD | Move | | Z / J | Action A (confirm) | | X / K | Action B (cancel) | | ESC | Exit / Back |
Specs
| Item | Value | |------|-------| | Screen | 80x22 | | Colors | 16 (0-15) | | SFX | 16 slots | | Patterns | 8 slots | | Channels | 4ch | | Waveforms | TRI, SAW, SQR, PLS, ORG, NOI, PHA, SIN | | Octave | 2-5 | | Volume | 0-7 |
Language
Hascii は YAML で記述する宣言的なゲーム言語。Elm アーキテクチャ (init/update/draw) に基づいている。
# yaml-language-server: $schema=hascii/hascii.schema.json
meta:
title: "GAME"
frame: 10
bg: 0
init:
x: 40
y: 10
score: 0
update:
- if: btn.left
set: { x: { sub: [x, 1] } }
- if: btn.right
set: { x: { add: [x, 1] } }
draw:
- cls:
- fill: 10
- rect: [x, y, 2, 1]
- stroke: 7
- print: [score, 0, 0]meta
ゲームのメタデータを定義する。
| Key | Description |
|-----|-------------|
| title | ゲームタイトル |
| frame | フレームレート (1-60) |
| bg | 背景色 (0-15) |
init
ゲーム開始時の初期状態を定義する。ここで定義した変数は update と draw から参照できる。
init:
x: 40
y: 10
items: [1, 2, 3]
player: { hp: 100, mp: 50 }update
毎フレーム実行されるロジックを定義する。状態を変更するには set を使う。
update:
# 変数を設定
- set: { x: 10, y: 20 }
# 条件付き (短縮形)
- if: condition
set: { x: 0 }
# 条件付き (then/else)
- if: condition
then:
- set: { x: 1 }
else:
- set: { x: 0 }
# ループ
- each: items
as: item
index: i
do:
- set: { score: { add: [score, item] } }
# 配列操作
- push: { to: arr, item: value }
- filter:
list: arr
as: item
cond: { gt: [item, 0] }draw
毎フレームの描画処理を定義する。
draw:
- cls: # 画面クリア
- fill: 10 # 塗りつぶし色 (0-15)
- stroke: 7 # 線の色 (0-15)
- noFill: # 塗りつぶし無効
- noStroke: # 線無効
- rect: [x, y, w, h] # 矩形
- circ: [x, y, r] # 円
- print: [text, x, y] # テキストExpressions
式は { operator: [args] } の形式で記述する。
| Expression | Description |
|------------|-------------|
| { add: [a, b] } | 加算 |
| { sub: [a, b] } | 減算 |
| { mul: [a, b] } | 乗算 |
| { div: [a, b] } | 除算 |
| { mod: [a, b] } | 剰余 |
| { min: [a, b] } | 最小値 |
| { max: [a, b] } | 最大値 |
| { rnd: [min, max] } | 乱数 (整数) |
| { abs: n } | 絶対値 |
| { floor: n } | 切り捨て |
| { eq: [a, b] } | 等価 (0 or 1) |
| { lt: [a, b] } | 小なり |
| { gt: [a, b] } | 大なり |
| { and: [a, b, ...] } | 論理 AND |
| { or: [a, b, ...] } | 論理 OR |
| { not: a } | 論理 NOT |
| { at: [arr, i] } | 配列アクセス |
| { len: arr } | 配列の長さ |
Input
入力状態は組み込み変数で参照する。
| Variable | Description |
|----------|-------------|
| btn.left | 左キー押下中 |
| btn.right | 右キー押下中 |
| btn.up | 上キー押下中 |
| btn.down | 下キー押下中 |
| btn.a | Z キー押下中 |
| btn.b | X キー押下中 |
| btnPressed.left | 左キー押した瞬間 |
| btnPressed.right | 右キー押した瞬間 |
| btnPressed.up | 上キー押した瞬間 |
| btnPressed.down | 下キー押した瞬間 |
| btnPressed.a | Z キー押した瞬間 |
| btnPressed.b | X キー押した瞬間 |
Editor
TUI コンソールにはエディタが内蔵されている。
| Tab | Description | |-----|-------------| | CODE | YAML ソース編集 | | SPRITE | (未実装) | | MAP | (未実装) | | SFX | 効果音エディタ | | TRACKER | 4ch 音楽トラッカー | | PLAY | ゲームプレビュー | | DATA | セーブデータ | | QUIT | エディタ終了 |
License
MIT
