Initial commit
This commit is contained in:
@@ -0,0 +1,303 @@
|
||||
const Item = require("./Item");
|
||||
const Cannon = require("./Cannon");
|
||||
const Harpooner = require("./Harpooner");
|
||||
const InventoryList = require("../Game/InventoryList");
|
||||
|
||||
const schemeCannons = require("../Data/cannons");
|
||||
const schemeHarpooners = require("../Data/harpooners");
|
||||
const ammunitions = require("../Data/ammunitions");
|
||||
const harpoons = require("../Data/harpoons");
|
||||
const itemTable = require("../Data/items");
|
||||
const constants = require("../Data/constants");
|
||||
|
||||
const { CATEGORIES, AFFECTS } = constants;
|
||||
const { CATEGORY_ITEM, CATEGORY_AMMUNITION, CATEGORY_HARPOON, CATEGORY_DESIGN, CATEGORY_ECONOMY, CATEGORY_STATUS, CATEGORY_CANNON, CATEGORY_HARPOONER } = CATEGORIES;
|
||||
const { AFFECT_CANNON_DAMAGE, AFFECT_HARPOONER_DAMAGE, AFFECT_PROTECTION, AFFECT_SAILING_SPEED, AFFECT_HITPOINT } = AFFECTS;
|
||||
|
||||
const AFFECT_TABLE = {
|
||||
1: [1, 2, 3, 4],
|
||||
[AFFECT_PROTECTION]: [5, 6, 7, 8]
|
||||
};
|
||||
|
||||
class Inventory {
|
||||
constructor(info) {
|
||||
this.selectedAmmunition = 0;
|
||||
this.selectedHarpoon = 0;
|
||||
|
||||
this.resourceSharedLimiter = info.resourceSharedLimiter;
|
||||
|
||||
this[CATEGORY_AMMUNITION] = new InventoryList();
|
||||
this[CATEGORY_HARPOON] = new InventoryList();
|
||||
this[CATEGORY_ITEM] = new InventoryList();
|
||||
this[CATEGORY_STATUS] = new InventoryList();
|
||||
this[CATEGORY_ECONOMY] = new InventoryList();
|
||||
this[CATEGORY_DESIGN] = new InventoryList();
|
||||
this[CATEGORY_CANNON] = new InventoryList();
|
||||
this[CATEGORY_HARPOONER] = new InventoryList();
|
||||
|
||||
this[CATEGORY_DESIGN].addItem(1, {
|
||||
categoryID: CATEGORY_DESIGN,
|
||||
id: 1,
|
||||
amount: 1
|
||||
}); // default design
|
||||
}
|
||||
|
||||
refreshSingle(element) {
|
||||
switch (element.categoryID) {
|
||||
case CATEGORY_ECONOMY:
|
||||
|
||||
this[CATEGORY_ECONOMY].accumulateItem(element.id, element);
|
||||
break;
|
||||
case CATEGORY_ITEM:
|
||||
const inventoryItem = this[CATEGORY_ITEM].getElement(element.id);
|
||||
if (!inventoryItem) return this.addItem(element);
|
||||
|
||||
inventoryItem.amount += element.amount;
|
||||
break;
|
||||
case CATEGORY_AMMUNITION:
|
||||
if (!element.amount) return;
|
||||
|
||||
this[CATEGORY_AMMUNITION].accumulateItem(element.id, element);
|
||||
|
||||
if (!this.selectedAmmunition) this.setSelectedAmmunition(element.id);
|
||||
break;
|
||||
case CATEGORY_HARPOON:
|
||||
if (!element.amount) return;
|
||||
|
||||
this[CATEGORY_HARPOON].accumulateItem(element.id, element);
|
||||
|
||||
if (!this.selectedHarpoon) this.setSelectedHarpoon(element.id);
|
||||
break;
|
||||
case CATEGORY_DESIGN:
|
||||
this[CATEGORY_DESIGN].accumulateItem(element.id, element);
|
||||
break;
|
||||
case CATEGORY_STATUS:
|
||||
this[CATEGORY_STATUS].accumulateItem(element.id, element);
|
||||
break;
|
||||
case CATEGORY_CANNON:
|
||||
let cannon = this[CATEGORY_CANNON].getElement(element.id);
|
||||
if (!cannon) {
|
||||
const schemeCannon = schemeCannons[element.id];
|
||||
if (!schemeCannon) return;
|
||||
|
||||
cannon = new Cannon({
|
||||
id: element.id,
|
||||
damage: schemeCannon.damage,
|
||||
range: schemeCannon.range,
|
||||
reload: schemeCannon.reload,
|
||||
scatter: schemeCannon.scatter,
|
||||
amount: element.amount,
|
||||
amountEquipped: element.amountEquipped,
|
||||
resourceSharedLimiter: this.resourceSharedLimiter.cannon
|
||||
});
|
||||
|
||||
this[CATEGORY_CANNON].accumulateItem(cannon.id, cannon);
|
||||
} else this[CATEGORY_CANNON].accumulateItem(cannon.id, element);
|
||||
break;
|
||||
case CATEGORY_HARPOONER:
|
||||
let harpooner = this[CATEGORY_HARPOONER].getElement(element.id);
|
||||
if (!harpooner) {
|
||||
const schemeHarpooner = schemeHarpooners[element.id];
|
||||
if (!schemeHarpooner) return;
|
||||
|
||||
harpooner = new Harpooner({
|
||||
id: element.id,
|
||||
damage: schemeHarpooner.damage,
|
||||
range: schemeHarpooner.range,
|
||||
reload: schemeHarpooner.reload,
|
||||
scatter: schemeHarpooner.scatter,
|
||||
amount: element.amount,
|
||||
amountEquipped: element.amountEquipped,
|
||||
resourceSharedLimiter: this.resourceSharedLimiter.harpooner
|
||||
});
|
||||
|
||||
this[CATEGORY_HARPOONER].accumulateItem(harpooner.id, harpooner);
|
||||
} else this[CATEGORY_HARPOONER].accumulateItem(element.id, element);
|
||||
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
use(categoryID, id, amount) {
|
||||
const category = this[categoryID];
|
||||
if (!category) return
|
||||
|
||||
const item = category[id];
|
||||
if (!item || !item.amount) return
|
||||
|
||||
const itemScheme = itemTable[id];
|
||||
if (!itemScheme && categoryID === CATEGORY_ITEM) return
|
||||
|
||||
let removedCount = -1;
|
||||
|
||||
if (itemScheme.isDurable) item.isActive = true;
|
||||
else {
|
||||
if (categoryID === CATEGORY_ITEM) item.nextUseAt = performance.now() + itemScheme.cooldown;
|
||||
removedCount = itemScheme.useOnImpact || categoryID !== CATEGORY_ITEM ? Math.min(amount, item.amount) : 0;
|
||||
|
||||
item.amount -= removedCount;
|
||||
item.usedAmount = removedCount;
|
||||
};
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
disable(id) {
|
||||
const item = this[CATEGORY_ITEM].getElement(id);
|
||||
if (!item) return;
|
||||
|
||||
item.isActive = false;
|
||||
}
|
||||
|
||||
alterAmount(categoryID, id, amount) {
|
||||
const category = this[categoryID];
|
||||
if (!category) return
|
||||
|
||||
const element = category.getElement(id);
|
||||
if (!element || !element.amount) return
|
||||
|
||||
const usedAmount = Math.min(amount, element.amount);
|
||||
element.amount -= usedAmount;
|
||||
|
||||
return usedAmount;
|
||||
}
|
||||
|
||||
setSelectedAmmunition(id) {
|
||||
if (!id) return this.selectedAmmunition = 0;
|
||||
|
||||
if (!ammunitions[id]) return;
|
||||
|
||||
const ammunition = this[CATEGORY_AMMUNITION].hasElement(id);
|
||||
if (!ammunition) return this.selectedAmmunition = 0;
|
||||
|
||||
console.info(ammunition)
|
||||
|
||||
return this.selectedAmmunition = id;
|
||||
}
|
||||
|
||||
getSelectedAmmunition() {
|
||||
const selectedAmmunition = this[CATEGORY_AMMUNITION].getElement(this.selectedAmmunition);
|
||||
if (!selectedAmmunition) return;
|
||||
|
||||
return selectedAmmunition;
|
||||
}
|
||||
|
||||
setSelectedHarpoon(id) {
|
||||
if (!id) return this.selectedHarpoon = 0;
|
||||
|
||||
if (!harpoons[id]) return;
|
||||
|
||||
const harpoon = this[CATEGORY_HARPOON].hasElement(id);
|
||||
if (!harpoon) return this.selectedHarpoon = 0;
|
||||
|
||||
return this.selectedHarpoon = id;
|
||||
}
|
||||
|
||||
getSeletedHarpoon() {
|
||||
const selectedHarpoon = this[CATEGORY_HARPOON].getElement(this.selectedHarpoon);
|
||||
if (!selectedHarpoon) return;
|
||||
|
||||
return selectedHarpoon;
|
||||
}
|
||||
|
||||
addItem(entry) {
|
||||
const itemScheme = itemTable[entry.id];
|
||||
if (!itemScheme) return;
|
||||
if (!entry.amount) return;
|
||||
|
||||
const { time, scale, affects } = itemScheme;
|
||||
|
||||
const item = new Item({
|
||||
id: entry.id,
|
||||
amount: entry.amount,
|
||||
time,
|
||||
scale,
|
||||
affects
|
||||
});
|
||||
|
||||
this[CATEGORY_ITEM].addItem(item.id, item);
|
||||
}
|
||||
|
||||
getItemsByAffect(affect) {
|
||||
const items = Object.values(this[CATEGORY_ITEM]);
|
||||
return items.filter(item => item.affects.includes(affect));
|
||||
}
|
||||
|
||||
useAvailableItemsByAffect(affect, cb) {
|
||||
AFFECT_TABLE[affect]
|
||||
.forEach(itemID => {
|
||||
const item = this[CATEGORY_ITEM].getElement(itemID);
|
||||
if (item && item.isActive && item.amount) {
|
||||
const use = item.use();
|
||||
cb(use.scale, itemID, use.statusID, use.isStatusActive);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
getPosessions() {
|
||||
return {
|
||||
[CATEGORY_AMMUNITION]: this[CATEGORY_AMMUNITION],
|
||||
[CATEGORY_HARPOON]: this[CATEGORY_HARPOON],
|
||||
[CATEGORY_DESIGN]: this[CATEGORY_DESIGN]
|
||||
};
|
||||
}
|
||||
|
||||
getDesignIDs() {
|
||||
const designIDs = [];
|
||||
this[CATEGORY_DESIGN].each(key => designIDs.push(key));
|
||||
|
||||
return designIDs;
|
||||
}
|
||||
|
||||
getEconomy() {
|
||||
const economy = [];
|
||||
this[CATEGORY_ECONOMY].each((key, value) => economy.push(value));
|
||||
|
||||
return economy;
|
||||
}
|
||||
|
||||
getAmmunitions() {
|
||||
const ammunitions = [];
|
||||
this[CATEGORY_AMMUNITION].each((key, value) => ammunitions.push(value));
|
||||
|
||||
return ammunitions;
|
||||
}
|
||||
|
||||
getHarpoons() {
|
||||
const harpoons = [];
|
||||
this[CATEGORY_HARPOON].each((key, value) => harpoons.push(value));
|
||||
|
||||
return harpoons;
|
||||
}
|
||||
|
||||
getItems() {
|
||||
const items = [];
|
||||
this[CATEGORY_ITEM].each((key, value) => items.push(value));
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
getCannons() {
|
||||
const cannons = [];
|
||||
this[CATEGORY_CANNON].each((key, value) => cannons.push(value));
|
||||
|
||||
return cannons;
|
||||
}
|
||||
|
||||
getHarpooners() {
|
||||
const harpooners = [];
|
||||
this[CATEGORY_HARPOONER].each((key, value) => harpooners.push(value));
|
||||
|
||||
return harpooners;
|
||||
}
|
||||
|
||||
hasDesign(id) {
|
||||
return this[CATEGORY_DESIGN].hasElement(id);
|
||||
}
|
||||
|
||||
getItem(id) {
|
||||
return this[CATEGORY_ITEM].getElement(id);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = Inventory;
|
||||
Reference in New Issue
Block a user