579
edits
m (→How to install the current system on an aircraft:  Removed reference to JSB)  | 
				 (→How to install the current system on an aircraft:  version 0.13, with some improvements and bugfixes)  | 
				||
| Line 20: | Line 20: | ||
#  | #  | ||
#  | #  | ||
# Version 0.  | # 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).  | 	        	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 "~  | |||
			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  | ||
			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.  | 			me.input.wCrashOn.setBoolValue(TRUE);  | ||
			me.soundWaterTimer.restart(3);  | 			me.soundWaterTimer.restart(3);  | ||
		}  | 		}  | ||
	},  | 	},  | ||
	_impactSoundWaterEnd: func	() {  | 	_impactSoundWaterEnd: func	() {  | ||
		me.input.wCrashOn.  | 		me.input.wCrashOn.setBoolValue(FALSE);  | ||
	},  | 	},  | ||
	_impactSoundBegin: func (speed) {  | 	_impactSoundBegin: func (speed) {  | ||
		if (speed > 5) {  | 		if (speed > 5) {  | ||
			me.input.crashOn.  | 			me.input.crashOn.setBoolValue(TRUE);  | ||
			me.soundTimer.restart(3);  | 			me.soundTimer.restart(3);  | ||
		}  | 		}  | ||
	},  | 	},  | ||
	_impactSoundEnd: func () {  | 	_impactSoundEnd: func () {  | ||
		me.input.crashOn.  | 		me.input.crashOn.setBoolValue(FALSE);  | ||
	},  | 	},  | ||
	_explodeBegin: func() {  | 	_explodeBegin: func(str) {  | ||
		me.input.explodeOn.  | 		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("  | 	    me._output(str~" and exploded.", TRUE);  | ||
		me.explodeTimer.restart(3);  | 		me.explodeTimer.restart(3);  | ||
	},  | 	},  | ||
	_explodeEnd: func () {  | 	_explodeEnd: func () {  | ||
		me.input.explodeOn.  | 		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.  | 		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.  | 		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.  | 			me.input.crackOn.setBoolValue(FALSE);  | ||
			me.input.creakOn.  | 			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.  | 			#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.  | 				me.input.creakVol.setDoubleValue(tremble_max);  | ||
				me.input.creakOn.  | 				me.input.creakOn.setBoolValue(TRUE);  | ||
				if (wingload > (wingLoadLimit * 0.90)) {  | 				if (wingload > (wingLoadLimit * 0.90)) {  | ||
					me.input.crackOn.  | 					me.input.crackOn.setBoolValue(TRUE);  | ||
					me.input.crackVol.  | 					me.input.crackVol.setDoubleValue(tremble_max);  | ||
					if (wingload > wingLoadLimit) {  | 					if (wingload > wingLoadLimit) {  | ||
						me.input.crackVol.  | 						me.input.crackVol.setDoubleValue(1);  | ||
						me.input.creakVol.  | 						me.input.creakVol.setDoubleValue(1);  | ||
						#me.input.trembleMax.  | 						#me.input.trembleMax.setDoubleValue(1);  | ||
						return TRUE;  | 						return TRUE;  | ||
					}  | 					}  | ||
				} else {  | 				} else {  | ||
					me.input.crackOn.  | 					me.input.crackOn.setBoolValue(FALSE);  | ||
				}  | 				}  | ||
			} else {  | 			} else {  | ||
				me.input.creakOn.  | 				me.input.creakOn.setBoolValue(FALSE);  | ||
			}  | 			}  | ||
		} else {  | 		} else {  | ||
			me.input.crackOn.  | 			me.input.crackOn.setBoolValue(FALSE);  | ||
			me.input.creakOn.  | 			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().  | 		me.input.downFps = props.Node.new().setDoubleValue(0);  | ||
	},  | 	},  | ||
	fps2kt: func (fps) {  | 	fps2kt: func (fps) {  | ||
edits