summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--res/scripts/common.lua12
-rw-r--r--src/camera_system.cpp4
-rw-r--r--src/camera_system.h2
-rw-r--r--src/character_system.cpp34
-rw-r--r--src/character_system.h4
-rw-r--r--src/game.cpp75
-rw-r--r--src/game.h6
-rw-r--r--src/main.cpp42
-rw-r--r--src/script_system.cpp11
-rw-r--r--src/sprite.h1
-rw-r--r--src/system.h2
-rw-r--r--src/transform_system.cpp10
-rw-r--r--src/transform_system.h2
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
196end 190end
197 191
198function CreateAnimatedSpriteAtPosition(alias, character, x, y, animName, direction, layer) 192function 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
48void CameraSystem::clearSpriteCache() {
49 followingSprite_ = -1;
50}
51
52vec2i CameraSystem::calculatePosWithCenter(vec2i center) const { 48vec2i 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
40private: 38private:
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
42void 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
42void CharacterSystem::moveInDirection(int spriteId, Direction dir) { 68void 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
270void 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
42private: 42private:
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
7int Game::emplaceSprite(std::string alias) { 7int 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
25void Game::clearSprites() { 36void 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
35void 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
85private: 86private:
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 {
42public: 42public:
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
229void 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
52private: 50private:
53 51
54 Game& game_; 52 Game& game_;