diff options
author | Andrei Karas <akaras@inbox.ru> | 2011-05-09 23:02:28 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2011-05-09 23:02:28 +0300 |
commit | 94a9a81d9c6aa9fa287616c8b4bfc5ea86214dcd (patch) | |
tree | a5fd9ec3c5844ce9b8d6b4c63c25c9ded803a6a0 | |
parent | 51169702a6fba4626eeae44faa35ebcbf40e5fed (diff) | |
download | mv-94a9a81d9c6aa9fa287616c8b4bfc5ea86214dcd.tar.gz mv-94a9a81d9c6aa9fa287616c8b4bfc5ea86214dcd.tar.bz2 mv-94a9a81d9c6aa9fa287616c8b4bfc5ea86214dcd.tar.xz mv-94a9a81d9c6aa9fa287616c8b4bfc5ea86214dcd.zip |
Impliment air and water block types.
-rw-r--r-- | src/being.cpp | 2 | ||||
-rw-r--r-- | src/being.h | 2 | ||||
-rw-r--r-- | src/localplayer.cpp | 6 | ||||
-rw-r--r-- | src/localplayer.h | 2 | ||||
-rw-r--r-- | src/map.cpp | 8 | ||||
-rw-r--r-- | src/map.h | 29 | ||||
-rw-r--r-- | src/resources/beinginfo.cpp | 3 | ||||
-rw-r--r-- | src/resources/mapreader.cpp | 31 | ||||
-rw-r--r-- | src/resources/monsterdb.cpp | 4 |
9 files changed, 77 insertions, 10 deletions
diff --git a/src/being.cpp b/src/being.cpp index 95ba4a63a..8a9d3c1e1 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -408,6 +408,8 @@ void Being::clearPath() void Being::setPath(const Path &path) { mPath = path; + if (mPath.empty()) + return; if ((Net::getNetworkType() == ServerInfo::TMWATHENA) && mAction != MOVE && mAction != DEAD) diff --git a/src/being.h b/src/being.h index 9609c2909..199cb4dc2 100644 --- a/src/being.h +++ b/src/being.h @@ -392,7 +392,7 @@ class Being : public ActorSprite, public ConfigListener /** * Gets the way the object is blocked by other objects. */ - unsigned char getWalkMask() const; + virtual unsigned char getWalkMask() const; /** * Gets the way the monster blocks pathfinding for other objects diff --git a/src/localplayer.cpp b/src/localplayer.cpp index bcc78dd1b..0dea8ddac 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -3835,6 +3835,12 @@ void LocalPlayer::resetYellowBar() miniStatusWindow->updateStatus(); } +unsigned char LocalPlayer::getWalkMask() const +{ + // for now blocking all types of collisions + return Map::BLOCKMASK_WALL | Map::BLOCKMASK_AIR | Map::BLOCKMASK_WATER; +} + void AwayListener::action(const gcn::ActionEvent &event) { if (event.getId() == "ok" && player_node && player_node->getAwayMode()) diff --git a/src/localplayer.h b/src/localplayer.h index 6a6a015b8..9cf0b9cfa 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -451,6 +451,8 @@ class LocalPlayer : public Being, public ActorSpriteListener, void resetYellowBar(); + virtual unsigned char getWalkMask() const; + protected: /** Whether or not the name settings have changed */ bool mUpdateName; diff --git a/src/map.cpp b/src/map.cpp index 8d2031019..83143a7c8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -793,6 +793,12 @@ void Map::blockTile(int x, int y, BlockType type) case BLOCKTYPE_MONSTER: mMetaTiles[tileNum].blockmask |= BLOCKMASK_MONSTER; break; + case BLOCKTYPE_AIR: + mMetaTiles[tileNum].blockmask |= BLOCKMASK_AIR; + break; + case BLOCKTYPE_WATER: + mMetaTiles[tileNum].blockmask |= BLOCKMASK_WATER; + break; default: case BLOCKTYPE_NONE: case NB_BLOCKTYPES: @@ -1053,6 +1059,7 @@ Path Map::findPath(int startX, int startY, int destX, int destY, // Skip if the tile is on the closed list or is not walkable // unless its the destination tile + //+++ here need check block must depend on player abilities. if (!newTile || newTile->whichList == mOnClosedList || ((newTile->blockmask & walkmask) && !(x == destX && y == destY)) @@ -1068,6 +1075,7 @@ Path Map::findPath(int startX, int startY, int destX, int destY, MetaTile *t1 = getMetaTile(curr.x, curr.y + dy); MetaTile *t2 = getMetaTile(curr.x + dx, curr.y); + //+++ here need check block must depend on player abilities. if (!t1 || !t2 || ((t1->blockmask | t2->blockmask) & BLOCKMASK_WALL)) { @@ -210,14 +210,27 @@ class Map : public Properties, public ConfigListener BLOCKTYPE_WALL, BLOCKTYPE_CHARACTER, BLOCKTYPE_MONSTER, + BLOCKTYPE_AIR, + BLOCKTYPE_WATER, NB_BLOCKTYPES }; + enum CollisionTypes + { + COLLISION_EMPTY = 0, + COLLISION_WALL = 1, + COLLISION_AIR = 2, + COLLISION_WATER = 3, + COLLISION_MAX = 4 + }; + enum BlockMask { - BLOCKMASK_WALL = 0x80, // = bin 1000 0000 - BLOCKMASK_CHARACTER = 0x01, // = bin 0000 0001 - BLOCKMASK_MONSTER = 0x02 // = bin 0000 0010 + BLOCKMASK_WALL = 0x80, // 1000 0000 + BLOCKMASK_CHARACTER = 0x01, // 0000 0001 + BLOCKMASK_MONSTER = 0x02, // 0000 0010 + BLOCKMASK_AIR = 0x04, // 0000 0100 + BLOCKMASK_WATER = 0x08, // 0000 1000 }; enum DebugType @@ -297,7 +310,8 @@ class Map : public Properties, public ConfigListener * without walkmask, only blocks against colliding tiles. */ bool getWalk(int x, int y, - unsigned char walkmask = BLOCKMASK_WALL) const; + unsigned char walkmask = BLOCKMASK_WALL | BLOCKMASK_AIR + | BLOCKMASK_WATER) const; /** * Tells whether a tile is occupied by a being. @@ -440,6 +454,12 @@ class Map : public Properties, public ConfigListener void setActorsFix(int x, int y) { mActorFixX = x; mActorFixY = y; } + int getVersion() + { return mVersion; } + + void setVersion(int n) + { mVersion = n; } + protected: friend class Actor; @@ -528,6 +548,7 @@ class Map : public Properties, public ConfigListener int mIndexedTilesetsSize; int mActorFixX; int mActorFixY; + int mVersion; SpecialLayer *mSpecialLayer; SpecialLayer *mTempLayer; diff --git a/src/resources/beinginfo.cpp b/src/resources/beinginfo.cpp index d0535ef04..438de46dd 100644 --- a/src/resources/beinginfo.cpp +++ b/src/resources/beinginfo.cpp @@ -33,7 +33,8 @@ BeingInfo::BeingInfo(): mName(_("unnamed")), mTargetCursorSize(ActorSprite::TC_MEDIUM), mWalkMask(Map::BLOCKMASK_WALL | Map::BLOCKMASK_CHARACTER - | Map::BLOCKMASK_MONSTER), + | Map::BLOCKMASK_MONSTER | Map::BLOCKMASK_AIR + | Map::BLOCKMASK_WATER), mBlockType(Map::BLOCKTYPE_CHARACTER), mTargetOffsetX(0), mTargetOffsetY(0), mMaxHP(0), mStaticMaxHP(false) diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index 818968621..7fa088326 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -288,6 +288,8 @@ Map *MapReader::readMap(xmlNodePtr node, const std::string &path) else if (xmlStrEqual(childNode->name, BAD_CAST "properties")) { readProperties(childNode, map); + map->setVersion(atoi(map->getProperty( + "manaplus version").c_str())); } else if (xmlStrEqual(childNode->name, BAD_CAST "objectgroup")) { @@ -407,8 +409,33 @@ inline static void setTile(Map *map, MapLayer *layer, int x, int y, int gid) { // Set collision tile // if (set && (gid - set->getFirstGid() == 1)) buggy update - if (set && (gid - set->getFirstGid() != 0)) - map->blockTile(x, y, Map::BLOCKTYPE_WALL); + if (set) + { + if (map->getVersion() >= 1) + { + switch (gid - set->getFirstGid()) + { + case Map::COLLISION_WALL: + map->blockTile(x, y, Map::BLOCKTYPE_WALL); + break; + case Map::COLLISION_AIR: + logger->log("air: %d, %d", x, y); + map->blockTile(x, y, Map::BLOCKTYPE_AIR); + break; + case Map::COLLISION_WATER: + logger->log("water: %d, %d", x, y); + map->blockTile(x, y, Map::BLOCKTYPE_WATER); + break; + default: + break; + } + } + else + { + if (gid - set->getFirstGid() != 0) + map->blockTile(x, y, Map::BLOCKTYPE_WALL); + } + } } } diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index 9fce60306..5a80b4500 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -71,8 +71,8 @@ void MonsterDB::load() BeingInfo *currentInfo = new BeingInfo; currentInfo->setWalkMask(Map::BLOCKMASK_WALL - | Map::BLOCKMASK_CHARACTER - | Map::BLOCKMASK_MONSTER); + | Map::BLOCKMASK_CHARACTER | Map::BLOCKMASK_MONSTER + | Map::BLOCKMASK_AIR | Map::BLOCKMASK_WATER); currentInfo->setBlockType(Map::BLOCKTYPE_MONSTER); currentInfo->setName(XML::getProperty( |