forked from OpenWF/SpaceNinjaServer
Compare commits
6 Commits
4b3b1969da
...
0e10f0d363
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e10f0d363 | |||
| 2a7767ef4a | |||
| e867123f89 | |||
| 2322a994c6 | |||
| be8e2feae6 | |||
| 4f8b07322e |
@ -14,9 +14,6 @@
|
||||
"unlockAllSkins": false,
|
||||
"fullyStockedVendors": false,
|
||||
"skipClanKeyCrafting": false,
|
||||
"spoofMasteryRank": -1,
|
||||
"relicRewardItemCountMultiplier": 1,
|
||||
"nightwaveStandingMultiplier": 1,
|
||||
"unfaithfulBugFixes": {
|
||||
"ignore1999LastRegionPlayed": false,
|
||||
"fixXtraCheeseTimer": false,
|
||||
|
||||
8
package-lock.json
generated
8
package-lock.json
generated
@ -18,7 +18,7 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.91",
|
||||
"warframe-public-export-plus": "^0.5.92",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
@ -5534,9 +5534,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/warframe-public-export-plus": {
|
||||
"version": "0.5.91",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.91.tgz",
|
||||
"integrity": "sha512-xp8rq/dvFC6+urb6vVFRtAmm1v0iE/ZALI3uVGBpblsVB/PWmGxjBBp8l00dCZs67JsqEKcrCcogKwtKTwDc1w=="
|
||||
"version": "0.5.92",
|
||||
"resolved": "https://registry.npmjs.org/warframe-public-export-plus/-/warframe-public-export-plus-0.5.92.tgz",
|
||||
"integrity": "sha512-5O5VtyVXxKtl5QdpzoVyKov5GX6t3z/U5tqPq73kjoSyA5NQT2V9sWsZK4ASyY8Edv9hNsdwlZdsdP8QmYbubg=="
|
||||
},
|
||||
"node_modules/warframe-riven-info": {
|
||||
"version": "0.1.2",
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
"morgan": "^1.10.0",
|
||||
"ncp": "^2.0.0",
|
||||
"undici": "^7.10.0",
|
||||
"warframe-public-export-plus": "^0.5.91",
|
||||
"warframe-public-export-plus": "^0.5.92",
|
||||
"warframe-riven-info": "^0.1.2",
|
||||
"winston": "^3.17.0",
|
||||
"winston-daily-rotate-file": "^5.0.0",
|
||||
|
||||
@ -348,12 +348,12 @@ export const getInventoryResponse = async (
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof config.spoofMasteryRank === "number" && config.spoofMasteryRank >= 0) {
|
||||
inventoryResponse.PlayerLevel = config.spoofMasteryRank;
|
||||
if (inventory.spoofMasteryRank && inventory.spoofMasteryRank >= 0) {
|
||||
inventoryResponse.PlayerLevel = inventory.spoofMasteryRank;
|
||||
if (!xpBasedLevelCapDisabled) {
|
||||
// This client has not been patched to accept any mastery rank, need to fake the XP.
|
||||
inventoryResponse.XPInfo = [];
|
||||
let numFrames = getExpRequiredForMr(Math.min(config.spoofMasteryRank, 5030)) / 6000;
|
||||
let numFrames = getExpRequiredForMr(Math.min(inventory.spoofMasteryRank, 5030)) / 6000;
|
||||
while (numFrames-- > 0) {
|
||||
inventoryResponse.XPInfo.push({
|
||||
ItemType: "/Lotus/Powersuits/Mag/Mag",
|
||||
|
||||
@ -14,7 +14,7 @@ export const updateChallengeProgressController: RequestHandler = async (req, res
|
||||
|
||||
const inventory = await getInventory(
|
||||
account._id.toString(),
|
||||
"ChallengesFixVersion ChallengeProgress SeasonChallengeHistory Affiliations CalendarProgress"
|
||||
"ChallengesFixVersion ChallengeProgress SeasonChallengeHistory Affiliations CalendarProgress nightwaveStandingMultiplier"
|
||||
);
|
||||
let affiliationMods: IAffiliationMods[] = [];
|
||||
if (challenges.ChallengeProgress) {
|
||||
|
||||
@ -8,7 +8,6 @@ import { logger } from "../utils/logger.ts";
|
||||
import { addMiscItems, combineInventoryChanges } from "../services/inventoryService.ts";
|
||||
import { handleStoreItemAcquisition } from "../services/purchaseService.ts";
|
||||
import type { IInventoryChanges } from "../types/purchaseTypes.ts";
|
||||
import { config } from "../services/configService.ts";
|
||||
|
||||
export const crackRelic = async (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
@ -29,10 +28,10 @@ export const crackRelic = async (
|
||||
ExportRewards[relic.rewardManifest][0] as { type: string; itemCount: number; rarity: TRarity }[], // rarity is nullable in PE+ typings, but always present for relics
|
||||
weights
|
||||
)!;
|
||||
if (config.relicRewardItemCountMultiplier !== undefined && (config.relicRewardItemCountMultiplier ?? 1) != 1) {
|
||||
if (inventory.relicRewardItemCountMultiplier && inventory.relicRewardItemCountMultiplier != 1) {
|
||||
reward = {
|
||||
...reward,
|
||||
itemCount: reward.itemCount * config.relicRewardItemCountMultiplier
|
||||
itemCount: reward.itemCount * inventory.relicRewardItemCountMultiplier
|
||||
};
|
||||
}
|
||||
logger.debug(`relic rolled`, reward);
|
||||
|
||||
@ -1469,6 +1469,9 @@ const inventorySchema = new Schema<IInventoryDatabase, InventoryDocumentProps>(
|
||||
nemesisHintProgressMultiplierGrineer: Number,
|
||||
nemesisHintProgressMultiplierCorpus: Number,
|
||||
nemesisExtraWeapon: Number,
|
||||
spoofMasteryRank: { type: Number, default: -1 },
|
||||
relicRewardItemCountMultiplier: { type: Number, default: 1 },
|
||||
nightwaveStandingMultiplier: { type: Number, default: 1 },
|
||||
|
||||
SubscribedToEmails: { type: Number, default: 0 },
|
||||
SubscribedToEmailsPersonalized: { type: Number, default: 0 },
|
||||
|
||||
@ -24,9 +24,6 @@ export interface IConfig {
|
||||
unlockAllSkins?: boolean;
|
||||
fullyStockedVendors?: boolean;
|
||||
skipClanKeyCrafting?: boolean;
|
||||
spoofMasteryRank?: number;
|
||||
relicRewardItemCountMultiplier?: number;
|
||||
nightwaveStandingMultiplier?: number;
|
||||
unfaithfulBugFixes?: {
|
||||
ignore1999LastRegionPlayed?: boolean;
|
||||
fixXtraCheeseTimer?: boolean;
|
||||
@ -149,7 +146,10 @@ export const configRemovedOptionsKeys = [
|
||||
"fastClanAscension",
|
||||
"unlockAllFlavourItems",
|
||||
"unlockAllShipDecorations",
|
||||
"unlockAllDecoRecipes"
|
||||
"unlockAllDecoRecipes",
|
||||
"spoofMasteryRank",
|
||||
"relicRewardItemCountMultiplier",
|
||||
"nightwaveStandingMultiplier"
|
||||
];
|
||||
|
||||
export const configPath = path.join(repoDir, args.configPath ?? "config.json");
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import type { IFriendInfo } from "../types/friendTypes.ts";
|
||||
import { getInventory } from "./inventoryService.ts";
|
||||
import { config } from "./configService.ts";
|
||||
import { Account } from "../models/loginModel.ts";
|
||||
import type { Types } from "mongoose";
|
||||
import { Friendship } from "../models/friendModel.ts";
|
||||
@ -13,8 +12,8 @@ export const addAccountDataToFriendInfo = async (info: IFriendInfo): Promise<voi
|
||||
};
|
||||
|
||||
export const addInventoryDataToFriendInfo = async (info: IFriendInfo): Promise<void> => {
|
||||
const inventory = await getInventory(fromOid(info._id), "PlayerLevel ActiveAvatarImageType");
|
||||
info.PlayerLevel = config.spoofMasteryRank == -1 ? inventory.PlayerLevel : config.spoofMasteryRank;
|
||||
const inventory = await getInventory(fromOid(info._id), "PlayerLevel ActiveAvatarImageType spoofMasteryRank");
|
||||
info.PlayerLevel = inventory.spoofMasteryRank == -1 ? inventory.PlayerLevel : inventory.spoofMasteryRank;
|
||||
info.ActiveAvatarImageType = inventory.ActiveAvatarImageType;
|
||||
};
|
||||
|
||||
|
||||
@ -117,6 +117,7 @@ export const createInventory = async (
|
||||
inventory.PlayedParkourTutorial = true;
|
||||
await addStartingGear(inventory);
|
||||
await completeQuest(inventory, "/Lotus/Types/Keys/VorsPrize/VorsPrizeQuestKeyChain");
|
||||
await completeQuest(inventory, "/Lotus/Types/Keys/ModQuest/ModQuestKeyChain");
|
||||
|
||||
const completedMissions = ["SolNode27", "SolNode89", "SolNode63", "SolNode85", "SolNode15", "SolNode79"];
|
||||
|
||||
@ -134,16 +135,6 @@ export const createInventory = async (
|
||||
}
|
||||
};
|
||||
|
||||
//TODO: RawUpgrades might need to return a LastAdded
|
||||
const awakeningRewards = [
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4",
|
||||
"/Lotus/Types/Restoratives/LisetAutoHack",
|
||||
"/Lotus/Upgrades/Mods/Warframe/AvatarShieldMaxMod"
|
||||
];
|
||||
|
||||
export const addStartingGear = async (
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
startingGear?: TPartialStartingGear
|
||||
@ -196,6 +187,14 @@ export const addStartingGear = async (
|
||||
inventory.RegularCredits = 3000;
|
||||
inventoryChanges.RegularCredits = 3000;
|
||||
|
||||
const awakeningRewards = [
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem1",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem2",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem3",
|
||||
"/Lotus/Types/StoreItems/AvatarImages/AvatarImageItem4",
|
||||
"/Lotus/Types/Restoratives/LisetAutoHack"
|
||||
];
|
||||
|
||||
for (const item of awakeningRewards) {
|
||||
const inventoryDelta = await addItem(inventory, item);
|
||||
combineInventoryChanges(inventoryChanges, inventoryDelta);
|
||||
@ -2131,7 +2130,7 @@ export const addChallenges = async (
|
||||
];
|
||||
}
|
||||
|
||||
const standingToAdd = meta.standing! * (config.nightwaveStandingMultiplier ?? 1);
|
||||
const standingToAdd = meta.standing! * (inventory.nightwaveStandingMultiplier ?? 1);
|
||||
affiliation.Standing += standingToAdd;
|
||||
if (affiliationMods.length == 0) {
|
||||
affiliationMods.push({ Tag: nightwaveSyndicateTag });
|
||||
|
||||
@ -65,7 +65,7 @@ export const createPersonalRooms = async (accountId: Types.ObjectId, shipId: Typ
|
||||
activeShipId: shipId
|
||||
});
|
||||
if (config.skipTutorial) {
|
||||
// unlocked during Vor's Prize
|
||||
// unlocked during Vor's Prize and The Teacher quests
|
||||
const defaultFeatures = [
|
||||
"/Lotus/Types/Items/ShipFeatureItems/MercuryNavigationFeatureItem",
|
||||
"/Lotus/Types/Items/ShipFeatureItems/ArsenalFeatureItem",
|
||||
|
||||
@ -8,6 +8,7 @@ import {
|
||||
ExportAnimals,
|
||||
ExportEnemies,
|
||||
ExportFusionBundles,
|
||||
ExportKeys,
|
||||
ExportRegions,
|
||||
ExportRelics,
|
||||
ExportRewards
|
||||
@ -1125,7 +1126,8 @@ export const addMissionRewards = async (
|
||||
RegularCredits: creditDrops,
|
||||
VoidTearParticipantsCurrWave: voidTearWave,
|
||||
StrippedItems: strippedItems,
|
||||
AffiliationChanges: AffiliationMods
|
||||
AffiliationChanges: AffiliationMods,
|
||||
InvasionProgress: invasionProgress
|
||||
}: IMissionInventoryUpdateRequest,
|
||||
firstCompletion: boolean
|
||||
): Promise<AddMissionRewardsReturnType> => {
|
||||
@ -1141,6 +1143,7 @@ export const addMissionRewards = async (
|
||||
const MissionRewards: IMissionReward[] = getRandomMissionDrops(
|
||||
inventory,
|
||||
rewardInfo,
|
||||
levelKeyName,
|
||||
missions,
|
||||
wagerTier,
|
||||
firstCompletion
|
||||
@ -1174,6 +1177,19 @@ export const addMissionRewards = async (
|
||||
|
||||
//inventory change is what the client has not rewarded itself, also the client needs to know the credit changes for display
|
||||
|
||||
if (invasionProgress) {
|
||||
for (const clientProgress of invasionProgress) {
|
||||
const dbProgress = inventory.QualifyingInvasions.find(x => x.invasionId.equals(clientProgress._id.$oid));
|
||||
if (dbProgress) {
|
||||
const run =
|
||||
(clientProgress.AttackerScore > clientProgress.DefenderScore
|
||||
? dbProgress.AttackerScore
|
||||
: dbProgress.DefenderScore) - 1;
|
||||
missionCompletionCredits += 1000 * Math.min(run, 10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (rewardInfo.goalId) {
|
||||
const goal = getWorldState().Goals.find(x => x._id.$oid == rewardInfo.goalId);
|
||||
if (goal) {
|
||||
@ -1688,8 +1704,8 @@ export const addCredits = async (
|
||||
finalCredits.TotalCredits[1] += finalCredits.TotalCredits[1];
|
||||
}
|
||||
if ((inventory.Boosters.find(x => x.ItemType == "/Lotus/Types/Boosters/CreditBlessing")?.ExpiryDate ?? 0) > now) {
|
||||
inventory.RegularCredits += finalCredits.TotalCredits[1];
|
||||
finalCredits.TotalCredits[1] += finalCredits.TotalCredits[1];
|
||||
inventory.RegularCredits += finalCredits.TotalCredits[1] * 0.25;
|
||||
finalCredits.TotalCredits[1] += finalCredits.TotalCredits[1] * 0.25;
|
||||
}
|
||||
|
||||
return finalCredits;
|
||||
@ -1756,6 +1772,7 @@ function getLevelCreditRewards(node: IRegion): number {
|
||||
function getRandomMissionDrops(
|
||||
inventory: TInventoryDatabaseDocument,
|
||||
RewardInfo: IRewardInfo,
|
||||
levelKeyName: string | undefined,
|
||||
mission: IMission | undefined,
|
||||
tierOverride: number | undefined,
|
||||
firstCompletion: boolean
|
||||
@ -2193,7 +2210,7 @@ function getRandomMissionDrops(
|
||||
}
|
||||
}
|
||||
|
||||
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound) {
|
||||
if (region.cacheRewardManifest && RewardInfo.EnemyCachesFound && !RewardInfo.goalId) {
|
||||
const deck = ExportRewards[region.cacheRewardManifest];
|
||||
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
|
||||
const drop = getRandomRewardByChance(deck[rotation]);
|
||||
@ -2259,6 +2276,71 @@ function getRandomMissionDrops(
|
||||
}
|
||||
}
|
||||
|
||||
if (RewardInfo.EnemyCachesFound) {
|
||||
if (RewardInfo.goalId) {
|
||||
const goal = getWorldState().Goals.find(x => x._id.$oid == RewardInfo.goalId);
|
||||
if (goal) {
|
||||
let currentMissionKey: string | undefined;
|
||||
if (RewardInfo.node == goal.Node) {
|
||||
currentMissionKey = goal.MissionKeyName;
|
||||
} else if (goal.ConcurrentNodes && goal.ConcurrentMissionKeyNames) {
|
||||
for (let i = 0; i < goal.ConcurrentNodes.length; i++) {
|
||||
if (RewardInfo.node == goal.ConcurrentNodes[i]) {
|
||||
currentMissionKey = goal.ConcurrentMissionKeyNames[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentMissionKey) {
|
||||
const keyMeta = ExportKeys[currentMissionKey];
|
||||
if (keyMeta.cacheRewardManifest) {
|
||||
const deck = ExportRewards[keyMeta.cacheRewardManifest];
|
||||
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
|
||||
const drop = getRandomRewardByChance(deck[rotation]);
|
||||
if (drop) {
|
||||
drops.push({
|
||||
StoreItem: drop.type,
|
||||
ItemCount: drop.itemCount,
|
||||
FromEnemyCache: true
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (RewardInfo.alertId) {
|
||||
const alert = getWorldState().Alerts.find(x => x._id.$oid == RewardInfo.alertId);
|
||||
if (alert && alert.MissionInfo.enemyCacheOverride) {
|
||||
const deck = ExportRewards[alert.MissionInfo.enemyCacheOverride];
|
||||
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
|
||||
const drop = getRandomRewardByChance(deck[rotation]);
|
||||
if (drop) {
|
||||
drops.push({
|
||||
StoreItem: drop.type,
|
||||
ItemCount: drop.itemCount,
|
||||
FromEnemyCache: true
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (levelKeyName) {
|
||||
const keyMeta = ExportKeys[levelKeyName];
|
||||
if (keyMeta.cacheRewardManifest) {
|
||||
const deck = ExportRewards[keyMeta.cacheRewardManifest];
|
||||
for (let rotation = 0; rotation != RewardInfo.EnemyCachesFound; ++rotation) {
|
||||
const drop = getRandomRewardByChance(deck[rotation]);
|
||||
if (drop) {
|
||||
drops.push({
|
||||
StoreItem: drop.type,
|
||||
ItemCount: drop.itemCount,
|
||||
FromEnemyCache: true
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (inventory.missionsCanGiveAllRelics) {
|
||||
for (const drop of drops) {
|
||||
const itemType = fromStoreItem(drop.StoreItem);
|
||||
|
||||
@ -3703,7 +3703,8 @@ export const getLiteSortie = (week: number): ILiteSortie => {
|
||||
value.missionType != "MT_ASSASSINATION" &&
|
||||
value.missionType != "MT_JUNCTION" &&
|
||||
value.missionType != "MT_LANDSCAPE" &&
|
||||
value.missionType != "MT_RAILJACK"
|
||||
value.missionType != "MT_RAILJACK" &&
|
||||
key != "SolNode63" // This node uses GrineerForestTilesetCaves which only supports MT_CAPTURE, which is not valid for LiteSorties.
|
||||
) {
|
||||
nodes.push(key);
|
||||
}
|
||||
|
||||
@ -61,6 +61,9 @@ export interface IAccountCheats {
|
||||
nemesisHintProgressMultiplierGrineer?: number;
|
||||
nemesisHintProgressMultiplierCorpus?: number;
|
||||
nemesisExtraWeapon?: number;
|
||||
spoofMasteryRank?: number;
|
||||
relicRewardItemCountMultiplier?: number;
|
||||
nightwaveStandingMultiplier?: number;
|
||||
}
|
||||
|
||||
export interface IInventoryDatabase
|
||||
|
||||
@ -58,6 +58,7 @@ export interface IAlertMissionInfo {
|
||||
maxEnemyLevel?: number;
|
||||
maxWaveNum?: number;
|
||||
descText?: string;
|
||||
enemyCacheOverride?: string;
|
||||
|
||||
maxRotations?: number; // SNS specific field
|
||||
}
|
||||
|
||||
@ -1071,6 +1071,20 @@
|
||||
<input class="form-check-input" type="checkbox" id="finishInvasionsInOneMission" />
|
||||
<label class="form-check-label" for="finishInvasionsInOneMission" data-loc="cheats_finishInvasionsInOneMission"></label>
|
||||
</div>
|
||||
<form class="form-group mt-2" onsubmit="doChangeSupportedSyndicate(); return false;">
|
||||
<label class="form-label" for="changeSyndicate" data-loc="cheats_changeSupportedSyndicate"></label>
|
||||
<div class="input-group">
|
||||
<select class="form-control" id="changeSyndicate"></select>
|
||||
<button class="btn btn-secondary" type="submit" data-loc="cheats_changeButton"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2">
|
||||
<label class="form-label" for="spoofMasteryRank" data-loc="cheats_spoofMasteryRank"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="spoofMasteryRank" type="number" min="-1" max="65535" data-default="-1" />
|
||||
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2">
|
||||
<label class="form-label" for="nemesisHenchmenKillsMultiplierGrineer" data-loc="cheats_nemesisHenchmenKillsMultiplierGrineer"></label>
|
||||
<div class="input-group">
|
||||
@ -1113,6 +1127,20 @@
|
||||
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2">
|
||||
<label class="form-label" for="relicRewardItemCountMultiplier" data-loc="cheats_relicRewardItemCountMultiplier"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="relicRewardItemCountMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
||||
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2">
|
||||
<label class="form-label" for="nightwaveStandingMultiplier" data-loc="cheats_nightwaveStandingMultiplier"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="nightwaveStandingMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
||||
<button class="btn btn-secondary" type="button" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mt-2 mb-2 d-flex flex-wrap gap-2">
|
||||
<button class="btn btn-primary" onclick="debounce(doUnlockAllShipFeatures);" data-loc="cheats_unlockAllShipFeatures"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(unlockAllMissions);" data-loc="cheats_unlockAllMissions"></button>
|
||||
@ -1127,13 +1155,6 @@
|
||||
<button class="btn btn-primary" onclick="debounce(unlockAllProfitTakerStages);" data-loc="cheats_unlockAllProfitTakerStages"></button>
|
||||
<button class="btn btn-primary" onclick="debounce(unlockAllSimarisResearchEntries);" data-loc="cheats_unlockAllSimarisResearchEntries"></button>
|
||||
</div>
|
||||
<form class="mt-2" onsubmit="doChangeSupportedSyndicate(); return false;">
|
||||
<label class="form-label" for="changeSyndicate" data-loc="cheats_changeSupportedSyndicate"></label>
|
||||
<div class="input-group">
|
||||
<select class="form-control" id="changeSyndicate"></select>
|
||||
<button class="btn btn-secondary" type="submit" data-loc="cheats_changeButton"></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -1161,27 +1182,6 @@
|
||||
<input class="form-check-input" type="checkbox" id="skipClanKeyCrafting" />
|
||||
<label class="form-check-label" for="skipClanKeyCrafting" data-loc="cheats_skipClanKeyCrafting"></label>
|
||||
</div>
|
||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('spoofMasteryRank'); return false;">
|
||||
<label class="form-label" for="spoofMasteryRank" data-loc="cheats_spoofMasteryRank"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="spoofMasteryRank" type="number" min="-1" max="65535" data-default="-1" />
|
||||
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('relicRewardItemCountMultiplier'); return false;">
|
||||
<label class="form-label" for="relicRewardItemCountMultiplier" data-loc="cheats_relicRewardItemCountMultiplier"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="relicRewardItemCountMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
||||
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
<form class="form-group mt-2" onsubmit="doSaveConfigInt('nightwaveStandingMultiplier'); return false;">
|
||||
<label class="form-label" for="nightwaveStandingMultiplier" data-loc="cheats_nightwaveStandingMultiplier"></label>
|
||||
<div class="input-group">
|
||||
<input class="form-control" id="nightwaveStandingMultiplier" type="number" min="1" max="1000000" data-default="1" />
|
||||
<button class="btn btn-secondary" type="submit" data-loc="cheats_save"></button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -33,7 +33,7 @@ dict = {
|
||||
code_remove: `Retirer`,
|
||||
code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`,
|
||||
code_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`,
|
||||
code_addVaultItemsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`,
|
||||
code_addVaultItemsConfirm: `Ajouter |COUNT| objets au coffre de clan ?`,
|
||||
code_succRankUp: `Montée de niveau effectuée.`,
|
||||
code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`,
|
||||
code_succAdded: `Ajouté.`,
|
||||
@ -45,7 +45,7 @@ dict = {
|
||||
code_rank: `Rang`,
|
||||
code_rankUp: `Monter de rang`,
|
||||
code_rankDown: `Baisser de rang`,
|
||||
code_unlockLevelCap: `[UNTRANSLATED] Unlock level cap`,
|
||||
code_unlockLevelCap: `Débloquer le level cap (9999)`,
|
||||
code_count: `Quantité`,
|
||||
code_focusAllUnlocked: `Les écoles de Focus sont déjà déverrouillées.`,
|
||||
code_focusUnlocked: `|COUNT| écoles de Focus déverrouillées ! Synchronisation de l'inventaire nécessaire.`,
|
||||
@ -65,22 +65,22 @@ dict = {
|
||||
code_completed: `Complétée`,
|
||||
code_active: `Active`,
|
||||
code_pigment: `Pigment`,
|
||||
code_controller: `[UNTRANSLATED] Controller cursor`,
|
||||
code_mouseLine: `[UNTRANSLATED] Line cursor`,
|
||||
code_mouse: `[UNTRANSLATED] Cursor`,
|
||||
code_controller: `Curseur manette`,
|
||||
code_mouseLine: `Curseur linéaire`,
|
||||
code_mouse: `Curseur`,
|
||||
code_itemColorPalette: `Palette de couleurs |ITEM|`,
|
||||
code_mature: `Maturer pour le combat`,
|
||||
code_unmature: `Régrésser l'âge génétique`,
|
||||
code_fund: `Financer`,
|
||||
code_funded: `Complété`,
|
||||
code_replays: `[UNTRANSLATED] Replays`,
|
||||
code_replays: `Rejouée`,
|
||||
code_stalker: `Stalker`,
|
||||
code_cutName: `[UNTRANSLATED] Cut |INDEX|`,
|
||||
code_cutName: `Coupe |INDEX|`,
|
||||
code_drifterBeardName: `Barbe du Voyageur |INDEX|`,
|
||||
code_drifterFaceName: `Visage du Voyageur |INDEX|`,
|
||||
code_operatorFaceName: `Visage de l'Opérateur |INDEX|`,
|
||||
code_succChange: `Changement effectué.`,
|
||||
code_requiredInvigorationUpgrade: `[UNTRANSLATED] You must select both an offensive & utility upgrade.`,
|
||||
code_requiredInvigorationUpgrade: `Invigoration offensive et défensive requises.`,
|
||||
login_description: `Connexion avec les informations de connexion OpenWF.`,
|
||||
login_emailLabel: `Email`,
|
||||
login_passwordLabel: `Mot de passe`,
|
||||
@ -114,7 +114,7 @@ dict = {
|
||||
inventory_kubrowPets: `Bêtes`,
|
||||
inventory_evolutionProgress: `Progrès de l'évolution Incarnon`,
|
||||
inventory_boosters: `Boosters`,
|
||||
inventory_flavourItems: `[UNTRANSLATED] <abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
|
||||
inventory_flavourItems: `<abbr title="Animation Sets, Glyphs, Palettes, etc.">Collectables</abbr>`,
|
||||
inventory_shipDecorations: `Décorations du vaisseau`,
|
||||
inventory_weaponSkins: `Aspects`,
|
||||
inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
|
||||
@ -123,10 +123,10 @@ dict = {
|
||||
inventory_bulkAddSpaceWeapons: `Ajouter les armes d'Archwing manquantes`,
|
||||
inventory_bulkAddSentinels: `Ajouter les Sentinelles manquantes`,
|
||||
inventory_bulkAddSentinelWeapons: `Ajouter les armes de Sentinelles manquantes`,
|
||||
inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
|
||||
inventory_bulkAddShipDecorations: `[UNTRANSLATED] Add Missing Ship Decorations`,
|
||||
inventory_bulkAddFlavourItems: `Ajouter les collectables manquants ?`,
|
||||
inventory_bulkAddShipDecorations: `Ajouter les décorations de vaisseau manquantes`,
|
||||
inventory_bulkAddEvolutionProgress: `Ajouter les évolutions Incarnon manquantes`,
|
||||
inventory_bulkAddWeaponSkins: `[UNTRANSLATED] Add Missing Skins`,
|
||||
inventory_bulkAddWeaponSkins: `Ajouter les skins manquants`,
|
||||
inventory_bulkRankUpSuits: `Toutes les Warframes au rang max`,
|
||||
inventory_bulkRankUpWeapons: `Toutes les armes au rang max`,
|
||||
inventory_bulkRankUpSpaceSuits: `Tous les Archwings au rang max`,
|
||||
@ -179,8 +179,8 @@ dict = {
|
||||
invigorations_utility_EnergyRegen: `+2 d'énergie régénérés/s`,
|
||||
|
||||
detailedView_invigorationOffensiveLabel: `Amélioration offensive`,
|
||||
detailedView_invigorationUtilityLabel: `[UNTRANSLATED] Utility Upgrade`,
|
||||
detailedView_invigorationExpiryLabel: `[UNTRANSLATED] Invigoration Expiry (optional)`,
|
||||
detailedView_invigorationUtilityLabel: `Amélioration défensive`,
|
||||
detailedView_invigorationExpiryLabel: `Expiration de l'invigoration (optionnel)`,
|
||||
|
||||
abilityOverride_label: `Remplacement de pouvoir`,
|
||||
abilityOverride_onSlot: `Sur l'emplacement`,
|
||||
@ -263,12 +263,12 @@ dict = {
|
||||
cheats_changeButton: `Changer`,
|
||||
cheats_markAllAsRead: `Marquer la boîte de réception comme lue`,
|
||||
cheats_finishInvasionsInOneMission: `Compléter les invasions en une mission.`,
|
||||
cheats_nemesisHenchmenKillsMultiplierGrineer: `[UNTRANSLATED] Rage Progess Multiplier (Grineer)`,
|
||||
cheats_nemesisHenchmenKillsMultiplierCorpus: `[UNTRANSLATED] Rage Progess Multiplier (Corpus)`,
|
||||
cheats_nemesisAntivirusGainMultiplier: `[UNTRANSLATED] Antivirus Progress Multiplier`,
|
||||
cheats_nemesisHintProgressMultiplierGrineer: `[UNTRANSLATED] Hint Progress Multiplier (Grineer)`,
|
||||
cheats_nemesisHintProgressMultiplierCorpus: `[UNTRANSLATED] Hint Progress Multiplier (Corpus)`,
|
||||
cheats_nemesisExtraWeapon: `[UNTRANSLATED] Extra Nemesis Weapon / Token On Vanquish (0 to disable)`,
|
||||
cheats_nemesisHenchmenKillsMultiplierGrineer: `Multiplicateur de rage (Grineer)`,
|
||||
cheats_nemesisHenchmenKillsMultiplierCorpus: `Multiplicateur de rage (Corpus)`,
|
||||
cheats_nemesisAntivirusGainMultiplier: `Multiplicateur de l'Antivirus`,
|
||||
cheats_nemesisHintProgressMultiplierGrineer: `Multiplicateur d'indices (Grineer)`,
|
||||
cheats_nemesisHintProgressMultiplierCorpus: `Multiplicateur d'indices (Corpus)`,
|
||||
cheats_nemesisExtraWeapon: `Arme de Nemesis/jeton supplémentaire sur exécution (0 pour désactiver)`,
|
||||
|
||||
worldState: `Carte Solaire`,
|
||||
worldState_creditBoost: `Booster de Crédit`,
|
||||
@ -291,7 +291,7 @@ dict = {
|
||||
worldState_hallowedFlame: `Flamme Hantée`,
|
||||
worldState_hallowedNightmares: `Cauchemars Hantés`,
|
||||
worldState_hallowedNightmaresRewards: `Récompenses Flamme Hantée Cauchemar`,
|
||||
worldState_naberusNights: `[UNTRANSLATED] Nights of Naberus`,
|
||||
worldState_naberusNights: `Les Nuits de Naberus`,
|
||||
worldState_proxyRebellion: `Rébellion Proxy`,
|
||||
worldState_proxyRebellionRewards: `Récompenses Rébellion Proxy`,
|
||||
worldState_bellyOfTheBeast: `Ventre de la Bête`,
|
||||
@ -300,7 +300,7 @@ dict = {
|
||||
worldState_eightClawProgressOverride: `Progrès de la Huitième Griffe`,
|
||||
worldState_thermiaFractures: `Crevasses Thermia`,
|
||||
worldState_thermiaFracturesProgressOverride: `Progrès des Fractures Thermia`,
|
||||
worldState_qtccAlerts: `[UNTRANSLATED] Quest to Conquer Cancer Alerts`,
|
||||
worldState_qtccAlerts: `Alertes Quête pour Vaincre le Cancer`,
|
||||
worldState_from_year: `De |VAL|`,
|
||||
worldState_pre_year: `Pre-|VAL|`,
|
||||
worldState_week: `Semaine |VAL|`,
|
||||
@ -416,11 +416,11 @@ dict = {
|
||||
theme_dark: `Thème sombre`,
|
||||
theme_light: `Thème clair`,
|
||||
|
||||
guildView_cheats: `[UNTRANSLATED] Clan Cheats`,
|
||||
guildView_cheats: `Clan`,
|
||||
guildView_techProjects: `Recherche`,
|
||||
guildView_vaultDecoRecipes: `Schémas de décorations de dojo`,
|
||||
guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`,
|
||||
guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`,
|
||||
guildView_vaultMiscItems: `Ressources dans le coffre`,
|
||||
guildView_vaultShipDecorations: `Décorations dans le coffre`,
|
||||
guildView_alliance: `Alliance`,
|
||||
guildView_members: `Members`,
|
||||
guildView_pending: `En Attente`,
|
||||
@ -443,7 +443,7 @@ dict = {
|
||||
guildView_currency_owned: `|COUNT| dans le coffre.`,
|
||||
guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`,
|
||||
guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`,
|
||||
guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`,
|
||||
guildView_bulkAddVaultShipDecorations: `Ajouter dans le coffre les décorations manquantes`,
|
||||
guildView_bulkFundTechProjects: `Financer toutes les recherches`,
|
||||
guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`,
|
||||
guildView_promote: `Promouvoir`,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user