Fix bad rendering of item acceptors / ejector hints

This commit is contained in:
tobspr 2020-07-05 17:11:03 +02:00
parent 34ef26b289
commit ca8745b1c0
1 changed files with 55 additions and 20 deletions

View File

@ -1,8 +1,9 @@
import { ClickDetector } from "../../../core/click_detector";
import { globalConfig } from "../../../core/config"; import { globalConfig } from "../../../core/config";
import { DrawParameters } from "../../../core/draw_parameters"; import { DrawParameters } from "../../../core/draw_parameters";
import { drawRotatedSprite } from "../../../core/draw_utils"; import { drawRotatedSprite } from "../../../core/draw_utils";
import { Loader } from "../../../core/loader"; import { Loader } from "../../../core/loader";
import { makeDiv, removeAllChildren, pulseAnimation, clamp } from "../../../core/utils"; import { clamp, makeDiv, removeAllChildren } from "../../../core/utils";
import { import {
enumDirectionToAngle, enumDirectionToAngle,
enumDirectionToVector, enumDirectionToVector,
@ -15,7 +16,6 @@ import { defaultBuildingVariant } from "../../meta_building";
import { THEME } from "../../theme"; import { THEME } from "../../theme";
import { DynamicDomAttach } from "../dynamic_dom_attach"; import { DynamicDomAttach } from "../dynamic_dom_attach";
import { HUDBuildingPlacerLogic } from "./building_placer_logic"; import { HUDBuildingPlacerLogic } from "./building_placer_logic";
import { ClickDetector } from "../../../core/click_detector";
export class HUDBuildingPlacer extends HUDBuildingPlacerLogic { export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
/** /**
@ -400,9 +400,15 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
for (let acceptorSlotIndex = 0; acceptorSlotIndex < slots.length; ++acceptorSlotIndex) { for (let acceptorSlotIndex = 0; acceptorSlotIndex < slots.length; ++acceptorSlotIndex) {
const slot = slots[acceptorSlotIndex]; const slot = slots[acceptorSlotIndex];
// Only draw same layer slots
if (slot.layer !== this.root.currentLayer) {
continue;
}
const acceptorSlotWsTile = staticComp.localTileToWorld(slot.pos); const acceptorSlotWsTile = staticComp.localTileToWorld(slot.pos);
const acceptorSlotWsPos = acceptorSlotWsTile.toWorldSpaceCenterOfTile(); const acceptorSlotWsPos = acceptorSlotWsTile.toWorldSpaceCenterOfTile();
// Go over all slots
for ( for (
let acceptorDirectionIndex = 0; let acceptorDirectionIndex = 0;
acceptorDirectionIndex < slot.directions.length; acceptorDirectionIndex < slot.directions.length;
@ -411,32 +417,47 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
const direction = slot.directions[acceptorDirectionIndex]; const direction = slot.directions[acceptorDirectionIndex];
const worldDirection = staticComp.localDirectionToWorld(direction); const worldDirection = staticComp.localDirectionToWorld(direction);
// Figure out which tile ejects to this slot
const sourceTile = acceptorSlotWsTile.add(enumDirectionToVector[worldDirection]); const sourceTile = acceptorSlotWsTile.add(enumDirectionToVector[worldDirection]);
let sprite = goodArrowSprite;
let alpha = 0.3;
let isBlocked = false;
let isConnected = false;
// Find all entities which are on that tile
const sourceEntities = this.root.map.getLayersContentsMultipleXY( const sourceEntities = this.root.map.getLayersContentsMultipleXY(
sourceTile.x, sourceTile.x,
sourceTile.y sourceTile.y
); );
// Check for every entity:
for (let i = 0; i < sourceEntities.length; ++i) { for (let i = 0; i < sourceEntities.length; ++i) {
const sourceEntity = sourceEntities[i]; const sourceEntity = sourceEntities[i];
sprite = badArrowSprite;
const sourceEjector = sourceEntity.components.ItemEjector; const sourceEjector = sourceEntity.components.ItemEjector;
const sourceStaticComp = sourceEntity.components.StaticMapEntity; const sourceStaticComp = sourceEntity.components.StaticMapEntity;
const ejectorAcceptLocalTile = sourceStaticComp.worldToLocalTile(acceptorSlotWsTile); const ejectorAcceptLocalTile = sourceStaticComp.worldToLocalTile(acceptorSlotWsTile);
if (
sourceEjector && // If this entity is on the same layer as the slot - if so, it can either be
sourceEjector.anySlotEjectsToLocalTile( // connected, or it can not be connected and thus block the input
ejectorAcceptLocalTile, if (sourceEntity.layer === slot.layer) {
this.root.currentLayer if (
) sourceEjector &&
) { sourceEjector.anySlotEjectsToLocalTile(
sprite = goodArrowSprite; ejectorAcceptLocalTile,
this.root.currentLayer
)
) {
// This one is connected, all good
isConnected = true;
} else {
// This one is blocked
isBlocked = true;
}
} }
alpha = 1.0;
} }
const alpha = isConnected || isBlocked ? 1.0 : 0.3;
const sprite = isBlocked ? badArrowSprite : goodArrowSprite;
parameters.context.globalAlpha = alpha; parameters.context.globalAlpha = alpha;
drawRotatedSprite({ drawRotatedSprite({
parameters, parameters,
@ -454,8 +475,12 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
if (ejectorComp) { if (ejectorComp) {
const slots = ejectorComp.slots; const slots = ejectorComp.slots;
// Go over all slots
for (let ejectorSlotIndex = 0; ejectorSlotIndex < slots.length; ++ejectorSlotIndex) { for (let ejectorSlotIndex = 0; ejectorSlotIndex < slots.length; ++ejectorSlotIndex) {
const slot = slots[ejectorSlotIndex]; const slot = slots[ejectorSlotIndex];
// Only draw same layer slots
if (slot.layer !== this.root.currentLayer) { if (slot.layer !== this.root.currentLayer) {
continue; continue;
} }
@ -466,32 +491,42 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
const ejectorSLotWsPos = ejectorSlotWsTile.toWorldSpaceCenterOfTile(); const ejectorSLotWsPos = ejectorSlotWsTile.toWorldSpaceCenterOfTile();
const ejectorSlotWsDirection = staticComp.localDirectionToWorld(slot.direction); const ejectorSlotWsDirection = staticComp.localDirectionToWorld(slot.direction);
let sprite = goodArrowSprite; let isBlocked = false;
let alpha = 0.3; let isConnected = false;
// Find all entities which are on that tile
const destEntities = this.root.map.getLayersContentsMultipleXY( const destEntities = this.root.map.getLayersContentsMultipleXY(
ejectorSlotWsTile.x, ejectorSlotWsTile.x,
ejectorSlotWsTile.y ejectorSlotWsTile.y
); );
// Check for every entity:
for (let i = 0; i < destEntities.length; ++i) { for (let i = 0; i < destEntities.length; ++i) {
alpha = 1;
const destEntity = destEntities[i]; const destEntity = destEntities[i];
const destAcceptor = destEntity.components.ItemAcceptor; const destAcceptor = destEntity.components.ItemAcceptor;
const destStaticComp = destEntity.components.StaticMapEntity; const destStaticComp = destEntity.components.StaticMapEntity;
if (destAcceptor) {
// If this entity is on the same layer as the slot - if so, it can either be
// connected, or it can not be connected and thus block the input
if (destEntity.layer === slot.layer) {
const destLocalTile = destStaticComp.worldToLocalTile(ejectorSlotWsTile); const destLocalTile = destStaticComp.worldToLocalTile(ejectorSlotWsTile);
const destLocalDir = destStaticComp.worldDirectionToLocal(ejectorSlotWsDirection); const destLocalDir = destStaticComp.worldDirectionToLocal(ejectorSlotWsDirection);
if ( if (
destAcceptor &&
destAcceptor.findMatchingSlot(destLocalTile, destLocalDir, this.root.currentLayer) destAcceptor.findMatchingSlot(destLocalTile, destLocalDir, this.root.currentLayer)
) { ) {
sprite = goodArrowSprite; // This one is connected, all good
isConnected = true;
} else { } else {
sprite = badArrowSprite; // This one is blocked
isBlocked = true;
} }
} }
} }
const alpha = isConnected || isBlocked ? 1.0 : 0.3;
const sprite = isBlocked ? badArrowSprite : goodArrowSprite;
parameters.context.globalAlpha = alpha; parameters.context.globalAlpha = alpha;
drawRotatedSprite({ drawRotatedSprite({
parameters, parameters,