アップグレードの作り方(内部動作編1)
アップグレードとはJetPackやライトアーマーなど、武器でない装備品のことです。
大筋は武器の追加と同じなので、武器の追加の仕方が分かっていれば理解しやすいと思います。
大筋は武器の追加と同じなので、武器の追加の仕方が分かっていれば理解しやすいと思います。
まず、武器の時と同様にbg_misc.cを開き、upgradeAttributes_tで検索をかけてください。

項目の数もないでちょっと解説などしてみます(半分憶測ですが)
UP_LIGHTARMOUR, //int upgradeNum;
:装備品のIDです。装備品の機能を追加するときに重要になります。
:装備品のIDです。装備品の機能を追加するときに重要になります。
LIGHTARMOUR_PRICE, //int price;
:装備品の値段です。
:装備品の値段です。
( 1 << S1 )|( 1 << S2 )|( 1 << S3 ), //int stages
:装備品が使用可能になるステージです。ちょっと変わった書き方ですが3パターンだけなのでフィーリングでがんばってください。
stage1から ( 1 << S1 )|( 1 << S2 )|( 1 << S3 )
stage2から ( 1 << S2 )|( 1 << S3 )
stage3のみ ( 1 << S3 )
:装備品が使用可能になるステージです。ちょっと変わった書き方ですが3パターンだけなのでフィーリングでがんばってください。
stage1から ( 1 << S1 )|( 1 << S2 )|( 1 << S3 )
stage2から ( 1 << S2 )|( 1 << S3 )
stage3のみ ( 1 << S3 )
SLOT_TORSO|SLOT_ARMS|SLOT_LEGS, //int slots;
:この装備品が占める体の部位です。
バトルスーツつけながらヘルメットが付けられないのは、このような設定があったからですね。
:この装備品が占める体の部位です。
バトルスーツつけながらヘルメットが付けられないのは、このような設定があったからですね。
"larmour", //char *upgradeName;
:武器の追加の時も出てきました。装備品の内部的な名前です。
これにより参照されるフォルダが決まるので、フォルダの名前に使えないものは避けましょう。
(先頭に数字、スペースや当然日本語も駄目)
:武器の追加の時も出てきました。装備品の内部的な名前です。
これにより参照されるフォルダが決まるので、フォルダの名前に使えないものは避けましょう。
(先頭に数字、スペースや当然日本語も駄目)
"Light Armour", //char *upgradeHumanName;
:ショップなどで売られる時に表示される名前です。
:ショップなどで売られる時に表示される名前です。
"icons/iconu_larmour",
:装備品のアイコンです。既存のものを指定するなどしましょう。
(新しく作る場合はアルファチャンネルを編集できるソフトでtgaファイルを作ることになります。)
:装備品のアイコンです。既存のものを指定するなどしましょう。
(新しく作る場合はアルファチャンネルを編集できるソフトでtgaファイルを作ることになります。)
qtrue, //qboolean purchasable
:買うことができるかどうか。
:買うことができるかどうか。
qfalse, //qboolean usable
:使用することができるかどうか。Jetpackなどは使えますが、ライトアーマーは使えませんね。
:使用することができるかどうか。Jetpackなどは使えますが、ライトアーマーは使えませんね。
WUT_HUMANS //WUTeam_t team;
:この装備品を付けるチームです。
:この装備品を付けるチームです。
そんな訳で、今回はHelmetでもパクってレーダーなし、防御力だけ上がるものを作ってみましょう。
武器の追加の時のようにコピペしてください。
武器の追加の時のようにコピペしてください。

武器の名前はHeadGearとでもしておきます。
コピペしたものを以下のように改変してください。
コピペしたものを以下のように改変してください。

次に、装備品IDを追加してやります。
bg_public.hを開き、ヘルメットの↑にでもUP_HEADGEARを挿入しておきます。
bg_public.hを開き、ヘルメットの↑にでもUP_HEADGEARを挿入しておきます。

ここで、前回と少し違うのはHEADGEAR_PRICEです。
お手本にしたHELMET_PRICEはどこで記述されているのでしょうか。
tremulous.hを開いてHELMET_PRICEで検索をかけてみましょう。
tremulous.hをいじったことがある人にはおなじみですね。
ここに、先ほどのHEADGEAR_PRICEの設定をして、値段もつけましょう。
お手本にしたHELMET_PRICEはどこで記述されているのでしょうか。
tremulous.hを開いてHELMET_PRICEで検索をかけてみましょう。
tremulous.hをいじったことがある人にはおなじみですね。
ここに、先ほどのHEADGEAR_PRICEの設定をして、値段もつけましょう。

フィーリングでがんばってくらはい
ここで内部編1はおしまいです。
次は見た目の設定です。
次は見た目の設定です。
アップグレードの作り方(見た目編)
アップグレードを作る場合、武器の作成とちょっと手順が異なります。
まず、data1.1.0の中身を研究してみましょう。
武器の時を思い出せば、modelsフォルダの中にupgradesフォルダでもあるのかと思いきやありません。
どうなってんじゃ!と思うかも知れませんが、playersフォルダのhuman_baseフォルダを開いてみましょう。
まず、data1.1.0の中身を研究してみましょう。
武器の時を思い出せば、modelsフォルダの中にupgradesフォルダでもあるのかと思いきやありません。
どうなってんじゃ!と思うかも知れませんが、playersフォルダのhuman_baseフォルダを開いてみましょう。

注目するべきは、light、helmetと付いているものがあることです。
そう、装備品の殆どは装備なしのHumanのスキンという形で実装されているのです。
とりあえず、前回のようにdata1.1.0の中身と整合性を合わせたフォルダ階層を作成しましょう。
作業してるフォルダ/models/players/human_base となるように、フォルダを作っていきます。
この時、前回作成した武器のフォルダと被っても問題はありません。
そう、装備品の殆どは装備なしのHumanのスキンという形で実装されているのです。
とりあえず、前回のようにdata1.1.0の中身と整合性を合わせたフォルダ階層を作成しましょう。
作業してるフォルダ/models/players/human_base となるように、フォルダを作っていきます。
この時、前回作成した武器のフォルダと被っても問題はありません。

↑前回とあわせるとこんな感じに、modelsフォルダの中にweapons playersフォルダがあるという形になる。
次に、作成したmodels/players/human_baseフォルダに必要なファイルを作ってやるのですが、
男はだまってコピーアンドペーストでいきましょう。
data.1.1.0/models/players/human_baseフォルダから、h_helmet.tga head_light.skinを
先ほど作成したmodels/plyaers/human_baseフォルダにコピペしてください。
男はだまってコピーアンドペーストでいきましょう。
data.1.1.0/models/players/human_baseフォルダから、h_helmet.tga head_light.skinを
先ほど作成したmodels/plyaers/human_baseフォルダにコピペしてください。
こいつらをいじくってやりましょう。
まず、ファイル名ですがheadgearを作るので
h_helmet.tga → h_headgear.tga
head_light.skin → head_headgear.skin
と変更してやりましょう。
まず、ファイル名ですがheadgearを作るので
h_helmet.tga → h_headgear.tga
head_light.skin → head_headgear.skin
と変更してやりましょう。
次にh_headgear.tgaを編集するのですが、.tgaファイルはペイントでは開けないので、pixiaやgimpなどで開きましょう。
自分は絵心がないのでここが一番きついのですが、適当に落書きするか、gimpの色の変更などでがんばりましょう。
自分は絵心がないのでここが一番きついのですが、適当に落書きするか、gimpの色の変更などでがんばりましょう。



次に、.skinファイルの編集です。早速開いてみましょう。
tag_head,
h_head_base,gfx/null
h_head_helmet,models/players/human_base/h_helmet
h_head_base,gfx/null
h_head_helmet,models/players/human_base/h_helmet
と3行だけ書いてありますね。なんのこっちゃか良くわかりませんが、
tag_head,
h_head_base,gfx/null
h_head_helmet,models/players/human_base/h_headgear
h_head_base,gfx/null
h_head_helmet,models/players/human_base/h_headgear
と書き直してみましょう。
これで終わりかと思いきや、あともう少しあります。
data1.1.0を開いてみてください。そこにarmourフォルダってのがあるはずなので、それを開いてください。
ここは、名前の通りアーマーの防御力を設定するところのようです。
今回追加するのは防具なので、当然ここの設定が必要になりますね。
これに習って、先ほど作成したmodels/players~~の、modelsフォルダの隣にarmourフォルダを作成してやりましょう。
そして、そのフォルダの中に、data1.1.0/armourフォルダからhelmet.armourをコピペして、
そのファイルの名前をheadgear.armourにしてやりましょう。
data1.1.0を開いてみてください。そこにarmourフォルダってのがあるはずなので、それを開いてください。
ここは、名前の通りアーマーの防御力を設定するところのようです。
今回追加するのは防具なので、当然ここの設定が必要になりますね。
これに習って、先ほど作成したmodels/players~~の、modelsフォルダの隣にarmourフォルダを作成してやりましょう。
そして、そのフォルダの中に、data1.1.0/armourフォルダからhelmet.armourをコピペして、
そのファイルの名前をheadgear.armourにしてやりましょう。
次に中身の編集です。
見てみるとなんとなく何が書いてあるかわかりますね。
要するに、高さと角度で部位を指定して、その場所のダメージ倍率modiferを記述してやっているようです。
crouchはしゃがんでいるときのものを指定しているのでしょう。
見てみるとなんとなく何が書いてあるかわかりますね。
要するに、高さと角度で部位を指定して、その場所のダメージ倍率modiferを記述してやっているようです。
crouchはしゃがんでいるときのものを指定しているのでしょう。
今回設定したい場所は頭なので、部位は変更しないでmodifierの項目だけ 0.3→0.5くらいにしてやりましょう。
(もちろんお好みで5.0くらいにしても結構です)
(もちろんお好みで5.0くらいにしても結構です)
これで一応の外見の設定はおしまいです。
後はいつものようにコンパイルして、vm models armourフォルダを選択してzipしてpk3にして実行してみましょう。
後はいつものようにコンパイルして、vm models armourフォルダを選択してzipしてpk3にして実行してみましょう。
はい売ってました

はい買えました

あれ!?変わってなくね!?

そうなんです。まだやることがあります。
終止符を打つためにまたソースの海へと飛び込んでいきましょう。
終止符を打つためにまたソースの海へと飛び込んでいきましょう。
アップグレードの作り方(内部動作編2)
基本的にソースの改変に定石はありません。
でも何かをお手本にものを作る場合は、それのIDで追っていけばよいのです。
今回はhelmetのパクリなので、ヘルメットのIDであるUP_HELMETを検索していってみましょう。
でも何かをお手本にものを作る場合は、それのIDで追っていけばよいのです。
今回はhelmetのパクリなので、ヘルメットのIDであるUP_HELMETを検索していってみましょう。
検索をすると、まずg_cmds.cの中にありました。

この処理の頭を見てみると、ScoreboardMessageと書いてありますね。

どうやらスコアボードをTabを押して表示するときに、装備しているものを表示する部分のようです。
周りの部分に合わせて、UP_HEADGEARも追加しましょう。
周りの部分に合わせて、UP_HEADGEARも追加しましょう。

次にbg_musc.cの中にありました。これは先ほど追加した部分ですね。
次にcg_draw.cの中にありました。

これは察するに、レーダーの関係のようなので華麗にスルーします。
そして次が重要です。
cg_players.cの中にありました。
cg_players.cの中にありました。

この処理の名前はCG_Player、CGというのはクライアントゲーム?の略だと思われます。
要するにプレイヤーの描画部分の根幹臭いですね。非常に怪しいです。
要するにプレイヤーの描画部分の根幹臭いですね。非常に怪しいです。
add the headの下で、head.hModel = ci->headModelなどと書いてあります。
C言語での = とは、左のものに右のものを入れる(代入する)という意味合いなので、
head.hModelにci->headModelを入れているらしいです。
良くわかりませんがHumanの頭をどうにかしているみたいですね。
C言語での = とは、左のものに右のものを入れる(代入する)という意味合いなので、
head.hModelにci->headModelを入れているらしいです。
良くわかりませんがHumanの頭をどうにかしているみたいですね。
その下を見てみましょう。
if(){}というのは、()の中の条件が成立すると、{}の中の処理を行うという意味です。
if(){}というのは、()の中の条件が成立すると、{}の中の処理を行うという意味です。
条件の詳細は、C言語の知識がないと分からないとは思いますが、この中にUP_HELMETが入っているということは、
プレイヤーがUP_HELMETを装備している場合、という意味だと考えてよさそうです。
プレイヤーがUP_HELMETを装備している場合、という意味だと考えてよさそうです。
プレイヤーがヘルメットを装備してるとどうするんでしょうか。
head.customSkin = cgs.media.larmourHeadSkin;
と書いてありますね。
=の意味を思い出すと、head.customSkinにcgs.media.larmourHeadSkin;を入れているようです。
head.customSkin = cgs.media.larmourHeadSkin;
と書いてありますね。
=の意味を思い出すと、head.customSkinにcgs.media.larmourHeadSkin;を入れているようです。
なんじゃこりゃあああああ!!と考える必要はありません!
larmourHeadSkinとは何かとだけを考えて見ましょう。
larmourとは、ライトアーマーのことでしょう。
そういえば先ほど、helmetのスキンはhead_light.skinという名前でしたね。
larmourHeadSkinとは何かとだけを考えて見ましょう。
larmourとは、ライトアーマーのことでしょう。
そういえば先ほど、helmetのスキンはhead_light.skinという名前でしたね。
恐らくヘルメットはライトアーマーの一部だったのを、あとで独立に切り出したものなのかもしれません。
要するに、larmourHeadとはヘルメットのことなのです!
要するに、larmourHeadとはヘルメットのことなのです!
だとしたら話は単純です。UP_HELMETの代わりに、UP_HEADGEARの時に、
head.customSkinに、何かそう、cgs.media.HeadgearHeadSkinとでも名づけておくものを入れてやればいいのです。
head.customSkinに、何かそう、cgs.media.HeadgearHeadSkinとでも名づけておくものを入れてやればいいのです。
下の画像のように変更してください。

さて、ここでおしまい、とするとコンパイルエラーが出ます。
なぜなら、cgs.media.HeadgearHeadSkinなどと勝手なものを作ってしまいましたね。
ないものは作ればいいのです。これをどこに書けばいいのかを探す旅にでましょう。
なぜなら、cgs.media.HeadgearHeadSkinなどと勝手なものを作ってしまいましたね。
ないものは作ればいいのです。これをどこに書けばいいのかを探す旅にでましょう。
cgs.media.HeadgearHeadSkinのお手本になったのは、cgs.media.larmourHeadSkinでした
これを理解するには、またちょっとC言語の知識が必要です。
話は逸れますが、ちょっと説明したいと思います。
めんどくさい人は飛ばしてください。
これを理解するには、またちょっとC言語の知識が必要です。
話は逸れますが、ちょっと説明したいと思います。
めんどくさい人は飛ばしてください。
C言語には構造体と呼ばれるものがあります。
実は皆さんはもうこれを知っています。
bg_misc.cの武器やアップグレードを登録する場所がありましたね?
IDや値段、アイテムの名前、買えるかどうかなどの複数のデータを一度に記述していました。
このように、いくつものデータを1つの名前でまとめて扱うための機能が構造体です。
実は皆さんはもうこれを知っています。
bg_misc.cの武器やアップグレードを登録する場所がありましたね?
IDや値段、アイテムの名前、買えるかどうかなどの複数のデータを一度に記述していました。
このように、いくつものデータを1つの名前でまとめて扱うための機能が構造体です。
例えば、bg_misc.cの中の例で言うと、
皆さんにはまずupgradeAttributes_tで検索をかけてもらいましたね?
ではこいつが何者なのか、全てのソースについて検索をかけてみて明らかにしましょう。
皆さんにはまずupgradeAttributes_tで検索をかけてもらいましたね?
ではこいつが何者なのか、全てのソースについて検索をかけてみて明らかにしましょう。
typedef struct
{
{
int upgradeNum;
int price; int stages;
int slots;
char *upgradeName; char *upgradeHumanName;
char *icon;
qboolean purchasable; qboolean usable;
WUTeam_t team;
} upgradeAttributes_t;
こんなものが見つかると思います。
int とは数値のことで、 charとは文字列のことでした。
なんとなく話が見えてきませんか?
つまり、upgradeNumという名前の数字、priceという名前の数字、slotsという名前の数字、upgradeNameという名前の文字列
これらを一まとめに表すことができるものが、upgradeAttributes_tという構造体なのです。
int とは数値のことで、 charとは文字列のことでした。
なんとなく話が見えてきませんか?
つまり、upgradeNumという名前の数字、priceという名前の数字、slotsという名前の数字、upgradeNameという名前の文字列
これらを一まとめに表すことができるものが、upgradeAttributes_tという構造体なのです。
例えば、
upgradeAttributes_t unko,tinko;
と記入すると、これら全ての項目を持つunko、tinkoという名前を持つ入れ物が作成されるのです。
upgradeAttributes_t unko,tinko;
と記入すると、これら全ての項目を持つunko、tinkoという名前を持つ入れ物が作成されるのです。
そして重要なことは、unkoのpriceを読み出したいときに、
unko.price
という書き方をします。ここで話は元に戻ります。
つまり、cgsとは何かの構造体で、その構造体の中にmediaという構造体が入っていて、
その構造体mediaの中にlarmourHeadSkinというものがあるのです。
つまり、cgsとは何かの構造体で、その構造体の中にmediaという構造体が入っていて、
その構造体mediaの中にlarmourHeadSkinというものがあるのです。
説明下手なので良くわからないとは思います。すいません。
しかし、Q3エンジンの中は構造体だらけなので、構造体の概念がなんとなくでも分かっていないとmod作成は厳しいです。
なんとなくでいいのでイメージを掴んでおいてください。
しかし、Q3エンジンの中は構造体だらけなので、構造体の概念がなんとなくでも分かっていないとmod作成は厳しいです。
なんとなくでいいのでイメージを掴んでおいてください。
さて、話を本筋に戻しましょう。
結局何をすればいいのかというと、larmourHeadSkinで検索をかけてやればいいのです。
larmourHeadSkinの真似をして,HeadgearHeadSkinというものを作ってやれば、完成するのです。
結局何をすればいいのかというと、larmourHeadSkinで検索をかけてやればいいのです。
larmourHeadSkinの真似をして,HeadgearHeadSkinというものを作ってやれば、完成するのです。
実際に検索をしてみると、cg_main.cの中にありました。

なんとなく分かりますね。
見た目の作り方で作成した.skinファイルを指定してやればいいのです。
ここを下のように改変してやりましょう。
見た目の作り方で作成した.skinファイルを指定してやればいいのです。
ここを下のように改変してやりましょう。

そして、もう一度検索してみると、cg_local.hの中にありました。

以下のようにしてやりましょう。

これで一応は完成です。お疲れ様でした。

なんだこの化け物は・・・
恐らくテクスチャをいじるのに失敗したみたいです。正直、テクスチャ関連はさっぱりなのでよくわかんないです><;;;;
gimpで色の変更くらいに留めておいたほうがいいかもしれませんね。
gimpで色の変更くらいに留めておいたほうがいいかもしれませんね。
それと、肝心の防御力の変更具合なのですが、これはどうがんばっても一人では検証できないので、実際に軽減率が反映されてるか試してません><;;;;
されてなかったらスレで言ってもらえれば色々調べてみたいと思いますが、今日のところはこの辺でご容赦を・・・
されてなかったらスレで言ってもらえれば色々調べてみたいと思いますが、今日のところはこの辺でご容赦を・・・