Feature Reference

Every menu control and settings toggle in Banshee's manual, sorted, with the code behind it — the 13 Session Saver controls and the 92 settings-menu functions.

This page catalogs the two menu sections of BansheeFunctions.txt[13] The Main Menu (the homepage Session Saver control panel) and [92] The Main Functions (everything in the in-game Settings menu, across the Render, Localhost, Sessions, and Statistics tabs). Each entry is paired with its implementing code. For the chat-command equivalents of many of these toggles, see the Command Reference.

The homepage's left/right panels are a thin UI over one idea: each button calls a small handler that sends a comma-delimited text message to the Session Saver over the authenticated User WebSocket. The handlers live in client.html; the receiving switch lives in zombsSessions.js (documented on the Session Saver control panel). Every control reads its parameters from the panel's input fields by class name:

client.html — representative panel handlers
const enableAutoBreakIn = () => {
    user.sendMessage(`eabi,  ;${document.getElementsByClassName("sessionsid")[0].value},  ;${document.getElementsByClassName("sessionsessionname")[0].value},  ;${document.getElementsByClassName("sessionname")[0].value},  ;${document.getElementsByClassName("sessionpsk")[0].value}`);
    sendSession();
}
const enableAutoRefiller   = () => user.sendMessage(`esrf,  ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enableAutoReconnect  = () => user.sendMessage(`earc,  ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enableAutoFarm       = () => user.sendMessage(`eafr,  ;${document.getElementsByClassName("sessionsid")[0].value}`);
const enablePartyRefiller  = () => user.sendMessage(`eafp,  ;${document.getElementsByClassName("prfsid")[0].value}`);
const addPartyRefillerKey  = () => {
    user.sendMessage(`addafpsk,  ;${document.getElementsByClassName("prfpsk")[0].value},  ;${document.getElementsByClassName("prfsid")[0].value}`);
    changeServer();
}

The Session-creation and password/server controls go through dedicated User methods rather than raw messages — these wrap the same sendMessage but exist as named methods because they're called from several places (the big homepage Play button reuses createSession, for instance):

client.html — User methods backing the menu
createSession(sessionname, name, sid, psk) {
    this.sendMessage(`createsession,  ;${sessionname},  ;${name},  ;${sid},  ;${psk}`);
}
closeSession(id)        { this.sendMessage("closesession,  ;" + id); }
changePassword(password) { this.sendMessage(`changehasaccess,  ;${password}`); }
reconnect(closed) {                       // used by "Change Server"
    if (!closed) this.reconnecting = true;
    this.disconnect();
    this.ws = new User().ws;
    this.ws.onopen = this.onOpen.bind(this);
    this.ws.onmessage = this.onMessage.bind(this);
    this.ws.onclose = this.onClose.bind(this);
}
ControlPanelHandler → wire messageHow it works
Auto Break InLefteabi / dabiServer re-requests a full server every 15s until it gets in; carries session name, player name, server id, PSK
Auto RefillerLeftesrf / dsrfRefills the server with one Session at a time when it isn't full (≤9 Sessions)
Auto ReconnectingLeftearc / darcRe-queues closed Sessions to reconnect every 5s (see the reconnect queue)
Auto FarmLefteafr / dafrNew Sessions farm a tree/stone — purely to dodge AFK-kick checks
Party Refiller KeyLeftaddafpsk / removeafpskRegisters/removes a 20-char PSK into server.keys for the party refiller to use
Party RefillerLefteafp / dafpSessions auto-rejoin the configured party when it unfills — protects bases from raiders
Close SessionLeftclosesessionuser.closeSession(id) — closes the picked Session
Change PasswordLeftchangehasaccessRotates the Session Saver's salt (stored in localStorage.salt)
Reset PasswordLeftchangehasaccessSets the password back to the script's defaultPassword
Send SessionLeftcreatesessionuser.createSession(...) — spawns a new headless Bot with the panel's fields
Change Session NameRightchangesessionnameRenames a Session by id
Change Session IDRightchangesessionidReorders Sessions by changing the second (display) id
Change ServerRight(local) reconnect()Repoints the User socket at a different Session Saver URL (yours = Localhost, or someone else's)

[92] The Main Functions — the Settings menu

The in-game Settings menu is generated from a single declarative tabs array in createScriptMenu(). Each tab holds sections, each section holds items, and the renderer turns every item into a button whose data-* attributes encode how it behaves. This one data structure is why the menu, the toggle system, and the Session relay all stay in sync — they're all reading the same schema. The three relevant button types:

script.js — createScriptMenu: how each item becomes a button
${(section.items || []).map(([key, label, onCommand, offCommand]) => tab.session
    ? `<a class="btn hud-session-toggle" data-session-script="${key}" data-session-on="${onCommand}" data-session-off="${offCommand}">${label}</a>`
    : `<a class="btn hud-script-toggle" data-script="${key}">${label}</a>`).join("")}
${(section.actions || []).map(([label, command]) =>
    `<a class="btn hud-session-action" data-session-command="${command}">${label}</a>`).join("")}
  • Localhost toggle (hud-script-toggle, data-script="key") — flips this.scripts[key] locally. This is the toggle system that drives your player and Sockets.
  • Session toggle (hud-session-toggle, data-session-on/off) — sends the same e…/d… relay codes documented in the Command Reference, so a menu button and a chat command are literally interchangeable.
  • Session action (hud-session-action, data-session-command) — sends a bare fire-once verb (lock, wlock1, ping…).

Render tab — Entity, Grids, Textures

The Render tab is special: instead of this.scripts flags, it proxies the game's own built-in "FPS / walkthrough" debug buttons. getRenderActions() declares each toggle as a descriptor that knows how to find the matching native button by its text, and the states are persisted to localStorage so your render preferences survive a reload (the manual: "This category saves your toggles upon exiting the game."):

script.js — getRenderActions: the Render-tab descriptors
getRenderActions() {
    return [
        { id: "tower-entity",     label: "Disable Tower Entity",          section: "Entity",   includes: ["Tower Entity"], excludes: ["Sprite"] },
        { id: "projectile-entity",label: "Disable Projectile Entity",     section: "Entity",   includes: ["Projectile Entity"] },
        { id: "zombie-sprite",    label: "Disable Zombie Sprite Entity",  section: "Entity",   includes: ["Zombie Sprite Entity"] },
        { id: "zombie-entity",    label: "Disable Zombie Entity",         section: "Entity",   includes: ["Zombie Entity"], excludes: ["Sprite"] },
        { id: "rendering",        label: "Stop Rendering",                section: "Entity",   includes: ["Rendering"] },
        { id: "grid-200",         label: "Show 200x200 Grid",             section: "Grids",    includes: ["200x200 Grid"] },
        { id: "ground",           label: "Hide Ground",                   section: "Grids",    includes: ["Ground"] },
        { id: "grid-7",           label: "Show 7x7 Grid",                 section: "Grids",    includes: ["7x7 Grid"] },
        { id: "stash-placement",  label: "Show Stash Placement",          section: "Grids",    includes: ["Stash Placement"] },
        { id: "stash-range",      label: "Show Stash Range",              section: "Grids",    includes: ["Stash Range"] },
        { id: "spawn-circle",     label: "Show Spawn Circle",             section: "Grids",    includes: ["Spawn Circle"] },
        { id: "blocked-areas",    label: "Show Blocked Areas",            section: "Grids",    includes: ["Blocked Areas"] },
        { id: "t6-textures",      label: "Use Blue T6 Textures",          section: "Textures", includes: ["T6 Textures"] },
        { id: "default-zombies",  label: "Use Default Zombies",           section: "Textures", includes: ["Zombies"] }
    ];
}

When you click a Render button, handleRenderAction either calls a registered window.zombsRenderActions API (Banshee's custom render hooks) or falls back to clicking the native game button it located by text, then saves the resulting state:

script.js — handleRenderAction & persistence
handleRenderAction(button) {
    const actionId = button.dataset.renderAction;
    const api = window.zombsRenderActions && window.zombsRenderActions[actionId];
    if (api && api.toggle) {
        api.toggle();
        this.saveRenderActionState(actionId);    // → localStorage.zombsRenderStates
        this.syncRenderButtons();
        return;
    }
    const source = this.findFpsRenderButton(actionId);   // locate native button by includes/excludes text
    if (!source) return;
    source.click();
    this.saveRenderActionState(actionId);
    this.syncRenderButtons();
}

findFpsRenderButton is the clever part: it scans the game's #hud-menu-FPS .hud-FPS-restart-walkthrough buttons and matches the one whose text contains every includes term and none of the excludes terms — which is how "Tower Entity" and "Zombie Entity" avoid matching the "…Sprite Entity" buttons.

ToggleSectionHow it works (per manual)
Tower / Projectile / Zombie Sprite / Zombie EntityEntityToggle rendering of that entity class (buildings except stash / projectiles / zombie textures / zombies as a whole)
RenderingEntityStarts/stops the engine itself — "You won't disconnect when it's disabled"
200x200 GridGridsTower-grouping grid for checking ranges; used for low-tier ENVs and Score Bases
GroundGridsShows/hides the four-biome ground (and base borders/ranges)
7x7 GridGridsWhere harvesters can be placed — can't place near enemy bases; used for Pressure-Bug raiding
Stash PlacementGrids53-tile minimum square between two gold stashes (on by default)
Stash RangeGrids18-tile build radius around the stash (on by default)
Spawn CircleGridsZombie-spawn ring (18·√2 tiles); also toggles tower/heal range indicators (on by default)
Blocked AreasGridsZombie-pathing block zones, offset one 48px grid to the bottom-right
Purple/Blue T6 TexturesTexturesSwitch Tier-6 between Amethyst and Diamond skins
Default/Themed ZombiesTexturesSwitch zombies between default and biome-themed textures

Localhost tab — your player & Sockets

Every Localhost item is a plain this.scripts[key] flag (with mutual-exclusion enforced for the wall/harvester families). The full schema, straight from createScriptMenu:

script.js — the Localhost tab schema
{ title: "Defense",   items: [["autoheal","Auto Heal"],["autobow","Auto Bow"],["autospear","Auto Spear"],["autoshield","Auto Shield"],["autoaim","Auto Aim"],["autotimeout","Auto Timeout"]] },
{ title: "Pets",      items: [["autopetpotion","Buy Pet Potion"],["autopetheal","Pet Heal"],["autorevivepets","Revive Pet"],["autoevolvepets","Evolve Pet"]] },
{ title: "Base",      items: [["autobuild","Auto Build"],["autoupgrade","Auto Upgrade"],["upgradeall","Upgrade All"],["sellall","Sell All"],["uth","UTH"],["towerheal","Tower Heal"],["autorefiller","Auto Refiller"]] },
{ title: "Placement", items: [["walls3x3","Walls 3x3"],["walls5x5","Walls 5x5"],["walls7x7","Walls 7x7"],["walls9x9","Walls 9x9"],["harvs4x4","Harvs 4x4"],["harvs8x8","Harvs 8x8"]] },
{ title: "Multibox",  items: [["mousemove","Mouse Move"],["positionlock","Position Lock"],["wasd","WASD"],["autofollow","Auto Follow"]] },
{ title: "Tools",     items: [["showrss","Player Info"],["clearchat","Clear Chat"],["chatspam","Chat Spam"],["xkey","X Key"],["scorelogger","Score Logger"],["autorespawn","Auto Respawn"],["autoaltjoin","Auto Alt Join"],["joindelay","Join Delay"],["sesswitcher","Ses Switcher"],["singlescorelogger","1P Score Logger"]] }
SectionToggles & what each does
DefenseAuto Heal (potion below low HP) · Auto Bow (auto-attack) · Auto Spear (buy Spear on Sockets to raid) · Auto Shield (T1 ZombieShield) · Auto Aim (player+Socket aimbot) · Auto Timeout (buy Pause → AITO). Code on Defense automations.
PetsBuy Pet Potion · Pet Heal (below low HP) · Revive Pet (when dead) · Evolve Pet (token-gated ladder — see Pets)
BaseAuto Build/Auto Upgrade (replay a recorded base — needs !record+!arb/!aru) · Upgrade All · Sell All · UTH (upgrade low-HP towers to tank) · Tower Heal (heal-spell low-HP towers) · Auto Refiller (spawn Alts to 40 players — see Base automations)
PlacementWalls 3x3 → 9x9 & Harvs 4x4 / 8x8 — mutually-exclusive placement-spam interceptors that trap players; full code on Chat Commands
MultiboxMouse Move · Position Lock · WASD · Auto Follow — drive how Sockets move; see the Multibox tab
ToolsPlayer Info · Clear Chat · Chat Spam · X Key · Score Logger · Auto Respawn · Auto Alt Join · Join Delay (stage Sockets — see Join Delay) · Ses Switcher · 1P Score Logger

Sessions tab — control the headless Bot

The Sessions tab is marked session: true, so every item carries its e…/d… relay codes inline in the schema — clicking a button sends the exact same message as the matching chat command. This is the menu face of the Session command relay:

script.js — Sessions tab schema (codes shipped inline with each item)
{ title: "Defense", items: [
    ["sessionAutobow","Auto Bow","eatb","datb"], ["sessionAutoaim","Auto Aim","eaa","daa"],
    ["sessionAimZombies","Aim Zombies","eaaz","daaz"], ["sessionAimDemons","Aim Demons","eaad","daad"],
    ["sessionTimeout","Auto Timeout","eat","dat"], ["sessionAutoWeapon","Weapon Switch","eaws","daws"],
    ["sessionClearZombies","Clear Zombies","eacz","dacz"], ["sessionChatSpam","Chat Spam","esp","dsp"] ] },
{ title: "Base", items: [
    ["sessionAutobuild","Auto Build","eab","dab"], ["sessionAutoupgrade","Auto Upgrade","eau","dau"],
    ["sessionUpgradeAll","Upgrade All","eua","dua"], ["sessionSellAll","Sell All","esa","dsa"],
    ["sessionUpgradeHealth","UTH","euth","duth"], ["sessionTowerHeal","Tower Heal","eth","dth"],
    ["sessionAhrc","AHRC","eahrc","dahrc"], ["sessionAntiArrow","Anti Arrow","eaar","daar"],
    ["sessionRevert","Revert Towers","erev","drev"], ["sessionReturnItems","Return Items","erit","drit"] ] },
{ title: "Misc", items: [
    ["sessionPositionLock","Position Lock","epl","dpl"], ["sessionFollow","Auto Follow","epf","dpf"],
    ["sessionAutoMove","Auto Move","eatm","datm"], ["sessionAimLock","Aim Lock","eal","dal"],
    ["sessionWallBounce","Wall Bounce","ewb","dwb"], ["sessionPlayerTrick","Player Trick","ept","dpt"],
    ["sessionReverseTrick","Reverse Trick","erpt","drpt"], ["sessionBossReverse","Boss Reverse","ebrpt","dbrpt"],
    ["sessionTokenReverse","Token Reverse","etrpt","dtrpt"], ["sessionAutoSell","Auto Sell","easl","dasl"] ] },
{ title: "Actions", actions: [
    ["Lock Position","lock"], ["Second Lock","2lock"], ["Aim Lock Pos","alock"],
    ["Horizontal WB","hor"], ["Vertical WB","ver"], ["Wall Lock 1","wlock1"],
    ["Wall Lock 2","wlock2"], ["Ping","ping"], ["Uptime","uptime"] ] }

Because the toggle codes are identical to the chat-command relay codes, the per-item behavior is exactly the one documented in the Command Reference table — Defense, Pets, Base, and Misc are all enable/disable pairs that flip a bot.scripts.* flag, while the Actions group (Lock Position, the two Wall Locks, Aim Lock Pos, Horizontal/Vertical WB, Ping, Uptime) fire the bare one-shot verbs. The handful of Sessions features the manual lists that have no chat-command twin — Clear Zombies, Weapon Switch, Anti Arrow, Revert Towers, Return Items, and the trick variants — are reachable both ways (e.g. !acz, !aws, !aar, !rev, !rit) since they share the same codes.

Why the duplication is intentional: a Session is headless, so there's no in-game menu running inside it. The menu you see is in your browser, attached to the Session — so a "menu toggle" and a "chat command" are just two front-ends emitting the same e…/d… message to the same Bot. That's the whole reason the schema stores the relay codes as data rather than hard-coding handlers.

Statistics tab

The Statistics tab (statistics: true) is a read-out panel, not a set of toggles. Its markup is a grid of data-stat cells that an auto-updater fills every 0.5s — CPU%, memory, heap, ZOMBS ping, server id, session count, and uptimes — plus a manual Refresh Stats button:

script.js — the Statistics panel markup
<div class="hud-statistic"><span>Process CPU</span><strong data-stat="cpuPercent">--</strong><small>%</small></div>
<div class="hud-statistic"><span>ZOMBS Ping</span><strong data-stat="zombsPingMs">--</strong><small>ms</small></div>
<div class="hud-statistic"><span>Sessions</span><strong data-stat="sessionsCount">--</strong><small>active</small></div>
<div class="hud-statistic"><span>Session Uptime</span><strong data-stat="sessionUptime">--</strong></div>
<a class="btn hud-statistics-refresh">Refresh Stats</a>

Per the manual, Refresh Stats "manually updates the Statistics that are auto updated every 0.5 seconds. This also updates your Ping, which isn't auto measured" — the stats stream comes from the Session Saver (sendSessionStats), while ping is the one value the client must actively probe. The Sessions-tab Ping and Uptime actions feed into the same panel.