ãšã³ãžã³ã®ä»çµã¿ â ã©ãã§ãåãã¹ã¯ãªãããšã³ãžã³
kaedevn ã§äœã£ãäœåã Web ã§ã Android ã§ã PC ã§ãåãããã«åãç§å¯ã¯ããã©ãããã©ãŒã ã«äŸåããªãã¹ã¯ãªãããšã³ãžã³ã®èšèšã«ãããŸããçŽ80,000è¡ã®ãœãŒã¹ã³ãŒããããã®ãã©ãã§ãåãããæ¯ããŠããŸãã
ã³ã³ãã€ã©ãšã€ã³ã¿ããªã¿ã®éã
kaedevn ã«ã¯2ã€ã®ã¹ã¯ãªããåŠçç³»ããããããããä»çµã¿ãç°ãªããŸãã
- packages/compiler â KS (.ks) / ã³ã³ãã€ã© â ã¹ã¯ãªãããäºåã« Op[]ïŒåœä»€é åïŒã«å€æãå®è¡æã¯ OpRunner ãåœä»€ãé ã«åŠç
- packages/interpreter â KSC (.ksc) / ã€ã³ã¿ããªã¿ â ã¹ã¯ãªããã鿬¡è§£éããŠçŽæ¥å®è¡ããããã°ã¢ãŒãããšã©ãŒåè£æç€ºãæèŒ
ã³ã³ãã€ã©ã¯ã¹ã¯ãªããå šäœãäºåã«æ©æ¢°ãèªãã圢ã«å€æããŠããå®è¡ããŸããã€ã³ã¿ããªã¿ã¯ã¹ã¯ãªããã1è¡ãã€èªã¿ãªãããã®å Žã§å®è¡ããŸãã
2ã€ã®ã¹ã¯ãªãã圢åŒ
kaedevn ã«ã¯çšéã®ç°ãªã2ã€ã®ã¹ã¯ãªãã圢åŒããããŸãã
KSïŒKaede ScriptïŒâ ã¿ã°ããŒã¹ã20ã³ãã³ã
TyranoScript ã«è¿ãã·ã³ãã«ãªåœ¢åŒã§ããã»ãªããåºæ¬æŒåºãçŽ æ©ãèšè¿°ããã®ã«åããŠããŸãã
@bg id="room"
@ch name="sakura" pose="smile" pos="C"
æ¡ããã¯ããïŒä»æ¥ããã倩æ°ã ãã
@choice text="äžç·ã«åºããã" target="go_out"
@choice text="å®¶ã§ã®ãã³ã" target="stay_home"
察å¿ã³ãã³ãïŒ20çš®ïŒ:
- æ å â @bg, @ch, @ch_hide, @ch_clear, @overlay, @overlay_hide, @show, @hide, @move, @fade
- é³å£° â @bgm, @bgm_stop, @se, @voice
- å¶åŸ¡ â @wait, @jump, @choice, @if, @set
- ãšãã§ã¯ã â @screen_filter
KSCïŒKaede Script CodeïŒâ TypeScript 颚ãåå®å š
TypeScript ã«è¿ãæ§æã§ã倿°ã»æ¡ä»¶åå²ã»é¢æ°å®çŸ©ã»åãã§ãã¯ãªã©ã®é«åºŠãªããžãã¯ãæžãã圢åŒã§ãã
bg("room")
ch("sakura", "smile", "C")
#sakura
ããã¯ããïŒä»æ¥ããã倩æ°ã ãã
#
if (affection >= 10) {
choice {
"äžç·ã«åºããã" { jump("go_out") }
"ããŒãã«èªã" { jump("date") }
}
} else {
choice {
"äžç·ã«åºããã" { jump("go_out") }
"å®¶ã§ã®ãã³ã" { jump("stay_home") }
}
}
KSC ã®åã·ã¹ãã :
- number â
affection = 5 - string â
playerName = "倪é" - boolean â
isClear = false - object â
{hp: 100, mp: 50} - array â
[1, 2, 3] - union â
number | string - 颿° â
def get_rank(score) { ... }
ã³ã³ãã€ã«ããå®è¡ãŸã§ã®æµã
KS ã®å ŽåïŒ4段éãã€ãã©ã€ã³ïŒ
.ks ã¹ã¯ãªãã
|
v
Tokenizer ââ åå¥è§£æïŒè¡ãåé¡ïŒ
| lineClassifier ã§ COMMAND / TEXT / LABEL ãå€å®
v
Parser âââââ æ§æè§£æïŒã³ãã³ãã¬ãžã¹ããªåç
§ïŒ
| commandRegistry.ts ãå
šã³ãã³ãã®å®çŸ©æº
v
Transformer â å€æã»æé©å
|
v
Finalizer ââ æ€èšŒ + Op[] åºå
| ãã©ãããã©ãŒã éäŸåã®åœä»€å
v
OpRunner âââ 1åœä»€ãã€å®è¡ãæç»ãšã³ãžã³ã«å§è²
KSC ã®å ŽåïŒã€ã³ã¿ããªã¿ïŒ
.ksc ã¹ã¯ãªãã
|
v
ã€ã³ã¿ããªã¿ ââ ã¹ã¯ãªããã鿬¡è§£éããŠçŽæ¥å®è¡
| TypeScript é¢šã®æ§æã1è¡ãã€åŠç
v
HostAPI ââââââ æç»ãšã³ãžã³ã«åœä»€ãå§è²
KSC ã€ã³ã¿ããªã¿ã¯ãããã°ã¢ãŒãïŒãã¬ãŒã¯ãã€ã³ãã倿°ãŠã©ãããã¹ãããå®è¡ïŒããšã©ãŒåè£æç€ºïŒLevenshtein è·é¢ã«ããé¡äŒŒã³ãã³ãã®ææ¡ïŒãæèŒããŠããŸãã
éèŠãªã®ã¯ãã³ã³ãã€ã©ã®åºåãã Op[] ããã©ãããã©ãŒã ãåããå ±é ã§ããç¹ã§ããåãåœä»€åã Web ãã©ãŠã¶ã§ã Nintendo Switch ã§ãå®è¡ã§ããŸãã
Op åïŒäžé衚çŸïŒâ ãšã³ãžã³ã®å ±éèšèª
ã³ã³ãã€ã©ãåºåããåœä»€ã®çš®é¡ã¯ä»¥äžã®éãã§ãã
- ããã¹ã â TEXT_APPENDïŒè©±è å + æ¬æïŒ
- æ å â BG_SET, CH_SET, CH_HIDE, CH_CLEAR, OVL_SET, OVL_HIDE, SHOW, HIDE, MOVE, FADE, SCREEN_FILTER
- é³å£° â BGM_PLAY, BGM_STOP, SE_PLAY, VOICE_PLAY
- å¶åŸ¡ â CHOICE, JUMP, VAR_SET, IFïŒãã¹ã察å¿ïŒ
- åŸ æ© â WAITïŒclick / timeout / voiceendïŒ
- ã¢ãã¡ãŒã·ã§ã³ â Timeline ããŒãã¬ãŒã
ã¹ã¯ãªãããšã³ãžã³ã®åœ¹å²
ã¹ã¯ãªãããšã³ãžã³ïŒKS ã® OpRunner / KSC ã®ã€ã³ã¿ããªã¿ïŒã¯ã¹ã¯ãªããã®ãé è³ãã§ãã以äžãæ åœããŸãã
- å®è¡å¶åŸ¡: ã³ã³ãã€ã«æžã¿åœä»€ã®é 次å®è¡ïŒKSïŒ/ ã¹ã¯ãªããã®é次解éïŒKSCïŒ
- 倿°ã®ä¿æ: ãã©ã°ã奜æåºŠãªã©ã®ã²ãŒã ç¶æ ã管çïŒã°ããŒãã«/ããŒã«ã«ã¹ã³ãŒã察å¿ïŒ
- ãããŒå¶åŸ¡: if åå²ããžã£ã³ãããµãã«ãŒãã³åŒã³åºãïŒcall / retïŒãfor / while ã«ãŒã
- éžæè¢ã®åŠç: ãã¬ã€ã€ãŒã®éžæãåãåãã察å¿ããã©ãã«ãžç§»å
ã¹ã¯ãªãããšã³ãžã³èªäœã¯ç»é¢æç»ãé³å£°åçãäžåè¡ããŸããããèæ¯ã room ã«å€ããŠããBGM ãåçããŠããšãã£ãåœä»€ãçºè¡ããã ãã§ããå®éã®æç»ã¯ãåãã©ãããã©ãŒã ã®å®è£ ïŒWeb ãªã PixiJSãSwitch ãªã SDL2ïŒãæ åœããŸãã
IEngineAPI â ãã©ãããã©ãŒã ãç¹ãã€ã³ã¿ãŒãã§ãŒã¹
ã¹ã¯ãªãããšã³ãžã³ãšæç»ãšã³ãžã³ã®éã«ã¯ IEngineAPI ãšããæœè±¡ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ãããŠããŸãã
IEngineAPI
âââ showText(speaker, body) ããã¹ã衚瀺
âââ showChoice(options) éžæè¢è¡šç€º â éžæçµæãè¿ã
âââ setBg(assetId) èæ¯å€æŽ
âââ showCh(charId, exprId, pos) ãã£ã©ã¯ã¿ãŒè¡šç€º
âââ hideCh(charId) ãã£ã©ã¯ã¿ãŒé衚瀺
âââ playBgm(assetId) BGM åç
âââ playSe(assetId) 广é³åç
âââ wait(mode, ms) åŸ
æ©
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããã ãã§ãæ°ãããã©ãããã©ãŒã ã«å¯Ÿå¿ã§ããŸããå®éã«ä»¥äžã®å®è£ ãååšããŸãã
- WebOpHandler â Web ãã©ãŠã¶ïŒPixiJSïŒ â æ¬çªçš
- SDL2Engine â Switch / Android / PC â ãã€ãã£ã
- TestEngine â ãŠããããã¹ãçšïŒç»é¢ãªãã§åäœæ€èšŒïŒ
- ConsoleEngine â ã³ã³ãœãŒã«ãã¢ïŒããã¹ãåºåã®ã¿ïŒ
ãããã°ã¢ãŒã
Kaede Script ã®ã³ãŒãèšæ³ïŒKSCïŒãå®è¡ããã€ã³ã¿ããªã¿ã«ã¯ãããã°æ©èœãçµã¿èŸŒãŸããŠããŸãã
- ãã¬ãŒã¯ãã€ã³ã: ä»»æã®è¡çªå·ã§å®è¡ãäžæåæ¢
- 倿°ãŠã©ãã: 倿°ã®å€ããªã¢ã«ã¿ã€ã ã§ç£èŠ
- ãã¬ãŒã¹ãã°: å®è¡ãããå šè¡ãèšé²
- ã¹ãããå®è¡: 1è¡ãã€é²ãã
ãšã©ãŒãã³ããªã³ã°
ã¹ã¯ãªããã«ãã¹ããã£ãå Žåãkaedevn ã¯èŠªåãªãšã©ãŒã¡ãã»ãŒãžãè¿ããŸãã
- Levenshtein è·é¢ã«ããé¡äŒŒã³ãã³ãã®åè£è¡šç€ºïŒã@bgg ãšæžããŸãããã@bg ã®ããšã§ããïŒãïŒ
- ã¹ã¿ãã¯ãã¬ãŒã¹: åŒã³åºãå ã®è¡çªå·ãšé¢æ°å
- ååŸã®ã³ã³ããã¹ã: ãšã©ãŒç®æã®åšèŸºè¡ã衚瀺
// å®è¡æã«ãšã©ãŒãæ€åº
affection = "é«ã" // Error: numberåã®å€æ°ã«stringã代å
¥ã§ããŸãã
jump(123) // Error: jump()ã®åŒæ°ã¯stringã§ããå¿
èŠããããŸã
ãªããã®èšèšãªã®ã
åŸæ¥ã®ããã«ç³»ãšã³ãžã³ã¯ãç¹å®ã®ãã©ãããã©ãŒã ïŒWindows ã WebïŒã«å¯çµåããŠããŸãããkaedevn ã¯æåãã Nintendo Switch ãžã®ç§»æ€ãèŠæ®ããŠããšã³ãžã³ã®ã³ã¢éšåãšãã©ãããã©ãŒã åºæã®åŠçãæç¢ºã«åé¢ããŠããŸãã
ãã®èšèšã«ãã:
- äœè ã¯1åæžãã ã: åãã¹ã¯ãªãããå šãã©ãããã©ãŒã ã§åã
- ç§»æ€ã³ã¹ããæå°: æ°ãããã©ãããã©ãŒã ã«å¯Ÿå¿ããã«ã¯ IEngineAPI ãå®è£ ããã ã
- ãã¹ãã容æ: ã¹ã¯ãªãããšã³ãžã³åäœã§ã¹ã¯ãªããã®æ£ãããæ€èšŒã§ããïŒç»é¢ãªãã§ 107 以äžã®ãã¹ããéãïŒ
- 2ã€ã®å ¥å£: åå¿è 㯠KS ã®ã¿ã°ããŒã¹ãäžçŽè 㯠KSC ã® TypeScript é¢šæ§æãéžã¹ã
é¢é£ããã¥ã¡ã³ã
- KS ã¹ã¯ãªãã仿§æž â KS ã³ã³ãã€ã©ã®å šã³ãã³ã
- KSC ã¹ã¯ãªãã仿§æž â KSC ã€ã³ã¿ããªã¿ã®å šã³ãã³ã
- ãã«ããã©ãããã©ãŒã â SDL2 ãã€ãã£ããšã³ãžã³
- ã¢ã»ããã®ããŒã¿ããªã㣠â å ±éã¢ã»ããèšèš