summary refs log tree commit diff stats
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp75
1 files changed, 27 insertions, 48 deletions
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}