RPG ã²ãŒã æ©èœ ããŒãããã
kaedevn 㯠ããã«ã²ãŒã ãš RPG ã²ãŒã ã®ã©ã¡ããäœãããã©ãããã©ãŒã ãç®æããŠããŸãã
- ðïž ããã«ã²ãŒã ïŒããã¹ãã»åå²ã»ãããã¯ã§ç©èªãç·šããVRM / Live2D ãã£ã©ãã·ãŒã³ã«é 眮ã皌åäž
- ðºïž RPG ã²ãŒã ïŒDatabaseïŒã¢ã¯ã¿ãŒã»ã¹ãã«ã»æµã»ã¢ã€ãã ïŒãã¿ã€ã«ããããã€ãã³ããã¿ãŒã³å¶ããã«ãéçºäžïŒæ¬ããŒãžïŒ
ããã«åäœã»RPG åäœã»ãããŠäž¡æ¹ãçµã¿åãããäœåãåããã©ãããã©ãŒã ã®äžã§äœããã®ãæçµçãªçãã§ãããããã«æ¬ç·šã®éäžã«ãã RPG ãæããããRPG ã®äŒè©±ã·ãŒã³ãããã«ã§æŒåºãããããã©ã¡ããåãæ¹åããæ¯ããããèšèšã«ãªã£ãŠããŸãã
â ïž ãã®ããŒãžã§èª¬æãã RPG æ©èœã¯ãŸã éçºäžã§ããçŸæç¹ã§äœè ã®çæ§ã¯å©çšã§ããŸããã ããã«åŽã®æ©èœã¯ ãã€ããŒãžã®äœ¿ãæ¹ / ãšãã£ã¿å®å šã¬ã€ã ããä»ããã詊ãããã ããŸãã
RPG ã²ãŒã æ©èœã§äœãã§ããããã«ãªãã
宿æã«äœè ãæ±ããæ©èœçŸ€ã§ããRPG ãã¯ãŒã« MV/MZ ãšåçã®è¡šçŸåãç®æããŠããŸãããå éšèšèšã¯å¥ç©ã§ãïŒâ èšèšææ³ïŒã
ð Database â ã²ãŒã ã®ç»å ŽèŠçŽ ãå®çŸ©
| ã«ããŽãª | å 容 |
|---|---|
| ã¢ã¯ã¿ãŒïŒå³æ¹ïŒ | HP / MP / ATK / DEF / SPDãèŠããã¹ãã«ãè£ å |
| ã¹ãã« | æ»æïŒå埩ïŒããïŒç¶æ ç°åžžãåšåãMP ã³ã¹ãã察象ç¯å²ïŒåäœã»å šäœïŒã屿§ãåœäžå€å® |
| ãšãã㌠| HP / ãã©ã¡ãŒã¿ãè¡å AIãããããããã¢ã€ãã ã»çµéšå€ã»ãŽãŒã«ã |
| ã¢ã€ãã | æ¶è²»ã¢ã€ãã / æŠåš / é²å · / ããŒã¢ã€ãã ã广ãå ¥ææ¹æ³ |
| ã¹ããŒãïŒç¶æ ç°åžžïŒ | æ¯ã»éº»çºã»ã¹ã¿ã³çãæç¶ã¿ãŒã³ãä»äžç¢ºç |
| 倿° / ã¹ã€ãã | ã°ããŒãã«ã»ãããã¹ã³ãŒãã§å ±æãããç¶æ ãã©ã° |
ðºïž ããããšãã£ã¿ â æ©ããäžçãäœã
- ã¿ã€ã«é 眮ïŒèã»å£ã»éè·¯ã»æ°Žã»å¢çãªã©ã®ã¿ã€ã«ã 20Ã15 ãã¹ã«å¡ã
- ã€ãã³ãé 眮ïŒNPCã»å®ç®±ã»ã¯ãŒãæãªã©ãåº§æšæå®ã§èšçœ®
- ãªãŒãžã§ã³ïŒç¯å²ããšã« BGM ããšã³ã«ãŠã³ãã¬ãŒããèšå®
- ãããéé·ç§»ïŒ
transfer_playerã€ãã³ãã§å¥ããããžãžã£ã³ã - ããããã / UIïŒãã¬ã€ã€ãŒã®äœçœ®ããªã¢ã«ã¿ã€ã 衚瀺
ð¬ ã€ãã³ãã³ãã³ãïŒ21 çš®ïŒ â RPG ã® "åã" ãæžã
RPG ãã¯ãŒã« MV/MZ ãšåçã® 21 çš®ã®ã³ãã³ããå®è£ æžã¿ïŒ
- ã»ãªã衚瀺 / éžæè¢
- ã¹ã€ããã»å€æ°æäœïŒ= / += / â= / Ã= / ÷=ïŒ
- ã»ã«ãã¹ã€ããïŒAãDïŒ
- æ¡ä»¶åå²ïŒthen / elseããã¹ãç¡å¶éïŒ
- ããã転éïŒãã¬ã€ã€ãŒãå¥ããããžïŒ
- æŠééå§ïŒçµæã§åå© / æååå²ïŒ
- BGM / SE åç
- ãŽãŒã«ãã»ã¢ã€ãã ã®å¢æž
- ããŒãã£ã¡ã³ããŒã®å ¥æ¿
- å šå埩
- ãŠã§ã€ã / ã³ã¡ã³ã
ããã㯠Kaede ScriptïŒKS / KSCïŒãšã¯å¥ç³»çµ±ã®ããžã¥ã¢ã« DSLãšããŠèšèšãããŠããããã©ãã°&ããããã§çµã¿ç«ãŠãããŸããè£åŽã®å®è£ 㯠TypeScript ã® discriminated union ã§åæ€æ»ãéã£ãç¶æ ã®ã³ãã³ãããªãŒãåžžã«ä¿ãããŸãã
âïž ã³ãã³ãããã«
- ã¿ãŒã³å¶ïŒçŽ æ©ãïŒSPDïŒé ã«è¡å
- ã³ãã³ãéžæïŒæ»æ / ã¹ãã« / ã¢ã€ãã / é²åŸ¡ / éãã
- ãã¡ãŒãžèšç®ïŒ
(ATK à power) â DEFãåœäžå€å®ã屿§åç - ç¶æ ç°åžžïŒæ¯ã»éº»çºã»ã¹ã¿ã³ã®åŠçãæç¶ã¿ãŒã³ã®ç®¡ç
- åæå€å®ïŒæµå šæ» / 峿¹å šæ» / éèµ° / ç¶ç¶
- 決å®è«çïŒã·ãŒãä»ãä¹±æ°ã«ãããåãå ¥åã§åãçµæãåçŸå¯èœïŒãããã°ã»åç»æ®åœ±ã«äŸ¿å©ïŒ
simulate()颿°ïŒããã«å šäœãé«éã·ãã¥ã¬ãŒã·ã§ã³ããŠåçã»æåŸ ãã¡ãŒãžãäºåèšç®
詳现㯠ããã«ã·ã¹ãã ã¬ã€ããããã«ããã±ãŒãžèªäœã¯å€éšäŸåãŒãã§ããã€ãã£ããšã³ãžã³ïŒSwitch ç§»æ€ïŒã«ããã®ãŸãŸæã¡èŸŒããŸãã
ð¯ Graph ãã¥ãŒ â äŸåé¢ä¿ã®å¯èŠåïŒãã¯ãŒã«ã«ã¯ãªãïŒ
ããã®å€æ°ã¯èª°ãæžã蟌ãããããã®ã¹ãã«ã¯èª°ãèŠããããããã®ã€ãã³ããåé€ãããšäœãå£ãããããã¯ã³ã¯ãªãã¯ã§è¡šç€ºãã Graph ãã¥ãŒãæèŒäºå®ãéžæããèŠçŽ ãã 3 段éå ãŸã§ã®åœ±é¿ç¯å²ãååŠæŒç®ã§ãªã¢ã«ã¿ã€ã å¯èŠåããŸãã
RPG ãã¯ãŒã«ã§ã¯ grep ãããããªãã£ãäŸåé¢ä¿ããæåãããã«ãã€ã³ã§èŠããèšèšã§ãã
ããŸäœãã§ããŠããŠãäœãã§ããŠããªãã
å®è£ æžã¿ïŒå éšã®ã¿ã»äœè éå ¬éïŒ

- ã€ãã³ãã³ãã³ã 21 çš® â
apps/editor/src/types/eventCommand.tsã«åå®çŸ©ãEventInterpreter.tsã§å®è¡ - Database ããã¯ãšã³ãïŒ
@kaedevn/entity-graphïŒâ ã¢ã¯ã¿ãŒã»ã¹ãã«ã»æµã»ã¢ã€ãã ã»å€æ°ã»ãããã€ãã³ããã¹ãŠåã Entity åã§ç®¡çã67 tests all-pass ã®å®å®å質 - éçè§£æïŒæªäœ¿çšå€æ°æ€åºããã©ã³ã¹ã·ãã¥ã¬ãŒã¿ïŒãã¡ãŒãžå ¬åŒããŒã¹ â ã¯ã³ã·ã§ããã»0 ãã¡ãŒãžæ€ç¥ïŒ
- RPG Studio ã¢ããªïŒ
apps/rpg-studioïŒâ Database / Map / Events / UI Layout / Graph / Analysis / Play Game ã® 7 ã¿ãæ§æã®è©Šäœ UIïŒ2026-04-21 ã«ãã©ãŠã¶åäœã確èªïŒ - ãµã³ãã«ããŒã¿ïŒã¢ã¯ã¿ãŒã»ã¹ãã«ã»æµã»ã¯ãšã¹ããã©ã°ã»ã€ãã³ãã®ãªãã¡ã¬ã³ã¹å®è£
- ããã«ã·ãã¥ã¬ãŒã¿ â æ±ºå®è«çãª
simulate()颿° - æ°žç¶åã¬ã€ã€ â ãã©ãŠã¶çš
LocalStorageAdapterãš CLI çšFileStorageAdapterãåäžStorageAdapterã€ã³ã¿ãŒãã§ãŒã¹ã§å®è£
æªå®è£ ïŒäœè ãè§Šããããã«ãªããŸã§ïŒ
- ããã«ãšãã£ã¿ â RPG Studio ã®ã·ãŒã ã¬ã¹çµ±å â 1 ã€ã®ãããžã§ã¯ãã§äž¡æ¹ã®ã²ãŒã ã¿ã€ããåãæ¿ã
- ããã«ç»é¢ã®æŒåº â ã¹ãã«ãšãã§ã¯ãã»ã«ã¡ã©ã¯ãŒã¯ã»ãã¡ãŒãžè¡šç€ºã¢ãã¡
- å ¬åŒ RPG ã¢ã»ãã â ãã£ã©ãããã»ã¿ã€ã«ã»ããã»æŠéãšãã§ã¯ãã»å¹æé³
- ã¢ãã€ã«æé©å â ã¿ããæäœãä»®æ³ã¹ãã£ãã¯
- ãã¬ã€ã€ãŒèŠç¹ã®å®æ â rpg-studio ã®ããŒã¿ãèªã¿èŸŒãã§å®éã«ãã¬ã€ããç»é¢ïŒçŸåšã¯ãµã³ãã«ããŒãã³ãŒãïŒ
- Switch ç§»æ€ã®æ€èšŒ â Core ã³ãã³ãã»ããã«åãŸãããã©ãŒãã³ã¹äºç®ã確èª
宿æã®äœè äœéš
以äžã® 3 ã€ã®ãã¿ãŒã³ã§ãRPG èŠçŽ ã䜿ã£ãäœåãäœããããã«ãªããŸãã
ãã¿ãŒã³ AïŒããã«æ¬ç·š à ãã RPG ãŸãŒã³
ãããã«ã·ãŒã³ã 䞻人å
¬ãçºã«å°ç
â
ãRPG ãŸãŒã³ã çºãæ©ãåã£ãŠ NPC ãšäŒè©±ããã³ãžã§ã³ãž
â
ãããã«ã ã³ãã³ãããã«
â
ãããã«ã·ãŒã³ã ããã«çµæã«å¿ãããšã³ãã£ã³ã°åå²
ãã¿ãŒã³ BïŒRPG æ¬ç·š à ããã«æŒåºã·ãŒã³
ãRPG ãã£ãŒã«ãã ãã³ãžã§ã³æ¢çŽ¢ã»ã¬ããªã³ã°
â
ããã¹æŠã ã³ãã³ãããã«
â
ãããã«æŒåºã åå©åŸã®ã€ãã³ãã VRM / Live2D ã§æŒåº
â
ãRPG ãã£ãŒã«ãã æ¬¡ã®ããããž
ãã¿ãŒã³ CïŒäž¡æ¹ã察çã«æ··ããäœå
ã©ã¡ãããšãã£ã¿å ã§èªç±ã«è¡ãæ¥å¯èœã倿°ã»ãã©ã°ã»ã¢ã»ããã¯ãã¹ãŠå ±éã® Entity ãšããŠç®¡çãããããããããã«åŽã§ç«ãŠããã©ã°ãããRPG åŽã®æ¡ä»¶åå²ãã«çŽæ¥äœ¿ããŸãã
äœè ã®äœæ¥ãããŒïŒæ³å®ïŒ
- DatabaseïŒã¢ã¯ã¿ãŒã»ã¹ãã«ã»æµã»ã¢ã€ãã ïŒãå®çŸ©
- ãããã«ã¿ã€ã«ãé 眮ããNPCã»ã¯ãŒãæã»å®ç®±ã€ãã³ãã眮ã
- ã€ãã³ãã«ã³ãã³ãïŒã»ãªãã»æ¡ä»¶åå²ã»æŠééå§ã»ããã転éïŒã䞊ã¹ã
- ããã«åŽããã¯
callãããã¯ã§ RPG ã·ãŒã³ãåŒã³åºããæ»ã£ãŠãã
èšèšææ³
ãRPG ãã¯ãŒã« MV/MZ ãšåçã®æ©èœãæäŸãã€ã€ãå éšèšèšã¯å¥ç©ã â ããã kaedevn ã® RPG ã®ç«ã¡äœçœ®ã§ããåããããªäœåäœéšãäœããããã«å€èŠã¯æãã€ã€ãä»¥äž 4 ã€ã®æ¬è³ªã§æ ¹æ¬çã«ç°ãªãã¢ãããŒããæ¡ã£ãŠããŸãã
1. ãã¹ãŠã Entityãåç §ã¯ãã¹ãŠ Relation ãšããŠæç€º
ãã¯ãŒã«ã§ã¯ Actor / Skill / Enemy / Item ãåºå®ã¹ããŒãã®ããŒãã«ã«å
¥ããçžäºåç
§ã¯æ°å€ IDã§è¡šçŸãããŸãïŒã倿° #42ããã¹ãã« #5ãçïŒã@kaedevn/entity-graph ã¯ãããã°ã©ãæ§é ã«çœ®ãæããŸããã
// packages/entity-graph/src/types/entity.ts
export interface Entity {
id: string;
type: string; // "actor" / "skill" / "map_event" / "variable" ...
properties: Record<string, unknown>;
}
export interface Relation {
sourceId: string;
targetId: string;
type: string; // "learns" / "writes" / "reads" / "unlocks" ...
}
ã¢ã¯ã¿ãŒãã¹ãã«ããããã€ãã³ãã倿°ãããã¹ãŠåã Entity åãäŸåé¢ä¿ã¯ Relation ãšããŠæç€ºçã«èšé²ãããŸãã
// apps/rpg-studio/src/sampleData.ts
createRelation(hero.id, slash.id, "learns"), // Hero ã Slash ãèŠãã
createRelation(oldMan.id, questFlag.id, "writes"), // è人ã€ãã³ãã questFlag ã«æžã蟌ã
createRelation(gateGuard.id, bossFlag.id, "reads"), // éçªã bossFlag ãèªã
â ããã®å€æ°ãã©ãããæžã蟌ãŸããã®ïŒãããã®ã¹ãã«ã誰ã䜿ããïŒãã store.getRelated(id, type, dir) ã§ã¯ãšãªã§ããããã¯ãŒã«ã§ã¯ grep ãããããªãã£ãäŸåé¢ä¿ã®å¯èŠåãããã«ãã€ã³ã§æç«ããŸãã
2. Schema é§å UIïŒãšãã£ã¿ãèªåçæãããïŒ
ãã¯ãŒã«ã§ã¯æ°ããããã£ïŒäŸïŒã¢ã¯ã¿ãŒã«ãè·æ¥ãã远å ïŒãå
¥ãããšãeditor.js / database.json / game.js ãå
šéšæžãæããå¿
èŠããããŸãã
kaedevn ã§ã¯ ã¹ããŒãå®çŸ©ã 1 ãæå€ããã ã ã§ãTableView / DetailView / PropertyEditor / CommandEditor ããã¹ãŠèªå察å¿ããŸãã
// packages/entity-graph/src/types/schema.ts
export interface EntitySchema {
type: string;
properties: PropertyDef[]; // UI ã¯ããããçãã
allowedRelations: RelationDef[]; // ãActor 㯠Skill ã« learns ãããç
}
3. åå®å šãªã€ãã³ã DSL
ãã¯ãŒã«ã®ã€ãã³ãã³ãã³ãã¯ããªããã£ã㪠value ãªããžã§ã¯ãã®é åã§ããã©ã¡ãŒã¿ã®åãã§ãã¯ã¯å®è¡æãŸã§ç¡ããkaedevn ã¯ããã TypeScript ã® discriminated union ã§æžãçŽããŸããã
// apps/editor/src/types/eventCommand.ts
export type EventCommand =
| ShowTextCommand
| ConditionalBranchCommand
| ControlVariablesCommand
// ... 21 çš®
;
export type ConditionalBranchCommand = {
type: 'conditional_branch';
condition: BranchCondition;
thenCommands: EventCommand[]; // ååž°åïŒãã¹ãç¡å¶é
elseCommands?: EventCommand[];
};
- åã³ãã³ããç¬ç«ããåïŒIDE è£å®ã»åæ€æ»ãå¹ãïŒ
- æ¡ä»¶åŒã union åïŒ
{ type: 'switch'; ... } | { type: 'variable'; ... } thenCommandsãååž°çãªEventCommand[]ãªã®ã§ããã¹ãã«å¶éãªã
4. éçè§£æã»ãã©ã³ã¹ã·ãã¥ã¬ãŒã¿ããã«ãã€ã³
ãã¯ãŒã«ã«ã¯ãæªäœ¿çšå€æ°ãæ€åºãããã¡ãŒãžèšç®åŒãäºåè©äŸ¡ããšãã£ãããŒã«ã¯åºæ¬ãããŸããããã©ã°ã€ã³ã§é 匵ãé åã§ããã
kaedevn ã® packages/entity-graph ã«ã¯ãããããã±ãŒãžæ©èœãšããŠå
èµãããŠããŸãïŒ
analysis/staticAnalyzer.tsâ æªäœ¿çšå€æ°ãæªæžã蟌ã¿å€æ°ã埪ç°åŒã³åºããæ€åºanalysis/balanceAnalyzer.tsâ ãã¡ãŒãžå ¬åŒãããŒã¹ããŠãã¯ã³ã·ã§ãããã«ãã0 ãã¡ãŒãžãã®ãã°ãæ€åºanalysis/impactGraph.tsâ éžãã ãšã³ãã£ãã£ãã BFS ã§ 3 段éã®åœ±é¿ç¯å²ãå¯èŠå
Graph ãã¥ãŒ ã¯ãã® impact graph ããªã¢ã«ã¿ã€ã ã§ååŠæŒç®ã°ã©ããšããŠè¡šç€ºããããã®ãã¥ãŒ â ãã¯ãŒã«ã«ã¯ååšããªãæŠå¿µã§ãã
æ¯èŒè¡šïŒãã£ããïŒ
| èŠ³ç¹ | RPG ãã¯ãŒã« MV/MZ | kaedevn |
|---|---|---|
| äœããã²ãŒã | RPG åç¬ïŒããã«ã¯å¥ããŒã«ïŒ | ããã« Ã RPG ã 1 ãããžã§ã¯ãã§ |
| ããŒã¿æ§é | åºå®ããŒãã« + æ°å€ ID åç § | Entity + RelationïŒä»»æã® typeïŒ |
| ãšãã£ã¿ UI | èšèªã§ããŒãã³ãŒã | Schema ããèªåçæ |
| ã€ãã³ãã³ãã³ã | ããªããã£ã㪠value é å | TypeScript discriminated union |
| æ¡ä»¶åŒ | æååïŒID ããŒã¹ | åä»ã unionïŒswitch / variable / item ...ïŒ |
| 倿°è¿œè·¡ | grep é Œã¿ | Relation ã¯ãšãªã§å³æ |
| ãã©ã³ã¹æ€èšŒ | ãã©ã°ã€ã³ä»»ã | ã³ã¢æ©èœïŒbalanceAnalyzerïŒ |
| äŸåå¯èŠå | ãªã | Graph ãã¥ãŒïŒimpact graphïŒ |
| ã¹ã¯ãªããæ¡åŒµ | Ruby / JavaScript ãèªç±ã«æžã | Kaede ScriptïŒKS / KSCïŒã® DSL çµç± |
èšèšã®ãã¬ãŒããªã
| åŸããã® | 倱ã£ããã® |
|---|---|
| â äŸåé¢ä¿ããã¹ãŠ explicit ã§è§£æå¯èœ | â ãã¯ãŒã«ãŠãŒã¶ãŒãæ £ãããæ°å€ IDãã®æè»œããæžã |
| â ã¹ããŒã倿Žã®åœ±é¿ç¯å²ãæå° | â ã¹ããŒãå®çŸ©ã®ã¡ã¿ããŒã¿ãå¢ããŠåŠç¿ã³ã¹ãããã |
| â åå®å šãªã€ãã³ã DSL | â TypeScript ã® union åã«æ £ããèŠã |
| â éçè§£æã§äºåã«ãã°æ€ç¥ | â ããŸãåããããŸã§ã®å®è£ éãå€ã |
ãªãå®æã«æéãããã£ãŠããã
äžèšã®èšèšã¯ãšãã£ã¿åŽ UIïŒrpg-studioïŒãšããã¯ãšã³ãïŒentity-graphïŒã®äž¡æ¹ãåæã«äœã蟌ãå¿ èŠããããæ¢åãã¯ãŒã«ã® fork ããåŽåã倧ãããªã£ãŠããŸããå ·äœçã«ã¯ïŒ
- ããã¯ãšã³ãïŒentity-graphïŒã¯ 67 tests all-pass ã®å質ã§å®å®
- ããã³ããšã³ãïŒrpg-studioïŒã®åæ©èœïŒDatabase / Map / Events / GraphïŒã¯åå¥ã«åãããããŠãŒã¶ãŒãäœã£ãã²ãŒã ããŒã¿ãèªã¿èŸŒãã§å®éã«ãã¬ã€ã§ããããŸã§ã®é ç·ïŒPhase 1-3ïŒãæªå®
â 2026-04-21 è§£æ¶æžã¿ïŒãã¬ã« export ããé€å€ãããã©ãŠã¶åŽã¯fileStorageAdapter.tsã Nodefsã䜿ã£ãŠãããããã©ãŠã¶ã§åããªãLocalStorageAdapterã®ã¿èªã¿èŸŒãæ§æã«ïŒ
äœè å ¬éãžã®æ¬¡ã®ããŒãã«ã¯ããšãã£ã¿ã§äœã£ãã²ãŒã ããŒã¿ãå®éã«ãã¬ã€ã§ããç»é¢ãã®å®æïŒPhase 1-3ïŒã§ãã
é¢é£è³æ
- ãšãã£ã¿å®å šã¬ã€ã â çŸåšå©çšã§ããããã«ãšãã£ã¿ã®æ©èœ
- ãããã¯åãªãã¡ã¬ã³ã¹ â æ¢åã®ãããã¯ãšãå°æ¥çã«ã€ãã³ãã³ãã³ããšçµ±åããããã®
- Kaede Script æŠèŠ â 2 èšæ³ïŒKS / KSCïŒã®äœ¿ãåã
- KSCïŒã³ãŒãèšæ³ïŒä»æ§æž â RPG ããžãã¯ã®äžéšã¯ãã§ã« KSC ã§èšè¿°å¯èœ
- ããã«ã·ã¹ãã ã¬ã€ã â å®è£ æžã¿ã®ããã«ããã±ãŒãž
- 3D ããã / ãªãŒãã³ã¯ãŒã«ã ããŒãããã â 3D ãã£ãŒã«ããšã®æ¥ç¶èšç»
- ããŒãããã 2026 â ãããžã§ã¯ãå šäœã®å¹Žéèšç»