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

summaryrefslogtreecommitdiff
path: root/source/game/scripting/StarLuaGameConverters.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/scripting/StarLuaGameConverters.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/scripting/StarLuaGameConverters.cpp')
-rw-r--r--source/game/scripting/StarLuaGameConverters.cpp601
1 files changed, 601 insertions, 0 deletions
diff --git a/source/game/scripting/StarLuaGameConverters.cpp b/source/game/scripting/StarLuaGameConverters.cpp
new file mode 100644
index 0000000..e2fd516
--- /dev/null
+++ b/source/game/scripting/StarLuaGameConverters.cpp
@@ -0,0 +1,601 @@
+#include "StarLuaGameConverters.hpp"
+
+namespace Star {
+
+LuaValue LuaConverter<CollisionKind>::from(LuaEngine& engine, CollisionKind k) {
+ return engine.createString(CollisionKindNames.getRight(k));
+}
+
+Maybe<CollisionKind> LuaConverter<CollisionKind>::to(LuaEngine&, LuaValue const& v) {
+ if (auto str = v.ptr<LuaString>())
+ return CollisionKindNames.maybeLeft(str->ptr());
+ return {};
+}
+
+LuaValue LuaConverter<CollisionSet>::from(LuaEngine& engine, CollisionSet const& s) {
+ auto collisionTable = engine.createTable();
+ int i = 1;
+ for (auto const& v : CollisionKindNames) {
+ if (s.contains(v.first)) {
+ collisionTable.set(i++, v.second);
+ }
+ }
+ return collisionTable;
+}
+
+Maybe<CollisionSet> LuaConverter<CollisionSet>::to(LuaEngine& engine, LuaValue const& v) {
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ CollisionSet result;
+ bool failed = false;
+ table->iterate([&result, &failed, &engine](LuaValue, LuaValue value) {
+ if (auto k = engine.luaMaybeTo<CollisionKind>(move(value))) {
+ result.insert(*k);
+ return true;
+ } else {
+ failed = true;
+ return false;
+ }
+ });
+
+ if (failed)
+ return {};
+ return result;
+}
+
+LuaValue LuaConverter<PlatformerAStar::Path>::from(LuaEngine& engine, PlatformerAStar::Path const& path) {
+ auto convertNode = [&engine](PlatformerAStar::Node const& node) {
+ auto table = engine.createTable();
+ table.set("position", node.position);
+ table.set("velocity", node.velocity);
+ return table;
+ };
+
+ LuaTable pathTable = engine.createTable();
+ int pathTableIndex = 1;
+ for (auto const& edge : path) {
+ auto edgeTable = engine.createTable();
+ edgeTable.set("cost", edge.cost);
+ edgeTable.set("action", PlatformerAStar::ActionNames.getRight(edge.action));
+ edgeTable.set("jumpVelocity", edge.jumpVelocity);
+ edgeTable.set("source", convertNode(edge.source));
+ edgeTable.set("target", convertNode(edge.target));
+ pathTable.set(pathTableIndex++, move(edgeTable));
+ }
+ return pathTable;
+}
+
+LuaMethods<PlatformerAStar::PathFinder> LuaUserDataMethods<PlatformerAStar::PathFinder>::make() {
+ LuaMethods<PlatformerAStar::PathFinder> methods;
+ methods.registerMethodWithSignature<Maybe<bool>, PlatformerAStar::PathFinder&, Maybe<unsigned>>(
+ "explore", mem_fn(&PlatformerAStar::PathFinder::explore));
+ methods.registerMethodWithSignature<Maybe<PlatformerAStar::Path>, PlatformerAStar::PathFinder&>(
+ "result", mem_fn(&PlatformerAStar::PathFinder::result));
+ return methods;
+}
+
+Maybe<PlatformerAStar::Parameters> LuaConverter<PlatformerAStar::Parameters>::to(LuaEngine&, LuaValue const& v) {
+ PlatformerAStar::Parameters p;
+ p.returnBest = false;
+ p.mustEndOnGround = false;
+ p.enableWalkSpeedJumps = false;
+ p.enableVerticalJumpAirControl = false;
+ if (v == LuaNil)
+ return p;
+
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ try {
+ p.maxDistance = table->get<Maybe<float>>("maxDistance");
+ p.returnBest = table->get<Maybe<bool>>("returnBest").value(false);
+ p.mustEndOnGround = table->get<Maybe<bool>>("mustEndOnGround").value(false);
+ p.enableWalkSpeedJumps = table->get<Maybe<bool>>("enableWalkSpeedJumps").value(false);
+ p.enableVerticalJumpAirControl = table->get<Maybe<bool>>("enableVerticalJumpAirControl").value(false);
+ p.swimCost = table->get<Maybe<float>>("swimCost");
+ p.jumpCost = table->get<Maybe<float>>("jumpCost");
+ p.liquidJumpCost = table->get<Maybe<float>>("liquidJumpCost");
+ p.dropCost = table->get<Maybe<float>>("dropCost");
+ p.boundBox = table->get<RectF>("boundBox");
+ p.standingBoundBox = table->get<RectF>("standingBoundBox");
+ p.droppingBoundBox = table->get<RectF>("droppingBoundBox");
+ p.smallJumpMultiplier = table->get<Maybe<float>>("smallJumpMultiplier");
+ p.jumpDropXMultiplier = table->get<Maybe<float>>("jumpDropXMultiplier");
+ p.maxFScore = table->get<double>("maxFScore");
+ p.maxNodesToSearch = table->get<unsigned>("maxNodesToSearch");
+ p.maxLandingVelocity = table->get<Maybe<float>>("maxLandingVelocity");
+ } catch (LuaConversionException const&) {
+ return {};
+ }
+
+ return p;
+}
+
+LuaValue LuaConverter<ActorJumpProfile>::from(LuaEngine& engine, ActorJumpProfile const& v) {
+ auto table = engine.createTable();
+ table.set("jumpSpeed", v.jumpSpeed);
+ table.set("jumpControlForce", v.jumpControlForce);
+ table.set("jumpInitialPercentage", v.jumpInitialPercentage);
+ table.set("jumpHoldTime", v.jumpHoldTime);
+ table.set("jumpTotalHoldTime", v.jumpTotalHoldTime);
+ table.set("multiJump", v.multiJump);
+ table.set("reJumpDelay", v.reJumpDelay);
+ table.set("autoJump", v.autoJump);
+ table.set("collisionCancelled", v.collisionCancelled);
+ return table;
+}
+
+Maybe<ActorJumpProfile> LuaConverter<ActorJumpProfile>::to(LuaEngine&, LuaValue const& v) {
+ if (v == LuaNil)
+ return ActorJumpProfile();
+
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ try {
+ ActorJumpProfile ajp;
+ ajp.jumpSpeed = table->get<Maybe<float>>("jumpSpeed");
+ ajp.jumpControlForce = table->get<Maybe<float>>("jumpControlForce");
+ ajp.jumpInitialPercentage = table->get<Maybe<float>>("jumpInitialPercentage");
+ ajp.jumpHoldTime = table->get<Maybe<float>>("jumpHoldTime");
+ ajp.jumpTotalHoldTime = table->get<Maybe<float>>("jumpTotalHoldTime");
+ ajp.multiJump = table->get<Maybe<bool>>("multiJump");
+ ajp.reJumpDelay = table->get<Maybe<float>>("reJumpDelay");
+ ajp.autoJump = table->get<Maybe<bool>>("autoJump");
+ ajp.collisionCancelled = table->get<Maybe<bool>>("collisionCancelled");
+ return ajp;
+ } catch (LuaConversionException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<ActorMovementParameters>::from(LuaEngine& engine, ActorMovementParameters const& v) {
+ auto table = engine.createTable();
+ table.set("mass", v.mass);
+ table.set("gravityMultiplier", v.gravityMultiplier);
+ table.set("liquidBuoyancy", v.liquidBuoyancy);
+ table.set("airBuoyancy", v.airBuoyancy);
+ table.set("bounceFactor", v.bounceFactor);
+ table.set("slopeSlidingFactor", v.slopeSlidingFactor);
+ table.set("maxMovementPerStep", v.maxMovementPerStep);
+ table.set("maximumCorrection", v.maximumCorrection);
+ table.set("speedLimit", v.speedLimit);
+ table.set("standingPoly", v.standingPoly);
+ table.set("crouchingPoly", v.crouchingPoly);
+ table.set("stickyCollision", v.stickyCollision);
+ table.set("stickyForce", v.stickyForce);
+ table.set("walkSpeed", v.walkSpeed);
+ table.set("runSpeed", v.runSpeed);
+ table.set("flySpeed", v.flySpeed);
+ table.set("airFriction", v.airFriction);
+ table.set("liquidFriction", v.liquidFriction);
+ table.set("minimumLiquidPercentage", v.minimumLiquidPercentage);
+ table.set("liquidImpedance", v.liquidImpedance);
+ table.set("normalGroundFriction", v.normalGroundFriction);
+ table.set("ambulatingGroundFriction", v.ambulatingGroundFriction);
+ table.set("groundForce", v.groundForce);
+ table.set("airForce", v.airForce);
+ table.set("liquidForce", v.liquidForce);
+ table.set("airJumpProfile", v.airJumpProfile);
+ table.set("liquidJumpProfile", v.liquidJumpProfile);
+ table.set("fallStatusSpeedMin", v.fallStatusSpeedMin);
+ table.set("fallThroughSustainFrames", v.fallThroughSustainFrames);
+ table.set("maximumPlatformCorrection", v.maximumPlatformCorrection);
+ table.set("maximumPlatformCorrectionVelocityFactor", v.maximumPlatformCorrectionVelocityFactor);
+ table.set("physicsEffectCategories", v.physicsEffectCategories);
+ table.set("groundMovementMinimumSustain", v.groundMovementMinimumSustain);
+ table.set("groundMovementMaximumSustain", v.groundMovementMaximumSustain);
+ table.set("groundMovementCheckDistance", v.groundMovementCheckDistance);
+ table.set("collisionEnabled", v.collisionEnabled);
+ table.set("frictionEnabled", v.frictionEnabled);
+ table.set("gravityEnabled", v.gravityEnabled);
+ return table;
+}
+
+Maybe<ActorMovementParameters> LuaConverter<ActorMovementParameters>::to(LuaEngine&, LuaValue const& v) {
+ if (v == LuaNil)
+ return ActorMovementParameters();
+
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ try {
+ ActorMovementParameters amp;
+ amp.mass = table->get<Maybe<float>>("mass");
+ amp.gravityMultiplier = table->get<Maybe<float>>("gravityMultiplier");
+ amp.liquidBuoyancy = table->get<Maybe<float>>("liquidBuoyancy");
+ amp.airBuoyancy = table->get<Maybe<float>>("airBuoyancy");
+ amp.bounceFactor = table->get<Maybe<float>>("bounceFactor");
+ amp.slopeSlidingFactor = table->get<Maybe<float>>("slopeSlidingFactor");
+ amp.maxMovementPerStep = table->get<Maybe<float>>("maxMovementPerStep");
+ amp.maximumCorrection = table->get<Maybe<float>>("maximumCorrection");
+ amp.speedLimit = table->get<Maybe<float>>("speedLimit");
+ amp.standingPoly = table->get<Maybe<PolyF>>("standingPoly").orMaybe(table->get<Maybe<PolyF>>("collisionPoly"));
+ amp.crouchingPoly = table->get<Maybe<PolyF>>("crouchingPoly").orMaybe(table->get<Maybe<PolyF>>("collisionPoly"));
+ amp.stickyCollision = table->get<Maybe<bool>>("stickyCollision");
+ amp.stickyForce = table->get<Maybe<float>>("stickyForce");
+ amp.walkSpeed = table->get<Maybe<float>>("walkSpeed");
+ amp.runSpeed = table->get<Maybe<float>>("runSpeed");
+ amp.flySpeed = table->get<Maybe<float>>("flySpeed");
+ amp.airFriction = table->get<Maybe<float>>("airFriction");
+ amp.liquidFriction = table->get<Maybe<float>>("liquidFriction");
+ amp.minimumLiquidPercentage = table->get<Maybe<float>>("minimumLiquidPercentage");
+ amp.liquidImpedance = table->get<Maybe<float>>("liquidImpedance");
+ amp.normalGroundFriction = table->get<Maybe<float>>("normalGroundFriction");
+ amp.ambulatingGroundFriction = table->get<Maybe<float>>("ambulatingGroundFriction");
+ amp.groundForce = table->get<Maybe<float>>("groundForce");
+ amp.airForce = table->get<Maybe<float>>("airForce");
+ amp.liquidForce = table->get<Maybe<float>>("liquidForce");
+ amp.airJumpProfile = table->get<ActorJumpProfile>("airJumpProfile");
+ amp.liquidJumpProfile = table->get<ActorJumpProfile>("liquidJumpProfile");
+ amp.fallStatusSpeedMin = table->get<Maybe<float>>("fallStatusSpeedMin");
+ amp.fallThroughSustainFrames = table->get<Maybe<int>>("fallThroughSustainFrames");
+ amp.maximumPlatformCorrection = table->get<Maybe<float>>("maximumPlatformCorrection");
+ amp.maximumPlatformCorrectionVelocityFactor = table->get<Maybe<float>>("maximumPlatformCorrectionVelocityFactor");
+ amp.physicsEffectCategories = table->get<Maybe<StringSet>>("physicsEffectCategories");
+ amp.groundMovementMinimumSustain = table->get<Maybe<float>>("groundMovementMinimumSustain");
+ amp.groundMovementMaximumSustain = table->get<Maybe<float>>("groundMovementMaximumSustain");
+ amp.groundMovementCheckDistance = table->get<Maybe<float>>("groundMovementCheckDistance");
+ amp.collisionEnabled = table->get<Maybe<bool>>("collisionEnabled");
+ amp.frictionEnabled = table->get<Maybe<bool>>("frictionEnabled");
+ amp.gravityEnabled = table->get<Maybe<bool>>("gravityEnabled");
+ return amp;
+ } catch (LuaConversionException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<ActorMovementModifiers>::from(LuaEngine& engine, ActorMovementModifiers const& v) {
+ auto table = engine.createTable();
+ table.set("groundMovementModifier", v.groundMovementModifier);
+ table.set("liquidMovementModifier", v.liquidMovementModifier);
+ table.set("speedModifier", v.speedModifier);
+ table.set("airJumpModifier", v.airJumpModifier);
+ table.set("liquidJumpModifier", v.liquidJumpModifier);
+ table.set("runningSuppressed", v.runningSuppressed);
+ table.set("jumpingSuppressed", v.jumpingSuppressed);
+ table.set("facingSuppressed", v.facingSuppressed);
+ table.set("movementSuppressed", v.movementSuppressed);
+ return table;
+}
+
+Maybe<ActorMovementModifiers> LuaConverter<ActorMovementModifiers>::to(LuaEngine&, LuaValue const& v) {
+ if (v == LuaNil)
+ return ActorMovementModifiers();
+
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ try {
+ ActorMovementModifiers amm;
+ amm.groundMovementModifier = table->get<Maybe<float>>("groundMovementModifier").value(1.0f);
+ amm.liquidMovementModifier = table->get<Maybe<float>>("liquidMovementModifier").value(1.0f);
+ amm.speedModifier = table->get<Maybe<float>>("speedModifier").value(1.0f);
+ amm.airJumpModifier = table->get<Maybe<float>>("airJumpModifier").value(1.0f);
+ amm.liquidJumpModifier = table->get<Maybe<float>>("liquidJumpModifier").value(1.0f);
+ amm.runningSuppressed = table->get<Maybe<bool>>("runningSuppressed").value(false);
+ amm.jumpingSuppressed = table->get<Maybe<bool>>("jumpingSuppressed").value(false);
+ amm.facingSuppressed = table->get<Maybe<bool>>("facingSuppressed").value(false);
+ amm.movementSuppressed = table->get<Maybe<bool>>("movementSuppressed").value(false);
+ return amm;
+ } catch (LuaConversionException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<StatModifier>::from(LuaEngine& engine, StatModifier const& v) {
+ return engine.luaFrom(jsonFromStatModifier(v));
+}
+
+Maybe<StatModifier> LuaConverter<StatModifier>::to(LuaEngine& engine, LuaValue v) {
+ auto json = engine.luaMaybeTo<Json>(move(v));
+ if (!json)
+ return {};
+
+ try {
+ return jsonToStatModifier(json.take());
+ } catch (JsonException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<EphemeralStatusEffect>::from(LuaEngine& engine, EphemeralStatusEffect const& v) {
+ auto table = engine.createTable();
+ table.set("effect", v.uniqueEffect);
+ table.set("duration", v.duration);
+ return table;
+}
+
+Maybe<EphemeralStatusEffect> LuaConverter<EphemeralStatusEffect>::to(LuaEngine& engine, LuaValue const& v) {
+ if (auto s = v.ptr<LuaString>()) {
+ return EphemeralStatusEffect{UniqueStatusEffect(s->ptr()), {}};
+ } else if (auto table = v.ptr<LuaTable>()) {
+ auto effect = engine.luaMaybeTo<String>(table->get("effect"));
+ auto duration = engine.luaMaybeTo<Maybe<float>>(table->get("duratino"));
+ if (effect && duration)
+ return EphemeralStatusEffect{effect.take(), duration.take()};
+ }
+
+ return {};
+}
+
+LuaValue LuaConverter<DamageRequest>::from(LuaEngine& engine, DamageRequest const& v) {
+ auto table = engine.createTable();
+ table.set("hitType", HitTypeNames.getRight(v.hitType));
+ table.set("damageType", DamageTypeNames.getRight(v.damageType));
+ table.set("damage", v.damage);
+ table.set("knockbackMomentum", v.knockbackMomentum);
+ table.set("sourceEntityId", v.sourceEntityId);
+ table.set("damageSourceKind", v.damageSourceKind);
+ table.set("statusEffects", v.statusEffects);
+ return table;
+}
+
+Maybe<DamageRequest> LuaConverter<DamageRequest>::to(LuaEngine&, LuaValue const& v) {
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+
+ try {
+ DamageRequest dr;
+ if (auto hitType = table->get<Maybe<String>>("hitType"))
+ dr.hitType = HitTypeNames.getLeft(*hitType);
+ if (auto damageType = table->get<Maybe<String>>("damageType"))
+ dr.damageType = DamageTypeNames.getLeft(*damageType);
+ dr.damage = table->get<float>("damage");
+ if (auto knockbackMomentum = table->get<Maybe<Vec2F>>("knockbackMomentum"))
+ dr.knockbackMomentum = *knockbackMomentum;
+ if (auto sourceEntityId = table->get<Maybe<EntityId>>("sourceEntityId"))
+ dr.sourceEntityId = *sourceEntityId;
+ if (auto damageSourceKind = table->get<Maybe<String>>("damageSourceKind"))
+ dr.damageSourceKind = damageSourceKind.take();
+ if (auto statusEffects = table->get<Maybe<List<EphemeralStatusEffect>>>("statusEffects"))
+ dr.statusEffects = statusEffects.take();
+ return dr;
+ } catch (LuaConversionException const&) {
+ return {};
+ } catch (MapException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<DamageNotification>::from(LuaEngine& engine, DamageNotification const& v) {
+ auto table = engine.createTable();
+ table.set("sourceEntityId", v.sourceEntityId);
+ table.set("targetEntityId", v.targetEntityId);
+ table.set("position", v.position);
+ table.set("damageDealt", v.damageDealt);
+ table.set("healthLost", v.healthLost);
+ table.set("hitType", HitTypeNames.getRight(v.hitType));
+ table.set("damageSourceKind", v.damageSourceKind);
+ table.set("targetMaterialKind", v.targetMaterialKind);
+ return table;
+}
+
+Maybe<DamageNotification> LuaConverter<DamageNotification>::to(LuaEngine&, LuaValue const& v) {
+ auto table = v.ptr<LuaTable>();
+ if (!table)
+ return {};
+ try {
+ DamageNotification dn;
+ dn.sourceEntityId = table->get<EntityId>("sourceEntityId");
+ dn.targetEntityId = table->get<EntityId>("targetEntityId");
+ dn.position = table->get<Vec2F>("position");
+ dn.damageDealt = table->get<float>("damageDealt");
+ dn.healthLost = table->get<float>("healthLost");
+ dn.hitType = HitTypeNames.getLeft(table->get<String>("hitType"));
+ dn.damageSourceKind = table->get<String>("damageSourceKind");
+ dn.targetMaterialKind = table->get<String>("targetMaterialKind");
+ return dn;
+ } catch (LuaConversionException const&) {
+ return {};
+ } catch (MapException const&) {
+ return {};
+ }
+}
+
+LuaValue LuaConverter<LiquidLevel>::from(LuaEngine& engine, LiquidLevel const& v) {
+ auto table = engine.createTable();
+ table.set(1, v.liquid);
+ table.set(2, v.level);
+ return table;
+}
+
+Maybe<LiquidLevel> LuaConverter<LiquidLevel>::to(LuaEngine& engine, LuaValue const& v) {
+ if (auto table = v.ptr<LuaTable>()) {
+ auto liquid = engine.luaMaybeTo<LiquidId>(table->get(1));
+ auto level = engine.luaMaybeTo<uint8_t>(table->get(2));
+ if (liquid && level)
+ return LiquidLevel(liquid.take(), level.take());
+ }
+ return {};
+}
+
+LuaValue LuaConverter<Collection>::from(LuaEngine& engine, Collection const& c) {
+ auto table = engine.createTable();
+ table.set("name", c.name);
+ table.set("type", CollectionTypeNames.getRight(c.type));
+ table.set("title", c.title);
+ return table;
+}
+
+Maybe<Collection> LuaConverter<Collection>::to(LuaEngine& engine, LuaValue const& v) {
+ if (auto table = v.ptr<LuaTable>()) {
+ auto name = engine.luaMaybeTo<String>(table->get("name"));
+ auto type = engine.luaMaybeTo<String>(table->get("type"));
+ auto title = engine.luaMaybeTo<String>(table->get("title"));
+ if (name && type && CollectionTypeNames.hasRightValue(*type) && title)
+ return Collection(*name, CollectionTypeNames.getLeft(*type), *title);
+ }
+
+ return {};
+}
+
+LuaValue LuaConverter<Collectable>::from(LuaEngine& engine, Collectable const& c) {
+ auto table = engine.createTable();
+ table.set("name", c.name);
+ table.set("order", c.order);
+ table.set("title", c.title);
+ table.set("description", c.description);
+ table.set("icon", c.icon);
+ return table;
+}
+
+Maybe<Collectable> LuaConverter<Collectable>::to(LuaEngine& engine, LuaValue const& v) {
+ if (auto table = v.ptr<LuaTable>()) {
+ auto name = engine.luaMaybeTo<String>(table->get("name"));
+ if (name) {
+ return Collectable(*name,
+ engine.luaMaybeTo<int>(table->get("order")).value(0),
+ engine.luaMaybeTo<String>(table->get("title")).value(""),
+ engine.luaMaybeTo<String>(table->get("description")).value(""),
+ engine.luaMaybeTo<String>(table->get("icon")).value(""));
+ }
+ }
+
+ return {};
+}
+
+LuaMethods<BehaviorStateWeakPtr> LuaUserDataMethods<BehaviorStateWeakPtr>::make() {
+ LuaMethods<BehaviorStateWeakPtr> methods;
+ methods.registerMethodWithSignature<NodeStatus, BehaviorStateWeakPtr, float>(
+ "run", [](BehaviorStateWeakPtr const& behavior, float dt) -> NodeStatus {
+ if (behavior.expired())
+ throw StarException("Use of expired blackboard");
+
+ return behavior.lock()->run(dt);
+ });
+ methods.registerMethodWithSignature<void, BehaviorStateWeakPtr>(
+ "clear", [](BehaviorStateWeakPtr const& behavior) {
+ if (behavior.expired())
+ throw StarException("Use of expired blackboard");
+
+ behavior.lock()->clear();
+ });
+ methods.registerMethodWithSignature<BlackboardWeakPtr, BehaviorStateWeakPtr>(
+ "blackboard", [](BehaviorStateWeakPtr const& behavior) -> BlackboardWeakPtr {
+ if (behavior.expired())
+ throw StarException("Use of expired blackboard");
+
+ return behavior.lock()->blackboardPtr();
+ });
+ return methods;
+}
+
+LuaValue LuaConverter<NodeStatus>::from(LuaEngine&, NodeStatus const& status) {
+ if (status == NodeStatus::Success)
+ return true;
+ else if (status == NodeStatus::Failure)
+ return false;
+ else
+ return {};
+}
+
+NodeStatus LuaConverter<NodeStatus>::to(LuaEngine&, LuaValue const& v) {
+ if (v.is<LuaBoolean>())
+ return v.get<LuaBoolean>() == true ? NodeStatus::Success : NodeStatus::Failure;
+ else
+ return NodeStatus::Running;
+}
+
+LuaMethods<BlackboardWeakPtr> LuaUserDataMethods<BlackboardWeakPtr>::make() {
+ LuaMethods<BlackboardWeakPtr> methods;
+
+ auto get =[](BlackboardWeakPtr const& board, NodeParameterType const& type, String const& key) -> LuaValue {
+ if (board.expired())
+ throw StarException("Use of expired blackboard");
+
+ return board.lock()->get(type, key);
+ };
+ auto set = [](BlackboardWeakPtr const& board, NodeParameterType const& type, String const& key, LuaValue const& value) {
+ if (board.expired())
+ throw StarException("Use of expired blackboard");
+
+ board.lock()->set(type, key, value);
+ };
+
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String, String>("get",
+ [&](BlackboardWeakPtr const& board, String const& type, String const& key) -> LuaValue {
+ return get(board, NodeParameterTypeNames.getLeft(type), key);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, String, LuaValue>("set",
+ [&](BlackboardWeakPtr const& board, String const& type, String const& key, LuaValue const& value) {
+ set(board, NodeParameterTypeNames.getLeft(type), key, value);
+ });
+
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getEntity", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Entity, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getPosition", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Position, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getVec2", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Vec2, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getNumber", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Number, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getBool", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Bool, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getList", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::List, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getTable", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::Table, key);
+ });
+ methods.registerMethodWithSignature<LuaValue, BlackboardWeakPtr, String>(
+ "getString", [&](BlackboardWeakPtr const& board, String const& key) -> LuaValue {
+ return get(board, NodeParameterType::String, key);
+ });
+
+
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setEntity", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Entity, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setPosition", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Position, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setVec2", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Vec2, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setNumber", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Number, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setBool", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Bool, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setList", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::List, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setTable", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::Table, key, value);
+ });
+ methods.registerMethodWithSignature<void, BlackboardWeakPtr, String, LuaValue>(
+ "setString", [&](BlackboardWeakPtr const& board, String const& key, LuaValue const& value) {
+ set(board, NodeParameterType::String, key, value);
+ });
+ return methods;
+}
+
+}