Not sure if there is anything in it that fundamentally won't work in STUB.
Code: Select all
FUNCTION UnitChangeSides(me, newTeam)
{
int side;
int enemy_side;
int id;
int x;
int y;
int men;
int baseMen;
int unitSize;
int baseUnitSize;
int experience;
int baseExperience;
int elan;
int baseElan;
int moraleState;
int team;
int originalTeam;
int general;
int generalNomen;
int generalType;
int generalQuality;
int unitIndex;
int facing;
int i;
int total;
int textureIndex;
int EditorData[4];
side = GetUnitSide(me);
enemy_side = side + 1;
enemy_side = enemy_side % 2;
x = GetUnitX(me);
y = GetUnitY(me);
facing = GetUnitFacing(me);
// Record unit data
men = GetAttrib(me, "TotalMen");
baseMen = GetBaseAttrib(me, "TotalMen");
unitSize = GetAttrib(me, "UnitSize");
baseUnitSize = GetBaseAttrib(me, "UnitSize");
experience = GetAttrib(me, "Experience");
baseExperience = GetBaseAttrib(me, "Experience");
elan = GetAttrib(me, "Elan");
baseElan = GetBaseAttrib(me, "Elan");
moraleState = GetAttrib(me, "MoraleState");
for (i = 0; i < 4; i++)
{
EditorData[i] = GetEditorData(me, i);
}
general = GetAttrib(me, "General");
generalNomen = GetAttrib(me, "GeneralNomen");
generalType = GetAttrib(me, "GeneralType");
generalQuality = GetAttrib(me, "GeneralQuality");
if (gCampGame == 2)
{
unitIndex = GetAttrib(me, "CampaignUnitIndex");
}
textureIndex = GetAttrib(me, "TextureIndex");
GetUnitTypeString(GetUnitTypeIndex(me));
Log("me, men", me, men);
// Remove from Close Combat if any.
if (IsInCloseCombat(me) == 1)
{
RemoveAllCloseCombats(me);
}
// Delete the original version of the unit
// Remove the original version of the unit. (Don't delete it or that will mess up references for other units already in close combat).
// Note that this means that these units subsequently count as part of the original strength of both armies for % routed purposes.
RemoveUnit(me, 1);
// Add the new version
id = AddUnit(x, y, enemy_side, GetWorkString(), 1);
if (id != -1)
{
SetUnitFacing(id, facing);
AddVizUnitFormationNoWait(id); // Works in both primary directions without any jostling if unit is full strength. If other directions or below full strength, some milling about occurs.
men *= GetBaseAttrib(id, "TotalMen");
men /= baseMen;
SetAttrib(id, "TotalMen", men);
SetAttrib(id, "DisplayTotalMen", men);
unitSize *= GetBaseAttrib(id, "UnitSize");
unitSize /= baseUnitSize;
SetAttrib(id, "UnitSize", unitSize);
experience *= GetBaseAttrib(id, "Experience");
experience /= baseExperience;
SetAttrib(id, "Experience", experience); // Needs to be modified so that average English knights can become Superior when dismounted.
elan *= GetBaseAttrib(id, "Experience");
elan /= baseElan;
SetAttrib(id, "Elan", elan); // Needs to be modified so that average English knights can become Superior when dismounted.
SetAttrib(id, "MoraleState", moraleState);
SetAttrib(id, "DisplayMoraleState", moraleState);
SetUnitTeam(id, newTeam);
SetAttrib(id, "OriginalTeam", newTeam);
SetAttrib(id, "General", general);
UpdateDisplayGeneral(id, GetAttrib(id, "General"));
SetAttrib(id, "GeneralNomen", generalNomen);
SetAttrib(id, "GeneralType", generalType);
SetAttrib(id, "GeneralQuality", generalQuality);
for (i = 0; i < 4; i++)
{
SetEditorData(id, i, EditorData[i])
}
if (generalType == 1) // C-in-C will be killed by traitors
{
AddVizFunctionCall("PlayUISFX", 525, 0); // General lost
AddVizUnitText(id, "IDS_GENERAL_FALLEN", "ffffff", 0);
SetAttrib(id, "General", -1);
UpdateDisplayGeneral(id, -1);
}
if (gCampGame == 2)
{
SetAttrib(id, "CampaignUnitIndex", unitIndex);
}
// Restore original texture
ReSkinUnit(id, textureIndex);
CustomiseUnitManCount(id);
}
SetCurrentSelectedUnit(id);
SetUnitStatusFlag(id);
ResetMovedLastFlags(side);
SetCommandRangeFlags(id);
}