map position, skills

This commit is contained in:
Henrique 2011-08-29 22:34:00 -03:00
parent 00484b96c8
commit 33573e957d
5 changed files with 70 additions and 46 deletions

View File

@ -75,6 +75,23 @@ namespace Otc
SpriteNoMask = 255
};
enum Skill {
Fist = 0,
Club,
Sword,
Axe,
Distance,
Shielding,
Fishing,
LastSkill
};
enum SkillType {
SkillLevel,
SkillPercent,
LastSkillType
};
enum Direction {
North = 0,
East,

View File

@ -36,11 +36,16 @@ public:
void setCanReportBugs(uint8 canReportBugs) { m_canReportBugs = (canReportBugs != 0); }
bool getCanReportBugs() { return m_canReportBugs; }
void setSkill(Otc::Skill skill, Otc::SkillType skillType, int value) { m_skills[skill][skillType] = value; }
int getSkill(Otc::Skill skill, Otc::SkillType skillType) { return m_skills[skill][skillType]; }
LocalPlayerPtr asLocalPlayer() { return std::static_pointer_cast<LocalPlayer>(shared_from_this()); }
private:
uint16 m_drawSpeed;
bool m_canReportBugs;
int m_skills[Otc::LastSkill][Otc::LastSkillType];
};
#endif

View File

@ -38,14 +38,13 @@ void Map::draw(const Rect& rect)
m_framebuffer->bind();
LocalPlayerPtr player = g_game.getLocalPlayer();
Position playerPos = player->getPosition();
int walkOffsetX = player->getWalkOffsetX();
int walkOffsetY = player->getWalkOffsetY();
// player is above 7
int drawFloorStop = 0;
if(playerPos.z <= 7) {
if(m_centralPosition.z <= 7) {
// player pos it 8-6. check if we can draw upper floors.
@ -64,9 +63,9 @@ void Map::draw(const Rect& rect)
// if we have something covering us, dont show floors above.
for(int jz = 6; jz >= 0; --jz) {
Position coverPos = Position(playerPos.x+(7-jz)-1, playerPos.y+(7-jz)-1, jz);
Position coverPos = Position(m_centralPosition.x+(7-jz)-1, m_centralPosition.y+(7-jz)-1, jz);
if(const TilePtr& tile = m_tiles[coverPos]) {
if(tile->getStackSize(3) > 0 && jz < playerPos.z) {
if(tile->getStackSize(3) > 0 && jz < m_centralPosition.z) {
drawFloorStop = jz;
break;
}
@ -80,11 +79,11 @@ void Map::draw(const Rect& rect)
// +1 in draws cause 64x64 items may affect view.
for(int step = 0; step < 2; ++step) {
for(int ix = -8+(playerPos.z-iz); ix < + 8+7; ++ix) {
for(int iy = -6+(playerPos.z-iz); iy < + 6+7; ++iy) {
Position itemPos = Position(playerPos.x + ix, playerPos.y + iy, iz);
for(int ix = -8+(m_centralPosition.z-iz); ix < + 8+7; ++ix) {
for(int iy = -6+(m_centralPosition.z-iz); iy < + 6+7; ++iy) {
Position itemPos = Position(m_centralPosition.x + ix, m_centralPosition.y + iy, iz);
if(const TilePtr& tile = m_tiles[itemPos])
tile->draw((ix + 7 - (playerPos.z-iz))*32 - walkOffsetX, (iy + 5 - (playerPos.z-iz))*32 - walkOffsetY, step);
tile->draw((ix + 7 - (m_centralPosition.z-iz))*32 - walkOffsetX, (iy + 5 - (m_centralPosition.z-iz))*32 - walkOffsetY, step);
}
}
}
@ -107,7 +106,7 @@ void Map::draw(const Rect& rect)
// draw player names and health bars
for(int ix = -7; ix <= 7; ++ix) {
for(int iy = -5; iy <= 5; ++iy) {
Position itemPos = Position(playerPos.x + ix, playerPos.y + iy, playerPos.z);
Position itemPos = Position(m_centralPosition.x + ix, m_centralPosition.y + iy, m_centralPosition.z);
if(const TilePtr& tile = m_tiles[itemPos]) {
auto& creatures = tile->getCreatures();
for(auto it = creatures.rbegin(), end = creatures.rend(); it != end; ++it) {
@ -125,7 +124,7 @@ void Map::draw(const Rect& rect)
// TODO: create isCovered function.
bool useGray = (drawFloorStop != playerPos.z-1);
bool useGray = (drawFloorStop != m_centralPosition.z-1);
creature->drawInformation(x*horizontalStretchFactor, y*verticalStretchFactor, useGray);
}

View File

@ -42,6 +42,9 @@ public:
void setLight(const Light& light) { m_light = light; }
Light getLight() { return m_light; }
void setCentralPosition(const Position& centralPosition) { m_centralPosition = centralPosition; }
Position getCentralPosition() { return m_centralPosition; }
CreaturePtr getCreatureById(uint32 id);
void removeCreatureById(uint32 id);
@ -50,6 +53,7 @@ private:
std::map<uint32, CreaturePtr> m_creatures;
Light m_light;
Position m_centralPosition;
FrameBufferPtr m_framebuffer;

View File

@ -307,32 +307,44 @@ void ProtocolGame::parseCanReportBugs(InputMessage& msg)
void ProtocolGame::parseMapDescription(InputMessage& msg)
{
Position pos = parsePosition(msg);
m_localPlayer->setPosition(pos);
g_map.setCentralPosition(pos);
setMapDescription(msg, pos.x - 8, pos.y - 6, pos.z, 18, 14);
}
void ProtocolGame::parseMoveNorth(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
Position pos = g_map.getCentralPosition();
pos.y--;
setMapDescription(msg, pos.x - 8, pos.y - 6, pos.z, 18, 1);
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseMoveEast(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
Position pos = g_map.getCentralPosition();
pos.x++;
setMapDescription(msg, pos.x + 9, pos.y - 6, pos.z, 1, 14);
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseMoveSouth(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
Position pos = g_map.getCentralPosition();
pos.y++;
setMapDescription(msg, pos.x - 8, pos.y + 7, pos.z, 18, 1);
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseMoveWest(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
Position pos = g_map.getCentralPosition();
pos.x--;
setMapDescription(msg, pos.x - 8, pos.y - 6, pos.z, 1, 14);
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseUpdateTile(InputMessage& msg)
@ -640,26 +652,9 @@ void ProtocolGame::parsePlayerStats(InputMessage& msg)
void ProtocolGame::parsePlayerSkills(InputMessage& msg)
{
msg.getU8(); // fist skill
msg.getU8(); // fist percent
msg.getU8(); // club skill
msg.getU8(); // club percent
msg.getU8(); // sword skill
msg.getU8(); // sword percent
msg.getU8(); // axe skill
msg.getU8(); // axe percent
msg.getU8(); // distance skill
msg.getU8(); // distance percent
msg.getU8(); // shielding skill
msg.getU8(); // shielding percent
msg.getU8(); // fishing skill
msg.getU8(); // fishing percent
for(int skill = 0; skill < Otc::LastSkill; skill++)
for(int skillType = 0; skillType < Otc::LastSkillType; skillType++)
m_localPlayer->setSkill((Otc::Skill)skill, (Otc::SkillType)skillType, msg.getU8());
}
void ProtocolGame::parsePlayerIcons(InputMessage& msg)
@ -773,25 +768,29 @@ void ProtocolGame::parseCancelWalk(InputMessage& msg)
void ProtocolGame::parseFloorChangeUp(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
logDebug("[ProtocolGame::parseFloorChangeUp]: This function has never been tested.");
Position pos = g_map.getCentralPosition();
pos.z--;
int32 skip = 0;
if(m_localPlayer->getPosition().z == 7)
if(pos.z == 7)
for(int32 i = 5; i >= 0; i--)
setFloorDescription(msg, pos.x - 8, pos.y - 6, i, 18, 14, 8 - i, &skip);
else if(m_localPlayer->getPosition().z > 7)
else if(pos.z > 7)
setFloorDescription(msg, pos.x - 8, pos.y - 6, pos.z - 2, 18, 14, 3, &skip);
//pos.x++;
//pos.y++;
//m_localPlayer->setPosition(pos);
pos.x++;
pos.y++;
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseFloorChangeDown(InputMessage& msg)
{
Position pos = m_localPlayer->getPosition();
//pos.z++;
logDebug("[ProtocolGame::parseFloorChangeDown]: This function has never been tested.");
Position pos = g_map.getCentralPosition();
pos.z++;
int skip = 0;
if(pos.z == 8) {
@ -802,9 +801,9 @@ void ProtocolGame::parseFloorChangeDown(InputMessage& msg)
else if(pos.z > 8 && pos.z < 14)
setFloorDescription(msg, pos.x - 8, pos.y - 6, pos.z + 2, 18, 14, -3, &skip);
//pos.x--;
//pos.y--;
//m_localPlayer->setPosition(pos);
pos.x--;
pos.y--;
g_map.setCentralPosition(pos);
}
void ProtocolGame::parseOutfitWindow(InputMessage& msg)