diff --git a/js/tileset.js b/js/tileset.js index 99ed41e..d2f57a8 100644 --- a/js/tileset.js +++ b/js/tileset.js @@ -1522,7 +1522,6 @@ export const LL_TILESET_LAYOUT = { }, }, button_black: { - __special__: 'wires', __special__: 'wires', base: [0, 2], wired: { @@ -2253,14 +2252,15 @@ export class Tileset { _draw_wires(drawspec, name, tile, packet) { // This /should/ match CC2's draw order exactly, based on experimentation - let wire_radius = this.layout['#wire-width'] / 2; // TODO circuit block with a lightning bolt is always powered // TODO circuit block in motion doesn't inherit cell's power if (tile && tile.wire_directions && ! packet.hide_logic) { // Draw the base tile packet.blit(drawspec.base[0], drawspec.base[1]); - let is_crossed = (tile.wire_directions === 0x0f && drawspec.wired_cross); + let mode = tile.wire_propagation_mode || TILE_TYPES[name].wire_propagation_mode; + let is_crossed = ( + tile.wire_directions === 0x0f && drawspec.wired_cross && mode === 'cross'); if (is_crossed && tile.powered_edges && tile.powered_edges !== 0x0f) { // For crossed wires with different power, order matters; horizontal is on top // TODO note that this enforces the CC2 wire order @@ -2275,6 +2275,14 @@ export class Tileset { } // Then draw the wired tile on top of it all this.draw_drawspec(is_crossed ? drawspec.wired_cross : drawspec.wired, name, tile, packet); + + if (drawspec.wired_cross && mode === 'none') { + // Extremely weird case: this tile was /designed/ to be drawn crossed, but something + // has happened and it doesn't propagate current at all. (This is usually because + // e.g. a red teleporter was destroyed, leaving floor in a weird mode.) + // Show the wires are disconnected by drawing a chunk of the base tile in the center + packet.blit(drawspec.base[0], drawspec.base[1], 0.375, 0.375, 0.25, 0.25); + } } else { // There's no wiring here, so just draw the base and then draw the wired part on top diff --git a/js/tiletypes.js b/js/tiletypes.js index 3158d40..8dbcd61 100644 --- a/js/tiletypes.js +++ b/js/tiletypes.js @@ -251,6 +251,7 @@ const TILE_TYPES = { floor: { layer: LAYERS.terrain, contains_wire: true, + wire_propagation_mode: 'cross', on_approach(me, level, other) { if (other.type.name === 'blob' || other.type.name === 'boulder') { // Blobs spread slime onto floor @@ -473,6 +474,7 @@ const TILE_TYPES = { layer: LAYERS.terrain, blocks_collision: COLLISION.all, contains_wire: true, + wire_propagation_mode: 'cross', }, canopy: { layer: LAYERS.canopy, @@ -2406,6 +2408,7 @@ const TILE_TYPES = { is_actor: true, is_block: true, contains_wire: true, + wire_propagation_mode: 'cross', can_reverse_on_railroad: true, movement_speed: 4, on_clone(me, original) { @@ -2831,6 +2834,16 @@ const TILE_TYPES = { removed_anything = true; } else { + // Super duper weird special case: both CC2 and LL precompute the wiring + // layout, and as a fun side effect, a destroyed blue teleporter becomes + // a floor tile that can genuinely conduct in all four directions. + // (The red teleporter, similarly, inhibits current.) + // This doesn't require any real logic changes, but for readability, + // inform the renderer. + if (terrain.type.wire_propagation_mode) { + level._set_tile_prop(terrain, 'wire_propagation_mode', + terrain.type.wire_propagation_mode); + } level.transmute_tile(terrain, 'floor'); removed_anything = true; }