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

summaryrefslogtreecommitdiff
path: root/source/game/StarWorldImpl.hpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-07-31 17:31:02 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-07-31 17:31:02 +1000
commit2dc10fa5ad76784c7053d00887a7f878b58dfcf9 (patch)
tree7138b9321517a3e4ead4b9b293ab6524ed4b1bca /source/game/StarWorldImpl.hpp
parent72e33fdef5e8e847a26a5525cc64b6a198aeebd4 (diff)
Tile Prediction improvements
each tile modification is now validated and then added to prediction one-by-one
Diffstat (limited to 'source/game/StarWorldImpl.hpp')
-rw-r--r--source/game/StarWorldImpl.hpp55
1 files changed, 31 insertions, 24 deletions
diff --git a/source/game/StarWorldImpl.hpp b/source/game/StarWorldImpl.hpp
index e8c0823..91e03fb 100644
--- a/source/game/StarWorldImpl.hpp
+++ b/source/game/StarWorldImpl.hpp
@@ -49,10 +49,12 @@ namespace WorldImpl {
bool canPlaceMaterialColorVariant(Vec2I const& pos, TileLayer layer, MaterialColorVariant color, GetTileFunction& getTile);
template <typename GetTileFunction>
bool canPlaceMod(Vec2I const& pos, TileLayer layer, ModId mod, GetTileFunction& getTile);
+ template <typename GetTileFunction>
+ pair<bool, bool> validateTileModification(EntityMapPtr const& entityMap, Vec2I const& pos, TileModification const& modification, bool allowEntityOverlap, GetTileFunction& getTile);
// Split modification list into good and bad
template <typename GetTileFunction>
pair<TileModificationList, TileModificationList> splitTileModifications(EntityMapPtr const& entityMap, TileModificationList const& modificationList,
- bool allowEntityOverlap, function<bool(Vec2I pos, GetTileFunction& getTile, TileModification modification)> extraCheck = {});
+ bool allowEntityOverlap, GetTileFunction& getTile, function<bool(Vec2I pos, TileModification modification)> extraCheck = {});
template <typename TileSectorArray>
float windLevel(shared_ptr<TileSectorArray> const& tileSectorArray, Vec2F const& position, float weatherWindLevel);
@@ -314,33 +316,38 @@ namespace WorldImpl {
}
template <typename GetTileFunction>
- pair<TileModificationList, TileModificationList> splitTileModifications(EntityMapPtr const& entityMap,
- TileModificationList const& modificationList, bool allowEntityOverlap, GetTileFunction& getTile, function<bool(Vec2I pos, TileModification modification)> extraCheck) {
+ pair<bool, bool> validateTileModification(EntityMapPtr const& entityMap, Vec2I const& pos, TileModification const& modification, bool allowEntityOverlap, GetTileFunction& getTile) {
+ bool good = false;
+ bool perhaps = false;
+
+ if (auto placeMaterial = modification.ptr<PlaceMaterial>()) {
+ perhaps = WorldImpl::perhapsCanPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, getTile);
+ if (perhaps)
+ good = WorldImpl::canPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, getTile);
+ } else if (auto placeMod = modification.ptr<PlaceMod>()) {
+ good = WorldImpl::canPlaceMod(pos, placeMod->layer, placeMod->mod, getTile);
+ } else if (auto placeMaterialColor = modification.ptr<PlaceMaterialColor>()) {
+ good = WorldImpl::canPlaceMaterialColorVariant(pos, placeMaterialColor->layer, placeMaterialColor->color, getTile);
+ } else if (modification.is<PlaceLiquid>()) {
+ good = getTile(pos).collision == CollisionKind::None;
+ } else {
+ good = false;
+ }
+
+ return { good, perhaps };
+ }
+
+ template <typename GetTileFunction>
+ pair<TileModificationList, TileModificationList> splitTileModifications(EntityMapPtr const& entityMap, TileModificationList const& modificationList,
+ bool allowEntityOverlap, GetTileFunction& getTile, function<bool(Vec2I pos, TileModification modification)> extraCheck) {
TileModificationList success;
TileModificationList unknown;
TileModificationList failures;
for (auto const& pair : modificationList) {
- Vec2I pos;
- TileModification modification;
- std::tie(pos, modification) = pair;
-
- bool good = false;
- bool perhaps = false;
- if (extraCheck && !extraCheck(pos, modification)) {
- good = false;
- } else if (auto placeMaterial = modification.ptr<PlaceMaterial>()) {
- perhaps = WorldImpl::perhapsCanPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, getTile);
- if (perhaps)
- good = WorldImpl::canPlaceMaterial(entityMap, pos, placeMaterial->layer, placeMaterial->material, allowEntityOverlap, getTile);
- } else if (auto placeMod = modification.ptr<PlaceMod>()) {
- good = WorldImpl::canPlaceMod(pos, placeMod->layer, placeMod->mod, getTile);
- } else if (auto placeMaterialColor = modification.ptr<PlaceMaterialColor>()) {
- good = WorldImpl::canPlaceMaterialColorVariant(pos, placeMaterialColor->layer, placeMaterialColor->color, getTile);
- } else if (modification.is<PlaceLiquid>()) {
- good = getTile(pos).collision == CollisionKind::None;
- } else {
- good = false;
- }
+
+ bool good = false, perhaps = false;
+ if (!extraCheck || extraCheck(pair.first, pair.second))
+ std::tie(good, perhaps) = validateTileModification(entityMap, pair.first, pair.second, allowEntityOverlap, getTile);
if (good)
success.append(pair);