Skip to content

Commit

Permalink
feat(core): add support for patch 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
marcincichocki committed Sep 27, 2023
1 parent e6379c0 commit d138fd8
Show file tree
Hide file tree
Showing 19 changed files with 257 additions and 25 deletions.
47 changes: 47 additions & 0 deletions src/core/daemon-set.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { DaemonId } from './common';
import {
DAEMON_ADVANCED_DATAMINE,
DAEMON_BASIC_DATAMINE,
DAEMON_CAMERA_SHUTDOWN,
DAEMON_DATAMINE_COPY_MALWARE,
DAEMON_DATAMINE_CRAFTING_SPECS,
DAEMON_DATAMINE_V1,
DAEMON_DATAMINE_V2,
DAEMON_DATAMINE_V3,
DAEMON_EXPERT_DATAMINE,
DAEMON_FRIENDLY_TURRETS,
DAEMON_GAIN_ACCESS,
DAEMON_ICEPICK,
DAEMON_MASS_VULNERABILITY,
DAEMON_NEUTRALIZE_MALWARE,
DAEMON_OPTICS_JAMMER,
DAEMON_TURRET_SHUTDOWN,
DAEMON_WEAPONS_JAMMER,
} from './daemons';

export const LEGACY_DAEMONS = new Set<DaemonId>([
DAEMON_DATAMINE_V1,
DAEMON_DATAMINE_V2,
DAEMON_DATAMINE_V3,
DAEMON_ICEPICK,
DAEMON_MASS_VULNERABILITY,
DAEMON_CAMERA_SHUTDOWN,
DAEMON_FRIENDLY_TURRETS,
DAEMON_TURRET_SHUTDOWN,
DAEMON_OPTICS_JAMMER,
DAEMON_WEAPONS_JAMMER,
DAEMON_DATAMINE_COPY_MALWARE,
DAEMON_NEUTRALIZE_MALWARE,
DAEMON_GAIN_ACCESS,
DAEMON_DATAMINE_CRAFTING_SPECS,
]);

export const DAEMONS = new Set<DaemonId>([
DAEMON_DATAMINE_COPY_MALWARE,
DAEMON_NEUTRALIZE_MALWARE,
DAEMON_GAIN_ACCESS,
DAEMON_DATAMINE_CRAFTING_SPECS,
DAEMON_BASIC_DATAMINE,
DAEMON_ADVANCED_DATAMINE,
DAEMON_EXPERT_DATAMINE,
]);
51 changes: 51 additions & 0 deletions src/core/daemons-i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ export const eng: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'NEUTRALIZE MALWARE',
[d.DAEMON_GAIN_ACCESS]: 'GAIN ACCESS',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'DATAMINE: CRAFTING SPECS',
[d.DAEMON_BASIC_DATAMINE]: 'BASIC DATAMINE',
[d.DAEMON_ADVANCED_DATAMINE]: 'ADVANCED DATAMINE',
[d.DAEMON_EXPERT_DATAMINE]: 'EXPERT DATAMINE',
};

export const pol: DaemonDict = {
Expand All @@ -56,6 +59,9 @@ export const pol: DaemonDict = {
[d.DAEMON_GAIN_ACCESS]: 'UZYSKAJ DOSTĘP',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]:
'EKSPLORACJA DANYCH: SCHEMATY WYTWARZANIA',
[d.DAEMON_BASIC_DATAMINE]: 'EKSPLORACJA: DANE BAZOWE',
[d.DAEMON_ADVANCED_DATAMINE]: 'EKSPLORACJA: DANE SPECJALNE',
[d.DAEMON_EXPERT_DATAMINE]: 'EKSPLORACJA: DANE WRAŻLIWE',
};

export const rus: DaemonDict = {
Expand All @@ -73,6 +79,9 @@ export const rus: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'ОБЕЗВРЕДИТЬ ВИРУС',
[d.DAEMON_GAIN_ACCESS]: 'ПОЛУЧИТЬ ДОСТУП',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'ДОБЫЧА ДАННЫХ: ДОКУМЕНТАЦИЯ',
[d.DAEMON_BASIC_DATAMINE]: 'ОБЫЧНА ДОБЫЧА ДАННЫХ',
[d.DAEMON_ADVANCED_DATAMINE]: 'ПРОДВИНУТАЯ ДОБЫЧА ДАННЫХ',
[d.DAEMON_EXPERT_DATAMINE]: 'ВЫСОКОУРОВНЕВАЯ ДОБЫЧА ДАННЫХ',
};

export const deu: DaemonDict = {
Expand All @@ -90,6 +99,9 @@ export const deu: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'MALWARE NEUTRALISIEREN',
[d.DAEMON_GAIN_ACCESS]: 'ZUGRIFF VERSCHAFFEN',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'DATA-MINING: SCHEMA',
[d.DAEMON_BASIC_DATAMINE]: 'EINFACHES DATA-MINING',
[d.DAEMON_ADVANCED_DATAMINE]: 'VERBESSERTES DATA-MINING',
[d.DAEMON_EXPERT_DATAMINE]: 'HERAUSRAGENDES DATA-MINING',
};

export const fra: DaemonDict = {
Expand All @@ -107,6 +119,9 @@ export const fra: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'NEUTRALISER LE MALWARE',
[d.DAEMON_GAIN_ACCESS]: "OBTENIR L'ACCÈS",
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'DATA MINING : PLAN DE FABRICATION',
[d.DAEMON_BASIC_DATAMINE]: 'DATA MINING ÉLÉMENTAIRE',
[d.DAEMON_ADVANCED_DATAMINE]: 'DATA MINING AVANCÉ',
[d.DAEMON_EXPERT_DATAMINE]: 'DATA MINING EXPERT',
};

export const por: DaemonDict = {
Expand All @@ -125,6 +140,9 @@ export const por: DaemonDict = {
[d.DAEMON_GAIN_ACCESS]: 'OBTER ACESSO',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]:
'MINERAÇÃO DE DADOS: ESPECIALIZAÇÕES DE CRIAÇÃO',
[d.DAEMON_BASIC_DATAMINE]: 'MINERAÇÃO DE DADOS BÁSICA',
[d.DAEMON_ADVANCED_DATAMINE]: 'MINERAÇÃO DE DADOS AVANÇADA',
[d.DAEMON_EXPERT_DATAMINE]: 'PERÍCIA EM MINERAÇÃO DE DADOS',
};

export const chi_sim: DaemonDict = {
Expand All @@ -142,6 +160,9 @@ export const chi_sim: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: '清除恶意软件',
[d.DAEMON_GAIN_ACCESS]: '获取权限',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: '数据挖掘: 制作规范',
[d.DAEMON_BASIC_DATAMINE]: '基础数据挖掘',
[d.DAEMON_ADVANCED_DATAMINE]: '高级数据挖掘',
[d.DAEMON_EXPERT_DATAMINE]: '专家数据挖掘',
};

export const spa: DaemonDict = {
Expand All @@ -160,6 +181,9 @@ export const spa: DaemonDict = {
[d.DAEMON_GAIN_ACCESS]: 'OBTENER ACCESO',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]:
'MINERÍA DE DATOS: ESPECIFICACIONES DE CREACIÓN',
[d.DAEMON_BASIC_DATAMINE]: 'MINERÍA DE DATOS BÁSICA',
[d.DAEMON_ADVANCED_DATAMINE]: 'MINERÍA DE DATOS AVANZADA',
[d.DAEMON_EXPERT_DATAMINE]: 'MINERÍA DE DATOS EXPERTA',
};

export const ita: DaemonDict = {
Expand All @@ -178,6 +202,9 @@ export const ita: DaemonDict = {
[d.DAEMON_GAIN_ACCESS]: 'OTTIENI ACCESSO',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]:
'ESTRAZIONE DATI: ISTRUZIONI DI CREAZIONE',
[d.DAEMON_BASIC_DATAMINE]: 'ESTRAZIONE DATI SEMPLICE',
[d.DAEMON_ADVANCED_DATAMINE]: 'ESTRAZIONE DATI AVANZATA',
[d.DAEMON_EXPERT_DATAMINE]: 'ESTRAZIONE DATI ESPERTO',
};

export const kor: DaemonDict = {
Expand All @@ -195,6 +222,9 @@ export const kor: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: '멀웨어 무력화',
[d.DAEMON_GAIN_ACCESS]: '액세스 권한 획득',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: '데이터마이닝: 제작 사양서',
[d.DAEMON_BASIC_DATAMINE]: '기본 데이터마이닝',
[d.DAEMON_ADVANCED_DATAMINE]: '고급 데이터마이닝',
[d.DAEMON_EXPERT_DATAMINE]: '전문 데이터마이닝',
};

export const jpn: DaemonDict = {
Expand All @@ -212,6 +242,9 @@ export const jpn: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'マルウェアを無力化する',
[d.DAEMON_GAIN_ACCESS]: 'アクセス取得',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'データマイニング: クラフト用設計図',
[d.DAEMON_BASIC_DATAMINE]: '基礎データマイニング',
[d.DAEMON_ADVANCED_DATAMINE]: '高度データマイニング',
[d.DAEMON_EXPERT_DATAMINE]: '超高度データマイニング',
};

export const tha: DaemonDict = {
Expand All @@ -229,6 +262,9 @@ export const tha: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'กําจัดมัลแวร์',
[d.DAEMON_GAIN_ACCESS]: 'ขอสิทธิ์เข้าถึง',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'ดาต้าไมน์: สูตรการคราฟต์',
[d.DAEMON_BASIC_DATAMINE]: 'ดาต้าไมน์ขันพื่นฐาน',
[d.DAEMON_ADVANCED_DATAMINE]: 'ดาต้าไมน์ขันสูง',
[d.DAEMON_EXPERT_DATAMINE]: 'ดาต้าไมน์ขันเชียวชาญ',
};

export const tur: DaemonDict = {
Expand All @@ -246,6 +282,9 @@ export const tur: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'KÖTÜ AMAÇLI YAZILIMI ORTADAN KALDIR',
[d.DAEMON_GAIN_ACCESS]: 'ERİŞİM SAĞLA',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'VERİ MADENİ: ÜRETİM KILAVUZLARI',
[d.DAEMON_BASIC_DATAMINE]: 'BASİT VERİ MADENİ',
[d.DAEMON_ADVANCED_DATAMINE]: 'GELİŞMİŞ VERİ MADENİ',
[d.DAEMON_EXPERT_DATAMINE]: 'UZMAN VERİ MADENİ',
};

export const ara: DaemonDict = {
Expand All @@ -263,6 +302,9 @@ export const ara: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'اقض على البرنامج الخبيث',
[d.DAEMON_GAIN_ACCESS]: 'تمكن من الوصول',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'منجم بيانات: مواصفات التصنيع',
[d.DAEMON_BASIC_DATAMINE]: 'منجه بيانات أساسي',
[d.DAEMON_ADVANCED_DATAMINE]: 'منجم بيانات متقدم',
[d.DAEMON_EXPERT_DATAMINE]: 'منجم بيانات نخبوي',
};

export const chi_tra: DaemonDict = {
Expand All @@ -280,6 +322,9 @@ export const chi_tra: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: '制止惡意軟體',
[d.DAEMON_GAIN_ACCESS]: '取得存取權',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: '資料探勘 : 製作需求',
[d.DAEMON_BASIC_DATAMINE]: '基礎資料探勘',
[d.DAEMON_ADVANCED_DATAMINE]: '進階資料探勘',
[d.DAEMON_EXPERT_DATAMINE]: '專業資料探勘',
};

export const ces: DaemonDict = {
Expand All @@ -297,6 +342,9 @@ export const ces: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'ZNEŠKODNIT MALWARE',
[d.DAEMON_GAIN_ACCESS]: 'ZÍSKAT PŘÍSTUP',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'TĚŽBA DAT: VÝROBNÍ SPECIFIKACE',
[d.DAEMON_BASIC_DATAMINE]: 'ZÁKLADNÍ TĚŽBA DAT',
[d.DAEMON_ADVANCED_DATAMINE]: 'POKROČILÁ TĚŽBA DAT',
[d.DAEMON_EXPERT_DATAMINE]: 'EXPERTNÍ TĚŽBA DAT',
};

export const hun: DaemonDict = {
Expand All @@ -315,6 +363,9 @@ export const hun: DaemonDict = {
[d.DAEMON_NEUTRALIZE_MALWARE]: 'ROSSZINDULATÚ SZOFTVER HATÁSTALANÍTÁSA',
[d.DAEMON_GAIN_ACCESS]: 'HOZZÁFÉRÉS MEGSZERZÉSE',
[d.DAEMON_DATAMINE_CRAFTING_SPECS]: 'ADATBÁNYÁSZAT: TÁRGYKÉSZÍTÉSI ÁBRA',
[d.DAEMON_BASIC_DATAMINE]: 'ALAP ADATBÁNYÁSZAT',
[d.DAEMON_ADVANCED_DATAMINE]: 'HALADÓ ADATBÁNYÁSZAT',
[d.DAEMON_EXPERT_DATAMINE]: 'SZAKÉRTŐ ADATBÁNYÁSZAT',
};

export const daemonsI18n: Record<BreachProtocolLanguage, DaemonDict> = {
Expand Down
6 changes: 6 additions & 0 deletions src/core/daemons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ export const DAEMON_DATAMINE_COPY_MALWARE = 'DAEMON_DATAMINE_COPY_MALWARE';
export const DAEMON_NEUTRALIZE_MALWARE = 'DAEMON_NEUTRALIZE_MALWARE';
export const DAEMON_GAIN_ACCESS = 'DAEMON_GAIN_ACCESS';
export const DAEMON_DATAMINE_CRAFTING_SPECS = 'DAEMON_DATAMINE_CRAFTING_SPECS';
// Patch 2.0 daemons.
export const DAEMON_BASIC_DATAMINE = 'DAEMON_BASIC_DATAMINE';
export const DAEMON_ADVANCED_DATAMINE = 'DAEMON_ADVANCED_DATAMINE';
export const DAEMON_EXPERT_DATAMINE = 'DAEMON_EXPERT_DATAMINE';
// This daemon is only used inside breach protocol tutorial.
// export const DAEMON_EXTRACT_EURODOLLARS = 'DAEMON_EXTRACT_EURODOLLARS';
1 change: 1 addition & 0 deletions src/core/ocr/fragments/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export type BreachProtocolFragmentResults = [

export interface BreachProtocolFragmentOptions extends FragmentOptions {
recognizer?: BreachProtocolRecognizer;
patch: '1.x' | '2.x';
}

export abstract class BreachProtocolFragment<
Expand Down
36 changes: 26 additions & 10 deletions src/core/ocr/fragments/types-fragment.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { Point, similarity, unique } from '@/common';
import {
DaemonId,
DAEMONS_SIZE_MAX,
DAEMONS_SIZE_MIN,
DaemonId,
TypesRawData,
} from '../../common';
import { DAEMONS, LEGACY_DAEMONS } from '../../daemon-set';
import {
DAEMON_DATAMINE_V1,
DAEMON_DATAMINE_V2,
Expand Down Expand Up @@ -55,6 +56,8 @@ export class BreachProtocolTypesFragment<
/** Language of current dictionary. */
private static daemonDictLang: BreachProtocolLanguage = null;

private static patch: string = null;

private static minAcceptableSimilarity = 0.85;

// Some non latin languages contain latin characters in daemon names.
Expand Down Expand Up @@ -87,17 +90,27 @@ export class BreachProtocolTypesFragment<
}

private setDaemonDict() {
if (
this.options.recognizer.lang !==
BreachProtocolTypesFragment.daemonDictLang
) {
const { lang } = this.options.recognizer;
const entries = Object.entries(daemonsI18n[lang]).map(
([k, v]: [DaemonId, string]) => [v, k] as const
);
const hasValidDictionary =
this.options.recognizer.lang ===
BreachProtocolTypesFragment.daemonDictLang;
const hasValidPatch =
this.options.patch === BreachProtocolTypesFragment.patch;

if (!hasValidDictionary || !hasValidPatch) {
const { recognizer, patch } = this.options;
const { lang } = recognizer;
const daemons = patch === '1.x' ? LEGACY_DAEMONS : DAEMONS;
const daemonDictEntries = Object.entries(daemonsI18n[lang]) as [
DaemonId,
string
][];
const entries = daemonDictEntries
.filter(([daemonId]) => daemons.has(daemonId))
.map(([daemonId, translation]) => [translation, daemonId] as const);

BreachProtocolTypesFragment.daemonDict = Object.fromEntries(entries);
BreachProtocolTypesFragment.daemonDictLang = lang;
BreachProtocolTypesFragment.patch = patch;
}
}

Expand Down Expand Up @@ -146,7 +159,10 @@ export class BreachProtocolTypesFragment<
const keys = Object.keys(BreachProtocolTypesFragment.daemonDict);

return lines.map((t) => {
if (BreachProtocolTypesFragment.edgeCases.has(t)) {
if (
this.options.patch === '1.x' &&
BreachProtocolTypesFragment.edgeCases.has(t)
) {
return BreachProtocolTypesFragment.edgeCases.get(t);
}

Expand Down
12 changes: 11 additions & 1 deletion src/core/ocr/ocr.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,16 @@ describe('raw data validation', () => {
it('should pass it if data is valid', () => {
const gridFragment = new BreachProtocolGridFragment(container, {
recognizer,
patch: '1.x',
});
const daemonsFragment = new BreachProtocolDaemonsFragment(container, {
recognizer,
extendedDaemonsAndTypesRecognitionRange: false,
patch: '1.x',
});
const bufferSizeFragment = new BreachProtocolBufferSizeFragment(container, {
extendedBufferSizeRecognitionRange: false,
patch: '1.x',
});

expect(gridFragment.getStatus(grid)).toBe(valid);
Expand All @@ -151,7 +154,10 @@ describe('raw data validation', () => {
});

it('should throw an error if grid is invalid', () => {
const fragment = new BreachProtocolGridFragment(container, { recognizer });
const fragment = new BreachProtocolGridFragment(container, {
recognizer,
patch: '1.x',
});
const invalidGrids = [
grid.map((s, i) => (i === 5 ? '57' : s)),
grid.map((s, i) => (i === 9 ? 'test' : s)),
Expand All @@ -169,6 +175,7 @@ describe('raw data validation', () => {
const fragment = new BreachProtocolDaemonsFragment(container, {
recognizer,
extendedDaemonsAndTypesRecognitionRange: false,
patch: '1.x',
});
const invalidDaemons = [
daemons.map(() => ['B7']),
Expand All @@ -185,6 +192,7 @@ describe('raw data validation', () => {
it('should throw an error if buffer size is invalid', () => {
const fragment = new BreachProtocolBufferSizeFragment(container, {
extendedBufferSizeRecognitionRange: false,
patch: '1.x',
});
const invalidBufferSizes = [NaN, 3, 10, 2 * Math.PI] as BufferSize[];

Expand Down Expand Up @@ -246,11 +254,13 @@ async function recognizeRegistryEntry(
settings?.extendedBufferSizeRecognitionRange ?? false;
const trimStrategy = new BreachProtocolBufferSizeTrimFragment(container, {
extendedBufferSizeRecognitionRange,
patch: '1.x',
});
const recognizer = new WasmBreachProtocolRecognizer(null);

return Promise.all([
breachProtocolOCR(container, recognizer, {
patch: '1.x',
thresholdGridAuto: true,
thresholdTypesAuto: true,
thresholdDaemonsAuto: true,
Expand Down
3 changes: 3 additions & 0 deletions src/core/ocr/ocr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export interface BreachProtocolOCROptions extends FragmentOptions {
skipTypesFragment?: boolean;
useFixedBufferSize?: boolean;
fixedBufferSize?: number;
patch: '1.x' | '2.x';
}

type FragmentCtor = new (
Expand Down Expand Up @@ -84,13 +85,15 @@ class BreachProtocolFragmentFactory<TImage> {
filterRecognizerResults,
extendedDaemonsAndTypesRecognitionRange,
extendedBufferSizeRecognitionRange,
patch,
} = options;

return {
recognizer,
extendedBufferSizeRecognitionRange,
extendedDaemonsAndTypesRecognitionRange,
filterRecognizerResults,
patch,
};
}
}
Expand Down

0 comments on commit d138fd8

Please sign in to comment.