From 05812f57f0079a332d9503544321dd08fa4de939 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 27 Sep 2015 15:35:24 -0600 Subject: [PATCH] * Trailing LF handling is now 'trailingLF' option, with 'default', 'yes', 'no', etc. * Initial checking of WIP Mystery Skulls theme by Luciano Ayres of blocktronics * Fix random theme selection * WIP on theme customization apply: Needs to be much more flexible than current * MenuModule will use .next > .fallback > default fallback --- core/ansi_escape_parser.js | 28 ++++- core/art.js | 2 +- core/bbs.js | 16 +-- core/config_cache.js | 25 +++-- core/fse.js | 7 +- core/menu_module.js | 40 +++---- core/system_menu_method.js | 5 +- core/theme.js | 10 +- core/view_controller.js | 6 +- mods/art/MAINMENU.ANS | Bin 304 -> 0 bytes mods/art/MATRIX.ANS | Bin 0 -> 4821 bytes mods/art/MATRIX1.ANS | Bin 7087 -> 0 bytes mods/menu.hjson | 100 +++++++++--------- mods/prompt.hjson | 7 +- .../pause.ans => themes/NU-MAYA/PAUSE.ANS} | Bin .../NU-MAYA/{USRSTAT1.ANS => STATUS.ANS} | Bin .../NU-MAYA/{USRCRED1.ANS => USERLOG.ANS} | Bin mods/themes/luciano_blocktronics/LASTCALL.ANS | Bin 0 -> 1739 bytes mods/themes/luciano_blocktronics/MATRIX.ANS | Bin 0 -> 4821 bytes mods/themes/luciano_blocktronics/MMENU.ANS | Bin 0 -> 3316 bytes mods/themes/luciano_blocktronics/MNUPRMT.ANS | Bin 0 -> 204 bytes mods/themes/luciano_blocktronics/PAUSE.ANS | Bin 0 -> 221 bytes mods/themes/luciano_blocktronics/STATUS.ANS | Bin 0 -> 4104 bytes mods/themes/luciano_blocktronics/USERLOG.ANS | Bin 0 -> 3252 bytes mods/themes/luciano_blocktronics/theme.hjson | 46 ++++++++ 25 files changed, 187 insertions(+), 105 deletions(-) delete mode 100644 mods/art/MAINMENU.ANS create mode 100644 mods/art/MATRIX.ANS delete mode 100644 mods/art/MATRIX1.ANS rename mods/{art/pause.ans => themes/NU-MAYA/PAUSE.ANS} (100%) rename mods/themes/NU-MAYA/{USRSTAT1.ANS => STATUS.ANS} (100%) rename mods/themes/NU-MAYA/{USRCRED1.ANS => USERLOG.ANS} (100%) create mode 100644 mods/themes/luciano_blocktronics/LASTCALL.ANS create mode 100644 mods/themes/luciano_blocktronics/MATRIX.ANS create mode 100644 mods/themes/luciano_blocktronics/MMENU.ANS create mode 100644 mods/themes/luciano_blocktronics/MNUPRMT.ANS create mode 100644 mods/themes/luciano_blocktronics/PAUSE.ANS create mode 100644 mods/themes/luciano_blocktronics/STATUS.ANS create mode 100644 mods/themes/luciano_blocktronics/USERLOG.ANS create mode 100644 mods/themes/luciano_blocktronics/theme.hjson diff --git a/core/ansi_escape_parser.js b/core/ansi_escape_parser.js index 85684a35..ba08c290 100644 --- a/core/ansi_escape_parser.js +++ b/core/ansi_escape_parser.js @@ -36,15 +36,14 @@ function ANSIEscapeParser(options) { mciReplaceChar : '', termHeight : 25, termWidth : 80, - omitTrailingLF : false, + trailingLF : 'default', // default|omit|no|yes, ... }); this.mciReplaceChar = miscUtil.valueWithDefault(options.mciReplaceChar, ''); this.termHeight = miscUtil.valueWithDefault(options.termHeight, 25); this.termWidth = miscUtil.valueWithDefault(options.termWidth, 80); - this.omitTrailingLF = miscUtil.valueWithDefault(options.omitTrailingLF, false); + this.trailingLF = miscUtil.valueWithDefault(options.trailingLF, 'default'); - function getArgArray(array) { var i = array.length; while(i--) { @@ -246,9 +245,28 @@ function ANSIEscapeParser(options) { if(pos < buffer.length) { var lastBit = buffer.slice(pos); - if(self.omitTrailingLF && '\r\n' === lastBit.slice(-2).toString()) { - lastBit = lastBit.slice(pos, -2); // trim off last CRLF + + // :TODO: check for various ending LF's, not just DOS \r\n + if('\r\n' === lastBit.slice(-2).toString()) { + switch(self.trailingLF) { + case 'default' : + // + // Default is to *not* omit the trailing LF + // if we're going to end on termHeight + // + if(this.termHeight === self.row) { + lastBit = lastBit.slice(0, -2); + } + break; + + case 'omit' : + case 'no' : + case false : + lastBit = lastBit.slice(0, -2); + break; + } } + parseMCI(lastBit) } diff --git a/core/art.js b/core/art.js index b69f45c3..eb3067d6 100644 --- a/core/art.js +++ b/core/art.js @@ -417,7 +417,7 @@ function display(options, cb) { mciReplaceChar : mciReplaceChar, termHeight : options.client.term.termHeight, termWidth : options.client.term.termWidth, - omitTrailingLF : options.omitTrailingLF, + trailingLF : options.trailingLF, }); var mciMap = {}; diff --git a/core/bbs.js b/core/bbs.js index 0991d914..d668717b 100644 --- a/core/bbs.js +++ b/core/bbs.js @@ -238,18 +238,18 @@ function startListening() { } function prepareClient(client, cb) { + var theme = require('./theme.js'); + // :TODO: it feels like this should go somewhere else... and be a bit more elegant. + if('*' === conf.config.preLoginTheme) { - var theme = require('./theme.js'); - client.user.properties.theme_id = theme.getRandomTheme() || ''; - - theme.loadTheme(client.user.properties.theme_id, function themeLoaded(err, theme) { - client.currentTheme = theme; - cb(null); - }); } else { client.user.properties.theme_id = conf.config.preLoginTheme; - cb(null); } + + theme.loadTheme(client.user.properties.theme_id, function themeLoaded(err, theme) { + client.currentTheme = theme; + cb(null); + }); } \ No newline at end of file diff --git a/core/config_cache.js b/core/config_cache.js index 1c689f54..c8b1e00b 100644 --- a/core/config_cache.js +++ b/core/config_cache.js @@ -11,6 +11,7 @@ var events = require('events'); var util = require('util'); var assert = require('assert'); var hjson = require('hjson'); +var _ = require('lodash'); function ConfigCache() { events.EventEmitter.call(this); @@ -54,21 +55,29 @@ function ConfigCache() { util.inherits(ConfigCache, events.EventEmitter); -ConfigCache.prototype.getConfig = function(filePath, cb) { - var self = this; +ConfigCache.prototype.getConfigWithOptions = function(options, cb) { + assert(_.isString(options.filePath)); - if(filePath in this.cache) { - cb(null, this.cache[filePath], false); - } else { - this.reCacheConfigFromFile(filePath, function fileCached(err, config) { - if(!err) { - self.gaze.add(filePath); + var self = this; + var isCached = (options.filePath in this.cache); + + if(options.forceReCache || !isCached) { + this.reCacheConfigFromFile(options.filePath, function fileCached(err, config) { + if(!err && !isCached) { + self.gaze.add(options.filePath); } cb(err, config, true); }); + } else { + cb(null, this.cache[options.filePath], false); } }; + +ConfigCache.prototype.getConfig = function(filePath, cb) { + this.getConfigWithOptions( { filePath : filePath }, cb); +}; + ConfigCache.prototype.getModConfig = function(fileName, cb) { this.getConfig(paths.join(Config.paths.mods, fileName), cb); }; diff --git a/core/fse.js b/core/fse.js index 7ba5d5f8..bf775609 100644 --- a/core/fse.js +++ b/core/fse.js @@ -378,9 +378,10 @@ function FullScreenEditorModule(options) { self.client, { font : self.menuConfig.font }, function displayed(err, artData) { - mciData[n] = artData; - - self[n] = { height : artData.height }; + if(artData) { + mciData[n] = artData; + self[n] = { height : artData.height }; + } next(err); } diff --git a/core/menu_module.js b/core/menu_module.js index 70d3ab50..c135ed5a 100644 --- a/core/menu_module.js +++ b/core/menu_module.js @@ -48,10 +48,10 @@ function MenuModule(options) { theme.displayThemedAsset( self.menuConfig.art, self.client, - { font : self.menuConfig.font }, + self.menuConfig.options, // can include .font, .trailingLF, etc. function displayed(err, artData) { if(err) { - self.client.log.debug( { art : self.menuConfig.arg, err : err }, 'Could not display art'); + self.client.log.debug( { art : self.menuConfig.art, err : err }, 'Could not display art'); } else { mciData.menu = artData.mciMap; } @@ -83,7 +83,7 @@ function MenuModule(options) { theme.displayThemedAsset( promptConfig.art, self.client, - { font : self.menuConfig.font }, + self.menuConfig.options, // can include .font, .trailingLF, etc. function displayed(err, artData) { if(!err) { mciData.prompt = artData.mciMap; @@ -130,7 +130,6 @@ function MenuModule(options) { self.finishedLoading(); self.nextMenu(); - //self.nextAction(); } ); }; @@ -143,20 +142,22 @@ function MenuModule(options) { return _.isNumber(self.menuConfig.options.nextTimeout); }; - // :TODO: Convert this to process "next" instead of "action" - this.nextAction = function() { - if(!_.isObject(self.menuConfig.form) && !_.isString(self.menuConfig.prompt) && - _.isString(self.menuConfig.action)) - { - menuUtil.handleAction(self.client, null, self.menuConfig); - } - }; - this.nextMenu = function() { - if(!_.isObject(self.menuConfig.form) && !_.isString(self.menuConfig.prompt) && - !_.isUndefined(self.menuConfig.next)) - { + function goNext() { + if(_.isString(self.menuConfig.next)) { + menuUtil.handleNext(self.client, self.menuConfig.next); + } else { + self.client.fallbackMenuModule( { }, function fallback(err) { + // :TODO: this seems sloppy... look into further + }); + } + } + + if(!_.isObject(self.menuConfig.form) && !_.isString(self.menuConfig.prompt)) { /* + If 'next' is supplied, we'll use it. Otherwise, utlize fallback which + may be explicit (supplied) or non-explicit (previous menu) + 'next' may be a simple asset, or a object with next.asset and extrArgs @@ -168,14 +169,13 @@ function MenuModule(options) { asset: assetSpec extraArgs: ... } - */ + */ if(self.hasNextTimeout()) { setTimeout(function nextTimeout() { - menuUtil.handleNext(self.client, self.menuConfig.next); - + goNext(); }, this.menuConfig.options.nextTimeout); } else { - menuUtil.handleNext(self.client, self.menuConfig.next); + goNext(); } } }; diff --git a/core/system_menu_method.js b/core/system_menu_method.js index 9bbaf9e4..6bc3b5fa 100644 --- a/core/system_menu_method.js +++ b/core/system_menu_method.js @@ -22,7 +22,8 @@ function login(callingMenu, formData, extraArgs) { // :TODO: if username exists, record failed login attempt to properties // :TODO: check Config max failed logon attempts/etc. - client.gotoMenuModule( { name : callingMenu.menuConfig.fallback } ); + client.fallbackMenuModule(); + //client.gotoMenuModule( { name : callingMenu.menuConfig.fallback } ); } else { var now = new Date(); var user = callingMenu.client.user; @@ -47,7 +48,7 @@ function login(callingMenu, formData, extraArgs) { 'Already logged in' ); - // :TODO: display custom message if present + // :TODO: display custom message if present (Obv/2: TOONODE.ANS) client.term.write('\nA user by that name is already logged in.\n'); diff --git a/core/theme.js b/core/theme.js index 0f4427b1..8cde3fa0 100644 --- a/core/theme.js +++ b/core/theme.js @@ -79,7 +79,7 @@ function loadTheme(themeID, cb) { var path = paths.join(Config.paths.themes, themeID, 'theme.hjson'); - configCache.getConfig(path, function loaded(err, theme) { + configCache.getConfigWithOptions( { filePath : path, forceReCache : true }, function loaded(err, theme) { if(err) { cb(err); } else { @@ -195,12 +195,13 @@ function displayThemeArt(options, cb) { if(err) { cb(err); } else { + // :TODO: just use simple merge of options -> displayOptions var dispOptions = { art : artInfo.data, sauce : artInfo.sauce, client : options.client, font : options.font, - omitTrailingLF : options.omitTrailingLF, + trailingLF : options.trailingLF, }; art.display(dispOptions, function displayed(err, mciMap, extraInfo) { @@ -250,7 +251,7 @@ function displayThemedPause(options, cb) { displayThemedAsset( promptConfig.art, options.client, - { font : promptConfig.font, omitTrailingLF : true }, + promptConfig.options, function displayed(err, artData) { artInfo = artData; callback(err); @@ -323,11 +324,12 @@ function displayThemedAsset(assetSpec, client, options, cb) { return; } + // :TODO: just use simple merge of options -> displayOptions var dispOpts = { name : artAsset.asset, client : client, font : options.font, - omitTrailingLF : options.omitTrailingLF, + trailingLF : options.trailingLF, }; switch(artAsset.type) { diff --git a/core/view_controller.js b/core/view_controller.js index 6acd42c5..4fb6b851 100644 --- a/core/view_controller.js +++ b/core/view_controller.js @@ -571,15 +571,15 @@ ViewController.prototype.loadFromMenuConfig = function(options, cb) { }); }, function applyThemeCustomization(callback) { - if(_.isObject(formConfig)) { + //if(_.isObject(formConfig)) { menuUtil.applyThemeCustomization({ name : self.client.currentMenuModule.menuName, type : 'menus', client : self.client, - configMci : formConfig.mci, + configMci : formConfig ? formConfig.mci : {}, formId : formIdKey, }); - } + //} callback(null); }, diff --git a/mods/art/MAINMENU.ANS b/mods/art/MAINMENU.ANS deleted file mode 100644 index c26cd179a6e076f97c4019c12d9c8a5a978d9090..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmb1+Hn27^ur@Z&<>f+$($U7oxe7qi07M#E19|Qct}c)QYBJ9C$xqKuOXKBI04c}~ zMUxFJPAyXK%uCCMDF{YW5L{VYlA4R6#0O1@PhxS2f^%X{PHIsxFPBuXW2m#Mfq??` lfRTZrse!q%!FmP;21dpJ23{Zy1j3$9z6xRPju0N41ONaEIRO9w diff --git a/mods/art/MATRIX.ANS b/mods/art/MATRIX.ANS new file mode 100644 index 0000000000000000000000000000000000000000..3a196643ca3e68b409e8d3126ce71fabd893dd2a GIT binary patch literal 4821 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 diff --git a/mods/menu.hjson b/mods/menu.hjson index be583e36..ce01b920 100644 --- a/mods/menu.hjson +++ b/mods/menu.hjson @@ -61,6 +61,9 @@ matrix: { art: matrix + options: { + + } form: { 0: { // :TODO: Make form "0" the default if missing (e.g. optional)... not sure how with current structure though VM: { @@ -69,7 +72,7 @@ submit: true focus: true // :TODO: need a good way to localize these ... Standard Orig->Lookup seems good. - items: [ "Login", "Apply", "Log Off" ] + items: [ "login", "apply", "log off" ] } } @@ -111,45 +114,45 @@ } ]*/ }, - "login2" : { - "art" : "USRCRED", - "fallback" : "matrix", + + login2: { + art: USERLOG next: messageArea //"next" : "fullLoginSequenceLoginArt", - "form" : { - "0" : { - "mci" : { - "ET1" : { - "width" : 20, - "maxLength" : "@config:users.usernameMax", - "argName" : "username", - "focus" : true - }, - "ET2" : { - "width" : 20, - "password" : true, - "maxLength" : "@config:users.passwordMax", - "argName" : "password", - "submit" : true + form: { + 0: { + mci: { + ET1: { + maxLength: @config:users.usernameMax + argName: username + focus: true } - }, - "submit" : { - "*" : [ + ET2: { + password: true + maxLength: @config:users.passwordMax + argName: password + submit: true + } + } + + submit: { + *: [ { - "value" : { "password" : null }, - "action" : "@systemMethod:login" + value: { password: null } + action: @systemMethod:login } ] - }, - "actionKeys" : [ + } + actionKeys: [ { - "keys" : [ "escape" ], - "action" : "@menu:matrix" + keys: [ "escape" ] + action: @menu:matrix } ] } } - }, + } + "logoff" : { "art" : "LOGOFF", "next" : "@systemMethod:logoff", @@ -390,7 +393,7 @@ "next" : "fullLoginSequenceUserStats" }, "fullLoginSequenceUserStats" : { - "art" : "USRSTAT", + art: STATUS "options" : { "pause" : true }, "next" : "mainMenu" }, @@ -404,17 +407,20 @@ "options" : { "pause" : true } //"action" : "@menu:lastCallers" }, - "mainMenu" : { - "art" : "MMENU1", - "desc" : "Main Menu", - "prompt" : "menuCommand", + mainMenu: { + art: MMENU + /*options: { + trailingLF: yes + }*/ + desc: Main Menu + prompt: menuCommand "submit" : [ { "value" : { "command" : "G" }, "action" : "@menu:logoff" }, { - "value" : { "command" : "D" }, + "value" : { "command" : "O" }, "action" : "@menu:doorPimpWars" }, /* @@ -441,20 +447,16 @@ } ] }, - "mainMenuLastCallers" : { - "module" : "last_callers", - "art" : "LASTCALL", - "options" : { "pause" : true }, - "config" : { - "dateTimeFormat" : "ddd MMM Do h:mm a" - }, - "next" : "mainMenu" - }, - "mainMenuUserStats" : { - "art" : "USRSTAT", - "options" : { "pause" : true }, - "next" : "mainMenu" - }, + mainMenuLastCallers: { + module: last_callers + art: LASTCALL + options: { pause: true } + } + mainMenuUserStats: { + art: STATUS + options: { pause: true } + next: mainMenu + } /////////////////////////////////////////////////////////////////////// // Message Area Related /////////////////////////////////////////////////////////////////////// diff --git a/mods/prompt.hjson b/mods/prompt.hjson index 77cdc3af..9661e8cd 100644 --- a/mods/prompt.hjson +++ b/mods/prompt.hjson @@ -59,11 +59,14 @@ /////////////////////////////////////////////////////////////////////// // Standard / Required /////////////////////////////////////////////////////////////////////// - "pause" : { + pause: { // // Any menu 'pause' will use this prompt // - "art" : "pause" + art: pause + options: { + trailingLF: no + } /* "mci" : { // :TODO: Need special pause for a key MCI diff --git a/mods/art/pause.ans b/mods/themes/NU-MAYA/PAUSE.ANS similarity index 100% rename from mods/art/pause.ans rename to mods/themes/NU-MAYA/PAUSE.ANS diff --git a/mods/themes/NU-MAYA/USRSTAT1.ANS b/mods/themes/NU-MAYA/STATUS.ANS similarity index 100% rename from mods/themes/NU-MAYA/USRSTAT1.ANS rename to mods/themes/NU-MAYA/STATUS.ANS diff --git a/mods/themes/NU-MAYA/USRCRED1.ANS b/mods/themes/NU-MAYA/USERLOG.ANS similarity index 100% rename from mods/themes/NU-MAYA/USRCRED1.ANS rename to mods/themes/NU-MAYA/USERLOG.ANS diff --git a/mods/themes/luciano_blocktronics/LASTCALL.ANS b/mods/themes/luciano_blocktronics/LASTCALL.ANS new file mode 100644 index 0000000000000000000000000000000000000000..a12267deabe18d401b699a483b0ec2b261ff9659 GIT binary patch literal 1739 zcmb_dv2N5r5WO@Mky25C8#napwQrZ`s>6y9=#U~V(71{aQ6goz0;K#_l;816`zMI^ zW_E2~loA)0*`1j;Z{CcZYA~B-)0s_cLLBEO#T2WdX?hs*Ev!UOUGrD})`(m8a+JV$ zb~=vL;Jbbt)wJh*g)*%Te`{cFS{HWP{Z-v>ce{(Pd-0h77b7IVgla%m0cbq{ki`(X zS~t0J8B)Q$4-dBo!E*>}TBMcZNbTBr+mLtxc4IE_W0nri-}cuR(n=B&-GaQSj+Zc zTYX3z1YZiQqK*z&$_tvi9zW+j$@BWthcET_k6S%WzyAP7 C$xj>r literal 0 HcmV?d00001 diff --git a/mods/themes/luciano_blocktronics/MATRIX.ANS b/mods/themes/luciano_blocktronics/MATRIX.ANS new file mode 100644 index 0000000000000000000000000000000000000000..3a196643ca3e68b409e8d3126ce71fabd893dd2a GIT binary patch literal 4821 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 Or<1Qjn7bo{2PXlT+9Cb` literal 0 HcmV?d00001 diff --git a/mods/themes/luciano_blocktronics/PAUSE.ANS b/mods/themes/luciano_blocktronics/PAUSE.ANS new file mode 100644 index 0000000000000000000000000000000000000000..53bae43257f4ad4bd92542190856779293f8c86a GIT binary patch literal 221 zcmb1+Hn29dHZia^Hp{h>jy5(2lV-UJ#nM0-pkQudafX6)v|(-~R3N{!2+Yrh@>465 z@)L_vKuUn(Km%-mq*<;FFPBuXW2m#Mfq??`fRTZrsez@Dc?<&s10!Pq10#?I0%1=l NUxhGtM+gs20syK`D4GBO literal 0 HcmV?d00001 diff --git a/mods/themes/luciano_blocktronics/STATUS.ANS b/mods/themes/luciano_blocktronics/STATUS.ANS new file mode 100644 index 0000000000000000000000000000000000000000..fd945a26cf0699dfd09789e9f659f5522b4c00d9 GIT binary patch literal 4104 zcmb_fyKdY@6qQ>6f{Qdk)UZ(BOnA&FyX={O6&B)>yJSF zr8^FF(F*=E(n+@pk-#NLU{(il(ve0qG)4*}2~<*V5-aq@Gz4L624|-66TjP+&+n7= z`=8beWHt4gs&EIUPBn@P7CfM85=pg9B4|)`(6#s?Bad{%tv=?5K{8+QLLOj-4N4>P zB4W>8yx1ewy98WZf4jMdmGEILhA0-S+k{OANx@o+tQ_UzWH<+)7jSVyJu(v2fPVPn z^{a{)l+5Ge`sw98fHA;XjVhp8039k$K$hmS#Z?bfoEz0SV3(ql-OqA+Dh{E?d9)V+ zN84plz|ui)|6~ni;XB-%zx8*a$Y$?3VogmZrDr0~X@>h@JDeNJGB*ZX0!P6$3 z#%e+#LK~Jw_@Pu@*gythL)T`>Fsew0wlWAIo^~P^0i=);N~sSDx(UN%I4pw>hzks; z8^jcv34w+wT9z0V&U`ty-91n>|znUoK0$4{qXAL zo3{rn(5XzVxa*9cb|EnNC2M(lyjNm`x1=9-3gvJ|3}r4Hj`7Hex_hY)GHwet?o$XT zRO7hlV>E2042w9T*VT}{25JZHiaEcemQIKr7#_iLSyAwa$V!3CgKew3RDkpWTAYj- zkEG?D%Sv3faRP^FXzYZCf;glc1y^cGq<(NU;bY>OsY4Wdz0F3@nf8 z7YXXNOZ!_eHj$=2-C_aoqzT($aqdAnL43J;3m}eV5;Ytn_Cc^V00xDqQ)uN7kUa*V zEtxNOD(7PEVmT~EN9XsC22+DTs6zAAkaQ+V4UfgZFmuZ(MRG*&##C9gbFoxu3jmr; z>xH;*rR|A;vS}HxD)Q?DU36J4BwDIV%(HqdRiPwJBJswoam)=Jku)fZJJ3?1a+C*I zA7XGU@q<~G1ktDQcHlAf1s9;eUDuXCgKx4V`$QiB6MuTXAw+P7nQZDi5-*uc~VN4+Tfav(qnreR6&E qP1|DXr}}m6>au;*ZU1?Aa`NE8&nKUs==a%oU;ohj{`868%JqK-iiIoy literal 0 HcmV?d00001 diff --git a/mods/themes/luciano_blocktronics/USERLOG.ANS b/mods/themes/luciano_blocktronics/USERLOG.ANS new file mode 100644 index 0000000000000000000000000000000000000000..6522f67959ba14a3c335af623704953b9874cc41 GIT binary patch literal 3252 zcmb`JyN=yt6on@(f{F&^G;Y%S+-G#E!HS|tkVKjgic=s8geXkOOVNb9j!pb3d~5B! zZ4XSz8I3RhW$(4tzWm-?+smQ7?Av~G-EF(gb-(M!adSO(T<*H@t1mX!?QJ(sP1Eq7 zx273AGB(pxOQzVxkd|^8d1UO=O)R#ZL-&^~PvbD*Xm3Z`%Ylbs7#KPCx*ghH*R!X2 z!3LKmpfzdg)QxzUG|F}`+6-plve$kMT(CG|dklMWdg>=`F=c1x3uEEJ9){op>IM&G z$0o}(fIT7W6Mtc+Z^Ayd%Dh<}$^%r`hLK$_bx;Y3@aDU83f-kyfX6Ao%WDw|kLgpy zVwv=c7p^-w@th=(k&+}|q#H0MLgWZF#xXc{BSVCLMBWvW0>aJ}|0lr&?O+Rq^u=x4 z2i;O3k|=WtEQ>oloA(q1Jp+@enJ}&~vl8`qc2J8oWQS>p;3=KWCw->uPRBi&XjFt6 zDNIa@Bd+O&_v;eW=|>tuC zi`e6X{FP5TY@N&UZj+2h(Bbbzxrf(93&J`BbbO`YEp;DxNjBOUR77}Ce3uO=mdje& zOBp~|saXRSt$9&g&8Qq8e=VN%bUw~-KYa>LHYZdD161)MI2t;uH>nS(;CR37girY- z_uG9@5MVnySz8Ga*7St9#Z+rT{LCWOyM$PMvVZ`Nu|!-!!33xlJJCN_O(r-iHrN`|ayzeaRmDyl1qRQW1# zJWGaUi?TW8i{^7AW=P1|U8_f;3-#3w8Bq#g$0?xF6&xjQ4*1R8Gkd${guldk$_AT) zQ5*;Ot>sw9rF%1vkrB+zV+o-2P|(EJJlrmoF(#3_*9Hw=1Z>wc3pEol_qkcKf@fVh z6jOnCnI}})@tY^I*x3TCuoeD9av@UdBc+~FDWx_h(IUrB-7mlY_G|xh5dQNK(J6lN z`fo2q%MIHHyn>a)SRXns81Uo;v7+7zaR$2beNHf)n2&ugI%h~{t%9|_TeL%U?C5#; zkLJaPH~Nb86#4WhDb*>cpA}e4C_qK>Wz$J>1U2m9ZTPyhe` literal 0 HcmV?d00001 diff --git a/mods/themes/luciano_blocktronics/theme.hjson b/mods/themes/luciano_blocktronics/theme.hjson new file mode 100644 index 00000000..0d3dcd81 --- /dev/null +++ b/mods/themes/luciano_blocktronics/theme.hjson @@ -0,0 +1,46 @@ +{ + info: { + name: Mystery Skull + author: Luciano Ayres + group: blocktronics + } + + customization: { + + defaults: { + general: { + passwordChar: * + } + + dateTimeFormat: { + short: MMM Do h:mm a + } + } + + menus: { + matrix: { + VM1: { + focusTextStyle: first lower + } + } + + login2: { + ET1: { width: 14 } + ET2: { width: 14 } + } + + mainMenuUserStats: { + UN1: { width: 17 } + UR2: { width: 17 } + LO3: { width: 17 } + UF4: { width: 17 } + UG5: { width: 17 } + UT6: { width: 17 } + UC7: { width: 17 } + } + + mainMenuLastCallers: { + } + } + } +} \ No newline at end of file