Cleaned up includes.
[sdlbotor.git] / Player.cpp
blob3bc981df9ae36fbf139a839238ec49eac67c1bfc
1 #include "globalfunc.h"
3 #include "Player.h"
4 #include "Game.h"
5 #include "Tile.h"
6 #include "Object.h"
7 #include "Map.h"
9 namespace botor
12 Tileset Player::PLAYER_TILESET( "player.png" );
14 Player::Player( Uint8 X, Uint8 Y ) : LivingMapObject( X, Y ), lives(3),
15 ani_idle( 0, 0, 0, false ),
16 ani_walking( 1, 2, 10 ),
17 ani_immuneIdle( 3, 0, 0, false ),
18 ani_immuneWalking( 4, 2, 10 ),
19 immune(false)
22 ani_player = new DAnimation( &PLAYER_TILESET );
24 p_ani_idle = &ani_idle;
25 p_ani_walking = &ani_walking;
27 graphic = ani_player;
28 ani_player->load( p_ani_idle );
32 // Player::~Player() { }
34 void Player::InitWalking( Uint8 X, Uint8 Y )
36 if( !walking )
38 vX = X;
39 vY = Y;
40 walking = true;
41 ani_player->load( p_ani_walking );
42 StartMovement();
47 float Player::SPEED()
49 return PLAYER_SPEED;
52 bool Player::isWalkable( Uint8 X, Uint8 Y )
54 Tile *t = Game::getMap()->tileAt(X, Y);
56 if( isBitSet( t->typeMask, Tile::TILE_EFENCE ) )
58 if( immune )
60 if( Game::getMap()->PushPushable( X, Y, vX, vY ) )
62 return true;
65 else
66 return true;
68 else if( isBitSet( t->typeMask, Tile::TILE_WALKABLE ) )
70 return true;
72 else if( isBitSet( t->typeMask, Tile::TILE_PUSHABLE ) )
74 if( Game::getMap()->PushPushable( X, Y, vX, vY ) )
76 return true;
80 return false;
83 void Player::OnTile( Tile *t )
85 if( isBitSet( t->typeMask, Tile::TILE_EFENCE ) )
87 Game::getMap()->RemoveTile( mapX, mapY );
88 Die();
91 if( Object *o = Game::getMap()->getObject( mapX, mapY ) )
93 o->OnPlayerOnTile( this );
97 void Player::OnDead()
99 lives--;
102 void Player::HandleInput( SDL_Event *event )
104 switch( event->type )
107 case SDL_KEYDOWN:
110 switch( event->key.keysym.sym )
112 case SDLK_DOWN:
113 InitWalking( 0, +1 );
114 break;
115 case SDLK_UP:
116 InitWalking( 0, -1 );
117 break;
118 case SDLK_LEFT:
119 InitWalking( -1, 0 );
120 break;
121 case SDLK_RIGHT:
122 InitWalking( +1, 0 );
123 break;
124 case SDLK_RETURN:
125 if( !isAlive() )
126 ResetPlayer();
127 else
128 Use( 0 );
129 break;
130 //case SDLK_a:
131 // Game::getMap()->Acid( mapX, mapY );
132 // break;
133 default:
134 break;
138 break;
142 case SDL_KEYUP:
143 switch( event->key.keysym.sym )
145 case SDLK_DOWN:
146 case SDLK_UP:
147 vY = 0;
148 walking = false;
149 ani_player->load( p_ani_idle );
150 break;
151 case SDLK_LEFT:
152 case SDLK_RIGHT:
153 vX = 0;
154 ani_player->load( p_ani_idle );
155 walking = false;
156 break;
157 default:
158 break;
164 void Player::Draw()
167 inv.Draw( 0,0 );
169 LivingMapObject::Draw();
172 void Player::ResetPlayer()
174 Teleport( 1, 1 );
175 Reanimate();
178 unsigned int Player::getLives() { return lives; }
180 void Player::Pickup( Object *o )
182 o->OnPickup( this );
183 inv.addObject( o );
186 void Player::Drop( Object *o )
188 if( Object *obj = inv.removeObject() )
190 Game::getMap()->insertObject( obj, mapX, mapY );
192 o->OnDrop( this );
197 void Player::Use( Object *o )
199 if( Object *obj = inv.removeObject() )
202 obj->OnActivation( this );
204 if( obj->getNUse() == ObjectClass::NUseOnce )
206 delete obj;
208 else if( obj->getNUse() == ObjectClass::NUseDrop )
210 Game::getMap()->insertObject( obj, mapX, mapY );
212 obj->OnDrop( this );
214 else
216 inv.addObject( obj );
222 void Player::SetImmune( bool newstate )
224 immune = newstate;
226 if( immune )
228 p_ani_idle = &ani_immuneIdle;
229 p_ani_walking = &ani_immuneWalking;
231 else
233 p_ani_idle = &ani_idle;
234 p_ani_walking = &ani_walking;