Ticket #4102: 4102.3.diff
File 4102.3.diff, 22.8 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/simulation/components/GarrisonHolder.js
65 65 this.allowGarrisoning = {}; 66 66 this.visibleGarrisonPoints = []; 67 67 if (this.template.VisibleGarrisonPoints) 68 { 69 for each (var offset in this.template.VisibleGarrisonPoints) 70 { 71 var o = {}; 72 o.x = +offset.X; 73 o.y = +offset.Y; 74 o.z = +offset.Z; 75 this.visibleGarrisonPoints.push({"offset":o, "entity": null}); 76 } 77 } 68 for (let name in cmpGarrisonHolder.template.VisibleGarrisonPoints) 69 cmpGarrisonHolder.visibleGarrisonPoints.push({ 70 "offset": { 71 "x": +cmpGarrisonHolder.template.VisibleGarrisonPoints[name].X, 72 "y": +cmpGarrisonHolder.template.VisibleGarrisonPoints[name].Y, 73 "z": +cmpGarrisonHolder.template.VisibleGarrisonPoints[name].Z 74 }, 75 "entity": null 76 }); 78 77 }; 79 78 80 79 /** … … 82 81 */ 83 82 GarrisonHolder.prototype.GetLoadingRange = function() 84 83 { 85 var max = +this.template.LoadingRange; 86 return { "max": max, "min": 0 }; 84 return { "max": +this.template.LoadingRange, "min": 0 }; 87 85 }; 88 86 89 87 /** … … 93 91 { 94 92 if (!this.template.Pickup || this.IsFull()) 95 93 return false; 96 varcmpOwner = Engine.QueryInterface(this.entity, IID_Ownership);94 let cmpOwner = Engine.QueryInterface(this.entity, IID_Ownership); 97 95 if (!cmpOwner) 98 96 return false; 99 var player = cmpOwner.GetOwner(); 100 return IsOwnedByPlayer(player, ent); 97 return IsOwnedByPlayer(cmpOwner.GetOwner(), ent); 101 98 }; 102 99 103 100 … … 163 160 */ 164 161 GarrisonHolder.prototype.IsGarrisoningAllowed = function() 165 162 { 166 for each (var allow in this.allowGarrisoning) 167 { 168 if (!allow) 163 for (let allow in this.allowGarrisoning) 164 if (!this.allowGarrisoning[allow]) 169 165 return false; 170 } 166 171 167 return true; 172 168 }; 173 169 … … 176 172 */ 177 173 GarrisonHolder.prototype.GetGarrisonedEntitiesCount = function() 178 174 { 179 varcount = 0;180 for each (var ent inthis.entities)175 let count = 0; 176 for (let ent of this.entities) 181 177 { 182 count++;183 varcmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder);178 ++count; 179 let cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder); 184 180 if (cmpGarrisonHolder) 185 181 count += cmpGarrisonHolder.GetGarrisonedEntitiesCount(); 186 182 } … … 196 192 if (!this.IsGarrisoningAllowed()) 197 193 return false; 198 194 199 varcmpIdentity = Engine.QueryInterface(entity, IID_Identity);195 let cmpIdentity = Engine.QueryInterface(entity, IID_Identity); 200 196 if (!cmpIdentity) 201 197 return false; 202 var entityClasses = cmpIdentity.GetClassesList(); 203 return MatchesClassList(entityClasses, this.template.List._string); 198 return MatchesClassList(cmpIdentity.GetClassesList(), this.template.List._string); 204 199 }; 205 200 206 201 /** … … 211 206 */ 212 207 GarrisonHolder.prototype.Garrison = function(entity, vgpEntity) 213 208 { 214 varcmpPosition = Engine.QueryInterface(entity, IID_Position);209 let cmpPosition = Engine.QueryInterface(entity, IID_Position); 215 210 if (!cmpPosition) 216 211 return false; 217 212 … … 254 249 return false; 255 250 256 251 // check the capacity 257 varextraCount = 0;258 varcmpGarrisonHolder = Engine.QueryInterface(entity, IID_GarrisonHolder);252 let extraCount = 0; 253 let cmpGarrisonHolder = Engine.QueryInterface(entity, IID_GarrisonHolder); 259 254 if (cmpGarrisonHolder) 260 255 extraCount += cmpGarrisonHolder.GetGarrisonedEntitiesCount(); 261 256 if (this.GetGarrisonedEntitiesCount() + extraCount >= this.GetCapacity()) … … 263 258 264 259 if (!this.timer && this.GetHealRate() > 0) 265 260 { 266 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 267 this.timer = cmpTimer.SetTimeout(this.entity, IID_GarrisonHolder, "HealTimeout", 1000, {}); 261 let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 262 if(cmpTimer) 263 this.timer = cmpTimer.SetTimeout(this.entity, IID_GarrisonHolder, "HealTimeout", 1000, {}); 268 264 } 269 265 270 266 // Actual garrisoning happens here 271 267 this.entities.push(entity); 272 268 this.UpdateGarrisonFlag(); 273 varcmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);269 let cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue); 274 270 if (cmpProductionQueue) 275 271 cmpProductionQueue.PauseProduction(); 276 272 277 varcmpAura = Engine.QueryInterface(entity, IID_Auras);273 let cmpAura = Engine.QueryInterface(entity, IID_Auras); 278 274 if (cmpAura && cmpAura.HasGarrisonAura()) 279 275 cmpAura.ApplyGarrisonBonus(this.entity); 280 276 281 Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added" 277 Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added": [entity], "removed": [] }); 282 278 283 varcmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);279 let cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI); 284 280 if (cmpUnitAI && cmpUnitAI.IsUnderAlert()) 285 Engine.PostMessage(cmpUnitAI.GetAlertRaiser(), MT_UnitGarrisonedAfterAlert, { "holder": this.entity, "unit": entity});281 Engine.PostMessage(cmpUnitAI.GetAlertRaiser(), MT_UnitGarrisonedAfterAlert, { "holder": this.entity, "unit": entity }); 286 282 287 283 return true; 288 284 }; … … 294 290 */ 295 291 GarrisonHolder.prototype.Eject = function(entity, forced) 296 292 { 297 varentityIndex = this.entities.indexOf(entity);293 let entityIndex = this.entities.indexOf(entity); 298 294 // Error: invalid entity ID, usually it's already been ejected 299 295 if (entityIndex == -1) 300 296 return false; // Fail 301 297 302 298 // Find spawning location 303 varcmpFootprint = Engine.QueryInterface(this.entity, IID_Footprint);304 varcmpHealth = Engine.QueryInterface(this.entity, IID_Health);305 varcmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);299 let cmpFootprint = Engine.QueryInterface(this.entity, IID_Footprint); 300 let cmpHealth = Engine.QueryInterface(this.entity, IID_Health); 301 let cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity); 306 302 // If the garrisonHolder is a sinking ship, restrict the location to the intersection of both passabilities 307 303 // TODO: should use passability classes to be more generic 308 if ((!cmpHealth || cmpHealth.GetHitpoints() == 0) && cmpIdentity && cmpIdentity.HasClass("Ship")) 309 var pos = cmpFootprint.PickSpawnPointBothPass(entity); 310 else 311 var pos = cmpFootprint.PickSpawnPoint(entity); 304 let pos = (!cmpHealth || cmpHealth.GetHitpoints() === 0) && cmpIdentity && cmpIdentity.HasClass("Ship") ? 305 cmpFootprint.PickSpawnPointBothPass(entity) : 306 cmpFootprint.PickSpawnPoint(entity); 312 307 313 308 if (pos.y < 0) 314 309 { … … 315 310 // Error: couldn't find space satisfying the unit's passability criteria 316 311 if (forced) 317 312 { // If ejection is forced, we need to continue, so use center of the building 318 varcmpPosition = Engine.QueryInterface(this.entity, IID_Position);313 let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); 319 314 pos = cmpPosition.GetPosition(); 320 315 } 321 316 else … … 324 319 } 325 320 } 326 321 327 varcmpNewPosition = Engine.QueryInterface(entity, IID_Position);322 let cmpNewPosition = Engine.QueryInterface(entity, IID_Position); 328 323 this.entities.splice(entityIndex, 1); 329 324 330 for (var vgp of this.visibleGarrisonPoints) 325 let cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI); 326 for (let vgp of this.visibleGarrisonPoints) 331 327 { 332 328 if (vgp.entity != entity) 333 329 continue; 334 330 cmpNewPosition.SetTurretParent(INVALID_ENTITY, new Vector3D()); 335 var cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);336 331 if (cmpUnitAI) 337 332 cmpUnitAI.ResetTurretStance(); 338 333 vgp.entity = null; … … 339 334 break; 340 335 } 341 336 342 var cmpUnitAI = Engine.QueryInterface(entity, IID_UnitAI);343 337 if (cmpUnitAI) 344 338 cmpUnitAI.Ungarrison(); 345 339 346 varcmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue);340 let cmpProductionQueue = Engine.QueryInterface(entity, IID_ProductionQueue); 347 341 if (cmpProductionQueue) 348 342 cmpProductionQueue.UnpauseProduction(); 349 343 350 varcmpAura = Engine.QueryInterface(entity, IID_Auras);344 let cmpAura = Engine.QueryInterface(entity, IID_Auras); 351 345 if (cmpAura && cmpAura.HasGarrisonAura()) 352 346 cmpAura.RemoveGarrisonBonus(this.entity); 353 347 … … 366 360 */ 367 361 GarrisonHolder.prototype.OrderWalkToRallyPoint = function(entities) 368 362 { 369 varcmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);370 varcmpRallyPoint = Engine.QueryInterface(this.entity, IID_RallyPoint);363 let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); 364 let cmpRallyPoint = Engine.QueryInterface(this.entity, IID_RallyPoint); 371 365 if (cmpRallyPoint) 372 366 { 373 varrallyPos = cmpRallyPoint.GetPositions()[0];367 let rallyPos = cmpRallyPoint.GetPositions()[0]; 374 368 if (rallyPos) 375 369 { 376 varcommands = GetRallyPointCommands(cmpRallyPoint, entities);370 let commands = GetRallyPointCommands(cmpRallyPoint, entities); 377 371 // ignore the rally point if it is autogarrison 378 372 if (commands[0].type == "garrison" && commands[0].target == this.entity) 379 373 return; 380 for each (var com in commands) 381 { 382 ProcessCommand(cmpOwnership.GetOwner(), com); 383 } 374 for (let command of commands) 375 ProcessCommand(cmpOwnership.GetOwner(), command); 384 376 } 385 377 } 386 378 }; … … 396 388 if (!this.IsGarrisoningAllowed() && !forced) 397 389 return false; 398 390 399 varejectedEntities = [];400 varsuccess = true;401 varfailedRadius;402 for ( varentity of entities)391 let ejectedEntities = []; 392 let success = true; 393 let failedRadius; 394 for (let entity of entities) 403 395 { 404 396 if (failedRadius !== undefined) 405 397 { 406 varcmpObstruction = Engine.QueryInterface(entity, IID_Obstruction);407 varradius = cmpObstruction ? cmpObstruction.GetUnitRadius() : 0;398 let cmpObstruction = Engine.QueryInterface(entity, IID_Obstruction); 399 let radius = cmpObstruction ? cmpObstruction.GetUnitRadius() : 0; 408 400 if (radius >= failedRadius) 409 401 continue; 410 402 } … … 411 403 412 404 if (this.Eject(entity, forced)) 413 405 { 414 varcmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership);415 varcmpEntOwnership = Engine.QueryInterface(entity, IID_Ownership);406 let cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); 407 let cmpEntOwnership = Engine.QueryInterface(entity, IID_Ownership); 416 408 if (cmpOwnership && cmpEntOwnership && cmpOwnership.GetOwner() == cmpEntOwnership.GetOwner()) 417 409 ejectedEntities.push(entity); 418 410 } … … 423 415 failedRadius = Math.min(failedRadius, radius); 424 416 else 425 417 { 426 varcmpObstruction = Engine.QueryInterface(entity, IID_Obstruction);418 let cmpObstruction = Engine.QueryInterface(entity, IID_Obstruction); 427 419 failedRadius = cmpObstruction ? cmpObstruction.GetUnitRadius() : 0; 428 420 } 429 421 } … … 454 446 */ 455 447 GarrisonHolder.prototype.UnloadTemplate = function(extendedTemplate, all, forced) 456 448 { 457 varindex = extendedTemplate.indexOf("&");449 let index = extendedTemplate.indexOf("&"); 458 450 if (index == -1) 459 451 return false; 460 452 461 varowner = +extendedTemplate.slice(1,index);462 vartemplate = extendedTemplate.slice(index+1);453 let owner = +extendedTemplate.slice(1,index); 454 let template = extendedTemplate.slice(index+1); 463 455 464 varentities = [];465 varcmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);466 for each (var entity inthis.entities)456 let entities = []; 457 let cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); 458 for (let entity of this.entities) 467 459 { 468 varcmpIdentity = Engine.QueryInterface(entity, IID_Identity);460 let cmpIdentity = Engine.QueryInterface(entity, IID_Identity); 469 461 470 462 // Units with multiple ranks are grouped together. 471 var name = cmpIdentity.GetSelectionGroupName() 472 || cmpTemplateManager.GetCurrentTemplateName(entity); 463 let name = cmpIdentity.GetSelectionGroupName() || cmpTemplateManager.GetCurrentTemplateName(entity); 473 464 474 465 if (name != template) 475 466 continue; … … 493 484 */ 494 485 GarrisonHolder.prototype.UnloadAllByOwner = function(owner, forced) 495 486 { 496 varentities = this.entities.filter(ent => {497 varcmpOwnership = Engine.QueryInterface(ent, IID_Ownership);487 let entities = this.entities.filter(ent => { 488 let cmpOwnership = Engine.QueryInterface(ent, IID_Ownership); 498 489 return cmpOwnership && cmpOwnership.GetOwner() == owner; 499 490 }); 500 491 return this.PerformEject(entities, forced); … … 507 498 */ 508 499 GarrisonHolder.prototype.UnloadAll = function(forced) 509 500 { 510 var entities = this.entities.slice(); 511 return this.PerformEject(entities, forced); 501 return this.PerformEject(this.entities.slice(), forced); 512 502 }; 513 503 514 504 /** … … 518 508 GarrisonHolder.prototype.OnHealthChanged = function(msg) 519 509 { 520 510 if (!this.HasEnoughHealth() && this.entities.length) 521 { 522 var entities = this.entities.slice(); 523 this.EjectOrKill(entities); 524 } 511 this.EjectOrKill(this.entities.slice()); 525 512 }; 526 513 527 514 /** … … 529 516 */ 530 517 GarrisonHolder.prototype.HasEnoughHealth = function() 531 518 { 532 varcmpHealth = Engine.QueryInterface(this.entity, IID_Health);533 varhitpoints = cmpHealth.GetHitpoints();534 varmaxHitpoints = cmpHealth.GetMaxHitpoints();535 varejectHitpoints = Math.floor((+this.template.EjectHealth) * maxHitpoints);519 let cmpHealth = Engine.QueryInterface(this.entity, IID_Health); 520 let hitpoints = cmpHealth.GetHitpoints(); 521 let maxHitpoints = cmpHealth.GetMaxHitpoints(); 522 let ejectHitpoints = Math.floor((+this.template.EjectHealth) * maxHitpoints); 536 523 return hitpoints > ejectHitpoints; 537 524 }; 538 525 … … 541 528 */ 542 529 GarrisonHolder.prototype.HealTimeout = function(data) 543 530 { 544 if (this.entities.length == 0) 531 let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 532 if (!this.entities.length) 545 533 { 546 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);547 534 cmpTimer.CancelTimer(this.timer); 548 535 this.timer = undefined; 536 return; 549 537 } 550 else 538 539 for (let entity of this.entities) 551 540 { 552 for each (var entity in this.entities) 541 let cmpHealth = Engine.QueryInterface(entity, IID_Health); 542 if (cmpHealth) 553 543 { 554 var cmpHealth = Engine.QueryInterface(entity, IID_Health); 555 if (cmpHealth) 556 { 557 // We do not want to heal unhealable units 558 if (!cmpHealth.IsUnhealable()) 559 cmpHealth.Increase(this.GetHealRate()); 560 } 544 // We do not want to heal unhealable units 545 if (!cmpHealth.IsUnhealable()) 546 cmpHealth.Increase(this.GetHealRate()); 561 547 } 562 var cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);563 this.timer = cmpTimer.SetTimeout(this.entity, IID_GarrisonHolder, "HealTimeout", 1000, {});564 548 } 549 this.timer = cmpTimer.SetTimeout(this.entity, IID_GarrisonHolder, "HealTimeout", 1000, {}); 565 550 }; 566 551 567 552 GarrisonHolder.prototype.UpdateGarrisonFlag = function() … … 580 565 { 581 566 if (this.timer) 582 567 { 583 varcmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);568 let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer); 584 569 cmpTimer.CancelTimer(this.timer); 585 570 } 586 571 }; … … 595 580 // the ownership change may be on the garrisonholder 596 581 if (this.entity == msg.entity) 597 582 { 598 varentities = [];599 for each (var entity inthis.entities)583 let entities = []; 584 for (let entity of this.entities) 600 585 { 601 586 if (msg.to == -1 || !IsOwnedByMutualAllyOfEntity(this.entity, entity)) 602 587 entities.push(entity); … … 607 592 } 608 593 609 594 // or on some of its garrisoned units 610 varentityIndex = this.entities.indexOf(msg.entity);595 let entityIndex = this.entities.indexOf(msg.entity); 611 596 if (entityIndex != -1) 612 597 { 613 598 // If the entity is dead, remove it directly instead of ejecting the corpse 614 varcmpHealth = Engine.QueryInterface(msg.entity, IID_Health);615 if (cmpHealth && cmpHealth.GetHitpoints() == 0)599 let cmpHealth = Engine.QueryInterface(msg.entity, IID_Health); 600 if (cmpHealth && cmpHealth.GetHitpoints() === 0) 616 601 { 617 602 this.entities.splice(entityIndex, 1); 618 603 Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added" : [], "removed": [msg.entity] }); 619 604 this.UpdateGarrisonFlag(); 620 605 621 for ( varpt of this.visibleGarrisonPoints)606 for (let pt of this.visibleGarrisonPoints) 622 607 if (pt.entity == msg.entity) 623 608 pt.entity = null; 624 609 } … … 632 617 */ 633 618 GarrisonHolder.prototype.OnGlobalEntityRenamed = function(msg) 634 619 { 635 varentityIndex = this.entities.indexOf(msg.entity);620 let entityIndex = this.entities.indexOf(msg.entity); 636 621 if (entityIndex != -1) 637 622 { 638 623 let vgpRenamed; … … 671 656 */ 672 657 GarrisonHolder.prototype.OnDiplomacyChanged = function() 673 658 { 674 varentities = this.entities.filter(ent => !IsOwnedByMutualAllyOfEntity(this.entity, ent));659 let entities = this.entities.filter(ent => !IsOwnedByMutualAllyOfEntity(this.entity, ent)); 675 660 this.EjectOrKill(entities); 676 661 }; 677 662 … … 686 671 // is inside a holder which kills its entities, so do not eject) 687 672 if (cmpPosition.IsInWorld()) 688 673 { 689 var cmpGarrisonHolder = this; 690 var ejectables = entities.filter(function(ent) { return cmpGarrisonHolder.IsEjectable(ent); }); 674 let ejectables = entities.filter(ent => this.IsEjectable(ent), this); 691 675 if (ejectables.length) 692 676 this.PerformEject(ejectables, false); 693 677 } 694 678 695 679 // And destroy all remaining entities 696 varkilledEntities = [];697 for each (var entity inentities)680 let killedEntities = []; 681 for (let entity of entities) 698 682 { 699 varentityIndex = this.entities.indexOf(entity);683 let entityIndex = this.entities.indexOf(entity); 700 684 if (entityIndex == -1) 701 685 continue; 702 varcmpHealth = Engine.QueryInterface(entity, IID_Health);686 let cmpHealth = Engine.QueryInterface(entity, IID_Health); 703 687 if (cmpHealth) 704 688 cmpHealth.Kill(); 705 689 this.entities.splice(entityIndex, 1); … … 707 691 } 708 692 709 693 if (killedEntities.length > 0) 710 Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added" : [], "removed": killedEntities });694 Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added": [], "removed": killedEntities }); 711 695 this.UpdateGarrisonFlag(); 712 696 }; 713 697 … … 716 700 */ 717 701 GarrisonHolder.prototype.IsEjectable = function(entity) 718 702 { 719 varejectableClasses = this.template.EjectClassesOnDestroy._string;703 let ejectableClasses = this.template.EjectClassesOnDestroy._string; 720 704 ejectableClasses = ejectableClasses ? ejectableClasses.split(/\s+/) : []; 721 var entityClasses = (Engine.QueryInterface(entity, IID_Identity)).GetClassesList(); 722 for each (var ejectableClass in ejectableClasses) 723 if (entityClasses.indexOf(ejectableClass) != -1) 724 return true; 725 726 return false; 705 let entityClasses = (Engine.QueryInterface(entity, IID_Identity)).GetClassesList(); 706 return ejectableClasses.some(ejectableClass => entityClasses.indexOf(ejectableClass) != -1); 727 707 }; 728 708 729 709 /** … … 744 724 }; 745 725 746 726 Engine.RegisterComponentType(IID_GarrisonHolder, "GarrisonHolder", GarrisonHolder); 747 -
binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js
1 Engine.LoadHelperScript("ValueModification.js"); 2 Engine.LoadHelperScript("Player.js"); 3 Engine.LoadComponentScript("interfaces/GarrisonHolder.js"); 4 Engine.LoadComponentScript("GarrisonHolder.js"); 5 Engine.LoadComponentScript("interfaces/AuraManager.js"); 6 Engine.LoadComponentScript("interfaces/Auras.js"); 7 Engine.LoadComponentScript("interfaces/Heal.js"); 8 Engine.LoadComponentScript("interfaces/Health.js"); 9 Engine.LoadComponentScript("interfaces/ProductionQueue.js") 10 Engine.LoadComponentScript("interfaces/TechnologyManager.js"); 11 Engine.LoadComponentScript("interfaces/Timer.js"); 12 Engine.LoadComponentScript("interfaces/UnitAI.js") 13 Engine.LoadComponentScript("interfaces/RallyPoint.js"); 14 15 const garrisonedEntitiesList = [25, 26, 27]; 16 const garrisonHolderId = 15; 17 const unitToGarrisonId = 24; 18 const classes = "Infantry+Cavalry"; 19 20 ResetState(); 21 22 let holder = garrisonHolderId; 23 let unit = unitToGarrisonId; 24 25 AddMock(holder, IID_Footprint, { 26 "PickSpawnPointBothPass": () => ({"x": 4, "y": 3}), 27 "PickSpawnPoint": () => ({"x": 4, "y": 3}), 28 }); 29 30 AddMock(holder, IID_Health, { 31 "GetHitpoints": () => 500, 32 "GetMaxHitpoints": () => 600, 33 }); 34 AddMock(holder, IID_Position, { 35 "SetTurretParent": () => {}, 36 "GetTurretParent": () => INVALID_ENTITY, 37 "GetPosition": () => new Vector3D(), 38 "GetPosition2D": () => new Vector2D(), 39 "GetRotation": () => ({ "y": 0 }), 40 "IsInWorld": () => true, 41 "GetHeightOffset": () => 0, 42 }); 43 AddMock(holder, IID_Obstruction, { 44 "GetUnitRadius": () => 0, 45 }); 46 AddMock(SYSTEM_ENTITY, IID_Timer, { 47 GetTime: () => 0, 48 SetTimeout: (ent, iid, funcname, time, data) => 0, 49 }); 50 51 for (let i = 24; i < 28; ++i) 52 { 53 AddMock(holder, IID_Health, { 54 "GetHitpoints": () => 190, 55 "GetMaxHitpoints": () => 200, 56 }); 57 AddMock(i, IID_Identity, { 58 "GetClassesList": () => "Infantry+Cavalry", 59 }); 60 AddMock(i, IID_Ownership, { 61 "GetOwner": () => 1, 62 }); 63 AddMock(i, IID_UnitAI, { 64 "SetTurretStance": () => {}, 65 "CanGarrison": () => true, 66 "IsUnderAlert": () => false, 67 "ResetTurretStance": () => {}, 68 "Ungarrison" : () => {}, 69 }); 70 AddMock(i, IID_Position, { 71 "GetHeightOffset": () => 0, 72 "GetPosition": () => new Vector3D(), 73 "GetPosition2D": () => new Vector2D(), 74 "GetRotation": () => ({ "y": 0 }), 75 "GetTurretParent": () => INVALID_ENTITY, 76 "IsInWorld": () => true, 77 "JumpTo": () => {}, 78 "MoveOutOfWorld": () => {}, 79 "SetHeightOffset":() => {}, 80 "SetTurretParent": () => {}, 81 }); 82 83 } 84 85 86 87 88 let cmpGarrisonHolder = ConstructComponent(holder, "GarrisonHolder", { 89 "Max" : 4, 90 "List": {"_string": "Infantry+Cavalry"}, 91 "EjectHealth": 0.1, 92 "EjectClassesOnDestroy": {"_string": "Infantry"}, 93 "BuffHeal": 1, 94 "LoadingRange": 2.1, 95 "Pickup": false, 96 "VisibleGarrisonPoints": { 97 "archer1": { 98 "X": 12, 99 "Y": 5, 100 "Z": 6 101 }, 102 "archer2": { 103 "X": 15, 104 "Y": 5, 105 "Z": 6 106 } 107 } 108 }); 109 110 cmpGarrisonHolder.Init(); 111 112 113 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetLoadingRange(), { "max": 2.1, "min": 0 }); 114 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetEntities(), []); 115 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetHealRate(), 1); 116 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetAllowedClasses(), classes); 117 TS_ASSERT_EQUALS(cmpGarrisonHolder.GetCapacity(), 4); 118 TS_ASSERT_EQUALS(cmpGarrisonHolder.GetGarrisonedEntitiesCount(), 0); 119 TS_ASSERT_EQUALS(cmpGarrisonHolder.CanPickup(unitToGarrisonId), false); 120 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), false); 121 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(unitToGarrisonId), true); 122 for (let entity of garrisonedEntitiesList) 123 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(entity), true); 124 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), true); 125 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetEntities(), [24,25,26,27]); 126 TS_ASSERT_EQUALS(cmpGarrisonHolder.GetGarrisonedEntitiesCount(), 4); 127 TS_ASSERT_EQUALS(cmpGarrisonHolder.Unload(25), true); 128 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetEntities(), [24,26,27]); 129 TS_ASSERT_EQUALS(cmpGarrisonHolder.GetGarrisonedEntitiesCount(), 3); 130 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), false); 131 TS_ASSERT_EQUALS(cmpGarrisonHolder.UnloadAll(), true); 132 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetEntities(), []); 133 134