This commit is contained in:
Eduardo Bart 2011-08-11 22:44:00 -03:00
commit f78d1c91b0
15 changed files with 133 additions and 27 deletions

View File

@ -9,6 +9,7 @@
#include <script/luainterface.h>
#include <net/connection.h>
#include <../game.h>
#include <../item.h>
Engine g_engine;
@ -97,7 +98,15 @@ void Engine::run()
defaultFont->renderText(fpsText, Point(g_graphics.getScreenSize().width() - fpsTextSize.width() - 10, 10));
// todo remove. render map
g_game.getMap()->draw(0, 0, g_graphics.getScreenSize().width(), g_graphics.getScreenSize().height());
g_game.getMap()->draw(0, 0);
// todo remove. view items
static Item *item = NULL;
if(!item) {
item = new Item();
item->setId(8377);
}
//item->draw(1, 1, 7);
g_graphics.endRender();
@ -129,4 +138,18 @@ void Engine::onResize(const Size& size)
void Engine::onInputEvent(const InputEvent& event)
{
UIContainer::getRoot()->onInputEvent(event);
ProtocolGame *protocol = g_game.getProtocol();
if(protocol) {
if(event.type == EV_KEY_DOWN) {
if(event.keycode == KC_UP)
protocol->sendWalkNorth();
if(event.keycode == KC_RIGHT)
protocol->sendWalkEast();
if(event.keycode == KC_DOWN)
protocol->sendWalkSouth();
if(event.keycode == KC_LEFT)
protocol->sendWalkWest();
}
}
}

View File

@ -29,6 +29,7 @@ public:
uint8* getBuffer() { return m_buffer; }
uint16 getMessageSize() { return m_messageSize; }
void setMessageSize(uint16 messageSize) { m_messageSize = messageSize; }
void setWritePos(uint16 writePos) { m_writePos = writePos; }
private:

View File

@ -125,6 +125,13 @@ void Protocol::xteaEncrypt(OutputMessage& outputMessage)
{
uint16 messageLength = outputMessage.getMessageSize();
memmove(outputMessage.getBuffer() + OutputMessage::DATA_POS + 2, outputMessage.getBuffer() + OutputMessage::DATA_POS, messageLength);
*(uint16*)(outputMessage.getBuffer() + OutputMessage::DATA_POS) = messageLength;
messageLength += 2;
outputMessage.setMessageSize(messageLength);
outputMessage.setWritePos(messageLength + OutputMessage::DATA_POS);
//add bytes until reach 8 multiple
if((messageLength % 8) != 0) {
uint16 n = 8 - (messageLength % 8);
@ -133,7 +140,7 @@ void Protocol::xteaEncrypt(OutputMessage& outputMessage)
}
int readPos = 0;
uint32 *buffer = (uint32*)outputMessage.getBuffer() + OutputMessage::DATA_POS;
uint32 *buffer = (uint32*)(outputMessage.getBuffer() + OutputMessage::DATA_POS);
while(readPos < messageLength / 4) {
uint32 v0 = buffer[readPos], v1 = buffer[readPos + 1];
uint32 delta = 0x61C88647;

View File

@ -4,16 +4,21 @@
#include <global.h>
#include "map.h"
#include "player.h"
#include "protocolgame.h"
class Game
{
public:
void setProtocol(ProtocolGame *protocolGame) { m_protocolGame = protocolGame; }
ProtocolGame *getProtocol() { return m_protocolGame; }
Map *getMap() { return &m_map; }
Player *getPlayer() { return &m_player; }
private:
Map m_map;
Player m_player;
ProtocolGame *m_protocolGame;
};

View File

@ -50,12 +50,26 @@ Item::Item()
m_type = Thing::TYPE_ITEM;
}
void Item::draw(int x, int y)
void Item::draw(int x, int y, int z)
{
ItemAttributes *itemAttributes = g_tibiaDat.getItemAttributes(m_id);
int cDivX = 0, cDivY = 0, cDivZ = 0, cAnim = 0;
if(itemAttributes->group == ITEM_GROUP_SPLASH || itemAttributes->group == ITEM_GROUP_FLUID || itemAttributes->stackable) {
//cDivX = subType % itemAttributes->xdiv;
//cDivY = subType / itemAttributes->xdiv;
}
else if(!itemAttributes->moveable) {
cDivX = x % itemAttributes->xdiv;
cDivY = y % itemAttributes->ydiv;
cDivZ = z % itemAttributes->zdiv;
}
x *= 32;
y *= 32;
z = (7-z)*32;
for(int b = 0; b < itemAttributes->blendframes; b++) {
for(int yi = 0; yi < itemAttributes->height; yi++) {
for(int xi = 0; xi < itemAttributes->width; xi++) {
@ -72,7 +86,8 @@ void Item::draw(int x, int y)
TexturePtr data = g_tibiaSpr.getSprite(itemId);
// todo verify this to draw in correct pos (screenX, screenY)
g_graphics.drawTexturedRect(Rect(x - xi*32 - 32, y - yi*32 - 32, 32, 32), data, Rect(0, 0, 32, 32));
g_graphics.drawTexturedRect(Rect(x - xi*32 - z + 32, y - yi*32 - z + 32, 32, 32), data, Rect(0, 0, 32, 32));
g_graphics.drawBoundingRect(Rect(x - xi*32 - z + 32, y - yi*32 - z + 32, 32, 32));
}
}
}

View File

@ -41,7 +41,7 @@ class Item : virtual public Thing
public:
Item();
void draw(int x, int y);
void draw(int x, int y, int z);
void setId(uint16 id) { m_id = id; }
uint16 getId() const { return m_id; }

View File

@ -1,7 +1,7 @@
#include "map.h"
#include "game.h"
void Map::draw(int x, int y, int width, int heigth)
void Map::draw(int x, int y)
{
if(!m_framebuffer)
m_framebuffer = FrameBufferPtr(new FrameBuffer(19*32, 15*32));
@ -13,7 +13,7 @@ void Map::draw(int x, int y, int width, int heigth)
for(int iy = 0; iy < 15; ++iy) {
if(playerPos.getZ() >= 7) {
for(int iz = 7; iz > 0; --iz) {
m_map[ix][iy][iz].draw(x+ix*32-(7-iz)*32, y+iy*32-(7-iz)*32);
m_map[ix][iy][iz].draw(x+ix, y+iy, iz);
}
}
}
@ -35,6 +35,6 @@ void Map::addThing(Thing *thing, const Position& pos)
if(relativePos.getZ() >= 15)
logDebug("relativePos is invalid.");
logDebug("x: ", (int)relativePos.getX(), " y: ", (int)relativePos.getY(), " z: ", (int)relativePos.getZ());
//logDebug("x: ", (int)relativePos.getX(), " y: ", (int)relativePos.getY(), " z: ", (int)relativePos.getZ());
m_map[relativePos.getX()][relativePos.getY()][relativePos.getZ()].addThing(thing);
}

View File

@ -10,11 +10,11 @@ class Map
public:
void addThing(Thing *thing, const Position& pos);
void draw(int x, int y, int width, int heigth);
void draw(int x, int y);
private:
// Visible tiles are 15x11, but we have a +3 value. We have 15 floors.
Tile m_map[19][15][15];
Tile m_map[20][16][15];
FrameBufferPtr m_framebuffer;
};

View File

@ -5,10 +5,12 @@
ProtocolGame::ProtocolGame()
{
m_checksumEnabled = false;
g_game.setProtocol(this);
}
ProtocolGame::~ProtocolGame()
{
g_game.setProtocol(NULL);
}
void ProtocolGame::login(const std::string& accountName, const std::string& accountPassword, uint32 ip, uint16 port, const std::string& characterName)

View File

@ -21,9 +21,17 @@ public:
void onConnect();
void onRecv(InputMessage& inputMessage);
// Send Messages
void sendPing();
void sendWalkNorth();
void sendWalkEast();
void sendWalkSouth();
void sendWalkWest();
private:
void sendLoginPacket(uint32 timestamp, uint8 unknown);
// Parse Messages
void parseMessage(InputMessage& msg);
void parsePlayerLogin(InputMessage& msg);
@ -96,8 +104,6 @@ private:
void parseQuestList(InputMessage& msg);
void parseQuestPartList(InputMessage& msg);
void sendPing();
void setMapDescription(InputMessage& msg, int32 x, int32 y, int32 z, int32 width, int32 height);
void setFloorDescription(InputMessage& msg, int32 x, int32 y, int32 z, int32 width, int32 height, int32 offset, int32* skipTiles);
void setTileDescription(InputMessage& msg, Position position);

View File

@ -229,6 +229,8 @@ void ProtocolGame::parseMessage(InputMessage& msg)
break;
}
}
recv();
}
void ProtocolGame::parsePlayerLogin(InputMessage& msg)

View File

@ -3,7 +3,35 @@
void ProtocolGame::sendPing()
{
OutputMessage oMsg;
oMsg.reset();
oMsg.addU8(0x1E);
send(oMsg);
}
void ProtocolGame::sendWalkNorth()
{
OutputMessage oMsg;
oMsg.addU8(0x65);
send(oMsg);
}
void ProtocolGame::sendWalkEast()
{
OutputMessage oMsg;
oMsg.addU8(0x66);
send(oMsg);
}
void ProtocolGame::sendWalkSouth()
{
OutputMessage oMsg;
oMsg.addU8(0x67);
send(oMsg);
}
void ProtocolGame::sendWalkWest()
{
OutputMessage oMsg;
oMsg.addU8(0x68);
send(oMsg);
}

View File

@ -19,7 +19,7 @@ public:
void setType(Type type) { m_type = type; }
Type getType() const { return m_type; }
virtual void draw(int, int) {}
virtual void draw(int, int, int) {}
virtual Item* getItem() { return NULL; }
virtual const Item *getItem() const { return NULL; }

View File

@ -2,20 +2,29 @@
#include "item.h"
#include "tibiadat.h"
Tile::Tile()
{
m_ground = NULL;
}
void Tile::addThing(Thing *thing)
{
if(!thing)
return;
if(thing->getType() == Thing::TYPE_ITEM) {
const Item *item = thing->getItem();
Item *item = thing->getItem();
if(item) {
ItemAttributes *itemAttributes = g_tibiaDat.getItemAttributes(item->getId());
if(itemAttributes->alwaysOnTop)
m_itemsTop.push_back(thing);
else
m_itemsBot.push_back(thing);
if(itemAttributes->group == ITEM_GROUP_GROUND)
m_ground = item;
else {
if(itemAttributes->alwaysOnTop)
m_itemsTop.push_back(thing);
else
m_itemsBot.push_back(thing);
}
}
}
else if(thing->getType() == Thing::TYPE_CREATURE) {
@ -23,12 +32,18 @@ void Tile::addThing(Thing *thing)
}
}
void Tile::draw(int x, int y)
void Tile::draw(int x, int y, int z)
{
for(auto it = m_itemsBot.begin(), end = m_itemsBot.end(); it != end; ++it)
(*it)->draw(x, y);
for(auto it = m_creatures.begin(), end = m_creatures.end(); it != end; ++it)
(*it)->draw(x, y);
if(m_ground)
m_ground->draw(x, y, z);
for(auto it = m_itemsTop.begin(), end = m_itemsTop.end(); it != end; ++it)
(*it)->draw(x, y);
(*it)->draw(x, y, z);
for(auto it = m_creatures.begin(), end = m_creatures.end(); it != end; ++it)
(*it)->draw(x, y, z);
for(auto it = m_itemsBot.begin(), end = m_itemsBot.end(); it != end; ++it)
(*it)->draw(x, y, z);
}

View File

@ -7,12 +7,14 @@
class Tile
{
public:
Tile();
void addThing(Thing *thing);
void draw(int x, int y);
void draw(int x, int y, int z);
private:
// ground
Item *m_ground;
std::list<Thing*> m_itemsBot;
std::list<Thing*> m_creatures;
std::list<Thing*> m_itemsTop;