「OnDamaged」の編集履歴(バックアップ)一覧はこちら
「OnDamaged」(2005/12/01 (木) 21:46:28) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
----
・OnDamagedに入るスクリプト。
・ダメージを受けた時に発動する。
----
#Contents
**NWNデフォルト(翻訳付き)
#include "nw_i0_generic"
void main()
{
if(GetFleeToExit()) {
// 逃走可能であるか調べます。
} else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
// (NW_FLAG_SET_WARNINGS)がオンになっていた場合何もしません
} else {
object oDamager = GetLastDamager();
// 最後にダメージを受けたクリーチャーをoDamagerとして習得します
if (!GetIsObjectValid(oDamager)) {
// 自分にダメージを与えた相手を確認できない場合。
} else if (!GetIsFighting(OBJECT_SELF)) {
// 自分が誰とも戦って無い場合は~
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
DetermineSpecialBehavior(oDamager);
//草食・肉食・その他に適した行動を取る
} else {
if(!GetObjectSeen(oDamager)
&& GetArea(OBJECT_SELF) == GetArea(oDamager)) {
// 対象が見えない場合も攻撃者が元居た位置まで移動して、
// その後で改めて攻撃しようとする
ActionMoveToLocation(GetLocation(oDamager), TRUE);
ActionDoCommand(DetermineCombatRound());
} else {
// 敵がモロ見えの場合は攻撃する
DetermineCombatRound();
}
}
} else {
// ここからは既に戦っている場合~
// より強力な敵に攻撃されたら切り替わると考えて下さい。
object oTarget = GetAttackTarget();
// 自分が攻撃している相手を習得します
if (!GetIsObjectValid(oTarget))
oTarget = GetAttemptedAttackTarget();
//それが駄目なら過去に攻撃した相手
if (!GetIsObjectValid(oTarget))
oTarget = GetAttemptedSpellTarget();
//それも駄目なら過去に呪文を唱えた相手を習得
// 一撃で自分のHPの25%を奪った相手
// または今攻撃している相手よりHDが2高い相手に狙いを変えます
if (!GetIsObjectValid(oTarget)
|| (
oTarget != oDamager
&& (
GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
|| (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
)
)
)
{
// Switch targets
DetermineCombatRound(oDamager);
}
}
}
// Send the user-defined event signal
if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));
}
}
----
・OnDamagedに入るスクリプト。
・ダメージを受けた時に発動する。
----
#Contents
**NWNデフォルト(翻訳付き)
#include "nw_i0_generic"
void main()
{
if(GetFleeToExit()) {
// 逃走可能であるか調べます。
} else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
// (NW_FLAG_SET_WARNINGS)がオンになっていた場合何もしません
} else {
object oDamager = GetLastDamager();
// 最後にダメージを受けたクリーチャーをoDamagerとして習得します
if (!GetIsObjectValid(oDamager)) {
// 自分にダメージを与えた相手を確認できない場合。
} else if (!GetIsFighting(OBJECT_SELF)) {
// 自分が誰とも戦って無い場合は~
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
DetermineSpecialBehavior(oDamager);
//草食・肉食・その他に適した行動を取る
} else {
if(!GetObjectSeen(oDamager)
&& GetArea(OBJECT_SELF) == GetArea(oDamager)) {
// 対象が見えない場合も攻撃者が元居た位置まで移動して、
// その後で改めて攻撃しようとする
ActionMoveToLocation(GetLocation(oDamager), TRUE);
ActionDoCommand(DetermineCombatRound());
} else {
// 敵がモロ見えの場合は攻撃する
DetermineCombatRound();
}
}
} else {
// ここからは既に戦っている場合~
// より強力な敵に攻撃されたら切り替わると考えて下さい。
object oTarget = GetAttackTarget();
// 自分が攻撃している相手を習得します
if (!GetIsObjectValid(oTarget))
oTarget = GetAttemptedAttackTarget();
//それが駄目なら過去に攻撃した相手
if (!GetIsObjectValid(oTarget))
oTarget = GetAttemptedSpellTarget();
//それも駄目なら過去に呪文を唱えた相手を習得
// 一撃で自分のHPの25%を奪った相手
// または今攻撃している相手よりHDが2高い相手に狙いを変えます
if (!GetIsObjectValid(oTarget)
|| (
oTarget != oDamager
&& (
GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4)
|| (GetHitDice(oDamager) - 2) > GetHitDice(oTarget)
)
)
)
{
// Switch targets
DetermineCombatRound(oDamager);
}
}
}
// Send the user-defined event signal
if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));
}
}