diff --git a/core/src/mindustry/ai/RtsAI.java b/core/src/mindustry/ai/RtsAI.java index 56643587b3..7242afbfe8 100644 --- a/core/src/mindustry/ai/RtsAI.java +++ b/core/src/mindustry/ai/RtsAI.java @@ -33,6 +33,7 @@ public class RtsAI{ //in order of priority?? static final BlockFlag[] flags = {BlockFlag.generator, BlockFlag.factory, BlockFlag.core, BlockFlag.battery}; static final ObjectFloatMap weights = new ObjectFloatMap<>(); + //TODO configurable, perhaps static final int minSquadSize = 4; //TODO max squad size static final boolean debug = OS.hasProp("mindustry.debug"); diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index b4a628a39d..156c303032 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -70,7 +70,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, transient boolean wasDamaged; //used only by the indexer transient float visualLiquid; - /** TODO Each bit corresponds to a team ID. Only 64 are supported. */ + /** TODO Each bit corresponds to a team ID. Only 64 are supported. Does not work on servers. */ transient long visibleFlags; transient boolean wasVisible; //used only by the block renderer when fog is on (TODO replace with discovered check?) @@ -165,10 +165,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //region io public final void writeBase(Writes write){ + boolean writeVisibility = state.rules.fog && visibleFlags != 0; + write.f(health); write.b(rotation | 0b10000000); write.b(team.id); - write.b(3); //version + write.b(writeVisibility ? 4 : 3); //version write.b(enabled ? 1 : 0); //write presence of items/power/liquids/cons, so removing/adding them does not corrupt future saves. write.b(moduleBitmask()); @@ -179,6 +181,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, //efficiency is written as two bytes to save space write.b((byte)(Mathf.clamp(efficiency) * 255f)); write.b((byte)(Mathf.clamp(optionalEfficiency) * 255f)); + + //only write visibility when necessary, saving 8 bytes - implies new version + if(writeVisibility){ + write.l(visibleFlags); + } } public final void readBase(Reads read){ @@ -220,6 +227,11 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, efficiency = read.ub() / 255f; optionalEfficiency = read.ub() / 255f; } + + //version 4 (and only 4 at the moment) has visibility flags + if(version == 4){ + visibleFlags = read.l(); + } } public int moduleBitmask(){ diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 489a2117ed..8499849c98 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -83,7 +83,7 @@ public class BlockRenderer{ updateFloors.add(new UpdateRenderState(tile, tile.floor())); } - if(tile.build != null && (tile.team() == player.team() || !state.rules.fog)){ + if(tile.build != null && (tile.team() == player.team() || !state.rules.fog || (tile.build.visibleFlags & (1L << player.team().id)) != 0)){ tile.build.wasVisible = true; } @@ -416,6 +416,7 @@ public class BlockRenderer{ updateShadow(build); renderer.minimap.update(tile); } + build.visibleFlags |= (1L << player.team().id); build.wasVisible = true; }