diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2025-04-26 03:48:26 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2025-04-26 03:48:26 +1000 |
commit | 87751c5a84925cbd9d630c65738e0e77b01a66f0 (patch) | |
tree | 9ecfd6479a14fef5916b5dafa056f4d360757e39 /source/game | |
parent | 6369ba9ec72f097d8cc9ab06bed0c6816da516c8 (diff) |
songbook Lua bindings, give NPCs songbooks
Diffstat (limited to 'source/game')
-rw-r--r-- | source/game/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/game/StarMonster.cpp | 2 | ||||
-rw-r--r-- | source/game/StarNpc.cpp | 27 | ||||
-rw-r--r-- | source/game/StarNpc.hpp | 3 | ||||
-rw-r--r-- | source/game/StarPlayer.cpp | 5 | ||||
-rw-r--r-- | source/game/StarSongbook.cpp | 18 | ||||
-rw-r--r-- | source/game/StarSongbook.hpp | 12 | ||||
-rw-r--r-- | source/game/StarStagehand.cpp | 2 | ||||
-rw-r--r-- | source/game/scripting/StarBehaviorLuaBindings.cpp | 2 | ||||
-rw-r--r-- | source/game/scripting/StarBehaviorLuaBindings.hpp | 2 | ||||
-rw-r--r-- | source/game/scripting/StarSongbookLuaBindings.cpp | 21 | ||||
-rw-r--r-- | source/game/scripting/StarSongbookLuaBindings.hpp | 11 |
12 files changed, 92 insertions, 15 deletions
diff --git a/source/game/CMakeLists.txt b/source/game/CMakeLists.txt index 11e0024..b1a519c 100644 --- a/source/game/CMakeLists.txt +++ b/source/game/CMakeLists.txt @@ -250,6 +250,7 @@ SET (star_game_HEADERS scripting/StarPlayerLuaBindings.hpp scripting/StarRootLuaBindings.hpp scripting/StarScriptedAnimatorLuaBindings.hpp + scripting/StarSongbookLuaBindings.hpp scripting/StarStatusControllerLuaBindings.hpp scripting/StarTeamClientLuaBindings.hpp scripting/StarWorldLuaBindings.hpp @@ -491,6 +492,7 @@ SET (star_game_SOURCES scripting/StarPlayerLuaBindings.cpp scripting/StarRootLuaBindings.cpp scripting/StarScriptedAnimatorLuaBindings.cpp + scripting/StarSongbookLuaBindings.cpp scripting/StarStatusControllerLuaBindings.cpp scripting/StarTeamClientLuaBindings.cpp scripting/StarWorldLuaBindings.cpp diff --git a/source/game/StarMonster.cpp b/source/game/StarMonster.cpp index d9ce986..98f4642 100644 --- a/source/game/StarMonster.cpp +++ b/source/game/StarMonster.cpp @@ -144,7 +144,7 @@ void Monster::init(World* world, EntityId entityId, EntityMode mode) { m_scriptComponent.addCallbacks("entity", LuaBindings::makeEntityCallbacks(this)); m_scriptComponent.addCallbacks("animator", LuaBindings::makeNetworkedAnimatorCallbacks(&m_networkedAnimator)); m_scriptComponent.addCallbacks("status", LuaBindings::makeStatusControllerCallbacks(m_statusController.get())); - m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorLuaCallbacks(&m_behaviors)); + m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorCallbacks(&m_behaviors)); m_scriptComponent.addActorMovementCallbacks(m_movementController.get()); m_scriptComponent.init(world); } diff --git a/source/game/StarNpc.cpp b/source/game/StarNpc.cpp index 388f6e5..7c1cf63 100644 --- a/source/game/StarNpc.cpp +++ b/source/game/StarNpc.cpp @@ -2,6 +2,8 @@ #include "StarDataStreamExtra.hpp" #include "StarWorld.hpp" #include "StarRoot.hpp" +#include "StarSongbook.hpp" +#include "StarSongbookLuaBindings.hpp" #include "StarDamageManager.hpp" #include "StarDamageDatabase.hpp" #include "StarLogging.hpp" @@ -76,6 +78,8 @@ Npc::Npc(NpcVariant const& npcVariant) if (!m_statusController->statusProperty("effectDirectives")) m_statusController->setStatusProperty("effectDirectives", speciesDefinition->effectDirectives()); + m_songbook = make_shared<Songbook>(species()); + m_effectEmitter = make_shared<EffectEmitter>(); m_hitDamageNotificationLimiter = 0; @@ -185,7 +189,8 @@ void Npc::init(World* world, EntityId entityId, EntityMode mode) { { return m_npcVariant.scriptConfig.query(name, def); })); m_scriptComponent.addCallbacks("entity", LuaBindings::makeEntityCallbacks(this)); m_scriptComponent.addCallbacks("status", LuaBindings::makeStatusControllerCallbacks(m_statusController.get())); - m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorLuaCallbacks(&m_behaviors)); + m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorCallbacks(&m_behaviors)); + m_scriptComponent.addCallbacks("songbook", LuaBindings::makeSongbookCallbacks(m_songbook.get())); m_scriptComponent.addActorMovementCallbacks(m_movementController.get()); m_scriptComponent.init(world); } @@ -199,6 +204,8 @@ void Npc::uninit() { m_scriptComponent.removeCallbacks("config"); m_scriptComponent.removeCallbacks("entity"); m_scriptComponent.removeCallbacks("status"); + m_scriptComponent.removeCallbacks("behavior"); + m_scriptComponent.removeCallbacks("songbook"); m_scriptComponent.removeActorMovementCallbacks(); } m_tools->uninit(); @@ -359,6 +366,8 @@ void Npc::destroy(RenderCallback* renderCallback) { if (renderCallback && m_deathParticleBurst.get()) renderCallback->addParticles(m_humanoid.particles(*m_deathParticleBurst.get()), position()); + + m_songbook->stop(); } void Npc::damagedOther(DamageNotification const& damage) { @@ -503,6 +512,7 @@ void Npc::render(RenderCallback* renderCallback) { renderCallback->addDrawables(m_tools->renderObjectPreviews(aimPosition(), walkingDirection(), inToolRange(), favoriteColor()), renderLayer); m_effectEmitter->render(renderCallback); + m_songbook->render(renderCallback); } void Npc::renderLightSources(RenderCallback* renderCallback) { @@ -571,6 +581,8 @@ void Npc::tickShared(float dt) { if (m_hitDamageNotificationLimiter) m_hitDamageNotificationLimiter--; + m_songbook->update(*entityMode(), world()); + m_effectEmitter->setSourcePosition("normal", position()); m_effectEmitter->setSourcePosition("mouth", position() + mouthOffset()); m_effectEmitter->setSourcePosition("feet", position() + feetOffset()); @@ -814,6 +826,8 @@ void Npc::setupNetStates() { m_netGroup.addNetElement(m_statusController.get()); m_netGroup.addNetElement(m_armor.get()); m_netGroup.addNetElement(m_tools.get()); + m_songbook->setCompatibilityVersion(6); + m_netGroup.addNetElement(m_songbook.get()); m_netGroup.setNeedsStoreCallback(bind(&Npc::setNetStates, this)); m_netGroup.setNeedsLoadCallback(bind(&Npc::getNetStates, this, _1)); @@ -1075,10 +1089,13 @@ bool Npc::consumeEnergy(float energy) { void Npc::queueUIMessage(String const&) {} bool Npc::instrumentPlaying() { - return false; // TODO: remove this from tool user entirely + return m_songbook->instrumentPlaying(); } -void Npc::instrumentEquipped(String const&) {} +void Npc::instrumentEquipped(String const& instrumentKind) { + if (canUseTool()) + m_songbook->keepAlive(instrumentKind, mouthPosition()); +} void Npc::interact(InteractAction const&) {} @@ -1102,6 +1119,10 @@ StatusController* Npc::statusController() { return m_statusController.get(); } +Songbook* Npc::songbook() { + return m_songbook.get(); +} + void Npc::setCameraFocusEntity(Maybe<EntityId> const&) { // players only } diff --git a/source/game/StarNpc.hpp b/source/game/StarNpc.hpp index 0b22702..21c562c 100644 --- a/source/game/StarNpc.hpp +++ b/source/game/StarNpc.hpp @@ -25,6 +25,7 @@ namespace Star { +STAR_CLASS(Songbook); STAR_CLASS(Item); STAR_CLASS(RenderCallback); STAR_CLASS(Npc); @@ -165,6 +166,7 @@ public: void requestEmote(String const& emote) override; ActorMovementController* movementController() override; StatusController* statusController() override; + Songbook* songbook(); void setCameraFocusEntity(Maybe<EntityId> const& cameraFocusEntity) override; void playEmote(HumanoidEmote emote) override; @@ -246,6 +248,7 @@ private: ArmorWearerPtr m_armor; ToolUserPtr m_tools; + SongbookPtr m_songbook; NetElementBool m_disableWornArmor; diff --git a/source/game/StarPlayer.cpp b/source/game/StarPlayer.cpp index 43add67..facde2e 100644 --- a/source/game/StarPlayer.cpp +++ b/source/game/StarPlayer.cpp @@ -3,6 +3,7 @@ #include "StarJsonExtra.hpp" #include "StarRoot.hpp" #include "StarSongbook.hpp" +#include "StarSongbookLuaBindings.hpp" #include "StarEmoteProcessor.hpp" #include "StarSpeciesDatabase.hpp" #include "StarDamageManager.hpp" @@ -331,6 +332,7 @@ void Player::init(World* world, EntityId entityId, EntityMode mode) { p.second->addActorMovementCallbacks(m_movementController.get()); p.second->addCallbacks("player", LuaBindings::makePlayerCallbacks(this)); p.second->addCallbacks("status", LuaBindings::makeStatusControllerCallbacks(m_statusController.get())); + p.second->addCallbacks("songbook", LuaBindings::makeSongbookCallbacks(m_songbook.get())); if (m_client) p.second->addCallbacks("celestial", LuaBindings::makeCelestialCallbacks(m_client)); p.second->init(world); @@ -362,6 +364,7 @@ void Player::uninit() { p.second->removeCallbacks("player"); p.second->removeCallbacks("mcontroller"); p.second->removeCallbacks("status"); + p.second->removeCallbacks("songbook"); p.second->removeCallbacks("world"); if (m_client) p.second->removeCallbacks("celestial"); @@ -2272,7 +2275,7 @@ bool Player::instrumentPlaying() { void Player::instrumentEquipped(String const& instrumentKind) { if (canUseTool()) - m_songbook->keepalive(instrumentKind, mouthPosition()); + m_songbook->keepAlive(instrumentKind, mouthPosition()); } void Player::interact(InteractAction const& action) { diff --git a/source/game/StarSongbook.cpp b/source/game/StarSongbook.cpp index 68db655..72f2b2b 100644 --- a/source/game/StarSongbook.cpp +++ b/source/game/StarSongbook.cpp @@ -158,7 +158,7 @@ void Songbook::render(RenderCallback* renderCallback) { m_pendingAudio.clear(); } -void Songbook::keepalive(String const& instrument, Vec2F const& position) { +void Songbook::keepAlive(String const& instrument, Vec2F const& position) { if (instrument != m_instrument) { m_instrument = instrument; m_dataUpdated = true; @@ -681,11 +681,11 @@ void Songbook::play(Json const& song, String const& timeSource) { m_activeCooldown = 3; } -bool Songbook::active() { +bool Songbook::active() const { return m_activeCooldown > 0; } -bool Songbook::instrumentPlaying() { +bool Songbook::instrumentPlaying() const { if (!active()) return false; if (m_timeSourceInstance) { @@ -698,6 +698,18 @@ bool Songbook::instrumentPlaying() { return false; } +Maybe<String> Songbook::timeSource() const { + return m_timeSource; +} + +Maybe<String> Songbook::instrument() const { + return m_instrument; +} + +Json Songbook::song() const { + return m_song; +} + double Songbook::fundamentalFrequency(double p) { return 55.0 * pow(2.0, (p - 69.0) / 12.0 + 3.0); } diff --git a/source/game/StarSongbook.hpp b/source/game/StarSongbook.hpp index 89a4bfd..6f15242 100644 --- a/source/game/StarSongbook.hpp +++ b/source/game/StarSongbook.hpp @@ -24,12 +24,16 @@ public: // instrument needs to tell the songbook what type it is, and needs to keep // calling it to signal // the instrument is still equiped - void keepalive(String const& instrument, Vec2F const& position); + void keepAlive(String const& instrument, Vec2F const& position); void stop(); - void play(Json const& song, String const& timesource); - bool active(); - bool instrumentPlaying(); + void play(Json const& song, String const& timeSource); + bool active() const; + bool instrumentPlaying() const; + + Maybe<String> timeSource() const; + Maybe<String> instrument() const; + Json song() const; private: struct Note { diff --git a/source/game/StarStagehand.cpp b/source/game/StarStagehand.cpp index d85f77b..1207d91 100644 --- a/source/game/StarStagehand.cpp +++ b/source/game/StarStagehand.cpp @@ -43,7 +43,7 @@ void Stagehand::init(World* world, EntityId entityId, EntityMode mode) { return m_config.query(name, def); })); m_scriptComponent.addCallbacks("entity", LuaBindings::makeEntityCallbacks(this)); - m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorLuaCallbacks(&m_behaviors)); + m_scriptComponent.addCallbacks("behavior", LuaBindings::makeBehaviorCallbacks(&m_behaviors)); m_scriptComponent.init(world); } } diff --git a/source/game/scripting/StarBehaviorLuaBindings.cpp b/source/game/scripting/StarBehaviorLuaBindings.cpp index 8866746..4bf16f2 100644 --- a/source/game/scripting/StarBehaviorLuaBindings.cpp +++ b/source/game/scripting/StarBehaviorLuaBindings.cpp @@ -4,7 +4,7 @@ namespace Star { -LuaCallbacks LuaBindings::makeBehaviorLuaCallbacks(List<BehaviorStatePtr>* list) { +LuaCallbacks LuaBindings::makeBehaviorCallbacks(List<BehaviorStatePtr>* list) { LuaCallbacks callbacks; callbacks.registerCallback("behavior", [list](Json const& config, JsonObject const& parameters, LuaTable context, Maybe<LuaUserData> blackboard) -> BehaviorStateWeakPtr { diff --git a/source/game/scripting/StarBehaviorLuaBindings.hpp b/source/game/scripting/StarBehaviorLuaBindings.hpp index d2a882b..01c04ab 100644 --- a/source/game/scripting/StarBehaviorLuaBindings.hpp +++ b/source/game/scripting/StarBehaviorLuaBindings.hpp @@ -9,6 +9,6 @@ STAR_CLASS(Root); STAR_CLASS(UniverseClient); namespace LuaBindings { - LuaCallbacks makeBehaviorLuaCallbacks(List<BehaviorStatePtr>* list); + LuaCallbacks makeBehaviorCallbacks(List<BehaviorStatePtr>* list); } } diff --git a/source/game/scripting/StarSongbookLuaBindings.cpp b/source/game/scripting/StarSongbookLuaBindings.cpp new file mode 100644 index 0000000..e2f70a3 --- /dev/null +++ b/source/game/scripting/StarSongbookLuaBindings.cpp @@ -0,0 +1,21 @@ +#include "StarSongbookLuaBindings.hpp" +#include "StarLuaConverters.hpp" + +namespace Star { + +LuaCallbacks LuaBindings::makeSongbookCallbacks(Songbook* songbook) { + LuaCallbacks callbacks; + + callbacks.registerCallbackWithSignature<void, Json, String>("play", bind(mem_fn(&Songbook::play), songbook, _1, _2)); + callbacks.registerCallbackWithSignature<void, String, Vec2F>("keepAlive", bind(mem_fn(&Songbook::keepAlive), songbook, _1, _2)); + callbacks.registerCallbackWithSignature<void>("stop", bind(mem_fn(&Songbook::stop), songbook)); + callbacks.registerCallbackWithSignature<bool>("active", bind(mem_fn(&Songbook::active), songbook)); + callbacks.registerCallbackWithSignature<String>("band", bind(mem_fn(&Songbook::timeSource), songbook)); + callbacks.registerCallbackWithSignature<String>("instrument", bind(mem_fn(&Songbook::instrument), songbook)); + callbacks.registerCallbackWithSignature<bool>("instrumentPlaying", bind(mem_fn(&Songbook::instrumentPlaying), songbook)); + callbacks.registerCallbackWithSignature<Json>("song", bind(mem_fn(&Songbook::song), songbook)); + + return callbacks; +} + +} diff --git a/source/game/scripting/StarSongbookLuaBindings.hpp b/source/game/scripting/StarSongbookLuaBindings.hpp new file mode 100644 index 0000000..cc55ec6 --- /dev/null +++ b/source/game/scripting/StarSongbookLuaBindings.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "StarLua.hpp" +#include "StarSongbook.hpp" + +namespace Star { + +namespace LuaBindings { + LuaCallbacks makeSongbookCallbacks(Songbook* songbook); +} +} |