afnm-types 0.6.56 → 0.6.58

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,2 +1,2 @@
1
- export type GameScreen = 'location' | 'recipe' | 'mission' | 'craftingHall' | 'manual' | 'cultivation' | 'map' | 'healer' | 'market' | 'favour' | 'herbField' | 'mine' | 'recipeLibrary' | 'requestBoard' | 'compendium' | 'library' | 'altar' | 'research' | 'reforge' | 'pillarGrid' | 'fallenStar' | 'trainingGround' | 'tenThousandFlames' | 'lifeScreen' | 'soulShardDelve' | 'enchantmentShop' | 'challengeBoard';
2
- export type ScreenType = GameScreen | 'newgame' | 'combat' | 'crafting' | 'dualCultivation' | 'event' | 'auction' | 'mysticalRegion' | 'tournament' | 'house' | 'guild' | 'stoneCutting' | 'fallenStar' | 'soulShardDelve';
1
+ export type GameScreen = 'location' | 'recipe' | 'mission' | 'craftingHall' | 'manual' | 'cultivation' | 'map' | 'healer' | 'market' | 'favour' | 'herbField' | 'mine' | 'recipeLibrary' | 'requestBoard' | 'compendium' | 'library' | 'altar' | 'research' | 'reforge' | 'expedition' | 'pillarGrid' | 'fallenStar' | 'trainingGround' | 'tenThousandFlames' | 'lifeScreen' | 'soulShardDelve' | 'enchantmentShop' | 'challengeBoard';
2
+ export type ScreenType = GameScreen | 'newgame' | 'combat' | 'crafting' | 'dualCultivation' | 'event' | 'auction' | 'mysticalRegion' | 'tournament' | 'house' | 'guild' | 'stoneCutting' | 'fallenStar' | 'soulShardDelve' | 'expedition';
package/dist/auction.d.ts CHANGED
@@ -18,6 +18,7 @@ export interface AuctionItemDef {
18
18
  condition: string;
19
19
  countOverride?: number;
20
20
  countMultiplier?: number;
21
+ costMultiplier?: number;
21
22
  }
22
23
  export interface AuctionCharacter {
23
24
  name: string;
@@ -23,12 +23,30 @@ export interface StoredFigment {
23
23
  stances: StoredStance[];
24
24
  currentStyle?: StoredStyle;
25
25
  storedStyles?: StoredStyle[];
26
+ assignedTiers?: Record<string, number>;
27
+ }
28
+ /** An active firmament incursion targeting the player's inner world */
29
+ export interface ActiveIncursion {
30
+ id: string;
31
+ spawnedYear: number;
32
+ spawnedMonth: number;
33
+ }
34
+ /** Generated but uncollected essence accumulating in the inner world */
35
+ export interface PendingEssence {
36
+ essenceItemName: string;
37
+ count: number;
38
+ progress: number;
26
39
  }
27
40
  /** State for the Life Flourishing breakthrough system */
28
41
  export interface LifeFlourishingState {
29
42
  unlockedSpecies: string[];
30
43
  storedFigments: StoredFigment[];
31
- manifestedFigmentId?: string;
44
+ evokedFigmentId?: string;
45
+ worldAspectId?: string;
46
+ firmamentProgress?: number;
47
+ activeIncursions?: ActiveIncursion[];
48
+ pendingEssences?: PendingEssence[];
49
+ essenceTiersUnlocked?: Record<string, number>;
32
50
  }
33
51
  export interface BreakthroughState {
34
52
  mundane?: {
package/dist/buff.d.ts CHANGED
@@ -57,6 +57,20 @@ interface InventoryItemTechniqueCondition extends BaseTechniqueCondition {
57
57
  count: number;
58
58
  mode: 'more' | 'less' | 'equal';
59
59
  }
60
+ /**
61
+ * Configures how a buff lives outside combat. Buffs without a `persistence`
62
+ * field are combat or event scoped only.
63
+ */
64
+ export interface BuffPersistence {
65
+ /**
66
+ * When combat ends, the surviving stack count of this buff on the player is
67
+ * written back into `player.monthBuffs`. Existing entries are replaced, not
68
+ * additively merged. Stacks of zero or below remove the buff.
69
+ */
70
+ persistAfterCombat?: boolean;
71
+ /** Stacks of this buff lost at the end of every month. */
72
+ decayPerMonth?: number;
73
+ }
60
74
  export interface Buff {
61
75
  name: string;
62
76
  displayName?: Translatable;
@@ -108,6 +122,7 @@ export interface Buff {
108
122
  /** Block specific triggers from executing. Used to prevent effects like celestial rotation. */
109
123
  blockTriggerEffects?: {
110
124
  trigger: string;
125
+ condition?: TechniqueCondition;
111
126
  effects: BuffEffect[];
112
127
  }[];
113
128
  damageInterceptorEffects?: {
@@ -122,6 +137,7 @@ export interface Buff {
122
137
  amplifier: {
123
138
  kind: 'multiply';
124
139
  value: number;
140
+ cantUpgrade?: boolean;
125
141
  };
126
142
  effects?: BuffEffect[];
127
143
  appliesTo: ('damage' | 'barrier' | 'heal' | 'tempHealth')[];
@@ -134,6 +150,7 @@ export interface Buff {
134
150
  modifier: {
135
151
  kind: 'add' | 'multiply';
136
152
  value: number;
153
+ cantUpgrade?: boolean;
137
154
  };
138
155
  effects?: BuffEffect[];
139
156
  }[];
@@ -144,6 +161,12 @@ export interface Buff {
144
161
  stacks: number;
145
162
  stacksAreDays?: boolean;
146
163
  stacksAreMonths?: boolean;
164
+ /**
165
+ * Marks the buff as carrying state on the player between events. When set,
166
+ * the buff opts out of the default daily monthBuffs decay (which treats
167
+ * stacks as days remaining) and follows the rules in this object instead.
168
+ */
169
+ persistence?: BuffPersistence;
147
170
  buffType?: string;
148
171
  buffTypeTooltip?: string;
149
172
  endurePercent?: number;
@@ -155,6 +178,11 @@ export interface Buff {
155
178
  guardianIntercept?: {
156
179
  percent: Scaling;
157
180
  maxHp: Scaling;
181
+ /** How re-application of the guardian buff combines with existing guardian HP.
182
+ * 'refresh' (default): maxHp = max(old, new); hp = maxHp (fully heal).
183
+ * 'extend': hp = oldHp + newMaxHp; maxHp = max(oldMaxHp, hp). Adds onto current and extends the cap. */
184
+ refreshMode?: 'refresh' | 'extend';
185
+ canUpgrade?: boolean;
158
186
  };
159
187
  /** Runtime guardian HP — set automatically from guardianIntercept.maxHp at buff creation */
160
188
  guardianHp?: number;
@@ -328,6 +356,7 @@ interface BaseBuff {
328
356
  [key in CombatStatistic]: Scaling;
329
357
  }>;
330
358
  hidden?: boolean;
359
+ cantUpgrade?: boolean;
331
360
  }
332
361
  interface DamageEffect extends BaseBuff {
333
362
  kind: 'damage';
@@ -372,6 +401,7 @@ interface ConsumeBuffSelfEffect extends BaseBuff {
372
401
  buff: Buff | string;
373
402
  silent?: boolean;
374
403
  hideBuff?: boolean;
404
+ targeting?: EffectTargeting;
375
405
  }
376
406
  interface CreateBuffTargetEffect extends BaseBuff {
377
407
  kind: 'buffTarget';
@@ -418,6 +448,9 @@ interface ModifyBuffGroupEffect extends BaseBuff {
418
448
  onTarget?: boolean;
419
449
  group: string;
420
450
  amount: Scaling;
451
+ /** Defaults to 'all'. 'highest'/'lowest' restrict the effect to a single matching buff
452
+ * chosen by stack count. */
453
+ mode?: 'all' | 'highest' | 'lowest';
421
454
  }
422
455
  interface SetStateEffect extends BaseBuff {
423
456
  kind: 'setState';
@@ -537,6 +537,18 @@ function extractFromFile(filePath) {
537
537
  });
538
538
  }
539
539
  }
540
+ else if (typescript_1.default.isBinaryExpression(arg) && arg.operatorToken.kind === typescript_1.default.SyntaxKind.PlusToken) {
541
+ // String concatenation with + is supported - try to resolve it
542
+ const resolved = (0, template_processor_js_1.tryResolveBinaryExpression)(arg, sourceFile, filePath);
543
+ if (resolved !== null && resolved.trim().length > 0) {
544
+ results.push({
545
+ text: resolved,
546
+ file: filePath,
547
+ line: (0, template_processor_js_1.getLineNumber)(sourceFile, node.getStart()),
548
+ context: `${funcName}-call`,
549
+ });
550
+ }
551
+ }
540
552
  else if (typescript_1.default.isTemplateExpression(arg)) {
541
553
  const templateText = arg.getText(sourceFile);
542
554
  const processed = (0, template_processor_js_1.processTemplateExpression)(arg, sourceFile, filePath);
@@ -1037,20 +1037,31 @@ function buildTranslationLookup(langData) {
1037
1037
  function loadExistingLanguageFiles() {
1038
1038
  const languageFiles = new Map();
1039
1039
  const translationsDir = path_1.default.join('src', 'translations');
1040
- // List of language codes to look for
1041
- const languages = ['zh', 'de', 'fr', 'es', 'ru'];
1042
- for (const lang of languages) {
1043
- const langPath = path_1.default.join(translationsDir, `${lang}.json`);
1044
- if (fs_1.default.existsSync(langPath)) {
1045
- try {
1046
- const data = JSON.parse(fs_1.default.readFileSync(langPath, 'utf-8'));
1047
- languageFiles.set(lang, data);
1048
- console.log(` Loaded existing translations from ${lang}.json`);
1049
- }
1050
- catch (error) {
1051
- const message = error instanceof Error ? error.message : String(error);
1052
- console.warn(` Warning: Failed to parse ${lang}.json: ${message}`);
1053
- }
1040
+ // Discover languages by scanning the translations directory rather than maintaining
1041
+ // a hardcoded list (which silently dropped ja/ko/vi/fi/pl/pt-BR/th/zh-CN/zh-TW).
1042
+ // Filenames are <lang>.json; non-language files in this dir are explicitly excluded.
1043
+ const NON_LANGUAGE_FILES = new Set([
1044
+ 'template.json',
1045
+ 'debug.json',
1046
+ 'custom-strings.json',
1047
+ 'technique-tooltip-templates.json',
1048
+ ]);
1049
+ const entries = fs_1.default.readdirSync(translationsDir);
1050
+ for (const file of entries) {
1051
+ if (!file.endsWith('.json'))
1052
+ continue;
1053
+ if (NON_LANGUAGE_FILES.has(file))
1054
+ continue;
1055
+ const lang = file.replace(/\.json$/, '');
1056
+ const langPath = path_1.default.join(translationsDir, file);
1057
+ try {
1058
+ const data = JSON.parse(fs_1.default.readFileSync(langPath, 'utf-8'));
1059
+ languageFiles.set(lang, data);
1060
+ console.log(` Loaded existing translations from ${lang}.json`);
1061
+ }
1062
+ catch (error) {
1063
+ const message = error instanceof Error ? error.message : String(error);
1064
+ console.warn(` Warning: Failed to parse ${lang}.json: ${message}`);
1054
1065
  }
1055
1066
  }
1056
1067
  return languageFiles;
@@ -3,7 +3,7 @@ import type { ReactNode, PropsWithChildren, ReactElement } from 'react';
3
3
  import type { SoundEffectName } from './audio';
4
4
  import type { ScreenEffectType } from './ScreenEffectType';
5
5
  import type React from 'react';
6
- export type BorderType = 'wood' | 'mystic';
6
+ export type BorderType = 'wood' | 'mystic' | 'expedition' | 'expeditionSmall';
7
7
  interface GameDialogProps {
8
8
  id: string;
9
9
  onClose?: () => void;
@@ -33,6 +33,7 @@ export type GameIconButtonFC = React.ForwardRefRenderFunction<HTMLButtonElement,
33
33
  hoverSfx?: SoundEffectName;
34
34
  clickSfx?: SoundEffectName;
35
35
  tooltip?: ReactNode;
36
+ fancyBorder?: boolean;
36
37
  }>;
37
38
  export type GameCloseButtonFC = React.ForwardRefRenderFunction<HTMLButtonElement, Omit<IconButtonProps & {
38
39
  hoverSfx?: SoundEffectName;
package/dist/entity.d.ts CHANGED
@@ -333,6 +333,8 @@ export interface CombatEntity {
333
333
  partyId?: string;
334
334
  /** When true, critchance is forced to 0 for this entity (used in training ground) */
335
335
  noCrit?: boolean;
336
+ /** Maximum qi droplets for this entity (set during combat entity creation) */
337
+ maxqiDroplets?: number;
336
338
  /** Cached hash for getVariablesFromEntity. Cleared whenever stats or buffs mutate. */
337
339
  _cachedHash?: string;
338
340
  }
package/dist/event.d.ts CHANGED
@@ -39,7 +39,7 @@ export interface BaseEventStep {
39
39
  kind: EventStepKind;
40
40
  condition?: string;
41
41
  }
42
- 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 | CraftingTeamUpStep | AddFollowerStep | BreakPartyStep | ClearTeamUpStep | UnlockAltarStep | DropItemStep | SetAltarCooldownStep | CompressCoreStep | ChangeScreenStep | UnlockTechniqueStep | UnlockAuctionTechniqueStep | AddRecipeStep | AddManualStep | LearnNpcStancesStep | ReplaceItemStep | DualCultivationStep | ChangeBGMStep | ClearChangeBGMStep | AddGuildApprovalStep | AdvanceGuildRankStep | OverridePlayerRealmStep | SetContentRealmOverrideStep | SetAidBreakthroughCooldownStep | StoneCuttingStep | GiveItemStep | ChangePhysicalStatStep | ChangeSocialStatStep | SelectRelationshipPathStep | SetTradeCooldownStep | StatusStep | ClearStatusStep;
42
+ 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 | CraftingTeamUpStep | AddFollowerStep | BreakPartyStep | ClearTeamUpStep | UnlockAltarStep | DropItemStep | SetAltarCooldownStep | CompressCoreStep | ChangeScreenStep | UnlockTechniqueStep | UnlockAuctionTechniqueStep | AddRecipeStep | AddManualStep | LearnNpcStancesStep | ReplaceItemStep | DualCultivationStep | ChangeBGMStep | ClearChangeBGMStep | AddGuildApprovalStep | AdvanceGuildRankStep | OverridePlayerRealmStep | SetContentRealmOverrideStep | SetAidBreakthroughCooldownStep | StoneCuttingStep | GiveItemStep | ChangePhysicalStatStep | ChangeSocialStatStep | SelectRelationshipPathStep | SetTradeCooldownStep | StatusStep | ClearStatusStep | IncreaseInstabilityStep | EndExpeditionStep | AddItemsToFoundStep | AddItemsToExtractedStep;
43
43
  export interface TextStep extends BaseEventStep {
44
44
  kind: 'text';
45
45
  text: Translatable;
@@ -174,6 +174,7 @@ export interface CreateBuffStep extends BaseEventStep {
174
174
  buff: Buff;
175
175
  amount: string;
176
176
  persistBeyondEvent?: boolean;
177
+ debuff?: boolean;
177
178
  }
178
179
  export interface ConsumeBuffStep extends BaseEventStep {
179
180
  kind: 'consumeBuff';
@@ -464,6 +465,10 @@ export interface SetAidBreakthroughCooldownStep extends BaseEventStep {
464
465
  export interface StoneCuttingStep extends BaseEventStep {
465
466
  kind: 'stoneCutting';
466
467
  realm: Realm;
468
+ /** Percentage discount to apply to stone cutting costs (0-100), evaluated as expression */
469
+ discountPercentage?: string;
470
+ /** Number of stones the player can cut for free, evaluated as expression */
471
+ freeCount?: string;
467
472
  }
468
473
  export interface GiveItemStep extends BaseEventStep {
469
474
  kind: 'giveItem';
@@ -509,4 +514,26 @@ export interface EventStatusThreshold {
509
514
  colour: string;
510
515
  label?: Translatable;
511
516
  }
517
+ export interface IncreaseInstabilityStep {
518
+ kind: 'instability';
519
+ condition?: string;
520
+ }
521
+ export interface EndExpeditionStep {
522
+ kind: 'endExpedition';
523
+ failed: boolean;
524
+ condition?: string;
525
+ }
526
+ export interface AddItemsToFoundStep {
527
+ kind: 'addToFound';
528
+ items: {
529
+ item: ItemDesc;
530
+ count: number;
531
+ }[];
532
+ condition?: string;
533
+ }
534
+ export interface AddItemsToExtractedStep {
535
+ kind: 'addToExtracted';
536
+ extractSlots: number;
537
+ condition?: string;
538
+ }
512
539
  export {};
@@ -0,0 +1,128 @@
1
+ import { Buff } from './buff';
2
+ import { EnemyEntity } from './entity';
3
+ import { EventStep } from './event';
4
+ import { ItemDesc } from './item';
5
+ import { Rarity } from './rarity';
6
+ import { Translatable } from './translatable';
7
+ export declare const expeditionBaseCost = 87500;
8
+ export declare const expeditionDirections: readonly ["left", "right", "top", "bottom"];
9
+ export type ExpeditionDirection = (typeof expeditionDirections)[number];
10
+ export declare const expeditionDirectionOpposite: {
11
+ [key in ExpeditionDirection]: ExpeditionDirection;
12
+ };
13
+ export declare const expeditionDirectionPoint: {
14
+ [key in ExpeditionDirection]: ExpeditionPoint;
15
+ };
16
+ export interface ExpeditionPoint {
17
+ x: number;
18
+ y: number;
19
+ }
20
+ export type RoleRarity = Exclude<Rarity, 'transcendent'>;
21
+ export declare const RoleRarityWeight: Record<RoleRarity, number>;
22
+ export type Roles = 'fighter' | 'healer' | 'surveyor' | 'archaeologist' | 'stabilizer' | 'qiflow';
23
+ export declare const rolesToName: Record<Roles, string>;
24
+ export declare const roleDescription: Record<Roles, string>;
25
+ export declare const RoleWeight: Record<Roles, number>;
26
+ export type MemberRole = {
27
+ role: Roles;
28
+ rarity: RoleRarity;
29
+ };
30
+ export type TeamMember = {
31
+ name: Translatable;
32
+ buff?: Buff;
33
+ role: MemberRole;
34
+ };
35
+ export type ExpeditionTeam = TeamMember[];
36
+ export interface TileMonsters {
37
+ combat: EnemyEntity[];
38
+ boss: EnemyEntity[];
39
+ challenge: EnemyEntity[];
40
+ }
41
+ export type ExpeditionTileTypes = 'entrance' | 'exit' | 'extract' | 'combat' | 'rest' | 'treasure' | 'boss' | 'buff' | 'debuff' | 'challenge' | 'puzzle' | 'boonBane';
42
+ export interface ExpeditionTilePoint extends ExpeditionPoint {
43
+ name: string;
44
+ }
45
+ export interface ExpeditionTile extends ExpeditionPoint {
46
+ expeditionTiles: ExpeditionTilePoint[];
47
+ edges: {
48
+ [key in ExpeditionDirection]: ExpeditionPoint[];
49
+ };
50
+ tileConnections: {
51
+ src: string;
52
+ dst: string;
53
+ }[];
54
+ edgeConnections: {
55
+ tile: string;
56
+ edge: string;
57
+ direction: ExpeditionDirection;
58
+ }[];
59
+ }
60
+ export type ExpeditionTiles = EntranceTile | ExitTile | ExtractTile | CombatTile | RestTile | TreasureTile | BossTile | BuffTile | DebuffTile | ChallengeTile | PuzzleTile | BoonBaneTile;
61
+ interface BaseTile {
62
+ name: string;
63
+ icon: string;
64
+ bg: string;
65
+ description: Translatable;
66
+ rarity: Rarity;
67
+ intro: EventStep[];
68
+ }
69
+ export interface EntranceTile extends BaseTile {
70
+ kind: 'entrance';
71
+ }
72
+ export interface ExitTile extends BaseTile {
73
+ kind: 'exit';
74
+ }
75
+ export interface ExtractTile extends BaseTile {
76
+ kind: 'extract';
77
+ extractCount: number;
78
+ }
79
+ export interface CombatTile extends BaseTile {
80
+ kind: 'combat';
81
+ modifier?: number;
82
+ enemyCount?: number;
83
+ items?: {
84
+ item: ItemDesc;
85
+ count: number;
86
+ }[];
87
+ }
88
+ export interface RestTile extends BaseTile {
89
+ kind: 'rest';
90
+ baseRestore: number;
91
+ }
92
+ export interface TreasureTile extends BaseTile {
93
+ kind: 'treasure';
94
+ }
95
+ export interface BossTile extends BaseTile {
96
+ kind: 'boss';
97
+ modifier?: number;
98
+ items?: {
99
+ item: ItemDesc;
100
+ count: number;
101
+ }[];
102
+ }
103
+ export interface BuffTile extends BaseTile {
104
+ kind: 'buff';
105
+ }
106
+ export interface DebuffTile extends BaseTile {
107
+ kind: 'debuff';
108
+ }
109
+ export interface ChallengeTile extends BaseTile {
110
+ kind: 'challenge';
111
+ modifier?: number;
112
+ items?: {
113
+ item: ItemDesc;
114
+ count: number;
115
+ }[];
116
+ }
117
+ export interface PuzzleTile extends BaseTile {
118
+ kind: 'puzzle';
119
+ enemies?: boolean;
120
+ }
121
+ export interface BoonBaneTile extends BaseTile {
122
+ kind: 'boonBane';
123
+ }
124
+ export interface ItemWCount {
125
+ item: ItemDesc;
126
+ count: number;
127
+ }
128
+ export {};
@@ -0,0 +1,57 @@
1
+ export const expeditionBaseCost = 87500;
2
+ export const expeditionDirections = ['left', 'right', 'top', 'bottom'];
3
+ export const expeditionDirectionOpposite = {
4
+ left: 'right',
5
+ right: 'left',
6
+ top: 'bottom',
7
+ bottom: 'top',
8
+ };
9
+ export const expeditionDirectionPoint = {
10
+ left: {
11
+ x: -1,
12
+ y: 0,
13
+ },
14
+ right: {
15
+ x: 2,
16
+ y: 0,
17
+ },
18
+ top: {
19
+ x: 0,
20
+ y: -1,
21
+ },
22
+ bottom: {
23
+ x: 0,
24
+ y: 2,
25
+ },
26
+ };
27
+ export const RoleRarityWeight = {
28
+ mundane: 30,
29
+ qitouched: 30,
30
+ empowered: 25,
31
+ resplendent: 20,
32
+ incandescent: 5,
33
+ };
34
+ export const rolesToName = {
35
+ fighter: 'Fighter',
36
+ healer: 'Healer',
37
+ surveyor: 'Surveyor',
38
+ archaeologist: 'Archeologist',
39
+ stabilizer: 'Stabilizer',
40
+ qiflow: 'Qi Manipulator',
41
+ };
42
+ export const roleDescription = {
43
+ fighter: 'Assists in limiting the prowess of fierce foes',
44
+ healer: 'Aids recuperation while resting',
45
+ surveyor: 'Analyzes signs of ambushes and plots routes avoiding them',
46
+ archaeologist: 'Utilizes expedition records to locate additional treasures',
47
+ stabilizer: 'Trained in placing spatial nodes that slow spatial destabilization',
48
+ qiflow: "Senses minute qi flow changes and manipulates them to the team's advantage",
49
+ };
50
+ export const RoleWeight = {
51
+ healer: 25,
52
+ archaeologist: 25,
53
+ surveyor: 20,
54
+ stabilizer: 15,
55
+ fighter: 10,
56
+ qiflow: 5,
57
+ };
@@ -1,6 +1,7 @@
1
- import type { Buff, EnemyEntity, ItemDesc, Realm } from '.';
1
+ import type { Buff, EnemyEntity, ItemDesc, Realm, Translatable } from '.';
2
2
  export interface FallenStar {
3
3
  name: string;
4
+ displayName?: Translatable;
4
5
  realm: Realm;
5
6
  image: string;
6
7
  monsterPool: {
@@ -15,4 +15,4 @@
15
15
  * };
16
16
  * }
17
17
  */
18
- export declare const GAME_VERSION = "0.6.56";
18
+ export declare const GAME_VERSION = "0.6.58";
@@ -15,4 +15,4 @@
15
15
  * };
16
16
  * }
17
17
  */
18
- export const GAME_VERSION = "0.6.56";
18
+ export const GAME_VERSION = "0.6.58";
package/dist/index.d.ts CHANGED
@@ -19,7 +19,6 @@ export * from './dualCultivation';
19
19
  export * from './element';
20
20
  export * from './entity';
21
21
  export * from './event';
22
- export * from './evolution';
23
22
  export * from './fallenStar';
24
23
  export * from './GameScreen';
25
24
  export * from './gameVersion';
package/dist/index.js CHANGED
@@ -19,7 +19,6 @@ export * from './dualCultivation';
19
19
  export * from './element';
20
20
  export * from './entity';
21
21
  export * from './event';
22
- export * from './evolution';
23
22
  export * from './fallenStar';
24
23
  export * from './GameScreen';
25
24
  export * from './gameVersion';
package/dist/item.d.ts CHANGED
@@ -12,7 +12,7 @@ import type { Realm, RealmProgress } from './realm';
12
12
  import type { RecipeDifficulty } from './RecipeDifficulty';
13
13
  import type { CombatStatistic, CombatStatsMap, CraftingStatistic, CraftingStatsMap, PhysicalStatistic, Scaling, SocialStatistic } from './stat';
14
14
  import type { Technique, TechniqueEffect } from './technique';
15
- import { DelveRoom } from './soulShardDelve';
15
+ import { DelveRoomConfig } from './soulShardDelve';
16
16
  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", "local_map"];
17
17
  export type ItemKind = (typeof itemKinds)[number];
18
18
  export declare const itemKindToName: {
@@ -43,6 +43,13 @@ interface ItemBase {
43
43
  qualityTier?: number;
44
44
  hiddenPotential?: number;
45
45
  minimumPotential?: number;
46
+ corruption?: ItemCorruption;
47
+ }
48
+ export interface ItemCorruption {
49
+ name: Translatable;
50
+ debuff: Buff;
51
+ threshold: number;
52
+ countPerCombat: number;
46
53
  }
47
54
  export interface ItemDesc {
48
55
  name: string;
@@ -223,6 +230,14 @@ export interface CombatItem extends ItemBase {
223
230
  export interface ConsumablePillItem extends BasePillItem {
224
231
  pillKind: 'consumable';
225
232
  max: number;
233
+ /**
234
+ * Optional shared consumption group. When set, the player can consume at most `groupCap`
235
+ * pills total across every pill that names the same `consumptionGroup`, in addition to
236
+ * each pill's individual `max` limit.
237
+ */
238
+ consumptionGroup?: string;
239
+ /** Lifetime cap for the entire consumption group. Required when `consumptionGroup` is set. */
240
+ groupCap?: number;
226
241
  physicalStats: Partial<Record<PhysicalStatistic, number>>;
227
242
  socialStats: Partial<Record<SocialStatistic, number>>;
228
243
  rawStats?: Partial<Record<CombatStatistic | CraftingStatistic, Scaling>>;
@@ -292,6 +307,11 @@ export interface RecipeItem extends ItemBase {
292
307
  baseItem: Item;
293
308
  perfectItem: Item;
294
309
  sublimeItem?: Item;
310
+ /** Override the default perfection effect resolved from the perfectItem's
311
+ * ItemKind in recipePerfectionEffect. Use 'quality' on recipes that should
312
+ * reward perfect/sublime crafts with stronger items (quality tier bonus)
313
+ * instead of producing more copies. */
314
+ perfectionEffectOverride?: 'none' | 'quality' | 'stacks';
295
315
  displayPerfect?: boolean;
296
316
  hideFromCompendium?: boolean;
297
317
  realmProgress: RealmProgress;
@@ -328,6 +348,7 @@ export interface CraftingTechniqueItem extends ItemBase {
328
348
  export interface TransportSealItem extends ItemBase {
329
349
  kind: 'transport_seal';
330
350
  destination: string;
351
+ omni?: boolean;
331
352
  }
332
353
  export interface EnchantmentItem extends ItemBase {
333
354
  kind: 'enchantment';
@@ -454,9 +475,9 @@ export interface PillarShardVariant {
454
475
  }
455
476
  export interface PillarShardItem extends ItemBase {
456
477
  kind: 'pillar_shard';
457
- tooltip: Translatable;
478
+ tooltip?: Translatable;
458
479
  maxInstances?: number;
459
- delveRoomConfig?: DelveRoom;
480
+ delveRoomConfig?: DelveRoomConfig;
460
481
  variants?: PillarShardVariant[];
461
482
  stability?: number;
462
483
  portal?: {
@@ -499,6 +520,8 @@ export interface UncutStonePool {
499
520
  }
500
521
  export interface LifeEssenceItem extends ItemBase {
501
522
  kind: 'life_essence';
523
+ /** Signature colour for UI (rings, slot borders, picker tints). Hex string. */
524
+ color: string;
502
525
  thresholds: {
503
526
  level: number;
504
527
  buffs: Buff[];
@@ -0,0 +1,33 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { AppDispatch } from '../store';
3
+ import type { BreakthroughState } from './breakthrough';
4
+ import type { SoundEffectName } from './audio';
5
+ import type { Item } from './item';
6
+ import type { PlayerEntity } from './entity';
7
+ import type { InventoryState } from './reduxState';
8
+ interface OpenItem {
9
+ item: Item;
10
+ data: unknown;
11
+ onComplete: () => void;
12
+ }
13
+ export interface ItemActionContext {
14
+ item: Item;
15
+ player: PlayerEntity;
16
+ inventory: InventoryState;
17
+ breakthrough: BreakthroughState;
18
+ flags: Record<string, number | string | boolean>;
19
+ dispatch: AppDispatch;
20
+ setResult: (result: ReactNode) => void;
21
+ setClicked: (clicked: boolean) => void;
22
+ setOpenItem?: (openItem: OpenItem) => void;
23
+ setDoEnchant?: (doEnchant: boolean) => void;
24
+ setDoUpgrade?: (doUpgrade: boolean) => void;
25
+ setDoAppearanceChange?: (doAppearanceChange: boolean) => void;
26
+ playSfx: (sound: SoundEffectName) => void;
27
+ usageRestricted: boolean;
28
+ }
29
+ export interface ItemActionResult {
30
+ buttons: ReactNode[];
31
+ }
32
+ export type ItemActionHandler = (context: ItemActionContext) => ItemActionResult;
33
+ export {};
@@ -0,0 +1 @@
1
+ export {};
package/dist/life.d.ts CHANGED
@@ -14,6 +14,11 @@ export interface LifeForm {
14
14
  role: string;
15
15
  species: string;
16
16
  image: string;
17
+ unlockCost: {
18
+ essence: string;
19
+ amount: number;
20
+ }[];
21
+ parentSpecies?: string;
17
22
  supportImage?: LifeFormAnimationImage;
18
23
  defensiveImage?: LifeFormAnimationImage;
19
24
  utilityImage?: LifeFormAnimationImage;