summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/being.cpp1
-rw-r--r--src/gui/chat.cpp12
-rw-r--r--src/gui/setup_video.cpp22
-rw-r--r--src/gui/setup_video.h2
-rw-r--r--src/gui/viewport.cpp11
-rw-r--r--src/localplayer.cpp44
-rw-r--r--src/localplayer.h32
-rw-r--r--src/main.cpp1
-rw-r--r--src/player.cpp15
-rw-r--r--src/player.h19
10 files changed, 124 insertions, 35 deletions
diff --git a/src/being.cpp b/src/being.cpp
index aff52757..ba3107db 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -69,6 +69,7 @@ Being::Being(int id, int job, Map *map):
mWalkSpeed(150),
mDirection(DOWN),
mMap(NULL),
+ mName(""),
mIsGM(false),
mParticleEffects(config.getValue("particleeffects", 1)),
mEquippedWeapon(NULL),
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp
index 35976963..d4818504 100644
--- a/src/gui/chat.cpp
+++ b/src/gui/chat.cpp
@@ -95,8 +95,7 @@ ChatWindow::~ChatWindow()
delete mRecorder;
}
-void
- ChatWindow::logic()
+void ChatWindow::logic()
{
// todo: only do this when the size changes (updateWidgets?)
@@ -296,6 +295,15 @@ void ChatWindow::chatSend(const std::string &nick, std::string msg)
}
// Prepare ordinary message
if (msg.substr(0, 1) != "/") {
+ // The server never tells you about your own GM status, so work around
+ // this for now by intercepting it here. NOTE: This assumes that the
+ // assert works, when it's not guaranteed to.
+
+ std::size_t space = msg.find(" ");
+ const std::string command = msg.substr(1, space);
+ if (msg.at(0) == '@' && command == "assert")
+ player_node->setGM();
+
msg = nick + " : " + msg;
MessageOut outMsg(mNetwork);
diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp
index 724ce8b4..a23f5923 100644
--- a/src/gui/setup_video.cpp
+++ b/src/gui/setup_video.cpp
@@ -38,6 +38,7 @@
#include "../configuration.h"
#include "../graphics.h"
+#include "../localplayer.h"
#include "../log.h"
#include "../main.h"
#include "../particle.h"
@@ -106,6 +107,7 @@ Setup_Video::Setup_Video():
mCustomCursorEnabled(config.getValue("customcursor", 1)),
mParticleEffectsEnabled(config.getValue("particleeffects", 1)),
mSpeechBubbleEnabled(config.getValue("speechbubble", 1)),
+ mNameEnabled(config.getValue("showownname", 0)),
mOpacity(config.getValue("guialpha", 0.8)),
mFps((int) config.getValue("fpslimit", 0)),
mModeListModel(new ModeListModel),
@@ -115,6 +117,7 @@ Setup_Video::Setup_Video():
mCustomCursorCheckBox(new CheckBox(_("Custom cursor"), mCustomCursorEnabled)),
mParticleEffectsCheckBox(new CheckBox(_("Particle effects"), mParticleEffectsEnabled)),
mSpeechBubbleCheckBox(new CheckBox(_("Speech bubbles"), mSpeechBubbleEnabled)),
+ mNameCheckBox(new CheckBox(_("Show name"), mNameEnabled)),
mAlphaSlider(new Slider(0.2, 1.0)),
mFpsCheckBox(new CheckBox(_("FPS Limit:"))),
mFpsSlider(new Slider(10, 200)),
@@ -145,8 +148,9 @@ Setup_Video::Setup_Video():
mModeList->setDimension(gcn::Rectangle(0, 0, 60, 70));
scrollArea->setDimension(gcn::Rectangle(10, 10, 90, 70));
mFsCheckBox->setPosition(110, 10);
+ mNameCheckBox->setPosition(195, 10);
mOpenGLCheckBox->setPosition(110, 30);
- mParticleEffectsCheckBox->setPosition(175, 30);
+ mParticleEffectsCheckBox->setPosition(180, 30);
mCustomCursorCheckBox->setPosition(110, 50);
mSpeechBubbleCheckBox->setPosition(110, 70);
mAlphaSlider->setDimension(gcn::Rectangle(10, 100, 75, 10));
@@ -170,6 +174,7 @@ Setup_Video::Setup_Video():
mCustomCursorCheckBox->setActionEventId("customcursor");
mParticleEffectsCheckBox->setActionEventId("particleeffects");
mSpeechBubbleCheckBox->setActionEventId("speechbubble");
+ mNameCheckBox->setActionEventId("showownname");
mAlphaSlider->setActionEventId("guialpha");
mFpsCheckBox->setActionEventId("fpslimitcheckbox");
mFpsSlider->setActionEventId("fpslimitslider");
@@ -186,6 +191,7 @@ Setup_Video::Setup_Video():
mCustomCursorCheckBox->addActionListener(this);
mParticleEffectsCheckBox->addActionListener(this);
mSpeechBubbleCheckBox->addActionListener(this);
+ mNameCheckBox->addActionListener(this);
mAlphaSlider->addActionListener(this);
mFpsCheckBox->addActionListener(this);
mFpsSlider->addActionListener(this);
@@ -262,6 +268,7 @@ Setup_Video::Setup_Video():
add(mCustomCursorCheckBox);
add(mParticleEffectsCheckBox);
add(mSpeechBubbleCheckBox);
+ add(mNameCheckBox);
add(mAlphaSlider);
add(alphaLabel);
add(mFpsCheckBox);
@@ -344,6 +351,7 @@ void Setup_Video::apply()
mCustomCursorEnabled = config.getValue("customcursor", 1);
mParticleEffectsEnabled = config.getValue("particleeffects", 1);
mSpeechBubbleEnabled = config.getValue("speechbubble", 1);
+ mNameEnabled = config.getValue("showownname", 0);
mOpacity = config.getValue("guialpha", 0.8);
mOverlayDetail = (int)config.getValue("OverlayDetail", 2);
mOpenGLEnabled = config.getValue("opengl", 0);
@@ -375,6 +383,9 @@ void Setup_Video::cancel()
mFsCheckBox->setSelected(mFullScreenEnabled);
mOpenGLCheckBox->setSelected(mOpenGLEnabled);
mCustomCursorCheckBox->setSelected(mCustomCursorEnabled);
+ mParticleEffectsCheckBox->setSelected(mParticleEffectsEnabled);
+ mSpeechBubbleCheckBox->setSelected(mSpeechBubbleEnabled);
+ mNameCheckBox->setSelected(mNameEnabled);
mAlphaSlider->setValue(mOpacity);
mOverlayDetailSlider->setValue(mOverlayDetail);
mParticleDetailSlider->setValue(mParticleDetail);
@@ -388,6 +399,7 @@ void Setup_Video::cancel()
config.setValue("customcursor", mCustomCursorEnabled ? 1 : 0);
config.setValue("particleeffects", mParticleEffectsEnabled ? 1 : 0);
config.setValue("speechbubble", mSpeechBubbleEnabled ? 1 : 0);
+ config.setValue("showownname", mNameEnabled ? 1 : 0);
config.setValue("guialpha", mOpacity);
config.setValue("opengl", mOpenGLEnabled ? 1 : 0);
}
@@ -445,6 +457,14 @@ void Setup_Video::action(const gcn::ActionEvent &event)
config.setValue("speechbubble",
mSpeechBubbleCheckBox->isSelected() ? 1 : 0);
}
+ else if (event.getId() == "showownname")
+ {
+ // Notify the local player that settings have changed for the name
+ // and requires an update
+ player_node->mUpdateName = true;
+ config.setValue("showownname",
+ mNameCheckBox->isSelected() ? 1 : 0);
+ }
else if (event.getId() == "fpslimitslider")
{
mFps = (int) mFpsSlider->getValue();
diff --git a/src/gui/setup_video.h b/src/gui/setup_video.h
index 4103c5ef..dfc3da38 100644
--- a/src/gui/setup_video.h
+++ b/src/gui/setup_video.h
@@ -51,6 +51,7 @@ class Setup_Video : public SetupTab, public gcn::ActionListener,
bool mCustomCursorEnabled;
bool mParticleEffectsEnabled;
bool mSpeechBubbleEnabled;
+ bool mNameEnabled;
double mOpacity;
int mFps;
@@ -62,6 +63,7 @@ class Setup_Video : public SetupTab, public gcn::ActionListener,
gcn::CheckBox *mCustomCursorCheckBox;
gcn::CheckBox *mParticleEffectsCheckBox;
gcn::CheckBox *mSpeechBubbleCheckBox;
+ gcn::CheckBox *mNameCheckBox;
gcn::Slider *mAlphaSlider;
gcn::CheckBox *mFpsCheckBox;
diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp
index 080ebddc..75b756f5 100644
--- a/src/gui/viewport.cpp
+++ b/src/gui/viewport.cpp
@@ -93,6 +93,10 @@ Viewport::draw(gcn::Graphics *gcnGraphics)
Graphics *graphics = static_cast<Graphics*>(gcnGraphics);
+ // Ensure the client doesn't freak out if a feature localplayer uses
+ // is dependent on a map.
+ player_node->mMapInitialized = true;
+
// Avoid freaking out when tick_time overflows
if (tick_time < lastTick)
{
@@ -196,6 +200,13 @@ Viewport::draw(gcn::Graphics *gcnGraphics)
}
}
+ if (player_node->mUpdateName)
+ {
+ player_node->mUpdateName = false;
+ player_node->setName(player_node->getName());
+ }
+
+
// Draw text
if (textManager)
{
diff --git a/src/localplayer.cpp b/src/localplayer.cpp
index 24b50d03..fb568d20 100644
--- a/src/localplayer.cpp
+++ b/src/localplayer.cpp
@@ -20,6 +20,7 @@
*/
#include <cassert>
+#include "configuration.h"
#include "equipment.h"
#include "floor_item.h"
#include "game.h"
@@ -44,6 +45,9 @@
LocalPlayer *player_node = NULL;
+static const int NAME_X_OFFSET = 15;
+static const int NAME_Y_OFFSET = 30;
+
LocalPlayer::LocalPlayer(Uint32 id, Uint16 job, Map *map):
Player(id, job, map),
mCharId(0),
@@ -68,6 +72,13 @@ LocalPlayer::LocalPlayer(Uint32 id, Uint16 job, Map *map):
mInventory(new Inventory(INVENTORY_SIZE)),
mStorage(new Inventory(STORAGE_SIZE))
{
+ // Variable to keep the local player from doing certain actions before a map
+ // is initialized. e.g. drawing a player's name using the TextManager, since
+ // it appears to be dependant upon map coordinates for updating drawing.
+ mMapInitialized = false;
+
+ mUpdateName = true;
+
initTargetCursor();
}
@@ -75,6 +86,7 @@ LocalPlayer::~LocalPlayer()
{
delete mInventory;
delete mStorage;
+ delete mName;
for (int i = Being::TC_SMALL; i < Being::NUM_TC; i++)
{
@@ -158,6 +170,38 @@ void LocalPlayer::logic()
Being::logic();
}
+void LocalPlayer::setGM()
+{
+ mIsGM = !mIsGM;
+ setName(getName());
+}
+
+void LocalPlayer::setName(const std::string &name)
+{
+ if (mName)
+ {
+ delete mName;
+ mName = 0;
+ }
+
+ if (config.getValue("showownname", false) && mMapInitialized)
+ {
+ Player::setName(name);
+ }
+ else
+ {
+ Being::setName(name);
+ }
+}
+
+void LocalPlayer::updateCoords()
+{
+ if (mName)
+ {
+ mName->adviseXY(mPx + NAME_X_OFFSET, mPy + NAME_Y_OFFSET);
+ }
+}
+
void LocalPlayer::nextStep()
{
if (mPath.empty())
diff --git a/src/localplayer.h b/src/localplayer.h
index 0760f226..28551a22 100644
--- a/src/localplayer.h
+++ b/src/localplayer.h
@@ -57,7 +57,7 @@ class LocalPlayer : public Player
*/
~LocalPlayer();
- void setName(const std::string &name) {Being::setName(name); }
+ virtual void setName(const std::string &name);
void setNetwork(Network *network) { mNetwork = network; }
Network *getNetwork() {return mNetwork; }
virtual void logic();
@@ -126,6 +126,14 @@ class LocalPlayer : public Player
void attack(Being *target = NULL, bool keep = false);
+ /**
+ * Triggers whether or not to show the name as a GM name.
+ * NOTE: This doesn't mean that just anyone can use this.
+ * If the server doesn't acknowlege you, you won't be shown
+ * as a GM on other people's clients.
+ */
+ virtual void setGM();
+
void stopAttack();
Being* getTarget() const;
@@ -212,6 +220,10 @@ class LocalPlayer : public Player
Uint16 mStatPoint, mSkillPoint;
Uint16 mStatsPointsToAttribute;
+ bool mUpdateName; /** Whether or not the name settings have changed */
+
+ bool mMapInitialized; /** Whether or not the map is available yet */
+
float mLastAttackTime; /**< Used to synchronize the charge dialog */
void drawTargetCursor(Graphics *graphics, int offsetX, int offsetY);
@@ -232,15 +244,15 @@ class LocalPlayer : public Player
FloorItem *mPickUpTarget;
bool mTrading;
- bool mInStorage; /**< Whether storage is currently accessible */
+ bool mInStorage; /**< Whether storage is currently accessible */
bool mGoingToTarget;
- bool mKeepAttacking;/** Whether or not to continue to attack */
- int mTargetTime; /** How long the being has been targeted **/
- int mLastAction; /**< Time stamp of the last action, -1 if none. */
- int mLastTarget; /** Time stamp of last targeting action, -1 if none. */
- int mWalkingDir; /**< The direction the player is walking in. */
- int mDestX; /**< X coordinate of destination. */
- int mDestY; /**< Y coordinate of destination. */
+ bool mKeepAttacking; /** Whether or not to continue to attack */
+ int mTargetTime; /** How long the being has been targeted **/
+ int mLastAction; /**< Time stamp of the last action, -1 if none. */
+ int mLastTarget; /** Time stamp of last targeting action, -1 if none. */
+ int mWalkingDir; /**< The direction the player is walking in. */
+ int mDestX; /**< X coordinate of destination. */
+ int mDestY; /**< Y coordinate of destination. */
Inventory *mInventory;
Inventory *mStorage;
@@ -259,6 +271,8 @@ class LocalPlayer : public Player
// Load the target cursors into memory
void initTargetCursor();
+
+ virtual void updateCoords();
};
extern LocalPlayer *player_node;
diff --git a/src/main.cpp b/src/main.cpp
index 5f508c52..d9ebaefa 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -968,6 +968,7 @@ int main(int argc, char *argv[])
if (options.chooseDefault)
((CharSelectDialog*) currentDialog)->action(
gcn::ActionEvent(NULL, "ok"));
+
break;
case GAME_STATE:
diff --git a/src/player.cpp b/src/player.cpp
index 47275c81..ca728bef 100644
--- a/src/player.cpp
+++ b/src/player.cpp
@@ -41,15 +41,11 @@ Player::Player(int id, int job, Map *map):
Being(id, job, map)
{
mName = 0;
- mIsGM = false;
}
Player::~Player()
{
- if (mName)
- {
- delete mName;
- }
+ delete mName;
}
void Player::setName(const std::string &name)
@@ -69,8 +65,7 @@ void Player::setName(const std::string &name)
}
}
-void
-Player::logic()
+void Player::logic()
{
switch (mAction) {
case STAND:
@@ -109,14 +104,12 @@ Player::logic()
Being::logic();
}
-Being::Type
-Player::getType() const
+Being::Type Player::getType() const
{
return PLAYER;
}
-void
-Player::flash(int time)
+void Player::flash(int time)
{
if (mName)
{
diff --git a/src/player.h b/src/player.h
index 97ff15d9..a082a92b 100644
--- a/src/player.h
+++ b/src/player.h
@@ -43,17 +43,13 @@ class Player : public Being
/**
* Set up mName to be the character's name
*/
- virtual void
- setName(const std::string &name);
+ virtual void setName(const std::string &name);
- virtual void
- logic();
+ virtual void logic();
- virtual Type
- getType() const;
+ virtual Type getType() const;
- virtual void
- setGender(Gender gender);
+ virtual void setGender(Gender gender);
/**
* Sets the hair style and color for this player.
@@ -70,8 +66,7 @@ class Player : public Being
/**
* Sets visible equipments for this player.
*/
- virtual void
- setSprite(int slot, int id, std::string color = "");
+ virtual void setSprite(int slot, int id, std::string color = "");
/**
* Flash the player's name
@@ -79,8 +74,8 @@ class Player : public Being
void flash(int time);
protected:
- void updateCoords();
- private:
+ virtual void updateCoords();
+
FlashText *mName;
};