Crash and stress damage system: Difference between revisions

Jump to navigation Jump to search
→‎How to install the current system on an aircraft: version 0.13, with some improvements and bugfixes
(→‎How to install the current system on an aircraft: version 0.13, with some improvements and bugfixes)
Line 20: Line 20:
#
#
#
#
# Version 0.12
# Version 0.13
#
#
# License:
# License:
Line 84: Line 84:
detachOn:  "damage/sounds/detach-on",
detachOn:  "damage/sounds/detach-on",
explodeOn:  "damage/sounds/explode-on",
explodeOn:  "damage/sounds/explode-on",
simCrashed: "sim/crashed",
wildfire:  "environment/wildfire/fire-on-crash",
};
};
foreach(var ident; keys(m.input)) {
foreach(var ident; keys(m.input)) {
Line 105: Line 107:
m.lastMessageTime = 0;
m.lastMessageTime = 0;


 
m._initProperties();
m._identifyGears(gears);
m._identifyGears(gears);
m.setStressLimit(stressLimit);
m.setStressLimit(stressLimit);
Line 147: Line 149:
            props.globals.initNode(prop, TRUE, "BOOL");
            props.globals.initNode(prop, TRUE, "BOOL");
        } else {
        } else {
        props.globals.getNode(prop).setValue(TRUE);#in case this gets initialized empty from a recorder signal or MP alias.
        props.globals.getNode(prop).setBoolValue(TRUE);#in case this gets initialized empty from a recorder signal or MP alias.
        }
        }


Line 205: Line 207:
me.lastMessageTime = 0;
me.lastMessageTime = 0;
me.repairing = TRUE;
me.repairing = TRUE;
me.input.simCrashed.setBoolValue(FALSE);
me.repairTimer.restart(10.0);
me.repairTimer.restart(10.0);
},
},
_finishRepair: func () {
_finishRepair: func () {
me.repairing = FALSE;
me.repairing = FALSE;
},
_initProperties: func () {
me.input.crackOn.setBoolValue(FALSE);
me.input.creakOn.setBoolValue(FALSE);
me.input.crackVol.setDoubleValue(0.0);
me.input.creakVol.setDoubleValue(0.0);
me.input.wCrashOn.setBoolValue(FALSE);
me.input.crashOn.setBoolValue(FALSE);
me.input.detachOn.setBoolValue(FALSE);
me.input.explodeOn.setBoolValue(FALSE);
},
},
_identifyGears: func (gears) {
_identifyGears: func (gears) {
Line 284: Line 296:
    var probability = speed / 200.0;# 200kt will fail everything, 0kt will fail nothing.
    var probability = speed / 200.0;# 200kt will fail everything, 0kt will fail nothing.


    var hitStr = "something";
    if(info != nil and info[1] != nil) {
    hitStr = info[1].names == nil?"something":info[1].names[0];
    foreach(infoStr; info[1].names) {
    if(find('_', infoStr) == -1) {
    hitStr = infoStr;
    break;
    }
    }
}
    # test for explosion
    # test for explosion
    if(probability > 1.0 and me.fdm.input.fuel.getValue() > 2500) {
    if(probability > 1.0 and me.fdm.input.fuel.getValue() > 2500) {
    # 200kt+ and fuel in tanks will explode the aircraft on impact.
    # 200kt+ and fuel in tanks will explode the aircraft on impact.
    me._explodeBegin();
    me.input.simCrashed.setBoolValue(TRUE);
    me._explodeBegin("Aircraft hit "~hitStr~".");
    return;
    return;
    }
    }
Line 296: Line 319:
      }
      }
    }
    }
var str = "Aircraft hit "~info[1].names[size(info[1].names)-1]~".";
 
var str = "Aircraft hit "~hitStr~".";
me._output(str);
me._output(str);
} elsif (solid == TRUE) {
} elsif (solid == TRUE) {
var pos= geo.Coord.new().set_latlon(lat, lon);
# The aircraft is burning and will ignite the ground
wildfire.ignite(pos, 1);
if(me.input.wildfire.getValue() == TRUE) {
var pos= geo.Coord.new().set_latlon(lat, lon);
wildfire.ignite(pos, 1);
}
}
}
if(solid == TRUE) {
if(solid == TRUE) {
Line 310: Line 337:
_impactSoundWaterBegin: func (speed) {
_impactSoundWaterBegin: func (speed) {
if (speed > 5) {#check if sound already running?
if (speed > 5) {#check if sound already running?
me.input.wCrashOn.setValue(1);
me.input.wCrashOn.setBoolValue(TRUE);
me.soundWaterTimer.restart(3);
me.soundWaterTimer.restart(3);
}
}
},
},
_impactSoundWaterEnd: func () {
_impactSoundWaterEnd: func () {
me.input.wCrashOn.setValue(0);
me.input.wCrashOn.setBoolValue(FALSE);
},
},
_impactSoundBegin: func (speed) {
_impactSoundBegin: func (speed) {
if (speed > 5) {
if (speed > 5) {
me.input.crashOn.setValue(1);
me.input.crashOn.setBoolValue(TRUE);
me.soundTimer.restart(3);
me.soundTimer.restart(3);
}
}
},
},
_impactSoundEnd: func () {
_impactSoundEnd: func () {
me.input.crashOn.setValue(0);
me.input.crashOn.setBoolValue(FALSE);
},
},
_explodeBegin: func() {
_explodeBegin: func(str) {
me.input.explodeOn.setValue(1);
me.input.explodeOn.setBoolValue(TRUE);
me.exploded = TRUE;
me.exploded = TRUE;
var failure_modes = FailureMgr._failmgr.failure_modes;
var failure_modes = FailureMgr._failmgr.failure_modes;
Line 336: Line 363:
    }
    }


    me._output("Aircraft exploded.", TRUE);
    me._output(str~" and exploded.", TRUE);
me.explodeTimer.restart(3);
me.explodeTimer.restart(3);
},
},
_explodeEnd: func () {
_explodeEnd: func () {
me.input.explodeOn.setValue(0);
me.input.explodeOn.setBoolValue(FALSE);
},
},
_stressDamage: func (str) {
_stressDamage: func (str) {
me._output("Aircraft damaged: Wings broke off, due to "~str~" G forces.");
me._output("Aircraft damaged: Wings broke off, due to "~str~" G forces.");
me.input.detachOn.setValue(1);
me.input.detachOn.setBoolValue(TRUE);
   FailureMgr.set_failure_level(me.fdm.wingsFailureID, 1);
   FailureMgr.set_failure_level(me.fdm.wingsFailureID, 1);
Line 354: Line 381:
},
},
_stressDamageEnd: func () {
_stressDamageEnd: func () {
me.input.detachOn.setValue(0);
me.input.detachOn.setBoolValue(FALSE);
},
},
_output: func (str, override = FALSE) {
_output: func (str, override = FALSE) {
Line 373: Line 400:
var lon = me.input.lon.getValue();
var lon = me.input.lon.getValue();
var info = geodinfo(lat, lon);
var info = geodinfo(lat, lon);
var solid = info[1] == nil?TRUE:info[1].solid;
var solid = info==nil?TRUE:(info[1] == nil?TRUE:info[1].solid);
if(solid == FALSE) {
if(solid == FALSE) {
me._impactDamage();
me._impactDamage();
Line 399: Line 426:
}
}
} else {
} else {
me.input.crackOn.setValue(0);
me.input.crackOn.setBoolValue(FALSE);
me.input.creakOn.setValue(0);
me.input.creakOn.setBoolValue(FALSE);
#me.input.trembleOn.setValue(0);
#me.input.trembleOn.setValue(0);
}
}
Line 408: Line 435:
#me.input.trembleOn.setValue(1);
#me.input.trembleOn.setValue(1);
var tremble_max = math.sqrt((wingload - (wingLoadLimit * 0.5)) / (wingLoadLimit * 0.5));
var tremble_max = math.sqrt((wingload - (wingLoadLimit * 0.5)) / (wingLoadLimit * 0.5));
#me.input.trembleMax.setValue(1);
#me.input.trembleMax.setDoubleValue(1);


if (wingload > (wingLoadLimit * 0.75)) {
if (wingload > (wingLoadLimit * 0.75)) {


#tremble_max = math.sqrt((wingload - (wingLoadLimit * 0.5)) / (wingLoadLimit * 0.5));
#tremble_max = math.sqrt((wingload - (wingLoadLimit * 0.5)) / (wingLoadLimit * 0.5));
me.input.creakVol.setValue(tremble_max);
me.input.creakVol.setDoubleValue(tremble_max);
me.input.creakOn.setValue(1);
me.input.creakOn.setBoolValue(TRUE);


if (wingload > (wingLoadLimit * 0.90)) {
if (wingload > (wingLoadLimit * 0.90)) {
me.input.crackOn.setValue(1);
me.input.crackOn.setBoolValue(TRUE);
me.input.crackVol.setValue(tremble_max);
me.input.crackVol.setDoubleValue(tremble_max);
if (wingload > wingLoadLimit) {
if (wingload > wingLoadLimit) {
me.input.crackVol.setValue(1);
me.input.crackVol.setDoubleValue(1);
me.input.creakVol.setValue(1);
me.input.creakVol.setDoubleValue(1);
#me.input.trembleMax.setValue(1);
#me.input.trembleMax.setDoubleValue(1);
return TRUE;
return TRUE;
}
}
} else {
} else {
me.input.crackOn.setValue(0);
me.input.crackOn.setBoolValue(FALSE);
}
}
} else {
} else {
me.input.creakOn.setValue(0);
me.input.creakOn.setBoolValue(FALSE);
}
}
} else {
} else {
me.input.crackOn.setValue(0);
me.input.crackOn.setBoolValue(FALSE);
me.input.creakOn.setValue(0);
me.input.creakOn.setBoolValue(FALSE);
#me.input.trembleOn.setValue(0);
#me.input.trembleOn.setValue(0);
}
}
Line 492: Line 519:
convert: func () {
convert: func () {
call(fdmProperties.convert, [], me);
call(fdmProperties.convert, [], me);
me.input.downFps = props.Node.new().setValue(0);
me.input.downFps = props.Node.new().setDoubleValue(0);
},
},
fps2kt: func (fps) {
fps2kt: func (fps) {
574

edits

Navigation menu