「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)); } }

表示オプション

横に並べて表示:
変化行の前後のみ表示: