UNPKG

hzengine-core

Version:

An Visual Novel Engine for Zepp OS

113 lines (112 loc) 5.48 kB
import { sayAction } from "./basic.js"; export function character_command(core) { // character command // Used to create a character, and save it to script field in archive storage, // so that it can be used when the archive is loaded next time the game starts // by loading the archive. // syntax: character <short_name> <display_name> // if the short name is conflict with an existing character, the script will throw an error core.script.use((ctx, next) => { if (ctx.rawtext.trim().split(" ")[0].toLowerCase() !== "character") return next(); if (ctx.slicedArgs.length > 3) throw `Character Command: incorrect amount of args`; if (ctx.slicedArgs.length === 1) throw `Character Command: incorrect amount of args`; if (ctx.slicedArgs.length === 2) throw `Character Command: display name not specified`; if (ctx.slicedArgs[1].isQuoted) throw `Character Command: short name should not be quoted`; // Check if the short name is conflict with an existing character let short_name = ctx.slicedArgs[1].str; let characterMap = getCharacterMap(); if (characterMap[short_name] != null) { if (characterMap[short_name].declare_info.path === ctx.currentPath && characterMap[short_name].declare_info.index === ctx.currentLineIndex) { } else throw `Character Command: short name [${short_name}] conflict, at file [${characterMap[short_name].declare_info.path}] line [${characterMap[short_name].declare_info.index + 1}] and `; } else { let display_name = ctx.slicedArgs[2].isQuoted ? core.script.parseString(ctx.slicedArgs[2].str) : ctx.slicedArgs[2].str; characterMap[short_name] = buildCharacterInfo(short_name, display_name); } function buildCharacterInfo(short_name, display_name) { return { short_name, display_name, declare_info: { path: ctx.currentPath, index: ctx.currentLineIndex, }, }; } }); function getCharacterMap() { // // Check core.storage.archiveData // if (typeof core.storage.archiveData == null) // throw `[HZEngine] ArchiveData is null`; // if (typeof core.storage.archiveData != "object") // throw `[HZEngine] ArchiveData is not a object(Record or Array)`; // if (Array.isArray(core.storage.archiveData)) // throw `[HZEngine] ArchiveData is an Array`; // // Check core.storage.archiveData.script // if (core.storage.archiveData.script == null) { // console.log(`[HZEngine] ArchiveData.script is null, create it`); // core.storage.archiveData.script = {}; // } // if (typeof core.storage.archiveData.script != "object") // throw `[HZEngine] ArchiveData.script is not a object(Record or Array)`; // if (Array.isArray(core.storage.archiveData.script)) // throw `[HZEngine] ArchiveData.script is an Array`; // // Check core.storage.archiveData.script.characterMap // if (core.storage.archiveData.script.characterMap == null) { // console.log( // `[HZEngine] ArchiveData.script.characterMap is null, create it` // ); // core.storage.archiveData.script.characterMap = {}; // } // if (typeof core.storage.archiveData.script.characterMap != "object") // throw `[HZEngine] ArchiveData.script.characterMap is not a object(Record or Array)`; // if (Array.isArray(core.storage.archiveData.script.characterMap)) // throw `[HZEngine] ArchiveData.script.characterMap is an Array`; // return core.storage.archiveData.script.characterMap as any; // TODO return core.storage.getSaveableData(core.storage.archiveData, true, "script", "characterMap"); } // Gramma: %short_name% "{message}" core.script.use((ctx, next) => { if (ctx.slicedArgs[0].isQuoted) return next(); let characterMap = getCharacterMap(); let short_name = ctx.slicedArgs[0].str; for (let key in characterMap) { // console.log(`Character Say Command: key=${key} sn=${short_name}`); function parseSayCommandArgs() { if (ctx.slicedArgs.length > 0 && ctx.slicedArgs[ctx.slicedArgs.length - 1].str === "nowait") { ctx.slicedArgs = ctx.slicedArgs.slice(0, ctx.slicedArgs.length - 1); return { wait: false, }; } else { return { wait: true, }; } } let parsed = parseSayCommandArgs(); if (key === short_name) { if (ctx.slicedArgs.length != 2) throw `Character Say Command: incorrect amount of args`; console.log("Character Say Command:", short_name, ctx.slicedArgs[1].str); sayAction(core, characterMap[key].display_name, ctx.slicedArgs[1].str, parsed.wait); // if(parsed.wait) core.system.pause(); return; } } return next(); }); }