diff --git a/js/format-c2g.js b/js/format-c2g.js index 37741b8..752308d 100644 --- a/js/format-c2g.js +++ b/js/format-c2g.js @@ -894,6 +894,10 @@ const TILE_ENCODING = { name: 'sand', is_extension: true, }, + 0xe8: { + name: 'grass', + is_extension: true, + }, 0xed: { name: 'ankh', has_next: true, diff --git a/js/tileset.js b/js/tileset.js index 1e4d41a..0fa510b 100644 --- a/js/tileset.js +++ b/js/tileset.js @@ -1161,6 +1161,7 @@ export const LL_TILESET_LAYOUT = { open: [1, 7], }, cracked_floor: [2, 6], + grass: [2, 7], thin_walls: { __special__: 'thin_walls', diff --git a/js/tiletypes.js b/js/tiletypes.js index 3514807..e35ad8f 100644 --- a/js/tiletypes.js +++ b/js/tiletypes.js @@ -6,7 +6,7 @@ function activate_me(me, level) { me.type.activate(me, level); } -function blocks_leaving_thin_walls(me, actor, direction) { +function blocks_leaving_thin_walls(me, level, actor, direction) { return me.type.thin_walls.has(direction) && actor.type.name !== 'ghost'; } @@ -384,7 +384,7 @@ const TILE_TYPES = { return false; return (me.edges & DIRECTIONS[direction].opposite_bit) !== 0; }, - blocks_leaving(me, actor, direction) { + blocks_leaving(me, level, actor, direction) { if (actor.type.name === 'ghost') return false; return (me.edges & DIRECTIONS[direction].bit) !== 0; @@ -397,7 +397,7 @@ const TILE_TYPES = { // stop something from leaving one_way_walls: { layer: LAYERS.thin_wall, - blocks_leaving(me, actor, direction) { + blocks_leaving(me, level, actor, direction) { if (actor.type.name === 'ghost') return false; return (me.edges & DIRECTIONS[direction].bit) !== 0; @@ -625,7 +625,7 @@ const TILE_TYPES = { return me.type._is_affected(me, other) && ! me.type.has_opening(me, DIRECTIONS[direction].opposite); }, - blocks_leaving(me, other, direction) { + blocks_leaving(me, level, other, direction) { // FIXME needs the same logic as redirect_exit, so that an illegal entrance can't leave // at all return me.type._is_affected(me, other) && ! me.type.has_opening(me, direction); @@ -730,6 +730,30 @@ const TILE_TYPES = { blocks_collision: COLLISION.block_cc1 | COLLISION.block_cc2, speed_factor: 0.5, }, + grass: { + layer: LAYERS.terrain, + blocks_collision: COLLISION.block_cc1 | COLLISION.block_cc2, + blocks(me, level, other) { + // These guys with big wheels can't do grass + return ( + other.type.name === 'tank_blue' || other.type.name === 'tank_yellow' || + other.type.name === 'rover'); + }, + blocks_leaving(me, level, other, direction) { + // Both kinds of bugs prefer to stay in the grass + if (other.type.name === 'bug' || other.type.name === 'paramecium') { + let neighbor = level.get_neighboring_cell(me.cell, direction); + if (neighbor && neighbor.get_terrain().type.name !== 'grass') + return true; + } + }, + on_arrive(me, level, other) { + if (other.type.name === 'fireball') { + level.transmute_tile(me, 'fire'); + level.spawn_animation(me.cell, 'puff'); + } + }, + }, dash_floor: { layer: LAYERS.terrain, speed_factor: 2, diff --git a/tileset-lexy.png b/tileset-lexy.png index 9d4947b..093bd9b 100644 Binary files a/tileset-lexy.png and b/tileset-lexy.png differ diff --git a/tileset-src/tileset-lexy.aseprite b/tileset-src/tileset-lexy.aseprite index b13112f..8ce2328 100644 Binary files a/tileset-src/tileset-lexy.aseprite and b/tileset-src/tileset-lexy.aseprite differ