Skip to content

Script manager for game hackmud, with minification, TypeScript support, and player script type definition generation.

License

Notifications You must be signed in to change notification settings

samualtnorman/hackmud-script-manager

Repository files navigation

Hackmud Script Manager

Command made for Hackmud Scripting Environment, which is a scripting environment for hackmud with minification, autocompletes / intellisense, and TypeScript support.

ko-fi

You can read about how HSM works in my blog post.

Install

  1. Install Node.js
  2. Run npm install -g hackmud-script-manager

Usage

  1. Run #dir in game, then cd to that folder
  2. Name your source script file to <name>.src.js
  3. Run hsm minify <name>.src.js and it will create a minified script file called <name>.js

NOTE: If you get an error message that looks like this:

[...]\AppData\Local\pnpm\hsm.ps1 cannot be loaded because running scripts is disabled on this system. [...]

You will need to run Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser in PowerShell as an administrator. For more information, see Microsoft's page about Execution Policies.

image image image

Features

  • Minification
    • This includes auto quine cheating.
      • Supported types are null, numbers, strings, and JSON compatible objects and arrays.
      • Non JSON compatible object keys are quine cheated.
      • Member expressions are converted to index notation so the index string can be quine cheated.
      • And template literals are converted to string concatenation so the strings can be quine cheated.
    • Global variable aliasing.
    • Convert function declarations to arrow function assigned to variable hoisted to the top of the block (function foo() { ... } -> let foo = () => ...).
    • Convert _START and _TIMEOUT to _ST and _TO.
    • Remove unused parameters from the main function expression.
  • Modern Javascript Syntax and Features
  • Future JavaScript Syntax and Features
  • TypeScript Support
    • This command/module does not do type checking, it simply removes type annotations so you'll need to rely on your IDE or run tsc seperatly with noEmit.
  • And “Cool” Unnecessary Features.
    • Variables declared outside the main function expression automatically become #G global variables.
    • Any code outside the function expression will only run once per top level script execution (#FMCL).
    • Basic seclevel verification.
      • Declaring // @seclevel HIGHSEC or any other seclevel before all of your code stops you from accidentally using #ls. or #ns..
    • Import node_modules modules into your script using import { foo } from "bar" syntax.
    • _SOURCE is replaced with a string of the source code of the script it's in.
    • _BUILD_DATE is replaced with a unix timestamp (Date.now()) of the build date of the script.
    • _SCRIPT_USER is replaced with a string of the user the script was pushed to.
      • This saves characters compared to context.this_script.split(".")[0].
    • _SCRIPT_SUBNAME is like _SCRIPT_USER but for the name of the script.
      • Saves characters compared to context.this_script.split(".")[1].
    • _FULL_SCRIPT_NAME is replaced with what would be in context.this_script.
    • Subscript and #db methods names are verified.
    • All references to preprocessor syntax functions not being called are turned into arrow function wrappers e.g. let debug = #D; -> let debug = v => #D(v);.
    • _SECLEVEL is replaced with a number (0 to 4) representing the seclevel of the script.
  • And Neat Weird Fixes
    • Like .__proto__ and .prototype being converted to ["__proto__"] and ["prototype"].
    • Illegal and unsafe strings.
      • Appearences of _SC and friends are either renamed or have an escape inserted so that script is legal.
      • Preprocessor syntax in strings are escaped so hackmud doesn't recognise them as preprocessor syntax.
      • And appearences of // in strings and regexes have a backslash inserted between to stop hackmud's overagressive comment remover from removing half the line of code.
    • Classes are actually usable now, this module replaces instances of this with a variable referencing what would be this.
    • Function.prototype can be referenced (but only the .prototype property, nothing else).
    • Object.getPrototypeOf and Object.setPrototypeOf are replaced with equivalent functions.