// ==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();
};