1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-02-20 14:59:19 +00:00

Add dye incinerator building.

This commit is contained in:
hexagonhexagon 2020-06-14 10:20:53 -04:00
parent 374e8b0db1
commit f05a282581
13 changed files with 114 additions and 26 deletions

View File

@ -9,9 +9,9 @@
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="96" inkscape:export-ydpi="96"
inkscape:export-xdpi="96" inkscape:export-xdpi="96"
inkscape:export-filename="C:\Users\Jasper\WebstormProjects\shapez.io\res_raw\sprites\buildings\furnace.png" inkscape:export-filename="/home/dualhexagon/Desktop/shapezio/shapez.io/res_raw/sprites/buildings/mixer-incinerator.png"
sodipodi:docname="furnace.svg" sodipodi:docname="furnace.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)" inkscape:version="0.92.3 (2405546, 2018-03-11)"
id="svg8" id="svg8"
version="1.1" version="1.1"
viewBox="0 0 384 192" viewBox="0 0 384 192"
@ -21,10 +21,10 @@
id="defs2" /> id="defs2" />
<sodipodi:namedview <sodipodi:namedview
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:window-y="-8" inkscape:window-y="27"
inkscape:window-x="-8" inkscape:window-x="67"
inkscape:window-height="1017" inkscape:window-height="713"
inkscape:window-width="1920" inkscape:window-width="1299"
inkscape:bbox-paths="true" inkscape:bbox-paths="true"
inkscape:bbox-nodes="true" inkscape:bbox-nodes="true"
inkscape:snap-nodes="false" inkscape:snap-nodes="false"
@ -44,9 +44,9 @@
inkscape:document-rotation="0" inkscape:document-rotation="0"
inkscape:current-layer="layer3" inkscape:current-layer="layer3"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:cy="120.16762" inkscape:cy="112.64913"
inkscape:cx="210.28118" inkscape:cx="191.77955"
inkscape:zoom="2.4601423" inkscape:zoom="0.947937"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
borderopacity="1.0" borderopacity="1.0"
@ -59,19 +59,23 @@
<sodipodi:guide <sodipodi:guide
id="guide837" id="guide837"
orientation="1,0" orientation="1,0"
position="9,183" /> position="9,183"
inkscape:locked="false" />
<sodipodi:guide <sodipodi:guide
id="guide839" id="guide839"
orientation="0,-1" orientation="0,-1"
position="9,183" /> position="9,183"
inkscape:locked="false" />
<sodipodi:guide <sodipodi:guide
id="guide841" id="guide841"
orientation="1,0" orientation="1,0"
position="375,183" /> position="375,183"
inkscape:locked="false" />
<sodipodi:guide <sodipodi:guide
id="guide843" id="guide843"
orientation="0,-1" orientation="0,-1"
position="9,9" /> position="9,9"
inkscape:locked="false" />
</sodipodi:namedview> </sodipodi:namedview>
<metadata <metadata
id="metadata5"> id="metadata5">

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -7,7 +7,7 @@ $buildings: belt, cutter, miner, mixer, painter, rotater, splitter, stacker, tra
} }
$buildingsAndVariants: belt, splitter, splitter-compact, splitter-compact-inverse, underground_belt, $buildingsAndVariants: belt, splitter, splitter-compact, splitter-compact-inverse, underground_belt,
underground_belt-tier2, miner, miner-chainable, cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, underground_belt-tier2, miner, miner-chainable, cutter, cutter-quad, rotater, rotater-ccw, stacker, mixer, mixer-incinerator,
painter, painter-double, painter-quad, trash, trash-storage; painter, painter-double, painter-quad, trash, trash-storage;
@each $building in $buildingsAndVariants { @each $building in $buildingsAndVariants {
[data-icon="building_tutorials/#{$building}.png"] { [data-icon="building_tutorials/#{$building}.png"] {

View File

@ -65,6 +65,7 @@ export const globalConfig = {
painterDouble: 1 / 8, painterDouble: 1 / 8,
painterQuad: 1 / 8, painterQuad: 1 / 8,
mixer: 1 / 5, mixer: 1 / 5,
dyeIncinerator: 1 / 4,
stacker: 1 / 6, stacker: 1 / 6,
}, },

View File

@ -4,19 +4,28 @@ import { ItemAcceptorComponent, enumItemAcceptorItemFilter } from "../components
import { ItemEjectorComponent } from "../components/item_ejector"; import { ItemEjectorComponent } from "../components/item_ejector";
import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor"; import { enumItemProcessorTypes, ItemProcessorComponent } from "../components/item_processor";
import { Entity } from "../entity"; import { Entity } from "../entity";
import { MetaBuilding } from "../meta_building"; import { MetaBuilding, defaultBuildingVariant } from "../meta_building";
import { GameRoot } from "../root"; import { GameRoot } from "../root";
import { enumHubGoalRewards } from "../tutorial_goals"; import { enumHubGoalRewards } from "../tutorial_goals";
import { T } from "../../translations"; import { T } from "../../translations";
import { formatItemsPerSecond } from "../../core/utils"; import { formatItemsPerSecond } from "../../core/utils";
/** @enum {string} */
export const enumMixerVariants = { incinerator: "incinerator" };
export class MetaMixerBuilding extends MetaBuilding { export class MetaMixerBuilding extends MetaBuilding {
constructor() { constructor() {
super("mixer"); super("mixer");
} }
getDimensions() { getDimensions(variant) {
return new Vector(2, 1); switch (variant) {
case defaultBuildingVariant:
case enumMixerVariants.incinerator:
return new Vector(2, 1);
default:
assertAlways(false, "Unknown mixer variant: " + variant);
}
} }
getSilhouetteColor() { getSilhouetteColor() {
@ -36,8 +45,24 @@ export class MetaMixerBuilding extends MetaBuilding {
* @returns {Array<[string, string]>} * @returns {Array<[string, string]>}
*/ */
getAdditionalStatistics(root, variant) { getAdditionalStatistics(root, variant) {
const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.mixer); switch (variant) {
return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]]; case defaultBuildingVariant: {
const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.mixer);
return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
}
case enumMixerVariants.incinerator: {
const speed = root.hubGoals.getProcessorBaseSpeed(enumItemProcessorTypes.dyeIncinerator);
return [[T.ingame.buildingPlacement.infoTexts.speed, formatItemsPerSecond(speed)]];
}
}
}
getAvailableVariants(root) {
let variants = [defaultBuildingVariant];
if (root.hubGoals.isRewardUnlocked(enumHubGoalRewards.reward_dye_incinerator)) {
variants.push(enumMixerVariants.incinerator);
}
return variants;
} }
/** /**
@ -51,12 +76,7 @@ export class MetaMixerBuilding extends MetaBuilding {
processorType: enumItemProcessorTypes.mixer, processorType: enumItemProcessorTypes.mixer,
}) })
); );
entity.addComponent(new ItemEjectorComponent({}));
entity.addComponent(
new ItemEjectorComponent({
slots: [{ pos: new Vector(0, 0), direction: enumDirection.top }],
})
);
entity.addComponent( entity.addComponent(
new ItemAcceptorComponent({ new ItemAcceptorComponent({
slots: [ slots: [
@ -74,4 +94,39 @@ export class MetaMixerBuilding extends MetaBuilding {
}) })
); );
} }
/**
*
* @param {Entity} entity
* @param {number} rotationVariant
* @param {string} variant
*/
updateVariants(entity, rotationVariant, variant) {
switch (variant) {
case defaultBuildingVariant: {
entity.components.ItemEjector.setSlots([
{ pos: new Vector(0, 0), direction: enumDirection.top },
]);
break;
}
case enumMixerVariants.incinerator: {
entity.components.ItemProcessor.type = enumItemProcessorTypes.dyeIncinerator;
entity.components.ItemProcessor.inputsPerCharge = 1;
entity.components.ItemAcceptor.setSlots([
{
pos: new Vector(0, 0),
directions: [enumDirection.left],
filter: enumItemAcceptorItemFilter.color,
},
]);
entity.components.ItemEjector.setSlots([
{ pos: new Vector(1, 0), direction: enumDirection.right },
]);
break;
}
default: {
assertAlways(false, "Unknown mixer variant: " + variant);
}
}
}
} }

View File

@ -14,6 +14,7 @@ export const enumItemProcessorTypes = {
stacker: "stacker", stacker: "stacker",
trash: "trash", trash: "trash",
mixer: "mixer", mixer: "mixer",
dyeIncinerator: "dyeIncinerator",
painter: "painter", painter: "painter",
painterDouble: "painterDouble", painterDouble: "painterDouble",
painterQuad: "painterQuad", painterQuad: "painterQuad",

View File

@ -395,6 +395,7 @@ export class HubGoals extends BasicSerializableObject {
return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt * 2; return globalConfig.beltSpeedItemsPerSecond * this.upgradeImprovements.belt * 2;
case enumItemProcessorTypes.mixer: case enumItemProcessorTypes.mixer:
case enumItemProcessorTypes.dyeIncinerator:
case enumItemProcessorTypes.painter: case enumItemProcessorTypes.painter:
case enumItemProcessorTypes.painterDouble: case enumItemProcessorTypes.painterDouble:
case enumItemProcessorTypes.painterQuad: { case enumItemProcessorTypes.painterQuad: {

View File

@ -240,6 +240,16 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
break; break;
} }
// DYE INCINERATOR
case enumItemProcessorTypes.dyeIncinerator: {
outItems.push({
item: new ColorItem("uncolored"),
});
break;
}
// PAINTER // PAINTER
case enumItemProcessorTypes.painter: { case enumItemProcessorTypes.painter: {

View File

@ -22,6 +22,7 @@ export const enumHubGoalRewards = {
reward_painter_double: "reward_painter_double", reward_painter_double: "reward_painter_double",
reward_painter_quad: "reward_painter_quad", reward_painter_quad: "reward_painter_quad",
reward_storage: "reward_storage", reward_storage: "reward_storage",
reward_dye_incinerator: "reward_dye_incinerator",
reward_blueprints: "reward_blueprints", reward_blueprints: "reward_blueprints",
reward_freeplay: "reward_freeplay", reward_freeplay: "reward_freeplay",
@ -160,6 +161,13 @@ export const tutorialGoals = [
}, },
// 18 // 18
{
shape: "WpWpWpWp:CwCwCwCw:WpWpWpWp:CwCwCwCw", // painting t4 (two variants)
required: 150000,
reward: enumHubGoalRewards.reward_dye_incinerator,
},
// 19
{ {
shape: finalGameShape, shape: finalGameShape,
required: 250000, required: 250000,

View File

@ -2,7 +2,7 @@ import { MetaBuilding, defaultBuildingVariant } from "./meta_building";
import { MetaCutterBuilding, enumCutterVariants } from "./buildings/cutter"; import { MetaCutterBuilding, enumCutterVariants } from "./buildings/cutter";
import { MetaRotaterBuilding, enumRotaterVariants } from "./buildings/rotater"; import { MetaRotaterBuilding, enumRotaterVariants } from "./buildings/rotater";
import { MetaPainterBuilding, enumPainterVariants } from "./buildings/painter"; import { MetaPainterBuilding, enumPainterVariants } from "./buildings/painter";
import { MetaMixerBuilding } from "./buildings/mixer"; import { MetaMixerBuilding, enumMixerVariants } from "./buildings/mixer";
import { MetaStackerBuilding } from "./buildings/stacker"; import { MetaStackerBuilding } from "./buildings/stacker";
import { MetaSplitterBuilding, enumSplitterVariants } from "./buildings/splitter"; import { MetaSplitterBuilding, enumSplitterVariants } from "./buildings/splitter";
import { MetaUndergroundBeltBuilding, enumUndergroundBeltVariants } from "./buildings/underground_belt"; import { MetaUndergroundBeltBuilding, enumUndergroundBeltVariants } from "./buildings/underground_belt";
@ -44,6 +44,7 @@ export const enumHubGoalRewardsToContentUnlocked = {
[enumHubGoalRewards.reward_painter_double]: typed([[MetaPainterBuilding, enumPainterVariants.double]]), [enumHubGoalRewards.reward_painter_double]: typed([[MetaPainterBuilding, enumPainterVariants.double]]),
[enumHubGoalRewards.reward_painter_quad]: typed([[MetaPainterBuilding, enumPainterVariants.quad]]), [enumHubGoalRewards.reward_painter_quad]: typed([[MetaPainterBuilding, enumPainterVariants.quad]]),
[enumHubGoalRewards.reward_storage]: typed([[MetaTrashBuilding, enumTrashVariants.storage]]), [enumHubGoalRewards.reward_storage]: typed([[MetaTrashBuilding, enumTrashVariants.storage]]),
[enumHubGoalRewards.reward_dye_incinerator]: typed([[MetaMixerBuilding, enumMixerVariants.incinerator]]),
[enumHubGoalRewards.reward_freeplay]: null, [enumHubGoalRewards.reward_freeplay]: null,
[enumHubGoalRewards.no_reward]: null, [enumHubGoalRewards.no_reward]: null,

View File

@ -496,6 +496,9 @@ buildings:
default: default:
name: &mixer Color Mixer name: &mixer Color Mixer
description: Mixes two colors using additive blending. description: Mixes two colors using additive blending.
incinerator:
name: Dye Incinerator
description: Produce gray dye from any dye you put in.
painter: painter:
default: default:
@ -586,6 +589,10 @@ storyRewards:
title: Storage Buffer title: Storage Buffer
desc: You have unlocked a variant of the <strong>trash</strong> - It allows to store items up to a given capacity! desc: You have unlocked a variant of the <strong>trash</strong> - It allows to store items up to a given capacity!
reward_dye_incinerator:
title: Dye Incinerator
desc: You have unlocked a variant of the <strong>mixer</strong> - It allows you to make gray dye by inputting any dye you have. Very useful with the <strong>quad painter</strong>!
reward_freeplay: reward_freeplay:
title: Freeplay title: Freeplay
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!) desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)