diff options
Diffstat (limited to 'src/party.cpp')
| -rw-r--r-- | src/party.cpp | 121 |
1 files changed, 94 insertions, 27 deletions
| diff --git a/src/party.cpp b/src/party.cpp index 2af252f..307bca8 100644 --- a/src/party.cpp +++ b/src/party.cpp | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | #include "party.h" | 1 | #include "party.h" |
| 2 | #include "consts.h" | 2 | #include "consts.h" |
| 3 | #include <iostream> | ||
| 3 | 4 | ||
| 4 | void Party::addMember(Game& game, int spriteId) { | 5 | void Party::addMember(Game& game, int spriteId) { |
| 5 | int index = members_.size(); | 6 | int index = members_.size(); |
| @@ -93,41 +94,84 @@ void Party::move(Game& game, const Input& keystate) { | |||
| 93 | 94 | ||
| 94 | pLoc += (unitVecInDirection(dir) * speed); | 95 | pLoc += (unitVecInDirection(dir) * speed); |
| 95 | 96 | ||
| 96 | game.moveSprite(members_[0].spriteId, pLoc); | 97 | // Check collision. |
| 98 | const Map& map = game.getMap(); | ||
| 99 | bool blocked = false; | ||
| 100 | |||
| 101 | const vec2i UL_COL_BOX = { 8, 8 }; | ||
| 102 | const vec2i DR_COL_BOX = { 4, 0 }; | ||
| 103 | vec2i oldColPosUL = (p1.loc() - UL_COL_BOX) / map.getTileSize(); | ||
| 104 | vec2i newColPosUL = (pLoc - UL_COL_BOX) / map.getTileSize(); | ||
| 105 | vec2i oldColPosDR = (p1.loc() + DR_COL_BOX) / map.getTileSize(); | ||
| 106 | vec2i newColPosDR = (pLoc + DR_COL_BOX) / map.getTileSize(); | ||
| 107 | |||
| 108 | if (dirHasDir(dir, Direction::right) && | ||
| 109 | newColPosDR.x() > oldColPosDR.x()) { | ||
| 110 | for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { | ||
| 111 | if (map.isBlocked(newColPosDR.x(), y)) { | ||
| 112 | blocked = true; | ||
| 113 | pLoc.x() = p1.loc().x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | ||
| 114 | break; | ||
| 115 | } | ||
| 116 | } | ||
| 117 | } | ||
| 97 | 118 | ||
| 98 | for (int i = 1; i < members_.size(); i++) { | 119 | if (dirHasDir(dir, Direction::left) && |
| 99 | const Sprite& pNext = game.getSprite(members_[i].spriteId); | 120 | newColPosUL.x() < oldColPosUL.x()) { |
| 100 | const Movement& posdir = members_[i].movement.front(); | 121 | for (int y = newColPosUL.y(); y <= newColPosDR.y(); y++) { |
| 101 | game.moveSprite(members_[i].spriteId, posdir.pos); | 122 | if (map.isBlocked(newColPosUL.x(), y)) { |
| 102 | game.setSpriteDirection(members_[i].spriteId, posdir.dir); | 123 | blocked = true; |
| 124 | pLoc.x() = p1.loc().x();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | ||
| 125 | break; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | ||
| 103 | 129 | ||
| 104 | members_[i].movement.pop_front(); | 130 | if (dirHasDir(dir, Direction::down) && |
| 105 | members_[i].movement.push_back({.pos = pLoc, .dir = dir}); | 131 | newColPosDR.y() > oldColPosDR.y()) { |
| 132 | for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { | ||
| 133 | if (map.isBlocked(x, newColPosDR.y())) { | ||
| 134 | blocked = true; | ||
| 135 | pLoc.y() = p1.loc().y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | ||
| 136 | break; | ||
| 137 | } | ||
| 138 | } | ||
| 106 | } | 139 | } |
| 107 | } | ||
| 108 | 140 | ||
| 109 | void Party::beginCrouch(Game& game) { | 141 | if (dirHasDir(dir, Direction::up) && |
| 110 | if (state_ == State::Running) { | 142 | newColPosUL.y() < oldColPosUL.y()) { |
| 111 | state_ = State::Normal; | 143 | for (int x = newColPosUL.x(); x <= newColPosDR.x(); x++) { |
| 144 | if (map.isBlocked(x, newColPosUL.y())) { | ||
| 145 | blocked = true; | ||
| 146 | pLoc.y() = p1.loc().y();//(newColPosDR * map.getTileSize() - (collisionBox / 2)).x() - 1; | ||
| 147 | break; | ||
| 148 | } | ||
| 149 | } | ||
| 150 | } | ||
| 151 | |||
| 152 | if (blocked && state_ == State::Running) { | ||
| 153 | stopRunning(game); | ||
| 154 | } | ||
| 155 | |||
| 156 | // Move everything | ||
| 157 | if (pLoc != p1.loc()) { | ||
| 158 | game.moveSprite(members_[0].spriteId, pLoc); | ||
| 112 | 159 | ||
| 113 | // Double the movement buffer for the followers. | ||
| 114 | for (int i = 1; i < members_.size(); i++) { | 160 | for (int i = 1; i < members_.size(); i++) { |
| 115 | std::deque<Movement> newMove; | 161 | const Sprite& pNext = game.getSprite(members_[i].spriteId); |
| 116 | vec2i lastPos = game.getSprite(members_[i].spriteId).loc(); | 162 | const Movement& posdir = members_[i].movement.front(); |
| 117 | 163 | game.moveSprite(members_[i].spriteId, posdir.pos); | |
| 118 | while (!members_[i].movement.empty()) { | 164 | game.setSpriteDirection(members_[i].spriteId, posdir.dir); |
| 119 | Movement m1 = members_[i].movement.front(); | ||
| 120 | Movement m2 = m1; | ||
| 121 | m1.pos = (m1.pos + lastPos) / 2; | ||
| 122 | lastPos = m2.pos; | ||
| 123 | |||
| 124 | newMove.push_back(m1); | ||
| 125 | newMove.push_back(m2); | ||
| 126 | members_[i].movement.pop_front(); | ||
| 127 | } | ||
| 128 | 165 | ||
| 129 | members_[i].movement = std::move(newMove); | 166 | members_[i].movement.pop_front(); |
| 167 | members_[i].movement.push_back({.pos = pLoc, .dir = dir}); | ||
| 130 | } | 168 | } |
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | void Party::beginCrouch(Game& game) { | ||
| 173 | if (state_ == State::Running) { | ||
| 174 | stopRunning(game); | ||
| 131 | } else { | 175 | } else { |
| 132 | state_ = State::Crouching; | 176 | state_ = State::Crouching; |
| 133 | 177 | ||
| @@ -159,3 +203,26 @@ void Party::endCrouch(Game& game) { | |||
| 159 | } | 203 | } |
| 160 | } | 204 | } |
| 161 | } | 205 | } |
| 206 | |||
| 207 | void Party::stopRunning(Game& game) { | ||
| 208 | state_ = State::Normal; | ||
| 209 | |||
| 210 | // Double the movement buffer for the followers. | ||
| 211 | for (int i = 1; i < members_.size(); i++) { | ||
| 212 | std::deque<Movement> newMove; | ||
| 213 | vec2i lastPos = game.getSprite(members_[i].spriteId).loc(); | ||
| 214 | |||
| 215 | while (!members_[i].movement.empty()) { | ||
| 216 | Movement m1 = members_[i].movement.front(); | ||
| 217 | Movement m2 = m1; | ||
| 218 | m1.pos = (m1.pos + lastPos) / 2; | ||
| 219 | lastPos = m2.pos; | ||
| 220 | |||
| 221 | newMove.push_back(m1); | ||
| 222 | newMove.push_back(m2); | ||
| 223 | members_[i].movement.pop_front(); | ||
| 224 | } | ||
| 225 | |||
| 226 | members_[i].movement = std::move(newMove); | ||
| 227 | } | ||
| 228 | } | ||
