From 7ca0ad0d7d56427edae3968f3e6e342f04cf84fd Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sat, 18 Feb 2012 23:49:13 +0000 Subject: [PATCH 1/8] [Fix] Changed abs(Vec2::DistanceSquared(thisPos, goalPos)); to fabs(Vec2::DistanceSquared(thisPos, goalPos)); --- src/libUnuk/Engine/NPC.cpp | 136 +++++++++++++++---------------- src/libUnuk/LevelGen/MapTile.cpp | 88 ++++++++++---------- src/libUnuk/LevelGen/MapTile.h | 88 ++++++++++---------- 3 files changed, 156 insertions(+), 156 deletions(-) diff --git a/src/libUnuk/Engine/NPC.cpp b/src/libUnuk/Engine/NPC.cpp index 4f59627..270937f 100644 --- a/src/libUnuk/Engine/NPC.cpp +++ b/src/libUnuk/Engine/NPC.cpp @@ -1,12 +1,12 @@ #include "NPC.h" -#include "../Unuk/Player.h" +#include "../../Unuk/Player.h" NPC::NPC(LevelGen* mapArg) : Character(mapArg) { - _moveTimer.Start(); - - _moveChangeFrequency = 14000; - _moveDurationMax = 3000; - _moveDurationMin = 1000; + _moveTimer.Start(); + + _moveChangeFrequency = 14000; + _moveDurationMax = 3000; + _moveDurationMin = 1000; } NPC::~NPC(void) { @@ -14,80 +14,80 @@ NPC::~NPC(void) { } void NPC::Update(void) { - // Store the NPC's health. - // int health = GetHealth(); // not referenced + // Store the NPC's health. + // int health = GetHealth(); // not referenced - Move(); + Move(); - if(xVel > 0) directionFacing = FACING_RIGHT; - else if(xVel < 0) directionFacing = FACING_LEFT; - else if(yVel > 0) directionFacing = FACING_DOWN; - else if(yVel < 0) directionFacing = FACING_UP; + if(xVel > 0) directionFacing = FACING_RIGHT; + else if(xVel < 0) directionFacing = FACING_LEFT; + else if(yVel > 0) directionFacing = FACING_DOWN; + else if(yVel < 0) directionFacing = FACING_UP; - _healthBar.SetProgress((float)GetHealth() / 100.0f); + _healthBar.SetProgress((float)GetHealth() / 100.0f); } void NPC::Move(void) { - if(_moving && _moveTimer.GetTicks() > _moveDurationMax) { - xVel = 0.0f; - yVel = 0.0f; - _moving = false; - } - - if(_moving && _moveTimer.GetTicks() >= _moveDurationCurrent) { - xVel = 0.0f; - yVel = 0.0f; - _moving = false; - } - - if(_moveTimer.GetTicks() > _moveChangeFrequency) { - _moveTimer.Start(); - _moveDurationCurrent = _moveDurationMin + (rand() % (_moveDurationMax - _moveDurationMin)); - if(rand() % 2) { - yVel = 0.0f; - if(rand() % 2) - xVel = CHARACTER_SPEED; - else - xVel = -CHARACTER_SPEED; - } else { - xVel = 0.0f; - if(rand() % 2) - yVel = CHARACTER_SPEED; - else - yVel = -CHARACTER_SPEED; - } - _moving = true; - } - - map->MoveIfPossible(this, xVel, yVel, false); - Character::HealthBarScroll(); + if(_moving && _moveTimer.GetTicks() > _moveDurationMax) { + xVel = 0.0f; + yVel = 0.0f; + _moving = false; + } + + if(_moving && _moveTimer.GetTicks() >= _moveDurationCurrent) { + xVel = 0.0f; + yVel = 0.0f; + _moving = false; + } + + if(_moveTimer.GetTicks() > _moveChangeFrequency) { + _moveTimer.Start(); + _moveDurationCurrent = _moveDurationMin + (rand() % (_moveDurationMax - _moveDurationMin)); + if(rand() % 2) { + yVel = 0.0f; + if(rand() % 2) + xVel = CHARACTER_SPEED; + else + xVel = -CHARACTER_SPEED; + } else { + xVel = 0.0f; + if(rand() % 2) + yVel = CHARACTER_SPEED; + else + yVel = -CHARACTER_SPEED; + } + _moving = true; + } + + map->MoveIfPossible(this, xVel, yVel, false); + Character::HealthBarScroll(); } void NPC::OnPlayerMove(Player* player) { - MapTile& start = map->GetTile(x / TILE_WIDTH, y / TILE_HEIGHT); - MapTile& goal = map->GetTile(player->GetX() / TILE_WIDTH, player->GetY() / TILE_HEIGHT); + MapTile& start = map->GetTile(x / TILE_WIDTH, y / TILE_HEIGHT); + MapTile& goal = map->GetTile(player->GetX() / TILE_WIDTH, player->GetY() / TILE_HEIGHT); - _astar.SetStartAndGoalStates(start, goal); + _astar.SetStartAndGoalStates(start, goal); - bool solutionFound = false; + bool solutionFound = false; - // Dirty loop to calculate the path - while(true) { - _astar.SearchStep(); + // Dirty loop to calculate the path + while(true) { + _astar.SearchStep(); - int state = _astar.GetState(); - if(state == AStarSearch::SEARCH_STATE_SUCCEEDED) { - solutionFound = true; - break; - } else if(state == AStarSearch::SEARCH_STATE_SEARCHING) { - continue; - } else { - break; - } - } + int state = _astar.GetState(); + if(state == AStarSearch::SEARCH_STATE_SUCCEEDED) { + solutionFound = true; + break; + } else if(state == AStarSearch::SEARCH_STATE_SEARCHING) { + continue; + } else { + break; + } + } - if(solutionFound) { - x = _astar.GetSolutionEnd()->GetTileX(); - y = _astar.GetSolutionEnd()->GetTileY(); - } + if(solutionFound) { + x = _astar.GetSolutionEnd()->GetTileX(); + y = _astar.GetSolutionEnd()->GetTileY(); + } } diff --git a/src/libUnuk/LevelGen/MapTile.cpp b/src/libUnuk/LevelGen/MapTile.cpp index e861204..1000597 100644 --- a/src/libUnuk/LevelGen/MapTile.cpp +++ b/src/libUnuk/LevelGen/MapTile.cpp @@ -2,67 +2,67 @@ #include "LevelGen.h" MapTile::MapTile(const MapTile& source) { - _level = source._level; - _tile = source._tile; - _entity = source._entity; - _zLevel = source._zLevel; + _level = source._level; + _tile = source._tile; + _entity = source._entity; + _zLevel = source._zLevel; } bool MapTile::IsSameState(MapTile& tile) { - return (tile.GetTileX() == _tile.GetX()) && (tile.GetTileY() == _tile.GetY()); + return (tile.GetTileX() == _tile.GetX()) && (tile.GetTileY() == _tile.GetY()); } bool MapTile::IsGoal(MapTile& tile) { - return IsSameState(tile); + return IsSameState(tile); } float MapTile::GoalDistanceEstimate(MapTile& goal) { - Vec2 thisPos(_tile.GetX(), _tile.GetY()); - Vec2 goalPos(goal.GetTileX(), goal.GetTileY()); - return abs(Vec2::DistanceSquared(thisPos, goalPos)); + Vec2 thisPos(_tile.GetX(), _tile.GetY()); + Vec2 goalPos(goal.GetTileX(), goal.GetTileY()); + return fabs(Vec2::DistanceSquared(thisPos, goalPos)); } float MapTile::GetCost(MapTile& goal) { - return 64.0f*64.0f; + return 64.0f*64.0f; } bool MapTile::GetSuccessors(AStarSearch* search, MapTile* parent) { - int tileX = _tile.GetX() / TILE_WIDTH; - int tileY = _tile.GetY() / TILE_HEIGHT; - - // Add tile to the left if possible. - if(tileX > 0) { - MapTile& successor = _level->GetTile(tileX - 1, tileY); - if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { - search->AddSuccessor(successor); - } - } + int tileX = _tile.GetX() / TILE_WIDTH; + int tileY = _tile.GetY() / TILE_HEIGHT; - // Add tile to the right if possible - // TODO: replace 64 with map width - if(tileX < 64) { - MapTile& successor = _level->GetTile(tileX + 1, tileY); - if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { - search->AddSuccessor(successor); - } - } + // Add tile to the left if possible. + if(tileX > 0) { + MapTile& successor = _level->GetTile(tileX - 1, tileY); + if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { + search->AddSuccessor(successor); + } + } - // Add tile to the bottom if possible - if(tileY > 0) { - MapTile& successor = _level->GetTile(tileX, tileY - 1); - if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { - search->AddSuccessor(successor); - } - } + // Add tile to the right if possible + // TODO: replace 64 with map width + if(tileX < 64) { + MapTile& successor = _level->GetTile(tileX + 1, tileY); + if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { + search->AddSuccessor(successor); + } + } - // Add tile to the top if possible - // TODO: replace 64 with map height - if(tileY < 64) { - MapTile& successor = _level->GetTile(tileX, tileY + 1); - if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { - search->AddSuccessor(successor); - } - } + // Add tile to the bottom if possible + if(tileY > 0) { + MapTile& successor = _level->GetTile(tileX, tileY - 1); + if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { + search->AddSuccessor(successor); + } + } - return true; + // Add tile to the top if possible + // TODO: replace 64 with map height + if(tileY < 64) { + MapTile& successor = _level->GetTile(tileX, tileY + 1); + if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { + search->AddSuccessor(successor); + } + } + + return true; } diff --git a/src/libUnuk/LevelGen/MapTile.h b/src/libUnuk/LevelGen/MapTile.h index 01f506c..85253a0 100644 --- a/src/libUnuk/LevelGen/MapTile.h +++ b/src/libUnuk/LevelGen/MapTile.h @@ -15,57 +15,57 @@ class LevelGen; class MapTile { public: - MapTile(LevelGen* level = NULL) : _level(level) { } - ~MapTile(void) { } + MapTile(LevelGen* level = NULL) : _level(level) { } + ~MapTile(void) { } - void Render(void) { _tile.Render(), _entity.Render(); } + void Render(void) { _tile.Render(), _entity.Render(); } - // Tile Mutators. - SDL_Surface* SetTileTexture(SDL_Surface* arg) { _tile.SetTexture(arg); return NULL; } - void SetTileTextureName(string path) { _tile.SetTextureName(path); } - string GetTileTextureName(void) { return _tile.GetTextureName(); } - void SetTileSolidity(bool arg) { _tile.SetSolidity(arg); } - bool GetTileSolidity(void) { return _tile.GetSolidity(); } - // Well, it kinda helps if I lay the - // tiles rather than just get the - // return value right?? - void SetTileXY(int xArg, int yArg) { _tile.SetXY(xArg, yArg); } - int GetTileX(void) { return _tile.GetX(); } - int GetTileY(void) { return _tile.GetY(); } - + // Tile Mutators. + SDL_Surface* SetTileTexture(SDL_Surface* arg) { _tile.SetTexture(arg); return NULL; } + void SetTileTextureName(string path) { _tile.SetTextureName(path); } + string GetTileTextureName(void) { return _tile.GetTextureName(); } + void SetTileSolidity(bool arg) { _tile.SetSolidity(arg); } + bool GetTileSolidity(void) { return _tile.GetSolidity(); } + // Well, it kinda helps if I lay the + // tiles rather than just get the + // return value right?? + void SetTileXY(int xArg, int yArg) { _tile.SetXY(xArg, yArg); } + int GetTileX(void) { return _tile.GetX(); } + int GetTileY(void) { return _tile.GetY(); } - // Entity Mutators. - void SetEntityTexture(SDL_Surface* arg) { _entity.SetTexture(arg); } - void SetEntityTextureName(string path) { _entity.SetTextureName(path); } - void SetEntityXY(int xArg, int yArg) { _entity.SetXY(xArg, yArg); } - void SetEntitySolidity(bool arg) { _entity.SetSolidity(arg); } - bool GetEntitySolitity(void) { return _entity.GetSolidity(); } - // Entity Mutators. - int GetEntityX(void) { return _entity.GetX(); } - int GetEntityY(void) { return _entity.GetY(); } - int GetEntityWidth(void) { return _entity.GetWidth(); } - int GetEntityHeight(void) { return _entity.GetHeight(); } - string GetEntityTextureName(void) { return _entity.GetTextureName(); } + // Entity Mutators. + void SetEntityTexture(SDL_Surface* arg) { _entity.SetTexture(arg); } + void SetEntityTextureName(string path) { _entity.SetTextureName(path); } + void SetEntityXY(int xArg, int yArg) { _entity.SetXY(xArg, yArg); } + void SetEntitySolidity(bool arg) { _entity.SetSolidity(arg); } + bool GetEntitySolitity(void) { return _entity.GetSolidity(); } - // ZLevel Mutators. - void SetZLevel(int arg) { _zLevel = arg; } - int GetZLevel(void) { return _zLevel; } + // Entity Mutators. + int GetEntityX(void) { return _entity.GetX(); } + int GetEntityY(void) { return _entity.GetY(); } + int GetEntityWidth(void) { return _entity.GetWidth(); } + int GetEntityHeight(void) { return _entity.GetHeight(); } + string GetEntityTextureName(void) { return _entity.GetTextureName(); } - // Pathfinding stuff. - MapTile(const MapTile& source); - bool IsSameState(MapTile& tile); - bool IsGoal(MapTile& tile); - float GoalDistanceEstimate(MapTile& goal); - float GetCost(MapTile& goal); - bool GetSuccessors(AStarSearch* search, MapTile* parent); + // ZLevel Mutators. + void SetZLevel(int arg) { _zLevel = arg; } + int GetZLevel(void) { return _zLevel; } + + // Pathfinding stuff. + MapTile(const MapTile& source); + bool IsSameState(MapTile& tile); + bool IsGoal(MapTile& tile); + float GoalDistanceEstimate(MapTile& goal); + float GetCost(MapTile& goal); + bool GetSuccessors(AStarSearch* search, MapTile* parent); private: - LevelGen* _level; - MapElement _tile; - MapEntityGeneric _entity; + LevelGen* _level; + MapElement _tile; + MapEntityGeneric _entity; - // -1 is a 'special' tile, the next tile that the player walks - // on is the players new zlevel. - int _zLevel; + // -1 is a 'special' tile, the next tile that the player walks + // on is the players new zlevel. + int _zLevel; }; From d55d16ac616dd537da4f5eeb1bea7a3c74d9dfd7 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 14:51:53 +0000 Subject: [PATCH 2/8] [Fix] Memory managment now working, and utilized. --- src/Unuk/Game.h | 58 ++++++++++++++-------------- src/libUnuk/Engine/Character.h | 45 +++++++++++----------- src/libUnuk/Engine/WorldManager.h | 50 ++++++++++++++++-------- src/libUnuk/LevelGen/LevelGen.h | 63 ++++++++++++++++--------------- 4 files changed, 118 insertions(+), 98 deletions(-) diff --git a/src/Unuk/Game.h b/src/Unuk/Game.h index f393464..e76bfba 100644 --- a/src/Unuk/Game.h +++ b/src/Unuk/Game.h @@ -23,46 +23,46 @@ enum gameNavVal_t { gameMainMenu, gameQuitGame }; class Game { public: - Game(void); - ~Game(void); - - void New(const string& savegameIDArg); - void Load(const string& savegameIDArg); + Game(void); + ~Game(void); + + void New(const string& savegameIDArg); + void Load(const string& savegameIDArg); + + gameNavVal_t Run(void); - gameNavVal_t Run(void); - private: - void HandleInput(void); - void UpdateGame(void); - void Render(void); + void HandleInput(void); + void UpdateGame(void); + void Render(void); - void NewSavegame(const string savegameIDArg); - void LoadSavegame(const string savegameIDArg); - void SaveSavegame(void); + void NewSavegame(const string savegameIDArg); + void LoadSavegame(const string savegameIDArg); + void SaveSavegame(void); static const int MAX_FPS = 200; - static const int GAME_UPDATES_PER_SECOND = 60; - static const int SKIP_TICKS = 1000 / GAME_UPDATES_PER_SECOND; + static const int GAME_UPDATES_PER_SECOND = 60; + static const int SKIP_TICKS = 1000 / GAME_UPDATES_PER_SECOND; - bool _gameRunning; + bool _gameRunning; - gameNavVal_t _runGameReturnValue; + gameNavVal_t _runGameReturnValue; - string _saveGameID; - string _mapID; + string _saveGameID; + string _mapID; - Text _gameUpdateTime; - Text _gameRenderTime; - Text _playerXY; - Text _npcHealth; + Text _gameUpdateTime; + Text _gameRenderTime; + Text _playerXY; + Text _npcHealth; - IngameMenu _ingameMenu; + IngameMenu _ingameMenu; LevelGen _map; - Player* _player; + Player* _player; - Text _playerHealth; - Text _playerExp; - Bar _playerHealthBar; - Bar _playerExpBar; + Text _playerHealth; + Text _playerExp; + Bar _playerHealthBar; + Bar _playerExpBar; }; diff --git a/src/libUnuk/Engine/Character.h b/src/libUnuk/Engine/Character.h index 587ca38..6843146 100644 --- a/src/libUnuk/Engine/Character.h +++ b/src/libUnuk/Engine/Character.h @@ -45,28 +45,29 @@ public: void OnAttack(void); -// inline void* operator new(size_t size) { -// return gMemManager.Allocate(size); -// } -// -// inline void operator delete(void* object) { -// gMemManager.Free(object); -// } -// -// inline void* operator new [](size_t size) { -// return gMemManager.Allocate(size); -// } -// -// inline void operator delete [](void* object) { -// gMemManager.Free(object); -// } - - enum { - FACING_UP, - FACING_RIGHT, - FACING_DOWN, - FACING_LEFT - }; + // Overload new and delete operators to utilize MemManager. + inline void* operator new(size_t size) { + return gMemManager.Allocate(size); + } + + inline void operator delete(void* object) { + gMemManager.Free(object); + } + + inline void* operator new [](size_t size) { + return gMemManager.Allocate(size); + } + + inline void operator delete [](void* object) { + gMemManager.Free(object); + } + + enum { + FACING_UP, + FACING_RIGHT, + FACING_DOWN, + FACING_LEFT + }; protected: void HealthBarScroll(void); diff --git a/src/libUnuk/Engine/WorldManager.h b/src/libUnuk/Engine/WorldManager.h index 5833abf..eced73e 100644 --- a/src/libUnuk/Engine/WorldManager.h +++ b/src/libUnuk/Engine/WorldManager.h @@ -1,5 +1,6 @@ #pragma once #include +#include "MemClass.h" class Character; class NPC; @@ -10,26 +11,43 @@ class LevelGen; class WorldManager { public: - WorldManager(LevelGen* level); - ~WorldManager(void); + WorldManager(LevelGen* level); + ~WorldManager(void); - void Update(void); - void Render(void); + void Update(void); + void Render(void); - void AddNPC(NPC* npc); - void RemoveNPC(int index); - NPC* GetNPC(int index); - NPC* GetNPCAt(int xArg, int yArg); - void CreateNPC(int x, int y); - - bool CheckCollision(const SDL_Rect& charRect, Character* exclude); + void AddNPC(NPC* npc); + void RemoveNPC(int index); + NPC* GetNPC(int index); + NPC* GetNPCAt(int xArg, int yArg); + void CreateNPC(int x, int y); - int GetNPCCount() { return _npcs.size(); } + bool CheckCollision(const SDL_Rect& charRect, Character* exclude); - void OnPlayerAttack(Player* player); - void OnPlayerMove(Player* player); + int GetNPCCount() { return _npcs.size(); } + + void OnPlayerAttack(Player* player); + void OnPlayerMove(Player* player); + + // Overload new and delete operators to utilize MemManager. + inline void* operator new(size_t size) { + return gMemManager.Allocate(size); + } + + inline void operator delete(void* object) { + gMemManager.Free(object); + } + + inline void* operator new [](size_t size) { + return gMemManager.Allocate(size); + } + + inline void operator delete [](void* object) { + gMemManager.Free(object); + } private: - LevelGen* _level; - std::list _npcs; + LevelGen* _level; + std::list _npcs; }; diff --git a/src/libUnuk/LevelGen/LevelGen.h b/src/libUnuk/LevelGen/LevelGen.h index a3b1bb0..7221c72 100644 --- a/src/libUnuk/LevelGen/LevelGen.h +++ b/src/libUnuk/LevelGen/LevelGen.h @@ -14,6 +14,7 @@ #include "../LevelGen/MapTile.h" #include "../System/Debug.h" #include "../Engine/WorldManager.h" +#include "../Engine/MemClass.h" using namespace std; class Character; @@ -24,16 +25,16 @@ public: LevelGen(void); ~LevelGen(void); - void New(void); - void Load(const string& filename); - void Save(const string& filename); - void Update(void); - void Render(void); - - void FindSpawnPoint(int& xArg, int& yArg, int objWidth, int objHeight); - void MoveIfPossible(Character* character, float xVel, float yVel, bool isPlayer = false); - bool CanMoveToPoint(int xArg, int yArg); - + void New(void); + void Load(const string& filename); + void Save(const string& filename); + void Update(void); + void Render(void); + + void FindSpawnPoint(int& xArg, int& yArg, int objWidth, int objHeight); + void MoveIfPossible(Character* character, float xVel, float yVel, bool isPlayer = false); + bool CanMoveToPoint(int xArg, int yArg); + bool GetTileSolidity(int xArg, int yArg); int GetTileX(int xArg, int yArg); int GetTileY(int xArg, int yArg); @@ -46,35 +47,35 @@ public: int GetTileZLevel(int xArg, int yArg); - MapTile& GetTile(int xArg, int yArg); + MapTile& GetTile(int xArg, int yArg); string GetCurrentMap(void); WorldManager& GetWorld(void) { return _world; } - void SetPlayer(Player* player) { _player = player; } - + void SetPlayer(Player* player) { _player = player; } + private: - void Unload(void); - void DoMagic(void); - void GenerateEntities(const std::string& name, int frequency); - void MakeWalkingPaths(void); - void GenerateEnemies(void); + void Unload(void); + void DoMagic(void); + void GenerateEntities(const std::string& name, int frequency); + void MakeWalkingPaths(void); + void GenerateEnemies(void); - string _currentMap; - int x; - int y; + string _currentMap; + int x; + int y; - static const int TILE_ARRAY_SIZE = 150; - MapTile _tile[TILE_ARRAY_SIZE][TILE_ARRAY_SIZE]; - - static const int BOUNDARIES_X = (SCREEN_WIDTH / TILE_WIDTH); - static const int BOUNDARIES_Y = (SCREEN_HEIGHT / TILE_HEIGHT); + static const int TILE_ARRAY_SIZE = 150; + MapTile _tile[TILE_ARRAY_SIZE][TILE_ARRAY_SIZE]; - TextureManager _tileTextures; - TextureManager _entityTextures; + static const int BOUNDARIES_X = (SCREEN_WIDTH / TILE_WIDTH); + static const int BOUNDARIES_Y = (SCREEN_HEIGHT / TILE_HEIGHT); - WorldManager _world; - - Player* _player; + TextureManager _tileTextures; + TextureManager _entityTextures; + + WorldManager _world; + + Player* _player; }; From 87c075ddb03a212c202236f0d5b274f6df0581f6 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 15:04:55 +0000 Subject: [PATCH 3/8] [Change] Removed operator overloads in WorldManager.h as we never use them. WorldManager will invoke the operators from Character. --- src/libUnuk/Engine/MemManager.cpp | 312 +++++++++++++++--------------- src/libUnuk/Engine/WorldManager.h | 17 -- 2 files changed, 156 insertions(+), 173 deletions(-) diff --git a/src/libUnuk/Engine/MemManager.cpp b/src/libUnuk/Engine/MemManager.cpp index 57ff900..240ea2a 100644 --- a/src/libUnuk/Engine/MemManager.cpp +++ b/src/libUnuk/Engine/MemManager.cpp @@ -4,203 +4,203 @@ MemManager gMemManager; void BitMapEntry::SetBit(int position, bool flag) { - blocksAvailable += flag ? 1 : -1; - int elementNo = position / INT_SIZE; - int bitNo = position % INT_SIZE; - if(flag) - bitMap[elementNo] = bitMap[elementNo] | (1 << bitNo); - else - bitMap[elementNo] = bitMap[elementNo] & ~(1 << bitNo); + blocksAvailable += flag ? 1 : -1; + int elementNo = position / INT_SIZE; + int bitNo = position % INT_SIZE; + if(flag) + bitMap[elementNo] = bitMap[elementNo] | (1 << bitNo); + else + bitMap[elementNo] = bitMap[elementNo] & ~(1 << bitNo); } void BitMapEntry::SetMultipleBits(int position, bool flag, int count) { - blocksAvailable += flag ? count : -count; - int elementNo = position / INT_SIZE; - int bitNo = position % INT_SIZE; + blocksAvailable += flag ? count : -count; + int elementNo = position / INT_SIZE; + int bitNo = position % INT_SIZE; - int bitSize = (count <= INT_SIZE - bitNo) ? count : INT_SIZE - bitNo; - SetRangeOfInt(&bitMap[elementNo], bitNo + bitSize - 1, bitNo, flag); - count -= bitSize; - if(!count) return; + int bitSize = (count <= INT_SIZE - bitNo) ? count : INT_SIZE - bitNo; + SetRangeOfInt(&bitMap[elementNo], bitNo + bitSize - 1, bitNo, flag); + count -= bitSize; + if(!count) return; - int i = ++elementNo; - while(count >= 0) { - if(count <= INT_SIZE) { - SetRangeOfInt(&bitMap[i], count - 1, 0, flag); - return; - } else - bitMap[i] = flag ? unsigned (-1) : 0; - count -= 32; - i++; - } + int i = ++elementNo; + while(count >= 0) { + if(count <= INT_SIZE) { + SetRangeOfInt(&bitMap[i], count - 1, 0, flag); + return; + } else + bitMap[i] = flag ? unsigned (-1) : 0; + count -= 32; + i++; + } } void BitMapEntry::SetRangeOfInt(int* element, int msb, int lsb, bool flag) { - if(flag) { - int mask = (unsigned(-1) << lsb) & (unsigned(-1) >> (INT_SIZE - msb - 1)); - *element |= mask; - } else { - int mask = (unsigned(-1) << lsb) & (unsigned(-1) >> (INT_SIZE - msb - 1)); - *element &= ~mask; - } + if(flag) { + int mask = (unsigned(-1) << lsb) & (unsigned(-1) >> (INT_SIZE - msb - 1)); + *element |= mask; + } else { + int mask = (unsigned(-1) << lsb) & (unsigned(-1) >> (INT_SIZE - msb - 1)); + *element &= ~mask; + } } MemClass* BitMapEntry::FirstFreeBlock(size_t/* size*/) { - for(int i = 0; i < BIT_MAP_ELEMENTS; i++) { - if(bitMap[i] == 0) - // There aint any bits free. - continue; + for(int i = 0; i < BIT_MAP_ELEMENTS; i++) { + if(bitMap[i] == 0) + // There aint any bits free. + continue; - // Yield the first bit position. This is a 1 - // in an int from the right. - int result = bitMap[i] & -(bitMap[i]); - //void* address = 0; - int basePos = (INT_SIZE * i); + // Yield the first bit position. This is a 1 + // in an int from the right. + int result = bitMap[i] & -(bitMap[i]); + //void* address = 0; + int basePos = (INT_SIZE * i); - switch(result) { - // Make the corresponfing bit 0 so block is no longer free. - case 0x00000001: return ComplexObjectAddress(basePos + 0); - case 0x00000002: return ComplexObjectAddress(basePos + 1); - case 0x00000004: return ComplexObjectAddress(basePos + 2); - case 0x00000008: return ComplexObjectAddress(basePos + 3); - case 0x00000010: return ComplexObjectAddress(basePos + 4); - case 0x00000020: return ComplexObjectAddress(basePos + 5); - case 0x00000040: return ComplexObjectAddress(basePos + 6); - case 0x00000080: return ComplexObjectAddress(basePos + 7); - case 0x00000100: return ComplexObjectAddress(basePos + 8); - case 0x00000200: return ComplexObjectAddress(basePos + 9); - case 0x00000400: return ComplexObjectAddress(basePos + 10); - case 0x00000800: return ComplexObjectAddress(basePos + 11); - case 0x00001000: return ComplexObjectAddress(basePos + 12); - case 0x00002000: return ComplexObjectAddress(basePos + 13); - case 0x00004000: return ComplexObjectAddress(basePos + 14); - case 0x00008000: return ComplexObjectAddress(basePos + 15); - case 0x00010000: return ComplexObjectAddress(basePos + 16); - case 0x00020000: return ComplexObjectAddress(basePos + 17); - case 0x00040000: return ComplexObjectAddress(basePos + 18); - case 0x00080000: return ComplexObjectAddress(basePos + 19); - case 0x00100000: return ComplexObjectAddress(basePos + 20); - case 0x00200000: return ComplexObjectAddress(basePos + 21); - case 0x00400000: return ComplexObjectAddress(basePos + 22); - case 0x00800000: return ComplexObjectAddress(basePos + 23); - case 0x01000000: return ComplexObjectAddress(basePos + 24); - case 0x02000000: return ComplexObjectAddress(basePos + 25); - case 0x04000000: return ComplexObjectAddress(basePos + 26); - case 0x08000000: return ComplexObjectAddress(basePos + 27); - case 0x10000000: return ComplexObjectAddress(basePos + 28); - case 0x20000000: return ComplexObjectAddress(basePos + 29); - case 0x40000000: return ComplexObjectAddress(basePos + 30); - case 0x80000000: return ComplexObjectAddress(basePos + 31); - default: break; - } - } - return 0; + switch(result) { + // Make the corresponfing bit 0 so block is no longer free. + case 0x00000001: return ComplexObjectAddress(basePos + 0); + case 0x00000002: return ComplexObjectAddress(basePos + 1); + case 0x00000004: return ComplexObjectAddress(basePos + 2); + case 0x00000008: return ComplexObjectAddress(basePos + 3); + case 0x00000010: return ComplexObjectAddress(basePos + 4); + case 0x00000020: return ComplexObjectAddress(basePos + 5); + case 0x00000040: return ComplexObjectAddress(basePos + 6); + case 0x00000080: return ComplexObjectAddress(basePos + 7); + case 0x00000100: return ComplexObjectAddress(basePos + 8); + case 0x00000200: return ComplexObjectAddress(basePos + 9); + case 0x00000400: return ComplexObjectAddress(basePos + 10); + case 0x00000800: return ComplexObjectAddress(basePos + 11); + case 0x00001000: return ComplexObjectAddress(basePos + 12); + case 0x00002000: return ComplexObjectAddress(basePos + 13); + case 0x00004000: return ComplexObjectAddress(basePos + 14); + case 0x00008000: return ComplexObjectAddress(basePos + 15); + case 0x00010000: return ComplexObjectAddress(basePos + 16); + case 0x00020000: return ComplexObjectAddress(basePos + 17); + case 0x00040000: return ComplexObjectAddress(basePos + 18); + case 0x00080000: return ComplexObjectAddress(basePos + 19); + case 0x00100000: return ComplexObjectAddress(basePos + 20); + case 0x00200000: return ComplexObjectAddress(basePos + 21); + case 0x00400000: return ComplexObjectAddress(basePos + 22); + case 0x00800000: return ComplexObjectAddress(basePos + 23); + case 0x01000000: return ComplexObjectAddress(basePos + 24); + case 0x02000000: return ComplexObjectAddress(basePos + 25); + case 0x04000000: return ComplexObjectAddress(basePos + 26); + case 0x08000000: return ComplexObjectAddress(basePos + 27); + case 0x10000000: return ComplexObjectAddress(basePos + 28); + case 0x20000000: return ComplexObjectAddress(basePos + 29); + case 0x40000000: return ComplexObjectAddress(basePos + 30); + case 0x80000000: return ComplexObjectAddress(basePos + 31); + default: break; + } + } + return 0; } MemClass* BitMapEntry::ComplexObjectAddress(int pos) { - SetBit(pos, false); - return &((static_cast(Head()) + (pos / INT_SIZE)) [INT_SIZE - (pos % INT_SIZE + 1)]); + SetBit(pos, false); + return &((static_cast(Head()) + (pos / INT_SIZE)) [INT_SIZE - (pos % INT_SIZE + 1)]); } void* BitMapEntry::Head(void) { - return gMemManager.GetMemoryPoolList()[index]; + return gMemManager.GetMemoryPoolList()[index]; } void* MemManager::Allocate(size_t size) { - // None array. - if(size == sizeof(MemClass)) { - set::iterator freeMapI = _freeMapEntries.begin(); - if(freeMapI != _freeMapEntries.end()) { - BitMapEntry* mapEntry = *freeMapI; - return mapEntry->FirstFreeBlock(size); - } else { - AllocateChunkAndInitBitMap(); - _freeMapEntries.insert(&(_bitMapEntryList[_bitMapEntryList.size() - 1])); - return _bitMapEntryList[_bitMapEntryList.size() - 1].FirstFreeBlock(size); - } - } else { - // Array. - if(_arrayMemoryList.empty()) { - return AllocateArrayMemory(size); - } else { - map::iterator infoI = _arrayMemoryList.begin(); - map::iterator infoEndI = _arrayMemoryList.end(); + // None array. + if(size == sizeof(MemClass)) { + set::iterator freeMapI = _freeMapEntries.begin(); + if(freeMapI != _freeMapEntries.end()) { + BitMapEntry* mapEntry = *freeMapI; + return mapEntry->FirstFreeBlock(size); + } else { + AllocateChunkAndInitBitMap(); + _freeMapEntries.insert(&(_bitMapEntryList[_bitMapEntryList.size() - 1])); + return _bitMapEntryList[_bitMapEntryList.size() - 1].FirstFreeBlock(size); + } + } else { + // Array. + if(_arrayMemoryList.empty()) { + return AllocateArrayMemory(size); + } else { + map::iterator infoI = _arrayMemoryList.begin(); + map::iterator infoEndI = _arrayMemoryList.end(); - while(infoI != infoEndI) { - ArrayMemoryInfo info = (*infoI).second; - if(info.StartPosition != 0) - // Only search the memory blocks where allocation - // is done from first byte. - continue; - else { - BitMapEntry* entry = &_bitMapEntryList[info.memPoolListIndex]; - if(entry->blocksAvailable < (size / sizeof(MemClass))) - return AllocateArrayMemory(size); - else { - info.StartPosition = BIT_MAP_SIZE - entry->blocksAvailable; - info.Size = size / sizeof(MemClass); - MemClass* baseAddress = static_cast(_memoryPoolList[info.memPoolListIndex]) + info.StartPosition; + while(infoI != infoEndI) { + ArrayMemoryInfo info = (*infoI).second; + if(info.StartPosition != 0) + // Only search the memory blocks where allocation + // is done from first byte. + continue; + else { + BitMapEntry* entry = &_bitMapEntryList[info.memPoolListIndex]; + if(entry->blocksAvailable < (size / sizeof(MemClass))) + return AllocateArrayMemory(size); + else { + info.StartPosition = BIT_MAP_SIZE - entry->blocksAvailable; + info.Size = size / sizeof(MemClass); + MemClass* baseAddress = static_cast(_memoryPoolList[info.memPoolListIndex]) + info.StartPosition; - _arrayMemoryList[baseAddress] = info; - SetMultipleBlockBits(&info, false); + _arrayMemoryList[baseAddress] = info; + SetMultipleBlockBits(&info, false); - return baseAddress; - } - } - } - } - } - return 0; + return baseAddress; + } + } + } + } + } + return 0; } void* MemManager::AllocateArrayMemory(size_t size) { - void* chunkAddress = AllocateChunkAndInitBitMap(); - ArrayMemoryInfo info; - info.memPoolListIndex = _memoryPoolList.size() - 1; - info.StartPosition = 0; - info.Size = size / sizeof(MemClass); - _arrayMemoryList[chunkAddress] = info; - SetMultipleBlockBits(&info, false); - return chunkAddress; + void* chunkAddress = AllocateChunkAndInitBitMap(); + ArrayMemoryInfo info; + info.memPoolListIndex = _memoryPoolList.size() - 1; + info.StartPosition = 0; + info.Size = size / sizeof(MemClass); + _arrayMemoryList[chunkAddress] = info; + SetMultipleBlockBits(&info, false); + return chunkAddress; } void* MemManager::AllocateChunkAndInitBitMap(void) { - BitMapEntry mapEntry; - MemClass* memoryBeginAddress = reinterpret_cast(new char[sizeof(MemClass) * BIT_MAP_SIZE]); - _memoryPoolList.push_back(memoryBeginAddress); - mapEntry.index = _memoryPoolList.size() - 1; - _bitMapEntryList.push_back(mapEntry); - return memoryBeginAddress; + BitMapEntry mapEntry; + MemClass* memoryBeginAddress = reinterpret_cast(new char[sizeof(MemClass) * BIT_MAP_SIZE]); + _memoryPoolList.push_back(memoryBeginAddress); + mapEntry.index = _memoryPoolList.size() - 1; + _bitMapEntryList.push_back(mapEntry); + return memoryBeginAddress; } void MemManager::Free(void* object) { - if(_arrayMemoryList.find(object) == _arrayMemoryList.end()) - // Simple block deletion. - SetBlockBit(object, true); - else { - // Memory block deletion. - ArrayMemoryInfo *info = &_arrayMemoryList[object]; - SetMultipleBlockBits(info, true); - } + if(_arrayMemoryList.find(object) == _arrayMemoryList.end()) + // Simple block deletion. + SetBlockBit(object, true); + else { + // Memory block deletion. + ArrayMemoryInfo *info = &_arrayMemoryList[object]; + SetMultipleBlockBits(info, true); + } } void MemManager::SetBlockBit(void* object, bool flag) { - int i = _bitMapEntryList.size() - 1; - for(; i >= 0; i--) { - BitMapEntry* bitMap = &_bitMapEntryList[i]; - if((bitMap->Head() <= object) && (&(static_cast(bitMap->Head()))[BIT_MAP_SIZE - 1] >= object)) { - int position = static_cast(object)- static_cast(bitMap->Head()); - bitMap->SetBit(position, flag); - flag ? bitMap->blocksAvailable++ : bitMap->blocksAvailable--; - } - } + int i = _bitMapEntryList.size() - 1; + for(; i >= 0; i--) { + BitMapEntry* bitMap = &_bitMapEntryList[i]; + if((bitMap->Head() <= object) && (&(static_cast(bitMap->Head()))[BIT_MAP_SIZE - 1] >= object)) { + int position = static_cast(object)- static_cast(bitMap->Head()); + bitMap->SetBit(position, flag); + flag ? bitMap->blocksAvailable++ : bitMap->blocksAvailable--; + } + } } void MemManager::SetMultipleBlockBits(ArrayMemoryInfo* info, bool flag) { - BitMapEntry* mapEntry = &_bitMapEntryList[info->memPoolListIndex]; - mapEntry->SetMultipleBits(info->StartPosition, flag, info->Size); + BitMapEntry* mapEntry = &_bitMapEntryList[info->memPoolListIndex]; + mapEntry->SetMultipleBits(info->StartPosition, flag, info->Size); } vector& MemManager::GetMemoryPoolList(void) { - return _memoryPoolList; + return _memoryPoolList; } diff --git a/src/libUnuk/Engine/WorldManager.h b/src/libUnuk/Engine/WorldManager.h index eced73e..bcb0cfa 100644 --- a/src/libUnuk/Engine/WorldManager.h +++ b/src/libUnuk/Engine/WorldManager.h @@ -30,23 +30,6 @@ public: void OnPlayerAttack(Player* player); void OnPlayerMove(Player* player); - // Overload new and delete operators to utilize MemManager. - inline void* operator new(size_t size) { - return gMemManager.Allocate(size); - } - - inline void operator delete(void* object) { - gMemManager.Free(object); - } - - inline void* operator new [](size_t size) { - return gMemManager.Allocate(size); - } - - inline void operator delete [](void* object) { - gMemManager.Free(object); - } - private: LevelGen* _level; std::list _npcs; From 50db7381947ba0027617ce4ca289c9a7f8e9a57f Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 15:18:24 +0000 Subject: [PATCH 4/8] [Change] Avoid using numerals when TILE_WIDTH and TILE_HEIGHT are defined in Unuk/Constants.h --- src/libUnuk/LevelGen/MapTile.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libUnuk/LevelGen/MapTile.cpp b/src/libUnuk/LevelGen/MapTile.cpp index 1000597..3a461d4 100644 --- a/src/libUnuk/LevelGen/MapTile.cpp +++ b/src/libUnuk/LevelGen/MapTile.cpp @@ -39,8 +39,7 @@ bool MapTile::GetSuccessors(AStarSearch* search, MapTile* parent) { } // Add tile to the right if possible - // TODO: replace 64 with map width - if(tileX < 64) { + if(tileX < TILE_WIDTH) { MapTile& successor = _level->GetTile(tileX + 1, tileY); if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { search->AddSuccessor(successor); @@ -56,8 +55,7 @@ bool MapTile::GetSuccessors(AStarSearch* search, MapTile* parent) { } // Add tile to the top if possible - // TODO: replace 64 with map height - if(tileY < 64) { + if(tileY < TILE_HEIGHT) { MapTile& successor = _level->GetTile(tileX, tileY + 1); if(successor.GetTileSolidity() || successor.GetEntitySolitity()) { search->AddSuccessor(successor); From a6bc7151d45a13c14ec0633aa33c781aa968574f Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 17:29:58 +0000 Subject: [PATCH 5/8] [Change] Updated README file. --- README | 47 +++++------------------------------------------ 1 file changed, 5 insertions(+), 42 deletions(-) diff --git a/README b/README index 5bf0e2e..d69a260 100644 --- a/README +++ b/README @@ -1,9 +1,6 @@ Readme plz! ___________ -I have decided to use Git for SCM of this project. -Please see https://github.com/Allanis/Unuk - ################################################## I am currently working on a series of algorithms to show off @@ -11,49 +8,15 @@ for a portfolio piece. I will place this under the GPL licence. ################################################## -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -TODO: +~~Instructions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*Menu: -~~~~~ -- New Game -- SaveGame loading - - New screen or make buttons appear on the menu -- SaveGame deleting -- Game Settings - - Keybindings - - Fullscreen - -*Fix NPC animation - -*Map Editor: -~~~~~~~~~~~~ - -- Change the array of tiles into a list of tiles. -- Get a tile selection marker and display the current tile info. - -*Proper collision testing. -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- MapTile objects store a list of character* 's - - The character class will add and remove themselves from the list in the MapTile. - - When the Character class wants to check for collisions it hands a pointer to - itself to the MapTile object, the MapTile will then return true if any - Character in it's list collides with the Character* it just recieved. - - Create the appropriate methods in the MapTile class - - bool CheckCollision(Character *charptr); - - void AddCharacter(Character *charptr); - - void RemoveCharacter(Character *charptr); - -*A way for entities to store information (Like items). -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- Sort out how we will read in the information - - A list of present objects that can be referenced with a single word in the map file. +Arrow keys/wasd - Move Player. +'p' - Show debug information. +'Space'/'Left Mouse' - Attack. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copyright (C) 2011 SaraCraft allanis@saracraft.net From 4b86f12f3a8dcdec68cfd65470560f205cf67dad Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 21:18:26 +0000 Subject: [PATCH 6/8] [Add] Who wants to see some magical abilities? --- Unuk-QT/Unuk-QT.pro | 6 ++---- src/libUnuk/Engine/Spells.h | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/libUnuk/Engine/Spells.h diff --git a/Unuk-QT/Unuk-QT.pro b/Unuk-QT/Unuk-QT.pro index cb08ce9..8f97244 100644 --- a/Unuk-QT/Unuk-QT.pro +++ b/Unuk-QT/Unuk-QT.pro @@ -1,5 +1,4 @@ CONFIG -= qt - LIBS += -lGL \ -lSDL \ -lSDL_ttf \ @@ -7,7 +6,6 @@ LIBS += -lGL \ -lSDL_gfx \ -ltinyxml \ -lGLU - HEADERS += ../src/Libs/wglext.h \ ../src/Libs/glxext.h \ ../src/libUnuk/Engine/WorldManager.h \ @@ -46,8 +44,8 @@ HEADERS += ../src/Libs/wglext.h \ ../src/libUnuk/System/Vec2.h \ ../src/libUnuk/System/MathBox.h \ ../src/libUnuk/Engine/Pathfinding.h \ - ../src/libUnuk/UI/SavegameMenu.h - + ../src/libUnuk/UI/SavegameMenu.h \ + ../src/libUnuk/Engine/Spells.h SOURCES += ../src/libUnuk/Engine/WorldManager.cpp \ ../src/libUnuk/Engine/ParticleEmitter.cpp \ ../src/libUnuk/Engine/NPC.cpp \ diff --git a/src/libUnuk/Engine/Spells.h b/src/libUnuk/Engine/Spells.h new file mode 100644 index 0000000..03eabc2 --- /dev/null +++ b/src/libUnuk/Engine/Spells.h @@ -0,0 +1,21 @@ +#pragma once; +#include "../../Unuk/Player.h" +#include "../System/Timer.h" +#include "ParticleEmitter.h" + +class Spells { +public: + Spells(void); + ~Spells(void); + + enum { + FIREBALL, + ICE + }; + + void CastSpell(Player* player); + +private: + Timer* _timeBetweenCast; + +}; From 45d5720e4b711f9de4ed70867f28bdfb54bde5b3 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sun, 19 Feb 2012 23:16:10 +0000 Subject: [PATCH 7/8] [Add] A little spell stuff. [Add] Woot, Rachel did the character sprite. --- Data/Media/Images/Characters/Reniesta.png | Bin 0 -> 7001 bytes Unuk-QT/Unuk-QT.pro | 3 +- src/Unuk/Game.cpp | 210 +++++++++++----------- src/Unuk/Player.cpp | 52 +++--- src/Unuk/Player.h | 60 +++---- src/libUnuk/Engine/ParticleEmitter.cpp | 82 ++++----- src/libUnuk/Engine/Spells.cpp | 17 ++ src/libUnuk/Engine/Spells.h | 7 +- src/libUnuk/Engine/WorldManager.cpp | 6 +- src/libUnuk/Engine/WorldManager.h | 1 - 10 files changed, 228 insertions(+), 210 deletions(-) create mode 100644 Data/Media/Images/Characters/Reniesta.png create mode 100644 src/libUnuk/Engine/Spells.cpp diff --git a/Data/Media/Images/Characters/Reniesta.png b/Data/Media/Images/Characters/Reniesta.png new file mode 100644 index 0000000000000000000000000000000000000000..1f3108952896bd451190008222d6dc130973108c GIT binary patch literal 7001 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 SukO1)wUp%5; literal 0 HcmV?d00001 diff --git a/Unuk-QT/Unuk-QT.pro b/Unuk-QT/Unuk-QT.pro index 8f97244..2dc0a50 100644 --- a/Unuk-QT/Unuk-QT.pro +++ b/Unuk-QT/Unuk-QT.pro @@ -79,4 +79,5 @@ SOURCES += ../src/libUnuk/Engine/WorldManager.cpp \ ../src/libUnuk/UI/EventHistory.cpp \ ../src/libUnuk/UI/Bar.cpp \ ../src/libUnuk/System/Vec2.cpp \ - ../src/libUnuk/UI/SavegameMenu.cpp + ../src/libUnuk/UI/SavegameMenu.cpp \ + ../src/libUnuk/Engine/Spells.cpp diff --git a/src/Unuk/Game.cpp b/src/Unuk/Game.cpp index a2129d5..48be3d4 100644 --- a/src/Unuk/Game.cpp +++ b/src/Unuk/Game.cpp @@ -7,7 +7,7 @@ Game::Game(void) { Debug::logger->message("Creating characters.."); _player = new Player(&_map); - _map.SetPlayer(_player); + _map.SetPlayer(_player); _runGameReturnValue = gameMainMenu; } @@ -19,29 +19,29 @@ Game::~Game(void) { } void Game::New(const string& savegameIDArg) { - _saveGameID = savegameIDArg; - NewSavegame(savegameIDArg); - - int spawnX; - int spawnY; - _map.FindSpawnPoint(spawnX, spawnY, 40, 45); - - _player->SetXY((float)spawnX, (float)spawnY); + _saveGameID = savegameIDArg; + NewSavegame(savegameIDArg); + + int spawnX; + int spawnY; + _map.FindSpawnPoint(spawnX, spawnY, 40, 45); + + _player->SetXY((float)spawnX, (float)spawnY); } void Game::Load(const string& savegameIDArg) { - _saveGameID = savegameIDArg; - LoadSavegame(savegameIDArg); - - int spawnX; - int spawnY; - _map.FindSpawnPoint(spawnX, spawnY, 40, 45); - - _player->SetXY((float)spawnX, (float)spawnY); + _saveGameID = savegameIDArg; + LoadSavegame(savegameIDArg); + + int spawnX; + int spawnY; + _map.FindSpawnPoint(spawnX, spawnY, 40, 45); + + _player->SetXY((float)spawnX, (float)spawnY); } gameNavVal_t Game::Run(void) { - _player->LoadSprites("../Data/Media/Images/Characters/Player.png", 40, 45); + _player->LoadSprites("../Data/Media/Images/Characters/Reniesta.png", 40, 45); int fps = 0; int frame = 0; @@ -252,10 +252,10 @@ void Game::Render(void) { } void Game::NewSavegame(const string savegameIDArg) { - string saveFilename = "../Save/" + savegameIDArg; + string saveFilename = "../Save/" + savegameIDArg; - _map.New(); - _map.Save(_saveGameID); + _map.New(); + _map.Save(_saveGameID); TiXmlDocument doc; @@ -266,13 +266,13 @@ void Game::NewSavegame(const string savegameIDArg) { TiXmlElement* nameElement = new TiXmlElement("name"); TiXmlText* nameText = new TiXmlText("Allanis"); //TODO: replace with _player->GetName() when it works. --konom nameElement->LinkEndChild(nameText); - - int spawnX; - int spawnY; - _map.FindSpawnPoint(spawnX, spawnY, 40, 45); - - _player->SetXY(spawnX, spawnY); - + + int spawnX; + int spawnY; + _map.FindSpawnPoint(spawnX, spawnY, 40, 45); + + _player->SetXY(spawnX, spawnY); + std::stringstream xString; xString << spawnX; @@ -286,22 +286,22 @@ void Game::NewSavegame(const string savegameIDArg) { TiXmlElement* yElement = new TiXmlElement("y"); TiXmlText* yText = new TiXmlText(yString.str().c_str()); yElement->LinkEndChild(yText); - - _player->SetLevelLiteral(1); - - TiXmlElement* levelElement = new TiXmlElement("level"); - TiXmlText* levelText = new TiXmlText("1"); - levelElement->LinkEndChild(levelText); - - _player->SetExpLiteral(0); - - TiXmlElement* expElement = new TiXmlElement("exp"); - TiXmlText* expText = new TiXmlText("0"); - expElement->LinkEndChild(expText); - - TiXmlElement* healthElement = new TiXmlElement("health"); - TiXmlText* healthText = new TiXmlText("100"); - healthElement->LinkEndChild(healthText); + + _player->SetLevelLiteral(1); + + TiXmlElement* levelElement = new TiXmlElement("level"); + TiXmlText* levelText = new TiXmlText("1"); + levelElement->LinkEndChild(levelText); + + _player->SetExpLiteral(0); + + TiXmlElement* expElement = new TiXmlElement("exp"); + TiXmlText* expText = new TiXmlText("0"); + expElement->LinkEndChild(expText); + + TiXmlElement* healthElement = new TiXmlElement("health"); + TiXmlText* healthText = new TiXmlText("100"); + healthElement->LinkEndChild(healthText); TiXmlElement* mapElement = new TiXmlElement("map"); TiXmlText* mapText = new TiXmlText("map"); //TODO: replace with actual map name. @@ -310,9 +310,9 @@ void Game::NewSavegame(const string savegameIDArg) { saveElement->LinkEndChild(nameElement); saveElement->LinkEndChild(xElement); saveElement->LinkEndChild(yElement); - saveElement->LinkEndChild(levelElement); - saveElement->LinkEndChild(expElement); - saveElement->LinkEndChild(healthElement); + saveElement->LinkEndChild(levelElement); + saveElement->LinkEndChild(expElement); + saveElement->LinkEndChild(healthElement); saveElement->LinkEndChild(mapElement); doc.LinkEndChild(decl); @@ -327,12 +327,12 @@ void Game::LoadSavegame(const string savegameIDArg) { // Converting to XML ftw! TiXmlDocument mapFile(saveFilename.c_str()); - - // Create new save if can't load file. - if(!mapFile.LoadFile()) { - New(savegameIDArg); - return; - } + + // Create new save if can't load file. + if(!mapFile.LoadFile()) { + New(savegameIDArg); + return; + } TiXmlElement* rootElem = NULL; TiXmlElement* dataElem = NULL; @@ -364,41 +364,41 @@ void Game::LoadSavegame(const string savegameIDArg) { // _player->SetXY((float)playerX, (float)playerY); */ - - // - Parse the player level. - dataElem = dataElem->NextSiblingElement("level"); - assert(dataElem != NULL); - int playerLevel = atoi(dataElem->GetText()); - // - - _player->SetLevelLiteral(playerLevel); - - // - Parse the player exp. - dataElem = dataElem->NextSiblingElement("exp"); - assert(dataElem != NULL); - int playerExp = atoi(dataElem->GetText()); - // - - _player->SetExpLiteral(playerExp); - - // - Parse the player health. - dataElem = dataElem->NextSiblingElement("health"); - assert(dataElem != NULL); - int playerHealth = atoi(dataElem->GetText()); - // - - _player->SetHealthLiteral(playerHealth); + + // - Parse the player level. + dataElem = dataElem->NextSiblingElement("level"); + assert(dataElem != NULL); + int playerLevel = atoi(dataElem->GetText()); + // + + _player->SetLevelLiteral(playerLevel); + + // - Parse the player exp. + dataElem = dataElem->NextSiblingElement("exp"); + assert(dataElem != NULL); + int playerExp = atoi(dataElem->GetText()); + // + + _player->SetExpLiteral(playerExp); + + // - Parse the player health. + dataElem = dataElem->NextSiblingElement("health"); + assert(dataElem != NULL); + int playerHealth = atoi(dataElem->GetText()); + // + + _player->SetHealthLiteral(playerHealth); } // // - - _map.Load(_saveGameID); + + _map.Load(_saveGameID); } void Game::SaveSavegame(void) { string saveFilename = "../Save/" + _saveGameID; - + TiXmlDocument doc; TiXmlDeclaration* decl = new TiXmlDeclaration("1.0", "", ""); @@ -425,38 +425,38 @@ void Game::SaveSavegame(void) { yElement->LinkEndChild(yText); */ - std::stringstream levelString; - levelString << _player->GetLevel(); - - TiXmlElement* levelElement = new TiXmlElement("level"); - TiXmlText* levelText = new TiXmlText(levelString.str().c_str()); - levelElement->LinkEndChild(levelText); - - std::stringstream expString; - expString << _player->GetExp(); - - TiXmlElement* expElement = new TiXmlElement("exp"); - TiXmlText* expText = new TiXmlText(expString.str().c_str()); - expElement->LinkEndChild(expText); - - std::stringstream healthString; - healthString << _player->GetHealth(); - - TiXmlElement* healthElement = new TiXmlElement("health"); - TiXmlText* healthText = new TiXmlText(healthString.str().c_str()); - healthElement->LinkEndChild(healthText); + std::stringstream levelString; + levelString << _player->GetLevel(); + + TiXmlElement* levelElement = new TiXmlElement("level"); + TiXmlText* levelText = new TiXmlText(levelString.str().c_str()); + levelElement->LinkEndChild(levelText); + + std::stringstream expString; + expString << _player->GetExp(); + + TiXmlElement* expElement = new TiXmlElement("exp"); + TiXmlText* expText = new TiXmlText(expString.str().c_str()); + expElement->LinkEndChild(expText); + + std::stringstream healthString; + healthString << _player->GetHealth(); + + TiXmlElement* healthElement = new TiXmlElement("health"); + TiXmlText* healthText = new TiXmlText(healthString.str().c_str()); + healthElement->LinkEndChild(healthText); saveElement->LinkEndChild(nameElement); //saveElement->LinkEndChild(xElement); //saveElement->LinkEndChild(yElement); - saveElement->LinkEndChild(levelElement); - saveElement->LinkEndChild(expElement); - saveElement->LinkEndChild(healthElement); + saveElement->LinkEndChild(levelElement); + saveElement->LinkEndChild(expElement); + saveElement->LinkEndChild(healthElement); doc.LinkEndChild(decl); doc.LinkEndChild(saveElement); doc.SaveFile(saveFilename.c_str()); - - _map.Save(_saveGameID); + + _map.Save(_saveGameID); } diff --git a/src/Unuk/Player.cpp b/src/Unuk/Player.cpp index 900ee97..36e5baa 100644 --- a/src/Unuk/Player.cpp +++ b/src/Unuk/Player.cpp @@ -17,23 +17,23 @@ const int Player::EXP_TABLE[MAX_LEVEL] = { 2000, 3500, 5000, - 6500, - 8500, - 10250, - 12000, - 15000, - 25000, - 50000, - 65000, - 80000, - 100000 + 6500, + 8500, + 10250, + 12000, + 15000, + 25000, + 50000, + 65000, + 80000, + 100000 }; Player::Player(LevelGen *mapArg) : Character(mapArg) { _level = 1; _exp = 0; - _lastTileX = 0; - _lastTileY = 0; + _lastTileX = 0; + _lastTileY = 0; } Player::~Player(void) { @@ -101,14 +101,14 @@ void Player::Update(void) { // For now The camera will be static. //SetCamera(); - int tileX = x / TILE_WIDTH; - int tileY = y / TILE_HEIGHT; - if(tileX != _lastTileX || tileY != _lastTileY) { - _lastTileX = tileX; - _lastTileY = tileY; - - map->GetWorld().OnPlayerMove(this); - } + int tileX = x / TILE_WIDTH; + int tileY = y / TILE_HEIGHT; + if(tileX != _lastTileX || tileY != _lastTileY) { + _lastTileX = tileX; + _lastTileY = tileY; + + map->GetWorld().OnPlayerMove(this); + } _healthBar.SetProgress((float)GetHealth() / 100.0f); } @@ -133,8 +133,8 @@ void Player::SetCamera(void) { } void Player::Move() { - map->MoveIfPossible(this, xVel, yVel, true); - Character::HealthBarScroll(); + map->MoveIfPossible(this, xVel, yVel, true); + Character::HealthBarScroll(); } void Player::SetLevel(int level) { @@ -143,10 +143,10 @@ void Player::SetLevel(int level) { if(_exp < 0) { _exp = 0; } - if(_level == MAX_LEVEL) { - eventHistory->LogEvent("YOU BEAT IT! I'M SO PROUD!"); - eventHistory->LogEvent("*Sheds Tear*"); - } + if(_level == MAX_LEVEL) { + eventHistory->LogEvent("YOU BEAT IT! I'M SO PROUD!"); + eventHistory->LogEvent("*Sheds Tear*"); + } } void Player::SetExp(int exp) { diff --git a/src/Unuk/Player.h b/src/Unuk/Player.h index a5bf7f4..253ee06 100644 --- a/src/Unuk/Player.h +++ b/src/Unuk/Player.h @@ -4,46 +4,46 @@ #include "Globals.h" #include "Constants.h" #include "../libUnuk/Engine/Character.h" -#include "../libUnuk//System/Debug.h" +#include "../libUnuk/System/Debug.h" class Player : public Character { public: - Player(LevelGen* mapArg); - ~Player(void); + Player(LevelGen* mapArg); + ~Player(void); - void HandleInput(void); - void Update(void); + void HandleInput(void); + void Update(void); - void SetName(string nameArg); - string GetName(void) { return _name; } - - void SetLevel(int level); - int GetLevel(void) { return _level; } + void SetName(string nameArg); + string GetName(void) { return _name; } - void SetExp(int exp); - int GetExp(void) { return _exp; } - - void SetLevelLiteral(int level) { _level = level; } - void SetExpLiteral(int exp) { _exp = exp; } - void SetHealthLiteral(int health) { _health = health; } + void SetLevel(int level); + int GetLevel(void) { return _level; } + + void SetExp(int exp); + int GetExp(void) { return _exp; } + + void SetLevelLiteral(int level) { _level = level; } + void SetExpLiteral(int exp) { _exp = exp; } + void SetHealthLiteral(int health) { _health = health; } + + void SetXY(float xArg, float yArg) { x = xArg, y = yArg; _lastTileX = xArg / TILE_WIDTH; _lastTileY = yArg / TILE_HEIGHT; } + + static const int MAX_LEVEL = 20; + static const int EXP_TABLE[MAX_LEVEL]; - void SetXY(float xArg, float yArg) { x = xArg, y = yArg; _lastTileX = xArg / TILE_WIDTH; _lastTileY = yArg / TILE_HEIGHT; } - - static const int MAX_LEVEL = 20; - static const int EXP_TABLE[MAX_LEVEL]; - protected: - void Move(void); - void CheckTileCollisions(void); + void Move(void); + void CheckTileCollisions(void); private: - void SetCamera(void); - static const float PLAYER_SPEED; + void SetCamera(void); + static const float PLAYER_SPEED; - string _name; - int _level; - int _exp; + string _name; + int _level; + int _exp; - int _lastTileX; - int _lastTileY; + int _lastTileX; + int _lastTileY; }; diff --git a/src/libUnuk/Engine/ParticleEmitter.cpp b/src/libUnuk/Engine/ParticleEmitter.cpp index b029fab..7b492c2 100644 --- a/src/libUnuk/Engine/ParticleEmitter.cpp +++ b/src/libUnuk/Engine/ParticleEmitter.cpp @@ -9,72 +9,72 @@ ParticleEmitter::~ParticleEmitter(void) { } void ParticleEmitter::SetXY(int xArg, int yArg) { - x = xArg; - y = yArg; + x = xArg; + y = yArg; } void ParticleEmitter::ForceXY(int xArg, int yArg) { - for(int i = 0; i < _particleCount; i++) { - m_particle[i].x = (float)xArg; - m_particle[i].y = (float)yArg; - } + for(int i = 0; i < _particleCount; i++) { + m_particle[i].x = (float)xArg; + m_particle[i].y = (float)yArg; + } } void ParticleEmitter::SetParticleCount(int countArg) { - _particleCount = countArg; - m_particle.resize(_particleCount); + _particleCount = countArg; + m_particle.resize(_particleCount); - for(int i = 0; i < _particleCount; i++) { - m_particle[i].startTime = SDL_GetTicks(); - } + for(int i = 0; i < _particleCount; i++) { + m_particle[i].startTime = SDL_GetTicks(); + } } void ParticleEmitter::SetParticleSpeed(float speedArg) { - _particleSpeed = speedArg; + _particleSpeed = speedArg; } void ParticleEmitter::SetParticleType(string typeArg) { - if(!_particleTexture) { - SDL_FreeSurface(_particleTexture); - } + if(!_particleTexture) { + SDL_FreeSurface(_particleTexture); + } - string textureFilename = "../Data/Media/Images/Particles/" + typeArg + ".png"; - _particleTexture = LoadImageAlpha(textureFilename.c_str()); + string textureFilename = "../../Data/Media/Images/Particles/" + typeArg + ".png"; + _particleTexture = LoadImageAlpha(textureFilename.c_str()); } void ParticleEmitter::SetParticleLifetime(int lifetimeArg) { - _particleLifetime = lifetimeArg; + _particleLifetime = lifetimeArg; - for(int i = 0; i < _particleCount; i++) { - m_particle[i].lifetime = rand() % _particleLifetime + _particleLifetime / 4; - } + for(int i = 0; i < _particleCount; i++) { + m_particle[i].lifetime = rand() % _particleLifetime + _particleLifetime / 4; + } } void ParticleEmitter::Render(void) { - for(int i = 0; i < _particleCount; i++) { - ApplySurface((int)m_particle[i].x, (int)m_particle[i].y, _particleTexture, screen); - } + for(int i = 0; i < _particleCount; i++) { + ApplySurface((int)m_particle[i].x, (int)m_particle[i].y, _particleTexture, screen); + } } void ParticleEmitter::Update(void) { - for(int i = 0; i < _particleCount; i++) { - if((int)SDL_GetTicks() - m_particle[i].startTime > m_particle[i].lifetime) { - // Reset the x and y coords. - m_particle[i].x = (float)x; - m_particle[i].y = (float)y; + for(int i = 0; i < _particleCount; i++) { + if((int)SDL_GetTicks() - m_particle[i].startTime > m_particle[i].lifetime) { + // Reset the x and y coords. + m_particle[i].x = (float)x; + m_particle[i].y = (float)y; - m_particle[i].xVel = (float)(rand() % 360); - m_particle[i].yVel = (float)(rand() % 360); + m_particle[i].xVel = (float)(rand() % 360); + m_particle[i].yVel = (float)(rand() % 360); - if(rand() % 2) - m_particle[i].xVel = m_particle[i].xVel * -1.0f; - if(rand() % 2) - m_particle[i].yVel = m_particle[i].yVel * -1.0f; + if(rand() % 2) + m_particle[i].xVel = m_particle[i].xVel * -1.0f; + if(rand() % 2) + m_particle[i].yVel = m_particle[i].yVel * -1.0f; - m_particle[i].startTime = SDL_GetTicks(); - } else { - m_particle[i].x += m_particle[i].xVel * _particleSpeed; - m_particle[i].y += m_particle[i].yVel * _particleSpeed; - } - } + m_particle[i].startTime = SDL_GetTicks(); + } else { + m_particle[i].x += m_particle[i].xVel * _particleSpeed; + m_particle[i].y += m_particle[i].yVel * _particleSpeed; + } + } } diff --git a/src/libUnuk/Engine/Spells.cpp b/src/libUnuk/Engine/Spells.cpp new file mode 100644 index 0000000..9de8469 --- /dev/null +++ b/src/libUnuk/Engine/Spells.cpp @@ -0,0 +1,17 @@ +#include "Spells.h" + +Spells::Spells(void) { + +} + +Spells::~Spells(void) { + +} + +void Spells::CastSpell() { + +} + +void Spells::Render(void) { + //_particle->Render(); +} diff --git a/src/libUnuk/Engine/Spells.h b/src/libUnuk/Engine/Spells.h index 03eabc2..b7fc547 100644 --- a/src/libUnuk/Engine/Spells.h +++ b/src/libUnuk/Engine/Spells.h @@ -1,4 +1,4 @@ -#pragma once; +#pragma once #include "../../Unuk/Player.h" #include "../System/Timer.h" #include "ParticleEmitter.h" @@ -13,9 +13,10 @@ public: ICE }; - void CastSpell(Player* player); + void CastSpell(/*Player* player*/); + void Render(void); private: Timer* _timeBetweenCast; - + ParticleEmitter* _particle; }; diff --git a/src/libUnuk/Engine/WorldManager.cpp b/src/libUnuk/Engine/WorldManager.cpp index b9f164b..3a0399f 100644 --- a/src/libUnuk/Engine/WorldManager.cpp +++ b/src/libUnuk/Engine/WorldManager.cpp @@ -187,7 +187,7 @@ void WorldManager::OnPlayerAttack(Player* player) { } void WorldManager::OnPlayerMove(Player* player) { - for(std::list::iterator i = _npcs.begin(); i != _npcs.end(); ++i) { - (*i)->OnPlayerMove(player); - } + for(std::list::iterator i = _npcs.begin(); i != _npcs.end(); ++i) { + (*i)->OnPlayerMove(player); + } } diff --git a/src/libUnuk/Engine/WorldManager.h b/src/libUnuk/Engine/WorldManager.h index bcb0cfa..9ef2132 100644 --- a/src/libUnuk/Engine/WorldManager.h +++ b/src/libUnuk/Engine/WorldManager.h @@ -1,7 +1,6 @@ #pragma once #include #include "MemClass.h" - class Character; class NPC; class Player; From 8e81f3aa868bbba58e2dd7d1406dc57efd89b579 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Mon, 20 Feb 2012 19:34:14 +0000 Subject: [PATCH 8/8] [Fix] Fixed character sheet's animation sequence. --- Data/Media/Images/Characters/Reniesta.png | Bin 7001 -> 7130 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Data/Media/Images/Characters/Reniesta.png b/Data/Media/Images/Characters/Reniesta.png index 1f3108952896bd451190008222d6dc130973108c..5dc7b92a6149e394b8877860637ba7767e0c8489 100644 GIT binary patch literal 7130 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 SukO1)wUp%5;