📄 ai.htm
字号:
<a href="qc-types.htm#void">void</a>() <b>ai_stand</b><a name="ai_stand">=</a>
{
<b>if</b> (<a href="ai.htm#FindTarget">FindTarget</a> ())
<b>return</b>;
<b>if</b> (<a href="qc-glob.htm#time">time</a> > <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_pausetime">pausetime</a>)
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_walk">th_walk</a> ();
<b>return</b>;
}
<i>// change angle slightly</i>
};
<i>/*
=============
ai_turn
don't move, but turn towards ideal_yaw
=============
*/</i>
<a href="qc-types.htm#void">void</a>() <b>ai_turn</b><a name="ai_turn">=</a>
{
<b>if</b> (<a href="ai.htm#FindTarget">FindTarget</a> ())
<b>return</b>;
<a href="qc-built.htm#ChangeYaw">ChangeYaw</a> ();
};
<i>//=============================================================================</i>
<i>/*
=============
ChooseTurn
=============
*/</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#vector">vector</a> dest3) <b>ChooseTurn</b><a name="ChooseTurn">=</a>
{
<b>local</b> <a href="qc-types.htm#vector">vector</a> dir, newdir;
dir = <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_origin">origin</a> - dest3;
newdir_x = trace_plane_normal_y;
newdir_y = 0 - trace_plane_normal_x;
newdir_z = 0;
<b>if</b> (dir * newdir > 0)
{
dir_x = 0 - trace_plane_normal_y;
dir_y = trace_plane_normal_x;
}
<b>else</b>
{
dir_x = trace_plane_normal_y;
dir_y = 0 - trace_plane_normal_x;
}
dir_z = 0;
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> = <a href="qc-built.htm#vectoyaw">vectoyaw</a>(dir);
};
<i>/*
============
FacingIdeal
============
*/</i>
<a href="qc-types.htm#float">float</a>() <b>FacingIdeal</b><a name="FacingIdeal">=</a>
{
<b>local</b> <a href="qc-types.htm#float">float</a> delta;
delta = <a href="qc-built.htm#anglemod">anglemod</a>(<a href="qc-glob.htm#self">self</a>.angles_y - <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a>);
<b>if</b> (delta > 45 && delta < 315)
return FALSE;
return TRUE;
};
<i>//=============================================================================</i>
<a href="qc-types.htm#float">float</a>() <a href="wizard.htm#WizardCheckAttack">WizardCheckAttack</a>;
<a href="qc-types.htm#float">float</a>() <a href="dog.htm#DogCheckAttack">DogCheckAttack</a>;
<a href="qc-types.htm#float">float</a>() <b>CheckAnyAttack</b><a name="CheckAnyAttack">=</a>
{
<b>if</b> (!enemy_vis)
<b>return</b>;
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_army"</b>)
<b>return</b> <a href="fight.htm#SoldierCheckAttack">SoldierCheckAttack</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_ogre"</b>)
<b>return</b> <a href="fight.htm#OgreCheckAttack">OgreCheckAttack</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_shambler"</b>)
<b>return</b> <a href="fight.htm#ShamCheckAttack">ShamCheckAttack</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_demon1"</b>)
<b>return</b> <a href="demon.htm#DemonCheckAttack">DemonCheckAttack</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_dog"</b>)
<b>return</b> <a href="dog.htm#DogCheckAttack">DogCheckAttack</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_classname">classname</a> == <b>"monster_wizard"</b>)
<b>return</b> <a href="wizard.htm#WizardCheckAttack">WizardCheckAttack</a> ();
<b>return</b> <a href="fight.htm#CheckAttack">CheckAttack</a> ();
};
<i>/*
=============
ai_run_melee
Turn and close until within an angle to launch a melee attack
=============
*/</i>
<a href="qc-types.htm#void">void</a>() <b>ai_run_melee</b><a name="ai_run_melee">=</a>
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> = <a href="fight.htm#enemy_yaw">enemy_yaw</a>;
<a href="qc-built.htm#ChangeYaw">ChangeYaw</a> ();
<b>if</b> (<a href="ai.htm#FacingIdeal">FacingIdeal</a>())
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_melee">th_melee</a> ();
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_attack_state">attack_state</a> = <a href="defs.htm#AS_STRAIGHT">AS_STRAIGHT</a>;
}
};
<i>/*
=============
ai_run_missile
Turn in place until within an angle to launch a missile attack
=============
*/</i>
<a href="qc-types.htm#void">void</a>() <b>ai_run_missile</b><a name="ai_run_missile">=</a>
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> = <a href="fight.htm#enemy_yaw">enemy_yaw</a>;
<a href="qc-built.htm#ChangeYaw">ChangeYaw</a> ();
<b>if</b> (<a href="ai.htm#FacingIdeal">FacingIdeal</a>())
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_missile">th_missile</a> ();
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_attack_state">attack_state</a> = <a href="defs.htm#AS_STRAIGHT">AS_STRAIGHT</a>;
}
};
<i>/*
=============
ai_run_slide
Strafe sideways, but stay at aproximately the same range
=============
*/</i>
<a href="qc-types.htm#void">void</a>() <b>ai_run_slide</b><a name="ai_run_slide">=</a>
{
<b>local</b> <a href="qc-types.htm#float">float</a> ofs;
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> = <a href="fight.htm#enemy_yaw">enemy_yaw</a>;
<a href="qc-built.htm#ChangeYaw">ChangeYaw</a> ();
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_lefty">lefty</a>)
ofs = 90;
<b>else</b>
ofs = -90;
<b>if</b> (<a href="qc-built.htm#walkmove">walkmove</a> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> + ofs, <a href="defs.htm#movedist">movedist</a>))
<b>return</b>;
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_lefty">lefty</a> = 1 - <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_lefty">lefty</a>;
<a href="qc-built.htm#walkmove">walkmove</a> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_ideal_yaw">ideal_yaw</a> - ofs, <a href="defs.htm#movedist">movedist</a>);
};
<i>/*
=============
ai_run
The monster has an enemy it is trying to kill
=============
*/</i>
<a href="qc-types.htm#void">void</a>(<a href="qc-types.htm#float">float</a> dist) <b>ai_run</b><a name="ai_run">=</a>
{
<b>local</b> <a href="qc-types.htm#vector">vector</a> delta;
<b>local</b> <a href="qc-types.htm#float">float</a> axis;
<b>local</b> <a href="qc-types.htm#float">float</a> direct, ang_rint, ang_floor, ang_ceil;
<a href="defs.htm#movedist">movedist</a> = dist;
<i>// see if the enemy is dead</i>
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_health">health</a> <= 0)
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a> = <a href="qc-glob.htm#world">world</a>;
<i>// FIXME: look all around for other targets</i>
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_oldenemy">oldenemy</a>.<a href="qc-enty.htm#dot_health">health</a> > 0)
{
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a> = <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_oldenemy">oldenemy</a>;
<a href="ai.htm#HuntTarget">HuntTarget</a> ();
}
<b>else</b>
{
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_movetarget">movetarget</a>)
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_walk">th_walk</a> ();
<b>else</b>
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_th_stand">th_stand</a> ();
<b>return</b>;
}
}
<a href="qc-glob.htm#self">self</a>.show_hostile = <a href="qc-glob.htm#time">time</a> + 1; <i>// wake up other monsters</i>
<i>// check knowledge of enemy</i>
enemy_vis = <a href="ai.htm#visible">visible</a>(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>);
<b>if</b> (enemy_vis)
<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_search_time">search_time</a> = <a href="qc-glob.htm#time">time</a> + 5;
<i>// look for other coop players</i>
<b>if</b> (<a href="qc-glob.htm#coop">coop</a> && <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_search_time">search_time</a> < <a href="qc-glob.htm#time">time</a>)
{
<b>if</b> (<a href="ai.htm#FindTarget">FindTarget</a> ())
<b>return</b>;
}
enemy_infront = <a href="ai.htm#infront">infront</a>(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>);
enemy_range = <a href="ai.htm#range">range</a>(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>);
<a href="fight.htm#enemy_yaw">enemy_yaw</a> = <a href="qc-built.htm#vectoyaw">vectoyaw</a>(<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_enemy">enemy</a>.<a href="qc-enty.htm#dot_origin">origin</a> - <a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_origin">origin</a>);
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_attack_state">attack_state</a> == <a href="defs.htm#AS_MISSILE">AS_MISSILE</a>)
{
<i>//dprint ("ai_run_missile\n");</i>
<a href="ai.htm#ai_run_missile">ai_run_missile</a> ();
<b>return</b>;
}
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_attack_state">attack_state</a> == <a href="defs.htm#AS_MELEE">AS_MELEE</a>)
{
<i>//dprint ("ai_run_melee\n");</i>
<a href="ai.htm#ai_run_melee">ai_run_melee</a> ();
<b>return</b>;
}
<b>if</b> (<a href="ai.htm#CheckAnyAttack">CheckAnyAttack</a> ())
<b>return</b>; <i>// beginning an attack</i>
<b>if</b> (<a href="qc-glob.htm#self">self</a>.<a href="qc-enty.htm#dot_attack_state">attack_state</a> == <a href="defs.htm#AS_SLIDING">AS_SLIDING</a>)
{
<a href="ai.htm#ai_run_slide">ai_run_slide</a> ();
<b>return</b>;
}
<i>// head straight in</i>
<a href="qc-built.htm#movetogoal">movetogoal</a> (dist); <i>// done in C code...</i>
};
</pre></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -