// ==UserScript== // @name Survev Overlay // @namespace https://github.com/DamienVesper/SurvevOverlay // @version 1.0.0 // @description An ingame counter overlay to view connection stats and in-game health stats. // @author DamienVesper // @license AGPL-3.0 // @require https://update.greasyfork.org/scripts/391611/743919/WSHook.js // @run-at document-start // @match *://survev.io/* // @match *://66.179.254.36/* // @match *://expandedwater.online/* // @grant none // @downloadURL https://update.greasyfork.icu/scripts/519076/Survev%20Overlay.user.js // @updateURL https://update.greasyfork.icu/scripts/519076/Survev%20Overlay.meta.js // ==/UserScript== "use strict"; var elementStyle = document.createElement("style"); elementStyle.appendChild(document.createTextNode(".sv-container {\r\n background: rgba(0, 0, 0, 0.25);\r\n border-radius: 5px;\r\n padding: 8px;\r\n}\r\n\r\n/* counter styling */\r\n#sv-bottom-wrapper {\r\n margin-bottom: 5px;\r\n}\r\n\r\n#sv-hp-wrapper, #sv-adren-wrapper {\r\n width: 50px;\r\n margin-right: 5px;\r\n display: inline-block;\r\n}\r\n\r\n#sv-fps-wrapper, #sv-ping-wrapper {\r\n margin: 5px 0px;\r\n width: 192px;\r\n}\r\n\r\n/* make room for fps & ping counters */\r\n#ui-spectate-options {\r\n top: 85px;\r\n}\r\n\r\n/* kill counters */\r\n.sv-kill-counter-wrapper {\r\n position: absolute;\r\n justify-content: center;\r\n align-items: center;\r\n top: 0px;\r\n left: 252.5px;\r\n width: 24px;\r\n height: 24px;\r\n}\r\n\r\n/* .sv-kill-counter-wrapper .sv-kc-icon {\r\n display: inline-block;\r\n\r\n background: url('https://survev.io/img/gui/crosshair.svg');\r\n background-position: center;\r\n background-repeat: no-repeat;\r\n background-size: 32px;\r\n border-radius: 20px;\r\n\r\n height: 20px;\r\n width: 20px;\r\n} */\r\n\r\n/* blue adrenaline */\r\n.ui-boost-base .ui-bar-inner {\r\n background: #1e90ff !important;\r\n}")); document.head.appendChild(elementStyle); var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); class Plugin { constructor() { /** * Variables the plugin uses. */ __publicField(this, "env"); /** * Load the plugin. */ __publicField(this, "load"); /** * Unload the plugin. */ __publicField(this, "unload"); /** * Runtime execution of the plugin. */ __publicField(this, "run"); /** * DOM update by the plugin. */ __publicField(this, "update"); } } class Adrenaline extends Plugin { constructor() { super(...arguments); __publicField(this, "elements"); __publicField(this, "env", { adren: 0 }); __publicField(this, "load", () => { var _a; let bottomWrapper = document.querySelector(`#sv-bottom-wrapper`); if (!bottomWrapper) { bottomWrapper = document.createElement(`div`); bottomWrapper.id = `sv-bottom-wrapper`; const boostCounter = document.querySelector(`#ui-boost-counter`); (_a = document.querySelector(`#ui-bottom-center-0`)) == null ? void 0 : _a.insertBefore(bottomWrapper, document.querySelector(`#ui-boost-counter`)); bottomWrapper.style.marginBottom = `-15px`; const observer2 = new MutationObserver((mutationRecord) => { for (const mutation of mutationRecord) { if (mutation.attributeName === `style`) document.querySelector(`#sv-bottom-wrapper`).style.marginBottom = `${boostCounter.style.opacity === `0` ? -15 : 5}px`; } }); observer2.observe(boostCounter, { attributes: true, attributeFilter: [`style`] }); } const wrapper = document.createElement(`div`); const text = document.createElement(`span`); this.elements = { wrapper, text }; wrapper.id = `sv-hp-wrapper`; wrapper.classList.add(`sv-container`); wrapper.appendChild(text); bottomWrapper.appendChild(wrapper); const observer = new MutationObserver((mutationRecord) => { for (const mutation of mutationRecord) if (mutation.attributeName === `style`) this.update(); }); document.querySelectorAll(`.ui-boost-base .ui-bar-inner`).forEach((el) => observer.observe(el, { attributes: true, attributeFilter: [`style`] })); this.update(); }); __publicField(this, "run", () => { let adrenPercentage = 0; const boosts = document.querySelectorAll(`.ui-boost-base .ui-bar-inner`); boosts.forEach((boost, i) => { if (i <= 1) adrenPercentage += parseInt(boost.style.width.slice(0, boost.style.width.length - 1)) / 4; else if (i === 2) adrenPercentage += parseInt(boost.style.width.slice(0, boost.style.width.length - 1)) / 2.5; else if (i === 3) adrenPercentage += parseInt(boost.style.width.slice(0, boost.style.width.length - 1)) / 10; }); this.env.adren = Math.round(adrenPercentage); }); __publicField(this, "update", () => { this.run(); this.elements.text.innerHTML = `AD: ${this.env.adren}`; }); } } class FPS extends Plugin { constructor(config) { super(); __publicField(this, "config"); __publicField(this, "elements"); __publicField(this, "env", { frameTimes: [] }); __publicField(this, "intervals", { update: void 0 }); __publicField(this, "load", () => { var _a; const wrapper = document.createElement(`div`); const text = document.createElement(`span`); this.elements = { wrapper, text }; wrapper.id = `sv-fps-wrapper`; wrapper.classList.add(`sv-container`); wrapper.appendChild(text); (_a = document.querySelector(`#ui-top-left`)) == null ? void 0 : _a.appendChild(wrapper); this.run(); this.intervals.update = setInterval(this.update, this.config.updateInterval); }); __publicField(this, "run", () => { window.requestAnimationFrame(() => { const now = performance.now(); while (this.env.frameTimes.length > 0 && this.env.frameTimes[0] <= now - 1e3) this.env.frameTimes.shift(); this.env.frameTimes.push(now); if (core.player !== void 0) core.player.seq = (core.player.seq + 1) % 256; this.run(); }); }); __publicField(this, "update", () => { this.elements.text.innerHTML = `${this.env.frameTimes.length} FPS`; }); this.config = { updateInterval: (config == null ? void 0 : config.updateInterval) ?? 1e3 }; } } class HP extends Plugin { constructor() { super(...arguments); __publicField(this, "elements"); __publicField(this, "env", { hp: 100 }); __publicField(this, "load", () => { var _a; let bottomWrapper = document.querySelector(`#sv-bottom-wrapper`); if (!bottomWrapper) { bottomWrapper = document.createElement(`div`); bottomWrapper.id = `sv-bottom-wrapper`; const boostCounter = document.querySelector(`#ui-boost-counter`); (_a = document.querySelector(`#ui-bottom-center-0`)) == null ? void 0 : _a.insertBefore(bottomWrapper, document.querySelector(`#ui-boost-counter`)); bottomWrapper.style.marginBottom = `-15px`; const observer2 = new MutationObserver((mutationRecord) => { for (const mutation of mutationRecord) { if (mutation.attributeName === `style`) document.querySelector(`#sv-bottom-wrapper`).style.marginBottom = `${boostCounter.style.opacity === `0` ? -15 : 5}px`; } }); observer2.observe(boostCounter, { attributes: true, attributeFilter: [`style`] }); } const wrapper = document.createElement(`div`); const text = document.createElement(`span`); this.elements = { wrapper, text }; wrapper.id = `sv-hp-wrapper`; wrapper.classList.add(`sv-container`); wrapper.appendChild(text); bottomWrapper.appendChild(wrapper); this.elements.text.innerHTML = `HP: ${this.env.hp}`; const healthUI = document.querySelector(`#ui-health-actual`); const observer = new MutationObserver((mutationRecord) => { for (const mutation of mutationRecord) { if (mutation.attributeName === `style`) { this.env.hp = Math.floor((healthUI.clientWidth ?? 0) / 4); this.elements.text.innerHTML = `HP: ${this.env.hp}`; } } }); observer.observe(healthUI, { attributes: true, attributeFilter: [`style`] }); }); } } class Kill extends Plugin { constructor(config) { super(); __publicField(this, "config"); __publicField(this, "elements", []); __publicField(this, "intervals", { update: void 0 }); __publicField(this, "load", () => { const teamElements = document.querySelectorAll(`.ui-team-member`); for (let i = 0; i < teamElements.length; i++) { const teamElement = teamElements[i]; const wrapper = document.createElement(`div`); const text = document.createElement(`span`); text.innerHTML = `0`; wrapper.id = `sv-kill-${i}-wrapper`; wrapper.classList.add(`sv-container`, `sv-kill-counter-wrapper`); wrapper.appendChild(text); teamElement.appendChild(wrapper); this.elements.push({ wrapper, text }); this.intervals.update = setInterval(this.update, this.config.updateInterval); } }); __publicField(this, "update", () => { if (core.player === void 0) return; const playerInfo = core.player.playerBarn.players.get(core.player.activeId); const teamKills = playerInfo === void 0 ? [0, 0, 0, 0] : core.player.teamKills.get(playerInfo.groupId) ?? [0, 0, 0, 0]; const teamElements = document.querySelectorAll(`.ui-team-member`); for (let i = 0; i < this.elements.length; i++) { if (teamElements[i].style.display === `none`) this.elements[i].wrapper.style.display = `none`; else this.elements[i].wrapper.style.display = `flex`; this.elements[i].text.innerHTML = `${teamKills[i]}`; } }); this.config = { updateInterval: (config == null ? void 0 : config.updateInterval) ?? 1e3 }; } } class Ping extends Plugin { constructor(config) { super(); __publicField(this, "config"); __publicField(this, "elements"); __publicField(this, "env", { ping: 0 }); __publicField(this, "intervals", { update: void 0 }); __publicField(this, "load", () => { var _a; const wrapper = document.createElement(`div`); const text = document.createElement(`span`); this.elements = { wrapper, text }; wrapper.id = `sv-ping-wrapper`; wrapper.classList.add(`sv-container`); wrapper.appendChild(text); (_a = document.querySelector(`#ui-top-left`)) == null ? void 0 : _a.appendChild(wrapper); this.intervals.update = setInterval(this.update, this.config.updateInterval); }); __publicField(this, "run", () => { if (core.player === void 0) return; const pings = core.player.pings.sort((a, b) => a - b); if (pings.length > 0) { this.env.ping = pings[Math.floor(pings.length * 0.5)]; core.player.pings = []; } }); __publicField(this, "update", () => { this.run(); this.elements.text.innerHTML = `${this.env.ping} MS`; }); this.config = { updateInterval: (config == null ? void 0 : config.updateInterval) ?? 1e3 }; } } const core = { plugins: [ new FPS(), new Ping(), new HP(), new Adrenaline(), new Kill({ updateInterval: 100 }) ], player: void 0 }; const EmotesDefs = { emote_medical: { type: "emote", texture: "emote-medical-healthkit.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo: { type: "emote", texture: "ammo-box.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo9mm: { type: "emote", texture: "ammo-9mm.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo12gauge: { type: "emote", texture: "ammo-12gauge.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo762mm: { type: "emote", texture: "ammo-762mm.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo556mm: { type: "emote", texture: "ammo-556mm.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo50ae: { type: "emote", texture: "ammo-50AE.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo308sub: { type: "emote", texture: "ammo-308sub.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammoflare: { type: "emote", texture: "ammo-flare.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_ammo45acp: { type: "emote", texture: "ammo-45acp.img", sound: "emote_01", channel: "ui", teamOnly: true, noCustom: true, category: 0 /* Locked */ }, emote_loot: { type: "emote", texture: "", sound: "emote_01", channel: "ui", teamOnly: false, noCustom: true, category: 0 /* Locked */ }, emote_trick_nothing: { type: "emote", texture: "face-imp-trick.img", sound: "trick_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_trick_size: { type: "emote", texture: "face-imp-trick.img", sound: "trick_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_trick_m9: { type: "emote", texture: "face-imp-trick.img", sound: "trick_03", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_trick_chatty: { type: "emote", texture: "face-imp-trick.img", sound: "trick_02", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_trick_drain: { type: "emote", texture: "face-imp-trick.img", sound: "trick_02", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_treat_9mm: { type: "emote", texture: "face-angel-treat.img", sound: "treat_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_treat_12g: { type: "emote", texture: "face-angel-treat.img", sound: "treat_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_treat_556: { type: "emote", texture: "face-angel-treat.img", sound: "treat_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_treat_762: { type: "emote", texture: "face-angel-treat.img", sound: "treat_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_treat_super: { type: "emote", texture: "face-angel-treat.img", sound: "treat_01", channel: "ui", noCustom: true, category: 0 /* Locked */ }, emote_bugle_inspiration_red: { type: "emote", texture: "bugle-inspiration-red.img", sound: "emote_01", channel: "ui", noCustom: true, category: 5 /* Other */ }, emote_bugle_final_red: { type: "emote", texture: "bugle-final-red.img", sound: "emote_01", channel: "ui", noCustom: true, category: 5 /* Other */ }, emote_bugle_inspiration_blue: { type: "emote", texture: "bugle-inspiration-blue.img", sound: "emote_01", channel: "ui", noCustom: true, category: 5 /* Other */ }, emote_bugle_final_blue: { type: "emote", texture: "bugle-final-blue.img", sound: "emote_01", channel: "ui", noCustom: true, category: 5 /* Other */ }, emote_thumbsup: { type: "emote", name: "Thumbs Up", rarity: 1, texture: "thumbs-up.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_sadface: { type: "emote", name: "Sad Face", rarity: 1, texture: "face-sad.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_happyface: { type: "emote", name: "Happy Face", rarity: 1, texture: "face-happy.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_surviv: { type: "emote", name: "Surviv Logo", rarity: 1, texture: "surviv.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_gg: { type: "emote", name: "GG", rarity: 1, texture: "gg.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_question: { type: "emote", name: "Question Mark", rarity: 1, texture: "question.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_tombstone: { type: "emote", name: "Tombstone", rarity: 1, texture: "tombstone.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_joyface: { type: "emote", name: "Joyful Face", rarity: 1, texture: "face-joy.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_sobface: { type: "emote", name: "Sobbing Face", rarity: 1, texture: "face-sob.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_thinkingface: { type: "emote", name: "Thonk", rarity: 1, texture: "face-thinking.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_flagus: { type: "emote", name: "Flag United States", rarity: 1, texture: "flag-united-states-of-america.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagthailand: { type: "emote", name: "Flag Thailand", rarity: 1, texture: "flag-thailand.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaggermany: { type: "emote", name: "Flag Germany", rarity: 1, texture: "flag-germany.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagfrance: { type: "emote", name: "Flag France", rarity: 1, texture: "flag-france.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagsouthkorea: { type: "emote", name: "Flag South Korea", rarity: 1, texture: "flag-south-korea.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagbrazil: { type: "emote", name: "Flag Brazil", rarity: 1, texture: "flag-brazil.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagcanada: { type: "emote", name: "Flag Canada", rarity: 1, texture: "flag-canada.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagspain: { type: "emote", name: "Flag Spain", rarity: 1, texture: "flag-spain.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagrussia: { type: "emote", name: "Flag Russia", rarity: 1, texture: "flag-russia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagmexico: { type: "emote", name: "Flag Mexico", rarity: 1, texture: "flag-mexico.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagpoland: { type: "emote", name: "Flag Poland", rarity: 1, texture: "flag-republic-of-poland.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaguk: { type: "emote", name: "Flag United Kingdom", rarity: 1, texture: "flag-united-kingdom.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagcolombia: { type: "emote", name: "Flag Colombia", rarity: 1, texture: "flag-colombia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagukraine: { type: "emote", name: "Flag Ukraine", rarity: 1, texture: "flag-ukraine.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagturkey: { type: "emote", name: "Flag Turkey", rarity: 1, texture: "flag-turkey.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagphilippines: { type: "emote", name: "Flag Philippines", rarity: 1, texture: "flag-philippines.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagczechia: { type: "emote", name: "Flag Czechia", rarity: 1, texture: "flag-czech-republic.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagperu: { type: "emote", name: "Flag Peru", rarity: 1, texture: "flag-peru.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagaustria: { type: "emote", name: "Flag Austria", rarity: 1, texture: "flag-austria.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagargentina: { type: "emote", name: "Flag Argentina", rarity: 1, texture: "flag-argentina.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagjapan: { type: "emote", name: "Flag Japan", rarity: 1, texture: "flag-japan.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagvenezuela: { type: "emote", name: "Flag Venezuela", rarity: 1, texture: "flag-venezuela.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagvietnam: { type: "emote", name: "Flag Vietnam", rarity: 1, texture: "flag-vietnam.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagswitzerland: { type: "emote", name: "Flag Switzerland", rarity: 1, texture: "flag-switzerland.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagnetherlands: { type: "emote", name: "Flag Netherlands", rarity: 1, texture: "flag-netherlands.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagchina: { type: "emote", name: "Flag China", rarity: 1, texture: "flag-china.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagtaiwan: { type: "emote", name: "Flag Taiwan", rarity: 1, texture: "flag-taiwan.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagchile: { type: "emote", name: "Flag Chile", rarity: 1, texture: "flag-chile.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagaustralia: { type: "emote", name: "Flag Australia", rarity: 1, texture: "flag-australia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagdenmark: { type: "emote", name: "Flag Denmark", rarity: 1, texture: "flag-denmark.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagitaly: { type: "emote", name: "Flag Italy", rarity: 1, texture: "flag-italy.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagsweden: { type: "emote", name: "Flag Sweden", rarity: 1, texture: "flag-sweden.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagecuador: { type: "emote", name: "Flag Ecuador", rarity: 1, texture: "flag-ecuador.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagslovakia: { type: "emote", name: "Flag Slovakia", rarity: 1, texture: "flag-slovakia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaghungary: { type: "emote", name: "Flag Hungary", rarity: 1, texture: "flag-hungary.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagromania: { type: "emote", name: "Flag Romania", rarity: 1, texture: "flag-romania.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaghongkong: { type: "emote", name: "Flag Hong Kong", rarity: 1, texture: "flag-hong-kong.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagindonesia: { type: "emote", name: "Flag Indonesia", rarity: 1, texture: "flag-indonesia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagfinland: { type: "emote", name: "Flag Finland", rarity: 1, texture: "flag-finland.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagnorway: { type: "emote", name: "Flag Norway", rarity: 1, texture: "flag-norway.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_heart: { type: "emote", name: "Heart", rarity: 1, texture: "heart.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_sleepy: { type: "emote", name: "Zzz", rarity: 1, texture: "sleepy.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_flex: { type: "emote", name: "Flex", rarity: 1, texture: "flex.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_angryface: { type: "emote", name: "Angry Face", rarity: 1, texture: "face-angry.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_upsidedownface: { type: "emote", name: "Upside Down Face", rarity: 1, texture: "face-upsidedown.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_teabag: { type: "emote", name: "Teabag", rarity: 1, texture: "teabag.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_alienface: { type: "emote", name: "Alien Face", rarity: 1, texture: "face-alien.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_flagbelarus: { type: "emote", name: "Flag Belarus", rarity: 1, texture: "flag-belarus.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagbelgium: { type: "emote", name: "Flag Belgium", rarity: 1, texture: "flag-belgium.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagkazakhstan: { type: "emote", name: "Flag Kazakhstan", rarity: 1, texture: "flag-kazakhstan.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_egg: { type: "emote", name: "Egg", rarity: 1, texture: "egg.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_police: { type: "emote", name: "Police Insignia", rarity: 1, texture: "police.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_dabface: { type: "emote", name: "Dab Face", rarity: 1, texture: "face-dab.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_flagmalaysia: { type: "emote", name: "Flag Malaysia", rarity: 1, texture: "flag-malaysia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagnewzealand: { type: "emote", name: "Flag New Zealand", rarity: 1, texture: "flag-new-zealand.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_logosurviv: { type: "emote", name: "PARMA", rarity: 1, texture: "logo-surviv.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_logoegg: { type: "emote", name: "The Egg", rarity: 1, texture: "logo-egg.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_logoswine: { type: "emote", name: "The Swine", rarity: 1, texture: "logo-swine.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_logohydra: { type: "emote", name: "The Hydra", rarity: 1, texture: "logo-hydra.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_logostorm: { type: "emote", name: "The Storm", rarity: 1, texture: "logo-storm.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_flaghonduras: { type: "emote", name: "Flag Honduras", rarity: 1, texture: "flag-honduras.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_logocaduceus: { type: "emote", name: "The Caduceus", rarity: 1, texture: "logo-caduceus.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_impface: { type: "emote", name: "Imp Face", rarity: 1, texture: "face-imp.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_monocleface: { type: "emote", name: "Monocole Face", rarity: 1, texture: "face-monocle.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_sunglassface: { type: "emote", name: "Sunglasses Face", rarity: 1, texture: "face-sunglass.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_headshotface: { type: "emote", name: "Headshot!", rarity: 1, texture: "face-headshot.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_potato: { type: "emote", name: "Potato", rarity: 1, texture: "potato.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_leek: { type: "emote", name: "Leek", rarity: 1, texture: "leek.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_eggplant: { type: "emote", name: "Eggplant", rarity: 1, texture: "eggplant.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_baguette: { type: "emote", name: "Baguette", rarity: 1, texture: "baguette.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_chick: { type: "emote", name: "Chick", rarity: 1, texture: "chick.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_flagbolivia: { type: "emote", name: "Flag Bolivia", rarity: 1, texture: "flag-bolivia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagcroatia: { type: "emote", name: "Flag Croatia", rarity: 1, texture: "flag-croatia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagindia: { type: "emote", name: "Flag India", rarity: 1, texture: "flag-india.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagisrael: { type: "emote", name: "Flag Israel", rarity: 1, texture: "flag-israel.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaggeorgia: { type: "emote", name: "Flag Georgia", rarity: 1, texture: "flag-georgia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaggreece: { type: "emote", name: "Flag Greece", rarity: 1, texture: "flag-greece.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagguatemala: { type: "emote", name: "Flag Gautemala", rarity: 1, texture: "flag-guatemala.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagportugal: { type: "emote", name: "Flag Portugal", rarity: 1, texture: "flag-portugal.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagserbia: { type: "emote", name: "Flag Serbia", rarity: 1, texture: "flag-serbia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagsingapore: { type: "emote", name: "Flag Singapore", rarity: 1, texture: "flag-singapore.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagtrinidad: { type: "emote", name: "Flag Trinidad and Tobago", rarity: 1, texture: "flag-trinidad-and-tobago.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaguruguay: { type: "emote", name: "Flag Uruguay", rarity: 1, texture: "flag-uruguay.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_logoconch: { type: "emote", name: "The Conch", rarity: 1, texture: "logo-conch.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_pineapple: { type: "emote", name: "Pineapple", rarity: 1, texture: "pineapple.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_coconut: { type: "emote", name: "Coconut", rarity: 1, texture: "coconut.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_crab: { type: "emote", name: "Crab", rarity: 1, texture: "crab.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 3 /* Animals */ }, emote_whale: { type: "emote", name: "Whale", rarity: 1, texture: "whale.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 3 /* Animals */ }, emote_logometeor: { type: "emote", name: "The Meteor", rarity: 1, texture: "logo-meteor.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_salt: { type: "emote", name: "Salt Shaker", rarity: 1, texture: "salt.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_disappointface: { type: "emote", name: "Disappointed Face", rarity: 1, texture: "face-disappoint.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_logocrossing: { type: "emote", name: "The Crossing", rarity: 1, texture: "logo-crossing.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_fish: { type: "emote", name: "Fish", rarity: 1, texture: "fish.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 3 /* Animals */ }, emote_campfire: { type: "emote", name: "Campfire", rarity: 1, texture: "campfire.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_chickendinner: { type: "emote", name: "Chicken Dinner", rarity: 1, texture: "chicken-dinner.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_cattle: { type: "emote", name: "Cattle Skull", rarity: 1, texture: "cattle.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 3 /* Animals */ }, emote_icecream: { type: "emote", name: "Ice Cream", rarity: 1, texture: "ice-cream.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_cupcake: { type: "emote", name: "Cupcake", rarity: 1, texture: "cupcake.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_donut: { type: "emote", name: "Donut", rarity: 1, texture: "donut.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_logohatchet: { type: "emote", name: "The Hatchet", rarity: 1, texture: "logo-hatchet.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_acorn: { type: "emote", name: "Acorn", rarity: 1, texture: "acorn.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_trunk: { type: "emote", name: "Tree Trunk", rarity: 1, texture: "trunk.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_forest: { type: "emote", name: "Forest", rarity: 1, texture: "forest.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_pumpkin: { type: "emote", name: "Pumpkin", rarity: 1, texture: "pumpkin.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_candycorn: { type: "emote", name: "Candy Corn", rarity: 1, texture: "candy-corn.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 2 /* Food */ }, emote_pilgrimhat: { type: "emote", name: "Pilgrim", rarity: 1, texture: "pilgrim-hat.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_turkeyanimal: { type: "emote", name: "Turkey", rarity: 1, texture: "turkey-animal.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 3 /* Animals */ }, emote_heartface: { type: "emote", name: "Heart Face", rarity: 1, texture: "face-heart.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_logochrysanthemum: { type: "emote", name: "The Chrysanthemum", rarity: 1, texture: "logo-chrysanthemum.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_santahat: { type: "emote", name: "Santa Hat", rarity: 1, texture: "santa-hat.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_snowman: { type: "emote", name: "Snowman", rarity: 1, texture: "snowman.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_snowflake: { type: "emote", name: "Snowflake", rarity: 1, texture: "snowflake.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_flagmorocco: { type: "emote", name: "Flag Morocco", rarity: 1, texture: "flag-morocco.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagestonia: { type: "emote", name: "Flag Estonia", rarity: 1, texture: "flag-estonia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagalgeria: { type: "emote", name: "Flag Algeria", rarity: 1, texture: "flag-algeria.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagegypt: { type: "emote", name: "Flag Egypt", rarity: 1, texture: "flag-egypt.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagazerbaijan: { type: "emote", name: "Flag Azerbaijan", rarity: 1, texture: "flag-azerbaijan.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagalbania: { type: "emote", name: "Flag Albania", rarity: 1, texture: "flag-albania.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaglithuania: { type: "emote", name: "Flag Lithuania", rarity: 1, texture: "flag-lithuania.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaglatvia: { type: "emote", name: "Flag Latvia", rarity: 1, texture: "flag-latvia.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flaguae: { type: "emote", name: "Flag United Arab Emirates", rarity: 1, texture: "flag-united-arab-emirates.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_flagdominicanrepublic: { type: "emote", name: "Flag Dominican Republic", rarity: 1, texture: "flag-dominican-republic.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 6 /* Flags */ }, emote_logocloud: { type: "emote", name: "The Cloud", rarity: 1, texture: "logo-cloud.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ }, emote_ghost_base: { type: "emote", name: "Ghost", rarity: 2, texture: "ghost-base.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_bandagedface: { type: "emote", name: "Bandaged Face", rarity: 2, texture: "face-bandaged.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_picassoface: { type: "emote", name: "Picasso Face", rarity: 2, texture: "face-picasso.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_pooface: { type: "emote", name: "Poo Face", rarity: 3, texture: "face-poo.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 1 /* Faces */ }, emote_ok: { type: "emote", name: "Ok", rarity: 2, texture: "ok.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_rainbow: { type: "emote", name: "Rainbow", rarity: 3, texture: "rainbow.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 5 /* Other */ }, emote_logotwins: { type: "emote", name: "The Twins", rarity: 1, texture: "logo-twins.img", sound: "emote_01", channel: "ui", teamOnly: false, category: 4 /* Logos */ } }; function earcut(data, holeIndices, dim) { dim = dim || 2; const hasHoles = holeIndices == null ? void 0 : holeIndices.length; const outerLen = hasHoles ? holeIndices[0] * dim : data.length; let outerNode = linkedList(data, 0, outerLen, dim, true); const triangles = []; if (!outerNode) return triangles; let minX; let minY; let maxX; let maxY; let x; let y; let invSize; if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); if (data.length > 80 * dim) { minX = maxX = data[0]; minY = maxY = data[1]; for (let i = dim; i < outerLen; i += dim) { x = data[i]; y = data[i + 1]; if (x < minX) minX = x; if (y < minY) minY = y; if (x > maxX) maxX = x; if (y > maxY) maxY = y; } invSize = Math.max(maxX - minX, maxY - minY); invSize = invSize !== 0 ? 1 / invSize : 0; } earcutLinked(outerNode, triangles, dim, minX, minY, invSize); return triangles; } function linkedList(data, start, end, dim, clockwise) { let i; let last; if (clockwise === signedArea(data, start, end, dim) > 0) { for (i = start; i < end; i += dim) { last = insertNode(i, data[i], data[i + 1], last); } } else { for (i = end - dim; i >= start; i -= dim) { last = insertNode(i, data[i], data[i + 1], last); } } if (last && equals(last, last.next)) { removeNode(last); last = last.next; } return last; } function filterPoints(start, end) { if (!start) return start; if (!end) end = start; let p = start; let again; do { again = false; if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { removeNode(p); p = end = p.prev; if (p === p.next) break; again = true; } else { p = p.next; } } while (again || p !== end); return end; } function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) { if (!ear) return; if (!pass && invSize) indexCurve(ear, minX, minY, invSize); let stop = ear; let prev; let next; while (ear.prev !== ear.next) { prev = ear.prev; next = ear.next; if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) { triangles.push(prev.i / dim); triangles.push(ear.i / dim); triangles.push(next.i / dim); removeNode(ear); ear = next.next; stop = next.next; continue; } ear = next; if (ear === stop) { if (!pass) { earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); } else if (pass === 1) { ear = cureLocalIntersections(ear, triangles, dim); earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); } else if (pass === 2) { splitEarcut(ear, triangles, dim, minX, minY, invSize); } break; } } } function isEar(ear) { const a = ear.prev; const b = ear; const c = ear.next; if (area(a, b, c) >= 0) return false; let p = ear.next.next; while (p !== ear.prev) { if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.next; } return true; } function isEarHashed(ear, minX, minY, invSize) { const a = ear.prev; const b = ear; const c = ear.next; if (area(a, b, c) >= 0) return false; const minTX = a.x < b.x ? a.x < c.x ? a.x : c.x : b.x < c.x ? b.x : c.x; const minTY = a.y < b.y ? a.y < c.y ? a.y : c.y : b.y < c.y ? b.y : c.y; const maxTX = a.x > b.x ? a.x > c.x ? a.x : c.x : b.x > c.x ? b.x : c.x; const maxTY = a.y > b.y ? a.y > c.y ? a.y : c.y : b.y > c.y ? b.y : c.y; const minZ = zOrder(minTX, minTY, minX, minY, invSize); const maxZ = zOrder(maxTX, maxTY, minX, minY, invSize); let p = ear.prevZ; let n = ear.nextZ; while (p && p.z >= minZ && n && n.z <= maxZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } while (p && p.z >= minZ) { if (p !== ear.prev && p !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false; p = p.prevZ; } while (n && n.z <= maxZ) { if (n !== ear.prev && n !== ear.next && pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false; n = n.nextZ; } return true; } function cureLocalIntersections(start, triangles, dim) { let p = start; do { const a = p.prev; const b = p.next.next; if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { triangles.push(a.i / dim); triangles.push(p.i / dim); triangles.push(b.i / dim); removeNode(p); removeNode(p.next); p = start = b; } p = p.next; } while (p !== start); return p; } function splitEarcut(start, triangles, dim, minX, minY, invSize) { let a = start; do { let b = a.next.next; while (b !== a.prev) { if (a.i !== b.i && isValidDiagonal(a, b)) { let c = splitPolygon(a, b); a = filterPoints(a, a.next); c = filterPoints(c, c.next); earcutLinked(a, triangles, dim, minX, minY, invSize); earcutLinked(c, triangles, dim, minX, minY, invSize); return; } b = b.next; } a = a.next; } while (a !== start); } function eliminateHoles(data, holeIndices, outerNode, dim) { const queue = []; let i; let len; let start; let end; let list; for (i = 0, len = holeIndices.length; i < len; i++) { start = holeIndices[i] * dim; end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; list = linkedList(data, start, end, dim, false); if (list === list.next) list.steiner = true; queue.push(getLeftmost(list)); } queue.sort(compareX); for (i = 0; i < queue.length; i++) { eliminateHole(queue[i], outerNode); outerNode = filterPoints(outerNode, outerNode.next); } return outerNode; } function compareX(a, b) { return a.x - b.x; } function eliminateHole(hole, outerNode) { outerNode = findHoleBridge(hole, outerNode); if (outerNode) { const b = splitPolygon(outerNode, hole); filterPoints(b, b.next); } } function findHoleBridge(hole, outerNode) { let p = outerNode; const hx = hole.x; const hy = hole.y; let qx = -Infinity; let m; do { if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) { const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); if (x <= hx && x > qx) { qx = x; if (x === hx) { if (hy === p.y) return p; if (hy === p.next.y) return p.next; } m = p.x < p.next.x ? p : p.next; } } p = p.next; } while (p !== outerNode); if (!m) return null; if (hx === qx) return m.prev; const stop = m; const mx = m.x; const my = m.y; let tanMin = Infinity; let tan; p = m.next; while (p !== stop) { if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y )) { tan = Math.abs(hy - p.y) / (hx - p.x); if ((tan < tanMin || tan === tanMin && p.x > m.x) && locallyInside(p, hole)) { m = p; tanMin = tan; } } p = p.next; } return m; } function indexCurve(start, minX, minY, invSize) { let p = start; do { if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize); p.prevZ = p.prev; p.nextZ = p.next; p = p.next; } while (p !== start); p.prevZ.nextZ = null; p.prevZ = null; sortLinked(p); } function sortLinked(list) { let i; let p; let q; let e; let tail; let numMerges; let pSize; let qSize; let inSize = 1; do { p = list; list = null; tail = null; numMerges = 0; while (p) { numMerges++; q = p; pSize = 0; for (i = 0; i < inSize; i++) { pSize++; q = q.nextZ; if (!q) break; } qSize = inSize; while (pSize > 0 || qSize > 0 && q) { if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) { e = p; p = p.nextZ; pSize--; } else { e = q; q = q.nextZ; qSize--; } if (tail) tail.nextZ = e; else list = e; e.prevZ = tail; tail = e; } p = q; } tail.nextZ = null; inSize *= 2; } while (numMerges > 1); return list; } function zOrder(x, y, minX, minY, invSize) { x = 32767 * (x - minX) * invSize; y = 32767 * (y - minY) * invSize; x = (x | x << 8) & 16711935; x = (x | x << 4) & 252645135; x = (x | x << 2) & 858993459; x = (x | x << 1) & 1431655765; y = (y | y << 8) & 16711935; y = (y | y << 4) & 252645135; y = (y | y << 2) & 858993459; y = (y | y << 1) & 1431655765; return x | y << 1; } function getLeftmost(start) { let p = start; let leftmost = start; do { if (p.x < leftmost.x) leftmost = p; p = p.next; } while (p !== start); return leftmost; } function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } function isValidDiagonal(a, b) { return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); } function area(p, q, r) { return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } function equals(p1, p2) { return p1.x === p2.x && p1.y === p2.y; } function intersects(p1, q1, p2, q2) { if (equals(p1, q1) && equals(p2, q2) || equals(p1, q2) && equals(p2, q1)) return true; return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; } function intersectsPolygon(a, b) { let p = a; do { if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true; p = p.next; } while (p !== a); return false; } function locallyInside(a, b) { return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; } function middleInside(a, b) { let p = a; let inside = false; const px = (a.x + b.x) / 2; const py = (a.y + b.y) / 2; do { if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside; p = p.next; } while (p !== a); return inside; } function splitPolygon(a, b) { const a2 = new Node(a.i, a.x, a.y); const b2 = new Node(b.i, b.x, b.y); const an = a.next; const bp = b.prev; a.next = b; b.prev = a; a2.next = an; an.prev = a2; b2.next = a2; a2.prev = b2; bp.next = b2; b2.prev = bp; return b2; } function insertNode(i, x, y, last) { const p = new Node(i, x, y); if (!last) { p.prev = p; p.next = p; } else { p.next = last.next; p.prev = last; last.next.prev = p; last.next = p; } return p; } function removeNode(p) { p.next.prev = p.prev; p.prev.next = p.next; if (p.prevZ) p.prevZ.nextZ = p.nextZ; if (p.nextZ) p.nextZ.prevZ = p.prevZ; } function Node(i, x, y) { this.i = i; this.x = x; this.y = y; this.prev = null; this.next = null; this.z = null; this.prevZ = null; this.nextZ = null; this.steiner = false; } earcut.deviation = function(data, holeIndices, dim, triangles) { const hasHoles = holeIndices == null ? void 0 : holeIndices.length; const outerLen = hasHoles ? holeIndices[0] * dim : data.length; let polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); if (hasHoles) { for (let i = 0, len = holeIndices.length; i < len; i++) { const start = holeIndices[i] * dim; const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; polygonArea -= Math.abs(signedArea(data, start, end, dim)); } } let trianglesArea = 0; for (let i = 0; i < triangles.length; i += 3) { const a = triangles[i] * dim; const b = triangles[i + 1] * dim; const c = triangles[i + 2] * dim; trianglesArea += Math.abs( (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1]) ); } return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea); }; function signedArea(data, start, end, dim) { let sum = 0; for (let i = start, j = end - dim; i < end; i += dim) { sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); j = i; } return sum; } earcut.flatten = function(data) { const dim = data[0][0].length; const result = { vertices: [], holes: [], dimensions: dim }; let holeIndex = 0; for (let i = 0; i < data.length; i++) { for (let j = 0; j < data[i].length; j++) { for (let d = 0; d < dim; d++) { result.vertices.push(data[i][j][d]); } } if (i > 0) { holeIndex += data[i - 1].length; result.holes.push(holeIndex); } } return result; }; function min(a, b) { return a < b ? a : b; } function max(a, b) { return a > b ? a : b; } const v2 = { create(x, y) { return { x, y: y ?? x }; }, copy(vec) { return { x: vec.x, y: vec.y }; }, set(a, b) { a.x = b.x; a.y = b.y; }, add(a, b) { return { x: a.x + b.x, y: a.y + b.y }; }, sub(a, b) { return { x: a.x - b.x, y: a.y - b.y }; }, mul(a, s) { return { x: a.x * s, y: a.y * s }; }, div(a, s) { return { x: a.x / s, y: a.y / s }; }, neg(a) { return { x: -a.x, y: -a.y }; }, lengthSqr(a) { return a.x * a.x + a.y * a.y; }, length(a) { return Math.sqrt(v2.lengthSqr(a)); }, normalize(a) { const eps = 1e-6; const len = v2.length(a); return { x: len > eps ? a.x / len : a.x, y: len > eps ? a.y / len : a.y }; }, distance(startPos, finishPos) { const diffPos = v2.sub(startPos, finishPos); return v2.length(diffPos); }, directionNormalized(a, b) { const diffPos = v2.sub(b, a); return v2.normalize(diffPos); }, normalizeSafe(a, v = { x: 1, y: 0 }) { const eps = 1e-6; const len = v2.length(a); return { x: len > eps ? a.x / len : v.x, y: len > eps ? a.y / len : v.y }; }, dot(a, b) { return a.x * b.x + a.y * b.y; }, perp(a) { return { x: -a.y, y: a.x }; }, proj(a, b) { return v2.mul(b, v2.dot(a, b) / v2.dot(b, b)); }, rotate(a, rad) { const cosr = Math.cos(rad); const sinr = Math.sin(rad); return { x: a.x * cosr - a.y * sinr, y: a.x * sinr + a.y * cosr }; }, mulElems(a, b) { return { x: a.x * b.x, y: a.y * b.y }; }, divElems(a, b) { return { x: a.x / b.x, y: a.y / b.y }; }, minElems(a, b) { return { x: min(a.x, b.x), y: min(a.y, b.y) }; }, maxElems(a, b) { return { x: max(a.x, b.x), y: max(a.y, b.y) }; }, randomUnit() { return v2.normalizeSafe( v2.create(Math.random() - 0.5, Math.random() - 0.5), v2.create(1, 0) ); }, lerp(t, a, b) { return v2.add(v2.mul(a, 1 - t), v2.mul(b, t)); }, eq(a, b, epsilon = 1e-4) { return Math.abs(a.x - b.x) <= epsilon && Math.abs(a.y - b.y) <= epsilon; } }; const kEpsilon = 1e-6; const math = { clamp(a, min2, max2) { return a < max2 ? a > min2 ? a : min2 : max2; }, v2Clamp(vector, minV2, maxV2) { let minX; let minY; let maxX; let maxY; if (minV2.x > maxV2.x) { minX = maxV2.x; maxX = minV2.x; } else { minX = minV2.x; maxX = maxV2.x; } if (minV2.y > maxV2.y) { minY = maxV2.y; maxY = minV2.y; } else { minY = minV2.y; maxY = maxV2.y; } const resX = vector.x < maxX ? vector.x > minX ? vector.x : minX : maxX; const resY = vector.y < maxY ? vector.y > minY ? vector.y : minY : maxY; return v2.create(resX, resY); }, min(a, b) { return a < b ? a : b; }, max(a, b) { return a > b ? a : b; }, lerp(t, a, b) { return a * (1 - t) + b * t; }, delerp(t, a, b) { return math.clamp((t - a) / (b - a), 0, 1); }, v2lerp(t, a, b) { return v2.create(math.lerp(t, a.x, b.x), math.lerp(t, a.y, b.y)); }, smoothstep(v, a, b) { const t = math.clamp((v - a) / (b - a), 0, 1); return t * t * (3 - 2 * t); }, easeOutElastic(e, t = 0.3) { return Math.pow(2, e * -10) * Math.sin((e - t / 4) * (Math.PI * 2) / t) + 1; }, easeOutExpo(e) { if (e === 1) { return 1; } return 1 - Math.pow(2, e * -10); }, easeInExpo(e) { if (e === 0) { return 0; } return Math.pow(2, (e - 1) * 10); }, easeOutQuart(e) { return 1 - Math.pow(1 - e, 4); }, remap(v, a, b, x, y) { const t = math.clamp((v - a) / (b - a), 0, 1); return math.lerp(t, x, y); }, eqAbs(a, b, eps = kEpsilon) { return Math.abs(a - b) < eps; }, eqRel(a, b, eps = kEpsilon) { return Math.abs(a - b) <= eps * Math.max(Math.max(1, Math.abs(a)), Math.abs(b)); }, deg2rad(deg) { return deg * Math.PI / 180; }, deg2vec2(deg) { deg *= Math.PI / 180; return v2.create(Math.cos(deg), Math.sin(deg)); }, rad2deg(rad) { return rad * 180 / Math.PI; }, rad2degFromDirection(y, x) { const rad = Math.atan2(y, x); let angle = rad * 180 / Math.PI; if (angle < 0) { angle += 360; } return angle; }, fract(n) { return n - Math.floor(n); }, sign(n) { return n < 0 ? -1 : 1; }, mod(num, n) { return (num % n + n) % n; }, fmod(num, n) { return num - Math.floor(num / n) * n; }, angleDiff(a, b) { const d = math.fmod(b - a + Math.PI, Math.PI * 2) - Math.PI; return d < -Math.PI ? d + Math.PI * 2 : d; }, oriToRad(ori) { return ori % 4 * 0.5 * Math.PI; }, oriToAngle(ori) { return ori * (180 / Math.PI); }, radToOri(rad) { return Math.floor( math.fmod(rad + Math.PI * 0.25, Math.PI * 2) / (Math.PI * 0.5) ); }, quantize(f, min2, max2, bits) { assert(f >= min2 && f <= max2); const range = (1 << bits) - 1; const x = math.clamp(f, min2, max2); const t = (x - min2) / (max2 - min2); const a = t * range + 0.5; const b = a < 0 ? Math.ceil(a) : Math.floor(a); return min2 + b / range * (max2 - min2); }, v2Quantize(v, minX, minY, maxX, maxY, bits) { return v2.create( math.quantize(v.x, minX, maxX, bits), math.quantize(v.y, minY, maxY, bits) ); }, // Ray-Line and Ray-Polygon implementations from // http://ahamnett.blogspot.com/2012/06/raypolygon-intersections.html rayLineIntersect(origin, direction, lineA, lineB) { const segment = v2.sub(lineB, lineA); const segmentPerp = v2.create(segment.y, -segment.x); const perpDotDir = v2.dot(direction, segmentPerp); if (Math.abs(perpDotDir) <= kEpsilon) return void 0; const d = v2.sub(lineA, origin); const t = v2.dot(segmentPerp, d) / perpDotDir; const s = v2.dot(v2.create(direction.y, -direction.x), d) / perpDotDir; return t >= 0 && s >= 0 && s <= 1 ? t : void 0; }, rayPolygonIntersect(origin, direction, vertices) { let t = Number.MAX_VALUE; let intersected = false; for (let i = 0, j = vertices.length - 1; i < vertices.length; j = i++) { const distance = this.rayLineIntersect( origin, direction, vertices[j], vertices[i] ); if (distance !== void 0) { if (distance < t) { intersected = true; t = distance; } } } return intersected ? t : void 0; }, // https://stackoverflow.com/questions/22521982/js-check-if-point-inside-a-polygon pointInsidePolygon(point, poly) { const { x } = point; const { y } = point; let inside = false; const count = poly.length; for (let i = 0, j = count - 1; i < count; j = i++) { const xi = poly[i].x; const yi = poly[i].y; const xj = poly[j].x; const yj = poly[j].y; const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi; if (intersect) { inside = !inside; } } return inside; }, distToSegmentSq(p, a, b) { const ab = v2.sub(b, a); const c = v2.dot(v2.sub(p, a), ab) / v2.dot(ab, ab); const d = v2.add(a, v2.mul(ab, math.clamp(c, 0, 1))); const e = v2.sub(d, p); return v2.dot(e, e); }, distToPolygon(p, poly) { let closestDistSq = Number.MAX_VALUE; for (let i = 0; i < poly.length; i++) { const a = poly[i]; const b = i === poly.length - 1 ? poly[0] : poly[i + 1]; const distSq = math.distToSegmentSq(p, a, b); if (distSq < closestDistSq) { closestDistSq = distSq; } } return Math.sqrt(closestDistSq); }, polygonArea(poly) { const verts = []; for (let i = 0; i < poly.length; i++) { verts.push(poly[i].x); verts.push(poly[i].y); } const idxs = earcut(verts); let area2 = 0; for (let _i = 0; _i < idxs.length; _i += 3) { const idx0 = idxs[_i + 0]; const idx1 = idxs[_i + 1]; const idx2 = idxs[_i + 2]; const ax = verts[idx0 * 2 + 0]; const ay = verts[idx0 * 2 + 1]; const bx = verts[idx1 * 2 + 0]; const by = verts[idx1 * 2 + 1]; const cx = verts[idx2 * 2 + 0]; const cy = verts[idx2 * 2 + 1]; area2 += Math.abs( (ax * by + bx * cy + cx * ay - bx * ay - cx * by - ax * cy) * 0.5 ); } return area2; }, // http://paulbourke.net/geometry/pointlineplane/javascript.txt lineIntersects(x1, y1, x2, y2, x3, y3, x4, y4) { if (x1 === x2 && y1 === y2 || x3 === x4 && y3 === y4) { return false; } const denominator = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1); if (denominator === 0) { return false; } const ua = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator; const ub = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator; if (ua < 0 || ua > 1 || ub < 0 || ub > 1) { return false; } const x = x1 + ua * (x2 - x1); const y = y1 + ua * (y2 - y1); return { x, y }; }, // functions not copied from surviv addAdjust(pos1, pos, ori) { if (ori === 0) return v2.add(pos1, pos); let xOffset, yOffset; switch (ori) { case 1: xOffset = -pos.y; yOffset = pos.x; break; case 2: xOffset = -pos.x; yOffset = -pos.y; break; case 3: xOffset = pos.y; yOffset = -pos.x; break; } return v2.add(pos1, v2.create(xOffset, yOffset)); } }; function assert(value, message) { if (!value) { const error = message instanceof Error ? message : new Error(message ?? "Assertation failed"); throw error; } } function defineSkin$1(baseDefs, baseType, params) { return util.mergeDeep({}, baseDefs[baseType], { baseType }, params); } const util = { // // Game objects can belong to the following layers: // 0: ground layer // 1: bunker layer // 2: ground and stairs (both) // 3: bunker and stairs (both) // // Objects on the same layer should interact with one another. sameLayer(a, b) { return (a & 1) === (b & 1) || a & 2 && b & 2; }, sameAudioLayer(a, b) { return a === b || a & 2 || b & 2; }, toGroundLayer(a) { return a & 1; }, toStairsLayer(a) { return a & 1; }, random(min2, max2) { return math.lerp(Math.random(), min2, max2); }, randomInt(min2, max2) { min2 = Math.ceil(min2); max2 = Math.floor(max2); return Math.floor(Math.random() * (max2 - min2 + 1)) + min2; }, // Uniformly distributed random point within circle // Taken from https://stackoverflow.com/questions/5837572/generate-a-random-point-within-a-circle-uniformly randomPointInCircle(rad) { let a = Math.random(); let b = Math.random(); if (b < a) { const c = a; a = b; b = c; } const pos = v2.create( b * rad * Math.cos(2 * Math.PI * a / b), b * rad * Math.sin(2 * Math.PI * a / b) ); return pos; }, randomPointInAabb(aabb) { return v2.create( util.random(aabb.min.x, aabb.max.x), util.random(aabb.min.y, aabb.max.y) ); }, seededRand(seed) { let rng = seed; return function(min2 = 0, max2 = 1) { rng = rng * 16807 % 2147483647; const t = rng / 2147483647; return math.lerp(t, min2, max2); }; }, // Taken from: https://gist.github.com/mjackson/5311256 rgbToHsv(r, g, b) { r /= 255; g /= 255; b /= 255; const max2 = Math.max(r, g, b); const min2 = Math.min(r, g, b); let h = 0; let s = 0; const v = max2; const d = max2 - min2; s = max2 == 0 ? 0 : d / max2; if (max2 == min2) { h = 0; } else { switch (max2) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return { h, s, v }; }, // Taken from: https://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately hsvToRgb(h, s, v) { let r = 0; let g = 0; let b = 0; let i = 0; let f = 0; let p = 0; let q = 0; let t = 0; i = Math.floor(h * 6); f = h * 6 - i; p = v * (1 - s); q = v * (1 - f * s); t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: r = v; g = t; b = p; break; case 1: r = q; g = v; b = p; break; case 2: r = p; g = v; b = t; break; case 3: r = p; g = q; b = v; break; case 4: r = t; g = p; b = v; break; case 5: r = v; g = p; b = q; break; } return { r: Math.round(r * 255), g: Math.round(g * 255), b: Math.round(b * 255) }; }, adjustValue(tint, value) { let r = tint >> 16 & 255; let g = tint >> 8 & 255; let b = tint & 255; r = Math.round(r * value); g = Math.round(g * value); b = Math.round(b * value); return (r << 16) + (g << 8) + b; }, lerpColor(t, start, end) { const toLinear = function toLinear2(c) { return { r: c.r ** 2.2, g: c.g ** 2.2, b: c.b ** 2.2 }; }; const toSRGB = function toSRGB2(c) { return { r: c.r ** (1 / 2.2), g: c.g ** (1 / 2.2), b: c.b ** (1 / 2.2) }; }; const s = toLinear(util.intToRgb(start)); const e = toLinear(util.intToRgb(end)); return util.rgbToInt( toSRGB({ r: math.lerp(t, s.r, e.r), g: math.lerp(t, s.g, e.g), b: math.lerp(t, s.b, e.b) }) ); }, rgbToInt(c) { return (c.r << 16) + (c.g << 8) + c.b; }, intToRgb(c) { return { r: c >> 16 & 255, g: c >> 8 & 255, b: c & 255 }; }, // https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb rgbToHex(c) { const rgb = util.rgbToInt(c); return `#${(16777216 + rgb).toString(16).slice(-6)}`; }, // https://stackoverflow.com/questions/13348129/using-native-javascript-to-desaturate-a-colour hexToRgb(hex) { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) } : null; }, intToHex(int) { return `#${(16777216 + int).toString(16).slice(-6)}`; }, hexToInt(hex) { return parseInt(hex.slice(-6), 16); }, updateColor(sat, hex) { sat /= 100; const col = util.hexToRgb(hex); const black = 0; col.r = Math.round(col.r * sat + black * (1 - sat)); col.g = Math.round(col.g * sat + black * (1 - sat)); col.b = Math.round(col.b * sat + black * (1 - sat)); const out = util.rgbToInt(col); return out; }, // Taken from https://stackoverflow.com/questions/27936772/how-to-deep-merge-instead-of-shallow-merge isObject(item) { return item && (typeof item === "undefined" ? "undefined" : typeof item) === "object" && !Array.isArray(item); }, mergeDeep(target, ...sources) { if (!sources.length) return target; const source = sources.shift(); if (this.isObject(target) && this.isObject(source)) { for (const key in source) { if (this.isObject(source[key])) { if (!target[key]) Object.assign(target, { [key]: {} }); this.mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return this.mergeDeep(target, ...sources); }, cloneDeep(source) { return util.mergeDeep({}, source); }, shuffleArray(arr) { for (let i = arr.length - 1; i >= 0; i--) { const idx = Math.floor(Math.random() * (i + 1)); const tmp = arr[i]; arr[i] = arr[idx]; arr[idx] = tmp; } }, wrappedArrayIndex(arr, index) { return arr.at(index % arr.length); }, weightedRandom(items) { let total = 0; for (let i = 0; i < items.length; i++) { total += items[i].weight; } let rng = util.random(0, total); let idx = 0; while (rng > items[idx].weight) { rng -= items[idx].weight; idx++; } return items[idx]; } }; function defineMeleeSkin(baseType, params) { return defineSkin$1(BaseDefs$4, baseType, params); } const BaseDefs$4 = { fists: { name: "Fists", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["fists"] }, sound: { swing: "punch_swing_01", deploy: "stow_weapon_01", playerHit: "punch_hit_01" }, lootImg: { sprite: "loot-weapon-fists.img", scale: 0.3, rad: 25, tint: 65280 } }, knuckles: { name: "Knuckles", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, noDropOnDeath: true, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1, attack: 0 }, anim: { idlePose: "fists", attackAnims: ["fists", "fists"] }, sound: { pickup: "frag_pickup_01", swing: "punch_swing_01", deploy: "knuckles_deploy_01", playerHit: "punch_hit_01" }, lootImg: { sprite: "loot-melee-knuckles-rusted.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rad: 25, rot: 0.785 }, worldImg: { sprite: "loot-melee-knuckles-rusted.img", pos: { x: 0, y: -27 }, rot: 0.5 * Math.PI, scale: { x: 0.2, y: 0.2 }, tint: 16777215 } }, karambit: { name: "Karambit", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, noDropOnDeath: true, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1 }, anim: { idlePose: "slash", attackAnims: ["slash", "fists"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-karambit-rugged.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-karambit-rugged.img", pos: { x: 15.5, y: -5 }, rot: 0.5 * Math.PI, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, bayonet: { name: "Bayonet", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, noDropOnDeath: true, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["cut", "thrust"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-bayonet-rugged.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-bayonet-rugged.img", pos: { x: -0.5, y: -32.5 }, rot: 0.785, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, huntsman: { name: "Huntsman", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, noDropOnDeath: true, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["cut", "thrust"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-huntsman-rugged.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-huntsman-rugged.img", pos: { x: 2.5, y: -35.5 }, rot: 0.82, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, bowie: { name: "Bowie", type: "melee", quality: 0, autoAttack: false, switchDelay: 0.25, damage: 24, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, noDropOnDeath: true, attack: { offset: { x: 1.35, y: 0 }, rad: 0.9, damageTimes: [0.1], cooldownTime: 0.25 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["cut", "thrust"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-bowie-vintage.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-bowie-vintage.img", pos: { x: -0.5, y: -32.5 }, rot: 0.785, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, machete: { name: "Machete", type: "melee", quality: 1, cleave: true, autoAttack: false, switchDelay: 0.25, damage: 33, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, attack: { offset: { x: 1.5, y: 0 }, rad: 1.75, damageTimes: [0.12], cooldownTime: 0.3 }, speed: { equip: 1 }, anim: { idlePose: "machete", attackAnims: ["cutReverse"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-machete-taiga.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-machete-taiga.img", pos: { x: -2.5, y: -48.5 }, rot: 1.885, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, saw: { name: "Saw", type: "melee", quality: 1, cleave: true, autoAttack: false, switchDelay: 0.25, damage: 44, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, attack: { offset: { x: 2, y: 0 }, rad: 1.75, damageTimes: [0.1, 0.5], cooldownTime: 0.7 }, speed: { equip: 1 }, anim: { idlePose: "machete", attackAnims: ["sawSwing"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "knife_deploy_01", playerHit: "knife_hit_01", playerHit2: "saw_hit_01" }, lootImg: { sprite: "loot-melee-bonesaw-rusted.img", mirror: true, tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-bonesaw-rusted.img", pos: { x: -2.5, y: -48.5 }, rot: 1.885, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, woodaxe: { name: "Wood Axe", type: "melee", quality: 0, armorPiercing: true, autoAttack: false, switchDelay: 0.25, damage: 36, obstacleDamage: 1.92, headshotMult: 1, attack: { offset: { x: 1.35, y: 0 }, rad: 1, damageTimes: [0.18], cooldownTime: 0.36 }, speed: { equip: 1 }, anim: { idlePose: "meleeTwoHanded", attackAnims: ["axeSwing"] }, sound: { pickup: "heavy_pickup_01", swing: "heavy_swing_01", deploy: "stow_weapon_01", playerHit: "axe_hit_01" }, lootImg: { sprite: "loot-melee-woodaxe.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-woodaxe.img", pos: { x: -12.5, y: -16 }, rot: 1.2, scale: { x: 0.35, y: 0.35 }, tint: 16777215, leftHandOntop: true } }, fireaxe: { name: "Fire Axe", type: "melee", quality: 1, armorPiercing: true, autoAttack: false, switchDelay: 0.25, damage: 44, obstacleDamage: 2.4, headshotMult: 1, attack: { offset: { x: 1.35, y: 0 }, rad: 1, damageTimes: [0.21], cooldownTime: 0.42 }, speed: { equip: 1 }, anim: { idlePose: "meleeTwoHanded", attackAnims: ["axeSwing"] }, sound: { pickup: "heavy_pickup_01", swing: "heavy_swing_01", deploy: "stow_weapon_01", playerHit: "axe_hit_01" }, lootImg: { sprite: "loot-melee-fireaxe.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-fireaxe.img", pos: { x: -12.5, y: -4 }, rot: 1.2, scale: { x: 0.35, y: 0.35 }, tint: 16777215, leftHandOntop: true } }, katana: { name: "Katana", type: "melee", quality: 0, armorPiercing: true, cleave: true, autoAttack: false, switchDelay: 0.25, damage: 40, obstacleDamage: 1.5, headshotMult: 1, attack: { offset: { x: 1.75, y: 0 }, rad: 2, damageTimes: [0.2], cooldownTime: 0.4 }, speed: { equip: 1 }, anim: { idlePose: "meleeKatana", attackAnims: ["katanaSwing"] }, sound: { pickup: "frag_pickup_01", swing: "medium_swing_01", deploy: "stow_weapon_01", playerHit: "knife_hit_01" }, lootImg: { sprite: "loot-melee-katana.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-katana.img", pos: { x: 52.5, y: -2 }, rot: 3, scale: { x: 0.35, y: 0.35 }, tint: 16777215, leftHandOntop: true } }, naginata: { name: "Naginata", type: "melee", quality: 1, armorPiercing: true, cleave: true, autoAttack: false, switchDelay: 0.25, damage: 56, obstacleDamage: 1.92, headshotMult: 1, attack: { offset: { x: 3.5, y: 0 }, rad: 2, damageTimes: [0.27], cooldownTime: 0.54 }, speed: { equip: 1 }, anim: { idlePose: "meleeNaginata", attackAnims: ["naginataSwing"] }, sound: { pickup: "heavy_pickup_01", swing: "heavy_swing_01", deploy: "stow_weapon_01", playerHit: "axe_hit_01" }, lootImg: { sprite: "loot-melee-naginata.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-naginata.img", pos: { x: 42.5, y: -3 }, rot: 1.9, scale: { x: 0.35, y: 0.35 }, tint: 16777215, leftHandOntop: true } }, stonehammer: { name: "Stone Hammer", type: "melee", quality: 1, armorPiercing: true, stonePiercing: true, autoAttack: false, switchDelay: 0.25, damage: 60, obstacleDamage: 1.92, headshotMult: 1, attack: { offset: { x: 1.35, y: 0 }, rad: 1.25, damageTimes: [0.25], cooldownTime: 0.5 }, speed: { equip: 1 }, anim: { idlePose: "meleeTwoHanded", attackAnims: ["hammerSwing"] }, sound: { pickup: "heavy_pickup_01", swing: "heavy_swing_01", deploy: "stow_weapon_01", playerHit: "hammer_hit_01" }, lootImg: { sprite: "loot-melee-stonehammer.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, mirror: true, rot: 2.35619 }, worldImg: { sprite: "loot-melee-stonehammer.img", pos: { x: -12.5, y: -4 }, rot: 1.2, scale: { x: 0.35, y: 0.35 }, tint: 16777215, leftHandOntop: true } }, hook: { name: "Hook", type: "melee", quality: 1, autoAttack: true, switchDelay: 0.25, damage: 18, obstacleDamage: 1, headshotMult: 1, attack: { offset: { x: 1.5, y: 0 }, rad: 1, damageTimes: [0.075], cooldownTime: 0.175 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["hook"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "stow_weapon_01", playerHit: "hook_hit_01" }, lootImg: { sprite: "loot-melee-hook-silver.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-hook-silver.img", pos: { x: 0, y: -27 }, rot: 0.5 * Math.PI, scale: { x: 0.35, y: 0.35 }, tint: 16777215, renderOnHand: true } }, pan: { name: "Pan", type: "melee", quality: 1, autoAttack: false, switchDelay: 0.25, damage: 60, obstacleDamage: 0.8, headshotMult: 1, attack: { offset: { x: 2, y: 0 }, rad: 1.5, damageTimes: [0.15], cooldownTime: 0.5 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["pan"] }, sound: { pickup: "pan_pickup_01", swing: "heavy_swing_01", deploy: "pan_pickup_01", playerHit: "pan_hit_01", bullet: "pan_bullet" }, lootImg: { sprite: "loot-melee-pan-black.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: -0.785 }, worldImg: { sprite: "loot-melee-pan-black-side.img", pos: { x: 0, y: -40 }, rot: 1.125, scale: { x: 0.35, y: 0.35 }, tint: 16777215 }, hipImg: { sprite: "loot-melee-pan-black-side.img", pos: { x: -17.25, y: 7.5 }, rot: 0.78 * Math.PI, scale: { x: 0.3, y: 0.3 }, tint: 16777215 }, reflectSurface: { equipped: { p0: { x: 2.65, y: -0.125 }, p1: { x: 1.35, y: -0.74 } }, unequipped: { p0: { x: -0.625, y: -1.2 }, p1: { x: -1.4, y: -0.25 } } } }, spade: { name: "Spade", type: "melee", quality: 1, cleave: false, autoAttack: false, switchDelay: 0.25, damage: 40, obstacleDamage: 1, headshotMult: 1, noPotatoSwap: true, attack: { offset: { x: 1.75, y: 0 }, rad: 1.5, damageTimes: [0.12], cooldownTime: 0.35 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["cut", "thrust"] }, sound: { pickup: "heavy_pickup_01", swing: "knife_swing_01", deploy: "stow_weapon_01", playerHit: "spade_hit_01" }, lootImg: { sprite: "loot-melee-spade-assault.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-spade-assault.img", pos: { x: -0.5, y: -41.5 }, rot: 1, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } }, crowbar: { name: "Crowbar", type: "melee", quality: 1, cleave: false, autoAttack: false, switchDelay: 0.25, damage: 33, obstacleDamage: 1.4, headshotMult: 1, noPotatoSwap: true, attack: { offset: { x: 1.25, y: 0 }, rad: 1.25, damageTimes: [0.12], cooldownTime: 0.3 }, speed: { equip: 1 }, anim: { idlePose: "fists", attackAnims: ["cut", "cutReverseShort"] }, sound: { pickup: "frag_pickup_01", swing: "knife_swing_01", deploy: "frag_pickup_01", playerHit: "crowbar_hit_01" }, lootImg: { sprite: "loot-melee-crowbar-recon.img", tint: 16777215, border: "loot-circle-outer-02.img", borderTint: 16777215, scale: 0.3, rot: 0.785 }, worldImg: { sprite: "loot-melee-crowbar-recon.img", pos: { x: -1, y: -10 }, rot: 1, scale: { x: 0.35, y: 0.35 }, tint: 16777215 } } }; const SkinDefs$4 = { fists: defineMeleeSkin("fists", { name: "Fists", rarity: 0, lore: "The old one-two." }), knuckles_rusted: defineMeleeSkin("knuckles", { name: "Knuckles Rusted", rarity: 2, lore: "Rust up for the dust up.", noPotatoSwap: false, lootImg: { sprite: "loot-melee-knuckles-rusted.img" }, worldImg: { sprite: "loot-melee-knuckles-rusted.img" } }), knuckles_heroic: defineMeleeSkin("knuckles", { name: "Knuckles Heroic", rarity: 3, lore: "Give 'em a hero sandwich.", noPotatoSwap: false, lootImg: { sprite: "loot-melee-knuckles-heroic.img" }, worldImg: { sprite: "loot-melee-knuckles-heroic.img" } }), karambit_rugged: defineMeleeSkin("karambit", { name: "Karambit Rugged", rarity: 3, noPotatoSwap: false, anim: { idlePose: "slash", attackAnims: ["slash", "fists"] }, lootImg: { sprite: "loot-melee-karambit-rugged.img" }, worldImg: { sprite: "loot-melee-karambit-rugged.img" } }), karambit_prismatic: defineMeleeSkin("karambit", { name: "Karambit Prismatic", rarity: 4, noPotatoSwap: false, lootImg: { sprite: "loot-melee-karambit-prismatic.img" }, worldImg: { sprite: "loot-melee-karambit-prismatic.img" } }), karambit_drowned: defineMeleeSkin("karambit", { name: "Karambit Drowned", rarity: 4, noPotatoSwap: false, lootImg: { sprite: "loot-melee-karambit-drowned.img" }, worldImg: { sprite: "loot-melee-karambit-drowned.img" } }), bayonet_rugged: defineMeleeSkin("bayonet", { name: "Bayonet Rugged", rarity: 3, noPotatoSwap: false, lootImg: { sprite: "loot-melee-bayonet-rugged.img" }, worldImg: { sprite: "loot-melee-bayonet-rugged.img" } }), bayonet_woodland: defineMeleeSkin("bayonet", { name: "Bayonet Woodland", rarity: 4, noPotatoSwap: false, lootImg: { sprite: "loot-melee-bayonet-woodland.img" }, worldImg: { sprite: "loot-melee-bayonet-woodland.img" } }), huntsman_rugged: defineMeleeSkin("huntsman", { name: "Huntsman Rugged", rarity: 3, noPotatoSwap: false, lootImg: { sprite: "loot-melee-huntsman-rugged.img" }, worldImg: { sprite: "loot-melee-huntsman-rugged.img" } }), huntsman_burnished: defineMeleeSkin("huntsman", { name: "Huntsman Burnished", rarity: 4, noPotatoSwap: false, lootImg: { sprite: "loot-melee-huntsman-burnished.img" }, worldImg: { sprite: "loot-melee-huntsman-burnished.img" } }), bowie_vintage: defineMeleeSkin("bowie", { name: "Bowie Vintage", rarity: 3, noPotatoSwap: false, lootImg: { sprite: "loot-melee-bowie-vintage.img" }, worldImg: { sprite: "loot-melee-bowie-vintage.img" } }), bowie_frontier: defineMeleeSkin("bowie", { name: "Bowie Frontier", rarity: 4, noPotatoSwap: false, lootImg: { sprite: "loot-melee-bowie-frontier.img" }, worldImg: { sprite: "loot-melee-bowie-frontier.img" } }), machete_taiga: defineMeleeSkin("machete", { name: "UVSR Taiga", noPotatoSwap: false, lootImg: { sprite: "loot-melee-machete-taiga.img" }, worldImg: { sprite: "loot-melee-machete-taiga.img" } }), kukri_trad: defineMeleeSkin("machete", { name: "Tallow's Kukri", noPotatoSwap: false, lootImg: { sprite: "loot-melee-kukri-trad.img" }, worldImg: { sprite: "loot-melee-kukri-trad.img", pos: { x: -0.5, y: -46.5 } } }), bonesaw_rusted: defineMeleeSkin("saw", { name: "Bonesaw Rusted", noPotatoSwap: false, lootImg: { sprite: "loot-melee-bonesaw-rusted.img" }, worldImg: { sprite: "loot-melee-bonesaw-rusted.img" } }), woodaxe_bloody: defineMeleeSkin("woodaxe", { name: "Axe Bloodstained", lootImg: { sprite: "loot-melee-woodaxe-bloody.img" }, worldImg: { sprite: "loot-melee-woodaxe-bloody.img" } }), katana_rusted: defineMeleeSkin("katana", { name: "Katana Rusted", lootImg: { sprite: "loot-melee-katana-rusted.img" }, worldImg: { sprite: "loot-melee-katana-rusted.img" } }), katana_orchid: defineMeleeSkin("katana", { name: "Katana Orchid", quality: 1, lootImg: { sprite: "loot-melee-katana-orchid.img" }, worldImg: { sprite: "loot-melee-katana-orchid.img" } }), sledgehammer: defineMeleeSkin("stonehammer", { name: "Sledgehammer", lootImg: { sprite: "loot-melee-sledgehammer.img" }, worldImg: { sprite: "loot-melee-sledgehammer.img", pos: { x: -12.5, y: -3.5 } } }), crowbar_scout: defineMeleeSkin("crowbar", { name: "Scouting Crowbar", noPotatoSwap: false }), crowbar_recon: defineMeleeSkin("crowbar", { name: "Crowbar Carbon", noPotatoSwap: false, lootImg: { sprite: "loot-melee-crowbar-recon.img" }, worldImg: { sprite: "loot-melee-crowbar-recon.img" } }), kukri_sniper: defineMeleeSkin("machete", { name: "Marksman's Recurve", noPotatoSwap: false, lootImg: { sprite: "loot-melee-kukri-sniper.img" }, worldImg: { sprite: "loot-melee-kukri-sniper.img", pos: { x: -0.5, y: -46.5 } } }), bonesaw_healer: defineMeleeSkin("saw", { name: "The Separator", noPotatoSwap: false, lootImg: { sprite: "loot-melee-bonesaw-healer.img" }, worldImg: { sprite: "loot-melee-bonesaw-healer.img" } }), katana_demo: defineMeleeSkin("katana", { name: "Hakai no Katana", lootImg: { sprite: "loot-melee-katana-demo.img" }, worldImg: { sprite: "loot-melee-katana-demo.img" } }), spade_assault: defineMeleeSkin("spade", { name: "Trench Spade", noPotatoSwap: false }), warhammer_tank: defineMeleeSkin("stonehammer", { name: "Panzerhammer", damage: 64, attack: { offset: { x: 1.5, y: 0 }, rad: 1.75, damageTimes: [0.3], cooldownTime: 0.6 }, lootImg: { sprite: "loot-melee-warhammer-tank.img" }, worldImg: { sprite: "loot-melee-warhammer-tank.img", pos: { x: -10.5, y: -3 } } }) }; const MeleeDefs = { ...BaseDefs$4, ...SkinDefs$4 }; function defineOutfitSkin(baseType, params) { return defineSkin$1(BaseDefs$3, baseType, params); } const BaseDefs$3 = { outfitBase: { name: "Basic Outfit", type: "outfit", skinImg: { baseTint: 16303476, baseSprite: "player-base-01.img", handTint: 16303476, handSprite: "player-hands-01.img", footTint: 16303476, footSprite: "player-feet-01.img", backpackTint: 8480055, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "clothes_pickup_01" } } }; const SkinDefs$3 = { outfitBase: defineOutfitSkin("outfitBase", { noDropOnDeath: true, name: "Basic Outfit", rarity: 0, lore: "Pure and simple.", lootImg: { sprite: "loot-shirt-outfitBase.img", tint: 16777215 } }), outfitDemo: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 13068903, baseSprite: "player-base-02.img", handTint: 11882573, handSprite: "player-hands-02.img", footTint: 11882573, footSprite: "player-feet-02.img", backpackTint: 10368820, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitTank: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 15382883, baseSprite: "player-base-02.img", handTint: 14197835, handSprite: "player-hands-02.img", footTint: 14197835, footSprite: "player-feet-02.img", backpackTint: 12553007, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitMedic: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 14449116, baseSprite: "player-base-02.img", handTint: 12866756, handSprite: "player-hands-02.img", footTint: 12866756, footSprite: "player-feet-02.img", backpackTint: 11089833, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitScout: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 11326819, baseSprite: "player-base-02.img", handTint: 9880138, handSprite: "player-hands-02.img", footTint: 9880138, footSprite: "player-feet-02.img", backpackTint: 8630324, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitSniper: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 9293531, baseSprite: "player-base-02.img", handTint: 7387849, handSprite: "player-hands-02.img", footTint: 7387849, footSprite: "player-feet-02.img", backpackTint: 5415860, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitAssault: defineOutfitSkin("outfitBase", { noDrop: true, skinImg: { baseTint: 14339929, baseSprite: "player-base-02.img", handTint: 13024064, handSprite: "player-hands-02.img", footTint: 13024064, footSprite: "player-feet-02.img", backpackTint: 10918952, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16777215 } }), outfitTurkey: defineOutfitSkin("outfitBase", { name: "Fowl Facade", noDropOnDeath: true, skinImg: { baseTint: 15781563, baseSprite: "player-base-outfitTurkey.img", handTint: 10818304, handSprite: "player-hands-02.img", footTint: 10818304, footSprite: "player-feet-02.img", backpackTint: 11031846, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitTurkey.img", tint: 15781563 }, rarity: 3, lore: "M1100 not included." }), outfitDev: defineOutfitSkin("outfitBase", { name: "Developer Swag", noDropOnDeath: true, skinImg: { baseTint: 3442216, baseSprite: "player-base-outfitDC.img", handTint: 6937122, handSprite: "player-hands-02.img", footTint: 6937122, footSprite: "player-feet-02.img", backpackTint: 2902793, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitDev.img", tint: 16777215 }, rarity: 5, lore: "Two-time limited edition print." }), outfitMod: defineOutfitSkin("outfitBase", { name: "Discord Moderatr", noDropOnDeath: true, skinImg: { baseTint: 3380187, baseSprite: "player-base-outfitDC.img", handTint: 9684974, handSprite: "player-hands-02.img", footTint: 9684974, footSprite: "player-feet-02.img", backpackTint: 1529478, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitMod.img", tint: 16777215 }, rarity: 3, lore: "For those who wield the power of the pan." }), outfitWheat: defineOutfitSkin("outfitBase", { name: "Splintered Wheat", skinImg: { baseTint: 16777215, baseSprite: "player-base-outfitWheat.img", handTint: 15785362, handSprite: "player-hands-01.img", footTint: 15785362, footSprite: "player-feet-01.img", backpackTint: 13346845, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitWheat.img", tint: 16777215 } }), outfitNoir: defineOutfitSkin("outfitBase", { name: "Neo Noir", skinImg: { baseTint: 1776411, baseSprite: "player-base-02.img", handTint: 16777215, handSprite: "player-hands-02.img", footTint: 16777215, footSprite: "player-feet-02.img", backpackTint: 7829367, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 1776411 } }), outfitRedLeaderAged: defineOutfitSkin("outfitBase", { name: "Weathered Red", skinImg: { baseTint: 10098712, baseSprite: "player-base-02.img", handTint: 16711680, handSprite: "player-hands-02.img", footTint: 16711680, footSprite: "player-feet-02.img", backpackTint: 5442572, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 10098712 } }), outfitBlueLeaderAged: defineOutfitSkin("outfitBase", { name: "Stifled Blue", skinImg: { baseTint: 1523353, baseSprite: "player-base-02.img", handTint: 20223, handSprite: "player-hands-02.img", footTint: 20223, footSprite: "player-feet-02.img", backpackTint: 794700, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 1523353 } }), outfitRedLeader: defineOutfitSkin("outfitBase", { name: "Red Leader", noDrop: true, skinImg: { baseTint: 10158080, baseSprite: "player-base-02.img", handTint: 16711680, handSprite: "player-hands-02.img", footTint: 16711680, footSprite: "player-feet-02.img", backpackTint: 5439488, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 8650752 } }), outfitBlueLeader: defineOutfitSkin("outfitBase", { name: "Blue Leader", noDrop: true, skinImg: { baseTint: 12187, baseSprite: "player-base-02.img", handTint: 20223, handSprite: "player-hands-02.img", footTint: 20223, footSprite: "player-feet-02.img", backpackTint: 5964, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 13223 } }), outfitSpetsnaz: defineOutfitSkin("outfitBase", { name: "Siberian Assault", skinImg: { baseTint: 16777215, baseSprite: "player-base-outfitSpetsnaz.img", handTint: 15000804, handSprite: "player-hands-01.img", footTint: 15000804, footSprite: "player-feet-01.img", backpackTint: 13816530, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitSpetsnaz.img", tint: 16777215 } }), outfitWoodsCloak: defineOutfitSkin("outfitBase", { name: "Greencloak", skinImg: { baseTint: 2817792, baseSprite: "player-base-02.img", handTint: 16711594, handSprite: "player-hands-02.img", footTint: 16711594, footSprite: "player-feet-02.img", backpackTint: 15635271, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 2817792 } }), outfitElf: defineOutfitSkin("outfitBase", { name: "Tallow's Little Helper", skinImg: { baseTint: 12845056, baseSprite: "player-base-01.img", handTint: 1489152, handSprite: "player-hands-01.img", footTint: 1489152, footSprite: "player-feet-01.img", backpackTint: 365312, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 1489152 } }), outfitImperial: defineOutfitSkin("outfitBase", { name: "Imperial Seal", skinImg: { baseTint: 12320813, baseSprite: "player-base-01.img", handTint: 16777215, handSprite: "player-hands-01.img", footTint: 16777215, footSprite: "player-feet-01.img", backpackTint: 12625727, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 12320813 } }), outfitLumber: defineOutfitSkin("outfitBase", { name: "Woodcutter's Wrap", skinImg: { baseTint: 16777215, baseSprite: "player-base-outfitLumber.img", handTint: 8258312, handSprite: "player-hands-02.img", footTint: 8258312, footSprite: "player-feet-02.img", backpackTint: 4854547, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitLumber.img", tint: 16777215 } }), outfitVerde: defineOutfitSkin("outfitBase", { name: "Poncho Verde", skinImg: { baseTint: 1785868, baseSprite: "player-base-02.img", handTint: 11912587, handSprite: "player-hands-02.img", footTint: 11912587, footSprite: "player-feet-02.img", backpackTint: 11238441, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 1785868 } }), outfitPineapple: defineOutfitSkin("outfitBase", { name: "Valiant Pineapple", skinImg: { baseTint: 10027008, baseSprite: "player-base-02.img", handTint: 4985105, handSprite: "player-hands-02.img", footTint: 4985105, footSprite: "player-feet-02.img", backpackTint: 16763904, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 10027008 } }), outfitTarkhany: defineOutfitSkin("outfitBase", { name: "Tarkhany Regal", skinImg: { baseTint: 4927107, baseSprite: "player-base-02.img", handTint: 16757760, handSprite: "player-hands-02.img", footTint: 16757760, footSprite: "player-feet-02.img", backpackTint: 4661344, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 4927107 } }), outfitWaterElem: defineOutfitSkin("outfitBase", { name: "Water Elemental", skinImg: { baseTint: 7143401, baseSprite: "player-base-02.img", handTint: 15990876, handSprite: "player-hands-02.img", footTint: 15990876, footSprite: "player-feet-02.img", backpackTint: 32644, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 7143401 } }), outfitHeaven: defineOutfitSkin("outfitBase", { name: "Celestial Garb", skinImg: { baseTint: 16777215, baseSprite: "player-base-outfitHeaven.img", handTint: 13762639, handSprite: "player-hands-02.img", footTint: 13762639, footSprite: "player-feet-02.img", backpackTint: 36503, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitHeaven.img", tint: 16777215 } }), outfitMeteor: defineOutfitSkin("outfitBase", { name: "Falling Star", skinImg: { baseTint: 9764864, baseSprite: "player-base-02.img", handTint: 16742400, handSprite: "player-hands-02.img", footTint: 16742400, footSprite: "player-feet-02.img", backpackTint: 4727582, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 9764864 } }), outfitIslander: defineOutfitSkin("outfitBase", { name: "Island Time", skinImg: { baseTint: 16762368, baseSprite: "player-base-01.img", handTint: 148992, handSprite: "player-hands-01.img", footTint: 148992, footSprite: "player-feet-01.img", backpackTint: 4495104, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16762368 } }), outfitAqua: defineOutfitSkin("outfitBase", { name: "Aquatic Avenger", skinImg: { baseTint: 47778, baseSprite: "player-base-01.img", handTint: 65502, handSprite: "player-hands-01.img", footTint: 65502, footSprite: "player-feet-01.img", backpackTint: 536620, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 47778 } }), outfitCoral: defineOutfitSkin("outfitBase", { name: "Coral Guise", skinImg: { baseTint: 16736103, baseSprite: "player-base-01.img", handTint: 16746895, handSprite: "player-hands-01.img", footTint: 16746895, footSprite: "player-feet-01.img", backpackTint: 16772298, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16736103 } }), outfitKhaki: defineOutfitSkin("outfitBase", { name: "The Initiative", rarity: 1, skinImg: { baseTint: 12824197, baseSprite: "player-base-02.img", handTint: 9404516, handSprite: "player-hands-02.img", footTint: 9404516, footSprite: "player-feet-02.img", backpackTint: 4208940, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 12824197 } }), outfitParma: defineOutfitSkin("outfitBase", { name: "PARMA Jumpsuit", noDropOnDeath: true, rarity: 1, lore: "Next generation inversion.", skinImg: { baseTint: 8746585, baseSprite: "player-base-01.img", handTint: 12824197, handSprite: "player-hands-01.img", footTint: 12824197, footSprite: "player-feet-01.img", backpackTint: 4208940, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitParma.img", tint: 16777215 } }), outfitParmaPrestige: defineOutfitSkin("outfitBase", { name: "The Core Jumpsuit", noDropOnDeath: true, rarity: 3, lore: "Special issue for staffers at Bunker 1.", skinImg: { baseTint: 14925953, baseSprite: "player-base-outfitParmaPrestige.img", handTint: 11113323, handSprite: "player-hands-02.img", footTint: 11113323, footSprite: "player-feet-02.img", backpackTint: 6640177, backpackSprite: "player-circle-base-02.img" }, lootImg: { sprite: "loot-shirt-outfitParmaPrestige.img", tint: 16777215 } }), outfitCasanova: defineOutfitSkin("outfitBase", { name: "Casanova Silks", skinImg: { baseTint: 4327436, baseSprite: "player-base-01.img", handTint: 7602183, handSprite: "player-hands-01.img", footTint: 7602183, footSprite: "player-feet-01.img", backpackTint: 1052688, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 4327436 } }), outfitPrisoner: defineOutfitSkin("outfitBase", { name: "The New Black", skinImg: { baseTint: 16735266, baseSprite: "player-base-01.img", handTint: 16545059, handSprite: "player-hands-01.img", footTint: 16545059, footSprite: "player-feet-01.img", backpackTint: 16756224, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 16735266 } }), outfitJester: defineOutfitSkin("outfitBase", { name: "Jester's Folly", skinImg: { baseTint: 7798904, baseSprite: "player-base-01.img", handTint: 4915276, handSprite: "player-hands-01.img", footTint: 4915276, footSprite: "player-feet-01.img", backpackTint: 936960, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 7798904 } }), outfitWoodland: defineOutfitSkin("outfitBase", { name: "Woodland Combat", rarity: 1, lore: "Common component of PARMA survival caches.", skinImg: { baseTint: 2831146, baseSprite: "player-base-01.img", handTint: 5925970, handSprite: "player-hands-01.img", footTint: 5925970, footSprite: "player-feet-01.img", backpackTint: 5056e3, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitWoodland.img", tint: 16777215 } }), outfitRoyalFortune: defineOutfitSkin("outfitBase", { name: "Royal Fortune", rarity: 3, skinImg: { baseTint: 8333091, baseSprite: "player-base-01.img", handTint: 15254058, handSprite: "player-hands-01.img", footTint: 15254058, footSprite: "player-feet-01.img", backpackTint: 9981696, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitRoyalFortune.img", tint: 16777215 } }), outfitKeyLime: defineOutfitSkin("outfitBase", { name: "Key Lime", rarity: 1, lore: "Not for eating.", skinImg: { baseTint: 13107007, baseSprite: "player-base-01.img", handTint: 15662941, handSprite: "player-hands-01.img", footTint: 15662941, footSprite: "player-feet-01.img", backpackTint: 12355383, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitKeyLime.img", tint: 16777215 } }), outfitCobaltShell: defineOutfitSkin("outfitBase", { name: "Cobalt Shell", rarity: 1, lore: "It means bluish.", skinImg: { baseTint: 11095, baseSprite: "player-base-01.img", handTint: 2711164, handSprite: "player-hands-01.img", footTint: 2711164, footSprite: "player-feet-01.img", backpackTint: 19093, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitCobaltShell.img", tint: 16777215 } }), outfitCarbonFiber: defineOutfitSkin("outfitBase", { name: "Carbon Fiber", noDropOnDeath: true, rarity: 2, lore: "Military-grade, fine spun filament.", skinImg: { baseTint: 2171169, baseSprite: "player-base-01.img", handTint: 1842204, handSprite: "player-hands-01.img", footTint: 1842204, footSprite: "player-feet-01.img", backpackTint: 3552822, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitCarbonFiber.img", tint: 16777215 } }), outfitDarkGloves: defineOutfitSkin("outfitBase", { name: "The Professional", noDropOnDeath: true, rarity: 2, lore: "True survivrs wear the dark gloves.", skinImg: { baseTint: 16303476, baseSprite: "player-base-01.img", handTint: 12482560, handSprite: "player-hands-01.img", footTint: 12482560, footSprite: "player-feet-01.img", backpackTint: 10708736, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitDarkGloves.img", tint: 16777215 } }), outfitDarkShirt: defineOutfitSkin("outfitBase", { name: "The Semi-Pro", noDropOnDeath: true, rarity: 1, lore: "Some survivrs wear the dark shirt.", skinImg: { baseTint: 12482560, baseSprite: "player-base-01.img", handTint: 16303476, handSprite: "player-hands-01.img", footTint: 16303476, footSprite: "player-feet-01.img", backpackTint: 15183443, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitDarkShirt.img", tint: 16777215 } }), outfitGhillie: defineOutfitSkin("outfitBase", { name: "Ghillie Suit", ghillie: true, skinImg: { baseTint: 8630096, baseSprite: "player-base-01.img", handTint: 8630096, handSprite: "player-hands-01.img", footTint: 8630096, footSprite: "player-feet-01.img", backpackTint: 6697728, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-01.img", tint: 8630096 } }), outfitDesertCamo: defineOutfitSkin("outfitBase", { name: "Desert Camo", rarity: 1, skinImg: { baseTint: 13736782, baseSprite: "player-base-01.img", handTint: 11169046, handSprite: "player-hands-01.img", footTint: 11169046, footSprite: "player-feet-01.img", backpackTint: 16763778, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitDesertCamo.img", tint: 16777215 } }), outfitCamo: defineOutfitSkin("outfitBase", { name: "Forest Camo", rarity: 1, lore: "Be one with the trees.", skinImg: { baseTint: 10066278, baseSprite: "player-base-01.img", handTint: 8684631, handSprite: "player-hands-01.img", footTint: 8684631, footSprite: "player-feet-01.img", backpackTint: 6710835, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitCamo.img", tint: 16777215 } }), outfitRed: defineOutfitSkin("outfitBase", { name: "Target Practice", noDropOnDeath: true, rarity: 1, lore: "On the plus side, they won't see you bleed.", skinImg: { baseTint: 16711680, baseSprite: "player-base-01.img", handTint: 13893632, handSprite: "player-hands-01.img", footTint: 13893632, footSprite: "player-feet-01.img", backpackTint: 11993088, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitRed.img", tint: 16777215 } }), outfitWhite: defineOutfitSkin("outfitBase", { name: "Arctic Avenger", noDropOnDeath: true, rarity: 1, lore: "No business like snow business.", skinImg: { baseTint: 14935011, baseSprite: "player-base-01.img", handTint: 15658734, handSprite: "player-hands-01.img", footTint: 15658734, footSprite: "player-feet-01.img", backpackTint: 14474460, backpackSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-shirt-outfitWhite.img", tint: 16777215 } }), outfitBarrel: defineOutfitSkin("outfitBase", { name: "Barrel Costume", obstacleType: "barrel_01", baseScale: 0.8, lootImg: { tint: 3750201 } }), outfitWoodBarrel: defineOutfitSkin("outfitBase", { name: "Wood Barrel Costume", obstacleType: "barrel_02", baseScale: 1, lootImg: { tint: 11235106 } }), outfitStone: defineOutfitSkin("outfitBase", { name: "Stone Costume", obstacleType: "stone_01", baseScale: 0.9, lootImg: { tint: 7434609 } }), outfitTree: defineOutfitSkin("outfitBase", { name: "Tree Costume", obstacleType: "tree_07", baseScale: 1, lootImg: { tint: 4599058 } }), outfitTreeSpooky: defineOutfitSkin("outfitBase", { name: "Spooky Tree Costume", obstacleType: "tree_05", baseScale: 1, lootImg: { tint: 1775895 } }), outfitStump: defineOutfitSkin("outfitBase", { name: "Stump Costume", obstacleType: "tree_09", baseScale: 1, lootImg: { tint: 8602624 } }), outfitBush: defineOutfitSkin("outfitBase", { name: "Bush Costume", obstacleType: "bush_01b", baseScale: 1, lootImg: { tint: 3889951 } }), outfitLeafPile: defineOutfitSkin("outfitBase", { name: "Leaf Pile Costume", obstacleType: "bush_06b", baseScale: 1, lootImg: { tint: 16731392 } }), outfitCrate: defineOutfitSkin("outfitBase", { name: "Crate Costume", obstacleType: "crate_01", baseScale: 1, lootImg: { tint: 6697728 } }), outfitTable: defineOutfitSkin("outfitBase", { name: "Table Costume", obstacleType: "table_01", baseScale: 1, lootImg: { tint: 6697728 } }), outfitSoviet: defineOutfitSkin("outfitBase", { name: "Soviet Costume", obstacleType: "crate_02", baseScale: 1, lootImg: { tint: 6697728 } }), outfitAirdrop: defineOutfitSkin("outfitBase", { name: "Air Drop Costume", obstacleType: "crate_10", baseScale: 1, lootImg: { tint: 6579300 } }), outfitOven: defineOutfitSkin("outfitBase", { name: "Oven Costume", obstacleType: "oven_01", baseScale: 1, lootImg: { tint: 14935011 } }), outfitRefrigerator: defineOutfitSkin("outfitBase", { name: "Fridge Costume", obstacleType: "refrigerator_01b", baseScale: 1, lootImg: { tint: 7733259 } }), outfitVending: defineOutfitSkin("outfitBase", { name: "Vending Costume", obstacleType: "vending_01", baseScale: 1, lootImg: { tint: 10925 } }), outfitPumpkin: defineOutfitSkin("outfitBase", { name: "Pumpkin Costume", obstacleType: "pumpkin_01", baseScale: 1, lootImg: { tint: 15889667 } }), outfitWoodpile: defineOutfitSkin("outfitBase", { name: "Woodpile Costume", obstacleType: "woodpile_01", baseScale: 1, lootImg: { tint: 9455616 } }), outfitToilet: defineOutfitSkin("outfitBase", { name: "Toilet Costume", obstacleType: "toilet_02", baseScale: 1, lootImg: { tint: 16777215 } }), outfitBushRiver: defineOutfitSkin("outfitBase", { name: "River Bush Costume", obstacleType: "bush_04", baseScale: 1, lootImg: { tint: 5339946 } }), outfitCrab: defineOutfitSkin("outfitBase", { name: "Crab Pot Costume", obstacleType: "crate_20", baseScale: 1, lootImg: { tint: 16592920 } }), outfitStumpAxe: defineOutfitSkin("outfitBase", { name: "Stump Axe Costume", obstacleType: "tree_02h", baseScale: 1, lootImg: { tint: 11100701 } }) }; const OutfitDefs = { ...BaseDefs$3, ...SkinDefs$3 }; const HealEffectDefs = { heal_basic: { type: "heal_effect", name: "Basic Healing", rarity: 0, texture: "part-heal-basic.img", emitter: "heal_basic" }, heal_heart: { type: "heal_effect", name: "Healing Hearts", rarity: 1, texture: "part-heal-heart.img", emitter: "heal_heart" }, heal_moon: { type: "heal_effect", name: "Blood Moon", rarity: 2, texture: "part-heal-moon.img", emitter: "heal_moon" }, heal_tomoe: { type: "heal_effect", name: "Tomoe", rarity: 3, texture: "part-heal-tomoe.img", emitter: "heal_tomoe" }, boost_basic: { type: "boost_effect", name: "Basic Boost", rarity: 0, texture: "part-boost-basic.img", emitter: "boost_basic" }, boost_star: { type: "boost_effect", name: "Starboost", rarity: 1, texture: "part-boost-star.img", emitter: "boost_star" }, boost_naturalize: { type: "boost_effect", name: "Naturalize", rarity: 2, texture: "part-boost-naturalize.img", emitter: "boost_naturalize" }, boost_shuriken: { type: "boost_effect", name: "Shuriken", rarity: 3, texture: "part-boost-shuriken.img", emitter: "boost_shuriken" } }; const UnlockDefs = { unlock_default: { type: "unlock", name: "standard-issue", unlocks: [ "outfitBase", "fists", "heal_basic", "boost_basic", "crosshair_default", "crosshair_001", "crosshair_005", "crosshair_007", "crosshair_086", "crosshair_027", "crosshair_080", "crosshair_098", "crosshair_101", "crosshair_158", "crosshair_094", "crosshair_118", "crosshair_136", "crosshair_160", "crosshair_176", "emote_thumbsup", "emote_sadface", "emote_happyface", "emote_surviv", "emote_gg", "emote_question", "emote_tombstone", "emote_joyface", "emote_sobface", "emote_thinkingface", "emote_flagus", "emote_flagthailand", "emote_flaggermany", "emote_flagfrance", "emote_flagsouthkorea", "emote_flagbrazil", "emote_flagcanada", "emote_flagspain", "emote_flagrussia", "emote_flagmexico", "emote_flagpoland", "emote_flaguk", "emote_flagcolombia", "emote_flagukraine", "emote_flagturkey", "emote_flagphilippines", "emote_flagczechia", "emote_flagperu", "emote_flagaustria", "emote_flagargentina", "emote_flagjapan", "emote_flagvenezuela", "emote_flagvietnam", "emote_flagswitzerland", "emote_flagnetherlands", "emote_flagchina", "emote_flagtaiwan", "emote_flagchile", "emote_flagaustralia", "emote_flagdenmark", "emote_flagitaly", "emote_flagsweden", "emote_flagecuador", "emote_flagslovakia", "emote_flaghungary", "emote_flagromania", "emote_flaghongkong", "emote_flagindonesia", "emote_flagfinland", "emote_flagnorway", "emote_heart", "emote_sleepy", "emote_flex", "emote_angryface", "emote_upsidedownface", "emote_teabag", "emote_alienface", "emote_flagbelarus", "emote_flagbelgium", "emote_flagkazakhstan", "emote_egg", "emote_police", "emote_dabface", "emote_flagmalaysia", "emote_flagnewzealand", "emote_logosurviv", "emote_logoegg", "emote_logoswine", "emote_logohydra", "emote_logostorm", "emote_flaghonduras", "emote_logocaduceus", "emote_impface", "emote_monocleface", "emote_sunglassface", "emote_headshotface", "emote_potato", "emote_leek", "emote_eggplant", "emote_baguette", "emote_chick", "emote_flagbolivia", "emote_flagcroatia", "emote_flagindia", "emote_flagisrael", "emote_flaggeorgia", "emote_flaggreece", "emote_flagguatemala", "emote_flagportugal", "emote_flagserbia", "emote_flagsingapore", "emote_flagtrinidad", "emote_flaguruguay", "emote_logoconch", "emote_pineapple", "emote_coconut", "emote_crab", "emote_whale", "emote_logometeor", "emote_salt", "emote_disappointface", "emote_logocrossing", "emote_fish", "emote_campfire", "emote_chickendinner", "emote_cattle", "emote_icecream", "emote_cupcake", "emote_donut", "emote_logohatchet", "emote_acorn", "emote_trunk", "emote_forest", "emote_pumpkin", "emote_candycorn", "emote_pilgrimhat", "emote_turkeyanimal", "emote_heartface", "emote_logochrysanthemum", "emote_santahat", "emote_snowman", "emote_snowflake", "emote_flagmorocco", "emote_flagestonia", "emote_flagalgeria", "emote_flagegypt", "emote_flagazerbaijan", "emote_flagalbania", "emote_flaglithuania", "emote_flaglatvia", "emote_flaguae", "emote_flagdominicanrepublic", "emote_logocloud", "emote_logotwins" /* use this to unlock everything :) ...new Set([ ...allowedOutfits, ...allowedMeleeSkins, ...allowedEmotes, ...allowedHealEffects, ...Object.keys(CrosshairDefs), ...PassDefs.pass_survivr1.items.map((item) => item.item), ]), */ ] }, unlock_new_account: { type: "unlock", name: "new-account", free: true, unlocks: ["outfitDarkShirt"] } }; class PlayerBarn { constructor() { __publicField(this, "players", /* @__PURE__ */ new Map()); __publicField(this, "playerIds", []); __publicField(this, "playerStatuses", /* @__PURE__ */ new Map()); __publicField(this, "teams", /* @__PURE__ */ new Map()); __publicField(this, "groups", /* @__PURE__ */ new Map()); } getPlayerInfo(playerId) { return this.players.get(playerId); } setPlayerInfo(playerInfo) { this.players.set(playerInfo.playerId, playerInfo); } deletePlayerInfo(playerId) { this.players.delete(playerId); } setPlayerStatus(playerId, newStatus) { const status = this.playerStatuses.get(playerId) || { playerId, pos: v2.copy(newStatus.pos), posTarget: v2.copy(newStatus.pos), posDelta: v2.create(0, 0), health: 100, posInterp: 0, visible: false, dead: false, downed: false, disconnected: false, role: ``, timeSinceUpdate: 0, timeSinceVisible: 0, minimapAlpha: 0, minimapVisible: false }; if (!status.minimapVisible) { status.pos = v2.copy(newStatus.pos); if (!status.visible && newStatus.visible) status.timeSinceVisible = 0; } status.visible = newStatus.visible; if (status.visible) status.timeSinceUpdate = 0; status.posTarget = v2.copy(newStatus.pos); status.posDelta = v2.length(v2.sub(newStatus.pos, status.pos)); status.dead = newStatus.dead; status.downed = newStatus.downed; status.role = newStatus.role; if (newStatus.health !== void 0) status.health = newStatus.health; if (newStatus.disconnected !== void 0) status.disconnected = newStatus.disconnected; this.playerStatuses.set(playerId, status); } updatePlayerStatus(teamId, playerStatus, factionMode) { const team = this.getTeamInfo(teamId); const playerIds = factionMode ? this.playerIds : team.playerIds; if (playerIds.length != playerStatus.players.length) { console.error( `PlayerIds and playerStatus.players out of sync. OurLen: ${playerIds.length} MsgLen: ${playerStatus.players.length} FactionMode: ${factionMode}` ); return; } for (let i = 0; i < playerIds.length; i++) { const playerId = playerIds[i]; const status = playerStatus.players[i]; if (status.hasData) this.setPlayerStatus(playerId, status); } } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type getTeamInfo(teamId) { return this.teams.get(teamId); } // eslint-disable-next-line @typescript-eslint/explicit-function-return-type getGroupInfo(groupId) { return this.groups.get(groupId); } getPlayerStatus(playerId) { return this.playerStatuses.get(playerId); } updateGroupStatus(groupId, groupStatus) { const info = this.getGroupInfo(groupId); if (info.playerIds.length != groupStatus.players.length) { console.error(`PlayerIds and groupStatus.players out of sync`); return; } for (let i = 0; i < info.playerIds.length; i++) { const playerId = info.playerIds[i]; const playerStatus = groupStatus.players[i]; const status = this.getPlayerStatus(playerId); if (status) { status.health = playerStatus.health; status.disconnected = playerStatus.disconnected; } } } getPlayerName(playerId) { const info = this.getPlayerInfo(playerId); return (info == null ? void 0 : info.name) ?? ``; } recomputeTeamData() { this.teams.clear(); this.groups.clear(); const keys = [...this.players.keys()]; for (let i = 0; i < keys.length; i++) { const playerInfo = this.players.get(keys[i]); const playerId = playerInfo.playerId; const teamId = playerInfo.teamId; const teamInfo = this.teams.get(teamId) || { teamId, playerIds: [] }; teamInfo.playerIds.push(playerId); this.teams.set(teamId, teamInfo); const groupId = playerInfo.groupId; const groupInfo = this.groups.get(groupId) || { groupId, playerIds: [] }; groupInfo.playerIds.push(playerId); this.groups.set(groupId, groupInfo); } const teams = [...this.teams.keys()]; for (let i = 0; i < teams.length; i++) { const teamInfo = this.teams.get(teams[i]); teamInfo == null ? void 0 : teamInfo.playerIds.sort((a, b) => a - b); this.teams.set(teams[i], teamInfo); } const groups = [...this.groups.keys()]; for (let i = 0; i < groups.length; i++) { const groupInfo = this.groups.get(groups[i]); groupInfo == null ? void 0 : groupInfo.playerIds.sort((a, b) => a - b); this.groups.set(teams[i], groupInfo); } } } function defineBulletSkin(baseType, params) { return defineSkin$1(BaseDefs$2, baseType, params); } const BaseDefs$2 = { bullet_mp5: { type: "bullet", damage: 11, obstacleDamage: 1, falloff: 0.8, distance: 100, speed: 85, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_ak47: { type: "bullet", damage: 13.5, obstacleDamage: 1, falloff: 0.9, distance: 200, speed: 100, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_scar: { type: "bullet", damage: 15, obstacleDamage: 1, falloff: 0.85, distance: 175, speed: 108, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_an94: { type: "bullet", damage: 17.5, obstacleDamage: 1, falloff: 0.94, distance: 300, speed: 110, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_groza: { type: "bullet", damage: 12.5, obstacleDamage: 1, falloff: 0.85, distance: 175, speed: 104, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_grozas: { type: "bullet", damage: 13, obstacleDamage: 1, falloff: 0.87, distance: 185, speed: 106, variance: 0, shrapnel: false, suppressed: true, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_model94: { type: "bullet", damage: 44, obstacleDamage: 1, falloff: 0.75, distance: 175, speed: 156, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.12, tracerLength: 1 }, bullet_blr: { type: "bullet", damage: 56, obstacleDamage: 1, falloff: 0.9, distance: 400, speed: 160, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.14, tracerLength: 1 }, bullet_mosin: { type: "bullet", damage: 72, obstacleDamage: 1.5, falloff: 0.95, distance: 500, speed: 178, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.16, tracerLength: 1 }, bullet_sv98: { type: "bullet", damage: 80, obstacleDamage: 1.5, falloff: 0.96, distance: 520, speed: 182, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.2, tracerLength: 1 }, bullet_awc: { type: "bullet", damage: 180, obstacleDamage: 1.5, falloff: 0.94, distance: 300, speed: 136, variance: 0, shrapnel: false, suppressed: true, tracerColor: "308sub", tracerWidth: 0.2, tracerLength: 1 }, bullet_scarssr: { type: "bullet", damage: 60, obstacleDamage: 1.5, falloff: 0.85, distance: 200, speed: 108, variance: 0, shrapnel: false, suppressed: true, tracerColor: "308sub", tracerWidth: 0.14, tracerLength: 1 }, bullet_m39: { type: "bullet", damage: 27, obstacleDamage: 1, falloff: 0.9, distance: 400, speed: 125, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_svd: { type: "bullet", damage: 36, obstacleDamage: 1, falloff: 0.9, distance: 425, speed: 127, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_garand: { type: "bullet", damage: 35, obstacleDamage: 1, falloff: 0.9, distance: 400, speed: 130, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.12, tracerLength: 0.9 }, bullet_buckshot: { type: "bullet", damage: 12.5, obstacleDamage: 1, falloff: 0.3, speed: 66, distance: 27, variance: 0, shrapnel: false, tracerColor: "12gauge", tracerWidth: 0.1, tracerLength: 0.8 }, bullet_flechette: { type: "bullet", damage: 8.75, obstacleDamage: 1, falloff: 0.85, speed: 88, distance: 45, variance: 0, shrapnel: false, tracerColor: "12gauge", tracerWidth: 0.075, tracerLength: 0.5 }, bullet_frag: { type: "bullet", damage: 12, obstacleDamage: 1, falloff: 0.3, speed: 72, distance: 24, variance: 0, shrapnel: false, tracerColor: "frag", tracerWidth: 0.1, tracerLength: 0.5, onHit: "explosion_usas" }, bullet_slug: { type: "bullet", damage: 77, obstacleDamage: 1, falloff: 0.85, speed: 118, distance: 60, variance: 0, shrapnel: false, tracerColor: "12gauge", tracerWidth: 0.2, tracerLength: 0.4 }, bullet_birdshot: { type: "bullet", damage: 4, obstacleDamage: 1, falloff: 0.25, speed: 66, distance: 25, variance: 0, shrapnel: false, tracerColor: "12gauge", tracerWidth: 0.1, tracerLength: 0.1 }, bullet_m9: { type: "bullet", damage: 12, obstacleDamage: 1, falloff: 0.7, speed: 85, distance: 100, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_m9_cursed: { type: "bullet", damage: 12, obstacleDamage: 1, falloff: 0.7, speed: 85, distance: 100, variance: 0, shrapnel: false, tracerColor: "9mm_cursed", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_m93r: { type: "bullet", damage: 12, obstacleDamage: 1, falloff: 0.7, speed: 85, distance: 100, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_p30l: { type: "bullet", damage: 21, obstacleDamage: 1, falloff: 0.75, speed: 94, distance: 100, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.12, tracerLength: 0.8 }, bullet_ot38: { type: "bullet", damage: 26, obstacleDamage: 1, falloff: 0.75, speed: 112, distance: 125, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.09, tracerLength: 0.8 }, bullet_ots38: { type: "bullet", damage: 32, obstacleDamage: 1, falloff: 0.77, speed: 115, distance: 135, variance: 0, shrapnel: false, suppressed: true, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.8 }, bullet_colt45: { type: "bullet", damage: 29, obstacleDamage: 1, falloff: 0.7, speed: 106, distance: 110, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.09, tracerLength: 0.8 }, bullet_m1911: { type: "bullet", damage: 14, obstacleDamage: 1, falloff: 0.7, speed: 80, distance: 88, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_m1a1: { type: "bullet", damage: 13, obstacleDamage: 1, falloff: 0.8, distance: 88, speed: 80, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_mkg45: { type: "bullet", damage: 28, obstacleDamage: 1, falloff: 0.75, distance: 145, speed: 126, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_deagle: { type: "bullet", damage: 35, obstacleDamage: 1, falloff: 0.75, speed: 115, distance: 120, variance: 0, shrapnel: false, tracerColor: "50AE", tracerWidth: 0.12, tracerLength: 0.8 }, bullet_mac10: { type: "bullet", damage: 9.25, obstacleDamage: 1, falloff: 0.6, distance: 50, speed: 75, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_ump9: { type: "bullet", damage: 15, obstacleDamage: 1, falloff: 0.75, distance: 100, speed: 100, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_vector: { type: "bullet", damage: 7.5, obstacleDamage: 1, falloff: 0.6, distance: 46, speed: 88, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_vector45: { type: "bullet", damage: 9.5, obstacleDamage: 1, falloff: 0.6, distance: 45, speed: 82, variance: 0, shrapnel: false, tracerColor: "45acp", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_scorpion: { type: "bullet", damage: 10.75, obstacleDamage: 1, falloff: 0.77, distance: 120, speed: 90, variance: 0, shrapnel: false, suppressed: true, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_vss: { type: "bullet", damage: 22, obstacleDamage: 1, falloff: 0.8, distance: 125, speed: 95, variance: 0, shrapnel: false, suppressed: true, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.8 }, bullet_dp28: { type: "bullet", damage: 14, obstacleDamage: 1.5, falloff: 0.9, distance: 225, speed: 110, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_bar: { type: "bullet", damage: 17.5, obstacleDamage: 1.75, falloff: 0.9, distance: 275, speed: 114, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_pkp: { type: "bullet", damage: 18, obstacleDamage: 2, falloff: 0.9, distance: 200, speed: 120, variance: 0, shrapnel: false, tracerColor: "762mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_glock: { type: "bullet", damage: 9, obstacleDamage: 1, falloff: 0.5, speed: 70, distance: 44, variance: 0, shrapnel: false, tracerColor: "9mm", tracerWidth: 0.1, tracerLength: 0.7 }, bullet_famas: { type: "bullet", damage: 17, obstacleDamage: 1, falloff: 0.8, distance: 150, speed: 110, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_hk416: { type: "bullet", damage: 11, obstacleDamage: 1, falloff: 0.85, distance: 175, speed: 105, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_m4a1: { type: "bullet", damage: 14, obstacleDamage: 1, falloff: 0.82, distance: 165, speed: 98, variance: 0, shrapnel: false, suppressed: true, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_mk12: { type: "bullet", damage: 22.5, obstacleDamage: 1, falloff: 0.9, distance: 400, speed: 132, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_l86: { type: "bullet", damage: 26.5, obstacleDamage: 1, falloff: 0.9, distance: 425, speed: 134, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_m249: { type: "bullet", damage: 14, obstacleDamage: 1.75, falloff: 0.9, distance: 220, speed: 125, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_qbb97: { type: "bullet", damage: 14, obstacleDamage: 1.5, falloff: 0.9, distance: 200, speed: 118, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.1, tracerLength: 0.9 }, bullet_scout: { type: "bullet", damage: 56, obstacleDamage: 1, falloff: 0.92, distance: 450, speed: 164, variance: 0, shrapnel: false, tracerColor: "556mm", tracerWidth: 0.14, tracerLength: 0.95 }, bullet_flare: { type: "bullet", damage: 0, obstacleDamage: 1, falloff: 10, distance: 16, speed: 4, variance: 0, shrapnel: false, tracerColor: "flare", tracerWidth: 0.3, tracerLength: 1.2, flareColor: 16733184, addFlare: true, maxFlareScale: 2, skipCollision: true }, bullet_potato: { type: "bullet", damage: 0, obstacleDamage: 1, falloff: 1, distance: 1, speed: 100, variance: 0, shrapnel: false, tracerColor: "invis", tracerWidth: 0, tracerLength: 1.2, skipCollision: true }, bullet_bugle: { type: "bullet", damage: 0, obstacleDamage: 1, falloff: 1, distance: 1, speed: 100, variance: 0, shrapnel: false, tracerColor: "invis", tracerWidth: 0, tracerLength: 1.2, skipCollision: true }, shrapnel_barrel: { type: "bullet", damage: 2, obstacleDamage: 1, falloff: 1, speed: 20, distance: 8, variance: 1.5, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.125, tracerLength: 0.6 }, shrapnel_stove: { type: "bullet", damage: 5, obstacleDamage: 2.5, falloff: 1, speed: 30, distance: 24, variance: 1.5, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.125, tracerLength: 0.6 }, shrapnel_frag: { type: "bullet", damage: 20, obstacleDamage: 1, falloff: 1, speed: 20, distance: 8, variance: 1.5, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.125, tracerLength: 0.6 }, shrapnel_strobe: { type: "bullet", damage: 3, obstacleDamage: 1, falloff: 1, speed: 20, distance: 3, variance: 1.5, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.1, tracerLength: 0.3 }, shrapnel_usas: { type: "bullet", damage: 5, obstacleDamage: 1, falloff: 1, speed: 20, distance: 5, variance: 1.2, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.1, tracerLength: 0.5 }, shrapnel_mirv_mini: { type: "bullet", damage: 6, obstacleDamage: 1, falloff: 1, speed: 20, distance: 5, variance: 1.3, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.1, tracerLength: 0.5 }, shrapnel_bomb_iron: { type: "bullet", damage: 10, obstacleDamage: 1, falloff: 1, speed: 24, distance: 12, variance: 1.5, shrapnel: true, tracerColor: "shrapnel", tracerWidth: 0.125, tracerLength: 0.6 } }; const SkinDefs$2 = { bullet_mp5_bonus: defineBulletSkin("bullet_mp5", { speed: 106.25, distance: 125 }), bullet_m9_bonus: defineBulletSkin("bullet_m9", { speed: 106.25, distance: 125 }), bullet_mac10_bonus: defineBulletSkin("bullet_mac10", { speed: 93.75, distance: 62.5 }), bullet_ump9_bonus: defineBulletSkin("bullet_ump9", { speed: 125, distance: 125 }), bullet_vector_bonus: defineBulletSkin("bullet_vector", { speed: 110, distance: 57.5 }), bullet_glock_bonus: defineBulletSkin("bullet_glock", { speed: 87.5, distance: 55 }), bullet_m93r_bonus: defineBulletSkin("bullet_m93r", { speed: 106.25, distance: 125 }), bullet_scorpion_bonus: defineBulletSkin("bullet_scorpion", { speed: 112.5, distance: 150, tracerColor: "9mm_suppressed_bonus" }), bullet_vss_bonus: defineBulletSkin("bullet_vss", { speed: 118.75, distance: 156.25, tracerColor: "9mm_suppressed_bonus" }), bullet_p30l_bonus: defineBulletSkin("bullet_p30l", { speed: 117.5, distance: 125 }) }; const BulletDefs = { ...BaseDefs$2, ...SkinDefs$2 }; const CrosshairDefs = { crosshair_default: { type: "crosshair", name: "Default", rarity: 0, cursor: "crosshair", texture: "crosshair000.img", code: '' }, crosshair_001: { type: "crosshair", name: "Style 001", rarity: 1, texture: "crosshair001.img", code: '' }, crosshair_005: { type: "crosshair", name: "Style 005", rarity: 1, texture: "crosshair005.img", code: '' }, crosshair_007: { type: "crosshair", name: "Style 007", rarity: 1, texture: "crosshair007.img", code: '' }, crosshair_010: { type: "crosshair", name: "Style 010", rarity: 1, texture: "crosshair010.img", code: '' }, crosshair_022: { type: "crosshair", name: "Style 022", rarity: 1, texture: "crosshair022.img", code: '' }, crosshair_027: { type: "crosshair", name: "Style 027", rarity: 1, texture: "crosshair027.img", code: '' }, crosshair_038: { type: "crosshair", name: "Style 038", rarity: 1, texture: "crosshair038.img", code: '' }, crosshair_040: { type: "crosshair", name: "Style 040", rarity: 1, texture: "crosshair040.img", code: '' }, crosshair_045: { type: "crosshair", name: "Style 045", rarity: 1, texture: "crosshair045.img", code: '' }, crosshair_051: { type: "crosshair", name: "Style 051", rarity: 1, texture: "crosshair051.img", code: '' }, crosshair_064: { type: "crosshair", name: "Style 064", rarity: 1, texture: "crosshair064.img", code: '' }, crosshair_080: { type: "crosshair", name: "Style 080", rarity: 1, texture: "crosshair080.img", code: '' }, crosshair_086: { type: "crosshair", name: "Style 086", rarity: 1, texture: "crosshair086.img", code: '' }, crosshair_094: { type: "crosshair", name: "Style 094", rarity: 1, texture: "crosshair094.img", code: '' }, crosshair_098: { type: "crosshair", name: "Style 098", rarity: 1, texture: "crosshair098.img", code: '' }, crosshair_101: { type: "crosshair", name: "Style 101", rarity: 1, texture: "crosshair101.img", code: '' }, crosshair_102: { type: "crosshair", name: "Style 102", rarity: 1, texture: "crosshair102.img", code: '' }, crosshair_109: { type: "crosshair", name: "Style 109", rarity: 1, texture: "crosshair109.img", code: '' }, crosshair_118: { type: "crosshair", name: "Style 118", rarity: 1, texture: "crosshair118.img", code: '' }, crosshair_124: { type: "crosshair", name: "Style 124", rarity: 1, texture: "crosshair124.img", code: '' }, crosshair_125: { type: "crosshair", name: "Style 125", rarity: 1, texture: "crosshair125.img", code: '' }, crosshair_136: { type: "crosshair", name: "Style 136", rarity: 1, texture: "crosshair136.img", code: '' }, crosshair_158: { type: "crosshair", name: "Style 158", rarity: 1, texture: "crosshair158.img", code: '' }, crosshair_160: { type: "crosshair", name: "Style 160", rarity: 1, texture: "crosshair160.img", code: '' }, crosshair_173: { type: "crosshair", name: "Style 173", rarity: 1, texture: "crosshair173.img", code: '' }, crosshair_176: { type: "crosshair", name: "Style 176", rarity: 1, texture: "crosshair176.img", code: '' }, crosshair_177: { type: "crosshair", name: "Style 177", rarity: 1, texture: "crosshair177.img", code: '' }, crosshair_181: { type: "crosshair", name: "Style 181", rarity: 1, texture: "crosshair181.img", code: '' }, crosshair_184: { type: "crosshair", name: "Style 184", rarity: 1, texture: "crosshair184.img", code: '' } }; const ExplosionDefs = { explosion_frag: { type: "explosion", damage: 125, obstacleDamage: 1.1, rad: { min: 5, max: 12 }, shrapnelCount: 12, shrapnelType: "shrapnel_frag", explosionEffectType: "frag", decalType: "decal_frag_explosion" }, explosion_smoke: { type: "explosion", damage: 0, obstacleDamage: 1, rad: { min: 5, max: 12 }, shrapnelCount: 0, shrapnelType: "shrapnel_frag", explosionEffectType: "smoke", decalType: "decal_smoke_explosion" }, explosion_strobe: { type: "explosion", damage: 1, obstacleDamage: 5, rad: { min: 1.5, max: 2.5 }, shrapnelCount: 3, shrapnelType: "shrapnel_strobe", explosionEffectType: "strobe", decalType: "decal_smoke_explosion" }, explosion_barrel: { type: "explosion", damage: 125, obstacleDamage: 1, rad: { min: 5, max: 12 }, shrapnelCount: 12, shrapnelType: "shrapnel_barrel", explosionEffectType: "barrel", decalType: "decal_barrel_explosion" }, explosion_stove: { type: "explosion", damage: 125, obstacleDamage: 2, rad: { min: 5, max: 12 }, shrapnelCount: 16, shrapnelType: "shrapnel_stove", explosionEffectType: "barrel", decalType: "decal_barrel_explosion" }, explosion_usas: { type: "explosion", damage: 42, obstacleDamage: 4, rad: { min: 3.5, max: 6.5 }, shrapnelCount: 9, shrapnelType: "shrapnel_usas", explosionEffectType: "usas", decalType: "decal_frag_small_explosion" }, explosion_rounds: { type: "explosion", damage: 3, obstacleDamage: 15, rad: { min: 0.75, max: 1 }, shrapnelCount: 0, shrapnelType: "shrapnel_usas", explosionEffectType: "rounds", decalType: "decal_rounds_explosion" }, explosion_rounds_sg: { type: "explosion", damage: 3, obstacleDamage: 15, rad: { min: 0.75, max: 1 }, shrapnelCount: 0, shrapnelType: "shrapnel_usas", explosionEffectType: "rounds_sg", decalType: "decal_rounds_explosion" }, explosion_mirv: { type: "explosion", damage: 125, obstacleDamage: 1.1, rad: { min: 5, max: 12 }, shrapnelCount: 12, shrapnelType: "shrapnel_frag", explosionEffectType: "mirv", decalType: "decal_frag_explosion" }, explosion_mirv_mini: { type: "explosion", damage: 75, obstacleDamage: 1.1, rad: { min: 4, max: 8 }, shrapnelCount: 7, shrapnelType: "shrapnel_mirv_mini", explosionEffectType: "mirv_mini", decalType: "decal_frag_small_explosion" }, explosion_martyr_nade: { type: "explosion", damage: 80, obstacleDamage: 1.1, rad: { min: 4.5, max: 9 }, shrapnelCount: 8, shrapnelType: "shrapnel_mirv_mini", explosionEffectType: "martyr_nade", decalType: "decal_frag_small_explosion" }, explosion_snowball: { type: "explosion", damage: 2, obstacleDamage: 1, rad: { min: 1.24, max: 1.25 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "snowball", decalType: "decal_snowball_explosion", freezeAmount: 3, freezeDuration: 0.5 }, explosion_snowball_heavy: { type: "explosion", damage: 5, obstacleDamage: 1, rad: { min: 1.24, max: 1.25 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "snowball_heavy", decalType: "decal_snowball_explosion", freezeAmount: 3, freezeDuration: 1 }, explosion_potato: { type: "explosion", damage: 2, obstacleDamage: 1, teamDamage: false, rad: { min: 1.24, max: 1.25 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "potato", decalType: "decal_potato_explosion", freezeAmount: 3, freezeDuration: 0.5 }, explosion_potato_heavy: { type: "explosion", damage: 5, obstacleDamage: 1, teamDamage: false, rad: { min: 1.24, max: 1.25 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "potato_heavy", decalType: "decal_potato_explosion", freezeAmount: 3, freezeDuration: 1 }, explosion_potato_cannonball: { type: "explosion", damage: 95, obstacleDamage: 1.3, teamDamage: false, rad: { min: 3.5, max: 6.5 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "potato_cannonball", decalType: "decal_frag_small_explosion" }, explosion_potato_smgshot: { type: "explosion", damage: 13, obstacleDamage: 1.25, teamDamage: false, rad: { min: 1.25, max: 1.75 }, shrapnelCount: 0, shrapnelType: "", explosionEffectType: "potato_smgshot", decalType: "" }, explosion_bomb_iron: { type: "explosion", damage: 40, obstacleDamage: 2, rad: { min: 5, max: 14 }, shrapnelCount: 2, shrapnelType: "shrapnel_bomb_iron", explosionEffectType: "bomb_iron", decalType: "decal_bomb_iron_explosion" } }; function defineSkin(baseType, params) { return util.mergeDeep({}, BaseDefs$1[baseType], { baseType }, params); } const ChestDefs = { chest01: { name: "Level 1 Vest", type: "chest", level: 1, damageReduction: 0.25, skinImg: { baseTint: 11842740, baseSprite: "player-armor-base-01.img" }, lootImg: { sprite: "loot-chest-01.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "chest_pickup_01" } }, chest02: { name: "Level 2 Vest", type: "chest", level: 2, damageReduction: 0.38, skinImg: { baseTint: 4934475, baseSprite: "player-armor-base-01.img" }, lootImg: { sprite: "loot-chest-02.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "chest_pickup_01" } }, chest03: { name: "Level 3 Vest", type: "chest", level: 3, damageReduction: 0.45, skinImg: { baseTint: 0, baseSprite: "player-armor-base-01.img" }, lootImg: { sprite: "loot-chest-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "chest_pickup_01" } }, chest04: { name: "Level 4 Vest", type: "chest", noDrop: true, level: 4, damageReduction: 0.6, skinImg: { baseTint: 1846790, baseSprite: "player-armor-base-01.img" }, lootImg: { sprite: "loot-chest-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "chest_pickup_01" } } }; const HelmetDefs = { helmet01: { name: "Level 1 Helmet", type: "helmet", level: 1, damageReduction: 0.25, skinImg: { baseTint: 3244031, baseTintRed: 10972011, baseTintBlue: 6459582, baseSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-helmet-01.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "helmet_pickup_01" } }, helmet02: { name: "Level 2 Helmet", type: "helmet", level: 2, damageReduction: 0.4, skinImg: { baseTint: 13027014, baseTintRed: 10027008, baseTintBlue: 20642, baseSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-helmet-02.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "helmet_pickup_01" } }, helmet03: { name: "Level 3 Helmet", type: "helmet", level: 3, damageReduction: 0.55, skinImg: { baseTint: 2434341, baseTintRed: 2491396, baseTintBlue: 334125, baseSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-helmet-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "helmet_pickup_01" } }, helmet04: { name: "Level 4 Helmet", type: "helmet", level: 4, damageReduction: 0.7, skinImg: { baseTint: 2434341, baseTintRed: 2491396, baseTintBlue: 334125, baseSprite: "player-circle-base-01.img" }, lootImg: { sprite: "loot-helmet-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "helmet_pickup_01" } } }; const BackpackDefs = { backpack00: { name: "Pouch", type: "backpack", level: 0, playerRad: 0.55, tint: 16777215, lootImg: { sprite: "loot-pack-00.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "pack_pickup_01" } }, backpack01: { name: "Small Pack", type: "backpack", level: 1, playerRad: 0.65, tint: 6697728, lootImg: { sprite: "loot-pack-01.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "pack_pickup_01" } }, backpack02: { name: "Regular Pack", type: "backpack", level: 2, tint: 26112, playerRad: 0.85, lootImg: { sprite: "loot-pack-02.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "pack_pickup_01" } }, backpack03: { name: "Military Pack", type: "backpack", level: 3, tint: 6710835, playerRad: 1, lootImg: { sprite: "loot-pack-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "pack_pickup_01" } } }; const BoostDefs = { soda: { name: "Soda", type: "boost", useTime: 3, boost: 25, lootImg: { sprite: "loot-medical-soda.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "soda_pickup_01", use: "soda_use_01" }, emitter: "boost", aura: { sprite: "part-aura-circle-01.img", tint: 1676544 } }, painkiller: { name: "Pills", type: "boost", useTime: 5, boost: 50, lootImg: { sprite: "loot-medical-pill.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "pills_pickup_01", use: "pills_use_01" }, emitter: "boost", aura: { sprite: "part-aura-circle-01.img", tint: 1676544 } } }; const HealDefs = { bandage: { name: "Bandage", type: "heal", useTime: 3, heal: 15, maxHeal: 100, lootImg: { sprite: "loot-medical-bandage.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "bandage_pickup_01", use: "bandage_use_01" }, emitter: "heal", aura: { sprite: "part-aura-circle-01.img", tint: 16711680 } }, healthkit: { name: "Med Kit", type: "heal", useTime: 6, heal: 100, maxHeal: 100, lootImg: { sprite: "loot-medical-healthkit.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "healthkit_pickup_01", use: "healthkit_use_01" }, emitter: "heal", aura: { sprite: "part-aura-circle-01.img", tint: 16711680 } } }; const AmmoDefs = { "9mm": { name: "9mm", type: "ammo", minStackSize: 15, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 16756224, tintDark: 12550912 }, sound: { pickup: "ammo_pickup_01" } }, "762mm": { name: "7.62mm", type: "ammo", minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 26367, tintDark: 19903 }, sound: { pickup: "ammo_pickup_01" } }, "556mm": { name: "5.56mm", type: "ammo", minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 237056, tintDark: 161536 }, sound: { pickup: "ammo_pickup_01" } }, "12gauge": { name: "12 gauge", type: "ammo", minStackSize: 5, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 16711680, tintDark: 12517376 }, sound: { pickup: "ammo_pickup_01" } }, "50AE": { name: ".50 AE", type: "ammo", special: true, minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 2697513, tintDark: 2039583 }, sound: { pickup: "ammo_pickup_01" } }, "308sub": { name: ".308 Subsonic", type: "ammo", special: true, minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 3225600, tintDark: 2435840 }, sound: { pickup: "ammo_pickup_01" } }, flare: { name: "Flare", type: "ammo", special: true, minStackSize: 1, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 13911552, tintDark: 13911552 }, sound: { pickup: "ammo_pickup_01" } }, "45acp": { name: ".45 ACP", type: "ammo", special: true, minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 7930111, tintDark: 5963967 }, sound: { pickup: "ammo_pickup_01" } }, potato_ammo: { name: "Potato Ammo", type: "ammo", special: true, hideUi: true, minStackSize: 10, lootImg: { sprite: "loot-ammo-box.img", scale: 0.2, tint: 7618334, tintDark: 7618334 }, sound: { pickup: "ammo_pickup_01" } } }; const BaseDefs$1 = { ...AmmoDefs, ...HealDefs, ...BoostDefs, ...BackpackDefs, ...HelmetDefs, ...ChestDefs }; const ScopeDefs = { "1xscope": { name: "1x Scope", type: "scope", level: 1, lootImg: { sprite: "loot-scope-00.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "scope_pickup_01" } }, "2xscope": { name: "2x Scope", type: "scope", level: 2, lootImg: { sprite: "loot-scope-01.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "scope_pickup_01" } }, "4xscope": { name: "4x Scope", type: "scope", level: 4, lootImg: { sprite: "loot-scope-02.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "scope_pickup_01" } }, "8xscope": { name: "8x Scope", type: "scope", level: 8, lootImg: { sprite: "loot-scope-03.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "scope_pickup_01" } }, "15xscope": { name: "15x Scope", type: "scope", level: 15, lootImg: { sprite: "loot-scope-04.img", tint: 16777215, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, sound: { pickup: "scope_pickup_01" } } }; const SkinDefs$1 = { helmet03_leader: defineSkin("helmet03", { name: "Leader Helmet", skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-leader.img" } }), helmet03_forest: defineSkin("helmet03", { name: "Shishigami no Kabuto", role: "woods_king", mapIndicator: { sprite: "player-king-woods.img", tint: 65280, pulse: true, pulseTint: 65280 }, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-forest.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-forest.img", border: "loot-circle-outer-01.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet03_moon: defineSkin("helmet03", { name: "Tsukuyomi no Kabuto", skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-moon.img", spriteScale: 0.3 } }), helmet03_lt: defineSkin("helmet03", { name: "Lieutenant Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-lieutenant.img", spriteScale: 0.3 } }), helmet03_lt_aged: defineSkin("helmet03", { name: "Lieutenant Helmet", perk: "firepower", skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-lieutenant.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-lieutenant.img", rot: 0.5 * Math.PI } }), helmet03_potato: defineSkin("helmet03", { name: "K-pot-ato", perk: "rare_potato", skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-potato.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-potato.img", rot: 0.5 * Math.PI } }), helmet03_marksman: defineSkin("helmet03", { name: "Marksman Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-marksman.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-marksman.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet03_recon: defineSkin("helmet03", { name: "Recon Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-recon.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-recon.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet03_grenadier: defineSkin("helmet03", { name: "Grenadier Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-grenadier.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-grenadier.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet03_bugler: defineSkin("helmet03", { name: "Bugler Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-bugler.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-bugler.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet04_medic: defineSkin("helmet04", { name: "Medic Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-medic.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-medic.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet04_last_man_red: defineSkin("helmet04", { name: "Lone Survivr Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-last-man-01.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-last-man-01.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet04_last_man_blue: defineSkin("helmet04", { name: "Lone Survivr Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-last-man-02.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-last-man-02.img", scale: 0.3, rot: 0.5 * Math.PI } }), helmet04_leader: defineSkin("helmet04", { name: "Leader Helmet", noDrop: true, skinImg: { baseTint: 16777215, baseTintRed: 16777215, baseTintBlue: 16777215, baseSprite: "player-helmet-leader.img", spriteScale: 0.3 }, lootImg: { sprite: "player-helmet-leader.img", scale: 0.3, rot: 0.5 * Math.PI } }) }; const GearDefs = { ...BaseDefs$1, ...ScopeDefs, ...SkinDefs$1 }; const GunDefs = { mp5: { name: "MP5", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2, fireDelay: 0.09, switchDelay: 0.75, barrelLength: 2.625, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 3, bulletCount: 1, bulletType: "bullet_mp5", bulletTypeBonus: "bullet_mp5_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mp5.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.49 }, tint: 1184274, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.375 }, sound: { shoot: "mp5_01", reload: "mp5_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "mp5_switch_01" } }, mac10: { name: "MAC-10", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 96, maxClip: 32, maxReload: 32, extendedClip: 50, extendedReload: 50, reloadTime: 1.8, fireDelay: 0.045, switchDelay: 0.75, barrelLength: 2.45, barrelOffset: 0, recoilTime: 1e10, moveSpread: 11, shotSpread: 10, bulletCount: 1, bulletType: "bullet_mac10", bulletTypeBonus: "bullet_mac10_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mac10.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.44 }, tint: 3684408, leftHandOffset: { x: 1.4, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.35 }, sound: { shoot: "mac10_01", reload: "mac10_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "mac10_switch_01" } }, ump9: { name: "UMP9", type: "gun", quality: 0, fireMode: "burst", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 1.9, fireDelay: 0.35, burstDelay: 0.07, switchDelay: 0.75, barrelLength: 2.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.5, bulletCount: 1, burstCount: 3, bulletType: "bullet_ump9", bulletTypeBonus: "bullet_ump9_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ump9.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.515 }, tint: 1184274, leftHandOffset: { x: 5.6, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.4 }, sound: { shoot: "ump9_01", reload: "ump9_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "ump9_switch_01" } }, vector: { name: "Vector", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 99, maxClip: 33, maxReload: 33, extendedClip: 40, extendedReload: 40, reloadTime: 1.6, fireDelay: 0.038, switchDelay: 0.75, barrelLength: 2.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4.5, shotSpread: 2.5, bulletCount: 1, bulletType: "bullet_vector", bulletTypeBonus: "bullet_vector_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-vector.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.5 }, tint: 9009504, leftHandOffset: { x: 7, y: 0 }, recoil: 0.89 }, particle: { shellScale: 1, shellOffset: 0.4 }, sound: { shoot: "vector_01", reload: "vector_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "vector_switch_01" } }, vector45: { name: "Vector", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "45acp", ammoSpawnCount: 75, maxClip: 25, maxReload: 25, extendedClip: 32, extendedReload: 32, reloadTime: 1.6, fireDelay: 0.044, switchDelay: 0.75, barrelLength: 2.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 6.5, shotSpread: 4.5, bulletCount: 1, bulletType: "bullet_vector45", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-vector45.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.5 }, tint: 9009504, leftHandOffset: { x: 7, y: 0 }, recoil: 0.89 }, particle: { shellScale: 1.2, shellOffset: 0.4 }, sound: { shoot: "vector_02", reload: "vector_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "vector_switch_01" } }, scorpion: { name: "CZ-3A1", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.2, fireDelay: 0.055, switchDelay: 0.75, barrelLength: 3.6, barrelOffset: 0, recoilTime: 1e10, moveSpread: 5, shotSpread: 4, bulletCount: 1, bulletType: "bullet_scorpion", bulletTypeBonus: "bullet_scorpion_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-scorpion.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-scorpion-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 8, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.375 }, sound: { shoot: "scorpion_01", reload: "scorpion_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "scorpion_switch_01" } }, vss: { name: "VSS", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 60, maxClip: 20, maxReload: 20, extendedClip: 30, extendedReload: 30, reloadTime: 2.3, fireDelay: 0.16, switchDelay: 0.75, barrelLength: 3.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 2, bulletCount: 1, bulletType: "bullet_vss", bulletTypeBonus: "bullet_vss_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-vss.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-vss-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 9, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.375 }, sound: { shoot: "vss_01", reload: "vss_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "vss_switch_01" } }, famas: { name: "FAMAS", type: "gun", quality: 0, fireMode: "burst", caseTiming: "shoot", isBullpup: true, ammo: "556mm", ammoSpawnCount: 75, maxClip: 25, maxReload: 25, extendedClip: 35, extendedReload: 35, reloadTime: 2.3, fireDelay: 0.35, burstDelay: 0.07, switchDelay: 0.75, barrelLength: 3.1, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2, shotSpread: 1.1, bulletCount: 1, burstCount: 3, bulletType: "bullet_famas", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-famas.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-famas-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 12, y: 0 }, gunOffset: { x: -8, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.425 }, sound: { shoot: "famas_01", reload: "famas_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "famas_switch_01" } }, hk416: { name: "M416", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.3, fireDelay: 0.075, switchDelay: 0.75, barrelLength: 2.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 8, shotSpread: 4, bulletCount: 1, bulletType: "bullet_hk416", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-hk416.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.52 }, tint: 14402714, leftHandOffset: { x: 4.2, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.4 }, sound: { shoot: "hk416_01", reload: "hk416_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "hk416_switch_01" } }, m4a1: { name: "M4A1-S", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 3.1, fireDelay: 0.082, switchDelay: 0.75, barrelLength: 3.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 2, bulletCount: 1, bulletType: "bullet_m4a1", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m4a1.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-m4a1-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 7.9, y: 0 }, recoil: 1.3 }, particle: { shellScale: 1, shellOffset: 0.4 }, sound: { shoot: "m4a1_01", reload: "m4a1_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m4a1_switch_01", fallOff: 3 } }, mk12: { name: "Mk 12 SPR", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 60, maxClip: 20, maxReload: 20, extendedClip: 30, extendedReload: 30, reloadTime: 2.4, fireDelay: 0.18, switchDelay: 0.75, barrelLength: 3.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1, bulletCount: 1, bulletType: "bullet_mk12", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mk12.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.485 }, tint: 10984586, leftHandOffset: { x: 4.2, y: 0 }, recoil: 1.66 }, particle: { shellScale: 1.3, shellOffset: 0.55 }, sound: { shoot: "mk12_01", reload: "mk12_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "mk12_switch_01" } }, l86: { name: "L86A2", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.9, fireDelay: 0.19, switchDelay: 0.75, barrelLength: 3.25, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3.5, shotSpread: 1, bulletCount: 1, bulletType: "bullet_l86", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-l86.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.46 }, tint: 14469287, leftHandOffset: { x: -3, y: 0 }, recoil: 1.66 }, particle: { shellScale: 1.3, shellOffset: 0.55 }, sound: { shoot: "l86_01", reload: "l86_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "l86_switch_01" } }, m249: { name: "M249", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 200, maxClip: 100, maxReload: 100, extendedClip: 150, extendedReload: 150, reloadTime: 6.7, fireDelay: 0.08, switchDelay: 0.75, barrelLength: 3.75, barrelOffset: 0, recoilTime: 1e10, moveSpread: 6, shotSpread: 1.5, bulletCount: 1, bulletType: "bullet_m249", headshotMult: 2, speed: { equip: 0, attack: -4 }, lootImg: { sprite: "loot-weapon-m249.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-m249-top-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 13.2, y: 0 }, recoil: 1.33, magImg: { sprite: "gun-m249-bot-01.img", pos: { x: 0, y: -20.5 } } }, particle: { shellScale: 1, shellOffset: 0.5875 }, sound: { shoot: "m249_01", reload: "m249_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "m249_switch_01" } }, qbb97: { name: "QBB-97", type: "gun", fireMode: "auto", caseTiming: "shoot", ammo: "556mm", ammoSpawnCount: 150, maxClip: 75, maxReload: 75, extendedClip: 95, extendedReload: 95, reloadTime: 3.9, fireDelay: 0.1, switchDelay: 0.75, barrelLength: 3.1, barrelOffset: 0, recoilTime: 1e10, moveSpread: 0.5, shotSpread: 4, bulletCount: 1, bulletType: "bullet_qbb97", headshotMult: 2, speed: { equip: 0, attack: -2 }, lootImg: { sprite: "loot-weapon-qbb97.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.425 }, tint: 1973790, leftHandOffset: { x: 8.4, y: 0 }, recoil: 1.33, magImg: { sprite: "gun-qbb97-bot-01.img", pos: { x: -1.5, y: -14.25 } } }, particle: { shellScale: 1, shellOffset: 0.5875 }, sound: { shoot: "qbb97_01", reload: "qbb97_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "qbb97_switch_01" } }, scout_elite: { name: "Scout Elite", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "556mm", aimDelay: true, ammoSpawnCount: 20, maxClip: 5, maxReload: 5, extendedClip: 10, extendedReload: 10, reloadTime: 2.6, fireDelay: 1, switchDelay: 1, pullDelay: 1, barrelLength: 3.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 1, shotSpread: 1, bulletCount: 1, bulletType: "bullet_scout", headshotMult: 1.5, speed: { equip: 0, attack: 5 }, lootImg: { sprite: "loot-weapon-scout.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.52 }, tint: 3290683, leftHandOffset: { x: 2.8, y: 0 }, recoil: 2.33 }, particle: { shellScale: 1.6, shellOffset: 0.6 }, sound: { shoot: "scout_01", reload: "scout_reload_01", cycle: "scout_cycle_01", pull: "scout_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "scout_cycle_01" } }, ak47: { name: "AK-47", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.5, fireDelay: 0.1, switchDelay: 0.75, barrelLength: 3.15, barrelOffset: 0, recoilTime: 1e10, moveSpread: 7.5, shotSpread: 2.5, bulletCount: 1, bulletType: "bullet_ak47", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ak.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.435 }, tint: 6433298, leftHandOffset: { x: 2.8, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "ak47_01", reload: "ak47_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "ak47_switch_01" } }, scar: { name: "SCAR-H", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 80, maxClip: 20, maxReload: 20, extendedClip: 30, extendedReload: 30, reloadTime: 2.7, fireDelay: 0.09, switchDelay: 0.75, barrelLength: 3.15, barrelOffset: 0, recoilTime: 1e10, moveSpread: 5, shotSpread: 2, bulletCount: 1, bulletType: "bullet_scar", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-scar.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.435 }, tint: 10189640, leftHandOffset: { x: 2.8, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "scar_01", reload: "scar_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "scar_switch_01" } }, scarssr: { name: "SCAR-SSR", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "308sub", ammoSpawnCount: 40, maxClip: 10, maxReload: 10, extendedClip: 20, extendedReload: 20, reloadTime: 2.7, fireDelay: 0.3, switchDelay: 0.75, barrelLength: 3.9, barrelOffset: 0, recoilTime: 1e10, moveSpread: 5.5, shotSpread: 1.5, bulletCount: 1, bulletType: "bullet_scarssr", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-scarssr.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-scarssr-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 6, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "scarssr_01", reload: "scar_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "scar_switch_01" } }, an94: { name: "AN-94", type: "gun", quality: 1, fireMode: "burst", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 90, maxClip: 45, maxReload: 45, extendedClip: 60, extendedReload: 60, reloadTime: 2.35, fireDelay: 0.24, burstDelay: 0.025, switchDelay: 0.75, barrelLength: 3.25, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 1.5, bulletCount: 1, burstCount: 2, burstSounds: 1, bulletType: "bullet_an94", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-an94.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.46 }, tint: 2960685, leftHandOffset: { x: 2.85, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "an94_01", reload: "an94_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "an94_switch_01" } }, groza: { name: "Groza", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", isBullpup: true, ammo: "762mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.8, fireDelay: 0.078, switchDelay: 0.75, barrelLength: 2.6, barrelOffset: 0, recoilTime: 1e10, moveSpread: 9, shotSpread: 5, bulletCount: 1, bulletType: "bullet_groza", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-groza.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-groza-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 12, y: 0 }, gunOffset: { x: -8, y: 0 }, recoil: 1.4 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "groza_01", reload: "groza_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "groza_switch_01" } }, grozas: { name: "Groza-S", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", isBullpup: true, ammo: "762mm", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2.8, fireDelay: 0.078, switchDelay: 0.75, barrelLength: 3.3, barrelOffset: 0, recoilTime: 1e10, moveSpread: 7.5, shotSpread: 3.5, bulletCount: 1, bulletType: "bullet_grozas", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-grozas.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-grozas-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 12, y: 0 }, gunOffset: { x: -8, y: 0 }, recoil: 1.4 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "grozas_01", reload: "groza_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "groza_switch_01" } }, dp28: { name: "DP-28", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 120, maxClip: 60, maxReload: 60, extendedClip: 80, extendedReload: 80, reloadTime: 3.3, fireDelay: 0.115, switchDelay: 0.75, barrelLength: 3.75, barrelOffset: 0, recoilTime: 1e10, moveSpread: 9, shotSpread: 2, bulletCount: 1, bulletType: "bullet_dp28", headshotMult: 2, speed: { equip: 0, attack: -2 }, lootImg: { sprite: "loot-weapon-dp28.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.53 }, tint: 1710618, leftHandOffset: { x: 8.4, y: 0 }, recoil: 1.33, magImg: { sprite: "gun-dp28-top-01.img", pos: { x: 0, y: -22.5 }, top: true } }, particle: { shellScale: 1, shellOffset: 0.6 }, sound: { shoot: "dp28_01", reload: "dp28_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "dp28_switch_01" } }, bar: { name: "BAR M1918", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 80, maxClip: 20, maxReload: 20, extendedClip: 40, extendedReload: 40, reloadTime: 2.7, fireDelay: 0.12, switchDelay: 0.75, barrelLength: 3.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 8, shotSpread: 2, bulletCount: 1, bulletType: "bullet_bar", headshotMult: 2, speed: { equip: 0, attack: -1.5 }, lootImg: { sprite: "loot-weapon-bar.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.52 }, tint: 5065810, leftHandOffset: { x: 6.8, y: 0 }, recoil: 1.4 }, particle: { shellScale: 1, shellOffset: 0.6 }, sound: { shoot: "bar_01", reload: "bar_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "bar_switch_01" } }, pkp: { name: "PKP Pecheneg", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 200, maxClip: 200, maxReload: 200, extendedClip: 250, extendedReload: 250, reloadTime: 5, fireDelay: 0.1, switchDelay: 0.75, barrelLength: 3.6, barrelOffset: 0, recoilTime: 1e10, moveSpread: 7.5, shotSpread: 2.5, bulletCount: 1, bulletType: "bullet_pkp", headshotMult: 2, speed: { equip: 0, attack: -5 }, lootImg: { sprite: "loot-weapon-pkp.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-pkp-top-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 12.5, y: 0 }, recoil: 1.33, magImg: { sprite: "gun-pkp-bot-01.img", pos: { x: 0, y: -17.5 } } }, particle: { shellScale: 1, shellOffset: 0.5875, shellReverse: true }, sound: { shoot: "pkp_01", reload: "pkp_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "pkp_switch_01" } }, model94: { name: "Model 94", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "45acp", ammoSpawnCount: 64, maxClip: 8, maxReload: 1, extendedClip: 8, extendedReload: 1, reloadTime: 0.5, fireDelay: 0.7, switchDelay: 1, pullDelay: 1, barrelLength: 3.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.5, bulletCount: 1, bulletType: "bullet_model94", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-model94.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.5175 }, tint: 10510624, leftHandOffset: { x: 3.2, y: 0 }, recoil: 2.33 }, particle: { shellScale: 1.4, shellOffset: 0.6 }, sound: { shoot: "model94_01", reload: "model94_reload_01", cycle: "model94_cycle_01", pull: "model94_cycle_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "model94_cycle_01" } }, mkg45: { name: "Mk45G", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "45acp", ammoSpawnCount: 52, maxClip: 13, maxReload: 13, extendedClip: 26, extendedReload: 26, reloadTime: 2.1, fireDelay: 0.17, switchDelay: 0.75, barrelLength: 3.3, barrelOffset: 0, recoilTime: 0.2, moveSpread: 7.5, shotSpread: 3.5, bulletCount: 1, bulletType: "bullet_mkg45", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mkg45.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.47 }, tint: 3487029, leftHandOffset: { x: 4.2, y: 0 }, recoil: 1.66 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "mkg45_01", reload: "mkg45_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "mkg45_switch_01" } }, blr: { name: "BLR 81", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 30, maxClip: 3, maxReload: 3, extendedClip: 5, extendedReload: 5, reloadTime: 1.7, fireDelay: 0.8, switchDelay: 1, pullDelay: 1, barrelLength: 3.8, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.5, bulletCount: 1, bulletType: "bullet_blr", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-blr.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.53 }, tint: 4663046, leftHandOffset: { x: 6.4, y: 0 }, recoil: 2.75 }, particle: { shellScale: 1.4, shellOffset: 0.6 }, sound: { shoot: "blr_01", reload: "blr_reload_01", cycle: "blr_cycle_01", pull: "blr_cycle_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "blr_cycle_01" } }, mosin: { name: "Mosin-Nagant", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "762mm", aimDelay: true, ammoSpawnCount: 20, maxClip: 5, maxReload: 1, maxReloadAlt: 5, extendedClip: 5, extendedReload: 1, extendedReloadAlt: 5, reloadTime: 0.9, reloadTimeAlt: 3, fireDelay: 1.75, switchDelay: 1, pullDelay: 1, barrelLength: 3.75, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1, bulletCount: 1, bulletType: "bullet_mosin", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mosin.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.52 }, tint: 3348992, leftHandOffset: { x: 2.8, y: 0 }, recoil: 2.33 }, particle: { shellScale: 1.6, shellOffset: 0.6 }, sound: { shoot: "mosin_01", reload: "mosin_reload_01", reloadAlt: "mosin_reload_02", cycle: "mosin_cycle_01", pull: "mosin_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "mosin_cycle_01" } }, sv98: { name: "SV-98", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "762mm", aimDelay: true, ammoSpawnCount: 30, maxClip: 10, maxReload: 10, extendedClip: 15, extendedReload: 15, reloadTime: 2.7, fireDelay: 1.5, switchDelay: 1, pullDelay: 0.8, barrelLength: 3.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2.5, shotSpread: 1, bulletCount: 1, bulletType: "bullet_sv98", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-sv98.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.4925 }, tint: 6654279, leftHandOffset: { x: 2.8, y: 0 }, recoil: 2.33 }, particle: { shellScale: 1.6, shellOffset: 0.6 }, sound: { shoot: "sv98_01", reload: "sv98_reload_01", cycle: "sv98_cycle_01", pull: "sv98_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "sv98_cycle_01" } }, awc: { name: "AWM-S", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "308sub", aimDelay: true, ammoSpawnCount: 20, maxClip: 5, maxReload: 5, extendedClip: 7, extendedReload: 7, reloadTime: 3.6, fireDelay: 1.5, switchDelay: 1, pullDelay: 1.4, barrelLength: 3.8, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 0.5, bulletCount: 1, bulletType: "bullet_awc", headshotMult: 1, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-awc.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-awc-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 11, y: 0 }, recoil: 2.66 }, particle: { shellScale: 1.5, shellOffset: 0.6 }, sound: { shoot: "awc_01", reload: "awc_reload_01", cycle: "awc_cycle_01", pull: "awc_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "awc_cycle_01", fallOff: 3 } }, m39: { name: "M39 EMR", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 60, maxClip: 20, maxReload: 20, extendedClip: 30, extendedReload: 30, reloadTime: 2.5, fireDelay: 0.23, switchDelay: 0.75, barrelLength: 3.5, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4.25, shotSpread: 1, bulletCount: 1, bulletType: "bullet_m39", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m39.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.4925 }, tint: 3355443, leftHandOffset: { x: 2.8, y: 0 }, recoil: 1.66 }, particle: { shellScale: 1.3, shellOffset: 0.575 }, sound: { shoot: "m39_01", reload: "m39_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "m39_switch_01" } }, svd: { name: "SVD-63", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 60, maxClip: 10, maxReload: 10, extendedClip: 20, extendedReload: 20, reloadTime: 2.5, fireDelay: 0.25, switchDelay: 0.75, barrelLength: 4, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4.5, shotSpread: 1, bulletCount: 1, bulletType: "bullet_svd", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-svd.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.56 }, tint: 1842204, leftHandOffset: { x: 8, y: 0 }, recoil: 2 }, particle: { shellScale: 1.3, shellOffset: 0.575 }, sound: { shoot: "svd_01", reload: "svd_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "svd_switch_01" } }, garand: { name: "M1 Garand", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "762mm", ammoSpawnCount: 40, maxClip: 8, maxReload: 8, extendedClip: 8, extendedReload: 8, reloadTime: 2.1, fireDelay: 0.23, switchDelay: 0.75, barrelLength: 3.6, barrelOffset: 0, recoilTime: 0.36, moveSpread: 4, shotSpread: 1, bulletCount: 1, bulletType: "bullet_garand", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-garand.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-garand-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 8, y: 0 }, recoil: 1.66 }, particle: { shellScale: 1.3, shellOffset: 0.575 }, sound: { shoot: "garand_01", shootLast: "garand_02", reload: "garand_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "garand_switch_01" } }, m870: { name: "M870", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "12gauge", deployGroup: 1, ammoSpawnCount: 10, maxClip: 5, maxReload: 1, extendedClip: 10, extendedReload: 1, reloadTime: 0.75, fireDelay: 0.9, switchDelay: 0.9, pullDelay: 0.9, barrelLength: 3.15, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2, shotSpread: 10, bulletCount: 9, jitter: 1, bulletType: "bullet_buckshot", headshotMult: 1.5, lootImg: { sprite: "loot-weapon-m870.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, speed: { equip: 0, attack: 0 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.435 }, tint: 3348992, leftHandOffset: { x: 7, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "m870_01", reload: "m870_reload_01", cycle: "m870_cycle_01", pull: "m870_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m870_cycle_01" } }, m1100: { name: "M1100", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "12gauge", ammoSpawnCount: 12, maxClip: 4, maxReload: 1, extendedClip: 8, extendedReload: 1, reloadTime: 0.7, fireDelay: 0.3, switchDelay: 0.9, barrelLength: 3.15, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2, shotSpread: 25, bulletCount: 18, jitter: 1, bulletType: "bullet_birdshot", headshotMult: 1.5, lootImg: { sprite: "loot-weapon-m1100.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, speed: { equip: 0, attack: 0 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.435 }, tint: 3032110, leftHandOffset: { x: 7, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "m1100_01", reload: "m1100_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m1100_deploy_01" } }, mp220: { name: "MP220", type: "gun", quality: 0, fireMode: "single", caseTiming: "reload", ammo: "12gauge", ammoSpawnCount: 10, maxClip: 2, maxReload: 2, extendedClip: 2, extendedReload: 2, reloadTime: 2.7, fireDelay: 0.2, switchDelay: 0.3, barrelLength: 2.7, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2, shotSpread: 10, bulletCount: 9, jitter: 1, bulletType: "bullet_buckshot", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-mp220.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-mp220-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.35 }, sound: { shoot: "mp220_01", reload: "mp220_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "mp220_deploy_01" } }, saiga: { name: "Saiga-12", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "12gauge", ammoSpawnCount: 20, maxClip: 5, maxReload: 5, extendedClip: 8, extendedReload: 8, reloadTime: 2.5, fireDelay: 0.4, switchDelay: 0.75, barrelLength: 3.75, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2, shotSpread: 10, bulletCount: 9, jitter: 1, bulletType: "bullet_buckshot", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-saiga.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-saiga-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 8, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "saiga_01", reload: "saiga_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "saiga_switch_01" } }, spas12: { name: "SPAS-12", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "12gauge", deployGroup: 1, ammoSpawnCount: 18, maxClip: 9, maxReload: 1, extendedClip: 12, extendedReload: 1, reloadTime: 0.55, fireDelay: 0.75, switchDelay: 0.75, pullDelay: 0.75, barrelLength: 2.8, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 4, bulletCount: 9, jitter: 0.2, bulletType: "bullet_flechette", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-spas12.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.4 }, tint: 2966097, leftHandOffset: { x: 4.9, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "spas12_01", reload: "spas12_reload_01", cycle: "spas12_cycle_01", pull: "spas12_pull_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "spas12_cycle_01" } }, m1014: { name: "M1014", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "12gauge", ammoSpawnCount: 16, maxClip: 8, maxReload: 1, extendedClip: 10, extendedReload: 1, reloadTime: 0.52, fireDelay: 0.4, switchDelay: 0.75, barrelLength: 3.2, barrelOffset: 0, recoilTime: 0.5, moveSpread: 4, shotSpread: 4, bulletCount: 1, jitter: 0.2, bulletType: "bullet_slug", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m1014.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-long-01.img", scale: { x: 0.5, y: 0.44 }, tint: 5656632, leftHandOffset: { x: 4.8, y: 0 }, recoil: 1.33 }, particle: { shellScale: 1, shellOffset: 0.45 }, sound: { shoot: "m1014_01", reload: "m1014_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m1014_deploy_01" } }, usas: { name: "USAS-12", type: "gun", quality: 1, fireMode: "auto", caseTiming: "shoot", ammo: "12gauge", toMouseHit: true, ammoSpawnCount: 30, maxClip: 10, maxReload: 10, extendedClip: 20, extendedReload: 20, reloadTime: 2.9, fireDelay: 0.5, switchDelay: 0.75, barrelLength: 3.65, barrelOffset: 0, recoilTime: 1e10, moveSpread: 6, shotSpread: 7, bulletCount: 1, jitter: 1, bulletType: "bullet_frag", noSplinter: true, headshotMult: 1, speed: { equip: 0, attack: -1 }, lootImg: { sprite: "loot-weapon-usas.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-usas-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 16, y: 0 }, recoil: 1.5 }, particle: { shellScale: 1, shellOffset: 0.35 }, sound: { shoot: "usas_01", reload: "usas_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_02", deploy: "usas_switch_01" } }, m9: { name: "M9", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 45, dualWieldType: "m9_dual", pistol: true, maxClip: 15, maxReload: 15, extendedClip: 30, extendedReload: 30, reloadTime: 1.6, fireDelay: 0.12, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, recoilTime: 1e10, moveSpread: 8, shotSpread: 8, bulletCount: 1, bulletType: "bullet_m9", bulletTypeBonus: "bullet_m9_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m9.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.505 }, tint: 1973790, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "m9_01", reload: "m9_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m9_switch_01" } }, m9_dual: { name: "Dual M9", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", isDual: true, pistol: true, ammo: "9mm", ammoSpawnCount: 45, maxClip: 30, maxReload: 30, extendedClip: 60, extendedReload: 60, reloadTime: 3.1, fireDelay: 0.08, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 9, shotSpread: 11, bulletCount: 1, bulletType: "bullet_m9", bulletTypeBonus: "bullet_m9_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m9-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.505 }, tint: 1973790, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "m9_01", reload: "m9_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m9_switch_01" } }, m9_cursed: { name: "M9 Cursed", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "9mm_cursed", ammoSpawnCount: 0, ammoInfinite: true, noPotatoSwap: true, pistol: true, noDrop: true, maxClip: 15, maxReload: 15, extendedClip: 30, extendedReload: 30, reloadTime: 1.6, fireDelay: 0.12, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, recoilTime: 1e10, moveSpread: 8, shotSpread: 8, bulletCount: 1, bulletType: "bullet_m9_cursed", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m9-cursed.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.505 }, tint: 1973790, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "m9_01", reload: "m9_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m9_switch_01" } }, m93r: { name: "M93R", type: "gun", quality: 0, fireMode: "burst", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 60, dualWieldType: "m93r_dual", pistol: false, maxClip: 20, maxReload: 20, extendedClip: 30, extendedReload: 30, reloadTime: 1.8, fireDelay: 0.28, burstDelay: 0.04, switchDelay: 0.25, barrelLength: 2.3, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 4, bulletCount: 1, burstCount: 3, bulletType: "bullet_m93r", bulletTypeBonus: "bullet_m93r_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m93r.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.51 }, tint: 2766875, leftHandOffset: { x: 0.8, y: 0 }, recoil: 0.5 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "m93r_01", reload: "m93r_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m93r_switch_01" } }, m93r_dual: { name: "Dual M93R", type: "gun", quality: 0, fireMode: "burst", caseTiming: "shoot", isDual: true, pistol: true, ammo: "9mm", ammoSpawnCount: 60, maxClip: 40, maxReload: 40, extendedClip: 60, extendedReload: 60, reloadTime: 3.3, fireDelay: 0.18, burstDelay: 0.04, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 6, shotSpread: 7, bulletCount: 1, burstCount: 3, bulletType: "bullet_m93r", bulletTypeBonus: "bullet_m93r_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m93r-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.51 }, tint: 2766875, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "m93r_01", reload: "m93r_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m93r_switch_01" } }, glock: { name: "G18C", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 51, dualWieldType: "glock_dual", pistol: true, maxClip: 17, maxReload: 17, extendedClip: 31, extendedReload: 31, reloadTime: 1.95, fireDelay: 0.06, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, recoilTime: 1e10, moveSpread: 10, shotSpread: 12, bulletCount: 1, bulletType: "bullet_glock", bulletTypeBonus: "bullet_glock_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-glock.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.49 }, tint: 1973790, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "glock_01", reload: "glock_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "glock_switch_01" } }, glock_dual: { name: "Dual G18C", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 51, isDual: true, pistol: true, maxClip: 34, maxReload: 34, extendedClip: 62, extendedReload: 62, reloadTime: 3.8, fireDelay: 0.03, switchDelay: 0.25, barrelLength: 2.2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 16, shotSpread: 18, bulletCount: 1, bulletType: "bullet_glock", bulletTypeBonus: "bullet_glock_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-glock-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.49 }, tint: 1973790, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "glock_01", reload: "glock_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "glock_switch_01" } }, p30l: { name: "P30L", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 45, dualWieldType: "p30l_dual", pistol: true, maxClip: 15, maxReload: 15, extendedClip: 30, extendedReload: 30, reloadTime: 1.2, fireDelay: 0.14, switchDelay: 0.25, barrelLength: 2.3, barrelOffset: 0, recoilTime: 1e10, moveSpread: 1, shotSpread: 2, bulletCount: 1, bulletType: "bullet_p30l", bulletTypeBonus: "bullet_p30l_bonus", headshotMult: 2, speed: { equip: 1, attack: 1 }, lootImg: { sprite: "loot-weapon-p30l.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-p30l-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "p30l_01", reload: "p30l_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "p30l_switch_01" } }, p30l_dual: { name: "Dual P30L", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "9mm", ammoSpawnCount: 90, isDual: true, pistol: true, maxClip: 30, maxReload: 30, extendedClip: 60, extendedReload: 60, reloadTime: 2.65, fireDelay: 0.09, switchDelay: 0.3, barrelLength: 2.3, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 2, shotSpread: 3, bulletCount: 1, bulletType: "bullet_p30l", bulletTypeBonus: "bullet_p30l_bonus", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-p30l-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-p30l-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.25 }, sound: { shoot: "p30l_01", reload: "p30l_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "p30l_switch_01" } }, ot38: { name: "OT-38", type: "gun", quality: 0, fireMode: "single", caseTiming: "reload", ammo: "762mm", ammoSpawnCount: 20, dualWieldType: "ot38_dual", pistol: true, maxClip: 5, maxReload: 5, extendedClip: 5, extendedReload: 5, reloadTime: 2, fireDelay: 0.4, switchDelay: 0.3, barrelLength: 2.05, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.25, bulletCount: 1, bulletType: "bullet_ot38", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ot38.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.4625 }, tint: 7368816, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "ot38_01", reload: "ot38_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "ot38_switch_01" } }, ot38_dual: { name: "Dual OT-38", type: "gun", quality: 0, fireMode: "single", caseTiming: "reload", ammo: "762mm", ammoSpawnCount: 20, isDual: true, pistol: true, maxClip: 10, maxReload: 10, extendedClip: 10, extendedReload: 10, reloadTime: 3.8, fireDelay: 0.2, switchDelay: 0.3, barrelLength: 2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 4, shotSpread: 1.75, bulletCount: 1, bulletType: "bullet_ot38", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ot38-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.4625 }, tint: 7368816, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "ot38_01", reload: "ot38_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "ot38_switch_01" } }, ots38: { name: "OTs-38", type: "gun", quality: 0, fireMode: "single", caseTiming: "reload", ammo: "762mm", ammoSpawnCount: 20, dualWieldType: "ots38_dual", pistol: true, maxClip: 5, maxReload: 5, extendedClip: 5, extendedReload: 5, reloadTime: 2, fireDelay: 0.36, switchDelay: 0.3, barrelLength: 2.05, barrelOffset: 0, recoilTime: 1e10, moveSpread: 2.4, shotSpread: 1.2, bulletCount: 1, bulletType: "bullet_ots38", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ots38.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-ots38-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "ots38_01", reload: "ot38_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "ot38_switch_01" } }, ots38_dual: { name: "Dual OTs-38", type: "gun", quality: 1, fireMode: "single", caseTiming: "reload", ammo: "762mm", ammoSpawnCount: 40, isDual: true, pistol: true, maxClip: 10, maxReload: 10, extendedClip: 10, extendedReload: 10, reloadTime: 3.8, fireDelay: 0.18, switchDelay: 0.3, barrelLength: 2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 2.8, shotSpread: 1.4, bulletCount: 1, bulletType: "bullet_ots38", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-ots38-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-ots38-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "ots38_01", reload: "ot38_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "ot38_switch_01" } }, colt45: { name: "Peacemaker", type: "gun", quality: 0, fireMode: "auto", caseTiming: "reload", ammo: "45acp", ammoSpawnCount: 48, dualWieldType: "colt45_dual", pistol: true, maxClip: 6, maxReload: 6, extendedClip: 6, extendedReload: 6, reloadTime: 3, fireDelay: 0.12, switchDelay: 0.3, barrelLength: 2.26, barrelOffset: 0, recoilTime: 0.35, moveSpread: 3, shotSpread: 16, bulletCount: 1, bulletType: "bullet_colt45", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-colt45.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.52 }, tint: 12895428, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1.2, shellOffset: 0.225 }, sound: { shoot: "colt45_01", reload: "colt45_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "colt45_switch_01" } }, colt45_dual: { name: "Dual Peacemaker", type: "gun", quality: 0, fireMode: "auto", caseTiming: "reload", ammo: "45acp", ammoSpawnCount: 48, isDual: true, pistol: true, maxClip: 12, maxReload: 12, extendedClip: 12, extendedReload: 12, reloadTime: 5.1, fireDelay: 0.13, switchDelay: 0.3, barrelLength: 2.26, barrelOffset: 0, dualOffset: 0.6, recoilTime: 0.35, moveSpread: 3, shotSpread: 16, bulletCount: 1, bulletType: "bullet_colt45", headshotMult: 1.5, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-colt45-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.52 }, tint: 12895428, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1.2, shellOffset: 0.225 }, sound: { shoot: "colt45_01", reload: "colt45_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "colt45_switch_01" } }, m1911: { name: "M1911", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "45acp", ammoSpawnCount: 28, dualWieldType: "m1911_dual", pistol: true, maxClip: 7, maxReload: 7, extendedClip: 12, extendedReload: 12, reloadTime: 2.1, fireDelay: 0.13, switchDelay: 0.25, barrelLength: 2.1, barrelOffset: 0, recoilTime: 1e10, moveSpread: 7, shotSpread: 6, bulletCount: 1, bulletType: "bullet_m1911", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m1911.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.5 }, tint: 9605778, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1.2, shellOffset: 0.25 }, sound: { shoot: "m1911_01", reload: "m1911_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m1911_switch_01" } }, m1911_dual: { name: "Dual M1911", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", isDual: true, pistol: true, ammo: "45acp", ammoSpawnCount: 28, maxClip: 14, maxReload: 14, extendedClip: 24, extendedReload: 24, reloadTime: 3.6, fireDelay: 0.085, switchDelay: 0.25, barrelLength: 2.1, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 8, shotSpread: 9.5, bulletCount: 1, bulletType: "bullet_m1911", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m1911-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.5 }, tint: 9605778, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1.2, shellOffset: 0.25 }, sound: { shoot: "m1911_01", reload: "m1911_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m1911_switch_01" } }, m1a1: { name: "M1A1", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", ammo: "45acp", ammoSpawnCount: 90, maxClip: 30, maxReload: 30, extendedClip: 50, extendedReload: 50, reloadTime: 2.8, fireDelay: 0.095, switchDelay: 0.75, barrelLength: 2.8, barrelOffset: 0, recoilTime: 1e10, moveSpread: 6, shotSpread: 6, bulletCount: 1, bulletType: "bullet_m1a1", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-m1a1.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-med-01.img", scale: { x: 0.5, y: 0.53 }, tint: 3674112, leftHandOffset: { x: 5.8, y: 0 }, recoil: 1 }, particle: { shellScale: 1.2, shellOffset: 0.375 }, sound: { shoot: "m1a1_01", reload: "m1a1_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "m1a1_switch_01" } }, deagle: { name: "DEagle 50", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "50AE", ammoSpawnCount: 56, dualWieldType: "deagle_dual", pistol: true, maxClip: 7, maxReload: 7, extendedClip: 9, extendedReload: 9, reloadTime: 2.3, fireDelay: 0.16, switchDelay: 0.3, barrelLength: 1.855, barrelOffset: 0, recoilTime: 0.5, moveSpread: 6, shotSpread: 2.5, bulletCount: 1, bulletType: "bullet_deagle", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-deagle.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-deagle-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1.4, shellOffset: 0.265 }, sound: { shoot: "deagle_01", reload: "deagle_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "deagle_switch_01" } }, deagle_dual: { name: "Dual DEagle 50", type: "gun", quality: 1, fireMode: "single", caseTiming: "shoot", ammo: "50AE", ammoSpawnCount: 98, isDual: true, pistol: true, maxClip: 14, maxReload: 14, extendedClip: 18, extendedReload: 18, reloadTime: 4, fireDelay: 0.12, switchDelay: 0.3, barrelLength: 2.4, barrelOffset: 0, dualOffset: 0.6, recoilTime: 0.5, moveSpread: 7.5, shotSpread: 3.5, bulletCount: 1, bulletType: "bullet_deagle", headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-deagle-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-deagle-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.265 }, sound: { shoot: "deagle_01", reload: "deagle_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "deagle_switch_01" } }, flare_gun: { name: "Flare Gun", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "flare", dualWieldType: "flare_gun_dual", pistol: true, outsideOnly: true, ammoSpawnCount: 1, ignoreEndlessAmmo: true, maxClip: 1, maxReload: 1, extendedClip: 1, extendedReload: 1, reloadTime: 2, fireDelay: 0.4, switchDelay: 0.3, barrelLength: 2, barrelOffset: 0, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.25, bulletCount: 1, bulletType: "bullet_flare", noSplinter: true, headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-flare-gun.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.4625 }, tint: 16733184, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "flare_gun_01", reload: "flare_gun_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "gun_switch_01" } }, flare_gun_dual: { name: "Dual Flare Gun", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", ammo: "flare", isDual: true, pistol: true, outsideOnly: true, ammoSpawnCount: 2, ignoreEndlessAmmo: true, maxClip: 2, maxReload: 2, extendedClip: 2, extendedReload: 2, reloadTime: 3.5, fireDelay: 0.3, switchDelay: 0.3, barrelLength: 2, barrelOffset: 0, dualOffset: 0.6, recoilTime: 1e10, moveSpread: 3, shotSpread: 1.25, bulletCount: 1, bulletType: "bullet_flare", noSplinter: true, headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-flare-gun-dual.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-short-01.img", scale: { x: 0.5, y: 0.4625 }, tint: 16733184, leftHandOffset: { x: 0, y: 0 }, recoil: 1 }, particle: { shellScale: 1, shellOffset: 0.225 }, sound: { shoot: "flare_gun_01", reload: "flare_gun_reload_02", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "gun_switch_01" } }, potato_cannon: { name: "Potato Cannon", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", isLauncher: true, noPotatoSwap: true, deployGroup: 3, ammo: "potato_ammo", ammoSpawnCount: 0, ammoInfinite: true, maxClip: 4, maxReload: 1, extendedClip: 4, extendedReload: 1, reloadTime: 1, fireDelay: 1.2, switchDelay: 0.9, barrelLength: 3, barrelOffset: -1, recoilTime: 1e10, moveSpread: 2, shotSpread: 1, bulletCount: 1, bulletType: "bullet_potato", projType: "potato_cannonball", noSplinter: true, headshotMult: 1, speed: { equip: -3, attack: 0 }, lootImg: { sprite: "loot-weapon-potato-cannon.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-potato-cannon-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 7, y: 2 }, gunOffset: { x: -10, y: -4 }, recoil: 8, handsBelow: true }, particle: { shellScale: 1, shellOffset: -1, shellOffsetY: 1 }, sound: { shoot: "potato_cannon_01", reload: "potato_cannon_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "potato_cannon_switch_01" } }, potato_smg: { name: "Spud Gun", type: "gun", quality: 0, fireMode: "auto", caseTiming: "shoot", noPotatoSwap: true, ammo: "potato_ammo", ammoSpawnCount: 0, ammoInfinite: true, maxClip: 30, maxReload: 30, extendedClip: 40, extendedReload: 40, reloadTime: 2, fireDelay: 0.09, switchDelay: 0.75, barrelLength: 3.25, barrelOffset: 0, recoilTime: 1e10, moveSpread: 4, shotSpread: 3, bulletCount: 1, bulletType: "bullet_potato", projType: "potato_smgshot", noSplinter: true, headshotMult: 2, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-potato-smg.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-potato-smg-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, recoil: 2, magImg: { sprite: "gun-potato-smg-top-01.img", pos: { x: 0, y: -15 }, top: true } }, particle: { shellScale: 1, shellOffset: 0.1, shellReverse: true, shellOffsetY: -1.1 }, sound: { shoot: "potato_smg_01", reload: "potato_smg_reload_01", pickup: "gun_pickup_01", empty: "empty_fire_01", deploy: "potato_smg_switch_01" } }, bugle: { name: "Bugle", type: "gun", quality: 0, fireMode: "single", caseTiming: "shoot", noDrop: true, noPotatoSwap: true, pistol: true, ignoreDetune: true, ammo: "bugle_ammo", ammoSpawnCount: 0, maxClip: 1, maxReload: 1, extendedClip: 4, extendedReload: 1, reloadTime: 0.01, fireDelay: 1, switchDelay: 0.3, barrelLength: 3, barrelOffset: 0, recoilTime: 1e10, moveSpread: 1, shotSpread: 1, bulletCount: 1, bulletType: "bullet_bugle", noSplinter: true, headshotMult: 1, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-weapon-bugle.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.3 }, worldImg: { sprite: "gun-bugle-01.img", scale: { x: 0.5, y: 0.5 }, tint: 16777215, leftHandOffset: { x: 12, y: 0 }, recoil: 4 }, particle: { shellScale: 4, shellOffset: 2, shellForward: 1 }, sound: { shoot: "bugle_01", shootTeam: { 1: "bugle_01", 2: "bugle_02" }, shootAlt: "bugle_03", reload: "", pickup: "stow_weapon_01", empty: "empty_fire_01", deploy: "stow_weapon_01" } } }; const PassDefs = { pass_survivr1: { type: "pass", xp: [ 50, 50, 50, 50, 50, 50, 50, 50, 75, 75, 75, 75, 75, 75, 100, 100, 100, 125, 125, 150, 75, 75, 75 ], items: [ { level: 2, item: "outfitParma" }, { level: 3, item: "heal_heart" }, { level: 4, item: "emote_bandagedface" }, { level: 5, item: "outfitWhite" }, { level: 6, item: "boost_star" }, { level: 7, item: "emote_ok" }, { level: 8, item: "outfitRed" }, { level: 9, item: "heal_moon" }, { level: 10, item: "emote_pooface" }, { level: 11, item: "knuckles_rusted" }, { level: 12, item: "boost_naturalize" }, { level: 13, item: "emote_ghost_base" }, { level: 14, item: "outfitDarkGloves" }, { level: 15, item: "heal_tomoe" }, { level: 16, item: "emote_picassoface" }, { level: 17, item: "outfitCarbonFiber" }, { level: 18, item: "boost_shuriken" }, { level: 19, item: "emote_rainbow" }, { level: 20, item: "outfitParmaPrestige" }, { level: 21, item: "knuckles_heroic" }, { level: 30, item: "outfitTurkey" }, { level: 50, item: "bayonet_rugged" }, { level: 99, item: "bayonet_woodland" } ] } }; const PerkDefs = { leadership: { name: "Leadership", type: "perk", lootImg: { sprite: "loot-perk-leadership.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, firepower: { name: "Firepower", type: "perk", lootImg: { sprite: "loot-perk-firepower.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, gotw: { name: "Gift of the Wild", type: "perk", lootImg: { sprite: "loot-perk-gotw.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, windwalk: { name: "Windwalk", type: "perk", lootImg: { sprite: "loot-perk-windwalk.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, rare_potato: { name: "Rare Potato", type: "perk", lootImg: { sprite: "loot-perk-rare-potato.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, aoe_heal: { name: "Mass Medicate", type: "perk", lootImg: { sprite: "loot-perk-aoe-heal.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, endless_ammo: { name: "Endless Ammo", type: "perk", lootImg: { sprite: "loot-perk-endless-ammo.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, steelskin: { name: "Steelskin", type: "perk", lootImg: { sprite: "loot-perk-steelskin.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, splinter: { name: "Splinter Rounds", type: "perk", lootImg: { sprite: "loot-perk-splinter.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, small_arms: { name: "Small Arms", type: "perk", lootImg: { sprite: "loot-perk-small-arms.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, takedown: { name: "Takedown", type: "perk", lootImg: { sprite: "loot-perk-takedown.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, field_medic: { name: "Field Medic", type: "perk", lootImg: { sprite: "loot-perk-field-medic.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, tree_climbing: { name: "Tree Climbing", type: "perk", lootImg: { sprite: "loot-perk-tree-climbing.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, scavenger: { name: "Scavenger", type: "perk", lootImg: { sprite: "loot-perk-scavenger.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, scavenger_adv: { name: "Master Scavenger", type: "perk", lootImg: { sprite: "loot-perk-scavenger_adv.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, hunted: { name: "The Hunted", type: "perk", lootImg: { sprite: "loot-perk-hunted.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, chambered: { name: "One In The Chamber", type: "perk", lootImg: { sprite: "loot-perk-chambered.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, martyrdom: { name: "Martyrdom", type: "perk", lootImg: { sprite: "loot-perk-martyrdom.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, targeting: { name: "Targeting", type: "perk", lootImg: { sprite: "loot-perk-targeting.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, bonus_45: { name: ".45 In The Chamber", type: "perk", lootImg: { sprite: "loot-perk-bonus-45.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, broken_arrow: { name: "Broken Arrow", type: "perk", lootImg: { sprite: "loot-perk-broken-arrow.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, fabricate: { name: "Fabricate", type: "perk", lootImg: { sprite: "loot-perk-fabricate.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, self_revive: { name: "Revivify", type: "perk", lootImg: { sprite: "loot-perk-self-revive.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, bonus_9mm: { name: "9mm Overpressure", type: "perk", lootImg: { sprite: "loot-perk-bonus-9mm.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, flak_jacket: { name: "Flak Jacket", type: "perk", lootImg: { sprite: "loot-perk-flak-jacket.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, explosive: { name: "Explosive Rounds", type: "perk", lootImg: { sprite: "loot-perk-explosive.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, bonus_assault: { name: "Hollow-points", type: "perk", lootImg: { sprite: "loot-perk-bonus-assault.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, inspiration: { name: "Inspiration", type: "perk", lootImg: { sprite: "loot-perk-inspiration.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, final_bugle: { name: "Last Breath", type: "perk", lootImg: { sprite: "loot-perk-final-bugle.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, halloween_mystery: { name: "Trick Or Treat?", type: "perk", lootImg: { sprite: "loot-perk-halloween-mystery.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, trick_nothing: { name: "One With Nothing", type: "perk", emoteOnPickup: "emote_trick_nothing", lootImg: { sprite: "loot-perk-trick-nothing.img", tint: 16777215, border: "loot-circle-outer-04.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, trick_size: { name: "Feedership", type: "perk", emoteOnPickup: "emote_trick_size", lootImg: { sprite: "loot-perk-trick-size.img", tint: 16777215, border: "loot-circle-outer-04.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, trick_m9: { name: "Dev Troll Special", type: "perk", emoteOnPickup: "emote_trick_m9", lootImg: { sprite: "loot-perk-trick-m9.img", tint: 16777215, border: "loot-circle-outer-04.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, trick_chatty: { name: "Gabby Ghost", type: "perk", emoteOnPickup: "emote_trick_chatty", lootImg: { sprite: "loot-perk-trick-chatty.img", tint: 16777215, border: "loot-circle-outer-04.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, trick_drain: { name: "That Sucks", type: "perk", emoteOnPickup: "emote_trick_drain", lootImg: { sprite: "loot-perk-trick-drain.img", tint: 16777215, border: "loot-circle-outer-04.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, treat_9mm: { name: "Candy Corn", type: "perk", emoteOnPickup: "emote_treat_9mm", lootImg: { sprite: "loot-perk-treat-9mm.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, treat_12g: { name: "Red Jelly Beans", type: "perk", emoteOnPickup: "emote_treat_12g", lootImg: { sprite: "loot-perk-treat-12g.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, treat_556: { name: "Sour Apple Belt", type: "perk", emoteOnPickup: "emote_treat_556", lootImg: { sprite: "loot-perk-treat-556.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, treat_762: { name: "Blueberry Taffy", type: "perk", emoteOnPickup: "emote_treat_762", lootImg: { sprite: "loot-perk-treat-762.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, treat_super: { name: "Full Size OKAMI Bar", type: "perk", emoteOnPickup: "emote_treat_super", lootImg: { sprite: "loot-perk-treat-super.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } }, turkey_shoot: { name: "Perky Shoot", type: "perk", emoteOnPickup: "emote_turkeyanimal", lootImg: { sprite: "loot-perk-turkey_shoot.img", tint: 16777215, border: "loot-circle-outer-03.img", borderTint: 16777215, scale: 0.275 }, sound: { pickup: "perk_pickup_01" } } }; const PingDefs = { ping_danger: { type: "ping", texture: "ping-team-danger.img", mapTexture: "ping-map-danger.img", sound: "ping_danger_01", soundLeader: "ping_leader_01", pingMap: true, pingLife: 4, mapLife: 4, mapEvent: false, worldDisplay: true }, ping_coming: { type: "ping", texture: "ping-team-coming.img", mapTexture: "ping-map-coming.img", sound: "ping_coming_01", soundLeader: "ping_leader_01", pingMap: true, pingLife: 4, mapLife: 300, mapEvent: false, worldDisplay: true }, ping_help: { type: "ping", texture: "ping-team-help.img", mapTexture: "ping-map-help.img", sound: "ping_help_01", soundLeader: "ping_leader_01", pingMap: true, pingLife: 4, mapLife: 4, mapEvent: false, worldDisplay: true }, ping_airdrop: { type: "ping", texture: "ping-team-airdrop.img", mapTexture: "ping-map-airdrop.img", sound: "ping_airdrop_01", pingMap: true, pingLife: 4, mapLife: 10, mapEvent: true, worldDisplay: false, tint: 16737792 }, ping_airstrike: { type: "ping", texture: "ping-team-airstrike.img", mapTexture: "ping-map-airstrike.img", sound: "ping_airstrike_01", pingMap: true, pingLife: 2, mapLife: 2, mapEvent: true, worldDisplay: true, tint: 15400704 }, ping_woodsking: { type: "ping", texture: "player-king-woods.img", mapTexture: "ping-map-woods-king.img", sound: "helmet03_forest_pickup_01", pingMap: true, pingLife: 4, mapLife: 10, mapEvent: true, worldDisplay: false, tint: 1244928 }, ping_unlock: { type: "ping", texture: "ping-team-unlock.img", mapTexture: "ping-map-unlock.img", sound: "ping_unlock_01", pingMap: true, pingLife: 4, mapLife: 10, mapEvent: true, worldDisplay: false, tint: 55551 } }; const QuestDefs = { quest_top_solo: { type: "quest", category: "top", target: 2, xp: 30 }, quest_top_squad: { type: "quest", category: "top", target: 2, xp: 30 }, quest_kills: { type: "quest", category: "pvp", target: 5, xp: 30 }, quest_kills_hard: { type: "quest", category: "pvp", target: 10, xp: 40 }, quest_damage: { type: "quest", category: "pvp", target: 750, xp: 30 }, quest_damage_hard: { type: "quest", category: "pvp", target: 1500, xp: 40 }, quest_survived: { type: "quest", category: "pvp", target: 900, xp: 30, timed: true }, quest_damage_9mm: { type: "quest", category: "damage", target: 250, xp: 30, icon: "img/emotes/ammo-9mm.svg" }, quest_damage_762mm: { type: "quest", category: "damage", target: 250, xp: 30, icon: "img/emotes/ammo-762mm.svg" }, quest_damage_556mm: { type: "quest", category: "damage", target: 250, xp: 30, icon: "img/emotes/ammo-556mm.svg" }, quest_damage_12gauge: { type: "quest", category: "damage", target: 250, xp: 30, icon: "img/emotes/ammo-12gauge.svg" }, quest_damage_grenade: { type: "quest", category: "damage", target: 100, xp: 40 }, quest_damage_melee: { type: "quest", category: "damage", target: 150, xp: 40 }, quest_heal: { type: "quest", category: "item", target: 10, xp: 30 }, quest_boost: { type: "quest", category: "item", target: 10, xp: 30 }, quest_airdrop: { type: "quest", category: "item", target: 1, xp: 30 }, quest_crates: { type: "quest", category: "destruction", target: 25, xp: 30 }, quest_toilets: { type: "quest", category: "destruction", target: 5, xp: 30 }, quest_furniture: { type: "quest", category: "destruction", target: 10, xp: 30 }, quest_barrels: { type: "quest", category: "destruction", target: 10, xp: 30 }, quest_lockers: { type: "quest", category: "destruction", target: 10, xp: 30 }, quest_pots: { type: "quest", category: "destruction", target: 8, xp: 30 }, quest_vending: { type: "quest", category: "destruction", target: 1, xp: 40 }, quest_club_kills: { type: "quest", category: "location", target: 2, xp: 40 } }; var EmoteSlot = /* @__PURE__ */ ((EmoteSlot2) => { EmoteSlot2[EmoteSlot2["Top"] = 0] = "Top"; EmoteSlot2[EmoteSlot2["Right"] = 1] = "Right"; EmoteSlot2[EmoteSlot2["Bottom"] = 2] = "Bottom"; EmoteSlot2[EmoteSlot2["Left"] = 3] = "Left"; EmoteSlot2[EmoteSlot2["Win"] = 4] = "Win"; EmoteSlot2[EmoteSlot2["Death"] = 5] = "Death"; EmoteSlot2[EmoteSlot2["Count"] = 6] = "Count"; return EmoteSlot2; })(EmoteSlot || {}); var DamageType = /* @__PURE__ */ ((DamageType2) => { DamageType2[DamageType2["Player"] = 0] = "Player"; DamageType2[DamageType2["Bleeding"] = 1] = "Bleeding"; DamageType2[DamageType2["Gas"] = 2] = "Gas"; DamageType2[DamageType2["Airdrop"] = 3] = "Airdrop"; DamageType2[DamageType2["Airstrike"] = 4] = "Airstrike"; return DamageType2; })(DamageType || {}); var Action = /* @__PURE__ */ ((Action2) => { Action2[Action2["None"] = 0] = "None"; Action2[Action2["Reload"] = 1] = "Reload"; Action2[Action2["ReloadAlt"] = 2] = "ReloadAlt"; Action2[Action2["UseItem"] = 3] = "UseItem"; Action2[Action2["Revive"] = 4] = "Revive"; return Action2; })(Action || {}); var WeaponSlot = /* @__PURE__ */ ((WeaponSlot2) => { WeaponSlot2[WeaponSlot2["Primary"] = 0] = "Primary"; WeaponSlot2[WeaponSlot2["Secondary"] = 1] = "Secondary"; WeaponSlot2[WeaponSlot2["Melee"] = 2] = "Melee"; WeaponSlot2[WeaponSlot2["Throwable"] = 3] = "Throwable"; WeaponSlot2[WeaponSlot2["Count"] = 4] = "Count"; return WeaponSlot2; })(WeaponSlot || {}); var GasMode = /* @__PURE__ */ ((GasMode2) => { GasMode2[GasMode2["Inactive"] = 0] = "Inactive"; GasMode2[GasMode2["Waiting"] = 1] = "Waiting"; GasMode2[GasMode2["Moving"] = 2] = "Moving"; return GasMode2; })(GasMode || {}); var Anim = /* @__PURE__ */ ((Anim2) => { Anim2[Anim2["None"] = 0] = "None"; Anim2[Anim2["Melee"] = 1] = "Melee"; Anim2[Anim2["Cook"] = 2] = "Cook"; Anim2[Anim2["Throw"] = 3] = "Throw"; Anim2[Anim2["CrawlForward"] = 4] = "CrawlForward"; Anim2[Anim2["CrawlBackward"] = 5] = "CrawlBackward"; Anim2[Anim2["Revive"] = 6] = "Revive"; return Anim2; })(Anim || {}); var Plane = /* @__PURE__ */ ((Plane2) => { Plane2[Plane2["Airdrop"] = 0] = "Airdrop"; Plane2[Plane2["Airstrike"] = 1] = "Airstrike"; return Plane2; })(Plane || {}); var HasteType = /* @__PURE__ */ ((HasteType2) => { HasteType2[HasteType2["None"] = 0] = "None"; HasteType2[HasteType2["Windwalk"] = 1] = "Windwalk"; HasteType2[HasteType2["Takedown"] = 2] = "Takedown"; HasteType2[HasteType2["Inspire"] = 3] = "Inspire"; return HasteType2; })(HasteType || {}); var Input = /* @__PURE__ */ ((Input2) => { Input2[Input2["MoveLeft"] = 0] = "MoveLeft"; Input2[Input2["MoveRight"] = 1] = "MoveRight"; Input2[Input2["MoveUp"] = 2] = "MoveUp"; Input2[Input2["MoveDown"] = 3] = "MoveDown"; Input2[Input2["Fire"] = 4] = "Fire"; Input2[Input2["Reload"] = 5] = "Reload"; Input2[Input2["Cancel"] = 6] = "Cancel"; Input2[Input2["Interact"] = 7] = "Interact"; Input2[Input2["Revive"] = 8] = "Revive"; Input2[Input2["Use"] = 9] = "Use"; Input2[Input2["Loot"] = 10] = "Loot"; Input2[Input2["EquipPrimary"] = 11] = "EquipPrimary"; Input2[Input2["EquipSecondary"] = 12] = "EquipSecondary"; Input2[Input2["EquipMelee"] = 13] = "EquipMelee"; Input2[Input2["EquipThrowable"] = 14] = "EquipThrowable"; Input2[Input2["EquipFragGrenade"] = 15] = "EquipFragGrenade"; Input2[Input2["EquipSmokeGrenade"] = 16] = "EquipSmokeGrenade"; Input2[Input2["EquipNextWeap"] = 17] = "EquipNextWeap"; Input2[Input2["EquipPrevWeap"] = 18] = "EquipPrevWeap"; Input2[Input2["EquipLastWeap"] = 19] = "EquipLastWeap"; Input2[Input2["EquipOtherGun"] = 20] = "EquipOtherGun"; Input2[Input2["EquipPrevScope"] = 21] = "EquipPrevScope"; Input2[Input2["EquipNextScope"] = 22] = "EquipNextScope"; Input2[Input2["UseBandage"] = 23] = "UseBandage"; Input2[Input2["UseHealthKit"] = 24] = "UseHealthKit"; Input2[Input2["UseSoda"] = 25] = "UseSoda"; Input2[Input2["UsePainkiller"] = 26] = "UsePainkiller"; Input2[Input2["StowWeapons"] = 27] = "StowWeapons"; Input2[Input2["SwapWeapSlots"] = 28] = "SwapWeapSlots"; Input2[Input2["ToggleMap"] = 29] = "ToggleMap"; Input2[Input2["CycleUIMode"] = 30] = "CycleUIMode"; Input2[Input2["EmoteMenu"] = 31] = "EmoteMenu"; Input2[Input2["TeamPingMenu"] = 32] = "TeamPingMenu"; Input2[Input2["Fullscreen"] = 33] = "Fullscreen"; Input2[Input2["HideUI"] = 34] = "HideUI"; Input2[Input2["TeamPingSingle"] = 35] = "TeamPingSingle"; Input2[Input2["Count"] = 36] = "Count"; return Input2; })(Input || {}); const GameConfig = { protocolVersion: 78, Input, EmoteSlot, WeaponSlot, WeaponType: ["gun", "gun", "melee", "throwable"], DamageType, Action, Anim, GasMode, Plane, HasteType, gas: { damageTickRate: 2 }, map: { gridSize: 16, shoreVariation: 3, grassVariation: 2 }, player: { radius: 1, maxVisualRadius: 3.75, maxInteractionRad: 3.5, health: 100, reviveHealth: 24, minActiveTime: 10, boostDecay: 0.33, boostMoveSpeed: 1.85, boostHealAmount: 0.33, boostBreakpoints: [1, 1, 1.5, 0.5], scopeDelay: 0.25, baseSwitchDelay: 0.25, freeSwitchCooldown: 1, headshotChance: 0.15, moveSpeed: 12, waterSpeedPenalty: 3, cookSpeedPenalty: 3, frozenSpeedPenalty: 3, hasteSpeedBonus: 4.8, bleedTickRate: 1, downedMoveSpeed: 4, downedRezMoveSpeed: 2, keepZoomWhileDowned: false, reviveDuration: 8, reviveRange: 5, crawlTime: 0.75, teammateSpawnRadius: 5, // radius of circle that teammates spawn inside of, relative to the first player on the team to join emoteSoftCooldown: 2, emoteHardCooldown: 6, emoteThreshold: 6, throwableMaxMouseDist: 18, cookTime: 0.1, throwTime: 0.3, meleeHeight: 0.25, touchLootRadMult: 1.4, medicHealRange: 8, medicReviveRange: 6, spectateDeadTimeout: 2, killLeaderMinKills: 3, minSpawnRad: 25, /* STRIP_FROM_PROD_CLIENT:START */ defaultItems: { weapons: [ { type: "", ammo: 0 }, { type: "", ammo: 0 }, { type: "fists", ammo: 0 }, { type: "", ammo: 0 } ], outfit: "outfitBase", backpack: "backpack00", helmet: "", chest: "", scope: "1xscope", perks: [], inventory: { "9mm": 0, "762mm": 0, "556mm": 0, "12gauge": 0, "50AE": 0, "308sub": 0, flare: 0, "45acp": 0, frag: 0, smoke: 0, strobe: 0, mirv: 0, snowball: 0, potato: 0, bandage: 0, healthkit: 0, soda: 0, painkiller: 0, "1xscope": 1, "2xscope": 0, "4xscope": 0, "8xscope": 0, "15xscope": 0 } } /* STRIP_FROM_PROD_CLIENT:END */ }, defaultEmoteLoadout: [ "emote_happyface", "emote_thumbsup", "emote_surviv", "emote_sadface", "", "" ], airdrop: { actionOffset: 0, fallTime: 8, crushDamage: 100, planeVel: 48, planeRad: 150, soundRangeMult: 2.5, soundRangeDelta: 0.25, soundRangeMax: 92, fallOff: 0 }, airstrike: { actionOffset: 0, bombJitter: 4, bombOffset: 2, bombVel: 3, bombCount: 20, planeVel: 350, planeRad: 120, soundRangeMult: 18, soundRangeDelta: 18, soundRangeMax: 48, fallOff: 1.25 }, groupColors: [16776960, 16711935, 65535, 16733184], teamColors: [13369344, 32511], bullet: { maxReflect: 3, reflectDistDecay: 1.5, height: 0.25, falloff: true }, projectile: { maxHeight: 5 }, structureLayerCount: 2, tracerColors: { "9mm": { regular: 16704198, saturated: 16767411, chambered: 16744192, alphaRate: 0.92, alphaMin: 0.14 }, "9mm_suppressed_bonus": { regular: 16704198, saturated: 16767411, chambered: 16744192, alphaRate: 0.96, alphaMin: 0.28 }, "9mm_cursed": { regular: 1247488, saturated: 1247488, chambered: 1247488, alphaRate: 0.92, alphaMin: 0.14 }, "762mm": { regular: 12965630, saturated: 11257087, chambered: 19711, alphaRate: 0.94, alphaMin: 0.2 }, "12gauge": { regular: 16702684, saturated: 16702684, chambered: 16711680 }, "556mm": { regular: 11141010, saturated: 11141010, chambered: 3604224, alphaRate: 0.92, alphaMin: 0.14 }, "50AE": { regular: 16773256, saturated: 16773256, chambered: 16768768 }, "308sub": { regular: 2435840, saturated: 4608e3, chambered: 1250816, alphaRate: 0.92, alphaMin: 0.07 }, flare: { regular: 14869218, saturated: 14869218, chambered: 12895428 }, "45acp": { regular: 15515391, saturated: 15183103, chambered: 11862271 }, shrapnel: { regular: 3355443, saturated: 3355443 }, frag: { regular: 13303808, saturated: 13303808 }, invis: { regular: 0, saturated: 0, chambered: 0 } }, scopeZoomRadius: { desktop: { "1xscope": 28, "2xscope": 36, "4xscope": 48, "8xscope": 68, "15xscope": 104 }, mobile: { "1xscope": 32, "2xscope": 40, "4xscope": 48, "8xscope": 64, "15xscope": 88 } }, bagSizes: { "9mm": [120, 240, 330, 420], "762mm": [90, 180, 240, 300], "556mm": [90, 180, 240, 300], "12gauge": [15, 30, 60, 90], "50AE": [49, 98, 147, 196], "308sub": [10, 20, 40, 80], flare: [2, 4, 6, 8], "45acp": [90, 180, 240, 300], frag: [3, 6, 9, 12], smoke: [3, 6, 9, 12], strobe: [2, 3, 4, 5], mirv: [2, 4, 6, 8], snowball: [10, 20, 30, 40], potato: [10, 20, 30, 40], bandage: [5, 10, 15, 30], healthkit: [1, 2, 3, 4], soda: [2, 5, 10, 15], painkiller: [1, 2, 3, 4], "1xscope": [1, 1, 1, 1], "2xscope": [1, 1, 1, 1], "4xscope": [1, 1, 1, 1], "8xscope": [1, 1, 1, 1], "15xscope": [1, 1, 1, 1] }, lootRadius: { outfit: 1, melee: 1.25, gun: 1.25, throwable: 1, ammo: 1.2, heal: 1, boost: 1, backpack: 1, helmet: 1, chest: 1, scope: 1, perk: 1.25, xp: 1 } }; const Main = { mapId: 0, desc: { name: "Normal", icon: "", buttonCss: "" }, assets: { audio: [ { name: "club_music_01", channel: "ambient" }, { name: "club_music_02", channel: "ambient" }, { name: "ambient_steam_01", channel: "ambient" }, { name: "log_11", channel: "sfx" }, { name: "log_12", channel: "sfx" } ], atlases: ["gradient", "loadout", "shared", "main"] }, biome: { colors: { background: 2118510, water: 3310251, waterRipple: 11792639, beach: 13480795, riverbank: 9461284, grass: 8433481, underground: 1772803, playerSubmerge: 2854052, playerGhillie: 8630096 }, valueAdjust: 1, sound: { riverShore: "sand" }, particles: { camera: "" }, tracerColors: {}, airdrop: { planeImg: "map-plane-01.img", planeSound: "plane_01", airdropImg: "map-chute-01.img" } }, gameMode: { maxPlayers: 80, killLeaderEnabled: true }, gameConfig: { planes: { timings: [ { circleIdx: 1, wait: 10, options: { type: GameConfig.Plane.Airdrop } }, { circleIdx: 3, wait: 2, options: { type: GameConfig.Plane.Airdrop } } ], crates: [ { name: "airdrop_crate_01", weight: 10 }, { name: "airdrop_crate_02", weight: 1 } ] }, bagSizes: {}, bleedDamage: 2, bleedDamageMult: 1 }, /* STRIP_FROM_PROD_CLIENT:START */ // NOTE: this loot table is not the original one so its not accurate // ? are guesses based on statistics // ! are uncertain data based on leak lootTable: { tier_world: [ { name: "tier_guns", count: 1, weight: 0.29 }, // TODO get more data on this from original { name: "tier_ammo", count: 1, weight: 0.04 }, // ? { name: "tier_scopes", count: 1, weight: 0.15 }, // ? { name: "tier_armor", count: 1, weight: 0.1 }, // ? { name: "tier_medical", count: 1, weight: 0.17 }, // ? { name: "tier_throwables", count: 1, weight: 0.05 }, // ? { name: "tier_packs", count: 1, weight: 0.09 } // ? ], tier_surviv: [ { name: "tier_scopes", count: 1, weight: 0.15 }, // TODO get more data on this from original { name: "tier_armor", count: 1, weight: 0.1 }, // ? { name: "tier_medical", count: 1, weight: 0.17 }, // ? { name: "tier_throwables", count: 1, weight: 0.05 }, // ? { name: "tier_packs", count: 1, weight: 0.09 } // ? ], tier_container: [ { name: "tier_guns", count: 1, weight: 0.29 }, { name: "tier_ammo", count: 1, weight: 0.04 }, { name: "tier_scopes", count: 1, weight: 0.15 }, { name: "tier_armor", count: 1, weight: 0.1 }, { name: "tier_medical", count: 1, weight: 0.17 }, { name: "tier_throwables", count: 1, weight: 0.05 }, { name: "tier_packs", count: 1, weight: 0.09 }, { name: "tier_outfits", count: 1, weight: 0.035 } // ! ], tier_leaf_pile: [ { name: "tier_ammo", count: 1, weight: 0.2 }, { name: "tier_scopes", count: 1, weight: 0.2 }, { name: "tier_armor", count: 1, weight: 0.2 }, { name: "tier_medical", count: 1, weight: 0.2 }, { name: "tier_throwables", count: 1, weight: 0.15 }, { name: "tier_packs", count: 1, weight: 0.05 } ], tier_soviet: [ { name: "tier_guns", count: 1, weight: 3 }, // ? { name: "tier_armor", count: 1, weight: 2 }, // ? { name: "tier_packs", count: 1, weight: 1 } // ? ], tier_toilet: [ { name: "tier_guns", count: 1, weight: 0.1 }, { name: "tier_scopes", count: 1, weight: 0.05 }, { name: "tier_medical", count: 1, weight: 0.6 }, { name: "tier_throwables", count: 1, weight: 0.05 }, { name: "tier_outfits", count: 1, weight: 0.025 } // ! ], tier_scopes: [ { name: "2xscope", count: 1, weight: 24 }, { name: "4xscope", count: 1, weight: 5 }, { name: "8xscope", count: 1, weight: 1 }, // ? { name: "15xscope", count: 1, weight: 0.02 } // ? ], tier_armor: [ { name: "helmet01", count: 1, weight: 9 }, // ! { name: "helmet02", count: 1, weight: 6 }, { name: "helmet03", count: 1, weight: 0.2 }, { name: "chest01", count: 1, weight: 15 }, // ! { name: "chest02", count: 1, weight: 6 }, { name: "chest03", count: 1, weight: 0.2 } ], tier_packs: [ { name: "backpack01", count: 1, weight: 15 }, // ! { name: "backpack02", count: 1, weight: 6 }, { name: "backpack03", count: 1, weight: 0.2 } ], tier_medical: [ { name: "bandage", count: 5, weight: 16 }, { name: "healthkit", count: 1, weight: 4 }, { name: "soda", count: 1, weight: 15 }, { name: "painkiller", count: 1, weight: 5 } ], tier_throwables: [ { name: "frag", count: 2, weight: 1 }, // ! { name: "smoke", count: 1, weight: 1 }, { name: "mirv", count: 2, weight: 0.05 } ], tier_ammo: [ { name: "9mm", count: 60, weight: 3 }, { name: "762mm", count: 60, weight: 3 }, { name: "556mm", count: 60, weight: 3 }, { name: "12gauge", count: 10, weight: 3 } ], tier_ammo_crate: [ { name: "9mm", count: 60, weight: 3 }, { name: "762mm", count: 60, weight: 3 }, { name: "556mm", count: 60, weight: 3 }, { name: "12gauge", count: 10, weight: 3 }, { name: "50AE", count: 21, weight: 1 }, { name: "308sub", count: 5, weight: 1 }, { name: "flare", count: 1, weight: 1 } ], tier_vending_soda: [ { name: "soda", count: 1, weight: 1 }, // ? { name: "tier_ammo", count: 1, weight: 1 } // ? ], tier_sv98: [{ name: "sv98", count: 1, weight: 1 }], tier_scopes_sniper: [ { name: "4xscope", count: 1, weight: 5 }, // ? { name: "8xscope", count: 1, weight: 1 }, // ? { name: "15xscope", count: 1, weight: 0.02 } // ? ], tier_mansion_floor: [{ name: "outfitCasanova", count: 1, weight: 1 }], tier_vault_floor: [{ name: "outfitJester", count: 1, weight: 1 }], tier_police_floor: [{ name: "outfitPrisoner", count: 1, weight: 1 }], tier_chrys_01: [{ name: "outfitImperial", count: 1, weight: 1 }], tier_chrys_02: [{ name: "katana", count: 1, weight: 1 }], tier_chrys_03: [ { name: "2xscope", count: 1, weight: 5 }, // ? { name: "4xscope", count: 1, weight: 5 }, // ? { name: "8xscope", count: 1, weight: 5 }, // ? { name: "15xscope", count: 1, weight: 0.1 } // ? ], tier_chrys_case: [ { name: "", count: 1, weight: 5 }, // ? { name: "tier_katanas", count: 1, weight: 3 }, // ? { name: "naginata", count: 1, weight: 1 } // ? ], tier_eye_02: [{ name: "stonehammer", count: 1, weight: 1 }], tier_eye_block: [ { name: "m9", count: 1, weight: 1 }, { name: "ots38_dual", count: 1, weight: 1 }, { name: "flare_gun", count: 1, weight: 1 }, { name: "colt45", count: 1, weight: 1 }, { name: "45acp", count: 1, weight: 1 }, { name: "painkiller", count: 1, weight: 1 }, { name: "m4a1", count: 1, weight: 1 }, { name: "m249", count: 1, weight: 1 }, { name: "awc", count: 1, weight: 1 }, { name: "pkp", count: 1, weight: 1 } ], tier_sledgehammer: [{ name: "sledgehammer", count: 1, weight: 1 }], tier_chest_04: [ { name: "p30l", count: 1, weight: 40 }, // ? { name: "p30l_dual", count: 1, weight: 1 } // ? ], tier_woodaxe: [{ name: "woodaxe", count: 1, weight: 1 }], tier_club_melee: [{ name: "machete_taiga", count: 1, weight: 1 }], tier_guns: [ { name: "famas", count: 1, weight: 0.9 }, { name: "hk416", count: 1, weight: 4 }, { name: "mk12", count: 1, weight: 0.1 }, { name: "pkp", count: 1, weight: 5e-3 }, { name: "m249", count: 1, weight: 6e-3 }, { name: "ak47", count: 1, weight: 2.7 }, { name: "scar", count: 1, weight: 0.01 }, { name: "dp28", count: 1, weight: 0.5 }, { name: "mosin", count: 1, weight: 0.1 }, { name: "m39", count: 1, weight: 0.1 }, { name: "mp5", count: 1, weight: 10 }, { name: "mac10", count: 1, weight: 6 }, { name: "ump9", count: 1, weight: 3 }, { name: "m870", count: 1, weight: 9 }, { name: "m1100", count: 1, weight: 6 }, { name: "mp220", count: 1, weight: 2 }, { name: "saiga", count: 1, weight: 0.1 }, { name: "ot38", count: 1, weight: 8 }, { name: "m9", count: 1, weight: 19 }, { name: "m93r", count: 1, weight: 5 }, { name: "glock", count: 1, weight: 7 }, { name: "deagle", count: 1, weight: 0.05 }, { name: "vector", count: 1, weight: 0.01 }, { name: "sv98", count: 1, weight: 0.01 }, { name: "spas12", count: 1, weight: 1 }, { name: "qbb97", count: 1, weight: 0.01 }, { name: "flare_gun", count: 1, weight: 0.145 }, // ! { name: "flare_gun_dual", count: 1, weight: 25e-4 }, // ! { name: "groza", count: 1, weight: 0.8 }, { name: "scout_elite", count: 1, weight: 0.05 }, { name: "vss", count: 1, weight: 0.05 } // ! ], tier_police: [ { name: "scar", count: 1, weight: 0.5 }, { name: "helmet03", count: 1, weight: 0.15 }, { name: "chest03", count: 1, weight: 0.1 }, { name: "backpack03", count: 1, weight: 0.25 } ], tier_ring_case: [ { name: "grozas", count: 1, weight: 0.75 }, // ? { name: "ots38_dual", count: 1, weight: 0.15 }, // ? { name: "pkp", count: 1, weight: 0.1 }, // ? { name: "m9", count: 1, weight: 0.01 } // ? ], tier_chest: [ { name: "famas", count: 1, weight: 1.15 }, { name: "hk416", count: 1, weight: 4 }, { name: "mk12", count: 1, weight: 0.55 }, { name: "m249", count: 1, weight: 0.07 }, { name: "ak47", count: 1, weight: 4 }, { name: "scar", count: 1, weight: 0.27 }, { name: "dp28", count: 1, weight: 0.55 }, { name: "mosin", count: 1, weight: 0.55 }, { name: "m39", count: 1, weight: 0.55 }, { name: "saiga", count: 1, weight: 0.26 }, { name: "mp220", count: 1, weight: 1.5 }, { name: "deagle", count: 1, weight: 0.15 }, { name: "vector", count: 1, weight: 0.1 }, { name: "sv98", count: 1, weight: 0.1 }, { name: "spas12", count: 1, weight: 1 }, { name: "groza", count: 1, weight: 1.15 }, { name: "helmet02", count: 1, weight: 1 }, { name: "helmet03", count: 1, weight: 0.25 }, { name: "chest02", count: 1, weight: 1 }, { name: "chest03", count: 1, weight: 0.25 }, { name: "4xscope", count: 1, weight: 0.5 }, { name: "8xscope", count: 1, weight: 0.25 } ], tier_conch: [ { name: "outfitAqua", count: 1, weight: 1 }, { name: "outfitCoral", count: 1, weight: 1 } ], tier_noir_outfit: [{ name: "outfitNoir", count: 1, weight: 1 }], tier_khaki_outfit: [{ name: "outfitKhaki", count: 1, weight: 1 }], tier_pirate_melee: [{ name: "hook", count: 1, weight: 1 }], tier_hatchet: [ { name: "vector", count: 1, weight: 0.4 }, { name: "hk416", count: 1, weight: 0.25 }, { name: "mp220", count: 1, weight: 0.15 }, { name: "pkp", count: 1, weight: 0.01 }, { name: "m249", count: 1, weight: 0.01 }, { name: "m9", count: 1, weight: 0.01 } ], tier_lmgs: [ { name: "dp28", count: 1, weight: 2 }, // ? { name: "bar", count: 1, weight: 1.5 }, // ? { name: "qbb97", count: 1, weight: 0.5 }, // ? { name: "m249", count: 1, weight: 0.05 }, // ? { name: "pkp", count: 1, weight: 0.05 } // ? ], tier_shotguns: [ { name: "spas12", count: 1, weight: 2 }, // ? { name: "mp220", count: 1, weight: 1.5 }, // ? { name: "m1100", count: 1, weight: 1 }, // ? { name: "m870", count: 1, weight: 1 }, // ? { name: "saiga", count: 1, weight: 0.15 }, // ? { name: "usas", count: 1, weight: 0.01 } // ? ], tier_hatchet_melee: [ { name: "fireaxe", count: 1, weight: 5 }, // ? { name: "tier_katanas", count: 1, weight: 3 }, // ? { name: "stonehammer", count: 1, weight: 1 } // ? ], tier_pavilion: [ { name: "naginata", count: 1, weight: 2 }, // ? { name: "pkp", count: 1, weight: 2 }, // ? { name: "dp28", count: 1, weight: 1 }, // ? { name: "bar", count: 1, weight: 1 }, // ? { name: "m9", count: 1, weight: 1 } // ? ], tier_forest_helmet: [{ name: "helmet03_forest", count: 1, weight: 1 }], tier_outfits: [ { name: "outfitCobaltShell", count: 1, weight: 0.2 }, // ? { name: "outfitKeyLime", count: 1, weight: 0.15 }, // ? { name: "outfitWoodland", count: 1, weight: 0.1 }, // ? { name: "outfitCamo", count: 1, weight: 0.1 }, // ? { name: "outfitGhillie", count: 1, weight: 0.01 } // ? ], tier_islander_outfit: [{ name: "outfitIslander", count: 1, weight: 1 }], tier_imperial_outfit: [{ name: "outfitImperial", count: 1, weight: 1 }], tier_pineapple_outfit: [{ name: "outfitPineapple", count: 1, weight: 1 }], tier_tarkhany_outfit: [{ name: "outfitTarkhany", count: 1, weight: 1 }], tier_spetsnaz_outfit: [{ name: "outfitSpetsnaz", count: 1, weight: 1 }], tier_lumber_outfit: [{ name: "outfitLumber", count: 1, weight: 1 }], tier_verde_outfit: [{ name: "outfitVerde", count: 1, weight: 1 }], tier_airdrop_uncommon: [ { name: "mk12", count: 1, weight: 2.5 }, { name: "scar", count: 1, weight: 0.75 }, { name: "mosin", count: 1, weight: 2.5 }, { name: "m39", count: 1, weight: 2.5 }, { name: "saiga", count: 1, weight: 1 }, { name: "deagle", count: 1, weight: 1 }, { name: "vector", count: 1, weight: 1 }, { name: "sv98", count: 1, weight: 0.5 }, { name: "qbb97", count: 1, weight: 1.5 }, { name: "m9", count: 1, weight: 0.01 }, { name: "flare_gun", count: 1, weight: 0.5 }, { name: "scout_elite", count: 1, weight: 1.5 }, { name: "vss", count: 1, weight: 1.5 } // ! ], tier_airdrop_rare: [ { name: "garand", count: 1, weight: 6 }, { name: "awc", count: 1, weight: 3 }, { name: "pkp", count: 1, weight: 0.08 }, { name: "m249", count: 1, weight: 0.1 }, { name: "m4a1", count: 1, weight: 4 }, { name: "scorpion", count: 1, weight: 5 }, // ? { name: "ots38_dual", count: 1, weight: 4.5 } ], tier_airdrop_mythic: [ { name: "scarssr", count: 1, weight: 1 }, // ? { name: "usas", count: 1, weight: 1 }, // ? { name: "p30l_dual", count: 1, weight: 1 } // ? ], tier_airdrop_ammo: [ { name: "9mm", count: 30, weight: 3 }, { name: "762mm", count: 30, weight: 3 }, { name: "556mm", count: 30, weight: 3 }, { name: "12gauge", count: 5, weight: 3 } ], tier_airdrop_outfits: [ { name: "", count: 1, weight: 20 }, { name: "outfitMeteor", count: 1, weight: 5 }, // ! { name: "outfitHeaven", count: 1, weight: 1 }, // ! { name: "outfitGhillie", count: 1, weight: 0.5 } ], tier_airdrop_throwables: [ { name: "frag", count: 2, weight: 1 }, { name: "mirv", count: 2, weight: 0.5 } ], tier_airdrop_melee: [ { name: "", count: 1, weight: 19 }, { name: "pan", count: 1, weight: 1 } ], tier_airdrop_armor: [ { name: "helmet03", count: 1, weight: 1 }, { name: "chest03", count: 1, weight: 1 }, { name: "backpack03", count: 1, weight: 1 } ], tier_airdrop_scopes: [ { name: "", count: 1, weight: 24 }, // ? { name: "4xscope", count: 1, weight: 5 }, // ? { name: "8xscope", count: 1, weight: 1 }, // ? { name: "15xscope", count: 1, weight: 0.02 } // ? ], tier_katanas: [ { name: "katana", count: 1, weight: 4 }, // ? { name: "katana_rusted", count: 1, weight: 4 }, // ? { name: "katana_orchid", count: 1, weight: 1 } // ? ], tier_stonehammer: [{ name: "stonehammer", count: 1, weight: 1 }], tier_saloon: [ { name: "vector45", count: 1, weight: 1 }, { name: "mkg45", count: 1, weight: 1 } ], tier_pumpkin_perks: [{ name: "halloween_mystery", count: 1, weight: 1 }], tier_xp_uncommon: [ { name: "xp_book_tallow", count: 1, weight: 1 }, { name: "xp_book_greene", count: 1, weight: 1 }, { name: "xp_book_parma", count: 1, weight: 1 }, { name: "xp_book_nevelskoy", count: 1, weight: 1 }, { name: "xp_book_rinzo", count: 1, weight: 1 }, { name: "xp_book_kuga", count: 1, weight: 1 } ], tier_xp_rare: [ { name: "xp_glasses", count: 1, weight: 0.1 }, { name: "xp_compass", count: 1, weight: 0.1 }, { name: "xp_stump", count: 1, weight: 0.1 }, { name: "xp_bone", count: 1, weight: 0.1 } ], tier_xp_mythic: [{ name: "xp_donut", count: 1, weight: 0.01 }], // xp and halloween perks guessed with no base on real data! tier_fruit_xp: [ { name: "", count: 1, weight: 40 } /* commented until we have a pass so the xp artifacts do something { name: "tier_xp_uncommon", count: 1, weight: 1 }, { name: "tier_xp_rare", count: 1, weight: 0.1 }, { name: "tier_xp_mythic", count: 1, weight: 0.001 }, */ ], tier_airdrop_xp: [ { name: "", count: 1, weight: 15 } /* { name: "tier_xp_uncommon", count: 1, weight: 1 }, { name: "tier_xp_rare", count: 1, weight: 0.1 }, { name: "tier_xp_mythic", count: 1, weight: 0.001 }, */ ], tier_halloween_mystery_perks: [ { name: "trick_nothing", count: 1, weight: 1 }, { name: "trick_size", count: 1, weight: 1 }, { name: "trick_m9", count: 1, weight: 1 }, { name: "trick_chatty", count: 1, weight: 1 }, { name: "trick_drain", count: 1, weight: 1 }, { name: "treat_9mm", count: 1, weight: 1 }, { name: "treat_12g", count: 1, weight: 1 }, { name: "treat_556", count: 1, weight: 1 }, { name: "treat_762", count: 1, weight: 1 }, { name: "treat_super", count: 1, weight: 0.1 } ] }, mapGen: { map: { baseWidth: 512, baseHeight: 512, scale: { small: 1.1875, large: 1.28125 }, extension: 112, shoreInset: 48, grassInset: 18, rivers: { lakes: [], weights: [ { weight: 0.1, widths: [4] }, { weight: 0.15, widths: [8] }, { weight: 0.25, widths: [8, 4] }, { weight: 0.21, widths: [16] }, { weight: 0.09, widths: [16, 8] }, { weight: 0.2, widths: [16, 8, 4] }, { weight: 1e-4, widths: [16, 16, 8, 6, 4] } ], smoothness: 0.45, masks: [] } }, places: [ { name: "The Killpit", pos: v2.create(0.53, 0.64) }, { name: "Sweatbath", pos: v2.create(0.84, 0.18) }, { name: "Tarkhany", pos: v2.create(0.15, 0.11) }, { name: "Ytyk-Kyuyol", pos: v2.create(0.25, 0.42) }, { name: "Todesfelde", pos: v2.create(0.81, 0.85) }, { name: "Pineapple", pos: v2.create(0.21, 0.79) }, { name: "Fowl Forest", pos: v2.create(0.73, 0.47) }, { name: "Ranchito Pollo", pos: v2.create(0.53, 0.25) } ], bridgeTypes: { medium: "bridge_md_structure_01", large: "bridge_lg_structure_01", xlarge: "" }, riverCabins: { cabin_01: 3 }, customSpawnRules: { locationSpawns: [ { type: "club_complex_01", pos: v2.create(0.5, 0.5), rad: 150, retryOnFailure: true } ], placeSpawns: ["warehouse_01", "house_red_01", "house_red_02", "barn_01"] }, densitySpawns: [ { stone_01: 350, barrel_01: 76, silo_01: 8, crate_01: 50, crate_02: 4, crate_03: 8, bush_01: 78, cache_06: 12, tree_01: 320, hedgehog_01: 24, container_01: 5, container_02: 5, container_03: 5, container_04: 5, shack_01: 7, outhouse_01: 5, loot_tier_1: 24, loot_tier_beach: 4 } ], fixedSpawns: [ { // small is spawn count for solos and duos, large is spawn count for squads warehouse_01: 2, house_red_01: { small: 3, large: 4 }, house_red_02: { small: 3, large: 4 }, barn_01: { small: 1, large: 3 }, barn_02: 1, hut_01: 3, hut_02: 1, // spas hut hut_03: 1, // scout hut shack_03a: 2, shack_03b: { small: 2, large: 3 }, greenhouse_01: 1, cache_01: 1, cache_02: 1, // mosin tree cache_07: 1, bunker_structure_01: { odds: 0.05 }, bunker_structure_02: 1, bunker_structure_03: 1, bunker_structure_04: 1, bunker_structure_05: 1, warehouse_complex_01: 1, chest_01: 1, chest_03: { odds: 0.2 }, mil_crate_02: { odds: 0.25 }, tree_02: 3, teahouse_complex_01su: { small: 1, large: 2 }, stone_04: 1, club_complex_01: 1 } ], randomSpawns: [ { spawns: ["mansion_structure_01", "police_01", "bank_01"], choose: 2 } ], spawnReplacements: [{}], importantSpawns: ["club_complex_01"] } /* STRIP_FROM_PROD_CLIENT:END */ }; var TeamColor = /* @__PURE__ */ ((TeamColor2) => { TeamColor2[TeamColor2["Red"] = 1] = "Red"; TeamColor2[TeamColor2["Blue"] = 2] = "Blue"; return TeamColor2; })(TeamColor || {}); const mapDef = { mapId: 3, desc: { name: "50v50", icon: "img/gui/star.svg", buttonCss: "btn-mode-faction", buttonText: "50v50" }, assets: { audio: [ { name: "lt_assigned_01", channel: "ui" }, { name: "medic_assigned_01", channel: "ui" }, { name: "marksman_assigned_01", channel: "ui" }, { name: "recon_assigned_01", channel: "ui" }, { name: "grenadier_assigned_01", channel: "ui" }, { name: "bugler_assigned_01", channel: "ui" }, { name: "last_man_assigned_01", channel: "ui" }, { name: "ping_leader_01", channel: "ui" }, { name: "bugle_01", channel: "activePlayer" }, { name: "bugle_02", channel: "activePlayer" }, { name: "bugle_03", channel: "activePlayer" }, { name: "bugle_01", channel: "otherPlayers" }, { name: "bugle_02", channel: "otherPlayers" }, { name: "bugle_03", channel: "otherPlayers" } ], atlases: ["gradient", "loadout", "shared", "faction"] }, biome: { colors: { background: 333348, water: 465718, waterRipple: 11792639, beach: 9328178, riverbank: 6632211, grass: 5136680, underground: 1772803, playerSubmerge: 1192009, playerGhillie: 5005348 } }, gameMode: { maxPlayers: 100, factionMode: true, factions: 2 }, /* STRIP_FROM_PROD_CLIENT:START */ gameConfig: { planes: { timings: [ { circleIdx: 1, wait: 10, options: { type: GameConfig.Plane.Airstrike, numPlanes: [ { count: 3, weight: 5 }, { count: 4, weight: 1 }, { count: 5, weight: 0.1 } ], airstrikeZoneRad: 60, wait: 1.5, delay: 1 } }, { circleIdx: 2, wait: 6, options: { type: GameConfig.Plane.Airdrop } }, { circleIdx: 2, wait: 30, options: { type: GameConfig.Plane.Airstrike, numPlanes: [ { count: 3, weight: 4 }, { count: 4, weight: 1 }, { count: 5, weight: 0.1 } ], airstrikeZoneRad: 55, wait: 1.5, delay: 1 } }, { circleIdx: 3, wait: 8, options: { type: GameConfig.Plane.Airstrike, numPlanes: [ { count: 3, weight: 3 }, { count: 4, weight: 1 }, { count: 5, weight: 0.1 } ], airstrikeZoneRad: 50, wait: 1.5, delay: 1 } }, { circleIdx: 4, wait: 3, options: { type: GameConfig.Plane.Airdrop } }, { circleIdx: 4, wait: 21, options: { type: GameConfig.Plane.Airstrike, numPlanes: [ { count: 3, weight: 2 }, { count: 4, weight: 1 }, { count: 5, weight: 0.1 } ], airstrikeZoneRad: 45, wait: 1.5, delay: 1 } }, { circleIdx: 5, wait: 6, options: { type: GameConfig.Plane.Airstrike, numPlanes: [ { count: 3, weight: 1 }, { count: 4, weight: 1 }, { count: 5, weight: 0.1 } ], airstrikeZoneRad: 40, wait: 1.5, delay: 1 } } ], crates: [{ name: "airdrop_crate_03", weight: 1 }] }, roles: { timings: [ { role: "leader", circleIdx: 0, wait: 50 }, { role: () => util.weightedRandom([ { type: "lieutenant", weight: 1 }, { type: "marksman", weight: 1 }, { type: "recon", weight: 1 }, { type: "grenadier", weight: 1 } ]).type, circleIdx: 0, wait: 54 }, { role: "medic", circleIdx: 0, wait: 58 }, { role: "bugler", circleIdx: 0, wait: 62 } ] }, bagSizes: {}, bleedDamage: 2, bleedDamageMult: 1.25 }, lootTable: { tier_guns: [ { name: "famas", count: 1, weight: 0.9 }, { name: "hk416", count: 1, weight: 4 }, { name: "mk12", count: 1, weight: 0.1 }, { name: "pkp", count: 1, weight: 5e-3 }, { name: "m249", count: 1, weight: 6e-3 }, { name: "ak47", count: 1, weight: 2.7 }, { name: "scar", count: 1, weight: 0.01 }, { name: "dp28", count: 1, weight: 0.5 }, { name: "mosin", count: 1, weight: 0.1 }, { name: "m39", count: 1, weight: 0.1 }, { name: "vss", count: 1, weight: 0.1 }, { name: "mp5", count: 1, weight: 10 }, { name: "mac10", count: 1, weight: 6 }, { name: "ump9", count: 1, weight: 3 }, { name: "m870", count: 1, weight: 9 }, { name: "m1100", count: 1, weight: 6 }, { name: "mp220", count: 1, weight: 2 }, { name: "saiga", count: 1, weight: 0.1 }, { name: "ot38", count: 1, weight: 8 }, { name: "m9", count: 1, weight: 19 }, { name: "m93r", count: 1, weight: 5 }, { name: "glock", count: 1, weight: 7 }, { name: "deagle", count: 1, weight: 0.05 }, { name: "vector", count: 1, weight: 0.01 }, { name: "sv98", count: 1, weight: 0.01 }, { name: "spas12", count: 1, weight: 1 }, { name: "qbb97", count: 1, weight: 0.01 }, { name: "flare_gun", count: 1, weight: 0.1 }, { name: "groza", count: 1, weight: 0.8 }, { name: "scout_elite", count: 1, weight: 0.05 } ], tier_toilet: [ { name: "tier_guns", count: 1, weight: 0.1 }, { name: "tier_scopes", count: 1, weight: 0.05 }, { name: "tier_medical", count: 1, weight: 0.6 }, { name: "tier_throwables", count: 1, weight: 0.05 }, { name: "tier_faction_outfits", count: 1, weight: 0.025 } ], tier_container: [ { name: "tier_guns", count: 1, weight: 0.29 }, { name: "tier_ammo", count: 1, weight: 0.04 }, { name: "tier_scopes", count: 1, weight: 0.15 }, { name: "tier_armor", count: 1, weight: 0.1 }, { name: "tier_medical", count: 1, weight: 0.17 }, { name: "tier_throwables", count: 1, weight: 0.05 }, { name: "tier_packs", count: 1, weight: 0.09 }, { name: "tier_faction_outfits", count: 1, weight: 0.035 } ], tier_medical: [ { name: "bandage", count: 5, weight: 16 }, { name: "healthkit", count: 1, weight: 4 }, { name: "soda", count: 1, weight: 15 }, { name: "painkiller", count: 1, weight: 5 }, { name: "frag", count: 1, weight: 2 } ], tier_airdrop_uncommon: [ { name: "mk12", count: 1, weight: 2.5 }, { name: "scar", count: 1, weight: 0.75 }, { name: "mosin", count: 1, weight: 2.5 }, { name: "m39", count: 1, weight: 2.5 }, { name: "saiga", count: 1, weight: 1 }, { name: "deagle", count: 1, weight: 1 }, { name: "vector", count: 1, weight: 1 }, { name: "sv98", count: 1, weight: 0.5 }, { name: "qbb97", count: 1, weight: 1.5 }, { name: "m9", count: 1, weight: 0.01 }, { name: "scout_elite", count: 1, weight: 1.5 } ], tier_ghillie: [ { name: "outfitDarkGhillie", count: 1, weight: 0.5 } ], tier_airdrop_outfits: [ { name: "", count: 1, weight: 25 }, { name: "outfitHeaven", count: 1, weight: 1 }, { name: "outfitDarkGhillie", count: 1, weight: 0.5 } ], tier_ammo_crate: [ { name: "9mm", count: 60, weight: 3 }, { name: "762mm", count: 60, weight: 3 }, { name: "556mm", count: 60, weight: 3 }, { name: "12gauge", count: 10, weight: 3 }, { name: "50AE", count: 21, weight: 1 }, { name: "308sub", count: 5, weight: 1 } ], tier_mansion_floor: [{ name: "outfitCamo", count: 1, weight: 1 }], tier_conch: [{ name: "outfitKeyLime", count: 1, weight: 1 }], tier_chrys_01: [ { name: "outfitCarbonFiber", count: 1, weight: 1 } ] }, mapGen: { map: { baseWidth: 512, baseHeight: 512, scale: { small: 1.5, large: 1.5 }, extension: 112, shoreInset: 48, grassInset: 18, rivers: { weights: [ { weight: 1, widths: [20] }, { weight: 1, widths: [20, 4] }, { weight: 1, widths: [20, 8, 4] } ], smoothness: 0.15 } }, places: [ { name: "Riverside", pos: v2.create(0.51, 0.5) }, { name: "Pineapple", pos: v2.create(0.84, 0.18) }, { name: "Tarkhany", pos: v2.create(0.21, 0.79) } ], bridgeTypes: { medium: "bridge_md_structure_01", large: "bridge_lg_structure_01", xlarge: "bridge_xlg_structure_01" }, customSpawnRules: { locationSpawns: [], placeSpawns: [] }, densitySpawns: [ { stone_01: 350, barrel_01: 76, silo_01: 8, crate_01: 38, crate_02f: 5, crate_22: 5, crate_03: 8, bush_01: 78, tree_08f: 320, hedgehog_01: 24, container_01: 5, container_02: 5, container_03: 5, container_04: 5, shack_01: 7, outhouse_01: 5, loot_tier_1: 24, loot_tier_beach: 4 } ], fixedSpawns: [ { warehouse_01f: 6, house_red_01: 4, house_red_02: 4, barn_01: 4, bank_01: 1, police_01: 1, hut_01: 4, hut_02: 1, shack_03a: 2, shack_03b: 3, greenhouse_01: 1, cache_01: 1, cache_02: 1, cache_07: 1, mansion_structure_01: 1, bunker_structure_01: { odds: 1 }, bunker_structure_03: 1, bunker_structure_04: 1, warehouse_complex_01: 1, chest_01: 1, chest_03f: 1, mil_crate_02: { odds: 1 }, tree_02: 3, river_town_01: 1 } ], randomSpawns: [], spawnReplacements: [ { bush_01: "bush_01f", crate_02: "crate_01", stone_01: "stone_01f", stone_03: "stone_03f", tree_01: "tree_08f" } ], importantSpawns: [ "river_town_01", "police_01", "bank_01", "mansion_structure_01", "warehouse_complex_01" ] } /* STRIP_FROM_PROD_CLIENT:END */ }; util.mergeDeep({}, Main, mapDef); function getTeamWeapon(colorToWeaponMap, teamcolor) { return colorToWeaponMap[teamcolor]; } function getTeamHelmet(colorToHelmetMap, teamcolor) { return colorToHelmetMap[teamcolor]; } function createDefaultItems(e) { const defaultItems = { weapons: [ { type: "", ammo: 0 }, { type: "", ammo: 0 }, { type: "fists", ammo: 0 }, { type: "", ammo: 0 } ], backpack: "backpack00", helmet: "", chest: "", outfit: "", scope: "1xscope", // perks: [] as Array<{ type: string; droppable?: boolean }>, inventory: { "9mm": 0, "762mm": 0, "556mm": 0, "12gauge": 0, "50AE": 0, "308sub": 0, flare: 0, "45acp": 0, frag: 0, smoke: 0, strobe: 0, mirv: 0, snowball: 0, potato: 0, bandage: 0, healthkit: 0, soda: 0, painkiller: 0, "1xscope": 1, "2xscope": 0, "4xscope": 0, "8xscope": 0, "15xscope": 0 } }; return util.mergeDeep(defaultItems, e || {}); } const RoleDefs = { leader: { type: "role", announce: true, killFeed: { assign: true, dead: true }, sound: { assign: "leader_assigned_01", dead: "leader_dead_01" }, mapIcon: { alive: "player-star.img", dead: "skull-leader.img" }, perks: ["leadership"], defaultItems: createDefaultItems({ weapons: [ (teamcolor) => getTeamWeapon( { [TeamColor.Red]: { type: "m1014", ammo: 8, fillInv: true }, [TeamColor.Blue]: { type: "an94", ammo: 45, fillInv: true } }, teamcolor ), { type: "flare_gun", ammo: 1 }, (teamcolor) => getTeamWeapon( { [TeamColor.Red]: { type: "machete_taiga", ammo: 0 }, [TeamColor.Blue]: { type: "kukri_trad", ammo: 0 } }, teamcolor ), { type: "", ammo: 0 } ], backpack: "backpack03", helmet: "helmet04_leader", chest: "chest03", outfit: (teamcolor) => ({ [TeamColor.Red]: "outfitRedLeader", [TeamColor.Blue]: "outfitBlueLeader" })[teamcolor], scope: "8xscope", inventory: { "8xscope": 1 } }) }, lieutenant: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "lt_assigned_01" }, perks: ["firepower"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, (teamcolor) => getTeamWeapon( { [TeamColor.Red]: { type: "m4a1", ammo: 40, fillInv: true }, [TeamColor.Blue]: { type: "grozas", ammo: 40, fillInv: true } }, teamcolor ), { type: "spade_assault", ammo: 0 }, { type: "", ammo: 0 } ], backpack: "backpack03", helmet: "helmet03_lt", chest: "chest03", scope: "4xscope", inventory: { "4xscope": 1 } }) }, medic: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "medic_assigned_01" }, mapIcon: { alive: "player-medic.img", dead: "skull-leader.img" }, perks: ["aoe_heal", "self_revive"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, { type: "", ammo: 0 }, { type: "bonesaw_rusted", ammo: 0 }, { type: "smoke", ammo: 0 } ], backpack: "backpack03", helmet: "helmet04_medic", chest: "chest03", scope: "4xscope", inventory: { "4xscope": 1, healthkit: 4, painkiller: 4, soda: 15, smoke: 6 } }) }, marksman: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "marksman_assigned_01" }, perks: ["targeting"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, (teamcolor) => getTeamWeapon( { [TeamColor.Red]: util.weightedRandom([ { type: "l86", ammo: 30, fillInv: true, weight: 0.9 }, { type: "scarssr", ammo: 10, fillInv: true, weight: 0.1 } ]), [TeamColor.Blue]: util.weightedRandom([ { type: "svd", ammo: 10, fillInv: true, weight: 0.9 }, { type: "scarssr", ammo: 10, fillInv: true, weight: 0.1 } ]) }, teamcolor ), { type: "kukri_sniper", ammo: 0 }, { type: "", ammo: 0 } ], backpack: "backpack03", helmet: "helmet03_marksman", chest: "chest03", scope: "4xscope", inventory: { "4xscope": 1 } }) }, recon: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "recon_assigned_01" }, perks: ["small_arms"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, { type: "glock_dual", ammo: 34, fillInv: true }, { type: "crowbar_recon", ammo: 0 }, { type: "", ammo: 0 } ], backpack: "backpack03", helmet: "helmet03_recon", chest: "chest03", scope: "4xscope", inventory: { "4xscope": 1, soda: 6 } }) }, grenadier: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "grenadier_assigned_01" }, perks: ["flak_jacket"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, { type: "mp220", ammo: 2, fillInv: true }, { type: "katana", ammo: 0 }, { type: "mirv", ammo: 8 } ], backpack: "backpack03", helmet: "helmet03_grenadier", chest: "chest03", scope: "4xscope", inventory: { mirv: 8, frag: 12, "4xscope": 1 } }) }, bugler: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "bugler_assigned_01" }, perks: ["inspiration", "final_bugle"], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, { type: "bugle", ammo: 1 }, { type: "", ammo: 0 }, { type: "", ammo: 0 } ], backpack: "backpack03", helmet: "helmet03_bugler", chest: "chest03", scope: "4xscope", inventory: { "4xscope": 1 } }) }, last_man: { type: "role", announce: true, killFeed: { assign: true }, sound: { assign: "last_man_assigned_01" }, perks: [ "steelskin", "splinter", () => util.weightedRandom([ { type: "takedown", weight: 1 }, { type: "windwalk", weight: 1 }, { type: "field_medic", weight: 1 } ]).type ], defaultItems: createDefaultItems({ weapons: [ { type: "", ammo: 0 }, (teamcolor) => getTeamWeapon( { [TeamColor.Red]: util.weightedRandom([ { type: "m249", ammo: 100, fillInv: true, weight: 1 }, { type: "pkp", ammo: 200, fillInv: true, weight: 1 } ]), [TeamColor.Blue]: util.weightedRandom([ { type: "m249", ammo: 100, fillInv: true, weight: 1 }, { type: "pkp", ammo: 200, fillInv: true, weight: 1 } ]) }, teamcolor ), { type: "", ammo: 0 }, { type: "mirv", ammo: 8 } ], backpack: "backpack03", helmet: (teamcolor) => getTeamHelmet( { [TeamColor.Red]: "helmet04_last_man_red", [TeamColor.Blue]: "helmet04_last_man_blue" }, teamcolor ), chest: "chest04", scope: "8xscope", inventory: { mirv: 8, "8xscope": 1 } }) }, woods_king: { type: "role", announce: false, killFeed: { dead: true, color: "#12ff00" }, sound: { dead: "leader_dead_01" }, perks: ["gotw", "windwalk"] }, kill_leader: { type: "role", announce: false, killFeed: { assign: true, dead: true, color: "#ff8400" }, sound: { assign: "leader_assigned_01", dead: "leader_dead_01" } }, the_hunted: { type: "role", announce: true, killFeed: { assign: true, dead: true, color: "#ff8400" }, sound: { assign: "leader_assigned_01", dead: "leader_dead_01" }, mapIndicator: { sprite: "player-the-hunted.img", tint: 16745472, pulse: true, pulseTint: 16745472 }, perks: ["hunted"] }, healer: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["field_medic", "windwalk"], visorImg: { baseSprite: "player-visor-healer.img", spriteScale: 0.3 }, guiImg: "img/gui/role-healer.svg", color: 11468975 }, tank: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["steelskin", "endless_ammo"], visorImg: { baseSprite: "player-visor-tank.img", spriteScale: 0.3 }, guiImg: "img/gui/role-tank.svg", color: 13862400 }, sniper: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["chambered", "takedown"], visorImg: { baseSprite: "player-visor-sniper.img", spriteScale: 0.3 }, guiImg: "img/gui/role-sniper.svg", color: 30696 }, scout: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["small_arms", "tree_climbing"], visorImg: { baseSprite: "player-visor-scout.img", spriteScale: 0.3 }, guiImg: "img/gui/role-scout.svg", color: 6725632 }, demo: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["fabricate", "flak_jacket"], visorImg: { baseSprite: "player-visor-demo.img", spriteScale: 0.3 }, guiImg: "img/gui/role-demo.svg", color: 6750976 }, assault: { type: "role", announce: false, sound: { assign: "spawn_01" }, perks: ["firepower", "bonus_assault"], visorImg: { baseSprite: "player-visor-assault.img", spriteScale: 0.3 }, guiImg: "img/gui/role-assault.svg", color: 16772119 } }; const ThrowableDefs = { frag: { name: "Frag Grenade", type: "throwable", quality: 0, explosionType: "explosion_frag", inventoryOrder: 1, cookable: true, explodeOnImpact: false, playerCollision: false, fuseTime: 4, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 20, spinVel: 10 * Math.PI, spinDrag: 1 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-frag.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-frag-nopin-nolever-01.img", scale: 0.12, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-frag-pin-01.img", pos: { x: 4.2, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-frag-nopin-01.img", pos: { x: 4.2, y: 4.2 }, scale: 0.14 }, left: { sprite: "proj-frag-pin-part.img", pos: { x: 4.2, y: 4.2 }, scale: 0.14 } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, mirv: { name: "MIRV Grenade", type: "throwable", quality: 1, explosionType: "explosion_mirv", inventoryOrder: 2, cookable: true, explodeOnImpact: false, playerCollision: false, fuseTime: 4, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 20, spinVel: 10 * Math.PI, spinDrag: 1 }, numSplit: 6, splitType: "mirv_mini", speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-mirv.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-mirv-nopin-nolever.img", scale: 0.13, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-mirv-pin.img", pos: { x: 4.2, y: 4.2 }, scale: 0.15 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-mirv-nopin.img", pos: { x: 4.2, y: 4.2 }, scale: 0.15 }, left: { sprite: "proj-frag-pin-part.img", pos: { x: 4.2, y: 4.2 }, scale: 0.15 } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, mirv_mini: { name: "MIRV Grenade", type: "throwable", quality: 0, explosionType: "explosion_mirv_mini", inventoryOrder: 99, cookable: true, noPotatoSwap: true, explodeOnImpact: false, playerCollision: false, fuseTime: 1.8, fuseVariance: 0.3, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 20, spinVel: 10 * Math.PI, spinDrag: 1 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-frag.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-mirv-mini-01.img", scale: 0.12, tint: 16777215 }, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, martyr_nade: { name: "Martyrdom", type: "throwable", quality: 0, explosionType: "explosion_martyr_nade", inventoryOrder: 99, cookable: true, noPotatoSwap: true, explodeOnImpact: false, playerCollision: false, fuseTime: 3, fuseVariance: 0.3, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 20, spinVel: 10 * Math.PI, spinDrag: 1 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-frag.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-martyrdom-01.img", scale: 0.12, tint: 16777215 }, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, smoke: { name: "Smoke Grenade", type: "throwable", quality: 0, explosionType: "explosion_smoke", inventoryOrder: 3, cookable: false, explodeOnImpact: false, playerCollision: false, fuseTime: 2.5, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 15, spinVel: 10 * Math.PI, spinDrag: 1 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-smoke.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-smoke-nopin-nolever.img", scale: 0.12, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-smoke-pin.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-smoke-nopin.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "proj-frag-pin-part.img", pos: { x: 3, y: 4.2 }, scale: 0.14 } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, strobe: { name: "IR Strobe", type: "throwable", quality: 1, explosionType: "explosion_strobe", inventoryOrder: 3, cookable: false, explodeOnImpact: false, playerCollision: false, fuseTime: 13.5, strikeDelay: 2.5, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 5, speed: 25, spinVel: 6 * Math.PI, spinDrag: 1 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-strobe.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-strobe-armed.img", scale: 0.12, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-strobe-unarmed.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-strobe-arming.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "", pos: { x: 3, y: 4.2 }, scale: 0.14 } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: false, sound: { pullPin: "strobe_click_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, snowball: { name: "Snowball", type: "throwable", quality: 0, explosionType: "explosion_snowball", heavyType: "snowball_heavy", changeTime: 5, inventoryOrder: 0, cookable: true, noPotatoSwap: true, forceMaxThrowDistance: true, explodeOnImpact: true, playerCollision: true, fuseTime: 9999, aimDistance: 32, rad: 1, throwPhysics: { playerVelMult: 0, velZ: 3.35, speed: 40, spinVel: 10 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-snowball.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-snowball-01.img", scale: 0.12, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-snowball-01.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-snowball-01.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "snowball_pickup_01", deploy: "frag_deploy_01" } }, snowball_heavy: { name: "Snowball", type: "throwable", quality: 0, explosionType: "explosion_snowball_heavy", inventoryOrder: 0, cookable: true, noPotatoSwap: true, forceMaxThrowDistance: true, explodeOnImpact: true, playerCollision: true, fuseTime: 9999, aimDistance: 32, rad: 1.25, throwPhysics: { playerVelMult: 0, velZ: 3.35, speed: 45, spinVel: 10 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-snowball.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-snowball-02.img", scale: 0.2, tint: 16777215 }, handImg: {}, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, potato: { name: "Potato", type: "throwable", quality: 0, explosionType: "explosion_potato", freezeOnImpact: true, heavyType: "potato_heavy", changeTime: 5, inventoryOrder: 0, cookable: true, forceMaxThrowDistance: true, explodeOnImpact: true, playerCollision: true, fuseTime: 9999, aimDistance: 32, rad: 1, throwPhysics: { playerVelMult: 0, velZ: 3.35, speed: 40, spinVel: 10 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-potato.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-potato-01.img", scale: 0.12, tint: 16777215 }, handImg: { equip: { right: { sprite: "proj-potato-01.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, cook: { right: { sprite: "proj-potato-01.img", pos: { x: 3, y: 4.2 }, scale: 0.14 }, left: { sprite: "none" } }, throwing: { right: { sprite: "none" }, left: { sprite: "none" } } }, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "potato_pickup_01", deploy: "frag_deploy_01" }, emoteId: 210 }, potato_heavy: { name: "Potato", type: "throwable", quality: 0, explosionType: "explosion_potato_heavy", inventoryOrder: 0, noPotatoSwap: true, cookable: true, forceMaxThrowDistance: true, explodeOnImpact: true, playerCollision: true, fuseTime: 9999, aimDistance: 32, rad: 1.25, throwPhysics: { playerVelMult: 0, velZ: 3.35, speed: 45, spinVel: 10 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-potato.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-potato-02.img", scale: 0.2, tint: 16777215 }, handImg: {}, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } }, potato_cannonball: { name: "Potato Cannon", type: "throwable", quality: 0, explosionType: "explosion_potato_cannonball", inventoryOrder: 0, noPotatoSwap: true, cookable: true, forceMaxThrowDistance: true, explodeOnImpact: true, destroyNonCollidables: true, playerCollision: true, fuseTime: 999, aimDistance: 32, rad: 1, throwPhysics: { playerVelMult: 0, velZ: 3, speed: 65, spinVel: 5 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-potato.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-potato-02.img", scale: 0.2, tint: 16777215 }, handImg: {}, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" }, trail: { maxLength: 25, width: 2.8, alpha: 1, tint: 5916214 } }, potato_smgshot: { name: "Spud Gun", type: "throwable", quality: 0, explosionType: "explosion_potato_smgshot", inventoryOrder: 0, noPotatoSwap: true, cookable: true, forceMaxThrowDistance: true, explodeOnImpact: true, destroyNonCollidables: true, playerCollision: true, fuseTime: 999, aimDistance: 32, rad: 0.1, throwPhysics: { playerVelMult: 0, velZ: 3, speed: 85, spinVel: 9 * Math.PI, spinDrag: 1, fixedCollisionHeight: 0.25 }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-potato.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-wedge-01.img", scale: 0.075, tint: 16777215 }, handImg: {}, useThrowParticles: false, sound: { pullPin: "", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" }, trail: { maxLength: 40, width: 2.8, alpha: 1, tint: 5920310 } }, bomb_iron: { name: "Iron Bomb", type: "throwable", quality: 0, explosionType: "explosion_bomb_iron", inventoryOrder: 1, cookable: true, noPotatoSwap: true, explodeOnImpact: true, playerCollision: false, fuseTime: 4, aimDistance: 0, rad: 1, throwPhysics: { playerVelMult: 0.6, velZ: 0, speed: 20, spinVel: 1 * Math.PI, spinDrag: 1, randomizeSpinDir: true }, speed: { equip: 0, attack: 0 }, lootImg: { sprite: "loot-throwable-frag.img", tint: 65280, border: "loot-circle-outer-01.img", borderTint: 0, scale: 0.2 }, worldImg: { sprite: "proj-bomb-iron-01.img", scale: 0.12, tint: 16777215 }, handImg: {}, useThrowParticles: true, sound: { pullPin: "frag_pin_01", throwing: "frag_throw_01", pickup: "frag_pickup_01", deploy: "frag_deploy_01" } } }; function defineXpSkin(baseType, params) { return defineSkin$1(BaseDefs, baseType, params); } const BaseDefs = { xp_10: { name: "XP", type: "xp", xp: 8, lootImg: { sprite: "loot-xp-book-01.img", tint: 16777215, border: "loot-circle-outer-05.img", borderTint: 16777215, scale: 0.2 }, sound: { drop: "xp_drop_01", pickup: "xp_pickup_01" }, emitter: "xp_common" }, xp_25: { name: "XP", type: "xp", xp: 24, lootImg: { sprite: "loot-xp-book-01.img", tint: 16777215, border: "loot-circle-outer-05.img", borderTint: 16777215, scale: 0.2 }, sound: { drop: "xp_drop_02", pickup: "xp_pickup_02" }, emitter: "xp_rare" }, xp_100: { name: "XP", type: "xp", xp: 96, lootImg: { sprite: "loot-xp-book-01.img", tint: 16777215, border: "loot-circle-outer-05.img", borderTint: 16777215, scale: 0.2 }, sound: { drop: "xp_drop_02", pickup: "xp_pickup_02" }, emitter: "xp_mythic" } }; const SkinDefs = { xp_book_tallow: defineXpSkin("xp_10", { name: "Tallow's Journal", lootImg: { sprite: "loot-xp-book-01.img" } }), xp_book_greene: defineXpSkin("xp_10", { name: "Greene's Infinite Wisdom", lootImg: { sprite: "loot-xp-book-02.img" } }), xp_book_parma: defineXpSkin("xp_10", { name: "The PARMA Papers", lootImg: { sprite: "loot-xp-book-03.img" } }), xp_book_nevelskoy: defineXpSkin("xp_10", { name: "The Nevelskoy Report", lootImg: { sprite: "loot-xp-book-04.img" } }), xp_book_rinzo: defineXpSkin("xp_10", { name: "Rinzō's Log", lootImg: { sprite: "loot-xp-book-05.img" } }), xp_book_kuga: defineXpSkin("xp_10", { name: "Memoirs of Kuga Kairyū", lootImg: { sprite: "loot-xp-book-06.img" } }), xp_glasses: defineXpSkin("xp_25", { name: "Lenz's Spectacles", lootImg: { sprite: "loot-xp-glasses-01.img" } }), xp_compass: defineXpSkin("xp_25", { name: "Amélie's True Compass", lootImg: { sprite: "loot-xp-compass-01.img" } }), xp_stump: defineXpSkin("xp_25", { name: "Ravenstone's Bloody Stump", lootImg: { sprite: "loot-xp-stump-01.img" } }), xp_bone: defineXpSkin("xp_25", { name: "Bone of Gordon", lootImg: { sprite: "loot-xp-bone-01.img" } }), xp_donut: defineXpSkin("xp_100", { name: "Cake Donut", lootImg: { sprite: "loot-xp-donut-01.img" } }) }; const XPDefs = { ...BaseDefs, ...SkinDefs }; const ObjectDefsList = [ BulletDefs, CrosshairDefs, HealEffectDefs, EmotesDefs, ExplosionDefs, GearDefs, GunDefs, MeleeDefs, OutfitDefs, QuestDefs, PerkDefs, PassDefs, PingDefs, RoleDefs, ThrowableDefs, UnlockDefs, XPDefs ]; const GameObjectDefs = {}; for (let i = 0; i < ObjectDefsList.length; i++) { const gameObjectDefs = ObjectDefsList[i]; const objectTypes = Object.keys(gameObjectDefs); for (let j = 0; j < objectTypes.length; j++) { const objectType = objectTypes[j]; if (GameObjectDefs[objectType] !== void 0) { throw new Error(`GameObject ${objectType} is already defined`); } GameObjectDefs[objectType] = gameObjectDefs[objectType]; } } const coldet = { circleToAabb(pos, rad) { const extent = v2.create(rad); return { type: 1, min: v2.sub(pos, extent), max: v2.add(pos, extent) }; }, aabbToCircle(min2, max2) { const e = v2.mul(v2.sub(max2, min2), 0.5); const c = v2.add(min2, e); return { type: 0, pos: c, rad: v2.length(e) }; }, lineSegmentToAabb(a, b) { return { type: collider.Type.Aabb, min: v2.create(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y), max: v2.create(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y) }; }, boundingAabb(aabbs) { const min2 = v2.create(Number.MAX_VALUE, Number.MAX_VALUE); const max2 = v2.create(-Number.MAX_VALUE, -Number.MAX_VALUE); for (let i = 0; i < aabbs.length; i++) { const x = aabbs[i]; min2.x = math.min(min2.x, x.min.x); min2.y = math.min(min2.y, x.min.y); max2.x = math.max(max2.x, x.max.x); max2.y = math.max(max2.y, x.max.y); } return { min: min2, max: max2 }; }, splitAabb(aabb, axis) { const e = v2.mul(v2.sub(aabb.max, aabb.min), 0.5); const c = v2.add(aabb.min, e); const left = { min: v2.copy(aabb.min), max: v2.copy(aabb.max) }; const right = { min: v2.copy(aabb.min), max: v2.copy(aabb.max) }; if (Math.abs(axis.y) > Math.abs(axis.x)) { left.max = v2.create(aabb.max.x, c.y); right.min = v2.create(aabb.min.x, c.y); } else { left.max = v2.create(c.x, aabb.max.y); right.min = v2.create(c.x, aabb.min.y); } const dir = v2.sub(aabb.max, aabb.min); return v2.dot(dir, axis) > 0 ? [right, left] : [left, right]; }, scaleAabbAlongAxis(aabb, axis, scale) { const e = v2.mul(v2.sub(aabb.max, aabb.min), 0.5); const c = v2.add(aabb.min, e); const y = Math.abs(axis.y) > Math.abs(axis.x); return { min: v2.create( y ? aabb.min.x : c.x - e.x * scale, y ? c.y - e.y * scale : aabb.min.y ), max: v2.create( y ? aabb.max.x : c.x + e.x * scale, y ? c.y + e.y * scale : aabb.max.y ) }; }, clampPosToAabb(pos, aabb) { return v2.minElems(v2.maxElems(pos, aabb.min), aabb.max); }, clampPolygonToAabb(poly, aabb) { const newPoly = []; for (let i = 0; i < poly.length; i++) { newPoly.push(coldet.clampPosToAabb(poly[i], aabb)); } return newPoly; }, testPointAabb(pos, min2, max2) { return pos.x >= min2.x && pos.y >= min2.y && pos.x <= max2.x && pos.y <= max2.y; }, testCircleAabb(pos, rad, min2, max2) { const cpt = v2.create( math.clamp(pos.x, min2.x, max2.x), math.clamp(pos.y, min2.y, max2.y) ); const dstSqr = v2.lengthSqr(v2.sub(pos, cpt)); return dstSqr < rad * rad || pos.x >= min2.x && pos.x <= max2.x && pos.y >= min2.y && pos.y <= max2.y; }, testCircleCircle(pos0, rad0, pos1, rad1) { const rad = rad0 + rad1; return v2.lengthSqr(v2.sub(pos1, pos0)) < rad * rad; }, testAabbAabb(min0, max0, min1, max1) { return min0.x < max1.x && min0.y < max1.y && min1.x < max0.x && min1.y < max0.y; }, testAabbPolygon(min2, max2, poly) { for (let i = 0; i < poly.length; i++) { const a = poly[i]; const b = i === poly.length - 1 ? poly[0] : poly[i + 1]; if (coldet.intersectSegmentAabb(a, b, min2, max2)) { return true; } } return false; }, test(coll1, coll2) { if (coll1.type === 0) { if (coll2.type === 0) { return coldet.testCircleCircle( coll1.pos, coll1.rad, coll2.pos, coll2.rad ); } return coldet.testCircleAabb(coll1.pos, coll1.rad, coll2.min, coll2.max); } if (coll2.type === 0) { return coldet.testCircleAabb(coll2.pos, coll2.rad, coll1.min, coll1.max); } return coldet.testAabbAabb(coll1.min, coll1.max, coll2.min, coll2.max); }, aabbInsideAabb(min0, max0, min1, max1) { return min0.x >= min1.x && min0.y >= min1.y && max0.x <= max1.x && max0.y <= max1.y; }, signedAreaTri(a, b, c) { return (a.x - c.x) * (b.y - c.y) - (a.y - c.y) * (b.x - c.x); }, intersectSegmentSegment(a0, a1, b0, b1) { const x1 = coldet.signedAreaTri(a0, a1, b1); const x2 = coldet.signedAreaTri(a0, a1, b0); if (x1 !== 0 && x2 !== 0 && x1 * x2 < 0) { const x3 = coldet.signedAreaTri(b0, b1, a0); const x4 = x3 + x2 - x1; if (x3 * x4 < 0) { const t = x3 / (x3 - x4); return { point: v2.add(a0, v2.mul(v2.sub(a1, a0), t)) }; } } return null; }, intersectSegmentCircle(s0, s1, pos, rad) { let d = v2.sub(s1, s0); const len = math.max(v2.length(d), 1e-6); d = v2.div(d, len); const m = v2.sub(s0, pos); const b = v2.dot(m, d); const c = v2.dot(m, m) - rad * rad; if (c > 0 && b > 0) { return null; } const discSq = b * b - c; if (discSq < 0) { return null; } const disc = Math.sqrt(discSq); let t = -b - disc; if (t < 0) { t = -b + disc; } if (t <= len) { const point = v2.add(s0, v2.mul(d, t)); return { point, normal: v2.normalize(v2.sub(point, pos)) }; } return null; }, intersectSegmentAabb(s0, s1, min2, max2) { let tmin = 0; let tmax = Number.MAX_VALUE; const eps = 1e-5; const r = s0; let d = v2.sub(s1, s0); const dist = v2.length(d); d = dist > eps ? v2.div(d, dist) : v2.create(1, 0); let absDx = Math.abs(d.x); let absDy = Math.abs(d.y); if (absDx < eps) { d.x = eps * 2; absDx = d.x; } if (absDy < eps) { d.y = eps * 2; absDy = d.y; } if (absDx > eps) { const tx1 = (min2.x - r.x) / d.x; const tx2 = (max2.x - r.x) / d.x; tmin = math.max(tmin, math.min(tx1, tx2)); tmax = math.min(tmax, math.max(tx1, tx2)); if (tmin > tmax) { return null; } } if (absDy > eps) { const ty1 = (min2.y - r.y) / d.y; const ty2 = (max2.y - r.y) / d.y; tmin = math.max(tmin, math.min(ty1, ty2)); tmax = math.min(tmax, math.max(ty1, ty2)); if (tmin > tmax) { return null; } } if (tmin > dist) { return null; } const p = v2.add(s0, v2.mul(d, tmin)); const c = v2.add(min2, v2.mul(v2.sub(max2, min2), 0.5)); const p0 = v2.sub(p, c); const d0 = v2.mul(v2.sub(min2, max2), 0.5); const x = p0.x / Math.abs(d0.x) * 1.001; const y = p0.y / Math.abs(d0.y) * 1.001; const n = v2.normalizeSafe( v2.create( x < 0 ? Math.ceil(x) : Math.floor(x), y < 0 ? Math.ceil(y) : Math.floor(y) ), v2.create(1, 0) ); return { point: p, normal: n }; }, intersectSegmentAabb2(s0, s1, min2, max2) { const segments = [ { a: v2.create(min2.x, min2.y), b: v2.create(max2.x, min2.y) }, { a: v2.create(max2.x, min2.y), b: v2.create(max2.x, max2.y) }, { a: v2.create(max2.x, max2.y), b: v2.create(min2.x, max2.y) }, { a: v2.create(min2.x, max2.y), b: v2.create(min2.x, min2.y) } ]; for (let i = 0; i < segments.length; i++) { const seg = segments[i]; const res = coldet.intersectSegmentSegment(s0, s1, seg.a, seg.b); if (res) { return res; } } return null; }, intersectRayAabb(o, d, min2, max2) { const eps = 1e-5; if (Math.abs(d.x) < eps) { d.x = eps * 2; } if (Math.abs(d.y) < eps) { d.y = eps * 2; } const tmin = v2.divElems(v2.sub(min2, o), d); const tmax = v2.divElems(v2.sub(max2, o), d); const rmin = v2.minElems(tmin, tmax); const rmax = v2.maxElems(tmin, tmax); const minmax = math.min(rmax.x, rmax.y); const maxmin = math.max(rmin.x, rmin.y); return minmax >= maxmin ? v2.add(o, v2.mul(d, minmax)) : null; }, intersectCircleCircle(pos0, rad0, pos1, rad1) { const r = rad0 + rad1; const toP1 = v2.sub(pos1, pos0); const distSqr = v2.lengthSqr(toP1); if (distSqr < r * r) { const dist = Math.sqrt(distSqr); return { dir: dist > 1e-5 ? v2.div(toP1, dist) : v2.create(1, 0), pen: r - dist }; } return null; }, intersectAabbCircle(min2, max2, pos, rad) { if (pos.x >= min2.x && pos.x <= max2.x && pos.y >= min2.y && pos.y <= max2.y) { const e = v2.mul(v2.sub(max2, min2), 0.5); const c = v2.add(min2, e); const p = v2.sub(pos, c); const xp = Math.abs(p.x) - e.x - rad; const yp = Math.abs(p.y) - e.y - rad; if (xp > yp) { return { dir: v2.create(p.x > 0 ? 1 : -1, 0), pen: -xp }; } return { dir: v2.create(0, p.y > 0 ? 1 : -1), pen: -yp }; } const cpt = v2.create( math.clamp(pos.x, min2.x, max2.x), math.clamp(pos.y, min2.y, max2.y) ); const dir = v2.sub(pos, cpt); const dstSqr = v2.lengthSqr(dir); if (dstSqr < rad * rad) { const dst = Math.sqrt(dstSqr); return { dir: dst > 1e-4 ? v2.div(dir, dst) : v2.create(1, 0), pen: rad - dst }; } return null; }, intersectAabbAabb(min0, max0, min1, max1) { const e0 = v2.mul(v2.sub(max0, min0), 0.5); const c0 = v2.add(min0, e0); const e1 = v2.mul(v2.sub(max1, min1), 0.5); const c1 = v2.add(min1, e1); const n = v2.sub(c1, c0); const xo = e0.x + e1.x - Math.abs(n.x); if (xo > 0) { const yo = e0.y + e1.y - Math.abs(n.y); if (yo > 0) { if (xo > yo) { return { dir: n.x < 0 ? v2.create(-1, 0) : v2.create(1, 0), pen: xo }; } return { dir: n.y < 0 ? v2.create(0, -1) : v2.create(0, 1), pen: yo }; } } return null; } }; const collider = { Type: { Circle: 0, Aabb: 1 }, createCircle(pos, rad, height = 0) { return { type: collider.Type.Circle, pos: v2.copy(pos), rad, height }; }, createAabb(min2, max2, height = 0) { return { type: collider.Type.Aabb, min: v2.copy(min2), max: v2.copy(max2), height }; }, createAabbExtents(pos, extent, height) { const min2 = v2.sub(pos, extent); const max2 = v2.add(pos, extent); return collider.createAabb(min2, max2, height); }, createBounding(colliders) { if (colliders.length === 1) { return collider.copy(colliders[0]); } const aabbs = []; let maxHeight = 0; for (let i = 0; i < colliders.length; i++) { const col = colliders[i]; aabbs.push(collider.toAabb(col)); maxHeight = math.max(maxHeight, col.height); } const bound = coldet.boundingAabb(aabbs); return collider.createAabb(bound.min, bound.max, maxHeight); }, toAabb(c) { if (c.type === collider.Type.Aabb) { return collider.createAabb(c.min, c.max, c.height); } const aabb = coldet.circleToAabb(c.pos, c.rad); return collider.createAabb(aabb.min, aabb.max, c.height); }, copy(c) { return c.type === collider.Type.Circle ? collider.createCircle(c.pos, c.rad, c.height) : collider.createAabb(c.min, c.max, c.height); }, transform(col, pos, rot, scale) { if (col.type === collider.Type.Aabb) { const e = v2.mul(v2.sub(col.max, col.min), 0.5); const c = v2.add(col.min, e); const pts = [ v2.create(c.x - e.x, c.y - e.y), v2.create(c.x - e.x, c.y + e.y), v2.create(c.x + e.x, c.y - e.y), v2.create(c.x + e.x, c.y + e.y) ]; const min2 = v2.create(Number.MAX_VALUE, Number.MAX_VALUE); const max2 = v2.create(-Number.MAX_VALUE, -Number.MAX_VALUE); for (let i = 0; i < pts.length; i++) { const p = v2.add(v2.rotate(v2.mul(pts[i], scale), rot), pos); min2.x = math.min(min2.x, p.x); min2.y = math.min(min2.y, p.y); max2.x = math.max(max2.x, p.x); max2.y = math.max(max2.y, p.y); } return collider.createAabb(min2, max2, col.height); } return collider.createCircle( v2.add(v2.rotate(v2.mul(col.pos, scale), rot), pos), col.rad * scale, col.height ); }, getPoints(aabb) { const pts = []; const { min: min2 } = aabb; const { max: max2 } = aabb; pts[0] = v2.create(min2.x, min2.y); pts[1] = v2.create(min2.x, max2.y); pts[2] = v2.create(max2.x, min2.y); pts[3] = v2.create(max2.x, max2.y); return pts; }, intersectCircle(col, pos, rad) { if (col.type === collider.Type.Aabb) { return coldet.intersectAabbCircle(col.min, col.max, pos, rad); } return coldet.intersectCircleCircle(col.pos, col.rad, pos, rad); }, intersectAabb(col, min2, max2) { if (col.type === collider.Type.Aabb) { return coldet.intersectAabbAabb(col.min, col.max, min2, max2); } return coldet.intersectAabbCircle(min2, max2, col.pos, col.rad); }, intersectSegment(col, a, b) { if (col.type === collider.Type.Aabb) { return coldet.intersectSegmentAabb(a, b, col.min, col.max); } return coldet.intersectSegmentCircle(a, b, col.pos, col.rad); }, intersect(colA, colB) { if (colB.type === collider.Type.Aabb) { return collider.intersectAabb(colA, colB.min, colB.max); } return collider.intersectCircle(colA, colB.pos, colB.rad); } }; function tierLoot(tier, min2, max2, props) { props = props || {}; return { tier, min: min2, max: max2, props }; } function autoLoot(type, count, props) { props = props || {}; return { type, count, props }; } function randomObstacleType(types) { const arr = []; for (const key in types) { if (types[key]) { arr.push({ type: key, weight: types[key] }); } } if (arr.length === 0) { throw new Error("Invalid obstacle types"); } let total = 0; for (let i = 0; i < arr.length; i++) { total += arr[i].weight; } return function() { let rng = util.random(0, total); let idx = 0; while (rng > arr[idx].weight) { rng -= arr[idx].weight; idx++; } return arr[idx].type; }; } function wallImg(img, tint = 16777215, alpha = 1, zIdx = 10) { return { sprite: img, scale: 0.5, alpha, tint, zIdx }; } function createBarrel(params) { const baseDef = { type: "obstacle", obstacleType: "barrel", scale: { createMin: 1, createMax: 1, destroy: 0.6 }, collision: collider.createCircle(v2.create(0, 0), 1.75), height: 0.5, collidable: true, destructible: true, explosion: "explosion_barrel", health: 150, hitParticle: "barrelChip", explodeParticle: "barrelBreak", reflectBullets: true, loot: [], map: { display: true, color: 6447714, scale: 1 }, terrain: { grass: true, beach: true }, img: { sprite: "map-barrel-01.img", scale: 0.4, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "barrel_bullet", punch: "barrel_bullet", explode: "barrel_break_01", enter: "none" } }; return util.mergeDeep(baseDef, params || {}); } function createWoodBarrel(params) { const t = { type: "obstacle", obstacleType: "barrel", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 1.75), height: 0.5, collidable: true, destructible: true, health: 20, hitParticle: "outhouseChip", explodeParticle: "barrelPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: true, color: 11235106, scale: 1 }, terrain: { grass: true, beach: true }, img: { sprite: "map-barrel-02.img", residue: "map-barrel-res-02.img", scale: 0.4, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_crate_bullet", punch: "wood_crate_bullet", explode: "barrel_break_02", enter: "none" } }; return util.mergeDeep(t, params || {}); } function createBed(params) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.9 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.8, 3.4)), height: 0.5, collidable: true, destructible: true, health: 100, hitParticle: "clothHit", explodeParticle: ["woodPlank", "clothBreak"], reflectBullets: false, loot: [], map: { display: true, color: 6697728, scale: 0.875 }, terrain: { grass: true, beach: true }, img: { sprite: "map-bed-02.img", residue: "map-bed-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "cloth_bullet", punch: "cloth_punch", explode: "cloth_break_01", enter: "none" } }; return util.mergeDeep(t, params || {}); } function createBookShelf(params) { const ObstacleDef = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.5, 1)), height: 0.5, collidable: true, destructible: true, health: 75, hitParticle: "woodChip", explodeParticle: ["woodPlank", "book"], reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-bookshelf-01.img", residue: "map-drawers-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "drawers_break_01", enter: "none" } }; return util.mergeDeep(ObstacleDef, params || {}); } function createBunkerStairs(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 1), v2.create(2, 3.25) ), color: 3815994 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 1), v2.create(2, 3.25)) ] } ], imgs: [ { sprite: "map-bunker-generic-floor-02.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.75), v2.create(2, 3.25) ) } ], imgs: [ { sprite: "map-bunker-generic-ceiling-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] }, mapObjects: [ { type: "metal_wall_ext_6", pos: v2.create(0, -2.2), scale: 1, ori: 1 }, { type: "metal_wall_ext_7", pos: v2.create(-2.5, 1), scale: 1, ori: 0 }, { type: "metal_wall_ext_7", pos: v2.create(2.5, 1), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createStatue(e) { const t = { type: "building", ori: 0, terrain: {}, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(-0.5, 0), v2.create(3.25, 2) ) ] } ], imgs: [ { sprite: "map-bunker-generic-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 3 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "metal_wall_ext_short_6", pos: v2.create(2.2, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(-1, 2.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(-1, -2.5), scale: 1, ori: 1 }, { type: e.statue, pos: v2.create(-1, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createStatueUnderground(e) { const t = { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(6.5, 0), v2.create(4, 3)) ] } ], imgs: [ { sprite: "map-bunker-statue-chamber-floor-01.img", pos: v2.create(3.5, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 3 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(6.5, 0), v2.create(4, 3) ) } ], imgs: [ { sprite: "", scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(-4, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(3, 3.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(3, -3.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(12, 0), scale: 1, ori: 0 }, { type: e.crate, pos: v2.create(8.5, 0), scale: 0.75, ori: 0, inheritOri: false } ] }; return util.mergeDeep(t, e || {}); } function createBush(e) { const t = { type: "obstacle", scale: { createMin: 1.05, createMax: 1.2, destroy: 1 }, collision: collider.createCircle(v2.create(0, 0), 1.4), height: 10, collidable: false, destructible: true, health: 100, hitParticle: "leaf", explodeParticle: "leaf", reflectBullets: false, isBush: true, loot: [], map: { display: true, color: 24320, scale: 1.5 }, terrain: { grass: true, beach: false }, img: { sprite: "map-bush-01.img", residue: "map-bush-res-01.img", scale: 0.5, alpha: 0.97, tint: 16777215, zIdx: 60 }, sound: { bullet: "bush_bullet", punch: "bush_bullet", explode: "bush_break_01", enter: "bush_enter_01" } }; return util.mergeDeep(t, e || {}); } function createCache(e) { const t = { type: "building", map: { displayType: "stone_02" }, terrain: { grass: true, beach: false }, ori: 0, floor: { surfaces: [], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "stone_02", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_initiative_01", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ] }; return util.mergeDeep(t, e || {}); } function createCase(e) { const t = { type: "obstacle", obstacleType: "crate", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.6)), height: 0.5, collidable: true, destructible: true, health: 75, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-case-deagle-01.img", residue: "map-crate-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_crate_bullet", punch: "wood_crate_bullet", explode: "crate_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createChest(e) { const t = { type: "obstacle", obstacleType: "crate", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.6)), height: 0.5, collidable: true, destructible: true, health: 140, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_chest", 3, 4)], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-chest-01.img", residue: "map-crate-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_crate_bullet", punch: "wood_crate_bullet", explode: "crate_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createRiverChest(e) { const t = createChest({ collision: collider.createAabbExtents(v2.create(0, 0.8), v2.create(2.25, 0.8)), mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0.8), v2.create(2.25, 1.6)) ], terrain: { river: { centerWeight: 1 } } }); return util.mergeDeep(t, e || {}); } function createContainer(e) { const t = [ { type: "container_wall_top", pos: v2.create(0, 7.95), scale: 1, ori: 0 }, { type: "container_wall_side", pos: v2.create(2.35, 2.1), scale: 1, ori: 0 }, { type: "container_wall_side", pos: v2.create(-2.35, 2.1), scale: 1, ori: 0 }, { type: e.loot_spawner_01 || "loot_tier_2", pos: v2.create(0, 3.25), scale: 1, ori: 0 }, { type: e.loot_spawner_02 || randomObstacleType({ loot_tier_1: 2, "": 1 }), pos: v2.create(0, 0.05), scale: 1, ori: 0 } ]; const r = [ { type: "container_wall_side_open", pos: v2.create(2.35, 0), scale: 1, ori: 0 }, { type: "container_wall_side_open", pos: v2.create(-2.35, 0), scale: 1, ori: 0 }, { type: "loot_tier_2", pos: v2.create(0, -0.05), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(0, 0.05), scale: 1, ori: 0 } ]; return { type: "building", map: { display: true, color: e.mapTint || 2703694, scale: 1 }, terrain: { grass: true, beach: true, riverShore: true }, zIdx: 1, floor: { surfaces: [ { type: "container", collision: [ e.open ? collider.createAabbExtents( v2.create(0, 0), v2.create(2.5, 11) ) : collider.createAabbExtents( v2.create(0, 0), v2.create(2.5, 8) ) ] } ], imgs: [ { sprite: e.open ? "map-building-container-open-floor.img" : "map-building-container-floor-01.img", scale: 0.5, alpha: 1, tint: e.tint } ] }, ceiling: { zoomRegions: [ { zoomIn: e.open ? collider.createAabbExtents( v2.create(0, 0), v2.create(2.5, 5.75) ) : collider.createAabbExtents( v2.create(0, 2.25), v2.create(2.5, 5.5) ), zoomOut: e.open ? collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 11)) : collider.createAabbExtents( v2.create(0, -0.5), v2.create(2.5, 8.75) ) } ], imgs: e.ceilingImgs || [ { sprite: e.ceilingSprite, scale: 0.5, alpha: 1, tint: e.tint } ] }, mapObjects: e.open ? r : t }; } function createCouch(e) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.85 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.5, 1.5)), height: 0.5, collidable: true, destructible: true, health: 125, hitParticle: "clothHit", explodeParticle: ["woodPlank", "clothBreak"], reflectBullets: false, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-couch-01.img", residue: "map-couch-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "cloth_bullet", punch: "cloth_punch", explode: "cloth_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createCrate(e) { const t = { type: "obstacle", obstacleType: "crate", scale: { createMin: 1, createMax: 1, destroy: 0.5 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 2.25)), height: 0.5, collidable: true, destructible: true, health: 75, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: true, color: 6697728, scale: 0.875 }, terrain: { grass: true, beach: true, riverShore: true }, img: { sprite: "map-crate-01.img", residue: "map-crate-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_crate_bullet", punch: "wood_crate_bullet", explode: "crate_break_02", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createAirdrop(e) { const t = { obstacleType: "airdrop", dropCollision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)), collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)), airdropCrate: true, scale: { destroy: 1 }, destructible: false, health: 200, hitParticle: "barrelChip", explodeParticle: "airdropCrate02", reflectBullets: true, loot: [], map: { display: false }, button: { interactionRad: 1, interactionText: "game-unlock", useOnce: true, destroyOnUse: true, useDelay: 2.5, useDir: v2.create(-1, 0), useImg: "map-airdrop-04.img", useParticle: "airdropCrate03", sound: { on: "airdrop_open_01", off: "" } }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "airdrop_open_02" } }; return util.mergeDeep(createCrate(t), e || {}); } function createClassCrate(e) { const t = { type: "obstacle", obstacleType: "crate", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createCircle(v2.create(0, 0), 2.1), height: 0.5, collidable: true, destructible: true, health: 150, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: false }, terrain: { grass: true, beach: true, riverShore: true }, img: { sprite: "map-class-crate-01.img", residue: "map-class-crate-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_crate_bullet", punch: "wood_crate_bullet", explode: "crate_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createDepositBox(e) { const t = { type: "obstacle", obstacleType: "locker", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(2.5, 1)), height: 10, collidable: true, destructible: true, health: 20, hitParticle: "barrelChip", explodeParticle: "depositBoxGreyBreak", reflectBullets: true, loot: [tierLoot("tier_world", 1, 1)], lootSpawn: { offset: v2.create(0, -1), speedMult: 0 }, map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-deposit-box-01.img", residue: "none", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "deposit_box_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createDoor(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(e.hinge, e.extents), height: 10, collidable: true, destructible: true, health: 150, hitParticle: "whiteChip", explodeParticle: "whitePlank", reflectBullets: false, door: { interactionRad: 0.75, canUse: true, openSpeed: 2, openOneWay: 0, openDelay: 0, openOnce: false, autoOpen: false, autoClose: false, autoCloseDelay: 1, slideToOpen: false, slideOffset: 3.5, spriteAnchor: v2.create(0.5, 1), sound: { // @ts-expect-error can't find any reference to this open: e.soundOpen || "door_open_01", // @ts-expect-error can't find any reference to this close: e.soundClose || "door_close_01", change: "", error: "" } }, loot: [], img: { sprite: "map-door-01.img", residue: "none", scale: 0.5, alpha: 1, tint: 14671839, zIdx: 15 }, sound: { bullet: "wall_wood_bullet", punch: "wall_wood_bullet", explode: "wall_break_01", enter: "none" } }; const material = e.material; if (!MaterialDefs[material]) { throw new Error(`Invalid material ${e.material}`); } return util.mergeDeep(t, MaterialDefs[material], e || {}); } function createLabDoor(e) { const t = createDoor({ material: "concrete", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { interactionRad: 2, openOneWay: false, openSpeed: 7, autoOpen: true, autoClose: true, autoCloseDelay: 1, slideToOpen: true, slideOffset: 3.75, sound: { open: "door_open_03", close: "door_close_03", error: "door_error_01" }, casingImg: { sprite: "map-door-slot-01.img", pos: v2.create(-2, 0), scale: 0.5, alpha: 1, tint: 1316379 } }, img: { tint: 5373952 } }); return util.mergeDeep(t, e || {}); } function createDrawer(e) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(2.5, 1.25)), height: 0.5, collidable: true, destructible: true, health: 75, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_container", 1, 1)], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-drawers-01.img", residue: "map-drawers-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "drawers_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createGunMount(e) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.9 }, collision: collider.createAabbExtents(v2.create(0, 0.2), v2.create(2.25, 0.7)), height: 0.5, collidable: true, destructible: true, health: 50, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], lootSpawn: { offset: v2.create(0, -1), speedMult: 0 }, map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-gun-mount-01.img", residue: "map-drawers-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "barrel_break_02", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createLocker(e) { const t = { type: "obstacle", obstacleType: "locker", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(1.5, 0.6)), height: 10, collidable: true, destructible: true, health: 20, hitParticle: "barrelChip", explodeParticle: "lockerBreak", reflectBullets: true, loot: [tierLoot("tier_world", 1, 1)], lootSpawn: { offset: v2.create(0, -1), speedMult: 0 }, map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-locker-01.img", residue: "", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "deposit_box_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createControlPanel(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1, 1)), height: 0.5, collidable: true, destructible: true, explosion: "explosion_barrel", health: 250, hitParticle: "barrelChip", explodeParticle: "depositBoxGreyBreak", reflectBullets: true, loot: [], map: { display: false }, terrain: { grass: false, beach: true }, img: { sprite: "map-power-box-01.img", residue: "", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "deposit_box_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createOven(e) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(1.7, 1.3)), height: 0.5, collidable: true, destructible: true, explosion: "explosion_barrel", health: 200, hitParticle: "barrelChip", explodeParticle: "barrelBreak", reflectBullets: true, loot: [], map: { display: false, color: 14935011, scale: 0.875 }, terrain: { grass: true, beach: true }, img: { sprite: "map-oven-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "barrel_bullet", punch: "barrel_bullet", explode: "oven_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createPlanter(e) { const t = { type: "obstacle", obstacleType: "pot", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 4.25)), height: 0.5, collidable: true, destructible: true, health: 100, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: true, color: 6697728, scale: 0.875 }, terrain: { grass: true, beach: true, riverShore: true }, img: { sprite: "map-planter-01.img", residue: "map-planter-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "toilet_porc_bullet", punch: "toilet_porc_bullet", explode: "ceramic_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createBottle(e) { const t = { type: "obstacle", obstacleType: "pot", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 1.5), height: 0.5, collidable: true, destructible: true, health: 50, hitParticle: "potChip", explodeParticle: "potBreak", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: true, color: 6697728, scale: 1 }, terrain: { grass: true, beach: true }, img: { sprite: "map-pot-01.img", residue: "map-pot-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "toilet_porc_bullet", punch: "toilet_porc_bullet", explode: "toilet_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createBottle2(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.5, 0.5)), height: 0.3, collidable: true, destructible: false, health: 50, hitParticle: "bottleBlueChip", explodeParticle: "bottleBlueBreak", reflectBullets: false, loot: [], map: { display: true, color: 6697728, scale: 1 }, terrain: { grass: true, beach: true }, img: { sprite: "map-bottle-02.img", residue: "none", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" }, button: { interactionRad: 1.25, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-bottle-03.img", sound: { on: "button_press_01", off: "button_press_01" } } }; return util.mergeDeep(t, e || {}); } function createPotato(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 1.1), height: 0.5, collidable: true, destructible: true, health: 100, hitParticle: "potatoChip", explodeParticle: "potatoBreak", reflectBullets: false, swapWeaponOnDestroy: true, regrow: true, regrowTimer: 60, loot: [tierLoot("tier_potato_perks", 1, 1)], map: { display: false, color: 9466197, scale: 1 }, terrain: { grass: true, beach: true, riverShore: true }, img: { sprite: "map-potato-01.img", residue: "map-potato-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "organic_hit", punch: "organic_hit", explode: "pumpkin_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createPumpkin(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 1.9), height: 0.5, collidable: true, destructible: true, health: 100, reflectBullets: false, isDecalAnchor: true, hitParticle: "pumpkinChip", explodeParticle: "pumpkinBreak", loot: [tierLoot("tier_outfits", 1, 1)], map: { display: true, color: 15889667, scale: 1 }, terrain: { grass: true, beach: false, riverShore: true }, img: { sprite: "map-pumpkin-01.img", residue: "map-pumpkin-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "organic_hit", punch: "organic_hit", explode: "pumpkin_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createRecorder(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.9, 1.5)), height: 0.5, collidable: true, destructible: false, explosion: "explosion_barrel", health: 250, hitParticle: "barrelChip", explodeParticle: "depositBoxGreyBreak", reflectBullets: true, loot: [], map: { display: false }, terrain: { grass: false, beach: true }, img: { sprite: "map-recorder-01.img", residue: "", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 9 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "deposit_box_break_01", enter: "none" }, button: { interactionRad: 0.2, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-recorder-02.img", sound: { on: "", off: "" } } }; return util.mergeDeep(t, e || {}); } function createRefrigerator(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(1.7, 1.25)), height: 0.5, collidable: true, destructible: false, health: 100, hitParticle: "redChip", explodeParticle: "woodPlank", reflectBullets: true, loot: [], map: { display: false, color: 7733259, scale: 0.875 }, terrain: { grass: true, beach: true }, img: { sprite: "map-refrigerator-01.img", residue: "map-crate-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "barrel_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createSandBags(e) { const t = { type: "obstacle", map: { display: true, color: 13278307, scale: 1 }, scale: { createMin: 1, createMax: 1, destroy: 0.5 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.1, 1.4)), height: 0.5, collidable: true, destructible: false, health: 150, hitParticle: "goldChip", explodeParticle: "barrelBreak", reflectBullets: false, loot: [], img: { sprite: "map-sandbags-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_brick_bullet", punch: "wall_brick_bullet", explode: "crate_break_02", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createSilo(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createCircle(v2.create(0, 0), 7.75), height: 10, collidable: true, destructible: false, health: 300, hitParticle: "barrelChip", explodeParticle: "barrelBreak", reflectBullets: true, loot: [], map: { display: true, color: 4079166, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-silo-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "silo_bullet", punch: "silo_bullet", explode: "barrel_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createStone(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1.2, destroy: 0.5 }, collision: collider.createCircle(v2.create(0, 0), 1.6), height: 0.5, collidable: true, destructible: true, health: 250, reflectBullets: false, hitParticle: "rockChip", explodeParticle: "rockBreak", loot: [], map: { display: true, color: 11776947, scale: 1 }, terrain: { grass: true, beach: false, riverShore: true }, img: { sprite: "map-stone-01.img", residue: "map-stone-res-01.img", scale: 0.4, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "stone_bullet", punch: "stone_bullet", explode: "stone_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createRiverStone(e) { const t = { type: "obstacle", scale: { createMin: 0.8, createMax: 1.2, destroy: 0.5 }, collision: collider.createCircle(v2.create(0, 0), 2.9), height: 0.5, collidable: true, destructible: true, health: 500, reflectBullets: false, hitParticle: "rockChip", explodeParticle: "rockBreak", loot: [], map: { display: true, color: 5197647, scale: 1 }, terrain: { grass: false, beach: false, river: { centerWeight: 0.5 }, riverShore: false }, img: { sprite: "map-stone-03.img", residue: "map-stone-res-02.img", scale: 0.4, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "stone_bullet", punch: "stone_bullet", explode: "stone_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createTable(e) { const t = { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2)), height: 0.5, collidable: false, destructible: true, health: 100, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: true, beach: true }, img: { sprite: "map-table-01.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "crate_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createToilet(e) { const t = { type: "obstacle", obstacleType: "toilet", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0.25), 1.18), height: 0.5, collidable: true, destructible: true, health: 100, reflectBullets: false, hitParticle: "whiteChip", explodeParticle: "toiletBreak", loot: [tierLoot("tier_toilet", 2, 3)], map: { display: false, color: 11776947, scale: 1 }, img: { sprite: "map-toilet-01.img", residue: "map-toilet-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "toilet_porc_bullet", punch: "toilet_porc_bullet", explode: "toilet_break_01", enter: "none" }, terrain: { grass: true, beach: false } }; return util.mergeDeep(t, e || {}); } function createTree(e) { const t = { type: "obstacle", scale: { createMin: 0.8, createMax: 1, destroy: 0.5 }, collision: collider.createCircle(v2.create(0, 0), 1.55), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(5.75, 5.75)), height: 10, collidable: true, destructible: true, health: 175, hitParticle: "woodChip", explodeParticle: "woodLog", reflectBullets: false, isTree: true, loot: [], map: { display: true, color: 4083758, scale: 2.5 }, terrain: { grass: true, beach: false }, img: { sprite: "map-tree-03.img", residue: "map-tree-res-01.img", scale: 0.7, alpha: 1, tint: 16777215, zIdx: 800 }, sound: { bullet: "tree_bullet", punch: "tree_bullet", explode: "tree_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createTreeSwitch(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createCircle(v2.create(0, 0), 1.6), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(5.75, 5.75)), button: { interactionRad: 0.2, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-tree-switch-04.img", sound: { on: "button_press_01", off: "button_press_01" } }, height: 0.5, collidable: true, destructible: false, health: 175, hitParticle: "woodChip", explodeParticle: "woodLog", reflectBullets: false, loot: [], map: { display: false, color: 8602624, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-tree-switch-01.img", residue: "map-tree-res-01.img", scale: 0.5, alpha: 1, zIdx: 10, tint: 16777215 }, sound: { bullet: "tree_bullet", punch: "tree_bullet", explode: "tree_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createWall(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.copy(e.extents)), height: 10, isWall: true, collidable: true, destructible: true, health: e.health || 150, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [], map: { display: false }, img: {}, sound: { bullet: "wall_bullet", punch: "wall_bullet", explode: "barrel_break_01", enter: "none" } }; const material = e.material; if (!MaterialDefs[material]) { throw new Error(`Invalid material ${e.material}`); } return util.mergeDeep(t, MaterialDefs[material], e || {}); } function createWheel(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createCircle(v2.create(0, 2.3), 4.6), height: 10, collidable: true, destructible: false, health: 300, hitParticle: "barrelChip", explodeParticle: "barrelBreak", reflectBullets: true, loot: [], map: { display: false, color: 6310464, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-wheel-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "silo_bullet", punch: "silo_bullet", explode: "barrel_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createWoodPile(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), height: 0.5, collidable: true, destructible: true, health: 150, hitParticle: "woodChip", explodeParticle: "woodLog", reflectBullets: false, loot: [], map: { display: false, color: 9455616, scale: 0.875 }, terrain: {}, img: { sprite: "map-woodpile-01.img", residue: "map-woodpile-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "tree_bullet", punch: "tree_bullet", explode: "tree_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createBank(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-16, 7), v2.create(10.75, 11) ), color: 7820585 }, { collider: collider.createAabbExtents( v2.create(6, 0), v2.create(11.5, 18.25) ), color: 9989427 }, { collider: collider.createAabbExtents( v2.create(22, 4), v2.create(4.5, 7.5) ), color: 7820585 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(6, -1), v2.create(11.25, 18.25) ), collider.createAabbExtents( v2.create(21.5, 4), v2.create(4.75, 7.25) ) ] } ], imgs: [ { sprite: "map-building-bank-floor-01.img", pos: v2.create(0, 6.96), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bank-floor-02.img", pos: v2.create(9.5, -12.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(6, -1), v2.create(11.25, 18.25) ) }, { zoomIn: collider.createAabbExtents( v2.create(21.5, 4), v2.create(4.75, 7.25) ) }, { zoomIn: collider.createAabbExtents( v2.create(-15, 6), v2.create(10.75, 11) ), zoomOut: collider.createAabbExtents( v2.create(6, 1.25), v2.create(15.25, 20) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-bank-ceiling-01.img", pos: v2.create(-16, 7), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-bank-ceiling-02.img", pos: v2.create(6, 0), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-bank-ceiling-03.img", pos: v2.create(22, 8), scale: 0.667, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "brick_wall_ext_23", pos: v2.create(-14, 17), scale: 1, ori: 1 }, { type: "brick_wall_ext_23", pos: v2.create(-25.9, 6), scale: 1, ori: 0 }, { type: "brick_wall_ext_20", pos: v2.create(-15.5, -5), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(-5, -7), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(-5, -16.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(-2.5, -19), scale: 1, ori: 1 }, { type: "brick_wall_ext_7", pos: v2.create(6, -19), scale: 1, ori: 1 }, { type: "brick_wall_ext_4", pos: v2.create(14.5, -19), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(17, -16.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_7", pos: v2.create(17, -6), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(1, -19.25), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(11, -19.25), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-5.25, -13.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(17.25, -13.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_9", pos: v2.create(22, -3), scale: 1, ori: 1 }, { type: "brick_wall_ext_15", pos: v2.create(26, 4), scale: 1, ori: 0 }, { type: "brick_wall_ext_9", pos: v2.create(22, 11), scale: 1, ori: 1 }, { type: "brick_wall_ext_7", pos: v2.create(17, 14), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(14.5, 17), scale: 1, ori: 1 }, { type: "brick_wall_ext_8", pos: v2.create(4.5, 17), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-1, 17.25), scale: 1, ori: 1 }, { type: e.vault || "vault_01", pos: v2.create(-12, 6), scale: 1, ori: 0 }, { type: "bank_wall_int_4", pos: v2.create(-2.5, -5), scale: 1, ori: 1 }, { type: "bank_window_01", pos: v2.create(1, -5), scale: 1, ori: 1 }, { type: "bank_wall_int_3", pos: v2.create(4, -5), scale: 1, ori: 1 }, { type: "bank_wall_int_4", pos: v2.create(6, -3.5), scale: 1, ori: 0 }, { type: "bank_window_01", pos: v2.create(6, 0), scale: 1, ori: 0 }, { type: "bank_wall_int_4", pos: v2.create(6, 3.5), scale: 1, ori: 0 }, { type: "bank_wall_int_4", pos: v2.create(8.5, 5), scale: 1, ori: 1 }, { type: "bank_window_01", pos: v2.create(12, 5), scale: 1, ori: 1 }, { type: "bank_wall_int_3", pos: v2.create(15, 5), scale: 1, ori: 1 }, { type: "bank_wall_int_5", pos: v2.create(17, 4), scale: 1, ori: 0 }, { type: "bank_wall_int_8", pos: v2.create(21.5, 4), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(17, -2.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(17, 10.5), scale: 1, ori: 2 }, { type: "house_door_01", pos: v2.create(12.5, 17.25), scale: 1, ori: 1 }, { type: "vending_01", pos: v2.create(4.5, -16.9), scale: 1, ori: 2 }, { type: "stand_01", pos: v2.create(7.65, -17), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(23.5, 0.5), scale: 1, ori: 3 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(23.5, 7.5), scale: 1, ori: 3 }, { type: "stand_01", pos: v2.create(15, 15), scale: 1, ori: 3 }, { type: "fire_ext_01", pos: v2.create(4.5, 16.15), scale: 1, ori: 3 }, { type: "bush_02", pos: v2.create(-2.5, -16.25), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "bush_02", pos: v2.create(14.5, -16.25), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(19.75, 13.75), scale: 0.9, ori: 0, inheritOri: false }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(12, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(1, 0), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(-16.5, -12.5), scale: 1.1, ori: 0 }, { type: "barrel_01", pos: v2.create(-7.5, -7.25), scale: 0.85, ori: 0 }, { type: "tree_01", pos: v2.create(21, -7), scale: 0.55, ori: 0 }, { type: "tree_01", pos: v2.create(21, -16.25), scale: 0.55, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createBankVault(e) { const t = { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(-3.5, 0), v2.create(10, 10.5) ) ] } ], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-3.5, 0), v2.create(9.25, 10.5) ), zoomOut: collider.createAabbExtents( v2.create(-3.5, 0), v2.create(10, 10.5) ) } ], vision: { dist: 7.25, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-vault-ceiling.img", scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thick_20", pos: v2.create(-12.5, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thick_20", pos: v2.create(-3.5, -9.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thick_20", pos: v2.create(-3.5, 9.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thick_6", pos: v2.create(5.5, -6.45), scale: 1, ori: 0 }, { type: "metal_wall_ext_thick_6", pos: v2.create(5.5, 6.45), scale: 1, ori: 0 }, { type: "vault_door_main", pos: v2.create(6.5, 3.5), scale: 1, ori: 2 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(-12.3, 5), scale: 1, ori: 1 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(-12.3, -5), scale: 1, ori: 1 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(-8, 9.3), scale: 1, ori: 0 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(-8, -9.3), scale: 1, ori: 2 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(1, 9.3), scale: 1, ori: 0 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: e.gold_box || 1 }), pos: v2.create(1, -9.3), scale: 1, ori: 2 }, { type: "crate_05", pos: v2.create(-3.5, 6.5), scale: 1, ori: 0 }, { type: "crate_05", pos: v2.create(-3.5, -6.5), scale: 1, ori: 2 }, { type: e.floor_loot || randomObstacleType({ loot_tier_vault_floor: 1 }), pos: v2.create(-3.5, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createBarn(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 12), v2.create(5, 2) ), color: 12300935 }, { collider: collider.createAabbExtents( v2.create(0, -2), v2.create(24.5, 12.8) ), color: 3816739 } ] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, -2), v2.create(28, 16.5)), collider.createAabbExtents(v2.create(0, 14), v2.create(7, 5)) ], zIdx: 1, floor: { surfaces: [ { type: "house", collision: [ collider.createAabbExtents(v2.create(0, -2), v2.create(25, 13.2)), collider.createAabbExtents(v2.create(0, 12), v2.create(5.5, 2.5)) ] } ], imgs: [ { sprite: "map-building-barn-floor-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -2), v2.create(24.5, 12.8) ) }, { zoomIn: collider.createAabbExtents( v2.create(0, 12), v2.create(5.5, 2.5) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(5.5, 18.5) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-barn-ceiling-01.img", pos: v2.create(0, -2), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-barn-ceiling-02.img", pos: v2.create(0, 13.2), scale: 0.5, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "brick_wall_ext_4", pos: v2.create(-24.5, 9), scale: 1, ori: 0 }, { type: "brick_wall_ext_3", pos: v2.create(-22.5, 10.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_12", pos: v2.create(-24.5, -2), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(-24.5, -13), scale: 1, ori: 0 }, { type: "brick_wall_ext_3", pos: v2.create(-22.5, -14.5), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-24.75, 5.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-24.75, -9.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-19.5, 10.75), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-19.5, -14.75), scale: 1, ori: 1 }, { type: "brick_wall_ext_16", pos: v2.create(-10, 10.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_16", pos: v2.create(10, 10.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_16", pos: v2.create(-10, -14.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(5, -14.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_4", pos: v2.create(-5.5, 13), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(5.5, 13), scale: 1, ori: 0 }, { type: "brick_wall_ext_3", pos: v2.create(-3.5, 14.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_3", pos: v2.create(3.5, 14.5), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(9.5, -14.75), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(2, 14.75), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-2, -14.75), scale: 1, ori: 3 }, { type: "brick_wall_ext_4", pos: v2.create(24.5, 9), scale: 1, ori: 0 }, { type: "brick_wall_ext_3", pos: v2.create(22.5, 10.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_13", pos: v2.create(17.5, -14.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_19", pos: v2.create(24.5, -5.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_1", pos: v2.create(23.5, -1.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(24.75, 5.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(19.5, 10.75), scale: 1, ori: 1 }, { type: e.bonus_room || "panicroom_01", pos: v2.create(19.5, -8), scale: 1, ori: 0 }, { type: "barn_wall_int_6", pos: v2.create(-21, 0.5), scale: 1, ori: 1 }, { type: "barn_wall_int_6", pos: v2.create(-21, -4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_5", pos: v2.create(-11.5, 0.5), scale: 1, ori: 1 }, { type: "barn_wall_int_2", pos: v2.create(-13, -4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_7", pos: v2.create(-6.5, -4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_8", pos: v2.create(-11.5, -10), scale: 1, ori: 0 }, { type: "barn_wall_int_8", pos: v2.create(-7.5, 6), scale: 1, ori: 0 }, { type: "barn_wall_int_5", pos: v2.create(-3.5, -11.5), scale: 1, ori: 0 }, { type: "barn_wall_int_7", pos: v2.create(10.5, 0.5), scale: 1, ori: 1 }, { type: "barn_wall_int_5", pos: v2.create(14.5, 7.5), scale: 1, ori: 0 }, { type: "barn_wall_int_13", pos: v2.create(14.5, -7.5), scale: 1, ori: 0 }, { type: "barn_wall_int_4", pos: v2.create(17, -1.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-18, -4.5), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(-18, 0.5), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(-3.5, -5), scale: 1, ori: 2 }, { type: "house_door_01", pos: v2.create(14.5, 1), scale: 1, ori: 0 }, { type: e.bonus_door, pos: v2.create(23, -1.5), scale: 1, ori: 1 }, { type: "barn_column_1", pos: v2.create(-8, 1), scale: 1, ori: 0 }, { type: "barn_column_1", pos: v2.create(-11, -5), scale: 1, ori: 0 }, { type: "barn_column_1", pos: v2.create(15, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(-7.5, -12), scale: 1, ori: 2 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-12.5, 8.5), scale: 1, ori: 0 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-5.5, 7.25), scale: 1, ori: 1 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-13.5, -9.5), scale: 1, ori: 3 }, { type: "stand_01", pos: v2.create(16.5, 8.5), scale: 1, ori: 0 }, { type: "stand_01", pos: v2.create(3.5, 12.5), scale: 1, ori: 3 }, { type: "table_01", pos: v2.create(8, -8), scale: 1, ori: 0 }, { type: "oven_01", pos: v2.create(12.25, -1.5), scale: 1, ori: 0 }, { type: "refrigerator_01", pos: v2.create(8.75, -1.5), scale: 1, ori: 0 }, { type: "bush_02", pos: v2.create(-22, -2), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "bush_02", pos: v2.create(12, 8), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(-19, -9.5), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(-19, 5.5), scale: 1, ori: 0 }, { type: "loot_tier_1", pos: v2.create(0, 5.5), scale: 1, ori: 0 }, { type: e.porch_01 || "", pos: v2.create(-4, 17), scale: 0.9, ori: 2 }, { type: e.porch_01 || "", pos: v2.create(4, 17), scale: 0.9, ori: 2 } ] }; return util.mergeDeep(t, e || {}); } function createBarnBasement(e) { const t = { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(-3, 0), v2.create(12, 7)), collider.createAabbExtents(v2.create(12, -3.5), v2.create(3, 2)) ] } ], imgs: [ { sprite: "map-building-barn-basement-floor-01.img", pos: v2.create(5.5, -0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(2, 0), v2.create(6, 7)) }, { zoomIn: collider.createAabbExtents( v2.create(11, -3.5), v2.create(3.5, 2) ) } ], imgs: [ { sprite: "map-building-barn-basement-ceiling-01.img", pos: v2.create(5, 0), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "house_door_02", pos: v2.create(13.5, 7), scale: 1, ori: 1 }, { type: "concrete_wall_ext_6", pos: v2.create(12.5, 6), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_11", pos: v2.create(15, 0), scale: 1, ori: 0 }, { type: "concrete_wall_column_5x10", pos: v2.create(7, 2.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_21", pos: v2.create(-6, 6), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_13", pos: v2.create(-15, -2), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_30", pos: v2.create(1.5, -7), scale: 1, ori: 1 }, { type: "concrete_wall_ext_3", pos: v2.create(-4, 3), scale: 1, ori: 0 }, { type: "stone_wall_int_4", pos: v2.create(-4, -0.5), scale: 1, ori: 2 }, { type: "concrete_wall_ext_3", pos: v2.create(-4, -4), scale: 1, ori: 0 }, { type: "loot_tier_sledgehammer", pos: v2.create(0.5, -0.5), scale: 1, ori: 0 }, { type: "bookshelf_01", pos: v2.create(1, 3.5), scale: 1, ori: 0 }, { type: e.basement || "barn_basement_floor_02", pos: v2.create(-8, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createBridgeLarge(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(31.5, 8) ), color: 5197647 }, { collider: collider.createAabbExtents( v2.create(-14, -9.5), v2.create(2.5, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(14, -9.5), v2.create(2.5, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(-14, 9.5), v2.create(2.5, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(14, 9.5), v2.create(2.5, 1.5) ), color: 3618615 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(31.5, 8)) ] } ], imgs: [ { sprite: "map-building-bridge-lg-floor.img", pos: v2.create(-15.75, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bridge-lg-floor.img", pos: v2.create(15.75, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 2, mirrorY: true } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(16.5, 7) ) } ], vision: { dist: 10 }, imgs: [ { sprite: "map-building-bridge-lg-ceiling.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "bridge_rail_12", pos: v2.create(-22.5, 7.5), scale: 1, ori: 1 }, { type: "bridge_rail_12", pos: v2.create(-22.5, -7.5), scale: 1, ori: 1 }, { type: "bridge_rail_12", pos: v2.create(22.5, 7.5), scale: 1, ori: 1 }, { type: "bridge_rail_12", pos: v2.create(22.5, -7.5), scale: 1, ori: 1 }, { type: "concrete_wall_column_5x4", pos: v2.create(-14, -9), scale: 1, ori: 0 }, { type: "concrete_wall_column_5x4", pos: v2.create(-14, 9), scale: 1, ori: 0 }, { type: "concrete_wall_column_5x4", pos: v2.create(14, -9), scale: 1, ori: 0 }, { type: "concrete_wall_column_5x4", pos: v2.create(14, 9), scale: 1, ori: 0 }, { type: "concrete_wall_ext_5", pos: v2.create(-9, 7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(-9, -7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(9, 7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(9, -7.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(-5, 7.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(-5, -7.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(5, 7.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(5, -7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(0, 7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(0, -7.5), scale: 1, ori: 1 }, { type: randomObstacleType({ loot_tier_1: 2, "": 1 }), pos: v2.create(-22, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 2, "": 1 }), pos: v2.create(22, 0), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(-14, 2.75), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(-10, 5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(0, 4.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(0, -4.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(10, -5), scale: 0.9, ori: 0 }, { type: "sandbags_01", pos: v2.create(14, -2.75), scale: 1, ori: 1 } ] }; return util.mergeDeep(t, e || {}); } function createCabin(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0.5), v2.create(18, 12) ), color: 3823128 }, { collider: collider.createAabbExtents( v2.create(0, -13), v2.create(17, 2) ), color: 6368528 } ] }, terrain: { grass: true, beach: false, riverShore: true, nearbyRiver: { radMin: 0.75, radMax: 1.5, facingOri: 1 } }, zIdx: 1, floor: { surfaces: [ { type: "house", collision: [ collider.createAabbExtents(v2.create(0, -1.5), v2.create(18, 14)) ] }, { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(4, -14), v2.create(3, 2.5)), collider.createAabbExtents(v2.create(-4, 13.5), v2.create(2, 1)) ] } ], imgs: [ { sprite: "map-building-cabin-floor.img", pos: v2.create(0, -1), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.5), v2.create(19, 12) ), zoomOut: collider.createAabbExtents( v2.create(0, 0.5), v2.create(21, 14) ) }, { zoomIn: collider.createAabbExtents( v2.create(4, -13), v2.create(3, 2) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, damage: { obstacleCount: 1 }, imgs: [ { sprite: "map-building-cabin-ceiling-01a.img", pos: v2.create(0, 0.5), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-cabin-ceiling-01b.img", pos: v2.create(4, -13), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-chimney-01.img", pos: v2.create(13, 2), scale: 0.5, alpha: 1, tint: 16777215, removeOnDamaged: true } ] }, occupiedEmitters: [ { type: "cabin_smoke_parent", pos: v2.create(0, 0), rot: 0, scale: 1, layer: 0, parentToCeiling: true } ], mapObjects: [ { type: "brick_wall_ext_12", pos: v2.create(-12, 12), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-2, 12.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_12", pos: v2.create(4, 12), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(11.5, 12.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(15.5, 12), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(-18.5, 9.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-18.75, 5), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(-18.5, 0.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-18.75, -4), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(-18.5, -8.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_5", pos: v2.create(-15.5, -11), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-11.5, -11.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_12", pos: v2.create(-4, -11), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(2, -11.25), scale: 1, ori: 3 }, { type: "brick_wall_ext_12", pos: v2.create(12, -11), scale: 1, ori: 1 }, { type: "brick_wall_ext_15", pos: v2.create(18.5, 5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(18.75, -4), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(18.5, -8.5), scale: 1, ori: 0 }, { type: e.cabin_wall_int_5 || "cabin_wall_int_5", pos: v2.create(-10.5, 9), scale: 1, ori: 0 }, { type: e.cabin_wall_int_10 || "cabin_wall_int_10", pos: v2.create(-13, 2), scale: 1, ori: 1 }, { type: e.cabin_wall_int_13 || "cabin_wall_int_13", pos: v2.create(-3.5, -4), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-10.5, 2.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-4, 2), scale: 1, ori: 1 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(-16, 9), scale: 1, ori: 0 }, { type: "stand_01", pos: v2.create(-12.5, 9.5), scale: 1, ori: 0 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-15, 0), scale: 1, ori: 0 }, { type: "pot_01", pos: v2.create(-16, -8.5), scale: 1, ori: 0 }, { type: "bed_lg_01", pos: v2.create(-7, -6.75), scale: 1, ori: 2 }, { type: e.cabin_mount || randomObstacleType({ gun_mount_01: 50, gun_mount_05: 50, gun_mount_04: 10, gun_mount_02: 10, gun_mount_03: 1 }), pos: v2.create(4, 10.65), scale: 1, ori: 0 }, { type: "table_01", pos: v2.create(4, 6.5), scale: 1, ori: 0 }, { type: "stove_01", pos: v2.create(13, 2), scale: 1, ori: 3 }, { type: "woodpile_01", pos: v2.create(13, -3), scale: 1, ori: 0 }, { type: "pot_01", pos: v2.create(16, 9.5), scale: 1, ori: 0 }, { type: "pot_01", pos: v2.create(16, -8.5), scale: 1, ori: 0 }, { type: e.porch_01 || "", pos: v2.create(-1, -13.5), scale: 0.9, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createHut(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(7, 7) ), color: 15181895 }, { collider: collider.createAabbExtents( v2.create(0, -18.9), v2.create(2, 12) ), color: 6171907 } ] }, terrain: { waterEdge: { dir: v2.create(0, 1), distMin: -8.5, distMax: 0 } }, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(7, 7)), collider.createAabbExtents(v2.create(0, -18.9), v2.create(2, 12)) ] } ], imgs: [ { sprite: "map-building-hut-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-hut-floor-02.img", pos: v2.create(0, -18.9), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(0, 0), v2.create(6, 6)) } ], vision: { width: 4 }, imgs: [ { sprite: e.ceilingImg || "map-building-hut-ceiling-01.img", scale: 0.667, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 2, particle: "hutBreak", particleCount: 25, residue: "map-hut-res-01.img" } }, mapObjects: [ { type: "hut_wall_int_4", pos: v2.create(-4, -6.5), scale: 1, ori: 1 }, { type: "hut_wall_int_4", pos: v2.create(4, -6.5), scale: 1, ori: 1 }, { type: "hut_wall_int_5", pos: v2.create(-6.5, 4.5), scale: 1, ori: 0 }, { type: "hut_window_open_01", pos: v2.create(-6.75, 0.5), scale: 1, ori: 0 }, { type: "hut_wall_int_6", pos: v2.create(-6.5, -4), scale: 1, ori: 0 }, { type: "hut_wall_int_12", pos: v2.create(0, 6.5), scale: 1, ori: 1 }, { type: "hut_wall_int_14", pos: v2.create(6.5, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ pot_01: 2, "": 1 }), pos: v2.create(4.5, 4.5), scale: 1, ori: 0 }, { type: randomObstacleType({ pot_01: 2, "": 1 }), pos: v2.create(4.5, -4.5), scale: 1, ori: 0 }, { type: randomObstacleType({ pot_01: 2, "": 1 }), pos: v2.create(-4.5, 4.5), scale: 1, ori: 0 }, { type: randomObstacleType({ pot_01: 2, "": 1 }), pos: v2.create(-4.5, -4.5), scale: 1, ori: 0 }, { type: e.specialLoot || "pot_01", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createShack3(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-7.75, 3), v2.create(1, 2) ), color: 6171907 }, { collider: collider.createAabbExtents( v2.create(5, -4.75), v2.create(2, 1) ), color: 6171907 }, { collider: collider.createAabbExtents( v2.create(1, 1.5), v2.create(8, 5.5) ), color: 3754050 }, { collider: collider.createAabbExtents( v2.create(-10.65, 7), v2.create(2, 12) ), color: 6171907 } ] }, terrain: {}, zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(1, 1.5), v2.create(8, 5.5)), collider.createAabbExtents( v2.create(-10.65, 7), v2.create(2, 12) ), collider.createAabbExtents(v2.create(-7.75, 3), v2.create(1, 2)), collider.createAabbExtents(v2.create(5, -4.75), v2.create(2, 1)) ] } ], imgs: [ { sprite: "map-building-shack-floor-03.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-hut-floor-02.img", pos: v2.create(-10.65, 7), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(1, 1.5), v2.create(7.75, 5.25) ) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-shack-ceiling-03.img", pos: v2.create(0.5, 0.5), scale: 0.667, alpha: 1, tint: 10461087 } ], destroy: { wallCount: 3, particle: "shackGreenBreak", particleCount: 30, residue: "map-shack-res-03.img" } }, bridgeLandBounds: [ collider.createAabbExtents(v2.create(-1.75, -4.25), v2.create(11.25, 4.75)) ], bridgeWaterBounds: [ collider.createAabbExtents(v2.create(-10.5, 15.5), v2.create(3.5, 6)) ], mapObjects: [ { type: "shack_wall_ext_2", pos: v2.create(-6.5, 6), scale: 1, ori: 0 }, { type: "shack_wall_ext_14", pos: v2.create(1, 6.5), scale: 1, ori: 1 }, { type: "shack_wall_ext_10", pos: v2.create(8.5, 2), scale: 1, ori: 0 }, { type: "shack_wall_ext_2", pos: v2.create(8, -3.5), scale: 1, ori: 1 }, { type: "shack_wall_ext_9", pos: v2.create(-1.5, -3.5), scale: 1, ori: 1 }, { type: "shack_wall_ext_5", pos: v2.create(-6.5, -1.5), scale: 1, ori: 0 }, { type: "pot_01", pos: v2.create(-4.25, -1.25), scale: 1, ori: 0 }, { type: "pot_01", pos: v2.create(-1.25, -1.25), scale: 1, ori: 0 }, { type: "table_01", pos: v2.create(5.5, 4), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-4.75, -5.75), scale: 0.9, ori: 0 }, { type: "crate_20", pos: v2.create(-1, -5.75), scale: 1, ori: 0 }, { type: "loot_tier_leaf_pile", pos: v2.create(-10.65, 16), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createGreenhouse(e) { const t = { type: "building", map: { display: true, color: 1995644, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(15, 25)), collider.createAabbExtents(v2.create(-15, 9), v2.create(2.5, 4.5)), collider.createAabbExtents(v2.create(17.5, -7), v2.create(4.5, 2.5)) ], zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(13, 20)) ] }, { type: "house", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(2, 20)) ] } ], imgs: e.floor_images || [ { sprite: "map-building-greenhouse-floor-01.img", pos: v2.create(0, 10), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-greenhouse-floor-01.img", pos: v2.create(0, -10), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, 21), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -21), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(12.5, 19.5) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(14, 22) ) } ], vision: { dist: 7.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: e.ceiling_images || [ { sprite: "map-building-greenhouse-ceiling-01.img", pos: v2.create(0, -9.85), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-building-greenhouse-ceiling-01.img", pos: v2.create(0, 9.85), scale: 1, alpha: 1, tint: 16777215, mirrorY: true } ], destroy: { wallCount: 7, particle: "greenhouseBreak", particleCount: 60, residue: "", sound: "ceiling_break_02" } }, mapObjects: [ { type: "glass_wall_10", pos: v2.create(-7, 19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(-7, -19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(-12.5, 15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, 5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, -15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, -5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(7, 19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(7, -19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(12.5, 15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, 5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, -15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, -5), scale: 1, ori: 0 }, { type: "house_door_05", pos: v2.create(2, 19.75), scale: 1, ori: 1 }, { type: "house_door_05", pos: v2.create(-2, -19.75), scale: 1, ori: 3 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(-4.5, 14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(-7, 2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(-7, -2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(-4.5, -14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(4.5, 14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(7, 2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(7, -2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_01: 1, planter_02: 1, planter_03: 1 }), pos: v2.create(4.5, -14.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-15, 11), scale: 0.9, ori: 0 }, { type: "sandbags_02", pos: v2.create(-15, 7), scale: 1, ori: 0 }, { type: "sandbags_02", pos: v2.create(15.5, -7), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(19.5, -7), scale: 0.9, ori: 0 }, { type: "bunker_structure_08", pos: v2.create(-9.5, -15.5), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createBunkerChrys(e) { const t = { type: "structure", terrain: { grass: true, beach: false }, ori: 0, mapObstacleBounds: [ collider.createAabbExtents(v2.create(5, 5), v2.create(15, 15)) ], layers: [ { type: "bunker_chrys_01", pos: v2.create(0, 0), ori: 0 }, { type: e.bunkerType || "bunker_chrys_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 0), v2.create(1.5, 2.6) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(10.5, -12.25), v2.create(15, 9.5)), collider.createAabbExtents(v2.create(40, 20), v2.create(14.45, 35)) ] }; return util.mergeDeep(t, e || {}); } function createLoggingComplex(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false, spawnPriority: 10 }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, -4), v2.create(55, 50)) ], bridgeLandBounds: [ collider.createAabbExtents(v2.create(0, -4), v2.create(55, 50)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(55, 55)), color: e.groundTintLt || 5195792, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(-28.5, 7), v2.create(7, 5)), color: e.groundTintDk || 5986827, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents( v2.create(-24.5, -35), v2.create(5.5, 4.5) ), color: e.groundTintDk || 5986827, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(20, 10), v2.create(20, 30)), color: e.groundTintDk || 5986827, roughness: 0.05, offsetDist: 0.5 } ], floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(55, 55)) ] } ], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "container_04", pos: v2.create(3.75, 14), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-1.35, 10.25), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-6, 12.25), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-2, 14.5), scale: 0.9, ori: 0 }, { type: "warehouse_02", pos: v2.create(20, 10), scale: 1, ori: 1 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(35, 24.25), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(35, 29), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(39.75, 27), scale: 1, ori: 0, inheritOri: false }, { type: "tree_07", pos: v2.create(47, 13), scale: 1, ori: 0 }, { type: "tree_02", pos: v2.create(50.5, 9.5), scale: 1, ori: 0, inheritOri: false }, { type: "bunker_structure_06", pos: v2.create(38, -12.5), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(21, -32), scale: 1, ori: 3 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(21, -37.5), scale: 1, ori: 3 }, { type: "tree_07", pos: v2.create(45.5, -31.5), scale: 1, ori: 0 }, { type: "tree_07", pos: v2.create(40.5, -36.5), scale: 1.1, ori: 0 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(21.75, -50), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(26.75, -49), scale: 1, ori: 0, inheritOri: false }, { type: "tree_02", pos: v2.create(44.5, -50.5), scale: 1, ori: 0, inheritOri: false }, { type: "tree_09", pos: v2.create(-9, 34), scale: 1, ori: 0 }, { type: "tree_02", pos: v2.create(-13.5, 35.5), scale: 1, ori: 0, inheritOri: false }, { type: "tree_09", pos: v2.create(-16.5, 32), scale: 1, ori: 3 }, { type: "tree_09", pos: v2.create(-20, 36), scale: 1, ori: 2 }, { type: "tree_09", pos: v2.create(-24.5, 33), scale: 1, ori: 3 }, { type: "tree_09", pos: v2.create(-31.5, 37), scale: 1, ori: 2 }, { type: "tree_09", pos: v2.create(-32.5, 32), scale: 1, ori: 1 }, { type: "tree_09", pos: v2.create(-40, 35.5), scale: 1, ori: 1 }, { type: "tree_09", pos: v2.create(-44.5, 32.5), scale: 1, ori: 3 }, { type: "woodpile_02", pos: v2.create(-33.5, 23.5), scale: 1, ori: 0 }, { type: "woodpile_02", pos: v2.create(-42.75, 21.5), scale: 1, ori: 1 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-30.5, 9), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ chest_02: 1, case_04: 1 }), pos: v2.create(-30.5, 4.75), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-25.75, 7), scale: 1, ori: 0, inheritOri: false }, { type: "woodpile_02", pos: v2.create(-14.5, 0.5), scale: 1, ori: 1 }, { type: "woodpile_02", pos: v2.create(-21, -8.75), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-36.5, -9), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-34, -11.5), scale: 0.9, ori: 0 }, { type: "outhouse_01", pos: v2.create(-48.5, -5), scale: 1, ori: 1 }, { type: randomObstacleType({ outhouse_01: 5, outhouse_02: 1 }), pos: v2.create(-48.5, -14.5), scale: 1, ori: 1 }, { type: "woodpile_01", pos: v2.create(-51, -20.5), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-26.75, -36), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-22, -34), scale: 1, ori: 0, inheritOri: false }, { type: "tree_09", pos: v2.create(-14.5, -20), scale: 1, ori: 1 }, { type: "tree_09", pos: v2.create(-11.5, -23), scale: 1, ori: 2 }, { type: "tree_09", pos: v2.create(-15.5, -24), scale: 1, ori: 0 }, { type: "woodpile_02", pos: v2.create(-37, -34), scale: 1, ori: 1 }, { type: "woodpile_02", pos: v2.create(-31, -47), scale: 1, ori: 0 }, { type: "woodpile_02", pos: v2.create(-18.75, -45.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-2.5, -35.75), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(0.75, -37.5), scale: 0.9, ori: 0 }, { type: "tree_07", pos: v2.create(1, -33), scale: 1.2, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createLoggingComplex2(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false, spawnPriority: 10 }, mapObstacleBounds: [collider.createCircle(v2.create(0, 0), 40)], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(5, 21.5), v2.create(5.5, 6)), color: e.groundTintDk || 7563810, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents( v2.create(-17.75, -14), v2.create(6, 4.5) ), color: e.groundTintDk || 7563810, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents( v2.create(21.5, -10), v2.create(4.75, 3.5) ), color: e.groundTintDk || 7563810, roughness: 0.05, offsetDist: 0.5 } ], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: e.tree_08c || "tree_08c", pos: v2.create(0, 0), scale: 2, ori: 0 }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(2.5, 19.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(7.5, 19), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(3.5, 24.5), scale: 1, ori: 0, inheritOri: false }, { type: "crate_04", pos: v2.create(-20.5, -13.25), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(-15, -14.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(23.5, -9.25), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(20, -11), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createMansion(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-1.5, 20.5), v2.create(12.5, 4.5) ), color: 8671554 }, { collider: collider.createAabbExtents( v2.create(-2, -23), v2.create(3, 2.5) ), color: 8671554 }, { collider: collider.createAabbExtents( v2.create(-20.5, -22.5), v2.create(10, 2) ), color: 7750457 }, { collider: collider.createAabbExtents( v2.create(28, 1.5), v2.create(3.75, 3) ), color: 7237230 }, { collider: collider.createAabbExtents( v2.create(-3.5, -2), v2.create(28, 18.5) ), color: 6175023 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(-3.5, -2), v2.create(28, 18.5) ), collider.createAabbExtents( v2.create(-1.5, 20.5), v2.create(12.5, 4.5) ), collider.createAabbExtents(v2.create(0, 0), v2.create(20, 20)) ] }, { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(-21, -17), v2.create(11, 8)), collider.createAabbExtents(v2.create(-23, -6), v2.create(8, 3)), collider.createAabbExtents(v2.create(-2, -24), v2.create(2, 3)), collider.createAabbExtents(v2.create(28, 1.5), v2.create(3, 3)) ] }, { type: "grass", collision: [ collider.createAabbExtents(v2.create(-2, 4), v2.create(5, 5)) ] }, { type: "house", collision: [ collider.createAabbExtents(v2.create(1, 13), v2.create(2, 3.25)) ] } ], imgs: [ { sprite: "map-building-mansion-floor-01a.img", pos: v2.create(-1.5, 22), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-floor-01b.img", pos: v2.create(-3.5, -2), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-floor-01c.img", pos: v2.create(28.5, 1.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-floor-01d.img", pos: v2.create(-15, -24), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-15, -22.4), v2.create(17, 2.2) ), zoomOut: collider.createAabbExtents( v2.create(-15, -24.4), v2.create(21, 4.2) ) }, { zoomIn: collider.createAabbExtents( v2.create(-3.5, -2), v2.create(28, 18.5) ), zoomOut: collider.createAabbExtents( v2.create(-3.5, -2), v2.create(28, 18.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(-1.5, 20.6), v2.create(12, 4.2) ), zoomOut: collider.createAabbExtents( v2.create(-9, 23.1), v2.create(5, 6.7) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-mansion-ceiling.img", scale: 1, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "brick_wall_ext_9", pos: v2.create(-31.5, -16.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-31.75, -10.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_19", pos: v2.create(-31.5, 0.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-31.75, 11.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(-31.5, 15), scale: 1, ori: 0 }, { type: "brick_wall_ext_17", pos: v2.create(-22.5, 16.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_9", pos: v2.create(-13.5, 20.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-13, 24.9), scale: 1, ori: 3 }, { type: "brick_wall_ext_19", pos: v2.create(0.5, 24.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_9", pos: v2.create(10.5, 20.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_13", pos: v2.create(17.5, 16.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(24.5, 14), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(24.75, 9.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_18", pos: v2.create(24.5, -1), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(24.75, -11.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_8", pos: v2.create(24.5, -17), scale: 1, ori: 0 }, { type: "brick_wall_ext_7", pos: v2.create(20.5, -20.5), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(15.5, -20.75), scale: 1, ori: 1 }, { type: "brick_wall_ext_14", pos: v2.create(7, -20.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-4, -21), scale: 1, ori: 3 }, { type: "brick_wall_ext_6", pos: v2.create(-7, -20.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_short_7", pos: v2.create(28.5, 4.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_short_7", pos: v2.create(28.5, -1.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(-7, -20.5), scale: 1, ori: 1 }, { type: e.mansion_column_1 || "mansion_column_1", pos: v2.create(-5, -24), scale: 1, ori: 1 }, { type: e.mansion_column_1 || "mansion_column_1", pos: v2.create(1, -24), scale: 1, ori: 1 }, { type: "saferoom_01", pos: v2.create(-25.5, 1.5), scale: 1, ori: 0 }, { type: e.mansion_wall_int_12 || "mansion_wall_int_12", pos: v2.create(-25, -2.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-19, -2.5), scale: 1, ori: 3 }, { type: e.mansion_wall_int_1 || "mansion_wall_int_1", pos: v2.create(-30.5, 5.5), scale: 1, ori: 1 }, { type: "house_door_03", pos: v2.create(-30.25, 5.5), scale: 1, ori: 3 }, { type: e.mansion_wall_int_13 || "mansion_wall_int_13", pos: v2.create(-20.5, 5.5), scale: 1, ori: 1 }, { type: e.mansion_wall_int_7 || "mansion_wall_int_7", pos: v2.create(-19.5, 1.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-14.5, 6), scale: 1, ori: 0 }, { type: e.mansion_wall_int_6 || "mansion_wall_int_6", pos: v2.create(-14.5, 13), scale: 1, ori: 0 }, { type: e.mansion_wall_int_6 || "mansion_wall_int_6", pos: v2.create(-14.5, -5), scale: 1, ori: 0 }, { type: e.mansion_wall_int_10 || "mansion_wall_int_10", pos: v2.create(-10, -8.5), scale: 1, ori: 1 }, { type: e.mansion_wall_int_11 || "mansion_wall_int_11", pos: v2.create(-9.5, -14.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_8", pos: v2.create(-7.5, 14), scale: 1, ori: 0 }, { type: "brick_wall_ext_8", pos: v2.create(-1.5, 14), scale: 1, ori: 0 }, { type: "brick_wall_ext_8", pos: v2.create(3.5, 14), scale: 1, ori: 0 }, { type: "brick_wall_ext_12", pos: v2.create(-2, 9.5), scale: 1, ori: 1 }, { type: "stairs_01", pos: v2.create(-4.5, 12), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-7.5, 4), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(3.5, 4), scale: 1, ori: 0 }, { type: "glass_wall_12", pos: v2.create(-2, -1.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(10.5, 16), scale: 1, ori: 2 }, { type: e.mansion_wall_int_9 || "mansion_wall_int_9", pos: v2.create(10.5, 7.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(10.5, -1), scale: 1, ori: 0 }, { type: e.mansion_wall_int_8 || "mansion_wall_int_8", pos: v2.create(10.5, -5), scale: 1, ori: 0 }, { type: e.mansion_wall_int_9 || "mansion_wall_int_9", pos: v2.create(15.5, 4.5), scale: 1, ori: 1 }, { type: e.mansion_wall_int_9 || "mansion_wall_int_9", pos: v2.create(15.5, -1.5), scale: 1, ori: 1 }, { type: e.mansion_wall_int_5 || "mansion_wall_int_5", pos: v2.create(19.5, 1.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(24, 1.5), scale: 1, ori: 1 }, { type: e.mansion_wall_int_5 || "mansion_wall_int_5", pos: v2.create(3.5, -8.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(6, -8.5), scale: 1, ori: 3 }, { type: e.mansion_wall_int_11 || "mansion_wall_int_11", pos: v2.create(5.5, -14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ bookshelf_01: 6, bookshelf_02: 1 }), pos: v2.create(-27.25, 7.15), scale: 1, ori: 2 }, { type: randomObstacleType({ bookshelf_01: 6, bookshelf_02: 1 }), pos: v2.create(-27.25, 14.85), scale: 1, ori: 0 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-11.5, -11.75), scale: 1, ori: 3 }, { type: "stand_01", pos: v2.create(-7.5, -10.5), scale: 1, ori: 0 }, { type: "stand_01", pos: v2.create(3.5, -10.5), scale: 1, ori: 0 }, { type: randomObstacleType({ bookshelf_01: 6, bookshelf_02: 1 }), pos: v2.create(7.25, -16.25), scale: 1, ori: 1 }, { type: "piano_01", pos: v2.create(14.9, -3.25), scale: 1, ori: 0 }, { type: "toilet_01", pos: v2.create(17, 1.5), scale: 1, ori: 3 }, { type: "refrigerator_01", pos: v2.create(22.15, 14.4), scale: 1, ori: 0 }, { type: "oven_01", pos: v2.create(12.75, 6.75), scale: 1, ori: 1 }, { type: "oven_01", pos: v2.create(12.75, 10.25), scale: 1, ori: 1 }, { type: "table_02", pos: v2.create(15.75, -14.25), scale: 1, ori: 0 }, { type: e.entry_loot || "", pos: v2.create(-2, -8.5), scale: 1, ori: 0 }, { type: e.decoration_02 || "loot_tier_mansion_floor", pos: v2.create(-2, -8.5), scale: 1, ori: 0 }, { type: e.decoration_02 || "", pos: v2.create(-21, 9.5), scale: 1, ori: 0 }, { type: e.decoration_02 || "", pos: v2.create(18, -8.5), scale: 1, ori: 0 }, { type: e.decoration_02 || "", pos: v2.create(6, 20.5), scale: 1, ori: 0 }, { type: e.decoration_01 || "", pos: v2.create(-30.15, 15), scale: 0.8, ori: 0 }, { type: e.decoration_01 || "", pos: v2.create(1.5, 11.5), scale: 1, ori: 2 }, { type: e.decoration_01 || "", pos: v2.create(8.5, 22.5), scale: 1, ori: 3 }, { type: e.decoration_01 || "", pos: v2.create(22.5, 14.5), scale: 1, ori: 3 }, { type: e.decoration_01 || "", pos: v2.create(22.5, -18.5), scale: 1, ori: 2 }, { type: e.tree || "tree_interior_01", pos: v2.create(-2, 4), scale: e.tree_scale || 0.6, ori: 0, ignoreMapSpawnReplacement: true }, { type: e.tree_loot || "", pos: v2.create(-2.25, 4), scale: 1, ori: 0 }, { type: e.tree_loot || "", pos: v2.create(-1.75, 4), scale: 1, ori: 0 }, { type: e.tree_loot || "", pos: v2.create(-2, 4.25), scale: 1, ori: 0 }, { type: e.tree_loot || "", pos: v2.create(-2, 3.75), scale: 1, ori: 0 }, { type: randomObstacleType({ bush_01: 25, bush_03: 1, "": e.bush_chance || 0 }), pos: v2.create(-4.75, 1.25), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ bush_01: 25, bush_03: 1, "": e.bush_chance || 0 }), pos: v2.create(0.75, 1.25), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ bush_01: 25, bush_03: 1, "": e.bush_chance || 0 }), pos: v2.create(-4.75, 6.75), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ bush_01: 25, bush_03: 1, "": e.bush_chance || 0 }), pos: v2.create(0.75, 6.75), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: e.porch_01 || "bush_01", pos: v2.create(-8, -23), scale: 0.95, ori: 0 }, { type: e.porch_01 || "bush_01", pos: v2.create(4, -23), scale: 0.95, ori: 0 }, { type: "shack_01", pos: v2.create(-20.75, 22.5), scale: 1, ori: 2 }, { type: "crate_01", pos: v2.create(13.25, 19.25), scale: 0.9, ori: 0, inheritOri: false }, { type: "tree_01", pos: v2.create(24, 24), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(27, -4), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(29, -17.25), scale: 0.7, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createMansionCellar(e) { const t = { type: "building", map: { display: false }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "brick", collision: [ collider.createAabbExtents(v2.create(18, 3), v2.create(7, 13)), collider.createAabbExtents(v2.create(5, 0), v2.create(6, 10)) ] } ], imgs: [ { sprite: "map-building-mansion-gradient-01.img", pos: v2.create(-3.75, 0.25), scale: 4, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-cellar-01a.img", pos: v2.create(11.5, 5.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-cellar-01b.img", pos: v2.create(28.5, 1.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-mansion-cellar-01c.img", pos: v2.create(11.5, -9), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(18, 3), v2.create(7, 13) ) }, { zoomIn: collider.createAabbExtents( v2.create(5, 1.5), v2.create(6, 12) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "brick_wall_ext_thicker_24", pos: v2.create(-2.5, 6), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_8", pos: v2.create(0, -7.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_7", pos: v2.create(5.5, -9.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_9", pos: v2.create(11.5, -11.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_7", pos: v2.create(17.5, -9.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_5", pos: v2.create(21.5, -7.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_8", pos: v2.create(25.5, -5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_15", pos: v2.create(25.5, 11.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_16", pos: v2.create(16, 17.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_7", pos: v2.create(9.5, 12.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_5", pos: v2.create(5.5, 10.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_5", pos: v2.create(29.5, 5.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_thicker_5", pos: v2.create(29.5, -2.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(31.5, 1.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_thicker_6", pos: v2.create(4.5, 15), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(1, 17.6), scale: 1, ori: 1 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(8.5, -9.53), scale: 1, ori: 2 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(11.5, -9.53), scale: 1, ori: 2 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(14.5, -9.53), scale: 1, ori: 2 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(12.75, 15.5), scale: 1, ori: 0 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(15.75, 15.5), scale: 1, ori: 0 }, { type: randomObstacleType({ barrel_03: 9, barrel_04: 1 }), pos: v2.create(18.75, 15.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(22.25, 14.25), scale: 0.75, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ bookshelf_01: 7, bookshelf_02: 1 }), pos: v2.create(22.75, 8), scale: 1, ori: 3 }, { type: e.mansion_column_1 || "mansion_column_1", pos: v2.create(5.5, 1.5), scale: 1, ori: 1 }, { type: e.mansion_column_1 || "mansion_column_1", pos: v2.create(17.5, 1.5), scale: 1, ori: 1 }, { type: e.mid_obs_01 || "barrel_02", pos: v2.create(8.5, 1.5), scale: 0.8, ori: 0 }, { type: "barrel_01", pos: v2.create(11.5, 1.5), scale: 0.8, ori: 0 }, { type: e.mid_obs_01 || "barrel_02", pos: v2.create(14.5, 1.5), scale: 0.8, ori: 0 }, { type: e.decoration_02 || "", pos: v2.create(16.5, 7.5), scale: 1, ori: 0 }, { type: e.decoration_02 || "", pos: v2.create(11.5, -5.5), scale: 1, ori: 0 }, { type: e.decoration_01 || "", pos: v2.create(0.5, -4.5), scale: 1, ori: 1 }, { type: e.decoration_01 || "", pos: v2.create(22.5, 14.5), scale: 1, ori: 3 } ] }; return util.mergeDeep(t, e || {}); } function createOutHouse(e) { const t = { type: "building", map: { display: true, color: 8145976, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 1.4), v2.create(5.5, 6.5)) ], zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 0.15), v2.create(3.75, 4.75) ) ] } ], imgs: [ { sprite: "map-building-outhouse-floor.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 1.45), v2.create(3.6, 3.2) ), zoomOut: collider.createAabbExtents( v2.create(0, 1.4), v2.create(3.8, 3.4) ) } ], imgs: [ { sprite: "map-building-outhouse-ceiling.img", scale: 0.5, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 2, particleCount: 15, particle: "outhouseBreak", residue: "map-outhouse-res.img" } }, mapObjects: [ { type: "outhouse_wall_top", pos: v2.create(0, 4.46), scale: 1, ori: 0 }, { type: "outhouse_wall_side", pos: v2.create(3.4, 1.73), scale: 1, ori: 0 }, { type: "outhouse_wall_side", pos: v2.create(-3.4, 1.73), scale: 1, ori: 0 }, { type: "outhouse_wall_bot", pos: v2.create(-2.65, -1.52), scale: 1, ori: 0 }, { type: "outhouse_wall_bot", pos: v2.create(2.65, -1.52), scale: 1, ori: 0 }, { type: e.obs || randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(0, 2), scale: 0.95, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createTeaPavilion(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(9, 9) ), color: 10555920 }, { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(3.5, 3.5) ), color: 16727611 }, { collider: collider.createAabbExtents( v2.create(0, -10.15), v2.create(2, 1.5) ), color: 7354635 } ] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(11, 11)), collider.createAabbExtents(v2.create(0, -20), v2.create(4, 12)) ], ori: 0, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(9, 9)), collider.createAabbExtents( v2.create(0, -10.15), v2.create(2, 1.5) ) ] } ], imgs: [ { sprite: "map-building-pavilion-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-teahouse-floor-02.img", pos: v2.create(0, -10.25), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(0, 0), v2.create(7, 7)), zoomOut: collider.createAabbExtents(v2.create(0, 0), v2.create(9, 9)) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-pavilion-ceiling-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 3, particle: "teapavilionBreak", particleCount: 15, residue: "map-building-pavilion-res-01.img" } }, mapObjects: [ { type: "teahouse_wall_int_12", pos: v2.create(0, 6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_13", pos: v2.create(6.5, 0.5), scale: 1, ori: 0 }, { type: "teahouse_wall_int_13", pos: v2.create(-6.5, 0.5), scale: 1, ori: 0 }, { type: "teahouse_wall_int_5", pos: v2.create(-4.5, -6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_5", pos: v2.create(4.5, -6.5), scale: 1, ori: 1 }, { type: "teahouse_door_01", pos: v2.create(-2, -6.5), scale: 1, ori: 3 }, { type: e.left_loot || "pot_03", pos: v2.create(4.5, 4.5), scale: 1, ori: 0 }, { type: e.right_loot || "pot_03", pos: v2.create(-4.5, 4.5), scale: 1, ori: 0 }, { type: e.center_loot || "loot_tier_airdrop_armor", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createTeaHouseComplex(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(24, 18)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(21, 15)), color: e.grass_color || 6066442, roughness: 0.05, offsetDist: 0.25 } ], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "teahouse_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(12, 11), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(-16, -6), scale: 1, ori: 0 }, { type: e.tree_small || "tree_07sp", pos: v2.create(-3, 12), scale: 0.9, ori: 0 }, { type: e.tree_small || "tree_07sp", pos: v2.create(-15, 12), scale: 0.9, ori: 0 }, { type: e.tree_large || randomObstacleType({ tree_08sp: 2, "": 1 }), pos: v2.create(-10, -13), scale: 1, ori: 0 }, { type: e.tree_large || randomObstacleType({ tree_08sp: 2, "": 1 }), pos: v2.create(-17.5, 2.5), scale: 1.2, ori: 0 }, { type: e.tree_large || randomObstacleType({ tree_08sp: 2, "": 1 }), pos: v2.create(18, -6.5), scale: 1, ori: 0 }, { type: e.tree_large || randomObstacleType({ tree_08sp: 2, "": 1 }), pos: v2.create(17.5, 5), scale: 1.2, ori: 0 }, { type: e.tree_small || "tree_07sp", pos: v2.create(3, -12), scale: 0.9, ori: 0 }, { type: e.tree_small || "tree_07sp", pos: v2.create(15, -12), scale: 0.9, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createGrassyCover(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(10, 10)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(8, 8)), color: 7696926, roughness: 0.1, offsetDist: 0.2 } ], floor: { surfaces: [], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [] }; return util.mergeDeep(t, e || {}); } function createPoliceStation(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-21, -8), v2.create(21.25, 14) ), color: 5855577 }, { collider: collider.createAabbExtents( v2.create(-24.5, 8.5), v2.create(17.75, 9.75) ), color: 3355970 }, { collider: collider.createAabbExtents( v2.create(-3.5, 12), v2.create(3.5, 6.25) ), color: 4278620 }, { collider: collider.createAabbExtents( v2.create(10.35, 0), v2.create(10.5, 22) ), color: 3355970 }, { collider: collider.createAabbExtents( v2.create(31.25, 12.5), v2.create(10.75, 9.5) ), color: 3355970 }, { collider: collider.createAabbExtents( v2.create(-3.5, 2.5), v2.create(2.25, 2.25) ), color: 6310464 }, { collider: collider.createCircle(v2.create(-30.5, -18), 1.5), color: 8026746 }, { collider: collider.createCircle(v2.create(-20.5, -10.5), 1.5), color: 8026746 }, { collider: collider.createAabbExtents( v2.create(-38.5, -7), v2.create(1.4, 3.1) ), color: 13278307 }, { collider: collider.createAabbExtents( v2.create(-7.5, -19.5), v2.create(3.1, 1.4) ), color: 13278307 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(-24.5, 8.5), v2.create(17.75, 9.75) ), collider.createAabbExtents( v2.create(-3.5, 12), v2.create(3.5, 6.25) ), collider.createAabbExtents( v2.create(10.35, 0), v2.create(10.5, 22) ), collider.createAabbExtents( v2.create(31.25, 12.5), v2.create(10.75, 9.5) ) ] }, { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(-21.5, -13), v2.create(21, 11.5) ), collider.createAabbExtents(v2.create(-3.5, 2), v2.create(3, 3.5)) ] } ], imgs: [ { sprite: "map-building-police-floor-01.img", pos: v2.create(-9.5, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-police-floor-02.img", pos: v2.create(33, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-24.5, 8.5), v2.create(17.75, 9.75) ) }, { zoomIn: collider.createAabbExtents( v2.create(-3.5, 12), v2.create(3.5, 6.25) ) }, { zoomIn: collider.createAabbExtents( v2.create(10.35, 0), v2.create(10.5, 22) ) }, { zoomIn: collider.createAabbExtents( v2.create(31.25, 12.5), v2.create(10.75, 9.5) ), zoomOut: collider.createAabbExtents( v2.create(12, 0), v2.create(12.75, 26) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-police-ceiling-01.img", pos: v2.create(-21.5, 8.5), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-police-ceiling-02.img", pos: v2.create(10.5, 0), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-police-ceiling-03.img", pos: v2.create(31.96, 12.5), scale: 0.667, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "brick_wall_ext_20", pos: v2.create(-42, 8.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_41", pos: v2.create(-21, 18), scale: 1, ori: 1 }, { type: "brick_wall_ext_7", pos: v2.create(-38, -1), scale: 1, ori: 1 }, { type: "brick_wall_ext_21", pos: v2.create(-18, -1), scale: 1, ori: 1 }, { type: "brick_wall_ext_7", pos: v2.create(-7, 2), scale: 1, ori: 0 }, { type: "brick_wall_ext_7", pos: v2.create(-4, 6), scale: 1, ori: 1 }, { type: "brick_wall_ext_16", pos: v2.create(0, -1.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-0.5, -11), scale: 1, ori: 0 }, { type: "brick_wall_ext_10", pos: v2.create(0, -17.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_6", pos: v2.create(3.5, -22), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(6.5, -22.5), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(14.5, -22.5), scale: 1, ori: 1 }, { type: "brick_wall_ext_6", pos: v2.create(17.5, -22), scale: 1, ori: 1 }, { type: "brick_wall_ext_11", pos: v2.create(21, -17), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(21.5, -11.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_11", pos: v2.create(21, -2), scale: 1, ori: 0 }, { type: "brick_wall_ext_20", pos: v2.create(31.5, 3), scale: 1, ori: 1 }, { type: "brick_wall_ext_20", pos: v2.create(42, 12.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_33", pos: v2.create(25, 22), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(4.5, 22.5), scale: 1, ori: 3 }, { type: "brick_wall_ext_4", pos: v2.create(2.5, 22), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(0, 20), scale: 1, ori: 0 }, { type: "police_wall_int_2", pos: v2.create(-40.5, 8), scale: 1, ori: 1 }, { type: "police_wall_int_3", pos: v2.create(-34, 8), scale: 1, ori: 1 }, { type: "cell_door_01", pos: v2.create(-35.5, 8), scale: 1, ori: 1 }, { type: "police_wall_int_8", pos: v2.create(-35, 3.5), scale: 1, ori: 0 }, { type: "police_wall_int_3", pos: v2.create(-27, 8), scale: 1, ori: 1 }, { type: "police_wall_int_8", pos: v2.create(-28, 3.5), scale: 1, ori: 0 }, { type: "cell_door_01", pos: v2.create(-21.5, 8), scale: 1, ori: 1 }, { type: "police_wall_int_3", pos: v2.create(-20, 8), scale: 1, ori: 1 }, { type: "police_wall_int_8", pos: v2.create(-21, 3.5), scale: 1, ori: 0 }, { type: "cell_door_01", pos: v2.create(-14.5, 8), scale: 1, ori: 1 }, { type: "police_wall_int_3", pos: v2.create(-13, 8), scale: 1, ori: 1 }, { type: "police_wall_int_8", pos: v2.create(-14, 3.5), scale: 1, ori: 0 }, { type: "cell_door_01", pos: v2.create(-7.5, 8), scale: 1, ori: 1 }, { type: "police_wall_int_6", pos: v2.create(-7, 9.5), scale: 1, ori: 0 }, { type: "police_wall_int_7", pos: v2.create(-4, 13), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-7, 17.5), scale: 1, ori: 2 }, { type: "police_wall_int_4", pos: v2.create(2.5, -1), scale: 1, ori: 1 }, { type: "bank_window_01", pos: v2.create(6, -1), scale: 1, ori: 1 }, { type: "police_wall_int_6", pos: v2.create(10.5, -1), scale: 1, ori: 1 }, { type: "bank_window_01", pos: v2.create(15, -1), scale: 1, ori: 1 }, { type: "police_wall_int_4", pos: v2.create(18.5, -1), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(21, 3.5), scale: 1, ori: 0 }, { type: "police_wall_int_10", pos: v2.create(21, 12.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(21, 21.5), scale: 1, ori: 2 }, { type: "metal_wall_ext_10", pos: v2.create(35.5, 4), scale: 1, ori: 1 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(33, 4.15), scale: 1, ori: 2 }, { type: "metal_wall_ext_10", pos: v2.create(35.5, 21), scale: 1, ori: 1 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(33, 20.85), scale: 1, ori: 0 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(38, 20.85), scale: 1, ori: 0 }, { type: "metal_wall_ext_18", pos: v2.create(41, 12.5), scale: 1, ori: 0 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(40.85, 7.5), scale: 1, ori: 3 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(40.85, 17.5), scale: 1, ori: 3 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(35.5, 12.5), scale: 1, ori: 1 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(38, 11.35), scale: 1, ori: 0 }, { type: randomObstacleType({ locker_01: 8, locker_02: 1 }), pos: v2.create(33, 13.65), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(-37, 1), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(-23, 1), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(-16, 1), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(-9, 1), scale: 1, ori: 2 }, { type: "control_panel_01", pos: v2.create(-4.5, 9.5), scale: 1, ori: 1 }, { type: "crate_06", pos: v2.create(-24.5, 20.25), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(14.5, 12.5), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(18.75, 12.5), scale: 1, ori: 1 }, { type: "fire_ext_01", pos: v2.create(21.85, 12.5), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(10.5, 1.25), scale: 1, ori: 0 }, { type: "vending_01", pos: v2.create(2, -6.75), scale: 1, ori: 1 }, { type: "stand_01", pos: v2.create(2, -14.5), scale: 1, ori: 1 }, { type: "bush_01", pos: v2.create(2.5, -19.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "bush_01", pos: v2.create(18.5, -19.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: randomObstacleType({ loot_tier_police_floor: 1 }), pos: v2.create(-38.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(-31.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(-24.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(-17.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(-10.5, 4), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-3.5, 2.5), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true }, { type: "sandbags_01", pos: v2.create(-38.5, -7), scale: 1, ori: 3 }, { type: "sandbags_01", pos: v2.create(-7.5, -19.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-30.5, -18), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-20.5, -10.5), scale: 0.9, ori: 0 }, { type: "tree_01", pos: v2.create(39, -6), scale: 0.8, ori: 0 }, { type: "tree_01", pos: v2.create(28, -17.5), scale: 0.8, ori: 0 }, { type: "hedgehog_01", pos: v2.create(39, -17.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(24.5, -0.5), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true } ] }; return util.mergeDeep(t, e || {}); } function createHouseRed(e) { const t = { type: "building", map: { display: true, color: 6429724, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(19, 17.5)) ], zIdx: 1, floor: { surfaces: [ { type: "house", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(14.5, 13)) ] } ], imgs: [ { sprite: "map-building-house-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-porch-01.img", pos: v2.create(-1, 14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(14.5, 13) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(16.5, 15) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-house-ceiling.img", scale: 0.667, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "brick_wall_ext_12", pos: v2.create(-9, 13), scale: 1, ori: 1 }, { type: "brick_wall_ext_14", pos: v2.create(8, 13), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(1, 13.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(-14.5, 10), scale: 1, ori: 0 }, { type: "brick_wall_ext_10", pos: v2.create(-14.5, -0.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(-14.5, -10.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-14.75, 6), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-14.75, -7), scale: 1, ori: 0 }, { type: "brick_wall_ext_5", pos: v2.create(-12.5, -13), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(-4.5, -13), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(4.5, -13), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(12.5, -13), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-8.5, -13.25), scale: 1, ori: 3 }, { type: "house_window_01", pos: v2.create(8.5, -13.25), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(-2, -13.25), scale: 1, ori: 3 }, { type: "brick_wall_ext_8", pos: v2.create(14.5, 8.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_9", pos: v2.create(14.5, -3), scale: 1, ori: 0 }, { type: "brick_wall_ext_2", pos: v2.create(14.5, -11.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(14.75, -9), scale: 1, ori: 2 }, { type: "house_window_01", pos: v2.create(14.75, 3), scale: 1, ori: 2 }, { type: e.house_wall_int_9 || "house_wall_int_9", pos: v2.create(-9.5, -1), scale: 1, ori: 1 }, { type: e.house_wall_int_5 || "house_wall_int_5", pos: v2.create(4.5, -6), scale: 1, ori: 0 }, { type: e.house_wall_int_9 || "house_wall_int_9", pos: v2.create(9.5, -4), scale: 1, ori: 1 }, { type: e.house_wall_int_8 || "house_wall_int_8", pos: v2.create(5.5, 8.5), scale: 1, ori: 0 }, { type: e.house_wall_int_4 || "house_wall_int_4", pos: v2.create(8, 7), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(4.5, -12.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(6, 2.5), scale: 1, ori: 2 }, { type: "house_door_01", pos: v2.create(14, 7), scale: 1, ori: 1 }, { type: e.house_column_1 || "house_column_1", pos: v2.create(6, 3.5), scale: 1, ori: 0 }, { type: e.house_column_1 || "house_column_1", pos: v2.create(6, -2.5), scale: 1, ori: 0 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(8, 10), scale: 1, ori: 1 }, { type: "stand_01", pos: v2.create(12.25, -2), scale: 1, ori: 3 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(7.75, -6), scale: 1, ori: 0 }, { type: e.stand || "", pos: v2.create(-12.25, -3), scale: 1, ori: 1 }, { type: "table_01", pos: v2.create(-11.25, 1.75), scale: 1, ori: 0 }, { type: "oven_01", pos: v2.create(-7, 11), scale: 1, ori: 0 }, { type: "refrigerator_01", pos: v2.create(-7, 1), scale: 1, ori: 2 }, { type: e.plant || "bush_02", pos: e.plant_pos || v2.create(-12, -10.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: e.porch_01 || "", pos: v2.create(4.5, -15.5), scale: 0.9, ori: 0 }, { type: e.porch_01 || "", pos: v2.create(-5.25, 15.5), scale: 0.9, ori: 2 }, { type: "loot_tier_1", pos: v2.create(0, 4.5), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(-10.25, -8.5), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(-10, -8.75), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(-9.75, -8.25), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createHouseRed2(e) { const t = { type: "building", map: { display: true, color: 4656911, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, -1), v2.create(19, 18.5)) ], zIdx: 1, floor: { surfaces: [ { type: "house", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(14.5, 13)) ] } ], imgs: [ { sprite: "map-building-house-floor-02.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-porch-01.img", pos: v2.create(10, 14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(2.6, -14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(5.2, -14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(7.8, -14.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -16.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(2.6, -16.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(5.2, -16.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-porch-01.img", pos: v2.create(7.8, -16.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(14.5, 13) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(16.5, 15) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-house-ceiling.img", scale: 0.667, alpha: 1, tint: 13619151, rot: 2 } ] }, mapObjects: [ { type: "brick_wall_ext_5", pos: v2.create(-12.5, 13), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-8.5, 13.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_15", pos: v2.create(0.5, 13), scale: 1, ori: 1 }, { type: "brick_wall_ext_3", pos: v2.create(13.5, 13), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(12, 13.25), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(-14.5, 10), scale: 1, ori: 0 }, { type: "brick_wall_ext_10", pos: v2.create(-14.5, -0.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_4", pos: v2.create(-14.5, -10.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-14.75, 6), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(-14.75, -7), scale: 1, ori: 0 }, { type: "brick_wall_ext_5", pos: v2.create(-12.5, -13), scale: 1, ori: 1 }, { type: "brick_wall_ext_5", pos: v2.create(-4.5, -13), scale: 1, ori: 1 }, { type: "brick_wall_ext_13", pos: v2.create(8.5, -13), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-8.5, -13.25), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(-2, -13.25), scale: 1, ori: 3 }, { type: "brick_wall_ext_8", pos: v2.create(14.5, 8.5), scale: 1, ori: 0 }, { type: "brick_wall_ext_9", pos: v2.create(14.5, -3), scale: 1, ori: 0 }, { type: "brick_wall_ext_2", pos: v2.create(14.5, -11.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(14.75, -9), scale: 1, ori: 2 }, { type: "house_window_01", pos: v2.create(14.75, 3), scale: 1, ori: 2 }, { type: e.house_wall_int_5 || "house_wall_int_5", pos: v2.create(-0.5, 10), scale: 1, ori: 0 }, { type: e.house_wall_int_14 || "house_wall_int_14", pos: v2.create(-7, 3), scale: 1, ori: 1 }, { type: e.house_wall_int_11 || "house_wall_int_11", pos: v2.create(-8.5, -2), scale: 1, ori: 1 }, { type: e.house_wall_int_4 || "house_wall_int_4", pos: v2.create(12, 1), scale: 1, ori: 1 }, { type: e.house_wall_int_4 || "house_wall_int_4", pos: v2.create(12, -7), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-0.5, 3.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-3.5, -1.5), scale: 1, ori: 0 }, { type: e.house_column_1 || "house_column_1", pos: v2.create(4, -3), scale: 1, ori: 0 }, { type: randomObstacleType({ toilet_01: 5, toilet_02: 1 }), pos: v2.create(-11.75, 0.5), scale: 1, ori: 1 }, { type: e.stand || "", pos: v2.create(-12.5, 11), scale: 1, ori: 0 }, { type: randomObstacleType({ drawers_01: 7, drawers_02: 1 }), pos: v2.create(-3.75, 11), scale: 1, ori: 0 }, { type: randomObstacleType({ bookshelf_01: 7, bookshelf_02: 1 }), pos: v2.create(13, -3), scale: 1, ori: 3 }, { type: "table_03", pos: v2.create(-8.5, -6), scale: 1, ori: 0 }, { type: "oven_01", pos: v2.create(-12.25, -11), scale: 1, ori: 2 }, { type: "refrigerator_01", pos: v2.create(-4.5, -11), scale: 1, ori: 2 }, { type: e.plant || "bush_02", pos: e.plant_pos || v2.create(2, 10.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: e.porch_01 || "", pos: v2.create(-4.5, -15.5), scale: 0.9, ori: 0 }, { type: e.porch_01 || "", pos: v2.create(5.75, 15.5), scale: 0.9, ori: 2 }, { type: "loot_tier_1", pos: v2.create(0, -4.5), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(4.25, 8.5), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(3.75, 8.5), scale: 1, ori: 0 }, { type: e.plant_loot || "", pos: v2.create(4, 8.25), scale: 1, ori: 0 }, { type: "grill_01", pos: v2.create(6, -15.25), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createShack2(e) { const t = { type: "building", map: { display: true, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 0.9), v2.create(5.6, 3.5) ) ] }, { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(3.75, -4), v2.create(2.25, 1.5) ) ] } ], imgs: [ { sprite: "map-building-shack-floor-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.9), v2.create(5.6, 3.5) ), zoomOut: collider.createAabbExtents( v2.create(0, 0.8), v2.create(5.9, 3.8) ) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-shack-ceiling-01.img", scale: 0.667, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 2, particle: "shackBreak", particleCount: 25, residue: "map-shack-res-01.img" } }, mapObjects: [ { type: "shack_wall_bot", pos: v2.create(-1.49, -2.4), scale: 1, ori: 0 }, { type: "shack_wall_side_left", pos: v2.create(-5.55, 0.69), scale: 1, ori: 0 }, { type: "shack_wall_top", pos: v2.create(-0.3, 4.33), scale: 1, ori: 0 }, { type: "shack_wall_side_right", pos: v2.create(5.55, 0.95), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(7.9, 2.85), scale: 0.8, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(7.45, -0.9), scale: 0.85, ori: 0 }, { type: randomObstacleType({ loot_tier_2: 1 }), pos: v2.create(-2, 0.8), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(2, 0.8), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createShack(e) { const t = { type: "building", map: { display: true, color: 4014894, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(0, 1), v2.create(5, 4)) ] }, { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(0, -4), v2.create(2, 1)) ] } ], imgs: [ { sprite: "map-building-shack-floor-02.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 1), v2.create(4.75, 3.75) ) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-shack-ceiling-02.img", scale: 0.667, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 2, particle: "shackBreak", particleCount: 25, residue: "map-shack-res-02.img" } }, mapObjects: [ { type: "barn_wall_int_2", pos: v2.create(-3, -2.5), scale: 1, ori: 1 }, { type: "barn_wall_int_2", pos: v2.create(3, -2.5), scale: 1, ori: 1 }, { type: "barn_wall_int_8", pos: v2.create(-4.5, 1), scale: 1, ori: 0 }, { type: "barn_wall_int_8", pos: v2.create(4.5, 1), scale: 1, ori: 0 }, { type: "barn_wall_int_8", pos: v2.create(0, 4.5), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(4, -4.5), scale: 0.8, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1 }), pos: v2.create(0, 1), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createWarehouse(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(27, 0), v2.create(3, 12.25) ), color: 10066329 }, { collider: collider.createAabbExtents( v2.create(-27, 0), v2.create(3, 12.25) ), color: 10066329 }, { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(24.5, 12.25) ), color: 5915450 } ] }, zIdx: 1, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(35, 16)) ], floor: { surfaces: [ { type: "warehouse", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(32, 12.5)) ] } ], imgs: [ { sprite: "map-building-warehouse-floor-01.img", pos: v2.create(-15.615, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-warehouse-floor-01.img", pos: v2.create(15.615, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(24.5, 12.25) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(32, 12.5) ) } ], vision: { dist: 8, width: 5 }, imgs: [ { sprite: "map-building-warehouse-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "warehouse_wall_side", pos: v2.create(0, 11.9), scale: 1, ori: 0 }, { type: "warehouse_wall_edge", pos: v2.create(-24.4, 8.2), scale: 1, ori: 0 }, { type: "warehouse_wall_edge", pos: v2.create(24.4, 8.2), scale: 1, ori: 0 }, { type: "warehouse_wall_side", pos: v2.create(0, -11.9), scale: 1, ori: 0 }, { type: "warehouse_wall_edge", pos: v2.create(-24.4, -8.2), scale: 1, ori: 0 }, { type: "warehouse_wall_edge", pos: v2.create(24.4, -8.2), scale: 1, ori: 0 }, { type: e.topLeftObs, pos: v2.create(-21.25, 8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "crate_04", pos: v2.create(-16.25, 8.75), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-21.25, -8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "barrel_01", pos: v2.create(-16.5, -8.75), scale: 0.9, ori: 0 }, { type: e.topRightObs, pos: v2.create(21.25, 8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "barrel_01", pos: v2.create(16.5, 8.75), scale: 0.9, ori: 0 }, { type: "crate_04", pos: v2.create(16.25, -8.75), scale: 1, ori: 1 }, { type: e.botRightObs, pos: v2.create(21.25, -8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: randomObstacleType({ crate_02: 1, crate_01: 3 }), pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "crate_01", pos: v2.create(5, 0), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "crate_01", pos: v2.create(-5, 0), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: e.ignoreMapSpawnReplacement }, { type: "crate_04", pos: v2.create(0, 5), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(0, -5), scale: 1, ori: 0 }, { type: e.decoration_01 || "", pos: v2.create(-9, 6), scale: 1, ori: 0 }, { type: e.decoration_01 || "", pos: v2.create(9, -6), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); } function createWarehouse2(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(25, 0), v2.create(3, 12.25) ), color: 10066329 }, { collider: collider.createAabbExtents( v2.create(-25, 0), v2.create(3, 12.25) ), color: 10066329 }, { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(22.5, 12.25) ), color: 2240064 } ] }, zIdx: 1, terrain: { grass: true, beach: false }, floor: { surfaces: [ { type: "warehouse", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(27.5, 12.5) ) ] } ], imgs: [ { sprite: "map-building-warehouse-floor-02.img", pos: v2.create(-13.72, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-building-warehouse-floor-02.img", pos: v2.create(13.72, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(22, 12.25) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(27.5, 12.5) ) } ], vision: { dist: 8, width: 5 }, imgs: [ { sprite: "map-building-warehouse-ceiling-02.img", scale: 1, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "metal_wall_ext_43", pos: v2.create(0, 12), scale: 1, ori: 1 }, { type: "metal_wall_ext_8", pos: v2.create(-21.9, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_8", pos: v2.create(21.9, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_43", pos: v2.create(0, -12), scale: 1, ori: 1 }, { type: "metal_wall_ext_8", pos: v2.create(-21.9, -8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_8", pos: v2.create(21.9, -8.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-18.75, 8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(-14, 8.75), scale: 0.9, ori: 0 }, { type: "crate_06", pos: v2.create(-18.75, -6), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(-19.5, -9.5), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(18.75, 6), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(19.5, 9.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(18.75, -8.75), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(14, -8.75), scale: 0.9, ori: 0 }, { type: randomObstacleType({ crate_08: 24, crate_09: 1 }), pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(0, 5), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(0, -5), scale: 1, ori: 0, inheritOri: false, ignoreMapSpawnReplacement: true }, { type: "crate_06", pos: v2.create(4, -5), scale: 1, ori: 1 }, { type: "crate_06", pos: v2.create(-4, 5), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(4.5, 0), scale: 0.9, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-4.5, 0), scale: 0.9, ori: 0, inheritOri: false } ] }; return util.mergeDeep(t, e || {}); } function createWindow(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 2)), height: 10, collidable: true, destructible: true, isWindow: true, health: 1, hitParticle: "glassChip", explodeParticle: "windowBreak", reflectBullets: false, loot: [], destroyType: "house_window_broken_01", img: { sprite: "map-building-house-window-01.img", residue: "none", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); } function createLowWall(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 2)), height: 0.2, isWall: true, collidable: true, destructible: false, health: 100, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [], img: { sprite: "map-building-house-window-res-01.img", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 }, sound: { bullet: "wall_wood_bullet", punch: "wall_wood_bullet", explode: "", enter: "none" } }; return util.mergeDeep(t, e || {}); } const MaterialDefs = { metal: { destructible: false, reflectBullets: true, hitParticle: "barrelChip", explodeParticle: "barrelBreak", sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "barrel_break_01", enter: "none" } }, wood: { destructible: true, reflectBullets: false, sound: { bullet: "wall_wood_bullet", punch: "wall_wood_bullet", explode: "wall_break_01", enter: "none" } }, woodPerm: { destructible: false, reflectBullets: false, sound: { bullet: "wall_wood_bullet", punch: "wall_wood_bullet", explode: "wall_break_01", enter: "none" } }, brick: { destructible: false, reflectBullets: false, hitParticle: "brickChip", sound: { bullet: "wall_brick_bullet", punch: "wall_brick_bullet", explode: "wall_break_01", enter: "none" } }, concrete: { destructible: false, reflectBullets: false, hitParticle: "barrelChip", sound: { bullet: "concrete_hit", punch: "concrete_hit", explode: "wall_break_01", enter: "none" } }, stone: { destructible: true, stonePlated: true, reflectBullets: false, hitParticle: "rockChip", explodeParticle: "rockBreak", sound: { bullet: "concrete_hit", punch: "concrete_hit", explode: "stone_break_01", enter: "none" } }, glass: { destructible: true, reflectBullets: false, hitParticle: "glassChip", explodeParticle: "windowBreak", sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }, cobalt: { destructible: false, reflectBullets: true, hitParticle: "barrelChip", explodeParticle: "barrelBreak", sound: { bullet: "cobalt_bullet", punch: "cobalt_bullet", explode: "barrel_break_01", enter: "none" } } }; const MapObjectDefs = { barrel_01: createBarrel({}), barrel_01b: createBarrel({ img: { tint: 13224393 }, loot: [ tierLoot("tier_surviv", 2, 3), autoLoot("mirv", 1), autoLoot("mirv", 1), autoLoot("mirv", 1) ] }), barrel_02: createWoodBarrel({ health: 60 }), barrel_03: createWoodBarrel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.25, 0.5)), health: 20, img: { sprite: "map-barrel-03.img", residue: "map-barrel-res-03.img", scale: 0.45 } }), barrel_04: createWoodBarrel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.25, 0.5)), health: 20, loot: [tierLoot("tier_soviet", 2, 3)], img: { sprite: "map-barrel-04.img", residue: "map-barrel-res-03.img", scale: 0.45 } }), propane_01: createBarrel({ collision: collider.createCircle(v2.create(0, 0), 1.25), health: 50, map: { display: true, color: 24516, scale: 1 }, img: { sprite: "map-propane-01.img", scale: 0.4 } }), bed_sm_01: createBed({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.4, 3.4)), img: { sprite: "map-bed-01.img" } }), bed_lg_01: createBed({ img: { residue: "map-bed-res-02.img" } }), bollard_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createCircle(v2.create(0, 0), 1.25), height: 0.5, collidable: true, destructible: false, health: 300, hitParticle: "barrelChip", explodeParticle: "barrelBreak", reflectBullets: true, loot: [], map: { display: true, color: 6310464, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-bollard-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "silo_bullet", punch: "silo_bullet", explode: "barrel_break_01", enter: "none" } }, bookshelf_01: createBookShelf({ img: { sprite: "map-bookshelf-01.img" }, loot: [tierLoot("tier_world", 1, 1)] }), bookshelf_02: createBookShelf({ img: { sprite: "map-bookshelf-02.img" }, loot: [tierLoot("tier_soviet", 2, 3)] }), bush_01: createBush({}), bush_01b: createBush({ img: { alpha: 1 } }), bush_01cb: createBush({ img: { sprite: "map-bush-01cb.img" }, map: { color: 2518873 } }), bush_01f: createBush({ img: { sprite: "map-bush-01f.img" }, map: { color: 1793032 } }), bush_01sv: createBush({ hitParticle: "leafPrickly", explodeParticle: "leafPrickly", img: { sprite: "map-bush-01sv.img", residue: "map-bush-res-01sv.img" }, map: { color: 7569455 } }), brush_01sv: createBush({ scale: { createMin: 1.5, createMax: 1.75, destroy: 0.75 }, health: 150, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.75, 1.75)), hitParticle: "leaf", explodeParticle: "leaf", img: { sprite: "map-brush-01sv.img", residue: "map-brush-res-02sv.img" }, map: { color: 5207588 } }), brush_02sv: createBush({ scale: { createMin: 1.5, createMax: 1.75, destroy: 0.75 }, health: 150, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.75, 1.75)), hitParticle: "leaf", explodeParticle: "leaf", img: { sprite: "map-brush-02sv.img", residue: "map-brush-res-02sv.img" }, map: { color: 5207588 } }), bush_01x: createBush({ map: { color: 4545840 }, img: { sprite: "map-bush-01x.img" } }), bush_02: createBush({ img: { residue: "map-bush-res-02.img" } }), bush_03: createBush({ img: { sprite: "map-bush-03.img", alpha: 1 } }), bush_04: createBush({ hitParticle: "leafRiver", explodeParticle: "leafRiver", img: { sprite: "map-bush-04.img", residue: "map-bush-res-04.img", alpha: 1, scale: 0.5 }, terrain: { grass: true, river: { centerWeight: 0.3 }, riverShore: true }, sound: { enter: "bush_enter_02" } }), bush_04cb: createBush({ hitParticle: "leafRiver", explodeParticle: "leafRiver", img: { sprite: "map-bush-04cb.img", residue: "map-bush-res-04.img", alpha: 1, scale: 0.5 }, terrain: { grass: true, river: { centerWeight: 0.3 }, riverShore: true }, sound: { enter: "bush_enter_02" }, map: { color: 2784099 } }), bush_05: createBush({ img: { sprite: "map-bush-05.img", residue: "map-bush-res-05.img" }, map: { color: 6971965 } }), bush_06: createBush({ collision: collider.createCircle(v2.create(0, 0), 1.75), img: { sprite: "map-bush-06.img", residue: "map-bush-res-06.img" }, map: { display: true, color: 6971965, scale: 1.5 } }), bush_06b: createBush({ scale: { createMin: 1, createMax: 1 }, collision: collider.createCircle(v2.create(0, 0), 1.75), img: { sprite: "map-bush-06.img", residue: "map-bush-res-06.img", alpha: 1 }, map: { display: true, color: 14041344, scale: 1.5 } }), bush_07: createBush({ hitParticle: "leafRiver", explodeParticle: "leafRiver", img: { sprite: "map-bush-07.img", alpha: 1, scale: 0.5 }, sound: { enter: "bush_enter_02" } }), bush_07sp: createBush({ hitParticle: "leafRiver", explodeParticle: "leafRiver", map: { display: true, color: 671242, scale: 1.5 }, img: { sprite: "map-bush-07sp.img", alpha: 1, scale: 0.5 }, sound: { enter: "bush_enter_02" } }), bush_07x: createBush({ img: { sprite: "map-bush-07x.img" } }), case_01: createCase({ loot: [autoLoot("deagle", 1)] }), case_02: createCase({ img: { sprite: "map-case-deagle-02.img" }, loot: [autoLoot("deagle", 1), autoLoot("deagle", 1)] }), case_03: createCase({ health: 140, img: { sprite: "map-case-hatchet-01.img", residue: "map-case-hatchet-res-01.img" }, loot: [tierLoot("tier_hatchet", 1, 1)], hitParticle: "blackChip" }), case_04: createCase({ health: 140, img: { sprite: "map-case-flare-01.img", residue: "map-case-flare-res-01.img" }, loot: [autoLoot("flare_gun", 1)], hitParticle: "blackChip", map: { display: true, color: 7025920, scale: 0.85 } }), case_05: createCase({ health: 140, img: { sprite: "map-case-meteor-01.img", residue: "map-case-meteor-res-01.img" }, loot: [ autoLoot("flare_gun", 1), autoLoot("strobe", 1), autoLoot("strobe", 1), autoLoot("strobe", 1), autoLoot("strobe", 1) ], hitParticle: "blackChip", map: { display: false, color: 7025920, scale: 0.85 } }), case_06: createCase({ health: 140, img: { sprite: "map-case-chrys-01.img" }, loot: [tierLoot("tier_chest", 2, 3), tierLoot("tier_chrys_case", 1, 1)], hitParticle: "blackChip", map: { display: false, color: 7025920, scale: 0.85 } }), case_07: createCase({ health: 200, img: { sprite: "map-case-ring-01.img" }, loot: [tierLoot("tier_ring_case", 1, 1)], hitParticle: "blackChip", map: { display: false, color: 7025920, scale: 0.85 } }), chest_01: createChest({ loot: [ tierLoot("tier_chest", 3, 4), tierLoot("tier_pirate_melee", 1, 1), autoLoot("outfitRoyalFortune", 1) ] }), chest_01cb: createChest({ loot: [tierLoot("tier_chest", 3, 4), tierLoot("tier_pirate_melee", 1, 1)] }), chest_02: createChest({ img: { sprite: "map-chest-02.img" }, loot: [tierLoot("tier_chest", 2, 2)], map: { display: true, color: 7025920, scale: 0.85 } }), chest_03: createRiverChest({ img: { sprite: "map-chest-03.img" }, loot: [tierLoot("tier_chest", 3, 5), autoLoot("outfitWaterElem", 1)] }), chest_03cb: createRiverChest({ img: { sprite: "map-chest-03.img" }, loot: [tierLoot("tier_chest", 3, 5)] }), chest_03d: createRiverChest({ img: { sprite: "map-chest-03d.img" }, loot: [tierLoot("tier_chest", 3, 5), autoLoot("outfitWaterElem", 1)] }), chest_03f: createRiverChest({ img: { sprite: "map-chest-03f.img" }, loot: [tierLoot("tier_chest", 3, 5), autoLoot("outfitKhaki", 1)] }), chest_03x: createRiverChest({ img: { sprite: "map-chest-03x.img" }, loot: [tierLoot("tier_chest", 3, 5), autoLoot("outfitWaterElem", 1)] }), chest_04: createChest({ health: 200, img: { sprite: "map-case-basement-01.img" }, loot: [ tierLoot("tier_noir_outfit", 1, 1), tierLoot("tier_chest_04", 1, 1), autoLoot("glock_dual", 1), autoLoot("smoke", 4) ], map: { display: false, color: 7025920, scale: 0.85 } }), chest_04d: createChest({ health: 200, img: { sprite: "map-case-basement-01.img" }, loot: [ tierLoot("tier_noir_outfit", 1, 1), tierLoot("tier_chest_04", 1, 1), autoLoot("9mm", 300), autoLoot("smoke", 4), autoLoot("backpack02", 1) ], map: { display: false, color: 7025920, scale: 0.85 } }), control_panel_01: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.7)), button: { interactionRad: 0.75, interactionText: "game-use", useOnce: true, useType: "cell_door_01", useDelay: 1.1, useDir: v2.create(-1, 0), useImg: "map-control-panel-02.img", sound: { on: "cell_control_01", off: "" } }, img: { sprite: "map-control-panel-01.img" } }), control_panel_02: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.7)), health: 175, img: { sprite: "map-control-panel-02.img" } }), control_panel_02b: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.7)), destructible: false, button: { interactionRad: 0.2, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-control-panel-01.img", sound: { on: "button_press_01", off: "button_press_01" } }, img: { sprite: "map-control-panel-02.img" } }), control_panel_03: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.25, 1.2)), health: 150, img: { sprite: "map-control-panel-03.img" } }), control_panel_04: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.7)), button: { interactionRad: 0.75, interactionText: "game-use", useOnce: true, useType: "crossing_door_01", useDelay: 4.25, useDir: v2.create(1, 0), useImg: "map-control-panel-05.img", sound: { on: "cell_control_02", off: "" } }, img: { sprite: "map-control-panel-04.img" } }), control_panel_06: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 1.2)), health: 200, img: { sprite: "map-control-panel-06.img" } }), switch_01: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.45, 0.55)), destructible: false, button: { interactionRad: 0.2, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-switch-02.img", offImg: "map-switch-03.img", sound: { on: "button_press_01", off: "button_press_01" } }, img: { sprite: "map-switch-01.img" } }), switch_02: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.45, 0.55)), destructible: false, img: { sprite: "map-switch-02.img" } }), switch_03: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.45, 0.55)), destructible: false, button: { interactionRad: 0.2, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(-1, 0), useImg: "map-switch-02.img", offImg: "map-switch-02.img", sound: { on: "button_press_01", off: "" } }, img: { sprite: "map-switch-01.img" } }), couch_01: createCouch({}), couch_02: createCouch({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3, 1.5)), img: { sprite: "map-couch-02.img" } }), couch_02b: createCouch({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3, 1.5)), img: { sprite: "map-couch-02.img", mirrorY: true } }), couch_03: createCouch({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), img: { sprite: "map-couch-03.img" } }), crate_01: createCrate({}), crate_01x: createCrate({ img: { sprite: "map-crate-01x.img" } }), crate_02: createCrate({ health: 140, loot: [tierLoot("tier_soviet", 3, 5)], map: { display: false }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-02.img" }, sound: { explode: "crate_break_01" } }), crate_02sv: createCrate({ health: 140, loot: [tierLoot("tier_soviet", 4, 5), tierLoot("tier_world", 1, 1)], map: { display: true, color: 16760832 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-02sv.img" }, sound: { explode: "crate_break_01" } }), crate_02sv_lake: createCrate({ health: 140, loot: [tierLoot("tier_soviet", 5, 6)], map: { display: true, color: 16760832 }, terrain: { lakeCenter: true }, img: { sprite: "map-crate-02sv.img" }, sound: { explode: "crate_break_01" } }), crate_02x: createCrate({ health: 140, loot: [tierLoot("tier_soviet", 3, 5)], map: { display: false }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-02x.img" }, sound: { explode: "crate_break_01" } }), crate_02f: createCrate({ health: 140, loot: [ tierLoot("tier_guns", 3, 3), tierLoot("tier_armor", 2, 2), tierLoot("tier_packs", 1, 1) ], map: { display: true, color: 13369344 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-02f.img" }, sound: { explode: "crate_break_01" } }), crate_02d: createCrate({ health: 140, loot: [ autoLoot("m1014", 1, 1), autoLoot("helmet03_lt_aged", 1, 1), autoLoot("outfitRedLeaderAged", 1, 1), autoLoot("machete_taiga", 1, 1) ], map: { display: true, color: 13369344 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-02f.img" }, sound: { explode: "crate_break_01" } }), crate_03: createCrate({ health: 100, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.575, 1.575)), loot: [tierLoot("tier_throwables", 2, 4)], map: { color: 5066014, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-03.img", scale: 0.35 }, sound: { explode: "crate_break_01" } }), crate_03x: createCrate({ health: 100, hitParticle: "glassChip", explodeParticle: ["glassPlank"], collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.575, 1.575)), loot: [ autoLoot("snowball", 4, 4), autoLoot("snowball", 4, 4), autoLoot("snowball", 4, 4) ], map: { color: 31863, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-03x.img", scale: 0.35 }, sound: { explode: "crate_break_02" } }), crate_04: createCrate({ health: 225, destructible: true, armorPlated: true, hitParticle: "greenChip", loot: [tierLoot("tier_ammo_crate", 1, 1)], map: { display: true, color: 5468244, scale: 0.875 }, img: { sprite: "map-crate-04.img" }, sound: { bullet: "ammo_crate_bullet", punch: "ammo_crate_bullet", explode: "crate_break_01" } }), crate_05: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2, 2)), destructible: false, hitParticle: "goldChip", loot: [], map: { display: false }, img: { sprite: "map-crate-05.img" }, sound: { bullet: "wall_brick_bullet", punch: "wall_brick_bullet" } }), crate_06: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 1.1)), health: 175, destructible: true, armorPlated: true, hitParticle: "greenChip", loot: [tierLoot("tier_ammo", 1, 1)], map: { display: false }, img: { sprite: "map-crate-06.img" }, sound: { bullet: "ammo_crate_bullet", punch: "ammo_crate_bullet" } }), crate_07: createCrate({ health: 140, loot: [ tierLoot("tier_surviv", 4, 5), autoLoot("ak47", 1), autoLoot("ak47", 1), autoLoot("ak47", 1), autoLoot("ak47", 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1) ], img: { sprite: "map-crate-07.img" }, sound: { explode: "crate_break_01" } }), crate_07b: createCrate({ health: 140, loot: [ tierLoot("tier_armor", 4, 5), autoLoot("mp220", 1), autoLoot("mp220", 1), autoLoot("bar", 1), autoLoot("bar", 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1) ], img: { sprite: "map-crate-07.img" }, sound: { explode: "crate_break_01" } }), crate_07sv: createCrate({ health: 140, loot: [ tierLoot("tier_surviv", 4, 5), autoLoot("svd", 1), autoLoot("svd", 1), autoLoot("blr", 1), autoLoot("blr", 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1), tierLoot("tier_khaki_outfit", 1, 1) ], img: { sprite: "map-crate-07.img" }, sound: { explode: "crate_break_01" } }), crate_08: createCrate({ health: 140, loot: [tierLoot("tier_surviv", 2, 3)], map: { display: false }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-08.img" }, sound: { explode: "crate_break_01" } }), crate_09: createCrate({ health: 140, loot: [tierLoot("tier_chest", 1, 2), tierLoot("tier_conch", 1, 1)], map: { display: false }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-09.img" }, sound: { explode: "crate_break_01" } }), crate_10: createCrate({ health: 200, scale: { destroy: 0.75 }, loot: [ tierLoot("tier_airdrop_uncommon", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1) ], map: { display: false }, img: { sprite: "map-crate-10.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_11: createCrate({ scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_rare", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1) ], map: { display: false }, img: { sprite: "map-crate-11.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_11h: createCrate({ collision: collider.createCircle(v2.create(0, 0), 2.25), isDecalAnchor: true, scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_rare", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1), tierLoot("tier_airdrop_xp", 2, 2) ], map: { display: false }, img: { sprite: "map-crate-11h.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_10sv: createCrate({ health: 200, scale: { destroy: 0.75 }, loot: [ tierLoot("tier_airdrop_uncommon", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1), tierLoot("tier_perks", 1, 1) ], map: { display: false }, img: { sprite: "map-crate-10.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_11sv: createCrate({ scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_rare", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1), tierLoot("tier_perks", 2, 2) ], map: { display: false }, img: { sprite: "map-crate-11.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_11de: createCrate({ scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_rare", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1), tierLoot("tier_perks", 1, 1) ], map: { display: false }, img: { sprite: "map-crate-11.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_11tr: createCrate({ scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_rare", 1, 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 2, 2), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_outfits", 1, 1), tierLoot("tier_airdrop_melee", 1, 1), tierLoot("tier_airdrop_ammo", 3, 3), tierLoot("tier_airdrop_throwables", 1, 1), tierLoot("tier_airdrop_xp", 2, 2) ], map: { display: false }, img: { sprite: "map-crate-11.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_12: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.5, 3.5)), scale: { destroy: 0.75 }, health: 500, loot: [ tierLoot("tier_airdrop_rare", 2, 2, { preloadGuns: true }), tierLoot("tier_airdrop_uncommon", 4, 6, { preloadGuns: true }), tierLoot("tier_airdrop_armor", 4, 5), tierLoot("tier_medical", 12, 15), tierLoot("tier_airdrop_scopes", 6, 8), tierLoot("tier_airdrop_outfits", 3, 4), tierLoot("tier_airdrop_melee", 5, 7), tierLoot("tier_airdrop_ammo", 10, 12), tierLoot("tier_airdrop_throwables", 6, 8), tierLoot("tier_katanas", 1, 1) ], map: { display: false }, img: { sprite: "map-crate-12.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_13: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.5, 3.5)), scale: { destroy: 0.75 }, health: 200, loot: [ tierLoot("tier_airdrop_mythic", 3, 4, { preloadGuns: true }), tierLoot("tier_airdrop_rare", 3, 4, { preloadGuns: true }), tierLoot("tier_airdrop_armor", 6, 8), tierLoot("tier_medical", 12, 15), tierLoot("tier_airdrop_scopes", 6, 8), tierLoot("tier_airdrop_faction_outfits", 1, 2), tierLoot("tier_airdrop_faction_melee", 3, 4), tierLoot("tier_airdrop_ammo", 10, 12), tierLoot("tier_airdrop_throwables", 6, 8), tierLoot("tier_katanas", 1, 1), autoLoot("strobe", 1), autoLoot("strobe", 1), autoLoot("strobe", 1) ], map: { display: false }, img: { sprite: "map-crate-13.img", residue: "map-crate-res-03.img" }, sound: { explode: "crate_break_01" } }), crate_14: createCrate({ explodeParticle: ["windowBreak", "woodPlank"], loot: [tierLoot("tier_throwables", 1, 1)], img: { sprite: "map-crate-14.img" }, sound: { explode: "window_break_02" } }), crate_14a: createCrate({ explodeParticle: ["windowBreak", "woodPlank"], loot: [tierLoot("tier_soviet", 1, 1)], img: { sprite: "map-crate-14a.img" }, sound: { explode: "window_break_02" } }), crate_15: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [tierLoot("tier_knives", 4, 4)], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-14.img" }, sound: { explode: "crate_break_01" } }), crate_16: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [tierLoot("tier_knives", 4, 4)], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-14.img" }, sound: { explode: "crate_break_01" } }), crate_18: createCrate({ health: 140, loot: [tierLoot("tier_cattle_crate", 2, 3), tierLoot("tier_soviet", 1, 2)], map: { display: true, color: 12867840, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-18.img" }, sound: { explode: "crate_break_01" } }), crate_19: createCrate({ health: 140, loot: [tierLoot("tier_guns", 1, 3), tierLoot("tier_surviv", 2, 3)], map: { display: true, color: 4500224, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-19.img" }, sound: { explode: "crate_break_01" } }), crate_20: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.7, 1.7)), health: 75, hitParticle: "greenChip", explodeParticle: "greenPlank", loot: [tierLoot("tier_armor", 1, 1), tierLoot("tier_world", 1, 1)], map: { display: true, color: 3884335, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-20.img" }, sound: { explode: "crate_break_01" } }), crate_21: createCrate({ health: 140, loot: [ tierLoot("tier_guns", 1, 2), tierLoot("tier_snipers", 1, 1), tierLoot("tier_cloud_02", 1, 1), tierLoot("tier_perks", 1, 1) ], map: { display: true, color: 18799, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-21.img" }, sound: { explode: "crate_break_01" } }), crate_21b: createCrate({ health: 140, loot: [ tierLoot("tier_guns", 1, 2), tierLoot("tier_snipers", 1, 1), tierLoot("tier_cloud_02", 1, 1), tierLoot("tier_perks", 1, 1) ], map: { display: false, color: 18799, scale: 0.875 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-21.img" }, sound: { explode: "crate_break_01" } }), crate_22: createCrate({ health: 140, loot: [ tierLoot("tier_guns", 3, 3), tierLoot("tier_armor", 2, 2), tierLoot("tier_packs", 1, 1) ], map: { display: true, color: 32511 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-22.img" }, sound: { explode: "crate_break_01" } }), crate_22d: createCrate({ health: 140, loot: [ autoLoot("an94", 1, 1), autoLoot("helmet03_lt_aged", 1, 1), autoLoot("outfitBlueLeaderAged", 1, 1), autoLoot("kukri_trad", 1, 1) ], map: { display: true, color: 32511 }, terrain: { grass: true, beach: false }, img: { sprite: "map-crate-22.img" }, sound: { explode: "crate_break_01" } }), airdrop_crate_01: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_10", explodeParticle: "airdropCrate02" }), airdrop_crate_02: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_11", explodeParticle: "airdropCrate02" }), airdrop_crate_03: createAirdrop({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 4)), button: { useImg: "map-airdrop-04.img", useParticle: "airdropCrate03", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-03.img", residue: "none" }, destroyType: "crate_12", explodeParticle: "airdropCrate04" }), airdrop_crate_04: createAirdrop({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 4)), button: { useImg: "map-airdrop-04.img", useParticle: "airdropCrate03", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-03.img", residue: "none" }, destroyType: "crate_13", explodeParticle: "airdropCrate04" }), airdrop_crate_01sv: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_10sv", explodeParticle: "airdropCrate02" }), airdrop_crate_02sv: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_11sv", explodeParticle: "airdropCrate02" }), airdrop_crate_02de: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_11de", explodeParticle: "airdropCrate02" }), airdrop_crate_02h: createAirdrop({ collision: collider.createCircle(v2.create(0, 0), 2.5), button: { useImg: "map-airdrop-02h.img", useParticle: "airdropCrate01h", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01h.img", residue: "none" }, destroyType: "cache_pumpkin_airdrop_02", explodeParticle: "airdropCrate02h" }), airdrop_crate_02tr: createAirdrop({ button: { useImg: "map-airdrop-02.img", useParticle: "airdropCrate01", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01.img", residue: "none" }, destroyType: "crate_11tr", explodeParticle: "airdropCrate02" }), airdrop_crate_01x: createAirdrop({ button: { useImg: "map-crate-13x.img", useParticle: "airdropCrate01x", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-01x.img", residue: "none" }, destroyType: "crate_10", explodeParticle: "airdropCrate02x" }), airdrop_crate_02x: createAirdrop({ button: { useImg: "map-crate-13x.img", useParticle: "airdropCrate01x", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-airdrop-02x.img", residue: "none" }, destroyType: "crate_11", explodeParticle: "airdropCrate02x" }), class_shell_01: createAirdrop({ collision: collider.createCircle(v2.create(0, 0), 2.25), button: { useImg: "map-class-shell-01b.img", useParticle: "classShell01a", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-class-shell-01a.img", residue: "none" }, destroyType: "class_crate_common", smartLoot: true, explodeParticle: "classShell01b" }), class_shell_02: createAirdrop({ collision: collider.createCircle(v2.create(0, 0), 2.25), button: { useImg: "map-class-shell-02b.img", useParticle: "classShell02a", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-class-shell-02a.img", residue: "none" }, destroyType: "class_crate_rare", smartLoot: true, explodeParticle: "classShell02b" }), class_shell_03: createAirdrop({ collision: collider.createCircle(v2.create(0, 0), 2.25), button: { useImg: "map-class-shell-03b.img", useParticle: "classShell03a", sound: { on: "airdrop_open_01", off: "" } }, img: { sprite: "map-class-shell-03a.img", residue: "none", zIdx: 20 }, destroyType: "class_crate_mythic", explodeParticle: "classShell03b" }), class_crate_common_scout: createClassCrate({ loot: [ tierLoot("tier_guns_common_scout", 1, 1), autoLoot("crowbar_scout", 1), autoLoot("helmet01", 1), autoLoot("backpack01", 1), autoLoot("soda", 1), autoLoot("soda", 1), autoLoot("soda", 1) ], img: { sprite: "map-class-crate-scout.img" } }), class_crate_common_sniper: createClassCrate({ loot: [ tierLoot("tier_guns_common_sniper", 1, 1), autoLoot("kukri_sniper", 1), autoLoot("helmet01", 1), autoLoot("backpack01", 1), autoLoot("4xscope", 1) ], img: { sprite: "map-class-crate-sniper.img" } }), class_crate_common_healer: createClassCrate({ loot: [ tierLoot("tier_guns_common_healer", 1, 1), autoLoot("bonesaw_healer", 1), autoLoot("helmet01", 1), autoLoot("backpack01", 1), autoLoot("healthkit", 1), autoLoot("painkiller", 1), autoLoot("smoke", 3) ], img: { sprite: "map-class-crate-healer.img" } }), class_crate_common_demo: createClassCrate({ loot: [ tierLoot("tier_guns_common_demo", 1, 1), autoLoot("katana_demo", 1), autoLoot("helmet01", 1), autoLoot("backpack02", 1), autoLoot("mirv", 1), autoLoot("mirv", 1), autoLoot("mirv", 1), autoLoot("mirv", 1), autoLoot("mirv", 1), autoLoot("mirv", 1) ], img: { sprite: "map-class-crate-demo.img" } }), class_crate_common_assault: createClassCrate({ loot: [ tierLoot("tier_guns_common_assault", 2, 2), autoLoot("spade_assault", 1), autoLoot("helmet01", 1), autoLoot("backpack01", 1) ], img: { sprite: "map-class-crate-assault.img" } }), class_crate_common_tank: createClassCrate({ loot: [ tierLoot("tier_guns_common_tank", 1, 1), autoLoot("warhammer_tank", 1), autoLoot("helmet02", 1), autoLoot("chest02", 1), autoLoot("backpack01", 1) ], img: { sprite: "map-class-crate-tank.img" } }), class_crate_rare_scout: createClassCrate({ loot: [ tierLoot("tier_guns_rare_scout", 1, 1), autoLoot("crowbar_scout", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-scout.img" } }), class_crate_rare_sniper: createClassCrate({ loot: [ tierLoot("tier_guns_rare_sniper", 1, 1), autoLoot("kukri_sniper", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-sniper.img" } }), class_crate_rare_healer: createClassCrate({ loot: [ tierLoot("tier_guns_rare_healer", 1, 1), autoLoot("bonesaw_healer", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-healer.img" } }), class_crate_rare_demo: createClassCrate({ loot: [ tierLoot("tier_guns_rare_demo", 1, 1), autoLoot("katana_demo", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-demo.img" } }), class_crate_rare_assault: createClassCrate({ loot: [ tierLoot("tier_guns_rare_assault", 2, 2), autoLoot("spade_assault", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-assault.img" } }), class_crate_rare_tank: createClassCrate({ loot: [ tierLoot("tier_guns_rare_tank", 1, 1), autoLoot("warhammer_tank", 1), tierLoot("tier_airdrop_armor", 1, 1), tierLoot("tier_medical", 1, 1), tierLoot("tier_airdrop_scopes", 1, 1), tierLoot("tier_airdrop_ammo", 2, 2), tierLoot("tier_airdrop_throwables", 1, 1) ], img: { sprite: "map-class-crate-tank.img" } }), class_crate_mythic: createClassCrate({ loot: [tierLoot("tier_class_crate_mythic", 1, 1)], img: { sprite: "map-class-crate-03.img" } }), mil_crate_01: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [tierLoot("tier_knives", 1, 1)], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-mil-01.img" }, sound: { explode: "crate_break_01" } }), mil_crate_02: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [ autoLoot("ot38", 1), autoLoot("ot38", 1), autoLoot("ot38", 1), autoLoot("ot38", 1) ], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-mil-02.img" }, sound: { explode: "crate_break_01" } }), mil_crate_03: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [autoLoot("ots38_dual", 1)], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-mil-03.img" }, sound: { explode: "crate_break_01" } }), mil_crate_04: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [tierLoot("tier_guns", 1, 1), tierLoot("tier_throwables", 2, 3)], map: { display: false }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-mil-04.img" }, sound: { explode: "crate_break_01" } }), mil_crate_05: createCrate({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.7, 1.25)), health: 100, loot: [tierLoot("tier_guns", 1, 2), tierLoot("tier_snipers", 1, 2)], map: { display: true, color: 3622438 }, terrain: { grass: true, beach: true }, img: { sprite: "map-crate-mil-05.img" }, sound: { explode: "crate_break_01" } }), bottle_01: createBottle({ collision: collider.createCircle(v2.create(0, 0), 0.5), health: 12, hitParticle: "bottleBrownChip", explodeParticle: "bottleBrownBreak", img: { sprite: "map-bottle-01.img", residue: "none" }, loot: [], sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }), bottle_02: createBottle({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.5, 0.5)), health: 20, hitParticle: "bottleBlueChip", explodeParticle: "bottleBlueBreak", img: { sprite: "map-bottle-02.img", residue: "none" }, loot: [], sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }), bottle_02r: createBottle2({ img: { tint: 13172736 } }), bottle_02o: createBottle2({ collidable: false, img: { tint: 16734720 } }), bottle_02y: createBottle2({ collidable: false, img: { tint: 16776960 } }), bottle_02g: createBottle2({ collidable: false, img: { tint: 32768 } }), bottle_02b: createBottle2({ img: { tint: 27903 } }), bottle_02i: createBottle2({ collidable: false, img: { tint: 4915330 } }), bottle_02v: createBottle2({ img: { tint: 15631086 } }), bottle_04: createBottle({ collision: collider.createCircle(v2.create(0, 0), 0.5), health: 20, hitParticle: "bottleWhiteChip", explodeParticle: "bottleWhiteBreak", img: { sprite: "map-bottle-04.img", residue: "none" }, loot: [], sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }), bottle_05: createBottle({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.5, 0.5)), health: 20, hitParticle: "bottleWhiteChip", explodeParticle: "bottleWhiteBreak", img: { sprite: "map-bottle-05.img", residue: "none" }, loot: [], sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }), candle_01: { type: "obstacle", map: { display: false, color: 16777215, scale: 1 }, scale: { createMin: 1, createMax: 1, destroy: 0.5 }, collision: collider.createCircle(v2.create(0, 0), 0.5), height: 0.5, collidable: false, destructible: false, health: 150, hitParticle: "goldChip", explodeParticle: "barrelBreak", reflectBullets: false, loot: [], img: { sprite: "map-candle-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "none", punch: "none", explode: "none", enter: "none" } }, deposit_box_01: createDepositBox({ img: { sprite: "map-deposit-box-01.img" }, loot: [tierLoot("tier_world", 1, 1)] }), deposit_box_02: createDepositBox({ explodeParticle: "depositBoxGoldBreak", img: { sprite: "map-deposit-box-02.img" }, loot: [tierLoot("tier_soviet", 1, 2), tierLoot("tier_guns", 1, 1)] }), drawers_01: createDrawer({ img: { sprite: "map-drawers-01.img" }, loot: [tierLoot("tier_container", 1, 1)] }), drawers_02: createDrawer({ img: { sprite: "map-drawers-02.img" }, loot: [tierLoot("tier_soviet", 2, 3)] }), fire_ext_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0.35, 0), 1), height: 0.5, collidable: true, destructible: true, createSmoke: true, health: 75, hitParticle: "redChip", explodeParticle: "redBreak", reflectBullets: true, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-fire-ext-01.img", residue: "map-fire-ext-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "barrel_bullet", punch: "barrel_bullet", explode: "explosion_smoke_01", enter: "none" } }, grill_01: createOven({ collision: collider.createCircle(v2.create(0, 0), 1.55), img: { sprite: "map-grill-01.img" } }), gun_mount_01: createGunMount({ loot: [autoLoot("m870", 1)], img: { sprite: "map-gun-mount-01.img" } }), gun_mount_02: createGunMount({ loot: [autoLoot("mp220", 1)], img: { sprite: "map-gun-mount-02.img" } }), gun_mount_03: createGunMount({ loot: [autoLoot("qbb97", 1)], img: { sprite: "map-gun-mount-03.img" } }), gun_mount_04: createGunMount({ loot: [autoLoot("woodaxe_bloody", 1)], img: { sprite: "map-gun-mount-04.img" } }), gun_mount_05: createGunMount({ loot: [autoLoot("m1100", 1)], img: { sprite: "map-gun-mount-05.img" } }), locker_01: createLocker({ img: { sprite: "map-locker-01.img" }, loot: [tierLoot("tier_world", 1, 1)] }), locker_02: createLocker({ img: { sprite: "map-locker-02.img" }, loot: [tierLoot("tier_police", 1, 1)] }), locker_03: createLocker({ img: { sprite: "map-locker-03.img" }, loot: [autoLoot("ak47", 1, 1), autoLoot("backpack02", 1, 1)] }), oven_01: createOven({}), piano_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.75, 1)), height: 0.5, collidable: true, destructible: false, health: 75, hitParticle: "woodChip", explodeParticle: ["woodPlank", "book"], reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-piano-01.img", residue: "map-drawers-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "piano_hit", punch: "piano_hit", explode: "drawers_break_01", enter: "none" } }, planter_01: createPlanter({}), planter_02: createPlanter({ img: { sprite: "map-planter-02.img" } }), planter_03: createPlanter({ img: { sprite: "map-planter-03.img" } }), planter_04: createPlanter({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), img: { sprite: "map-planter-04.img" }, destructible: false, button: { interactionRad: 0.1, interactionText: "game-use", useOnce: true, useType: "", useDelay: 0.25, useDir: v2.create(1, 0), useImg: "map-planter-05.img", sound: { on: "watering_01", off: "watering_01" } } }), planter_06: createPlanter({ img: { sprite: "map-planter-06.img", residue: "map-planter-res-02.img" } }), planter_07: createPlanter({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), img: { sprite: "map-planter-07.img", residue: "map-planter-res-03.img" }, destructible: true }), pot_01: createBottle({}), pot_02: createBottle({ img: { sprite: "map-pot-02.img" }, loot: [autoLoot("spas12", 1)] }), pot_03: createBottle({ img: { sprite: "map-pot-03.img" } }), pot_03b: createBottle({ img: { sprite: "map-pot-03.img" }, loot: [autoLoot("outfitWoodsCloak", 1), autoLoot("backpack03", 1)] }), pot_03c: createBottle({ img: { sprite: "map-pot-03.img" }, loot: [tierLoot("tier_pavilion", 1, 1)] }), pot_04: createBottle({ img: { sprite: "map-pot-04.img" } }), pot_05: createBottle({ img: { sprite: "map-pot-05.img" }, loot: [autoLoot("scout_elite", 1), tierLoot("tier_islander_outfit", 1, 1)] }), potato_01: createPotato({}), potato_02: createPotato({ img: { sprite: "map-potato-02.img" } }), potato_03: createPotato({ img: { sprite: "map-potato-03.img" } }), power_box_01: createControlPanel({}), pumpkin_01: createPumpkin({ loot: [tierLoot("tier_outfits", 1, 1), tierLoot("tier_pumpkin_candy", 1, 1)] }), pumpkin_02: createPumpkin({ health: 140, img: { sprite: "map-pumpkin-02.img" }, loot: [ tierLoot("tier_guns", 1, 2), tierLoot("tier_pumpkin_candy", 1, 2), tierLoot("tier_outfits", 1, 1) ] }), pumpkin_03: createPumpkin({ collision: collider.createCircle(v2.create(0, 0), 1.25), map: { display: false }, img: { sprite: "map-pumpkin-03.img", residue: "map-pumpkin-res-03.img" }, loot: [tierLoot("tier_pumpkin_perks", 1, 1), tierLoot("tier_fruit_xp", 1, 1)] }), squash_01: createPumpkin({ collision: collider.createCircle(v2.create(0, 0), 1.25), map: { display: false }, img: { sprite: "map-squash-01.img", residue: "map-squash-res-01.img" }, hitParticle: "squashChip", explodeParticle: "squashBreak", loot: [autoLoot("turkey_shoot", 1, 1), tierLoot("tier_fruit_xp", 1, 1)] }), refrigerator_01: createRefrigerator({}), refrigerator_01b: createRefrigerator({ scale: { createMin: 1, createMax: 1, destroy: 1 }, health: 250 }), recorder_01: createRecorder({ button: { sound: { on: "log_01" } } }), recorder_02: createRecorder({ button: { sound: { on: "log_02" } } }), recorder_03: createRecorder({ button: { sound: { on: "log_03" } } }), recorder_04: createRecorder({ button: { sound: { on: "log_04" } } }), recorder_05: createRecorder({ button: { sound: { on: "log_05" } } }), recorder_06: createRecorder({ button: { sound: { on: "log_06" } } }), recorder_07: createRecorder({ button: { sound: { on: "footstep_07" } } }), recorder_08: createRecorder({ button: { sound: { on: "footstep_08" } } }), recorder_09: createRecorder({ button: { sound: { on: "footstep_09" } } }), recorder_10: createRecorder({ button: { sound: { on: "cell_control_03" } } }), recorder_11: createRecorder({ button: { sound: { on: "log_11" }, useImg: "map-recorder-04.img" }, img: { sprite: "map-recorder-03.img" }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 1.25)) }), recorder_12: createRecorder({ button: { sound: { on: "log_12" }, useImg: "map-recorder-04.img" }, img: { sprite: "map-recorder-03.img" }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 1.25)) }), recorder_13: createRecorder({ button: { sound: { on: "log_13" }, useImg: "map-recorder-04.img" }, img: { sprite: "map-recorder-03.img" }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 1.25)) }), recorder_14: createRecorder({ button: { sound: { on: "log_14" }, useImg: "map-recorder-04.img" }, img: { sprite: "map-recorder-03.img" }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 1.25)) }), screen_01: { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.85 }, collision: collider.createAabbExtents(v2.create(0, 0.05), v2.create(4, 0.2)), height: 0.5, collidable: true, destructible: true, health: 25, hitParticle: "clothHit", explodeParticle: "barrelBreak", reflectBullets: false, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-screen-01.img", residue: "map-screen-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "cloth_bullet", punch: "cloth_punch", explode: "screen_break_01", enter: "none" } }, sandbags_01: createSandBags({}), sandbags_02: createSandBags({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.1, 1.4)), img: { sprite: "map-sandbags-02.img" } }), silo_01: createSilo({}), silo_01po: createSilo({ scale: { createMin: 1, createMax: 1, destroy: 0.9 }, destructible: true, health: 2500, loot: [autoLoot("potato_smg", 1, 1)], img: { residue: "map-smoke-res.img", tint: 16749645 } }), stairs_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2)), height: 0.5, collidable: false, destructible: true, health: 100, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-stairs-broken-01.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "crate_break_01", enter: "none" } }, stand_01: { type: "obstacle", obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents(v2.create(0, 0.15), v2.create(1.25, 1.25)), height: 0.5, collidable: true, destructible: true, health: 75, hitParticle: "woodChip", explodeParticle: "woodPlank", reflectBullets: false, loot: [tierLoot("tier_world", 1, 1)], map: { display: false, color: 6697728, scale: 0.875 }, terrain: { grass: false, beach: true }, img: { sprite: "map-stand-01.img", residue: "map-drawers-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "drawers_break_01", enter: "none" } }, stone_01: createStone({}), stone_01b: createStone({ img: { residue: "map-stone-res-01b.img" } }), stone_01cb: createStone({ map: { display: true, color: 10265256, scale: 1 }, img: { sprite: "map-stone-01cb.img", residue: "map-stone-res-01cb.img" } }), stone_01f: createStone({ map: { display: true, color: 8224125, scale: 1 } }), stone_01sv: createStone({ scale: { createMin: 1.2, createMax: 1.5, destroy: 0.5 } }), stone_01x: createStone({ map: { display: true, color: 6052956, scale: 1 }, img: { sprite: "map-stone-01x.img", residue: "map-stone-res-01x.img" } }), stone_02: createStone({ img: { tint: 15066597 }, loot: [tierLoot("tier_surviv", 2, 3), autoLoot("ak47", 1)] }), stone_02sv: createStone({ img: { tint: 15066597 }, loot: [ tierLoot("tier_surviv", 2, 3), autoLoot("m39", 1), tierLoot("tier_perks", 1, 1) ] }), stone_03: createRiverStone({}), stone_03b: createRiverStone({ img: { sprite: "map-stone-03b.img", residue: "map-stone-res-01.img" } }), stone_03cb: createRiverStone({ img: { sprite: "map-stone-03cb.img", residue: "map-stone-res-02cb.img" } }), stone_03f: createRiverStone({ img: { sprite: "map-stone-03f.img", residue: "map-stone-res-02f.img" } }), stone_03x: createRiverStone({ img: { sprite: "map-stone-03x.img", residue: "map-stone-res-02x.img" } }), stone_04: createStone({ stonePlated: true, scale: { createMin: 0.8, createMax: 0.8, destroy: 0.75 }, hitParticle: "rockEyeChip", explodeParticle: "rockEyeBreak", loot: [tierLoot("tier_eye_block", 1, 1)], terrain: { grass: true, beach: true, riverShore: true }, map: { display: true, color: 1512466, scale: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.8, 1.8)), img: { sprite: "map-stone-04.img", residue: "map-stone-res-04.img" } }), stone_05: createStone({ stonePlated: true, hitParticle: "rockEyeChip", explodeParticle: "rockEyeBreak", loot: [tierLoot("tier_eye_stone", 1, 1)], terrain: { grass: true, beach: true, riverShore: true }, map: { display: true, color: 1512466, scale: 1 }, collision: collider.createCircle(v2.create(0, 0), 1.7), img: { sprite: "map-stone-05.img", residue: "map-stone-res-01b.img" } }), stone_06: createStone({ stonePlated: true, scale: { createMin: 1, createMax: 1, destroy: 0.8 }, height: 10, terrain: { grass: true, beach: true, riverShore: true }, map: { display: true, color: 3618615, scale: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.5, 2)), img: { sprite: "map-stone-06.img", scale: 0.5, residue: "map-stone-res-06.img" } }), stone_07: createStone({ scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 7.75), health: 500, map: { display: true, color: 9931908, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-stone-07.img", residue: "map-stone-res-07.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 } }), stove_01: createControlPanel({ obstacleType: "furniture", scale: { createMin: 1, createMax: 1, destroy: 0.85 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3, 2.25)), disableBuildingOccupied: true, damageCeiling: true, explosion: "explosion_stove", height: 10, health: 500, img: { sprite: "map-stove-01.img" }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "oven_break_01", enter: "none" } }), stove_02: createControlPanel({ obstacleType: "furniture", collision: collider.createCircle(v2.create(0, 0), 1.5), disableBuildingOccupied: true, damageCeiling: true, explosion: "explosion_stove", height: 10, health: 400, img: { sprite: "map-stove-02.img" }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "oven_break_01", enter: "none" } }), table_01: createTable({}), table_01x: createTable({ img: { sprite: "map-table-01x.img" } }), table_02: createTable({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.5, 2.5)), health: 125, img: { sprite: "map-table-02.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 } }), table_02x: createTable({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.5, 2.5)), health: 125, img: { sprite: "map-table-02x.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 } }), table_03: createTable({ collision: collider.createCircle(v2.create(0, 0), 2.5), health: 125, img: { sprite: "map-table-03.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 } }), table_03x: createTable({ collision: collider.createCircle(v2.create(0, 0), 2.5), health: 125, img: { sprite: "map-table-03x.img", residue: "map-table-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 60 } }), tire_01: function(e) { const t = { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.8 }, collision: collider.createCircle(v2.create(0, 0), 1.75), height: 0.5, collidable: true, destructible: true, health: 1500, hitParticle: "blackChip", explodeParticle: "barrelBreak", reflectBullets: false, loot: [], map: { display: true, color: 6708838, scale: 1 }, terrain: { grass: true, beach: true }, img: { sprite: "map-tire-01.img", scale: 0.4, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "cloth_bullet", punch: "cloth_punch", explode: "cloth_break_01", enter: "none" } }; return util.mergeDeep(t, e || {}); }({}), toilet_01: createToilet({ img: { sprite: "map-toilet-01.img" }, loot: [tierLoot("tier_toilet", 2, 3)] }), toilet_02: createToilet({ img: { sprite: "map-toilet-02.img" }, loot: [tierLoot("tier_soviet", 3, 4)] }), toilet_02b: createToilet({ img: { sprite: "map-toilet-02.img", tint: 11842740 }, loot: [autoLoot("fireaxe", 1, 1)] }), toilet_03: createToilet({ reflectBullets: true, hitParticle: "barrelChip", explodeParticle: "toiletMetalBreak", img: { sprite: "map-toilet-03.img", residue: "map-toilet-res-02.img" }, loot: [tierLoot("tier_world", 1, 2)], sound: { bullet: "toilet_metal_bullet", punch: "toilet_metal_bullet", explode: "toilet_break_02" } }), toilet_04: createToilet({ reflectBullets: true, hitParticle: "barrelChip", explodeParticle: "toiletMetalBreak", img: { sprite: "map-toilet-04.img", residue: "map-toilet-res-02.img" }, loot: [tierLoot("tier_soviet", 2, 3)], sound: { bullet: "toilet_metal_bullet", punch: "toilet_metal_bullet", explode: "toilet_break_02" } }), towelrack_01: createBookShelf({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3, 1)), img: { sprite: "map-towelrack-01.img" }, explodeParticle: ["woodPlank", "clothBreak"] }), tree_01: createTree({}), tree_01cb: createTree({ scale: { createMin: 1.1, createMax: 1.3, destroy: 0.5 }, collision: collider.createCircle(v2.create(0, 0), 1.2), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(7.75, 7.75)), map: { color: 2900834 }, img: { sprite: "map-tree-03cb.img" } }), tree_01sv: createTree({ map: { color: 4411673 }, img: { sprite: "map-tree-03sv.img" } }), tree_interior_01: createTree({ img: { zIdx: 200 } }), tree_01x: createTree({ img: { sprite: "map-tree-01x.img" } }), tree_02: createTree({ health: 120, collision: collider.createCircle(v2.create(0, 0), 1.6), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(1.6, 1.6)), height: 0.5, loot: [autoLoot("woodaxe", 1)], map: { display: false }, scale: { createMin: 1, createMax: 1, destroy: 0.9 }, terrain: { grass: true, beach: false }, img: { sprite: "map-tree-04.img", scale: 0.5, zIdx: 10 } }), tree_02h: createTree({ health: 120, collision: collider.createCircle(v2.create(0, 0), 1.6), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(1.6, 1.6)), height: 0.5, loot: [autoLoot("woodaxe_bloody", 1)], map: { display: false }, scale: { createMin: 1, createMax: 1, destroy: 0.9 }, terrain: { grass: true, beach: false }, img: { sprite: "map-tree-04h.img", scale: 0.5, zIdx: 10 } }), tree_03: createTree({ img: { tint: 11645361 }, loot: [tierLoot("tier_surviv", 2, 3), autoLoot("mosin", 1)] }), tree_03sv: createTree({ map: { color: 4411673 }, img: { sprite: "map-tree-03sv.img", tint: 11645361 }, loot: [tierLoot("tier_surviv", 2, 3), autoLoot("mosin", 1)] }), tree_05: createTree({ collision: collider.createCircle(v2.create(0, 0), 2.3), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(12, 12)), scale: { createMin: 1.2, createMax: 1.3 }, health: 400, map: { color: 5911831, scale: 3 }, img: { sprite: "map-tree-05.img", residue: "map-tree-res-02.img", tint: 16777215, scale: 0.7, zIdx: 801 } }), tree_05b: createTree({ collision: collider.createCircle(v2.create(0, 0), 2.3), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(12, 12)), scale: { createMin: 1, createMax: 1 }, health: 500, loot: [ tierLoot("tier_shotguns", 1, 1), tierLoot("tier_lmgs", 1, 1), autoLoot("outfitTreeSpooky", 1) ], map: { color: 5911831, scale: 3 }, img: { sprite: "map-tree-05.img", residue: "map-tree-res-02.img", tint: 16777215, scale: 0.7, zIdx: 801 } }), tree_05c: createTree({ collision: collider.createCircle(v2.create(0, 0), 1.05), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 4)), scale: { createMin: 1.6, createMax: 1.6 }, health: 200, map: { color: 9064739, scale: 3 }, img: { sprite: "map-tree-05c.img", residue: "map-tree-res-02.img", tint: 16777215, scale: 0.35, zIdx: 801 } }), tree_06: createTree({ img: { sprite: "map-tree-06.img" }, map: { color: 7700520 } }), tree_07: createTree({ scale: { createMin: 1, createMax: 1.2 }, map: { color: 5199637, scale: 2.5 }, img: { sprite: "map-tree-07.img" } }), tree_07sp: createTree({ scale: { createMin: 1, createMax: 1.2 }, map: { color: 16697057, scale: 2.5 }, img: { sprite: "map-tree-07sp.img" }, terrain: { grass: true, beach: false, riverShore: true } }), tree_07spr: createTree({ scale: { createMin: 1, createMax: 1.2 }, map: { color: 16697057, scale: 2.5 }, img: { sprite: "map-tree-07sp.img" }, terrain: { grass: false, beach: false, riverShore: true } }), tree_07su: createTree({ scale: { createMin: 1, createMax: 1.2 }, map: { color: 2185478, scale: 2.5 }, img: { sprite: "map-tree-07su.img" } }), tree_08: createTree({ scale: { createMin: 1.2, createMax: 1.4 }, health: 225, map: { color: 11033868, scale: 2.5 }, img: { sprite: "map-tree-08.img", residue: "map-tree-res-02.img", scale: 0.35 } }), tree_08b: createTree({ scale: { createMin: 1.75, createMax: 2 }, health: 300, map: { color: 9647632, scale: 3 }, img: { sprite: "map-tree-08.img", residue: "map-tree-res-02.img", tint: 14383224, scale: 0.35, zIdx: 801 } }), tree_08c: createTree({ scale: { createMin: 1.75, createMax: 2 }, health: 500, loot: [ tierLoot("tier_shotguns", 2, 3), tierLoot("tier_lmgs", 2, 3), autoLoot("outfitWoodland", 1) ], map: { color: 7817749, scale: 3 }, img: { sprite: "map-tree-08.img", residue: "map-tree-res-02.img", tint: 11645361, scale: 0.35, zIdx: 801 } }), tree_08f: createTree({ scale: { createMin: 1.2, createMax: 1.6 }, health: 200, map: { color: 995844, scale: 3 }, img: { sprite: "map-tree-08f.img", residue: "map-tree-res-01.img", scale: 0.35, zIdx: 801 } }), tree_08sp: createTree({ scale: { createMin: 1.2, createMax: 1.4 }, health: 225, map: { color: 16746936, scale: 2.5 }, img: { sprite: "map-tree-08sp.img", residue: "map-tree-res-02.img", scale: 0.35 }, terrain: { grass: true, beach: false, riverShore: true } }), tree_08spb: createTree({ scale: { createMin: 1.75, createMax: 2 }, health: 300, map: { color: 16734619, scale: 3 }, img: { sprite: "map-tree-08sp.img", residue: "map-tree-res-02.img", tint: 14383224, scale: 0.35, zIdx: 801 }, terrain: { grass: true, beach: false, riverShore: true } }), tree_08spc: createTree({ scale: { createMin: 1.75, createMax: 2 }, health: 500, loot: [ tierLoot("tier_shotguns", 2, 3), tierLoot("tier_lmgs", 2, 3), autoLoot("outfitWoodland", 1) ], map: { color: 8268107, scale: 3 }, img: { sprite: "map-tree-08sp.img", residue: "map-tree-res-02.img", tint: 11645361, scale: 0.35, zIdx: 801 } }), tree_08spr: createTree({ scale: { createMin: 1.2, createMax: 1.4 }, health: 225, map: { color: 16746936, scale: 2.5 }, img: { sprite: "map-tree-08sp.img", residue: "map-tree-res-02.img", scale: 0.35 }, terrain: { grass: false, beach: false, riverShore: true } }), tree_08su: createTree({ scale: { createMin: 1.2, createMax: 1.4 }, health: 225, map: { color: 2183181, scale: 2.5 }, img: { sprite: "map-tree-08su.img", residue: "map-tree-res-01.img", scale: 0.35, zIdx: 801 } }), tree_08sub: createTree({ scale: { createMin: 1.75, createMax: 2 }, health: 300, map: { color: 1785864, scale: 3 }, img: { sprite: "map-tree-08su.img", residue: "map-tree-res-02.img", tint: 9211210, scale: 0.35, zIdx: 801 }, terrain: { grass: true, beach: false, riverShore: true } }), tree_09: createTree({ health: 120, collision: collider.createCircle(v2.create(0, 0), 1.6), aabb: collider.createAabbExtents(v2.create(0, 0), v2.create(5.75, 5.75)), height: 0.5, map: { display: true, color: 8602624, scale: 1 }, scale: { createMin: 1, createMax: 1, destroy: 0.75 }, terrain: { grass: true, beach: false }, img: { sprite: "map-tree-09.img", scale: 0.5, zIdx: 10 } }), tree_10: createTree({ collision: collider.createCircle(v2.create(0, 0), 1.25), scale: { createMin: 0.9, createMax: 1.1 }, map: { color: 7571807, scale: 2.5 }, img: { sprite: "map-tree-10.img" } }), tree_11: createTree({ collision: collider.createCircle(v2.create(0, 0), 1.25), scale: { createMin: 1, createMax: 1 }, img: { sprite: "map-tree-11.img", scale: 0.5, alpha: 0.92, zIdx: 201 } }), tree_12: createTree({ map: { color: 8032292, scale: 7 }, img: { sprite: "map-tree-12.img", residue: "map-tree-res-12.img", tint: 16777215, zIdx: 801 } }), tree_13: createTree({ img: { sprite: "map-tree-13.img", tint: 16777215, zIdx: 801 } }), tree_switch_01: createTreeSwitch({ img: { sprite: "map-tree-switch-01.img" } }), tree_switch_02: createTreeSwitch({ img: { sprite: "map-tree-switch-02.img" } }), tree_switch_03: createTreeSwitch({ img: { sprite: "map-tree-switch-03.img" } }), vat_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.9 }, collision: collider.createCircle(v2.create(0, 0), 2), height: 0.5, collidable: true, destructible: true, health: 250, reflectBullets: false, hitParticle: "glassChip", explodeParticle: "windowBreak", loot: [], map: { display: true, color: 11776947, scale: 1 }, terrain: { grass: false, beach: false }, img: { sprite: "map-vat-01.img", residue: "map-vat-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }, vat_02: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 0.95 }, collision: collider.createCircle(v2.create(0, 0), 3.1), height: 0.5, collidable: true, destructible: false, health: 1e3, reflectBullets: false, hitParticle: "glassChip", explodeParticle: "windowBreak", loot: [], map: { display: true, color: 11776947, scale: 1 }, terrain: { grass: true, beach: false }, img: { sprite: "map-vat-02.img", residue: "map-vat-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_01", enter: "none" } }, vending_01: function() { const t = { type: "obstacle", obstacleType: "vending", scale: { createMin: 1, createMax: 1, destroy: 0.75 }, collision: collider.createAabbExtents( v2.create(0, 0.15), v2.create(1.7, 1.25) ), height: 0.5, collidable: true, destructible: true, health: 150, hitParticle: "blueChip", explodeParticle: ["windowBreak", "lockerBreak"], reflectBullets: true, loot: [tierLoot("tier_vending_soda", 1, 3), autoLoot("soda", 1)], map: { display: false, color: 10925, scale: 0.875 }, terrain: { grass: true, beach: true }, img: { sprite: "map-vending-soda-01.img", residue: "map-vending-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "wall_bullet", punch: "metal_punch", explode: "vending_break_01", enter: "none" } }; return util.mergeDeep(t, {}); }(), wheel_01: createWheel({ button: { interactionRad: 1, interactionText: "game-use", useOnce: true, useType: "", useDelay: 2.5, useDir: v2.create(-1, 0), useImg: "map-wheel-02.img", sound: { on: "wheel_control_01", off: "" } } }), wheel_02: createWheel({ img: { sprite: "map-wheel-02.img" } }), wheel_03: createWheel({ img: { sprite: "map-wheel-03.img" } }), woodpile_01: createWoodPile({}), woodpile_02: createWoodPile({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(6, 3)), health: 400, destructible: true, img: { sprite: "map-woodpile-02.img", residue: "map-woodpile-res-02.img" } }), bank_window_01: { type: "obstacle", scale: { createMin: 1, createMax: 1, destroy: 1 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 2)), height: 10, collidable: true, destructible: true, isWindow: true, health: 75, hitParticle: "glassChip", explodeParticle: ["windowBreak", "redPlank"], reflectBullets: false, loot: [], img: { sprite: "map-building-bank-window-01.img", residue: "map-building-bank-window-res-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, sound: { bullet: "glass_bullet", punch: "glass_bullet", explode: "window_break_02", enter: "none" } }, house_door_01: createDoor({ material: "wood", hinge: v2.create(0, 2), extents: v2.create(0.3, 2) }), house_door_02: createDoor({ material: "metal", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { sound: { open: "door_open_02", close: "door_close_02" } }, img: { tint: 4934475 } }), house_door_03: createDoor({ material: "wood", hinge: v2.create(0, 2), extents: v2.create(0.5, 1.75), img: { sprite: "map-door-03.img" } }), house_door_05: createDoor({ material: "glass", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), img: { sprite: "map-door-05.img" } }), house_door_06: createDoor({ material: "wood", hinge: v2.create(0, 1.25), extents: v2.create(0.3, 1.25), img: { sprite: "map-door-06.img" } }), crossing_door_01: createDoor({ material: "metal", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, sound: { open: "door_open_02", close: "door_close_02" } }, img: { tint: 3159362 } }), cell_door_01: createDoor({ material: "metal", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, sound: { open: "door_open_02", close: "door_close_02" } }, img: { tint: 1776411 } }), eye_door_01: createDoor({ material: "metal", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, openOneWay: -1, sound: { open: "door_open_02", close: "door_close_02" } }, img: { tint: 921102 } }), lab_door_01: createLabDoor({ img: { tint: 5373952 } }), lab_door_02: createLabDoor({ door: { openOneWay: true, slideOffset: -3.75, casingImg: { pos: v2.create(6, 0) } }, img: { tint: 5373952 } }), lab_door_03: createLabDoor({ door: { openOneWay: true }, img: { tint: 5373952 } }), lab_door_locked_01: createLabDoor({ door: { locked: true, openOnce: true, autoClose: false, sound: { error: "" } }, img: { tint: 5373952 } }), house_window_01: createWindow({}), house_window_broken_01: createLowWall({}), lab_window_01: createWindow({ destroyType: "lab_window_broken_01" }), lab_window_broken_01: createLowWall({ img: { tint: 1316379 } }), container_05_collider: createWall({ material: "metal", extents: v2.create(2.75, 6) }), container_05: { type: "building", scale: { createMin: 1, createMax: 1, destroy: 0.5 }, zIdx: 1, map: { display: true, color: 11485762, scale: 1 }, terrain: { grass: false, beach: false }, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 2.4), v2.create(2.5, 5.75) ) } ], imgs: [ { sprite: "map-building-container-ceiling-05.img", scale: 0.5, alpha: 1, tint: 11485762 } ] }, mapObjects: [ { type: "container_05_collider", pos: v2.create(0, 2.4), scale: 1, ori: 0 } ] }, greenhouse_01: createGreenhouse({}), greenhouse_02: createGreenhouse({ floor_images: [ { sprite: "map-building-greenhouse-floor-02.img", pos: v2.create(0, 10), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-building-greenhouse-floor-02.img", pos: v2.create(0, -10), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, 21), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -21), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ], ceiling_images: [ { sprite: "map-building-greenhouse-ceiling-02.img", scale: 1, alpha: 1, tint: 16777215 } ], mapObjects: [ { type: "glass_wall_10", pos: v2.create(-7, 19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(-7, -19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(-12.5, 15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, 5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, -15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(-12.5, -5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(7, 19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(7, -19.5), scale: 1, ori: 1 }, { type: "glass_wall_10", pos: v2.create(12.5, 15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, 5), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, -15), scale: 1, ori: 0 }, { type: "glass_wall_10", pos: v2.create(12.5, -5), scale: 1, ori: 0 }, { type: "house_door_05", pos: v2.create(2, 19.75), scale: 1, ori: 1 }, { type: "house_door_05", pos: v2.create(-2, -19.75), scale: 1, ori: 3 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(-4.5, 14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(-7, 2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(-7, -2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(-4.5, -14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(4.5, 14.5), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(7, 2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(7, -2.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_06: 2, "": 1 }), pos: v2.create(4.5, -14.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-15, 11), scale: 0.9, ori: 0 }, { type: "sandbags_02", pos: v2.create(-15, 7), scale: 1, ori: 0 }, { type: "sandbags_02", pos: v2.create(15.5, -7), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(19.5, -7), scale: 0.9, ori: 0 }, { type: "bunker_structure_08b", pos: v2.create(-9.5, -15.5), scale: 1, ori: 0 } ] }), bunker_chrys_01: { type: "building", map: { display: false, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 10), v2.create(3.6, 5.8) ), color: 6707790 } ] }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 3.25)) ] } ], imgs: [ { sprite: "map-bunker-generic-floor-03.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -0.25), v2.create(1.5, 3.25) ) } ], imgs: [ { sprite: "map-bunker-generic-ceiling-02.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] }, mapObjects: [ { type: "metal_wall_ext_5", pos: v2.create(0, -3), scale: 1, ori: 1 }, { type: "metal_wall_ext_7", pos: v2.create(-2, 0.1), scale: 1, ori: 0 }, { type: "metal_wall_ext_7", pos: v2.create(2, 0.1), scale: 1, ori: 0 } ] }, lab_door_chrys: createDoor({ destructible: false, material: "concrete", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, openOneWay: false, openSpeed: 7, autoOpen: false, autoClose: false, slideToOpen: true, slideOffset: 3.75, sound: { open: "door_open_03", close: "door_close_03", error: "door_error_01" }, casingImg: { sprite: "map-door-slot-01.img", pos: v2.create(-2, 0), scale: 0.5, alpha: 1, tint: 1316379 } }, img: { tint: 5373952 } }), bunker_chrys_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents( v2.create(11, -12), v2.create(14.5, 9) ) ] } ], imgs: [ { sprite: "map-bunker-chrys-chamber-floor-01a.img", pos: v2.create(0, 1.85), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-chamber-floor-01b.img", pos: v2.create(11, -10.75), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(11, -12), v2.create(14.5, 9) ) } ], imgs: [ { sprite: "map-bunker-chrys-chamber-ceiling-01.img", pos: v2.create(11.5, -11), scale: 1, alpha: 1, tint: 6182731 } ] }, puzzle: { name: "bunker_chrys_01", completeUseType: "lab_door_chrys", completeOffDelay: 1, completeUseDelay: 2, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "none" } }, mapObjects: [ { type: "concrete_wall_ext_5", pos: v2.create(0, 4), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_26", pos: v2.create(-3, -8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(3, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(14, -3), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_25", pos: v2.create(11, -20), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(25, -5.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(25, -17.5), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(4.5, -4.15), scale: 1, ori: 0 }, { type: "locker_03", pos: v2.create(8, -4.15), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(0.5, -16.5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(12, -9.5), scale: 0.8, ori: 0 }, { type: "crate_01", pos: v2.create(12, -13.5), scale: 0.8, ori: 0 }, { type: "couch_01", pos: v2.create(15.5, -11.5), scale: 1, ori: 1 }, { type: "screen_01", pos: v2.create(23, -11.5), scale: 1, ori: 1 }, { type: "switch_01", pos: v2.create(18.5, -4.25), scale: 1, ori: 0, puzzlePiece: "ichi" }, { type: "switch_01", pos: v2.create(21.5, -4.25), scale: 1, ori: 0, puzzlePiece: "shi" }, { type: "switch_01", pos: v2.create(18.5, -18.75), scale: 1, ori: 2, puzzlePiece: "ni" }, { type: "switch_01", pos: v2.create(21.5, -18.75), scale: 1, ori: 2, puzzlePiece: "san" }, { type: "lab_door_chrys", pos: v2.create(25.5, -9.5), scale: 1, ori: 2 }, { type: "bunker_chrys_compartment_01", pos: v2.create(39.5, -6), scale: 1, ori: 0 }, { type: "bunker_chrys_compartment_02", pos: v2.create(43.5, 19), scale: 1, ori: 0 }, { type: "bunker_chrys_compartment_03", pos: v2.create(43.5, 43), scale: 1, ori: 0 } ] }, bunker_chrys_sublevel_01b: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents( v2.create(11, -12), v2.create(14.5, 9) ) ] } ], imgs: [ { sprite: "map-bunker-chrys-chamber-floor-01a.img", pos: v2.create(0, 1.85), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-chamber-floor-01b.img", pos: v2.create(11, -10.75), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(11, -12), v2.create(14.5, 9) ) } ], imgs: [ { sprite: "map-bunker-chrys-chamber-ceiling-01.img", pos: v2.create(11.5, -11), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "concrete_wall_ext_5", pos: v2.create(0, 4), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_26", pos: v2.create(-3, -8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(3, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(14, -3), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_25", pos: v2.create(11, -20), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(25, -5.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(25, -17.5), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(4.5, -4.15), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(0.5, -16.5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(12, -9.5), scale: 0.8, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(12, -13.5), scale: 0.8, ori: 0, ignoreMapSpawnReplacement: true }, { type: "couch_01", pos: v2.create(15.5, -11.5), scale: 1, ori: 1 }, { type: "switch_02", pos: v2.create(18.5, -4.25), scale: 1, ori: 0 }, { type: "switch_02", pos: v2.create(21.5, -4.25), scale: 1, ori: 0 }, { type: "switch_02", pos: v2.create(18.5, -18.75), scale: 1, ori: 2 }, { type: "switch_02", pos: v2.create(21.5, -18.75), scale: 1, ori: 2 }, { type: "lab_door_01", pos: v2.create(25.5, -9.5), scale: 1, ori: 2 }, { type: "bunker_chrys_compartment_01b", pos: v2.create(39.5, -6), scale: 1, ori: 0 }, { type: "bunker_chrys_compartment_02b", pos: v2.create(43.5, 19), scale: 1, ori: 0 }, { type: "bunker_chrys_compartment_03b", pos: v2.create(43.5, 43), scale: 1, ori: 0 } ] }, vault_door_chrys_01: createDoor({ material: "metal", hinge: v2.create(1, 3.5), extents: v2.create(1, 3.5), img: { sprite: "map-door-02.img" }, door: { interactionRad: 1.5, openSpeed: 0.23, openOneWay: -1, openDelay: 4.1, openOnce: true, spriteAnchor: v2.create(0.2, 1), sound: { open: "none", close: "none", change: "vault_change_01" } } }), vault_door_chrys_02: createDoor({ material: "metal", hinge: v2.create(1, 3.5), extents: v2.create(1, 3.5), img: { sprite: "map-door-02.img" }, door: { canUse: false, spriteAnchor: v2.create(0.2, 1) } }), bunker_chrys_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 2), v2.create(14, 13)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-01a.img", pos: v2.create(-12.5, -4.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-compartment-floor-01b.img", pos: v2.create(3.5, 2), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 2), v2.create(14, 13) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-01a.img", pos: v2.create(-10.5, -2.5), scale: 1, alpha: 1, tint: 6182731 }, { sprite: "map-bunker-chrys-compartment-ceiling-01b.img", pos: v2.create(4, 3), scale: 1, alpha: 1, tint: 6182731 } ] }, puzzle: { name: "bunker_chrys_02", completeUseType: "vault_door_chrys_01", completeOffDelay: 1, completeUseDelay: 5.5, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "vault_change_03" } }, mapObjects: [ { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, -2), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, 1), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_27", pos: v2.create(0.5, -9), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_42", pos: v2.create(15.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_34", pos: v2.create(-7.5, 17), scale: 1, ori: 0 }, { type: "metal_wall_column_4x8", pos: v2.create(-3.5, 14.5), scale: 1, ori: 1 }, { type: "metal_wall_column_4x8", pos: v2.create(11.5, 14.5), scale: 1, ori: 1 }, { type: randomObstacleType({ crate_01: 2, crate_04: 1 }), pos: v2.create(1.5, 5), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 2, crate_04: 1 }), pos: v2.create(1.5, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 2, crate_04: 1 }), pos: v2.create(6.5, 5), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 2, crate_04: 1 }), pos: v2.create(6.5, 0), scale: 1, ori: 0 }, { type: "vault_door_chrys_01", pos: v2.create(0.5, 15.5), scale: 1, ori: 3 }, { type: "loot_tier_chrys_01", pos: v2.create(12, -5.5), scale: 1, ori: 0 } ] }, bunker_chrys_compartment_01b: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 2), v2.create(14, 13)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-01a.img", pos: v2.create(-12.5, -4.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-compartment-floor-01c.img", pos: v2.create(3.5, 2), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 2), v2.create(14, 13) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-01a.img", pos: v2.create(-10.5, -2.5), scale: 1, alpha: 1, tint: 6182731 }, { sprite: "map-bunker-chrys-compartment-ceiling-01b.img", pos: v2.create(4, 3), scale: 1, alpha: 1, tint: 6182731 } ] }, puzzle: { name: "bunker_chrys_02", completeUseType: "vault_door_chrys_02", completeOffDelay: 1, completeUseDelay: 5.5, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "vault_change_03" } }, mapObjects: [ { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, -2), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, 1), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_27", pos: v2.create(0.5, -9), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_42", pos: v2.create(15.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_34", pos: v2.create(-7.5, 17), scale: 1, ori: 0 }, { type: "metal_wall_column_4x8", pos: v2.create(-3.5, 14.5), scale: 1, ori: 1 }, { type: "metal_wall_column_4x8", pos: v2.create(11.5, 14.5), scale: 1, ori: 1 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(-0.5, 7), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(2.5, 7), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(5.5, 7), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(8.5, 7), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(-0.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(8.5, 4), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(-0.5, 1), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(8.5, 1), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(-0.5, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(2.5, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(5.5, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ planter_07: 2, "": 1 }), pos: v2.create(8.5, -2), scale: 1, ori: 0 }, { type: "vault_door_chrys_02", pos: v2.create(0.5, 15.5), scale: 1, ori: 0 } ] }, bunker_chrys_compartment_02: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(10, 10)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-02a.img", pos: v2.create(0, -2.75), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-compartment-floor-02b.img", pos: v2.create(0, 9.75), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(10, 11) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-02a.img", pos: v2.create(0, 8.5), scale: 1, alpha: 1, tint: 6182731 }, { sprite: "map-bunker-chrys-compartment-ceiling-02b.img", pos: v2.create(0, -2.5), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_4", pos: v2.create(-8, 6), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(8, 6), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-7.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(7.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-4, 12), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(4, 12), scale: 1, ori: 1 }, { type: "loot_tier_chrys_02", pos: v2.create(8, -6.5), scale: 1, ori: 0 }, { type: "glass_wall_12", pos: v2.create(0, 5), scale: 1, ori: 1 }, { type: "control_panel_06", pos: v2.create(-8.5, 1.5), scale: 1, ori: 1 } ] }, bunker_chrys_compartment_02b: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(10, 10)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-02a.img", pos: v2.create(0, -2.75), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-chrys-compartment-floor-02c.img", pos: v2.create(0, 9.75), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(10, 11) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-02a.img", pos: v2.create(0, 8.5), scale: 1, alpha: 1, tint: 6182731 }, { sprite: "map-bunker-chrys-compartment-ceiling-02b.img", pos: v2.create(0, -2.5), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_4", pos: v2.create(-8, 6), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(8, 6), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-7.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(7.5, 10.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-4, 12), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(4, 12), scale: 1, ori: 1 }, { type: "loot_tier_chrys_01", pos: v2.create(8, -6.5), scale: 1, ori: 0 }, { type: "control_panel_06", pos: v2.create(-8.5, 1.5), scale: 1, ori: 1 }, { type: "control_panel_06", pos: v2.create(8.5, 1.5), scale: 1, ori: 3 }, { type: "stone_wall_int_4", pos: v2.create(0, 10.9), scale: 1, ori: 1 } ] }, bunker_chrys_compartment_03: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -1), v2.create(10, 14)) ] }, { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 11), v2.create(10, 4)), collider.createAabbExtents(v2.create(-7, -3), v2.create(3, 3)), collider.createAabbExtents(v2.create(8, -3), v2.create(2, 3)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-03a.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(10, 13) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-03a.img", pos: v2.create(0, -9.5), scale: 1, alpha: 1, tint: 6182731, rot: 0 }, { sprite: "map-bunker-chrys-compartment-ceiling-03b.img", pos: v2.create(0, 3), scale: 1, alpha: 1, tint: 6182731, rot: 0 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_5", pos: v2.create(-7.5, -8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(7.5, -8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, -7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(11, -7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-11.5, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(11.5, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(0, 13), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(0, 4.75), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(3, 0.5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(-3, 0.5), scale: 0.9, ori: 0 }, { type: "wheel_03", pos: v2.create(0, 9.1), scale: 1, ori: 0 }, { type: "wheel_03", pos: v2.create(-7.6, 1), scale: 1, ori: 1 }, { type: "wheel_03", pos: v2.create(7.6, 1), scale: 1, ori: 3 }, { type: "loot_tier_chrys_03", pos: v2.create(0, -5.5), scale: 1, ori: 0 } ] }, bunker_chrys_compartment_03b: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -1), v2.create(10, 14)) ] }, { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 11), v2.create(10, 4)), collider.createAabbExtents(v2.create(-7, -3), v2.create(3, 3)), collider.createAabbExtents(v2.create(8, -3), v2.create(2, 3)) ] } ], imgs: [ { sprite: "map-bunker-chrys-compartment-floor-03a.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(10, 13) ) } ], imgs: [ { sprite: "map-bunker-chrys-compartment-ceiling-03a.img", pos: v2.create(0, -9.5), scale: 1, alpha: 1, tint: 6182731, rot: 0 }, { sprite: "map-bunker-chrys-compartment-ceiling-03b.img", pos: v2.create(0, 3), scale: 1, alpha: 1, tint: 6182731, rot: 0 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_5", pos: v2.create(-7.5, -8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(7.5, -8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-11, -7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(11, -7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-11.5, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(11.5, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(0, 13), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(0, 4.75), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(3, 0.5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(-3, 0.5), scale: 0.9, ori: 0 }, { type: "wheel_03", pos: v2.create(0, 9.1), scale: 1, ori: 0 }, { type: "wheel_03", pos: v2.create(-7.6, 1), scale: 1, ori: 1 }, { type: "wheel_02", pos: v2.create(7.6, 1), scale: 1, ori: 3 }, { type: "case_05", pos: v2.create(0, -5.5), scale: 1, ori: 0 } ] }, bunker_structure_08: createBunkerChrys({ bunkerType: "bunker_chrys_sublevel_01" }), bunker_structure_08b: createBunkerChrys({ bunkerType: "bunker_chrys_sublevel_01b" }), hedgehog_wall: createWall({ material: "metal", extents: v2.create(3, 0.5), height: 0.5, map: { display: true, color: 5854285, scale: 1 } }), hedgehog_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: false, beach: true }, floor: { surfaces: [], imgs: [ { sprite: "map-hedgehog-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "hedgehog_wall", pos: v2.create(0, 0), scale: 1, ori: 1 }, { type: "hedgehog_wall", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, cache_01: createCache({}), cache_01sv: createCache({ mapObjects: [ { type: "stone_02sv", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_initiative_01", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ], map: { displayType: "stone_02sv" } }), cache_02: createCache({ mapObjects: [ { type: "tree_03", pos: v2.create(0, 0), scale: 0.9, ori: 0 }, { type: "decal_initiative_01", pos: v2.create(0, 0), scale: 1.2, ori: 0, inheritOri: false } ], map: { displayType: "tree_03" } }), cache_02sv: createCache({ mapObjects: [ { type: "tree_03sv", pos: v2.create(0, 0), scale: 0.9, ori: 0 }, { type: "decal_initiative_01", pos: v2.create(0, 0), scale: 1.2, ori: 0, inheritOri: false } ], map: { displayType: "tree_03sv" } }), cache_03: createCache({ mapObjects: [ { type: "bush_06", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "loot_tier_leaf_pile", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ], map: { displayType: "bush_06" } }), cache_06: createCache({ mapObjects: [ { type: "bush_07", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "loot_tier_leaf_pile", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ], map: { displayType: "bush_07" } }), cache_07: createCache({ mapObjects: [ { type: "barrel_01b", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_initiative_01", pos: v2.create(0, 0), scale: 1.1, ori: 0, inheritOri: false } ], map: { displayType: "barrel_01b" } }), cache_log_13: createCache({ terrain: { grass: false, beach: true }, mapObjects: [ { type: "crate_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "recorder_13", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ], map: { displayType: "crate_01" } }), cache_pumpkin_01: createCache({ mapObjects: [ { type: "pumpkin_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_01", pos: v2.create(0, 0), scale: 1.5, ori: 0, inheritOri: false } ] }), cache_pumpkin_02: createCache({ mapObjects: [ { type: "pumpkin_02", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_01", pos: v2.create(0, 0), scale: 1.5, ori: 0, inheritOri: false } ] }), cache_pumpkin_03: createCache({ mapObjects: [ { type: "pumpkin_03", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_04", pos: v2.create(0, 0), scale: 1.5, ori: 0, inheritOri: false } ] }), cache_pumpkin_airdrop_02: createCache({ mapObjects: [ { type: "crate_11h", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_01", pos: v2.create(0, 0), scale: 1.5, ori: 0, inheritOri: false } ] }), candle_lit_01: createCache({ mapObjects: [ { type: "candle_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_02", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ] }), candle_lit_02: createCache({ mapObjects: [ { type: "candle_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "decal_light_03", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false } ] }), hut_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), hitParticle: "tanChip", img: wallImg("map-wall-04.img", 4608e3) }), hut_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "tanChip", img: wallImg("map-wall-05.img", 4608e3) }), hut_wall_int_6: createWall({ material: "wood", extents: v2.create(0.5, 3), hitParticle: "tanChip", img: wallImg("map-wall-06.img", 4608e3) }), hut_wall_int_12: createWall({ material: "wood", extents: v2.create(0.5, 6), hitParticle: "tanChip", img: wallImg("map-wall-12.img", 4608e3) }), hut_wall_int_14: createWall({ material: "wood", extents: v2.create(0.5, 7), hitParticle: "tanChip", img: wallImg("map-wall-14.img", 4608e3) }), hut_window_open_01: createLowWall({ img: { tint: 7681026 } }), hut_01: createHut({}), hut_01x: createHut({ ceiling: { imgs: [ { sprite: "map-building-hut-ceiling-01.img", scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-04.img", pos: v2.create(4.5, 0.5), scale: 0.667, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-05.img", pos: v2.create(-0.5, 5), scale: 0.667, alpha: 1, tint: 16777215, rot: 1 } ] } }), hut_02: createHut({ ceilingImg: "map-building-hut-ceiling-02.img", specialLoot: "pot_02" }), hut_02x: createHut({ specialLoot: "pot_02", ceiling: { imgs: [ { sprite: "map-building-hut-ceiling-02.img", scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-04.img", pos: v2.create(4.5, 0.5), scale: 0.667, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-05.img", pos: v2.create(0.5, -4.5), scale: 0.667, alpha: 1, tint: 16777215, rot: 3 } ] } }), hut_03: createHut({ map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(7, 7) ), color: 7771201 }, { collider: collider.createAabbExtents( v2.create(0, -18.9), v2.create(2, 12) ), color: 6171907 } ] }, ceilingImg: "map-building-hut-ceiling-03.img", specialLoot: "pot_05" }), warehouse_wall_side: createWall({ material: "metal", extents: v2.create(25, 0.6) }), warehouse_wall_edge: createWall({ material: "metal", extents: v2.create(0.6, 3.2) }), warehouse_01: createWarehouse({ topLeftObs: "crate_01", topRightObs: "crate_01", botRightObs: "crate_01", ignoreMapSpawnReplacement: true }), warehouse_01h: createWarehouse({ topLeftObs: "crate_01", topRightObs: "crate_01", botRightObs: "crate_01", decoration_01: "candle_lit_01", ignoreMapSpawnReplacement: true }), warehouse_01f: createWarehouse({ topLeftObs: "crate_01", topRightObs: "crate_01", botRightObs: "crate_01", ignoreMapSpawnReplacement: false }), warehouse_01x: createWarehouse({ topLeftObs: "crate_01", topRightObs: "crate_01", botRightObs: "crate_01", ignoreMapSpawnReplacement: true, ceiling: { imgs: [ { sprite: "map-building-warehouse-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-snow-04.img", pos: v2.create(7.5, 5), scale: 0.9, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-05.img", pos: v2.create(-8.5, 4), scale: 0.9, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-06.img", pos: v2.create(22.25, 11.25), scale: 0.75, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-06.img", pos: v2.create(-22.25, -11.25), scale: 0.75, alpha: 1, tint: 16777215, rot: 2 } ] } }), warehouse_02: createWarehouse2({}), warehouse_02x: createWarehouse2({ ceiling: { imgs: [ { sprite: "map-building-warehouse-ceiling-02.img", scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-snow-04.img", pos: v2.create(0, 4), scale: 1, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-06.img", pos: v2.create(20.25, -9.75), scale: 0.75, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-06.img", pos: v2.create(-20.25, 9.75), scale: 0.75, alpha: 1, tint: 16777215, rot: 3 } ] } }), warehouse_complex_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(26, 70.5), v2.create(47, 7.5) ), color: 5855577 }, { collider: collider.createAabbExtents( v2.create(15.5, 52.5), v2.create(57.5, 10.5) ), color: 5855577 }, { collider: collider.createAabbExtents( v2.create(33, 11), v2.create(75, 31) ), color: 5855577 }, { collider: collider.createAabbExtents( v2.create(5, -30), v2.create(47, 10) ), color: 5855577 }, { collider: collider.createAabbExtents( v2.create(-39.75, 11.25), v2.create(2, 51) ), color: 16109568 }, { collider: collider.createCircle(v2.create(-39, 55), 1.25), color: 6310464 }, { collider: collider.createCircle(v2.create(-39, 20.5), 1.25), color: 6310464 }, { collider: collider.createCircle(v2.create(-39, 2), 1.25), color: 6310464 }, { collider: collider.createCircle(v2.create(-39, -31.5), 1.25), color: 6310464 }, { collider: collider.createAabbExtents( v2.create(-28, -30), v2.create(2, 2) ), color: 6697728 }, { collider: collider.createAabbExtents( v2.create(-23, -33), v2.create(2, 2) ), color: 6697728 }, { collider: collider.createAabbExtents( v2.create(7, 70), v2.create(2, 2) ), color: 6697728 }, { collider: collider.createAabbExtents( v2.create(12, 72), v2.create(2, 2) ), color: 6697728 }, { collider: collider.createCircle(v2.create(-26.5, 54.75), 1.75), color: 8026746 }, { collider: collider.createCircle(v2.create(-23.5, 57), 1.75), color: 8026746 }, { collider: collider.createCircle(v2.create(84, -15.5), 1.75), color: 8026746 }, { collider: collider.createCircle(v2.create(40, -35), 1.5), color: 8026746 }, { collider: collider.createCircle(v2.create(65, 61), 1.5), color: 8026746 }, { collider: collider.createAabbExtents( v2.create(44.5, -25), v2.create(1.4, 3.1) ), color: 13278307 }, { collider: collider.createAabbExtents( v2.create(58, 47.5), v2.create(1.4, 3.1) ), color: 13278307 } ] }, terrain: { waterEdge: { dir: v2.create(-1, 0), distMin: 72, distMax: 72 } }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(26, 70.5), v2.create(47, 7.5)), collider.createAabbExtents(v2.create(15.5, 52.5), v2.create(57.5, 10.5)), collider.createAabbExtents(v2.create(33, 11), v2.create(75, 31)), collider.createAabbExtents(v2.create(5, -30), v2.create(47, 10)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(26, 60), v2.create(47, 18)), color: 9340275, order: 1 }, { bound: collider.createAabbExtents( v2.create(5, 11.5), v2.create(47, 51.5) ), color: 9340275, order: 1 }, { bound: collider.createAabbExtents(v2.create(80, 11), v2.create(28, 31)), color: 9340275, order: 1 }, { bound: collider.createAabbExtents(v2.create(26, 58), v2.create(46, 19)), color: 5855577, order: 1 }, { bound: collider.createAabbExtents( v2.create(5, 11.5), v2.create(46, 50.5) ), color: 5855577, order: 1 }, { bound: collider.createAabbExtents(v2.create(78, 11), v2.create(29, 30)), color: 5855577, order: 1 }, { bound: collider.createAabbExtents( v2.create(-37.5, 38), v2.create(4.5, 10) ), color: 9340275, order: 1 }, { bound: collider.createAabbExtents( v2.create(-37.5, -15), v2.create(4.5, 10) ), color: 9340275, order: 1 }, { bound: collider.createAabbExtents( v2.create(-37.5, 38), v2.create(3.5, 9) ), color: 5855577, order: 1 }, { bound: collider.createAabbExtents( v2.create(-37.5, -15), v2.create(3.5, 9) ), color: 5855577, order: 1 } ], floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(26, 60), v2.create(47, 18)), collider.createAabbExtents( v2.create(5, 11.5), v2.create(47, 51.5) ), collider.createAabbExtents(v2.create(80, 11), v2.create(28, 31)) ] } ], imgs: [ { sprite: "map-complex-warehouse-floor-01.img", pos: v2.create(-39.2, 55), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-complex-warehouse-floor-02.img", pos: v2.create(-39.2, 11.5), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-complex-warehouse-floor-03.img", pos: v2.create(-39.2, -32), scale: 1, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "warehouse_02", pos: v2.create(5, 0), scale: 1, ori: 0 }, { type: "warehouse_02", pos: v2.create(70, 0), scale: 1, ori: 0 }, { type: "warehouse_02", pos: v2.create(18, 55), scale: 1, ori: 0 }, { type: "bollard_01", pos: v2.create(-39, 55), scale: 1, ori: 2 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_06: 0.08 }), pos: v2.create(-37.5, 38), scale: 1, ori: 0 }, { type: "bollard_01", pos: v2.create(-39, 20.5), scale: 1, ori: 2 }, { type: "bollard_01", pos: v2.create(-39, 2), scale: 1, ori: 2 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_06: 0.08 }), pos: v2.create(-37.5, -15), scale: 1, ori: 2 }, { type: "bollard_01", pos: v2.create(-39, -31.5), scale: 1, ori: 2 }, { type: "crate_01", pos: v2.create(-28, -30), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(-23, -33), scale: 1, ori: 0, inheritOri: false }, { type: "container_04", pos: v2.create(-11.5, -26.575), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(-6, -29), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(9.5, -29), scale: 1, ori: 0 }, { type: "container_04", pos: v2.create(15, -26.575), scale: 1, ori: 0 }, { type: "shack_02", pos: v2.create(37, -30), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(44.5, -25), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(84, -15.5), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(-3, 22), scale: 1, ori: 1 }, { type: "container_04", pos: v2.create(-5.425, 27.5), scale: 1, ori: 1 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(-3, 33), scale: 1, ori: 1 }, { type: "container_04", pos: v2.create(28, 22), scale: 1, ori: 1 }, { type: "container_04", pos: v2.create(28, 27.5), scale: 1, ori: 1 }, { type: "container_04", pos: v2.create(28, 33), scale: 1, ori: 1 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(53, 22), scale: 1, ori: 3 }, { type: "container_04", pos: v2.create(55.425, 27.5), scale: 1, ori: 1 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(53, 33), scale: 1, ori: 3 }, { type: "container_04", pos: v2.create(84, 22), scale: 1, ori: 3 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1, container_05: 2, container_06: 0.08, "": 0.75 }), pos: v2.create(86.425, 27.5), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(-26.5, 54.75), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-23.5, 57), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(7, 70), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(12, 72), scale: 1, ori: 0, inheritOri: false }, { type: "shack_02", pos: v2.create(60, 58), scale: 1, ori: 1 }, { type: "sandbags_01", pos: v2.create(58, 47.5), scale: 1, ori: 1 }, { type: "decal_oil_01", pos: v2.create(-37.5, 59.5), scale: 1, ori: 0 }, { type: "decal_oil_02", pos: v2.create(-29.5, 52.5), scale: 1, ori: 0 }, { type: "decal_oil_03", pos: v2.create(-16.5, 61.5), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(-15.5, 73.5), scale: 1, ori: 0 }, { type: "decal_oil_05", pos: v2.create(2.5, 72.5), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(33.5, 74), scale: 1, ori: 1 }, { type: "decal_oil_06", pos: v2.create(62.5, 69), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(105, 34), scale: 1, ori: 0 }, { type: "decal_oil_05", pos: v2.create(101.5, 23), scale: 1, ori: 0 }, { type: "decal_oil_01", pos: v2.create(84.5, 36), scale: 1, ori: 3 }, { type: "decal_oil_03", pos: v2.create(73.5, 30), scale: 1, ori: 3 }, { type: "decal_oil_03", pos: v2.create(56.5, 39), scale: 1, ori: 3 }, { type: "decal_oil_06", pos: v2.create(60.5, 14), scale: 1, ori: 1 }, { type: "decal_oil_02", pos: v2.create(40, 42), scale: 1, ori: 1 }, { type: "decal_oil_05", pos: v2.create(41.5, 20), scale: 1, ori: 0 }, { type: "decal_oil_01", pos: v2.create(35.5, 9), scale: 1, ori: 1 }, { type: "decal_oil_02", pos: v2.create(38.5, -5), scale: 1, ori: 2 }, { type: "decal_oil_05", pos: v2.create(36.5, -22), scale: 1, ori: 3 }, { type: "decal_oil_03", pos: v2.create(83, -16), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(28.5, -37), scale: 1, ori: 0 }, { type: "decal_oil_01", pos: v2.create(22.5, -24), scale: 1, ori: 0 }, { type: "decal_oil_03", pos: v2.create(7.5, -13.5), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(6.5, -21), scale: 1, ori: 0 }, { type: "decal_oil_06", pos: v2.create(-2.5, -32), scale: 1, ori: 0 }, { type: "decal_oil_05", pos: v2.create(-22.5, -24), scale: 1, ori: 1 }, { type: "decal_oil_03", pos: v2.create(-37.5, -29.75), scale: 1, ori: 0 }, { type: "decal_oil_04", pos: v2.create(-37.25, 9.5), scale: 0.75, ori: 1 }, { type: "decal_oil_02", pos: v2.create(-25.5, 15.5), scale: 1, ori: 1 }, { type: "decal_oil_04", pos: v2.create(-12.5, 22.5), scale: 1, ori: 1 }, { type: "decal_oil_05", pos: v2.create(-14.5, 33.5), scale: 1, ori: 1 }, { type: "decal_oil_03", pos: v2.create(-26.5, 40.5), scale: 1, ori: 1 }, { type: "decal_oil_06", pos: v2.create(3.5, 28.5), scale: 1, ori: 2 }, { type: "decal_oil_02", pos: v2.create(15.5, 38.5), scale: 1, ori: 2 } ] }, logging_complex_01: createLoggingComplex({}), logging_complex_01sp: createLoggingComplex({ groundTintLt: 3361294, groundTintDk: 2437648 }), logging_complex_01su: createLoggingComplex({ groundTintLt: 7843122, groundTintDk: 5143827 }), logging_complex_02: createLoggingComplex2({}), logging_complex_02sp: createLoggingComplex2({ groundTintDk: 2437648, tree_08c: "tree_08spc" }), logging_complex_02su: createLoggingComplex2({ groundTintDk: 5143827 }), logging_complex_03: function(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false, spawnPriority: 10 }, mapObstacleBounds: [collider.createCircle(v2.create(0, 0), 32)], mapGroundPatches: [ { bound: collider.createAabbExtents( v2.create(0, 0), v2.create(6.5, 5.5) ), color: e.groundTintDk || 7563810, roughness: 0.05, offsetDist: 0.5 } ], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(1.75, 2.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 4, crate_19: 1 }), pos: v2.create(-1.75, -2.5), scale: 1, ori: 0, inheritOri: false }, { type: "tree_09", pos: v2.create(2.75, -2.25), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-2.75, 2.25), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({}), junkyard_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, ori: 0, mapObstacleBounds: [collider.createCircle(v2.create(0, 0), 37)], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(-8.5, 24), v2.create(13, 9)), color: 1184769 }, { bound: collider.createAabbExtents( v2.create(26.75, 8.5), v2.create(8, 5.5) ), color: 1184769 }, { bound: collider.createAabbExtents( v2.create(23.75, -15.5), v2.create(7, 5.5) ), color: 1184769 }, { bound: collider.createAabbExtents( v2.create(-23.5, -3), v2.create(4.75, 3.5) ), color: 1184769 }, { bound: collider.createAabbExtents( v2.create(-3.5, -19.5), v2.create(4, 6.5) ), color: 1184769 } ], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "tree_05b", pos: v2.create(0, 0), scale: 1.5, ori: 0 }, { type: "candle_lit_01", pos: v2.create(-9, 3), scale: 1, ori: 0 }, { type: "candle_lit_01", pos: v2.create(9, 3), scale: 1, ori: 0 }, { type: "candle_lit_01", pos: v2.create(-6.5, -7), scale: 1, ori: 0 }, { type: "candle_lit_01", pos: v2.create(6.5, -7), scale: 1, ori: 0 }, { type: "candle_lit_01", pos: v2.create(0, 9), scale: 1, ori: 0 }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-2.5, 29.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-6.5, 29), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-10.5, 29.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-14.5, 30), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(1.5, 23.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-2.5, 24.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-6.5, 24), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-10.5, 24), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-14.5, 23.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-18.5, 24.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-2.5, 18.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-6.5, 18), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-10.5, 18.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ refrigerator_01: 3, "": 1 }), pos: v2.create(-14.5, 19), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, table_01: 3 }), pos: v2.create(22.5, 6), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, table_01: 3 }), pos: v2.create(29, 6), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, table_01: 3 }), pos: v2.create(24.5, 11), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, table_01: 3 }), pos: v2.create(31, 11), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ oven_01: 3, "": 1 }), pos: v2.create(20, -13), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ oven_01: 3, "": 1 }), pos: v2.create(24, -12.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ oven_01: 3, "": 1 }), pos: v2.create(28, -13.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ oven_01: 3, "": 1 }), pos: v2.create(22, -18.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ oven_01: 3, "": 1 }), pos: v2.create(26, -18.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, toilet_01: 3 }), pos: v2.create(-1.5, -16), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, toilet_01: 3 }), pos: v2.create(-5, -22), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, toilet_01: 3 }), pos: v2.create(-5.5, -17.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, toilet_01: 3 }), pos: v2.create(-1.5, -23.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, vending_01: 3 }), pos: v2.create(-25.5, -4.25), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, vending_01: 3 }), pos: v2.create(-21.5, -2.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, cache_03: 3 }), pos: v2.create(-24, 7), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, cache_03: 3 }), pos: v2.create(14, 18), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, cache_03: 3 }), pos: v2.create(-18, -16), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, cache_03: 3 }), pos: v2.create(9.5, -16), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ "": 1, cache_03: 3 }), pos: v2.create(25.5, -2.5), scale: 1, ori: 0, inheritOri: false } ] }, archway_column_1: createWall({ material: "wood", extents: v2.create(1, 1), img: Object.assign(wallImg("map-column-01.img", 7290644), { residue: "map-drawers-res.img" }) }), archway_01: { type: "building", map: { display: true, color: 7813914, scale: 1 }, terrain: { grass: true, beach: false }, floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(10, 1)) ] } ], imgs: [] }, ceiling: { zoomRegions: [], collision: [collider.createAabbExtents(v2.create(0, 0), v2.create(10.5, 2))], imgs: [ { sprite: "map-building-archway-ceiling-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 1, particle: "archwayBreak", particleCount: 15, residue: "map-archway-res-01.img" } }, mapObjects: [ { type: "archway_column_1", pos: v2.create(-10, 0), scale: 1, ori: 0 }, { type: "archway_column_1", pos: v2.create(10, 0), scale: 1, ori: 0 }, { type: "loot_tier_1", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, desert_town_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(65, 102)), collider.createAabbExtents(v2.create(0, 0), v2.create(20, 120)), collider.createAabbExtents(v2.create(-60, 40), v2.create(10, 5)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(60, 95)), color: 12813354, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(10, 96)), color: 9396511, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-33, 40), v2.create(27, 5)), color: 9396511, roughness: 0.1, offsetDist: 1 } ], floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(55, 25)) ] } ], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "archway_01", pos: v2.create(0, 95), scale: 1, ori: 0 }, { type: "archway_01", pos: v2.create(0, -95), scale: 1, ori: 0 }, { type: "police_01", pos: v2.create(40, -50), scale: 1, ori: 3 }, { type: "cabin_01", pos: v2.create(37, 20), scale: 1, ori: 3 }, { type: "cabin_01", pos: v2.create(35, 70), scale: 1, ori: 3 }, { type: "barn_01", pos: v2.create(-34, -60), scale: 1, ori: 3 }, { type: "bank_01b", pos: v2.create(-35, 0), scale: 1, ori: 1 }, { type: "saloon_structure_01", pos: v2.create(-35, 70), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(5, 76), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-6.75, 71), scale: 0.9, ori: 0 }, { type: "sandbags_02", pos: v2.create(-6.75, 67), scale: 1, ori: 0 }, { type: "sandbags_02", pos: v2.create(-50, 42), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-4, 44), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-1.5, 46.5), scale: 0.9, ori: 0 }, { type: "crate_18", pos: v2.create(0.25, 42), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-21, 31.5), scale: 0.9, ori: 0 }, { type: "sandbags_01", pos: v2.create(-15, 31.5), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(13, 34), scale: 1, ori: 1 }, { type: "sandbags_02", pos: v2.create(7, 8), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(-7.25, -12.5), scale: 0.9, ori: 0 }, { type: "sandbags_01", pos: v2.create(-7.25, -22), scale: 1, ori: 1 }, { type: "crate_18", pos: v2.create(2.5, -56.5), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-1.5, -59), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(1.5, -61), scale: 0.9, ori: 0 }, { type: "sandbags_01", pos: v2.create(-5.5, -74), scale: 1, ori: 0 }, { type: "sandbags_02", pos: v2.create(7.5, -82), scale: 1, ori: 0 } ] }, desert_town_02: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, -3), v2.create(50, 60)), collider.createAabbExtents(v2.create(0, 0), v2.create(60, 15)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, -3), v2.create(45, 55)), color: 12813354, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(46, 10)), color: 9396511, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 2), v2.create(5, 50.5)), color: 9396511, roughness: 0.1, offsetDist: 1 } ], floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "archway_01", pos: v2.create(45, 0), scale: 1, ori: 1 }, { type: "archway_01", pos: v2.create(-45, 0), scale: 1, ori: 1 }, { type: "house_red_01", pos: v2.create(24, 30), scale: 1, ori: 3 }, { type: "house_red_02", pos: v2.create(-24, 30), scale: 1, ori: 3 }, { type: "bank_01b", pos: v2.create(-10, -34), scale: 1, ori: 2 }, { type: "shack_01", pos: v2.create(31, -26), scale: 1, ori: 2 }, { type: "outhouse_01", pos: v2.create(28, -46), scale: 1, ori: 0 }, { type: "tree_06", pos: v2.create(29, -36), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-4.75, 34), scale: 0.9, ori: 0 }, { type: "sandbags_02", pos: v2.create(-4.75, 30), scale: 1, ori: 1 }, { type: "sandbags_01", pos: v2.create(-9, 10), scale: 1, ori: 0 }, { type: "crate_18", pos: v2.create(2.5, 1.5), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-2, -1), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(1.5, -3), scale: 0.9, ori: 0 }, { type: "sandbags_01", pos: v2.create(16, -10), scale: 1, ori: 1 } ] }, statue_01: createStone({ scale: { createMin: 1, createMax: 1, destroy: 0.5 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.4, 4.4)), destructible: false, map: { display: true, color: 5723991, scale: 1 }, img: { sprite: "map-statue-01.img", scale: 0.5 } }), statue_03: createStone({ stonePlated: true, health: 500, height: 10, scale: { createMin: 1, createMax: 1, destroy: 0.85 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.4, 4.4)), destructible: true, map: { display: true, color: 5723991, scale: 1 }, img: { sprite: "map-statue-03.img", scale: 0.5, residue: "" } }), statue_04: createStone({ stonePlated: true, health: 500, height: 10, scale: { createMin: 1, createMax: 1, destroy: 0.85 }, collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4.4, 4.4)), destructible: true, map: { display: true, color: 5723991, scale: 1 }, img: { sprite: "map-statue-04.img", scale: 0.5, residue: "" } }), statue_top_01: createStone({ health: 500, height: 10, collision: collider.createCircle(v2.create(0, 0), 2.45), scale: { createMin: 1, createMax: 1, destroy: 0.8 }, destructible: true, map: { display: false, color: 5723991, scale: 1 }, img: { sprite: "map-statue-top-01.img", residue: "", scale: 0.5, zIdx: 60 } }), statue_top_02: createStone({ health: 500, height: 10, collision: collider.createCircle(v2.create(0, 0), 2.45), scale: { createMin: 1, createMax: 1, destroy: 0.8 }, destructible: true, map: { display: false, color: 5723991, scale: 1 }, img: { sprite: "map-statue-top-02.img", residue: "", scale: 0.5, zIdx: 60 } }), statue_structure_01: { type: "building", ori: 0, terrain: {}, floor: { surfaces: [], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "statue_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "statue_top_01", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, statue_structure_02: { type: "building", ori: 0, terrain: {}, floor: { surfaces: [], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "statue_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "statue_top_02", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, statue_building_03: createStatue({ statue: "statue_03" }), statue_underground_03: createStatueUnderground({ crate: "crate_02d" }), statue_structure_03: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 5), v2.create(7.5, 12.5)) ], layers: [ { type: "statue_building_03", pos: v2.create(0, 0), ori: 0 }, { type: "statue_underground_03", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(-1, 0), v2.create(2.6, 2) ), downDir: v2.create(1, 0) } ], mask: [collider.createAabbExtents(v2.create(5.7, 0), v2.create(4, 4))] }, statue_building_04: createStatue({ statue: "statue_04" }), statue_underground_04: createStatueUnderground({ crate: "crate_22d" }), statue_structure_04: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 5), v2.create(7.5, 12.5)) ], layers: [ { type: "statue_building_04", pos: v2.create(0, 0), ori: 0 }, { type: "statue_underground_04", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(-1, 0), v2.create(2.6, 2) ), downDir: v2.create(1, 0) } ], mask: [collider.createAabbExtents(v2.create(5.7, 0), v2.create(4, 4))] }, river_town_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(70.75, 0.5), v2.create(30, 54.5) ), color: 3815994 }, { collider: collider.createAabbExtents( v2.create(77.5, 64), v2.create(23, 10) ), color: 3815994 }, { collider: collider.createAabbExtents( v2.create(111, -29.5), v2.create(10.5, 24.5) ), color: 3815994 }, { collider: collider.createAabbExtents( v2.create(50, 0), v2.create(4.4, 4.4) ), color: 5723991 } ] }, terrain: { bridge: { nearbyWidthMult: 1 }, spawnPriority: 100 }, bridgeLandBounds: [ collider.createAabbExtents(v2.create(-41, 0), v2.create(6, 10)), collider.createAabbExtents(v2.create(41, 0), v2.create(6, 10)), collider.createAabbExtents(v2.create(81, 0), v2.create(40, 54)), collider.createAabbExtents(v2.create(78, 64), v2.create(23, 10)), collider.createAabbExtents(v2.create(-76, -22), v2.create(36, 24)), collider.createAabbExtents(v2.create(-72, 22), v2.create(27, 25)) ], bridgeWaterBounds: [collider.createAabbExtents(v2.create(0, 0), v2.create(5, 5))], mapObstacleBounds: [ collider.createAabbExtents(v2.create(71, 0), v2.create(31, 56)), collider.createAabbExtents(v2.create(77, 65), v2.create(24, 10)), collider.createAabbExtents(v2.create(112, -30), v2.create(10, 26)), collider.createAabbExtents(v2.create(106, 19.5), v2.create(8, 7.25)), collider.createAabbExtents(v2.create(-71, 32), v2.create(27, 15)), collider.createAabbExtents(v2.create(-71, 16), v2.create(8, 6)), collider.createAabbExtents(v2.create(-75, -34), v2.create(40, 19)), collider.createAabbExtents(v2.create(-57, -10), v2.create(5, 11)), collider.createAabbExtents(v2.create(-86, -10), v2.create(5, 11)), collider.createAabbExtents(v2.create(-21, 0), v2.create(100, 8)), collider.createAabbExtents(v2.create(-109, 30), v2.create(7, 7.25)), collider.createAabbExtents(v2.create(0, 0), v2.create(40, 15)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(-20, 0), v2.create(100, 6)), color: 6632211, roughness: 0.05, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-71, 10), v2.create(2, 9)), color: 6632211, roughness: 0, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-57, -10), v2.create(2, 9)), color: 6632211, roughness: 0, offsetDist: 1 }, { bound: collider.createAabbExtents( v2.create(-109, 30), v2.create(6, 6.25) ), color: 3293977, roughness: 0.05, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(-86, -10), v2.create(2, 9)), color: 6632211, roughness: 0, offsetDist: 1 }, { bound: collider.createAabbExtents( v2.create(106, 19.5), v2.create(7, 6.25) ), color: 3293977, roughness: 0.05, offsetDist: 0.5 } ], floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] }, { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(70.75, 0.5), v2.create(30, 54.5) ), collider.createAabbExtents( v2.create(77.5, 64), v2.create(23, 10) ), collider.createAabbExtents( v2.create(111, -29.5), v2.create(10.5, 24.5) ) ] } ], imgs: [ { sprite: "map-complex-warehouse-floor-04.img", pos: v2.create(81, 10), scale: 1, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "bridge_xlg_structure_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "barn_01", pos: v2.create(-71, 30), scale: 1, ori: 2 }, { type: "house_red_01", pos: v2.create(-56, -30), scale: 1, ori: 0 }, { type: "house_red_02", pos: v2.create(-96, -30), scale: 1, ori: 0 }, { type: "sandbags_02", pos: v2.create(-68, 2), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_02: 1, crate_01: 3 }), pos: v2.create(-85, 1), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_02: 1, crate_01: 3 }), pos: v2.create(-90, -1), scale: 1, ori: 0, inheritOri: false }, { type: "crate_02f", pos: v2.create(-106.5, 32.25), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(-111.25, 32.25), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-108, 27.25), scale: 1, ori: 0 }, { type: "statue_structure_01", pos: v2.create(-50, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(45, 36), scale: 1, ori: 2 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(51, 36), scale: 1, ori: 2 }, { type: "shack_02", pos: v2.create(47, 20), scale: 1, ori: 0 }, { type: "warehouse_02", pos: v2.create(78, 40), scale: 1, ori: 1 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(95, 44), scale: 1, ori: 0 }, { type: "statue_structure_02", pos: v2.create(50, 0), scale: 1, ori: 2 }, { type: "crate_01", pos: v2.create(74.5, -0.5), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(79.5, 0.25), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(106, 22), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(104.5, 17.25), scale: 1, ori: 0, inheritOri: false }, { type: "crate_22", pos: v2.create(109.25, 17.25), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(85, -13), scale: 1, ori: 1 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(45, -36), scale: 1, ori: 0 }, { type: "shack_02", pos: v2.create(47, -20), scale: 1, ori: 2 }, { type: "warehouse_02", pos: v2.create(86, -30), scale: 1, ori: 0 }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(72, -47), scale: 1, ori: 1 } ] }, river_town_02: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, oris: [0, 1], mapObstacleBounds: [ collider.createAabbExtents(v2.create(61, -3), v2.create(24, 21)), collider.createAabbExtents(v2.create(46, -36), v2.create(6, 14)), collider.createAabbExtents(v2.create(-68, 0), v2.create(27, 8)), collider.createAabbExtents(v2.create(0, 0), v2.create(14, 14)), collider.createAabbExtents(v2.create(-80, 32), v2.create(4, 4)), collider.createAabbExtents(v2.create(-16, 13), v2.create(5, 2.5)), collider.createAabbExtents(v2.create(16, -13), v2.create(5, 2.5)), collider.createAabbExtents(v2.create(-76.5, 19.5), v2.create(2.5, 2.5)), collider.createAabbExtents(v2.create(-62, -18), v2.create(2.5, 2.5)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(-5, 0), v2.create(70, 6)), color: 9585940, roughness: 0.05, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-71, 10), v2.create(2, 9)), color: 9585940, roughness: 0.05, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-76, 19), v2.create(10.5, 8)), color: 9585940, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(-57, -10), v2.create(2, 9)), color: 9585940, roughness: 0.05, offsetDist: 1 }, { bound: collider.createAabbExtents( v2.create(-63, -19), v2.create(11.5, 8.5) ), color: 9585940, roughness: 0.1, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(14, 10)), color: 8405016, roughness: 0.3, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(9, 22)), color: 8405016, roughness: 0.3, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 33)), color: 8405016, roughness: 0.3, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(61, -3), v2.create(22, 19)), color: 3815994, roughness: 0.15, offsetDist: 1 }, { bound: collider.createAabbExtents( v2.create(45, -34), v2.create(5.75, 14) ), color: 3815994, roughness: 0.15, offsetDist: 1 }, { bound: collider.createAabbExtents(v2.create(69, -10), v2.create(4, 3.75)), color: 14657367, roughness: 0.2, offsetDist: 1 } ], floor: { surfaces: [ { type: "grass", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] }, { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(61, -3), v2.create(22, 19)), collider.createAabbExtents( v2.create(45, -34), v2.create(5.75, 14) ) ] } ], imgs: [ { sprite: "map-complex-warehouse-floor-05.img", pos: v2.create(81, 10), scale: 1, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "stone_06", pos: v2.create(-16, 13), scale: 1, ori: 0, inheritOri: true }, { type: "stone_06", pos: v2.create(16, -13), scale: 1, ori: 0, inheritOri: true }, { type: "sandbags_02", pos: v2.create(-68, 2), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_02: 1, crate_01: 4 }), pos: v2.create(-85, 1), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_02: 1, crate_01: 4 }), pos: v2.create(-90, -1), scale: 1, ori: 0, inheritOri: false }, { type: "statue_structure_03", pos: v2.create(-50, 0), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-80, 32), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_02: 1, crate_01: 4 }), pos: v2.create(-76.5, 19.5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_02: 1, crate_01: 4 }), pos: v2.create(-62, -18), scale: 1, ori: 0, inheritOri: false }, { type: "statue_structure_04", pos: v2.create(50, 0), scale: 1, ori: 2 }, { type: "tree_06", pos: v2.create(69, -10), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(74.5, -0.5), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(79.5, 0.25), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ container_01: 1, container_02: 1, container_03: 1 }), pos: v2.create(45, -36), scale: 1, ori: 0 }, { type: "tree_05c", pos: v2.create(0, 2), scale: 2, ori: 0, inheritOri: false }, { type: "case_05", pos: v2.create(0, -2), scale: 1, ori: 0, inheritOri: true } ] }, shack_wall_top: createWall({ material: "wood", extents: v2.create(5.6, 0.35), height: 10, img: wallImg("map-wall-shack-top.img") }), shack_wall_side_left: createWall({ material: "wood", extents: v2.create(0.35, 3.43), height: 10, img: wallImg("map-wall-shack-left.img") }), shack_wall_side_right: createWall({ material: "wood", extents: v2.create(0.35, 3.8), height: 10, img: wallImg("map-wall-shack-right.img") }), shack_wall_bot: createWall({ material: "wood", extents: v2.create(3.75, 0.35), height: 10, img: wallImg("map-wall-shack-bot.img") }), shack_01: createShack2({}), shack_01x: createShack2({ ceiling: { imgs: [ { sprite: "map-building-shack-ceiling-01.img", scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-05.img", pos: v2.create(-4, 2.5), scale: 0.667, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-04.img", pos: v2.create(3.5, -0.5), scale: 0.667, alpha: 1, tint: 16777215, rot: 0 } ] } }), shack_02: createShack({}), shack_02x: createShack({ ceiling: { imgs: [ { sprite: "map-building-shack-ceiling-02.img", scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-05.img", pos: v2.create(-2, 1), scale: 0.667, alpha: 1, tint: 16777215, rot: 0 } ] } }), shilo_01: function(e) { const t = { type: "building", map: { display: true, color: 3240224, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, -1), v2.create(17, 15)) ], floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(15, 12) ) ] } ], imgs: [ { sprite: "map-building-shilo-floor-01.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-porch-01.img", pos: v2.create(0, -13), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(14.5, 11.5) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(14.5, 11.5) ) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-shilo-ceiling-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, mapObjects: [ { type: "metal_wall_ext_12_5", pos: v2.create(7.75, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_12_5", pos: v2.create(-7.75, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_13", pos: v2.create(8.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_13", pos: v2.create(-8.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_23", pos: v2.create(-14.5, 0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_23", pos: v2.create(14.5, 0.5), scale: 1, ori: 0 }, { type: "silo_01po", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-2, -12), scale: 1, ori: 3 }, { type: "house_window_01", pos: v2.create(0, 11.75), scale: 1, ori: 1 } ] }; return util.mergeDeep(t, e || {}); }({}), shack_wall_ext_2: createWall({ material: "wood", extents: v2.create(0.5, 1), hitParticle: "tanChip", img: wallImg("map-wall-02.img", 12556639) }), shack_wall_ext_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "tanChip", img: wallImg("map-wall-05.img", 12556639) }), shack_wall_ext_9: createWall({ material: "wood", extents: v2.create(0.5, 4.5), hitParticle: "tanChip", img: wallImg("map-wall-09.img", 12556639) }), shack_wall_ext_10: createWall({ material: "wood", extents: v2.create(0.5, 5), hitParticle: "tanChip", img: wallImg("map-wall-10.img", 12556639) }), shack_wall_ext_14: createWall({ material: "wood", extents: v2.create(0.5, 7), hitParticle: "tanChip", img: wallImg("map-wall-14.img", 12556639) }), shack_03a: createShack3({ terrain: { bridge: { nearbyWidthMult: 1 }, nearbyRiver: { radMin: 0.75, radMax: 1.5, facingOri: 1 } } }), shack_03b: createShack3({ terrain: { waterEdge: { dir: v2.create(0, 1), distMin: 4, distMax: 5 } }, map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-7.75, 3), v2.create(1, 2) ), color: 6171907 }, { collider: collider.createAabbExtents( v2.create(5, -4.75), v2.create(2, 1) ), color: 6171907 }, { collider: collider.createAabbExtents( v2.create(1, 1.5), v2.create(8, 5.5) ), color: 5730406 }, { collider: collider.createAabbExtents( v2.create(-10.65, 9), v2.create(2, 12) ), color: 6171907 } ] }, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(1, 1.5), v2.create(8, 5.5)), collider.createAabbExtents( v2.create(-10.65, 9), v2.create(2, 12) ), collider.createAabbExtents(v2.create(-7.75, 3), v2.create(1, 2)), collider.createAabbExtents(v2.create(5, -4.75), v2.create(2, 1)) ] } ], imgs: [ { sprite: "map-building-shack-floor-03.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-hut-floor-02.img", pos: v2.create(-10.65, 9), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { imgs: [ { sprite: "map-building-shack-ceiling-03.img", pos: v2.create(0.5, 0.5), scale: 0.667, alpha: 1, tint: 16777215 } ] } }), shack_03x: createShack3({ terrain: { bridge: { nearbyWidthMult: 1 }, nearbyRiver: { radMin: 0.75, radMax: 1.5, facingOri: 1 } }, ceiling: { imgs: [ { sprite: "map-building-shack-ceiling-03.img", pos: v2.create(0.5, 0.5), scale: 0.667, alpha: 1, tint: 10461087 }, { sprite: "map-snow-01.img", pos: v2.create(3.75, 1.75), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 } ] } }), outhouse_wall_top: createWall({ material: "wood", extents: v2.create(3.2, 0.35), height: 10, hitParticle: "outhouseChip", explodeParticle: "outhousePlank", health: 100, img: wallImg("map-wall-outhouse-top.img") }), outhouse_wall_side: createWall({ material: "wood", extents: v2.create(0.35, 3.1), height: 10, hitParticle: "outhouseChip", explodeParticle: "outhousePlank", health: 100, img: wallImg("map-wall-outhouse-side.img") }), outhouse_wall_bot: createWall({ material: "wood", extents: v2.create(1.15, 0.35), height: 10, hitParticle: "outhouseChip", explodeParticle: "outhousePlank", health: 100, img: wallImg("map-wall-outhouse-bot.img") }), outhouse_01: createOutHouse({}), outhouse_01x: createOutHouse({ ceiling: { imgs: [ { sprite: "map-building-outhouse-ceiling.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-snow-04.img", pos: v2.create(2.25, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] } }), outhouse_02: createOutHouse({ ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 1.45), v2.create(3.6, 3.2) ), zoomOut: collider.createAabbExtents( v2.create(0, 1.4), v2.create(3.8, 3.4) ) } ], imgs: [ { sprite: "map-building-outhouse-ceiling.img", scale: 0.5, alpha: 1, tint: 13735576 } ], destroy: { wallCount: 2, particleCount: 15, particle: "outhouseBreak", residue: "map-outhouse-res.img" } }, obs: "toilet_02b" }), perch_01: function(e) { const t = { type: "building", map: { display: true, color: 1915136, scale: 1 }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(7, 8)) ], zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(4.25, 5) ), collider.createAabbExtents( v2.create(5, 0), v2.create(1.25, 2) ), collider.createAabbExtents( v2.create(-5, 0), v2.create(1.25, 2) ) ] } ], imgs: [ { sprite: "map-building-perch-floor.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [ { sprite: "map-building-perch-ceiling.img", scale: 0.5, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 5, particleCount: 15, particle: "shackGreenBreak", residue: "map-perch-res.img" } }, mapObjects: [ { type: "loot_tier_1", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "barn_wall_int_2", pos: v2.create(3.5, -3), scale: 1, ori: 0 }, { type: "barn_wall_int_2", pos: v2.create(-3.5, -3), scale: 1, ori: 0 }, { type: "barn_wall_int_2", pos: v2.create(3.5, 3), scale: 1, ori: 0 }, { type: "barn_wall_int_2", pos: v2.create(-3.5, 3), scale: 1, ori: 0 }, { type: "barn_wall_int_2_5", pos: v2.create(2.75, -4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_2_5", pos: v2.create(-2.75, -4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_2_5", pos: v2.create(2.75, 4.5), scale: 1, ori: 1 }, { type: "barn_wall_int_2_5", pos: v2.create(-2.75, 4.5), scale: 1, ori: 1 }, { type: "house_window_broken_01", pos: v2.create(0, 4.75), scale: 1, ori: 1 }, { type: "house_window_broken_01", pos: v2.create(0, -4.75), scale: 1, ori: 1 } ] }; return util.mergeDeep(t, e || {}); }({}), brick_wall_ext_1: createWall({ material: "brick", extents: v2.create(0.5, 0.5) }), brick_wall_ext_2: createWall({ material: "brick", extents: v2.create(0.5, 1) }), brick_wall_ext_3: createWall({ material: "brick", extents: v2.create(0.5, 1.5) }), brick_wall_ext_4: createWall({ material: "brick", extents: v2.create(0.5, 2) }), brick_wall_ext_5: createWall({ material: "brick", extents: v2.create(0.5, 2.5) }), brick_wall_ext_6: createWall({ material: "brick", extents: v2.create(0.5, 3) }), brick_wall_ext_7: createWall({ material: "brick", extents: v2.create(0.5, 3.5) }), brick_wall_ext_8: createWall({ material: "brick", extents: v2.create(0.5, 4) }), brick_wall_ext_9: createWall({ material: "brick", extents: v2.create(0.5, 4.5) }), brick_wall_ext_10: createWall({ material: "brick", extents: v2.create(0.5, 5) }), brick_wall_ext_11: createWall({ material: "brick", extents: v2.create(0.5, 5.5) }), brick_wall_ext_12: createWall({ material: "brick", extents: v2.create(0.5, 6) }), brick_wall_ext_12_5: createWall({ material: "brick", extents: v2.create(0.5, 6.25) }), brick_wall_ext_13: createWall({ material: "brick", extents: v2.create(0.5, 6.5) }), brick_wall_ext_14: createWall({ material: "brick", extents: v2.create(0.5, 7) }), brick_wall_ext_15: createWall({ material: "brick", extents: v2.create(0.5, 7.5) }), brick_wall_ext_16: createWall({ material: "brick", extents: v2.create(0.5, 8) }), brick_wall_ext_17: createWall({ material: "brick", extents: v2.create(0.5, 8.5) }), brick_wall_ext_18: createWall({ material: "brick", extents: v2.create(0.5, 9) }), brick_wall_ext_19: createWall({ material: "brick", extents: v2.create(0.5, 9.5) }), brick_wall_ext_20: createWall({ material: "brick", extents: v2.create(0.5, 10) }), brick_wall_ext_21: createWall({ material: "brick", extents: v2.create(0.5, 10.5) }), brick_wall_ext_23: createWall({ material: "brick", extents: v2.create(0.5, 11.5) }), brick_wall_ext_33: createWall({ material: "brick", extents: v2.create(0.5, 16.5) }), brick_wall_ext_41: createWall({ material: "brick", extents: v2.create(0.5, 20.5) }), brick_wall_ext_short_7: createWall({ material: "brick", extents: v2.create(0.5, 3.5), height: 0.5 }), brick_wall_ext_thicker_4: createWall({ material: "brick", extents: v2.create(1.5, 2) }), brick_wall_ext_thicker_5: createWall({ material: "brick", extents: v2.create(1.5, 2.5) }), brick_wall_ext_thicker_6: createWall({ material: "brick", extents: v2.create(1.5, 3) }), brick_wall_ext_thicker_7: createWall({ material: "brick", extents: v2.create(1.5, 3.5) }), brick_wall_ext_thicker_8: createWall({ material: "brick", extents: v2.create(1.5, 4) }), brick_wall_ext_thicker_9: createWall({ material: "brick", extents: v2.create(1.5, 4.5) }), brick_wall_ext_thicker_15: createWall({ material: "brick", extents: v2.create(1.5, 7.5) }), brick_wall_ext_thicker_16: createWall({ material: "brick", extents: v2.create(1.5, 8) }), brick_wall_ext_thicker_24: createWall({ material: "brick", extents: v2.create(1.5, 12) }), concrete_wall_ext_thin_6: createWall({ material: "concrete", extents: v2.create(0.375, 3) }), concrete_wall_ext_1_5: createWall({ material: "concrete", extents: v2.create(0.5, 0.75) }), concrete_wall_ext_2: createWall({ material: "concrete", extents: v2.create(0.5, 1) }), concrete_wall_ext_3: createWall({ material: "concrete", extents: v2.create(0.5, 1.5) }), concrete_wall_ext_4: createWall({ material: "concrete", extents: v2.create(0.5, 2) }), concrete_wall_ext_5: createWall({ material: "concrete", extents: v2.create(0.5, 2.5) }), concrete_wall_ext_6: createWall({ material: "concrete", extents: v2.create(0.5, 3) }), concrete_wall_ext_7: createWall({ material: "concrete", extents: v2.create(0.5, 3.5) }), concrete_wall_ext_8: createWall({ material: "concrete", extents: v2.create(0.5, 4) }), concrete_wall_ext_9: createWall({ material: "concrete", extents: v2.create(0.5, 4.5) }), concrete_wall_ext_9_5: createWall({ material: "concrete", extents: v2.create(0.5, 4.75) }), concrete_wall_ext_10_5: createWall({ material: "concrete", extents: v2.create(0.5, 5.25) }), concrete_wall_ext_11: createWall({ material: "concrete", extents: v2.create(0.5, 5.5) }), concrete_wall_ext_11_5: createWall({ material: "concrete", extents: v2.create(0.5, 5.75) }), concrete_wall_ext_13: createWall({ material: "concrete", extents: v2.create(0.5, 6.5) }), concrete_wall_ext_14: createWall({ material: "concrete", extents: v2.create(0.5, 7) }), concrete_wall_ext_15: createWall({ material: "concrete", extents: v2.create(0.5, 7.5) }), concrete_wall_ext_16: createWall({ material: "concrete", extents: v2.create(0.5, 8) }), concrete_wall_ext_17: createWall({ material: "concrete", extents: v2.create(0.5, 8.5) }), concrete_wall_ext_23: createWall({ material: "concrete", extents: v2.create(0.5, 11.5) }), concrete_wall_ext_24: createWall({ material: "concrete", extents: v2.create(0.5, 12) }), concrete_wall_ext_25: createWall({ material: "concrete", extents: v2.create(0.5, 12.5) }), concrete_wall_column_4x8: createWall({ material: "concrete", extents: v2.create(2, 4) }), concrete_wall_column_4x9: createWall({ material: "concrete", extents: v2.create(2, 4.5) }), concrete_wall_column_4x24: createWall({ material: "concrete", extents: v2.create(2, 12) }), concrete_wall_column_5x10: createWall({ material: "concrete", extents: v2.create(2.5, 5) }), concrete_wall_column_7x10: createWall({ material: "concrete", extents: v2.create(3.5, 5) }), concrete_wall_ext_thick_11: createWall({ material: "concrete", extents: v2.create(1, 5.5) }), concrete_wall_ext_thicker_4: createWall({ material: "concrete", extents: v2.create(1.5, 2) }), concrete_wall_ext_thicker_5: createWall({ material: "concrete", extents: v2.create(1.5, 2.5) }), concrete_wall_ext_thicker_6: createWall({ material: "concrete", extents: v2.create(1.5, 3) }), concrete_wall_ext_thicker_8: createWall({ material: "concrete", extents: v2.create(1.5, 4) }), concrete_wall_ext_thicker_9: createWall({ material: "concrete", extents: v2.create(1.5, 4.5) }), concrete_wall_ext_thicker_10: createWall({ material: "concrete", extents: v2.create(1.5, 5) }), concrete_wall_ext_thicker_11: createWall({ material: "concrete", extents: v2.create(1.5, 5.5) }), concrete_wall_ext_thicker_12: createWall({ material: "concrete", extents: v2.create(1.5, 6) }), concrete_wall_ext_thicker_13: createWall({ material: "concrete", extents: v2.create(1.5, 6.5) }), concrete_wall_ext_thicker_14: createWall({ material: "concrete", extents: v2.create(1.5, 7) }), concrete_wall_ext_thicker_15: createWall({ material: "concrete", extents: v2.create(1.5, 7.5) }), concrete_wall_ext_thicker_17: createWall({ material: "concrete", extents: v2.create(1.5, 8.5) }), concrete_wall_ext_thicker_19: createWall({ material: "concrete", extents: v2.create(1.5, 9.5) }), concrete_wall_ext_thicker_21: createWall({ material: "concrete", extents: v2.create(1.5, 10.5) }), concrete_wall_ext_thicker_22: createWall({ material: "concrete", extents: v2.create(1.5, 11) }), concrete_wall_ext_thicker_27: createWall({ material: "concrete", extents: v2.create(1.5, 13.5) }), concrete_wall_ext_thicker_30: createWall({ material: "concrete", extents: v2.create(1.5, 15) }), concrete_wall_ext_thicker_31: createWall({ material: "concrete", extents: v2.create(1.5, 15.5) }), concrete_wall_ext_thicker_42: createWall({ material: "concrete", extents: v2.create(1.5, 21) }), concrete_wall_ext_thicker_54: createWall({ material: "concrete", extents: v2.create(1.5, 27) }), metal_wall_ext_3: createWall({ material: "metal", extents: v2.create(0.5, 1.5) }), metal_wall_ext_4: createWall({ material: "metal", extents: v2.create(0.5, 2) }), metal_wall_ext_5: createWall({ material: "metal", extents: v2.create(0.5, 2.5) }), metal_wall_ext_6: createWall({ material: "metal", extents: v2.create(0.5, 3) }), metal_wall_ext_7: createWall({ material: "metal", extents: v2.create(0.5, 3.5) }), metal_wall_ext_8: createWall({ material: "metal", extents: v2.create(0.5, 4) }), metal_wall_ext_9: createWall({ material: "metal", extents: v2.create(0.5, 4.5) }), metal_wall_ext_10: createWall({ material: "metal", extents: v2.create(0.5, 5) }), metal_wall_ext_12: createWall({ material: "metal", extents: v2.create(0.5, 6) }), metal_wall_ext_12_5: createWall({ material: "metal", extents: v2.create(0.5, 6.25) }), metal_wall_ext_13: createWall({ material: "metal", extents: v2.create(0.5, 6.5) }), metal_wall_ext_18: createWall({ material: "metal", extents: v2.create(0.5, 9) }), metal_wall_ext_23: createWall({ material: "metal", extents: v2.create(0.5, 11.5) }), metal_wall_ext_43: createWall({ material: "metal", extents: v2.create(0.5, 21.5) }), metal_wall_ext_short_6: createWall({ material: "metal", extents: v2.create(0.5, 3), height: 0.5 }), metal_wall_ext_short_7: createWall({ material: "metal", extents: v2.create(0.5, 3.5), height: 0.5 }), metal_wall_ext_thick_6: createWall({ material: "metal", extents: v2.create(1, 3) }), metal_wall_ext_thick_12: createWall({ material: "metal", extents: v2.create(1, 6) }), metal_wall_ext_thick_20: createWall({ material: "metal", extents: v2.create(1, 10) }), metal_wall_ext_thicker_4: createWall({ material: "metal", extents: v2.create(1.5, 2) }), metal_wall_ext_thicker_5: createWall({ material: "metal", extents: v2.create(1.5, 2.5) }), metal_wall_ext_thicker_6: createWall({ material: "metal", extents: v2.create(1.5, 3) }), metal_wall_ext_thicker_7: createWall({ material: "metal", extents: v2.create(1.5, 3.5) }), metal_wall_ext_thicker_8: createWall({ material: "metal", extents: v2.create(1.5, 4) }), metal_wall_ext_thicker_9: createWall({ material: "metal", extents: v2.create(1.5, 4.5) }), metal_wall_ext_thicker_10: createWall({ material: "metal", extents: v2.create(1.5, 5) }), metal_wall_ext_thicker_11: createWall({ material: "metal", extents: v2.create(1.5, 5.5) }), metal_wall_ext_thicker_12: createWall({ material: "metal", extents: v2.create(1.5, 6) }), metal_wall_ext_thicker_13: createWall({ material: "metal", extents: v2.create(1.5, 6.5) }), metal_wall_ext_thicker_14: createWall({ material: "metal", extents: v2.create(1.5, 7) }), metal_wall_ext_thicker_15: createWall({ material: "metal", extents: v2.create(1.5, 7.5) }), metal_wall_ext_thicker_16: createWall({ material: "metal", extents: v2.create(1.5, 8) }), metal_wall_ext_thicker_17: createWall({ material: "metal", extents: v2.create(1.5, 8.5) }), metal_wall_ext_thicker_18: createWall({ material: "metal", extents: v2.create(1.5, 9) }), metal_wall_ext_thicker_19: createWall({ material: "metal", extents: v2.create(1.5, 9.5) }), metal_wall_ext_thicker_20: createWall({ material: "metal", extents: v2.create(1.5, 10) }), metal_wall_ext_thicker_21: createWall({ material: "metal", extents: v2.create(1.5, 10.5) }), metal_wall_ext_thicker_22: createWall({ material: "metal", extents: v2.create(1.5, 11) }), metal_wall_ext_thicker_23: createWall({ material: "metal", extents: v2.create(1.5, 11.5) }), metal_wall_ext_thicker_24: createWall({ material: "metal", extents: v2.create(1.5, 12) }), metal_wall_ext_thicker_25: createWall({ material: "metal", extents: v2.create(1.5, 12.5) }), metal_wall_ext_thicker_26: createWall({ material: "metal", extents: v2.create(1.5, 13) }), metal_wall_ext_thicker_27: createWall({ material: "metal", extents: v2.create(1.5, 13.5) }), metal_wall_ext_thicker_28: createWall({ material: "metal", extents: v2.create(1.5, 14.5) }), metal_wall_ext_thicker_29: createWall({ material: "metal", extents: v2.create(1.5, 14.5) }), metal_wall_ext_thicker_32: createWall({ material: "metal", extents: v2.create(1.5, 16) }), metal_wall_ext_thicker_34: createWall({ material: "metal", extents: v2.create(1.5, 17) }), metal_wall_ext_thicker_35: createWall({ material: "metal", extents: v2.create(1.5, 17.5) }), metal_wall_ext_thicker_42: createWall({ material: "metal", extents: v2.create(1.5, 21) }), metal_wall_ext_thicker_48: createWall({ material: "metal", extents: v2.create(1.5, 24) }), glass_wall_9: createWall({ material: "glass", extents: v2.create(0.5, 4.5), health: 100, img: wallImg("map-wall-glass-9.img") }), glass_wall_10: createWall({ material: "glass", extents: v2.create(0.5, 5), health: 50, img: wallImg("map-wall-glass-10.img") }), glass_wall_12: createWall({ material: "glass", extents: v2.create(0.5, 6), health: 50, img: wallImg("map-wall-glass-12.img") }), glass_wall_12_2: createWall({ material: "glass", extents: v2.create(1, 6), health: 5e3, img: wallImg("map-wall-glass-12-2.img") }), glass_wall_18: createWall({ material: "glass", extents: v2.create(0.5, 9), health: 150, img: wallImg("map-wall-glass-18.img") }), panicroom_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(4.5, 6)) ] } ], imgs: [ { sprite: "map-building-panicroom-floor.img", scale: 0.5, alpha: 1, tint: 6250335 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(4.5, 6) ) } ], imgs: [ { sprite: "map-building-panicroom-ceiling.img", scale: 0.5, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_12", pos: v2.create(-4, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_3", pos: v2.create(-2, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_7", pos: v2.create(0, -5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_12", pos: v2.create(4, 0), scale: 1, ori: 0 }, { type: "loot_tier_2", pos: v2.create(0, -0.05), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, "": 1 }), pos: v2.create(0, 0.05), scale: 1, ori: 0 } ] }, barn_basement_stairs_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [], imgs: [ { sprite: "map-building-barn-basement-stairs.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "concrete_wall_ext_8", pos: v2.create(4, 2), scale: 1, ori: 0 }, { type: "concrete_wall_column_4x8", pos: v2.create(-2.5, 2), scale: 1, ori: 0 }, { type: "concrete_wall_column_4x9", pos: v2.create(0, -4), scale: 1, ori: 1 } ] }, barn_basement_floor_01: createBarnBasement({}), barn_basement_floor_01d: createBarnBasement({ basement: "barn_basement_floor_02d" }), barn_basement_floor_02: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [ { sprite: "map-building-barn-basement-floor-02.img", pos: v2.create(-2, -0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-1, -1), v2.create(5, 6) ) } ], imgs: [ { sprite: "map-building-barn-basement-ceiling-02.img", pos: v2.create(-1.4, 0), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "chest_04", pos: v2.create(-1, -0.5), scale: 1, ori: 1 } ] }, barn_basement_floor_02d: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [ { sprite: "map-building-barn-basement-floor-02.img", pos: v2.create(-2, -0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-1, -1), v2.create(5, 6) ) } ], imgs: [ { sprite: "map-building-barn-basement-ceiling-02.img", pos: v2.create(-1.4, 0), scale: 1, alpha: 1, tint: 6182731 } ] }, mapObjects: [ { type: "chest_04d", pos: v2.create(-1, -0.5), scale: 1, ori: 1 } ] }, barn_basement_structure_01: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(30, 30)) ], layers: [ { type: "barn_basement_stairs_01", pos: v2.create(0, 0), ori: 0 }, { type: "barn_basement_floor_01", pos: v2.create(-10, -0.5), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(1.5, 1.5), v2.create(2, 3.5) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(-12.5, -1), v2.create(12, 8.5)), collider.createAabbExtents(v2.create(3.51, -6), v2.create(4, 4)) ] }, barn_basement_structure_01d: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(30, 30)) ], layers: [ { type: "barn_basement_stairs_01", pos: v2.create(0, 0), ori: 0 }, { type: "barn_basement_floor_01d", pos: v2.create(-10, -0.5), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(1.5, 1.5), v2.create(2, 3.5) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(-12.5, -1), v2.create(12, 8.5)), collider.createAabbExtents(v2.create(3.51, -6), v2.create(4, 4)) ] }, barn_wall_int_2: createWall({ material: "wood", extents: v2.create(0.5, 1), hitParticle: "ltgreenChip", img: wallImg("map-wall-02-rounded.img", 7173701) }), barn_wall_int_2_5: createWall({ material: "wood", extents: v2.create(0.5, 1.25), hitParticle: "ltgreenChip", img: wallImg("map-wall-02-5-rounded.img", 7173701) }), barn_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), hitParticle: "ltgreenChip", img: wallImg("map-wall-04-rounded.img", 7173701) }), barn_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-05-rounded.img", 7173701) }), barn_wall_int_6: createWall({ material: "wood", extents: v2.create(0.5, 3), hitParticle: "ltgreenChip", img: wallImg("map-wall-06-rounded.img", 7173701) }), barn_wall_int_7: createWall({ material: "wood", extents: v2.create(0.5, 3.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-07-rounded.img", 7173701) }), barn_wall_int_8: createWall({ material: "wood", extents: v2.create(0.5, 4), hitParticle: "ltgreenChip", img: wallImg("map-wall-08-rounded.img", 7173701) }), barn_wall_int_11: createWall({ material: "wood", extents: v2.create(0.5, 5.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-11-rounded.img", 7173701) }), barn_wall_int_13: createWall({ material: "wood", extents: v2.create(0.5, 6.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-13-rounded.img", 7173701) }), barn_column_1: createWall({ material: "concrete", extents: v2.create(1, 1), hitParticle: "ltgreenChip", img: wallImg("map-column-01.img", 2764060) }), barn_01: createBarn({ bonus_door: "house_door_02" }), barn_01h: createBarn({ porch_01: "cache_pumpkin_02", bonus_door: "house_door_02" }), barn_01x: createBarn({ ceiling: { imgs: [ { sprite: "map-building-barn-ceiling-01.img", pos: v2.create(0, -2), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-barn-ceiling-02.img", pos: v2.create(0, 13.2), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-snow-01.img", pos: v2.create(-14.5, 5.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-02.img", pos: v2.create(-0.5, -9), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-03.img", pos: v2.create(14.5, 5.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] }, bonus_door: "house_door_02" }), barn_02: createBarn({ bonus_room: "barn_basement_structure_01", bonus_door: "", map: { displayType: "barn_01" } }), barn_02d: createBarn({ bonus_room: "barn_basement_structure_01d", bonus_door: "", map: { displayType: "barn_01" } }), bank_wall_int_3: createWall({ material: "wood", extents: v2.create(0.5, 1.5), img: wallImg("map-wall-03-rounded.img", 7951934) }), bank_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), img: wallImg("map-wall-04-rounded.img", 7951934) }), bank_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), img: wallImg("map-wall-05-rounded.img", 7951934) }), bank_wall_int_8: createWall({ material: "wood", extents: v2.create(0.5, 4), img: wallImg("map-wall-08-rounded.img", 7951934) }), bank_01: createBank({}), bank_01b: createBank({ vault: "vault_01b" }), bank_01x: createBank({ ceiling: { imgs: [ { sprite: "map-building-bank-ceiling-01.img", pos: v2.create(-16, 7), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-bank-ceiling-02.img", pos: v2.create(6, 0), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-bank-ceiling-03.img", pos: v2.create(22, 8), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-02.img", pos: v2.create(-13, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-04.img", pos: v2.create(1.25, 9.25), scale: 1, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-06.img", pos: v2.create(13.75, 15.25), scale: 0.75, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-06.img", pos: v2.create(15.25, -15.75), scale: 0.75, alpha: 1, tint: 16777215, rot: 1 } ] } }), vault_door_main: createDoor({ material: "metal", hinge: v2.create(1, 3.5), extents: v2.create(1, 3.5), img: { sprite: "map-door-02.img" }, door: { interactionRad: 1.5, openSpeed: 0.23, openOneWay: -1, openDelay: 4.1, openOnce: true, spriteAnchor: v2.create(0.2, 1), sound: { open: "none", close: "none", change: "vault_change_01" } } }), vault_01: createBankVault({}), vault_01b: createBankVault({ gold_box: 9, floor_loot: "loot_tier_stonehammer" }), police_wall_int_2: createWall({ material: "wood", extents: v2.create(0.5, 1), img: wallImg("map-wall-02-rounded.img", 1777447) }), police_wall_int_3: createWall({ material: "wood", extents: v2.create(0.5, 1.5), img: wallImg("map-wall-03-rounded.img", 1777447) }), police_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), img: wallImg("map-wall-04-rounded.img", 1777447) }), police_wall_int_6: createWall({ material: "wood", extents: v2.create(0.5, 3), img: wallImg("map-wall-06-rounded.img", 1777447) }), police_wall_int_7: createWall({ material: "wood", extents: v2.create(0.5, 3.5), img: wallImg("map-wall-07-rounded.img", 1777447) }), police_wall_int_8: createWall({ material: "wood", extents: v2.create(0.5, 4), img: wallImg("map-wall-08-rounded.img", 1777447) }), police_wall_int_10: createWall({ material: "wood", extents: v2.create(0.5, 5), img: wallImg("map-wall-10-rounded.img", 1777447) }), police_01: createPoliceStation({}), police_01x: createPoliceStation({ ceiling: { imgs: [ { sprite: "map-building-police-ceiling-01.img", pos: v2.create(-21.5, 8.5), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-police-ceiling-02.img", pos: v2.create(10.5, 0), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-police-ceiling-03.img", pos: v2.create(31.96, 12.5), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-01.img", pos: v2.create(13, 17.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 3 }, { sprite: "map-snow-02.img", pos: v2.create(-21, 14), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-03.img", pos: v2.create(30.25, 6.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-07.img", pos: v2.create(4.5, -3.25), scale: 0.6, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-06.img", pos: v2.create(-40.25, 14.75), scale: 0.75, alpha: 1, tint: 16777215, rot: 3 }, { sprite: "map-snow-06.img", pos: v2.create(-38.75, 0.75), scale: 0.75, alpha: 1, tint: 16777215, rot: 2 } ] } }), house_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), hitParticle: "tanChip", img: wallImg("map-wall-04-rounded.img", 10584424) }), house_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "tanChip", img: wallImg("map-wall-05-rounded.img", 10584424) }), house_wall_int_8: createWall({ material: "wood", extents: v2.create(0.5, 4), hitParticle: "tanChip", img: wallImg("map-wall-08-rounded.img", 10584424) }), house_wall_int_9: createWall({ material: "wood", extents: v2.create(0.5, 4.5), hitParticle: "tanChip", img: wallImg("map-wall-09-rounded.img", 10584424) }), house_wall_int_11: createWall({ material: "wood", extents: v2.create(0.5, 5.5), hitParticle: "tanChip", img: wallImg("map-wall-11-rounded.img", 10584424) }), house_wall_int_14: createWall({ material: "wood", extents: v2.create(0.5, 7), hitParticle: "tanChip", img: wallImg("map-wall-14-rounded.img", 10584424) }), house_column_1: createWall({ material: "concrete", extents: v2.create(1, 1), hitParticle: "tanChip", img: wallImg("map-column-01.img", 5587506) }), house_red_01: createHouseRed({ stand: "stand_01" }), house_red_01h: createHouseRed({ porch_01: "cache_pumpkin_02", stand: "stand_01" }), house_red_01x: createHouseRed({ ceiling: { imgs: [ { sprite: "map-building-house-ceiling.img", scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-01.img", pos: v2.create(-5.5, 8.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-snow-02.img", pos: v2.create(4.5, -7), scale: 0.5, alpha: 1, tint: 16777215 } ] } }), house_red_02: createHouseRed2({ stand: "stand_01" }), house_red_02h: createHouseRed2({ porch_01: "cache_pumpkin_02", stand: "stand_01" }), house_red_02x: createHouseRed2({ ceiling: { imgs: [ { sprite: "map-building-house-ceiling.img", scale: 0.667, alpha: 1, tint: 13619151, rot: 2 }, { sprite: "map-snow-02.img", pos: v2.create(3.5, 6), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-01.img", pos: v2.create(-4.5, -8), scale: 0.5, alpha: 1, tint: 16777215, rot: 3 } ] } }), cabin_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "tanChip", img: wallImg("map-wall-05-rounded.img", 10584424) }), cabin_wall_int_10: createWall({ material: "wood", extents: v2.create(0.5, 5), hitParticle: "tanChip", img: wallImg("map-wall-10-rounded.img", 10584424) }), cabin_wall_int_13: createWall({ material: "wood", extents: v2.create(0.5, 6.5), hitParticle: "tanChip", img: wallImg("map-wall-13-rounded.img", 10584424) }), cabin_01: createCabin({}), cabin_01x: createCabin({ ceiling: { imgs: [ { sprite: "map-building-cabin-ceiling-01a.img", pos: v2.create(0, 0.5), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-building-cabin-ceiling-01b.img", pos: v2.create(4, -13), scale: 0.667, alpha: 1, tint: 16777215 }, { sprite: "map-snow-01.img", pos: v2.create(-13, 6), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-02.img", pos: v2.create(-3.5, -6.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-03.img", pos: v2.create(10.75, 8.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-chimney-01.img", pos: v2.create(13, 2), scale: 0.5, alpha: 1, tint: 16777215, removeOnDamaged: true } ] } }), cabin_02: createCabin({ cabin_mount: "gun_mount_02", porch_01: "cache_pumpkin_02" }), dock_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(2.5, 0), v2.create(2.4, 10.25) ), color: 8862486 }, { collider: collider.createAabbExtents( v2.create(-2.45, 7.75), v2.create(2.6, 2.5) ), color: 8862486 } ] }, terrain: { grass: true, beach: false, bridge: { nearbyWidthMult: 0.75 } }, bridgeLandBounds: [ collider.createAabbExtents(v2.create(2.5, -10.5), v2.create(2.5, 1.5)) ], bridgeWaterBounds: [ collider.createAabbExtents(v2.create(0, 7.75), v2.create(5.5, 3.5)) ], zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(2.5, 0), v2.create(2.4, 10.25) ), collider.createAabbExtents( v2.create(-2.45, 7.75), v2.create(2.6, 2.5) ) ] } ], imgs: [ { sprite: "map-building-dock-floor-01a.img", pos: v2.create(-2.5, 7.85), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-dock-floor-01b.img", pos: v2.create(2.5, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "bollard_01", pos: v2.create(-4.25, 7.75), scale: 0.8, ori: 2 }, { type: randomObstacleType({ barrel_01: 1, crate_01: 1 }), pos: v2.create(3, 8.25), scale: 0.75, ori: 0 } ] }, mansion_wall_int_1: createWall({ material: "wood", extents: v2.create(0.5, 0.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-01-rounded.img", 16768917) }), mansion_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-05-rounded.img", 16768917) }), mansion_wall_int_6: createWall({ material: "wood", extents: v2.create(0.5, 3), hitParticle: "ltgreenChip", img: wallImg("map-wall-06-rounded.img", 16768917) }), mansion_wall_int_7: createWall({ material: "wood", extents: v2.create(0.5, 3.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-07-rounded.img", 16768917) }), mansion_wall_int_8: createWall({ material: "wood", extents: v2.create(0.5, 4), hitParticle: "ltgreenChip", img: wallImg("map-wall-08-rounded.img", 16768917) }), mansion_wall_int_9: createWall({ material: "wood", extents: v2.create(0.5, 4.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-09-rounded.img", 16768917) }), mansion_wall_int_10: createWall({ material: "wood", extents: v2.create(0.5, 5), hitParticle: "ltgreenChip", img: wallImg("map-wall-10-rounded.img", 16768917) }), mansion_wall_int_11: createWall({ material: "wood", extents: v2.create(0.5, 5.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-11-rounded.img", 16768917) }), mansion_wall_int_12: createWall({ material: "wood", extents: v2.create(0.5, 6), hitParticle: "ltgreenChip", img: wallImg("map-wall-12-rounded.img", 16768917) }), mansion_wall_int_13: createWall({ material: "wood", extents: v2.create(0.5, 6.5), hitParticle: "ltgreenChip", img: wallImg("map-wall-13-rounded.img", 16768917) }), mansion_column_1: createWall({ material: "concrete", extents: v2.create(1, 1), hitParticle: "tanChip", img: wallImg("map-column-01.img", 7432016) }), saferoom_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(6, 4)) ] } ], imgs: [ { sprite: "map-building-saferoom-floor.img", scale: 0.5, alpha: 1, tint: 6250335 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(0, 0), v2.create(5, 3)) } ], imgs: [ { sprite: "map-building-saferoom-ceiling.img", scale: 0.5, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_7", pos: v2.create(-5, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_6", pos: v2.create(1.5, 3), scale: 1, ori: 1 }, { type: "metal_wall_ext_9", pos: v2.create(0, -3), scale: 1, ori: 1 }, { type: "metal_wall_ext_7", pos: v2.create(5, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ case_01: 1, case_02: 0.025, chest_02: 1 }), pos: v2.create(2.5, 0), scale: 1, ori: 3 } ] }, mansion_01: createMansion({}), mansion_01x: createMansion({ ceiling: { imgs: [ { sprite: "map-building-mansion-ceiling.img", scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-snow-01.img", pos: v2.create(6, 19.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-02.img", pos: v2.create(-16, 8), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-03.img", pos: v2.create(20.25, -1.75), scale: 0.5, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-04.img", pos: v2.create(10.25, -13.25), scale: 1, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-05.img", pos: v2.create(10.25, 6.25), scale: 1, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-07.img", pos: v2.create(-21.25, -20.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-snow-06.img", pos: v2.create(-29.75, 13.25), scale: 0.75, alpha: 1, tint: 16777215, rot: 3 } ] }, tree: "tree_11", tree_scale: 1, tree_loot: "loot_tier_1", bush_chance: 999 }), mansion_02: createMansion({ decoration_01: "decal_web_01", decoration_02: "candle_lit_01", porch_01: "cache_pumpkin_02", entry_loot: "" }), mansion_cellar_01: createMansionCellar({}), mansion_cellar_02: createMansionCellar({ decoration_01: "decal_web_01", decoration_02: "candle_lit_01", mid_obs_01: "pumpkin_01" }), mansion_structure_01: { type: "structure", terrain: { grass: true, beach: false }, layers: [ { type: "mansion_01", pos: v2.create(0, 0), ori: 0 }, { type: "mansion_cellar_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(28, 1.5), v2.create(3, 2.55) ), downDir: v2.create(-1, 0), noCeilingReveal: true }, { collision: collider.createAabbExtents( v2.create(1, 13.5), v2.create(2, 3.5) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(10, -0.1), v2.create(15, 10.1)), collider.createAabbExtents(v2.create(17.5, 13.5), v2.create(7.49, 3.49)) ] }, mansion_structure_02: { type: "structure", terrain: { grass: true, beach: false }, layers: [ { type: "mansion_02", pos: v2.create(0, 0), ori: 0 }, { type: "mansion_cellar_02", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(28, 1.5), v2.create(3, 2.55) ), downDir: v2.create(-1, 0), noCeilingReveal: true }, { collision: collider.createAabbExtents( v2.create(1, 13.5), v2.create(2, 3.5) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(10, -0.1), v2.create(15, 10.1)), collider.createAabbExtents(v2.create(17.5, 13.5), v2.create(7.49, 3.49)) ] }, saloon_column_1: createWall({ material: "woodPerm", extents: v2.create(1, 1), hitParticle: "blackChip", img: wallImg("map-column-01.img", 1710618) }), saloon_bar_small: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 5)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), saloon_bar_large: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 7.5)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), saloon_bar_back_large: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 5)), img: { sprite: "map-saloon-bar-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 } }), saloon_bar_back_small: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 1.5)), img: { sprite: "map-saloon-bar-02.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 } }), saloon_door_secret: createDoor({ destructible: false, material: "wood", hitParticle: "woodChip", hinge: v2.create(0, 2), extents: v2.create(0.75, 2), door: { canUse: false, openOnce: true, openOneWay: false, openSpeed: 36, autoOpen: false, autoClose: false, slideToOpen: true, slideOffset: 4.5, sound: { open: "" } }, img: { sprite: "map-door-04.img", residue: "map-drawers-res.img", scale: 0.5, tint: 16777215, zIdx: 9 } }), wood_perm_wall_ext_5: createWall({ material: "woodPerm", extents: v2.create(0.5, 2.5), hitParticle: "blackChip" }), wood_perm_wall_ext_6: createWall({ material: "woodPerm", extents: v2.create(0.5, 3), hitParticle: "blackChip" }), wood_perm_wall_ext_7: createWall({ material: "woodPerm", extents: v2.create(0.5, 3.5), hitParticle: "blackChip" }), wood_perm_wall_ext_14: createWall({ material: "woodPerm", extents: v2.create(0.5, 7), hitParticle: "blackChip" }), wood_perm_wall_ext_17: createWall({ material: "woodPerm", extents: v2.create(0.5, 8.5), hitParticle: "blackChip" }), wood_perm_wall_ext_35: createWall({ material: "woodPerm", extents: v2.create(0.5, 17.5), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_6: createWall({ material: "woodPerm", extents: v2.create(1.5, 3), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_7: createWall({ material: "woodPerm", extents: v2.create(1.5, 3.5), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_8: createWall({ material: "woodPerm", extents: v2.create(1.5, 4), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_10: createWall({ material: "woodPerm", extents: v2.create(1.5, 5), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_12: createWall({ material: "woodPerm", extents: v2.create(1.5, 6), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_13: createWall({ material: "woodPerm", extents: v2.create(1.5, 6.5), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_18: createWall({ material: "woodPerm", extents: v2.create(1.5, 9), hitParticle: "blackChip" }), wood_perm_wall_ext_thicker_21: createWall({ material: "woodPerm", extents: v2.create(1.5, 10.5), hitParticle: "blackChip" }), saloon_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(20.5, 20.5) ), color: 5252110 }, { collider: collider.createAabbExtents( v2.create(-1, 1), v2.create(19, 19) ), color: 4337194 }, { collider: collider.createAabbExtents( v2.create(-3, 3), v2.create(17, 17) ), color: 2499104 }, { collider: collider.createAabbExtents( v2.create(-23.5, 1), v2.create(3, 2) ), color: 3485483 } ] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(22.5, 22.5)) ], zIdx: 1, floor: { surfaces: [ { type: "house", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(20.5, 20.5) ), collider.createAabbExtents(v2.create(-23.5, 1), v2.create(3, 2)) ] } ], imgs: [ { sprite: "map-building-saloon-floor-01.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-saloon-ceiling-02.img", pos: v2.create(-23.5, 1), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-1, 1), v2.create(19, 19) ), zoomOut: collider.createAabbExtents( v2.create(1, -1), v2.create(21.5, 21.5) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, damage: { obstacleCount: 1 }, imgs: [ { sprite: "map-building-saloon-ceiling-01.img", pos: v2.create(0, 0), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-building-saloon-ceiling-02.img", pos: v2.create(-23.5, 1), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-chimney-01.img", pos: v2.create(-3, 3), scale: 0.5, alpha: 1, tint: 16777215, removeOnDamaged: true } ] }, occupiedEmitters: [ { type: "cabin_smoke_parent", pos: v2.create(0, 0), rot: 0, scale: 1, layer: 0, parentToCeiling: true } ], puzzle: { name: "saloon", completeUseType: "saloon_door_secret", completeOffDelay: 1, completeUseDelay: 2, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "piano_02" } }, mapObjects: [ { type: "wood_perm_wall_ext_17", pos: v2.create(-20, 11), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_5", pos: v2.create(-23, 3), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_5", pos: v2.create(-26, 1), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_5", pos: v2.create(-22, 1), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_5", pos: v2.create(-23, -1), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_14", pos: v2.create(-20, -7.5), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_35", pos: v2.create(-3, 20), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_6", pos: v2.create(-16.5, -14), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-12, -14.25), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_7", pos: v2.create(-7, -14), scale: 1, ori: 1 }, { type: "house_window_01", pos: v2.create(-2, -14.25), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_7", pos: v2.create(3, -14), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_6", pos: v2.create(14, 16.5), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(14.25, 12), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_7", pos: v2.create(14, 7), scale: 1, ori: 0 }, { type: "house_window_01", pos: v2.create(14.25, 2), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_7", pos: v2.create(14, -3), scale: 1, ori: 0 }, { type: "saloon_bar_back_large", pos: v2.create(-18.75, 7.5), scale: 1, ori: 0 }, { type: "saloon_door_secret", pos: v2.create(-18.75, 2.5), scale: 1, ori: 2 }, { type: "saloon_bar_back_small", pos: v2.create(-18.75, -2), scale: 1, ori: 0 }, { type: "bottle_01", pos: v2.create(-18.75, 11.25), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-18.75, 10), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-18.75, 9), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-18.75, 6), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-18.75, 5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-18.75, 3.75), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_02v", pos: v2.create(-18.75, -1.75), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "violet" }, { type: "saloon_bar_large", pos: v2.create(-11, 5), scale: 1, ori: 0 }, { type: "saloon_bar_small", pos: v2.create(-14.5, -4), scale: 1, ori: 1 }, { type: "bottle_01", pos: v2.create(-10.75, 11), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_02r", pos: v2.create(-11, 8), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "red" }, { type: "bottle_01", pos: v2.create(-11, 6.25), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-10.75, 5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-11, 1.5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-10.75, -1), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_02b", pos: v2.create(-11, -2.5), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "blue" }, { type: "bottle_01", pos: v2.create(-13, -4), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-15, -4.25), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_01", pos: v2.create(-16.5, -4), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_02", pos: v2.create(-17.5, 17.5), scale: 1, ori: 0, puzzlePiece: "barrel" }, { type: "piano_01", pos: v2.create(-18, -9.5), scale: 1, ori: 1 }, { type: "loot_tier_1", pos: v2.create(-16, -9.5), scale: 1, ori: 1 }, { type: randomObstacleType({ gun_mount_01: 100, gun_mount_02: 10 }), pos: v2.create(-0.5, 18.75), scale: 1, ori: 0, puzzlePiece: "gun" }, { type: "barrel_02", pos: v2.create(-3, -7), scale: 0.9, ori: 0 }, { type: "barrel_02", pos: v2.create(-0.5, -4.5), scale: 0.9, ori: 0 }, { type: "stove_02", pos: v2.create(-3, 3), scale: 1, ori: 0 }, { type: "bottle_02g", pos: v2.create(7.25, 10.5), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "green" }, { type: "table_03", pos: v2.create(7.25, 10.5), scale: 1, ori: 0 }, { type: "table_03", pos: v2.create(7.25, 0.5), scale: 1, ori: 0 }, { type: "bottle_02i", pos: v2.create(12.5, 4.5), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "indigo" }, { type: "crate_01", pos: v2.create(11, 17), scale: 0.9, ori: 0 }, { type: "bottle_02y", pos: v2.create(8, 18.5), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "yellow" }, { type: "crate_01", pos: v2.create(-23, 11.5), scale: 0.9, ori: 0 }, { type: "bush_01", pos: v2.create(-23.5, 7), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-23, -5), scale: 0.9, ori: 0 }, { type: "saloon_column_1", pos: v2.create(-19.5, -17.5), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(-10, -16.5), scale: 0.9, ori: 0 }, { type: "bottle_02o", pos: v2.create(3.75, -17.5), scale: 1, ori: 0, inheritOri: false, puzzlePiece: "orange" }, { type: "saloon_column_1", pos: v2.create(5.5, -17.5), scale: 1, ori: 0, puzzlePiece: "column" }, { type: "saloon_column_1", pos: v2.create(17.5, 19.5), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(16.5, 9), scale: 0.9, ori: 0 }, { type: "saloon_column_1", pos: v2.create(17.5, -5.5), scale: 1, ori: 0 } ] }, saloon_cellar_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "brick", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(15, 9)) ] } ], imgs: [ { sprite: "map-building-saloon-cellar-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(0, 0), v2.create(15, 9)) } ], imgs: [ { sprite: "", pos: v2.create(-2, 3.5), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 7, width: 3 } }, mapObjects: [ { type: "wood_perm_wall_ext_thicker_18", pos: v2.create(-8, 10), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_5", pos: v2.create(1.5, 7), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_12", pos: v2.create(-4.5, 4), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_thicker_13", pos: v2.create(-16, 2), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_8", pos: v2.create(-13.5, -6), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_thicker_7", pos: v2.create(-8, -8), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_13", pos: v2.create(0, -10), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_thicker_7", pos: v2.create(8, -8), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_8", pos: v2.create(13.5, -6), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_thicker_13", pos: v2.create(16, 2), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_10", pos: v2.create(12.5, 10), scale: 1, ori: 1 }, { type: "wood_perm_wall_ext_thicker_6", pos: v2.create(9, 5.5), scale: 1, ori: 0 }, { type: "wood_perm_wall_ext_thicker_21", pos: v2.create(0, 1), scale: 1, ori: 1 }, { type: "loot_tier_saloon", pos: v2.create(0, -4), scale: 1, ori: 0 }, { type: "barrel_04", pos: v2.create(-3, -8.03), scale: 1, ori: 2 }, { type: "barrel_04", pos: v2.create(0, -8.03), scale: 1, ori: 2 }, { type: "barrel_04", pos: v2.create(3, -8.03), scale: 1, ori: 2 }, { type: "recorder_04", pos: v2.create(12.5, 6.5), scale: 1, ori: 0 } ] }, saloon_structure_01: { type: "structure", terrain: { grass: true, beach: false }, layers: [ { type: "saloon_01", pos: v2.create(0, 0), ori: 0 }, { type: "saloon_cellar_01", pos: v2.create(-19, -6), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(-19.5, 0.75), v2.create(1.5, 2) ), downDir: v2.create(-1, 0) } ], mask: [collider.createAabbExtents(v2.create(-30, 0.75), v2.create(10, 5))], interiorSound: { sound: "piano_music_01", soundAlt: "", transitionTime: 5, outsideMaxDist: 10, outsideVolume: 0.25, puzzle: "saloon" } }, teahouse_wall_int_3: createWall({ material: "wood", extents: v2.create(0.5, 1.5), hitParticle: "tanChip", img: wallImg("map-wall-03.img", 5505024, 0.95) }), teahouse_wall_int_4: createWall({ material: "wood", extents: v2.create(0.5, 2), hitParticle: "tanChip", img: wallImg("map-wall-04.img", 5505024, 0.95) }), teahouse_wall_int_5: createWall({ material: "wood", extents: v2.create(0.5, 2.5), hitParticle: "tanChip", img: wallImg("map-wall-05.img", 5505024, 0.95) }), teahouse_wall_int_7: createWall({ material: "wood", extents: v2.create(0.5, 3.5), hitParticle: "tanChip", img: wallImg("map-wall-07.img", 5505024, 0.95) }), teahouse_wall_int_12: createWall({ material: "wood", extents: v2.create(0.5, 6), hitParticle: "tanChip", img: wallImg("map-wall-12.img", 5505024, 0.95) }), teahouse_wall_int_13: createWall({ material: "wood", extents: v2.create(0.5, 6.5), hitParticle: "tanChip", img: wallImg("map-wall-13.img", 5505024, 0.95) }), teahouse_wall_int_14: createWall({ material: "wood", extents: v2.create(0.5, 7), hitParticle: "tanChip", img: wallImg("map-wall-14.img", 5505024, 0.95) }), teahouse_wall_int_18: createWall({ material: "wood", extents: v2.create(0.5, 9), hitParticle: "tanChip", img: wallImg("map-wall-18.img", 5505024, 0.95) }), teahouse_door_01: createLabDoor({ img: { tint: 14537141, alpha: 0.95 }, door: { interactionRad: 2, openOneWay: false, openSpeed: 7, autoOpen: false, autoClose: false, autoCloseDelay: 1, slideToOpen: true, slideOffset: 3.75, sound: { open: "door_open_04", close: "door_open_04", error: "door_error_01" }, casingImg: { sprite: "map-door-slot-02.img", pos: v2.create(-2, 0), scale: 0.5, alpha: 1, tint: 3211264 } } }), teahouse_window_open_01: createLowWall({ img: { tint: 12216619 } }), teahouse_01: function(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(14, 9) ), color: 4608356 }, { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(7.5, 3.75) ), color: 5793921 }, { collider: collider.createAabbExtents( v2.create(9, -10.15), v2.create(2, 1.5) ), color: 7354635 }, { collider: collider.createAabbExtents( v2.create(-9, 10.15), v2.create(2, 1.5) ), color: 7354635 } ] }, terrain: { grass: true, beach: false }, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(14, 9)), collider.createAabbExtents( v2.create(9, -10.15), v2.create(2, 1.5) ), collider.createAabbExtents( v2.create(-9, 10.15), v2.create(2, 1.5) ) ] } ], imgs: [ { sprite: "map-building-teahouse-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-teahouse-floor-02.img", pos: v2.create(9, -10.25), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-teahouse-floor-02.img", pos: v2.create(-9, 10.25), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(12, 7) ), zoomOut: collider.createAabbExtents( v2.create(0, 0), v2.create(14, 9) ) } ], vision: { width: 4 }, imgs: [ { sprite: "map-building-teahouse-ceiling-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ], destroy: { wallCount: 3, particle: "teahouseBreak", particleCount: 25, residue: "map-building-teahouse-res-01.img" } }, mapObjects: [ { type: "teahouse_window_open_01", pos: v2.create(-6.5, -6.75), scale: 1, ori: 1 }, { type: "teahouse_window_open_01", pos: v2.create(11.75, 1.5), scale: 1, ori: 0 }, { type: "teahouse_wall_int_7", pos: v2.create(11.5, -3.5), scale: 1, ori: 0 }, { type: "teahouse_wall_int_4", pos: v2.create(11.5, 5), scale: 1, ori: 0 }, { type: "teahouse_door_01", pos: v2.create(-7, 6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_18", pos: v2.create(2, 6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_3", pos: v2.create(-9.5, -6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_12", pos: v2.create(1, -6.5), scale: 1, ori: 1 }, { type: "teahouse_wall_int_14", pos: v2.create(-11.5, 0), scale: 1, ori: 0 }, { type: "teahouse_door_01", pos: v2.create(7, -6.5), scale: 1, ori: 3 }, { type: "pot_03", pos: v2.create(9.5, 4.5), scale: 1, ori: 0 }, { type: "pot_03", pos: v2.create(-9.5, -1.5), scale: 1, ori: 0 }, { type: "pot_03", pos: v2.create(-9.5, -4.5), scale: 1, ori: 0 }, { type: "case_06", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({}), teapavilion_01: createTeaPavilion({ terrain: { lakeCenter: true } }), teapavilion_01w: createTeaPavilion({ center_loot: "loot_tier_helmet_forest", left_loot: "pot_03b", right_loot: "pot_03c", terrain: { lakeCenter: true } }), teahouse_complex_01s: createTeaHouseComplex({}), teahouse_complex_01su: createTeaHouseComplex({ grass_color: 6460706, tree_small: "tree_08su", tree_large: "tree_08su" }), savannah_patch_01: function(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(20, 16)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(8, 15), v2.create(5, 4)), color: 13084454, roughness: 0.1, offsetDist: 0.5 }, { bound: collider.createAabbExtents( v2.create(-6, -12), v2.create(7, 3) ), color: 13084454, roughness: 0.1, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(-18, 8), v2.create(3, 4)), color: 13084454, roughness: 0.1, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(16, -8), v2.create(3, 6)), color: 13084454, roughness: 0.1, offsetDist: 0.5 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(16, 12)), color: e.grass_color || 16762368, roughness: 0.1, offsetDist: 0.5 } ], floor: { surfaces: [ { type: "grass", data: { isBright: true }, collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(16, 12) ) ] } ], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "crate_21", pos: v2.create(0, 0), scale: 1, ori: 0, inheritOri: false }, { type: e.tree_large || "tree_12", pos: v2.create(-13, 5.5), scale: 1.1, ori: 0 }, { type: e.tree_large || "tree_12", pos: v2.create(10.5, -5), scale: 0.9, ori: 0 }, { type: e.tree_small || "tree_01sv", pos: v2.create(7, 10), scale: 1, ori: 0 }, { type: "bush_01sv", pos: v2.create(-8, -10), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({ grass_color: 15451700, terrain: { grass: true, beach: false, spawnPriority: 1 } }), kopje_patch_01: function(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(45, 35)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(40, 30)), color: e.grass_color || 16762368, roughness: 0.2, offsetDist: 3 }, { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(16, 12)), color: 5862162, roughness: 0.2, offsetDist: 1 } ], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "crate_21", pos: v2.create(-2.5, 0), scale: 1, ori: 0, inheritOri: false }, { type: "crate_21", pos: v2.create(2.5, 0), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(0, 5), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(0, -5), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 3, "": 1 }), pos: v2.create(-39.5, 30.5), scale: 0.95, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 3, "": 1 }), pos: v2.create(-41.5, 26), scale: 0.95, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 3, "": 1 }), pos: v2.create(39.5, -30.5), scale: 0.95, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 3, "": 1 }), pos: v2.create(41.5, -26), scale: 0.95, ori: 0, inheritOri: false }, { type: e.tree_large || "tree_12", pos: v2.create(34, 22.5), scale: 1.05, ori: 0 }, { type: e.tree_small || "tree_12", pos: v2.create(-34.5, -23), scale: 0.95, ori: 0 }, { type: e.tree_small || "tree_12", pos: v2.create(22.5, -14), scale: 0.95, ori: 0 }, { type: e.tree_small || "tree_01sv", pos: v2.create(21.5, -3), scale: 1, ori: 0 }, { type: e.tree_small || "tree_01sv", pos: v2.create(11, -15), scale: 1, ori: 0 }, { type: e.tree_small || "tree_01sv", pos: v2.create(-19, 2), scale: 1, ori: 0 }, { type: e.tree_small || "tree_01sv", pos: v2.create(-10, 13), scale: 1, ori: 0 }, { type: "stone_07", pos: v2.create(-20, 12), scale: 1, ori: 0 }, { type: "stone_07", pos: v2.create(15.5, 10), scale: 1, ori: 1 }, { type: "stone_07", pos: v2.create(-13.5, -12.5), scale: 1, ori: 2 }, { type: "kopje_brush_01", pos: v2.create(-40, -9), scale: 1, ori: 0 }, { type: "kopje_brush_01", pos: v2.create(-40, 6), scale: 1, ori: 2 }, { type: "kopje_brush_01", pos: v2.create(40, -9), scale: 1, ori: 0 }, { type: "kopje_brush_01", pos: v2.create(40, 6), scale: 1, ori: 0 }, { type: "kopje_brush_01", pos: v2.create(0, 28), scale: 1, ori: 1 }, { type: "kopje_brush_01", pos: v2.create(0, -28), scale: 1, ori: 3 } ] }; return util.mergeDeep(t, e || {}); }({ grass_color: 8035865, terrain: { grass: true, beach: false, spawnPriority: 2 } }), kopje_brush_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(18, 18)) ], mapGroundPatches: [], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ loot_tier_1: 1, loot_tier_2: 1, loot_tier_surviv: 1 }), pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(0, 0), scale: 1.5, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(1, 6), scale: 1.5, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-4, 3), scale: 1.5, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-5, -2), scale: 1.5, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(2.5, -5), scale: 1.5, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-1, -8), scale: 1.5, ori: 0 } ] }, grassy_wall_3: createWall({ scale: { createMin: 1, createMax: 1, destroy: 0.8 }, material: "wood", extents: v2.create(0.375, 1.5), hitParticle: "tanChip", img: { sprite: "map-wall-03-grassy.img", residue: "map-wall-03-grassy-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, map: { display: true, color: 7282176, scale: 1 }, health: 300 }), grassy_wall_8: createWall({ scale: { createMin: 1, createMax: 1, destroy: 0.8 }, material: "wood", extents: v2.create(0.375, 4), hitParticle: "tanChip", img: { sprite: "map-wall-08-grassy.img", residue: "map-wall-08-grassy-res.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 }, map: { display: true, color: 7282176, scale: 1 }, health: 300 }), grassy_cover_01: createGrassyCover({ mapObjects: [ { type: "loot_tier_1", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "grassy_wall_8", pos: v2.create(0, 4.75), scale: 1, ori: 1 }, { type: "grassy_wall_8", pos: v2.create(0, -4.75), scale: 1, ori: 3 }, { type: "grassy_wall_3", pos: v2.create(0, 3), scale: 1, ori: 0 }, { type: "grassy_wall_3", pos: v2.create(0, -3), scale: 1, ori: 2 } ] }), grassy_cover_02: createGrassyCover({ mapObjects: [ { type: "loot_tier_1", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "grassy_wall_8", pos: v2.create(0, 4.75), scale: 1, ori: 1 }, { type: "grassy_wall_8", pos: v2.create(0, -4.75), scale: 1, ori: 3 }, { type: "grassy_wall_3", pos: v2.create(-3.5, 3), scale: 1, ori: 0 }, { type: "grassy_wall_3", pos: v2.create(3.5, -3), scale: 1, ori: 2 } ] }), grassy_cover_03: createGrassyCover({ mapObjects: [ { type: "loot_tier_1", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "grassy_wall_8", pos: v2.create(-5, 1.5), scale: 1, ori: 0 }, { type: "grassy_wall_8", pos: v2.create(1, -4.75), scale: 1, ori: 3 }, { type: "grassy_wall_3", pos: v2.create(-3.25, 5), scale: 1, ori: 1 }, { type: "grassy_wall_3", pos: v2.create(4.5, -3), scale: 1, ori: 2 } ] }), grassy_cover_complex_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(30, 10)) ], mapGroundPatches: [], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ grassy_cover_01: 1, grassy_cover_02: 1, grassy_cover_03: 1 }), pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ grassy_cover_01: 1, grassy_cover_02: 1, grassy_cover_03: 1 }), pos: v2.create(-15, 0), scale: 1, ori: 0 }, { type: randomObstacleType({ grassy_cover_01: 1, grassy_cover_02: 1, grassy_cover_03: 1 }), pos: v2.create(15, 0), scale: 1, ori: 0 } ] }, brush_clump_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(17, 17)) ], mapGroundPatches: [], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ loot_tier_1: 1, loot_tier_2: 1, loot_tier_surviv: 1 }), pos: v2.create(-2, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ stone_01: 3, barrel_01: 3, "": 1 }), pos: v2.create(2, 2), scale: 1, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-13, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-6, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(0, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(7, 2), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(12, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(0, -10), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(3, -5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-3, 5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-6, 10), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-4, -6), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(5, -13), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(5, 5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(10, 9), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(10, -9), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-10, -9), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-8, 13), scale: 1.75, ori: 0 } ] }, brush_clump_02: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(17, 17)) ], mapGroundPatches: [], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ loot_tier_1: 1, loot_tier_2: 1, loot_tier_surviv: 1 }), pos: v2.create(2, 2), scale: 1, ori: 0 }, { type: randomObstacleType({ stone_01: 3, barrel_01: 3, "": 1 }), pos: v2.create(-2, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-12, 4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-6, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(0, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(7, -12), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(12, 2), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(1, -11), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(3, -4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-3, 4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(3, 11), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(11, 12), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(5, 5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(9, 8), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(10, -9), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-8, 13), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-7, 9), scale: 1.75, ori: 0 } ] }, brush_clump_03: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(17, 17)) ], mapGroundPatches: [], floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: randomObstacleType({ loot_tier_1: 1, loot_tier_2: 1, loot_tier_surviv: 1 }), pos: v2.create(2, 2), scale: 1, ori: 0 }, { type: randomObstacleType({ stone_01: 3, barrel_01: 3, "": 1 }), pos: v2.create(-2, -2), scale: 1, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-12, 4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-6, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(0, 0), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(7, -11.5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(1, -13.5), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(3, -4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-3, 4), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(10, -9), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-3, 13), scale: 1.75, ori: 0 }, { type: randomObstacleType({ brush_01sv: 5, brush_02sv: 5, "": 1 }), pos: v2.create(-7, 9), scale: 1.75, ori: 0 } ] }, teapavilion_complex_01: { type: "building", map: { display: true, shapes: [] }, terrain: { lakeCenter: true }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(14, 14)), collider.createAabbExtents(v2.create(0, -20), v2.create(4, 12)) ], mapGroundPatches: [ { bound: collider.createAabbExtents(v2.create(0, 0), v2.create(12.5, 12.5)), color: 6066442, roughness: 0.1, offsetDist: 0.25 } ], ori: 0, floor: { surfaces: [{ type: "grass", collision: [] }], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "teapavilion_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "barrel_02", pos: v2.create(11, -4), scale: 1, ori: 0 }, { type: randomObstacleType({ tree_07sp: 2, "": 1 }), pos: v2.create(-3, 12), scale: 0.9, ori: 0 }, { type: randomObstacleType({ tree_07sp: 2, "": 1 }), pos: v2.create(-12, -6), scale: 0.9, ori: 0 }, { type: randomObstacleType({ tree_08sp: 2, "": 1 }), pos: v2.create(-12.5, 9), scale: 1, ori: 0 }, { type: randomObstacleType({ tree_07sp: 2, "": 1 }), pos: v2.create(12, 4), scale: 0.9, ori: 0 } ] }, club_wall_int_6: createWall({ material: "wood", extents: v2.create(0.5, 3), hitParticle: "tanChip", img: wallImg("map-wall-06-rounded.img", 10584424) }), club_wall_int_10: createWall({ material: "wood", extents: v2.create(0.5, 5), hitParticle: "redChip", img: wallImg("map-wall-10-rounded.img", 7218988) }), club_bar_small: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 4.5)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), club_bar_large: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 7)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), club_bar_back_large: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.75, 7.5)), img: { sprite: "map-club-bar-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 10 } }), secret_door_club: createDoor({ destructible: false, material: "concrete", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, openOneWay: false, openSpeed: 7, autoOpen: false, autoClose: false, slideToOpen: true, slideOffset: 3.75, sound: { open: "door_open_03", close: "door_close_03", error: "door_error_01" }, casingImg: { sprite: "map-door-slot-01.img", pos: v2.create(-2, 0), scale: 0.5, alpha: 1, tint: 1316379 } }, img: { tint: 5373952 } }), bathhouse_column_1: createWall({ material: "concrete", extents: v2.create(2, 2), hitParticle: "whiteChip", img: wallImg("map-bathhouse-column-01.img", 13481337) }), bathhouse_column_2: createWall({ material: "concrete", extents: v2.create(1, 1), hitParticle: "whiteChip", img: wallImg("map-bathhouse-column-02.img", 13481337) }), bathhouse_rocks_01: createControlPanel({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.55, 1.55)), destructible: false, img: { sprite: "map-bathrocks-01.img" } }), vault_door_bathhouse: createDoor({ destructible: false, material: "metal", hinge: v2.create(0, 2), extents: v2.create(0.3, 2), door: { canUse: false, openOnce: true, openOneWay: false, openSpeed: 7, autoOpen: false, autoClose: false, slideToOpen: true, slideOffset: 3.75, sound: { open: "door_open_03", close: "door_close_03", error: "door_error_01" }, casingImg: { sprite: "map-door-slot-01.img", pos: v2.create(-2, 0), scale: 0.5, alpha: 1, tint: 1316379 } }, img: { tint: 4934475 } }), club_01: function(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(-29.25, -8.5), v2.create(3.25, 2.5) ), color: 13022098 }, { collider: collider.createAabbExtents( v2.create(-4, -8.5), v2.create(22, 13.25) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(6, 18), v2.create(12, 8.25) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(16, 16.5), v2.create(2, 6.5) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(6.5, 7), v2.create(2.5, 3) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(23.5, -7.5), v2.create(5.75, 7) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(1.5, -24.5), v2.create(8, 3.5) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(-1.5, 30.75), v2.create(4.5, 4.5) ), color: 5900046 }, { collider: collider.createAabbExtents( v2.create(-21.5, 7), v2.create(2.5, 3) ), color: 5900046 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, mapGroundPatches: [ { bound: collider.createAabbExtents( v2.create(-13.5, 11.5), v2.create(16, 24.5) ), color: 9340275, order: 1 }, { bound: collider.createAabbExtents( v2.create(-13.5, 11.5), v2.create(15, 23.5) ), color: 5855577, order: 1 }, { bound: collider.createAabbExtents(v2.create(1.5, 7), v2.create(3, 3)), color: 5855577, order: 1 }, { bound: collider.createAabbExtents( v2.create(-12, 14.5), v2.create(7.5, 0.25) ), color: 14145495, order: 1, useAsMapShape: false }, { bound: collider.createAabbExtents( v2.create(-12, 21.5), v2.create(7.5, 0.25) ), color: 14145495, order: 1, useAsMapShape: false }, { bound: collider.createAabbExtents( v2.create(-12, 28.5), v2.create(7.5, 0.25) ), color: 14145495, order: 1, useAsMapShape: false }, { bound: collider.createAabbExtents( v2.create(15, 5), v2.create(20, 30) ), color: 7551e3, roughness: 0.05, offsetDist: 0.5 } ], mapObstacleBounds: [], floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(1.5, -24.5), v2.create(5, 3.5) ), collider.createAabbExtents( v2.create(-13, 20.25), v2.create(16.5, 15.5) ), collider.createAabbExtents( v2.create(-28, 0), v2.create(1.5, 5.25) ) ] }, { type: "stone", collision: [ collider.createAabbExtents( v2.create(-29.5, -8.5), v2.create(3, 2.5) ) ] }, { type: "carpet", collision: [ collider.createAabbExtents( v2.create(-4, -8.5), v2.create(22, 13.25) ), collider.createAabbExtents( v2.create(4.5, 18), v2.create(10.5, 8.25) ), collider.createAabbExtents( v2.create(16, 16.5), v2.create(2, 6.5) ), collider.createAabbExtents( v2.create(6.5, 7), v2.create(2.5, 3) ), collider.createAabbExtents( v2.create(23.5, -3), v2.create(5.75, 2.5) ), collider.createAabbExtents( v2.create(26.5, -7.5), v2.create(2.5, 7) ) ] } ], imgs: [ { sprite: "map-building-club-floor-01a.img", pos: v2.create(-30, -8.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01b.img", pos: v2.create(-21.5, 8), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01c.img", pos: v2.create(-4, -8.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01d.img", pos: v2.create(1.5, -25), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01e.img", pos: v2.create(24, -7.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01f.img", pos: v2.create(6.5, 7), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01g.img", pos: v2.create(6, 18), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-floor-01h.img", pos: v2.create(-1.5, 31.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-4, -8.5), v2.create(22, 13.25) ) }, { zoomIn: collider.createAabbExtents( v2.create(4.5, 18), v2.create(10.5, 8.25) ) }, { zoomIn: collider.createAabbExtents( v2.create(16, 16.5), v2.create(2, 6.75) ) }, { zoomIn: collider.createAabbExtents( v2.create(6.5, 7), v2.create(2.5, 3) ) }, { zoomIn: collider.createAabbExtents( v2.create(-1.5, 30), v2.create(3, 4) ) }, { zoomIn: collider.createAabbExtents( v2.create(23.5, -3), v2.create(5.75, 2.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(26.5, -7.5), v2.create(2.5, 7) ) }, { zoomIn: collider.createAabbExtents( v2.create(1.5, -24), v2.create(5, 3) ) }, { zoomIn: collider.createAabbExtents( v2.create(-21.5, 7), v2.create(2.5, 3) ) }, { zoomOut: collider.createAabbExtents( v2.create(1.5, -28), v2.create(5.5, 2) ) }, { zoomOut: collider.createAabbExtents( v2.create(-21.5, 11), v2.create(3.5, 2) ) }, { zoomOut: collider.createAabbExtents( v2.create(17, 25), v2.create(3, 3) ) }, { zoomOut: collider.createAabbExtents( v2.create(17, 25), v2.create(3, 3) ) } ], vision: { dist: 7.5, width: 2.5, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-club-ceiling-01a.img", pos: v2.create(-4.5, -8.5), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-ceiling-01b.img", pos: v2.create(24, -7.5), scale: 1, alpha: 1, tint: 16777215 }, { sprite: "map-building-club-ceiling-01c.img", pos: v2.create(6, 22.5), scale: 1, alpha: 1, tint: 16777215 } ] }, puzzle: { name: "club_01", completeUseType: "secret_door_club", completeOffDelay: 1, completeUseDelay: 2, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "none" } }, mapObjects: [ { type: "concrete_wall_ext_7", pos: v2.create(-30, -11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(-30, -5.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(-24, 7.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_5", pos: v2.create(-19, 7.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_3", pos: v2.create(-25, 4.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_25", pos: v2.create(-26, -8.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_9_5", pos: v2.create(-21.75, -21.5), scale: 1, ori: 1 }, { type: "club_window_01", pos: v2.create(-15.5, -21.75), scale: 1, ori: 1 }, { type: "concrete_wall_ext_11_5", pos: v2.create(-8.25, -21.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(-3, -24.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_5", pos: v2.create(6, -24.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_13", pos: v2.create(12, -21.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_13", pos: v2.create(12, -21.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_6", pos: v2.create(18, -18), scale: 1, ori: 0 }, { type: "concrete_wall_column_7x10", pos: v2.create(21, -10), scale: 1, ori: 0 }, { type: "concrete_wall_ext_4", pos: v2.create(26.5, -14.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_10_5", pos: v2.create(29, -9.75), scale: 1, ori: 0 }, { type: "club_window_01", pos: v2.create(29.25, -3), scale: 1, ori: 0 }, { type: "concrete_wall_ext_1_5", pos: v2.create(29, -0.75), scale: 1, ori: 0 }, { type: "concrete_wall_ext_11", pos: v2.create(23, -0.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(18, 2.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_8", pos: v2.create(13.5, 4.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_6", pos: v2.create(9, 7), scale: 1, ori: 0 }, { type: "concrete_wall_ext_8", pos: v2.create(13.5, 9.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_13", pos: v2.create(18, 15.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thick_11", pos: v2.create(9, 26), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_11", pos: v2.create(2, 30.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_11", pos: v2.create(-5, 30.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_4", pos: v2.create(-1.5, 34.5), scale: 1, ori: 1 }, { type: "secret_door_club", pos: v2.create(0.5, 26), scale: 1, ori: 1 }, { type: "concrete_wall_ext_16", pos: v2.create(-6, 17), scale: 1, ori: 0 }, { type: "concrete_wall_ext_9", pos: v2.create(-1, 9.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_6", pos: v2.create(4, 7), scale: 1, ori: 0 }, { type: "concrete_wall_ext_23", pos: v2.create(-8, 4.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(-23.5, 4.5), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(-2.5, -21.5), scale: 1, ori: 3 }, { type: "house_door_01", pos: v2.create(5.5, -21.5), scale: 1, ori: 1 }, { type: "club_bar_small", pos: v2.create(-16, -0.5), scale: 1, ori: 0 }, { type: "club_bar_large", pos: v2.create(-7.5, -3.5), scale: 1, ori: 1 }, { type: "club_bar_back_large", pos: v2.create(-8, 3.3), scale: 1, ori: 1 }, { type: "bottle_05", pos: v2.create(-16.25, 1.25), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-16, -0.5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-16, -2.25), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-14.5, -4), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-12.25, -3.5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-9.5, -3.75), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-5.25, -2.75), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-5.5, -4.25), scale: 1, ori: 0 }, { type: "bottle_04", pos: v2.create(-2.25, -3.5), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-3.25, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-4.25, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-6.5, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-7.5, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_04", pos: v2.create(-8.5, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-12.25, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: "bottle_05", pos: v2.create(-13.25, 3.3), scale: 1, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_14: 1, crate_14a: 1 }), pos: v2.create(-12, 0.25), scale: 0.85, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_14: 1, crate_14a: 1 }), pos: v2.create(-7.75, 0.25), scale: 0.85, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_14: 1, crate_14a: 1 }), pos: v2.create(-3.5, 0.25), scale: 0.85, ori: 0, inheritOri: false }, { type: "couch_02", pos: v2.create(-24, -15), scale: 1, ori: 1 }, { type: "couch_03", pos: v2.create(-24, -19.5), scale: 1, ori: 0 }, { type: "couch_02b", pos: v2.create(-19.5, -19.5), scale: 1, ori: 0 }, { type: "table_03", pos: v2.create(-19, -14.5), scale: 1, ori: 0 }, { type: "decal_flyer_01", pos: v2.create(-17.5, -13.25), scale: 1, ori: 1 }, { type: "couch_02b", pos: v2.create(-7, -15), scale: 1, ori: 1 }, { type: "couch_03", pos: v2.create(-7, -19.5), scale: 1, ori: 1 }, { type: "couch_02", pos: v2.create(-11.5, -19.5), scale: 1, ori: 2 }, { type: "table_03", pos: v2.create(-12, -14.5), scale: 1, ori: 0 }, { type: "club_wall_int_10", pos: v2.create(12.5, -7.5), scale: 1, ori: 1 }, { type: "club_wall_int_10", pos: v2.create(8, -13), scale: 1, ori: 0 }, { type: "couch_01", pos: v2.create(13, -9.5), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 1, crate_14: 1, crate_14a: 1 }), pos: v2.create(11, -13.5), scale: 0.85, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 1, crate_14: 1, crate_14a: 1 }), pos: v2.create(15.25, -15.5), scale: 0.85, ori: 0, inheritOri: false }, { type: randomObstacleType({ crate_01: 1, crate_14: 1, crate_14a: 1 }), pos: v2.create(15.25, 1.75), scale: 0.85, ori: 0, inheritOri: false }, { type: "club_vault", pos: v2.create(-1.5, 30.5), scale: 1, ori: 0 }, { type: "switch_01", pos: v2.create(-5.5, 11.5), scale: 1, ori: 1, puzzlePiece: "1" }, { type: "switch_01", pos: v2.create(-5.5, 14.5), scale: 1, ori: 1, puzzlePiece: "4" }, { type: "switch_01", pos: v2.create(-5.5, 17.5), scale: 1, ori: 1, puzzlePiece: "2" }, { type: "switch_01", pos: v2.create(-5.5, 20.5), scale: 1, ori: 1, puzzlePiece: "3" }, { type: "bookshelf_01", pos: v2.create(-1.5, 24), scale: 1, ori: 0 }, { type: "crate_02", pos: v2.create(10.75, 23), scale: 0.75, ori: 0, inheritOri: false }, { type: "decal_barrel_explosion", pos: v2.create(17.5, 26.25), scale: 1, ori: 0 }, { type: "decal_plank_01", pos: v2.create(17.25, 27.25), scale: 0.5, ori: 0 }, { type: "decal_plank_01", pos: v2.create(17.5, 27.5), scale: 0.5, ori: 1 }, { type: "decal_plank_01", pos: v2.create(19.5, 25.75), scale: 0.5, ori: 1 }, { type: "decal_plank_01", pos: v2.create(18.75, 25.5), scale: 0.5, ori: 3 }, { type: "couch_01", pos: v2.create(6.5, 11.5), scale: 1, ori: 0 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(-4.25, 29.55), scale: 1, ori: 1 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(1.25, 29.55), scale: 1, ori: 3 }, { type: "bathhouse_column_1", pos: v2.create(-5.5, -24), scale: 1, ori: 0 }, { type: "bathhouse_column_1", pos: v2.create(8.5, -24), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_03: 1, barrel_01: 1, barrel_02: 1 }), pos: v2.create(1.5, 7), scale: 1, ori: 0, inheritOri: false }, { type: "bush_01", pos: v2.create(11.5, 7), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-13.75, 17), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-10.25, 18.25), scale: 1, ori: 0 }, { type: randomObstacleType({ crate_01: 1, crate_14: 1, crate_14a: 1 }), pos: v2.create(-25, 30), scale: 1, ori: 0, inheritOri: false }, { type: "bush_01", pos: v2.create(-28.5, -14), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(26.5, -18), scale: 0.75, ori: 0 }, { type: randomObstacleType({ crate_01: 1, crate_14: 1, crate_14a: 1 }), pos: v2.create(21, -17.5), scale: 0.9, ori: 0, inheritOri: false }, { type: "decal_oil_04", pos: v2.create(-12, 26.5), scale: 1, ori: 0 }, { type: "decal_oil_03", pos: v2.create(-18, 32), scale: 1, ori: 0 }, { type: "decal_oil_02", pos: v2.create(-24, 23), scale: 0.75, ori: 0 }, { type: "decal_oil_06", pos: v2.create(-11, 16.5), scale: 1, ori: 0 }, { type: "decal_oil_05", pos: v2.create(-9.5, 8), scale: 1, ori: 1 }, { type: "decal_oil_03", pos: v2.create(-26, 11.5), scale: 0.5, ori: 1 } ] }; return util.mergeDeep(t, e || {}); }({}), bathhouse_01: function(e) { const t = { type: "building", map: { display: false }, terrain: { grass: true, beach: false }, mapObstacleBounds: [], zIdx: 0, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(2, 9.5), v2.create(20, 22) ), collider.createAabbExtents( v2.create(0, 7.5), v2.create(26, 48) ), collider.createAabbExtents( v2.create(-26, -26), v2.create(4, 3) ) ] } ], imgs: [ { sprite: "map-building-club-gradient-01.img", pos: v2.create(-3.5, -13.5), scale: 4, alpha: 1, tint: 16777215 }, { sprite: "map-building-bathhouse-basement-01a.img", pos: v2.create(-33.5, -26), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bathhouse-basement-01b.img", pos: v2.create(-10, -26.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bathhouse-basement-01c.img", pos: v2.create(18.5, -35.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bathhouse-basement-01d.img", pos: v2.create(23.02, -27.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-building-bathhouse-basement-01e.img", pos: v2.create(2, 9), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(2, 9.5), v2.create(20, 22) ), zoomOut: collider.createAabbExtents( v2.create(2, 9.5), v2.create(22, 24) ), zoom: 48 }, { zoomIn: collider.createAabbExtents( v2.create(0, 7.5), v2.create(26, 48) ) }, { zoomIn: collider.createAabbExtents( v2.create(-26, -26), v2.create(4, 3) ) }, { zoomIn: collider.createAabbExtents( v2.create(30, 0.5), v2.create(7.5, 6.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(-26, 16.5), v2.create(7.5, 6.5) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, occupiedEmitters: [ { type: "bathhouse_steam", pos: v2.create(30, 0.5), dir: v2.create(-1, 0), rot: 0, scale: 1, layer: 1, parentToCeiling: false }, { type: "bathhouse_steam", pos: v2.create(-26, 16.5), dir: v2.create(1, 0), rot: 0, scale: 1, layer: 1, parentToCeiling: false } ], goreRegion: collider.createAabbExtents(v2.create(2, 8.5), v2.create(20, 23)), puzzle: { name: "club_02", completeUseType: "vault_door_bathhouse", completeOffDelay: 1, completeUseDelay: 2, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "none" } }, mapObjects: [ { type: "concrete_wall_ext_5", pos: v2.create(-36.5, -26), scale: 1, ori: 0 }, { type: "concrete_wall_ext_7", pos: v2.create(-33.5, -23), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(-33.5, -29), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_4", pos: v2.create(-28, -22), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_6", pos: v2.create(-27.5, -17.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_11", pos: v2.create(-23.5, -13), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_11", pos: v2.create(-24.5, -30), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_6", pos: v2.create(-20.5, -34.5), scale: 1, ori: 0 }, { type: "club_wall_int_6", pos: v2.create(-14.5, -34.5), scale: 1, ori: 0 }, { type: "club_wall_int_6", pos: v2.create(-9.5, -34.5), scale: 1, ori: 0 }, { type: "concrete_wall_column_4x24", pos: v2.create(-8, -22.5), scale: 1, ori: 1 }, { type: "concrete_wall_column_4x9", pos: v2.create(2, -29), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_54", pos: v2.create(5, -39), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_14", pos: v2.create(26.5, -30.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_4", pos: v2.create(23, -25), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_6", pos: v2.create(19.5, -26.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_10", pos: v2.create(16, -31), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_19", pos: v2.create(9.5, -23), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_14", pos: v2.create(18, -15), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_21", pos: v2.create(23.5, 20), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_5", pos: v2.create(23.5, -11), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_19", pos: v2.create(15.5, 32), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_19", pos: v2.create(-11.5, 32), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_5", pos: v2.create(-19.5, 28), scale: 1, ori: 0 }, { type: "concrete_wall_ext_thicker_19", pos: v2.create(-19.5, -2), scale: 1, ori: 0 }, { type: "house_door_05", pos: v2.create(-18, -14), scale: 1, ori: 3 }, { type: "glass_wall_9", pos: v2.create(-0.5, -14), scale: 1, ori: 1 }, { type: "glass_wall_9", pos: v2.create(-9.5, -14), scale: 1, ori: 1 }, { type: "house_door_05", pos: v2.create(8, -14), scale: 1, ori: 1 }, { type: "vault_door_bathhouse", pos: v2.create(6, 34.5), scale: 1, ori: 1 }, { type: "vault_door_bathhouse", pos: v2.create(-2, 34.5), scale: 1, ori: 3 }, { type: "switch_03", pos: v2.create(8, 30.75), scale: 1, ori: 0, puzzlePiece: "1" }, { type: "house_door_01", pos: v2.create(2, -37.5), scale: 1, ori: 0 }, { type: "house_door_01", pos: v2.create(-19.5, -24.5), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_01: 9, toilet_02: 1 }), pos: v2.create(-17, -35.25), scale: 1, ori: 2 }, { type: randomObstacleType({ toilet_01: 9, toilet_02: 1 }), pos: v2.create(-12, -35.25), scale: 1, ori: 2 }, { type: "towelrack_01", pos: v2.create(-12, -25.5), scale: 1, ori: 0 }, { type: "bathhouse_column_1", pos: v2.create(-13, -7.5), scale: 1, ori: 1 }, { type: "pot_04", pos: v2.create(-13, -3), scale: 1, ori: 0 }, { type: "towelrack_01", pos: v2.create(-13, 2.25), scale: 1, ori: 1 }, { type: "bathhouse_column_1", pos: v2.create(-13, 8.5), scale: 1, ori: 1 }, { type: "towelrack_01", pos: v2.create(-13, 14.75), scale: 1, ori: 1 }, { type: "pot_04", pos: v2.create(-13, 20), scale: 1, ori: 0 }, { type: "bathhouse_column_1", pos: v2.create(-13, 24.5), scale: 1, ori: 1 }, { type: "bathhouse_column_1", pos: v2.create(17, -7.5), scale: 1, ori: 1 }, { type: "pot_04", pos: v2.create(17, -3), scale: 1, ori: 0 }, { type: "towelrack_01", pos: v2.create(17, 2.25), scale: 1, ori: 1 }, { type: "bathhouse_column_1", pos: v2.create(17, 8.5), scale: 1, ori: 1 }, { type: "towelrack_01", pos: v2.create(17, 14.75), scale: 1, ori: 1 }, { type: "pot_04", pos: v2.create(17, 20), scale: 1, ori: 0 }, { type: "bathhouse_column_1", pos: v2.create(17, 24.5), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(-27.5, -28.85), scale: 1, ori: 2 }, { type: "locker_01", pos: v2.create(-23.5, -28.85), scale: 1, ori: 2 }, { type: "locker_01", pos: v2.create(10.5, -37.85), scale: 1, ori: 2 }, { type: "locker_01", pos: v2.create(14.5, -37.85), scale: 1, ori: 2 }, { type: "locker_01", pos: v2.create(18.5, -37.85), scale: 1, ori: 2 }, { type: "decal_bathhouse_pool_01", pos: v2.create(2, 8.5), scale: 1, ori: 0 }, { type: "decal_club_01", pos: v2.create(2, 8.5), scale: 1, ori: 0 }, { type: "decal_club_02", pos: v2.create(2, 8.5), scale: 1, ori: 0 }, { type: "bathhouse_sideroom_01", pos: v2.create(-26, 16.5), scale: 1, ori: 0 }, { type: "bathhouse_sideroom_01", pos: v2.create(30, 0.5), scale: 1, ori: 2 }, { type: "bathhouse_sideroom_02", pos: v2.create(2, 44), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({}), bathhouse_sideroom_01: function(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [], zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(7.5, 6.5) ) ] } ], imgs: [ { sprite: "map-building-bathhouse-sideroom-01.img", pos: v2.create(-1, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(7.5, 6.5) ) } ], vision: { dist: 5.5, width: 3.25, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-bathhouse-sideroom-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 } ] }, soundEmitters: [ { sound: "ambient_steam_01", channel: "ambient", pos: v2.create(0, 0), range: { min: 9, max: 16 }, falloff: 1, volume: 0.2 } ], healRegions: [ { collision: collider.createAabbExtents( v2.create(0, 0), v2.create(7.5, 6.5) ), healRate: 3 } ], mapObjects: [ { type: "concrete_wall_ext_thicker_15", pos: v2.create(0.5, 7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_15", pos: v2.create(0.5, -7.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_thicker_19", pos: v2.create(-8.5, 0), scale: 1, ori: 0 }, { type: "concrete_wall_ext_4", pos: v2.create(7.5, 4), scale: 1, ori: 0 }, { type: "concrete_wall_ext_4", pos: v2.create(7.5, -4), scale: 1, ori: 0 }, { type: "house_door_05", pos: v2.create(7.5, -2), scale: 1, ori: 0 }, { type: "bathhouse_rocks_01", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({}), bathhouse_sideroom_02: function(e) { const t = { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false }, mapObstacleBounds: [], zIdx: 1, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(14, 10) ) ] } ], imgs: [ { sprite: "map-building-bathhouse-sideroom-02.img", pos: v2.create(0, 0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(14, 9.5) ) } ], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-bathhouse-sideroom-ceiling-02.img", scale: 1, alpha: 1, tint: 4931116 } ] }, mapObjects: [ { type: "metal_wall_ext_thick_12", pos: v2.create(10, -9.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thick_12", pos: v2.create(-10, -9.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(14.5, 1), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(-14.5, 1), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_26", pos: v2.create(0, 9), scale: 1, ori: 1 }, { type: "crate_05", pos: v2.create(-2.5, -2.5), scale: 1, ori: 0 }, { type: "crate_05", pos: v2.create(2.5, -1.5), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(-10.75, 5.25), scale: 0.8, ori: 0 }, { type: "crate_04", pos: v2.create(10.75, 5.25), scale: 0.8, ori: 0 }, { type: "mil_crate_04", pos: v2.create(-5.75, 5.5), scale: 1, ori: 0 }, { type: "mil_crate_04", pos: v2.create(5.75, 5.5), scale: 1, ori: 0 }, { type: "case_07", pos: v2.create(0, 5.25), scale: 1, ori: 0 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(-13.75, -4.8), scale: 1, ori: 1 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(-13.75, 0.45), scale: 1, ori: 1 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(13.75, -4.8), scale: 1, ori: 3 }, { type: randomObstacleType({ deposit_box_01: 3, deposit_box_02: 1 }), pos: v2.create(13.75, 0.45), scale: 1, ori: 3 } ] }; return util.mergeDeep(t, e || {}); }({}), club_window_01: createWindow({ isWindow: false, hitParticle: "woodChip", explodeParticle: "woodPlank", destroyType: "club_window_broken_01", img: { sprite: "map-building-boarded-window-01.img" }, sound: { bullet: "wood_prop_bullet", punch: "wood_prop_bullet", explode: "barrel_break_02", enter: "none" } }), club_window_broken_01: createLowWall({ img: { tint: 7886127 } }), club_vault: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(3, 4)) ] } ], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 6250335 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents(v2.create(0, 0), v2.create(3, 4)) } ], imgs: [ { sprite: "map-building-club-vault-ceiling.img", scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "loot_tier_club_melee", pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, club_structure_01: { type: "structure", structureType: "club", terrain: { grass: true, beach: false, spawnPriority: 10 }, mapObstacleBounds: [], layers: [ { type: "club_01", pos: v2.create(-3.5, -17.5), ori: 0 }, { type: "bathhouse_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(-33, -26), v2.create(3, 2.55) ), downDir: v2.create(1, 0), noCeilingReveal: true }, { collision: collider.createAabbExtents( v2.create(23, -28.5), v2.create(2, 3) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(-5, 8), v2.create(25, 50)), collider.createAabbExtents(v2.create(23.01, -35.5), v2.create(3, 4)) ], interiorSound: { sound: "club_music_01", soundAlt: "club_music_02", filter: "club", transitionTime: 1, soundAltPlayTime: 90, outsideMaxDist: 10, outsideVolume: 0.25, undergroundVolume: 0.707, puzzle: "club_02" } }, club_complex_01: { type: "building", map: { display: true, shapes: [] }, terrain: { grass: true, beach: false, spawnPriority: 10 }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(-16, 15), v2.create(19, 6)), collider.createAabbExtents(v2.create(-8, -15.5), v2.create(26.5, 27.5)), collider.createAabbExtents(v2.create(-2, -47), v2.create(10, 5)), collider.createAabbExtents(v2.create(-37, -26), v2.create(4, 5)), collider.createAabbExtents(v2.create(23, -7), v2.create(8, 10)), collider.createAabbExtents(v2.create(22, -29), v2.create(6, 12)), collider.createAabbExtents(v2.create(-8, -23), v2.create(28, 21)), collider.createAabbExtents(v2.create(2, 0), v2.create(16, 12)), collider.createAabbExtents(v2.create(-16, 0), v2.create(4, 4)), collider.createAabbExtents(v2.create(-28.5, 12.5), v2.create(3.5, 3.5)) ], mapGroundPatches: [], floor: { surfaces: [], imgs: [] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "club_structure_01", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "shack_01", pos: v2.create(22, -10), scale: 1, ori: 1 } ] }, bunker_egg_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(0, 7.75), v2.create(2, 3.25) ) ] } ], imgs: [ { sprite: "map-bunker-generic-floor-01.img", pos: v2.create(0, 7.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], vision: { dist: 5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "metal_wall_ext_short_6", pos: v2.create(0, 5.3), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(-2.5, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(2.5, 8.5), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(5, 8), scale: 1.05, ori: 0 }, { type: "tree_01", pos: v2.create(-5, 7.5), scale: 1.1, ori: 0 }, { type: "tree_01", pos: v2.create(-1.25, 15.75), scale: 1, ori: 0 }, { type: "decal_vent_01", pos: v2.create(-5, -0), scale: 1, ori: 0 }, { type: "stone_01", pos: v2.create(-5.75, -1.5), scale: 1, ori: 0, inheritOri: false }, { type: "decal_vent_02", pos: v2.create(4.5, -8.5), scale: 1, ori: 0 }, { type: "bush_01", pos: v2.create(5.75, -6.75), scale: 1, ori: 0 } ] }, bunker_egg_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -4.5), v2.create(10, 9)) ] } ], imgs: [ { sprite: "map-bunker-egg-chamber-floor-01a.img", pos: v2.create(-0.15, -4.6), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-egg-chamber-floor-01b.img", pos: v2.create(0, 9.24), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -4.5), v2.create(10, 9) ) } ], imgs: [ { sprite: "map-bunker-egg-chamber-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_24", pos: v2.create(0, -14.5), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "crate_07", pos: v2.create(0, -4.5), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-7, -11), scale: 0.9, ori: 0 } ] }, bunker_egg_sublevel_02: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -4.5), v2.create(10, 9)) ] } ], imgs: [ { sprite: "map-bunker-egg-chamber-floor-01a.img", pos: v2.create(-0.15, -4.6), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-egg-chamber-floor-01b.img", pos: v2.create(0, 9.25), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -4.5), v2.create(10, 9) ) } ], imgs: [ { sprite: "map-bunker-egg-chamber-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_24", pos: v2.create(0, -14.5), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "crate_07b", pos: v2.create(0, -4.5), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-7, -11), scale: 0.9, ori: 0 } ] }, bunker_egg_sublevel_01sv: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -4.5), v2.create(10, 9)) ] } ], imgs: [ { sprite: "map-bunker-egg-chamber-floor-01a.img", pos: v2.create(-0.15, -4.6), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-egg-chamber-floor-01b.img", pos: v2.create(0, 9.25), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -4.5), v2.create(10, 9) ) } ], imgs: [ { sprite: "map-bunker-egg-chamber-ceiling-01.img", scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_24", pos: v2.create(0, -14.5), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "crate_07sv", pos: v2.create(0, -4.5), scale: 1, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-7, -11), scale: 0.9, ori: 0 } ] }, bunker_structure_01: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 5), v2.create(7.5, 12.5)) ], layers: [ { type: "bunker_egg_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_egg_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [collider.createAabbExtents(v2.create(0, -3.7), v2.create(10, 9.5))] }, bunker_structure_01b: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 5), v2.create(7.5, 12.5)) ], layers: [ { type: "bunker_egg_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_egg_sublevel_02", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [collider.createAabbExtents(v2.create(0, -3.7), v2.create(10, 9.5))] }, bunker_structure_01sv: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 5), v2.create(7.5, 12.5)) ], layers: [ { type: "bunker_egg_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_egg_sublevel_01sv", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [collider.createAabbExtents(v2.create(0, -3.7), v2.create(10, 9.5))] }, bunker_hydra_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(20.25, 3.5), v2.create(6.25, 5.5) ), color: 2894892 }, { collider: collider.createAabbExtents( v2.create(32.25, 3.5), v2.create(6.75, 9.25) ), color: 3815994 } ] }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(20.25, 3.5), v2.create(6.25, 5.5) ), collider.createAabbExtents( v2.create(32.25, 3.5), v2.create(6.75, 9.25) ) ] }, { type: "container", collision: [ collider.createAabbExtents( v2.create(16.25, 3.5), v2.create(3.25, 2) ), collider.createAabbExtents( v2.create(-16.5, -90.75), v2.create(2, 3.25) ), collider.createAabbExtents( v2.create(40, -50.5), v2.create(2, 3.25) ) ] } ], imgs: [ { sprite: "map-bunker-hydra-floor-01.img", pos: v2.create(25.75, 3.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-generic-floor-01.img", pos: v2.create(-16.5, -90), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-bunker-generic-floor-01.img", pos: v2.create(40, -51), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(19.25, 3.5), v2.create(6.25, 5.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(32.25, 3.5), v2.create(6.75, 9.25) ) } ], imgs: [ { sprite: "map-bunker-hydra-ceiling-01.img", pos: v2.create(25.75, 3.5), scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 2.75, linger: 0.5, fadeRate: 6 } }, mapObjects: [ { type: "concrete_wall_ext_13", pos: v2.create(18.75, 9.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_13", pos: v2.create(18.75, -2.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_11", pos: v2.create(12.75, 3.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_7", pos: v2.create(25.75, 9), scale: 1, ori: 0 }, { type: "concrete_wall_ext_7", pos: v2.create(25.75, -2), scale: 1, ori: 0 }, { type: "concrete_wall_ext_2", pos: v2.create(26.25, 12.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_2", pos: v2.create(26.25, -5.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_8", pos: v2.create(35.25, 12.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_8", pos: v2.create(35.25, -5.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_17", pos: v2.create(38.75, 3.5), scale: 1, ori: 0 }, { type: "police_wall_int_7", pos: v2.create(32.75, 8.5), scale: 1, ori: 0 }, { type: "police_wall_int_2", pos: v2.create(33.25, 4.5), scale: 1, ori: 1 }, { type: "house_door_01", pos: v2.create(38.25, 4.5), scale: 1, ori: 1 }, { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(35.75, 10.5), scale: 1, ori: 0 }, { type: "crate_08", pos: v2.create(35.75, -2.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_6", pos: v2.create(13, 3.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(17, 6), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(17, 1), scale: 1, ori: 1 }, { type: "decal_vent_01", pos: v2.create(-1.5, 8), scale: 1, ori: 0 }, { type: "decal_vent_02", pos: v2.create(8, -0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_6", pos: v2.create(-16.5, -87.75), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(-19, -91), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(-14, -91), scale: 1, ori: 0 }, { type: "decal_vent_01", pos: v2.create(-15.15, -79.55), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_6", pos: v2.create(40, -53.25), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(37.5, -50), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(42.5, -50), scale: 1, ori: 0 }, { type: "decal_vent_02", pos: v2.create(40, -60.5), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(-11.5, -92), scale: 1.05, ori: 0 }, { type: "tree_01", pos: v2.create(-21.5, -92.5), scale: 1.1, ori: 0 }, { type: "tree_01", pos: v2.create(-17.5, -83.25), scale: 1, ori: 0 }, { type: "tree_01", pos: v2.create(45, -50), scale: 1.05, ori: 0 }, { type: "tree_01", pos: v2.create(35, -50.5), scale: 1.1, ori: 0 }, { type: "tree_01", pos: v2.create(38.75, -42.25), scale: 1, ori: 0 }, { type: "decal_hydra_01", pos: v2.create(3.5, -48.5), scale: 1, ori: 0, inheritOri: false } ] }, bunker_hydra_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(3.5, 3), v2.create(9.5, 9)) ] }, { type: "tile", collision: [ collider.createAabbExtents( v2.create(-15.5, -79.5), v2.create(3, 8) ), collider.createAabbExtents( v2.create(40.5, -62), v2.create(9.5, 8) ) ] } ], imgs: [ { sprite: "map-bunker-hydra-chamber-floor-01a.img", pos: v2.create(17.5, 3.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hydra-chamber-floor-01b.img", pos: v2.create(3.5, 2.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hydra-chamber-floor-02.img", pos: v2.create(-15.5, -83), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hydra-chamber-floor-03.img", pos: v2.create(40.5, -58.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(3.5, 2.25), v2.create(10, 10) ) }, { zoomIn: collider.createAabbExtents( v2.create(-15, -77), v2.create(5.5, 10.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(38, -62), v2.create(11.5, 8) ) } ], imgs: [ { sprite: "map-bunker-hydra-chamber-ceiling-01.img", pos: v2.create(7, 2), scale: 1, alpha: 1, tint: 6250335 }, { sprite: "map-bunker-hydra-chamber-ceiling-02.img", pos: v2.create(-13.5, -76.5), scale: 1, alpha: 1, tint: 6250335 }, { sprite: "map-bunker-hydra-chamber-ceiling-03.img", pos: v2.create(38, -62), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 10, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(20, 3.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16.5, 7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16.5, 0), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(14, 12), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(14, -5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(2, 13.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(-7, 2.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(-3, -6.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(10, -6.5), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(13.5, 5.5), scale: 1, ori: 2 }, { type: "lab_door_01", pos: v2.create(-0.5, -7.5), scale: 1, ori: 3 }, { type: "lab_door_01", pos: v2.create(7.5, -7.5), scale: 1, ori: 1 }, { type: "sandbags_01", pos: v2.create(0, 7.25), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(10.25, -2.75), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(10.25, 9.75), scale: 0.9, ori: 0, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(-3.5, -3), scale: 0.9, ori: 0 }, { type: "metal_wall_ext_thicker_23", pos: v2.create(-20, -83), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(-11, -79), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-13, -90.5), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(-16.5, -94), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-18.5, -87.5), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(-12.15, -79), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(-12.15, -74.5), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(-12.15, -83.5), scale: 1, ori: 3 }, { type: "concrete_wall_ext_6", pos: v2.create(40, -47), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(36.5, -50.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(43.5, -50.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(33, -53), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(30, -55), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(30, -66), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_16", pos: v2.create(36.5, -71), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(48.25, -70), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_13", pos: v2.create(50, -62), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(48.25, -54), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(38, -53.5), scale: 1, ori: 3 }, { type: "crate_08", pos: v2.create(34, -67), scale: 1, ori: 2 }, { type: "locker_01", pos: v2.create(46.5, -55.15), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(48.9, -57.5), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(48.9, -62), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(48.9, -66.5), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(46.5, -68.85), scale: 1, ori: 2 }, { type: "bunker_hydra_compartment_01", pos: v2.create(3.5, -18.95), scale: 1, ori: 0 }, { type: "bunker_hydra_compartment_02", pos: v2.create(6, -50), scale: 1, ori: 0 }, { type: "bunker_hydra_compartment_03", pos: v2.create(10.5, -74.95), scale: 1, ori: 0 } ] }, bunker_hydra_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents( v2.create(0, 1.5), v2.create(9.5, 12.5) ) ] } ], imgs: [ { sprite: "map-bunker-hydra-compartment-floor-01.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 1.25), v2.create(10, 10) ) } ], imgs: [ { sprite: "map-bunker-hydra-compartment-ceiling-01.img", pos: v2.create(0, 1.25), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_17", pos: v2.create(-9.75, 3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(-6.5, 9.75), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(6.5, 10.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(10.5, 1.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(-7.5, -6.75), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(8, -7.5), scale: 1, ori: 1 }, { type: "crate_08", pos: v2.create(6.5, 6.5), scale: 1, ori: 2 }, { type: "sandbags_01", pos: v2.create(4.75, 1.5), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(-4, -8.5), scale: 1, ori: 3 }, { type: "lab_door_01", pos: v2.create(4, -8.5), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(-6, 8.4), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(-8.35, 6), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(-8.35, 1.5), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(-8.35, -3), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(-6, -5.4), scale: 1, ori: 2 } ] }, metal_wall_column_5x12: createWall({ material: "metal", extents: v2.create(2.5, 6) }), bunker_hydra_compartment_02: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "tile", data: { isBright: true }, collision: [ collider.createAabbExtents(v2.create(-2.5, 16), v2.create(22, 4)), collider.createAabbExtents( v2.create(-2.5, 9.5), v2.create(6, 2.5) ), collider.createAabbExtents(v2.create(0, -4.5), v2.create(25, 17)) ] } ], imgs: [ { sprite: "map-bunker-hydra-compartment-floor-02.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-2, 3), v2.create(22.5, 19.5) ) } ], imgs: [ { sprite: "map-bunker-hydra-compartment-ceiling-02.img", pos: v2.create(0, 1), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_21", pos: v2.create(-17, 21.75), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(12, 21.75), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_42", pos: v2.create(-26, -0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_29", pos: v2.create(21, 6), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-19, -18.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-18.5, -14), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(-15, -15), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(-9, -16), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(4, -16), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(10, -15), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(17, -14), scale: 1, ori: 1 }, { type: "metal_wall_column_5x12", pos: v2.create(-14.5, 13), scale: 1, ori: 1 }, { type: "metal_wall_column_5x12", pos: v2.create(9.5, 13), scale: 1, ori: 1 }, { type: "control_panel_03", pos: v2.create(-7, 12), scale: 1, ori: 1 }, { type: "control_panel_03", pos: v2.create(2, 12), scale: 1, ori: 3 }, { type: "lab_window_01", pos: v2.create(-7, 7), scale: 1, ori: 1 }, { type: "lab_window_01", pos: v2.create(-4, 7), scale: 1, ori: 1 }, { type: "lab_window_01", pos: v2.create(-1, 7), scale: 1, ori: 1 }, { type: "lab_window_01", pos: v2.create(2, 7), scale: 1, ori: 1 }, { type: "metal_wall_ext_4", pos: v2.create(-9, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_4", pos: v2.create(4, 8.5), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(-20.5, 13), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(15.5, 13), scale: 1, ori: 3 }, { type: "crate_01", pos: v2.create(-17.5, 7.75), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "vat_01", pos: v2.create(-12.25, 7.5), scale: 1, ori: 3 }, { type: "vat_01", pos: v2.create(-12, -2.5), scale: 1, ori: 0 }, { type: "vat_01", pos: v2.create(-18, -2.5), scale: 1, ori: 2 }, { type: "vat_02", pos: v2.create(-2.5, 1.5), scale: 1, ori: 2 }, { type: "power_box_01", pos: v2.create(-2.5, -3), scale: 1, ori: 2 }, { type: "crate_01", pos: v2.create(12.5, 7.75), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "vat_01", pos: v2.create(7.25, 7.5), scale: 1, ori: 3 }, { type: "vat_01", pos: v2.create(7, -2.5), scale: 1, ori: 2 }, { type: "vat_01", pos: v2.create(13, -2.5), scale: 1, ori: 0 }, { type: "vat_01", pos: v2.create(-10.75, -11.5), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(-4.5, -16.5), scale: 1, ori: 3 }, { type: "vat_01", pos: v2.create(5.75, -11.5), scale: 1, ori: 1 }, { type: "fire_ext_01", pos: v2.create(1.5, -14.15), scale: 1, ori: 1 }, { type: "lab_door_03", pos: v2.create(-20.5, -16.5), scale: 1, ori: 1 }, { type: "lab_door_02", pos: v2.create(20.5, -8.5), scale: 1, ori: 2 } ] }, bunker_hydra_compartment_03: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, 2), v2.create(9, 8.75)) ] } ], imgs: [ { sprite: "map-bunker-hydra-compartment-floor-03.img", pos: v2.create(0, -0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.75), v2.create(10, 7.75) ) } ], imgs: [ { sprite: "map-bunker-hydra-compartment-ceiling-03.img", pos: v2.create(0, 1), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_17", pos: v2.create(-10.5, -1), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(0, -8), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(10.5, -1), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_14", pos: v2.create(2, 6), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-6.5, -1.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(-1.75, 2), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(-2, -2), scale: 0.9, ori: 0 }, { type: "case_03", pos: v2.create(7, -4), scale: 1, ori: 3 } ] }, bunker_structure_02: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(25.5, 3.5), v2.create(16, 11.5)), collider.createAabbExtents(v2.create(-16.5, -89.5), v2.create(7, 7.5)), collider.createAabbExtents(v2.create(40, -47.25), v2.create(6.5, 7.25)), collider.createAabbExtents(v2.create(3.5, -48.5), v2.create(3, 3)) ], layers: [ { type: "bunker_hydra_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_hydra_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(16.4, 3.5), v2.create(2.6, 2) ), downDir: v2.create(-1, 0) }, { collision: collider.createAabbExtents( v2.create(-16.5, -90.75), v2.create(2, 2.5) ), downDir: v2.create(0, 1) }, { collision: collider.createAabbExtents( v2.create(40, -50.35), v2.create(2, 2.5) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(3.5, -7.2), v2.create(10.75, 20)), collider.createAabbExtents(v2.create(-15, -79.75), v2.create(5, 8.5)), collider.createAabbExtents(v2.create(39, -61.85), v2.create(12, 9)), collider.createAabbExtents(v2.create(3.5, -49.2), v2.create(23.49, 21.99)), collider.createAabbExtents(v2.create(10.5, -76.7), v2.create(10, 5.5)) ] }, bunker_storm_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 10), v2.create(3.6, 5.8) ), color: 6707790 } ] }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(0, 7.75), v2.create(2, 3.25) ) ] }, { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 13.5), v2.create(3.75, 2.5) ) ] }, { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(5, 13.75), v2.create(1.25, 2.25) ) ] } ], imgs: [ { sprite: "map-bunker-storm-floor-02.img", pos: v2.create(1.25, 10), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 10), v2.create(3.5, 5.6) ), zoomOut: collider.createAabbExtents( v2.create(0, 10), v2.create(3.8, 5.9) ) } ], vision: { dist: 5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-shack-ceiling-01.img", pos: v2.create(-1, 10), scale: 0.667, alpha: 1, tint: 16777215, rot: 1 } ], destroy: { wallCount: 2, particle: "shackBreak", particleCount: 25, residue: "none" } }, mapObjects: [ { type: "metal_wall_ext_short_6", pos: v2.create(0, 5.3), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(-2.5, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(2.5, 8.5), scale: 1, ori: 0 }, { type: "shack_wall_bot", pos: v2.create(3.39, 8.6), scale: 1, ori: 1 }, { type: "shack_wall_side_left", pos: v2.create(0.3, 4.52), scale: 1, ori: 1 }, { type: "shack_wall_top", pos: v2.create(-3.39, 9.73), scale: 1, ori: 1 }, { type: "shack_wall_side_right", pos: v2.create(0, 15.58), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-2, 17.9), scale: 0.8, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(1.45, 17.7), scale: 0.85, ori: 0 }, { type: "decal_vent_01", pos: v2.create(-5, -0), scale: 1, ori: 0 }, { type: "decal_vent_02", pos: v2.create(4.5, -8.5), scale: 1, ori: 0 }, { type: "stone_01", pos: v2.create(-4.25, -1.5), scale: 1, ori: 0, inheritOri: false }, { type: "bush_01", pos: v2.create(3.75, -6.75), scale: 1, ori: 0 } ] }, bunker_storm_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents( v2.create(1, -4.4), v2.create(10.5, 9) ) ] }, { type: "tile", collision: [ collider.createAabbExtents( v2.create(19, -5.5), v2.create(7.5, 8) ) ] } ], imgs: [ { sprite: "map-bunker-storm-chamber-floor-01a.img", pos: v2.create(8.5, -4.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-storm-chamber-floor-01b.img", pos: v2.create(0, 9.25), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(8.5, -4.5), v2.create(18, 9.5) ) } ], imgs: [ { sprite: "map-bunker-storm-chamber-ceiling-01.img", pos: v2.create(8.5, -1), scale: 1, alpha: 1, tint: 16777215 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-10.5, -3), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(-1.5, -14.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(10.5, -11), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(12.5, -11), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(21.5, -14.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(27.5, -5.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_17", pos: v2.create(20.5, 3.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(10.5, 2.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(12.5, 0), scale: 1, ori: 0 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "crate_01", pos: v2.create(-6.5, 1.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_04", pos: v2.create(6, -1), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(3.9, -6.4), scale: 1, ori: 0 }, { type: "control_panel_03", pos: v2.create(16, -11.5), scale: 1, ori: 2 }, { type: "control_panel_02", pos: v2.create(20, -11.25), scale: 1, ori: 2 }, { type: "control_panel_03", pos: v2.create(24, -11.5), scale: 1, ori: 2 }, { type: "crate_08", pos: v2.create(23.5, -0.5), scale: 1, ori: 0 }, { type: randomObstacleType({ case_03: 1, chest_02: 9 }), pos: v2.create(16.5, 0.25), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(11.5, -2), scale: 1, ori: 2 }, { type: "barrel_01", pos: v2.create(-7, -11), scale: 0.9, ori: 0 } ] }, bunker_structure_03: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 6), v2.create(7, 16.5)) ], layers: [ { type: "bunker_storm_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_storm_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [collider.createAabbExtents(v2.create(8.5, -3.7), v2.create(18, 9.5))] }, bunker_conch_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(20, 3.35), v2.create(5.5, 2.5) ), color: 2703694 }, { collider: collider.createAabbExtents( v2.create(46.5, -32.55), v2.create(5.5, 2.5) ), color: 2703694 } ] }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(16.25, 3.5), v2.create(3.25, 2) ), collider.createAabbExtents( v2.create(44.25, -32.5), v2.create(3.25, 2) ), collider.createAabbExtents( v2.create(22, 3.35), v2.create(8, 2.5) ), collider.createAabbExtents( v2.create(50.5, -32.55), v2.create(8, 2.5) ) ] } ], imgs: [ { sprite: "map-bunker-conch-floor-01.img", pos: v2.create(20.75, 3.45), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-conch-floor-01.img", pos: v2.create(48.75, -32.45), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(19, 3.35), v2.create(5.5, 2.5) ), zoomOut: collider.createAabbExtents( v2.create(22, 3.35), v2.create(8, 2.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(47.5, -32.55), v2.create(5.5, 2.5) ), zoomOut: collider.createAabbExtents( v2.create(50.5, -32.55), v2.create(8, 2.5) ) } ], imgs: [ { sprite: "map-bunker-conch-ceiling-01.img", pos: v2.create(19.25, 3.35), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-conch-ceiling-01.img", pos: v2.create(47.25, -32.55), scale: 0.5, alpha: 1, tint: 16777215 } ], vision: {} }, mapObjects: [ { type: "container_wall_top", pos: v2.create(13.7, 3.35), scale: 1, ori: 1 }, { type: "container_wall_side", pos: v2.create(19.6, 5.7), scale: 1, ori: 1 }, { type: "container_wall_side", pos: v2.create(19.6, 1), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(24, 9), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(18, -2), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "container_wall_top", pos: v2.create(41.7, -32.55), scale: 1, ori: 1 }, { type: "container_wall_side", pos: v2.create(47.6, -34.9), scale: 1, ori: 1 }, { type: "container_wall_side", pos: v2.create(47.6, -30.2), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(47, -27), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(40, -37), scale: 1, ori: 0 }, { type: "decal_vent_03", pos: v2.create(-2, -13.5), scale: 1, ori: 0 } ] }, bunker_conch_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(1, 4), v2.create(12.5, 3.5)), collider.createAabbExtents( v2.create(28, -30), v2.create(13.5, 4.5) ) ] } ], imgs: [ { sprite: "map-bunker-conch-chamber-floor-01.img", pos: v2.create(4, 5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-conch-chamber-floor-02.img", pos: v2.create(34.86, -29.9), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(1, 3.5), v2.create(12.5, 5) ) }, { zoomIn: collider.createAabbExtents( v2.create(26.75, -30), v2.create(15.25, 4.5) ) } ], imgs: [ { sprite: "map-bunker-conch-chamber-ceiling-01.img", pos: v2.create(-2, 3.5), scale: 1, alpha: 1, tint: 6250335 }, { sprite: "map-bunker-conch-chamber-ceiling-02.img", pos: v2.create(26.25, -29.9), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 7, width: 3 } }, occupiedEmitters: [ { type: "bunker_bubbles_01", pos: v2.create(-2, -13.5), rot: 0, scale: 0.5, layer: 0 } ], mapObjects: [ { type: "house_door_02", pos: v2.create(13.5, 1.35), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(20, 3.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16.5, 6.7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_29", pos: v2.create(7, 0), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_16", pos: v2.create(5.5, 9), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_9", pos: v2.create(-7, 7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(-13, 3.5), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(9.5, 7.85), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(5, 7.85), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(0.5, 7.85), scale: 1, ori: 0 }, { type: "decal_pipes_01", pos: v2.create(-4.5, 5), scale: 1, ori: 2 }, { type: "house_door_02", pos: v2.create(41.5, -34.55), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(48, -32.4), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(38.5, -35.9), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_13", pos: v2.create(42, -29.2), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(34, -26.7), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(27, -33.4), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(20, -30.9), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(23.5, -23.9), scale: 1, ori: 1 }, { type: "decal_pipes_04", pos: v2.create(22, -29.9), scale: 1, ori: 2 }, { type: "loot_tier_2", pos: v2.create(31, -30), scale: 1, ori: 0 }, { type: "bunker_conch_compartment_01", pos: v2.create(-1.5, -12.4), scale: 1, ori: 0 } ] }, bunker_conch_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "water", collision: [ collider.createAabbExtents( v2.create(1, -2.5), v2.create(15, 15.5) ) ] } ], imgs: [ { sprite: "map-bunker-conch-compartment-floor-01a.img", pos: v2.create(-3, -0.75), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-conch-compartment-floor-01b.img", pos: v2.create(9.75, -17.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-1.5, -1), v2.create(12.5, 12) ) }, { zoomIn: collider.createAabbExtents( v2.create(9.5, -14.5), v2.create(4, 2.5) ) } ], imgs: [ { sprite: "map-bunker-conch-compartment-ceiling-01.img", pos: v2.create(-0.75, -5.5), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 7, width: 3 } }, occupiedEmitters: [ { type: "bunker_bubbles_01", pos: v2.create(-0.5, -1), rot: 0, scale: 0.5, layer: 0 } ], mapObjects: [ { type: "metal_wall_ext_thicker_5", pos: v2.create(-11.5, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-15, 7.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(-15.5, 0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(-13.5, -6.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(-11.5, -11.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_13", pos: v2.create(-3.5, -13.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(4.5, -14.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_13", pos: v2.create(9.5, -18.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(13.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(11.5, -0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(3.5, 10.5), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(-10, 11), scale: 1, ori: 3 }, { type: "control_panel_03", pos: v2.create(-12.25, 4.25), scale: 1, ori: 1 }, { type: "control_panel_02", pos: v2.create(-12, 0.25), scale: 1, ori: 1 }, { type: "fire_ext_01", pos: v2.create(-3, 8.75), scale: 1, ori: 3 }, { type: "crate_09", pos: v2.create(2.75, 6.25), scale: 1, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(7.5, 6.25), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "decal_pipes_02", pos: v2.create(7.25, 7.25), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-3.75, -2), scale: 0.8, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(-1.25, -4.25), scale: 0.8, ori: 0, inheritOri: false }, { type: "crate_01", pos: v2.create(-7.5, -9.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(3.5, -9.5), scale: 1, ori: 0, ignoreMapSpawnReplacement: true }, { type: "decal_pipes_03", pos: v2.create(-5.25, -9.25), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(13.5, -17), scale: 1, ori: 0 } ] }, bunker_structure_04: { type: "structure", terrain: { waterEdge: { dir: v2.create(-1, 0), distMin: 15, distMax: 16 } }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(21, 3.5), v2.create(9.5, 8)), collider.createAabbExtents(v2.create(48, -32.5), v2.create(10, 8)) ], layers: [ { type: "bunker_conch_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_conch_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(16.9, 3.5), v2.create(2.6, 2) ), downDir: v2.create(-1, 0) }, { collision: collider.createAabbExtents( v2.create(44.9, -32.5), v2.create(2.6, 2) ), downDir: v2.create(-1, 0) } ], mask: [ collider.createAabbExtents(v2.create(-1.5, -9.2), v2.create(15.7, 22)), collider.createAabbExtents(v2.create(28.25, -32), v2.create(14, 8)) ] }, bunker_crossing_stairs_01: createBunkerStairs({}), bunker_crossing_stairs_01b: createBunkerStairs({ ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.75), v2.create(2, 3.25) ) } ], imgs: [ { sprite: "map-bunker-crossing-ceiling-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] } }), bunker_crossing_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(5, 5) ), color: 1984867 } ] }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [], imgs: [ { sprite: "map-bunker-crossing-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "bunker_crossing_stairs_01b", pos: v2.create(34.5, 28.5), scale: 1, ori: 3 }, { type: "bunker_crossing_stairs_01b", pos: v2.create(-36, 20), scale: 1, ori: 2 }, { type: "bunker_crossing_stairs_01b", pos: v2.create(36, -14), scale: 1, ori: 0 }, { type: "bunker_crossing_stairs_01", pos: v2.create(-34.5, -22.5), scale: 1, ori: 1 } ] }, bunker_crossing_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 3.25), v2.create(38, 28)) ] } ], imgs: [ { sprite: "map-bunker-crossing-chamber-floor-01a.img", pos: v2.create(-11.44, 27), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-bunker-crossing-chamber-floor-01b.img", pos: v2.create(-9.38, 18.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-bunker-crossing-chamber-floor-01c.img", pos: v2.create(-36.44, 18.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-bunker-crossing-chamber-floor-03.img", pos: v2.create(28.5, 23.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 2 }, { sprite: "map-bunker-crossing-chamber-floor-02.img", pos: v2.create(-28.5, -17.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-bunker-crossing-chamber-floor-01a.img", pos: v2.create(11.45, -21), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-bunker-crossing-chamber-floor-01b.img", pos: v2.create(9.39, -12.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-bunker-crossing-chamber-floor-01c.img", pos: v2.create(36.45, -12.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-3, 27.5), v2.create(35.1, 5) ) }, { zoomIn: collider.createAabbExtents( v2.create(3, -21.5), v2.create(35.1, 5) ) }, { zoomIn: collider.createAabbExtents( v2.create(-4, 20.5), v2.create(3, 3) ) }, { zoomIn: collider.createAabbExtents( v2.create(4, -14.5), v2.create(3, 3) ) } ], imgs: [ { sprite: "map-bunker-crossing-chamber-ceiling-01.img", pos: v2.create(-3.5, 24), scale: 1, alpha: 1, tint: 6250335 }, { sprite: "map-bunker-crossing-chamber-ceiling-01.img", pos: v2.create(3.5, -18), scale: 1, alpha: 1, tint: 6250335, rot: 2 } ], vision: { dist: 7, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(38.5, 28.5), scale: 1, ori: 0 }, { type: "house_door_02", pos: v2.create(32, 30.5), scale: 1, ori: 2 }, { type: "decal_pipes_05", pos: v2.create(13, 28.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_48", pos: v2.create(15, 32), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_35", pos: v2.create(21.5, 25), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(2.5, 23.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-0.5, 20.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-7.5, 20.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_32", pos: v2.create(-22, 29), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(-39.5, 23), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(-36, 16), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-38, 22.5), scale: 1, ori: 3 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-32.5, 19.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_22", pos: v2.create(-20, 22), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(-4.5, 29), scale: 0.8, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(-38.5, -22.5), scale: 1, ori: 0 }, { type: "house_door_02", pos: v2.create(-32, -20.5), scale: 1, ori: 2 }, { type: "decal_pipes_05", pos: v2.create(-12, -22.5), scale: 1, ori: 2 }, { type: "metal_wall_ext_thicker_48", pos: v2.create(-15, -26), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(-31.5, -19), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_16", pos: v2.create(-12, -19), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-2.5, -17.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(0.5, -14.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(7.5, -14.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_32", pos: v2.create(22, -23), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(39.5, -17), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(36, -10), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(38, -16.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(32.5, -13.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_22", pos: v2.create(20, -16), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(4.5, -23), scale: 0.8, ori: 0 }, { type: "crate_06", pos: v2.create(-12.5, -22.25), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(-7, -22.75), scale: 1, ori: 0 }, { type: "bunker_crossing_compartment_01", pos: v2.create(1.5, 0), scale: 1, ori: 0 } ] }, bunker_crossing_bathroom: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "water", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [ { sprite: "", scale: 0.5, alpha: 1, tint: 6250335 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(3.75, 2) ) } ], imgs: [ { sprite: "map-building-crossing-bathroom-ceiling.img", scale: 0.5, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: randomObstacleType({ toilet_03: 5, toilet_04: 1 }), pos: v2.create(2, 0), scale: 1, ori: 3 } ] }, bunker_crossing_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "water", collision: [ collider.createAabbExtents(v2.create(-1, 3), v2.create(17, 17.5)) ] } ], imgs: [ { sprite: "map-bunker-crossing-compartment-floor-02.img", pos: v2.create(-22.5, -10), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-crossing-compartment-floor-01.img", pos: v2.create(4, 3), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(4, 3), v2.create(22, 14.5) ) }, { zoomIn: collider.createAabbExtents( v2.create(-22, -11), v2.create(4.5, 9) ) } ], imgs: [ { sprite: "map-bunker-crossing-compartment-ceiling-01a.img", pos: v2.create(-22.475, -11), scale: 1, alpha: 1, tint: 6250335 }, { sprite: "map-bunker-crossing-compartment-ceiling-01b.img", pos: v2.create(3.975, 3), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 7, width: 3 } }, occupiedEmitters: [ { type: "bunker_bubbles_02", pos: v2.create(-1.5, 0), rot: 0, scale: 0.5, layer: 0 } ], mapObjects: [ { type: "metal_wall_ext_thicker_13", pos: v2.create(-14, 16), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(-7.5, 17.5), scale: 1, ori: 3 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(5.5, 16), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16, 13.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(22, 8), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(28, 4.5), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(17.5, 6.5), scale: 1, ori: 2 }, { type: "bunker_crossing_bathroom", pos: v2.create(22, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(22, 1), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(16, -6), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(9.5, -10), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(4.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_19", pos: v2.create(-9, -10), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-19.5, -8), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(-20, -14.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_17", pos: v2.create(-27, -11), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(-23, -1), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_14", pos: v2.create(-19, 7.5), scale: 1, ori: 0 }, { type: "control_panel_04", pos: v2.create(-15.25, 8.5), scale: 1, ori: 1 }, { type: "control_panel_03", pos: v2.create(-15.5, 12.75), scale: 1, ori: 1 }, { type: "control_panel_03", pos: v2.create(-15.5, 4.25), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(-5, 10.25), scale: 0.8, ori: 0 }, { type: "barrel_01", pos: v2.create(-3.25, 12.5), scale: 0.8, ori: 0 }, { type: "locker_01", pos: v2.create(1.15, 14.85), scale: 1, ori: 0 }, { type: "locker_03", pos: v2.create(4.5, 14.85), scale: 1, ori: 0 }, { type: "bookshelf_01", pos: v2.create(10.5, 13), scale: 1, ori: 0 }, { type: "bed_sm_01", pos: v2.create(10.5, 10), scale: 1, ori: 3 }, { type: "crate_01", pos: v2.create(-5, -6.25), scale: 0.8, ori: 0, ignoreMapSpawnReplacement: true }, { type: "barrel_01", pos: v2.create(-3, -2.5), scale: 0.9, ori: 0 }, { type: "vending_01", pos: v2.create(-1.25, -6.5), scale: 1, ori: 2 }, { type: "fire_ext_01", pos: v2.create(14, -0.5), scale: 1, ori: 2 }, { type: "refrigerator_01", pos: v2.create(8.25, -6.5), scale: 1, ori: 2 }, { type: "oven_01", pos: v2.create(12.25, -6.5), scale: 1, ori: 2 }, { type: "crossing_door_01", pos: v2.create(-17.85, -2.5), scale: 1, ori: 2 }, { type: "couch_01", pos: v2.create(-12, 0), scale: 1, ori: 0 }, { type: "screen_01", pos: v2.create(-12, -7.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-23.5, -4.5), scale: 0.8, ori: 0, ignoreMapSpawnReplacement: true }, { type: "loot_tier_woodaxe", pos: v2.create(-23.5, -8.5), scale: 0.8, ori: 0 }, { type: "crate_01", pos: v2.create(-23.5, -14), scale: 0.8, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crossing_door_01", pos: v2.create(-21.5, -20.15), scale: 1, ori: 1 } ] }, bunker_structure_05: { type: "structure", terrain: { grass: true, beach: false, bridge: { nearbyWidthMult: 1.2 }, spawnPriority: 100 }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(35.5, 28.5), v2.create(6, 6)), collider.createAabbExtents(v2.create(-36, 19), v2.create(6, 6)), collider.createAabbExtents(v2.create(36, -13), v2.create(6, 6)), collider.createAabbExtents(v2.create(-35.5, -22.5), v2.create(6, 6)), collider.createAabbExtents(v2.create(0, 0), v2.create(6, 6)) ], bridgeLandBounds: [ collider.createAabbExtents(v2.create(35.5, 28.5), v2.create(5, 5)), collider.createAabbExtents(v2.create(-36, 19), v2.create(5, 5)), collider.createAabbExtents(v2.create(36, -13), v2.create(5, 5)), collider.createAabbExtents(v2.create(-35.5, -22.5), v2.create(5, 5)) ], bridgeWaterBounds: [collider.createAabbExtents(v2.create(0, 0), v2.create(5, 5))], layers: [ { type: "bunker_crossing_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_crossing_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(35.6, 28.5), v2.create(2.6, 2) ), downDir: v2.create(-1, 0) }, { collision: collider.createAabbExtents( v2.create(-36, 19), v2.create(2, 2.6) ), downDir: v2.create(0, 1) }, { collision: collider.createAabbExtents( v2.create(36, -13), v2.create(2, 2.6) ), downDir: v2.create(0, -1) }, { collision: collider.createAabbExtents( v2.create(-35.5, -22.5), v2.create(2.6, 2) ), downDir: v2.create(1, 0) } ], mask: [ collider.createAabbExtents(v2.create(-3.7, 27), v2.create(36.5, 5)), collider.createAabbExtents(v2.create(3.7, -21), v2.create(36.5, 5)), collider.createAabbExtents(v2.create(0, 3), v2.create(30, 18.95)) ] }, bunker_hatchet_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 10), v2.create(3.6, 5.8) ), color: 6707790 } ] }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(0, 7.75), v2.create(2, 3.25) ) ] }, { type: "shack", collision: [ collider.createAabbExtents( v2.create(0, 13.5), v2.create(3.75, 2.5) ), collider.createAabbExtents( v2.create(5, 13.75), v2.create(1.25, 2.25) ) ] } ], imgs: [ { sprite: "map-bunker-storm-floor-02.img", pos: v2.create(1.25, 10), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 10), v2.create(3.5, 5.6) ), zoomOut: collider.createAabbExtents( v2.create(0, 10), v2.create(3.8, 5.9) ) } ], vision: { dist: 5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [ { sprite: "map-building-shack-ceiling-01.img", pos: v2.create(-1, 10), scale: 0.667, alpha: 1, tint: 16777215, rot: 1 } ], destroy: { wallCount: 2, particle: "shackBreak", particleCount: 25, residue: "none" } }, mapObjects: [ { type: "metal_wall_ext_short_6", pos: v2.create(0, 5.3), scale: 1, ori: 1 }, { type: "metal_wall_ext_short_7", pos: v2.create(-2.5, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_short_7", pos: v2.create(2.5, 8.5), scale: 1, ori: 0 }, { type: "shack_wall_bot", pos: v2.create(3.39, 8.6), scale: 1, ori: 1 }, { type: "shack_wall_side_left", pos: v2.create(0.3, 4.52), scale: 1, ori: 1 }, { type: "shack_wall_top", pos: v2.create(-3.39, 9.73), scale: 1, ori: 1 }, { type: "shack_wall_side_right", pos: v2.create(0, 15.58), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-2, 17.9), scale: 0.8, ori: 0, inheritOri: false }, { type: "barrel_01", pos: v2.create(1.45, 17.7), scale: 0.85, ori: 0 }, { type: "decal_vent_01", pos: v2.create(5, 0), scale: 1, ori: 0 }, { type: "decal_vent_02", pos: v2.create(5, -8.5), scale: 1, ori: 0 }, { type: "tree_07", pos: v2.create(6.75, -4.5), scale: 1, ori: 0 } ] }, bunker_hatchet_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(-3, -4.4), v2.create(13, 9)) ] } ], imgs: [ { sprite: "map-bunker-hatchet-chamber-floor-01a.img", pos: v2.create(0, -4.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-chamber-floor-01b.img", pos: v2.create(0, 9.25), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-chamber-floor-01c.img", pos: v2.create(-15, -9.475), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-3, -4.4), v2.create(13, 9.25) ) } ], imgs: [ { sprite: "map-bunker-hatchet-chamber-ceiling-01.img", pos: v2.create(-3, -4.5), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 5, width: 3 } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(-8.5, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(8.5, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(10.5, -6), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(-10.5, -1), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_14", pos: v2.create(-16, -7.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_25", pos: v2.create(-3.5, -14.5), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "barrel_01", pos: v2.create(-5, 0.5), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(6.75, -10.75), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_06", pos: v2.create(0, -11), scale: 1, ori: 0 }, { type: "crate_06", pos: v2.create(7, -4), scale: 1, ori: 1 }, { type: "bunker_hatchet_compartment_01", pos: v2.create(-32, -1.5), scale: 1, ori: 0 }, { type: "bunker_hatchet_compartment_02", pos: v2.create(-63.5, -4), scale: 1, ori: 0 }, { type: "bunker_hatchet_compartment_03", pos: v2.create(-55, 20.5), scale: 1, ori: 0 } ] }, bunker_hatchet_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(16, 13)) ] } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-floor-01.img", pos: v2.create(0, 0.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(16, 12.5) ) } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-ceiling-01.img", pos: v2.create(0, 0), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_13", pos: v2.create(10.5, 2), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(3.5, 7), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(-3.5, 14.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(-10.5, 6), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_32", pos: v2.create(0, -13), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_14", pos: v2.create(-16, -6), scale: 1, ori: 1 }, { type: "lab_door_01", pos: v2.create(16, -7.5), scale: 1, ori: 2 }, { type: "lab_door_01", pos: v2.create(-16, -7.5), scale: 1, ori: 2 }, { type: "lab_door_01", pos: v2.create(-9, 12.5), scale: 1, ori: 3 }, { type: "metal_wall_ext_10", pos: v2.create(8.65, -0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_10", pos: v2.create(3, 5.15), scale: 1, ori: 1 }, { type: "locker_01", pos: v2.create(0.5, 5), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(5.5, 5), scale: 1, ori: 0 }, { type: "locker_01", pos: v2.create(8.5, 2), scale: 1, ori: 3 }, { type: "locker_01", pos: v2.create(8.5, -3), scale: 1, ori: 3 }, { type: "barrel_01", pos: v2.create(1.5, -0.5), scale: 0.9, ori: 0 }, { type: "fire_ext_01", pos: v2.create(0.5, -11.25), scale: 0.9, ori: 1 }, { type: "couch_01", pos: v2.create(-7.5, -2.5), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-7, 8.5), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true } ] }, bunker_hatchet_compartment_02: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(16, 15)) ] } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-floor-02a.img", pos: v2.create(4, -8.25), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-02b.img", pos: v2.create(0.75, 6), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-02c.img", pos: v2.create(-14, 0.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-02d.img", pos: v2.create(-6.27, 14.25), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(-0.5, 0), v2.create(16, 15) ) } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-ceiling-02.img", pos: v2.create(-0.5, -0.5), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_8", pos: v2.create(11.5, -10.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_13", pos: v2.create(10, 4.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(3, 9.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(6, -13), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_12", pos: v2.create(-1.5, -16.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_7", pos: v2.create(-9, -13.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_11", pos: v2.create(-13, -8.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(-17, 0.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_6", pos: v2.create(-12.5, 6.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_25", pos: v2.create(-11, 20.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_14", pos: v2.create(-4, 15), scale: 1, ori: 0 }, { type: "lab_door_01", pos: v2.create(-5.5, 15), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-1.25, 0.5), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(2.75, -1.75), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_04", pos: v2.create(3, 2.5), scale: 0.85, ori: 0 }, { type: "crate_01", pos: v2.create(-7.5, 11), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "control_panel_06", pos: v2.create(2, 6.25), scale: 1, ori: 0 }, { type: "control_panel_06", pos: v2.create(6.75, 1.5), scale: 1, ori: 3 }, { type: "loot_tier_hatchet_melee", pos: v2.create(6.75, 6.25), scale: 1, ori: 0 }, { type: "glass_wall_12_2", pos: v2.create(-10.5, -1), scale: 1, ori: 0 }, { type: "glass_wall_12_2", pos: v2.create(-1.5, -10), scale: 1, ori: 1 }, { type: "loot_tier_imperial_outfit", pos: v2.create(-13.5, -4.5), scale: 1, ori: 0 }, { type: "loot_tier_pineapple_outfit", pos: v2.create(-13.5, -1), scale: 1, ori: 0 }, { type: "loot_tier_tarkhany_outfit", pos: v2.create(-13.5, 2.5), scale: 1, ori: 0 }, { type: "loot_tier_spetsnaz_outfit", pos: v2.create(-5, -13), scale: 1, ori: 0 }, { type: "loot_tier_lumber_outfit", pos: v2.create(-1.5, -13), scale: 1, ori: 0 }, { type: "loot_tier_verde_outfit", pos: v2.create(2, -13), scale: 1, ori: 0 } ] }, bunker_hatchet_compartment_03: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(19, 10)) ] } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-floor-03a.img", pos: v2.create(-14.5, -8.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-03b.img", pos: v2.create(-9, 3), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-03c.img", pos: v2.create(5.5, -0.25), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-hatchet-compartment-floor-03d.img", pos: v2.create(14.5, -3.75), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(19, 9.5) ) } ], imgs: [ { sprite: "map-bunker-hatchet-compartment-ceiling-03.img", pos: v2.create(0, 0), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_25", pos: v2.create(1.5, -4), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(12, 3), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_10", pos: v2.create(1.5, 6.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_21", pos: v2.create(-10.5, 10), scale: 1, ori: 1 }, { type: "crate_01", pos: v2.create(-16, -5), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_01", pos: v2.create(3, -0.5), scale: 0.85, ori: 0, ignoreMapSpawnReplacement: true }, { type: "crate_06", pos: v2.create(-11.75, -1.05), scale: 0.85, ori: 0 }, { type: "crate_06", pos: v2.create(-7, -1.05), scale: 0.85, ori: 0 }, { type: "case_03", pos: v2.create(-2.5, 6.5), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-7, 6.75), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-11, 5.5), scale: 0.9, ori: 0 } ] }, bunker_structure_06: { type: "structure", terrain: { grass: true, beach: false }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(1, 6), v2.create(7, 13.5)) ], layers: [ { type: "bunker_hatchet_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_hatchet_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [ collider.createAabbExtents(v2.create(-3, -3.7), v2.create(13, 9.5)), collider.createAabbExtents(v2.create(-48.025, 6), v2.create(32, 24.95)) ] }, bunker_eye_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 7.5), v2.create(2, 3.25) ), color: 6946816 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "container", collision: [ collider.createAabbExtents( v2.create(0, 7.75), v2.create(2, 3.25) ) ] } ], imgs: [ { sprite: "map-bunker-generic-floor-01.img", pos: v2.create(0, 7.5), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 8.25), v2.create(2, 3.25) ) } ], imgs: [ { sprite: "map-bunker-generic-ceiling-01.img", pos: v2.create(0, 7.5), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] }, puzzle: { name: "bunker_eye_01", completeUseType: "eye_door_01", completeOffDelay: 1, completeUseDelay: 2, errorResetDelay: 1, pieceResetDelay: 2, sound: { fail: "door_error_01", complete: "" } }, mapObjects: [ { type: "metal_wall_ext_6", pos: v2.create(0, 5.3), scale: 1, ori: 1 }, { type: "metal_wall_ext_7", pos: v2.create(-2.5, 8.5), scale: 1, ori: 0 }, { type: "metal_wall_ext_7", pos: v2.create(2.5, 8.5), scale: 1, ori: 0 }, { type: "bush_01", pos: v2.create(5, 23), scale: 1.2, ori: 0 } ] }, vault_door_eye: createDoor({ material: "metal", hinge: v2.create(1, 3.5), extents: v2.create(1, 3.5), img: { sprite: "map-door-02.img" }, door: { interactionRad: 1.5, openSpeed: 10, openOneWay: -1, openDelay: 0.1, openOnce: true, canUse: false, spriteAnchor: v2.create(0.2, 1), sound: { open: "none", close: "none", change: "none" } } }), metal_wall_column_4x8: createWall({ material: "metal", extents: v2.create(2, 4) }), stone_wall_int_4: createWall({ material: "stone", extents: v2.create(0.6, 2), img: wallImg("map-wall-04-stone.img", 16777215) }), bunker_eye_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, -12), v2.create(14, 17)) ] } ], imgs: [ { sprite: "map-bunker-eye-chamber-floor-01a.img", pos: v2.create(0, -8.5), scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-bunker-eye-chamber-floor-01b.img", pos: v2.create(13, -23), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, -12), v2.create(14, 17) ) } ], imgs: [ { sprite: "map-bunker-eye-chamber-ceiling-01.img", pos: v2.create(0, -12), scale: 1, alpha: 1, tint: 6250335 } ], vision: { dist: 5, width: 3 } }, puzzle: { name: "bunker_eye_02", completeUseType: "vault_door_eye", completeOffDelay: 1, completeUseDelay: 5.25, errorResetDelay: 1, pieceResetDelay: 10, sound: { fail: "door_error_01", complete: "vault_change_02" } }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(3.5, 8), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(-7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(7, 5.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_34", pos: v2.create(-10.5, -10), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(13, -26.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_4", pos: v2.create(15.5, -23), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(13, -19.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_24", pos: v2.create(10.5, -5), scale: 1, ori: 0 }, { type: "metal_wall_column_4x8", pos: v2.create(-7.5, -29), scale: 1, ori: 1 }, { type: "metal_wall_column_4x8", pos: v2.create(7.5, -29), scale: 1, ori: 1 }, { type: "house_door_02", pos: v2.create(-2, 5), scale: 1, ori: 3 }, { type: "stone_04", pos: v2.create(12, -23), scale: 1, ori: 2 }, { type: "stone_wall_int_4", pos: v2.create(9.4, -23), scale: 1, ori: 0 }, { type: "recorder_01", pos: v2.create(7.5, 2), scale: 1, ori: 2 }, { type: "control_panel_02b", pos: v2.create(-7, 1), scale: 1, ori: 1, puzzlePiece: "swine" }, { type: "control_panel_02b", pos: v2.create(-7, -4), scale: 1, ori: 1, puzzlePiece: "egg" }, { type: "control_panel_02b", pos: v2.create(-7, -9), scale: 1, ori: 1, puzzlePiece: "storm" }, { type: "control_panel_02b", pos: v2.create(-7, -14), scale: 1, ori: 1, puzzlePiece: "caduceus" }, { type: "control_panel_02b", pos: v2.create(-7, -19), scale: 1, ori: 1, puzzlePiece: "crossing" }, { type: "control_panel_02b", pos: v2.create(-7, -24), scale: 1, ori: 1, puzzlePiece: "conch" }, { type: "control_panel_02b", pos: v2.create(7, -4), scale: 1, ori: 3, puzzlePiece: "cloud" }, { type: "control_panel_02b", pos: v2.create(7, -9), scale: 1, ori: 3, puzzlePiece: "hydra" }, { type: "control_panel_02b", pos: v2.create(7, -14), scale: 1, ori: 3, puzzlePiece: "hatchet" }, { type: "control_panel_02b", pos: v2.create(7, -19), scale: 1, ori: 3, puzzlePiece: "harpsichord" }, { type: "candle_lit_02", pos: v2.create(0, -1.5), scale: 0.75, ori: 0 }, { type: "candle_lit_02", pos: v2.create(0, -11.5), scale: 0.75, ori: 0 }, { type: "candle_lit_02", pos: v2.create(0, -21.5), scale: 0.75, ori: 0 }, { type: "vault_door_eye", pos: v2.create(3.5, -30), scale: 1, ori: 1 }, { type: "bunker_eye_compartment_01", pos: v2.create(0, -39), scale: 1, ori: 0 } ] }, bunker_eye_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "tile", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(10, 10)) ] } ], imgs: [ { sprite: "map-bunker-eye-compartment-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(10, 10) ) } ], imgs: [ { sprite: "map-bunker-eye-compartment-ceiling-01.img", pos: v2.create(0, 0), scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "metal_wall_ext_thicker_20", pos: v2.create(10.5, -2), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_20", pos: v2.create(-10.5, -2), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_18", pos: v2.create(0, -10.5), scale: 1, ori: 1 }, { type: "loot_tier_eye_02", pos: v2.create(0, -3.5), scale: 1, ori: 0 }, { type: "recorder_02", pos: v2.create(-7, -7), scale: 1, ori: 2 } ] }, bunker_structure_07: { type: "structure", terrain: { grass: true, beach: false }, ori: 2, mapObstacleBounds: [ collider.createAabbExtents(v2.create(-1, 8), v2.create(7, 6)), collider.createAabbExtents(v2.create(-40, -70), v2.create(2, 2)), collider.createAabbExtents(v2.create(40, -70), v2.create(2, 2)), collider.createAabbExtents(v2.create(0, -30), v2.create(2, 2)), collider.createAabbExtents(v2.create(5, 23), v2.create(2, 2)) ], layers: [ { type: "bunker_eye_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_eye_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, 8.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) } ], mask: [collider.createAabbExtents(v2.create(0, -22.2), v2.create(13.5, 28))] }, bunker_twins_stairs_01: createBunkerStairs({ map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 1), v2.create(2, 3.25) ), color: 10244368 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0.75), v2.create(2, 3.25) ) } ], imgs: [ { sprite: "map-bunker-twins-ceiling-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215, rot: 0 } ] } }), bunker_twins_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [], imgs: [ { sprite: "map-bunker-vent-02.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], vision: { dist: 5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "bunker_twins_stairs_01", pos: v2.create(5, 13.5), scale: 1, ori: 0 }, { type: "bunker_twins_stairs_01", pos: v2.create(-5, -13.5), scale: 1, ori: 2 }, { type: "bunker_twins_stairs_01", pos: v2.create(-18.5, 0), scale: 1, ori: 1 }, { type: "bunker_twins_stairs_01", pos: v2.create(18.5, 0), scale: 1, ori: 3 } ] }, cobalt_wall_int_4: createWall({ material: "cobalt", extents: v2.create(0.6, 2), img: wallImg("map-wall-04-cobalt.img", 16777215) }), bunker_twins_sublevel_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [ { type: "tile", data: { isBright: true }, collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(16, 11)) ] } ], imgs: [ { sprite: "map-bunker-twins-chamber-floor-01.img", pos: v2.create(0, 0), scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [ { zoomIn: collider.createAabbExtents( v2.create(0, 0), v2.create(15.5, 10.5) ) } ], imgs: [ { sprite: "map-bunker-twins-chamber-ceiling-01.img", scale: 1, alpha: 1, tint: 6250335 } ] }, mapObjects: [ { type: "concrete_wall_ext_6", pos: v2.create(5, 17.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(1.5, 14), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(8.5, 14), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(-7.5, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(12.5, 11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16.5, 9), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-16.5, 9), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(-5, -17.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-1.5, -14), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-8.5, -14), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_15", pos: v2.create(7.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_5", pos: v2.create(-12.5, -11.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-16.5, -9), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(16.5, -9), scale: 1, ori: 0 }, { type: "concrete_wall_ext_6", pos: v2.create(22.5, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(19, 3.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(19, -3.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_6", pos: v2.create(-22.5, 0), scale: 1, ori: 0 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-19, 3.5), scale: 1, ori: 1 }, { type: "metal_wall_ext_thicker_8", pos: v2.create(-19, -3.5), scale: 1, ori: 1 }, { type: "lab_door_locked_01", pos: v2.create(3, 10.5), scale: 1, ori: 3 }, { type: "lab_door_locked_01", pos: v2.create(-3, -10.5), scale: 1, ori: 1 }, { type: "lab_door_locked_01", pos: v2.create(15.5, 2), scale: 1, ori: 2 }, { type: "lab_door_locked_01", pos: v2.create(-15.5, -2), scale: 1, ori: 0 }, { type: "class_shell_03", pos: v2.create(0, 0), scale: 1, ori: 0 }, { type: "vat_01", pos: v2.create(-6.75, 6.75), scale: 1, ori: 3 }, { type: "vat_01", pos: v2.create(-12.175, 6.75), scale: 1, ori: 3 }, { type: "vat_01", pos: v2.create(6.75, -6.75), scale: 1, ori: 1 }, { type: "vat_01", pos: v2.create(12.175, -6.75), scale: 1, ori: 1 }, { type: "control_panel_03", pos: v2.create(2.5, -8.25), scale: 1, ori: 2 }, { type: "cobalt_wall_int_4", pos: v2.create(-12.5, -10.385), scale: 1, ori: 3 }, { type: "barrel_01", pos: v2.create(-10, -8), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(-13, -6), scale: 0.9, ori: 0 }, { type: "recorder_14", pos: v2.create(-13.5, -8.75), scale: 1, ori: 1 }, { type: "cobalt_wall_int_4", pos: v2.create(12.5, 10.385), scale: 1, ori: 1 }, { type: "barrel_01", pos: v2.create(10, 8), scale: 0.9, ori: 0 }, { type: "barrel_01", pos: v2.create(13, 6), scale: 0.9, ori: 0 }, { type: "bunker_twins_compartment_01", pos: v2.create(-19.5, -18.5), scale: 1, ori: 0 }, { type: "bunker_twins_compartment_01", pos: v2.create(19.5, 18.5), scale: 1, ori: 2 } ] }, bunker_twins_compartment_01: { type: "building", map: { display: false, color: 6707790, scale: 1 }, terrain: { grass: true, beach: false }, zIdx: 2, floor: { surfaces: [ { type: "bunker", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(0, 0)) ] } ], imgs: [] }, ceiling: { zoomRegions: [], imgs: [ { sprite: "map-bunker-hydra-compartment-ceiling-03.img", pos: v2.create(0, 0), scale: 1, alpha: 1, tint: 6250335, rot: 0, mirrorX: true } ] }, mapObjects: [] }, bunker_structure_09: { type: "structure", terrain: { grass: true, beach: false }, ori: 0, mapObstacleBounds: [ collider.createAabbExtents(v2.create(5, 15.4), v2.create(3.5, 6)), collider.createAabbExtents(v2.create(-5, -15.4), v2.create(3.5, 6)), collider.createAabbExtents(v2.create(20.5, 0), v2.create(6, 3.5)), collider.createAabbExtents(v2.create(-20.5, 0), v2.create(6, 3.5)), collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)) ], layers: [ { type: "bunker_twins_01", pos: v2.create(0, 0), ori: 0 }, { type: "bunker_twins_sublevel_01", pos: v2.create(0, 0), ori: 0 } ], stairs: [ { collision: collider.createAabbExtents( v2.create(5, 14.4), v2.create(2, 2.6) ), downDir: v2.create(0, -1) }, { collision: collider.createAabbExtents( v2.create(-5, -14.4), v2.create(2, 2.6) ), downDir: v2.create(0, 1) }, { collision: collider.createAabbExtents( v2.create(19.5, 0), v2.create(2.6, 2) ), downDir: v2.create(-1, 0) }, { collision: collider.createAabbExtents( v2.create(-19.5, 0), v2.create(2.6, 2) ), downDir: v2.create(1, 0) } ], mask: [collider.createAabbExtents(v2.create(0, 0), v2.create(16.75, 11.75))] }, bridge_lg_under_column: createWall({ material: "concrete", extents: v2.create(2.5, 10) }), concrete_wall_column_5x4: createWall({ material: "concrete", extents: v2.create(2.5, 2) }), bridge_rail_3: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 2)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), bridge_rail_12: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 6.5)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), bridge_lg_01: createBridgeLarge({}), bridge_lg_01x: createBridgeLarge({ ceiling: { imgs: [ { sprite: "map-building-bridge-lg-ceiling.img", scale: 0.5, alpha: 1, tint: 16777215 }, { sprite: "map-snow-03.img", pos: v2.create(-10, -4), scale: 0.4, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-07.img", pos: v2.create(8, 4), scale: 0.4, alpha: 1, tint: 16777215, rot: 0 }, { sprite: "map-snow-06.img", pos: v2.create(15, -5.25), scale: 0.667, alpha: 1, tint: 16777215, rot: 1 }, { sprite: "map-snow-06.img", pos: v2.create(-15, 5.25), scale: 0.667, alpha: 1, tint: 16777215, rot: 3 } ] } }), bridge_lg_under_01: { type: "building", map: { display: false }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [], imgs: [] }, ceiling: { zoomRegions: [], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "bridge_lg_under_column", pos: v2.create(-14, 0), scale: 1, ori: 0 }, { type: "bridge_lg_under_column", pos: v2.create(14, 0), scale: 1, ori: 0 } ] }, bridge_lg_structure_01: { type: "structure", terrain: { bridge: { nearbyWidthMult: 5 } }, layers: [ { type: "bridge_lg_01", pos: v2.create(0, 0), ori: 0 }, { type: "bridge_lg_under_01", pos: v2.create(0, 0), ori: 0, underground: false } ], bridgeLandBounds: [ collider.createAabbExtents(v2.create(-34, 0), v2.create(6, 9)), collider.createAabbExtents(v2.create(34, 0), v2.create(6, 9)) ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, -9.5), v2.create(11.5, 1.5) ), downDir: v2.create(0, 1), lootOnly: true }, { collision: collider.createAabbExtents( v2.create(0, 9.5), v2.create(11.5, 1.5) ), downDir: v2.create(0, -1), lootOnly: true } ], mask: [collider.createAabbExtents(v2.create(0, 0), v2.create(12, 8))] }, bridge_xlg_under_column: createWall({ material: "concrete", extents: v2.create(2.5, 14) }), concrete_wall_column_9x4: createWall({ material: "concrete", extents: v2.create(4.5, 2) }), bridge_rail_20: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 10)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), bridge_xlg_01: function(e) { const t = { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(38.5, 12) ), color: 2894124 }, { collider: collider.createAabbExtents( v2.create(-16, -13), v2.create(3, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(16, -13), v2.create(3, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(-16, 13), v2.create(3, 1.5) ), color: 3618615 }, { collider: collider.createAabbExtents( v2.create(16, 13), v2.create(3, 1.5) ), color: 3618615 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "asphalt", collision: [ collider.createAabbExtents( v2.create(0, 0), v2.create(38.5, 12) ) ] } ], imgs: [ { sprite: "map-building-bridge-xlg-floor.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "bridge_rail_20", pos: v2.create(-26, 11.5), scale: 1, ori: 1 }, { type: "bridge_rail_20", pos: v2.create(-26, -11.5), scale: 1, ori: 1 }, { type: "bridge_rail_20", pos: v2.create(26, 11.5), scale: 1, ori: 1 }, { type: "bridge_rail_20", pos: v2.create(26, -11.5), scale: 1, ori: 1 }, { type: "concrete_wall_column_9x4", pos: v2.create(-16, -13), scale: 1, ori: 0 }, { type: "concrete_wall_column_9x4", pos: v2.create(-16, 13), scale: 1, ori: 0 }, { type: "concrete_wall_column_9x4", pos: v2.create(16, -13), scale: 1, ori: 0 }, { type: "concrete_wall_column_9x4", pos: v2.create(16, 13), scale: 1, ori: 0 }, { type: "concrete_wall_ext_5", pos: v2.create(-9, 11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(-9, -11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(9, 11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_5", pos: v2.create(9, -11.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(-5, 11.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(-5, -11.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(5, 11.5), scale: 1, ori: 1 }, { type: "bridge_rail_3", pos: v2.create(5, -11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(0, 11.5), scale: 1, ori: 1 }, { type: "concrete_wall_ext_7", pos: v2.create(0, -11.5), scale: 1, ori: 1 }, { type: "loot_tier_1", pos: v2.create(-25, 3), scale: 1, ori: 0 }, { type: "loot_tier_1", pos: v2.create(25, 3), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(-14, 6.5), scale: 1, ori: 1 }, { type: "sandbags_01", pos: v2.create(-20, -8), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(-14, -8), scale: 0.9, ori: 0 }, { type: "crate_01", pos: v2.create(0, 2.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(0, -2.5), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(0, 7.5), scale: 1, ori: 0 }, { type: "crate_04", pos: v2.create(0, -7.5), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-5, 0), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(5, 0), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(-27, -8), scale: 1, ori: 0 }, { type: "crate_01", pos: v2.create(27, -8), scale: 1, ori: 0 }, { type: "sandbags_01", pos: v2.create(14, 6.5), scale: 1, ori: 1 }, { type: "sandbags_01", pos: v2.create(20, -8), scale: 1, ori: 0 }, { type: "barrel_01", pos: v2.create(14, -8), scale: 0.9, ori: 0 } ] }; return util.mergeDeep(t, e || {}); }({}), bridge_xlg_under_01: { type: "building", map: { display: false }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [], imgs: [] }, ceiling: { zoomRegions: [], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "bridge_xlg_under_column", pos: v2.create(-14, 0), scale: 1, ori: 0 }, { type: "bridge_xlg_under_column", pos: v2.create(14, 0), scale: 1, ori: 0 } ] }, bridge_xlg_structure_01: { type: "structure", terrain: { bridge: { nearbyWidthMult: 5 } }, layers: [ { type: "bridge_xlg_01", pos: v2.create(0, 0), ori: 0 }, { type: "bridge_xlg_under_01", pos: v2.create(0, 0), ori: 0, underground: false } ], bridgeLandBounds: [ collider.createAabbExtents(v2.create(-41, 0), v2.create(5, 10)), collider.createAabbExtents(v2.create(41, 0), v2.create(5, 10)) ], bridgeWaterBounds: [collider.createAabbExtents(v2.create(0, 0), v2.create(5, 5))], stairs: [ { collision: collider.createAabbExtents( v2.create(0, -13.5), v2.create(11.5, 1.5) ), downDir: v2.create(0, 1), lootOnly: true }, { collision: collider.createAabbExtents( v2.create(0, 13.5), v2.create(11.5, 1.5) ), downDir: v2.create(0, -1), lootOnly: true } ], mask: [collider.createAabbExtents(v2.create(0, 0), v2.create(12, 12))] }, bridge_rail_28: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.4, 14)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), brick_wall_ext_3_0_low: createLowWall({ collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.5, 1.5)), img: { sprite: "", scale: 0.5, alpha: 1, tint: 4456448, zIdx: 10 } }), brick_wall_ext_11_5: createWall({ material: "brick", extents: v2.create(0.5, 5.75) }), bridge_md_01: { type: "building", map: { display: true, shapes: [ { collider: collider.createAabbExtents( v2.create(0, 0), v2.create(14, 3.5) ), color: 9322264 } ] }, terrain: { grass: true, beach: false }, zIdx: 1, floor: { surfaces: [ { type: "shack", collision: [ collider.createAabbExtents(v2.create(0, 0), v2.create(13.5, 3.5)) ] } ], imgs: [ { sprite: "map-building-bridge-md-floor.img", scale: 0.5, alpha: 1, tint: 16777215 } ] }, ceiling: { zoomRegions: [], imgs: [] }, mapObjects: [ { type: "bridge_rail_28", pos: v2.create(0, 3), scale: 1, ori: 1 }, { type: "bridge_rail_28", pos: v2.create(0, -3), scale: 1, ori: 1 }, { type: "brick_wall_ext_3_0_low", pos: v2.create(-6, 4.25), scale: 1, ori: 0 }, { type: "brick_wall_ext_3_0_low", pos: v2.create(6, 4.25), scale: 1, ori: 0 }, { type: "brick_wall_ext_3_0_low", pos: v2.create(-6, -4.25), scale: 1, ori: 0 }, { type: "brick_wall_ext_3_0_low", pos: v2.create(6, -4.25), scale: 1, ori: 0 }, { type: randomObstacleType({ loot_tier_1: 1, loot_tier_2: 1 }), pos: v2.create(0, 0), scale: 1, ori: 0 } ] }, bridge_md_under_01: { type: "building", map: { display: false }, terrain: { grass: true, beach: false }, zIdx: 0, floor: { surfaces: [], imgs: [] }, ceiling: { zoomRegions: [], vision: { dist: 5.5, width: 2.75, linger: 0.5, fadeRate: 6 }, imgs: [] }, mapObjects: [ { type: "brick_wall_ext_11_5", pos: v2.create(-6, 0), scale: 1, ori: 0 }, { type: "brick_wall_ext_11_5", pos: v2.create(6, 0), scale: 1, ori: 0 } ] }, bridge_md_structure_01: { type: "structure", terrain: { bridge: { nearbyWidthMult: 8 } }, mapObstacleBounds: [ collider.createAabbExtents(v2.create(0, 0), v2.create(23, 7)) ], layers: [ { type: "bridge_md_01", pos: v2.create(0, 0), ori: 0 }, { type: "bridge_md_under_01", pos: v2.create(0, 0), ori: 0, underground: false } ], bridgeLandBounds: [ collider.createAabbExtents(v2.create(-15.5, 0), v2.create(3, 5)), collider.createAabbExtents(v2.create(15.5, 0), v2.create(3, 5)) ], stairs: [ { collision: collider.createAabbExtents( v2.create(0, -4.75), v2.create(5.5, 1.25) ), downDir: v2.create(0, 1), lootOnly: true }, { collision: collider.createAabbExtents( v2.create(0, 4.75), v2.create(5.5, 1.25) ), downDir: v2.create(0, -1), lootOnly: true } ], mask: [collider.createAabbExtents(v2.create(0, 0), v2.create(6.5, 3.6))] }, container_wall_top: createWall({ material: "metal", extents: v2.create(2.75, 0.4) }), container_wall_side: createWall({ material: "metal", extents: v2.create(0.4, 5.5) }), container_wall_side_open: createWall({ material: "metal", extents: v2.create(0.4, 6) }), container_01: createContainer({ open: false, tint: 2703694, ceilingSprite: "map-building-container-ceiling-01.img" }), container_02: createContainer({ open: false, tint: 2703694, ceilingSprite: "map-building-container-ceiling-02.img" }), container_03: createContainer({ open: false, tint: 2703694, ceilingSprite: "map-building-container-ceiling-03.img" }), container_04: createContainer({ open: true, tint: 3560807, ceilingSprite: "map-building-container-open-ceiling-01.img" }), container_01x: createContainer({ open: false, tint: 2703694, ceilingImgs: [ { sprite: "map-building-container-ceiling-01.img", scale: 0.5, alpha: 1, tint: 2703694 }, { sprite: "map-snow-05.img", pos: v2.create(0, 3), scale: 0.6, alpha: 1, tint: 16777215, rot: 0 } ] }), container_06: createContainer({ open: false, tint: 12227840, ceilingSprite: "map-building-container-ceiling-01.img", loot_spawner_01: "loot_tier_sv98", loot_spawner_02: "loot_tier_scopes_sniper" }), loot_tier_1: { type: "loot_spawner", loot: [tierLoot("tier_world", 1, 1)], terrain: { grass: true, beach: true, riverShore: true } }, loot_tier_2: { type: "loot_spawner", loot: [tierLoot("tier_container", 1, 1)], terrain: { grass: true, beach: true, riverShore: true } }, loot_tier_beach: { type: "loot_spawner", loot: [tierLoot("tier_world", 1, 1)], terrain: { grass: false, beach: true } }, loot_tier_surviv: { type: "loot_spawner", loot: [tierLoot("tier_surviv", 1, 1)], terrain: { grass: true, beach: true, riverShore: true } }, loot_tier_vault_floor: { type: "loot_spawner", loot: [tierLoot("tier_vault_floor", 1, 1)] }, loot_tier_police_floor: { type: "loot_spawner", loot: [tierLoot("tier_police_floor", 1, 1)] }, loot_tier_mansion_floor: { type: "loot_spawner", loot: [tierLoot("tier_mansion_floor", 1, 1)] }, loot_tier_sv98: { type: "loot_spawner", loot: [tierLoot("tier_sv98", 1, 1)] }, loot_tier_scopes_sniper: { type: "loot_spawner", loot: [tierLoot("tier_scopes_sniper", 1, 1)] }, loot_tier_woodaxe: { type: "loot_spawner", loot: [tierLoot("tier_woodaxe", 1, 1)] }, loot_tier_fireaxe: { type: "loot_spawner", loot: [tierLoot("tier_fireaxe", 1, 1)] }, loot_tier_stonehammer: { type: "loot_spawner", loot: [tierLoot("tier_stonehammer", 1, 1)] }, loot_tier_sledgehammer: { type: "loot_spawner", loot: [tierLoot("tier_sledgehammer", 1, 1)] }, loot_tier_hatchet_melee: { type: "loot_spawner", loot: [tierLoot("tier_hatchet_melee", 1, 1)] }, loot_tier_club_melee: { type: "loot_spawner", loot: [tierLoot("tier_club_melee", 1, 1)] }, loot_tier_leaf_pile: { type: "loot_spawner", loot: [tierLoot("tier_leaf_pile", 1, 1)] }, loot_tier_islander_outfit: { type: "loot_spawner", loot: [tierLoot("tier_islander_outfit", 1, 1)] }, loot_tier_verde_outfit: { type: "loot_spawner", loot: [tierLoot("tier_verde_outfit", 1, 1)] }, loot_tier_lumber_outfit: { type: "loot_spawner", loot: [tierLoot("tier_lumber_outfit", 1, 1)] }, loot_tier_imperial_outfit: { type: "loot_spawner", loot: [tierLoot("tier_imperial_outfit", 1, 1)] }, loot_tier_pineapple_outfit: { type: "loot_spawner", loot: [tierLoot("tier_pineapple_outfit", 1, 1)] }, loot_tier_tarkhany_outfit: { type: "loot_spawner", loot: [tierLoot("tier_tarkhany_outfit", 1, 1)] }, loot_tier_spetsnaz_outfit: { type: "loot_spawner", loot: [tierLoot("tier_spetsnaz_outfit", 1, 1)] }, loot_tier_eye_01: { type: "loot_spawner", loot: [tierLoot("tier_eye_01", 1, 1)] }, loot_tier_eye_02: { type: "loot_spawner", loot: [tierLoot("tier_eye_02", 1, 1)] }, loot_tier_saloon: { type: "loot_spawner", loot: [tierLoot("tier_saloon", 1, 1)] }, loot_tier_chrys_01: { type: "loot_spawner", loot: [tierLoot("tier_chrys_01", 1, 1)] }, loot_tier_chrys_02: { type: "loot_spawner", loot: [tierLoot("tier_chrys_02", 1, 1)] }, loot_tier_chrys_02b: { type: "loot_spawner", loot: [tierLoot("tier_chrys_02b", 1, 1)] }, loot_tier_chrys_03: { type: "loot_spawner", loot: [tierLoot("tier_chrys_03", 1, 1)] }, loot_tier_airdrop_armor: { type: "loot_spawner", loot: [tierLoot("tier_airdrop_armor", 1, 1)] }, loot_tier_helmet_forest: { type: "loot_spawner", loot: [tierLoot("tier_forest_helmet", 1, 1)], terrain: { grass: true, beach: false } }, loot_tier_helmet_potato: { type: "loot_spawner", loot: [tierLoot("tier_potato_helmet", 1, 1)], terrain: { grass: true, beach: false } }, loot_tier_perk_test: { type: "loot_spawner", loot: [ autoLoot("explosive", 1), autoLoot("splinter", 1), autoLoot("scavenger_adv", 1) ], terrain: { grass: true, beach: false } }, loot_tier_sniper_test: { type: "loot_spawner", loot: [ autoLoot("l86", 1), autoLoot("svd", 1), autoLoot("vss", 1), autoLoot("blr", 1), autoLoot("scarssr", 1) ], terrain: { grass: true, beach: false } }, loot_tier_loot_test: { type: "loot_spawner", loot: [ autoLoot("explosive", 1), autoLoot("backpack03", 1), autoLoot("chest03", 1), autoLoot("helmet03", 1), autoLoot("scavenger_adv", 1), autoLoot("explosive", 1), autoLoot("splinter", 1), autoLoot("p30l", 1), autoLoot("p30l", 1), autoLoot("p30l", 1), autoLoot("p30l", 1), autoLoot("deagle", 1), autoLoot("deagle", 1), autoLoot("deagle", 1), autoLoot("ots38_dual", 1) ], terrain: { grass: true, beach: false } }, decal_barrel_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-barrel-res-01.img", scale: 0.24, alpha: 1, tint: 0, zIdx: 9 } }, decal_frag_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-barrel-res-01.img", scale: 0.2, alpha: 0.8, tint: 0, zIdx: 11 } }, decal_frag_small_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-barrel-res-01.img", scale: 0.12, alpha: 0.8, tint: 2105376, zIdx: 11 } }, decal_rounds_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, lifetime: { min: 2, max: 2.5 }, img: { sprite: "map-barrel-res-01.img", scale: 0.1, alpha: 0.8, tint: 3150346, zIdx: 11 } }, decal_bomb_iron_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, lifetime: { min: 6, max: 10 }, fadeChance: 0.6, img: { sprite: "map-barrel-res-01.img", scale: 0.2, alpha: 0.8, tint: 0, zIdx: 11 } }, decal_smoke_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-smoke-res.img", scale: 0.2, alpha: 0.5, tint: 16777215, zIdx: 11 } }, decal_snowball_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, lifetime: 5, fadeChance: 1, img: { sprite: "map-snowball-res.img", scale: 0.2, alpha: 0.25, tint: 16777215, zIdx: 11 } }, decal_potato_explosion: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, lifetime: 5, fadeChance: 1, img: { sprite: "map-potato-res.img", scale: 0.2, alpha: 0.25, tint: 16777215, zIdx: 11 } }, decal_vent_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-bunker-vent-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_vent_02: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-bunker-vent-02.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_vent_03: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-bunker-vent-03.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_hydra_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 3), height: 0, img: { sprite: "map-bunker-hydra-floor-04.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_pipes_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1, 4.5)), height: 1, img: { sprite: "map-pipes-01.img", scale: 0.5, alpha: 0.96, tint: 16777215, zIdx: 60 } }, decal_pipes_02: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 3)), height: 1, img: { sprite: "map-pipes-02.img", scale: 0.5, alpha: 0.96, tint: 16777215, zIdx: 60 } }, decal_pipes_03: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(10.5, 4)), height: 1, img: { sprite: "map-pipes-03.img", scale: 0.5, alpha: 0.96, tint: 16777215, zIdx: 60 } }, decal_pipes_04: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1, 5.5)), height: 1, img: { sprite: "map-pipes-04.img", scale: 0.5, alpha: 0.96, tint: 16777215, zIdx: 60 } }, decal_pipes_05: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1, 3.5)), height: 1, img: { sprite: "map-pipes-05.img", scale: 0.5, alpha: 0.96, tint: 16777215, zIdx: 60 } }, decal_initiative_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 3), height: 0, img: { sprite: "map-decal-initiative.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_web_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), height: 1, img: { sprite: "map-web-01.img", scale: 0.5, alpha: 0.75, tint: 16777215, zIdx: 60 } }, decal_light_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(3.25, 3.25)), height: 1, lifetime: 1e10, img: { sprite: "map-light-01.img", scale: 1, alpha: 0.5, tint: 16751616, zIdx: 60, flicker: true, flickerMin: 0.9, flickerMax: 1.1, flickerRate: 0.5, ignoreAdjust: true } }, decal_light_02: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)), height: 1, lifetime: 1e10, img: { sprite: "map-light-01.img", scale: 0.75, alpha: 0.5, tint: 16760397, zIdx: 60, flicker: true, flickerMin: 0.8, flickerMax: 1.2, flickerRate: 0.2, ignoreAdjust: true } }, decal_light_03: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)), height: 1, lifetime: 1e10, img: { sprite: "map-light-01.img", scale: 0.75, alpha: 0.5, tint: 8585216, zIdx: 60, flicker: true, flickerMin: 0.8, flickerMax: 1.2, flickerRate: 0.2, ignoreAdjust: true } }, decal_light_04: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.5, 2.5)), height: 1, lifetime: 1e10, img: { sprite: "map-light-01.img", scale: 0.75, alpha: 0.5, tint: 16734244, zIdx: 60, flicker: true, flickerMin: 0.5, flickerMax: 0.75, flickerRate: 0.4, ignoreAdjust: true } }, decal_blood_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), height: 0, img: { sprite: "part-splat-01.img", scale: 0.25, alpha: 0.95, tint: 4001294, zIdx: 0 } }, decal_blood_02: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), height: 0, img: { sprite: "part-splat-02.img", scale: 0.25, alpha: 0.95, tint: 4001294, zIdx: 0 } }, decal_blood_03: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(1.5, 1.5)), height: 0, img: { sprite: "part-splat-03.img", scale: 0.25, alpha: 0.95, tint: 4001294, zIdx: 0 } }, decal_chrys_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 1, img: { sprite: "map-bunker-vent-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 3 } }, decal_oil_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-decal-oil-01.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_oil_02: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-decal-oil-02.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_oil_03: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-decal-oil-03.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_oil_04: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-decal-oil-04.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_oil_05: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 1), height: 0, img: { sprite: "map-decal-oil-05.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_oil_06: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 2), height: 0, img: { sprite: "map-decal-oil-06.img", scale: 0.5, alpha: 1, tint: 16777215, zIdx: 0 } }, decal_bathhouse_pool_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(9, 15)), height: 1, surface: { type: "water", data: { waterColor: 5157572, rippleColor: 10478319 } }, img: { sprite: "map-bathhouse-pool-01.img", scale: 8, alpha: 0.5, tint: 52721, zIdx: 5 }, gore: { fade: { start: 0, end: 4, pow: 0.5, speed: 2 }, tint: 7667727, alpha: 0.85, waterColor: 8529201, rippleColor: 11490399 } }, decal_club_01: { type: "decal", collision: collider.createCircle(v2.create(0, 0), 4), height: 0, img: { sprite: "map-decal-club-01.img", scale: 1, alpha: 1, tint: 16777215, zIdx: 4 } }, decal_club_02: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(4, 10.5)), height: 1, img: { sprite: "map-decal-club-02.img", scale: 1, alpha: 0, tint: 16777215, zIdx: 4 }, gore: { fade: { start: 4, end: 6, pow: 3.25, speed: 0.5 }, alpha: 1 } }, decal_plank_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(2.25, 2.25)), height: 0, img: { sprite: "part-plank-01.img", scale: 0.5, alpha: 1, tint: 4327436, zIdx: 9 } }, decal_flyer_01: { type: "decal", collision: collider.createAabbExtents(v2.create(0, 0), v2.create(0.5, 1)), height: 0, img: { sprite: "map-decal-flyer-01.img", scale: 0.6, alpha: 0.667, tint: 16777215, zIdx: 4 } } }; var BitView = function BitView2(source, byteOffset, byteLength) { var isBuffer = source instanceof ArrayBuffer || typeof Buffer !== "undefined" && source instanceof Buffer; if (!isBuffer) { throw new Error("Must specify a valid ArrayBuffer or Buffer."); } byteOffset = byteOffset || 0; byteLength = byteLength || source.byteLength || source.length; this._view = new Uint8Array(source, byteOffset, byteLength); }; BitView._scratch = new DataView(new ArrayBuffer(8)); Object.defineProperty(BitView.prototype, "buffer", { get: function get() { return Buffer.from(this._view.buffer); }, enumerable: true, configurable: false }); Object.defineProperty(BitView.prototype, "byteLength", { get: function get2() { return this._view.length; }, enumerable: true, configurable: false }); BitView.prototype._setBit = function(offset, on) { if (on) { this._view[offset >> 3] |= 1 << (offset & 7); } else { this._view[offset >> 3] &= ~(1 << (offset & 7)); } }; BitView.prototype.getBits = function(offset, bits, signed) { var available = this._view.length * 8 - offset; if (bits > available) { throw new Error( `Cannot get ${bits} bit(s) from offset ${offset}, ${available} available` ); } var value = 0; for (var i = 0; i < bits; ) { var remaining = bits - i; var bitOffset = offset & 7; var currentByte = this._view[offset >> 3]; var read = math.min(remaining, 8 - bitOffset); var mask = (1 << read) - 1; var readBits = currentByte >> bitOffset & mask; value |= readBits << i; offset += read; i += read; } if (signed) { if (bits !== 32 && value & 1 << bits - 1) { value |= -1 ^ (1 << bits) - 1; } return value; } return value >>> 0; }; BitView.prototype.setBits = function(offset, value, bits) { var available = this._view.length * 8 - offset; if (bits > available) { throw new Error( `Cannot set ${bits} bit(s) from offset ${offset}, ${available} available` ); } for (var i = 0; i < bits; ) { var wrote; if (bits - i >= 8 && (offset & 7) === 0) { this._view[offset >> 3] = value & 255; wrote = 8; } else { this._setBit(offset, value & 1); wrote = 1; } value = value >> wrote; offset += wrote; i += wrote; } }; BitView.prototype.getBoolean = function(offset) { return this.getBits(offset, 1, false) !== 0; }; BitView.prototype.getInt8 = function(offset) { return this.getBits(offset, 8, true); }; BitView.prototype.getUint8 = function(offset) { return this.getBits(offset, 8, false); }; BitView.prototype.getInt16 = function(offset) { return this.getBits(offset, 16, true); }; BitView.prototype.getUint16 = function(offset) { return this.getBits(offset, 16, false); }; BitView.prototype.getInt32 = function(offset) { return this.getBits(offset, 32, true); }; BitView.prototype.getUint32 = function(offset) { return this.getBits(offset, 32, false); }; BitView.prototype.getFloat32 = function(offset) { BitView._scratch.setUint32(0, this.getUint32(offset)); return BitView._scratch.getFloat32(0); }; BitView.prototype.getFloat64 = function(offset) { BitView._scratch.setUint32(0, this.getUint32(offset)); BitView._scratch.setUint32(4, this.getUint32(offset + 32)); return BitView._scratch.getFloat64(0); }; BitView.prototype.setBoolean = function(offset, value) { this.setBits(offset, value ? 1 : 0, 1); }; BitView.prototype.setInt8 = BitView.prototype.setUint8 = function(offset, value) { this.setBits(offset, value, 8); }; BitView.prototype.setInt16 = BitView.prototype.setUint16 = function(offset, value) { this.setBits(offset, value, 16); }; BitView.prototype.setInt32 = BitView.prototype.setUint32 = function(offset, value) { this.setBits(offset, value, 32); }; BitView.prototype.setFloat32 = function(offset, value) { BitView._scratch.setFloat32(0, value); this.setBits(offset, BitView._scratch.getUint32(0), 32); }; BitView.prototype.setFloat64 = function(offset, value) { BitView._scratch.setFloat64(0, value); this.setBits(offset, BitView._scratch.getUint32(0), 32); this.setBits(offset + 32, BitView._scratch.getUint32(4), 32); }; BitView.prototype.getArrayBuffer = function(offset, byteLength) { var buffer = new Uint8Array(byteLength); for (var i = 0; i < byteLength; i++) { buffer[i] = this.getUint8(offset + i * 8); } return buffer; }; var reader = function reader2(name, size) { return function() { if (this._index + size > this._length) { throw new Error("Trying to read past the end of the stream"); } var val = this._view[name](this._index); this._index += size; return val; }; }; var writer = function writer2(name, size) { return function(value) { this._view[name](this._index, value); this._index += size; }; }; function readASCIIString(stream, bytes) { return readString(stream, bytes, false); } function readUTF8String(stream, bytes) { return readString(stream, bytes, true); } function readString(stream, bytes, utf8) { if (bytes === 0) { return ""; } var i = 0; var chars = []; var append = true; var fixedLength = !!bytes; if (!bytes) { bytes = Math.floor((stream._length - stream._index) / 8); } while (i < bytes) { var c = stream.readUint8(); if (c === 0) { append = false; if (!fixedLength) { break; } } if (append) { chars.push(c); } i++; } var string = String.fromCharCode.apply(null, chars); if (utf8) { try { return decodeURIComponent(escape(string)); } catch (_e) { return string; } } else { return string; } } function writeASCIIString(stream, string, bytes) { var length = bytes || string.length + 1; for (var i = 0; i < length; i++) { stream.writeUint8(i < string.length ? string.charCodeAt(i) : 0); } } function writeUTF8String(stream, string, bytes) { var byteArray = stringToByteArray(string); var length = bytes || byteArray.length + 1; for (var i = 0; i < length; i++) { stream.writeUint8(i < byteArray.length ? byteArray[i] : 0); } } function stringToByteArray(str) { var b = [], i, unicode; for (i = 0; i < str.length; i++) { unicode = str.charCodeAt(i); if (unicode <= 127) { b.push(unicode); } else if (unicode <= 2047) { b.push(unicode >> 6 | 192); b.push(unicode & 63 | 128); } else if (unicode <= 65535) { b.push(unicode >> 12 | 224); b.push(unicode >> 6 & 63 | 128); b.push(unicode & 63 | 128); } else { b.push(unicode >> 18 | 240); b.push(unicode >> 12 & 63 | 128); b.push(unicode >> 6 & 63 | 128); b.push(unicode & 63 | 128); } } return b; } var BitStream$1 = function BitStream(source, byteOffset, byteLength) { var isBuffer = source instanceof ArrayBuffer || typeof Buffer !== "undefined" && source instanceof Buffer; if (!(source instanceof BitView) && !isBuffer) { throw new Error("Must specify a valid BitView, ArrayBuffer or Buffer"); } if (isBuffer) { this._view = new BitView(source, byteOffset, byteLength); } else { this._view = source; } this._index = 0; this._startIndex = 0; this._length = this._view.byteLength * 8; }; Object.defineProperty(BitStream$1.prototype, "index", { get: function get3() { return this._index - this._startIndex; }, set: function set(val) { this._index = val + this._startIndex; }, enumerable: true, configurable: true }); Object.defineProperty(BitStream$1.prototype, "length", { get: function get4() { return this._length - this._startIndex; }, set: function set2(val) { this._length = val + this._startIndex; }, enumerable: true, configurable: true }); Object.defineProperty(BitStream$1.prototype, "bitsLeft", { get: function get5() { return this._length - this._index; }, enumerable: true, configurable: true }); Object.defineProperty(BitStream$1.prototype, "byteIndex", { // Ceil the returned value, over compensating for the amount of // bits written to the stream. get: function get6() { return Math.ceil(this._index / 8); }, set: function set3(val) { this._index = val * 8; }, enumerable: true, configurable: true }); Object.defineProperty(BitStream$1.prototype, "buffer", { get: function get7() { return this._view.buffer; }, enumerable: true, configurable: false }); Object.defineProperty(BitStream$1.prototype, "view", { get: function get8() { return this._view; }, enumerable: true, configurable: false }); BitStream$1.prototype.readBits = function(bits, signed) { var val = this._view.getBits(this._index, bits, signed); this._index += bits; return val; }; BitStream$1.prototype.writeBits = function(value, bits) { this._view.setBits(this._index, value, bits); this._index += bits; }; BitStream$1.prototype.readBoolean = reader("getBoolean", 1); BitStream$1.prototype.readInt8 = reader("getInt8", 8); BitStream$1.prototype.readUint8 = reader("getUint8", 8); BitStream$1.prototype.readInt16 = reader("getInt16", 16); BitStream$1.prototype.readUint16 = reader("getUint16", 16); BitStream$1.prototype.readInt32 = reader("getInt32", 32); BitStream$1.prototype.readUint32 = reader("getUint32", 32); BitStream$1.prototype.readFloat32 = reader("getFloat32", 32); BitStream$1.prototype.readFloat64 = reader("getFloat64", 64); BitStream$1.prototype.writeBoolean = writer("setBoolean", 1); BitStream$1.prototype.writeInt8 = writer("setInt8", 8); BitStream$1.prototype.writeUint8 = writer("setUint8", 8); BitStream$1.prototype.writeInt16 = writer("setInt16", 16); BitStream$1.prototype.writeUint16 = writer("setUint16", 16); BitStream$1.prototype.writeInt32 = writer("setInt32", 32); BitStream$1.prototype.writeUint32 = writer("setUint32", 32); BitStream$1.prototype.writeFloat32 = writer("setFloat32", 32); BitStream$1.prototype.writeFloat64 = writer("setFloat64", 64); BitStream$1.prototype.readASCIIString = function(bytes) { return readASCIIString(this, bytes); }; BitStream$1.prototype.readUTF8String = function(bytes) { return readUTF8String(this, bytes); }; BitStream$1.prototype.writeASCIIString = function(string, bytes) { writeASCIIString(this, string, bytes); }; BitStream$1.prototype.writeUTF8String = function(string, bytes) { writeUTF8String(this, string, bytes); }; BitStream$1.prototype.readBitStream = function(bitLength) { var slice = new BitStream$1(this._view); slice._startIndex = this._index; slice._index = this._index; slice.length = bitLength; this._index += bitLength; return slice; }; BitStream$1.prototype.writeBitStream = function(stream, length) { if (!length) { length = stream.bitsLeft; } var bitsToWrite; while (length > 0) { bitsToWrite = math.min(length, 32); this.writeBits(stream.readBits(bitsToWrite), bitsToWrite); length -= bitsToWrite; } }; BitStream$1.prototype.readArrayBuffer = function(byteLength) { var buffer = this._view.getArrayBuffer(this._index, byteLength); this._index += byteLength * 8; return buffer; }; BitStream$1.prototype.writeArrayBuffer = function(buffer, byteLength) { this.writeBitStream(new BitStream$1(buffer), byteLength * 8); }; class DisconnectMsg { constructor() { __publicField(this, "reason", ""); } serialize(s) { s.writeString(this.reason); } deserialize(s) { this.reason = s.readString(); } } class InputMsg { constructor() { __publicField(this, "seq", 0); __publicField(this, "moveLeft", false); __publicField(this, "moveRight", false); __publicField(this, "moveUp", false); __publicField(this, "moveDown", false); __publicField(this, "shootStart", false); __publicField(this, "shootHold", false); __publicField(this, "portrait", false); __publicField(this, "touchMoveActive", false); __publicField(this, "touchMoveDir", v2.create(1, 0)); __publicField(this, "touchMoveLen", 255); __publicField(this, "toMouseDir", v2.create(1, 0)); __publicField(this, "toMouseLen", 0); __publicField(this, "inputs", []); __publicField(this, "useItem", ""); } addInput(input) { if (this.inputs.length < 7 && !this.inputs.includes(input)) { this.inputs.push(input); } } serialize(s) { s.writeUint8(this.seq); s.writeBoolean(this.moveLeft); s.writeBoolean(this.moveRight); s.writeBoolean(this.moveUp); s.writeBoolean(this.moveDown); s.writeBoolean(this.shootStart); s.writeBoolean(this.shootHold); s.writeBoolean(this.portrait); s.writeBoolean(this.touchMoveActive); if (this.touchMoveActive) { s.writeUnitVec(this.touchMoveDir, 8); s.writeUint8(this.touchMoveLen); } s.writeUnitVec(this.toMouseDir, 10); s.writeFloat(this.toMouseLen, 0, Constants.MouseMaxDist, 8); s.writeBits(this.inputs.length, 4); for (let i = 0; i < this.inputs.length; i++) { s.writeUint8(this.inputs[i]); } s.writeGameType(this.useItem); s.writeBits(0, 6); } deserialize(s) { this.seq = s.readUint8(); this.moveLeft = s.readBoolean(); this.moveRight = s.readBoolean(); this.moveUp = s.readBoolean(); this.moveDown = s.readBoolean(); this.shootStart = s.readBoolean(); this.shootHold = s.readBoolean(); this.portrait = s.readBoolean(); this.touchMoveActive = s.readBoolean(); if (this.touchMoveActive) { this.touchMoveDir = s.readUnitVec(8); this.touchMoveLen = s.readUint8(); } this.toMouseDir = s.readUnitVec(10); this.toMouseLen = s.readFloat(0, Constants.MouseMaxDist, 8); const length = s.readBits(4); for (let i = 0; i < length; i++) { this.inputs.push(s.readUint8()); } this.useItem = s.readGameType(); s.readBits(6); } } class JoinedMsg { constructor() { __publicField(this, "teamMode"); __publicField(this, "playerId", 0); __publicField(this, "started", false); __publicField(this, "emotes", []); } serialize(s) { s.writeUint8(this.teamMode); s.writeUint16(this.playerId); s.writeBoolean(this.started); s.writeUint8(this.emotes.length); for (let i = 0; i < this.emotes.length; i++) { s.writeGameType(this.emotes[i]); } s.writeAlignToNextByte(); } deserialize(s) { this.teamMode = s.readUint8(); this.playerId = s.readUint16(); this.started = s.readBoolean(); const count = s.readUint8(); for (let i = 0; i < count; i++) { const emote = s.readGameType(); this.emotes.push(emote); } s.readAlignToNextByte(); } } var ObjectType = /* @__PURE__ */ ((ObjectType2) => { ObjectType2[ObjectType2["Invalid"] = 0] = "Invalid"; ObjectType2[ObjectType2["Player"] = 1] = "Player"; ObjectType2[ObjectType2["Obstacle"] = 2] = "Obstacle"; ObjectType2[ObjectType2["Loot"] = 3] = "Loot"; ObjectType2[ObjectType2["LootSpawner"] = 4] = "LootSpawner"; ObjectType2[ObjectType2["DeadBody"] = 5] = "DeadBody"; ObjectType2[ObjectType2["Building"] = 6] = "Building"; ObjectType2[ObjectType2["Structure"] = 7] = "Structure"; ObjectType2[ObjectType2["Decal"] = 8] = "Decal"; ObjectType2[ObjectType2["Projectile"] = 9] = "Projectile"; ObjectType2[ObjectType2["Smoke"] = 10] = "Smoke"; ObjectType2[ObjectType2["Airdrop"] = 11] = "Airdrop"; return ObjectType2; })(ObjectType || {}); const ObjectSerializeFns = { [ 1 /* Player */ ]: { serializedFullSize: 32, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeUnitVec(data.dir, 8); }, serializeFull: (s, data) => { s.writeGameType(data.outfit); s.writeGameType(data.backpack); s.writeGameType(data.helmet); s.writeGameType(data.chest); s.writeGameType(data.activeWeapon); s.writeBits(data.layer, 2); s.writeBoolean(data.dead); s.writeBoolean(data.downed); s.writeBits(data.animType, 3); s.writeBits(data.animSeq, 3); s.writeBits(data.actionType, 3); s.writeBits(data.actionSeq, 3); s.writeBoolean(data.wearingPan); s.writeBoolean(data.healEffect); s.writeBoolean(data.frozen); s.writeBits(data.frozenOri, 2); s.writeBoolean(data.hasteType !== HasteType.None); if (data.hasteType !== HasteType.None) { s.writeBits(data.hasteType, 3); s.writeBits(data.hasteSeq, 3); } s.writeBoolean(data.actionItem !== ""); if (data.actionItem !== "") { s.writeGameType(data.actionItem); } s.writeBoolean(data.hasScale); if (data.hasScale) { s.writeFloat( data.scale, Constants.PlayerMinScale, Constants.PlayerMaxScale, 8 ); } s.writeBoolean(data.role !== ""); if (data.role !== "") { s.writeGameType(data.role); } s.writeBoolean(data.hasPerks); if (data.hasPerks) { const perkAmount = math.min(data.perks.length, Constants.MaxPerks - 1); s.writeBits(perkAmount, 3); for (let i = 0; i < perkAmount; i++) { const perk = data.perks[i]; s.writeGameType(perk.type); s.writeBoolean(perk.droppable); } } s.writeAlignToNextByte(); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.dir = s.readUnitVec(8); }, deserializeFull(s, data) { data.outfit = s.readGameType(); data.backpack = s.readGameType(); data.helmet = s.readGameType(); data.chest = s.readGameType(); data.activeWeapon = s.readGameType(); data.layer = s.readBits(2); data.dead = s.readBoolean(); data.downed = s.readBoolean(); data.animType = s.readBits(3); data.animSeq = s.readBits(3); data.actionType = s.readBits(3); data.actionSeq = s.readBits(3); data.wearingPan = s.readBoolean(); data.healEffect = s.readBoolean(); data.frozen = s.readBoolean(); data.frozenOri = s.readBits(2); data.hasteType = 0; data.hasteSeq = -1; if (s.readBoolean()) { data.hasteType = s.readBits(3); data.hasteSeq = s.readBits(3); } const hasActionItem = s.readBoolean(); data.actionItem = hasActionItem ? s.readGameType() : ""; const hasScale = s.readBoolean(); data.scale = hasScale ? s.readFloat(Constants.PlayerMinScale, Constants.PlayerMaxScale, 8) : 1; const hasRole = s.readBoolean(); data.role = hasRole ? s.readGameType() : ""; data.perks = []; const hasPerks = s.readBoolean(); if (hasPerks) { const perkCount = s.readBits(3); for (let i = 0; i < perkCount; i++) { const type = s.readGameType(); const droppable = s.readBoolean(); data.perks.push({ type, droppable }); } } s.readAlignToNextByte(); } }, [ 2 /* Obstacle */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeBits(data.ori, 2); s.writeFloat( data.scale, Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8 ); s.writeBits(0, 6); }, serializeFull: (s, data) => { s.writeFloat(data.healthT, 0, 1, 8); s.writeMapType(data.type); s.writeBits(data.layer, 2); s.writeBoolean(data.dead); s.writeBoolean(data.isDoor); if (data.isDoor) { s.writeBoolean(data.door.open); s.writeBoolean(data.door.canUse); s.writeBoolean(data.door.locked); s.writeBits(data.door.seq, 5); } s.writeBoolean(data.isButton); if (data.isButton) { s.writeBoolean(data.button.onOff); s.writeBoolean(data.button.canUse); s.writeBits(data.button.seq, 6); } s.writeBoolean(data.isPuzzlePiece); if (data.isPuzzlePiece) s.writeUint16(data.parentBuildingId); s.writeBoolean(data.isSkin); if (data.isSkin) s.writeUint16(data.skinPlayerId); s.writeBits(0, 5); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.ori = s.readBits(2); data.scale = s.readFloat( Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8 ); s.readBits(6); }, deserializeFull: (s, data) => { data.healthT = s.readFloat(0, 1, 8); data.type = s.readMapType(); data.layer = s.readBits(2); data.dead = s.readBoolean(); data.isDoor = s.readBoolean(); if (data.isDoor) { data.door = {}; data.door.open = s.readBoolean(); data.door.canUse = s.readBoolean(); data.door.locked = s.readBoolean(); data.door.seq = s.readBits(5); } data.isButton = s.readBoolean(); if (data.isButton) { data.button = {}; data.button.onOff = s.readBoolean(); data.button.canUse = s.readBoolean(); data.button.seq = s.readBits(6); } data.isPuzzlePiece = s.readBoolean(); if (data.isPuzzlePiece) { data.parentBuildingId = s.readUint16(); } data.isSkin = s.readBoolean(); if (data.isSkin) { data.skinPlayerId = s.readUint16(); } s.readBits(5); } }, [ 6 /* Building */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeBoolean(data.ceilingDead); s.writeBoolean(data.occupied); s.writeBoolean(data.ceilingDamaged); s.writeBoolean(data.hasPuzzle); if (data.hasPuzzle) { s.writeBoolean(data.puzzleSolved); s.writeBits(data.puzzleErrSeq, 7); } s.writeBits(0, 4); }, serializeFull: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeMapType(data.type); s.writeBits(data.ori, 2); s.writeBits(data.layer, 2); }, deserializePart: (s, data) => { data.ceilingDead = s.readBoolean(); data.occupied = s.readBoolean(); data.ceilingDamaged = s.readBoolean(); data.hasPuzzle = s.readBoolean(); if (data.hasPuzzle) { data.puzzleSolved = s.readBoolean(); data.puzzleErrSeq = s.readBits(7); } s.readBits(4); }, deserializeFull: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.type = s.readMapType(); data.ori = s.readBits(2); data.layer = s.readBits(2); } }, [ 7 /* Structure */ ]: { serializedFullSize: 0, serializePart: () => { }, serializeFull: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeMapType(data.type); s.writeBits(data.ori, 2); s.writeBoolean(data.interiorSoundEnabled); s.writeBoolean(data.interiorSoundAlt); for (let r = 0; r < GameConfig.structureLayerCount; r++) { s.writeUint16(data.layerObjIds[r]); } }, deserializePart: () => { }, deserializeFull: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.type = s.readMapType(); data.ori = s.readBits(2); data.interiorSoundEnabled = s.readBoolean(); data.interiorSoundAlt = s.readBoolean(); data.layerObjIds = []; for (let r = 0; r < GameConfig.structureLayerCount; r++) { const a = s.readUint16(); data.layerObjIds.push(a); } } }, [ 4 /* LootSpawner */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeMapType(data.type); s.writeBits(data.layer, 2); s.writeBits(0, 2); }, serializeFull: () => { }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.type = s.readMapType(); data.layer = s.readBits(2); s.readBits(2); }, deserializeFull: () => { } }, [ 3 /* Loot */ ]: { serializedFullSize: 5, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); }, serializeFull: (s, data) => { s.writeGameType(data.type); s.writeUint8(data.count); s.writeBits(data.layer, 2); s.writeBoolean(data.isOld); s.writeBoolean(data.isPreloadedGun); s.writeBoolean(data.ownerId != 0); if (data.ownerId != 0) { s.writeUint16(data.ownerId); } s.writeBits(0, 1); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); }, deserializeFull: (s, data) => { data.type = s.readGameType(); data.count = s.readUint8(); data.layer = s.readBits(2); data.isOld = s.readBoolean(); data.isPreloadedGun = s.readBoolean(); data.hasOwner = s.readBoolean(); if (data.hasOwner) { data.ownerId = s.readUint16(); } s.readBits(1); } }, [ 5 /* DeadBody */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); }, serializeFull: (s, data) => { s.writeUint8(data.layer); s.writeUint16(data.playerId); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); }, deserializeFull: (s, data) => { data.layer = s.readUint8(); data.playerId = s.readUint16(); } }, [ 8 /* Decal */ ]: { serializedFullSize: 0, serializePart: () => { }, serializeFull: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeFloat( data.scale, Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8 ); s.writeMapType(data.type); s.writeBits(data.ori, 2); s.writeBits(data.layer, 2); s.writeUint8(data.goreKills); }, deserializePart: () => { }, deserializeFull: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.scale = s.readFloat( Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8 ); data.type = s.readMapType(); data.ori = s.readBits(2); data.layer = s.readBits(2); data.goreKills = s.readUint8(); } }, [ 9 /* Projectile */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeFloat(data.posZ, 0, GameConfig.projectile.maxHeight, 10); s.writeUnitVec(data.dir, 7); }, serializeFull: (s, data) => { s.writeGameType(data.type); s.writeBits(data.layer, 2); s.writeBits(0, 4); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.posZ = s.readFloat(0, GameConfig.projectile.maxHeight, 10); data.dir = s.readUnitVec(7); }, deserializeFull: (s, data) => { data.type = s.readGameType(); data.layer = s.readBits(2); s.readBits(4); } }, [ 10 /* Smoke */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); s.writeFloat(data.rad, 0, Constants.SmokeMaxRad, 8); }, serializeFull: (s, data) => { s.writeBits(data.layer, 2); s.writeBits(data.interior, 6); }, deserializePart: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.rad = s.readFloat(0, Constants.SmokeMaxRad, 8); }, deserializeFull: (s, data) => { data.layer = s.readBits(2); data.interior = s.readBits(6); } }, [ 11 /* Airdrop */ ]: { serializedFullSize: 0, serializePart: (s, data) => { s.writeFloat(data.fallT, 0, 1, 7); s.writeBoolean(data.landed); }, serializeFull: (s, data) => { s.writeVec(data.pos, 0, 0, 1024, 1024, 16); }, deserializePart: (s, data) => { data.fallT = s.readFloat(0, 1, 7); data.landed = s.readBoolean(); }, deserializeFull: (s, data) => { data.pos = s.readVec(0, 0, 1024, 1024, 16); } }, // * to please ts [ 0 /* Invalid */ ]: { serializedFullSize: 0, deserializeFull: () => { }, deserializePart: () => { }, serializeFull: () => { }, serializePart: () => { } } }; function serializeActivePlayer(s, data) { s.writeBoolean(data.healthDirty); if (data.healthDirty) s.writeFloat(data.health, 0, 100, 8); s.writeBoolean(data.boostDirty); if (data.boostDirty) s.writeFloat(data.boost, 0, 100, 8); s.writeBoolean(data.zoomDirty); if (data.zoomDirty) s.writeUint8(data.zoom); s.writeBoolean(data.actionDirty); if (data.actionDirty) { s.writeFloat(data.action.time, 0, Constants.ActionMaxDuration, 8); s.writeFloat(data.action.duration, 0, Constants.ActionMaxDuration, 8); s.writeUint16(data.action.targetId); } s.writeBoolean(data.inventoryDirty); if (data.inventoryDirty) { s.writeGameType(data.scope); for (const key of Object.keys(GameConfig.bagSizes)) { const hasItem = data.inventory[key] > 0; s.writeBoolean(hasItem); if (hasItem) s.writeBits(data.inventory[key], 9); } } s.writeBoolean(data.weapsDirty); if (data.weapsDirty) { s.writeBits(data.curWeapIdx, 2); for (let i = 0; i < GameConfig.WeaponSlot.Count; i++) { s.writeGameType(data.weapons[i].type); s.writeUint8(data.weapons[i].ammo); } } s.writeBoolean(data.spectatorCountDirty); if (data.spectatorCountDirty) { s.writeUint8(data.spectatorCount); } s.writeAlignToNextByte(); } function deserializeActivePlayer(s, data) { data.healthDirty = s.readBoolean(); if (data.healthDirty) { data.health = s.readFloat(0, 100, 8); } data.boostDirty = s.readBoolean(); if (data.boostDirty) { data.boost = s.readFloat(0, 100, 8); } data.zoomDirty = s.readBoolean(); if (data.zoomDirty) { data.zoom = s.readUint8(); } data.actionDirty = s.readBoolean(); if (data.actionDirty) { data.action = {}; data.action.time = s.readFloat(0, Constants.ActionMaxDuration, 8); data.action.duration = s.readFloat(0, Constants.ActionMaxDuration, 8); data.action.targetId = s.readUint16(); } data.inventoryDirty = s.readBoolean(); if (data.inventoryDirty) { data.scope = s.readGameType(); data.inventory = {}; const inventoryKeys = Object.keys(GameConfig.bagSizes); for (let i = 0; i < inventoryKeys.length; i++) { const item = inventoryKeys[i]; let count = 0; if (s.readBoolean()) { count = s.readBits(9); } data.inventory[item] = count; } } data.weapsDirty = s.readBoolean(); if (data.weapsDirty) { data.curWeapIdx = s.readBits(2); data.weapons = []; for (let i = 0; i < GameConfig.WeaponSlot.Count; i++) { data.weapons.push({ type: s.readGameType(), ammo: s.readUint8() }); } } data.spectatorCountDirty = s.readBoolean(); if (data.spectatorCountDirty) { data.spectatorCount = s.readUint8(); } s.readAlignToNextByte(); } function serializePlayerStatus(s, data) { s.writeUint8(data.players.length); for (let i = 0; i < data.players.length; i++) { const info = data.players[i]; s.writeBoolean(info.hasData); if (info.hasData) { s.writeVec(info.pos, 0, 0, 1024, 1024, 11); s.writeBoolean(info.visible); s.writeBoolean(info.dead); s.writeBoolean(info.downed); s.writeBoolean(info.role !== ""); if (info.role !== "") { s.writeGameType(info.role); } } } s.writeAlignToNextByte(); } function deserializePlayerStatus(s, data) { data.players = []; const count = s.readUint8(); for (let i = 0; i < count; i++) { const p = {}; p.hasData = s.readBoolean(); if (p.hasData) { p.pos = s.readVec(0, 0, 1024, 1024, 11); p.visible = s.readBoolean(); p.dead = s.readBoolean(); p.downed = s.readBoolean(); p.role = ""; if (s.readBoolean()) { p.role = s.readGameType(); } } data.players.push(p); } s.readAlignToNextByte(); } function serializeGroupStatus(s, data) { s.writeUint8(data.players.length); for (let i = 0; i < data.players.length; i++) { const status = data.players[i]; s.writeFloat(status.health, 0, 100, 7); s.writeBoolean(status.disconnected); } } function deserializeGroupStatus(s, data) { data.players = []; const count = s.readUint8(); for (let i = 0; i < count; i++) { const p = {}; p.health = s.readFloat(0, 100, 7); p.disconnected = s.readBoolean(); data.players.push(p); } } function serializePlayerInfo(s, data) { s.writeUint16(data.playerId); s.writeUint8(data.teamId); s.writeUint8(data.groupId); s.writeString(data.name); s.writeGameType(data.loadout.heal); s.writeGameType(data.loadout.boost); s.writeAlignToNextByte(); } function deserializePlayerInfo(s, data) { data.playerId = s.readUint16(); data.teamId = s.readUint8(); data.groupId = s.readUint8(); data.name = s.readString(); data.loadout = {}; data.loadout.heal = s.readGameType(); data.loadout.boost = s.readGameType(); s.readAlignToNextByte(); } function serializeGasData(s, data) { s.writeUint8(data.mode); s.writeFloat32(data.duration); s.writeVec(data.posOld, 0, 0, 1024, 1024, 16); s.writeVec(data.posNew, 0, 0, 1024, 1024, 16); s.writeFloat(data.radOld, 0, 2048, 16); s.writeFloat(data.radNew, 0, 2048, 16); } function deserializeGasData(s, data) { data.mode = s.readUint8(); data.duration = s.readFloat32(); data.posOld = s.readVec(0, 0, 1024, 1024, 16); data.posNew = s.readVec(0, 0, 1024, 1024, 16); data.radOld = s.readFloat(0, 2048, 16); data.radNew = s.readFloat(0, 2048, 16); } const UpdateExtFlags = { DeletedObjects: 1 << 0, FullObjects: 1 << 1, ActivePlayerId: 1 << 2, Gas: 1 << 3, GasCircle: 1 << 4, PlayerInfos: 1 << 5, DeletePlayerIds: 1 << 6, PlayerStatus: 1 << 7, GroupStatus: 1 << 8, Bullets: 1 << 9, Explosions: 1 << 10, Emotes: 1 << 11, Planes: 1 << 12, AirstrikeZones: 1 << 13, MapIndicators: 1 << 14, KillLeader: 1 << 15 }; class UpdateMsg { constructor() { __publicField(this, "delObjIds", []); __publicField(this, "fullObjects", []); __publicField(this, "partObjects", []); __publicField(this, "activePlayerId", 0); __publicField(this, "activePlayerIdDirty", false); __publicField(this, "activePlayerData"); __publicField(this, "gasData"); __publicField(this, "gasDirty", false); __publicField(this, "gasT", 0); __publicField(this, "gasTDirty", false); __publicField(this, "playerInfos", []); __publicField(this, "deletedPlayerIds", []); __publicField(this, "playerStatus", { players: [] }); __publicField(this, "playerStatusDirty", false); __publicField(this, "groupStatus", { players: [] }); __publicField(this, "groupStatusDirty", false); __publicField(this, "bullets", []); __publicField(this, "explosions", []); __publicField(this, "emotes", []); __publicField(this, "planes", []); __publicField(this, "airstrikeZones", []); __publicField(this, "mapIndicators", []); __publicField(this, "killLeaderId", 0); __publicField(this, "killLeaderKills", 0); __publicField(this, "killLeaderDirty", false); __publicField(this, "ack", 0); } serialize(s) { let flags = 0; const flagsIdx = s.byteIndex; s.writeUint16(flags); if (this.delObjIds.length) { s.writeUint16(this.delObjIds.length); for (let i = 0; i < this.delObjIds.length; i++) { s.writeUint16(this.delObjIds[i]); } flags |= UpdateExtFlags.DeletedObjects; } if (this.fullObjects.length) { s.writeUint16(this.fullObjects.length); for (let i = 0; i < this.fullObjects.length; i++) { const obj = this.fullObjects[i]; s.writeUint8(obj.__type); s.writeBytes(obj.partialStream, 0, obj.partialStream.byteIndex); s.writeBytes(obj.fullStream, 0, obj.fullStream.byteIndex); } flags |= UpdateExtFlags.FullObjects; } s.writeUint16(this.partObjects.length); for (let i = 0; i < this.partObjects.length; i++) { const obj = this.partObjects[i]; s.writeBytes(obj.partialStream, 0, obj.partialStream.byteIndex); } if (this.activePlayerIdDirty) { s.writeUint16(this.activePlayerId); flags |= UpdateExtFlags.ActivePlayerId; } serializeActivePlayer(s, this.activePlayerData); if (this.gasDirty) { serializeGasData(s, this.gasData); flags |= UpdateExtFlags.Gas; } if (this.gasTDirty) { s.writeFloat(this.gasT, 0, 1, 16); flags |= UpdateExtFlags.GasCircle; } if (this.playerInfos.length) { s.writeUint8(this.playerInfos.length); for (let i = 0; i < this.playerInfos.length; i++) { serializePlayerInfo(s, this.playerInfos[i]); } flags |= UpdateExtFlags.PlayerInfos; } if (this.deletedPlayerIds.length) { s.writeUint8(this.deletedPlayerIds.length); for (let i = 0; i < this.deletedPlayerIds.length; i++) { s.writeUint16(this.deletedPlayerIds[i]); } flags |= UpdateExtFlags.DeletePlayerIds; } if (this.playerStatusDirty) { serializePlayerStatus(s, this.playerStatus); flags |= UpdateExtFlags.PlayerStatus; } if (this.groupStatusDirty) { serializeGroupStatus(s, this.groupStatus); flags |= UpdateExtFlags.GroupStatus; } if (this.bullets.length) { s.writeUint8(this.bullets.length); for (let i = 0; i < this.bullets.length; i++) { const bullet = this.bullets[i]; s.writeUint16(bullet.playerId); s.writeVec(bullet.startPos, 0, 0, 1024, 1024, 16); s.writeUnitVec(bullet.dir, 8); s.writeGameType(bullet.bulletType); s.writeBits(bullet.layer, 2); s.writeFloat(bullet.varianceT, 0, 1, 4); s.writeBits(bullet.distAdjIdx, 4); s.writeBoolean(bullet.clipDistance); if (bullet.clipDistance) { s.writeFloat(bullet.distance, 0, 1024, 16); } s.writeBoolean(bullet.shotFx); if (bullet.shotFx) { s.writeGameType(bullet.shotSourceType); s.writeBoolean(bullet.shotOffhand); s.writeBoolean(bullet.lastShot); } s.writeBoolean(bullet.reflectCount > 0); if (bullet.reflectCount > 0) { s.writeBits(bullet.reflectCount, 2); s.writeUint16(bullet.reflectObjId); } s.writeBoolean(bullet.hasSpecialFx); if (bullet.hasSpecialFx) { s.writeBoolean(bullet.shotAlt); s.writeBoolean(bullet.splinter); s.writeBoolean(bullet.trailSaturated); s.writeBoolean(bullet.trailSmall); s.writeBoolean(bullet.trailThick); } } s.writeAlignToNextByte(); flags |= UpdateExtFlags.Bullets; } if (this.explosions.length) { s.writeUint8(this.explosions.length); for (let i = 0; i < this.explosions.length; i++) { const explosion = this.explosions[i]; s.writeVec(explosion.pos, 0, 0, 1024, 1024, 16); s.writeGameType(explosion.type); s.writeBits(explosion.layer, 2); s.writeAlignToNextByte(); } flags |= UpdateExtFlags.Explosions; } if (this.emotes.length) { s.writeUint8(this.emotes.length); for (let i = 0; i < this.emotes.length; i++) { const emote = this.emotes[i]; s.writeUint16(emote.playerId); s.writeGameType(emote.type); s.writeGameType(emote.itemType); s.writeBoolean(emote.isPing); if (emote.isPing) { s.writeVec(emote.pos, 0, 0, 1024, 1024, 16); } s.writeAlignToNextByte(); } flags |= UpdateExtFlags.Emotes; } if (this.planes.length) { s.writeUint8(this.planes.length); for (let i = 0; i < this.planes.length; i++) { const plane = this.planes[i]; s.writeUint8(plane.id); s.writeVec(v2.add(plane.pos, v2.create(512, 512)), 0, 0, 2048, 2048, 10); s.writeUnitVec(plane.planeDir, 8); s.writeBoolean(plane.actionComplete); s.writeBits(plane.action, 3); } flags |= UpdateExtFlags.Planes; } if (this.airstrikeZones.length) { s.writeUint8(this.airstrikeZones.length); for (let i = 0; i < this.airstrikeZones.length; i++) { const zone = this.airstrikeZones[i]; s.writeVec(zone.pos, 0, 0, 1024, 1024, 12); s.writeFloat(zone.rad, 0, Constants.AirstrikeZoneMaxRad, 8); s.writeFloat(zone.duration, 0, Constants.AirstrikeZoneMaxDuration, 8); } flags |= UpdateExtFlags.AirstrikeZones; } if (this.mapIndicators.length) { s.writeUint8(this.mapIndicators.length); for (let i = 0; i < this.mapIndicators.length; i++) { const indicator = this.mapIndicators[i]; s.writeBits(indicator.id, 4); s.writeBoolean(indicator.dead); s.writeBoolean(indicator.equipped); s.writeGameType(indicator.type); s.writeVec(indicator.pos, 0, 0, 1024, 1024, 16); } s.writeAlignToNextByte(); flags |= UpdateExtFlags.MapIndicators; } if (this.killLeaderDirty) { s.writeUint16(this.killLeaderId); s.writeUint8(this.killLeaderKills); flags |= UpdateExtFlags.KillLeader; } s.writeUint8(this.ack); const idx = s.byteIndex; s.byteIndex = flagsIdx; s.writeUint16(flags); s.byteIndex = idx; } // @ts-expect-error deserialize only accept one argument for now deserialize(s, objectCreator) { const flags = s.readUint16(); if ((flags & UpdateExtFlags.DeletedObjects) != 0) { const count = s.readUint16(); for (let i = 0; i < count; i++) { this.delObjIds.push(s.readUint16()); } } if ((flags & UpdateExtFlags.FullObjects) != 0) { const count = s.readUint16(); for (let i = 0; i < count; i++) { const data = {}; data.__type = s.readUint8(); data.__id = s.readUint16(); ObjectSerializeFns[data.__type].deserializePart(s, data); ObjectSerializeFns[data.__type].deserializeFull(s, data); this.fullObjects.push(data); } } for (let count = s.readUint16(), i = 0; i < count; i++) { const data = {}; data.__id = s.readUint16(); const type = objectCreator.getTypeById(data.__id, s); ObjectSerializeFns[type].deserializePart(s, data); this.partObjects.push(data); } if ((flags & UpdateExtFlags.ActivePlayerId) != 0) { this.activePlayerId = s.readUint16(); this.activePlayerIdDirty = true; } const activePlayerData = {}; deserializeActivePlayer(s, activePlayerData); this.activePlayerData = activePlayerData; if ((flags & UpdateExtFlags.Gas) != 0) { const gasData = {}; deserializeGasData(s, gasData); this.gasData = gasData; this.gasDirty = true; } if ((flags & UpdateExtFlags.GasCircle) != 0) { this.gasT = s.readFloat(0, 1, 16); this.gasTDirty = true; } if ((flags & UpdateExtFlags.PlayerInfos) != 0) { const count = s.readUint8(); for (let i = 0; i < count; i++) { const x = {}; deserializePlayerInfo(s, x); this.playerInfos.push(x); } } if ((flags & UpdateExtFlags.DeletePlayerIds) != 0) { const count = s.readUint8(); for (let i = 0; i < count; i++) { const id = s.readUint16(); this.deletedPlayerIds.push(id); } } if ((flags & UpdateExtFlags.PlayerStatus) != 0) { const playerStatus = {}; deserializePlayerStatus(s, playerStatus); this.playerStatus = playerStatus; this.playerStatusDirty = true; } if ((flags & UpdateExtFlags.GroupStatus) != 0) { const groupStatus = {}; deserializeGroupStatus(s, groupStatus); this.groupStatus = groupStatus; this.groupStatusDirty = true; } if ((flags & UpdateExtFlags.Bullets) != 0) { for (let count = s.readUint8(), i = 0; i < count; i++) { const bullet = {}; bullet.playerId = s.readUint16(); bullet.pos = s.readVec(0, 0, 1024, 1024, 16); bullet.dir = s.readUnitVec(8); bullet.bulletType = s.readGameType(); bullet.layer = s.readBits(2); bullet.varianceT = s.readFloat(0, 1, 4); bullet.distAdjIdx = s.readBits(4); bullet.clipDistance = s.readBoolean(); if (bullet.clipDistance) { bullet.distance = s.readFloat(0, 1024, 16); } bullet.shotFx = s.readBoolean(); if (bullet.shotFx) { bullet.shotSourceType = s.readGameType(); bullet.shotOffhand = s.readBoolean(); bullet.lastShot = s.readBoolean(); } bullet.reflectCount = 0; bullet.reflectObjId = 0; if (s.readBoolean()) { bullet.reflectCount = s.readBits(2); bullet.reflectObjId = s.readUint16(); } bullet.hasSpecialFx = s.readBoolean(); if (bullet.hasSpecialFx) { bullet.shotAlt = s.readBoolean(); bullet.splinter = s.readBoolean(); bullet.trailSaturated = s.readBoolean(); bullet.trailSmall = s.readBoolean(); bullet.trailThick = s.readBoolean(); } this.bullets.push(bullet); } s.readAlignToNextByte(); } if ((flags & UpdateExtFlags.Explosions) != 0) { const count = s.readUint8(); for (let i = 0; i < count; i++) { const explosion = {}; explosion.pos = s.readVec(0, 0, 1024, 1024, 16); explosion.type = s.readGameType(); explosion.layer = s.readBits(2); s.readAlignToNextByte(); this.explosions.push(explosion); } } if ((flags & UpdateExtFlags.Emotes) != 0) { for (let count = s.readUint8(), i = 0; i < count; i++) { const emote = {}; emote.playerId = s.readUint16(); emote.type = s.readGameType(); emote.itemType = s.readGameType(); emote.isPing = s.readBoolean(); if (emote.isPing) { emote.pos = s.readVec(0, 0, 1024, 1024, 16); } s.readBits(3); this.emotes.push(emote); } } if ((flags & UpdateExtFlags.Planes) != 0) { for (let count = s.readUint8(), i = 0; i < count; i++) { const plane = {}; plane.id = s.readUint8(); const pos = s.readVec(0, 0, 2048, 2048, 10); plane.pos = v2.create(pos.x - 512, pos.y - 512); plane.planeDir = s.readUnitVec(8); plane.actionComplete = s.readBoolean(); plane.action = s.readBits(3); this.planes.push(plane); } } if ((flags & UpdateExtFlags.AirstrikeZones) != 0) { for (let count = s.readUint8(), i = 0; i < count; i++) { const airStrikeZone = {}; airStrikeZone.pos = s.readVec(0, 0, 1024, 1024, 12); airStrikeZone.rad = s.readFloat(0, Constants.AirstrikeZoneMaxRad, 8); airStrikeZone.duration = s.readFloat( 0, Constants.AirstrikeZoneMaxDuration, 8 ); this.airstrikeZones.push(airStrikeZone); } } if ((flags & UpdateExtFlags.MapIndicators) != 0) { for (let count = s.readUint8(), i = 0; i < count; i++) { const mapIndicator = {}; mapIndicator.id = s.readBits(4); mapIndicator.dead = s.readBoolean(); mapIndicator.equipped = s.readBoolean(); mapIndicator.type = s.readGameType(); mapIndicator.pos = s.readVec(0, 0, 1024, 1024, 16); this.mapIndicators.push(mapIndicator); } s.readAlignToNextByte(); } if ((flags & UpdateExtFlags.KillLeader) != 0) { this.killLeaderId = s.readUint16(); this.killLeaderKills = s.readUint8(); this.killLeaderDirty = true; } this.ack = s.readUint8(); } } class KillMsg { constructor() { __publicField(this, "itemSourceType", ""); __publicField(this, "mapSourceType", ""); __publicField(this, "damageType", DamageType.Player); __publicField(this, "targetId", 0); __publicField(this, "killerId", 0); __publicField(this, "killCreditId", 0); __publicField(this, "killerKills", 0); __publicField(this, "downed", false); __publicField(this, "killed", false); } serialize(s) { s.writeUint8(this.damageType); s.writeGameType(this.itemSourceType); s.writeMapType(this.mapSourceType); s.writeUint16(this.targetId); s.writeUint16(this.killerId); s.writeUint16(this.killCreditId); s.writeUint8(this.killerKills); s.writeBoolean(this.downed); s.writeBoolean(this.killed); s.writeAlignToNextByte(); } deserialize(s) { this.damageType = s.readUint8(); this.itemSourceType = s.readGameType(); this.mapSourceType = s.readMapType(); this.targetId = s.readUint16(); this.killerId = s.readUint16(); this.killCreditId = s.readUint16(); this.killerKills = s.readUint8(); this.downed = s.readBoolean(); this.killed = s.readBoolean(); s.readAlignToNextByte(); } } class PlayerStatsMsg { constructor() { __publicField(this, "playerStats", { playerId: 0, timeAlive: 0, kills: 0, dead: false, damageDealt: 0, damageTaken: 0 }); } serialize(s) { s.writeUint16(this.playerStats.playerId); s.writeUint16(this.playerStats.timeAlive); s.writeUint8(this.playerStats.kills); s.writeUint8(this.playerStats.dead); s.writeUint16(Math.round(this.playerStats.damageDealt)); s.writeUint16(Math.round(this.playerStats.damageTaken)); } deserialize(s) { const playerStats = {}; playerStats.playerId = s.readUint16(); playerStats.timeAlive = s.readUint16(); playerStats.kills = s.readUint8(); playerStats.dead = s.readUint8(); playerStats.damageDealt = s.readUint16(); playerStats.damageTaken = s.readUint16(); this.playerStats = playerStats; } } class GameOverMsg { constructor() { __publicField(this, "teamId", 0); __publicField(this, "teamRank", 0); __publicField(this, "gameOver", false); __publicField(this, "winningTeamId", 0); __publicField(this, "playerStats", []); } serialize(s) { s.writeUint8(this.teamId); s.writeUint8(this.teamRank); s.writeUint8(+this.gameOver); s.writeUint8(this.winningTeamId); s.writeUint8(this.playerStats.length); for (let i = 0; i < this.playerStats.length; i++) { const stats = this.playerStats[i]; const statsMsg = new PlayerStatsMsg(); statsMsg.playerStats = stats; statsMsg.serialize(s); } } deserialize(s) { this.teamId = s.readUint8(); this.teamRank = s.readUint8(); this.gameOver = s.readUint8(); this.winningTeamId = s.readUint8(); for (let count = s.readUint8(), i = 0; i < count; i++) { const statsMsg = new PlayerStatsMsg(); statsMsg.deserialize(s); this.playerStats.push(statsMsg.playerStats); } } } class PickupMsg { constructor() { __publicField(this, "type", 0); __publicField(this, "item", ""); __publicField(this, "count", 0); } serialize(s) { s.writeUint8(this.type); s.writeGameType(this.item); s.writeUint8(this.count); s.writeBits(0, 6); } deserialize(s) { this.type = s.readUint8(); this.item = s.readGameType(); this.count = s.readUint8(); s.readBits(6); } } function serializeMapRiver(s, data) { s.writeFloat32(data.width); s.writeUint8(data.looped); s.writeUint8(data.points.length); for (const point of data.points) { s.writeVec(point, 0, 0, 1024, 1024, 16); } } function deserializeMapRiver(s, data) { data.width = s.readFloat32(); data.looped = s.readUint8(); data.points = []; const count = s.readUint8(); for (let i = 0; i < count; i++) { const pos = s.readVec(0, 0, 1024, 1024, 16); data.points.push(pos); } } function serializeMapPlace(s, place) { s.writeString(place.name); s.writeVec(place.pos, 0, 0, 1024, 1024, 16); } function deserializeMapPlaces(s, place) { place.name = s.readString(); place.pos = s.readVec(0, 0, 1024, 1024, 16); } function serializeMapGroundPatch(s, patch) { s.writeVec(patch.min, 0, 0, 1024, 1024, 16); s.writeVec(patch.max, 0, 0, 1024, 1024, 16); s.writeUint32(patch.color); s.writeFloat32(patch.roughness); s.writeFloat32(patch.offsetDist); s.writeBits(patch.order, 7); s.writeBoolean(patch.useAsMapShape); } function deserializeMapGroundPatch(s, patch) { patch.min = s.readVec(0, 0, 1024, 1024, 16); patch.max = s.readVec(0, 0, 1024, 1024, 16); patch.color = s.readUint32(); patch.roughness = s.readFloat32(); patch.offsetDist = s.readFloat32(); patch.order = s.readBits(7); patch.useAsMapShape = s.readBoolean(); } function serializeMapObj(s, obj) { s.writeVec(obj.pos, 0, 0, 1024, 1024, 16); s.writeFloat(obj.scale, Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8); s.writeMapType(obj.type); s.writeBits(obj.ori, 2); s.writeBits(0, 2); } function deserializeMapObj(s, data) { data.pos = s.readVec(0, 0, 1024, 1024, 16); data.scale = s.readFloat(Constants.MapObjectMinScale, Constants.MapObjectMaxScale, 8); data.type = s.readMapType(); data.ori = s.readBits(2); s.readBits(2); } class MapMsg { constructor() { __publicField(this, "mapName", ""); __publicField(this, "seed", 0); __publicField(this, "width", 0); __publicField(this, "height", 0); __publicField(this, "shoreInset", 0); __publicField(this, "grassInset", 0); __publicField(this, "rivers", []); __publicField(this, "places", []); __publicField(this, "objects", []); __publicField(this, "groundPatches", []); } serialize(s) { s.writeString(this.mapName, Constants.MapNameMaxLen); s.writeUint32(this.seed); s.writeUint16(this.width); s.writeUint16(this.height); s.writeUint16(this.shoreInset); s.writeUint16(this.grassInset); s.writeUint8(this.rivers.length); for (let i = 0; i < this.rivers.length; i++) { serializeMapRiver(s, this.rivers[i]); } s.writeUint8(this.places.length); for (let i = 0; i < this.places.length; i++) { serializeMapPlace(s, this.places[i]); } s.writeUint16(this.objects.length); for (let i = 0; i < this.objects.length; i++) { serializeMapObj(s, this.objects[i]); } s.writeUint8(this.groundPatches.length); for (let i = 0; i < this.groundPatches.length; i++) { serializeMapGroundPatch(s, this.groundPatches[i]); } } deserialize(s) { this.mapName = s.readString(Constants.MapNameMaxLen); this.seed = s.readUint32(); this.width = s.readUint16(); this.height = s.readUint16(); this.shoreInset = s.readUint16(); this.grassInset = s.readUint16(); const riverCount = s.readUint8(); for (let i = 0; i < riverCount; i++) { const river = {}; deserializeMapRiver(s, river); this.rivers.push(river); } const placeCount = s.readUint8(); for (let i = 0; i < placeCount; i++) { const place = {}; deserializeMapPlaces(s, place); this.places.push(place); } const objCount = s.readUint16(); for (let i = 0; i < objCount; i++) { const obj = {}; deserializeMapObj(s, obj); this.objects.push(obj); } const patchCount = s.readUint8(); for (let i = 0; i < patchCount; i++) { const patch = {}; deserializeMapGroundPatch(s, patch); this.groundPatches.push(patch); } } } class RoleAnnouncementMsg { constructor() { __publicField(this, "playerId", 0); __publicField(this, "killerId", 0); __publicField(this, "role", ""); __publicField(this, "assigned", false); __publicField(this, "killed", false); } serialize(s) { s.writeUint16(this.playerId); s.writeUint16(this.killerId); s.writeGameType(this.role); s.writeBoolean(this.assigned); s.writeBoolean(this.killed); s.writeAlignToNextByte(); } deserialize(s) { this.playerId = s.readUint16(); this.killerId = s.readUint16(); this.role = s.readGameType(); this.assigned = s.readBoolean(); this.killed = s.readBoolean(); s.readAlignToNextByte(); } } class AliveCountsMsg { constructor() { __publicField(this, "teamAliveCounts", []); } serialize(s) { const count = this.teamAliveCounts.length; s.writeUint8(count); for (let i = 0; i < count; i++) { s.writeUint8(this.teamAliveCounts[i]); } } deserialize(s) { const count = s.readUint8(); for (let i = 0; i < count; i++) { const alive = s.readUint8(); this.teamAliveCounts.push(alive); } } } class ConfigTypeMap { constructor(typeBits) { __publicField(this, "_typeToId", {}); __publicField(this, "_idToType", {}); __publicField(this, "nextId", 0); __publicField(this, "maxId"); this.maxId = 2 ** typeBits; this.addType(""); } addType(type) { assert( this._typeToId[type] === void 0, `Type ${type} has already been defined!` ); assert(this.nextId < this.maxId); this._typeToId[type] = this.nextId; this._idToType[this.nextId] = type; this.nextId++; } typeToId(type) { const id = this._typeToId[type]; assert(id !== void 0, `Invalid type ${type}`); return id; } idToType(id) { const type = this._idToType[id]; if (type === void 0) { console.error( "Invalid id given to idToType", id, "max", Object.keys(this._idToType).length ); } return type; } } function createTypeSerialization(type, typeList, bitsPerType) { const typeMap = new ConfigTypeMap(bitsPerType); const types = Object.keys(typeList); assert( types.length <= typeMap.maxId, `${type} contains ${types.length} types, max ${typeMap.maxId}` ); for (let i = 0; i < types.length; i++) { typeMap.addType(types[i]); } return typeMap; } const gameTypeSerialization = createTypeSerialization("Game", GameObjectDefs, 10); const mapTypeSerialization = createTypeSerialization("Map", MapObjectDefs, 12); class BitStream2 extends BitStream$1 { writeString(str, len) { this.writeASCIIString(str, len); } readString(len) { return this.readASCIIString(len); } writeFloat(f, min2, max2, bits) { assert(bits > 0 && bits < 31); assert( f >= min2 && f <= max2, `writeFloat: value out of range: ${f}, range: [${min2}, ${max2}]` ); const range = (1 << bits) - 1; const x = math.clamp(f, min2, max2); const t = (x - min2) / (max2 - min2); const v = t * range + 0.5; this.writeBits(v, bits); } readFloat(min2, max2, bits) { assert(bits > 0 && bits < 31); const range = (1 << bits) - 1; const x = this.readBits(bits); const t = x / range; const v = min2 + t * (max2 - min2); return v; } writeVec(vec, minX, minY, maxX, maxY, bitCount) { this.writeFloat(vec.x, minX, maxX, bitCount); this.writeFloat(vec.y, minY, maxY, bitCount); } readVec(minX, minY, maxX, maxY, bitCount) { return { x: this.readFloat(minX, maxX, bitCount), y: this.readFloat(minY, maxY, bitCount) }; } writeUnitVec(vec, bitCount) { this.writeVec(vec, -1.0001, -1.0001, 1.0001, 1.0001, bitCount); } readUnitVec(bitCount) { return this.readVec(-1.0001, -1.0001, 1.0001, 1.0001, bitCount); } writeVec32(vec) { this.writeFloat32(vec.x); this.writeFloat32(vec.y); } readVec32() { return { x: this.readFloat32(), y: this.readFloat32() }; } writeBytes(src, offset, length) { assert(this.index % 8 == 0); const data = new Uint8Array(src._view._view.buffer, offset, length); this._view._view.set(data, this.index / 8); this.index += length * 8; } writeAlignToNextByte() { const offset = 8 - this.index % 8; if (offset < 8) this.writeBits(0, offset); } readAlignToNextByte() { const offset = 8 - this.index % 8; if (offset < 8) this.readBits(offset); } writeGameType(type) { this.writeBits(gameTypeSerialization.typeToId(type), 10); } readGameType() { return gameTypeSerialization.idToType(this.readBits(10)); } writeMapType(type) { this.writeBits(mapTypeSerialization.typeToId(type), 12); } readMapType() { return mapTypeSerialization.idToType(this.readBits(12)); } } class MsgStream { constructor(buf) { __publicField(this, "stream"); __publicField(this, "arrayBuf"); const arrayBuf = buf instanceof ArrayBuffer ? buf : buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); if (!(arrayBuf instanceof ArrayBuffer)) { throw new Error( `Invalid buf type ${typeof buf === "undefined" ? "undefined" : typeof buf}` ); } this.arrayBuf = arrayBuf; this.stream = new BitStream2(arrayBuf); } getBuffer() { return new Uint8Array(this.arrayBuf, 0, this.stream.byteIndex); } getStream() { return this.stream; } serializeMsg(type, msg) { assert(this.stream.index % 8 == 0); this.stream.writeUint8(type); msg.serialize(this.stream); assert(this.stream.index % 8 == 0); } serializeMsgStream(type, stream) { assert(this.stream.index % 8 == 0 && stream.index % 8 == 0); this.stream.writeUint8(type); this.stream.writeBytes(stream, 0, stream.index / 8); } deserializeMsgType() { if (this.stream.length - this.stream.byteIndex * 8 >= 1) { return this.stream.readUint8(); } return 0; } } const Constants = { MapNameMaxLen: 24, PlayerNameMaxLen: 16, MouseMaxDist: 64, SmokeMaxRad: 10, ActionMaxDuration: 8.5, AirstrikeZoneMaxRad: 256, AirstrikeZoneMaxDuration: 60, PlayerMinScale: 0.75, PlayerMaxScale: 2, MapObjectMinScale: 0.125, MapObjectMaxScale: 2.5, MaxPerks: 8, MaxMapIndicators: 16 }; var MsgType = /* @__PURE__ */ ((MsgType2) => { MsgType2[MsgType2["None"] = 0] = "None"; MsgType2[MsgType2["Join"] = 1] = "Join"; MsgType2[MsgType2["Disconnect"] = 2] = "Disconnect"; MsgType2[MsgType2["Input"] = 3] = "Input"; MsgType2[MsgType2["Edit"] = 4] = "Edit"; MsgType2[MsgType2["Joined"] = 5] = "Joined"; MsgType2[MsgType2["Update"] = 6] = "Update"; MsgType2[MsgType2["Kill"] = 7] = "Kill"; MsgType2[MsgType2["GameOver"] = 8] = "GameOver"; MsgType2[MsgType2["Pickup"] = 9] = "Pickup"; MsgType2[MsgType2["Map"] = 10] = "Map"; MsgType2[MsgType2["Spectate"] = 11] = "Spectate"; MsgType2[MsgType2["DropItem"] = 12] = "DropItem"; MsgType2[MsgType2["Emote"] = 13] = "Emote"; MsgType2[MsgType2["PlayerStats"] = 14] = "PlayerStats"; MsgType2[MsgType2["AdStatus"] = 15] = "AdStatus"; MsgType2[MsgType2["Loadout"] = 16] = "Loadout"; MsgType2[MsgType2["RoleAnnouncement"] = 17] = "RoleAnnouncement"; MsgType2[MsgType2["Stats"] = 18] = "Stats"; MsgType2[MsgType2["UpdatePass"] = 19] = "UpdatePass"; MsgType2[MsgType2["AliveCounts"] = 20] = "AliveCounts"; MsgType2[MsgType2["PerkModeRoleSelect"] = 21] = "PerkModeRoleSelect"; return MsgType2; })(MsgType || {}); class UpdatePassMsg { serialize(_e) { } deserialize(_e) { } } class ObjectCreator { constructor() { __publicField(this, "idToObj", {}); } getObjById(id) { return this.idToObj[id]; } getTypeById(id, s) { const obj = this.getObjById(id); if (!obj) { const err = { id, ids: Object.keys(this.idToObj), stream: s._view._view }; console.error(`objectPoolErr`, `getTypeById${JSON.stringify(err)}`); return ObjectType.Invalid; } return obj.__type; } updateObjFull(type, id, data) { let obj = this.getObjById(id); if (obj === void 0) { obj = {}; obj.__id = id; obj.__type = type; this.idToObj[id] = obj; } obj.data = data; return obj; } updateObjPart(id, data) { const obj = this.getObjById(id); if (obj) { for (const dataKey in data) { obj.data[dataKey] = data; } } else console.error(`updateObjPart, missing object`, id); } deleteObj(id) { const obj = this.getObjById(id); if (obj === void 0) console.error(`deleteObj, missing object`, id); else delete this.idToObj[id]; } } for (const outfit in OutfitDefs) { if (!UnlockDefs.unlock_default.unlocks.includes(outfit)) continue; } for (const emote in EmotesDefs) { if (!UnlockDefs.unlock_default.unlocks.includes(emote)) continue; } for (const melee in MeleeDefs) { if (!UnlockDefs.unlock_default.unlocks.includes(melee)) continue; } class Player { constructor(ws) { __publicField(this, "ws"); __publicField(this, "objectCreator", new ObjectCreator()); __publicField(this, "activeId", 0); __publicField(this, "playerBarn", new PlayerBarn()); // Latency determination __publicField(this, "seq", 0); __publicField(this, "pings", []); __publicField(this, "seqs", /* @__PURE__ */ new Map()); __publicField(this, "seqInFlight", false); // Kill tracker __publicField(this, "teamKills", /* @__PURE__ */ new Map()); __publicField(this, "stream", new MsgStream(new ArrayBuffer(1024))); this.ws = ws; } sentMsg(type, stream) { switch (type) { case MsgType.Input: { const msg = new InputMsg(); msg.deserialize(stream); this.seqs.set(msg.seq, Date.now()); break; } } } onMsg(type, stream) { var _a, _b; switch (type) { case MsgType.Joined: { const msg = new JoinedMsg(); msg.deserialize(stream); break; } case MsgType.Map: { const msg = new MapMsg(); msg.deserialize(stream); break; } case MsgType.Update: { const msg = new UpdateMsg(); msg.deserialize(stream, this.objectCreator); const now = Date.now(); const time = this.seqs.get(msg.ack) ?? -1; if (time !== -1) { this.seqs.delete(msg.ack); const ping = now - time; this.pings.push(ping); } if (msg.activePlayerIdDirty) this.activeId = msg.activePlayerId; for (let i = 0; i < msg.playerInfos.length; i++) this.playerBarn.setPlayerInfo(msg.playerInfos[i]); for (let i = 0; i < msg.deletedPlayerIds.length; i++) { const playerId = msg.deletedPlayerIds[i]; this.playerBarn.deletePlayerInfo(playerId); } if (msg.playerInfos.length > 0 || msg.deletedPlayerIds.length > 0) this.playerBarn.recomputeTeamData(); if (msg.playerStatusDirty) { const teamID = (_a = this.playerBarn.getPlayerInfo(this.activeId)) == null ? void 0 : _a.teamId; if (teamID) this.playerBarn.updatePlayerStatus(teamID, msg.playerStatus, window.location.hostname === `expandedwater.online`); } if (msg.groupStatusDirty) { const groupId = (_b = this.playerBarn.getPlayerInfo(this.activeId)) == null ? void 0 : _b.groupId; if (groupId) this.playerBarn.updateGroupStatus(groupId, msg.groupStatus); } for (let i = 0; i < msg.delObjIds.length; i++) this.objectCreator.deleteObj(msg.delObjIds[i]); for (let i = 0; i < msg.fullObjects.length; i++) { const obj = msg.fullObjects[i]; this.objectCreator.updateObjFull(obj.__type, obj.__id, obj); } for (let i = 0; i < msg.partObjects.length; i++) { const obj = msg.partObjects[i]; this.objectCreator.updateObjPart(obj.__id, obj); } break; } case MsgType.Kill: { const msg = new KillMsg(); msg.deserialize(stream); if (msg.killerId !== msg.targetId && msg.killCreditId !== msg.targetId && !(msg.downed && !msg.killed)) { const playerInfo = this.playerBarn.getPlayerInfo(msg.killerId); if (playerInfo) { const group = this.playerBarn.getGroupInfo(playerInfo.groupId); if (group) { const idx = group.playerIds.indexOf(msg.killerId); if (idx !== -1) { const existingKills = this.teamKills.get(group.groupId); const set4 = existingKills ?? [0, 0, 0, 0]; set4[idx]++; this.teamKills.set(group.groupId, set4); console.log(this.activeId); } } } } break; } case MsgType.RoleAnnouncement: { const msg = new RoleAnnouncementMsg(); msg.deserialize(stream); break; } case MsgType.PlayerStats: { const msg = new PlayerStatsMsg(); msg.deserialize(stream); break; } case MsgType.Stats: { stream.readString(); break; } case MsgType.GameOver: { const msg = new GameOverMsg(); msg.deserialize(stream); break; } case MsgType.Pickup: { const msg = new PickupMsg(); msg.deserialize(stream); break; } case MsgType.UpdatePass: { new UpdatePassMsg().deserialize(stream); break; } case MsgType.AliveCounts: { const msg = new AliveCountsMsg(); msg.deserialize(stream); break; } case MsgType.Disconnect: { const msg = new DisconnectMsg(); msg.deserialize(stream); break; } } } sendMsg(type, msg) { this.stream.stream.index = 0; this.stream.serializeMsg(type, msg); this.ws.send(this.stream.getBuffer()); } } wsHook.before = function(data, url, wsObject) { var _a; try { const msgStream = new MsgStream(data); while (true) { const type = msgStream.deserializeMsgType(); if (type === MsgType.None) break; (_a = core.player) == null ? void 0 : _a.sentMsg(type, msgStream.getStream()); } } catch (e) { console.error(e); } return data; }; wsHook.after = function(e, url, wsObject) { var _a, _b; try { const msgStream = new MsgStream(e.data); while (true) { const type = msgStream.deserializeMsgType(); if (type === MsgType.None) break; else if (type === MsgType.Joined) { core.player = new Player(wsObject); core.player.onMsg(type, msgStream.getStream()); } else if (type === MsgType.Disconnect) { (_a = core.player) == null ? void 0 : _a.onMsg(type, msgStream.getStream()); core.player = void 0; } else (_b = core.player) == null ? void 0 : _b.onMsg(type, msgStream.getStream()); } } catch (e2) { console.error(e2); } return e; }; const init = () => { for (const plugin of core.plugins) plugin.load(); }; window.onload = () => { init(); };