added a bell object which is a new better way to do reset points
[supertux.git] / src / flip_level_transformer.cpp
1 #include <config.h>
2
3 #include "flip_level_transformer.h"
4 #include "object/tilemap.h"
5 #include "badguy/badguy.h"
6 #include "sector.h"
7 #include "tile_manager.h"
8
9 void
10 FlipLevelTransformer::transform_sector(Sector* sector)
11 {
12   float height = sector->solids->get_height() 
13     * sector->solids->get_tilemanager()->get_default_height();
14   
15   for(Sector::GameObjects::iterator i = sector->gameobjects.begin();
16       i != sector->gameobjects.end(); ++i) {
17     GameObject* object = *i;
18
19     TileMap* tilemap = dynamic_cast<TileMap*> (object);
20     if(tilemap) {
21       transform_tilemap(tilemap);
22     }
23     BadGuy* badguy = dynamic_cast<BadGuy*> (object);
24     if(badguy) {
25       transform_badguy(height, badguy);
26     } else {
27       MovingObject* mobject = dynamic_cast<MovingObject*> (object);
28       if(mobject) {
29         transform_moving_object(height, mobject);
30       }
31     }
32   }
33   for(Sector::SpawnPoints::iterator i = sector->spawnpoints.begin();
34       i != sector->spawnpoints.end(); ++i) {
35     transform_spawnpoint(height, *i);
36   }
37 }
38
39 void
40 FlipLevelTransformer::transform_tilemap(TileMap* tilemap)
41 {
42   for(size_t x = 0; x < tilemap->get_width(); ++x) {
43     for(size_t y = 0; y < tilemap->get_height()/2; ++y) {
44       // swap tiles
45       int y2 = tilemap->get_height()-1-y;
46       const Tile* t1 = tilemap->get_tile(x, y);
47       const Tile* t2 = tilemap->get_tile(x, y2);
48       tilemap->change(x, y, t2->getID());
49       tilemap->change(x, y2, t1->getID());
50     }
51   }
52   tilemap->set_drawing_effect(VERTICAL_FLIP);
53 }
54
55 void
56 FlipLevelTransformer::transform_badguy(float height, BadGuy* badguy)
57 {
58   Vector pos = badguy->get_start_position();
59   pos.y = height - pos.y;
60   badguy->set_start_position(pos);
61 }
62
63 void
64 FlipLevelTransformer::transform_spawnpoint(float height, SpawnPoint* spawn)
65 {
66   Vector pos = spawn->pos;
67   pos.y = height - pos.y;
68   spawn->pos = pos;
69 }
70
71 void
72 FlipLevelTransformer::transform_moving_object(float height, MovingObject*object)
73 {
74   Vector pos = object->get_pos();
75   pos.y = height - pos.y;
76   object->set_pos(pos);
77 }
78