Terraria Mod開発の話

暇なときのメモ書き

鉱石を追加しよう

テラリアには土ブロック、石ブロック、金鉱石、プラットフォーム、家具...様々なタイルがあります。美味しいものも
今回は鉱石に焦点を絞って、テクスチャにも触れていきます。

    public class BlogOreTile : ModTile
    {
        public override void SetDefaults()
        {
            Main.tileSolid[Type] = true; //通り抜けとか上に登ったりとか
            Main.tileMergeDirt[Type] = true; //草を土に変えるかとか
            Main.tileSolidTop[Type] = false; //テーブルとかプラットフォームとか上に乗れるけどすり抜けられるやつ
            Main.tileNoAttach[Type] = true; //松明とかをブロックに置けないようにする
            Main.tileLavaDeath[Type] = false; //マグマに触れた時の破壊
            Main.tileBlockLight[Type] = true; //光を遮るか
            Main.tileSpelunker[Type] = true; //スペランカーポーションで光るか
            dustType = DustID.Iron; //生成するダストの種類
            drop = mod.ItemType<BlogOreItem>(); //壊したときに出るアイテム
            ModTranslation name = CreateMapEntryName();
            name.SetDefault("Blog Ore");
            AddMapEntry(new Microsoft.Xna.Framework.Color(200, 200, 200), name); //この上の2行と合わせてMapで名前を表示する、name.SetDefault内のを変えると名前を変えられる
            mineResist = 1.5f; //ダンジョンとかの掘れるけど固いブロック
            minPick = 20; //掘るのに必要なピッケルパワー
        }

        public override bool CanExplode(int i, int j)
        {
            return Main.hardMode;
        }

        public override void NumDust(int i, int j, bool fail, ref int num)
        {
            num = fail ? 1 : 3;
        }
    }

まずは、タイルの通り抜けの有無ですが、Main.tileSolid[Type]をtrueにすることで通り抜け不可な土ブロックのようなものになります。
鉱石を追加するうえで重要なのは、スペランカーポーションで光るようにしたりするところですね、これはMain.tileSpelunkerになります。
このパラメーター一つでマジックランタンとかMoonlordの目玉ペットとかも反応するようになったりします。
dustTypeにはひとまず鉄を入れてあります。これはタイルを掘る時に出るダスト(エフェクト)です。Mod追加のものを使いたいならば、mod.DustType("BlogModDust")とでもしておいてください。
一応、mod.DustType()という形を推奨しておきます。いずれ詳しく書くので今は読み流してください。
鉱石なのでマップで名前が出るようにしたいです。AddMapEntryで名前とマップ上での色を渡します。
mineRegistで固いブロックの表現ができます。minPickで最低ピッケルパワーの定義ができます。
鉱石なのでその入手段階に応じて決めるべきです。
ちなみに、ピッケルパワーで掘る回数が決まるので(100%で壊れる)、掘るスピードと合わせてバランス調整を考えるべきです。
CanExplode()で爆破可/不可を設定できます。例ではハード前は不可、ハード後は可です。
NumDustは生成するダストの数を返します。
この?と:の分はif文で、?の前を条件、その次にtrueの処理、:を挟んでfalseの処理となっています。
例ではtileNoAttachをtrueにしていますが、これをfalseにしておいてください。効果を実感してもらうためのものです(本来はテーブルとかそういうものにつけます)
f:id:kodamamiyabi:20180224014523p:plainf:id:kodamamiyabi:20180224014557p:plain
テクスチャは、一か所につき3種類あります。その箇所は基本的に土との親和性を考えなければ(ガラスなど)20種類、考えるならば20+37の57種類です。
BarやWoodenBeam等のテクスチャについては別の記事で紹介します。
一枚目の画像では全ての出るパターンを網羅しています。
自分で確認しやすいようにテクスチャを作って、自分で確認しながら調整しましょう。もし、テクスチャを描くならば繋ぎ目を確認して、どのパーツがどのように繋がるかを考えて描くといいです。
できたテクスチャはBlogOreTileとして保存します。クラス名と同じです。
さて、これでタイルの追加はできました。あとは何をしますか?アイテムの追加です。
一休みしてからみていきましょう。

    public class BlogOreItem : ModItem
    {
        public override void SetStaticDefaults()
        {
            DisplayName.SetDefault("Blog Ore");
        }
        public override void SetDefaults()
        {
            item.width = 12;
            item.height = 12;
            item.maxStack = 999;
            item.useTurn = true;
            item.autoReuse = true;
            item.useAnimation = 15;
            item.useTime = 10;
            item.useStyle = 1;
            item.consumable = true;
            item.createTile = mod.TileType<BlogOreTile>();
        }
        public override void AddRecipes()
        {
            ModRecipe recipe = new ModRecipe(mod);
            recipe.AddIngredient(ItemID.DirtBlock, 1);
            recipe.SetResult(this, 1);
            recipe.AddRecipe();
        }
    }

まずはアイテム名の設定から、これは消費アイテムなのでconsumableをtrueにします。
そしてcreateTileにBlogOreTileを入れて終わり。ね?簡単でしょ?
これはどこに置いても(アイテムと一緒でも、鉱石タイルと同じでも)いいのですが、この後用意する画像を置いたところと同じ場所に置く必要があるので注意してください。
f:id:kodamamiyabi:20180224020201p:plain
これもクラス名と同じで...BlogOreItemとします。
ひとまず土ブロックをハンドクラフトで作れるようにしました。
色々パラメーターを変更して遊んでみてください。遊びからMod開発は始まります。

剣をカスタマイズしよう

今回は、勝手に追加されている剣のアイコンのアイテムをカスタマイズします。
前回作った自分のModフォルダのItemsに入っている.csファイルを開きましょう。
今回は、Mod名をBlogMod、アイテム名をBlogSwordという名前にしてあります。
プログラミングの入門的なのをざっくり眺めて行くと楽かもしれません、めんどくさい(しあまり関係のない)説明は飛ばします。

public class BlogSword : ModItem
{
	public override void SetStaticDefaults()
	{
		DisplayName.SetDefault("Ultimate Blog Sword"); //名前を自由に変えられる
		Tooltip.SetDefault("Super cool weapon."); //ツールチップも
	}
	public override void SetDefaults()
	{
		item.damage = 270; //ダメージ
		item.crit = 33;
		item.melee = true; //近接かどうか
		item.width = 40; //幅
		item.height = 40; //高さ
		item.useTime = 20; //振り速度
		item.useAnimation = 20; //振りアニメーションの時間 思惑がないならuseTimeと同じにすること
		item.useStyle = 1; //剣を振るタイプ、1~5まであるので試そう
		item.knockBack = 6; //ノックバック
		item.value = 10000; //買値
		item.rare = 2; //レアリティ、文字色と溶岩焼けに影響
		item.UseSound = SoundID.Item1; //振る音
		item.autoReuse = true; //自動振り
		item.channel = false; //弾をコントロールできる魔法杖とかで使う、使用している状態でキープ(アニメーションが終わっても使用中になる)
		item.noMelee = false; //trueにするとアイテムの振りで当たり判定がなくなる
		item.shoot = ProjectileID.TerraBeam; //撃ちたいプロジェクタイルをIDで入れる
		item.shootSpeed = 12f; //バニラAIを使う時は基本的に最大速度が16fになる、それ以上でも設定可
	}
}

最初にpublic override SetStaticDefault()ですが、これはアイテムがModLoaderに読み込まれた時に使われます。用途は名前の変更とか。ダブルクオーテーション"で囲まれている部分を適当な名前に変えれば変わります。Tooltip.SetDefaultも同様に中身を変えられます。gelのIt looks tasty!とかあんな感じで、アイテムの使い方とか注意点を書くなら書くで。
んで、SetDefaults()ですがこれが本日のメインディッシュです。アイテムが生成された時に読み込まれます。色々変えて試してみましょう。item.damageを適当に10万なり100万なりにすればムンロをワンパンできる剣が誕生します。とてもつよい。バランスなんて知らん
わかりにくいのがitem.useTimeとitem.useAnimationで、useTimeは剣で言う振り速度、銃の連射間隔で1/60単位です。useAnimationは終わるまで武器を使い続けます。具体的には、Clockwork AssaltRifleとかは一回のクリックで3回撃ちますよね。あんな感じです。AnimationをuseTimeが二回収まって余りが出るようにすればできます。

Item.useSoundは使った時の音で、nullもしくは設定しない(行ごと消す)ことで消えます。
item.widthとitem.heightはそれぞれアイテムの幅、高さで、これらはテクスチャの読み込み、当たり判定(攻撃時とワールドに落ちている時)とかに影響します。
さいつよの剣は出来ました、が振った時にエフェクトがありません!のでBlogSword内に下のを追加します。

public override void MeleeEffects(Player player, Rectangle hitbox)
        {
            if (Main.rand.Next(3) == 0) // 1 / 3の確率
            {
                Dust.NewDust(new Vector2(hitbox.X, hitbox.Y), hitbox.Width, hitbox.Height, DustID.Fire); //ダストを生成します
            }
        }

テラリアのエフェクトは大体ダストで管理されているので、これらを生成します。
さらに詳細にカスタマイズするには、
それから、肝心なもの…弾を出しましょう。
ひとまず、TerraBladeと同じ弾を出します。
item.shootに出したい弾のIDを代入します。それから、item.shootSpeedにも同様に適当な数値を入れておきましょう。
いちいちソースコードを見た人がプロジェクタイルのIDから内容を追うのは非効率的なので、Terraria.IDを使います。Terraria.ID.ProjectileID.をitem.shootに代入します。それだけであとは勝手にやってくれます。これで魔法剣の完成です。
SetDefault()内に

item.shoot = ProjectileID.TerraBeam;
item.shootSpeed = 12f;

さて、コードを書き換えてもそれだけじゃ反映されません。ビルドしましょう。
タイトルからMod Sourses、一覧から自分のModを探して、Build + Reloadします。これで反映されました。
新キャラ新ワールドを作るなりで試しましょう。
f:id:kodamamiyabi:20180202214144j:plain
f:id:kodamamiyabi:20180202214154j:plain

基本的に数値を書き換える→足りない所をExampleModとかから引っ張ってくるとかで解決します。
ってことで最後にサイトとかの紹介。
forums.terraria.org
Mod開発に関する公式のガイドラインです。絶対に読んでください。

Home · blushiemagic/tModLoader Wiki · GitHub
tModLoaderのWikiです。これに大体書いてあるんで正直このブログはいらなかったり。
最後に、テラリアのソースコードを読みましょう。方法は説明しませんが色々あるんで、ソースコードを手に入れたら作りたいものにバニラで近いアイテムを探して、それの処理を見てみると参考になります。
コピペでもできるんであとは名前をわかりやすく変えたりとか色々やって、後から見る自分が困らないようにしましょう。

TerrariaでMod開発を始めよう

Steam版Terraria Terraria でtModLoaderを使用してMod開発を行う方法とか仕様とか書いたり。

持っていない人は買ってラスボスまで倒してからModを始めましょう。

VisualStudio等の統合開発環境があると楽です。 言語はC#ですね。

さて、まず最初にtModLoaderを導入しましょう。 これがないと始まりません。 まず、Steamのスレッド Standalone - [1.3] tModLoader - A Modding API | Terraria Community Forums に行って、適当に下に送るとf:id:kodamamiyabi:20180201175036p:plain Downloadってのがあります。 ここで今赤い丸をつけてあるWindowsをクリックするとダウンロードが始まります。

ダウンロードしている間に、バニラTerraria(Modを導入していないものを慣例でバニラと呼びます)のコピーを作成します。 念のためにフォルダを分けているだけなので他の導入でも大丈夫です(インストーラー使用とか) アプリのSteamを開いて、ライブラリにあるTerrariaの上で右クリック、 f:id:kodamamiyabi:20180201180458p:plain プロパティを選択してf:id:kodamamiyabi:20180201180652p:plain

ローカルファイルタブのローカルファイルを閲覧をクリック、f:id:kodamamiyabi:20180201181400p:plain 一個戻って(commonを押す)、Terrariaフォルダをコピーして貼り付け、f:id:kodamamiyabi:20180201182440p:plain 名前をtModLoaderとかに変更します。 そうしたら先ほどダウンロードしたのを解凍して中身を全部コピー、tModLoaderの方に全部貼り付けます。 これで導入は完了です。一回だけMod入りTerraria.exeを起動しておきましょう。

次に、さっきのスレッド Standalone - [1.3] tModLoader - A Modding API | Terraria Community Forumsに行って、ExampleModをダウンロードします。f:id:kodamamiyabi:20180201183412p:plain 上の方の赤い丸が付いているリンクを踏むと、ダウンロードが始まります。 その下の赤い丸のは、自分でModを作る時のものです。 f:id:kodamamiyabi:20180201183924p:plain Mod Nameには全て英語で、先頭を大文字にして作りたいMod名を入れてください。記号とかは使えません。

Mod display nameにはModの表示名を、これは記号OKです。ただ、テラリアのフォントが対応してないとその部分表示が*になります。

1st Item's nameにもMod名と同様に英語で記号不可

Mod Authorには自分のSteamでのユーザー名でも入れておきましょう。 で、Generate Mod Skeletonを押すとダウンロードされます。

そうしたらこれを解凍して、フォルダごと

ドキュメント\My Games\Terraria\ModLoader\Mod Sourcesに移動しましょう。もしわからなければTerrariaでワールドに入って、F1を押して、Open FolderすればTerraria/CapturesかTerraria/ModLoader/Capturesに出るんでそこから行ってください。 これで最低限は終わりです。

ここからはVisual Studio前提になりますが、自分のModの.csprojファイルを開いて、Solution explorerからReferenceを展開します。(画像はExampleMod)f:id:kodamamiyabi:20180201185926p:plain

そうしたら、欠けているRelogicとTerrariaを一回消して、Add ReferenceからBrowse、さっきのtModLoader本体が入っているところのRelogic.Native.dllとTerraria.exeを指定してやります。 これで開発環境は完成しました。お疲れ様でした。