summary refs log tree commit diff stats
path: root/src/party.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/party.cpp')
-rw-r--r--src/party.cpp121
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
4void Party::addMember(Game& game, int spriteId) { 5void 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
109void 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
172void 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
207void 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}