Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2025-04-26 03:48:26 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2025-04-26 03:48:26 +1000
commit87751c5a84925cbd9d630c65738e0e77b01a66f0 (patch)
tree9ecfd6479a14fef5916b5dafa056f4d360757e39 /source/game
parent6369ba9ec72f097d8cc9ab06bed0c6816da516c8 (diff)
songbook Lua bindings, give NPCs songbooks
Diffstat (limited to 'source/game')
-rw-r--r--source/game/CMakeLists.txt2
-rw-r--r--source/game/StarMonster.cpp2
-rw-r--r--source/game/StarNpc.cpp27
-rw-r--r--source/game/StarNpc.hpp3
-rw-r--r--source/game/StarPlayer.cpp5
-rw-r--r--source/game/StarSongbook.cpp18
-rw-r--r--source/game/StarSongbook.hpp12
-rw-r--r--source/game/StarStagehand.cpp2
-rw-r--r--source/game/scripting/StarBehaviorLuaBindings.cpp2
-rw-r--r--source/game/scripting/StarBehaviorLuaBindings.hpp2
-rw-r--r--source/game/scripting/StarSongbookLuaBindings.cpp21
-rw-r--r--source/game/scripting/StarSongbookLuaBindings.hpp11
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);
+}
+}