afnm-types 0.6.11 → 0.6.16

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.
@@ -1 +1 @@
1
- export type GameScreen = 'location' | 'recipe' | 'mission' | 'craftingHall' | 'manual' | 'cultivation' | 'map' | 'healer' | 'market' | 'favour' | 'herbField' | 'mine' | 'recipeLibrary' | 'requestBoard' | 'compendium' | 'library' | 'altar' | 'research' | 'pillarGrid' | 'fallenStar';
1
+ export type GameScreen = 'location' | 'recipe' | 'mission' | 'craftingHall' | 'manual' | 'cultivation' | 'map' | 'healer' | 'market' | 'favour' | 'herbField' | 'mine' | 'recipeLibrary' | 'requestBoard' | 'compendium' | 'library' | 'altar' | 'research' | 'pillarGrid' | 'fallenStar' | 'trainingGround';
package/dist/buff.d.ts CHANGED
@@ -30,6 +30,7 @@ export interface Buff {
30
30
  canStack: boolean;
31
31
  effectHint?: string;
32
32
  tooltip?: string;
33
+ additionalTooltip?: string;
33
34
  flag?: string;
34
35
  condition?: TechniqueCondition;
35
36
  removeOnConditionFailed?: boolean;
@@ -18,6 +18,11 @@ export interface Character {
18
18
  portrait: string;
19
19
  image: string;
20
20
  imageScale?: number;
21
+ imageOverride?: {
22
+ image: string;
23
+ portrait: string;
24
+ condition: string;
25
+ }[];
21
26
  }
22
27
  export declare const characterRelationships: readonly ["Hostile", "Neutral", "Friendly", "Intimate"];
23
28
  export type CharacterRelationship = (typeof characterRelationships)[number];
package/dist/entity.d.ts CHANGED
@@ -41,6 +41,8 @@ export interface PlayerEntity {
41
41
  storedCraftingLoadouts?: StoredCraftingLoadout[];
42
42
  craftingQuickAccess?: (string | undefined)[];
43
43
  craftingTechniques: KnownCraftingTechnique[];
44
+ currentEquipmentLoadout?: StoredEquipmentLoadout;
45
+ storedEquipmentLoadouts?: StoredEquipmentLoadout[];
44
46
  destiny: string[];
45
47
  monthBuffs?: Buff[];
46
48
  injured?: boolean;
@@ -212,4 +214,17 @@ export interface StoredCraftingLoadout {
212
214
  autoName?: boolean;
213
215
  loadout: string[];
214
216
  }
217
+ export interface StoredEquipmentLoadout {
218
+ name: string;
219
+ id: string;
220
+ autoName?: boolean;
221
+ equipment: {
222
+ clothing?: ItemDesc;
223
+ talismans: (ItemDesc | undefined)[];
224
+ artefacts: (ItemDesc | undefined)[];
225
+ mount?: ItemDesc;
226
+ cauldron?: ItemDesc;
227
+ flame?: ItemDesc;
228
+ };
229
+ }
215
230
  export {};
package/dist/guild.d.ts CHANGED
@@ -3,6 +3,10 @@ import { OverridableComponent } from '@mui/material/OverridableComponent';
3
3
  import { EventStep } from './event';
4
4
  import { ShopItem } from './location';
5
5
  import { ScreenEffectType } from './ScreenEffectType';
6
+ export interface GuildMission {
7
+ quest: string;
8
+ condition: string;
9
+ }
6
10
  export interface Guild {
7
11
  name: string;
8
12
  description: string;
@@ -12,7 +16,7 @@ export interface Guild {
12
16
  screenEffect: ScreenEffectType;
13
17
  ranks: Record<number, string>;
14
18
  rankShop: Record<number, ShopItem[]>;
15
- rankQuests: Record<number, string[]>;
19
+ rankQuests: Record<number, GuildMission[]>;
16
20
  reputationToPromote: Record<number, number>;
17
21
  promotionQuests: Record<number, {
18
22
  title: string;
package/dist/house.d.ts CHANGED
@@ -14,7 +14,7 @@ export interface House {
14
14
  transportSeal: TransportSealItem;
15
15
  qiDensity: number;
16
16
  fixedRooms: Room[];
17
- freeRooms: number;
17
+ freeRooms: string;
18
18
  }
19
19
  export interface HouseData {
20
20
  densityFormation: ItemDesc | undefined;
package/dist/item.d.ts CHANGED
@@ -168,6 +168,7 @@ export interface CombatItem extends ItemBase {
168
168
  kind: 'consumable';
169
169
  effects: TechniqueEffect[];
170
170
  tooltip?: string;
171
+ affinity?: TechniqueElement;
171
172
  }
172
173
  export interface ConsumablePillItem extends BasePillItem {
173
174
  pillKind: 'consumable';
package/dist/mod.d.ts CHANGED
@@ -15,7 +15,7 @@ import { AuctionStep, CombatStep, CraftingStep, DualCultivationStep, EventStep,
15
15
  import { Guild } from './guild';
16
16
  import { Crop } from './herbField';
17
17
  import { Enchantment, Item, ItemDesc, RecipeItem, UncutStonePool } from './item';
18
- import { ConditionalLink, ExplorationLink, GameLocation, LocationEnemy, LocationEvent } from './location';
18
+ import { ConditionalLink, ExplorationLink, GameLocation, LocationBuilding, LocationEnemy, LocationEvent, LocationMapEvent, SectMission, CraftingMission } from './location';
19
19
  import { Manual } from './manual';
20
20
  import { MineChamber } from './mine';
21
21
  import { Quest } from './quest';
@@ -33,6 +33,7 @@ import { SoundEffectName } from './audio';
33
33
  import { ScreenEffectType } from './ScreenEffectType';
34
34
  import { RootState } from './reduxState';
35
35
  import { GameButtonFC, GameDialogFC, GameIconButtonFC, MemoBackgroundImageFC } from './components';
36
+ import { PuppetType } from './trainingGround';
36
37
  export interface ModMetadata {
37
38
  name: string;
38
39
  version: string;
@@ -42,30 +43,184 @@ export interface ModMetadata {
42
43
  };
43
44
  }
44
45
  export interface ModReduxAPI {
46
+ /**
47
+ * Hook to access the Redux store state. Works like React Redux's useSelector.
48
+ * @param selector - Function that extracts data from the RootState
49
+ * @returns The selected data from the store
50
+ * @example
51
+ * const playerRealm = useSelector((state) => state.player.realm);
52
+ * const inventory = useSelector((state) => state.inventory.items);
53
+ */
45
54
  useSelector: <TSelected>(selector: (state: RootState) => TSelected) => TSelected;
55
+ /**
56
+ * Hook to access game flags used for tracking quest progress and game state.
57
+ * @returns Object containing flags map and serialized JSON representation
58
+ * @example
59
+ * const { flags, flagsJSON } = useGameFlags();
60
+ * const questProgress = flags['main_quest_stage'] || 0;
61
+ */
46
62
  useGameFlags: () => {
47
63
  flags: Record<string, number>;
48
64
  flagsJSON: string;
49
65
  };
66
+ /**
67
+ * Hook to get a function for playing sound effects.
68
+ * @returns Function that plays a sound effect by name
69
+ * @example
70
+ * const playSfx = usePlaySfx();
71
+ * playSfx('Select');
72
+ */
50
73
  usePlaySfx: () => (name: SoundEffectName) => void;
74
+ /**
75
+ * Hook to register keyboard shortcuts
76
+ * @param priority - Higher numbers take precedence (0-100 typical)
77
+ * @param binding - Map of key names to callback functions
78
+ * @param disableSpaceOverride - If true, spacebar won't be overridden to map to Enter
79
+ * @example
80
+ * useKeybinding(10, {
81
+ * 'Escape': () => closeDialog(),
82
+ * 'Enter': () => confirmAction(),
83
+ * 'i': () => openInventory()
84
+ * });
85
+ */
51
86
  useKeybinding: (priority: number, binding: Record<string, () => void> | undefined, disableSpaceOverride?: boolean) => void;
52
87
  actions: {
88
+ /**
89
+ * Navigate to a different game screen.
90
+ * @param screen - Screen identifier (e.g., 'location', 'market', 'auction')
91
+ * @example
92
+ * setScreen('my_mod_custom_screen');
93
+ */
53
94
  setScreen: (screen: string) => void;
95
+ /**
96
+ * Set or update a game flag value.
97
+ * @param flag - Flag identifier (e.g., 'quest_started', 'boss_defeated')
98
+ * @param value - Numeric value to set (typically 0/1 for booleans, or progress counters)
99
+ * @example
100
+ * setFlag('tutorial_complete', 1);
101
+ * setFlag('quest_stage', 3);
102
+ */
54
103
  setFlag: (flag: string, value: number) => void;
104
+ /**
105
+ * Store custom mod-specific data in save file.
106
+ * @param modName - Name of your mod (for namespacing)
107
+ * @param key - Data key identifier
108
+ * @param data - Any JSON-serializable data
109
+ * @example
110
+ * setModData('myMod', 'customNPC_affinity', { npcId: 'elder_li', value: 75 });
111
+ */
55
112
  setModData: (modName: string, key: string, data: any) => void;
113
+ /**
114
+ * Move player to a different location on the world map.
115
+ * @param location - Location key from the locations data
116
+ * @example
117
+ * setLocation('Liang Tiao Village');
118
+ * setLocation('Shen Henda City');
119
+ */
56
120
  setLocation: (location: string) => void;
121
+ /**
122
+ * Update player entity stats and attributes.
123
+ * @param player - Player entity with properties to update
124
+ * @example
125
+ * updatePlayer(newPlayer);
126
+ */
57
127
  updatePlayer: (player: PlayerEntity) => void;
128
+ /**
129
+ * Advance the game calendar by specified days.
130
+ * @param days - Number of days to advance
131
+ * @example
132
+ * advanceDays(7); // Skip one week
133
+ * advanceDays(30); // Skip one month
134
+ */
58
135
  advanceDays: (days: number) => void;
136
+ /**
137
+ * Add a quest to the player's quest log.
138
+ * @param quest - Quest identifier key
139
+ * @example
140
+ * addQuest('Burning Bridges');
141
+ * addQuest('Shadow Cloak');
142
+ */
59
143
  addQuest: (quest: string) => void;
144
+ /**
145
+ * Add an item to player inventory.
146
+ * @param item - Item descriptor with name and optional properties
147
+ * @example
148
+ * addItem({ name: 'Spirit Core (III)', count: 10 });
149
+ * addItem({ name: 'Nine Mountain Hammer', count: 1, quality: 5 });
150
+ */
60
151
  addItem: (item: ItemDesc) => void;
152
+ /**
153
+ * Remove items from player inventory.
154
+ * @param itemName - Name of the item to remove
155
+ * @param count - Number of items to remove
156
+ * @example
157
+ * removeItem('Spirit Core (I)', 5);
158
+ * removeItem('Healing Pill (III)', 1);
159
+ */
61
160
  removeItem: (itemName: string, count: number) => void;
161
+ /**
162
+ * Teach the player a crafting recipe.
163
+ * @param item - Item name that the recipe produces
164
+ * @example
165
+ * learnRecipe('Healing Pill (III) Recipe');
166
+ */
62
167
  learnRecipe: (item: string) => void;
168
+ /**
169
+ * Teach the player a combat technique.
170
+ * @param technique - Technique identifier key
171
+ * @example
172
+ * learnTechnique('Gale Blast');
173
+ * learnTechnique('Advancing Fist');
174
+ */
63
175
  learnTechnique: (technique: string) => void;
176
+ /**
177
+ * Teach the player a crafting action/technique.
178
+ * @param action - Crafting action identifier
179
+ * @example
180
+ * learnCraftingAction('Toxic Fusion');
181
+ * learnCraftingAction('Gentle Repair');
182
+ */
64
183
  learnCraftingAction: (action: string) => void;
184
+ /**
185
+ * Modify player's spirit stones.
186
+ * @param amount - Amount to add (positive) or subtract (negative)
187
+ * @example
188
+ * changeMoney(100); // Add 100 spirit stones
189
+ * changeMoney(-50); // Remove 50 spirit stones
190
+ */
65
191
  changeMoney: (amount: number) => void;
192
+ /**
193
+ * Modify player's qi.
194
+ * @param amount - Amount to add (positive) or subtract (negative)
195
+ * @example
196
+ * changeQi(50); // Restore 50 qi
197
+ * changeQi(-20); // Consume 20 qi
198
+ */
66
199
  changeQi: (amount: number) => void;
200
+ /**
201
+ * Modify sect favour.
202
+ * @param amount - Amount to add (positive) or subtract (negative)
203
+ * @example
204
+ * changeFavour(10); // Gain 10 favour
205
+ * changeFavour(-5); // Lose 5 favour
206
+ */
67
207
  changeFavour: (amount: number) => void;
208
+ /**
209
+ * Start a game event.
210
+ * @param event - Event configuration with steps
211
+ * @example
212
+ * startEvent({ location: "Liang Tiao Village", steps: [{ type: 'text', text: 'Welcome!' }] });
213
+ */
68
214
  startEvent: (event: GameEvent) => void;
215
+ /**
216
+ * Initiate combat encounter.
217
+ * @param enemies - Array of enemy entities to fight
218
+ * @param playerBuffs - Buffs to apply to player at combat start
219
+ * @param locationBackgroundOverride - Optional custom background for combat
220
+ * @example
221
+ * startCombat([ratascar], []);
222
+ * startCombat([boss], [strengthBuff], { backgroundImage: 'boss_arena.png', screenEffect: 'mist' });
223
+ */
69
224
  startCombat: (enemies: EnemyEntity[], playerBuffs: Buff[], locationBackgroundOverride?: {
70
225
  backgroundImage: string;
71
226
  screenEffect: ScreenEffectType;
@@ -166,74 +321,600 @@ export interface ModAPI {
166
321
  mysticalRegionBlessings: Blessing[];
167
322
  harmonyConfigs: Record<RecipeHarmonyType, HarmonyTypeConfig>;
168
323
  itemTypeToHarmonyType: Record<ItemKind, RecipeHarmonyType>;
324
+ puppets: PuppetType[];
169
325
  };
170
326
  actions: {
327
+ /**
328
+ * Add a background option for character creation (birth stage).
329
+ * @param background - Background configuration with stats and description
330
+ */
171
331
  addBirthBackground: (background: Background) => void;
332
+ /**
333
+ * Add a background option for character creation (childhood stage).
334
+ * @param background - Background configuration for childhood events
335
+ */
172
336
  addChildBackground: (background: Background) => void;
337
+ /**
338
+ * Add a background option for character creation (teenage stage).
339
+ * @param background - Background configuration for teenage experiences
340
+ */
173
341
  addTeenBackground: (background: Background) => void;
342
+ /**
343
+ * Register a new item type in the game.
344
+ * @param item - Complete item definition with stats and properties
345
+ */
174
346
  addItem: (item: Item) => void;
347
+ /**
348
+ * Add an item to a shop's inventory.
349
+ * @param item - Item to add
350
+ * @param stacks - Number of stacks available
351
+ * @param location - Location of the shop
352
+ * @param realm - Required realm to purchase
353
+ * @param valueModifier - (Optional) Price multiplier (default 1.0)
354
+ * @param reputation - (Optional) Required reputation tier
355
+ */
175
356
  addItemToShop: (item: Item, stacks: number, location: string, realm: Realm, valueModifier?: number, reputation?: ReputationTier) => void;
357
+ /**
358
+ * Add an item to a guild's rank shop.
359
+ * @param item - Item to add
360
+ * @param stacks - Number of stacks available
361
+ * @param guild - Name of the guild
362
+ * @param rank - Required guild rank to purchase
363
+ * @param valueModifier - (Optional) Price multiplier (default 1.0)
364
+ * @param reputation - (Optional) Required reputation tier
365
+ */
366
+ addItemToGuild: (item: Item, stacks: number, guild: string, rank: number, valueModifier?: number, reputation?: ReputationTier) => void;
367
+ /**
368
+ * Add a crafting recipe to the sect recipe library.
369
+ * @param item - Recipe item configuration
370
+ */
176
371
  addRecipeToLibrary: (item: RecipeItem) => void;
372
+ /**
373
+ * Add an item to auction house pool.
374
+ * @param item - Item to add
375
+ * @param chance - Spawn chance (0-1). Default 1 unless you want it to be extra rare
376
+ * @param condition - Condition expression for availability. Normally should be '1'
377
+ * @param countOverride - Override stack count
378
+ * @param countMultiplier - Multiply default count
379
+ * @example
380
+ * addItemToAuction(rareRecipe, 1, '1');
381
+ */
177
382
  addItemToAuction: (item: Item, chance: number, condition: string, countOverride?: number, countMultiplier?: number) => void;
383
+ /**
384
+ * Add a recipe that can be researched from a base item.
385
+ * @param baseItem - Item that enables research
386
+ * @param recipe - Recipe to unlock
387
+ * @example
388
+ * addRecipeToResearch(ancientScroll, advancedPillRecipe);
389
+ */
178
390
  addRecipeToResearch: (baseItem: Item, recipe: RecipeItem) => void;
391
+ /**
392
+ * Register a new character.
393
+ * @param character - Complete character definition
394
+ */
179
395
  addCharacter: (character: Character) => void;
396
+ /**
397
+ * Add a breakthrough for a realm.
398
+ * @param realm - Target realm
399
+ * @param breakthrough - Breakthrough configuration
400
+ */
180
401
  addBreakthrough: (realm: Realm, breakthrough: Breakthrough) => void;
402
+ /**
403
+ * Add a recurring calendar event.
404
+ * @param event - Calendar event configuration
405
+ * @example
406
+ * addCalendarEvent({ name: 'Moon Festival', condition: '1', year: 1066, month: 8 });
407
+ */
181
408
  addCalendarEvent: (event: CalendarEvent) => void;
409
+ /**
410
+ * Register a new crafting action.
411
+ * @param action - Crafting action definition
412
+ */
182
413
  addCraftingTechnique: (technique: CraftingTechnique) => void;
414
+ /**
415
+ * Add a destiny
416
+ * @param destiny - Destiny configuration
417
+ */
183
418
  addDestiny: (destiny: Destiny) => void;
419
+ /**
420
+ * Add an event that triggers on conditions.
421
+ * @param event - Triggered event configuration
422
+ */
184
423
  addTriggeredEvent: (event: TriggeredEvent) => void;
424
+ /**
425
+ * Add a crop type for herb gardens.
426
+ * @param realm - Required realm to plant
427
+ * @param crop - Crop configuration
428
+ * @example
429
+ * addCrop('qi_condensation', { item: 'Twisted Vine', yield: 5, growthDays: 30 });
430
+ */
185
431
  addCrop: (realm: Realm, crop: Crop) => void;
432
+ /**
433
+ * Register a new world location.
434
+ * @param location - Complete location definition
435
+ */
186
436
  addLocation: (location: GameLocation) => void;
437
+ /**
438
+ * Create a link between two locations.
439
+ * @param existing - Source location key
440
+ * @param link - Link configuration
441
+ * @example
442
+ * linkLocations('Liang Tiao Village', { location: myLocation, distance: 5, condition: "my_unlock_flag" });
443
+ */
187
444
  linkLocations: (existing: string, link: ConditionalLink | ExplorationLink) => void;
445
+ /**
446
+ * Add buildings to an existing location.
447
+ * @param location - Location key
448
+ * @param buildings - Buildings to add
449
+ * @example
450
+ * addBuildingsToLocation('Liang Tiao Village', [{ kind: 'healer' }]);
451
+ */
452
+ addBuildingsToLocation: (location: string, buildings: LocationBuilding[]) => void;
453
+ /**
454
+ * Add enemies to an existing location.
455
+ * @param location - Location key
456
+ * @param enemies - Enemy configurations
457
+ */
458
+ addEnemiesToLocation: (location: string, enemies: LocationEnemy[]) => void;
459
+ /**
460
+ * Add events to an existing location.
461
+ * @param location - Location key
462
+ * @param events - Event configurations
463
+ */
464
+ addEventsToLocation: (location: string, events: LocationEvent[]) => void;
465
+ /**
466
+ * Add exploration events to an existing location.
467
+ * @param location - Location key
468
+ * @param events - Exploration event configurations
469
+ */
470
+ addExplorationEventsToLocation: (location: string, events: LocationEvent[]) => void;
471
+ /**
472
+ * Add map events to an existing location.
473
+ * @param location - Location key
474
+ * @param mapEvents - Map event configurations
475
+ */
476
+ addMapEventsToLocation: (location: string, mapEvents: LocationMapEvent[]) => void;
477
+ /**
478
+ * Add sect missions to an existing location.
479
+ * @param location - Location key
480
+ * @param missions - Mission configurations
481
+ * @example
482
+ * addMissionsToLocation('Sect Hall', [window.modAPI.utils.createCullingMission(...)]);
483
+ */
484
+ addMissionsToLocation: (location: string, missions: SectMission[]) => void;
485
+ /**
486
+ * Add crafting missions to an existing location.
487
+ * @param location - Location key
488
+ * @param missions - Crafting mission configurations
489
+ * @example
490
+ * addCraftingMissionsToLocation('Crafting Hall', [window.modAPI.utils.createCraftingMission(...)]);
491
+ */
492
+ addCraftingMissionsToLocation: (location: string, missions: CraftingMission[]) => void;
493
+ /**
494
+ * Add a manual to the Manual Pagoda.
495
+ * @param manual - Manual configuration
496
+ */
188
497
  addManual: (manual: Manual) => void;
498
+ /**
499
+ * Add a chamber to the spirit stone mine.
500
+ * @param realm - Required realm
501
+ * @param progress - Realm progress level
502
+ * @param chamber - Chamber configuration
503
+ */
189
504
  addMineChamber: (realm: Realm, progress: RealmProgress, chamber: MineChamber) => void;
505
+ /**
506
+ * Register a new quest.
507
+ * @param quest - Complete quest definition
508
+ */
190
509
  addQuest: (quest: Quest) => void;
510
+ /**
511
+ * Add a combat technique.
512
+ * @param technique - Technique configuration
513
+ */
191
514
  addTechnique: (technique: Technique) => void;
515
+ /**
516
+ * Register background music tracks.
517
+ * @param name - Music identifier
518
+ * @param path - Array of file paths (for variants)
519
+ * @example
520
+ * addMusic('boss_theme', ['audio/boss1.ogg', 'audio/boss2.ogg']);
521
+ */
192
522
  addMusic: (name: string, path: string[]) => void;
523
+ /**
524
+ * Register a sound effect.
525
+ * @param name - Sound effect identifier
526
+ * @param path - File path
527
+ * @example
528
+ * addSfx('sword_clash', 'audio/sfx/sword_clash.ogg');
529
+ */
193
530
  addSfx: (name: string, path: string) => void;
531
+ /**
532
+ * Add a joinable organisation.
533
+ * @param guild - Guild configuration
534
+ */
194
535
  addGuild: (guild: Guild) => void;
536
+ /**
537
+ * Add a dual cultivation technique.
538
+ * @param technique - Intimate technique configuration
539
+ */
195
540
  addDualCultivationTechnique: (technique: IntimateTechnique) => void;
541
+ /**
542
+ * Register an equipment enchantment.
543
+ * @param enchantment - Enchantment configuration
544
+ */
196
545
  addEnchantment: (enchantment: Enchantment) => void;
546
+ /**
547
+ * Add a fallen star.
548
+ * @param fallenStar - Fallen star configuration
549
+ */
197
550
  addFallenStar: (fallenStar: FallenStar) => void;
551
+ /**
552
+ * Add a room type for player housing.
553
+ * @param room - Room configuration
554
+ */
198
555
  addRoom: (room: Room) => void;
556
+ /**
557
+ * Add a researchable recipe linked to an item.
558
+ * @param baseItem - Item key that enables research
559
+ * @param recipe - Recipe to unlock
560
+ * @example
561
+ * addResearchableRecipe('ancient_cauldron', advancedPillRecipe);
562
+ */
199
563
  addResearchableRecipe: (baseItem: string, recipe: RecipeItem) => void;
564
+ /**
565
+ * Add an uncut stone to stone cutting pool.
566
+ * @param realm - Required realm
567
+ * @param uncutStone - Stone item
568
+ */
200
569
  addUncutStone: (realm: Realm, uncutStone: Item) => void;
570
+ /**
571
+ * Add a blessing for mystical regions.
572
+ * @param blessing - Blessing configuration
573
+ */
201
574
  addMysticalRegionBlessing: (blessing: Blessing) => void;
575
+ /**
576
+ * Register a new harmony type for crafting.
577
+ * @param harmonyType - Harmony type identifier
578
+ * @param config - Harmony configuration
579
+ */
202
580
  addHarmonyType: (harmonyType: RecipeHarmonyType, config: HarmonyTypeConfig) => void;
581
+ /**
582
+ * Override item type to harmony type mappings.
583
+ * @param mapping - Partial mapping of item kinds to harmony types
584
+ * @example
585
+ * overrideItemTypeToHarmonyType({ 'pill': 'medicinal', 'artefact': 'elemental' });
586
+ */
203
587
  overrideItemTypeToHarmonyType: (mapping: Partial<Record<ItemKind, RecipeHarmonyType>>) => void;
588
+ /**
589
+ * Register a custom game screen.
590
+ * @param config - Screen configuration
591
+ */
204
592
  addScreen: (config: ModScreenConfig) => void;
593
+ /**
594
+ * Register a new puppet type for training ground.
595
+ * @param puppet - Puppet configuration
596
+ */
597
+ addPuppetType: (puppet: PuppetType) => void;
205
598
  };
206
599
  utils: {
600
+ /**
601
+ * Create an alpha variant of an enemy (stronger version).
602
+ * @param enemy - Base enemy entity
603
+ * @returns Enhanced enemy with increased stats
604
+ * @example
605
+ * const alphaBandit = alpha(bandit);
606
+ * // Returns bandit with ~1.5x health and damage
607
+ */
207
608
  alpha: (enemy: EnemyEntity) => EnemyEntity;
609
+ /**
610
+ * Create an alpha+ variant of an enemy (much stronger).
611
+ * @param enemy - Base enemy entity
612
+ * @returns Significantly enhanced enemy
613
+ * @example
614
+ * const eliteBoss = alphaPlus(demonLord);
615
+ * // Returns enemy with ~2x stats and special abilities
616
+ */
208
617
  alphaPlus: (enemy: EnemyEntity) => EnemyEntity;
618
+ /**
619
+ * Create realmbreaker variants (group of stronger enemies).
620
+ * @param enemy - Base enemy template
621
+ * @returns Array of enhanced enemies
622
+ * @example
623
+ * const demonHorde = realmbreaker(demon);
624
+ * // Returns array of 3-5 demons with varied stats
625
+ */
209
626
  realmbreaker: (enemy: EnemyEntity) => EnemyEntity[];
627
+ /**
628
+ * Create a corrupted variant of an enemy.
629
+ * @param enemy - Base enemy entity
630
+ * @returns Corrupted enemy with dark powers
631
+ * @example
632
+ * const corruptedBeast = corrupted(beast);
633
+ * // Returns enemy with corruption buffs and abilities
634
+ */
210
635
  corrupted: (enemy: EnemyEntity) => EnemyEntity;
636
+ /**
637
+ * Create a combat event from an enemy configuration.
638
+ * @param enemy - Location enemy definition
639
+ * @returns Location event that triggers combat
640
+ */
211
641
  createCombatEvent: (enemy: LocationEnemy) => LocationEvent;
642
+ /**
643
+ * Create a monster culling quest.
644
+ * @param monster - Enemy to defeat
645
+ * @param location - Quest location
646
+ * @param description - Quest description text
647
+ * @param favour - Favour reward
648
+ * @returns Complete quest object
649
+ */
212
650
  createCullingMission: (monster: EnemyEntity, location: string, description: string, favour: number) => Quest;
651
+ /**
652
+ * Create an item collection quest.
653
+ * @param item - Item to collect
654
+ * @param location - Collection location
655
+ * @param description - Quest description
656
+ * @param favour - Favour reward
657
+ * @returns Complete quest object
658
+ */
213
659
  createCollectionMission: (item: Item, location: string, description: string, favour: number) => Quest;
660
+ /**
661
+ * Create a delivery quest with events.
662
+ * @param items - Items to deliver
663
+ * @param count - Number of items
664
+ * @param location - Delivery location
665
+ * @param description - Quest description
666
+ * @param preDeliverySteps - Events before delivery
667
+ * @param postDeliverySteps - Events after delivery
668
+ * @param favour - Favour reward
669
+ * @returns Complete quest object
670
+ */
214
671
  createDeliveryMission: (items: Item[], count: number, location: string, description: string, preDeliverySteps: EventStep[], postDeliverySteps: EventStep[], favour: number) => Quest;
672
+ /**
673
+ * Create a hunt quest with rewards.
674
+ * @param monster - Target monster
675
+ * @param location - Hunt location
676
+ * @param description - Quest description
677
+ * @param encounter - Encounter text
678
+ * @param spiritStones - Money reward
679
+ * @param reputation - Reputation gain
680
+ * @param reputationName - Faction name
681
+ * @param maxReputation - Max reputation tier
682
+ * @param characterEncounter - Optional NPC encounter
683
+ * @returns Complete quest object
684
+ */
215
685
  createHuntQuest: (monster: EnemyEntity, location: string, description: string, encounter: string, spiritStones: number, reputation: number, reputationName: string, maxReputation: ReputationTier, characterEncounter?: CharacterRequestEncounter) => Quest;
686
+ /**
687
+ * Create a pack hunting quest.
688
+ * @param monster - Monster type in pack
689
+ * @param location - Hunt location
690
+ * @param description - Quest description
691
+ * @param encounter - Encounter text
692
+ * @param spiritStones - Money reward
693
+ * @param reputation - Reputation gain
694
+ * @param reputationName - Faction name
695
+ * @param maxReputation - Max tier
696
+ * @returns Complete quest object
697
+ */
216
698
  createPackQuest: (monster: EnemyEntity, location: string, description: string, encounter: string, spiritStones: number, reputation: number, reputationName: string, maxReputation: ReputationTier) => Quest;
699
+ /**
700
+ * Create a delivery quest with full rewards.
701
+ * @param location - Delivery destination
702
+ * @param description - Quest description
703
+ * @param predelivery - Pre-delivery events
704
+ * @param item - Item to deliver
705
+ * @param amount - Item count
706
+ * @param postdelivery - Post-delivery events
707
+ * @param spiritStones - Money reward
708
+ * @param reputation - Reputation gain
709
+ * @param reputationName - Faction name
710
+ * @param maxReputation - Max tier
711
+ * @returns Complete quest object
712
+ */
217
713
  createDeliveryQuest: (location: string, description: string, predelivery: EventStep[], item: Item, amount: number, postdelivery: EventStep[], spiritStones: number, reputation: number, reputationName: string, maxReputation: ReputationTier) => Quest;
714
+ /**
715
+ * Create a fetch quest between locations.
716
+ * @param title - Quest title
717
+ * @param description - Quest description
718
+ * @param srcLocation - Source location
719
+ * @param srcHint - Hint for source
720
+ * @param srcSteps - Source events
721
+ * @param dstLocation - Destination location
722
+ * @param dstHint - Hint for destination
723
+ * @param dstSteps - Destination events
724
+ * @param spiritStones - Money reward
725
+ * @param reputation - Reputation gain
726
+ * @param reputationName - Faction name
727
+ * @param maxReputation - Max tier
728
+ * @returns Complete quest object
729
+ */
218
730
  createFetchQuest: (title: string, description: string, srcLocation: string, srcHint: string, srcSteps: EventStep[], dstLocation: string, dstHint: string, dstSteps: EventStep[], spiritStones: number, reputation: number, reputationName: string, maxReputation: ReputationTier) => Quest;
731
+ /**
732
+ * Create a crafting hall mission
733
+ * @param recipe - Quest recipe
734
+ * @param cost - Spirit Stone acceptance cost
735
+ * @param location - Quest start location
736
+ * @param appraiser - Quest start confirmation NPC
737
+ * @param description - Quest description
738
+ * @param introSteps - Pre Crafting quest steps
739
+ * @param sublimeSteps - Sublime result quest steps
740
+ * @param perfectSteps - Perfect result quest steps
741
+ * @param basicSteps - Basic result quest steps
742
+ * @param failureSteps - Failure result quest steps
743
+ * @param favour - Sect favour granted on success
744
+ */
745
+ createCraftingMission: (recipe: Item, cost: number, location: string, appraiser: string, description: string, introSteps: EventStep[], sublimeSteps: EventStep[], perfectSteps: EventStep[], basicSteps: EventStep[], failureSteps: EventStep[], favour: number) => Quest;
746
+ /**
747
+ * Create a Q&A dialogue tree.
748
+ * @param key - Unique key for the dialogue
749
+ * @param questions - Array of questions/answers
750
+ * @param exit - Exit option
751
+ * @param showExitOnAllComplete - Show exit only after all questions
752
+ * @returns Event steps for the dialogue
753
+ */
219
754
  createQuestionAnswerList: (key: string, questions: QuestionAnswer[], exit: QuestionAnswer, showExitOnAllComplete?: boolean) => EventStep[];
755
+ /**
756
+ * Get expected health for a realm/progress.
757
+ * @param realm - Cultivation realm
758
+ * @param progress - Progress within realm
759
+ * @returns Expected health value
760
+ * @example
761
+ * const health = getExpectedHealth('coreFormation', 'Middle');
762
+ */
220
763
  getExpectedHealth: (realm: Realm, progress: RealmProgress) => number;
764
+ /**
765
+ * Get expected power for a realm/progress.
766
+ * @param realm - Cultivation realm
767
+ * @param progress - Progress within realm
768
+ * @returns Expected power value
769
+ * @example
770
+ * const power = getExpectedPower('coreFormation', 'Late');
771
+ */
221
772
  getExpectedPower: (realm: Realm, progress: RealmProgress) => number;
773
+ /**
774
+ * Get expected defense for a realm/progress.
775
+ * @param realm - Cultivation realm
776
+ * @param progress - Progress within realm
777
+ * @returns Expected defense value
778
+ * @example
779
+ * const defense = getExpectedDefense('coreFormation', 'Early');
780
+ */
222
781
  getExpectedDefense: (realm: Realm, progress: RealmProgress) => number;
782
+ /**
783
+ * Get expected barrier for a realm/progress.
784
+ * @param realm - Cultivation realm
785
+ * @param progress - Progress within realm
786
+ * @returns Expected barrier value
787
+ * @example
788
+ * const barrier = getExpectedBarrier('coreFormation', 'Early');
789
+ */
223
790
  getExpectedBarrier: (realm: Realm, progress: RealmProgress) => number;
791
+ /**
792
+ * Get expected toxicity resistance for a realm/progress.
793
+ * @param realm - Cultivation realm
794
+ * @param progress - Progress within realm
795
+ * @returns Expected toxicity value
796
+ * @example
797
+ * const toxicity = getExpectedToxicity('coreFormation', 'Middle');
798
+ */
224
799
  getExpectedToxicity: (realm: Realm, progress: RealmProgress) => number;
800
+ /**
801
+ * Get expected qi pool for crafting.
802
+ * @param realm - Cultivation realm
803
+ * @param progress - Progress within realm
804
+ * @returns Expected pool value
805
+ * @example
806
+ * const pool = getExpectedPool('coreFormation', 'Late');
807
+ */
225
808
  getExpectedPool: (realm: Realm, progress: RealmProgress) => number;
809
+ /**
810
+ * Get expected crafting intensity.
811
+ * @param realm - Cultivation realm
812
+ * @param progress - Progress within realm
813
+ * @returns Expected intensity value
814
+ * @example
815
+ * const intensity = getExpectedIntensity('coreFormation', 'Late');
816
+ */
226
817
  getExpectedIntensity: (realm: Realm, progress: RealmProgress) => number;
818
+ /**
819
+ * Get expected crafting control.
820
+ * @param realm - Cultivation realm
821
+ * @param progress - Progress within realm
822
+ * @returns Expected control value
823
+ * @example
824
+ * const control = getExpectedControl('coreFormation', 'Early');
825
+ */
227
826
  getExpectedControl: (realm: Realm, progress: RealmProgress) => number;
827
+ /**
828
+ * Get expected player combat power. This takes into account masteries, equipement, buffs, and other factors. Normally ~100x higher than getExpectedPower.
829
+ * @param realm - Cultivation realm
830
+ * @param progress - Progress within realm
831
+ * @returns Expected power level
832
+ * @example
833
+ * const playerPower = getExpectedPlayerPower('coreFormation', 'Early');
834
+ */
228
835
  getExpectedPlayerPower: (realm: Realm, progress: RealmProgress) => number;
836
+ /**
837
+ * Get expected artifact power.
838
+ * @param realm - Cultivation realm
839
+ * @param progress - Progress within realm
840
+ * @returns Expected artifact power
841
+ * @example
842
+ * const artifactPower = getExpectedArtefactPower('coreFormation', 'Middle');
843
+ */
229
844
  getExpectedArtefactPower: (realm: Realm, progress: RealmProgress) => number;
845
+ /**
846
+ * Calculate charisma for breakthrough rewards.
847
+ * @param realm - Target realm
848
+ * @param mult - Multiplier (typically 1.0-3.0)
849
+ * @returns Charisma value
850
+ * @example
851
+ * const charisma = getBreakthroughCharisma('coreFormation', 1.5);
852
+ */
230
853
  getBreakthroughCharisma: (realm: Realm, mult: number) => number;
854
+ /**
855
+ * Calculate clothing defense value.
856
+ * @param realm - Required realm
857
+ * @param scale - Scale factor (0.5-2.0 typical)
858
+ * @returns Defense value
859
+ * @example
860
+ * const defense = getClothingDefense('coreFormation', 1.2);
861
+ */
231
862
  getClothingDefense: (realm: Realm, scale: number) => number;
863
+ /**
864
+ * Calculate clothing charisma value.
865
+ * @param realm - Required realm
866
+ * @param mult - Multiplier (1.0-3.0 typical)
867
+ * @returns Charisma value
868
+ * @example
869
+ * const charisma = getClothingCharisma('coreFormation', 2.0);
870
+ */
232
871
  getClothingCharisma: (realm: Realm, mult: number) => number;
872
+ /**
873
+ * Get max qi the player can hold in a realm.
874
+ * @param realm - Target realm
875
+ * @param realmProgress - Progress level
876
+ * @returns Qi amount
877
+ * @example
878
+ * const qi = getRealmQi('coreFormation', 'Late');
879
+ */
233
880
  getRealmQi: (realm: Realm, realmProgress: RealmProgress) => number;
881
+ /**
882
+ * Get qi cost for breakthrough.
883
+ * @param realm - Current realm
884
+ * @param realmProgress - Current progress
885
+ * @returns Qi cost
886
+ * @example
887
+ * const qiCost = getBreakthroughQi('coreFormation', 'Late');
888
+ */
234
889
  getBreakthroughQi: (realm: Realm, realmProgress: RealmProgress) => number;
890
+ /**
891
+ * Scale a numeric reward amount to a value appropriate for the player's realm and progress.
892
+ * @param base - Base reward amount
893
+ * @param realm - Player realm
894
+ * @param progress - Realm progress
895
+ * @returns Scaled reward
896
+ * @example
897
+ * const reward = getNumericReward(100, 'coreFormation', 'Middle');
898
+ */
235
899
  getNumericReward: (base: number, realm: Realm, progress: RealmProgress) => number;
900
+ /**
901
+ * Create a flag reference string.
902
+ * @param flag - Flag name
903
+ * @returns Flag reference for conditions
904
+ * @example
905
+ * const flagRef = flag('quest complete'); // Returns 'quest_complete'
906
+ */
236
907
  flag: (flag: string) => string;
908
+ /**
909
+ * Calculate crafting equipment stats.
910
+ * @param realm - Equipment realm
911
+ * @param realmProgress - Progress level
912
+ * @param factors - Stat multipliers for pool/control/intensity
913
+ * @param type - Equipment type ('cauldron' or 'flame')
914
+ * @returns Crafting statistics
915
+ * @example
916
+ * getCraftingEquipmentStats('coreFormation', 'Middle', { pool: 1.2, control: 1.0, intensity: 0.8 }, 'cauldron');
917
+ */
237
918
  getCraftingEquipmentStats: (realm: Realm, realmProgress: RealmProgress, factors: {
238
919
  pool: number;
239
920
  control: number;
@@ -241,17 +922,123 @@ export interface ModAPI {
241
922
  }, type: 'cauldron' | 'flame') => Partial<{
242
923
  [key in CraftingStatistic]: number;
243
924
  }>;
925
+ /**
926
+ * Evaluate an expression with game flags.
927
+ * @param exp - Expression string
928
+ * @param flags - Current flag values
929
+ * @returns Evaluated result (floored to integer)
930
+ * @example
931
+ * evalExp('10 * quest_stage + 50', { quest_stage: 3 }); // Returns 80
932
+ */
244
933
  evalExp: (exp: string, flags: Record<string, number>) => number;
934
+ /**
935
+ * Evaluate expression without flooring.
936
+ * @param exp - Expression string
937
+ * @param flags - Current flag values
938
+ * @returns Evaluated result (decimal allowed)
939
+ * @example
940
+ * evalExpNoFloor('charisma * 1.5', { charisma: 10 }); // Returns 15.0
941
+ */
245
942
  evalExpNoFloor: (exp: string, flags: Record<string, number>) => number;
943
+ /**
944
+ * Get pill effectiveness multiplier for realm.
945
+ * @param realm - Player realm
946
+ * @returns Multiplier value
947
+ * @example
948
+ * const mult = getPillRealmMultiplier('coreFormation');
949
+ */
950
+ getPillRealmMultiplier: (realm: Realm) => number;
246
951
  };
247
952
  hooks: {
953
+ /**
954
+ * Hook into enemy combat entity creation to modify stats.
955
+ * @param interceptor - Function to modify combat entity
956
+ * @example
957
+ * onCreateEnemyCombatEntity((enemy, combatEntity, flags) => {
958
+ * if (flags.hard_mode) {
959
+ * combatEntity.stats.hp *= 1.5;
960
+ * combatEntity.stats.power *= 1.2;
961
+ * }
962
+ * return combatEntity;
963
+ * });
964
+ */
248
965
  onCreateEnemyCombatEntity: (interceptor: (enemy: EnemyEntity, combatEntity: CombatEntity, gameFlags: Record<string, number>) => CombatEntity) => void;
966
+ /**
967
+ * Hook to modify recipe difficulty calculations.
968
+ * @param interceptor - Function to adjust recipe stats
969
+ * @example
970
+ * onDeriveRecipeDifficulty((recipe, stats, flags) => {
971
+ * if (recipe.basicItem.kind === 'pill' && flags.alchemy_mastery) {
972
+ * stats.difficulty *= 0.8;
973
+ * }
974
+ * return stats;
975
+ * });
976
+ */
249
977
  onDeriveRecipeDifficulty: (interceptor: (recipe: RecipeItem, recipeStats: CraftingRecipeStats, gameFlags: Record<string, number>) => CraftingRecipeStats) => void;
978
+ /**
979
+ * Hook to add events after combat completion.
980
+ * @param interceptor - Function returning additional event steps
981
+ * @example
982
+ * onCompleteCombat((step, victory, playerState, flags) => {
983
+ * if (victory && playerState.stats.hp < 10) {
984
+ * return [{ type: 'text', text: 'That was close!' }];
985
+ * }
986
+ * return [];
987
+ * });
988
+ */
250
989
  onCompleteCombat: (interceptor: (eventStep: CombatStep | FightCharacterStep, victory: boolean, playerCombatState: CombatEntity, gameFlags: Record<string, number>) => EventStep[]) => void;
990
+ /**
991
+ * Hook to add events after tournament completion.
992
+ * @param interceptor - Function returning additional event steps
993
+ * @example
994
+ * onCompleteTournament((step, result, flags) => {
995
+ * if (result === 'victory') {
996
+ * return [{ type: 'addItem', item: { name: 'champion_medal' }, amount: "1" }];
997
+ * }
998
+ * return [];
999
+ * });
1000
+ */
251
1001
  onCompleteTournament: (interceptor: (eventStep: TournamentStep, tournamentState: 'victory' | 'second' | 'defeat', gameFlags: Record<string, number>) => EventStep[]) => void;
1002
+ /**
1003
+ * Hook to add events after dual cultivation.
1004
+ * @param interceptor - Function returning additional event steps
1005
+ * @example
1006
+ * onCompleteDualCultivation((step, success, flags) => {
1007
+ * if (success && flags.dual_mastery) {
1008
+ * return [{ type: 'buff', buff: harmonyBonus }];
1009
+ * }
1010
+ * return [];
1011
+ * });
1012
+ */
252
1013
  onCompleteDualCultivation: (interceptor: (eventStep: DualCultivationStep, success: boolean, gameFlags: Record<string, number>) => EventStep[]) => void;
1014
+ /**
1015
+ * Hook to add events after crafting completion.
1016
+ * @param interceptor - Function returning additional event steps
1017
+ * @example
1018
+ * onCompleteCrafting((step, item, flags) => {
1019
+ * if (item && item.quality > 5) {
1020
+ * return [{ type: 'text', text: 'A masterpiece!' }];
1021
+ * }
1022
+ * return [];
1023
+ * });
1024
+ */
253
1025
  onCompleteCrafting: (interceptor: (eventStep: CraftingStep, item: CraftingResult | undefined, gameFlags: Record<string, number>) => EventStep[]) => void;
1026
+ /**
1027
+ * Hook to add events after auction completion.
1028
+ * @param interceptor - Function returning additional event steps
1029
+ * @example
1030
+ * onCompleteAuction((step, itemsBought, flags) => {
1031
+ * if (itemsBought.length > 5) {
1032
+ * return [{ type: 'flag', flag: 'big_spender', value: "1", global: true }];
1033
+ * }
1034
+ * return [];
1035
+ * });
1036
+ */
254
1037
  onCompleteAuction: (interceptor: (eventStep: AuctionStep, itemsBought: AuctionItem[], gameFlags: Record<string, number>) => EventStep[]) => void;
1038
+ /**
1039
+ * Hook to add events after stone cutting.
1040
+ * @param interceptor - Function returning additional event steps
1041
+ */
255
1042
  onCompleteStoneCutting: (interceptor: (eventStep: StoneCuttingStep, gameFlags: Record<string, number>) => EventStep[]) => void;
256
1043
  };
257
1044
  }
package/dist/quest.d.ts CHANGED
@@ -15,6 +15,7 @@ export interface QuestProgressState {
15
15
  seenUpTo: number;
16
16
  completed: number[];
17
17
  killTally: Record<string, number>;
18
+ raidsComplete: number;
18
19
  waitMonths?: Record<number, number>;
19
20
  }
20
21
  export type QuestReward = ItemQuestReward | MoneyQuestReward | FavourQuestReward | ReputationQuestReward | GuildApprovalQuestReward;
@@ -42,7 +43,7 @@ interface GuildApprovalQuestReward {
42
43
  amount: number;
43
44
  guild: string;
44
45
  }
45
- export type QuestStep = EventQuestStep | ConditionQuestStep | CollectQuestStep | MissionHallQuestStep | FlagValueQuestStep | SpeakToCharacterQuestStep | KillQuestStep | WaitQuestStep;
46
+ export type QuestStep = EventQuestStep | ConditionQuestStep | CollectQuestStep | MissionHallQuestStep | FlagValueQuestStep | SpeakToCharacterQuestStep | KillQuestStep | WaitQuestStep | RaidQuestStep;
46
47
  interface QuestStepBase {
47
48
  hint: string;
48
49
  }
@@ -88,4 +89,8 @@ interface WaitQuestStep extends QuestStepBase {
88
89
  kind: 'wait';
89
90
  months: number;
90
91
  }
92
+ export interface RaidQuestStep extends QuestStepBase {
93
+ kind: 'raid';
94
+ amount: number;
95
+ }
91
96
  export {};
@@ -23,7 +23,7 @@ import { Realm } from './realm';
23
23
  export interface Viewport {
24
24
  x: number;
25
25
  y: number;
26
- scale: number;
26
+ zoom: number;
27
27
  }
28
28
  export interface PlayerState {
29
29
  player: PlayerEntity;
@@ -81,6 +81,10 @@ export interface CombatState {
81
81
  customBgm?: string[];
82
82
  background: string;
83
83
  screenEffect: ScreenEffectType;
84
+ combatVictoryFlag?: {
85
+ flag: string;
86
+ value: number;
87
+ };
84
88
  }
85
89
  export type CraftingSliceState = ExistingCraftingState;
86
90
  export interface ResetFlag {
package/dist/stat.d.ts CHANGED
@@ -62,6 +62,7 @@ export interface Scaling {
62
62
  stat: PhysicalStatistic | SocialStatistic | CombatStatistic | CraftingStatistic | TechniqueElement | undefined;
63
63
  scaling?: 'stacks' | 'consumed' | string;
64
64
  eqn?: string;
65
+ additiveEqn?: string;
65
66
  max?: Scaling;
66
67
  divideByStanceLength?: boolean;
67
68
  upgradeKey?: string;
package/dist/stat.js CHANGED
@@ -149,7 +149,7 @@ export const combatStatToDescription = {
149
149
  lifesteal: '',
150
150
  critchance: 'Your chance to get a critical effect, increasing the power of your techniques.',
151
151
  critdam: '',
152
- artefactpower: "The strength of your artefact's techniques.",
152
+ artefactpower: "The strength of your artefact's techniques and your Formation Parts.",
153
153
  fistBoost: '',
154
154
  blossomBoost: '',
155
155
  weaponBoost: '',
@@ -38,6 +38,7 @@ export interface Technique {
38
38
  maxInstances?: number;
39
39
  stanceRestriction?: StanceRestriction;
40
40
  tooltip?: string;
41
+ additionalTooltip?: string;
41
42
  effects: TechniqueEffect[];
42
43
  triggeredEffects?: {
43
44
  trigger: string;
@@ -0,0 +1,10 @@
1
+ import { EnemyEntity, Realm, RealmProgress } from '.';
2
+ export interface PuppetType {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ image: string;
7
+ baseMultiplier: number;
8
+ multiplierGrowth: number;
9
+ createPuppet: (tier: number, realm: Realm, realmProgress: RealmProgress) => EnemyEntity;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "afnm-types",
3
- "version": "0.6.11",
3
+ "version": "0.6.16",
4
4
  "description": "Type definitions for Ascend From Nine Mountains",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -19,6 +19,9 @@
19
19
  "@mui/icons-material": "^7.3.1",
20
20
  "@mui/material": "^7.3.1"
21
21
  },
22
+ "devDependencies": {
23
+ "typescript": "^5.7.2"
24
+ },
22
25
  "scripts": {
23
26
  "build": "tsc --project tsconfig.types.json",
24
27
  "prepublishOnly": "npm run build"