hzengine-core
Version:
An Visual Novel Engine for Zepp OS
125 lines (124 loc) • 4.56 kB
JavaScript
export function basic_commands(core) {
// jump command
core.script.use((ctx, next) => {
let strArr = ctx.rawtext.trim().split(/ +/);
if (strArr.length === 0 || strArr[0].toLowerCase() !== "jump")
return next();
if (strArr.length !== 2)
throw "Jump Command: incorrect amount of args";
core.debug.log(`Jump Command: jump to label [${strArr[1]}]`);
core.script.jumpLabel(strArr[1]);
});
// call command
core.script.use((ctx, next) => {
let strArr = ctx.rawtext.trim().split(/ +/);
if (strArr.length === 0 || strArr[0].toLowerCase() !== "call")
return next();
if (strArr.length !== 2)
throw "Call Command: incorrect amount of args";
core.debug.log(`Call Command: call label [${strArr[1]}]`);
core.script.callLabel(strArr[1]);
});
// return command
core.script.use((ctx, next) => {
let strArr = ctx.rawtext.trim().split(/ +/);
if (strArr.length === 0 || strArr[0].toLowerCase() !== "return")
return next();
if (strArr.length !== 1)
throw "Return Command: this command can not have args";
core.debug.log(`Return Command: return`);
core.script.return();
});
// (debug) echo command
core.script.use((ctx, next) => {
let str = ctx.rawtext.trim();
if (!str.startsWith("echo"))
return next();
core.debug.log(`[ECHO] ${core.script.parseString(str.slice(4).trim())}`);
});
// say command
core.script.use((ctx, next) => {
if (!ctx.rawtext.trim().startsWith('"'))
return next();
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 (ctx.slicedArgs.length > 2 || ctx.slicedArgs.length < 1) {
throw `Say Command: incorrect amount of args`;
}
if (ctx.slicedArgs.length === 1) {
core.debug.log(`[SAY] ${ctx.slicedArgs[0].str}`);
sayAction(core, "", ctx.slicedArgs[0].str, parsed.wait);
}
else {
if (!ctx.slicedArgs[1].isQuoted)
throw `Say Command: second arg should be quoted`;
core.debug.log(`[SAY] ${ctx.slicedArgs[0].str}: ${ctx.slicedArgs[1].str}`);
sayAction(core, ctx.slicedArgs[0].str, ctx.slicedArgs[1].str, parsed.wait);
}
// if (parsed?.wait) core.system.pause();
});
// pause command
core.script.use((ctx, next) => {
if (ctx.rawtext.trim().split(" ")[0].toLowerCase() !== "pause")
return next();
if (ctx.slicedArgs.length > 2)
throw `Pause Command: incorrect amount of args`;
if (ctx.slicedArgs.length === 2) {
if (ctx.slicedArgs[1].isQuoted ||
!isFinite(Number(ctx.slicedArgs[1].str)))
throw `Pause Command: the second arg must be a number`;
core.system.pause(Number(ctx.slicedArgs[1].str) * 1000);
}
else
core.system.pause();
});
}
export function sayAction(core, who, what, wait) {
const say_view_tag = "hzengine.say";
const say_view_name = "say";
what = core.script.parseString(what);
let message = {
who,
what,
};
let router = core.ui.getRouter(say_view_tag);
if (!router) {
core.ui.addRouter(say_view_tag, "ct");
router = core.ui.getRouter(say_view_tag);
}
if (!router.length) {
// @ts-ignore
router.push(say_view_name, message);
}
else {
// @ts-ignore
router.update(message);
}
if (wait) {
if (core.config.getConfig("game.autoplay.enable")) {
let delay = core.config.getConfig("game.autoplay.extra_delay") +
core.config.getConfig("game.autoplay.ms_per_char") *
what.length;
if (isNaN(delay) || !isFinite(delay) || delay < 0) {
throw `Say Action: AutoPlay Delay Error: ${delay} ms`;
}
core.system.pause(delay);
}
else {
core.system.pause();
}
}
}