「OnPerception」の編集履歴(バックアップ)一覧はこちら
「OnPerception」(2005/12/01 (木) 22:37:54) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
----
・ OnPerceptionに入るスクリプト。
・対象を知覚した時に発動する。(視覚&聴覚)
----
#Contents
**NWNデフォルト(翻訳付き)
#include "NW_I0_GENERIC"
#include "nw_i0_generic"
void main()
{
//AIの設定が低い場合はここでスクリプトを終了します
if (GetAILevel() == AI_LEVEL_VERY_LOW) return;
//最後に知覚した対象
//最後に視認した対象
//最後に足音を聞いた対象
object oPercep = GetLastPerceived();
int bSeen = GetLastPerceptionSeen();
int bHeard = GetLastPerceptionHeard();
// 最後に聞こえた足音が聞こえなくなった場合
if (bHeard == FALSE)
{
// 誰かが自分の目の前から消えたに違いないので、それを習得する
bHeard = GetLastPerceptionVanished();
}
// カンバセーションを喋るコンディションがオンの場合
if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION)
&& GetIsPC(oPercep)
&& bSeen)
{
//一行の台詞を喋る
SpeakOneLinerConversation();
}
// これはアカウントの離脱に反応しないように追加されました。
// 最後に目の前から消えた相手が最後に知覚した相手だった場合
if ((GetLastPerceptionVanished()) && GetIsEnemy(GetLastPerceived()))
{
object oGone = GetLastPerceived();
//殴ろうとした相手、呪文を唱えようとした相手が最後に知覚した相手か、
//最後に攻撃しようとした相手が最後に知覚した相手で、なおかつ相手がもう自分と同じエリアに居ない場合
if((GetAttemptedAttackTarget() == GetLastPerceived() ||
GetAttemptedSpellTarget() == GetLastPerceived() ||
GetAttackTarget() == GetLastPerceived()) && GetArea(GetLastPerceived()) != GetArea(OBJECT_SELF))
{
//アクション全てクリアして別の相手を攻撃する
ClearAllActions();
DetermineCombatRound();
}
}
// この部分は大きく改定されました
// 戦闘中なら戦い続ける
// そうでなければ見つけた相手と戦い始める
// 敵が消えうせた後も戦闘状態を維持する
// 戦闘をしておらず敵を知覚していないなら、
// 知覚対象がPCであるかで何を喋るべきか考える
if (GetIsInCombat(OBJECT_SELF))
{
// don't do anything else, we're busy
//MyPrintString("GetIsFighting: TRUE");
}
// 対象を視認できるなら戦います、聞き耳を当てにしないで下さい。
else if (GetIsEnemy(oPercep) && bSeen)
{ // SpawnScriptDebugger();
//MyPrintString("GetIsEnemy: TRUE");
// We spotted an enemy and we're not already fighting
//寝ていない場合は
if(!GetHasEffect(EFFECT_TYPE_SLEEP)) {
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
{
//MyPrintString("DetermineSpecialBehavior");
//草食・肉食・その他に適した行動を取ります
DetermineSpecialBehavior();
} else
{
//MyPrintString("DetermineCombatRound");
//知覚した相手の方を向かせます
SetFacingPoint(GetPosition(oPercep));
//仲間に対象を攻撃するよう喋る、戦闘行動を取る
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
DetermineCombatRound();
}
}
}
else
{
if (bSeen)
{
//MyPrintString("GetLastPerceptionSeen: TRUE");
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
DetermineSpecialBehavior();
//特別な会話コンディションが設定されている場合
} else if (GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION)
&& GetIsPC(oPercep))
{
// 視認した相手に対してカンバセーションを開始します
ActionStartConversation(OBJECT_SELF);
}
}
else
// 目に見えないクリーチャーに対する幾つかの小さな反応
if (bHeard && GetIsEnemy(oPercep))
{
// SpeakString("vanished");
// * 雑音のした場所が7m以内なら
if (GetDistanceToObject(oPercep) <= 7.0)
{
//トゥルーシーイングがあるなら唱える
// if (GetHasSpell(SPELL_TRUE_SEEING) == TRUE)
if (GetHasSpell(SPELL_TRUE_SEEING))
{
ActionCastSpellAtObject(SPELL_TRUE_SEEING, OBJECT_SELF);
}
else
// シーインビジビリティがあるなら唱える
// if (GetHasSpell(SPELL_SEE_INVISIBILITY) == TRUE)
if (GetHasSpell(SPELL_SEE_INVISIBILITY))
{
ActionCastSpellAtObject(SPELL_SEE_INVISIBILITY, OBJECT_SELF);
}
else
// インビジブルパージがあるなら唱える
// if (GetHasSpell(SPELL_INVISIBILITY_PURGE) == TRUE)
if (GetHasSpell(SPELL_INVISIBILITY_PURGE))
{
ActionCastSpellAtObject(SPELL_INVISIBILITY_PURGE, OBJECT_SELF);
}
else
{
//何も出来ないなら頭を掻いたり、探すそぶりをする
ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT, 0.5);
ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT, 0.5);
ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 0.5);
}
}
}
// コンディションがオンの場合、ウェイポイントで特定アニメーションをする
if (!IsInConversation(OBJECT_SELF)) {
if (GetIsPostOrWalking()) {
WalkWayPoints();
} else if (GetIsPC(oPercep) &&
(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)
|| GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVIAN)
|| GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS)
|| GetIsEncounterCreature()))
{
SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE);
}
}
}
// Send the user-defined event if appropriate
if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen())
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_PERCEIVE));
}
}
----
・ OnPerceptionに入るスクリプト。
・対象を知覚した時に発動する。(視覚&聴覚)
----
#Contents
**NWNデフォルト(翻訳付き)
#include "nw_i0_generic"
void main()
{
if(GetFleeToExit()) {
// 逃げる場所が設定されてるなら逃げる
ActivateFleeToExit();
} else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS)) {
// 攻撃する前に一つの警告を与えますが…完全に実装していません
SetSpawnInCondition(NW_FLAG_SET_WARNINGS, FALSE);
//Put a check in to see if this attacker was the last attacker
//Possibly change the GetNPCWarning function to make the check
} else {
object oAttacker = GetLastAttacker();
if (!GetIsObjectValid(oAttacker)) {
// 見失った相手には何もしない
} else if (!GetIsFighting(OBJECT_SELF)) {
// この場合誰とも戦っていないので、攻撃してきた相手と戦いはじめる
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
SetSummonHelpIfAttacked();
//特定のエンカウンターをオンにする
DetermineSpecialBehavior(oAttacker);
//草食、肉食、その他に相応しい行動を取る
} else if (GetArea(oAttacker) == GetArea(OBJECT_SELF)) {
SetSummonHelpIfAttacked();
//特定のエンカウンターをオンにする
DetermineCombatRound(oAttacker);
//戦闘行動を取る
}
//コンディションが設定されてるなら仲間に攻撃命令を出す
SpeakString("NW_ATTACK_MY_TARGET", TALKVOLUME_SILENT_TALK);
//自分が攻撃していることを伝える
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
}
}
if(GetSpawnInCondition(NW_FLAG_ATTACK_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_ATTACKED));
}
}