From cb3c463261b2037387a62aec0dc855cab1541330 Mon Sep 17 00:00:00 2001 From: Tamir Atias Date: Sat, 14 Jan 2012 06:44:23 +0200 Subject: [PATCH] [Add] Player can now attack NPCs. --- src/Unuk/Game.cpp | 12 +++++-- src/Unuk/Player.cpp | 2 ++ src/libUnuk/Engine/Character.h | 12 ++++--- src/libUnuk/Engine/WorldManager.cpp | 50 +++++++++++++++++++++++++++++ src/libUnuk/Engine/WorldManager.h | 5 +++ 5 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/Unuk/Game.cpp b/src/Unuk/Game.cpp index a77a186..546bd7d 100644 --- a/src/Unuk/Game.cpp +++ b/src/Unuk/Game.cpp @@ -50,7 +50,7 @@ gameNavVal_t Game::Run(const string savegameIDArg) { stringstream npcHealth; _npcHealth.SetXY(10, 100); - _npcHealth.SetTextBlended("NPC Health - XX", vsmall, COLOUR_BLACK); + _npcHealth.SetTextBlended("NPC 0 Health - XX", vsmall, COLOUR_BLACK); _gameRunning = true; while(_gameRunning) { @@ -103,8 +103,16 @@ gameNavVal_t Game::Run(const string savegameIDArg) { playerHealth << "Player Health: " << _player->GetHealth(); _playerHealth.SetTextBlended(playerHealth.str(), vsmall, COLOUR_BLACK); + int npc0Health = 0; + if(_map.GetWorld().GetNPCCount() == 0) { + npc0Health = 0; + } + else { + npc0Health = _map.GetWorld().GetNPC(0)->GetHealth(); + } + npcHealth.str(""); - npcHealth << "NPC Health: " << _map.GetWorld().GetNPC(0)->GetHealth(); + npcHealth << "NPC 0 Health: " << npc0Health; _npcHealth.SetTextBlended(npcHealth.str(), vsmall, COLOUR_BLACK); } } diff --git a/src/Unuk/Player.cpp b/src/Unuk/Player.cpp index f4b5be2..2f9a99b 100644 --- a/src/Unuk/Player.cpp +++ b/src/Unuk/Player.cpp @@ -41,6 +41,7 @@ void Player::HandleInput(void) { case SDLK_SPACE: attacking = true; attackTimer.Start(); + map->GetWorld().OnPlayerAttack(this); break; default: break; @@ -59,6 +60,7 @@ void Player::HandleInput(void) { if(event.button.button == SDL_BUTTON_LEFT) { attacking = true; attackTimer.Start(); + map->GetWorld().OnPlayerAttack(this); } } } diff --git a/src/libUnuk/Engine/Character.h b/src/libUnuk/Engine/Character.h index 10c5e70..acedfbe 100644 --- a/src/libUnuk/Engine/Character.h +++ b/src/libUnuk/Engine/Character.h @@ -36,6 +36,9 @@ public: void SetHealth(int health) { _health = health; } int GetHealth(void) { return _health; } + int GetDirectionFacing(void) { return directionFacing; } + void SetDirectionFacing(int dir) { directionFacing = dir; } + void AddSpeachBubble(string text); void Render(void); @@ -56,6 +59,11 @@ public: inline void operator delete [](void* object) { gMemManager.Free(object); } + + static const int FACING_UP = 0; + static const int FACING_RIGHT = 1; + static const int FACING_DOWN = 2; + static const int FACING_LEFT = 3; protected: void Move(void); @@ -85,10 +93,6 @@ protected: static const float CHARACTER_SPEED; int directionFacing; - static const int FACING_UP = 0; - static const int FACING_RIGHT = 1; - static const int FACING_DOWN = 2; - static const int FACING_LEFT = 3; static const int ANIM_LEFT_FOOT = 0; static const int ANIM_NO_FOOT = 1; diff --git a/src/libUnuk/Engine/WorldManager.cpp b/src/libUnuk/Engine/WorldManager.cpp index af23a6b..a39b965 100644 --- a/src/libUnuk/Engine/WorldManager.cpp +++ b/src/libUnuk/Engine/WorldManager.cpp @@ -52,3 +52,53 @@ NPC* WorldManager::GetNPC(int index) { } return NULL; } + +void WorldManager::OnPlayerAttack(Character* player) { + int playerX = (int)(player->GetX() / 32.0f); + int playerY = (int)(player->GetY() / 32.0f); + int playerDir = player->GetDirectionFacing(); + + std::list::iterator i = _npcs.begin(); + + while(i != _npcs.end()) { + NPC* npc = (*i); + + int npcX = (int)(npc->GetX() / 32.0f); + int npcY = (int)(npc->GetY() / 32.0f); + + int diffX = npcX - playerX; + int diffY = npcY - playerY; + + // Not in player's line of sight. + if(diffX != 0 && diffY != 0) { + ++i; + continue; + } + + // Distance is greater than 2. + if(diffX > 2 || diffY > 2) { + ++i; + continue; + } + + // Player not facing the npc. + if((diffX < 0 && playerDir != Character::FACING_LEFT) || + (diffX > 0 && playerDir != Character::FACING_RIGHT) || + (diffY < 0 && playerDir != Character::FACING_UP) || + (diffY > 0 && playerDir != Character::FACING_DOWN)) + { + ++i; + continue; + } + + npc->SetHealth(npc->GetHealth() - 5); + + if(npc->GetHealth() <= 0) { + i = _npcs.erase(i); + delete npc; + } + else { + ++i; + } + } +} diff --git a/src/libUnuk/Engine/WorldManager.h b/src/libUnuk/Engine/WorldManager.h index 466571c..001b0f9 100644 --- a/src/libUnuk/Engine/WorldManager.h +++ b/src/libUnuk/Engine/WorldManager.h @@ -2,6 +2,7 @@ #include class NPC; +class Character; class WorldManager { public: @@ -15,6 +16,10 @@ public: void RemoveNPC(int index); NPC* GetNPC(int index); + int GetNPCCount() { return _npcs.size(); } + + void OnPlayerAttack(Character* player); + private: std::list _npcs; };