1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-03-02 03:39:21 +00:00

Add OR gate and different colors of wire based on the value

This commit is contained in:
tobspr
2020-08-13 20:01:54 +02:00
parent 49da768b73
commit 984bea1921
35 changed files with 1592 additions and 814 deletions

View File

@@ -39,8 +39,14 @@ export class LeverSystem extends GameSystemWithFilter {
if (entity && entity.components.Lever) {
const sprite = entity.components.Lever.toggled ? this.spriteOn : this.spriteOff;
const staticComp = entity.components.StaticMapEntity;
staticComp.drawSpriteOnFullEntityBounds(parameters, sprite, 0);
const origin = entity.components.StaticMapEntity.origin;
sprite.drawCached(
parameters,
origin.x * globalConfig.tileSize,
origin.y * globalConfig.tileSize,
globalConfig.tileSize,
globalConfig.tileSize
);
}
}
}

View File

@@ -11,6 +11,8 @@ export class LogicGateSystem extends GameSystemWithFilter {
this.boundOperations = {
[enumLogicGateType.and]: this.compute_AND.bind(this),
[enumLogicGateType.not]: this.compute_NOT.bind(this),
[enumLogicGateType.xor]: this.compute_XOR.bind(this),
[enumLogicGateType.or]: this.compute_OR.bind(this),
};
}
@@ -95,4 +97,64 @@ export class LogicGateSystem extends GameSystemWithFilter {
const value = /** @type {BooleanItem} */ (item).value;
return value ? BOOL_FALSE_SINGLETON : BOOL_TRUE_SINGLETON;
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {BaseItem}
*/
compute_XOR(parameters) {
assert(parameters.length === 2, "bad parameter count for XOR");
const param1 = parameters[0];
const param2 = parameters[1];
if (!param1 || !param2) {
// Not enough params
return null;
}
const itemType = param1.getItemType();
if (itemType !== param2.getItemType()) {
// Differing type
return BOOL_FALSE_SINGLETON;
}
if (itemType === enumItemType.boolean) {
return /** @type {BooleanItem} */ (param1).value ^ /** @type {BooleanItem} */ (param2).value
? BOOL_TRUE_SINGLETON
: BOOL_FALSE_SINGLETON;
}
return BOOL_FALSE_SINGLETON;
}
/**
* @param {Array<BaseItem|null>} parameters
* @returns {BaseItem}
*/
compute_OR(parameters) {
assert(parameters.length === 2, "bad parameter count for OR");
const param1 = parameters[0];
const param2 = parameters[1];
if (!param1 || !param2) {
// Not enough params
return null;
}
const itemType = param1.getItemType();
if (itemType !== param2.getItemType()) {
// Differing type
return BOOL_FALSE_SINGLETON;
}
if (itemType === enumItemType.boolean) {
return /** @type {BooleanItem} */ (param1).value || /** @type {BooleanItem} */ (param2).value
? BOOL_TRUE_SINGLETON
: BOOL_FALSE_SINGLETON;
}
return BOOL_FALSE_SINGLETON;
}
}

View File

@@ -18,6 +18,7 @@ import { createLogger } from "../../core/logging";
import { WiredPinsComponent, enumPinSlotType } from "../components/wired_pins";
import { getCodeFromBuildingData } from "../building_codes";
import { BaseItem, enumItemType } from "../base_item";
import { BooleanItem } from "../items/boolean_item";
const logger = createLogger("wires");
@@ -75,10 +76,30 @@ export class WireSystem extends GameSystemWithFilter {
super(root, [WireComponent]);
this.wireSprites = {
[enumWireType.regular]: Loader.getSprite("sprites/buildings/wire.png"),
[enumWireType.turn]: Loader.getSprite("sprites/buildings/wire-turn.png"),
[enumWireType.split]: Loader.getSprite("sprites/buildings/wire-split.png"),
[enumWireType.cross]: Loader.getSprite("sprites/buildings/wire-cross.png"),
regular: {
[enumWireType.regular]: Loader.getSprite("sprites/buildings/wire.png"),
[enumWireType.turn]: Loader.getSprite("sprites/buildings/wire-turn.png"),
[enumWireType.split]: Loader.getSprite("sprites/buildings/wire-split.png"),
[enumWireType.cross]: Loader.getSprite("sprites/buildings/wire-cross.png"),
},
conflict: {
[enumWireType.regular]: Loader.getSprite("sprites/wires/sets/conflict.png"),
[enumWireType.turn]: Loader.getSprite("sprites/wires/sets/conflict-turn.png"),
[enumWireType.split]: Loader.getSprite("sprites/wires/sets/conflict-split.png"),
[enumWireType.cross]: Loader.getSprite("sprites/wires/sets/conflict-cross.png"),
},
shape: {
[enumWireType.regular]: Loader.getSprite("sprites/wires/sets/shape.png"),
[enumWireType.turn]: Loader.getSprite("sprites/wires/sets/shape-turn.png"),
[enumWireType.split]: Loader.getSprite("sprites/wires/sets/shape-split.png"),
[enumWireType.cross]: Loader.getSprite("sprites/wires/sets/shape-cross.png"),
},
color: {
[enumWireType.regular]: Loader.getSprite("sprites/wires/sets/color.png"),
[enumWireType.turn]: Loader.getSprite("sprites/wires/sets/color-turn.png"),
[enumWireType.split]: Loader.getSprite("sprites/wires/sets/color-split.png"),
[enumWireType.cross]: Loader.getSprite("sprites/wires/sets/color-cross.png"),
},
};
this.root.signals.entityDestroyed.add(this.updateSurroundingWirePlacement, this);
@@ -406,6 +427,64 @@ export class WireSystem extends GameSystemWithFilter {
}
}
/**
* Returns the given tileset and opacity
* @param {WireComponent} wireComp
* @returns {{ spriteSet: Object<enumWireType, import("../../core/draw_utils").AtlasSprite>, opacity: number}}
*/
getSpriteSetAndOpacityForWire(wireComp) {
if (!wireComp.linkedNetwork) {
// There is no network, it's empty
return {
spriteSet: this.wireSprites.regular,
opacity: 0.3,
};
}
const network = wireComp.linkedNetwork;
if (network.valueConflict) {
// There is a conflict
return {
spriteSet: this.wireSprites.conflict,
opacity: 1,
};
}
const value = network.currentValue;
if (!value) {
// There is no value stored
return {
spriteSet: this.wireSprites.regular,
opacity: 0.3,
};
}
const valueType = value.getItemType();
if (valueType === enumItemType.shape) {
return {
spriteSet: this.wireSprites.shape,
opacity: 1,
};
} else if (valueType === enumItemType.color) {
return {
spriteSet: this.wireSprites.color,
opacity: 1,
};
} else if (valueType === enumItemType.boolean) {
return {
spriteSet: this.wireSprites.regular,
opacity: /** @type {BooleanItem} */ (value).value ? 1 : 0.5,
};
} else {
assertAlways(false, "Unknown item type: " + valueType);
}
return {
spriteSet: this.wireSprites.regular,
opacity: 1,
};
}
/**
* Draws a given chunk
* @param {import("../../core/draw_utils").DrawParameters} parameters
@@ -421,31 +500,30 @@ export class WireSystem extends GameSystemWithFilter {
const wireType = wireComp.type;
const network = wireComp.linkedNetwork;
let opacity = 1;
let spriteSet = this.wireSprites;
const { opacity, spriteSet } = this.getSpriteSetAndOpacityForWire(wireComp);
if (!network) {
opacity = 0.3;
} else {
if (network.valueConflict) {
opacity = 1;
// TODO
} else {
if (network.currentValue) {
if (
network.currentValue.getItemType() === enumItemType.boolean &&
// @ts-ignore
network.currentValue.value === 0
) {
opacity = 0.5;
} else {
opacity = 1;
}
} else {
opacity = 0.5;
}
}
}
// if (!network) {
// opacity = 0.3;
// } else {
// if (network.valueConflict) {
// opacity = 1;
// // TODO
// } else {
// if (network.currentValue) {
// if (
// network.currentValue.getItemType() === enumItemType.boolean &&
// // @ts-ignore
// network.currentValue.value === 0
// ) {
// opacity = 0.5;
// } else {
// opacity = 1;
// }
// } else {
// opacity = 0.5;
// }
// }
// }
const sprite = spriteSet[wireType];