返信先: Arma3 スクリプト公開スレ

ホーム フォーラム TRI Gaming フォーラム Arma3 スクリプト公開スレ 返信先: Arma3 スクリプト公開スレ

#116726
Stealer
メンバー

ようやくA3をプレイできそうなので、手始めにスクリプトをいくつかA3用に書き直しました。
公開するスクリプトのサンプルファイルは補足がない限り、バニラ及びDedicatedサーバ下のMPでも動作する前提で作っています。

Battle Damage Assessment(戦闘損害評価)スクリプト
こんな感じ v0.2
その昔、某氏の要望で作ったもの。
ミッション終了時、戦闘のハイライトとなった場所を中心にカメラが回転し、
開始時の自軍のユニット数からの単純な差し引きで損害(死傷者)を計上・表示し、その率によってSSSからF-までの18段階で戦闘指揮の評価をするスクリプトです。
現verでは自陣営の損害を計上するのみですが、これをたたき台に要望によって表示項目を増やしていきます。AARにどうぞ。
https://www.dropbox.com/s/12cor1vf8pykz44/BDA_Sample_A3.Stratis.7z?dl=0

使い方:

①mission.sqmと同階層に BDA_A3 フォルダを置く

②init.sqfにコマンドを記入:
 ["評価したい陣営"] execVM "BDA\BDA_main.sqf";
 
 評価したい陣営 には陣営の頭文字を大文字で入れます。
 W:West (BLUFOR)
 E:East (OPFOR)
 I:Resistance (Independent)
 C:Civilian (Civilian)
 
 例) ["W"] execVM "BDA\BDA_main.sqf"
 
 また、BDA起動時のBGMはデフォルトの曲ですが、カスタムBGMを使用したい場合、
 オプションパラメータとしてクラス名(descrption.extにてCfgMusicで定義したもの)を記入すれば変更可能です:
 [“評価したい陣営”,”BGMのクラス名”] execVM “BDA\BDA_main.sqf”
 
 例) ["W","customBGM"] execVM "BDA\BDA_main.sqf</blockquote>

③GameLogicに次の名前を付けて配置する: BDA_camobj
 BDA起動時、このロジックを中心にカメラが回転します。ミッションの象徴となった場所に置くといいです。

④BDA起動トリガを設置:
BDA_report = true;

 BDA_reportがtrueになった時点でBDAが起動、評価画面が表示された後、ミッションが終了します。

なかみ:

BDA_main.sqf

//initに記述した変数にBGMの変更があるかを判断し、なければデフォルト、あれば使用するようにパラメータを渡す準備をする
_music = " ";
_choosemusic = _this select 1;
if (isnil ("_choosemusic")) then {_music = "Track07_ActionDark"} else {_music = _choosemusic};

//ミッション開始時、各クライアントでBDA表示用スクリプトを起動しておく
[_music]execVM "BDA_A3\BDA_client.sqf";

//ここから先はサーバのみでの処理
if !(isServer) exitwith {};

//変数の定義 _side1 は[]内の要素0番目(=1番目) BDA_param_start1 は整数を宣言
_side1 = _this select 0;
BDA_param_start1 = 0;
BDA_report = false;
BDA_compcalc = false;

//switch構文で _side1 に入った文字を識別、計上する陣営を設定する
switch (_side1) do {
case "W": { BDA_param_side1 = West; };
case "E": { BDA_param_side1 = East; };
case "I": { BDA_param_side1 = Resistance; };
case "C": { BDA_param_side1 = Civilian; };
};

//ミッション開始時の陣営の総数を計上
BDA_param_start1 = ((BDA_param_side1) countSide allunits);

//BDA起動(ミッション終了)トリガが立つまで待つ
waituntil {BDA_report};

//ミッション終了時の陣営の総数を計上
BDA_param_end1 = ((BDA_param_side1) countSide allunits);
//陣営の生き残りの兵士の内、負傷者(3割以上ダメージを受けた者)の数を計上
BDA_param_w1 = {(getdammage _x >= 0.3) && side _x == BDA_param_side1} count allunits;

//sleepは「一呼吸」の感覚で意識的に処理の間に挟むと誤動作防止になる。0secと0.1secはサーバにとって天と地ほどの差がある。
sleep .2;

//計上した変数を各クライアントに配信
publicVariable "BDA_param_start1";
publicVariable "BDA_param_end1";
publicVariable "BDA_param_w1";

//各クライアントで既に待機している計上終了トリガ BDA_compcalc を配信
BDA_compcalc = true;
publicVariable "BDA_compcalc";

BDA_cliant.sqf

//「ここより先はクライアント処理のみ」を示すおまじない
if (!local player) exitwith {};
BDA_compcalc = false;

//ここから先は BDA_main の計上終了トリガを待つ
waituntil {BDA_compcalc};

//変数をこのスクリプトのみで使う宣言(BDAと関係ない、同じ名前を用いた変数への干渉を防ぐため)
private ["_commrank","_KIA1","_loss1","_msg1"];
//_commrank は文字列を宣言
_commrank = " ";
_music = _this select 0;

//BDA_mainの処理よりサーバから配信されたミッション開始時のユニット数を取得、終了時のユニットと計上する
_KIA1 = BDA_param_start1 - BDA_param_end1;
_loss1 = floor (100 - ((BDA_param_end1 / BDA_param_start1)*100));

//損害を百分率の割合によって評価する
if (_loss1 == 0) then {_commrank = "SSS";};
if ((_loss1 >= 1) && (_loss1 <= 5)) then {_commrank = "S+";};
if ((_loss1 >= 6) && (_loss1 <= 10)) then {_commrank = "S";};
if ((_loss1 >= 11) && (_loss1 <= 13)) then {_commrank = "A+";};
if ((_loss1 >= 14) && (_loss1 <= 17)) then {_commrank = "A";};
if ((_loss1 >= 18) && (_loss1 <= 20)) then {_commrank = "A-";};
if ((_loss1 >= 21) && (_loss1 <= 23)) then {_commrank = "B+";};
if ((_loss1 >= 24) && (_loss1 <= 27)) then {_commrank = "B";};
if ((_loss1 >= 28) && (_loss1 <= 30)) then {_commrank = "B-";};
if ((_loss1 >= 31) && (_loss1 <= 33)) then {_commrank = "C+";};
if ((_loss1 >= 34) && (_loss1 <= 37)) then {_commrank = "C";};
if ((_loss1 >= 38) && (_loss1 <= 40)) then {_commrank = "C-";};
if ((_loss1 >= 41) && (_loss1 <= 43)) then {_commrank = "D+";};
if ((_loss1 >= 44) && (_loss1 <= 47)) then {_commrank = "D";};
if ((_loss1 >= 48) && (_loss1 <= 50)) then {_commrank = "D-";};
if ((_loss1 >= 51) && (_loss1 <= 53)) then {_commrank = "E+";};
if ((_loss1 >= 54) && (_loss1 <= 57)) then {_commrank = "E";};
if ((_loss1 >= 58) && (_loss1 <= 60)) then {_commrank = "E-";};
if (_loss1 >= 61) then {_commrank = "F-";};

playmusic _music;

//カメラスクリプト起動
[] exec "BDA_A3\BDA_cam.sqs";
sleep 1;

//メッセージ表示

_msg1 = "<t align='centre' size='1.8 font='puristaLight' color='#ffffff'>" 
				+ '--Mission Completed--'+ "<br/>"
				+"</t>"
//				+ 'Battle Damage Assessment'+ "<br/>" +"<br/>"
				+"<t align='left' size='1.4 font='puristaLight' color='#ffffff'>" 
				+ 'Battle Damage Assessment'+ "<br/>"
				+"</t>"
				
				+"<t align='left' size='1' font='puristaLight' color='#ffffff'>" 
					+' Resources: ' +str BDA_param_start1+ "<br/>"
					+' Remains: ' +str BDA_param_end1+ "<br/>"
					+' Wounded: ' +str BDA_param_w1+ "<br/>"
					+' KIA: ' +str _KIA1+ "<br/>"
					+ "<br/>"
					+' Damage: ' +str _loss1+ '%'+ "<br/>"
					+ "<br/>"
					+ "<br/>"
					+ "<br/>"
					+"</t>"
					
					+"<t align='center' size='1.25' font='puristaLight' color='#ffffff'>" 
					+ 'Commander Rank: '
					+_commrank
					+"</t>";
					
[_msg1,0,0.1,50,5] call bis_fnc_dynamictext;
sleep 10;

//ミッション強制終了
endMission "END1";

BDA_cam.sqs

_camera1 = "camera" camCreate [0,0,0]
_camera1 cameraEffect ["Internal","BACK"]
_camera1 camSetTarget BDA_camobj
_camera1 camSetRelPos [-200,-200,100]
_camera1 camCommit 0
_camera1 camSetRelPos [200,-50,15]
_camera1 camCommit 70
@(camCommitted _camera1)
_camera1 cameraEffect ["TERMINATE","BACK"]
camDestroy _camera1

処理自体は簡単なスクリプトですが、スクリプト本体に動作の仕組みを説明をコメントアウトで添えています。
私自身、不慣れなプログラム作りと英語ソースに体当たりでなんとか習得した経緯があるため、学びたい誰かのお役に立てれば幸いです 😉

過去の遺物を改良しつつ、また楽しいミッション作りをしていきたいです。

  • この返信は10年、 1ヶ月前にStealerが編集しました。
  • この返信は10年、 1ヶ月前にStealerが編集しました。理由: 小修正 エラーが出なくなった(テストが甘かったです;)