mirror of
https://github.com/tobspr/shapez.io.git
synced 2026-03-02 03:39:21 +00:00
Further progress on the energy generator / wires, fix translations
This commit is contained in:
@@ -5,6 +5,7 @@ export const CHANGELOG = [
|
||||
entries: [
|
||||
"Allow holding ALT in belt planner to reverse direction (by jakobhellermann)",
|
||||
"Clear cursor when trying to pipette the same building twice (by hexy)",
|
||||
"Updated the soundtrack again, it is now 20 minutes in total!",
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -45,7 +45,7 @@ export const globalConfig = {
|
||||
|
||||
// Map
|
||||
mapChunkSize: 16,
|
||||
mapChunkPrerenderMinZoom: 1.15,
|
||||
mapChunkPrerenderMinZoom: 0.7,
|
||||
mapChunkOverviewMinZoom: 0.7,
|
||||
|
||||
// Belt speeds
|
||||
|
||||
@@ -9,6 +9,7 @@ import { Entity } from "../entity";
|
||||
import { MetaBuilding } from "../meta_building";
|
||||
import { GameRoot, enumLayer } from "../root";
|
||||
import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins";
|
||||
import { EnergyConsumerComponent } from "../components/energy_consumer";
|
||||
|
||||
export class MetaAdvancedProcessorBuilding extends MetaBuilding {
|
||||
constructor() {
|
||||
@@ -61,6 +62,14 @@ export class MetaAdvancedProcessorBuilding extends MetaBuilding {
|
||||
],
|
||||
})
|
||||
);
|
||||
entity.addComponent(
|
||||
new EnergyConsumerComponent({
|
||||
bufferSize: 3,
|
||||
perCharge: 1,
|
||||
batteryPosition: new Vector(4, 6.5),
|
||||
})
|
||||
);
|
||||
|
||||
entity.addComponent(
|
||||
new WiredPinsComponent({
|
||||
slots: [
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { enumDirection, Vector } from "../../core/vector";
|
||||
import { enumItemType } from "../base_item";
|
||||
import { EnergyGeneratorComponent } from "../components/energy_generator";
|
||||
import { ItemAcceptorComponent } from "../components/item_acceptor";
|
||||
import { ItemEjectorComponent } from "../components/item_ejector";
|
||||
import { enumPinSlotType, WiredPinsComponent } from "../components/wired_pins";
|
||||
import { Entity } from "../entity";
|
||||
import { MetaBuilding } from "../meta_building";
|
||||
import { GameRoot, enumLayer } from "../root";
|
||||
import { enumLayer, GameRoot } from "../root";
|
||||
import { enumHubGoalRewards } from "../tutorial_goals";
|
||||
import { EnergyGeneratorComponent } from "../components/energy_generator";
|
||||
import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins";
|
||||
import { enumItemType } from "../base_item";
|
||||
import { ItemEjectorComponent } from "../components/item_ejector";
|
||||
|
||||
export class MetaEnergyGenerator extends MetaBuilding {
|
||||
constructor() {
|
||||
@@ -51,17 +51,6 @@ export class MetaEnergyGenerator extends MetaBuilding {
|
||||
entity.addComponent(
|
||||
new ItemAcceptorComponent({
|
||||
slots: [
|
||||
{
|
||||
pos: new Vector(0, 0),
|
||||
directions: [enumDirection.top],
|
||||
filter: enumItemType.shape,
|
||||
},
|
||||
|
||||
{
|
||||
pos: new Vector(1, 0),
|
||||
directions: [enumDirection.top],
|
||||
filter: enumItemType.shape,
|
||||
},
|
||||
{
|
||||
pos: new Vector(0, 1),
|
||||
directions: [enumDirection.bottom],
|
||||
@@ -72,7 +61,6 @@ export class MetaEnergyGenerator extends MetaBuilding {
|
||||
directions: [enumDirection.bottom],
|
||||
filter: enumItemType.shape,
|
||||
},
|
||||
|
||||
{
|
||||
pos: new Vector(1, 0),
|
||||
directions: [enumDirection.top],
|
||||
@@ -99,6 +87,7 @@ export class MetaEnergyGenerator extends MetaBuilding {
|
||||
new EnergyGeneratorComponent({
|
||||
// Set by the energy generator system later
|
||||
requiredKey: null,
|
||||
acceptorSlotIndex: 2,
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ import { HubComponent } from "./components/hub";
|
||||
import { StorageComponent } from "./components/storage";
|
||||
import { EnergyGeneratorComponent } from "./components/energy_generator";
|
||||
import { WiredPinsComponent } from "./components/wired_pins";
|
||||
import { EnergyConsumerComponent } from "./components/energy_consumer";
|
||||
|
||||
export function initComponentRegistry() {
|
||||
gComponentRegistry.register(StaticMapEntityComponent);
|
||||
@@ -27,6 +28,7 @@ export function initComponentRegistry() {
|
||||
gComponentRegistry.register(StorageComponent);
|
||||
gComponentRegistry.register(EnergyGeneratorComponent);
|
||||
gComponentRegistry.register(WiredPinsComponent);
|
||||
gComponentRegistry.register(EnergyConsumerComponent);
|
||||
|
||||
// IMPORTANT ^^^^^ UPDATE ENTITY COMPONENT STORAGE AFTERWARDS
|
||||
|
||||
|
||||
34
src/js/game/components/energy_consumer.js
Normal file
34
src/js/game/components/energy_consumer.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import { Component } from "../component";
|
||||
import { types } from "../../savegame/serialization";
|
||||
import { Vector } from "../../core/vector";
|
||||
|
||||
export class EnergyConsumerComponent extends Component {
|
||||
static getId() {
|
||||
return "EnergyConsumer";
|
||||
}
|
||||
|
||||
static getSchema() {
|
||||
return {
|
||||
bufferSize: types.uint,
|
||||
perCharge: types.uint,
|
||||
stored: types.uint,
|
||||
batteryPosition: types.vector,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {object} param0
|
||||
* @param {number} param0.bufferSize How much energy this consumer can store
|
||||
* @param {number} param0.perCharge How much energy this consumer needs per charge
|
||||
* @param {Vector} param0.batteryPosition world space render offset of the battery icon
|
||||
*/
|
||||
constructor({ bufferSize = 3, perCharge = 1, batteryPosition = new Vector() }) {
|
||||
super();
|
||||
this.bufferSize = bufferSize;
|
||||
this.perCharge = perCharge;
|
||||
this.batteryPosition = batteryPosition;
|
||||
|
||||
this.stored = 0;
|
||||
}
|
||||
}
|
||||
@@ -5,9 +5,6 @@ import { ShapeItem } from "../items/shape_item";
|
||||
|
||||
const maxQueueSize = 20;
|
||||
|
||||
export const ENERGY_GENERATOR_EJECT_SLOT = 0;
|
||||
export const ENERGY_GENERATOR_ACCEPT_SLOT = 4;
|
||||
|
||||
export class EnergyGeneratorComponent extends Component {
|
||||
static getId() {
|
||||
return "EnergyGenerator";
|
||||
@@ -24,8 +21,9 @@ export class EnergyGeneratorComponent extends Component {
|
||||
*
|
||||
* @param {object} param0
|
||||
* @param {string} param0.requiredKey Which shape this generator needs, can be null if not computed yet
|
||||
* @param {number} param0.acceptorSlotIndex
|
||||
*/
|
||||
constructor({ requiredKey }) {
|
||||
constructor({ requiredKey, acceptorSlotIndex = 0 }) {
|
||||
super();
|
||||
this.requiredKey = requiredKey;
|
||||
|
||||
@@ -34,6 +32,12 @@ export class EnergyGeneratorComponent extends Component {
|
||||
* @type {number}
|
||||
*/
|
||||
this.itemsInQueue = 0;
|
||||
|
||||
/**
|
||||
* Stores which slot accepts the waste
|
||||
* @type {number}
|
||||
*/
|
||||
this.acceptorSlotIndex = acceptorSlotIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,7 +46,7 @@ export class EnergyGeneratorComponent extends Component {
|
||||
* @param {number} slot
|
||||
*/
|
||||
tryTakeItem(item, slot) {
|
||||
if (slot === ENERGY_GENERATOR_ACCEPT_SLOT) {
|
||||
if (slot === this.acceptorSlotIndex) {
|
||||
// this is the acceptor slot on the wires layer
|
||||
// just destroy it
|
||||
return true;
|
||||
|
||||
@@ -405,6 +405,7 @@ export class GameCore {
|
||||
systems.hub.draw(params);
|
||||
systems.energyGenerator.draw(params);
|
||||
systems.storage.draw(params);
|
||||
systems.energyConsumer.draw(params);
|
||||
}
|
||||
|
||||
root.hud.parts.wiresOverlay.draw(params);
|
||||
|
||||
@@ -12,6 +12,7 @@ import { HubComponent } from "./components/hub";
|
||||
import { StorageComponent } from "./components/storage";
|
||||
import { EnergyGeneratorComponent } from "./components/energy_generator";
|
||||
import { WiredPinsComponent } from "./components/wired_pins";
|
||||
import { EnergyConsumerComponent } from "./components/energy_consumer";
|
||||
/* typehints:end */
|
||||
|
||||
/**
|
||||
@@ -61,6 +62,9 @@ export class EntityComponentStorage {
|
||||
/** @type {WiredPinsComponent} */
|
||||
this.WiredPins;
|
||||
|
||||
/** @type {EnergyConsumerComponent} */
|
||||
this.EnergyConsumer;
|
||||
|
||||
/* typehints:end */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import { ItemAcceptorSystem } from "./systems/item_acceptor";
|
||||
import { StorageSystem } from "./systems/storage";
|
||||
import { EnergyGeneratorSystem } from "./systems/energy_generator";
|
||||
import { WiredPinsSystem } from "./systems/wired_pins";
|
||||
import { EnergyConsumerSystem } from "./systems/energy_consumer";
|
||||
|
||||
const logger = createLogger("game_system_manager");
|
||||
|
||||
@@ -64,6 +65,9 @@ export class GameSystemManager {
|
||||
/** @type {WiredPinsSystem} */
|
||||
wiredPins: null,
|
||||
|
||||
/** @type {EnergyConsumerSystem} */
|
||||
energyConsumer: null,
|
||||
|
||||
/* typehints:end */
|
||||
};
|
||||
this.systemUpdateOrder = [];
|
||||
@@ -104,6 +108,8 @@ export class GameSystemManager {
|
||||
|
||||
add("wiredPins", WiredPinsSystem);
|
||||
|
||||
add("energyConsumer", EnergyConsumerSystem);
|
||||
|
||||
// IMPORTANT: Must be after belt system since belt system can change the
|
||||
// orientation of an entity after it is placed -> the item acceptor cache
|
||||
// then would be invalid
|
||||
|
||||
@@ -546,7 +546,6 @@ export class BeltSystem extends GameSystemWithFilter {
|
||||
return;
|
||||
}
|
||||
|
||||
parameters.context.globalAlpha = 0.5;
|
||||
const contents = chunk.wireContents;
|
||||
for (let y = 0; y < globalConfig.mapChunkSize; ++y) {
|
||||
for (let x = 0; x < globalConfig.mapChunkSize; ++x) {
|
||||
@@ -564,7 +563,6 @@ export class BeltSystem extends GameSystemWithFilter {
|
||||
}
|
||||
}
|
||||
}
|
||||
parameters.context.globalAlpha = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
48
src/js/game/systems/energy_consumer.js
Normal file
48
src/js/game/systems/energy_consumer.js
Normal file
@@ -0,0 +1,48 @@
|
||||
import { GameSystemWithFilter } from "../game_system_with_filter";
|
||||
import { EnergyConsumerComponent } from "../components/energy_consumer";
|
||||
import { Loader } from "../../core/loader";
|
||||
import { DrawParameters } from "../../core/draw_parameters";
|
||||
import { Entity } from "../entity";
|
||||
import { enableImageSmoothing } from "../../core/buffer_utils";
|
||||
|
||||
export class EnergyConsumerSystem extends GameSystemWithFilter {
|
||||
constructor(root) {
|
||||
super(root, [EnergyConsumerComponent]);
|
||||
|
||||
this.batterySprites = [
|
||||
Loader.getSprite("sprites/wires/battery_empty.png"),
|
||||
Loader.getSprite("sprites/wires/battery_low.png"),
|
||||
Loader.getSprite("sprites/wires/battery_medium.png"),
|
||||
Loader.getSprite("sprites/wires/battery_full.png"),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws everything
|
||||
* @param {DrawParameters} parameters
|
||||
*/
|
||||
draw(parameters) {
|
||||
this.forEachMatchingEntityOnScreen(parameters, this.drawSingleEntity.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a given entity
|
||||
* @param {DrawParameters} parameters
|
||||
* @param {Entity} entity
|
||||
*/
|
||||
drawSingleEntity(parameters, entity) {
|
||||
const staticComp = entity.components.StaticMapEntity;
|
||||
const consumerComp = entity.components.EnergyConsumer;
|
||||
|
||||
const position = staticComp
|
||||
.getTileSpaceBounds()
|
||||
.getCenter()
|
||||
.toWorldSpace()
|
||||
.add(consumerComp.batteryPosition);
|
||||
|
||||
const percentage = consumerComp.stored / consumerComp.bufferSize;
|
||||
|
||||
const index = Math.floor(percentage * this.batterySprites.length);
|
||||
this.batterySprites[index].drawCachedCentered(parameters, position.x, position.y, 12);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { DrawParameters } from "../../core/draw_parameters";
|
||||
import { formatBigNumber } from "../../core/utils";
|
||||
import { T } from "../../translations";
|
||||
import { EnergyGeneratorComponent, ENERGY_GENERATOR_EJECT_SLOT } from "../components/energy_generator";
|
||||
import { EnergyGeneratorComponent } from "../components/energy_generator";
|
||||
import { Entity } from "../entity";
|
||||
import { GameSystemWithFilter } from "../game_system_with_filter";
|
||||
import { POSITIVE_ENERGY_ITEM_SINGLETON } from "../items/positive_energy_item";
|
||||
@@ -36,7 +36,8 @@ export class EnergyGeneratorSystem extends GameSystemWithFilter {
|
||||
}
|
||||
|
||||
if (energyGenComp.itemsInQueue > 0) {
|
||||
if (ejectorComp.tryEject(ENERGY_GENERATOR_EJECT_SLOT, POSITIVE_ENERGY_ITEM_SINGLETON)) {
|
||||
// FIXME: Find slot dynamically
|
||||
if (ejectorComp.tryEject(0, POSITIVE_ENERGY_ITEM_SINGLETON)) {
|
||||
energyGenComp.itemsInQueue -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ export class WiredPinsSystem extends GameSystemWithFilter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws the given layer
|
||||
* Draws the pins
|
||||
* @param {DrawParameters} parameters
|
||||
*/
|
||||
draw(parameters) {
|
||||
@@ -35,7 +35,7 @@ export class WiredPinsSystem extends GameSystemWithFilter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a given chunk
|
||||
* Draws a given entity
|
||||
* @param {DrawParameters} parameters
|
||||
* @param {Entity} entity
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user