improcket/js/game/inventory.mjs
2018-03-06 20:07:13 +00:00

82 lines
1.5 KiB
JavaScript

import {state} from './index.mjs';
import {modules} from '../data.mjs';
import {images as assets} from '../assets.mjs';
import * as events from './events.mjs';
export const items = new Map();
export let currentItem = null;
let onupdate = () => {};
export function init() {
items.clear();
addItem('connector', 'xheavy');
}
export function getTiles() {
let list = Array.from(items.values());
list.sort((a, b) => toId(...a.ident) < toId(...b.ident));
return list;
}
export function addItem(type, id) {
let mapId = toId(type, id);
if (!items.has(mapId)) items.set(mapId, new Tile(type, id));
let tile = items.get(mapId);
tile.increase();
update();
}
export function removeItem(type, id) {
let mapId = toId(type, id);
if (!items.has(mapId)) return;
let tile = items.get(mapId);
tile.decrease();
if (tile.quantity == 0) {
items.delete(mapId);
currentItem = null;
}
if (!state.editing)
events.tossItem();
update();
}
export function selectItem(type, id) {
currentItem = items.get(toId(type, id));
update();
}
export function setOnupdate(func) {
onupdate = func;
}
function update() {
onupdate();
}
function toId(type, id) {
return `${type}.${id}`;
}
class Tile {
constructor(type, id, q = 0) {
this.type = type;
this.id = id;
this.mapId = toId(type, id);
this.quantity = q;
this.image = assets.modules[type][id];
if (type === 'thruster') this.image = this.image.off;
}
get ident() {
return [this.type, this.id];
}
increase() {
this.quantity++;
}
decrease() {
this.quantity = Math.max(0, this.quantity - 1);
}
}