Skip to content

Instantly share code, notes, and snippets.

@hogart
Last active April 15, 2020 23:07

Revisions

  1. hogart revised this gist Apr 15, 2020. 1 changed file with 16 additions and 5 deletions.
    21 changes: 16 additions & 5 deletions dlg-macro.twee
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    Script [script]
    (function () {
    'use strict';
    /* globals version, Macro, Config, jQuery */
    /* globals version, Macro, jQuery */

    if (!version || !version.title || 'SugarCube' !== version.title || !version.major || version.major < 2) {
    throw new Error('<<dlg>> macro requires SugarCube 2.0 or greater, aborting load');
    @@ -16,6 +16,10 @@ Script [script]
    return element;
    }

    function isNumber(arg) {
    return typeof arg === 'number';
    }

    Macro.add('line', {
    tags: null,
    handler() {
    @@ -25,14 +29,21 @@ Script [script]
    level = parseInt(parentLevel.args[0], 10);
    }

    let targetLevel = level + 1;
    if (isNumber(this.args[1])) {
    targetLevel = parseInt(this.args[1], 10);
    } else if (isNumber(this.args[2])) {
    targetLevel = parseInt(this.args[2], 10);
    }

    let dlgId = 'dlg';
    const parentDlg = this.contextSelect((context) => context.name === 'dlg');
    if (parentDlg && parentDlg.args[0]) {
    dlgId = parentDlg.args[0];
    }

    let bullet = '';
    if (this.args.length === 2) {
    if (this.args.length === 2 && !isNumber(this.args[1])) {
    bullet = this.args[1];
    } else if (parentDlg && parentDlg.args.length === 3) {
    bullet = parentDlg.args[2];
    @@ -51,7 +62,7 @@ Script [script]

    const dlgStage = jQuery('#' + dlgId + '-stage');
    dlgStage.find('.dlg-level-' + level).attr('hidden', 'hidden');
    dlgStage.find('.dlg-level-' + (level + 1)).removeAttr('hidden');
    dlgStage.find('.dlg-level-' + targetLevel).removeAttr('hidden');
    });

    jQuery(this.output).append(link);
    @@ -63,7 +74,7 @@ Script [script]
    handler() {
    const level = parseInt(this.args[0], 10);
    if (isNaN(level)) {
    this.error('missing dlg level number');
    this.error('missing <<dlg>> <<level>> number');
    } else {
    const wrapper = jQuery(`<div class="dlg-level-${level}" hidden></div>`);
    for (const payload of this.payload) {
  2. hogart created this gist Nov 20, 2019.
    126 changes: 126 additions & 0 deletions dlg-macro.twee
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,126 @@
    Script [script]
    (function () {
    'use strict';
    /* globals version, Macro, Config, jQuery */

    if (!version || !version.title || 'SugarCube' !== version.title || !version.major || version.major < 2) {
    throw new Error('<<dlg>> macro requires SugarCube 2.0 or greater, aborting load');
    }

    function getOrCreate(id) {
    let element = jQuery('#' + id);
    if (element.length === 0) {
    element = jQuery(`<div id="${id}"></div>`);
    }

    return element;
    }

    Macro.add('line', {
    tags: null,
    handler() {
    let level = 0;
    const parentLevel = this.contextSelect((context) => context.name === 'level');
    if (parentLevel) {
    level = parseInt(parentLevel.args[0], 10);
    }

    let dlgId = 'dlg';
    const parentDlg = this.contextSelect((context) => context.name === 'dlg');
    if (parentDlg && parentDlg.args[0]) {
    dlgId = parentDlg.args[0];
    }

    let bullet = '';
    if (this.args.length === 2) {
    bullet = this.args[1];
    } else if (parentDlg && parentDlg.args.length === 3) {
    bullet = parentDlg.args[2];
    }

    let line;
    if (this.args.length === 0) {
    line = this.payload[0].content;
    } else {
    line = this.args[0];
    }

    const link = jQuery(`<a class="dlg-line">${bullet ? bullet + ' ' : ''}${line}</a>`);
    link.ariaClick(() => {
    jQuery('#' + dlgId).wiki(this.payload[0].contents);

    const dlgStage = jQuery('#' + dlgId + '-stage');
    dlgStage.find('.dlg-level-' + level).attr('hidden', 'hidden');
    dlgStage.find('.dlg-level-' + (level + 1)).removeAttr('hidden');
    });

    jQuery(this.output).append(link);
    },
    });

    Macro.add('level', {
    tags: [],
    handler() {
    const level = parseInt(this.args[0], 10);
    if (isNaN(level)) {
    this.error('missing dlg level number');
    } else {
    const wrapper = jQuery(`<div class="dlg-level-${level}" hidden></div>`);
    for (const payload of this.payload) {
    wrapper.wiki(payload.contents);
    }

    jQuery(this.output).append(wrapper);
    }
    },
    });

    Macro.add('dlg', {
    tags: [],
    handler() {
    const dlgId = this.args[0] || 'dlg';

    const currentLevel = this.args.length === 2 ? parseInt(this.args[1], 10) : 0;

    let dlgWrapper = getOrCreate(dlgId);
    let dlgStage = getOrCreate(dlgId + '-stage');

    for (const payload of this.payload) {
    dlgStage.wiki(payload.contents);
    }

    dlgStage.find('.dlg-level-' + currentLevel).removeAttr('hidden', 'hidden');

    jQuery(this.output)
    .append(dlgWrapper)
    .append(dlgStage);
    },
    });
    }());

    Start
    — Привет!

    <<dlg "dlg" 0 "➤">>\
    <<level 0>>\
    <<line "— Как дела?" "☺️">>
    — Привет, как дела?
    — Все пучком, а у тебя?
    <</line>>
    <<line "— Привет!" "👋">>
    — Привет!
    — Как поживаешь?
    <</line>>
    <</level>>\
    <<level 1>>\
    <<line "— Все плохо" "😢">>
    — Всё плохо, помер любимый хомяк!:(
    <</line>>
    <<line "— Дела идут..." "❤️">>
    — Дела идут, контора пишет, душа тоскует о душе;)
    <</line>>
    <<line "— Мне пора...">>
    — Сорян, играю в Death Stranding, некогда говорить!
    <</line>>
    <</level>>
    <</dlg>>