MENU

【Elin】神の像の生成【コード解析ベース】

Elin(エリン)、神の像関連のゲーム解析から得られた情報です。

主に神の像探し、神の像集めの効率化について調査を行いました。

最終更新:2026/1/5

目次

今回わかったこと

神の像の生成
  • 祠生成時に1/15で神像が生成される
  • シード制になっており、神像が出るタイミングは常に同じ
  • 1エリアに最大3個の祠が生成される
  • 善人フィートは祠の生成率を1.1倍にする(神像のみでなく祠全般)
  • 野外、ダンジョンで祠が出現する可能性があ
  • ダンジョン内では特に祠が出やすい
    • マップのデフォルト指定:shrineChance = 0
    • ダンジョン:shrineChance = 0.35
    • 野外:shrineChance = 0.04

ちなみにBigDaddyChanceというのもあり、これはデフォルト0、屋外0.02、ダンジョン0.08です。

以下、該当コード部分を提示しながら解説します。

祠生成チャンス

float num = ShrineChance * (EClass.pc.HasElement(1270) ? 1.1f : 1f);
for (int i = 0; i < 3; i++)
{
  Rand.SetSeed(base.uid + i);
  if (num <= EClass.rndf(1f))
  {
    continue;
  }
  
  祠の生成処理
  ......

祠の出現率を取得します。ダンジョンマップの場合は0.35、野外は0.04、それ以外は0です。

祠の出現率はプレイヤーに善人フィートがある場合1.1倍されます。(ダンジョンなら0.385、屋外なら0.044)

そして、forループを3回します。(祠の生成は1マップにつき3個が上限)

forループ内では、0~1までの数字が祠の出現率を上回っていた場合、祠の生成処理に移行します。

この祠出現のための乱数生成ですが、マップuidでシード固定されており、階段を降りる直前にセーブ&ロードを繰り返しても祠の生成数が変わらないように作られています。

空きスペース捜索

Point randomSpace = EClass._map.GetRandomSpace(3, 3);
if (randomSpace == null)
{
  continue;
}
randomSpace.x++;
randomSpace.z++;
if (randomSpace.HasThing || randomSpace.HasChara)
{
  continue;
}
randomSpace.SetObj();

マップ内のランダムな位置を指定します。

ランダム位置に空きスペースがなければ、あるいは生成予定先に空間がなければ処理を中断します。

生成予定先に空間があれば、祠の生成処理に移行します。

神像 or 祠判定

Rand.SetSeed(EClass.player.seedShrine);
EClass.player.seedShrine++;
if (EClass.rnd(EClass.debug.test ? 2 : 15) == 0)
{
  EClass._zone.AddCard(ThingGen.Create("pedestal_power"), randomSpace).Install();			         EClass._zone.AddCard(ThingGen.Create(EClass.gamedata.godStatues.RandomItemWeighted((GodStatueData a) => a.chance).idThing, -1, DangerLv), randomSpace).Install();
}
  else
  {
    EClass._zone.AddCard(ThingGen.Create("statue_power", -1, DangerLv), randomSpace).Install().SetRandomDir();
  }
}
Rand.SetSeed();

プレイヤーの持っているseedShrineという変数を取得し、それをベースに乱数シード固定します。
その後、seedShrineを1加算し、乱数テーブルを進めます。

seedShrineでシード固定された乱数を発生させ、1/15で神の像を生成し、それ以外の場合は祠を生成します。

また、神の像の生成は重み付き抽選されてるようです。
(おそらく生成されやすい神像、されづらい神像がある。GodStatueDataが見つけられなかったので今回は生成率は未調査)

まとめ:善人フィートを付けて広いダンジョンを探索

マップに祠が生成されるかはマップのuidで乱数シードが固定され、祠が神像になるかは祠生成時にテーブルが1個進む乱数テーブル式になっています。

また、祠の生成チャンスはダンジョン内部が最も高く、35%(善人で38.5%)が3回抽選されます。

生成される祠や神像はシード決定されておらず、ランダム抽選です。

祠の生成時、マップ内のランダムな場所に配置する処理があり、場所がない場合は配置処理がスキップされてしまうため、広いマップのほうが祠が生成されやすいです。(神の像リロで稀に配置階層がズレるのはこのため)

仕組み上seedShrineの乱数テーブルを進める必要があるため、ネフィアに潜って祠を生成しまくって乱数テーブルを進めるしか無いです。

結果としては神の像が出るネフィア階層は決まっているように見え、4階目に神の像があった場合はリロードし、3階目の階段前で停止し、階段を降りて結果を厳選…のような形式で神の像を厳選するのが良いでしょう。

おまけ:ビッグダディと進化個体チャンスも1.1倍

	public Chara TryGenerateEvolved(bool force = false, Point p = null)
	{
		float num = EvolvedChance * (EClass.pc.HasElement(1270) ? 1.1f : 1f);
		if (!force && num <= EClass.rndf(1f))
		{
			return null;
		}
		Chara chara = SpawnMob(p, SpawnSetting.Evolved());
		for (int i = 0; i < 2 + EClass.rnd(2); i++)
		{
			chara.ability.AddRandom();
		}
		chara.AddThing(chara.MakeGene(DNA.Type.Default));
		if (EClass.rnd(2) == 0)
		{
			chara.AddThing(chara.MakeGene(DNA.Type.Superior));
		}
		return chara;
	}

	public void TryGenerateBigDaddy()
	{
		if (!(BigDaddyChance * (EClass.pc.HasElement(1270) ? 1.1f : 1f) <= EClass.rndf(1f)))
		{
			int num = DangerLv * 125 / 100;
			if (num >= 30)
			{
				CardBlueprint.Set(new CardBlueprint
				{
					lv = num
				});
			}
			Chara chara = CharaGen.Create("big_daddy");
			if (EClass.pc.HasElement(1270))
			{
				chara.SetHostility(Hostility.Friend);
			}
			else if (EClass.pc.HasElement(1271))
			{
				chara.SetHostility(Hostility.Enemy);
			}
			EClass._zone.AddCard(chara, GetSpawnPos(SpawnPosition.Random, 10000));
			Msg.Say("sign_bigdaddy");
		}
	}

ビッグダディと進化モンスターの生成率も善人フィートで1.1倍です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次