Fix typo in CanTrade.

Introduced in c917c39a0d.
Reported by @gameboy at
https://wildfiregames.com/forum/topic/107586-an-error-occurred/?do=findComment&comment=553753.

Also adds a small test.

Differential revision: https://code.wildfiregames.com/D5060
Reviewed by: @wraitii
This was SVN commit r27737.
This commit is contained in:
Freagarach 2023-06-23 12:58:14 +00:00
parent 435d842bc1
commit ce25351443
2 changed files with 102 additions and 7 deletions

View File

@ -167,24 +167,23 @@ Trader.prototype.HasBothMarkets = function()
Trader.prototype.CanTrade = function(target)
{
let cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity);
let cmpTargetMarket = QueryMiragedInterface(target, IID_Market);
const cmpTargetMarket = QueryMiragedInterface(target, IID_Market);
if (!cmpTargetMarket)
return false;
let cmpTargetFoundation = Engine.QueryInterface(target, IID_Foundation);
const cmpTargetFoundation = Engine.QueryInterface(target, IID_Foundation);
if (cmpTargetFoundation)
return false;
const cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity);
if (!(cmpTraderIdentity.HasClass("Organic") && cmpTargetMarket.HasType("land")) &&
!(cmpTraderIdentity.HasClass("Ship") && cmpTargetMarket.HasType("naval")))
return false;
let cmpTraderDiplomacy = QueryOwnerInterface(this.entity, IID_Diplomacy);
let cmpTargetPlayer = QueryOwnerInterface(target, IID_Player);
const cmpTraderDiplomacy = QueryOwnerInterface(this.entity, IID_Diplomacy);
const cmpTargetPlayer = QueryOwnerInterface(target, IID_Player);
return cmpTraderPlayer && cmpTargetPlayer && !cmpTraderDiplomacy.IsEnemy(cmpTargetPlayer.GetPlayerID());
return cmpTraderDiplomacy && cmpTargetPlayer && !cmpTraderDiplomacy.IsEnemy(cmpTargetPlayer.GetPlayerID());
};
Trader.prototype.AddResources = function(ent, gain)

View File

@ -0,0 +1,96 @@
Engine.LoadComponentScript("interfaces/Diplomacy.js");
Engine.LoadComponentScript("interfaces/Foundation.js");
Engine.LoadComponentScript("interfaces/Market.js");
Engine.LoadComponentScript("interfaces/Trader.js");
Engine.LoadComponentScript("Trader.js");
Engine.LoadHelperScript("Player.js");
const player = 1;
const enemy = 2;
const ally = 3;
const trader = 5;
const ownMarket = 6;
const otherMarket = 7;
AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
"GetPlayerByID": (i) => i
});
const cmpTrader = ConstructComponent(trader, "Trader", {
"GainMultiplier": 0.8,
"GarrisonGainMultiplier": 0.2
});
AddMock(trader, IID_Identity, {
"HasClass": (cls) => cls === "Organic",
});
AddMock(ownMarket, IID_Market, {
"HasType": (t) => t === "land"
});
AddMock(trader, IID_Ownership, {
"GetOwner": () => player
});
AddMock(ownMarket, IID_Ownership, {
"GetOwner": () => player
});
AddMock(player, IID_Player, {
"GetPlayerID": () => player,
});
AddMock(player, IID_Diplomacy, {
"IsEnemy": (id) => id === enemy,
});
TS_ASSERT(cmpTrader.CanTrade(ownMarket));
// We can't trade with our enemy.
AddMock(enemy, IID_Player, {
"GetPlayerID": () => enemy,
});
AddMock(otherMarket, IID_Ownership, {
"GetOwner": () => enemy
});
AddMock(otherMarket, IID_Market, {
"HasType": (t) => t === "land"
});
TS_ASSERT(!cmpTrader.CanTrade(otherMarket));
// But can with our ally.
AddMock(ally, IID_Player, {
"GetPlayerID": () => ally,
});
AddMock(otherMarket, IID_Ownership, {
"GetOwner": () => ally
});
TS_ASSERT(cmpTrader.CanTrade(otherMarket));
// Land traders shouldn't try to trade with naval-only markets.
AddMock(trader, IID_Identity, {
"HasClass": (cls) => cls === "Organic",
});
AddMock(ownMarket, IID_Market, {
"HasType": (t) => t === "naval"
});
TS_ASSERT(!cmpTrader.CanTrade(ownMarket));
// And Ships shouldn't try to trade with land markets.
AddMock(trader, IID_Identity, {
"HasClass": (cls) => cls === "Ship",
});
AddMock(ownMarket, IID_Market, {
"HasType": (t) => t === "land"
});
TS_ASSERT(!cmpTrader.CanTrade(ownMarket));