From 5b35c2e49d16ade2bb94a5fcad7bacdfedbe804b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9=20Lopez?= <51089082+BaleineSanguine@users.noreply.github.com> Date: Wed, 23 Sep 2020 08:15:05 +0200 Subject: [PATCH] Added portable hub building Just need artwork + Smol optimization in systems\item_processor.js cuz my ide said so --- res/ui/building_icons/portable_hub.png | Bin 0 -> 5427 bytes res/ui/building_tutorials/portable_hub.png | Bin 0 -> 33351 bytes src/css/icons.scss | 5 +- src/js/game/buildings/portable_hub.js | 56 +++++++++++++++++++++ src/js/game/components/item_processor.js | 1 - src/js/game/hud/parts/buildings_toolbar.js | 2 + src/js/game/key_action_mapper.js | 2 + src/js/game/meta_building_registry.js | 5 ++ src/js/game/systems/item_processor.js | 9 +--- translations/base-en.yaml | 6 +++ 10 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 res/ui/building_icons/portable_hub.png create mode 100644 res/ui/building_tutorials/portable_hub.png create mode 100644 src/js/game/buildings/portable_hub.js diff --git a/res/ui/building_icons/portable_hub.png b/res/ui/building_icons/portable_hub.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a34ae6ec98f80220fc9a6cd1c5288e5031cc89 GIT binary patch literal 5427 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 literal 0 HcmV?d00001 diff --git a/res/ui/building_tutorials/portable_hub.png b/res/ui/building_tutorials/portable_hub.png new file mode 100644 index 0000000000000000000000000000000000000000..3d69bb538503e97b87eae18b5c74c7f37575806d GIT binary patch literal 33351 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

T$(48NS?a?4O)*sbtmMA^x|rN6?)&n* zPEO7%zaP37N=B}bCea&A`TRjo;SXXVQ@8ue1q=uw1p|!44f2d$kT^o1RHcq4Mjceo zZI%&#J}CIG zBXs=K@P2IQs!-x4U)-7X%*}b7;_MR!7e$3Mz62hP}V4hCYifwjKp{6t-fU zrkHo`^{c*JVeNuxk^$2WRdLSjK^o>~VcpKc@7_NK$;S~LX3bv4&u28&<(s8E4`I&D z=(W}7&?7N2JRH*$)Z+9@DV7H;9d_NSNg}xK6h56=&Po}vyS_Q0vXA{^Vo$58^kaQq zb=)L5l)opJAfS-a=FL(;Df0lC{=i-Ofoxd5p`xA0%`Iy-Q!d`jcTEi)y9YB7ksBf8 z6pZ`nDflgl6tCMN{0g$Sn!Ht(u#s+dwuY;_DL&rwKYsH}MLDZUo+-YRV3p*v;jxdN zD4+6-?wAE`+~!xao(p7TR%-t6OXI$!Qpav`)k}Pv0|rI?q|hKKAt4g`rd;rji?dUbsMp4i z-d=|NqAL+7rJS_2KE6Ij(anPdpRKOg6vI0EKJIA31!`_?hI0Wb+|pdq#{S{V%uH9p z9duNnF@u=o#&-(uiT;{rr%&)`FZ?00dBqXTE6yxH_SIah@k?F+zp0r(3??J~$)J3f zM!Wqrv81_6;ZBE05Lc~AaK zUjIhiHNRWQDk5$=g9~b>a!_Jmd}xd)D2SADFMQiGRp;gL>{(iUz0dRK&j*@qhc~>A zA)^Rf3(%m~t0t#B7UEVVwm)M&FOkfM&kDbw3E*g_UDUrZ6KMA*Jk}%P!gly)ZQgXB znR!)w=7{?Y8r+=Xmot&J20W-BL(PPLlv-=~~@m0KA z#UEoOhsTnJk1px_xFY4Y0fZ1Y>~eXG{iu45BaAj@DHzDe$>||SSz79Zkq*>dboK84 z`Sa)e{ENfpME;mIL5bb(6x~U+MF+Hqjtr}g@1ADa@$8`!(~Z%|0uST-1H)`4%)TM6 z3Om^U?rhVH%+k|K#;2!z_FDfvI^buf`ed8<&IrMw^b2Sv*`;*VQr`H9O1drdi6wdp zTk`b_LIv11VDU-t@ol9X(H<|)D$znbP*jBfGI2vblp=ps4MC%Xu4Q!895Q4_tdp|L zp=sbgg2@8hbl2y%shk`g>BYRKm-b1!9$M;VBa}qW@r<4gM}}r#rIwCu%xx4*d&Oxx zx;}a%N4xaWt_Qo2&-iZU-cHO= }cOSof0**9^hFKPI~Jm=mm0VwEJB`OaXacSBs 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%0Djy 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 literal 0 HcmV?d00001 diff --git a/src/css/icons.scss b/src/css/icons.scss index 841fccd9..42074acb 100644 --- a/src/css/icons.scss +++ b/src/css/icons.scss @@ -1,6 +1,5 @@ $buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, trash, underground_belt, wire, - constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader; - + constant_signal, logic_gate, lever, filter, wire_tunnel, display, virtual_processor, reader, portable_hub; @each $building in $buildings { [data-icon="building_icons/#{$building}.png"] { background-image: uiResource("res/ui/building_icons/#{$building}.png") !important; @@ -9,7 +8,7 @@ $buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, tra $buildingsAndVariants: belt, splitter, splitter-compact, splitter-compact-inverse, underground_belt, underground_belt-tier2, miner, miner-chainable, cutter, cutter-quad, rotater, rotater-ccw, rotater-fl, - stacker, mixer, painter, painter-double, painter-quad, trash, trash-storage; + stacker, mixer, painter, painter-double, painter-quad, trash, trash-storage, portable_hub; @each $building in $buildingsAndVariants { [data-icon="building_tutorials/#{$building}.png"] { background-image: uiResource("res/ui/building_tutorials/#{$building}.png") !important; diff --git a/src/js/game/buildings/portable_hub.js b/src/js/game/buildings/portable_hub.js new file mode 100644 index 00000000..59a76ff4 --- /dev/null +++ b/src/js/game/buildings/portable_hub.js @@ -0,0 +1,56 @@ +import { MetaBuilding } from "../meta_building"; +import {ItemAcceptorComponent} from "../components/item_acceptor"; +import {enumDirection, Vector} from "../../core/vector"; +import {enumItemProcessorTypes, ItemProcessorComponent} from "../components/item_processor"; +import {enumPinSlotType, WiredPinsComponent} from "../components/wired_pins"; + +export class MetaPortableHubBuilding extends MetaBuilding { + constructor() { + super("portable_hub"); + } + + getIsRotateable(variant) { + return false; + } + + getSilhouetteColor() { + return "#eb5555"; + } + + setupEntityComponents(entity, root) { + entity.addComponent( + new ItemAcceptorComponent({ + slots: [ + { + pos: new Vector(0, 0), + directions: [ + enumDirection.top, + enumDirection.right, + enumDirection.bottom, + enumDirection.left, + ], + }, + ], + }) + ); + + entity.addComponent( + new WiredPinsComponent({ + slots: [ + { + pos: new Vector(0, 0), + type: enumPinSlotType.logicalEjector, + direction: enumDirection.left, + }, + ], + }) + ); + + entity.addComponent( + new ItemProcessorComponent({ + inputsPerCharge: 1, + processorType: enumItemProcessorTypes.hub, + }) + ); + } +} diff --git a/src/js/game/components/item_processor.js b/src/js/game/components/item_processor.js index 5d51b4a3..8fb180a1 100644 --- a/src/js/game/components/item_processor.js +++ b/src/js/game/components/item_processor.js @@ -1,7 +1,6 @@ import { types } from "../../savegame/serialization"; import { BaseItem } from "../base_item"; import { Component } from "../component"; -import { typeItemSingleton } from "../item_resolver"; /** @enum {string} */ export const enumItemProcessorTypes = { diff --git a/src/js/game/hud/parts/buildings_toolbar.js b/src/js/game/hud/parts/buildings_toolbar.js index f8953204..f4c064b5 100644 --- a/src/js/game/hud/parts/buildings_toolbar.js +++ b/src/js/game/hud/parts/buildings_toolbar.js @@ -13,6 +13,7 @@ import { MetaLeverBuilding } from "../../buildings/lever"; import { MetaFilterBuilding } from "../../buildings/filter"; import { MetaDisplayBuilding } from "../../buildings/display"; import { MetaReaderBuilding } from "../../buildings/reader"; +import {MetaPortableHubBuilding} from "../../buildings/portable_hub"; const supportedBuildings = [ MetaBeltBaseBuilding, @@ -29,6 +30,7 @@ const supportedBuildings = [ MetaFilterBuilding, MetaDisplayBuilding, MetaReaderBuilding, + MetaPortableHubBuilding, ]; export class HUDBuildingsToolbar extends HUDBaseToolbar { diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index d5a758a5..13438505 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -65,6 +65,8 @@ export const KEYMAPPINGS = { constant_signal: { keyCode: key("3") }, logic_gate: { keyCode: key("4") }, virtual_processor: { keyCode: key("5") }, + + portable_hub: { keyCode: key("P") }, }, placement: { diff --git a/src/js/game/meta_building_registry.js b/src/js/game/meta_building_registry.js index 647e55f5..11e0cc20 100644 --- a/src/js/game/meta_building_registry.js +++ b/src/js/game/meta_building_registry.js @@ -23,6 +23,7 @@ import { MetaWireTunnelBuilding, enumWireTunnelVariants } from "./buildings/wire import { MetaDisplayBuilding } from "./buildings/display"; import { MetaVirtualProcessorBuilding, enumVirtualProcessorVariants } from "./buildings/virtual_processor"; import { MetaReaderBuilding } from "./buildings/reader"; +import {MetaPortableHubBuilding} from "./buildings/portable_hub"; const logger = createLogger("building_registry"); @@ -47,6 +48,7 @@ export function initMetaBuildingRegistry() { gMetaBuildingRegistry.register(MetaDisplayBuilding); gMetaBuildingRegistry.register(MetaVirtualProcessorBuilding); gMetaBuildingRegistry.register(MetaReaderBuilding); + gMetaBuildingRegistry.register(MetaPortableHubBuilding); // Belt registerBuildingVariant(1, MetaBeltBaseBuilding, defaultBuildingVariant, 0); @@ -137,6 +139,9 @@ export function initMetaBuildingRegistry() { // Reader registerBuildingVariant(49, MetaReaderBuilding); + // Portable hub + registerBuildingVariant(50, MetaPortableHubBuilding); + // Propagate instances for (const key in gBuildingVariants) { gBuildingVariants[key].metaInstance = gMetaBuildingRegistry.findByClass( diff --git a/src/js/game/systems/item_processor.js b/src/js/game/systems/item_processor.js index d58aa697..5bfddf5e 100644 --- a/src/js/game/systems/item_processor.js +++ b/src/js/game/systems/item_processor.js @@ -116,10 +116,8 @@ export class ItemProcessorSystem extends GameSystemWithFilter { // Check the network value at the given slot const network = pinsComp.slots[slotIndex - 1].linkedNetwork; const slotIsEnabled = network && isTruthyItem(network.currentValue); - if (!slotIsEnabled) { - return false; - } - return true; + return slotIsEnabled; + } case enumItemProcessorRequirements.filter: { @@ -524,9 +522,6 @@ export class ItemProcessorSystem extends GameSystemWithFilter { case enumItemProcessorTypes.hub: { trackProduction = false; - const hubComponent = entity.components.Hub; - assert(hubComponent, "Hub item processor has no hub component"); - for (let i = 0; i < items.length; ++i) { const item = /** @type {ShapeItem} */ (items[i].item); this.root.hubGoals.handleDefinitionDelivered(item.definition); diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 28fef7e2..5a372487 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -637,6 +637,11 @@ buildings: name: Compare description: Returns true if both items are exactly equal. Can compare shapes, items and booleans. + portable_hub: + default: + name: &portable_hub Portable hub + description: Like the hub but mini + storyRewards: # Those are the rewards gained from completing the store reward_cutter_and_trash: @@ -956,6 +961,7 @@ keybindings: wire_tunnel: *wire_tunnel display: *display reader: *reader + portable_hub: *portable_hub # --- pipette: Pipette