T2-ACCM/Scripts/ModScripts/AI/S11AI.cs
2013-02-01 15:45:22 -05:00

283 lines
8.5 KiB
C#

$S11manuverforce = 75;
$S11flyforce = 350;
$S11forwardspeed = 120;
$S11hoverheight = 3;
$S11hoverforce = 100;
$S11reconheight = "450 550";
$S11reconradius = 700;
$S11[move] = "TAKEOFF MOVE LAND IDLE";
$S11[guard] = "TAKEOFF RECON";
$S11[attack] = "TAKEOFF MOE FIRE MOVE LAND IDLE";
$S11[rearm] = "TAKEOFF MOVE LAND REARM TAKEOFF MOVE LAND IDLE";
function S11Think(%obj){
if(!isObject(%obj))
return;
if(%obj.tasks !$= ""){
%task = getWord(%obj.tasks,0);
%fun = "S11"@%task;
%obj.mode = %task;
if(%obj.specvar[%task] !$= "")
schedule(10, 0, %fun, %obj, %obj.specvar[%task]);
else
schedule(10, 0, %fun, %obj);
}
else{
%obj.mode = "IDLE";
S11IDLE(%obj);
}
}
function S11IDLE(%obj){
if(!isObject(%obj))
return;
if(%obj.mode !$= "IDLE")
return;
%pos = %obj.getPosition();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,vectorScale("0 0 -1",$S11hoverheight));
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
if(%searchresult){
%obj.applyImpulse(%pos,vectorScale("0 0 1",$S11hoverforce));
}
schedule(100, 0, "S11IDLE", %obj);
}
function S11TAKEOFF(%obj){
if(!isObject(%obj))
return;
if(%obj.mode !$= "TAKEOFF")
return;
%pos = %obj.getPosition();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,"0 0 -20");
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
if(%searchresult)
%obj.applyImpulse(%pos,"0 0 200");
else{
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
schedule(100, 0, "S11TAKEOFF", %obj);
}
function S11LAND(%obj){
if(!isObject(%obj))
return;
if(%obj.mode !$= "LAND")
return;
%pos = %obj.getPosition();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,"0 0" SPC (-10 - $S11hoverheight));
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
if(%searchresult){
%dist = vectorDist(%pos,posfromraycast(%searchresult));
if(%dist <= $S11hoverheight){
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%speed = vectorScale("0 0 -1",%dist);
%obj.setVelocity(%speed);
}
else{
%vel = %obj.getVelocity();
%reqvel = "0 0 -15";
%impvec = vectorScale(vectorSub(%reqvel,%vel),%obj.getDatablock().mass);
%obj.applyImpulse(%pos,%impvec);
}
schedule(100, 0, "S11LAND", %obj);
}
function S11MOVE(%obj, %movepos){
if(!isObject(%obj))
return;
if(%obj.mode !$= "MOVE")
return;
%pos = %obj.getPosition();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,"0 0 -150");
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
%vec = "0 0 0";
%frd = %obj.getForwardVector();
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
%vec = vectorScale(%frd,$S11flyforce);
if(%searchresult)
%vec = vectorAdd(%vec,"0 0 150");
%tstpos = getWords(%movepos,0,1) SPC getWord(%pos,2);
%dist = vectorDist(%tstpos,%pos);
if(%dist > 10){
%aimvec = vectorSub(%tstpos,%pos);
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
%obj.applyImpulse(vectorAdd(%pos,%frd),vectorScale(%tvec,$S11manuverforce));
}
else{
if(%obj.specvar["MOVE",2] !$= ""){
%obj.specvar["MOVE"] = %obj.specvar["MOVE",2];
%obj.specvar["MOVE",2] = "";
}
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%obj.applyImpulse(%pos,%vec);
schedule(100, 0, "S11MOVE",%obj,%movepos);
}
function S11RECON(%obj,%reconPos){
if(!isObject(%obj))
return;
if(%obj.mode !$= "RECON")
return;
%pos = %obj.getPosition();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,"0 0 -1000");
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
if(%searchresult){
%frd = %obj.getForwardVector();
%vec = "0 0 0";
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
%vec = vectorScale(%frd,$S11flyforce);
%dist = vectorDist(%pos,posfromraycast(%searchresult));
if(%dist < getWord($S11reconheight,0))
%vec = vectorAdd(%vec,"0 0 450");
if(%dist > getWord($S11reconheight,1))
%vec = vectorAdd(%vec,"0 0 -450");
%tstpos = getWords(%reconPos,0,1) SPC getWord(%pos,2);
%dist = vectorDist(%tstpos,%pos);
if(%dist > $S11reconradius){
%aimvec = vectorSub(%tstpos,%pos);
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
%obj.applyImpulse(vectorAdd(%pos,%frd),vectorScale(%tvec,$S11manuverforce));
}
%obj.applyImpulse(%pos,%vec);
}
else{
%vel = %obj.getVelocity();
%reqvel = "0 0 -50";
%impvec = vectorScale(vectorSub(%reqvel,%vel),%obj.getDatablock().mass);
%obj.applyImpulse(%pos,%impvec);
}
schedule(100, 0, "S11RECON",%obj,%reconpos);
}
function S11MOE(%obj,%target){
if(!isObject(%obj))
return;
if(%obj.mode !$= "MOE")
return;
if(!isObject(%target)){
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%pos = %obj.getPosition();
%frd = %obj.getForwardVector();
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
%vector = vectorAdd(%pos,vectorScale(%frd,100));
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
if(!%searchResult){
%tstvec = vectorAdd(%vector,"0 0 -50");
%searchResult2 = containerRayCast(%vector, %tstvec, %mask, %obj);
if(%searchResult2)
%dir = "1";
else
%dir = "-1";
}
else
%dir = "2";
%impvec = vectorScale(%obj.getUpVector(),$S11manuverforce * %dir);
%Tpos = %target.getPosition();
%tstpos = getWords(%TPos,0,1) SPC getWord(%pos,2);
%aimvec = VectorNormalize(vectorSub(%tstpos,%pos));
%dist = vectorDist(%frd,%aimvec);
if(%dist > 0.1){
%aimvec = vectorSub(%tstpos,%pos);
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
%impvec = vectorAdd(%impvec,vectorScale(%tvec,$S11manuverforce));
}
if(vectorDist(%pos, %Tpos) < 500){
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%obj.applyImpulse(vectorAdd(%pos,%frd),%impvec);
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
%obj.applyImpulse(%pos,vectorScale(%obj.getForwardVector(),$S11flyforce));
schedule(100, 0, "S11MOE", %obj,%target);
}
function S11REARM(%obj){
if(!isObject(%obj))
return;
if(%obj.mode !$= "REARM")
return;
%obj.setVelocity("0 0 0");
if (%obj.turret.inv[AALauncherAmmo] < 1)
%obj.turret.setInventory(AALauncherAmmo, 1);
else if(%DamageLevel > 0)
%obj.setRepairRate(0.01);
else {
%obj.setRepairRate(0);
S11Think(%obj);
return;
}
schedule(100, 0, "S11REARM", %obj, %target);
}
function S11FIRE(%obj,%target){
if(!isObject(%obj))
return;
if(%obj.mode !$= "FIRE")
return;
if(!isObject(%target)){
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%turret = %obj.turret;
if(%turret.inv[AALauncherAmmo] >= 1){
%turret.target = %target;
if(%obj.aiming != 1){
%obj.aiming = 1;
%turret.setTargetObject(%target);
%turret.aquireTime = getSimTime();
%turret.setImageTrigger(2,true);
}
else if(isObject(%turret.TLB)){
%turret.setImageTrigger(3,true);
}
}
else{
%obj.aiming = 0;
%turret.setImageTrigger(2,false);
%turret.setImageTrigger(3,false);
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
S11Think(%obj);
return;
}
%frd = %obj.getForwardVector();
%impvec = vectorAdd(vectorScale(%frd,$S11flyforce),"0 0 150");
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
%obj.applyImpulse(%obj.getPosition(),%impvec);
schedule(100, 0, "S11FIRE", %obj, %target);
}