diff options
-rw-r--r-- | res/scripts/common.lua | 12 | ||||
-rw-r--r-- | src/camera_system.cpp | 4 | ||||
-rw-r--r-- | src/camera_system.h | 2 | ||||
-rw-r--r-- | src/character_system.cpp | 34 | ||||
-rw-r--r-- | src/character_system.h | 4 | ||||
-rw-r--r-- | src/game.cpp | 75 | ||||
-rw-r--r-- | src/game.h | 6 | ||||
-rw-r--r-- | src/main.cpp | 42 | ||||
-rw-r--r-- | src/script_system.cpp | 11 | ||||
-rw-r--r-- | src/sprite.h | 1 | ||||
-rw-r--r-- | src/system.h | 2 | ||||
-rw-r--r-- | src/transform_system.cpp | 10 | ||||
-rw-r--r-- | src/transform_system.h | 2 |
13 files changed, 111 insertions, 94 deletions
diff --git a/res/scripts/common.lua b/res/scripts/common.lua index 8a9445b..2e6a7e2 100644 --- a/res/scripts/common.lua +++ b/res/scripts/common.lua | |||
@@ -178,21 +178,15 @@ function ChangeMap(map, warp) | |||
178 | local playerId = getPlayerSprite() | 178 | local playerId = getPlayerSprite() |
179 | local playerSprite = getSprite(playerId) | 179 | local playerSprite = getSprite(playerId) |
180 | local direction = playerSprite.dir | 180 | local direction = playerSprite.dir |
181 | local oldState = playerSprite.characterState | ||
182 | 181 | ||
183 | playerSprite.controllable = false | 182 | playerSprite.controllable = false |
184 | FadeToBlack(150) | 183 | FadeToBlack(150) |
185 | loadMap(map, warp, direction) | 184 | loadMap(map) |
186 | 185 | character():transplantParty(playerId, getWarpPoint(warp), direction) | |
187 | local newPlayerId = getPlayerSprite() | ||
188 | local newPlayerSprite = getSprite(newPlayerId) | ||
189 | if oldState == CharacterState.RUNNING then | ||
190 | character():startRunning(newPlayerId) | ||
191 | end | ||
192 | 186 | ||
193 | coroutine.yield() | 187 | coroutine.yield() |
194 | RemoveFadeout(150) | 188 | RemoveFadeout(150) |
195 | newPlayerSprite.controllable = true | 189 | playerSprite.controllable = true |
196 | end | 190 | end |
197 | 191 | ||
198 | function CreateAnimatedSpriteAtPosition(alias, character, x, y, animName, direction, layer) | 192 | function CreateAnimatedSpriteAtPosition(alias, character, x, y, animName, direction, layer) |
diff --git a/src/camera_system.cpp b/src/camera_system.cpp index 2d7be61..c46b9dd 100644 --- a/src/camera_system.cpp +++ b/src/camera_system.cpp | |||
@@ -45,10 +45,6 @@ void CameraSystem::destroySprite(int spriteId) { | |||
45 | } | 45 | } |
46 | } | 46 | } |
47 | 47 | ||
48 | void CameraSystem::clearSpriteCache() { | ||
49 | followingSprite_ = -1; | ||
50 | } | ||
51 | |||
52 | vec2i CameraSystem::calculatePosWithCenter(vec2i center) const { | 48 | vec2i CameraSystem::calculatePosWithCenter(vec2i center) const { |
53 | const Map& map = game_.getMap(); | 49 | const Map& map = game_.getMap(); |
54 | vec2i mapBounds = map.getMapSize() * map.getTileSize(); | 50 | vec2i mapBounds = map.getMapSize() * map.getTileSize(); |
diff --git a/src/camera_system.h b/src/camera_system.h index a2dee93..8c9419c 100644 --- a/src/camera_system.h +++ b/src/camera_system.h | |||
@@ -35,8 +35,6 @@ public: | |||
35 | 35 | ||
36 | void destroySprite(int spriteId) override; | 36 | void destroySprite(int spriteId) override; |
37 | 37 | ||
38 | void clearSpriteCache() override; | ||
39 | |||
40 | private: | 38 | private: |
41 | 39 | ||
42 | vec2i calculatePosWithCenter(vec2i center) const; | 40 | vec2i calculatePosWithCenter(vec2i center) const; |
diff --git a/src/character_system.cpp b/src/character_system.cpp index d0c416e..7d456f6 100644 --- a/src/character_system.cpp +++ b/src/character_system.cpp | |||
@@ -39,6 +39,32 @@ void CharacterSystem::addSpriteToParty(int leaderId, int followerId) { | |||
39 | game_.getSystem<AnimationSystem>().setSpriteAnimation(followerId, "still"); | 39 | game_.getSystem<AnimationSystem>().setSpriteAnimation(followerId, "still"); |
40 | } | 40 | } |
41 | 41 | ||
42 | void CharacterSystem::transplantParty(int leaderId, vec2i pos, Direction dir) { | ||
43 | Sprite& leader = game_.getSprite(leaderId); | ||
44 | CharacterState oldState = leader.characterState; | ||
45 | |||
46 | std::vector<int> followers = leader.followers; | ||
47 | leader.followers.clear(); | ||
48 | |||
49 | game_.getSystem<TransformSystem>().moveSprite(leaderId, pos); | ||
50 | game_.getSystem<AnimationSystem>().setSpriteDirection(leaderId, dir); | ||
51 | |||
52 | for (int followerId : followers) { | ||
53 | Sprite& follower = game_.getSprite(followerId); | ||
54 | follower.trail.clear(); | ||
55 | |||
56 | game_.getSystem<TransformSystem>().moveSprite(followerId, pos); | ||
57 | game_.getSystem<AnimationSystem>().setSpriteDirection(followerId, dir); | ||
58 | addSpriteToParty(leaderId, followerId); | ||
59 | } | ||
60 | |||
61 | if (oldState == CharacterState::Running) { | ||
62 | startRunning(leaderId); | ||
63 | } else { | ||
64 | setPartyState(leaderId, oldState); | ||
65 | } | ||
66 | } | ||
67 | |||
42 | void CharacterSystem::moveInDirection(int spriteId, Direction dir) { | 68 | void CharacterSystem::moveInDirection(int spriteId, Direction dir) { |
43 | Sprite& sprite = game_.getSprite(spriteId); | 69 | Sprite& sprite = game_.getSprite(spriteId); |
44 | 70 | ||
@@ -266,11 +292,3 @@ void CharacterSystem::destroySprite(int spriteId) { | |||
266 | stopRunningSound(sprite); | 292 | stopRunningSound(sprite); |
267 | } | 293 | } |
268 | } | 294 | } |
269 | |||
270 | void CharacterSystem::clearSpriteCache() { | ||
271 | for (Sprite& sprite : game_.getSprites() | game_.spriteView()) { | ||
272 | if (sprite.runningSfxChannel != -1) { | ||
273 | stopRunningSound(sprite); | ||
274 | } | ||
275 | } | ||
276 | } | ||
diff --git a/src/character_system.h b/src/character_system.h index 72a2585..8c2ea54 100644 --- a/src/character_system.h +++ b/src/character_system.h | |||
@@ -23,6 +23,8 @@ public: | |||
23 | 23 | ||
24 | void addSpriteToParty(int leaderId, int followerId); | 24 | void addSpriteToParty(int leaderId, int followerId); |
25 | 25 | ||
26 | void transplantParty(int leaderId, vec2i pos, Direction dir); | ||
27 | |||
26 | void moveInDirection(int spriteId, Direction dir); | 28 | void moveInDirection(int spriteId, Direction dir); |
27 | 29 | ||
28 | void stopDirecting(int spriteId); | 30 | void stopDirecting(int spriteId); |
@@ -37,8 +39,6 @@ public: | |||
37 | 39 | ||
38 | void destroySprite(int spriteId) override; | 40 | void destroySprite(int spriteId) override; |
39 | 41 | ||
40 | void clearSpriteCache() override; | ||
41 | |||
42 | private: | 42 | private: |
43 | 43 | ||
44 | void stopRunning(int spriteId); | 44 | void stopRunning(int spriteId); |
diff --git a/src/game.cpp b/src/game.cpp index b7ca869..ffa52cf 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
@@ -5,9 +5,19 @@ | |||
5 | #include "camera_system.h" | 5 | #include "camera_system.h" |
6 | 6 | ||
7 | int Game::emplaceSprite(std::string alias) { | 7 | int Game::emplaceSprite(std::string alias) { |
8 | int id = sprites_.size(); | 8 | int id; |
9 | sprites_.emplace_back(); | 9 | |
10 | sprites_.back().alias = alias; | 10 | if (idsToReuse_.empty()) { |
11 | id = sprites_.size(); | ||
12 | sprites_.emplace_back(); | ||
13 | sprites_.back().alias = alias; | ||
14 | } else { | ||
15 | id = idsToReuse_.front(); | ||
16 | idsToReuse_.pop_front(); | ||
17 | sprites_[id] = Sprite(); | ||
18 | sprites_[id].alias = alias; | ||
19 | } | ||
20 | |||
11 | spriteIds_.insert(id); | 21 | spriteIds_.insert(id); |
12 | spritesByAlias_[alias] = id; | 22 | spritesByAlias_[alias] = id; |
13 | return id; | 23 | return id; |
@@ -19,56 +29,28 @@ void Game::destroySprite(int id) { | |||
19 | } | 29 | } |
20 | 30 | ||
21 | spriteIds_.erase(id); | 31 | spriteIds_.erase(id); |
32 | idsToReuse_.push_back(id); | ||
22 | spritesByAlias_.erase(sprites_.at(id).alias); | 33 | spritesByAlias_.erase(sprites_.at(id).alias); |
23 | } | 34 | } |
24 | 35 | ||
25 | void Game::clearSprites() { | 36 | void Game::loadMap(std::string filename) { |
26 | for (std::unique_ptr<System>& system : systems_) { | 37 | // Clear out non-persistent sprites. |
27 | system->clearSpriteCache(); | 38 | std::list<int> spritesToDelete; |
28 | } | 39 | for (int spriteId : spriteIds_) { |
40 | Sprite& sprite = sprites_.at(spriteId); | ||
29 | 41 | ||
30 | sprites_.clear(); | 42 | if (!sprite.persistent) { |
31 | spriteIds_.clear(); | 43 | spritesToDelete.push_back(spriteId); |
32 | spritesByAlias_.clear(); | 44 | } |
33 | } | 45 | } |
34 | 46 | ||
35 | void Game::loadMap(std::string filename, std::string warpPoint, Direction dir) { | 47 | for (int spriteId : spritesToDelete) { |
36 | clearSprites(); | 48 | destroySprite(spriteId); |
49 | } | ||
37 | 50 | ||
51 | // Load the new map. | ||
38 | map_ = std::make_unique<Map>(filename); | 52 | map_ = std::make_unique<Map>(filename); |
39 | 53 | ||
40 | vec2i warpLoc = map_->getWarpPoint(warpPoint); | ||
41 | |||
42 | int lucasSprite = emplaceSprite("lucas"); | ||
43 | getSystem<TransformSystem>().initSprite(lucasSprite, warpLoc); | ||
44 | getSystem<TransformSystem>().setUpCollision(lucasSprite, {-8, -8}, {12, 8}, true); | ||
45 | getSystem<AnimationSystem>().initSprite(lucasSprite, "../res/sprites/lucas_anim.txt"); | ||
46 | getSystem<AnimationSystem>().setSpriteDirection(lucasSprite, dir); | ||
47 | getSprite(lucasSprite).hasShadow = true; | ||
48 | getSprite(lucasSprite).player = true; | ||
49 | getSystem<CharacterSystem>().initSprite(lucasSprite); | ||
50 | |||
51 | int kumaSprite = emplaceSprite("kuma"); | ||
52 | getSystem<TransformSystem>().initSprite(kumaSprite, warpLoc); | ||
53 | getSystem<AnimationSystem>().initSprite(kumaSprite, "../res/sprites/kuma_anim.txt"); | ||
54 | getSystem<AnimationSystem>().setSpriteDirection(kumaSprite, dir); | ||
55 | getSprite(kumaSprite).hasShadow = true; | ||
56 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, kumaSprite); | ||
57 | |||
58 | int dusterSprite = emplaceSprite("duster"); | ||
59 | getSystem<TransformSystem>().initSprite(dusterSprite, warpLoc); | ||
60 | getSystem<AnimationSystem>().initSprite(dusterSprite, "../res/sprites/duster_anim.txt"); | ||
61 | getSystem<AnimationSystem>().setSpriteDirection(dusterSprite, dir); | ||
62 | getSprite(dusterSprite).hasShadow = true; | ||
63 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, dusterSprite); | ||
64 | |||
65 | int boneySprite = emplaceSprite("boney"); | ||
66 | getSystem<TransformSystem>().initSprite(boneySprite, warpLoc); | ||
67 | getSystem<AnimationSystem>().initSprite(boneySprite, "../res/sprites/boney_anim.txt"); | ||
68 | getSystem<AnimationSystem>().setSpriteDirection(boneySprite, dir); | ||
69 | getSprite(boneySprite).hasShadow = true; | ||
70 | getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, boneySprite); | ||
71 | |||
72 | for (const Prototype& p : map_->getPrototypes()) { | 54 | for (const Prototype& p : map_->getPrototypes()) { |
73 | int spriteId = emplaceSprite(p.name); | 55 | int spriteId = emplaceSprite(p.name); |
74 | getSystem<TransformSystem>().initSprite(spriteId, p.pos); | 56 | getSystem<TransformSystem>().initSprite(spriteId, p.pos); |
@@ -86,7 +68,4 @@ void Game::loadMap(std::string filename, std::string warpPoint, Direction dir) { | |||
86 | getSystem<TransformSystem>().setUpCollision(spriteId, {0, 0}, t.size, false); | 68 | getSystem<TransformSystem>().setUpCollision(spriteId, {0, 0}, t.size, false); |
87 | getSprite(spriteId).walkthroughScript = t.script; | 69 | getSprite(spriteId).walkthroughScript = t.script; |
88 | } | 70 | } |
89 | |||
90 | getSystem<CameraSystem>().setFollowingSprite(lucasSprite); | ||
91 | getSystem<CameraSystem>().unlockCamera(); | ||
92 | } | 71 | } |
diff --git a/src/game.h b/src/game.h index 736fa7a..9340c65 100644 --- a/src/game.h +++ b/src/game.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef GAME_H_E6F1396E | 1 | #ifndef GAME_H_E6F1396E |
2 | #define GAME_H_E6F1396E | 2 | #define GAME_H_E6F1396E |
3 | 3 | ||
4 | #include <deque> | ||
4 | #include <list> | 5 | #include <list> |
5 | #include <range/v3/all.hpp> | 6 | #include <range/v3/all.hpp> |
6 | #include <vector> | 7 | #include <vector> |
@@ -76,7 +77,7 @@ public: | |||
76 | }); | 77 | }); |
77 | } | 78 | } |
78 | 79 | ||
79 | void loadMap(std::string filename, std::string warpPoint, Direction dir); | 80 | void loadMap(std::string filename); |
80 | 81 | ||
81 | const Map& getMap() const { return *map_; } | 82 | const Map& getMap() const { return *map_; } |
82 | 83 | ||
@@ -84,8 +85,6 @@ public: | |||
84 | 85 | ||
85 | private: | 86 | private: |
86 | 87 | ||
87 | void clearSprites(); | ||
88 | |||
89 | Mixer mixer_; | 88 | Mixer mixer_; |
90 | bool shouldQuit_ = false; | 89 | bool shouldQuit_ = false; |
91 | 90 | ||
@@ -93,6 +92,7 @@ private: | |||
93 | std::map<SystemKey, System*> systemByKey_; | 92 | std::map<SystemKey, System*> systemByKey_; |
94 | 93 | ||
95 | std::set<int> spriteIds_; | 94 | std::set<int> spriteIds_; |
95 | std::deque<int> idsToReuse_; | ||
96 | std::vector<Sprite> sprites_; | 96 | std::vector<Sprite> sprites_; |
97 | std::map<std::string, int> spritesByAlias_; | 97 | std::map<std::string, int> spritesByAlias_; |
98 | std::unique_ptr<Map> map_; | 98 | std::unique_ptr<Map> map_; |
diff --git a/src/main.cpp b/src/main.cpp index 79fa306..f220dc0 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -24,8 +24,46 @@ void loop(Renderer& renderer) { | |||
24 | game.emplaceSystem<MessageSystem>(); | 24 | game.emplaceSystem<MessageSystem>(); |
25 | game.emplaceSystem<EffectSystem>(); | 25 | game.emplaceSystem<EffectSystem>(); |
26 | 26 | ||
27 | game.loadMap("map2", "debugWarp_mailboxes", Direction::down); | 27 | game.loadMap("map2"); |
28 | game.getSprite(game.getSpriteByAlias("lucas")).controllable = true; | 28 | |
29 | vec2i warpLoc = game.getMap().getWarpPoint("debugWarp_mailboxes"); | ||
30 | |||
31 | int lucasSprite = game.emplaceSprite("lucas"); | ||
32 | game.getSystem<TransformSystem>().initSprite(lucasSprite, warpLoc); | ||
33 | game.getSystem<TransformSystem>().setUpCollision(lucasSprite, {-8, -8}, {12, 8}, true); | ||
34 | game.getSystem<AnimationSystem>().initSprite(lucasSprite, "../res/sprites/lucas_anim.txt"); | ||
35 | game.getSystem<AnimationSystem>().setSpriteDirection(lucasSprite, Direction::down); | ||
36 | game.getSprite(lucasSprite).hasShadow = true; | ||
37 | game.getSprite(lucasSprite).player = true; | ||
38 | game.getSprite(lucasSprite).controllable = true; | ||
39 | game.getSprite(lucasSprite).persistent = true; | ||
40 | game.getSystem<CharacterSystem>().initSprite(lucasSprite); | ||
41 | game.getSystem<CameraSystem>().setFollowingSprite(lucasSprite); | ||
42 | game.getSystem<CameraSystem>().unlockCamera(); | ||
43 | |||
44 | int kumaSprite = game.emplaceSprite("kuma"); | ||
45 | game.getSystem<TransformSystem>().initSprite(kumaSprite, warpLoc); | ||
46 | game.getSystem<AnimationSystem>().initSprite(kumaSprite, "../res/sprites/kuma_anim.txt"); | ||
47 | game.getSystem<AnimationSystem>().setSpriteDirection(kumaSprite, Direction::down); | ||
48 | game.getSprite(kumaSprite).hasShadow = true; | ||
49 | game.getSprite(kumaSprite).persistent = true; | ||
50 | game.getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, kumaSprite); | ||
51 | |||
52 | int dusterSprite = game.emplaceSprite("duster"); | ||
53 | game.getSystem<TransformSystem>().initSprite(dusterSprite, warpLoc); | ||
54 | game.getSystem<AnimationSystem>().initSprite(dusterSprite, "../res/sprites/duster_anim.txt"); | ||
55 | game.getSystem<AnimationSystem>().setSpriteDirection(dusterSprite, Direction::down); | ||
56 | game.getSprite(dusterSprite).hasShadow = true; | ||
57 | game.getSprite(dusterSprite).persistent = true; | ||
58 | game.getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, dusterSprite); | ||
59 | |||
60 | int boneySprite = game.emplaceSprite("boney"); | ||
61 | game.getSystem<TransformSystem>().initSprite(boneySprite, warpLoc); | ||
62 | game.getSystem<AnimationSystem>().initSprite(boneySprite, "../res/sprites/boney_anim.txt"); | ||
63 | game.getSystem<AnimationSystem>().setSpriteDirection(boneySprite, Direction::down); | ||
64 | game.getSprite(boneySprite).hasShadow = true; | ||
65 | game.getSprite(boneySprite).persistent = true; | ||
66 | game.getSystem<CharacterSystem>().addSpriteToParty(lucasSprite, boneySprite); | ||
29 | 67 | ||
30 | renderer.render(game); | 68 | renderer.render(game); |
31 | 69 | ||
diff --git a/src/script_system.cpp b/src/script_system.cpp index 8674f97..090bf46 100644 --- a/src/script_system.cpp +++ b/src/script_system.cpp | |||
@@ -54,6 +54,7 @@ ScriptSystem::ScriptSystem(Game& game) : game_(game) { | |||
54 | 54 | ||
55 | engine_.new_usertype<CharacterSystem>( | 55 | engine_.new_usertype<CharacterSystem>( |
56 | "character", | 56 | "character", |
57 | "transplantParty", &CharacterSystem::transplantParty, | ||
57 | "startRunning", &CharacterSystem::startRunning, | 58 | "startRunning", &CharacterSystem::startRunning, |
58 | "halt", &CharacterSystem::halt); | 59 | "halt", &CharacterSystem::halt); |
59 | 60 | ||
@@ -165,8 +166,14 @@ ScriptSystem::ScriptSystem(Game& game) : game_(game) { | |||
165 | 166 | ||
166 | engine_.set_function( | 167 | engine_.set_function( |
167 | "loadMap", | 168 | "loadMap", |
168 | [&] (std::string filename, std::string warpPoint, Direction dir) { | 169 | [&] (std::string filename) { |
169 | game_.loadMap(filename, warpPoint, dir); | 170 | game_.loadMap(filename); |
171 | }); | ||
172 | |||
173 | engine_.set_function( | ||
174 | "getWarpPoint", | ||
175 | [&] (std::string warp) { | ||
176 | return game_.getMap().getWarpPoint(warp); | ||
170 | }); | 177 | }); |
171 | 178 | ||
172 | engine_.script_file("../res/scripts/common.lua"); | 179 | engine_.script_file("../res/scripts/common.lua"); |
diff --git a/src/sprite.h b/src/sprite.h index 84b161f..19dbf92 100644 --- a/src/sprite.h +++ b/src/sprite.h | |||
@@ -42,6 +42,7 @@ class Sprite { | |||
42 | public: | 42 | public: |
43 | 43 | ||
44 | std::string alias; | 44 | std::string alias; |
45 | bool persistent = false; | ||
45 | 46 | ||
46 | // Transform | 47 | // Transform |
47 | vec2i loc { 0, 0 }; | 48 | vec2i loc { 0, 0 }; |
diff --git a/src/system.h b/src/system.h index 0cdc205..01d6cec 100644 --- a/src/system.h +++ b/src/system.h | |||
@@ -18,8 +18,6 @@ public: | |||
18 | virtual void tick(double dt) {} | 18 | virtual void tick(double dt) {} |
19 | 19 | ||
20 | virtual void destroySprite(int spriteId) {} | 20 | virtual void destroySprite(int spriteId) {} |
21 | |||
22 | virtual void clearSpriteCache() {} | ||
23 | }; | 21 | }; |
24 | 22 | ||
25 | #endif /* end of include guard: SYSTEM_H_6B40E1B9 */ | 23 | #endif /* end of include guard: SYSTEM_H_6B40E1B9 */ |
diff --git a/src/transform_system.cpp b/src/transform_system.cpp index 6e04d70..144477b 100644 --- a/src/transform_system.cpp +++ b/src/transform_system.cpp | |||
@@ -225,13 +225,3 @@ void TransformSystem::destroySprite(int spriteId) { | |||
225 | removeCollidable(spriteId); | 225 | removeCollidable(spriteId); |
226 | } | 226 | } |
227 | } | 227 | } |
228 | |||
229 | void TransformSystem::clearSpriteCache() { | ||
230 | for (auto& layer : spritesByY_) { | ||
231 | layer.clear(); | ||
232 | } | ||
233 | leftCollidables_.clear(); | ||
234 | rightCollidables_.clear(); | ||
235 | upCollidables_.clear(); | ||
236 | downCollidables_.clear(); | ||
237 | } | ||
diff --git a/src/transform_system.h b/src/transform_system.h index a21b93b..4ee481e 100644 --- a/src/transform_system.h +++ b/src/transform_system.h | |||
@@ -47,8 +47,6 @@ public: | |||
47 | 47 | ||
48 | void destroySprite(int spriteId) override; | 48 | void destroySprite(int spriteId) override; |
49 | 49 | ||
50 | void clearSpriteCache() override; | ||
51 | |||
52 | private: | 50 | private: |
53 | 51 | ||
54 | Game& game_; | 52 | Game& game_; |