diff options
Diffstat (limited to 'src/character_system.cpp')
-rw-r--r-- | src/character_system.cpp | 122 |
1 files changed, 93 insertions, 29 deletions
diff --git a/src/character_system.cpp b/src/character_system.cpp index 99b6929..27c2280 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp | |||
@@ -34,7 +34,7 @@ void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { | |||
34 | 34 | ||
35 | for (int i=0; i<truePartyDelay; i++) { | 35 | for (int i=0; i<truePartyDelay; i++) { |
36 | vec2i tween = ((follower.loc - targetPos) * i) / static_cast<double>(truePartyDelay) + targetPos; | 36 | vec2i tween = ((follower.loc - targetPos) * i) / static_cast<double>(truePartyDelay) + targetPos; |
37 | follower.trail.push_front({.pos = tween, .dir = toFace}); | 37 | follower.trail.push_front({.pos = tween, .dir = toFace, .medium = CharacterMedium::Normal}); |
38 | } | 38 | } |
39 | 39 | ||
40 | leader.followers.push_back(followerId); | 40 | leader.followers.push_back(followerId); |
@@ -70,14 +70,31 @@ void CharacterSystem::transplantParty(int leaderId, vec2i pos, Direction dir) { | |||
70 | 70 | ||
71 | void CharacterSystem::moveInDirection(int spriteId, Direction dir) { | 71 | void CharacterSystem::moveInDirection(int spriteId, Direction dir) { |
72 | Sprite& sprite = game_.getSprite(spriteId); | 72 | Sprite& sprite = game_.getSprite(spriteId); |
73 | sprite.movementDir = dir; | ||
73 | 74 | ||
74 | game_.getSystem<AnimationSystem>().setSpriteDirection(spriteId, dir); | 75 | switch (sprite.characterMedium) { |
76 | case CharacterMedium::Normal: { | ||
77 | game_.getSystem<AnimationSystem>().setSpriteDirection(spriteId, dir); | ||
78 | break; | ||
79 | } | ||
80 | case CharacterMedium::Ladder: { | ||
81 | if (dirHasDir(dir, Direction::up)) { | ||
82 | game_.getSystem<AnimationSystem>().setSpriteDirection(spriteId, Direction::up); | ||
83 | } else if (dirHasDir(dir, Direction::down)) { | ||
84 | game_.getSystem<AnimationSystem>().setSpriteDirection(spriteId, Direction::down); | ||
85 | } | ||
86 | break; | ||
87 | } | ||
88 | } | ||
75 | 89 | ||
76 | if (sprite.characterState == CharacterState::Still) { | 90 | if (sprite.characterState == CharacterState::Still) { |
77 | setPartyState(spriteId, CharacterState::Walking); | 91 | setPartyState(spriteId, CharacterState::Walking); |
78 | } else if (sprite.characterState == CharacterState::Crouching) { | 92 | } else if (sprite.characterState == CharacterState::Crouching) { |
79 | for (int followerId : sprite.followers) { | 93 | for (int followerId : sprite.followers) { |
80 | game_.getSystem<AnimationSystem>().setSpriteDirection(followerId, dir); | 94 | Sprite& follower = game_.getSprite(followerId); |
95 | if (follower.characterMedium == CharacterMedium::Normal) { | ||
96 | game_.getSystem<AnimationSystem>().setSpriteDirection(followerId, dir); | ||
97 | } | ||
81 | } | 98 | } |
82 | } | 99 | } |
83 | } | 100 | } |
@@ -107,14 +124,18 @@ void CharacterSystem::tick(double dt) { | |||
107 | } | 124 | } |
108 | 125 | ||
109 | int speed = sprite.movementSpeed; | 126 | int speed = sprite.movementSpeed; |
110 | if (sprite.characterState == CharacterState::Running) { | 127 | if (sprite.characterState == CharacterState::Running && sprite.characterMedium == CharacterMedium::Normal) { |
111 | speed *= 2; | 128 | speed *= 2; |
112 | } | 129 | } |
113 | 130 | ||
114 | pLoc += (unitVecInDirection(sprite.dir) * speed); | 131 | if (sprite.characterMedium == CharacterMedium::Ladder) { |
132 | //game_.getSystem<AnimationSystem>().advanceAnimation(spriteId); | ||
133 | } | ||
134 | |||
135 | pLoc += (unitVecInDirection(sprite.movementDir) * speed); | ||
115 | 136 | ||
116 | // Check collision. | 137 | // Check collision. |
117 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, pLoc, sprite.dir); | 138 | CollisionResult collision = game_.getSystem<TransformSystem>().checkCollision(spriteId, pLoc, sprite.movementDir); |
118 | bool blocked = collision.horiz.blocked || collision.vert.blocked; | 139 | bool blocked = collision.horiz.blocked || collision.vert.blocked; |
119 | 140 | ||
120 | if (collision.horiz.blocked && !sprite.clipping) { | 141 | if (collision.horiz.blocked && !sprite.clipping) { |
@@ -146,6 +167,12 @@ void CharacterSystem::tick(double dt) { | |||
146 | if (pLoc != sprite.loc) { | 167 | if (pLoc != sprite.loc) { |
147 | game_.getSystem<TransformSystem>().moveSprite(spriteId, pLoc); | 168 | game_.getSystem<TransformSystem>().moveSprite(spriteId, pLoc); |
148 | 169 | ||
170 | CharacterMedium newMedium = game_.getSystem<TransformSystem>().getMediumAtPosition(spriteId, pLoc); | ||
171 | if (newMedium != sprite.characterMedium) { | ||
172 | sprite.characterMedium = newMedium; | ||
173 | setAnimationFor(spriteId, sprite.characterState); | ||
174 | } | ||
175 | |||
149 | if (sprite.characterState == CharacterState::Running) { | 176 | if (sprite.characterState == CharacterState::Running) { |
150 | const Map& map = game_.getMap(); | 177 | const Map& map = game_.getMap(); |
151 | 178 | ||
@@ -164,12 +191,20 @@ void CharacterSystem::tick(double dt) { | |||
164 | 191 | ||
165 | for (int followerId : sprite.followers) { | 192 | for (int followerId : sprite.followers) { |
166 | Sprite& pNext = game_.getSprite(followerId); | 193 | Sprite& pNext = game_.getSprite(followerId); |
194 | if (pNext.characterMedium == CharacterMedium::Ladder) { | ||
195 | //game_.getSystem<AnimationSystem>().advanceAnimation(followerId); | ||
196 | } | ||
197 | |||
167 | const Movement& posdir = pNext.trail.front(); | 198 | const Movement& posdir = pNext.trail.front(); |
168 | game_.getSystem<TransformSystem>().moveSprite(followerId, posdir.pos); | 199 | game_.getSystem<TransformSystem>().moveSprite(followerId, posdir.pos); |
169 | game_.getSystem<AnimationSystem>().setSpriteDirection(followerId, posdir.dir); | 200 | game_.getSystem<AnimationSystem>().setSpriteDirection(followerId, posdir.dir); |
201 | if (posdir.medium != pNext.characterMedium) { | ||
202 | pNext.characterMedium = posdir.medium; | ||
203 | setAnimationFor(followerId, sprite.characterState); | ||
204 | } | ||
170 | 205 | ||
171 | pNext.trail.pop_front(); | 206 | pNext.trail.pop_front(); |
172 | pNext.trail.push_back({.pos = pLoc, .dir = sprite.dir}); | 207 | pNext.trail.push_back({.pos = pLoc, .dir = sprite.dir, .medium = sprite.characterMedium}); |
173 | } | 208 | } |
174 | } | 209 | } |
175 | } | 210 | } |
@@ -180,6 +215,10 @@ void CharacterSystem::tick(double dt) { | |||
180 | void CharacterSystem::beginCrouch(int spriteId) { | 215 | void CharacterSystem::beginCrouch(int spriteId) { |
181 | Sprite& sprite = game_.getSprite(spriteId); | 216 | Sprite& sprite = game_.getSprite(spriteId); |
182 | 217 | ||
218 | if (sprite.characterMedium == CharacterMedium::Ladder) { | ||
219 | return; | ||
220 | } | ||
221 | |||
183 | if (sprite.characterState == CharacterState::Running) { | 222 | if (sprite.characterState == CharacterState::Running) { |
184 | stopRunning(spriteId); | 223 | stopRunning(spriteId); |
185 | } else { | 224 | } else { |
@@ -242,32 +281,12 @@ void CharacterSystem::stopRunning(int spriteId) { | |||
242 | } | 281 | } |
243 | 282 | ||
244 | void CharacterSystem::setPartyState(int spriteId, CharacterState state) { | 283 | void CharacterSystem::setPartyState(int spriteId, CharacterState state) { |
245 | std::string animName; | ||
246 | switch (state) { | ||
247 | case CharacterState::Still: { | ||
248 | animName = "still"; | ||
249 | break; | ||
250 | } | ||
251 | case CharacterState::Walking: { | ||
252 | animName = "walk"; | ||
253 | break; | ||
254 | } | ||
255 | case CharacterState::Crouching: { | ||
256 | animName = "crouch"; | ||
257 | break; | ||
258 | } | ||
259 | case CharacterState::Running: { | ||
260 | animName = "run"; | ||
261 | break; | ||
262 | } | ||
263 | } | ||
264 | |||
265 | Sprite& sprite = game_.getSprite(spriteId); | 284 | Sprite& sprite = game_.getSprite(spriteId); |
266 | sprite.characterState = state; | 285 | sprite.characterState = state; |
267 | 286 | ||
268 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); | 287 | setAnimationFor(spriteId, state); |
269 | for (int followerId : sprite.followers) { | 288 | for (int followerId : sprite.followers) { |
270 | game_.getSystem<AnimationSystem>().setSpriteAnimation(followerId, animName); | 289 | setAnimationFor(followerId, state); |
271 | } | 290 | } |
272 | } | 291 | } |
273 | 292 | ||
@@ -297,3 +316,48 @@ void CharacterSystem::destroySprite(int spriteId) { | |||
297 | stopRunningSound(sprite); | 316 | stopRunningSound(sprite); |
298 | } | 317 | } |
299 | } | 318 | } |
319 | |||
320 | void CharacterSystem::setAnimationFor(int spriteId, CharacterState state) { | ||
321 | Sprite& sprite = game_.getSprite(spriteId); | ||
322 | std::string animName; | ||
323 | |||
324 | switch (sprite.characterMedium) { | ||
325 | case CharacterMedium::Normal: { | ||
326 | std::string animName; | ||
327 | |||
328 | switch (state) { | ||
329 | case CharacterState::Still: { | ||
330 | animName = "still"; | ||
331 | break; | ||
332 | } | ||
333 | case CharacterState::Walking: { | ||
334 | animName = "walk"; | ||
335 | break; | ||
336 | } | ||
337 | case CharacterState::Crouching: { | ||
338 | animName = "crouch"; | ||
339 | break; | ||
340 | } | ||
341 | case CharacterState::Running: { | ||
342 | animName = "run"; | ||
343 | break; | ||
344 | } | ||
345 | } | ||
346 | |||
347 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, animName); | ||
348 | |||
349 | break; | ||
350 | } | ||
351 | case CharacterMedium::Ladder: { | ||
352 | game_.getSystem<AnimationSystem>().setSpriteAnimation(spriteId, "climb."); | ||
353 | |||
354 | if (state == CharacterState::Still || state == CharacterState::Crouching) { | ||
355 | sprite.animPaused = true; | ||
356 | } else { | ||
357 | sprite.animPaused = false; | ||
358 | } | ||
359 | |||
360 | break; | ||
361 | } | ||
362 | } | ||
363 | } | ||