afnm-types 0.6.44 → 0.6.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@ import { OverridableComponent } from '@mui/material/OverridableComponent';
4
4
  import { Buff } from './buff';
5
5
  import { EnemyEntity } from './entity';
6
6
  import { EventStep } from './event';
7
- import { Item, ItemDesc, ItemKind, MountItem } from './item';
7
+ import { Item, ItemKind, MountItem } from './item';
8
8
  import { Realm, RealmProgress } from './realm';
9
9
  import { IntimateTrait } from './dualCultivation';
10
10
  export interface Character {
@@ -16,6 +16,7 @@ export interface Character {
16
16
  condition: string;
17
17
  definitions: CharacterDefinition[];
18
18
  relationship?: CharacterRelationshipDefinition[];
19
+ relationshipPaths?: Record<string, CharacterRelationshipDefinition[]>;
19
20
  followInteraction?: FollowCharacterDefinition;
20
21
  portrait: string;
21
22
  image: string;
@@ -128,6 +129,7 @@ export interface CharacterState {
128
129
  sparCooldown: number;
129
130
  approval: number;
130
131
  relationshipIndex: number;
132
+ relationshipPath?: string;
131
133
  seenRelationshipProgressEvent: boolean;
132
134
  giftedKeys: string[];
133
135
  challengeCooldown: number;
@@ -171,9 +173,12 @@ export interface GiftCharacterInteraction extends BaseCharacterInteraction {
171
173
  introSteps: EventStep[];
172
174
  item: string;
173
175
  amount: number;
174
- alternates?: ItemDesc[];
175
176
  acceptSteps: EventStep[];
176
177
  declineSteps: EventStep[];
178
+ improvedItem?: string;
179
+ improvedAcceptSteps?: EventStep[];
180
+ veryImprovedItem?: string;
181
+ veryImprovedAcceptSteps?: EventStep[];
177
182
  }
178
183
  export interface CraftingCharacterInteraction extends BaseCharacterInteraction {
179
184
  itemKinds: ItemKind[];
@@ -17,6 +17,7 @@ export declare const craftingConditionToColour: Record<CraftingCondition, string
17
17
  export declare const craftingConditionToIcon: Record<CraftingCondition, OverridableComponent<SvgIconTypeMap<{}, 'svg'>>>;
18
18
  export interface RecipeConditionEffect {
19
19
  name: string;
20
+ displayName?: Translatable;
20
21
  colour: string;
21
22
  conditionEffects: Record<CraftingCondition, {
22
23
  tooltip: Translatable;
package/dist/event.d.ts CHANGED
@@ -33,7 +33,7 @@ export interface GameEvent {
33
33
  value: number;
34
34
  }[];
35
35
  }
36
- export type EventStep = TextStep | SpeechStep | CombatStep | CraftingStep | ChoiceStep | ConditionalStep | SetFlagStep | ExitStep | CreateBuffStep | ConsumeBuffStep | ChangeLocationStep | AddItemStep | RemoveItemStep | AddQuestStep | ChangeMoneyStep | ChangeFavourStep | AddDestinyStep | ChangeReputationStep | QiStep | UnlockLocationStep | ClearCharacterStep | SetCharacterStep | LabelStep | GotoLabelStep | UnlockCraftingTechniqueStep | TalkToCharacterStep | TradeWithCharacterStep | CraftWithCharacterStep | FightCharacterStep | MarkBeatCharacterStep | MarkDidEncounterStep | ChangeHpStep | PassTimeStep | ReportAnalyticsStep | ApprovalStep | ProgressRelationshipStep | MarkGiftedStep | UpdateCharacterDefinitionStep | AuctionStep | MarkCalendarEventCompleteStep | AddMultipleItemStep | AdvanceMysticalRegionStep | CraftSkillStep | TournamentStep | TeamUpStep | AddFollowerStep | ClearTeamUpStep | UnlockAltarStep | DropItemStep | SetAltarCooldownStep | CompressCoreStep | ChangeScreenStep | UnlockTechniqueStep | UnlockAuctionTechniqueStep | AddRecipeStep | AddManualStep | LearnNpcStancesStep | ReplaceItemStep | DualCultivationStep | ChangeBGMStep | ClearChangeBGMStep | AddGuildApprovalStep | AdvanceGuildRankStep | OverridePlayerRealmStep | SetAidBreakthroughCooldownStep | StoneCuttingStep | GiveItemStep | ChangePhysicalStatStep | ChangeSocialStatStep;
36
+ export type EventStep = TextStep | SpeechStep | CombatStep | CraftingStep | ChoiceStep | ConditionalStep | SetFlagStep | ExitStep | CreateBuffStep | ConsumeBuffStep | ChangeLocationStep | AddItemStep | RemoveItemStep | AddQuestStep | ChangeMoneyStep | ChangeFavourStep | AddDestinyStep | ChangeReputationStep | QiStep | UnlockLocationStep | ClearCharacterStep | SetCharacterStep | LabelStep | GotoLabelStep | UnlockCraftingTechniqueStep | TalkToCharacterStep | TradeWithCharacterStep | CraftWithCharacterStep | FightCharacterStep | MarkBeatCharacterStep | MarkDidEncounterStep | ChangeHpStep | PassTimeStep | ReportAnalyticsStep | ApprovalStep | ProgressRelationshipStep | MarkGiftedStep | UpdateCharacterDefinitionStep | AuctionStep | MarkCalendarEventCompleteStep | AddMultipleItemStep | AdvanceMysticalRegionStep | CraftSkillStep | TournamentStep | TeamUpStep | AddFollowerStep | BreakPartyStep | ClearTeamUpStep | UnlockAltarStep | DropItemStep | SetAltarCooldownStep | CompressCoreStep | ChangeScreenStep | UnlockTechniqueStep | UnlockAuctionTechniqueStep | AddRecipeStep | AddManualStep | LearnNpcStancesStep | ReplaceItemStep | DualCultivationStep | ChangeBGMStep | ClearChangeBGMStep | AddGuildApprovalStep | AdvanceGuildRankStep | OverridePlayerRealmStep | SetAidBreakthroughCooldownStep | StoneCuttingStep | GiveItemStep | ChangePhysicalStatStep | ChangeSocialStatStep | SelectRelationshipPathStep;
37
37
  export interface TextStep {
38
38
  kind: 'text';
39
39
  condition?: string;
@@ -88,7 +88,7 @@ export type EventChoiceCondition = RealmCondition | PhysicalStatisticCondition |
88
88
  export interface RealmCondition {
89
89
  kind: 'realm';
90
90
  realm: Realm;
91
- mode?: 'more' | 'exact' | 'less';
91
+ mode?: 'more' | 'exact' | 'less' | 'lessOrEqual';
92
92
  }
93
93
  interface PhysicalStatisticCondition {
94
94
  kind: 'physicalStatistic';
@@ -370,6 +370,12 @@ export interface ProgressRelationshipStep {
370
370
  condition?: string;
371
371
  character: string;
372
372
  }
373
+ export interface SelectRelationshipPathStep {
374
+ kind: 'selectRelationshipPath';
375
+ condition?: string;
376
+ character: string;
377
+ path: string;
378
+ }
373
379
  export interface UpdateCharacterDefinitionStep {
374
380
  kind: 'updateCharacterDefinition';
375
381
  condition?: string;
@@ -434,6 +440,10 @@ export interface AddFollowerStep {
434
440
  character: string;
435
441
  followDef: FollowCharacterDefinition | undefined;
436
442
  }
443
+ export interface BreakPartyStep {
444
+ kind: 'breakParty';
445
+ condition?: string;
446
+ }
437
447
  export interface ClearTeamUpStep {
438
448
  kind: 'clearTeamUp';
439
449
  condition?: string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The current game version, injected at compile time from package.json.
3
+ * Mod authors can use this as the `gameVersion` field in `getMetadata()`.
4
+ *
5
+ * @example
6
+ * import { GAME_VERSION } from 'afnm-types';
7
+ *
8
+ * export function getMetadata() {
9
+ * return {
10
+ * name: 'My Mod',
11
+ * version: '1.0.0',
12
+ * description: 'My awesome mod',
13
+ * author: { name: 'Me' },
14
+ * gameVersion: GAME_VERSION,
15
+ * };
16
+ * }
17
+ */
18
+ export declare const GAME_VERSION: string;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The current game version, injected at compile time from package.json.
3
+ * Mod authors can use this as the `gameVersion` field in `getMetadata()`.
4
+ *
5
+ * @example
6
+ * import { GAME_VERSION } from 'afnm-types';
7
+ *
8
+ * export function getMetadata() {
9
+ * return {
10
+ * name: 'My Mod',
11
+ * version: '1.0.0',
12
+ * description: 'My awesome mod',
13
+ * author: { name: 'Me' },
14
+ * gameVersion: GAME_VERSION,
15
+ * };
16
+ * }
17
+ */
18
+ export const GAME_VERSION = typeof __GAME_VERSION__ !== 'undefined' ? __GAME_VERSION__ : '';
package/dist/item.d.ts CHANGED
@@ -12,7 +12,7 @@ import { Realm, RealmProgress } from './realm';
12
12
  import { RecipeDifficulty } from './RecipeDifficulty';
13
13
  import { CombatStatsMap, CraftingStatsMap, PhysicalStatistic, Scaling, SocialStatistic } from './stat';
14
14
  import { Technique, TechniqueEffect } from './technique';
15
- export declare const itemKinds: readonly ["clothing", "talisman", "artefact", "mount", "cauldron", "flame", "upgrade", "fruit", "elixir", "recipe", "technique", "action", "transport_seal", "enchantment", "pill", "reagent", "concoction", "consumable", "recuperation", "formation", "breakthrough", "pillar_shard", "material", "flare", "mystical_key", "condensation_art", "blueprint", "trophy", "treasure", "token", "life_essence", "device", "manual"];
15
+ export declare const itemKinds: readonly ["clothing", "talisman", "artefact", "mount", "cauldron", "flame", "upgrade", "fruit", "elixir", "recipe", "technique", "action", "transport_seal", "enchantment", "pill", "reagent", "concoction", "consumable", "recuperation", "formation", "breakthrough", "pillar_shard", "material", "flare", "mystical_key", "condensation_art", "blueprint", "trophy", "treasure", "token", "life_essence", "device", "manual", "pillar_pattern"];
16
16
  export type ItemKind = (typeof itemKinds)[number];
17
17
  export declare const itemKindToName: {
18
18
  [key in ItemKind]: string;
@@ -25,7 +25,7 @@ export type ItemCostMap = {
25
25
  };
26
26
  export declare const buyItemCostMap: ItemCostMap;
27
27
  export declare const sellItemCostMap: ItemCostMap;
28
- export type Item = TechniqueItem | TechniqueCrystalItem | TechniqueShardItem | TechniqueEnhancementDust | TransportSealItem | SpiritFruitItem | RecipeItem | ElixirItem | TreasureItem | CraftingItem | ClothingItem | TalismanItem | ArtefactItem | PillItem | ConcoctionItem | CombatItem | CauldronItem | FlameItem | BreakthroughItem | RecuperationItem | MountItem | FlareItem | CraftingTechniqueItem | EnchantmentItem | MysticalKeyItem | CondensationArtItem | FormationItem | PillarShardItem | TrophyItem | BlueprintItem | TokenItem | UpgradeItem | CraftingReagentItem | LifeEssenceItem | DeviceItem | ManualItem;
28
+ export type Item = TechniqueItem | TechniqueCrystalItem | TechniqueShardItem | TechniqueEnhancementDust | TransportSealItem | SpiritFruitItem | RecipeItem | ElixirItem | TreasureItem | CraftingItem | ClothingItem | TalismanItem | ArtefactItem | PillItem | ConcoctionItem | CombatItem | CauldronItem | FlameItem | BreakthroughItem | RecuperationItem | MountItem | FlareItem | CraftingTechniqueItem | EnchantmentItem | MysticalKeyItem | CondensationArtItem | FormationItem | PillarShardItem | TrophyItem | BlueprintItem | TokenItem | UpgradeItem | CraftingReagentItem | LifeEssenceItem | DeviceItem | ManualItem | PillarPatternItem;
29
29
  interface ItemBase {
30
30
  kind: ItemKind;
31
31
  name: string;
@@ -450,6 +450,9 @@ export interface PillarShardItem extends ItemBase {
450
450
  maxInstances?: number;
451
451
  variants?: PillarShardVariant[];
452
452
  stability?: number;
453
+ portal?: {
454
+ type: 'entrance' | 'exit';
455
+ };
453
456
  inputs?: {
454
457
  left?: number;
455
458
  right?: number;
@@ -491,4 +494,21 @@ export interface LifeEssenceItem extends ItemBase {
491
494
  techniques: Technique[];
492
495
  }[];
493
496
  }
497
+ export interface PillarPatternItem extends ItemBase {
498
+ kind: 'pillar_pattern';
499
+ shards: {
500
+ name: string;
501
+ pos: {
502
+ x: number;
503
+ y: number;
504
+ rotation: number;
505
+ };
506
+ overrideInput?: {
507
+ top?: number;
508
+ bottom?: number;
509
+ left?: number;
510
+ right?: number;
511
+ };
512
+ }[];
513
+ }
494
514
  export {};
package/dist/item.js CHANGED
@@ -32,6 +32,7 @@ export const itemKinds = [
32
32
  'life_essence',
33
33
  'device',
34
34
  'manual',
35
+ 'pillar_pattern',
35
36
  ];
36
37
  export const itemKindToName = {
37
38
  clothing: 'Clothing',
@@ -67,6 +68,7 @@ export const itemKindToName = {
67
68
  life_essence: 'Life Essence',
68
69
  device: 'Device',
69
70
  manual: 'Manual',
71
+ pillar_pattern: 'Pillar Pattern',
70
72
  };
71
73
  export const itemKindPluralToName = {
72
74
  clothing: 'Clothing',
@@ -102,6 +104,7 @@ export const itemKindPluralToName = {
102
104
  life_essence: 'Life Essences',
103
105
  device: 'Devices',
104
106
  manual: 'Manuals',
107
+ pillar_pattern: 'Pillar Patterns',
105
108
  };
106
109
  export const buyItemCostMap = {
107
110
  technique: 3000,
@@ -137,6 +140,7 @@ export const buyItemCostMap = {
137
140
  life_essence: 5000,
138
141
  device: 2500,
139
142
  manual: 15000,
143
+ pillar_pattern: 3000,
140
144
  };
141
145
  export const sellItemCostMap = {
142
146
  technique: 400,
@@ -172,6 +176,7 @@ export const sellItemCostMap = {
172
176
  life_essence: 1000,
173
177
  device: 600,
174
178
  manual: 0,
179
+ pillar_pattern: 500,
175
180
  };
176
181
  export const pillKindToName = {
177
182
  combat: 'Combat Pill',
@@ -37,4 +37,5 @@ export const itemTypeToHarmonyType = {
37
37
  upgrade: 'forge',
38
38
  life_essence: 'resonance',
39
39
  manual: 'resonance',
40
+ pillar_pattern: 'resonance',
40
41
  };
@@ -96,6 +96,27 @@ export interface LocationEvent {
96
96
  min: number;
97
97
  max: number;
98
98
  };
99
+ /**
100
+ * Marks this event as part of the global pity pool.
101
+ *
102
+ * **Pity counter**: All pity events share a single global attempt counter
103
+ * (`globalSpecialEventPity` flag). Each exploration where at least one pity
104
+ * event was eligible but none fired increments the counter; any pity event
105
+ * firing resets it to zero. The event's rarity weight is multiplied by
106
+ * min(1 + counter × 0.1, 5) — reaching 5× base weight after roughly 40
107
+ * consecutive failed attempts.
108
+ *
109
+ * **Exclusivity multiplier**: Before the pity counter is applied, each pity
110
+ * event receives a player-specific multiplier drawn from a fixed odds list
111
+ * (e.g. [10×, 8×, 4×, 2×, 1×]). The list is shuffled per-player using a
112
+ * hash of their name, so every player has the same distribution of chances
113
+ * but with different events in each tier. This guarantees every player
114
+ * stumbles into at least one exclusive event easily while having to actively
115
+ * seek out others. A floor of 1 weight slot is always kept so the pity
116
+ * counter can still accumulate and eventually guarantee the event for every
117
+ * player.
118
+ */
119
+ pity?: true;
99
120
  }
100
121
  export interface LocationMapEvent {
101
122
  event: EventStep[];
package/dist/mod.d.ts CHANGED
@@ -16,6 +16,7 @@ import { Guild } from './guild';
16
16
  import { Crop } from './herbField';
17
17
  import { Enchantment, EnchantmentDesc, Item, ItemDesc, ManualItem, RecipeItem, UncutStonePool } from './item';
18
18
  import { ConditionalLink, ExplorationLink, GameLocation, LocationBuilding, LocationEnemy, LocationEvent, LocationMapEvent, SectMission, CraftingMission } from './location';
19
+ import { Rarity } from './rarity';
19
20
  import { MineChamber } from './mine';
20
21
  import { Quest } from './quest';
21
22
  import { Realm, RealmProgress } from './realm';
@@ -79,6 +80,8 @@ export interface ModMetadata {
79
80
  author: {
80
81
  name: string;
81
82
  };
83
+ /** The game version this mod was compiled against. Set this to GAME_VERSION imported from afnm-types. */
84
+ gameVersion?: string;
82
85
  }
83
86
  export interface ModReduxAPI {
84
87
  /**
@@ -271,6 +274,30 @@ export interface ModReduxAPI {
271
274
  backgroundImage: string;
272
275
  screenEffect: ScreenEffectType;
273
276
  }) => void;
277
+ /**
278
+ * Execute a crafting technique during an active crafting session.
279
+ * Has the same effect as clicking the technique button in the crafting UI.
280
+ * Should only be called while a crafting session is active.
281
+ * @param technique - The fully resolved CraftingTechnique to execute
282
+ * @example
283
+ * const technique = api.craftingTechniqueFromKnown(knownTechnique);
284
+ * executeCraftingTechnique(technique);
285
+ */
286
+ executeCraftingTechnique: (technique: CraftingTechnique) => void;
287
+ /**
288
+ * Preview the result of executing a crafting technique without modifying game state.
289
+ * Deep-clones the provided CraftingState, runs the technique on the copy, and returns
290
+ * the resulting CraftingState. No Redux actions are dispatched.
291
+ * @param technique - The fully resolved CraftingTechnique to preview
292
+ * @param state - The current CraftingState (e.g. from useSelector(s => s.crafting))
293
+ * @returns A new CraftingState reflecting the outcome of executing the technique
294
+ * @example
295
+ * const craftingState = api.useSelector(state => state.crafting);
296
+ * const technique = api.craftingTechniqueFromKnown(knownTechnique);
297
+ * const preview = previewCraftingTechnique(technique, craftingState);
298
+ * console.log('Completion after:', preview.progressState?.completion);
299
+ */
300
+ previewCraftingTechnique: (technique: CraftingTechnique, state: CraftingState) => CraftingState;
274
301
  };
275
302
  components: {
276
303
  GameDialog: GameDialogFC;
@@ -600,6 +627,17 @@ export interface ModAPI {
600
627
  * addCraftingMissionsToLocation('Crafting Hall', [window.modAPI.utils.createCraftingMission(...)]);
601
628
  */
602
629
  addCraftingMissionsToLocation: (location: string, missions: CraftingMission[]) => void;
630
+ /**
631
+ * Add a quest to a location's request board.
632
+ * @param quest - Quest to add
633
+ * @param realm - Realm tier this quest appears for
634
+ * @param rarity - Rarity of the quest
635
+ * @param condition - Condition expression for availability (e.g. '1' for always available)
636
+ * @param location - Location key (must have a request board building)
637
+ * @example
638
+ * addQuestToRequestBoard(myQuest, 'qiCondensation', 'qitouched', '1', 'Liang Tiao Village');
639
+ */
640
+ addQuestToRequestBoard: (quest: Quest, realm: Realm, rarity: Rarity, condition: string, location: string) => void;
603
641
  /**
604
642
  * Add a manual to the Manual Pagoda.
605
643
  * @param manual - Manual configuration
package/dist/stat.d.ts CHANGED
@@ -55,7 +55,7 @@ export declare const physicalStatToDescription: {
55
55
  };
56
56
  export declare const reputationDescription = "Reputation affects a factions attitude towards you. High reputation reduces prices, unlocks quests, and allows the purchase of valuable items.";
57
57
  export declare const reputationPerTier = 5;
58
- export declare const reputationTiers: readonly ["neutral", "friendly", "respected", "honoured", "revered", "exalted", "wary", "disliked", "hated", "reviled"];
58
+ export declare const reputationTiers: readonly ["neutral", "friendly", "respected", "honoured", "revered", "exalted"];
59
59
  export type ReputationTier = (typeof reputationTiers)[number];
60
60
  export declare const reputationTierToReputation: Record<ReputationTier, number>;
61
61
  export declare const reputationTierToName: Record<ReputationTier, string>;
package/dist/stat.js CHANGED
@@ -300,10 +300,6 @@ export const reputationTiers = [
300
300
  'honoured',
301
301
  'revered',
302
302
  'exalted',
303
- 'wary',
304
- 'disliked',
305
- 'hated',
306
- 'reviled',
307
303
  ];
308
304
  export const reputationTierToReputation = {
309
305
  neutral: 0,
@@ -312,10 +308,6 @@ export const reputationTierToReputation = {
312
308
  honoured: reputationPerTier * 3,
313
309
  revered: reputationPerTier * 4,
314
310
  exalted: reputationPerTier * 5,
315
- wary: -reputationPerTier,
316
- disliked: -reputationPerTier * 2,
317
- hated: -reputationPerTier * 3,
318
- reviled: -reputationPerTier * 4,
319
311
  };
320
312
  export const reputationTierToName = {
321
313
  neutral: 'Neutral (-)',
@@ -324,10 +316,6 @@ export const reputationTierToName = {
324
316
  honoured: 'Honoured (III)',
325
317
  revered: 'Revered (IV)',
326
318
  exalted: 'Exalted (V)',
327
- wary: 'Wary (I-)',
328
- disliked: 'Disliked (II-)',
329
- hated: 'Hated (III-)',
330
- reviled: 'Reviled (IV-)',
331
319
  };
332
320
  export const reputationTierToNameOnly = {
333
321
  neutral: 'Neutral',
@@ -336,8 +324,4 @@ export const reputationTierToNameOnly = {
336
324
  honoured: 'Honoured',
337
325
  revered: 'Revered',
338
326
  exalted: 'Exalted',
339
- wary: 'Wary',
340
- disliked: 'Disliked',
341
- hated: 'Hated',
342
- reviled: 'Reviled',
343
327
  };
@@ -109,7 +109,7 @@ interface ConsumeTargetTechniqueEffect extends BaseTechniqueEffect {
109
109
  amount: Scaling;
110
110
  hideBuff?: boolean;
111
111
  }
112
- interface DamageTechniqueEffect extends BaseTechniqueEffect {
112
+ export interface DamageTechniqueEffect extends BaseTechniqueEffect {
113
113
  kind: 'damage';
114
114
  amount: Scaling;
115
115
  hits?: Scaling;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "afnm-types",
3
- "version": "0.6.44",
3
+ "version": "0.6.45",
4
4
  "description": "Type definitions for Ascend From Nine Mountains",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",