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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/opensb/binds/opensb.binds12
-rw-r--r--assets/opensb/sfx/tools/matradiusgrow.wavbin0 -> 4494 bytes
-rw-r--r--assets/opensb/sfx/tools/matradiusshrink.wavbin0 -> 4494 bytes
-rw-r--r--source/game/StarCollisionBlock.cpp7
-rw-r--r--source/game/StarCollisionBlock.hpp2
-rw-r--r--source/game/items/StarMaterialItem.cpp62
6 files changed, 68 insertions, 15 deletions
diff --git a/assets/opensb/binds/opensb.binds b/assets/opensb/binds/opensb.binds
index 43493e8..73ba73b 100644
--- a/assets/opensb/binds/opensb.binds
+++ b/assets/opensb/binds/opensb.binds
@@ -28,10 +28,20 @@
"group": "voice",
"name": "Push To Talk"
},
- "materialCycleCollision": {
+ "materialCollisionCycle": {
"default": [],
"group": "building",
"name": "Cycle Material Collision"
+ },
+ "materialRadiusGrow": {
+ "default": [],
+ "group": "building",
+ "name": "Grow Material Radius"
+ },
+ "materialRadiusShrink": {
+ "default": [],
+ "group": "building",
+ "name": "Shrink Material Radius"
}
}
}
diff --git a/assets/opensb/sfx/tools/matradiusgrow.wav b/assets/opensb/sfx/tools/matradiusgrow.wav
new file mode 100644
index 0000000..6a27a0e
--- /dev/null
+++ b/assets/opensb/sfx/tools/matradiusgrow.wav
Binary files differ
diff --git a/assets/opensb/sfx/tools/matradiusshrink.wav b/assets/opensb/sfx/tools/matradiusshrink.wav
new file mode 100644
index 0000000..95df1cc
--- /dev/null
+++ b/assets/opensb/sfx/tools/matradiusshrink.wav
Binary files differ
diff --git a/source/game/StarCollisionBlock.cpp b/source/game/StarCollisionBlock.cpp
index 6d693d9..dfe3204 100644
--- a/source/game/StarCollisionBlock.cpp
+++ b/source/game/StarCollisionBlock.cpp
@@ -2,6 +2,13 @@
namespace Star {
+EnumMap<TileCollisionOverride> const TileCollisionOverrideNames = {
+ {TileCollisionOverride::None, "None"},
+ {TileCollisionOverride::Empty, "Empty"},
+ {TileCollisionOverride::Platform, "Platform"},
+ {TileCollisionOverride::Block, "Block"}
+ };
+
EnumMap<CollisionKind> const CollisionKindNames{
{CollisionKind::Null, "Null"},
{CollisionKind::None, "None"},
diff --git a/source/game/StarCollisionBlock.hpp b/source/game/StarCollisionBlock.hpp
index c37ccd0..af8a290 100644
--- a/source/game/StarCollisionBlock.hpp
+++ b/source/game/StarCollisionBlock.hpp
@@ -59,6 +59,8 @@ CollisionSet const DefaultCollisionSet({CollisionKind::Null, CollisionKind::Slip
// Defines what can be "blocks" e.g. for tile rendering: Block and Slippery
CollisionSet const BlockCollisionSet({CollisionKind::Block, CollisionKind::Slippery});
+extern EnumMap<TileCollisionOverride> const TileCollisionOverrideNames;
+
extern EnumMap<CollisionKind> const CollisionKindNames;
bool isColliding(CollisionKind kind, CollisionSet const& collisionSet);
diff --git a/source/game/items/StarMaterialItem.cpp b/source/game/items/StarMaterialItem.cpp
index 210fcaa..f2f15da 100644
--- a/source/game/items/StarMaterialItem.cpp
+++ b/source/game/items/StarMaterialItem.cpp
@@ -11,6 +11,8 @@
namespace Star {
+constexpr int BlockRadiusLimit = 16;
+
MaterialItem::MaterialItem(Json const& config, String const& directory, Json const& settings)
: Item(config, directory, settings), FireableItem(config), BeamItem(config) {
m_material = config.getInt("materialId");
@@ -31,11 +33,13 @@ MaterialItem::MaterialItem(Json const& config, String const& directory, Json con
auto defaultParameters = Root::singleton().assets()->json("/items/defaultParameters.config");
setCooldownTime(config.queryFloat("materialItems.cooldown", defaultParameters.queryFloat("materialItems.cooldown")));
- m_blockRadius = config.getFloat("blockRadius", defaultParameters.getFloat("blockRadius"));
- m_altBlockRadius = config.getFloat("altBlockRadius", defaultParameters.getFloat("altBlockRadius"));
+ m_blockRadius = instanceValue("blockRadius", defaultParameters.getFloat("blockRadius")).toFloat();
+ m_altBlockRadius = instanceValue("altBlockRadius", defaultParameters.getFloat("altBlockRadius")).toFloat();
auto materialDatabase = Root::singleton().materialDatabase();
- m_multiplace = config.getBool("allowMultiplace", BlockCollisionSet.contains(materialDatabase->materialCollisionKind(m_material)));
+ auto multiplace = instanceValue("allowMultiplace", BlockCollisionSet.contains(materialDatabase->materialCollisionKind(m_material)));
+ if (multiplace.isType(Json::Type::Bool))
+ m_multiplace = multiplace.toBool();
m_placeSounds = jsonToStringList(config.get("placeSounds", JsonArray()));
if (m_placeSounds.empty()) {
auto miningSound = materialDatabase->miningSound(m_material);
@@ -49,7 +53,7 @@ MaterialItem::MaterialItem(Json const& config, String const& directory, Json con
}
m_shifting = false;
m_lastTileAreaRadiusCache = 0.0f;
- m_collisionOverride = TileCollisionOverride::None;
+ m_collisionOverride = TileCollisionOverrideNames.maybeLeft(instanceValue("collisionOverride", "None").toString()).value(TileCollisionOverride::None);
}
ItemPtr MaterialItem::clone() const {
@@ -69,23 +73,53 @@ void MaterialItem::uninit() {
void MaterialItem::update(float dt, FireMode fireMode, bool shifting, HashSet<MoveControlType> const& moves) {
FireableItem::update(dt, fireMode, shifting, moves);
BeamItem::update(dt, fireMode, shifting, moves);
- if (shifting || !multiplaceEnabled())
+ float radius = calcRadius(shifting);
+ if (radius == 1)
setEnd(BeamItem::EndType::Tile);
else
setEnd(BeamItem::EndType::TileGroup);
m_shifting = shifting;
- if (auto presses = Input::singleton().bindDown("opensb", "materialCycleCollision")) {
- CollisionKind baseKind = Root::singleton().materialDatabase()->materialCollisionKind(m_material);
- for (size_t i = 0; i != *presses; ++i) {
- constexpr auto limit = (uint8_t)TileCollisionOverride::Block + 1;
- while (true) {
- m_collisionOverride = (TileCollisionOverride)(((uint8_t)m_collisionOverride + 1) % limit);
- if (collisionKindFromOverride(m_collisionOverride) != baseKind)
- break;
+ if (owner()->isMaster()) {
+ Input& input = Input::singleton();
+ if (auto presses = input.bindDown("opensb", "materialCollisionCycle")) {
+ CollisionKind baseKind = Root::singleton().materialDatabase()->materialCollisionKind(m_material);
+ for (size_t i = 0; i != *presses; ++i) {
+ constexpr auto limit = (uint8_t)TileCollisionOverride::Block + 1;
+ while (true) {
+ m_collisionOverride = TileCollisionOverride(((uint8_t)m_collisionOverride + 1) % limit);
+ setInstanceValue("collisionOverride", TileCollisionOverrideNames.getRight(m_collisionOverride));
+ if (collisionKindFromOverride(m_collisionOverride) != baseKind)
+ break;
+ }
}
+ owner()->addSound("/sfx/tools/cyclematcollision.ogg", 1.0f, Random::randf(0.9f, 1.1f));
+ }
+
+ if (auto presses = input.bindDown("opensb", "materialRadiusGrow")) {
+ m_blockRadius = min(BlockRadiusLimit, int(m_blockRadius + *presses));
+ setInstanceValue("blockRadius", m_blockRadius);
+ owner()->addSound("/sfx/tools/matradiusgrow.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit);
}
- owner()->addSound("/sfx/tools/cyclematcollision.ogg", 1.0f, Random::randf(0.9f, 1.1f));
+
+ if (auto presses = input.bindDown("opensb", "materialRadiusShrink")) {
+ m_blockRadius = max(1, int(m_blockRadius - *presses));
+ setInstanceValue("blockRadius", m_blockRadius);
+ owner()->addSound("/sfx/tools/matradiusshrink.wav", 1.0f, 1.0f + m_blockRadius / BlockRadiusLimit);
+ }
+ }
+ else {
+ auto blockRadius = instanceValue("blockRadius");
+ if (blockRadius.isType(Json::Type::Float))
+ m_blockRadius = blockRadius.toFloat();
+
+ auto altBlockRadius = instanceValue("altBlockRadius");
+ if (altBlockRadius.isType(Json::Type::Float))
+ m_altBlockRadius = altBlockRadius.toFloat();
+
+ auto collisionOverride = instanceValue("collisionOverride");
+ if (collisionOverride.isType(Json::Type::String))
+ m_collisionOverride = TileCollisionOverrideNames.maybeLeft(collisionOverride.toString()).value(TileCollisionOverride::None);
}
}