Эксперимент.
1. Бак горит, состояние 4.
2. Горящий бак успел повредить соседний бак, огонь уже пропал, состояние 3.
3. Протектор загерметизировал текущий бак.
4. Дымящийся бак стал меньше дымить, состояние 2.
5. Бак перестал дымить и теперь он течёт, состояние 1.
Позже бак перестал течь, состояние 0.
К сожалению, игре не возможно определить от чего потёк бак и протектор ремонтирует любую течь. Зато отсюда получается багофича. Скорее всего, всё топливо успеет сгореть или вытечь пока бак "ремонтируется". Т.к. нет топлива, больше шансов на прекращение пожара (в жизни). Теперь есть шанс спланировать на самолёте до своей территории.
Для теста поставил 100% воспламеняемость бака, 10% вероятность "ремонта" бака в каждом состоянии и 14% вероятность перекидывания огня. С предыдущими вариантами кода получались интересные варианты, когда один бак тух, но в последнюю секунду огонь перебрасывался на соседний бак и от него снова загорался первый бак. Иногда дымящийся бак снова вспыхивал. Надо играть с вероятностью затухания, чтобы код из базового класса вызывал снова пожар.
Случайное затухание и возгорание ещё прописано в базовых классах, но с такими настройками дымление никогда у меня ещё не пропадало.
При тестах стоит бесконечный запас топлива, иначе, пока потухнет бак и прекратится течь, топлива может уже не остаться.
Взрыв бака зарыт где-то в базовых классах, иногда бак почти сразу взрывается, а иногда можно летать несколько минут.
Код:
public void rareAction(float paramFloat, boolean paramBoolean)
{
super.rareAction(paramFloat, paramBoolean);
if(paramBoolean)
{
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] > 4 && World.Rnd().nextFloat() < 0.14F)
((FlightModelMain) (super.FM)).AS.hitTank(this, 1, 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] > 4 && World.Rnd().nextFloat() < 0.14F)
((FlightModelMain) (super.FM)).AS.hitTank(this, 0, 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] > 4 && World.Rnd().nextFloat() < 0.14F)
((FlightModelMain) (super.FM)).AS.hitTank(this, 3, 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] > 4 && World.Rnd().nextFloat() < 0.14F)
((FlightModelMain) (super.FM)).AS.hitTank(this, 2, 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] == 1 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.repairTank(0);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] == 1 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.repairTank(1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] == 1 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.repairTank(2);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] == 1 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.repairTank(3);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] == 2 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 0, ((FlightModelMain) (super.FM)).AS.astateTankStates[0] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] == 2 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 1, ((FlightModelMain) (super.FM)).AS.astateTankStates[1] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] == 2 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 2, ((FlightModelMain) (super.FM)).AS.astateTankStates[2] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] == 2 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 3, ((FlightModelMain) (super.FM)).AS.astateTankStates[3] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] == 3 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 0, ((FlightModelMain) (super.FM)).AS.astateTankStates[0] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] == 3 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 1, ((FlightModelMain) (super.FM)).AS.astateTankStates[1] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] == 3 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 2, ((FlightModelMain) (super.FM)).AS.astateTankStates[2] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] == 3 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 3, ((FlightModelMain) (super.FM)).AS.astateTankStates[3] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] == 4 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 0, ((FlightModelMain) (super.FM)).AS.astateTankStates[0] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] == 4 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 1, ((FlightModelMain) (super.FM)).AS.astateTankStates[1] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] == 4 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 2, ((FlightModelMain) (super.FM)).AS.astateTankStates[2] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] == 4 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 3, ((FlightModelMain) (super.FM)).AS.astateTankStates[3] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[0] == 5 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 0, ((FlightModelMain) (super.FM)).AS.astateTankStates[0] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[1] == 5 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 1, ((FlightModelMain) (super.FM)).AS.astateTankStates[1] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[2] == 5 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 2, ((FlightModelMain) (super.FM)).AS.astateTankStates[2] - 1);
if(((FlightModelMain) (super.FM)).AS.astateTankStates[3] == 5 && World.Rnd().nextFloat() < 0.1F)
((FlightModelMain) (super.FM)).AS.setTankState(this, 3, ((FlightModelMain) (super.FM)).AS.astateTankStates[3] - 1);