骷髅洞穴/矿石分布
阅读
2025-02-23更新
最新编辑:09-C
阅读:
更新日期:2025-02-23
最新编辑:09-C
小型的可采集的石块和矿点会在矿层的所有位置随机出现,也有小概率生成较为聚集的团块。它们有着不同的分布方式。[1][2] 平均来说,在每日运气为0的时候,每层会生成不到0.67个团块,而在最大每日运气时每层会生成接近1个。团块有25%的概率为石头矿点,1.5%的概率为铱矿矿点,73.5%的概率为金矿矿点。
随机石块的分布更加复杂,和矿层深度有着密切的联系,最好分步骤来理解。
如果接了齐先生的任务使得矿井变为困难模式,则有小概率使得石块被替换为放射性矿石矿点。它的生成和运气的值关联极大,特殊的魅力增加的每日运气等效于多下192层,而在最差的运气时需要下550层才可能刷出放射性矿石矿点。运气buff增益同样也会对此造成影响,每1级增益等效于多下15层。在进行替换时,放射性矿石矿点会替换下面所说的任意一种矿点。
石块变为金属矿点(铜矿石,铁矿石,黄金矿石,铱矿石)的概率随着层数的下降会有不同的变化,在第1层时为2%,到100层时快速上升到16%,然后在1780层时上升至100%。运气对这一概率或分布的占比没有影响。铜和铁矿点具有相同的分布。从2100层起,矿井里就只会有金和铱矿点,而到5700层时就只会剩下铱矿点。
如果一个石块没有变成金属矿点,那么它有概率变为宝石(钻石,绿宝石,海蓝宝石,红宝石,紫水晶,黄水晶和翡翠)矿点、神秘石矿点、紫色宝石矿点或石头矿点。这意味着随着层数的递增,因为找到金属矿点的概率不断上升,找到这些矿点的概率就会逐渐下降,超过1780层之后就找不到这些种类的矿点了。 运气和采矿等级只对神秘石矿点和紫色宝石矿点的生成有较大影响,对其他矿点的影响可以忽略不计。
对宝石矿点来说,钻石比一般的宝石略微稀有一些,而翡翠比一般的宝石稀有1倍。找到宝石矿点的概率在一开始会上升,在大约到800层时达到最大概率,约为0.35%,接下来会逐渐下降。
对于石头矿点,在1层时其生成概率最高(最好的情况下,石头矿点9.73%,神秘石0.005%,紫色宝石矿点0.059%),在金属矿点生成概率上升时会石头矿点生成概率会对应下降。
在沙漠节时,矿点的生成会有所变化,允许卡利科三花蛋矿点生成。这会在下面所述的矿点团块和金属矿点生成的部分涉及到。
代码细节
生成矿层的代码可在StardewValley.Locations.MineShaft::populateLevel
里找到。在生成矿层之前,它先定义stoneChance(石块生成概率,双浮点精度数,下同)变量,为10(含)~30(不含),以及gemStoneChance(宝石生成概率)为0.003。接下来游戏调用StardewValley.Locations.MineShaft::adjustLevelChances
处的代码,进行一系列的判定,包括将感染层找到石块的概率设为0,并将找到宝石矿点的概率除以2[3]。
在这之后,游戏会在矿层的每一格尝试生成石块,游戏使用StardewValley.Locations.MineShaft::createLitterObject
处的代码决定通过了判定后生成的石块的种类。接着游戏从上面调用生成宝石矿点的概率,并且设定紫色宝石矿点的概率为0.001,神秘石矿点的概率为0.00005。在一次生成的过程中,如果没有添加任何石块,则会有概率生成大型物体,有2种外形不同的2×2大小的大石块可以被生成。
在遍历了每一个格子并完成了其他一些判定后,游戏会尝试调用StardewValley.Locations.MineShaft::tryToAddOreClumps
处的代码来生成金属矿点,但是要求矿井层数不能被5整除,也不能是宝箱层。
矿点团块(矿脉)
游戏里StardewValley.Locations.MineShaft::tryToAddOreClumps
[4] 代码的功能只会在一个判定后启用,这个判定是生成一个(0~1之间的)随机数,如果小于0.55加上每日运气的值,则判定为成功。这意味着基础概率为55%,在有特殊的魅力[5]时最高概率为67.5%。在这次尝试成功之后,会继续产生随机数,如果这个随机数大于0.25加上每日运气的值,则可以继续判定直到失败为止。这意味着这会有1次固定机会,加上25%的概率(最大运气情况下为37.5%的概率)获得额外的机会。
这样在期望上可以获得4/3次(每日运气为0)到1.6次的额外判定机会,算上先前的判定,则这个期望值为11/15次(每日运气为0)到1.08次。
然而,每次判定时会寻找矿点周边任意的一格,只有这一格为空时才能添加额外的矿点,使得期望比上述的值略低。
游戏会调用StardewValley.Locations.MineShaft::getAppropriateOre
[6]处的代码来确定添加的矿点的种类,在返回函数值前有25%的概率(非困难模式下)将矿点种类设为668或670,这是两种石头矿点的代码。
另外,游戏首先会检测是否处于沙漠节之中。如果是的话,会有(25+三花蛋分数/20)%的概率将矿点替换为三花蛋矿点。如果这一判定失败,则将矿点变为金矿点,有2%的概率再变为铱矿点。
当不处于沙漠节时,最终的结果是石头矿点有25%的概率生成,铱矿点1.5%,金矿点73.5%。
随机矿点替换
放射性矿石矿点
游戏首先会尝试生成放射性矿石矿点,进行判定时使用的代码见下:
if (this.GetAdditionalDifficulty() > 0 && this.mineLevel % 5 != 0 && this.mineRandom.NextDouble() < (double)this.GetAdditionalDifficulty() * 0.001 + (double)((float)this.mineLevel / 100000f) + Game1.player.team.AverageDailyLuck() / 13.0 + Game1.player.team.AverageLuckLevel() * 0.0001500000071246177)
矿井的难度可以通过启用矿井入口处的雕像或者接取齐先生的困难矿井任务来调整。这一共提供了三种可能性,正常(均不启用,0),启用其一(1),二者皆启用(2)。在难度为0时,放射性矿石矿点不会生成。
特殊的魅力提供的每日运气增益(0.025)等效于多下192.3层,而每1点运气增益大约等效于多下15层。额外的难度增益(二者皆启用相较于启用其一而言)等效于多下100层。
在难度系数为1,拥有最大每日运气(0.125)和运气增益(+13)的情况下,在第1层有1.38%的石块会被替换为放射性矿石矿点,到第99层时会上升到1.48%。如果是最坏的每日运气(-0.1),则需要到551层才可能刷出放射性矿石矿点。另外,放射性矿石矿点也不能在能被5整除的层数生成。
这意味着在理论上,拥有最大运气且难度系数为2时,从98524层起,除了能被5整除的层数外,矿井里将只能生成放射性矿石矿点。在运气最差的时候则需要到100390层。达到这些层数你需要跳过采石场矿井,其层数为77257层。
金属矿点
在这之后,游戏会分定不同的区域,对沙漠矿而言,游戏会把生成的石块设定为32,38,40,42(四种可能性概率均等),然后根据不同的情况进行计算。在不同的层数,chanceForOre(矿点生成概率)会有2种不同的概率公式,会使用包含最小值的计算,通过与游戏随机生成的双精度浮点数比较大小,最终分出4个不同的情况,其代码见下:
double chanceForOre = 0.02 + (double)skullCavernMineLevel * 0.0005;
if (this.mineLevel >= 130) {
chanceForOre += 0.01 * (double)((float)(Math.Min(100, skullCavernMineLevel) - 10) / 10f);
}
公式最终可以分为3段,在1~10层公式为0.02+沙漠矿层数×0.0005
,在10~100层公式为0.01+沙漠矿层数×0.0015
,100层以下公式为0.11+沙漠矿层数×0.0005
。这意味着每下一层,矿点生成的概率就增加0.05%,除了在11~100层,每下一层可以使矿点生成的概率增加0.15%。当下到1780层时,概率上升到了100%,由此产生了第4种情况。在前两种情况交界的第10层,用两种公式算出来的概率是一样的,因此这个函数是连续的。如果这一判定通过,函数将返回值设为矿点。
接下来,游戏首先判定当前是否处于沙漠节,如果是的话会有(13+三花蛋分数)%的概率将矿点变为三花蛋矿点。下面的分类讨论不会再涉及此处三花蛋的情况。在那以后,游戏将依次进行铱、金、铁、铜矿点的判定。 举个例子,如果一个石块要变为金矿矿点,它需要先通过生成矿点的判定,然后在生成铱矿矿点的判定中失败,并在生成金矿矿点的判定中成功。这意味着想要得到某一种矿点,它前面的其他种类矿点判定成功的概率必须低于100%,因此如果铱矿矿点生成的判定成功概率为100%,就不能再生成其他种类的矿点了。从默认石块变为特定种类矿点的公式如下:
铱矿矿点概率=矿点判定成功概率×铱矿矿点判定成功概率 金矿矿点概率=矿点判定成功概率×(1-铱矿矿点判定成功概率)×金矿矿点判定成功概率 铁矿矿点概率=矿点判定成功概率×(1-铱矿矿点判定成功概率)×(1-金矿矿点判定成功概率)×铁矿矿点判定成功概率 铜矿矿点概率=矿点判定成功概率×(1-铱矿矿点判定成功概率)×(1-金矿矿点判定成功概率)×(1-铁矿矿点判定成功概率)×铜矿矿点判定成功概率
各种矿点判定成功的概率由下面所示的代码定义:
double iridiumBoost = 0.0;
if (this.mineLevel >= 130) {
iridiumBoost += 0.001 * (double)((float)(skullCavernMineLevel - 10) / 10f);
}
iridiumBoost = Math.Min(iridiumBoost, 0.004);
if (skullCavernMineLevel > 100) {
iridiumBoost += (double)skullCavernMineLevel / 1000000.0;
}
double chanceForIridium = (double)Math.Min(100, skullCavernMineLevel) * (0.0003 + iridiumBoost);
double chanceForGold = 0.01 + (double)(this.mineLevel - Math.Min(150, skullCavernMineLevel)) * 0.0005;
double chanceForIron = Math.Min(0.5, 0.1 + (double)(this.mineLevel - Math.Min(200, skullCavernMineLevel)) * 0.005);
找到铱矿矿点的概率一定程度上取决于iridiumBoost(铱矿加成)变量,其分为四种可能性。在0~10层,没有额外的增益。在11~50层,这个增益的值从0逐渐增大为0.004。在50~99层,这个增益的值保持在0.004。在100层及以后,这个增益的值为0.004+0.000001×沙漠矿层数
。这使得找到铱矿矿点的概率的上升不是线性的,有5个区域;最后一个区域即为5700层以后铱矿矿点生成概率为100%的时候。金矿矿点的概率计算更为直接,初始概率为7%,在达到150层之后,会线性的上升,到2130层时概率达到100%。铁矿的初始概率为50%。额外说明,在30层时铱矿矿点会比金矿矿点更容易发现,在74层时铱矿矿点会比铁、铜矿矿点更容易发现,在677层时金矿矿点会比铁、铜矿矿点更容易发现,在1081层时铱矿矿点会比非金属矿点的石块更容易发现,在1332层时金矿矿点会比非金属矿点的石块更容易发现,在1725层时铁、铜矿矿点会比非金属矿点的石块更容易发现。
其他矿点
到现在为止,除了放射性矿点的判定以外,运气还没有参与计算,层数也只影响到了使用的矿层区域和判定可被5整除的层数的矿层生成。 然而,如果上述进行的判定如果没有返回任何矿点或石头的值,接下来进行判定的就是各种宝石矿点、暗灰色石头(石头矿点)、紫色宝石矿点和神秘石矿点。 这是根据下面一串复杂的代码完成的(为了简化,去掉了关于颜色判定的部分,并增加了一些注释):
double averageDailyLuck = Game1.player.team.AverageDailyLuck(Game1.currentLocation);
double averageMiningLevel = Game1.player.team.AverageSkillLevel(3, Game1.currentLocation);
double chanceModifier = averageDailyLuck + averageMiningLevel * 0.005;
//钻石矿点
if (this.mineLevel > 50 && this.mineRandom.NextDouble() < 0.00025 + (double)this.mineLevel / 120000.0 + 0.0005 * chanceModifier / 2.0) {
whichStone = 2;
stoneHealth = 10;
}
//宝石矿点
else if (gemStoneChance != 0.0 && this.mineRandom.NextDouble() < gemStoneChance + gemStoneChance * chanceModifier + (double)this.mineLevel / 24000.0) {
return new Object(tile, this.getRandomGemRichStoneForThisLevel(this.mineLevel), "Stone", canBeSetDown: true, canBeGrabbed: false, isHoedirt: false, isSpawnedObject: false) {
MinutesUntilReady = 5
};
}
//紫色宝石矿点
if (this.mineRandom.NextDouble() < chanceForPurpleStone / 2.0 + chanceForPurpleStone * averageMiningLevel * 0.008 + chanceForPurpleStone * (averageDailyLuck / 2.0)) {
whichStone = 44;
}
//神秘石矿点
if (this.mineLevel > 100 && this.mineRandom.NextDouble() < chanceForMysticStone + chanceForMysticStone * averageMiningLevel * 0.008 + chanceForMysticStone * (averageDailyLuck / 2.0)) {
whichStone = 46;
}
whichStone += whichStone % 2;
//暗灰色石头(石头矿点)
if (this.mineRandom.NextDouble() < 0.1 && this.getMineArea() != 40) {
return new Object(tile, (this.mineRandom.NextDouble() < 0.5) ? 668 : 670, "Stone", canBeSetDown: true, canBeGrabbed: false, isHoedirt: false, isSpawnedObject: false)
{
MinutesUntilReady = 2,
Flipped = (this.mineRandom.NextDouble() < 0.5)
};
}
return new Object(tile, whichStone, "Stone", canBeSetDown: true, canBeGrabbed: false, isHoedirt: false, isSpawnedObject: false) {
MinutesUntilReady = stoneHealth
};
在全面的分析之前,值得首先提一下运气的影响。钻石和宝石都使用chanceModifier
变量进行概率的调整。每日运气的值为-0.1~0.125(拥有特殊的魅力),采矿等级为0~14级,如此chanceModifier的取值范围即为-0.1~0.195。对于钻石而言,上述变量的值要乘以0.0005然后再除以2,使得其取值范围为-0.0025%~0.004875%,最值差等效于多下8.85层。对于每日运气最大(拥有特殊的魅力)和10级采矿的玩家,最值差只有0.005%,等效于多下6.6层。这和理应得到的在1层,运气为0,采矿技能为0级时的基础概率0.126%相比,只占了很小的一部分。
对于宝石矿点,最大的最值差为0.044%,而最小的则为0.033%,分别等效于多下10.62和7.92层,和1层时的基础概率0.654%也相去甚远。
紫色宝石矿点和神秘石矿点的概率计算并不直接使用层数这一参数计算。这时每日运气的最值差(实际参与计算的是每日运气除以2得到的值乘以默认概率,最值差为0.1125倍默认概率)占基础概率(0.5倍默认概率)的比重就大得多了,影响的量超过了20%,使得生成的概率更大程度上取决于运气。同理,14级采矿(相较于0级的最值差)的贡献为0.112倍默认概率,也超过了10%,但需要增益得到的4级采矿只占了0.032倍默认概率,相对而言不那么重要。对于神秘石矿点而言,运气对其概率的贡献超过了10%,而采矿等级的贡献值相对较少,这和紫色宝石矿点是类似的。
通过考虑输出的逻辑可以更好的理解这一点。第一种输出的可能性是未通过钻石矿点的判定但通过了宝石矿点的判定。第二种输出的可能性是上述判定失败,但通过了暗灰色石头(石头矿点)的判定。以此类推(接下来按神秘石矿点、紫色宝石矿点、钻石矿点的顺序判定,如果都失败就输出普通石头)。可用下面的伪代码来描述这一过程:
if (!diamondCheck && gemCheck){ return gem } if (stoneCheck) { return grey rock } if (mysticCheck) { return mystic stone } if (purpleCheck) { return gem node } if (diamondCheck) { return diamond } return rock
然而,此处钻石矿点的判定被使用了两次,你不能简单的认为是进行了两次是否可以生成钻石的判定(概率不是简单的乘以2),这两次判定可能同时成功或同时失败,使得计算变得更加复杂。这其中最容易理解的是宝石矿点的生成概率。为了生成宝石矿点,前面金属矿点的生成需要失败,钻石矿点的生成也要失败,同时宝石矿点的判定需要成功,这实际上等于:
(1-金属矿点判定成功概率)×(1-钻石矿点判定成功概率)×宝石矿点判定成功概率。
另外,游戏会调用MineShaft::getRandomGemRichStoneForThisLevel
[7]处的代码决定宝石矿点的具体宝石种类。其内容如下:
int whichGem = this.mineRandom.Next(59, 70);
whichGem += whichGem % 2;
这里会随机选择59(含)~70(不含)之间的一个整数,如果是奇数则加1。效果就是从60~70中随机选择一个偶数,而60~68之间的偶数被选中的概率相同,选中70的概率是前面各个偶数的一半(此处不再赘述这是为什么,自己推演一下便易得这一结论)。因此代码为70的翡翠生成的概率就是其他宝石(绿宝石,海蓝宝石,红宝石,紫水晶,黄水晶)的一半,也可以参考下面的公式:
翡翠概率=(1-钻石矿点判定成功概率)×宝石概率/11 其他宝石概率=(1-钻石矿点判定成功概率)×宝石概率×2/11
不生成宝石矿点并生成其他物体(除了钻石)的概率则等于:
钻石矿点判定成功概率+(1-钻石矿点判定成功概率)×(1-宝石矿点判定成功概率),即1-(1- 钻石矿点判定成功概率)×宝石矿点判定成功概率)
接下来依次判定剩下的三种,其概率公式如下:
石头矿点概率=(1-(1- 钻石矿点判定成功概率)×宝石矿点判定成功概率))×石头矿点判定成功概率 神秘石矿点概率=(1-(1- 钻石矿点判定成功概率)×宝石矿点判定成功概率))×(1-石头矿点判定成功概率)×神秘石矿点判定成功概率 紫色宝石矿点概率=(1-(1- 钻石矿点判定成功概率)×宝石矿点判定成功概率))×(1-石头矿点判定成功概率)×(1-神秘石矿点判定成功概率)×紫色宝石矿点判定成功概率
接下来要考虑的是钻石的概率。当钻石矿点判定成功时,会跳过宝石矿点的判定过程,因此计算中不涉及宝石矿点的概率值。由此可得,如果要生成钻石,就必须通过钻石矿点的判定(同时跳过了宝石矿点的判定),然后其他所有判定都要失败,其公式如下:
钻石矿点概率=钻石矿点判定成功概率×(1-紫色宝石矿点判定成功概率)×(1-神秘石矿点判定成功概率)×(1-石头矿点判定成功概率)
尽管以一种完全不同的方式计算,但找到钻石矿点和找到其他任何一种特定宝石矿点的概率都是很接近的。最后还有一种可能,是生成普通石头。计算时可以认为是与其他情况都互斥的可能性,但为了完整性,它仍然需要经过每一次检查(且都失败),其概率如下:
普通石头概率=(1-钻石矿点判定成功概率)×(1-宝石矿点判定成功概率)×(1-紫色宝石矿点判定成功概率)×(1-神秘石矿点判定成功概率)×(1-石头矿点判定成功概率)
因为这些判定之间并不独立,理论上可以出现找到某种物体的概率提高的同时降低找到其他物体的概率的情况。可以观察到,在100层之下,找到神秘石矿点的概率上升的同时会减少找到宝石矿点和紫色宝石矿点的概率。另外,出于运气和采矿等级(的提高)导致找到贵重物体矿点的概率上升也会导致找到石头矿点和普通石头的概率下降,但不会影响同种的物体。例如,高的每日运气会同时提高你找到钻石、宝石、神秘石和紫色宝石矿点的概率,并同时降低你找到石头矿点和普通石头的概率。
从普通石块中获得矿石
如果一块普通石块被生成,仍有机会在击破它时得到矿石。有4种普通石块可以被生成,它们生成的概率均等。当你击破普通石块时,StardewValley.Locations.MineShaft::checkStoneForItems
处的代码会调用StardewValley.Locations.MineShaft::getOreIndexForLevel
处的参数来进行掉落矿石的判定,关键部分的代码见下:[8]
double chanceModifier = who.DailyLuck / 2.0 + (double)who.MiningLevel * 0.005 + (double)who.LuckLevel * 0.001;
double oreModifier = ((tileIndexOfStone == 40 || tileIndexOfStone == 42) ? 1.2 : 0.8);
if (r.NextDouble() < 0.05 * (1.0 + chanceModifier) * oreModifier) {
if (r.NextDouble() < 0.25 * (double)((!who.professions.Contains(21)) ? 1 : 2)) {
Game1.createObjectDebris(382, x, y, who.UniqueMultiplayerID, this); //煤炭
}
Game1.createObjectDebris(this.getOreIndexForLevel(this.mineLevel, r), x, y, who.UniqueMultiplayerID, this);//矿石
} else if (r.NextDouble() < 0.5) {
Game1.createDebris(14, x, y, 1, this);
}
总的来说,从普通石块里找到额外产出的概率最低为5.1%,最高为5.7%。其中有47.45%~47.15%的概率找到的为石头。如果产出的为矿石,则有25%的概率可以获得煤炭,如果有勘探者职业则概率翻倍。这使得从普通石头中获得煤炭的概率大约为1%。
然后游戏调用StardewValley.Locations.MineShaft::getOreIndexForLevel
处的代码来决定可以获得什么矿石,其代码见下:[9]
if (r.NextDouble() < 0.01 + (double)((float)(mineLevel - 120) / 2000f)) {
return 386; //铱矿石
}
if (!(r.NextDouble() < 0.75)) {
if (!(r.NextDouble() < 0.75)) {
return 378; //铜矿石
}
return 380; //铁矿石
}
return 384; //黄金矿石
在第1层获得铱矿的概率为1.05%,然后线性的上升直到到了1980层这个概率达到了100%。如果和从矿点中得到铱矿石的概率一起考虑,那么在第1层通过击破石块获得铱矿石的概率在0.0536%~0.060%之间。如果得到的矿石不是铱矿石,则有75%的概率得到金矿石,18.75%的概率得到铁矿石,6.25%的概率得到铜矿石。
Desmos图表链接
你可以点击下面的这些超链接浏览对应的图表,有一些参数已经预设好了。
Desmos 网址链接 | 内容简介 |
---|---|
https://www.desmos.com/calculator/uwi9hfdjvv | 金属矿点分布与层数的关系图 |
https://www.desmos.com/calculator/iopaqgwsvs | 宝石矿点、紫色宝石矿点、暗灰色石头(石头矿点)和神秘石矿点分布与层数的关系图 为了确保所有曲线能在同一个图表中显示,缩放了部分参数。 |
https://www.desmos.com/calculator/ngyjsb1b0m | 每日运气(包括特殊的魅力)对各种宝石生成概率的加成,标准化为相对值 |
https://www.desmos.com/calculator/72efyqudvu | 采矿等级(包括了等级增益)对各种宝石生成概率的加成,标准化为相对值 |
当不被用作X轴时,每日运气、采矿等级和层数的数值可在左侧的滑动条处操纵并被用于计算。每日运气、采矿等级和层数的初始值分别为0.025,10和100。
历史
引用
- ↑ 参考游戏代码中 MineShaft::populateLevel 部分
- ↑ 参考游戏代码中 MineShaft::createLitterObject 部分
- ↑ 参考游戏代码中 MineShaft::adjustLevelChances 部分
- ↑ 参考游戏代码中 MineShaft::tryToAddOreClumps 部分
- ↑ 参考游戏代码中 FarmerTeam::AverageDailyLuck和Game1::_newDayAfterFade 部分
- ↑ 参考游戏代码中 FarmerTeam::getAppropriateOre 部分
- ↑ 参考游戏代码中 MineShaft::getRandomGemRichStoneForThisLevel 部分
- ↑ 参考游戏代码中 MineShaft::checkStoneForItems 部分
- ↑ 参考游戏代码中 MineShaft::getOreIndexForLevel 部分