| 1 | // SuperTux |
| 2 | // Copyright (C) 2006 Matthias Braun <matze@braunis.de> |
| 3 | // |
| 4 | // This program is free software: you can redistribute it and/or modify |
| 5 | // it under the terms of the GNU General Public License as published by |
| 6 | // the Free Software Foundation, either version 3 of the License, or |
| 7 | // (at your option) any later version. |
| 8 | // |
| 9 | // This program is distributed in the hope that it will be useful, |
| 10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 | // GNU General Public License for more details. |
| 13 | // |
| 14 | // You should have received a copy of the GNU General Public License |
| 15 | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 16 | |
| 17 | #include "supertux/flip_level_transformer.hpp" |
| 18 | |
| 19 | #include "badguy/badguy.hpp" |
| 20 | #include "object/block.hpp" |
| 21 | #include "object/camera.hpp" |
| 22 | #include "object/flower.hpp" |
| 23 | #include "object/platform.hpp" |
| 24 | #include "object/player.hpp" |
| 25 | #include "object/tilemap.hpp" |
| 26 | #include "supertux/sector.hpp" |
| 27 | |
| 28 | void |
| 29 | FlipLevelTransformer::transform_sector(Sector& sector) |
| 30 | { |
| 31 | float height = sector.get_height(); |
| 32 | |
| 33 | for (auto& object : sector.get_objects()) { |
| 34 | auto tilemap = dynamic_cast<TileMap*>(object.get()); |
| 35 | if (tilemap) { |
| 36 | transform_tilemap(height, *tilemap); |
| 37 | } |
| 38 | auto player = dynamic_cast<Player*>(object.get()); |
| 39 | if (player) { |
| 40 | Vector pos = player->get_pos(); |
| 41 | pos.y = height - pos.y - player->get_bbox().get_height(); |
| 42 | player->move(pos); |
| 43 | continue; |
| 44 | } |
| 45 | auto badguy = dynamic_cast<BadGuy*>(object.get()); |
| 46 | if (badguy) { |
| 47 | transform_badguy(height, *badguy); |
| 48 | } |
| 49 | auto flower = dynamic_cast<Flower*>(object.get()); |
| 50 | if (flower) { |
| 51 | transform_flower(*flower); |
| 52 | } |
| 53 | auto platform = dynamic_cast<Platform*>(object.get()); |
| 54 | if (platform) { |
| 55 | transform_platform(height, *platform); |
| 56 | } |
| 57 | auto block = dynamic_cast<Block*>(object.get()); |
| 58 | if (block) { |
| 59 | transform_block(height, *block); |
| 60 | } |
| 61 | auto mobject = dynamic_cast<MovingObject*>(object.get()); |
| 62 | if (mobject) { |
| 63 | transform_moving_object(height, *mobject); |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | sector.get_camera().reset(sector.get_player().get_pos()); |
| 68 | } |
| 69 | |
| 70 | Flip |
| 71 | FlipLevelTransformer::transform_flip(Flip flip) |
| 72 | { |
| 73 | if (flip & VERTICAL_FLIP) { |
| 74 | return flip & ~VERTICAL_FLIP; |
| 75 | } else { |
| 76 | return flip | VERTICAL_FLIP; |
| 77 | } |
| 78 | } |
| 79 | |
| 80 | void |
| 81 | FlipLevelTransformer::transform_path(float height, float obj_height, Path& path) |
| 82 | { |
| 83 | for (auto& node : path.m_nodes) { |
| 84 | Vector& pos = node.position; |
| 85 | pos.y = height - pos.y - obj_height; |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | void |
| 90 | FlipLevelTransformer::transform_tilemap(float height, TileMap& tilemap) |
| 91 | { |
| 92 | for (int x = 0; x < tilemap.get_width(); ++x) { |
| 93 | for (int y = 0; y < tilemap.get_height()/2; ++y) { |
| 94 | // swap tiles |
| 95 | int y2 = tilemap.get_height()-1-y; |
| 96 | uint32_t t1 = tilemap.get_tile_id(x, y); |
| 97 | uint32_t t2 = tilemap.get_tile_id(x, y2); |
| 98 | tilemap.change(x, y, t2); |
| 99 | tilemap.change(x, y2, t1); |
| 100 | } |
| 101 | } |
| 102 | tilemap.set_flip(transform_flip(tilemap.get_flip())); |
| 103 | Vector offset = tilemap.get_offset(); |
| 104 | offset.y = height - offset.y - tilemap.get_bbox().get_height(); |
| 105 | tilemap.set_offset(offset); |
| 106 | auto path = tilemap.get_path(); |
| 107 | if (path) |
| 108 | transform_path(height, tilemap.get_bbox().get_height(), *path); |
| 109 | } |
| 110 | |
| 111 | void |
| 112 | FlipLevelTransformer::transform_badguy(float height, BadGuy& badguy) |
| 113 | { |
| 114 | Vector pos = badguy.get_start_position(); |
| 115 | pos.y = height - pos.y; |
| 116 | badguy.set_start_position(pos); |
| 117 | } |
| 118 | |
| 119 | void |
| 120 | FlipLevelTransformer::transform_moving_object(float height, MovingObject& object) |
| 121 | { |
| 122 | Vector pos = object.get_pos(); |
| 123 | pos.y = height - pos.y - object.get_bbox().get_height(); |
| 124 | object.set_pos(pos); |
| 125 | } |
| 126 | |
| 127 | void |
| 128 | FlipLevelTransformer::transform_flower(Flower& flower) |
| 129 | { |
| 130 | flower.flip = transform_flip(flower.flip); |
| 131 | } |
| 132 | |
| 133 | void |
| 134 | FlipLevelTransformer::transform_platform(float height, Platform& platform) |
| 135 | { |
| 136 | transform_path(height, platform.get_bbox().get_height(), *(platform.get_path())); |
| 137 | } |
| 138 | |
| 139 | void |
| 140 | FlipLevelTransformer::transform_block(float height, Block& block) |
| 141 | { |
| 142 | if (block.m_original_y != -1) block.m_original_y = height - block.m_original_y - block.get_bbox().get_height(); |
| 143 | } |
| 144 | |
| 145 | /* EOF */ |
| 146 | |