Skip to content

Commit

Permalink
fixed crystal guardian and enraged guardian not shown in splits view
Browse files Browse the repository at this point in the history
  • Loading branch information
OliverGrack committed Jan 19, 2025
1 parent 2ba03c7 commit 0192e18
Show file tree
Hide file tree
Showing 4 changed files with 660 additions and 612 deletions.
166 changes: 84 additions & 82 deletions src/lib/parser/player-data/enemies.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
import { type EnemyName, enemiesGenerated, enemiesJournalGenerated } from '../../hk-data';

export const greyPrinceNames = [
// https://hollowknight.wiki/w/Grey_Prince_Zote
'Terrifying, Beautiful, Powerful, Grey Prince Zote',
'Gorgeous, Passionate,',
'Diligent, Overwhelming,',
'Vigorous,',
'Enchanting,',
'Mysterious,',
'Sensual,',
'Fearless,',
'Invincible,',
// https://hollowknight.wiki/w/Grey_Prince_Zote
'Terrifying, Beautiful, Powerful, Grey Prince Zote',
'Gorgeous, Passionate,',
'Diligent, Overwhelming,',
'Vigorous,',
'Enchanting,',
'Mysterious,',
'Sensual,',
'Fearless,',
'Invincible,',
];

for (let i = 1; i < greyPrinceNames.length; i++) {
greyPrinceNames[i] = greyPrinceNames[i] + ' ' + greyPrinceNames[i - 1];
greyPrinceNames[i] = greyPrinceNames[i] + ' ' + greyPrinceNames[i - 1];
}

for (let i = 0; i < greyPrinceNames.length; i++) {
greyPrinceNames[i] = greyPrinceNames[i] + ` (Level ${i + 1})`;
greyPrinceNames[i] = greyPrinceNames[i] + ` (Level ${i + 1})`;
}

// fields in playerData {name}Defeated: boolean
Expand All @@ -27,98 +27,100 @@ for (let i = 0; i < greyPrinceNames.length; i++) {
// create a single 'boss' like the Watcher Knights.
// additionally the dreamers are detected like this.
export const playerDataNameToDefeatedName: Record<
string,
{ enemy: EnemyName; overrideName?: string } | { dreamer: string; achievementSprite: string } | undefined
string,
{ enemy: EnemyName; overrideName?: string } | { dreamer: string; achievementSprite: string } | undefined
> = {
// guardians would refer to the watcher knights but only becomes true once lurien is defeated, therefore undefined
guardians: undefined, // { enemy: 'BlackKnight', overrideName: 'Watcher Knights' },
lurien: { dreamer: 'Lurien', achievementSprite: 'Achievement_icon__0000_watcher' },
hegemol: { dreamer: 'Herrah', achievementSprite: 'Achievement_icon__0002_beast' },
monomon: { dreamer: 'Monomon', achievementSprite: 'Achievement_icon__0001_teacher' },
zote: undefined, // covered below { enemy: 'Zote' },
falseKnight: undefined,
falseKnightDream: { enemy: 'FalseKnight', overrideName: 'Failed Champion' },
mawlek: undefined,
giantBuzzer: undefined,
giantFly: undefined,
blocker1: undefined,
blocker2: undefined,
hornet1: { enemy: 'Hornet', overrideName: 'Hornet Protector' },
collector: undefined,
hornetOutskirts: { enemy: 'Hornet', overrideName: 'Hornet Sentinel' },
// dream bosses (some missing?)
mageLordDream: { enemy: 'MageLord', overrideName: 'Soul Tyrant' },
infectedKnightDream: { enemy: 'InfectedKnight', overrideName: 'Lost Kin' },
whiteDefender: undefined, // { enemy: 'DungDefender', overrideName: 'White Defender' },
greyPrince: undefined, // { enemy: 'Zote', overrideName: 'Grey Prince Zote' },
// dream warriors
aladarSlug: undefined,
xero: undefined,
elderHu: undefined,
mumCaterpillar: undefined,
noEyes: undefined,
markoth: undefined,
galien: undefined,
megaMossCharger: undefined,
mageLord: undefined,
// other bosses
flukeMother: undefined,
duskKnight: undefined,
// guardians would refer to the watcher knights but only becomes true once lurien is defeated, therefore undefined
guardians: undefined, // { enemy: 'BlackKnight', overrideName: 'Watcher Knights' },
lurien: { dreamer: 'Lurien', achievementSprite: 'Achievement_icon__0000_watcher' },
hegemol: { dreamer: 'Herrah', achievementSprite: 'Achievement_icon__0002_beast' },
monomon: { dreamer: 'Monomon', achievementSprite: 'Achievement_icon__0001_teacher' },
zote: undefined, // covered below { enemy: 'Zote' },
falseKnight: undefined,
falseKnightDream: { enemy: 'FalseKnight', overrideName: 'Failed Champion' },
mawlek: undefined,
giantBuzzer: undefined,
giantFly: undefined,
blocker1: undefined,
blocker2: undefined,
hornet1: { enemy: 'Hornet', overrideName: 'Hornet Protector' },
collector: undefined,
hornetOutskirts: { enemy: 'Hornet', overrideName: 'Hornet Sentinel' },
// dream bosses (some missing?)
mageLordDream: { enemy: 'MageLord', overrideName: 'Soul Tyrant' },
infectedKnightDream: { enemy: 'InfectedKnight', overrideName: 'Lost Kin' },
whiteDefender: undefined, // { enemy: 'DungDefender', overrideName: 'White Defender' },
greyPrince: undefined, // { enemy: 'Zote', overrideName: 'Grey Prince Zote' },
// dream warriors
aladarSlug: undefined,
xero: undefined,
elderHu: undefined,
mumCaterpillar: undefined,
noEyes: undefined,
markoth: undefined,
galien: undefined,
megaMossCharger: undefined,
mageLord: undefined,
// other bosses
flukeMother: undefined,
duskKnight: undefined,
};

const journalInfoByPlayerDataName = Object.fromEntries(
enemiesJournalGenerated.map((journalInfo) => [journalInfo.playerDataName, journalInfo]),
enemiesJournalGenerated.map((journalInfo) => [journalInfo.playerDataName, journalInfo]),
);

const enemyArray = Object.values(enemiesGenerated).map((enemy) => {
const journalInfo = journalInfoByPlayerDataName[enemy.name];
return {
...enemy,
portraitName: journalInfo?.portraitName,
convoName: journalInfo?.convoName,
descConvo: journalInfo?.descConvo,
nameConvo: journalInfo?.nameConvo,
notesConvo: journalInfo?.notesConvo,
playerDataBoolName: journalInfo?.playerDataBoolName,
playerDataKillsName: journalInfo?.playerDataKillsName,
playerDataName: journalInfo?.playerDataName,
playerDataNewDataName: journalInfo?.playerDataNewDataName,
};
const journalInfo = journalInfoByPlayerDataName[enemy.name];
return {
...enemy,
portraitName: journalInfo?.portraitName,
convoName: journalInfo?.convoName,
descConvo: journalInfo?.descConvo,
nameConvo: journalInfo?.nameConvo,
notesConvo: journalInfo?.notesConvo,
playerDataBoolName: journalInfo?.playerDataBoolName,
playerDataKillsName: journalInfo?.playerDataKillsName,
playerDataName: journalInfo?.playerDataName,
playerDataNewDataName: journalInfo?.playerDataNewDataName,
};
});

export type EnemyInfo = (typeof enemyArray)[number];

export const enemies = {
byPlayerDataName: Object.fromEntries(enemyArray.map((enemy) => [enemy.name, enemy])),
byPlayerDataName: Object.fromEntries(enemyArray.map((enemy) => [enemy.name, enemy])),
};

// By default all enemies which need to be killed only once
// are seen as bosses, there are some exceptions
// of enemies which have only 1 kill, but are no bosses and the other way around
// these exceptions are defined here
const isBossOverrides: Partial<Record<EnemyName, boolean>> = {
BlackKnight: true, // Watcher Knights
BigFly: true, // Gruz Mother
MageKnight: true, // Soul Warrior
ZapBug: false, // Lumafly
Worm: false, // Goam
BigCentipede: false, // Garpede
AbyssTendril: false, // Void Tendrils
LazyFlyer: false, // Aluba
BindingSeal: false,
BlackKnight: true, // Watcher Knights
BigFly: true, // Gruz Mother
MageKnight: true, // Soul Warrior
ZapBug: false, // Lumafly
Worm: false, // Goam
BigCentipede: false, // Garpede
AbyssTendril: false, // Void Tendrils
LazyFlyer: false, // Aluba
BindingSeal: false,

ZotelingBuzzer: false, // Winged Zoteling
GreyPrince: false,
Zote: false,
ZotelingHopper: false,
ZotelingBalloon: false,
ZotelingBuzzer: false, // Winged Zoteling
GreyPrince: false,
Zote: false,
ZotelingHopper: false,
ZotelingBalloon: false,

MegaBeamMiner: true, // Crystal Guardian
};

export function isEnemyBoss(enemy: EnemyInfo): boolean {
const override = isBossOverrides[enemy.name];
if (override !== undefined) {
return override;
}
const override = isBossOverrides[enemy.name];
if (override !== undefined) {
return override;
}

return enemy.neededForJournal === 1;
return enemy.neededForJournal === 1;
}
Loading

0 comments on commit 0192e18

Please sign in to comment.