diff options
Diffstat (limited to 'src/client/scripts')
| -rw-r--r-- | src/client/scripts/aoiscript/evaluator.ts | 34 | ||||
| -rw-r--r-- | src/client/scripts/aoiscript/index.ts | 1 |
2 files changed, 34 insertions, 1 deletions
diff --git a/src/client/scripts/aoiscript/evaluator.ts b/src/client/scripts/aoiscript/evaluator.ts index cd488aeda4..e911be2caf 100644 --- a/src/client/scripts/aoiscript/evaluator.ts +++ b/src/client/scripts/aoiscript/evaluator.ts @@ -19,6 +19,7 @@ export class ASEvaluator { private envVars: Record<keyof typeof envVarsDef, any>; public aiscript?: AiScript; private pageVarUpdatedCallback; + private canvases: Record<string, HTMLCanvasElement> = {}; private opts: { randomSeed: string; visitor?: any; page?: any; url?: string; @@ -36,6 +37,28 @@ export class ASEvaluator { }), ...{ 'MkPages:updated': values.FN_NATIVE(([callback]) => { this.pageVarUpdatedCallback = callback; + }), + 'MkPages:get_canvas': values.FN_NATIVE(([id]) => { + utils.assertString(id); + const canvas = this.canvases[id.value]; + const ctx = canvas.getContext('2d'); + return values.OBJ(new Map([ + ['clear_rect', values.FN_NATIVE(([x, y, width, height]) => { ctx.clearRect(x.value, y.value, width.value, height.value) })], + ['fill_rect', values.FN_NATIVE(([x, y, width, height]) => { ctx.fillRect(x.value, y.value, width.value, height.value) })], + ['stroke_rect', values.FN_NATIVE(([x, y, width, height]) => { ctx.strokeRect(x.value, y.value, width.value, height.value) })], + ['fill_text', values.FN_NATIVE(([text, x, y, width]) => { ctx.fillText(text.value, x.value, y.value, width ? width.value : undefined) })], + ['stroke_text', values.FN_NATIVE(([text, x, y, width]) => { ctx.strokeText(text.value, x.value, y.value, width ? width.value : undefined) })], + ['set_line_width', values.FN_NATIVE(([width]) => { ctx.lineWidth = width.value })], + ['set_font', values.FN_NATIVE(([font]) => { ctx.font = font.value })], + ['set_fill_style', values.FN_NATIVE(([style]) => { ctx.fillStyle = style.value })], + ['set_stroke_style', values.FN_NATIVE(([style]) => { ctx.strokeStyle = style.value })], + ['begin_path', values.FN_NATIVE(() => { ctx.beginPath() })], + ['close_path', values.FN_NATIVE(() => { ctx.closePath() })], + ['move_to', values.FN_NATIVE(([x, y]) => { ctx.moveTo(x.value, y.value) })], + ['line_to', values.FN_NATIVE(([x, y]) => { ctx.lineTo(x.value, y.value) })], + ['fill', values.FN_NATIVE(() => { ctx.fill() })], + ['stroke', values.FN_NATIVE(() => { ctx.stroke() })], + ])); }) }}, { in: (q) => { @@ -73,10 +96,15 @@ export class ASEvaluator { IS_CAT: opts.visitor ? opts.visitor.isCat : false, SEED: opts.randomSeed ? opts.randomSeed : '', YMD: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`, + AISCRIPT_DISABLED: !this.opts.enableAiScript, NULL: null }; } + public registerCanvas(id: string, canvas: any) { + this.canvases[id] = canvas; + } + @autobind public updatePageVar(name: string, value: any) { const pageVar = this.pageVars.find(v => v.name === name); @@ -147,7 +175,11 @@ export class ASEvaluator { if (block.type === 'aiScriptVar') { if (this.aiscript) { - return utils.valToJs(this.aiscript.scope.get(block.value)); + try { + return utils.valToJs(this.aiscript.scope.get(block.value)); + } catch (e) { + return null; + } } else { return null; } diff --git a/src/client/scripts/aoiscript/index.ts b/src/client/scripts/aoiscript/index.ts index e6de5faaae..7f34964064 100644 --- a/src/client/scripts/aoiscript/index.ts +++ b/src/client/scripts/aoiscript/index.ts @@ -128,6 +128,7 @@ export const envVarsDef: Record<string, Type> = { IS_CAT: 'boolean', SEED: null, YMD: 'string', + AISCRIPT_DISABLED: 'boolean', NULL: null, }; |