diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js index ccbbc248..a37ea20d 100644 --- a/src/js/game/blueprint.js +++ b/src/js/game/blueprint.js @@ -44,7 +44,7 @@ export class Blueprint { const entity = root.entityMgr.findByUid(uids[i]); assert(entity, "Entity for blueprint not found:" + uids[i]); - const clone = entity.duplicateWithoutContents(); + const clone = entity.clone(); newEntities.push(clone); const pos = entity.components.StaticMapEntity.getTileSpaceBounds().getCenter(); @@ -160,7 +160,7 @@ export class Blueprint { continue; } - const clone = entity.duplicateWithoutContents(); + const clone = entity.clone(); clone.components.StaticMapEntity.origin.addInplace(tile); root.logic.freeEntityAreaBeforeBuild(clone); root.map.placeStaticEntity(clone); diff --git a/src/js/game/component.js b/src/js/game/component.js index 7d30faff..46b1b545 100644 --- a/src/js/game/component.js +++ b/src/js/game/component.js @@ -18,12 +18,10 @@ export class Component extends BasicSerializableObject { } /** - * Should duplicate the component but without its contents - * @returns {object} + * Copy the current state to another component + * @param {Component} otherComponent */ - duplicateWithoutContents() { - abstract; - } + copyAdditionalStateTo(otherComponent) {} /* dev:start */ diff --git a/src/js/game/components/belt.js b/src/js/game/components/belt.js index 02197822..138c4775 100644 --- a/src/js/game/components/belt.js +++ b/src/js/game/components/belt.js @@ -40,10 +40,6 @@ export class BeltComponent extends Component { return "Belt"; } - duplicateWithoutContents() { - return new BeltComponent({ direction: this.direction }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/belt_reader.js b/src/js/game/components/belt_reader.js index d59feb9c..d451bab5 100644 --- a/src/js/game/components/belt_reader.js +++ b/src/js/game/components/belt_reader.js @@ -8,10 +8,6 @@ export class BeltReaderComponent extends Component { return "BeltReader"; } - duplicateWithoutContents() { - return new BeltReaderComponent(); - } - static getSchema() { return { lastItem: types.nullable(typeItemSingleton), diff --git a/src/js/game/components/belt_underlays.js b/src/js/game/components/belt_underlays.js index c794564f..63b265d0 100644 --- a/src/js/game/components/belt_underlays.js +++ b/src/js/game/components/belt_underlays.js @@ -30,21 +30,6 @@ export class BeltUnderlaysComponent extends Component { return "BeltUnderlays"; } - duplicateWithoutContents() { - const beltUnderlaysCopy = []; - for (let i = 0; i < this.underlays.length; ++i) { - const underlay = this.underlays[i]; - beltUnderlaysCopy.push({ - pos: underlay.pos.copy(), - direction: underlay.direction, - }); - } - - return new BeltUnderlaysComponent({ - underlays: beltUnderlaysCopy, - }); - } - /** * @param {object} param0 * @param {Array=} param0.underlays Where to render belt underlays diff --git a/src/js/game/components/constant_signal.js b/src/js/game/components/constant_signal.js index b51277a1..286108be 100644 --- a/src/js/game/components/constant_signal.js +++ b/src/js/game/components/constant_signal.js @@ -15,8 +15,12 @@ export class ConstantSignalComponent extends Component { }; } - duplicateWithoutContents() { - return new ConstantSignalComponent({ signal: this.signal }); + /** + * Copy the current state to another component + * @param {ConstantSignalComponent} otherComponent + */ + copyAdditionalStateTo(otherComponent) { + otherComponent.signal = this.signal; } /** diff --git a/src/js/game/components/display.js b/src/js/game/components/display.js index 720bf8c7..5a5b1b3b 100644 --- a/src/js/game/components/display.js +++ b/src/js/game/components/display.js @@ -4,8 +4,4 @@ export class DisplayComponent extends Component { static getId() { return "Display"; } - - duplicateWithoutContents() { - return new DisplayComponent(); - } } diff --git a/src/js/game/components/item_acceptor.js b/src/js/game/components/item_acceptor.js index 3885eb1f..7dbd9677 100644 --- a/src/js/game/components/item_acceptor.js +++ b/src/js/game/components/item_acceptor.js @@ -28,22 +28,6 @@ export class ItemAcceptorComponent extends Component { return "ItemAcceptor"; } - duplicateWithoutContents() { - const slotsCopy = []; - for (let i = 0; i < this.slots.length; ++i) { - const slot = this.slots[i]; - slotsCopy.push({ - pos: slot.pos.copy(), - directions: slot.directions.slice(), - filter: slot.filter, - }); - } - - return new ItemAcceptorComponent({ - slots: slotsCopy, - }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js index 7839ba0a..4eda52f9 100644 --- a/src/js/game/components/item_ejector.js +++ b/src/js/game/components/item_ejector.js @@ -35,22 +35,6 @@ export class ItemEjectorComponent extends Component { }; } - duplicateWithoutContents() { - const slotsCopy = []; - for (let i = 0; i < this.slots.length; ++i) { - const slot = this.slots[i]; - slotsCopy.push({ - pos: slot.pos.copy(), - direction: slot.direction, - }); - } - - return new ItemEjectorComponent({ - slots: slotsCopy, - renderFloatingItems: this.renderFloatingItems, - }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index 4947a521..23d34687 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -49,14 +49,6 @@ export class ItemProcessorComponent extends Component { }; } - duplicateWithoutContents() { - return new ItemProcessorComponent({ - processorType: this.type, - processingRequirement: this.processingRequirement, - inputsPerCharge: this.inputsPerCharge, - }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/lever.js b/src/js/game/components/lever.js index e17df1e8..106cbbdd 100644 --- a/src/js/game/components/lever.js +++ b/src/js/game/components/lever.js @@ -12,8 +12,12 @@ export class LeverComponent extends Component { }; } - duplicateWithoutContents() { - return new LeverComponent({ toggled: this.toggled }); + /** + * Copy the current state to another component + * @param {LeverComponent} otherComponent + */ + copyAdditionalStateTo(otherComponent) { + otherComponent.toggled = this.toggled; } /** diff --git a/src/js/game/components/logic_gate.js b/src/js/game/components/logic_gate.js index e84d7bc9..a19f70b6 100644 --- a/src/js/game/components/logic_gate.js +++ b/src/js/game/components/logic_gate.js @@ -22,10 +22,6 @@ export class LogicGateComponent extends Component { return "LogicGate"; } - duplicateWithoutContents() { - return new LogicGateComponent({ type: this.type }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/miner.js b/src/js/game/components/miner.js index 5b818afb..ab87760f 100644 --- a/src/js/game/components/miner.js +++ b/src/js/game/components/miner.js @@ -19,12 +19,6 @@ export class MinerComponent extends Component { }; } - duplicateWithoutContents() { - return new MinerComponent({ - chainable: this.chainable, - }); - } - constructor({ chainable = false }) { super(); this.lastMiningTime = 0; diff --git a/src/js/game/components/static_map_entity.js b/src/js/game/components/static_map_entity.js index 3d138e42..d5daa998 100644 --- a/src/js/game/components/static_map_entity.js +++ b/src/js/game/components/static_map_entity.js @@ -63,7 +63,11 @@ export class StaticMapEntityComponent extends Component { return getBuildingDataFromCode(this.code).metaInstance; } - duplicateWithoutContents() { + /** + * Copy the current state to another component + * @param {Component} otherComponent + */ + copyAdditionalStateTo(otherComponent) { return new StaticMapEntityComponent({ origin: this.origin.copy(), rotation: this.rotation, diff --git a/src/js/game/components/storage.js b/src/js/game/components/storage.js index 3b32f6a3..be243a44 100644 --- a/src/js/game/components/storage.js +++ b/src/js/game/components/storage.js @@ -17,10 +17,6 @@ export class StorageComponent extends Component { }; } - duplicateWithoutContents() { - return new StorageComponent({ maximumStorage: this.maximumStorage }); - } - /** * @param {object} param0 * @param {number=} param0.maximumStorage How much this storage can hold diff --git a/src/js/game/components/underground_belt.js b/src/js/game/components/underground_belt.js index 74351aac..70a272e4 100644 --- a/src/js/game/components/underground_belt.js +++ b/src/js/game/components/underground_belt.js @@ -29,13 +29,6 @@ export class UndergroundBeltComponent extends Component { }; } - duplicateWithoutContents() { - return new UndergroundBeltComponent({ - mode: this.mode, - tier: this.tier, - }); - } - /** * * @param {object} param0 diff --git a/src/js/game/components/wire.js b/src/js/game/components/wire.js index 88c56249..4bb1edca 100644 --- a/src/js/game/components/wire.js +++ b/src/js/game/components/wire.js @@ -13,10 +13,6 @@ export class WireComponent extends Component { return "Wire"; } - duplicateWithoutContents() { - return new WireComponent({ type: this.type }); - } - /** * @param {object} param0 * @param {enumWireType=} param0.type diff --git a/src/js/game/components/wire_tunnel.js b/src/js/game/components/wire_tunnel.js index dfb38f1f..e1be448b 100644 --- a/src/js/game/components/wire_tunnel.js +++ b/src/js/game/components/wire_tunnel.js @@ -5,10 +5,6 @@ export class WireTunnelComponent extends Component { return "WireTunnel"; } - duplicateWithoutContents() { - return new WireTunnelComponent({ multipleDirections: this.multipleDirections }); - } - /** * @param {object} param0 * @param {boolean=} param0.multipleDirections diff --git a/src/js/game/components/wired_pins.js b/src/js/game/components/wired_pins.js index 9a19c2b0..ff339b86 100644 --- a/src/js/game/components/wired_pins.js +++ b/src/js/game/components/wired_pins.js @@ -49,20 +49,6 @@ export class WiredPinsComponent extends Component { this.setSlots(slots); } - duplicateWithoutContents() { - const slots = []; - for (let i = 0; i < this.slots.length; ++i) { - const slot = this.slots[i]; - slots.push({ - pos: slot.pos.copy(), - type: slot.type, - direction: slot.direction, - }); - } - - return new WiredPinsComponent({ slots }); - } - /** * Sets the slots of this building * @param {Array} slots diff --git a/src/js/game/entity.js b/src/js/game/entity.js index 095fda8f..d7dd715e 100644 --- a/src/js/game/entity.js +++ b/src/js/game/entity.js @@ -11,6 +11,7 @@ import { EntityComponentStorage } from "./entity_components"; import { Loader } from "../core/loader"; import { drawRotatedSprite } from "../core/draw_utils"; import { gComponentRegistry } from "../core/global_registries"; +import { getBuildingDataFromCode } from "./building_codes"; export class Entity extends BasicSerializableObject { /** @@ -82,14 +83,25 @@ export class Entity extends BasicSerializableObject { } /** - * Returns a clone of this entity without contents + * Returns a clone of this entity */ - duplicateWithoutContents() { - const clone = new Entity(this.root); + clone() { + const staticComp = this.components.StaticMapEntity; + const buildingData = getBuildingDataFromCode(staticComp.code); + + const clone = buildingData.metaInstance.createEntity({ + root: this.root, + origin: staticComp.origin, + originalRotation: staticComp.originalRotation, + rotation: staticComp.rotation, + rotationVariant: buildingData.rotationVariant, + variant: buildingData.variant, + }); + for (const key in this.components) { - clone.components[key] = this.components[key].duplicateWithoutContents(); + /** @type {Component} */ (this.components[key]).copyAdditionalStateTo(clone.components[key]); } - clone.layer = this.layer; + return clone; }