Exact source used by this build. SHA-256: 9f83dfd43cf8f02aaa7b7799ddfc27204e72ac82202992a43ec8b01d70ea6a8c.

1 import { z } from "zod";
2 
3 const Id = z.string().min(1);
4 const Chance = z.number().min(0).max(1);
5 const PositiveInt = z.number().int().positive();
6 const Range = z.object({ min: PositiveInt, max: PositiveInt }).refine((value) => value.max >= value.min, "Range maximum must be at least its minimum");
7 const Visual = { name: z.literal("TBD"), description: z.literal("TBD"), manifestKey: Id, color: z.number().int().min(0).max(0xffffff) };
8 export const MineDropSchema = z.object({ itemId: Id, min: PositiveInt, max: PositiveInt, chance: Chance }).refine((value) => value.max >= value.min, "Drop maximum must be at least its minimum");
9 export const MineNodeSchema = z.object({
10   id: Id, ...Visual, kind: z.enum(["rock", "ore", "gem", "geode"]),
11   hitsByTier: PositiveInt.array().length(5), minTier: z.number().int().min(0).max(4),
12   xp: z.number().int().nonnegative(), drops: MineDropSchema.array().min(1),
13 });
14 export const MineWeaponSchema = z.object({
15   id: Id, itemId: Id, ...Visual, type: z.enum(["sword", "dagger", "club"]),
16   minDamage: PositiveInt, maxDamage: PositiveInt, critChance: Chance, critMultiplier: z.number().positive(),
17   knockback: z.number().nonnegative(), speed: z.number().int(), reach: z.number().positive(),
18   arcDegrees: z.number().positive().max(360), swingMs: PositiveInt, specialCooldownMs: PositiveInt,
19   special: z.object({ kind: z.enum(["block", "flurry", "slam"]), durationMs: PositiveInt, hits: PositiveInt, damageMultiplier: z.number().nonnegative(), reachMultiplier: z.number().positive() }),
20 }).refine((value) => value.maxDamage >= value.minDamage, "Weapon damage range is inverted");
21 export const MineMonsterSchema = z.object({
22   id: Id, ...Visual, health: PositiveInt, damage: PositiveInt, defense: z.number().int().nonnegative(),
23   speed: z.number().positive(), behavior: z.enum(["chase", "ranged", "flying", "slimeHop", "armored"]),
24   xp: PositiveInt, attackMs: PositiveInt, range: z.number().positive(), projectileSpeed: z.number().nonnegative(),
25   hopMs: PositiveInt, knockbackResistance: Chance, drops: MineDropSchema.array(),
26 });
27 export const MineRingSchema = z.object({
28   id: Id, itemId: Id, ...Visual,
29   effects: z.object({ kind: z.enum(["glow", "magnet", "defense", "attack", "speed", "lifeSteal"]), value: z.number().positive() }).array().min(1),
30 });
31 export const MineBootsSchema = z.object({ id: Id, itemId: Id, ...Visual, defense: z.number().int().nonnegative(), immunity: z.number().int().nonnegative() });
32 
33 export const MinesSchema = z.object({
34   config: z.object({
35     maxFloor: PositiveInt, mvpContentFloors: PositiveInt, elevatorEvery: PositiveInt, treasureEvery: PositiveInt,
36     entrance: z.object({ areaId: Id, warpId: Id, x: z.number().nonnegative(), y: z.number().nonnegative(), range: z.number().positive() }),
37     width: z.number().int().min(12), height: z.number().int().min(12),
38     rooms: z.object({ min: PositiveInt, max: PositiveInt, minSize: z.number().int().min(3), maxSize: z.number().int().min(3) }),
39     rocks: Range, monsters: Range, infestedChance: Chance, mushroomChance: Chance,
40     clockMsPerGameMinute: PositiveInt, miningSwingMs: PositiveInt, mushroomItemId: Id,
41     nodeWeights: z.object({ rock: Chance, ore: Chance, gem: Chance, geode: Chance }),
42     starterWeaponId: Id, baseHealth: PositiveInt, healthPerCombatLevel: PositiveInt,
43     healthExcludedLevels: z.number().int().min(1).max(10).array(), invulnerabilityMs: PositiveInt, descentInvulnerabilityMs: PositiveInt,
44     monsterContactRange: z.number().positive(), playerKnockback: z.number().nonnegative(), hitStunMs: PositiveInt, projectileLifetimeMs: PositiveInt,
45     coalMiningXp: z.number().int().nonnegative(),
46     combatProfessionHealth: z.object({ hook: z.string().regex(/^combat_0[1-6]$/), bonus: PositiveInt }).array(),
47     knockout: z.object({ minGoldRate: Chance, maxGoldRate: Chance, maxGoldLoss: PositiveInt, maxLostStacks: PositiveInt, itemLossChance: Chance, healthRestored: PositiveInt }),
48     latePassout: z.object({ goldRate: Chance, maxGoldLoss: PositiveInt }),
49     ladder: z.object({ baseChance: Chance, luckDivisor: z.number().positive(), remainingRockNumerator: z.number().positive(), luckLevelMultiplier: Chance, emptyMonsterBonus: Chance, killChance: Chance }),
50   }),
51   bands: z.object({ id: z.enum(["stone", "ice", "magma"]), minFloor: PositiveInt, maxFloor: PositiveInt, rockNodeId: Id, oreNodeId: Id, gemNodeIds: Id.array().min(1), geodeNodeId: Id, monsterIds: Id.array().min(1), groundColor: z.number().int().min(0).max(0xffffff) }).array().min(1),
52   nodes: MineNodeSchema.array().min(1), weapons: MineWeaponSchema.array().min(1), monsters: MineMonsterSchema.array().min(1),
53   rings: MineRingSchema.array(), boots: MineBootsSchema.array(),
54   minerals: z.object({ id: Id, itemId: Id, ...Visual }).array(),
55   geodes: z.object({ itemId: Id, crackPrice: PositiveInt, drops: z.object({ itemId: Id, min: PositiveInt, max: PositiveInt, weight: z.number().positive() }).array().min(1) }).array(),
56   treasure: z.object({ floor: PositiveInt, items: z.object({ itemId: Id, quantity: PositiveInt }).array().min(1) }).array(),
57   mushrooms: z.object({ itemIds: Id.array().min(1), min: PositiveInt, max: PositiveInt }),
58   visuals: z.object({ floorManifestKey: Id, wallManifestKey: Id, ladderManifestKey: Id, chestManifestKey: Id, elevatorManifestKey: Id, mushroomManifestKey: Id, projectileManifestKey: Id, playerSwingManifestKey: Id, wallColor: z.number().int().min(0).max(0xffffff), ladderColor: z.number().int().min(0).max(0xffffff), chestColor: z.number().int().min(0).max(0xffffff), projectileColor: z.number().int().min(0).max(0xffffff) }),
59 });
60 export type MinesContent = z.infer<typeof MinesSchema>;
61 export type MineNodeDefinition = z.infer<typeof MineNodeSchema>;
62 export type MineWeaponDefinition = z.infer<typeof MineWeaponSchema>;
63 export type MineMonsterDefinition = z.infer<typeof MineMonsterSchema>;
64