Merge branch 'master' of github.com:Allanis/Unuk

Conflicts:
	src/libUnuk/Engine/NPC.cpp
	src/libUnuk/LevelGen/LevelGen.h
	src/libUnuk/LevelGen/MapTile.cpp
	src/libUnuk/LevelGen/MapTile.h
This commit is contained in:
Tamir Atias 2012-02-20 22:06:14 +02:00
commit 2e50097502
18 changed files with 574 additions and 504 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

47
README
View File

@ -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

View File

@ -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 \
@ -47,8 +45,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 \
@ -82,4 +80,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

View File

@ -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) {
// </y>
_player->SetXY((float)playerX, (float)playerY);
*/
// <level> - Parse the player level.
dataElem = dataElem->NextSiblingElement("level");
assert(dataElem != NULL);
int playerLevel = atoi(dataElem->GetText());
// </level>
_player->SetLevelLiteral(playerLevel);
// <exp> - Parse the player exp.
dataElem = dataElem->NextSiblingElement("exp");
assert(dataElem != NULL);
int playerExp = atoi(dataElem->GetText());
// </exp>
_player->SetExpLiteral(playerExp);
// <health> - Parse the player health.
dataElem = dataElem->NextSiblingElement("health");
assert(dataElem != NULL);
int playerHealth = atoi(dataElem->GetText());
// </health>
_player->SetHealthLiteral(playerHealth);
// <level> - Parse the player level.
dataElem = dataElem->NextSiblingElement("level");
assert(dataElem != NULL);
int playerLevel = atoi(dataElem->GetText());
// </level>
_player->SetLevelLiteral(playerLevel);
// <exp> - Parse the player exp.
dataElem = dataElem->NextSiblingElement("exp");
assert(dataElem != NULL);
int playerExp = atoi(dataElem->GetText());
// </exp>
_player->SetExpLiteral(playerExp);
// <health> - Parse the player health.
dataElem = dataElem->NextSiblingElement("health");
assert(dataElem != NULL);
int playerHealth = atoi(dataElem->GetText());
// </health>
_player->SetHealthLiteral(playerHealth);
}
// <save>
// </save>
_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);
}

View File

@ -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;
};

View File

@ -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) {

View File

@ -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;
};

View File

@ -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);

View File

@ -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<MemClass*>(Head()) + (pos / INT_SIZE)) [INT_SIZE - (pos % INT_SIZE + 1)]);
SetBit(pos, false);
return &((static_cast<MemClass*>(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<BitMapEntry*>::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<void*, ArrayMemoryInfo>::iterator infoI = _arrayMemoryList.begin();
map<void*, ArrayMemoryInfo>::iterator infoEndI = _arrayMemoryList.end();
// None array.
if(size == sizeof(MemClass)) {
set<BitMapEntry*>::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<void*, ArrayMemoryInfo>::iterator infoI = _arrayMemoryList.begin();
map<void*, ArrayMemoryInfo>::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<MemClass*>(_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<MemClass*>(_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<MemClass*>(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<MemClass*>(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<MemClass*>(bitMap->Head()))[BIT_MAP_SIZE - 1] >= object)) {
int position = static_cast<MemClass*>(object)- static_cast<MemClass*>(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<MemClass*>(bitMap->Head()))[BIT_MAP_SIZE - 1] >= object)) {
int position = static_cast<MemClass*>(object)- static_cast<MemClass*>(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<void*>& MemManager::GetMemoryPoolList(void) {
return _memoryPoolList;
return _memoryPoolList;
}

View File

@ -17,17 +17,17 @@ void NPC::ForceMove(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) {

View File

@ -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;
}
}
}

View File

@ -0,0 +1,17 @@
#include "Spells.h"
Spells::Spells(void) {
}
Spells::~Spells(void) {
}
void Spells::CastSpell() {
}
void Spells::Render(void) {
//_particle->Render();
}

View File

@ -0,0 +1,22 @@
#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*/);
void Render(void);
private:
Timer* _timeBetweenCast;
ParticleEmitter* _particle;
};

View File

@ -188,7 +188,7 @@ void WorldManager::OnPlayerAttack(Player* player) {
}
void WorldManager::OnPlayerMove(Player* player) {
for(std::list<NPC*>::iterator i = _npcs.begin(); i != _npcs.end(); ++i) {
(*i)->OnPlayerMove(player);
}
for(std::list<NPC*>::iterator i = _npcs.begin(); i != _npcs.end(); ++i) {
(*i)->OnPlayerMove(player);
}
}

View File

@ -1,6 +1,6 @@
#pragma once
#include <list>
#include "MemClass.h"
class Character;
class NPC;
class Player;
@ -10,26 +10,26 @@ 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);
private:
LevelGen* _level;
std::list<NPC*> _npcs;
LevelGen* _level;
std::list<NPC*> _npcs;
};

View File

@ -15,6 +15,7 @@
#include "../LevelGen/AStarTile.h"
#include "../System/Debug.h"
#include "../Engine/WorldManager.h"
#include "../Engine/MemClass.h"
using namespace std;
class Character;
@ -53,8 +54,8 @@ public:
WorldManager& GetWorld(void) { return _world; }
void SetPlayer(Player* player) { _player = player; }
void SetPlayer(Player* player) { _player = player; }
private:
void Unload(void);
void DoMagic(void);

View File

@ -0,0 +1,66 @@
#include "MapTile.h"
#include "LevelGen.h"
MapTile::MapTile(const MapTile& source) {
_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());
}
bool MapTile::IsGoal(MapTile& tile) {
return IsSameState(tile);
}
float MapTile::GoalDistanceEstimate(MapTile& goal) {
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;
}
bool MapTile::GetSuccessors(AStarSearch<MapTile>* 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);
}
}
// Add tile to the right if possible
if(tileX < TILE_WIDTH) {
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 top if possible
if(tileY < TILE_HEIGHT) {
MapTile& successor = _level->GetTile(tileX, tileY + 1);
if(successor.GetTileSolidity() || successor.GetEntitySolitity()) {
search->AddSuccessor(successor);
}
}
return true;
}

View File

@ -14,7 +14,7 @@ public:
MapTile(void) { }
~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; }
@ -29,29 +29,30 @@ public:
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(); }
// 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(); }
// ZLevel Mutators.
void SetZLevel(int arg) { _zLevel = arg; }
int GetZLevel(void) { return _zLevel; }
void SetZLevel(int arg) { _zLevel = arg; }
int GetZLevel(void) { return _zLevel; }
private:
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;
};