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:
commit
2e50097502
BIN
Data/Media/Images/Characters/Reniesta.png
Normal file
BIN
Data/Media/Images/Characters/Reniesta.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.0 KiB |
47
README
47
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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
17
src/libUnuk/Engine/Spells.cpp
Normal file
17
src/libUnuk/Engine/Spells.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "Spells.h"
|
||||
|
||||
Spells::Spells(void) {
|
||||
|
||||
}
|
||||
|
||||
Spells::~Spells(void) {
|
||||
|
||||
}
|
||||
|
||||
void Spells::CastSpell() {
|
||||
|
||||
}
|
||||
|
||||
void Spells::Render(void) {
|
||||
//_particle->Render();
|
||||
}
|
22
src/libUnuk/Engine/Spells.h
Normal file
22
src/libUnuk/Engine/Spells.h
Normal 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;
|
||||
};
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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);
|
||||
|
66
src/libUnuk/LevelGen/MapTile.cpp
Normal file
66
src/libUnuk/LevelGen/MapTile.cpp
Normal 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;
|
||||
}
|
@ -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;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user