now is walking
This commit is contained in:
parent
651315d4cd
commit
a5cdf634b3
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
|
19
src/item.cpp
19
src/item.cpp
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
#include "map.h"
|
||||
#include "game.h"
|
||||
|
||||
void Map::draw(int x, int y, int width, int heigth)
|
||||
void Map::draw(int x, int y)
|
||||
{
|
||||
Position playerPos = g_game.getPlayer()->getPosition();
|
||||
for(int ix = 0; ix < 19; ++ix) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,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);
|
||||
}
|
||||
|
|
|
@ -9,11 +9,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];
|
||||
};
|
||||
|
||||
#endif // MAP_H
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -229,6 +229,8 @@ void ProtocolGame::parseMessage(InputMessage& msg)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
recv();
|
||||
}
|
||||
|
||||
void ProtocolGame::parsePlayerLogin(InputMessage& msg)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
37
src/tile.cpp
37
src/tile.cpp
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue