diff options
author | Ira Rice <irarice@gmail.com> | 2008-10-12 06:39:34 +0000 |
---|---|---|
committer | Ira Rice <irarice@gmail.com> | 2008-10-12 06:39:34 +0000 |
commit | 9f5f8e5c6579f3ecc7a6c245e063d5f2d96c62ff (patch) | |
tree | 5d6ff477702930af474e2e49f860b47c7f8505fb | |
parent | d5736cdc5700994520a53fdd560fd7ea946f6e63 (diff) | |
download | mana-9f5f8e5c6579f3ecc7a6c245e063d5f2d96c62ff.tar.gz mana-9f5f8e5c6579f3ecc7a6c245e063d5f2d96c62ff.tar.bz2 mana-9f5f8e5c6579f3ecc7a6c245e063d5f2d96c62ff.tar.xz mana-9f5f8e5c6579f3ecc7a6c245e063d5f2d96c62ff.zip |
This commit contains three things: one, after looking over how TMW was
handling the effects through the level up system, I determined that it
wasn't bad, so I pulled it from TMW's SVN. Two, I edited the web page
css so that it better matches the forum. And three, I patched text
wrapping so that it'll fix up its display size based on all previous
lines, except for the last line. That fix will come later, but for now,
it'll be seen as a special case. While you'd like to think that just
resending the string and starting the function over again would fix it,
you'd be wrong. So it won't be patched until I think of a better way to
handle that case.
-rw-r--r-- | src/gui/speechbubble.cpp | 7 | ||||
-rw-r--r-- | src/gui/speechbubble.h | 2 | ||||
-rw-r--r-- | src/gui/textbox.cpp | 31 | ||||
-rw-r--r-- | src/main.cpp | 14 | ||||
-rw-r--r-- | src/net/beinghandler.cpp | 28 | ||||
-rw-r--r-- | src/net/protocol.h | 2 | ||||
-rw-r--r-- | src/player.h | 9 | ||||
-rw-r--r-- | src/resources/itemdb.cpp | 14 |
8 files changed, 67 insertions, 40 deletions
diff --git a/src/gui/speechbubble.cpp b/src/gui/speechbubble.cpp index c5c653e7..0ccbebc0 100644 --- a/src/gui/speechbubble.cpp +++ b/src/gui/speechbubble.cpp @@ -59,8 +59,13 @@ SpeechBubble::SpeechBubble()//: mSpeechBox->setTextWrapped( "" ); } -void SpeechBubble::setText(const std::string mText) +void SpeechBubble::setText(std::string mText) { + while (mText[0] == ' ') + { + mText = mText.substr(1, mText.size()); + } + mSpeechBox->setMinWidth(140); mSpeechBox->setTextWrapped( mText ); diff --git a/src/gui/speechbubble.h b/src/gui/speechbubble.h index c4ca9109..7a2a73b8 100644 --- a/src/gui/speechbubble.h +++ b/src/gui/speechbubble.h @@ -35,7 +35,7 @@ class SpeechBubble : public Window SpeechBubble(); - void setText(const std::string mText); + void setText(std::string mText); void setLocation(int x, int y); unsigned int getNumRows(); diff --git a/src/gui/textbox.cpp b/src/gui/textbox.cpp index 1a689ad5..f2d9b6ee 100644 --- a/src/gui/textbox.cpp +++ b/src/gui/textbox.cpp @@ -92,13 +92,31 @@ void TextBox::setTextWrapped(const std::string &text) if (xpos > minWidth) { minWidth = xpos; - if (minWidth > mMinWidth) - { - mMinWidth = minWidth; - } + } + // The window wasn't big enough. Resize it and try again. + if (minWidth > mMinWidth) + { + mMinWidth = minWidth; + // This is a reaaaly ugly hack for getting the string stream + // to clear itself. Don't mess with the spacer in the stream + // reset, as well as removing the break. These are all there + // because there are several compilers that I have tried + // that do not properly reset the string stream. + // You have been warned! + wrappedStream.str(" "); + spacePos = 0; + lastNewlinePos = 0; + newlinePos = text.find("\n", lastNewlinePos); + line = text.substr(lastNewlinePos, newlinePos - + lastNewlinePos); + width = 0; + break; + } + else + { + wrappedStream << "\n" << word; } xpos = width; - wrappedStream << "\n" << word; } lastSpacePos = spacePos + 1; } @@ -116,9 +134,10 @@ void TextBox::setTextWrapped(const std::string &text) { minWidth = xpos; } + mMinWidth = minWidth; if (minWidth > mMinWidth) { - mMinWidth = minWidth; + setTextWrapped(text); } gcn::TextBox::setText(wrappedStream.str()); diff --git a/src/main.cpp b/src/main.cpp index 4427b4d4..f9061c42 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -163,6 +163,8 @@ struct Options */ void setUpdatesDir() { + std::stringstream updates; + // If updatesHost is currently empty, fill it from config file if (updateHost.empty()) { updateHost = @@ -174,8 +176,9 @@ void setUpdatesDir() pos = updateHost.find("://"); if (pos != updateHost.npos) { if (pos + 3 < updateHost.length()) { - updatesDir = - "updates/" + updateHost.substr(pos + 3); + updates << "updates/" << updateHost.substr(pos + 3) + << "-" << loginData.port; + updatesDir = updates.str(); } else { logger->log("Error: Invalid update host: %s", updateHost.c_str()); errorMessage = "Invalid update host: " + updateHost; @@ -183,7 +186,8 @@ void setUpdatesDir() } } else { logger->log("Warning: no protocol was specified for the update host"); - updatesDir = "updates/" + updateHost; + updates << "updates/" << updateHost << "-" << loginData.port; + updatesDir = updates.str(); } ResourceManager *resman = ResourceManager::getInstance(); @@ -708,8 +712,8 @@ int main(int argc, char *argv[]) if (!options.password.empty()) { loginData.password = options.password; } - loginData.hostname = config.getValue("host", "216.139.126.36"); - loginData.port = (short)config.getValue("port", 0); + loginData.hostname = config.getValue("host", "www.aethyra.org"); + loginData.port = (short)config.getValue("port", 21001); loginData.remember = config.getValue("remember", 0); loginData.registerLogin = false; diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 87e4c8a4..baca0cfc 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -51,7 +51,7 @@ BeingHandler::BeingHandler(bool enableSync): SMSG_BEING_MOVE2, SMSG_BEING_REMOVE, SMSG_BEING_ACTION, - SMSG_BEING_LEVELUP, + SMSG_BEING_SELFEFFECT, SMSG_BEING_EMOTION, SMSG_BEING_CHANGE_LOOKS, SMSG_BEING_CHANGE_LOOKS2, @@ -263,27 +263,17 @@ void BeingHandler::handleMessage(MessageIn *msg) } break; - case SMSG_BEING_LEVELUP: + case SMSG_BEING_SELFEFFECT: { id = (Uint32)msg->readInt32(); + if (!beingManager->findBeing(id)) + break; + + int effectType = msg->readInt32(); + + beingManager->findBeing(id)->triggerEffect(effectType); - if (id == player_node->getId()) { - logger->log("Level up"); - sound.playSfx("sfx/levelup.ogg"); - } - else { - logger->log("Someone else went level up"); - } - Particle *levelupFX; - if (msg->readInt32() == 0) { // type - levelupFX = particleEngine->addEffect( - "graphics/particles/levelup.particle.xml", 0, 0); - } - else { - levelupFX = particleEngine->addEffect( - "graphics/particles/skillup.particle.xml", 0, 0); - } - beingManager->findBeing(id)->controlParticle(levelupFX); break; + } case SMSG_BEING_EMOTION: if (!(dstBeing = beingManager->findBeing(msg->readInt32()))) diff --git a/src/net/protocol.h b/src/net/protocol.h index 7d5edf94..5e1d3c62 100644 --- a/src/net/protocol.h +++ b/src/net/protocol.h @@ -65,7 +65,7 @@ #define SMSG_BEING_REMOVE 0x0080 #define SMSG_BEING_CHANGE_LOOKS 0x00c3 #define SMSG_BEING_CHANGE_LOOKS2 0x01d7 /**< Same as 0x00c3, but 16 bit ID */ -#define SMSG_BEING_LEVELUP 0x019b +#define SMSG_BEING_SELFEFFECT 0x019b #define SMSG_BEING_EMOTION 0x00c0 #define SMSG_BEING_ACTION 0x008a /**< Attack, sit, stand up, ... */ #define SMSG_BEING_CHAT 0x008d /**< A being talks */ diff --git a/src/player.h b/src/player.h index fdca64e8..6def34a5 100644 --- a/src/player.h +++ b/src/player.h @@ -79,6 +79,15 @@ class Player : public Being * Flash the player's name */ void flash(int time); + + /** + * Triggers a visual/audio effect, such as `level up' + * + * \param effect_id ID of the effect to trigger + */ + virtual void + triggerEffect(int effectId) { internalTriggerEffect(effectId, true, true); } + protected: void updateCoords(); private: diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 4d78aa1c..fbab5380 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -84,14 +84,14 @@ void ItemDB::load() } int type = XML::getProperty(node, "type", 0); - int weight = XML::getProperty(node, "weight", 0); + //int weight = XML::getProperty(node, "weight", 0); int view = XML::getProperty(node, "view", 0); std::string name = XML::getProperty(node, "name", ""); std::string image = XML::getProperty(node, "image", ""); std::string description = XML::getProperty(node, "description", ""); - std::string effect = XML::getProperty(node, "effect", ""); - int weaponType = XML::getProperty(node, "weapon_type", 0); + //std::string effect = XML::getProperty(node, "effect", ""); // Not used by Aethyra + //int weaponType = XML::getProperty(node, "weapon_type", 0); if (id) { @@ -99,11 +99,11 @@ void ItemDB::load() itemInfo->setImageName(image); itemInfo->setName((name == "") ? "Unnamed" : name); itemInfo->setDescription(description); - itemInfo->setEffect(effect); + //itemInfo->setEffect(effect); itemInfo->setType(type); itemInfo->setView(view); - itemInfo->setWeight(weight); - itemInfo->setWeaponType(weaponType); + //itemInfo->setWeight(weight); + //itemInfo->setWeaponType(weaponType); for_each_xml_child_node(itemChild, node) { @@ -127,7 +127,7 @@ void ItemDB::load() CHECK_PARAM(name, ""); CHECK_PARAM(image, ""); CHECK_PARAM(description, ""); - CHECK_PARAM(effect, ""); + //CHECK_PARAM(effect, ""); // CHECK_PARAM(type, 0); // CHECK_PARAM(weight, 0); // CHECK_PARAM(slot, 0); |