Index: ps/trunk/binaries/data/mods/public/simulation/components/Pack.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/Pack.js (revision 19428)
+++ ps/trunk/binaries/data/mods/public/simulation/components/Pack.js (revision 19429)
@@ -1,141 +1,142 @@
function Pack() {}
const PACKING_INTERVAL = 250;
Pack.prototype.Schema =
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"" +
"packed" +
"unpacked" +
"" +
"";
Pack.prototype.Init = function()
{
this.packed = this.template.State == "packed";
this.packing = false;
this.elapsedTime = 0;
this.timer = undefined;
};
Pack.prototype.OnDestroy = function()
{
this.CancelTimer();
};
Pack.prototype.CancelTimer = function()
{
if (this.timer)
{
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
cmpTimer.CancelTimer(this.timer);
this.timer = undefined;
}
};
Pack.prototype.IsPacked = function()
{
return this.packed;
};
Pack.prototype.IsPacking = function()
{
return this.packing;
};
Pack.prototype.Pack = function()
{
if (this.IsPacked() || this.IsPacking())
return;
this.packing = true;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.timer = cmpTimer.SetInterval(this.entity, IID_Pack, "PackProgress", 0, PACKING_INTERVAL, { "packing": true });
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("packing", true, 1.0, "packing");
};
Pack.prototype.Unpack = function()
{
if (!this.IsPacked() || this.IsPacking())
return;
this.packing = true;
let cmpTimer = Engine.QueryInterface(SYSTEM_ENTITY, IID_Timer);
this.timer = cmpTimer.SetInterval(this.entity, IID_Pack, "PackProgress", 0, PACKING_INTERVAL, { "packing": false });
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("unpacking", true, 1.0, "unpacking");
};
Pack.prototype.CancelPack = function()
{
if (!this.IsPacking())
return;
this.CancelTimer();
this.packing = false;
this.SetElapsedTime(0);
// Clear animation
let cmpVisual = Engine.QueryInterface(this.entity, IID_Visual);
if (cmpVisual)
cmpVisual.SelectAnimation("idle", false, 1.0, "");
};
Pack.prototype.GetPackTime = function()
{
let cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
return ApplyValueModificationsToEntity("Pack/Time", +this.template.Time, this.entity) *
cmpPlayer.GetCheatTimeMultiplier();
};
Pack.prototype.GetElapsedTime = function()
{
return this.elapsedTime;
};
Pack.prototype.GetProgress = function()
{
return this.elapsedTime / this.GetPackTime();
};
Pack.prototype.SetElapsedTime = function(time)
{
this.elapsedTime = time;
Engine.PostMessage(this.entity, MT_PackProgressUpdate, { "progress": this.elapsedTime });
};
Pack.prototype.PackProgress = function(data, lateness)
{
if (this.elapsedTime < this.GetPackTime())
{
this.SetElapsedTime(this.GetElapsedTime() + PACKING_INTERVAL + lateness);
return;
}
this.CancelTimer();
this.packed = !this.packed;
+ this.packing = false;
Engine.PostMessage(this.entity, MT_PackFinished, { "packed": this.packed });
let newEntity = ChangeEntityTemplate(this.entity, this.template.Entity);
if (newEntity)
PlaySound(this.packed ? "packed" : "unpacked", newEntity);
};
Engine.RegisterComponentType(IID_Pack, "Pack", Pack);
Index: ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Pack.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Pack.js (revision 19428)
+++ ps/trunk/binaries/data/mods/public/simulation/components/tests/test_Pack.js (revision 19429)
@@ -1,158 +1,158 @@
Engine.LoadHelperScript("Player.js");
Engine.LoadHelperScript("Sound.js");
Engine.LoadHelperScript("Transform.js");
Engine.LoadHelperScript("ValueModification.js");
Engine.LoadComponentScript("interfaces/TechnologyManager.js");
Engine.LoadComponentScript("interfaces/AuraManager.js");
Engine.LoadComponentScript("interfaces/Capturable.js");
Engine.LoadComponentScript("interfaces/GarrisonHolder.js");
Engine.LoadComponentScript("interfaces/Guard.js");
Engine.LoadComponentScript("interfaces/Health.js");
Engine.LoadComponentScript("interfaces/Pack.js");
Engine.LoadComponentScript("interfaces/Player.js");
Engine.LoadComponentScript("interfaces/Sound.js");
Engine.LoadComponentScript("interfaces/Timer.js");
Engine.LoadComponentScript("interfaces/UnitAI.js");
Engine.LoadComponentScript("Pack.js");
Engine.RegisterGlobal("MT_EntityRenamed", "entityRenamed");
const ent = 170;
const newEnt = 171;
const PACKING_INTERVAL = 250;
let timerActivated = false;
AddMock(ent, IID_Visual, {
"SelectAnimation": (name, once, speed, soundgroup) => name
});
AddMock(ent, IID_Ownership, {
"GetOwner": () => 1
});
AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
"GetPlayerByID": id => 11
});
AddMock(11, IID_Player, {
"GetCheatTimeMultiplier": () => 1
});
AddMock(ent, IID_Sound, {
"PlaySoundGroup": name => {}
});
AddMock(SYSTEM_ENTITY, IID_Timer, {
"CancelTimer": id => { timerActivated = false; return; },
"SetInterval": (ent, iid, funcname, time, repeattime, data) => { timerActivated = true; return 7; }
});
Engine.AddEntity = function(template) {
TS_ASSERT_EQUALS(template, "finalTemplate");
return true;
};
// Test Packing
let template = {
"Entity": "finalTemplate",
"Time": "2000",
"State": "unpacked"
};
let cmpPack = ConstructComponent(ent, "Pack", template);
// Check internals
TS_ASSERT(!cmpPack.packed);
TS_ASSERT(!cmpPack.packing);
TS_ASSERT_EQUALS(cmpPack.elapsedTime, 0);
TS_ASSERT_EQUALS(cmpPack.timer, undefined);
TS_ASSERT(!cmpPack.IsPacked());
TS_ASSERT(!cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetProgress(), 0);
// Pack
cmpPack.Pack();
TS_ASSERT_EQUALS(cmpPack.timer, 7);
TS_ASSERT(cmpPack.IsPacking());
// Listen to destroy message
cmpPack.OnDestroy();
TS_ASSERT(!cmpPack.timer);
TS_ASSERT(!timerActivated);
// Test UnPacking
template = {
"Entity": "finalTemplate",
"Time": "2000",
"State": "packed"
};
cmpPack = ConstructComponent(ent, "Pack", template);
// Check internals
TS_ASSERT(cmpPack.packed);
TS_ASSERT(!cmpPack.packing);
TS_ASSERT_EQUALS(cmpPack.elapsedTime, 0);
TS_ASSERT_EQUALS(cmpPack.timer, undefined);
TS_ASSERT(cmpPack.IsPacked());
TS_ASSERT(!cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetProgress(), 0);
// Unpack
cmpPack.Unpack();
TS_ASSERT(cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.timer, 7);
// Unpack progress
cmpPack.elapsedTime = 400;
cmpPack.PackProgress({}, 100);
TS_ASSERT(cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetElapsedTime(), 400 + 100 + PACKING_INTERVAL);
TS_ASSERT_EQUALS(cmpPack.GetProgress(), (400 + 100 + PACKING_INTERVAL) / 2000);
// Try to Pack or Unpack while packing, nothing happen
cmpPack.elapsedTime = 400;
cmpPack.Unpack();
TS_ASSERT(cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetElapsedTime(), 400);
TS_ASSERT_EQUALS(cmpPack.timer, 7);
TS_ASSERT(timerActivated);
cmpPack.Pack();
TS_ASSERT(cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetElapsedTime(), 400);
TS_ASSERT_EQUALS(cmpPack.timer, 7);
TS_ASSERT(timerActivated);
// Cancel
cmpPack.CancelPack();
TS_ASSERT(!cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetElapsedTime(), 0)
TS_ASSERT_EQUALS(cmpPack.GetProgress(), 0);
TS_ASSERT_EQUALS(cmpPack.timer, undefined);
TS_ASSERT(!timerActivated);
// Progress until completing
cmpPack.Unpack();
cmpPack.elapsedTime = 1800;
cmpPack.PackProgress({}, 100);
TS_ASSERT(cmpPack.IsPacking());
TS_ASSERT_EQUALS(cmpPack.GetElapsedTime(), 1800 + 100 + PACKING_INTERVAL);
TS_ASSERT_EQUALS(cmpPack.GetProgress(), (1800 + 100 + PACKING_INTERVAL) / 2000); // Shouldn't we cap at 1?
TS_ASSERT_EQUALS(cmpPack.timer, 7);
TS_ASSERT(timerActivated);
// Unpack completing
cmpPack.Unpack();
cmpPack.elapsedTime = 2100;
cmpPack.PackProgress({}, 100);
-TS_ASSERT(cmpPack.IsPacking()); // It should be reset? (See StatusBars)
+TS_ASSERT(!cmpPack.IsPacking());
TS_ASSERT(!cmpPack.timer);
TS_ASSERT(!timerActivated);