summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2021-07-05 11:58:29 -0400
committerStar Rauchenberger <fefferburbia@gmail.com>2021-07-05 11:58:29 -0400
commit324346a87c114f0991a092ac8653afecada364b5 (patch)
treef88ac730897056918b366e7fabaad2b136383d59 /src
parentd983ef6b8d66d916ed7502cf6d35b573c5366257 (diff)
downloadtanetane-324346a87c114f0991a092ac8653afecada364b5.tar.gz
tanetane-324346a87c114f0991a092ac8653afecada364b5.tar.bz2
tanetane-324346a87c114f0991a092ac8653afecada364b5.zip
Added background scripts
Background scripts are scripts that are launched when a map is loaded. They differ in use from a map's init script in that they are expected to contain an infinite loop. These scripts are linked to a sprite and will be killed when that sprite is destroyed (usually when the map is unloaded, but if the sprite is made persistent then it may last longer). The thread running the script is given no warning that it is being killed; the coroutine is simply never called again, and the thread is disposed of. Because of this, background scripts MUST ensure the game is in a consistent state before coroutine yielding, because it is not guaranteed that the coroutine will ever be called again.
Diffstat (limited to 'src')
-rw-r--r--src/game.cpp9
-rw-r--r--src/map.cpp2
-rw-r--r--src/map.h1
-rw-r--r--src/script_system.cpp9
-rw-r--r--src/script_system.h5
5 files changed, 24 insertions, 2 deletions
diff --git a/src/game.cpp b/src/game.cpp index 80ff506..dff8af0 100644 --- a/src/game.cpp +++ b/src/game.cpp
@@ -52,6 +52,7 @@ void Game::loadMap(std::string filename) {
52 // Load the new map. 52 // Load the new map.
53 map_ = std::make_unique<Map>(filename); 53 map_ = std::make_unique<Map>(filename);
54 54
55 std::vector<std::tuple<int, std::string>> backgroundScripts;
55 for (const Prototype& p : map_->getPrototypes()) { 56 for (const Prototype& p : map_->getPrototypes()) {
56 if (spritesByAlias_.count(p.name)) continue; 57 if (spritesByAlias_.count(p.name)) continue;
57 58
@@ -84,6 +85,9 @@ void Game::loadMap(std::string filename) {
84 getSprite(spriteId).mirrorAxis = p.mirrorAxis; 85 getSprite(spriteId).mirrorAxis = p.mirrorAxis;
85 getSprite(spriteId).mirroredSpriteId = getSpriteByAlias(p.spriteToMirror); 86 getSprite(spriteId).mirroredSpriteId = getSpriteByAlias(p.spriteToMirror);
86 } 87 }
88 if (!p.backgroundScript.empty()) {
89 backgroundScripts.push_back({spriteId, p.backgroundScript});
90 }
87 } 91 }
88 92
89 for (const Trigger& t : map_->getTriggers()) { 93 for (const Trigger& t : map_->getTriggers()) {
@@ -99,4 +103,9 @@ void Game::loadMap(std::string filename) {
99 if (getSystem<ScriptSystem>().mapHasScript(map_->getName(), "init")) { 103 if (getSystem<ScriptSystem>().mapHasScript(map_->getName(), "init")) {
100 getSystem<ScriptSystem>().runScript(map_->getName(), "init"); 104 getSystem<ScriptSystem>().runScript(map_->getName(), "init");
101 } 105 }
106
107 // Run any background scripts associated with new sprites.
108 for (auto& [spriteId, scriptName] : backgroundScripts) {
109 getSystem<ScriptSystem>().runScript(map_->getName(), scriptName, spriteId);
110 }
102} 111}
diff --git a/src/map.cpp b/src/map.cpp index c8bf18f..f28a976 100644 --- a/src/map.cpp +++ b/src/map.cpp
@@ -121,6 +121,8 @@ Map::Map(std::string_view name) : name_(name) {
121 p.spriteToMirror = property.getStringValue(); 121 p.spriteToMirror = property.getStringValue();
122 } else if (property.getName() == "bumpPlayerScript") { 122 } else if (property.getName() == "bumpPlayerScript") {
123 p.bumpPlayerScript = property.getStringValue(); 123 p.bumpPlayerScript = property.getStringValue();
124 } else if (property.getName() == "backgroundScript") {
125 p.backgroundScript = property.getStringValue();
124 } 126 }
125 } 127 }
126 128
diff --git a/src/map.h b/src/map.h index 7300e76..48c0223 100644 --- a/src/map.h +++ b/src/map.h
@@ -28,6 +28,7 @@ struct Prototype {
28 Direction dir = Direction::down; 28 Direction dir = Direction::down;
29 std::string interactionScript; 29 std::string interactionScript;
30 std::string bumpPlayerScript; 30 std::string bumpPlayerScript;
31 std::string backgroundScript;
31 bool shadow = false; 32 bool shadow = false;
32 bool wander = false; 33 bool wander = false;
33 int movementSpeed = -1; 34 int movementSpeed = -1;
diff --git a/src/script_system.cpp b/src/script_system.cpp index b4a7b9b..c820ecb 100644 --- a/src/script_system.cpp +++ b/src/script_system.cpp
@@ -269,6 +269,12 @@ void ScriptSystem::tick(double dt) {
269 }); 269 });
270} 270}
271 271
272void ScriptSystem::destroySprite(int spriteId) {
273 scripts_.remove_if([spriteId] (const Script& script) {
274 return (script.linkedSprite == spriteId);
275 });
276}
277
272void ScriptSystem::loadMapScripts(std::string mapName) { 278void ScriptSystem::loadMapScripts(std::string mapName) {
273 if (!loadedScripts_.count(mapName)) { 279 if (!loadedScripts_.count(mapName)) {
274 engine_.script_file("../res/scripts/" + mapName + ".lua"); 280 engine_.script_file("../res/scripts/" + mapName + ".lua");
@@ -282,7 +288,7 @@ bool ScriptSystem::mapHasScript(std::string mapName, std::string scriptName) {
282 return !!engine_.traverse_get<sol::function>(mapName, scriptName); 288 return !!engine_.traverse_get<sol::function>(mapName, scriptName);
283} 289}
284 290
285void ScriptSystem::runScript(std::string mapName, std::string scriptName) { 291void ScriptSystem::runScript(std::string mapName, std::string scriptName, int linkedSprite) {
286 loadMapScripts(mapName); 292 loadMapScripts(mapName);
287 293
288 Script newScript; 294 Script newScript;
@@ -291,6 +297,7 @@ void ScriptSystem::runScript(std::string mapName, std::string scriptName) {
291#ifdef TANETANE_DEBUG 297#ifdef TANETANE_DEBUG
292 newScript.debugInfo = mapName + "." + scriptName; 298 newScript.debugInfo = mapName + "." + scriptName;
293#endif 299#endif
300 newScript.linkedSprite = linkedSprite;
294 301
295 if (!*newScript.callable) { 302 if (!*newScript.callable) {
296 throw std::runtime_error("Error running script: " + mapName + "." + scriptName); 303 throw std::runtime_error("Error running script: " + mapName + "." + scriptName);
diff --git a/src/script_system.h b/src/script_system.h index 6a28430..0718e90 100644 --- a/src/script_system.h +++ b/src/script_system.h
@@ -19,9 +19,11 @@ public:
19 19
20 void tick(double dt) override; 20 void tick(double dt) override;
21 21
22 void destroySprite(int spriteId) override;
23
22 bool mapHasScript(std::string mapName, std::string scriptName); 24 bool mapHasScript(std::string mapName, std::string scriptName);
23 25
24 void runScript(std::string mapName, std::string scriptName); 26 void runScript(std::string mapName, std::string scriptName, int linkedSprite = -1);
25 27
26 void runDebugScript(std::string script); 28 void runDebugScript(std::string script);
27 29
@@ -33,6 +35,7 @@ private:
33 std::unique_ptr<sol::thread> runner; 35 std::unique_ptr<sol::thread> runner;
34 std::unique_ptr<sol::coroutine> callable; 36 std::unique_ptr<sol::coroutine> callable;
35 std::string debugInfo; 37 std::string debugInfo;
38 int linkedSprite = -1;
36 }; 39 };
37 40
38 Game& game_; 41 Game& game_;