集中修改选项到config,新增了readme

This commit is contained in:
AlexisinGit 2025-08-27 04:59:24 +08:00
parent 67a38ef2b7
commit 12099853c3
7 changed files with 250 additions and 59 deletions

View File

@ -1,3 +1,65 @@
#Alex端的食用教程和修改选项
在config-vanilla.json底部可以看到已经配置好的默认参数
复制一份并改名为config.json就可以使其生效之后对于参数的修改都在复制的这份config.json里进行
//修改参数的说明
//不需要额外奖励请设置为1设置为0会导致没有任何奖励
//集团声望设置为true时倒扣和掉段设置为false则不倒扣不掉段
SyndicateLoss?: boolean;
//玄骸相关
//玄骸密码总是正确不需要密码即可击杀且安魂mod不消耗耐久
nemesisAlwaysCorrect?: boolean;
//玄骸怒气倍率
extraHenchmenKilledGrineer?: number;
extraHenchmenKilledCorpus?: number;
//对于i骸是杀毒进度
extraHenchmenKilledInfestation?: number;
//玄骸解密进度倍率
extraHintProgressGrineer?: number;
extraHintProgressCorpus?: number;
//额外玄骸武器
//抽取随机的同派系武器,与当前玄骸元素属性和加成数值相同,一起发放到铸造厂
nemesisExtraWeapon?: number;
//效价融合增强,在原版1.1后额外的乘数
nemesisWeaponFuseMultiplier?: number;
//玄骸额外等级大于0的情况下猜错密码玄骸可能升更多级
nemesisExtraLevel?: number;
//任务奖励倍率
//包括生存、间谍、刺杀、赏金等,会在当前轮次奖池中额外抽取奖励
//这个倍率也会影响王境进度
extraRadomMissionDrops?: number;
//单独的王境进度倍率(与上面相乘!)
circuitProgressMuliplier?: number;
//额外堕落mod奖励
extraCorrputedMods?: number;
//额外隐藏掉落奖励(例如落银树亭的成长之力)
extraStrippedItems?: number;
//额外內源之力,九重天和漂泊者
extraPlayerSkillGainsSpace?: number;
extraPlayerSkillGainsDrifter?: number;
//核桃相关
//核桃按品质给白金的数值请在relicHelper.ts中修改
//核桃掉落倍率,开一个核桃会多开几个奖励出来
extraRelicRewards?: number;
#以下是原版readme说明
# Space Ninja Server
More information for the moment here: [https://discord.gg/PNNZ3asUuY](https://discord.gg/PNNZ3asUuY)

View File

@ -78,5 +78,32 @@
},
"dev": {
"keepVendorsExpired": false
}
},
"SyndicateLoss": false,
"nemesisAlwaysCorrect": false,
"extraHenchmenKilledGrineer": 4.0,
"extraHenchmenKilledCorpus": 1.0,
"extraHenchmenKilledInfestation": 2.0,
"extraHintProgressGrineer": 3.0,
"extraHintProgressCorpus": 1.0,
"nemesisExtraWeapon": 3,
"nemesisWeaponFuseMultiplier": 1.15,
"nemesisExtraLevel": 2,
"extraRadomMissionDrops": 3,
"circuitProgressMuliplier": 3,
"extraCorrputedMods": 3,
"extraStrippedItems": 3,
"extraPlayerSkillGainsSpace": 1.0,
"extraPlayerSkillGainsDrifter": 3,
"extraRelicRewards": 3
}

View File

@ -37,6 +37,7 @@ import {
import { logger } from "@/src/utils/logger";
import { RequestHandler } from "express";
import { Types } from "mongoose";
import { config } from "@/src/services/configService";
export const nemesisController: RequestHandler = async (req, res) => {
const account = await getAccountForRequest(req);
@ -56,9 +57,9 @@ export const nemesisController: RequestHandler = async (req, res) => {
// Upgrade destination damage value
const destDamage = 0.25 + (destFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25);
const sourceDamage = 0.25 + (sourceFingerprint.buffs[0].Value / 0x3fffffff) * (0.6 - 0.25);
// 融合系数增强
let newDamage = Math.max(destDamage, sourceDamage) * 1.25;
if (newDamage >= 0.57) {
const nemesisWeaponFuseMultiplier = config.nemesisWeaponFuseMultiplier ?? 1
let newDamage = Math.max(destDamage, sourceDamage) * 1.1 * nemesisWeaponFuseMultiplier;
if (newDamage >= 0.5794998) {
newDamage = 0.6;
}
destFingerprint.buffs[0].Value = Math.trunc(((newDamage - 0.25) / (0.6 - 0.25)) * 0x3fffffff);
@ -92,7 +93,13 @@ export const nemesisController: RequestHandler = async (req, res) => {
} else {
for (let i = 0; i != 3; ++i) {
if (body.guess[i] == passcode[i] || body.guess[i] == GUESS_WILDCARD) {
++guessResult;
// 修改点1: 对于非感染系玄骸,直接返回全部位置正确
if (config.nemesisAlwaysCorrect) {
guessResult = 3
}
else {
++guessResult;
}
}
}
}
@ -196,8 +203,10 @@ export const nemesisController: RequestHandler = async (req, res) => {
}
// Evaluate guess
const correct =
let correct =
body.guess == GUESS_WILDCARD || getNemesisPasscode(inventory.Nemesis!)[body.position] == body.guess;
// 修改点2: 非感染系玄骸无需密码即可击杀
if (config.nemesisAlwaysCorrect){correct = true}
// Update entry
const guess = decodeNemesisGuess(
@ -220,23 +229,26 @@ export const nemesisController: RequestHandler = async (req, res) => {
inventory.Nemesis!.Weakened = true;
// Subtract a charge from all requiem mods installed on parazon
const loadout = (await Loadout.findById(inventory.LoadOutPresets, "DATAKNIFE"))!;
const dataknifeLoadout = loadout.DATAKNIFE.id(
fromDbOid(inventory.CurrentLoadOutIds[LoadoutIndex.DATAKNIFE])
);
const dataknifeConfigIndex = dataknifeLoadout?.s?.mod ?? 0;
const dataknifeUpgrades = inventory.DataKnives[0].Configs[dataknifeConfigIndex].Upgrades!;
for (let i = 3; i != 6; ++i) {
//logger.debug(`subtracting a charge from ${dataknifeUpgrades[i]}`);
const upgrade = parseUpgrade(inventory, dataknifeUpgrades[i]);
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
// 修改点3安魂符耐久消耗
if (config.nemesisAlwaysCorrect){
const loadout = (await Loadout.findById(inventory.LoadOutPresets, "DATAKNIFE"))!;
const dataknifeLoadout = loadout.DATAKNIFE.id(
fromDbOid(inventory.CurrentLoadOutIds[LoadoutIndex.DATAKNIFE])
);
const dataknifeConfigIndex = dataknifeLoadout?.s?.mod ?? 0;
const dataknifeUpgrades = inventory.DataKnives[0].Configs[dataknifeConfigIndex].Upgrades!;
for (let i = 3; i != 6; ++i) {
//logger.debug(`subtracting a charge from ${dataknifeUpgrades[i]}`);
const upgrade = parseUpgrade(inventory, dataknifeUpgrades[i]);
consumeModCharge(response, inventory, upgrade, dataknifeUpgrades);
}
}
}
} else {
// Guess was incorrect, increase rank
//玄骸有概率升
const randomRank = Math.min((Math.random() > 0.5 ? 1 : 2));
response.RankIncrease = 1;
//玄骸有概率升
const randomRank = Math.floor(Math.random() * (config.nemesisExtraLevel ?? 1));
response.RankIncrease = 1 + randomRank;
const manifest = getNemesisManifest(inventory.Nemesis!.manifest);
inventory.Nemesis!.Rank = Math.min(inventory.Nemesis!.Rank + randomRank, manifest.systemIndexes.length - 1);
inventory.Nemesis!.InfNodes = getInfNodes(manifest, inventory.Nemesis!.Rank);

View File

@ -55,7 +55,6 @@ import { config } from "@/src/services/configService";
// return reward;
//};
//设置核桃按品质给白金
const premiumCreditsByRarity = {
COMMON:2,
UNCOMMON:5,
@ -77,7 +76,6 @@ export function getPlatinumByRarity(rarity: TRarity): number {
return premiumCreditsByRarity[rarity];
}
// 开启遗物循环修改的话改let i = 0; i < 3这个《3》数字改成几就是遗物给几次奖励
export const crackRelic = async (
inventory: TInventoryDatabaseDocument,
participant: IVoidTearParticipantInfo,
@ -92,11 +90,12 @@ export const crackRelic = async (
// 存储三次奖励的详细信息
// 存储奖励的详细信息
const allRewards: { type: string; itemCount: number; rarity: TRarity }[] = [];
// 循环生成三次奖励
for (let i = 0; i < 3; i++) {
// 循环生成奖励
const extraRelicReward = config.extraRelicRewards ?? 1;
for (let i = 0; i < extraRelicReward; i++) {
let weights = {...baseWeights}; // 复制基础权重
// 根据配置覆盖权重 (仅当配置开启时)

View File

@ -91,6 +91,61 @@ export interface IConfig extends IConfigRemovedOptions {
dev?: {
keepVendorsExpired?: boolean;
};
//Alex端的自定义接口
//集团声望是否倒扣和掉段设置为0则不倒扣不掉段
SyndicateLoss?: boolean;
//玄骸相关
//玄骸密码总是正确不需要密码即可击杀且安魂mod不消耗耐久
nemesisAlwaysCorrect?: boolean;
//玄骸怒气倍率
extraHenchmenKilledGrineer?: number;
extraHenchmenKilledCorpus?: number;
//对于i骸是杀毒进度
extraHenchmenKilledInfestation?: number;
//玄骸解密进度倍率
extraHintProgressGrineer?: number;
extraHintProgressCorpus?: number;
//额外玄骸武器
//抽取随机的同派系武器,与当前玄骸元素属性和加成数值相同,一起发放到铸造厂
nemesisExtraWeapon?: number;
//效价融合增强,在原版1.1后额外的乘数
nemesisWeaponFuseMultiplier?: number;
//玄骸额外等级大于0的情况下猜错密码玄骸可能升更多级
nemesisExtraLevel?: number;
//任务奖励倍率
//包括生存、间谍、刺杀、赏金等,会在当前轮次奖池中额外抽取奖励
//这个倍率也会影响王境进度
extraRadomMissionDrops?: number;
//单独的王境进度倍率(与上面相乘!)
circuitProgressMuliplier?: number;
//额外堕落mod奖励
extraCorrputedMods?: number;
//额外隐藏掉落奖励(例如落银树亭的成长之力)
extraStrippedItems?: number;
//额外內源之力,九重天和漂泊者
extraPlayerSkillGainsSpace?: number;
extraPlayerSkillGainsDrifter?: number;
//核桃相关
//核桃按品质给白金的数值请在relicHelper.ts中修改
//核桃掉落倍率,开一个核桃会多开几个奖励出来
extraRelicRewards?: number;
}
export const configRemovedOptionsKeys = [

View File

@ -1348,7 +1348,14 @@ export const addStanding = (
}
//声望变化不会为负数
syndicate.Standing += Math.max(0, gainedStanding);
const SyndicateLoss = config.SyndicateLoss ?? true;
if(SyndicateLoss){
syndicate.Standing += gainedStanding;
}
else{
syndicate.Standing += Math.max(0, gainedStanding);
}
const affiliationMod: IAffiliationMods = {
Tag: syndicateTag,
Standing: gainedStanding
@ -1362,12 +1369,13 @@ export const addStanding = (
}
} else {
while (syndicate.Standing < getMinStanding(syndicateMeta, syndicate.Title ?? 0)) {
//阻止掉段
syndicate.Title ??= 0;
//syndicate.Title -= 1;
affiliationMod.Title ??= 0;
//affiliationMod.Title -= 1;
//logger.debug(`${syndicateTag} is decreasing to title ${syndicate.Title} after applying alignment`);
if (SyndicateLoss){
syndicate.Title ??= 0;
affiliationMod.Title ??= 0;
syndicate.Title -= 1;
affiliationMod.Title -= 1;
logger.debug(`${syndicateTag} is decreasing to title ${syndicate.Title} after applying alignment`);
}
}
}
}

View File

@ -201,18 +201,35 @@ export const addMissionInventoryUpdates = async (
inventory.NemesisAbandonedRewards = inventoryUpdates.RewardInfo.NemesisAbandonedRewards;
}
if (inventoryUpdates.RewardInfo.NemesisHenchmenKills && inventory.Nemesis) {
//G玄骸额外怒气
//玄骸额外怒气
let extraHenchmenKilled = 1;
if (inventory.Nemesis.Faction == "FC_GRINEER") {
extraHenchmenKilled = 3
}
switch (inventory.Nemesis.Faction) {
case "FC_GRINEER":
extraHenchmenKilled = config.extraHenchmenKilledGrineer ?? extraHenchmenKilled;
break
case "FC_CORPUS":
extraHenchmenKilled = config.extraHenchmenKilledCorpus ?? extraHenchmenKilled;
break
case "FC_INFESTATION":
extraHenchmenKilled = config.extraHenchmenKilledInfestation ?? extraHenchmenKilled;
break
}
inventory.Nemesis.HenchmenKilled += inventoryUpdates.RewardInfo.NemesisHenchmenKills * extraHenchmenKilled;
}
if (inventoryUpdates.RewardInfo.NemesisHintProgress && inventory.Nemesis) {
//G玄骸额外解密进度
let extraHintProgress = 1.5;
if (inventory.Nemesis.Faction == "FC_GRINEER") {
extraHintProgress = 4
//玄骸额外解密进度
let extraHintProgress = 1;
switch (inventory.Nemesis.Faction) {
case "FC_GRINEER":
extraHintProgress = config.extraHintProgressGrineer ?? extraHintProgress;
break
case "FC_CORPUS":
extraHintProgress = config.extraHintProgressCorpus ?? extraHintProgress;
break
}
inventory.Nemesis.HintProgress += inventoryUpdates.RewardInfo.NemesisHintProgress * extraHintProgress;
if (inventory.Nemesis.Faction != "FC_INFESTATION" && inventory.Nemesis.Hints.length != 3) {
@ -357,8 +374,10 @@ export const addMissionInventoryUpdates = async (
break;
}
case "PlayerSkillGains": {
inventory.PlayerSkills.LPP_SPACE += value.LPP_SPACE ?? 0;
inventory.PlayerSkills.LPP_DRIFTER += (value.LPP_DRIFTER ?? 0) * 3;
const extraPlayerSkillGainsSpace = config.extraPlayerSkillGainsSpace ?? 1;
const extraPlayerSkillGainsDrifter = config.extraPlayerSkillGainsDrifter ?? 1;
inventory.PlayerSkills.LPP_SPACE += (value.LPP_SPACE?? 0) * extraPlayerSkillGainsSpace;
inventory.PlayerSkills.LPP_DRIFTER += (value.LPP_DRIFTER ?? 0) * extraPlayerSkillGainsDrifter;
break;
}
case "CustomMarkers": {
@ -812,6 +831,7 @@ export const addMissionInventoryUpdates = async (
// Duviri cave offers (generated with the duviri seed) change after completing one of its game modes (not when aborting).
if (inventoryUpdates.MissionStatus != "GS_QUIT") {
inventory.DuviriInfo!.Seed = generateRewardSeed();
inventory.DuviriInfo!.NumCompletions += 1;
}
break;
}
@ -855,14 +875,18 @@ export const addMissionInventoryUpdates = async (
) {
const weaponType = manifest.weapons[inventory.Nemesis.WeaponIdx];
giveNemesisWeaponRecipe(inventory, weaponType, value.nemesisName, value.weaponLoc, profile);
//增强玄骸,额外随机给三个武器
for (let i = 0; i < 3; i++) {
let randomNemesisWeapon = getRandomNemesisWeaponByFactions(inventory.Nemesis.Faction)
giveNemesisWeaponRecipe(inventory, randomNemesisWeapon, value.nemesisName, undefined, profile);
logger.debug(`随机额外玄骸${value.nemesisName}武器${randomNemesisWeapon}`);
}
att.push(weaponType);
//玄骸额外随机给三个武器
const extraWeapon = config.nemesisExtraWeapon ?? 0;
if (extraWeapon > 0) {
for (let i = 0; i < extraWeapon; i++) {
let randomNemesisWeapon = getRandomNemesisWeaponByFactions(inventory.Nemesis.Faction)
giveNemesisWeaponRecipe(inventory, randomNemesisWeapon, value.nemesisName, undefined, profile);
logger.debug(`随机额外玄骸${value.nemesisName}武器${randomNemesisWeapon}`);
att.push(randomNemesisWeapon)
}
}
}
//if (value.petLoc) {
if (profile.petHead) {
@ -1242,7 +1266,8 @@ export const addMissionRewards = async (
if (rewardInfo.useVaultManifest) {
//堕落mod一次性掉落三张
for (let i = 0; i < 3; i++) {
const extraCorrputedMods = config.extraCorrputedMods ?? 1
for (let i = 0; i < extraCorrputedMods; i++) {
MissionRewards.push({
StoreItem: getRandomElement(corruptedMods)!,
ItemCount: 1
@ -1346,7 +1371,9 @@ export const addMissionRewards = async (
}
if (strippedItems) {
for (let i = 0; i < 3; i++) {
const extraStrippedItems = config.extraStrippedItems ?? 1;
for (let i = 0; i < extraStrippedItems; i++) {
for (const si of strippedItems) {
if (si.DropTable in droptableAliases) {
logger.debug(`rewriting ${si.DropTable} to ${droptableAliases[si.DropTable]}`);
@ -1729,9 +1756,9 @@ function getRandomMissionDrops(
firstCompletion: boolean
): IMissionReward[] {
const drops: IMissionReward[] = [];
//重复执行三次方法并将结果附加到最终的drops数组里
for (let i = 0; i < 3; i++) {
const extraRadomMissionDrops = config.extraRadomMissionDrops ?? 1;
for (let i = 0; i < extraRadomMissionDrops; i++) {
if (RewardInfo.sortieTag == "Final" && firstCompletion) {
const arr = RewardInfo.sortieId!.split("_");
let sortieId = arr[1];
@ -2077,24 +2104,25 @@ function getRandomMissionDrops(
if (progress) {
// https://wiki.warframe.com/w/The%20Circuit#Tiers_and_Weekly_Rewards
const roundsCompleted = RewardInfo.rewardQualifications?.length || 0;
const circuitProgressMuliplier = config.circuitProgressMuliplier ?? 1;
if (roundsCompleted >= 1) {
progress.Earn += 100;
progress.Earn += 100 * circuitProgressMuliplier;
}
if (roundsCompleted >= 2) {
progress.Earn += 110;
progress.Earn += 110 * circuitProgressMuliplier;
}
if (roundsCompleted >= 3) {
progress.Earn += 120;
progress.Earn += 120 * circuitProgressMuliplier;
}
if (roundsCompleted >= 4) {
progress.Earn += 145;
progress.Earn += 145 * circuitProgressMuliplier;
if (progress.BonusAvailable && progress.BonusAvailable.getTime() <= Date.now()) {
progress.Earn += 50;
progress.BonusAvailable = new Date(Date.now() + 24 * 3600_000); // TOVERIFY
}
}
if (roundsCompleted >= 5) {
progress.Earn += (roundsCompleted - 4) * 170;
progress.Earn += (roundsCompleted - 4) * 170 * circuitProgressMuliplier;
}
}
tierOverride = 0;
@ -2110,7 +2138,7 @@ function getRandomMissionDrops(
}
}
//在循环中随机化奖励种子
const rng = new SRng((BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) + BigInt(i * 7)) ^ 0xffffffffffffffffn);
const rng = new SRng((BigInt(RewardInfo.rewardSeed ?? generateRewardSeed()) + BigInt(i * 17)) ^ 0xffffffffffffffffn);
rewardManifests.forEach(name => {
const table = ExportRewards[name];
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition