implement the Terraformer
The Terraformer is like a clone machine for everything that isn't an actor. It copies the terrain (and item) behind it to in front of it when powered.
This commit is contained in:
parent
da18684cbb
commit
9b76c6b9ce
@ -1598,6 +1598,8 @@ const EDITOR_PALETTE = [{
|
|||||||
'gate_yellow',
|
'gate_yellow',
|
||||||
'gate_green',
|
'gate_green',
|
||||||
'sand',
|
'sand',
|
||||||
|
'terraformer_n',
|
||||||
|
'global_cycler',
|
||||||
],
|
],
|
||||||
}];
|
}];
|
||||||
|
|
||||||
@ -2171,7 +2173,15 @@ const EDITOR_TILE_DESCRIPTIONS = {
|
|||||||
sand: {
|
sand: {
|
||||||
name: "Sand",
|
name: "Sand",
|
||||||
desc: "Anything walking on it moves at half speed. Stops all blocks.",
|
desc: "Anything walking on it moves at half speed. Stops all blocks.",
|
||||||
}
|
},
|
||||||
|
terraformer_n: {
|
||||||
|
name: "Terraformer",
|
||||||
|
desc: "When activated, copies the terrain and item behind it to the tile in front of it.",
|
||||||
|
},
|
||||||
|
global_cycler: {
|
||||||
|
name: "Global Cycler",
|
||||||
|
desc: "When activated, every terrain/item on the surrounding four tiles in the entire level becomes the terrain/item one clockwise.",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const SPECIAL_PALETTE_ENTRIES = {
|
const SPECIAL_PALETTE_ENTRIES = {
|
||||||
@ -2418,6 +2428,7 @@ for (let cycle of [
|
|||||||
['force_floor_n', 'force_floor_e', 'force_floor_s', 'force_floor_w'],
|
['force_floor_n', 'force_floor_e', 'force_floor_s', 'force_floor_w'],
|
||||||
['ice_nw', 'ice_ne', 'ice_se', 'ice_sw'],
|
['ice_nw', 'ice_ne', 'ice_se', 'ice_sw'],
|
||||||
['swivel_nw', 'swivel_ne', 'swivel_se', 'swivel_sw'],
|
['swivel_nw', 'swivel_ne', 'swivel_se', 'swivel_sw'],
|
||||||
|
['terraformer_n', 'terraformer_e', 'terraformer_s', 'terraformer_w'],
|
||||||
]) {
|
]) {
|
||||||
for (let [i, name] of cycle.entries()) {
|
for (let [i, name] of cycle.entries()) {
|
||||||
let left = cycle[(i - 1 + cycle.length) % cycle.length];
|
let left = cycle[(i - 1 + cycle.length) % cycle.length];
|
||||||
|
|||||||
@ -1031,6 +1031,12 @@ export const LL_TILESET_LAYOUT = Object.assign({}, CC2_TILESET_LAYOUT, {
|
|||||||
skeleton_key: [4, 40],
|
skeleton_key: [4, 40],
|
||||||
|
|
||||||
sand: [10, 41],
|
sand: [10, 41],
|
||||||
|
terraformer_n: [0, 43],
|
||||||
|
terraformer_e: [1, 43],
|
||||||
|
terraformer_s: [2, 43],
|
||||||
|
terraformer_w: [3, 43],
|
||||||
|
global_cycler: [4, 43],
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const TILESET_LAYOUTS = {
|
export const TILESET_LAYOUTS = {
|
||||||
|
|||||||
117
js/tiletypes.js
117
js/tiletypes.js
@ -89,6 +89,67 @@ function _define_gate(key) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function activate_terraformer(me, level, dx, dy) {
|
||||||
|
let did_something = false;
|
||||||
|
let old_cell = level.cell(
|
||||||
|
(me.cell.x - dx + level.width) % level.width,
|
||||||
|
(me.cell.y - dy + level.height) % level.height);
|
||||||
|
let new_cell = level.cell(
|
||||||
|
(me.cell.x + dx + level.width) % level.width,
|
||||||
|
(me.cell.y + dy + level.height) % level.height);
|
||||||
|
let old_terrain = old_cell.get_terrain();
|
||||||
|
let new_terrain = new_cell.get_terrain();
|
||||||
|
if (old_terrain.type.name != new_terrain.type.name)
|
||||||
|
{
|
||||||
|
level.transmute_tile(new_cell.get_terrain(), old_terrain.type.name);
|
||||||
|
did_something = true;
|
||||||
|
}
|
||||||
|
let old_item = old_cell.get_item();
|
||||||
|
if (old_item != null)
|
||||||
|
{
|
||||||
|
let new_item = new_cell.get_item();
|
||||||
|
if (new_item != null)
|
||||||
|
{
|
||||||
|
if (old_item.type.name != new_item.type.name)
|
||||||
|
{
|
||||||
|
level.transmute_tile(new_item, old_item.type.name)
|
||||||
|
did_something = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let type = TILE_TYPES[old_item.type.name];
|
||||||
|
let tile = new old_item.constructor(type);
|
||||||
|
level.add_tile(tile, new_cell);
|
||||||
|
did_something = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let old_item_mod = old_cell.get_item_mod();
|
||||||
|
if (old_item_mod != null)
|
||||||
|
{
|
||||||
|
let new_item_mod = new_cell.get_item_mod();
|
||||||
|
if (new_item_mod != null)
|
||||||
|
{
|
||||||
|
if (old_item_mod.type.name != new_item_mod.type.name)
|
||||||
|
{
|
||||||
|
level.transmute_tile(new_item_mod, old_item_mod.type.name)
|
||||||
|
did_something = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let type = TILE_TYPES[old_item_mod.type.name];
|
||||||
|
let tile = new old_item_mod.constructor(type);
|
||||||
|
level.add_tile(tile, new_cell);
|
||||||
|
did_something = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (did_something)
|
||||||
|
{
|
||||||
|
level.spawn_animation(new_cell, 'transmogrify_flash');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function player_visual_state(me) {
|
function player_visual_state(me) {
|
||||||
if (! me) {
|
if (! me) {
|
||||||
return 'normal';
|
return 'normal';
|
||||||
@ -1511,6 +1572,62 @@ const TILE_TYPES = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
terraformer_n: {
|
||||||
|
layer: LAYERS.terrain,
|
||||||
|
blocks_collision: COLLISION.real_player | COLLISION.block_cc1 | COLLISION.monster_solid,
|
||||||
|
activate(me, level) {
|
||||||
|
activate_terraformer(me, level, 0, -1);
|
||||||
|
},
|
||||||
|
// Also terraforms on rising pulse or gray button
|
||||||
|
on_power(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
on_gray_button(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
terraformer_e: {
|
||||||
|
layer: LAYERS.terrain,
|
||||||
|
blocks_collision: COLLISION.real_player | COLLISION.block_cc1 | COLLISION.monster_solid,
|
||||||
|
activate(me, level) {
|
||||||
|
activate_terraformer(me, level, 1, 0);
|
||||||
|
},
|
||||||
|
// Also terraforms on rising pulse or gray button
|
||||||
|
on_power(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
on_gray_button(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
terraformer_s: {
|
||||||
|
layer: LAYERS.terrain,
|
||||||
|
blocks_collision: COLLISION.real_player | COLLISION.block_cc1 | COLLISION.monster_solid,
|
||||||
|
activate(me, level) {
|
||||||
|
activate_terraformer(me, level, 0, 1);
|
||||||
|
},
|
||||||
|
// Also terraforms on rising pulse or gray button
|
||||||
|
on_power(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
on_gray_button(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
terraformer_w: {
|
||||||
|
layer: LAYERS.terrain,
|
||||||
|
blocks_collision: COLLISION.real_player | COLLISION.block_cc1 | COLLISION.monster_solid,
|
||||||
|
activate(me, level) {
|
||||||
|
activate_terraformer(me, level, -1, 0);
|
||||||
|
},
|
||||||
|
// Also terraforms on rising pulse or gray button
|
||||||
|
on_power(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
on_gray_button(me, level) {
|
||||||
|
me.type.activate(me, level);
|
||||||
|
},
|
||||||
|
},
|
||||||
// Buttons
|
// Buttons
|
||||||
button_blue: {
|
button_blue: {
|
||||||
layer: LAYERS.terrain,
|
layer: LAYERS.terrain,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user