summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2005-10-09 16:27:05 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2005-10-09 16:27:05 +0000
commit2327c5a7c3b054e52b69286da906f8e5c4432d1c (patch)
tree28a566d4d54b8c046b18f18c1fb592c31f83f5dd
parentff4d98eeee5a5a799039549c6df885a5208b792f (diff)
downloadmana-2327c5a7c3b054e52b69286da906f8e5c4432d1c.tar.gz
mana-2327c5a7c3b054e52b69286da906f8e5c4432d1c.tar.bz2
mana-2327c5a7c3b054e52b69286da906f8e5c4432d1c.tar.xz
mana-2327c5a7c3b054e52b69286da906f8e5c4432d1c.zip
Fixed player names overlapping other players and more cleanups.
-rw-r--r--ChangeLog4
-rw-r--r--NEWS1
-rw-r--r--src/being.cpp83
-rw-r--r--src/being.h62
-rw-r--r--src/engine.cpp54
-rwxr-xr-xsrc/floor_item.cpp1
-rwxr-xr-xsrc/floor_item.h2
-rw-r--r--src/game.cpp7
-rw-r--r--src/item.h8
-rw-r--r--src/map.cpp2
10 files changed, 81 insertions, 143 deletions
diff --git a/ChangeLog b/ChangeLog
index c9acc4f4..b16e5d23 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -31,8 +31,8 @@
a normal tile. One well in new_3-1 has been converted to use the new
double tiles for testing purposes.
* src/being.cpp, src/game.cpp, src/engine.cpp: Fixed map switch
- crashing the client, display of [TARGET] and Alt keys for toggling
- windows.
+ crashing the client, display of [TARGET], Alt keys for toggling
+ windows and names to overlap other players.
2005-10-06 Bjørn Lindeijer <bjorn@lindeijer.nl>
diff --git a/NEWS b/NEWS
index c8f5cccf..ce5de390 100644
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,7 @@
- Improved damage text font, shadow is now translucent
- Improved GUI layout, new profile window
- Improved support for building on FreeBSD and MacOS X
+- Improved tile engine to fix graphics glitches and make mapping easier
- Fixed items on map to be removed on map switch
- Fixed OpenGL checkbox in the setup window to be usable
- Cleaned up a lot of code
diff --git a/src/being.cpp b/src/being.cpp
index 9dccb5f6..72ccd2ad 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -56,7 +56,7 @@ extern Spriteset *weaponset;
Being *player_node = NULL;
-std::list<Being*> beings;
+Beings beings;
char hairtable[16][4][2] = {
// S(x,y) W(x,y) N(x,y) E(x,y)
@@ -131,8 +131,8 @@ void remove_node(Being *being)
Being *findNode(Uint32 id)
{
- std::list<Being*>::iterator i;
- for (i = beings.begin(); i != beings.end(); i++) {
+ for (Beings::iterator i = beings.begin(); i != beings.end(); i++)
+ {
Being *being = (*i);
if (being->getId() == id) {
return being;
@@ -143,8 +143,8 @@ Being *findNode(Uint32 id)
Being *findNode(Uint16 x, Uint16 y)
{
- std::list<Being*>::iterator i;
- for (i = beings.begin(); i != beings.end(); i++) {
+ for (Beings::iterator i = beings.begin(); i != beings.end(); i++)
+ {
Being *being = (*i);
// Return being if found and it is not a dead monster
if (being->x == x &&
@@ -160,8 +160,8 @@ Being *findNode(Uint16 x, Uint16 y)
Being* findNode(Uint16 x, Uint16 y, Being::Type type)
{
- std::list<Being *>::iterator i;
- for (i = beings.begin(); i != beings.end(); i++) {
+ for (Beings::iterator i = beings.begin(); i != beings.end(); i++)
+ {
Being *being = (*i);
// Check if is a NPC (only low job ids)
if (being->x == x &&
@@ -176,28 +176,17 @@ Being* findNode(Uint16 x, Uint16 y, Being::Type type)
return NULL;
}
-class BeingCompare {
- public:
- bool operator() (const Being *a, const Being *b) const {
- return a->y < b->y;
- }
-};
-
-void sort() {
- beings.sort(BeingCompare());
-}
-
Being::Being():
job(0),
x(0), y(0), direction(SOUTH),
action(0), mFrame(0),
speech_color(0),
walk_time(0),
- speed(150),
emotion(0), emotion_time(0),
aspd(350),
- mWeapon(0),
mId(0),
+ mWeapon(0),
+ mWalkSpeed(150),
mMap(NULL),
hairStyle(1), hairColor(1),
speech_time(0),
@@ -332,7 +321,7 @@ void Being::nextStep()
x = node.x;
y = node.y;
action = WALK;
- walk_time += speed / 10;
+ walk_time += mWalkSpeed / 10;
}
void Being::logic()
@@ -354,7 +343,7 @@ void Being::logic()
{
switch (action) {
case WALK:
- mFrame = (get_elapsed_time(walk_time) * 4) / speed;
+ mFrame = (get_elapsed_time(walk_time) * 4) / mWalkSpeed;
if (mFrame >= 4) {
nextStep();
}
@@ -379,6 +368,19 @@ void Being::logic()
}
}
+ if (getType() == MONSTER)
+ {
+ if (action != STAND)
+ {
+ mFrame = (get_elapsed_time(walk_time) * 4) / mWalkSpeed;
+
+ if (mFrame >= 4 && action != MONSTER_DEAD)
+ {
+ nextStep();
+ }
+ }
+ }
+
// Update pixel coordinates
mPx = x * 32;
mPy = y * 32;
@@ -436,13 +438,6 @@ void Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY)
graphics->drawText("[TARGET]", px + 15, py - dy,
gcn::Graphics::CENTER);
}
-
- // Draw player name
- if (getType() == PLAYER && this != player_node)
- {
- graphics->setFont(speechFont);
- graphics->drawText(mName, px + 15, py + 30, gcn::Graphics::CENTER);
- }
}
Being::Type Being::getType() const
@@ -497,7 +492,7 @@ Being::getXOffset() const
{
if (direction != NORTH && direction != SOUTH)
{
- offset = (get_elapsed_time(walk_time) * 32) / speed;
+ offset = (get_elapsed_time(walk_time) * 32) / mWalkSpeed;
if (offset > 32) offset = 32;
if (direction == WEST || direction == NW || direction == SW) {
@@ -522,7 +517,7 @@ Being::getYOffset() const
{
if (direction != EAST && direction != WEST)
{
- offset = (get_elapsed_time(walk_time) * 32) / speed;
+ offset = (get_elapsed_time(walk_time) * 32) / mWalkSpeed;
if (offset > 32) offset = 32;
if (direction == NORTH || direction == NW || direction == NE) {
@@ -599,43 +594,37 @@ Being::draw(Graphics *graphics, int offsetX, int offsetY)
mFrame = 3;
}
- px -= 42;
- py -= 65;
-
frame = mFrame + action;
if (action == MONSTER_DEAD)
{
graphics->drawImage(
monsterset[job - 1002]->spriteset[dir + 4 * MONSTER_DEAD],
- px + 30, py + 40);
+ px - 12, py - 25);
}
else
{
graphics->drawImage(
monsterset[job-1002]->spriteset[dir + 4 * frame],
- px + 30, py + 40);
+ px - 12, py - 25);
/*
if (x == mouseTileX && y == mouseTileY)
{
- graphics->drawImage(attackTarget, px + 30 + 16, py + 32);
+ graphics->drawImage(attackTarget, px + 4, py - 33);
}
*/
}
-
- if (action != STAND)
- {
- mFrame = (get_elapsed_time(walk_time) * 4) / speed;
-
- if (mFrame >= 4 && action != MONSTER_DEAD)
- {
- nextStep();
- }
- }
break;
default:
break;
}
+
+ // Draw player name
+ if (getType() == PLAYER && this != player_node)
+ {
+ graphics->setFont(speechFont);
+ graphics->drawText(mName, px + 15, py + 30, gcn::Graphics::CENTER);
+ }
}
diff --git a/src/being.h b/src/being.h
index d5ec7fab..67c8c6b6 100644
--- a/src/being.h
+++ b/src/being.h
@@ -88,7 +88,6 @@ class Being : public Sprite
Uint8 mFrame;
Sint32 speech_color;
Uint16 walk_time;
- Uint16 speed;
Uint8 emotion; /**< Currently showing emotion */
Uint8 emotion_time; /**< Time until emotion disappears */
@@ -152,14 +151,14 @@ class Being : public Sprite
void setHairColor(Uint16 color);
/**
- * Sets the hair style for this being.
+ * Gets the hair color for this being.
*/
- void setHairStyle(Uint16 style);
+ Uint16 getHairColor();
/**
- * Gets the hair color for this being.
+ * Sets the hair style for this being.
*/
- Uint16 getHairColor();
+ void setHairStyle(Uint16 style);
/**
* Gets the hair style for this being.
@@ -169,38 +168,32 @@ class Being : public Sprite
/**
* Makes this being take the next step of his path.
*/
- void nextStep();
+ void
+ nextStep();
/**
* Performs being logic.
*/
- void logic();
+ void
+ logic();
/**
* Draws the speech text above the being.
*/
- void drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY);
+ void
+ drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY);
/**
* Returns the type of the being.
*/
Type getType() const;
- // ACCES METHODS
-
/**
* Gets the weapon picture id.
*/
Uint16 getWeapon() const { return mWeapon; }
/**
- * Gets the sprite id.
- */
- Uint32 getId() const { return mId; }
-
- // MODIFICATION METHODS
-
- /**
* Sets the weapon picture id.
*
* @param weapon the picture id
@@ -213,7 +206,26 @@ class Being : public Sprite
*
* @param weapon the weapon id
*/
- void setWeaponById(Uint16 weapon);
+ void
+ setWeaponById(Uint16 weapon);
+
+ /**
+ * Gets the walk speed.
+ */
+ Uint16
+ getWalkSpeed() const { return mWalkSpeed; }
+
+ /**
+ * Sets the walk speed.
+ */
+ void
+ setWalkSpeed(Uint16 speed) { mWalkSpeed = speed; }
+
+ /**
+ * Gets the sprite id.
+ */
+ Uint32
+ getId() const { return mId; }
/**
* Sets the sprite id.
@@ -226,8 +238,6 @@ class Being : public Sprite
*/
void setMap(Map *map);
- // SPRITE METHODS
-
/**
* Draws this being to the given graphics context.
*
@@ -269,8 +279,9 @@ class Being : public Sprite
void
setPath(std::list<PATH_NODE> path);
+ Uint32 mId; /**< Unique sprite id */
Uint16 mWeapon; /**< Weapon picture id */
- Uint32 mId; /**< Unique id */
+ Uint16 mWalkSpeed; /**< Walking speed */
Map *mMap; /**< Map on which this being resides */
std::string mName; /**< Name of character */
Sprites::iterator mSpriteIterator;
@@ -315,14 +326,9 @@ createBeing(Uint32 id, Uint16 job, Map *map);
void
remove_node(Being *being);
-/**
- * Sort beings in vertical order
- */
-void
-sort();
-
extern Being *player_node;
-extern std::list<Being*> beings;
+typedef std::list<Being*> Beings;
+extern Beings beings;
#endif
diff --git a/src/engine.cpp b/src/engine.cpp
index 73974edc..2175096d 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -72,58 +72,6 @@ Spriteset *npcset;
Spriteset *weaponset;
-int get_x_offset(Being *being)
-{
- int offset = 0;
- char direction = being->direction;
-
- if (being->action == Being::WALK)
- {
- if (direction != Being::NORTH && direction != Being::SOUTH)
- {
- offset = (get_elapsed_time(being->walk_time) * 32) / being->speed;
- if (offset > 32) offset = 32;
-
- if (direction == Being::WEST || direction == Being::NW ||
- direction == Being::SW) {
- offset = -offset;
- offset += 32;
- }
- else {
- offset -= 32;
- }
- }
- }
-
- return offset;
-}
-
-int get_y_offset(Being *being)
-{
- int offset = 0;
- char direction = being->direction;
-
- if (being->action == Being::WALK)
- {
- if (direction != Being::EAST && direction != Being::WEST)
- {
- offset = (get_elapsed_time(being->walk_time) * 32) / being->speed;
- if (offset > 32) offset = 32;
-
- if (direction == Being::NORTH || direction == Being::NW ||
- direction == Being::NE) {
- offset = -offset;
- offset += 32;
- }
- else {
- offset -= 32;
- }
- }
- }
-
- return offset;
-}
-
Engine::Engine():
mCurrentMap(NULL)
{
@@ -295,8 +243,6 @@ void Engine::draw()
int mouseTileX = mouseX / 32 + camera_x;
int mouseTileY = mouseY / 32 + camera_y;
- sort();
-
frame++;
// Draw tiles and sprites
diff --git a/src/floor_item.cpp b/src/floor_item.cpp
index 32b8aee5..106ad210 100755
--- a/src/floor_item.cpp
+++ b/src/floor_item.cpp
@@ -22,7 +22,6 @@
*/
#include "floor_item.h"
-#include "sprite.h"
#include "graphic/spriteset.h"
#include "resources/itemmanager.h"
#include "resources/iteminfo.h"
diff --git a/src/floor_item.h b/src/floor_item.h
index e004c0a2..abec9840 100755
--- a/src/floor_item.h
+++ b/src/floor_item.h
@@ -28,8 +28,6 @@
#include "map.h"
#include "sprite.h"
-class Map;
-
/**
* An item lying on the floor.
*/
diff --git a/src/game.cpp b/src/game.cpp
index 9cac4df0..bc256b7c 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -295,7 +295,6 @@ void do_init()
player_node = createBeing(account_ID, 0, engine->getCurrentMap());
player_node->x = startX;
player_node->y = startY;
- player_node->speed = 150;
player_node->setHairColor(player_info->hairColor);
player_node->setHairStyle(player_info->hairStyle);
@@ -1095,7 +1094,7 @@ void do_parse()
// Prevent division by 0 when calculating frame
if (speed == 0) { speed = 150; }
- being->speed = speed;
+ being->setWalkSpeed(speed);
being->job = job;
being->setHairStyle(msg.readShort());
being->setWeapon(msg.readShort());
@@ -1194,7 +1193,7 @@ void do_parse()
being = createBeing(id, job, tiledMap);
}
- being->speed = speed;
+ being->setWalkSpeed(speed);
being->job = job;
being->setHairStyle(msg.readShort());
being->setWeaponById(msg.readShort()); // item id 1
@@ -1524,7 +1523,7 @@ void do_parse()
switch (type)
{
//case 0x0000:
- // player_node->speed = msg.readLong();
+ // player_node->setWalkSpeed(msg.readLong());
// break;
case 0x0005: player_info->hp = value; break;
case 0x0006: player_info->maxHp = value; break;
diff --git a/src/item.h b/src/item.h
index c4b53ad1..c21f5ddf 100644
--- a/src/item.h
+++ b/src/item.h
@@ -80,25 +80,25 @@ class Item
getQuantity() const { return mQuantity; }
/**
- * Sets wether this item is considered equipment.
+ * Sets whether this item is considered equipment.
*/
void
setEquipment(bool equipment) { mEquipment = equipment; }
/**
- * Returns wether this item is considered equipment.
+ * Returns whether this item is considered equipment.
*/
bool
isEquipment() const { return mEquipment; }
/**
- * Sets wether this item is equipped.
+ * Sets whether this item is equipped.
*/
void
setEquipped(bool equipped) { mEquipped = equipped; }
/**
- * Returns wether this item is equipped.
+ * Returns whether this item is equipped.
*/
bool
isEquipped() const { return mEquipped; }
diff --git a/src/map.cpp b/src/map.cpp
index 37b7292a..28c52192 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -118,7 +118,7 @@ Map::draw(Graphics *graphics, int scrollX, int scrollY, int layer)
// tiles have been drawn
if (layer == 1)
{
- while (si != mSprites.end() && (*si)->getPixelY() <= y * 32 - 32)
+ while (si != mSprites.end() && (*si)->getPixelY() < y * 32)
{
(*si)->draw(graphics, -scrollX, -scrollY);
si++;