Ticket #3811: clean_buildrestrictions_let.diff
File clean_buildrestrictions_let.diff, 8.7 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/simulation/components/BuildRestrictions.js
79 79 */ 80 80 BuildRestrictions.prototype.CheckPlacement = function() 81 81 { 82 varcmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);83 varname = cmpIdentity ? cmpIdentity.GetGenericName() : "Building";82 let cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity); 83 let name = cmpIdentity ? cmpIdentity.GetGenericName() : "Building"; 84 84 85 varresult = {85 let result = { 86 86 "success": false, 87 87 "message": markForTranslation("%(name)s cannot be built due to unknown error"), 88 88 "parameters": { … … 93 93 }; 94 94 95 95 // TODO: AI has no visibility info 96 varcmpPlayer = QueryOwnerInterface(this.entity, IID_Player);96 let cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 97 97 if (!cmpPlayer.IsAI()) 98 98 { 99 99 // Check whether it's in a visible or fogged region 100 varcmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);101 varcmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);100 let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 101 let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); 102 102 if (!cmpRangeManager || !cmpOwnership) 103 103 return result; // Fail 104 104 105 varexplored = (cmpRangeManager.GetLosVisibility(this.entity, cmpOwnership.GetOwner()) != "hidden");105 let explored = (cmpRangeManager.GetLosVisibility(this.entity, cmpOwnership.GetOwner()) != "hidden"); 106 106 if (!explored) 107 107 { 108 108 result.message = markForTranslation("%(name)s cannot be built in unexplored area"); … … 111 111 } 112 112 113 113 // Check obstructions and terrain passability 114 varpassClassName = "";114 let passClassName = ""; 115 115 switch (this.template.PlacementType) 116 116 { 117 117 case "shore": … … 129 129 passClassName = "building-land"; 130 130 } 131 131 132 varcmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction);132 let cmpObstruction = Engine.QueryInterface(this.entity, IID_Obstruction); 133 133 if (!cmpObstruction) 134 134 return result; // Fail 135 135 136 let ret = cmpObstruction.CheckFoundation(passClassName, this.template.Category == "Wall") 136 137 137 if (this.template.Category == "Wall")138 {139 // for walls, only test the center point140 var ret = cmpObstruction.CheckFoundation(passClassName, true);141 }142 else143 {144 var ret = cmpObstruction.CheckFoundation(passClassName, false);145 }146 147 138 if (ret != "success") 148 139 { 149 140 switch (ret) … … 163 154 } 164 155 165 156 // Check territory restrictions 166 varcmpTerritoryManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager);167 varcmpPlayer = QueryOwnerInterface(this.entity, IID_Player);168 varcmpPosition = Engine.QueryInterface(this.entity, IID_Position);157 let cmpTerritoryManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TerritoryManager); 158 let cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 159 let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); 169 160 if (!(cmpTerritoryManager && cmpPlayer && cmpPosition && cmpPosition.IsInWorld())) 170 161 return result; // Fail 171 162 172 var pos = cmpPosition.GetPosition2D(); 173 var tileOwner = cmpTerritoryManager.GetOwner(pos.x, pos.y); 174 var isConnected = !cmpTerritoryManager.IsTerritoryBlinking(pos.x, pos.y); 175 var isOwn = tileOwner == cmpPlayer.GetPlayerID(); 176 var isMutualAlly = cmpPlayer.IsExclusiveMutualAlly(tileOwner); 177 var isNeutral = tileOwner == 0; 163 let pos = cmpPosition.GetPosition2D(); 164 let tileOwner = cmpTerritoryManager.GetOwner(pos.x, pos.y); 165 let isConnected = !cmpTerritoryManager.IsTerritoryBlinking(pos.x, pos.y); 178 166 179 varinvalidTerritory = "";180 if ( isOwn)167 let invalidTerritory = ""; 168 if (tileOwner == cmpPlayer.GetPlayerID()) 181 169 { 182 170 if (!this.HasTerritory("own")) 183 171 // Translation: territoryType being displayed in a translated sentence in the form: "House cannot be built in %(territoryType)s territory.". … … 186 174 // Translation: territoryType being displayed in a translated sentence in the form: "House cannot be built in %(territoryType)s territory.". 187 175 invalidTerritory = markForTranslationWithContext("Territory type", "unconnected own"); 188 176 } 189 else if ( isMutualAlly)177 else if (cmpPlayer.IsExclusiveMutualAlly(tileOwner)) 190 178 { 191 179 if (!this.HasTerritory("ally")) 192 180 // Translation: territoryType being displayed in a translated sentence in the form: "House cannot be built in %(territoryType)s territory.". … … 195 183 // Translation: territoryType being displayed in a translated sentence in the form: "House cannot be built in %(territoryType)s territory.". 196 184 invalidTerritory = markForTranslationWithContext("Territory type", "unconnected allied"); 197 185 } 198 else if ( isNeutral)186 else if (!tileOwner) 199 187 { 200 188 if (!this.HasTerritory("neutral")) 201 189 // Translation: territoryType being displayed in a translated sentence in the form: "House cannot be built in %(territoryType)s territory.". … … 227 215 // 1. ships can be spawned "nearby" 228 216 // 2. builders can pass the terrain where the dock is placed (don't worry about paths) 229 217 // so it's correct even if the criteria changes for these units 230 varcmpFootprint = Engine.QueryInterface(this.entity, IID_Footprint);218 let cmpFootprint = Engine.QueryInterface(this.entity, IID_Footprint); 231 219 if (!cmpFootprint) 232 220 return result; // Fail 233 221 234 222 // Get building's footprint 235 varshape = cmpFootprint.GetShape();236 varhalfSize = 0;223 let shape = cmpFootprint.GetShape(); 224 let halfSize = 0; 237 225 if (shape.type == "square") 238 226 halfSize = shape.depth/2; 239 227 else if (shape.type == "circle") 240 228 halfSize = shape.radius; 241 229 242 varcmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain);243 varcmpWaterManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_WaterManager);230 let cmpTerrain = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain); 231 let cmpWaterManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_WaterManager); 244 232 if (!cmpTerrain || !cmpWaterManager) 245 233 return result; // Fail 246 234 247 varang = cmpPosition.GetRotation().y;248 varsz = halfSize * Math.sin(ang);249 varcz = halfSize * Math.cos(ang);235 let ang = cmpPosition.GetRotation().y; 236 let sz = halfSize * Math.sin(ang); 237 let cz = halfSize * Math.cos(ang); 250 238 if ((cmpWaterManager.GetWaterLevel(pos.x + sz, pos.y + cz) - cmpTerrain.GetGroundLevel(pos.x + sz, pos.y + cz)) < 1.0 // front 251 239 || (cmpWaterManager.GetWaterLevel(pos.x - sz, pos.y - cz) - cmpTerrain.GetGroundLevel(pos.x - sz, pos.y - cz)) > 2.0) // back 252 240 { … … 258 246 // Check distance restriction 259 247 if (this.template.Distance) 260 248 { 261 varcmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);262 varcmpPlayer = QueryOwnerInterface(this.entity, IID_Player);263 varcat = this.template.Distance.FromClass;249 let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 250 let cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); 251 let cat = this.template.Distance.FromClass; 264 252 265 varfilter = function(id)253 let filter = function(id) 266 254 { 267 varcmpIdentity = Engine.QueryInterface(id, IID_Identity);255 let cmpIdentity = Engine.QueryInterface(id, IID_Identity); 268 256 return cmpIdentity.GetClassesList().indexOf(cat) > -1; 269 257 }; 270 258 271 259 if (this.template.Distance.MinDistance) 272 260 { 273 vardist = +this.template.Distance.MinDistance;274 varnearEnts = cmpRangeManager.ExecuteQuery(this.entity, 0, dist, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions).filter(filter);261 let dist = +this.template.Distance.MinDistance; 262 let nearEnts = cmpRangeManager.ExecuteQuery(this.entity, 0, dist, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions).filter(filter); 275 263 if (nearEnts.length) 276 264 { 277 varresult = markForPluralTranslation(265 let result = markForPluralTranslation( 278 266 "%(name)s too close to a %(category)s, must be at least %(distance)s meter away", 279 267 "%(name)s too close to a %(category)s, must be at least %(distance)s meters away", 280 268 +this.template.Distance.MinDistance); … … 292 280 } 293 281 if (this.template.Distance.MaxDistance) 294 282 { 295 vardist = +this.template.Distance.MaxDistance;296 varnearEnts = cmpRangeManager.ExecuteQuery(this.entity, 0, dist, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions).filter(filter);283 let dist = +this.template.Distance.MaxDistance; 284 let nearEnts = cmpRangeManager.ExecuteQuery(this.entity, 0, dist, [cmpPlayer.GetPlayerID()], IID_BuildRestrictions).filter(filter); 297 285 if (!nearEnts.length) 298 286 { 299 varresult = markForPluralTranslation(287 let result = markForPluralTranslation( 300 288 "%(name)s too far from a %(category)s, must be within %(distance)s meter", 301 289 "%(name)s too far from a %(category)s, must be within %(distance)s meters", 302 290 +this.template.Distance.MinDistance);