effects working, map on higher levels too
This commit is contained in:
parent
3d4cfb793e
commit
97d2c30a81
|
@ -38,7 +38,7 @@ function EnterGame_connectToLoginServer()
|
|||
-- display motd
|
||||
local motdNumber = string.sub(motd, 0, string.find(motd, "\n"))
|
||||
local motdText = string.sub(motd, string.find(motd, "\n") + 1, string.len(motd))
|
||||
local motdBox = displayInfoBox("Message of the day", motdText)
|
||||
--local motdBox = displayInfoBox("Message of the day", motdText)
|
||||
|
||||
-- hide main menu
|
||||
mainMenu.visible = false
|
||||
|
|
|
@ -17,20 +17,20 @@ bool DatManager::load(const std::string& filename)
|
|||
int numShots = fw::getu16(fin);
|
||||
|
||||
m_itemsAttributes.resize(numItems);
|
||||
for(int id = 100; id <= numItems; ++id)
|
||||
for(int id = 100; id < numItems; ++id)
|
||||
parseThingAttributes(fin, m_itemsAttributes[id - 100]);
|
||||
|
||||
m_creaturesAttributes.resize(numItems);
|
||||
for(int id = 1; id < numCreatures; ++id)
|
||||
parseThingAttributes(fin, m_creaturesAttributes[id - 1]);
|
||||
for(int id = 0; id < numCreatures; ++id)
|
||||
parseThingAttributes(fin, m_creaturesAttributes[id]);
|
||||
|
||||
m_effectsAttributes.resize(numItems);
|
||||
for(int id = 100; id < numEffects; ++id)
|
||||
parseThingAttributes(fin, m_effectsAttributes[id - 100]);
|
||||
for(int id = 0; id < numEffects; ++id)
|
||||
parseThingAttributes(fin, m_effectsAttributes[id]);
|
||||
|
||||
m_shotsAttributes.resize(numItems);
|
||||
for(int id = 1; id < numShots; ++id)
|
||||
parseThingAttributes(fin, m_shotsAttributes[id - 1]);
|
||||
for(int id = 0; id < numShots; ++id)
|
||||
parseThingAttributes(fin, m_shotsAttributes[id]);
|
||||
|
||||
return true;
|
||||
} catch(std::exception& e) {
|
||||
|
@ -178,8 +178,9 @@ void DatManager::parseThingAttributesOpt(std::stringstream& fin, ThingAttributes
|
|||
break;
|
||||
case 0x19: // pixels characters height
|
||||
|
||||
fin.read((char*)&thingAttributes.xOffset, 1);
|
||||
fin.read((char*)&thingAttributes.yOffset, 1);
|
||||
//fin.read((char*)&thingAttributes.xOffset, 1);
|
||||
//fin.read((char*)&thingAttributes.yOffset, 1);
|
||||
fin.read((char*)&read_short, 2);
|
||||
//logDebug((int)thingAttributes.xOffset, " ", (int)thingAttributes.yOffset);
|
||||
break;
|
||||
case 0x1A:
|
||||
|
|
|
@ -14,9 +14,9 @@ public:
|
|||
void parseThingAttributesOpt(std::stringstream& fin, ThingAttributes& thingAttributes, uint8 opt);
|
||||
|
||||
ThingAttributes& getItemAttributes(uint16 id) { return m_itemsAttributes[id - 100]; }
|
||||
ThingAttributes& getCreatureAttributes(uint16 id) { return m_creaturesAttributes[id - 1]; }
|
||||
ThingAttributes& getEffectAttributes(uint16 id) { return m_effectsAttributes[id - 100]; }
|
||||
ThingAttributes& getShotAttributes(uint16 id) { return m_shotsAttributes[id - 1]; }
|
||||
ThingAttributes& getCreatureAttributes(uint16 id) { return m_creaturesAttributes[id]; }
|
||||
ThingAttributes& getEffectAttributes(uint16 id) { return m_effectsAttributes[id]; }
|
||||
ThingAttributes& getShotAttributes(uint16 id) { return m_shotsAttributes[id]; }
|
||||
|
||||
uint32 getSignature() { return m_signature; }
|
||||
|
||||
|
|
|
@ -3,12 +3,32 @@
|
|||
|
||||
Effect::Effect() : Thing(THING_EFFECT)
|
||||
{
|
||||
m_timer = 0;
|
||||
m_animation = 0;
|
||||
m_finished = false;
|
||||
}
|
||||
|
||||
void Effect::draw(int x, int y)
|
||||
{
|
||||
int anim = 0;
|
||||
internalDraw(x, y, 0, 0, 0, 0, anim);
|
||||
internalDraw(x, y, 0, 0, 0, 0, m_animation);
|
||||
}
|
||||
|
||||
void Effect::update(int elapsedTime)
|
||||
{
|
||||
if(m_finished)
|
||||
return;
|
||||
|
||||
if(m_timer > 75) {
|
||||
const ThingAttributes& attributes = getAttributes();
|
||||
|
||||
if(m_animation+1 == attributes.animcount) {
|
||||
m_finished = true;
|
||||
return;
|
||||
}
|
||||
m_animation++;
|
||||
m_timer = 0;
|
||||
}
|
||||
m_timer += elapsedTime;
|
||||
}
|
||||
|
||||
const ThingAttributes& Effect::getAttributes()
|
||||
|
|
|
@ -10,10 +10,18 @@ public:
|
|||
Effect();
|
||||
|
||||
void draw(int x, int y);
|
||||
void update(int elapsedTime);
|
||||
|
||||
bool finished() { return m_finished; }
|
||||
|
||||
const ThingAttributes& getAttributes();
|
||||
|
||||
virtual EffectPtr asEffect() { return std::static_pointer_cast<Effect>(shared_from_this()); }
|
||||
EffectPtr asEffect() { return std::static_pointer_cast<Effect>(shared_from_this()); }
|
||||
|
||||
private:
|
||||
int m_timer;
|
||||
int m_animation;
|
||||
bool m_finished;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -20,39 +20,31 @@ void Map::draw(int x, int y)
|
|||
if(playerPos.z <= 7) {
|
||||
|
||||
// player pos it 8-6. check if we can draw upper floors.
|
||||
bool draw = true;
|
||||
int drawFloorStop = 0;
|
||||
for(int jz = 6; jz >= 0; --jz) {
|
||||
Position coverPos = Position(playerPos.x-(6-jz), playerPos.y-(6-jz), jz);
|
||||
Position coverPos = Position(playerPos.x+(7-jz)-1, playerPos.y+(7-jz)-1, jz);
|
||||
if(m_tiles[coverPos]) {
|
||||
if(m_tiles[coverPos]->getStackSize() > 0 && jz < playerPos.z) {
|
||||
draw = false;
|
||||
drawFloorStop = jz;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(int iz = 7; iz > 0; --iz) {
|
||||
if(iz == drawFloorStop)
|
||||
break;
|
||||
|
||||
// +1 in draws cause 64x64 items may affect view.
|
||||
for(int ix = -7; ix < + 8+7; ++ix) {
|
||||
for(int iy = -5; iy < + 6+7; ++iy) {
|
||||
|
||||
for(int ix = -7+(playerPos.z-iz); ix < + 8+7; ++ix) {
|
||||
for(int iy = -5+(playerPos.z-iz); iy < + 6+7; ++iy) {
|
||||
Position itemPos = Position(playerPos.x + ix, playerPos.y + iy, iz);
|
||||
//Position drawPos = Position(ix + 8, iy - playerPos.y + 6, iz);
|
||||
//logDebug("x: ", relativePos.x, " y: ", relativePos.y, " z: ", (int)relativePos.z);
|
||||
if(m_tiles[itemPos])
|
||||
m_tiles[itemPos]->draw((ix + 7 - (7-iz))*32, (iy + 5 - (7-iz))*32);
|
||||
m_tiles[itemPos]->draw((ix + 7 - (playerPos.z-iz))*32, (iy + 5 - (playerPos.z-iz))*32);
|
||||
}
|
||||
}
|
||||
|
||||
if(!draw)
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// draw effects
|
||||
for(auto it = m_effects.begin(), end = m_effects.end(); it != end; ++it) {
|
||||
Position effectPos = (*it)->getPosition();
|
||||
(*it)->draw((effectPos.x - playerPos.x + 7) * 32, (effectPos.y - playerPos.y + 5) * 32);
|
||||
}
|
||||
|
||||
// debug draws
|
||||
|
@ -62,16 +54,33 @@ void Map::draw(int x, int y)
|
|||
m_framebuffer->draw(Rect(x, y, g_graphics.getScreenSize()));
|
||||
}
|
||||
|
||||
void Map::addThing(ThingPtr thing, uint8 stackpos)
|
||||
void Map::update(int elapsedTime)
|
||||
{
|
||||
if(thing->asItem() || thing->asCreature()) {
|
||||
if(!m_tiles[thing->getPosition()]) {
|
||||
m_tiles[thing->getPosition()] = TilePtr(new Tile());
|
||||
}
|
||||
// Items
|
||||
|
||||
m_tiles[thing->getPosition()]->addThing(thing, stackpos);
|
||||
}
|
||||
else if(thing->asEffect()) {
|
||||
m_effects.push_back(thing);
|
||||
// Effects
|
||||
for(auto it = m_effects.begin(), end = m_effects.end(); it != end;) {
|
||||
if((*it)->finished()) {
|
||||
m_tiles[(*it)->getPosition()]->removeThing(*it, 0);
|
||||
it = m_effects.erase(it);
|
||||
}
|
||||
else {
|
||||
(*it)->update(elapsedTime);
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Map::addThing(ThingPtr thing, uint8 stackpos)
|
||||
{
|
||||
if(!m_tiles[thing->getPosition()]) {
|
||||
m_tiles[thing->getPosition()] = TilePtr(new Tile());
|
||||
}
|
||||
|
||||
m_tiles[thing->getPosition()]->addThing(thing, stackpos);
|
||||
|
||||
// List with effects and shots to update them.
|
||||
if(thing->asEffect()) {
|
||||
m_effects.push_back(thing->asEffect());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,13 +8,14 @@
|
|||
class Map
|
||||
{
|
||||
public:
|
||||
void addThing(ThingPtr thing, uint8 stackpos = 0);
|
||||
|
||||
void draw(int x, int y);
|
||||
void update(int elapsedTime);
|
||||
|
||||
void addThing(ThingPtr thing, uint8 stackpos = 0);
|
||||
|
||||
private:
|
||||
std::unordered_map<Position, TilePtr, PositionHasher> m_tiles;
|
||||
std::list<ThingPtr> m_effects;
|
||||
std::list<EffectPtr> m_effects;
|
||||
|
||||
FrameBufferPtr m_framebuffer;
|
||||
};
|
||||
|
|
|
@ -26,7 +26,7 @@ void Thing::internalDraw(int x, int y, int blendframes, int xdiv, int ydiv, int
|
|||
|
||||
TexturePtr spriteTex = g_sprites.getSpriteTexture(spriteId);
|
||||
Rect drawRect((x - xi*32) - attributes.xOffset,
|
||||
(y - yi*32) - attributes.yOffset,
|
||||
(y - yi*32) - attributes.xOffset,
|
||||
32, 32);
|
||||
|
||||
g_graphics.drawTexturedRect(drawRect, spriteTex);
|
||||
|
|
|
@ -21,9 +21,26 @@ void Tile::addThing(ThingPtr thing, uint8 stackpos)
|
|||
else
|
||||
m_itemsBottom.push_back(thing);
|
||||
}
|
||||
} else if(thing->asCreature()) {
|
||||
}
|
||||
else if(thing->asCreature()) {
|
||||
m_creatures.push_back(thing);
|
||||
}
|
||||
else if(thing->asEffect()) {
|
||||
m_effects.push_back(thing);
|
||||
}
|
||||
}
|
||||
|
||||
void Tile::removeThing(ThingPtr thing, uint8 stackpos)
|
||||
{
|
||||
if(thing->asEffect()) {
|
||||
for(auto it = m_effects.begin(), end = m_effects.end(); it != end; ++it) {
|
||||
if(thing == *it) {
|
||||
(*it).reset();
|
||||
m_effects.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Tile::draw(int x, int y)
|
||||
|
@ -31,13 +48,16 @@ void Tile::draw(int x, int y)
|
|||
if(m_ground)
|
||||
m_ground->draw(x, y);
|
||||
|
||||
for(const ThingPtr& thing : m_itemsBottom)
|
||||
for(const ThingPtr& thing : m_itemsTop)
|
||||
thing->draw(x, y);
|
||||
|
||||
for(const ThingPtr& thing : m_creatures)
|
||||
thing->draw(x, y);
|
||||
|
||||
for(const ThingPtr& thing : m_itemsTop)
|
||||
for(const ThingPtr& thing : m_itemsBottom)
|
||||
thing->draw(x, y);
|
||||
|
||||
for(const ThingPtr& thing : m_effects)
|
||||
thing->draw(x, y);
|
||||
}
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ public:
|
|||
Tile();
|
||||
|
||||
void addThing(ThingPtr thing, uint8 stackpos);
|
||||
void removeThing(ThingPtr thing, uint8 stackpos);
|
||||
|
||||
void draw(int x, int y);
|
||||
|
||||
|
@ -22,6 +23,7 @@ private:
|
|||
std::deque<ThingPtr> m_itemsBottom;
|
||||
std::deque<ThingPtr> m_creatures;
|
||||
std::deque<ThingPtr> m_itemsTop;
|
||||
std::deque<ThingPtr> m_effects;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -82,6 +82,7 @@ void OTClient::run()
|
|||
int frameTicks = g_platform.getTicks();
|
||||
int lastFpsTicks = frameTicks;
|
||||
int lastPollTicks = frameTicks;
|
||||
int lastUpdateTicks = frameTicks;
|
||||
int frameCount = 0;
|
||||
|
||||
m_stopping = false;
|
||||
|
@ -114,6 +115,12 @@ void OTClient::run()
|
|||
lastPollTicks = frameTicks;
|
||||
}
|
||||
|
||||
// only update to a maximum of 60 fps
|
||||
if(frameTicks - lastUpdateTicks >= 1) {
|
||||
g_map.update(frameTicks - lastUpdateTicks);
|
||||
lastUpdateTicks = frameTicks;
|
||||
}
|
||||
|
||||
// only render when the windows is visible
|
||||
if(g_platform.isWindowVisible()) {
|
||||
// render begin
|
||||
|
|
Loading…
Reference in New Issue