// PB: Capsizing -->
if(Whr_IsStorm() && IsMainCharacter(rCharacter) && CheckAttribute(rCharacter,"Capsize") && GetCharacterShipClass(rCharacter) < 8)
// Limit roll-dependent damage to larger player ships in storms only
{
int RollDamageValue;
int i;
float RollAngle = -Radian2Degree(stf(GetAttribute(rCharacter, "ship.ang.z")));
if(RollAngle < -180) RollAngle = RollAngle + 360;
LogIt("Roll Angle = " + RollAngle); // Show the roll angle
switch(sti(rCharacter.Capsize.Warning))
{
case 0: // First Warning
if(GetSeaTime() > 10 && abs(RollAngle) > 9)
{
RollDamageValue = sti(rCharacter.Ship.Crew.Morale) - 10;
LogIt("Captain, the morale of the crew decreased from " + GetMoraleName(rCharacter.Ship.Crew.Morale) + " to " + GetMoraleName(RollDamageValue) + " because the ship's rolling is making them seasick");
rCharacter.Ship.Crew.Morale = RollDamageValue; // Decrease morale one level
if (sti(rCharacter.Ship.Crew.morale)<MORALE_MIN) rCharacter.Ship.Crew.morale=MORALE_MIN;
rCharacter.Capsize.Warning = 1;
}
break;
case 1: // Second Warning
if(GetSeaTime() > 25 && abs(RollAngle) > 11)
{
// switch(rand(1))
// {
// case 0:
for(i=GOOD_GOLD;i<GOODS_QUANTITY-1;i++) // Try to dump cargo first, rather than consumables
{
if(GetCargoGoods(rCharacter, i) <= 0) continue; // Don't dump cargo that isn't in the hold
if (CheckAttribute(rCharacter, "quest.generate_trade_quest.iQuantityGoods"))
{
if ( i == sti(rCharacter.quest.generate_trade_quest.iTradeGoods) ) continue; // Don't dump quest cargo (not realistic, but less frustrating)
}
}
if(GetCargoGoods(rCharacter, i) <= 0) // If the previous loop didn't return anything
{
for(i=0;i<GOOD_GOLD;i++) // Find some consumables to dump
{
if(GetCargoGoods(rCharacter, i) <= 0) continue; // Don't dump cargo that isn't in the hold
if (CheckAttribute(rCharacter, "quest.generate_trade_quest.iQuantityGoods"))
{
if ( i == sti(rCharacter.quest.generate_trade_quest.iTradeGoods) ) continue; // Don't dump quest cargo (not realistic, but less frustrating)
}
}
}
if(GetCargoGoods(rCharacter, i) > 0)
{
RollDamageValue = 1 + makeint(0.1*GetCargoGoods(rCharacter, i));
LogIt("Captain, the cargo has started shifting due to the rolling and " + RollDamageValue + " " + Goods[i].Name + " went overboard");
RemoveCharacterGoods(rCharacter, i, RollDamageValue);
}
else // The cargo hold is empty
{
RollDamageValue = makeint(0.1*GetCrewQuantity(rCharacter));
LogIt("*" + RollDamageValue + " crewmembers are heard yelling from inside the empty cargo hold*");
RemoveCharacterCrew(rCharacter, RollDamageValue); // 10% crew damage
}
/* break;
case 1:
// Add blade damage
break;
}*/
rCharacter.Capsize.Warning = 2;
}
break;
case 2: // Third Warning
if(GetSeaTime() > 40 && abs(RollAngle) > 13)
{
switch(rand(1))
{
case 0:
RollDamageValue = makeint(0.1*sti(rCharacter.Ship.HP));
LogIt("Captain, shifting cargo did " + RollDamageValue + " damage to the hull");
Ship_ApplyHullHitpoints(rCharacter, RollDamageValue, KILL_BY_TOUCH, -1); // 10% hull damage
break;
case 1:
RollDamageValue = makeint(0.1*GetCrewQuantity(rCharacter));
LogIt("Captain, that last violent roll washed " + RollDamageValue + " crewmembers overboard");
RemoveCharacterCrew(rCharacter, RollDamageValue); // 10% crew damage
break;
}
rCharacter.Capsize.Warning = 3;
}
break;
case 3: // Fourth Warning
if(GetSeaTime() > 50 && abs(RollAngle) > 15)
{
if(RollAngle > 0) LogIt("Captain, we're capsizing to starboard... ABANDON SHIP!");
else LogIt("Captain, we're capsizing to port... ABANDON SHIP!");
rCharacter.Capsize.Angle = RollAngle;
ShipDead(sti(rCharacter.Index), KILL_BY_OWNER, sti(rCharacter.Index));
}
break;
}
}
// PB: Capsizing <--