#author("2023-02-01T12:08:29-05:00","default:fear","fear")
#author("2023-03-11T05:52:16-05:00","default:fear","fear")
XS超入門的な記事。~
かなりプログラミング色が強くなるので、とりあえず、この記事を読んだ人が以下のことができるようになることを目的とする。~
-''既存のランダムマップに、エディターの「属性を変更」で変更できる項目をかけることができるようにする。''~

ちょー初心者向けなので、プログラミング経験者や、こんなんじゃ満足できないぜ!って感じの人がいれば、また新たに記事を書くつもり。~
#Contents
*XSとは [#za776e8e]
AoE2DEの公式ガイドによると、External Subroutines(外部サブルーチン)の略らしい。~
エディターで作成したカスタムシナリオやランダムマップに拡張的な効果を付与できる。~
~
が、XS自体にいくつかバグがあり、カスタムシナリオでの想定できる用途が到底初心者向きではないため、~
ここではランダムマップに焦点を絞った説明をしていく。~
**まだイメージがつきにくいんですが… [#l52197d7]
とりあえず、カスタムシナリオで出てくる、やったら強いユニットみたいなやつが、~
ランダムマップでも出せるようになる!と考えてくれれば。~
*XSの強み [#lfa65a94]
一回作ってしまえば、複数のrmsファイルに対して使いまわすことが可能。~
またテキストベースで編集するため、慣れてしまえばカスタマイズ速度が速い。~
*XSの欠点 [#ddc21a2f]
逆に、AoE2DE標準搭載のエディターのような視覚的に判別可能な要素がないため、エディターに触れたことがないとイメージしづらい。~
また、攻撃力・防御力など、エディターではいじれる項目がバグでいじれないなどの欠点もある。~
また、攻撃力・防御力など、エディターでは簡単にいじれる項目をいじるのがひと手間といった欠点もある。~
*推奨環境 [#c679fcf3]
とりあえずはメモ帳でもいいが、プログラミングなので、最低でも全角スペースと半角スペースの違いが一目で分かるサクラエディタぐらいの性能があると事故が少ない。~
インストールが手間でなければvisual studio codeを強く推奨。~
これは、半公式アドオンであるAoE2 XS Scriptingを導入可能であり、このアドオンによるガイダンス機能が相当便利であるため。~
&ref(AoE2 XS Scripting.png);~
↑これ。~
*実際に導入するまで [#fb22f5cd]
**ハローワールドまで [#h77ecbcc]
***rmsファイルの入手 [#y252e069]
まずは、xsを導入するランダムマップを決定する。~
ランダムマップについては、→[[RMS入門]](読まなくてもこの記事の目的は達成可能)~
ここでは、既存の標準ランダムマップに入れることにしてみよう。~
AoE2DEのインストール先にある、ランダムマップファイルを一個コピーする。~
インストール先を特に弄ってなければ、~
 \Program Files (x86)\Steam\steamapps\common\AoE2DE\resources\_common\drs\gamedata_x2

ね。~
拡張子は.rms。例えば、「道」だと、「Michi.rms」になっている。日本人が作ったのかな?~
拡張子の違うファイルや、よくわからんものも入っているので、普段遊んでいるマップのものを持ってくるのがおすすめ。~
これをコピーしたら、
 \Program Files (x86)\Steam\steamapps\common\AoE2DE\resources\_common\random-map-scripts

フォルダ内にペーストして、適当にリネーム(日本語OK)しておこう。
***rmsファイルへのxs読み込み命令の記載 [#z9380d10]
リネームしたファイルを開き(事故防止のためにコピー元のgamedata_x2は閉じておこう)、~
最初の#incrude_drsの記載の下あたりに、以下を記載する。~
 /* xs */
 #includeXS hogehoge.xs

※hogehogeの部分は、xsに付ける予定のファイル名(半角英数)を入力。~
※プログラミングの世界では、全角スペースはバグの原因になりやすい。必ず半角スペースを入力しよう。~
~
例えば、元のコードが、~
 ・
 ・
 ・
 #include_drs F_seasons.inc
 
 <PLAYER_SETUP>
 ・
 ・
 ・

みたいになっていたら、~
 ・
 ・
 ・
 #include_drs F_seasons.inc
 
 /* xs */
 #includeXS hogehoge.xs
 
 <PLAYER_SETUP>
 ・
 ・
 ・

となるようにして欲しい。~
なお、アラビアなど上記のような形式にになっていないものもあるので、その場合は以下のことに気を付けてくれればよい。~
1.コメントアウト箇所に書かない~
コメントアウトとは、エディターが注釈を書く場所で、rmsの場合は、/* */で囲われた箇所のこと。~
ここに書くと注釈扱いになるのでプログラムとして読み込んでくれない。~
2.プログラムの途中に書かない~
よくわからないものには触れないというのが、事故を防ぐ鉄則。~
たとえば、if ほにゃらら…みたいな文章の間に書くと、当然命令がおっかしくなる。~
~
なので、おすすめは、なるべく頭のほう。最初のコメントアウト終了箇所に改行を入れて載せたり、なんならちょっとダサいけど先頭ならまずバグらない。~

***xsファイルの新規作成 [#oa64112e]
次に、xsファイルを作成する。適当なテキストエディタやコード入力ソフトを用意し、新規作成から以下をまるっとコピーして記載。~

 // ←このように最初にスラッシュを二回打ち込むとコメント行にできるよ。
 /* このように、
 最初にスラッシュと*を打ち込んで、最後を*とスラッシュで閉じると
 複数行のコメント行にできるよ。
 */
 void main() {
     // ↓うまく読み込めると左上のメッセージ欄に表示されます。
     xsChatData("Hello AoE2DE");
 }

~これも、まるっとコピペで貼って欲しい。全角の中括弧などは使わない事。~
記載できたら、ファイルを以下の場所に保存する。~
 C:\Users\Username\Games\Age of Empires 2 DE\steamID\resources\_common\xs
''保存する際のファイル名は、上でrmsファイル内に記載したhogehoge.xsと合わせること。''~
''拡張子は.xsにしておく。''~
※とくに設定を弄ってない場合の場所~
※UserNameはwindowsで使っているusername。あなたのPCのusernameがkumaならC:\Users\kumaになる。~
※SteamIDは、steam→設定→アカウント→アカウント詳細を表示、で表示される(上の方に小さくちょろっと表示されている)~
 調べるのが億劫なら、なんかかなりの桁数の数字の羅列のフォルダがたぶんそう。~
~
なお、AoE2DEのゲームフォルダがある、~
 \Program Files (x86)\Steam\steamapps\common\AoE2DE\resources\_common\xs

に入れても、スカーミッシュモードだと動作するが、マルチプレイヤーだと他の人がダウンロードできないので注意。~
(こちらのフォルダには、定数名が記載されたconstant.xsという便利なファイルがある。)~
~
~
ここまで出来たら、AoE2DEのスカーミッシュモードで、~
ゲームモード:ランダムマップ、マップスタイル:カスタム~
を選択し、rmsファイルと同名のマップを選択して、ゲームを開始してみよう。~
うまく読み込めているなら、ゲーム開始と同時に左上に、「Hello AoE2DE」が表示されるはずである。~
**「属性を変更」の実行 [#n0670b61]
ここでは、「民兵」の「ヒットポイント」を「500」にしてみよう。~
これがうまくいけば、あとはこれの応用で属性の変更はマスターできるぞ。~
***xsファイルの編集 [#s3fb34d3]
''プログラムは、すべて半角で書くこと。''~
''コメント行を作りたい場合は、ダブルスラッシュの後であれば全角、日本語を記載しても大丈夫。''~
~
上記で作成したxsファイルの、~
 void main() {
 …
 }
の中が、プログラムを記載する箇所になる。このvoid main(){}は二回以上書くとバグる。また、この外には、入門編では何も書かないので注意。~
答えを先に言ってしまうと、この中に、~
 xsEffectAmount(cSetAttribute, 74, cHitpoints, 500);
と記載すれば、うまくいく(最後の半角;を忘れないように)~
この際、メッセージを出すxsChatDataの上に記載しておくとよい。~
~
 // ←このように最初にスラッシュを二回打ち込むとコメント行にできるよ。
 /* このように、
 最初にスラッシュと*を打ち込んで、最後を*とスラッシュで閉じると
 複数行のコメント行にできるよ。
 */
 void main() {
     xsEffectAmount(cSetAttribute, 74, cHitpoints, 500);
     // ↓うまく読み込めると左上のメッセージ欄に表示されます。
     xsChatData("Hello AoE2DE");
 }

↑完成系はこんな感じ。~
~
では、このプログラムのそれぞれの箇所について解説していく。~
まず、最初の、
 xsEffectAmount();
とは、効果量に関する命令を与える際の関数になる。これは不変なので、そのままコピペして使えばよい。~
この括弧の中に記載するものが、パラメータになる。パラメータは半角,で区切って記載する(見やすさの問題で、一緒に半角スペースを入れて「, 」で区切ることも多い)~
~
次に、cSetAttributeというのが、「設定する」という命令になる。~
このページは入門編なので、以下の三つについて覚えておこう。~
-cSetAttribute:設定する。
-cAddAttribute:加算する。
-cMulAttribute:乗算する。

次の「74」とは、「民兵」のIDを指す。~
このIDはゲーム内のエディターで調べることができる。~
調べ方としては、以下の方法が一番とっつきやすいか。~
~
1.「シングルプレイヤー」から「エディター」を選択~
2.「シナリオを作成」を選択~
3.「トリガー」を選択~
4.シナリオトリガー欄の下の「新規」を選択~
5・条件と効果欄の「新規効果」を選択~
6.効果リストから「属性を変更」を選択~
7.調べたいユニット、建物、英雄をオブジェクトリストの種類およびオブジェクトリストから選択~
8.アイテムIDの所が変化する。これがそのユニットのIDになる。~
&ref(idexample.png);~
↑これで例えば、「戦士育成所」のIDは、12であることがわかる。~
~
~
次の、cHitpointsとは、ヒットポイントに変更を加える、という命令になる。~
ここの項目については別途、[[attributeID]]のページにまとめたので、そこを参照してほしい。~
また、各値にどういう操作を加えたらどうなるのかについては、[[属性を変更]]のページを参照して欲しい。~
~
最後の500は、効果量になる。~
ここだけ小数点を用いた値や、マイナスの値が入力可能。~
ただし、ヒットポイントに小数を用いた値を入れたりしてもうまくはいかない。~
小数は、上記「cMulAttribute」を用いる時に、微妙な値を乗算したり、「割る」として機能させたいときに使うとよい。~
同様にマイナスは、「cAddAttribute」を用いる時に、「引く」として機能させたい時に使うとよい。~
~
ここまで設定できたら、xsファイルを保存して、実際にスカーミッシュモードで確認してみよう。~
無事、民兵のヒットポイントが500になっていればOK。~
あとは作成した行を編集したり、コピペしたりして、設定項目を増やしていけばオリジナルのxsファイルが作成できるぞ。~
~
 void main() {
     xsEffectAmount(cSetAttribute, 74, cHitpoints, 500);
     xsEffectAmount(cMulAttribute, 125, cHitpoints, 5, 7);
     xsEffectAmount(cMulAttribute, 125, cMovementSpeed, 2, 7);
     ・
     ・
     ・
     // ↓うまく読み込めると左上のメッセージ欄に表示されます。
     xsChatData("Hello AoE2DE");
 }

↑こんな感じに、どんどん設定する項目を増やしていこう。~
インデント数を揃えると、見やすい(プログラミング経験者っぽくなれる)~
~
***プレイヤー毎の設定は? [#k186be2e]
上記の方法だと、すべてのプレイヤーに対し設定が反映されるが、特定のプレイヤーにのみ設定を反映させたい場合があるかもしれない。~
その場合は、最後に、設定したいプレイヤーIDのパラメータを与えてやればよい。~
例えば、上記の設定を、プレイヤー7のみに与えたい場合は、~
 xsEffectAmount(cSetAttribute, 74, cHitpoints, 500, 7);
とすればよい。~
※ただし、プレイヤー数が7に満たない場合、相手を7番に設定してもうまく動作しない。~
*マルチプレイヤー時の注意点 [#s8f8f826]
xsファイルに変更を加えて保存したら、一度AoE2DEを再起動した方がよい。~
(スカーミッシュモードで検証する場合はそんなことしなくてもうまくいく)~
また、前回やったランダムマップと同一のランダムマップをやる場合、なぜかxsファイルの修正が反映されず、ダウンロードがうまくいかないバグがある。~
この場合は、一度ランダムマップの種類を変更して、相手にチェックを入れてもらい、こっちもチェックを入れてゲームを開始できる状態まで持って行ったあと、~
もう一度xsを導入したランダムマップを選び、チェックを入れると、更新されたxsファイルのダウンロードが始まる。~
それでもうまくいかない場合は、作成したrmsファイルをリネームしたり、同じxsファイルを用いるrmsファイルを複数用意しておけば、~
切替→チェック→ダウンロードの流れでファイルを送付することができる。~
*その他注意事項 [#ee0f2ea6]
 xsChatData("Hello AoE2DE");
は、左上に""で囲んだ範囲のメッセージを出力するという命令であり、ゲーム開始時に正常にロードできているか確認するのに便利だが、~
どうも日本語には対応してない感がある(日本語を入力するとエラーになる)。~
また、半角の各種記号は、プログラムが使う記号とダブっているのを使うとバグる危険性があるため、使わないほうがよい。~
つまりは、半角英数だけ使うのが安全だよってこと。~
*練習課題 [#gd2f25cc]
追加で改行を入れて、上記で設定したような設定が民兵以外にもできるかやってみよう。~
Q1.「家」のヒットポイントを、「cMulAttribute」を用いて10倍にしてみよう。~
Q2.「木を切る人」の作業速度と運搬限度を「cMulAttribute」を用いて10倍にしてみよう。~
※ヒント:木を切る人の男と女のID→[[町の人と内部ID]]~
     作業速度と運搬限度の指定→[[attributeID]]~
     全部で四行になると思います。~
Q3.プレイヤー2の「粉ひき所」のヒットポイントに、「cAddAttribute」を用いて100加算してみよう。~
※ヒント:スカーミッシュモードで「マップを公開」を「すべて表示」にしておくと、結果が確認しやすいです。~

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS