Added potion. reverted inventory lala
[sdlbotor.git] / Player.cpp
blob5593a8e095683e533421b717afad81401bb508dc
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( Sint8 X, Sint8 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 while( 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_d:
131 Drop( 0 );
132 break;
133 //case SDLK_a:
134 // Game::getMap()->Acid( mapX, mapY );
135 // break;
136 default:
137 break;
141 break;
145 case SDL_KEYUP:
146 switch( event->key.keysym.sym )
148 case SDLK_DOWN:
149 case SDLK_UP:
150 vY = 0;
151 walking = false;
152 ani_player->load( p_ani_idle );
153 break;
154 case SDLK_LEFT:
155 case SDLK_RIGHT:
156 vX = 0;
157 ani_player->load( p_ani_idle );
158 walking = false;
159 break;
160 default:
161 break;
167 void Player::Draw()
170 inv.Draw( 0,0 );
172 LivingMapObject::Draw();
175 void Player::ResetPlayer()
177 Teleport( 1, 1 );
178 Reanimate();
181 unsigned int Player::getLives() { return lives; }
183 void Player::Pickup( Object *o )
185 o->OnPickup( this );
186 inv.addObject( o );
189 void Player::Drop( Object *o )
191 if( Object *obj = inv.removeObject() )
193 obj->OnDrop( this );
194 Game::getMap()->insertObject( obj, mapX, mapY );
199 void Player::Use( Object *o )
201 if( Object *obj = inv.removeObject() )
204 obj->OnActivation( this );
206 if( obj->getNUse() == ObjectClass::NUseOnce )
208 delete obj;
210 else if( obj->getNUse() == ObjectClass::NUseDrop )
212 obj->OnDrop( this );
213 Game::getMap()->insertObject( obj, mapX, mapY );
215 else
217 inv.addObject( obj );
223 void Player::SetImmune( bool newstate )
225 immune = newstate;
227 if( immune )
229 p_ani_idle = &ani_immuneIdle;
230 p_ani_walking = &ani_immuneWalking;
232 else
234 p_ani_idle = &ani_idle;
235 p_ani_walking = &ani_walking;
240 void Player::addLives( int i )
242 lives += i;