TOP

 

コンパニオンの自動修理、コンパニオンの自動リチャージ、コンパニオンの自動溶岩脱出のスクリプトです。OBSE版のCSで使うことができます。

当サイトの改変アレン、改変ヴィリア等に組み込んでいるものです。大したものでは無いですが、改変転載転用自由です。

スクリプトタイプは、「Object」にしてNPCに付けてやれば動作します。

改行が視えないので、すごく解りづらいと思いますが、テキストエディタにコピペすれば見やすいかも知れません。

スクリプトのコピペの仕方が解らない場合は、覚書:MODを作ってみる でも書いたので、そちらを参考にして下さい。

 

◆ コンパニオン溶岩脱出スクリプト

ScriptName aaaNPCexitDangerousWaterScript

begin gamemode

if IsInDangerousWater == 1 && player.IsInDangerousWater == 0
MoveTo player
player.message "アレンは溶岩から脱出した。"
endif

end

たった数行ですが、これだけでコンパニオンが溶岩にダイブする危険にビクつかなくて済むかも知れません。

 

 

◆ コンパニオン自動リチャージスクリプト

ScriptName aaaNPCrechargeScript


ref tempref ;使い回しのリファレンス
ref tempref2 ;使い回しのリファレンス
short temp ;使い回しの変数
short temp1 ;使い回しの変数 チャージ加算値に使用
short temp2 ;使い回しの変数 チャージの最大値に使用
short temp3 ;使い回しの変数
short ChargeD ;チャージ用のタイマーの変数

begin gamemode ;時間が進んでいるモードで動作

set tempref to getequippedobject 16 ;装備スロット16(武器)のIDを格納
set tempref2 to tempref
;tempref2に、temprefをコピー
set temp1 to GetEquippedCurrentCharge 16
;装備スロット16(武器)のチャージを格納
set temp2 to (GetObjectCharge tempref)
;装備している武器の最大チャージを格納
set temp3 to temp2 ;(temp2 / 2)
;temp3に、temp2をコピー

;Message "GetEquippedCurrentCharge = %g GetObjectCharge = %g Magicka= %g ChargeD= %g",temp1,temp2,temp,ChargeD
;デバッグ用のメッセージ
if (tempref != 0) && temp2 > 0 && (temp1 < temp3) && (getav Magicka) > 9 && (getav Magicka) > ((GetBaseActorValue Magicka) - 10) && (getav Health) > ((GetBaseActorValue Health) / 2) && GetDead == 0
;リチャージの条件を判定

ModActorValue2 Magicka -10
;マジカを消費
set ChargeD to ChargeD + 1
;チャージ用のタイマーを加算
if IsInCombat == 1 && temp1 < (temp2 / 10)
;戦闘中かあるいはチャージが10分の1か判定(戦闘中はタイマーを無視)
set temp to temp1 + 1
;条件があっていればチャージに+1する
set ChargeD to 0
;チャージ用のタイマーをリセットする
elseif temp1 < (temp2 / 10) && ChargeD > 10
;チャージが10分の1かつ、タイマーが10カウント溜まっているか判定
set temp to temp1 + 1
set ChargeD to 0
elseif temp1 < (temp2 / 6) && ChargeD > 20
;チャージが6分の1かつ、タイマーが20カウント溜まっているか判定
set temp to temp1 + 1
set ChargeD to 0
elseif temp1 < (temp2 / 4) && ChargeD > 60
;チャージが4分の1かつ、タイマーが60カウント溜まっているか判定
set temp to temp1 + 1
set ChargeD to 0
elseif temp1 < (temp2 / 2) && ChargeD > 120
;チャージが2分の1かつ、タイマーが120カウント溜まっているか判定
set temp to temp1 + 1
set ChargeD to 0
elseif ChargeD > 180
;タイマーが180カウント溜まっていれば無条件でチャージに+1する
set temp to temp1 + 1
set ChargeD to 0
else
set temp to temp1
endif

if tempref == tempref2
SetEquippedCurrentCharge temp 16
set temp1 to GetEquippedCurrentCharge 16
;チャージを有効化
if temp1 > temp2
;チャージが最大チャージを超えていないか判定
SetEquippedCurrentCharge temp2 16
;超えているなら最大値に補正
endif
endif
endif
end

ソウルジェム方式にしなかったのは、ソウルジェムの種類があまりに多くてスクリプトが長くなってしまうのを嫌気した為です。

基本的なことですが ; を 付けた後の文章は単なるコメントと判定され読み込まれません。

 

 

◆ コンパニオン自動修理スクリプト

ScriptName aaaNPCrepairScript

ref tempref ;使い回しのリファレンス
short temp ;使い回しの変数
short temp1 ;使い回しの変数
short temp2 ;使い回しの変数
short temp3 ;使い回しの変数
short Armorerexp ;修理経験値
float saptimer ;自動補充の残り時間
short RepairLevel ;修理レベル(鍛冶スキルにプラスされるレベル)

begin gamemode ;時間が進んでいるモードで動作

if saptimer > 0
if IsInCombat == 1 && IsWeaponOut == 1 && GetDead == 0 && getdistance player < 1500
set saptimer to saptimer - getSecondsPassed
;Message "saptimer = %g Armorerexp = %g ",saptimer,Armorerexp
endif
else
set saptimer to 60 ;自動補充間隔。60分になってます。
if getItemCount RepairHammer < 10 ;ハンマーが10本以下の時だけ
AddItem RepairHammer,1 ;リペアハンマーの自動補充
endif
;AddItem LL1NPCPotionRestoreHealth,1 ;リペアハンマー以外を補充したい場合はここを有効にます。
;AddItem LL1NPCPotionRestoreMagicka,1
;AddItem LL0FoodLowerClass75,1
endif

set tempref to getequippedobject 0 ;装備スロット0(ヘルメット)のIDを格納
set temp1 to getav Armorer + RepairLevel ;修理レベルと鍛冶スキルの合計を格納
set temp2 to GetEquippedCurrentHealth 0 ;装備スロット0の現在の耐久力を格納
set temp3 to (GetObjectHealth tempref) ;装備しているヘルメットの最大耐久力を格納
;Message "getav Armorer = %g GetEquippedCurrentHealth = %g GetObjectHealth = %g ",temp1,temp2,temp3
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0 && player.IsInCombat == 0 ;ハンマーを持っているか、戦闘をしていないかなどの判定
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1) ;修理レベルが高いほど上限の大きい乱数を作る
if temp < 2 ;乱数が1か0だったら修理失敗
RemoveItem RepairHammer,1 ;修理に失敗したらハンマーを消費
;PlaySound UIArmorWeaponRepairBreak
else
if GetEnchantment tempref != 0 && temp1 < 50 ;エンチャント装備だった時にスキル50以下で結果が分岐
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3 ;回復後の耐久力が最大値を超えていないか判定
set temp2 to temp3 ;超えていた場合は、最大値とおなじ値にする
endif
SetEquippedCurrentHealth temp2 0 ;ヘルメットの現在の耐久力を回復
set Armorerexp to Armorerexp + 1 ;経験値+1
PlaySound UIArmorWeaponRepair ;修理のサウンドを出す
endif
endif
set tempref to getequippedobject 1 ;以降は別のスロットも同じ事の繰り返し
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 1
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 1
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 2
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 2
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 2
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 3
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 3
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 3
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 4
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 4
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 4
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 5
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 5
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 5
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 13
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 13
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 13
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 18
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 18
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && IsArmor tempref == 1 && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 18
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif
set tempref to getequippedobject 16
set temp1 to getav Armorer + RepairLevel
set temp2 to GetEquippedCurrentHealth 16
set temp3 to (GetObjectHealth tempref)
if (tempref != 0) && (temp2 < temp3) && getItemCount RepairHammer > 0 && IsInCombat == 0 && IsWeaponOut == 0 && GetDead == 0 && player.IsInCombat == 0
set temp to (temp1 / 3) +2
set temp to (rand 1 temp1)
if temp < 2
RemoveItem RepairHammer,1
else
if GetEnchantment tempref != 0 && temp1 < 50
set temp2 to temp2 + (temp1 / 4)+1
else
set temp2 to temp2 + (temp1 / 2)+1
endif
if temp2 > temp3
set temp2 to temp3
endif
SetEquippedCurrentHealth temp2 16
set Armorerexp to Armorerexp + 1
PlaySound UIArmorWeaponRepair
endif
endif

set temp1 to getav Armorer + RepairLevel

if Armorerexp > 100 && temp1 < 10
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif Armorerexp > 200 && temp1 < 20 ;修理レベルと鍛冶スキルの合計が20以下の時は経験値200ポイントで修理レベルアップ
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif Armorerexp > 1000 && temp1 < 30
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif Armorerexp > 3000 && temp1 < 50
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif Armorerexp > 6000 && temp1 < 80
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif Armorerexp > 10000 && temp1 < 100
set Armorerexp to 0
set RepairLevel to RepairLevel + 1
set temp1 to getav Armorer + RepairLevel
Message "アレンの修理スキルは %g に上達しました。 ",temp1
elseif temp1 >= 100
set Armorerexp to 0
endif

end

数値を変えればバランス調整もできるでしょう。エンチャント装備かどうかの判定もしているので、プレイヤーと同じくスキル50以下では修理できないようにも改変できそうです。

 

詳しくは説明しませんが、これらのスクリプトを合併する事もできます。

 

 

 

TOP