Survev Overlay

An ingame counter overlay to view connection stats and in-game health stats.

// ==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.gf.qytechs.cn/scripts/391611/743919/WSHook.js
// @run-at       document-start
// @match        *://survev.io/*
// @match        *://66.179.254.36/*
// @match        *://expandedwater.online/*
// @grant        none
// ==/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: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path fill="white" paint-order="fill markers stroke" d="M7.938 4.233h1.058V12.7H7.938z"/><path fill="white" paint-order="fill markers stroke" d="M12.7 7.937v1.058H4.233V7.937z"/></svg>'
  },
  crosshair_001: {
    type: "crosshair",
    name: "Style 001",
    rarity: 1,
    texture: "crosshair001.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M7.693.215v1.471A6.829 6.829 0 0 0 1.69 7.693H.215V9.24h1.471a6.829 6.829 0 0 0 6.007 6.003v1.475H9.24v-1.47a6.829 6.829 0 0 0 6.003-6.008h1.475V7.693h-1.47A6.829 6.829 0 0 0 9.24 1.69V.215zm0 2.745v1.897H9.24V2.96a5.567 5.567 0 0 1 4.734 4.733h-1.897V9.24h1.896a5.567 5.567 0 0 1-4.733 4.734v-1.897H7.693v1.896A5.567 5.567 0 0 1 2.96 9.24h1.897V7.693H2.96A5.567 5.567 0 0 1 7.693 2.96z" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_005: {
    type: "crosshair",
    name: "Style 005",
    rarity: 1,
    texture: "crosshair005.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M.53 3.704L3.703.53l4.763 4.763L13.229.529l3.175 3.175-4.762 4.763 4.762 4.762-3.175 3.175-4.762-4.762-4.763 4.762L.53 13.23l4.763-4.762L.529 3.704" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_007: {
    type: "crosshair",
    name: "Style 007",
    rarity: 1,
    texture: "crosshair007.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M9.091.345v4.998H7.842V.345h1.25m2.498 7.497h4.998v1.25H11.59v-1.25M9.091 11.59v4.998H7.842V11.59h1.25M.344 7.842h4.998v1.25H.345v-1.25" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_010: {
    type: "crosshair",
    name: "Style 010",
    rarity: 1,
    texture: "crosshair010.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.98.265v4.1H7.953v-4.1h1.025m0 12.303v4.1H7.954v-4.1h1.025M.265 7.954h4.1v1.025h-4.1V7.954m12.303 0h4.1v1.025h-4.1V7.954M8.98 8.467q0 .218-.154.359-.141.153-.36.153-.217 0-.371-.153-.141-.141-.141-.36 0-.217.141-.371.154-.141.372-.141t.359.141q.153.154.153.372" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_022: {
    type: "crosshair",
    name: "Style 022",
    rarity: 1,
    texture: "crosshair022.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.467 7.408l1.587 1.588-.529.529-1.058-1.058-1.059 1.058-.529-.53 1.588-1.587" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_027: {
    type: "crosshair",
    name: "Style 027",
    rarity: 1,
    texture: "crosshair027.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M2.117 1.058H6.35v1.059H2.117V6.35H1.058V2.117q0-.437.305-.741.317-.318.754-.318m0 14.817q-.437 0-.754-.318-.305-.304-.305-.74v-4.234h1.059v4.234H6.35v1.058H2.117m12.7-14.817q.436 0 .754.318.304.304.304.74V6.35h-1.058V2.117h-4.234V1.058h4.234m1.058 13.759q0 .436-.304.74-.318.318-.754.318h-4.234v-1.058h4.234v-4.234h1.058v4.234M8.996 6.88v1.057h1.058v1.059H8.996v1.058H7.937V8.996H6.88V7.937h1.058V6.88h1.059" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_038: {
    type: "crosshair",
    name: "Style 038",
    rarity: 1,
    texture: "crosshair038.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M4.233 6.88V5.82l1.588-1.587h1.058v1.059H6.35L5.292 6.35v.53H4.233m4.763 1.587q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.146.384-.146t.37.146q.159.159.159.384M12.7 6.879h-1.058V6.35l-1.059-1.058h-.529V4.233h1.059L12.7 5.821v1.058m0 3.175v1.059L11.113 12.7h-1.059v-1.058h.53l1.058-1.059v-.529H12.7m-8.467 0h1.059v.53l1.058 1.058h.53V12.7H5.82l-1.587-1.587v-1.059" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_040: {
    type: "crosshair",
    name: "Style 040",
    rarity: 1,
    texture: "crosshair040.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M11.642 4.233q.436 0 .754.318.304.304.304.74v2.117h-1.058V5.292H9.525V4.233h2.117m-.53 3.704h2.117v1.059h-2.116V7.937m.529 4.763H9.525v-1.058h2.117V9.525H12.7v2.117q0 .436-.304.74-.318.318-.754.318M7.937 5.82V3.705h1.059v2.117H7.937M5.292 4.233h2.116v1.059H5.292v2.116H4.233V5.292q0-.437.305-.741.317-.318.754-.318M3.704 7.937h2.117v1.059H3.704V7.937M5.292 12.7q-.437 0-.754-.318-.305-.304-.305-.74V9.525h1.059v2.117h2.116V12.7H5.292m2.645-1.587h1.059v2.116H7.937v-2.116" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_045: {
    type: "crosshair",
    name: "Style 045",
    rarity: 1,
    texture: "crosshair045.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M9.79 3.44l3.704 3.704-.384.383-3.704-3.704.384-.383M8.73 5.292v1.587h-.529V5.292h.53M3.44 7.144L7.144 3.44l.37.37L3.81 7.514l-.37-.37m5.556 1.323q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.146.384-.146t.37.146q.159.159.159.384m-3.704-.265h1.587v.53H5.292v-.53m4.762 0h1.588v.53h-1.588v-.53m-1.323 1.852v1.588h-.529v-1.588h.53m4.762-.264L9.79 13.494l-.37-.37 3.703-3.705.37.37m-6.35 3.705L3.44 9.79l.37-.37 3.704 3.703-.37.37" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_051: {
    type: "crosshair",
    name: "Style 051",
    rarity: 1,
    texture: "crosshair051.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M13.758 3.704L11.113 6.35h-.53v-.53l2.646-2.645.53.53m-10.584 0l.53-.53L6.35 5.821v.529h-.53L3.176 3.704m5.82 4.763l.53.529v.529h-.53l-.528-.53-.53.53h-.529v-.53l.53-.528-.53-.53v-.529h.53l.529.53.529-.53h.529v.53l-.53.529m4.763 4.762l-.529.53-2.646-2.646v-.53h.53l2.645 2.646m-10.583 0l2.646-2.646h.529v.53l-2.646 2.645-.529-.529" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_064: {
    type: "crosshair",
    name: "Style 064",
    rarity: 1,
    texture: "crosshair064.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M7.937 0v.546c-1.969.116-3.667.88-5.093 2.298C1.426 4.27.662 5.968.546 7.937H0v1.059h.546c.116 1.968.88 3.662 2.298 5.08 1.426 1.426 3.124 2.195 5.093 2.31v.547h1.059v-.546c1.968-.117 3.662-.886 5.08-2.311 1.425-1.418 2.194-3.112 2.31-5.08h.547V7.937h-.546c-.116-1.969-.885-3.667-2.311-5.093C12.658 1.427 10.964.662 8.996.546V0H7.937zm0 1.607v2.125c-1.087.11-2.031.562-2.83 1.361l-.014.014c-.799.799-1.251 1.743-1.36 2.83H1.606c.114-1.677.777-3.124 1.991-4.339 1.215-1.214 2.662-1.877 4.34-1.99zm1.059 0c1.678.114 3.125.777 4.34 1.991 1.214 1.215 1.876 2.662 1.99 4.34h-2.125c-.11-1.09-.568-2.038-1.374-2.845-.8-.799-1.743-1.251-2.831-1.36V1.606zM7.937 4.801V6.35h1.059V4.8a3.547 3.547 0 0 1 2.09 1.047c.595.595.941 1.293 1.047 2.09h-1.55v1.059h1.55c-.107.79-.453 1.483-1.047 2.077l-.013.013c-.594.594-1.287.94-2.077 1.046v-1.549H7.937v1.55a3.547 3.547 0 0 1-2.09-1.047 3.547 3.547 0 0 1-1.046-2.09H6.35V7.937H4.8a3.547 3.547 0 0 1 1.047-2.09 3.547 3.547 0 0 1 2.09-1.046zm-6.33 4.195h2.125c.11 1.088.562 2.032 1.361 2.83.807.807 1.756 1.265 2.844 1.375v2.125c-1.677-.114-3.124-.776-4.339-1.99-1.214-1.215-1.877-2.662-1.99-4.34zm11.594 0h2.125c-.114 1.678-.776 3.125-1.99 4.34-1.215 1.214-2.662 1.876-4.34 1.99v-2.125c1.08-.112 2.025-.569 2.83-1.374.806-.806 1.263-1.75 1.375-2.831z" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_080: {
    type: "crosshair",
    name: "Style 080",
    rarity: 1,
    texture: "crosshair080.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M3.598 3.598q-1.627 1.628-1.931 3.81H.595q.318-2.619 2.25-4.564Q4.788.913 7.407.595v1.072q-2.182.304-3.81 1.931m9.737 9.737q1.627-1.627 1.945-3.81h1.058q-.317 2.62-2.262 4.55-1.932 1.946-4.551 2.263V15.28q2.183-.318 3.81-1.945m0-9.737q-1.627-1.627-3.81-1.931V.595q2.62.318 4.55 2.25 1.946 1.944 2.263 4.563H15.28q-.318-2.182-1.945-3.81M6.879 6.88h1.058v1.058H6.88V6.88m2.117 0h1.058v1.058H8.996V6.88m0 2.117h1.058v1.058H8.996V8.996m-2.117 0h1.058v1.058H6.88V8.996M3.6 13.335q1.627 1.627 3.81 1.945v1.058q-2.62-.317-4.565-2.262Q.913 12.144.595 9.525h1.072q.304 2.183 1.931 3.81" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_086: {
    type: "crosshair",
    name: "Style 086",
    rarity: 1,
    texture: "crosshair086.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M16.528 1.413L11.49 6.451h-1.008V5.444L15.52.406l1.008 1.007m-16.122 0L1.413.406l5.038 5.038V6.45H5.444L.406 1.413m0 14.107l5.038-5.038H6.45v1.008l-5.038 5.038L.406 15.52m16.122 0l-1.008 1.008-5.038-5.038v-1.008h1.008l5.038 5.038" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_094: {
    type: "crosshair",
    name: "Style 094",
    rarity: 1,
    texture: "crosshair094.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.467 1.587q-2.077 0-3.705 1.059l-.754-.754Q5.953.529 8.467.529q2.513 0 4.471 1.363l-.767.754q-1.627-1.059-3.704-1.059m6.879 6.88q0-2.077-1.059-3.705l.768-.754q1.35 1.945 1.35 4.459 0 2.513-1.35 4.471l-.768-.767q1.059-1.627 1.059-3.704m1.058-6.88L13.23 4.762h-1.058V3.704L15.346.53l1.058 1.058M1.587.53l3.175 3.175v1.058H3.704L.53 1.587 1.587.53m0 7.938q0 2.077 1.059 3.704l-.754.767Q.529 10.98.529 8.467q0-2.514 1.363-4.459l.754.754Q1.587 6.39 1.587 8.467m6.35 0l.53-.53.529.53-.53.529-.529-.53m.53 6.88q2.077 0 3.704-1.059l.767.768q-1.958 1.35-4.471 1.35-2.514 0-4.459-1.35l.754-.768q1.628 1.059 3.705 1.059m-6.88 1.058L.53 15.346l3.175-3.175h1.058v1.058l-3.175 3.175m13.759 0L12.17 13.23v-1.058h1.058l3.175 3.175-1.058 1.058" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_098: {
    type: "crosshair",
    name: "Style 098",
    rarity: 1,
    texture: "crosshair098.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.996 8.467q0 .172-.093.304l-.066.066q-.145.159-.37.159t-.384-.159l-.053-.066q-.093-.132-.093-.304 0-.225.146-.384.159-.146.384-.146t.37.146q.159.159.159.384m-5.821 3.175h10.583L8.467 2.646l-5.292 8.996M8.467.529L15.875 12.7H1.058L8.467.53" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_101: {
    type: "crosshair",
    name: "Style 101",
    rarity: 1,
    texture: "crosshair101.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M6.588 6.588l-.013.013q-.754.78-.754 1.866v.013q0 .542.185 1.005.198.463.582.86l.066.066q.754.702 1.813.702 1.058 0 1.812-.715l.053-.053.013-.013q.384-.384.582-.86.186-.463.186-1.005 0-1.098-.768-1.879-.582-.582-1.35-.714L8.48 5.82h-.013l-.53.053q-.754.132-1.336.7l-.013.014m1.35-4.471h1.058v2.685q1.204.146 2.09 1.032 1.085 1.085 1.085 2.633 0 .926-.397 1.693l2.222 1.773-.767.767-2.116-1.64-.027.026q-1.085 1.085-2.62 1.085-1.547 0-2.632-1.085l-.026-.026-2.104 1.64-.767-.767 2.222-1.773q-.396-.767-.396-1.693 0-1.535 1.071-2.62l.013-.013q.887-.886 2.09-1.032V2.117m1.059 6.35q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.145-.145-.145-.37t.145-.384q.159-.146.384-.146t.37.146q.159.159.159.384" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_102: {
    type: "crosshair",
    name: "Style 102",
    rarity: 1,
    texture: "crosshair102.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M2.937 11.933l2.222-1.773q.238.476.649.9L3.704 12.7l-.767-.767m5.53-7.17l-.53.04V2.116h1.059v2.685l-.53-.04m.53 3.705q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.145.384-.145t.37.145q.159.159.159.384m4.233 4.233l-2.116-1.64q.41-.424.661-.9l2.222 1.773-.767.767" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_109: {
    type: "crosshair",
    name: "Style 109",
    rarity: 1,
    texture: "crosshair109.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.467 15.346q1.918 0 3.452-.9l.53.913q-1.773 1.045-3.982 1.045-2.196 0-3.97-1.032l.53-.926q1.535.9 3.44.9m-6.88-6.88q0 1.932.913 3.467l-.913.529Q.53 10.689.53 8.467q0-2.21 1.045-3.97l.913.53q-.9 1.535-.9 3.44m13.759 0q0-1.919-.9-3.44l.913-.53q1.045 1.76 1.045 3.97 0 2.222-1.058 3.995l-.913-.53q.913-1.547.913-3.465m-6.88-6.88q-1.918 0-3.452.913l-.53-.926Q6.258.53 8.468.53q2.209 0 3.982 1.045l-.53.926q-1.534-.913-3.452-.913M6.588 6.588l-.013.013q-.754.78-.754 1.866v.013q0 1.085.767 1.865.78.768 1.879.768 1.098 0 1.865-.768l.013-.013q.768-.767.768-1.865 0-1.098-.768-1.879-.78-.767-1.865-.767h-.013q-1.085 0-1.866.754l-.013.013m2.408 1.879q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.145.384-.145t.37.145q.159.159.159.384m2.09-2.633q1.085 1.085 1.085 2.633 0 1.534-1.085 2.619-1.085 1.085-2.62 1.085-1.547 0-2.632-1.085-1.072-1.085-1.072-2.62 0-1.534 1.072-2.619l.013-.013q1.085-1.072 2.62-1.072 1.534 0 2.619 1.072" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_118: {
    type: "crosshair",
    name: "Style 118",
    rarity: 1,
    texture: "crosshair118.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M13.335 3.598q-2.01-2.01-4.868-2.01-2.858 0-4.869 2.01-2.01 2.011-2.01 4.869 0 2.857 2.01 4.868 2.011 2.01 4.869 2.01 2.857 0 4.868-2.01 2.01-2.01 2.01-4.868 0-2.858-2.01-4.869m3.07 4.869q0 3.294-2.33 5.609-2.314 2.328-5.608 2.328-3.294 0-5.623-2.328Q.53 11.76.53 8.466q0-3.293 2.315-5.622Q5.173.53 8.467.53t5.609 2.315q2.328 2.329 2.328 5.623" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/><path d="M8.996 8.467q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.146.384-.146t.37.146q.159.159.159.384" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_124: {
    type: "crosshair",
    name: "Style 124",
    rarity: 1,
    texture: "crosshair124.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.467 5.292L4.762 1.588l.53-.53 3.175 3.175 3.175-3.175.529.53-3.704 3.704M5.292 8.467L1.587 12.17l-.529-.53 3.175-3.174-3.175-3.175.53-.53 3.704 3.705m6.35 0l3.704-3.704.529.529L12.7 8.467l3.175 3.175-.53.529-3.703-3.704m-3.175 3.175l3.704 3.704-.53.529L8.468 12.7l-3.175 3.175-.53-.53 3.705-3.703M6.88 7.514l.634-.635.953.953.952-.953.635.635-.952.953.952.952-.635.635-.952-.952-.953.952-.635-.635.953-.952-.953-.953" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_125: {
    type: "crosshair",
    name: "Style 125",
    rarity: 1,
    texture: "crosshair125.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M9.525 8.467l1.587-1.588.53.53-1.059 1.058 1.059 1.058-.53.53-1.587-1.588M8.467 9.525l1.587 1.587-.529.53-1.058-1.059-1.059 1.059-.529-.53 1.588-1.587m0-2.117L6.879 5.821l.53-.53L8.466 6.35l1.058-1.058.53.529-1.588 1.587M7.408 8.467l-1.587 1.587-.53-.529L6.35 8.467 5.292 7.408l.529-.529 1.587 1.588" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_136: {
    type: "crosshair",
    name: "Style 136",
    rarity: 1,
    texture: "crosshair136.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.466.354A8.112 8.112 0 0 0 .354 8.466a8.112 8.112 0 0 0 8.112 8.113 8.112 8.112 0 0 0 8.113-8.113A8.112 8.112 0 0 0 8.466.354zm-.1 1.497v6.514H1.852a6.619 6.619 0 0 1 6.512-6.514zm.202.002a6.619 6.619 0 0 1 6.514 6.512H8.568V1.853zM1.85 8.568h6.514v6.512a6.619 6.619 0 0 1-6.514-6.512zm6.717 0h6.512a6.619 6.619 0 0 1-6.512 6.514V8.568z" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_158: {
    type: "crosshair",
    name: "Style 158",
    rarity: 1,
    texture: "crosshair158.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M8.98 8.46q0 .218-.141.372-.154.142-.372.142t-.36-.142q-.154-.154-.154-.372t.154-.359q.142-.154.36-.154t.372.154q.14.141.14.36m-7.698 0q0 1.808.834 3.271l.706-.706.988.988-1.604 1.579q-.475-.526-.834-1.104Q.255 10.706.255 8.46q0-2.976 1.95-5.132L3.848 4.97 2.82 5.997l-.744-.744Q1.28 6.69 1.28 8.46m14.371 0q0-1.77-.783-3.195l-.641.63L13.2 4.867l1.527-1.54q.513.564.886 1.18 1.064 1.758 1.064 3.952 0 2.207-1.077 3.965l-.886 1.168-1.63-1.63 1.027-1.026.744.744q.796-1.45.796-3.22" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_160: {
    type: "crosshair",
    name: "Style 160",
    rarity: 1,
    texture: "crosshair160.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M16.933.564L9.878 7.62l-.565-.564L16.37 0l.564.564M9.031 8.467q0 .24-.17.395-.154.17-.394.17-.24 0-.41-.17-.155-.155-.155-.395 0-.24.155-.41.17-.155.41-.155.24 0 .395.155.17.17.17.41m7.337 8.466L9.313 9.878l.565-.565 7.055 7.056-.564.564M0 .564L.564 0 7.62 7.056l-.564.564L0 .564m.564 16.37L0 16.368l7.056-7.056.564.565-7.056 7.055" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_173: {
    type: "crosshair",
    name: "Style 173",
    rarity: 1,
    texture: "crosshair173.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M11.642 8.467q0-.926-.45-1.654l-.609.595L9.525 6.35l.609-.595q-.741-.463-1.667-.463t-1.654.463l.595.595L6.35 7.408l-.595-.595q-.463.728-.463 1.654 0 .926.463 1.667l.595-.609 1.058 1.058-.595.609q.728.45 1.654.45.926 0 1.667-.45l-.609-.609 1.058-1.058.609.609q.45-.741.45-1.667m1.058 0q0 1.362-.754 2.42l.754.755-1.058 1.058-.754-.754-.305.198q-.939.556-2.116.556-1.363 0-2.421-.754l-.754.754-1.059-1.058.754-.754q-.754-1.059-.754-2.421 0-1.376.754-2.421l-.754-.754 1.059-1.059.754.754q1.045-.754 2.42-.754 1.178 0 2.117.556l.305.198.754-.754L12.7 5.292l-.754.754q.754 1.058.754 2.42" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_176: {
    type: "crosshair",
    name: "Style 176",
    rarity: 1,
    texture: "crosshair176.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M12.7 8.467q0 1.137-.53 2.063v1.112h-.912Q10.081 12.7 8.467 12.7q-1.628 0-2.805-1.058h-.9v-1.098q-.529-.926-.529-2.077 0-1.151.53-2.077V5.292h.886q1.19-1.059 2.818-1.059 1.614 0 2.804 1.059h.9V6.39q.529.926.529 2.077m-1.984-2.25q-.913-.899-2.17-.925h-.159q-1.27.026-2.17.926-.925.926-.925 2.249 0 1.31.926 2.249.9.9 2.17.926h.158q1.257-.027 2.17-.926.926-.94.926-2.25 0-1.322-.926-2.248m-1.72 2.249q0 .225-.159.37-.145.159-.37.159t-.384-.159q-.145-.145-.145-.37t.145-.384q.159-.146.384-.146t.37.146q.159.159.159.384" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_177: {
    type: "crosshair",
    name: "Style 177",
    rarity: 1,
    texture: "crosshair177.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M1.058 12.726l1.879-2.91.913.542-.675 1.31h1.588v1.058H1.058M8.467.556l1.733 2.91-.913.542-.82-1.362-.807 1.362-.913-.542 1.72-2.91m.529 7.937q0 .172-.093.304l-.066.067q-.145.158-.37.158t-.384-.158l-.053-.067q-.092-.132-.092-.304 0-.225.145-.384.159-.145.384-.145t.37.145q.159.16.159.384m6.879 4.233h-3.704v-1.058h1.587l-.661-1.31.913-.542 1.865 2.91" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_181: {
    type: "crosshair",
    name: "Style 181",
    rarity: 1,
    texture: "crosshair181.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M12.7 8.467q0 1.746-1.244 2.99-1.243 1.243-2.99 1.243-1.759 0-3.002-1.244-1.23-1.243-1.23-2.99 0-1.759 1.23-3.002 1.243-1.23 3.003-1.23 1.746 0 2.99 1.23Q12.7 6.707 12.7 8.467m-1.984-2.25q-.94-.925-2.25-.925-1.322 0-2.248.926-.926.926-.926 2.249 0 1.31.926 2.249.926.926 2.249.926 1.31 0 2.249-.926.926-.94.926-2.25 0-1.322-.926-2.248m-.133 2.249q0 .873-.621 1.495-.622.621-1.495.621-.873 0-1.495-.621-.622-.622-.622-1.495 0-.873.622-1.495.622-.622 1.495-.622.873 0 1.495.622.621.622.621 1.495m-.992-1.125q-.463-.463-1.124-.463-.662 0-1.125.463-.463.463-.463 1.125 0 .661.463 1.124.463.463 1.125.463.661 0 1.124-.463.463-.463.463-1.124 0-.662-.463-1.125" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  },
  crosshair_184: {
    type: "crosshair",
    name: "Style 184",
    rarity: 1,
    texture: "crosshair184.img",
    code: '<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16.933 16.933"><path d="M7.937 3.704h1.059V6.88H7.937V3.704M6.88 7.937v1.059H3.704V7.937H6.88m4.207-2.103q.688.688.953 1.574H10.9q-.185-.45-.556-.82-.37-.37-.82-.556V4.908q.873.251 1.561.926m-5.252.013l.013-.013q.688-.675 1.561-.926v1.124q-.436.186-.807.543l-.013.013-.013.013q-.357.37-.542.807H4.908q.251-.873.926-1.56m0 5.238q-.675-.688-.926-1.561h1.125q.185.45.555.82.37.37.82.556v1.138q-.886-.265-1.574-.953m3.162-2.62q0 .226-.159.371-.145.159-.37.159t-.384-.159q-.146-.145-.146-.37t.146-.384q.159-.146.384-.146t.37.146q.159.159.159.384m1.058.529V7.937h3.175v1.059h-3.175m1.032 2.09q-.688.688-1.561.94V10.9q.437-.185.807-.556l.013-.013q.37-.37.556-.807h1.124q-.251.873-.939 1.561m-3.149-1.032h1.059v3.175H7.937v-3.175" fill="white" stroke="black" stroke-width=".5" stroke-linecap="square"/></svg>'
  }
};
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();
};

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址