Changeset 24960
- Timestamp:
- Feb 28, 2021, 11:02:03 AM (3 years ago)
- Location:
- ps/trunk/binaries/data/mods/public
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
ps/trunk/binaries/data/mods/public/globalscripts/Templates.js
r24494 r24960 328 328 } 329 329 330 331 332 333 334 330 335 if (template.GarrisonHolder) 331 336 { -
ps/trunk/binaries/data/mods/public/gui/common/tooltips.js
r24782 r24960 537 537 function getGarrisonTooltip(template) 538 538 { 539 if (!template.garrisonHolder) 540 return ""; 541 542 let tooltips = [ 543 sprintf(translate("%(label)s: %(garrisonLimit)s"), { 544 "label": headerFont(translate("Garrison Limit")), 545 "garrisonLimit": template.garrisonHolder.capacity 546 }) 547 ]; 548 549 if (template.garrisonHolder.buffHeal) 550 tooltips.push( 551 sprintf(translate("%(healRateLabel)s %(value)s %(health)s / %(second)s"), { 552 "healRateLabel": headerFont(translate("Heal:")), 553 "value": Math.round(template.garrisonHolder.buffHeal), 554 "health": unitFont(translate("Health")), 555 "second": unitFont(translate("second")), 539 let tooltips = []; 540 if (template.garrisonHolder) 541 { 542 tooltips.push ( 543 sprintf(translate("%(label)s: %(garrisonLimit)s"), { 544 "label": headerFont(translate("Garrison Limit")), 545 "garrisonLimit": template.garrisonHolder.capacity 556 546 }) 557 547 ); 558 548 559 return tooltips.join(commaFont(translate(", "))); 549 if (template.garrisonHolder.buffHeal) 550 tooltips.push( 551 sprintf(translate("%(healRateLabel)s %(value)s %(health)s / %(second)s"), { 552 "healRateLabel": headerFont(translate("Heal:")), 553 "value": Math.round(template.garrisonHolder.buffHeal), 554 "health": unitFont(translate("Health")), 555 "second": unitFont(translate("second")), 556 }) 557 ); 558 559 tooltips.join(commaFont(translate(", "))); 560 } 561 if (template.garrisonable) 562 { 563 let extraSize; 564 if (template.garrisonHolder) 565 extraSize = template.garrisonHolder.occupiedSlots; 566 if (template.garrisonable.size > 1 || extraSize) 567 tooltips.push ( 568 sprintf(translate("%(label)s: %(garrisonSize)s %(extraSize)s"), { 569 "label": headerFont(translate("Garrison Size")), 570 "garrisonSize": template.garrisonable.size, 571 "extraSize": extraSize ? 572 translateWithContext("nested garrison", "+ ") + extraSize : "" 573 }) 574 ); 575 } 576 577 return tooltips.join("\n"); 560 578 } 561 579 -
ps/trunk/binaries/data/mods/public/gui/session/selection_details.js
r24457 r24960 367 367 let totalCarrying = {}; 368 368 let totalLoot = {}; 369 369 370 370 371 for (let entState of entStates) … … 396 397 totalLoot[type] = (totalLoot[type] || 0) + carrying[type]; 397 398 } 399 400 401 402 403 404 398 405 } 399 406 … … 449 456 numberOfUnits.tooltip = ""; 450 457 458 459 460 461 462 463 451 464 if (Object.keys(totalCarrying).length) 452 465 numberOfUnits.tooltip = sprintf(translate("%(label)s %(details)s\n"), { -
ps/trunk/binaries/data/mods/public/gui/session/unit_actions.js
r24752 r24960 703 703 704 704 let tooltip = sprintf(translate("Current garrison: %(garrisoned)s/%(capacity)s"), { 705 "garrisoned": targetState.garrisonHolder. garrisonedEntitiesCount,705 "garrisoned": targetState.garrisonHolder., 706 706 "capacity": targetState.garrisonHolder.capacity 707 707 }); 708 708 709 let extraCount = 0;709 let extraCount = ; 710 710 if (entState.garrisonHolder) 711 extraCount += entState.garrisonHolder. garrisonedEntitiesCount;712 713 if (targetState.garrisonHolder. garrisonedEntitiesCount + extraCount >=targetState.garrisonHolder.capacity)711 extraCount += entState.garrisonHolder.; 712 713 if (targetState.garrisonHolder. targetState.garrisonHolder.capacity) 714 714 tooltip = coloredText(tooltip, "orange"); 715 715 … … 922 922 923 923 tooltip = sprintf(translate("Current garrison: %(garrisoned)s/%(capacity)s"), { 924 "garrisoned": targetState.garrisonHolder. garrisonedEntitiesCount,924 "garrisoned": targetState.garrisonHolder., 925 925 "capacity": targetState.garrisonHolder.capacity 926 926 }); 927 927 928 if (targetState.garrisonHolder. garrisonedEntitiesCount>=928 if (targetState.garrisonHolder. >= 929 929 targetState.garrisonHolder.capacity) 930 930 tooltip = coloredText(tooltip, "orange"); -
ps/trunk/binaries/data/mods/public/simulation/ai/common-api/entity.js
r24953 r24960 420 420 "garrisonMax": function() { return this.get("GarrisonHolder/Max"); }, 421 421 422 423 422 424 "garrisonEjectHealth": function() { return +this.get("GarrisonHolder/EjectHealth"); }, 423 425 … … 736 738 737 739 "garrisoned": function() { return this._entity.garrisoned; }, 738 "canGarrisonInside": function() { return this._entity.garrisoned.length < this.garrisonMax(); }, 740 741 "garrisonedSlots": function() { 742 let count = 0; 743 744 if (this._entity.garrisoned) 745 for (let ent of this._entity.garrisoned) 746 count += +this._ai._entities.get(ent).garrisonSize(); 747 748 return count; 749 }, 750 751 "canGarrisonInside": function() 752 { 753 return this.garrisonedSlots() < this.garrisonMax(); 754 }, 739 755 740 756 /** -
ps/trunk/binaries/data/mods/public/simulation/ai/petra/defenseManager.js
r24315 r24960 749 749 return false; 750 750 let minGarrison = data.min || target.garrisonMax(); 751 if (gameState.ai.HQ.garrisonManager.numberOfGarrisoned Units(target) >= minGarrison)751 if (gameState.ai.HQ.garrisonManager.numberOfGarrisonedts(target) >= minGarrison) 752 752 return false; 753 753 if (data.attacker) … … 801 801 for (let ent of units.values()) 802 802 { 803 if (garrisonManager.numberOfGarrisoned Units(target) >= minGarrison)803 if (garrisonManager.numberOfGarrisonedts(target) >= minGarrison) 804 804 break; 805 805 if (ent.getMetadata(PlayerID, "plan") !== undefined && ent.getMetadata(PlayerID, "plan") >= 0) … … 831 831 if (!MatchesClassList(unit.classes(), ent.garrisonableClasses())) 832 832 �� continue; 833 if (garrisonManager.numberOfGarrisoned Units(ent) >= ent.garrisonMax())833 if (garrisonManager.numberOfGarrisonedts(ent) >= ent.garrisonMax()) 834 834 continue; 835 835 if (ent.hitpoints() < ent.garrisonEjectHealth() * ent.maxHitpoints()) … … 867 867 if (!MatchesClassList(unit.classes(), ent.garrisonableClasses())) 868 868 continue; 869 if (garrisonManager.numberOfGarrisoned Units(ent) >= ent.garrisonMax() &&869 if (garrisonManager.numberOfGarrisonedts(ent) >= ent.garrisonMax() && 870 870 (!emergency || !ent.garrisoned().length)) 871 871 continue; … … 888 888 return true; 889 889 } 890 if (garrisonManager.numberOfGarrisoned Units(nearest) >= nearest.garrisonMax()) // make room for this ent890 if (garrisonManager.numberOfGarrisonedts(nearest) >= nearest.garrisonMax()) // make room for this ent 891 891 nearest.unload(nearest.garrisoned()[0]); 892 892 -
ps/trunk/binaries/data/mods/public/simulation/ai/petra/garrisonManager.js
r22803 r24960 180 180 list.splice(j--, 1); 181 181 } 182 if (this.numberOfGarrisoned Units(holder) === 0)182 if (this.numberOfGarrisonedts(holder) === 0) 183 183 this.holders.delete(id); 184 184 else … … 194 194 if (!ent || ent.owner() !== PlayerID) 195 195 this.decayingStructures.delete(id); 196 else if (this.numberOfGarrisoned Units(ent) < gmin)196 else if (this.numberOfGarrisonedts(ent) < gmin) 197 197 gameState.ai.HQ.defenseManager.garrisonUnitsInside(gameState, ent, { "min": gmin, "type": "decay" }); 198 198 } … … 208 208 }; 209 209 210 211 212 213 214 215 216 217 218 210 219 PETRA.GarrisonManager.prototype.allowMelee = function(holder) 211 220 { … … 219 228 PETRA.GarrisonManager.prototype.garrison = function(gameState, ent, holder, type) 220 229 { 221 if (this.numberOfGarrisoned Units(holder) >= holder.garrisonMax() || !ent.canGarrison())230 if (this.numberOfGarrisonedts(holder) >= holder.garrisonMax() || !ent.canGarrison()) 222 231 return; 223 232 -
ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js
r24669 r24960 2109 2109 // We will choose randomly ranged and melee units, except when garrisonHolder is full 2110 2110 // in which case we prefer melee units 2111 let numGarrisoned = this.garrisonManager.numberOfGarrisoned Units(nearestAnchor);2111 let numGarrisoned = this.garrisonManager.numberOfGarrisonedts(nearestAnchor); 2112 2112 if (nearestAnchor._entity.trainingQueue) 2113 2113 { -
ps/trunk/binaries/data/mods/public/simulation/components/AlertRaiser.js
r24776 r24960 64 64 let cmpGarrisonHolder = Engine.QueryInterface(ent, IID_GarrisonHolder); 65 65 if (!reserved.has(ent)) 66 reserved.set(ent, cmpGarrisonHolder.GetCapacity() - cmpGarrisonHolder. GetGarrisonedEntitiesCount());66 reserved.set(ent, cmpGarrisonHolder.GetCapacity() - cmpGarrisonHolder.()); 67 67 68 68 return cmpGarrisonHolder.IsAllowedToGarrison(unit) && reserved.get(ent); -
ps/trunk/binaries/data/mods/public/simulation/components/GarrisonHolder.js
r24957 r24960 94 94 GarrisonHolder.prototype.IsFull = function() 95 95 { 96 return this. GetGarrisonedEntitiesCount() >= this.GetCapacity();96 return this.() >= this.GetCapacity(); 97 97 }; 98 98 … … 135 135 }; 136 136 137 138 139 140 141 142 143 144 145 146 147 148 137 149 GarrisonHolder.prototype.IsAllowedToGarrison = function(entity) 138 150 { … … 143 155 return false; 144 156 145 let extraCount = 0; 146 let cmpGarrisonHolder = Engine.QueryInterface(entity, IID_GarrisonHolder); 147 if (cmpGarrisonHolder) 148 extraCount += cmpGarrisonHolder.GetGarrisonedEntitiesCount(); 149 if (this.GetGarrisonedEntitiesCount() + extraCount >= this.GetCapacity()) 157 let cmpGarrisonable = Engine.QueryInterface(entity, IID_Garrisonable); 158 if (!cmpGarrisonable || this.OccupiedSlots() + cmpGarrisonable.TotalSize() > this.GetCapacity()) 150 159 return false; 151 160 -
ps/trunk/binaries/data/mods/public/simulation/components/Garrisonable.js
r24957 r24960 1 1 function Garrisonable() {} 2 2 3 Garrisonable.prototype.Schema = "<empty/>"; 3 Garrisonable.prototype.Schema = 4 "<a:help>Controls the garrisonability of an entity.</a:help>" + 5 "<a:example>" + 6 "<Size>10</Size>" + 7 "</a:example>" + 8 "<element name='Size' a:help='Number of garrison slots the entity occupies.'>" + 9 "<data type='nonNegativeInteger'/>" + 10 "</element>"; 4 11 5 12 Garrisonable.prototype.Init = function() 6 13 { 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 7 37 }; 8 38 -
ps/trunk/binaries/data/mods/public/simulation/components/GuiInterface.js
r24502 r24960 369 369 "allowedClasses": cmpGarrisonHolder.GetAllowedClasses(), 370 370 "capacity": cmpGarrisonHolder.GetCapacity(), 371 " garrisonedEntitiesCount": cmpGarrisonHolder.GetGarrisonedEntitiesCount()371 "() 372 372 }; 373 373 … … 381 381 if (cmpGarrisonable) 382 382 ret.garrisonable = { 383 "holder": cmpGarrisonable.HolderID() 383 "holder": cmpGarrisonable.HolderID(), 384 "size": cmpGarrisonable.UnitSize() 384 385 }; 385 386 -
ps/trunk/binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js
r24957 r24960 13 13 const unitToGarrisonId = 24; 14 14 const enemyUnitId = 34; 15 15 16 const player = 1; 16 17 const friendlyPlayer = 2; … … 46 47 }); 47 48 48 for (let i = 24; i <= 3 4; ++i)49 for (let i = 24; i <= 3; ++i) 49 50 { 50 51 AddMock(i, IID_Identity, { … … 66 67 }); 67 68 68 AddMock(i, IID_Garrisonable, { 69 "Garrison": entity => true, 70 "UnGarrison": () => true 71 }); 69 if (i == largeUnitId) 70 AddMock(i, IID_Garrisonable, { 71 "UnitSize": () => 9, 72 "TotalSize": () => 9, 73 "Garrison": entity => true, 74 "UnGarrison": () => true 75 }); 76 else 77 AddMock(i, IID_Garrisonable, { 78 "UnitSize": () => 1, 79 "TotalSize": () => 1, 80 "Garrison": entity => true, 81 "UnGarrison": () => true 82 }); 72 83 73 84 AddMock(i, IID_Position, { … … 101 112 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(enemyUnitId), false); 102 113 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(unitToGarrisonId), true); 114 115 116 103 117 TS_ASSERT_EQUALS(cmpGarrisonHolder.Eject(unitToGarrisonId), true); 104 118 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(unitToGarrisonId), true); 105 119 for (let entity of garrisonedEntitiesList) 106 120 TS_ASSERT_EQUALS(cmpGarrisonHolder.Garrison(entity), true); 121 107 122 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), true); 108 123 TS_ASSERT_EQUALS(cmpGarrisonHolder.CanPickup(unitToGarrisonId), false); … … 121 136 TS_ASSERT_EQUALS(cmpGarrisonHolder.GetGarrisonedEntitiesCount(), 3); 122 137 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), false); 138 123 139 TS_ASSERT_EQUALS(cmpGarrisonHolder.UnloadAll(), true); 124 140 TS_ASSERT_UNEVAL_EQUALS(cmpGarrisonHolder.GetEntities(), []); … … 153 169 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsFull(), false); 154 170 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsAllowedToGarrison(enemyUnitId), false); 171 155 172 TS_ASSERT_EQUALS(cmpGarrisonHolder.IsAllowedToGarrison(unitToGarrisonId), true); 156 173 TS_ASSERT_EQUALS(cmpGarrisonHolder.HasEnoughHealth(), false); … … 214 231 }); 215 232 AddMock(siegeEngineId, IID_Garrisonable, { 233 234 216 235 "Garrison": entity => true, 217 236 "UnGarrison": () => true … … 235 254 }); 236 255 AddMock(cavalryId, IID_Garrisonable, { 256 257 237 258 "Garrison": entity => true, 238 259 "UnGarrison": () => true -
ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Garrisonable.js
r24957 r24960 1 1 Engine.LoadComponentScript("interfaces/Auras.js"); 2 2 Engine.LoadComponentScript("interfaces/Garrisonable.js"); 3 3 4 Engine.LoadComponentScript("interfaces/ProductionQueue.js"); 4 5 Engine.LoadComponentScript("interfaces/UnitAI.js"); 5 6 Engine.LoadComponentScript("Garrisonable.js"); 6 7 8 9 7 10 const garrisonHolderID = 1; 8 11 const garrisonableID = 2; 9 12 13 10 14 let cmpGarrisonable = ConstructComponent(garrisonableID, "Garrisonable", { 15 11 16 }); 17 18 19 20 21 22 23 24 25 26 27 12 28 13 29 TS_ASSERT(cmpGarrisonable.Garrison(garrisonHolderID)); -
ps/trunk/binaries/data/mods/public/simulation/templates/template_unit.xml
r24689 r24960 23 23 <Height>4.0</Height> 24 24 </Footprint> 25 <Garrisonable/> 25 <Garrisonable> 26 <Size>1</Size> 27 </Garrisonable> 26 28 <Guard/> 27 29 <Health>
Note:
See TracChangeset
for help on using the changeset viewer.