武器の作り方(内部動作編)
ここでは、内部的な武器の追加の仕方を説明します。
どう書けばいいのか非常に迷ったのですが、小難しいことは抜きにしてやり方だけ書いて行きたいと思います。
習うより馴れろということで
どう書けばいいのか非常に迷ったのですが、小難しいことは抜きにしてやり方だけ書いて行きたいと思います。
習うより馴れろということで
最初に、アーマリーに武器名を表示させて、購入するところまで言ってみたいと思います。
まずbg_misc.cを開いて、weaponAttributes_tと検索をかけてみてください。
下の画像のようなものが見つかりましたね。
下の画像のようなものが見つかりましたね。

これらが武器の内部的なデータを定義したものです。
左の英語や数字が武器のデータです。画像で緑色になっている部分はコメント呼ばれるもので、その値が何を示しているかの簡単な解説です。
武器の登録用紙みたいなものだと考えると分かりやすいかもしれません。
細かいこたーいいんです。とりあえずなんか追加してみましょう。
左の英語や数字が武器のデータです。画像で緑色になっている部分はコメント呼ばれるもので、その値が何を示しているかの簡単な解説です。
武器の登録用紙みたいなものだと考えると分かりやすいかもしれません。
細かいこたーいいんです。とりあえずなんか追加してみましょう。
ちょっと下にスクロールすると、WP_MACHINEGUNと書かれた武器データがあると思います。
こいつを下の画像を参考にコピペしてみてください。
こいつを下の画像を参考にコピペしてみてください。

一応ソースコードなので、中括弧やカンマの位置を間違えるとエラーになるので間違えずにコピペしてください。
お察しの通りこれはRifleのデータです。これで内部的にRifleは二つになりました。

でもこれじゃどっちがどっちだか区別できないので紛らわしいですね。
そんな訳でちょこっといじって見ましょう。
そんな訳でちょこっといじって見ましょう。

これで完成!・・・とは残念ながらいきません。
WP_MACHINEGUNEXの右の文字のintってのに注目しましょう。
intはIntegerの略で、日本語で数値という意味です。
実はこれは、英語のように見えて数字なのです。
なんのこっちゃと思われるかも知れませんが、
C言語ではある単語を別の単語に機械的に置き換える、マクロという機能があります。
それを使って数値に名前をつけて、英語のように見せかけているのです。
("Rifle"の右側を見るとcharとありますね。これはCharactor、日本語で文字という意味で、ダブルコーテーションで囲まれたものは基本的に文字です)
WP_MACHINEGUNEXの右の文字のintってのに注目しましょう。
intはIntegerの略で、日本語で数値という意味です。
実はこれは、英語のように見えて数字なのです。
なんのこっちゃと思われるかも知れませんが、
C言語ではある単語を別の単語に機械的に置き換える、マクロという機能があります。
それを使って数値に名前をつけて、英語のように見せかけているのです。
("Rifle"の右側を見るとcharとありますね。これはCharactor、日本語で文字という意味で、ダブルコーテーションで囲まれたものは基本的に文字です)
本来ここに入るべきものは武器を識別するためのID、数字なのですが、このIDがマシンガン(ライフル)であることを分かりやすくするために
わざわざ、1だの1024だの数字が入るはずのところに、数字に名前を付けて英語を入れているのです。
(tremulous.hを編集したことのある人は#define LEVEL0_HEALTHなどを見たことがあると思います。まさにそれのことです。
そのように、マクロには後からの改変を容易にするといった役割もあります。)
わざわざ、1だの1024だの数字が入るはずのところに、数字に名前を付けて英語を入れているのです。
(tremulous.hを編集したことのある人は#define LEVEL0_HEALTHなどを見たことがあると思います。まさにそれのことです。
そのように、マクロには後からの改変を容易にするといった役割もあります。)
なんでわざわざそんなことを言うのかというと、実はこのような数値の別名は、
適当に書いておけばコンピュータが勝手に名づけてくれるというものではありません。
先ほど適当にWP_MACHINEGUNEXなどと書いてしまいましたが、それを登録してやる必要があるということです。
適当に書いておけばコンピュータが勝手に名づけてくれるというものではありません。
先ほど適当にWP_MACHINEGUNEXなどと書いてしまいましたが、それを登録してやる必要があるということです。
回り道になりましたが、bg_public.hを開いて、WP_MACHINEGUNで検索をかけてみましょう。

ここが、武器IDの別名を定義するところです。WP_MACHINEGUNの下あたりにでもWP_MACHINEGUNEXを挟んでおきましょう。

はい、これで完成です。
実際プレイしてみましょう
実際プレイしてみましょう

はい、売ってました!

うわー!大差なーい!

いみねえええええええ!
実は本当に意味ないです。この状態でこの武器のデータをいじっても変化がありません。
ふざけんな!詐欺じゃねえか!!と思われたところで続きは次のところで。
ふざけんな!詐欺じゃねえか!!と思われたところで続きは次のところで。
武器の作り方(内部動作編2)
なぜ意味がなかったかというと、半分憶測ですが、アーマリーで買える武器一覧を表示するときはWP_~~を調べて、
その武器のweaponHumanName("Super Rifle"にしたところ)を調べその一覧を表示するのですが、
買う武器を選択すると、その武器のweaponName("rifle"になってるところ)が選択したものと等しいものをプレイヤーのデータに追加してやるって形なので
SuperRifleを選択しても、weaponNameが"rifle"になってる限りWP_MACHINEGUNのライフルがプレイヤーに与えられるのです
その武器のweaponHumanName("Super Rifle"にしたところ)を調べその一覧を表示するのですが、
買う武器を選択すると、その武器のweaponName("rifle"になってるところ)が選択したものと等しいものをプレイヤーのデータに追加してやるって形なので
SuperRifleを選択しても、weaponNameが"rifle"になってる限りWP_MACHINEGUNのライフルがプレイヤーに与えられるのです
要するにweaponNameを変更してやればいいので変更します。"superrifle"にして、テストプレイをしてみましょう。

そうですね。アイコンも武器モデルも武器発射すらできません。

武器の外見のデータも、内部的な処理もまだ記述していないので当然ですね。それでは内部的な処理から書いていきましょう。
g_weapon.cでWP_SHOTGUNで検索してみましょう。
ここは、プレイヤーが持っている武器ごとに何をするかを決める場所です。
g_weapon.cでWP_SHOTGUNで検索してみましょう。
ここは、プレイヤーが持っている武器ごとに何をするかを決める場所です。
case WP_SHOTGUN:
の下の行に
case WP_MACHINEGUNEX:
と挿入しましょう

下のshotgunFire( ent );とはショットガンを撃つみたいな意味です。上のbulletFire( ent, RIFLE_SPREAD, RIFLE_DMG, MOD_MACHINEGUN );とかもお察しください。
これをしたらまたテストプレイをしてみましょう。
マシンガンの連射力でショットガン撃ちまくる厨武器のできあがりです。TUEEEEEEEEEEEEEEEEEEEEEEEEE
マシンガンの連射力でショットガン撃ちまくる厨武器のできあがりです。TUEEEEEEEEEEEEEEEEEEEEEEEEE

内部動作の変更は大体こんな感じです。では次は見た目をライフルに戻してやりましょう。
武器の作り方(見た目編)
ここからはソースコードをいじる作業はいりません。
baseのdata1.1.0.pk3を解凍してみてください。そして、data1.1.0/models/weaponsフォルダを開いてみましょう。
いかにもそれっぽいフォルダが並んでいますね。
baseのdata1.1.0.pk3を解凍してみてください。そして、data1.1.0/models/weaponsフォルダを開いてみましょう。
いかにもそれっぽいフォルダが並んでいますね。

Tremulousの内部では、武器の見た目の情報を読み込むとき、武器の名前と同じフォルダを開いて、その中のデータを読み込むということをしてやります。
先ほど何も表示されなかったのは、ここにsuperrifleというフォルダがなかったため、情報が読み込めなかったのです。
先ほど何も表示されなかったのは、ここにsuperrifleというフォルダがなかったため、情報が読み込めなかったのです。
さて、ここに情報を追加するにはどうすればいいのかというと、
今まではコンパイルしてできたvmフォルダをzipで圧縮してmodにしていただけだと思います。
今度からは、models/weapons/superrifleというフォルダの階層を作成して、modelsフォルダとvmフォルダを一緒に選択してzip圧縮してもらうことになります。
(詳しい人はdata1.1.0.pk3の中にvmフォルダがないことを不思議に思うかも知れません。vms-1.1.0.pk3を解凍するとしあわせになれますん)
今まではコンパイルしてできたvmフォルダをzipで圧縮してmodにしていただけだと思います。
今度からは、models/weapons/superrifleというフォルダの階層を作成して、modelsフォルダとvmフォルダを一緒に選択してzip圧縮してもらうことになります。
(詳しい人はdata1.1.0.pk3の中にvmフォルダがないことを不思議に思うかも知れません。vms-1.1.0.pk3を解凍するとしあわせになれますん)
さて、実際に作業を行いましょう
まずmakeをするとvmフォルダが作成される場所にでも、modelsフォルダを作成して、その中にweaponsフォルダ、superrifleフォルダを作成しましょう。
まずmakeをするとvmフォルダが作成される場所にでも、modelsフォルダを作成して、その中にweaponsフォルダ、superrifleフォルダを作成しましょう。




見た目の情報はrifleの○パクリでいくので、data1.1.0/models/weapons/rifleフォルダを開いて、その中のファイルを全てsuperrifleの中にコピペしましょう


そして、vmフォルダとmodelsフォルダを選択後、いつものようにpk3を作り、テストプレイをしてみましょう。

ライフルっぽくなってますね。
RCも瞬殺!!
RCも瞬殺!!


これで一応の完成です。
要点をまとめると、
ゲーム内部の処理を変更したい:
要点をまとめると、
ゲーム内部の処理を変更したい:
- お手本にしたい武器のWP_~~で検索をかけて、それと同じ処理を辿るように追加した武器のWP_~を記入してやればよい。
武器の外観を変更したいor追加したい:
- その武器名の、models/weapons/~~というフォルダを作成して、その中のファイルをいじることで変更が可能
蛇足ですが、models/weapons/superrifle/weapon.cfgをメモ帳で開いてみましょう。
いかにも設定ファイルって感じですね。
武器の見た目の設定はこのファイルで定義されています。
ぶっちゃけ、superrifleフォルダ内のこれ以外を消去しても多分動作します(未確認)
なぜなら、中身を見れば分かるように
models/weapons/rifle/ricochet0.wavのように、rifleフォルダ内のものを参照しているからです。
逆に、オリジナルの音声や、モデル、アイコンを使いたい場合は、
適当なフォルダ階層を作成して、音声やアイコンモデルを配置して、ここで指定してやればいいのです。
また、他の武器のweapon.cfgをここに配置してやったりしてもおもしろいでしょう。
武器の見た目の設定はこのファイルで定義されています。
ぶっちゃけ、superrifleフォルダ内のこれ以外を消去しても多分動作します(未確認)
なぜなら、中身を見れば分かるように
models/weapons/rifle/ricochet0.wavのように、rifleフォルダ内のものを参照しているからです。
逆に、オリジナルの音声や、モデル、アイコンを使いたい場合は、
適当なフォルダ階層を作成して、音声やアイコンモデルを配置して、ここで指定してやればいいのです。
また、他の武器のweapon.cfgをここに配置してやったりしてもおもしろいでしょう。
すいません途中でめんどくさくなったので後半適当です
くわしいひと居たら消していいので書いてくらはい
来週辺りキットやるきでてるのでらいしゅうがんばる
あと武器は全部で32個までしかムリっぽいです
拡張の仕方いま調べてますのでwikiにかけるくらい理解したら書きます
くわしいひと居たら消していいので書いてくらはい
来週辺りキットやるきでてるのでらいしゅうがんばる
あと武器は全部で32個までしかムリっぽいです
拡張の仕方いま調べてますのでwikiにかけるくらい理解したら書きます