diablo2-web/src/common/units/hireling-table.ts

4521 lines
85 KiB
TypeScript

/**
* Canonical Diablo II v1.13c Hireling data table & stat resolver.
*
* Ground Truth References:
* - `Hireling.txt` / `hireling.bin` (120 rows)
* - D2Common.dll ordinal 10988 (0x6fd7c9e0) -> Act index resolution
* - D2Common.dll ordinal 10458 (0x6fd7ccc0) -> 64-bit LCG candidate evaluation
* - D2Common.dll ordinal 10091 (0x6fd7c9c0) -> Ability description string resolution
* - D2Client.dll 0x6faf9440 -> Candidate dialog line formatting
*
* DO NOT EDIT MANUALLY.
*/
import { lookupTbl } from '../formats/tbl.ts'
export interface HirelingRecord {
readonly version: number
readonly subTypeId: number
readonly classId: number
readonly act: number
readonly difficulty: number
readonly seller: number
readonly hireCost: number
readonly level: number
readonly expPerLvl: number
readonly hp: number
readonly hpPerLvl: number
readonly defense: number
readonly defPerLvl: number
readonly str: number
readonly strPerLvl: number
readonly dex: number
readonly dexPerLvl: number
readonly ar: number
readonly arPerLvl: number
readonly dmgMin: number
readonly dmgMax: number
readonly dmgPerLvl: number
readonly resist: number
readonly resistPerLvl: number
readonly hireDesc: number
readonly nameFirstKey: string
readonly nameLastKey: string
readonly wNameFirstId: number
readonly wNameLastId: number
readonly skills: readonly number[]
}
export const HIRELING_RECORDS: readonly HirelingRecord[] = [
{
"version": 0,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 3,
"expPerLvl": 100,
"hp": 45,
"hpPerLvl": 8,
"defense": 15,
"defPerLvl": 6,
"str": 35,
"strPerLvl": 10,
"dex": 45,
"dexPerLvl": 16,
"ar": 10,
"arPerLvl": 10,
"dmgMin": 1,
"dmgMax": 3,
"dmgPerLvl": 2,
"resist": 0,
"resistPerLvl": 8,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 25,
"expPerLvl": 100,
"hp": 221,
"hpPerLvl": 13,
"defense": 147,
"defPerLvl": 12,
"str": 63,
"strPerLvl": 10,
"dex": 89,
"dexPerLvl": 16,
"ar": 230,
"arPerLvl": 20,
"dmgMin": 7,
"dmgMax": 9,
"dmgPerLvl": 4,
"resist": 44,
"resistPerLvl": 7,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 49,
"expPerLvl": 100,
"hp": 533,
"hpPerLvl": 25,
"defense": 435,
"defPerLvl": 18,
"str": 93,
"strPerLvl": 10,
"dex": 137,
"dexPerLvl": 16,
"ar": 710,
"arPerLvl": 30,
"dmgMin": 19,
"dmgMax": 21,
"dmgPerLvl": 6,
"resist": 86,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 3,
"expPerLvl": 105,
"hp": 45,
"hpPerLvl": 8,
"defense": 15,
"defPerLvl": 6,
"str": 35,
"strPerLvl": 10,
"dex": 45,
"dexPerLvl": 16,
"ar": 10,
"arPerLvl": 10,
"dmgMin": 1,
"dmgMax": 3,
"dmgPerLvl": 2,
"resist": 0,
"resistPerLvl": 8,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 25,
"expPerLvl": 105,
"hp": 221,
"hpPerLvl": 12,
"defense": 147,
"defPerLvl": 12,
"str": 63,
"strPerLvl": 10,
"dex": 89,
"dexPerLvl": 16,
"ar": 230,
"arPerLvl": 20,
"dmgMin": 7,
"dmgMax": 9,
"dmgPerLvl": 4,
"resist": 44,
"resistPerLvl": 7,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 49,
"expPerLvl": 105,
"hp": 509,
"hpPerLvl": 16,
"defense": 435,
"defPerLvl": 18,
"str": 93,
"strPerLvl": 10,
"dex": 137,
"dexPerLvl": 16,
"ar": 710,
"arPerLvl": 30,
"dmgMin": 19,
"dmgMax": 21,
"dmgPerLvl": 6,
"resist": 86,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 2,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 6000,
"level": 25,
"expPerLvl": 110,
"hp": 199,
"hpPerLvl": 12,
"defense": 132,
"defPerLvl": 12,
"str": 60,
"strPerLvl": 10,
"dex": 84,
"dexPerLvl": 16,
"ar": 207,
"arPerLvl": 20,
"dmgMin": 6,
"dmgMax": 8,
"dmgPerLvl": 4,
"resist": 41,
"resistPerLvl": 7,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 2,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 6000,
"level": 49,
"expPerLvl": 110,
"hp": 487,
"hpPerLvl": 16,
"defense": 420,
"defPerLvl": 18,
"str": 90,
"strPerLvl": 10,
"dex": 132,
"dexPerLvl": 16,
"ar": 687,
"arPerLvl": 30,
"dmgMin": 18,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 83,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 3,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 7500,
"level": 25,
"expPerLvl": 115,
"hp": 199,
"hpPerLvl": 12,
"defense": 132,
"defPerLvl": 12,
"str": 60,
"strPerLvl": 10,
"dex": 84,
"dexPerLvl": 16,
"ar": 207,
"arPerLvl": 20,
"dmgMin": 6,
"dmgMax": 8,
"dmgPerLvl": 4,
"resist": 41,
"resistPerLvl": 7,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 3,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 7500,
"level": 49,
"expPerLvl": 115,
"hp": 487,
"hpPerLvl": 16,
"defense": 420,
"defPerLvl": 18,
"str": 90,
"strPerLvl": 10,
"dex": 132,
"dexPerLvl": 16,
"ar": 687,
"arPerLvl": 30,
"dmgMin": 18,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 83,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 4,
"classId": 271,
"act": 1,
"difficulty": 3,
"seller": 150,
"hireCost": 12500,
"level": 49,
"expPerLvl": 120,
"hp": 438,
"hpPerLvl": 16,
"defense": 378,
"defPerLvl": 18,
"str": 87,
"strPerLvl": 10,
"dex": 127,
"dexPerLvl": 16,
"ar": 618,
"arPerLvl": 30,
"dmgMin": 17,
"dmgMax": 19,
"dmgPerLvl": 6,
"resist": 80,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 0,
"subTypeId": 5,
"classId": 271,
"act": 1,
"difficulty": 3,
"seller": 150,
"hireCost": 14000,
"level": 49,
"expPerLvl": 125,
"hp": 438,
"hpPerLvl": 16,
"defense": 378,
"defPerLvl": 18,
"str": 87,
"strPerLvl": 10,
"dex": 127,
"dexPerLvl": 16,
"ar": 618,
"arPerLvl": 30,
"dmgMin": 17,
"dmgMax": 19,
"dmgPerLvl": 6,
"resist": 80,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 3,
"expPerLvl": 100,
"hp": 45,
"hpPerLvl": 9,
"defense": 15,
"defPerLvl": 8,
"str": 35,
"strPerLvl": 10,
"dex": 45,
"dexPerLvl": 16,
"ar": 10,
"arPerLvl": 12,
"dmgMin": 1,
"dmgMax": 3,
"dmgPerLvl": 2,
"resist": 0,
"resistPerLvl": 8,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 36,
"expPerLvl": 100,
"hp": 342,
"hpPerLvl": 18,
"defense": 279,
"defPerLvl": 15,
"str": 77,
"strPerLvl": 10,
"dex": 111,
"dexPerLvl": 16,
"ar": 406,
"arPerLvl": 24,
"dmgMin": 9,
"dmgMax": 11,
"dmgPerLvl": 4,
"resist": 66,
"resistPerLvl": 7,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 0,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 100,
"level": 67,
"expPerLvl": 100,
"hp": 900,
"hpPerLvl": 30,
"defense": 744,
"defPerLvl": 22,
"str": 116,
"strPerLvl": 10,
"dex": 173,
"dexPerLvl": 16,
"ar": 1150,
"arPerLvl": 36,
"dmgMin": 25,
"dmgMax": 27,
"dmgPerLvl": 6,
"resist": 121,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 3,
"expPerLvl": 105,
"hp": 45,
"hpPerLvl": 9,
"defense": 15,
"defPerLvl": 8,
"str": 35,
"strPerLvl": 10,
"dex": 45,
"dexPerLvl": 16,
"ar": 10,
"arPerLvl": 12,
"dmgMin": 1,
"dmgMax": 3,
"dmgPerLvl": 2,
"resist": 0,
"resistPerLvl": 8,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 36,
"expPerLvl": 105,
"hp": 342,
"hpPerLvl": 18,
"defense": 279,
"defPerLvl": 15,
"str": 77,
"strPerLvl": 10,
"dex": 111,
"dexPerLvl": 16,
"ar": 406,
"arPerLvl": 24,
"dmgMin": 9,
"dmgMax": 11,
"dmgPerLvl": 4,
"resist": 66,
"resistPerLvl": 7,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 1,
"classId": 271,
"act": 1,
"difficulty": 1,
"seller": 150,
"hireCost": 150,
"level": 67,
"expPerLvl": 105,
"hp": 900,
"hpPerLvl": 30,
"defense": 744,
"defPerLvl": 22,
"str": 116,
"strPerLvl": 10,
"dex": 173,
"dexPerLvl": 16,
"ar": 1150,
"arPerLvl": 36,
"dmgMin": 25,
"dmgMax": 27,
"dmgPerLvl": 6,
"resist": 121,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 2,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 6000,
"level": 36,
"expPerLvl": 110,
"hp": 308,
"hpPerLvl": 18,
"defense": 251,
"defPerLvl": 15,
"str": 74,
"strPerLvl": 10,
"dex": 106,
"dexPerLvl": 16,
"ar": 365,
"arPerLvl": 24,
"dmgMin": 8,
"dmgMax": 10,
"dmgPerLvl": 4,
"resist": 63,
"resistPerLvl": 7,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 2,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 6000,
"level": 67,
"expPerLvl": 110,
"hp": 866,
"hpPerLvl": 30,
"defense": 716,
"defPerLvl": 22,
"str": 113,
"strPerLvl": 10,
"dex": 168,
"dexPerLvl": 16,
"ar": 1109,
"arPerLvl": 36,
"dmgMin": 24,
"dmgMax": 26,
"dmgPerLvl": 6,
"resist": 118,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 3,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 7500,
"level": 36,
"expPerLvl": 115,
"hp": 308,
"hpPerLvl": 18,
"defense": 251,
"defPerLvl": 15,
"str": 74,
"strPerLvl": 10,
"dex": 106,
"dexPerLvl": 16,
"ar": 365,
"arPerLvl": 24,
"dmgMin": 8,
"dmgMax": 10,
"dmgPerLvl": 4,
"resist": 63,
"resistPerLvl": 7,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 3,
"classId": 271,
"act": 1,
"difficulty": 2,
"seller": 150,
"hireCost": 7500,
"level": 67,
"expPerLvl": 115,
"hp": 866,
"hpPerLvl": 30,
"defense": 716,
"defPerLvl": 22,
"str": 113,
"strPerLvl": 10,
"dex": 168,
"dexPerLvl": 16,
"ar": 1109,
"arPerLvl": 36,
"dmgMin": 24,
"dmgMax": 26,
"dmgPerLvl": 6,
"resist": 118,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 100,
"subTypeId": 4,
"classId": 271,
"act": 1,
"difficulty": 3,
"seller": 150,
"hireCost": 12500,
"level": 67,
"expPerLvl": 120,
"hp": 779,
"hpPerLvl": 30,
"defense": 644,
"defPerLvl": 22,
"str": 110,
"strPerLvl": 10,
"dex": 163,
"dexPerLvl": 16,
"ar": 998,
"arPerLvl": 36,
"dmgMin": 23,
"dmgMax": 25,
"dmgPerLvl": 6,
"resist": 115,
"resistPerLvl": 5,
"hireDesc": 1,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
7
]
},
{
"version": 100,
"subTypeId": 5,
"classId": 271,
"act": 1,
"difficulty": 3,
"seller": 150,
"hireCost": 14000,
"level": 67,
"expPerLvl": 125,
"hp": 779,
"hpPerLvl": 30,
"defense": 644,
"defPerLvl": 22,
"str": 110,
"strPerLvl": 10,
"dex": 163,
"dexPerLvl": 16,
"ar": 998,
"arPerLvl": 36,
"dmgMin": 23,
"dmgMax": 25,
"dmgPerLvl": 6,
"resist": 115,
"resistPerLvl": 5,
"hireDesc": 2,
"nameFirstKey": "merc01",
"nameLastKey": "merc41",
"wNameFirstId": 3411,
"wNameLastId": 3451,
"skills": [
8,
11
]
},
{
"version": 0,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 10,
"defense": 45,
"defPerLvl": 9,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 10,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 0,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 31,
"expPerLvl": 110,
"hp": 340,
"hpPerLvl": 20,
"defense": 243,
"defPerLvl": 16,
"str": 96,
"strPerLvl": 14,
"dex": 73,
"dexPerLvl": 12,
"ar": 240,
"arPerLvl": 20,
"dmgMin": 18,
"dmgMax": 25,
"dmgPerLvl": 6,
"resist": 62,
"resistPerLvl": 7,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 0,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 55,
"expPerLvl": 110,
"hp": 820,
"hpPerLvl": 35,
"defense": 627,
"defPerLvl": 24,
"str": 138,
"strPerLvl": 14,
"dex": 109,
"dexPerLvl": 12,
"ar": 720,
"arPerLvl": 30,
"dmgMin": 36,
"dmgMax": 43,
"dmgPerLvl": 8,
"resist": 104,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 0,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 10,
"defense": 45,
"defPerLvl": 9,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 10,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 0,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 31,
"expPerLvl": 110,
"hp": 340,
"hpPerLvl": 20,
"defense": 243,
"defPerLvl": 16,
"str": 96,
"strPerLvl": 14,
"dex": 73,
"dexPerLvl": 12,
"ar": 240,
"arPerLvl": 20,
"dmgMin": 18,
"dmgMax": 25,
"dmgPerLvl": 6,
"resist": 62,
"resistPerLvl": 7,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 0,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 55,
"expPerLvl": 110,
"hp": 820,
"hpPerLvl": 35,
"defense": 627,
"defPerLvl": 24,
"str": 138,
"strPerLvl": 14,
"dex": 109,
"dexPerLvl": 12,
"ar": 720,
"arPerLvl": 30,
"dmgMin": 36,
"dmgMax": 43,
"dmgPerLvl": 8,
"resist": 104,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 0,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 10,
"defense": 45,
"defPerLvl": 9,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 10,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 0,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 31,
"expPerLvl": 110,
"hp": 340,
"hpPerLvl": 20,
"defense": 243,
"defPerLvl": 16,
"str": 96,
"strPerLvl": 14,
"dex": 73,
"dexPerLvl": 12,
"ar": 240,
"arPerLvl": 20,
"dmgMin": 18,
"dmgMax": 25,
"dmgPerLvl": 6,
"resist": 62,
"resistPerLvl": 7,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 0,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 55,
"expPerLvl": 110,
"hp": 820,
"hpPerLvl": 35,
"defense": 627,
"defPerLvl": 24,
"str": 138,
"strPerLvl": 14,
"dex": 109,
"dexPerLvl": 12,
"ar": 720,
"arPerLvl": 30,
"dmgMin": 36,
"dmgMax": 43,
"dmgPerLvl": 8,
"resist": 104,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 0,
"subTypeId": 9,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 31,
"expPerLvl": 120,
"hp": 306,
"hpPerLvl": 20,
"defense": 219,
"defPerLvl": 16,
"str": 92,
"strPerLvl": 14,
"dex": 69,
"dexPerLvl": 12,
"ar": 216,
"arPerLvl": 20,
"dmgMin": 16,
"dmgMax": 23,
"dmgPerLvl": 6,
"resist": 59,
"resistPerLvl": 7,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
103
]
},
{
"version": 0,
"subTypeId": 9,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 55,
"expPerLvl": 120,
"hp": 786,
"hpPerLvl": 35,
"defense": 603,
"defPerLvl": 24,
"str": 134,
"strPerLvl": 14,
"dex": 105,
"dexPerLvl": 12,
"ar": 696,
"arPerLvl": 30,
"dmgMin": 34,
"dmgMax": 41,
"dmgPerLvl": 8,
"resist": 101,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
103
]
},
{
"version": 0,
"subTypeId": 10,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 31,
"expPerLvl": 120,
"hp": 306,
"hpPerLvl": 20,
"defense": 219,
"defPerLvl": 16,
"str": 92,
"strPerLvl": 14,
"dex": 69,
"dexPerLvl": 12,
"ar": 216,
"arPerLvl": 20,
"dmgMin": 16,
"dmgMax": 23,
"dmgPerLvl": 6,
"resist": 59,
"resistPerLvl": 7,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
114
]
},
{
"version": 0,
"subTypeId": 10,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 55,
"expPerLvl": 120,
"hp": 786,
"hpPerLvl": 35,
"defense": 603,
"defPerLvl": 24,
"str": 134,
"strPerLvl": 14,
"dex": 105,
"dexPerLvl": 12,
"ar": 696,
"arPerLvl": 30,
"dmgMin": 34,
"dmgMax": 41,
"dmgPerLvl": 8,
"resist": 101,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
114
]
},
{
"version": 0,
"subTypeId": 11,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 31,
"expPerLvl": 120,
"hp": 306,
"hpPerLvl": 20,
"defense": 219,
"defPerLvl": 16,
"str": 92,
"strPerLvl": 14,
"dex": 69,
"dexPerLvl": 12,
"ar": 216,
"arPerLvl": 20,
"dmgMin": 16,
"dmgMax": 23,
"dmgPerLvl": 6,
"resist": 59,
"resistPerLvl": 7,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
98
]
},
{
"version": 0,
"subTypeId": 11,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 55,
"expPerLvl": 120,
"hp": 786,
"hpPerLvl": 35,
"defense": 603,
"defPerLvl": 24,
"str": 134,
"strPerLvl": 14,
"dex": 105,
"dexPerLvl": 12,
"ar": 696,
"arPerLvl": 30,
"dmgMin": 34,
"dmgMax": 41,
"dmgPerLvl": 8,
"resist": 101,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
98
]
},
{
"version": 0,
"subTypeId": 12,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 55,
"expPerLvl": 130,
"hp": 707,
"hpPerLvl": 35,
"defense": 543,
"defPerLvl": 24,
"str": 130,
"strPerLvl": 14,
"dex": 101,
"dexPerLvl": 12,
"ar": 626,
"arPerLvl": 30,
"dmgMin": 32,
"dmgMax": 39,
"dmgPerLvl": 8,
"resist": 98,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 0,
"subTypeId": 13,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 55,
"expPerLvl": 130,
"hp": 707,
"hpPerLvl": 35,
"defense": 543,
"defPerLvl": 24,
"str": 130,
"strPerLvl": 14,
"dex": 101,
"dexPerLvl": 12,
"ar": 626,
"arPerLvl": 30,
"dmgMin": 32,
"dmgMax": 39,
"dmgPerLvl": 8,
"resist": 98,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 0,
"subTypeId": 14,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 55,
"expPerLvl": 130,
"hp": 707,
"hpPerLvl": 35,
"defense": 543,
"defPerLvl": 24,
"str": 130,
"strPerLvl": 14,
"dex": 101,
"dexPerLvl": 12,
"ar": 626,
"arPerLvl": 30,
"dmgMin": 32,
"dmgMax": 39,
"dmgPerLvl": 8,
"resist": 98,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 100,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 15,
"defense": 45,
"defPerLvl": 11,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 12,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 100,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 43,
"expPerLvl": 110,
"hp": 630,
"hpPerLvl": 25,
"defense": 419,
"defPerLvl": 19,
"str": 117,
"strPerLvl": 14,
"dex": 91,
"dexPerLvl": 12,
"ar": 428,
"arPerLvl": 24,
"dmgMin": 24,
"dmgMax": 31,
"dmgPerLvl": 6,
"resist": 86,
"resistPerLvl": 7,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 100,
"subTypeId": 6,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 75,
"expPerLvl": 110,
"hp": 1430,
"hpPerLvl": 40,
"defense": 1027,
"defPerLvl": 28,
"str": 173,
"strPerLvl": 14,
"dex": 139,
"dexPerLvl": 12,
"ar": 1196,
"arPerLvl": 36,
"dmgMin": 48,
"dmgMax": 55,
"dmgPerLvl": 8,
"resist": 142,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 100,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 15,
"defense": 45,
"defPerLvl": 11,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 12,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 100,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 43,
"expPerLvl": 110,
"hp": 630,
"hpPerLvl": 25,
"defense": 419,
"defPerLvl": 19,
"str": 117,
"strPerLvl": 14,
"dex": 91,
"dexPerLvl": 12,
"ar": 428,
"arPerLvl": 24,
"dmgMin": 24,
"dmgMax": 31,
"dmgPerLvl": 6,
"resist": 86,
"resistPerLvl": 7,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 100,
"subTypeId": 7,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 75,
"expPerLvl": 110,
"hp": 1430,
"hpPerLvl": 40,
"defense": 1027,
"defPerLvl": 28,
"str": 173,
"strPerLvl": 14,
"dex": 139,
"dexPerLvl": 12,
"ar": 1196,
"arPerLvl": 36,
"dmgMin": 48,
"dmgMax": 55,
"dmgPerLvl": 8,
"resist": 142,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 100,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 9,
"expPerLvl": 110,
"hp": 120,
"hpPerLvl": 15,
"defense": 45,
"defPerLvl": 11,
"str": 57,
"strPerLvl": 14,
"dex": 40,
"dexPerLvl": 12,
"ar": 20,
"arPerLvl": 12,
"dmgMin": 7,
"dmgMax": 14,
"dmgPerLvl": 4,
"resist": 18,
"resistPerLvl": 8,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 100,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 43,
"expPerLvl": 110,
"hp": 630,
"hpPerLvl": 25,
"defense": 419,
"defPerLvl": 19,
"str": 117,
"strPerLvl": 14,
"dex": 91,
"dexPerLvl": 12,
"ar": 428,
"arPerLvl": 24,
"dmgMin": 24,
"dmgMax": 31,
"dmgPerLvl": 6,
"resist": 86,
"resistPerLvl": 7,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 100,
"subTypeId": 8,
"classId": 338,
"act": 2,
"difficulty": 1,
"seller": 198,
"hireCost": 350,
"level": 75,
"expPerLvl": 110,
"hp": 1430,
"hpPerLvl": 40,
"defense": 1027,
"defPerLvl": 28,
"str": 173,
"strPerLvl": 14,
"dex": 139,
"dexPerLvl": 12,
"ar": 1196,
"arPerLvl": 36,
"dmgMin": 48,
"dmgMax": 55,
"dmgPerLvl": 8,
"resist": 142,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 100,
"subTypeId": 9,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 43,
"expPerLvl": 120,
"hp": 567,
"hpPerLvl": 25,
"defense": 377,
"defPerLvl": 19,
"str": 113,
"strPerLvl": 14,
"dex": 87,
"dexPerLvl": 12,
"ar": 385,
"arPerLvl": 24,
"dmgMin": 22,
"dmgMax": 29,
"dmgPerLvl": 6,
"resist": 83,
"resistPerLvl": 7,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
103
]
},
{
"version": 100,
"subTypeId": 9,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 75,
"expPerLvl": 120,
"hp": 1367,
"hpPerLvl": 40,
"defense": 985,
"defPerLvl": 28,
"str": 169,
"strPerLvl": 14,
"dex": 135,
"dexPerLvl": 12,
"ar": 1153,
"arPerLvl": 36,
"dmgMin": 46,
"dmgMax": 53,
"dmgPerLvl": 8,
"resist": 139,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
103
]
},
{
"version": 100,
"subTypeId": 10,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 43,
"expPerLvl": 120,
"hp": 567,
"hpPerLvl": 25,
"defense": 377,
"defPerLvl": 19,
"str": 113,
"strPerLvl": 14,
"dex": 87,
"dexPerLvl": 12,
"ar": 385,
"arPerLvl": 24,
"dmgMin": 22,
"dmgMax": 29,
"dmgPerLvl": 6,
"resist": 83,
"resistPerLvl": 7,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
114
]
},
{
"version": 100,
"subTypeId": 10,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 75,
"expPerLvl": 120,
"hp": 1367,
"hpPerLvl": 40,
"defense": 985,
"defPerLvl": 28,
"str": 169,
"strPerLvl": 14,
"dex": 135,
"dexPerLvl": 12,
"ar": 1153,
"arPerLvl": 36,
"dmgMin": 46,
"dmgMax": 53,
"dmgPerLvl": 8,
"resist": 139,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
114
]
},
{
"version": 100,
"subTypeId": 11,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 43,
"expPerLvl": 120,
"hp": 567,
"hpPerLvl": 25,
"defense": 377,
"defPerLvl": 19,
"str": 113,
"strPerLvl": 14,
"dex": 87,
"dexPerLvl": 12,
"ar": 385,
"arPerLvl": 24,
"dmgMin": 22,
"dmgMax": 29,
"dmgPerLvl": 6,
"resist": 83,
"resistPerLvl": 7,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
98
]
},
{
"version": 100,
"subTypeId": 11,
"classId": 338,
"act": 2,
"difficulty": 2,
"seller": 198,
"hireCost": 7900,
"level": 75,
"expPerLvl": 120,
"hp": 1367,
"hpPerLvl": 40,
"defense": 985,
"defPerLvl": 28,
"str": 169,
"strPerLvl": 14,
"dex": 135,
"dexPerLvl": 12,
"ar": 1153,
"arPerLvl": 36,
"dmgMin": 46,
"dmgMax": 53,
"dmgPerLvl": 8,
"resist": 139,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
98
]
},
{
"version": 100,
"subTypeId": 12,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 75,
"expPerLvl": 130,
"hp": 1230,
"hpPerLvl": 40,
"defense": 887,
"defPerLvl": 28,
"str": 165,
"strPerLvl": 14,
"dex": 131,
"dexPerLvl": 12,
"ar": 1038,
"arPerLvl": 36,
"dmgMin": 44,
"dmgMax": 51,
"dmgPerLvl": 8,
"resist": 136,
"resistPerLvl": 4,
"hireDesc": 3,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
99
]
},
{
"version": 100,
"subTypeId": 13,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 75,
"expPerLvl": 130,
"hp": 1230,
"hpPerLvl": 40,
"defense": 887,
"defPerLvl": 28,
"str": 165,
"strPerLvl": 14,
"dex": 131,
"dexPerLvl": 12,
"ar": 1038,
"arPerLvl": 36,
"dmgMin": 44,
"dmgMax": 51,
"dmgPerLvl": 8,
"resist": 136,
"resistPerLvl": 4,
"hireDesc": 4,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
104
]
},
{
"version": 100,
"subTypeId": 14,
"classId": 338,
"act": 2,
"difficulty": 3,
"seller": 198,
"hireCost": 15000,
"level": 75,
"expPerLvl": 130,
"hp": 1230,
"hpPerLvl": 40,
"defense": 887,
"defPerLvl": 28,
"str": 165,
"strPerLvl": 14,
"dex": 131,
"dexPerLvl": 12,
"ar": 1038,
"arPerLvl": 36,
"dmgMin": 44,
"dmgMax": 51,
"dmgPerLvl": 8,
"resist": 136,
"resistPerLvl": 4,
"hireDesc": 5,
"nameFirstKey": "merca201",
"nameLastKey": "merca221",
"wNameFirstId": 1019,
"wNameLastId": 1039,
"skills": [
10,
108
]
},
{
"version": 0,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 15,
"expPerLvl": 110,
"hp": 160,
"hpPerLvl": 8,
"defense": 80,
"defPerLvl": 4,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 10,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 37,
"expPerLvl": 110,
"hp": 336,
"hpPerLvl": 14,
"defense": 168,
"defPerLvl": 10,
"str": 77,
"strPerLvl": 10,
"dex": 62,
"dexPerLvl": 8,
"ar": 235,
"arPerLvl": 20,
"dmgMin": 12,
"dmgMax": 18,
"dmgPerLvl": 4,
"resist": 64,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 61,
"expPerLvl": 110,
"hp": 672,
"hpPerLvl": 20,
"defense": 408,
"defPerLvl": 18,
"str": 107,
"strPerLvl": 10,
"dex": 86,
"dexPerLvl": 8,
"ar": 715,
"arPerLvl": 30,
"dmgMin": 24,
"dmgMax": 30,
"dmgPerLvl": 4,
"resist": 106,
"resistPerLvl": 6,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 15,
"expPerLvl": 120,
"hp": 160,
"hpPerLvl": 8,
"defense": 80,
"defPerLvl": 4,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 10,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 37,
"expPerLvl": 120,
"hp": 336,
"hpPerLvl": 14,
"defense": 168,
"defPerLvl": 10,
"str": 77,
"strPerLvl": 10,
"dex": 62,
"dexPerLvl": 8,
"ar": 235,
"arPerLvl": 20,
"dmgMin": 12,
"dmgMax": 18,
"dmgPerLvl": 4,
"resist": 64,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 61,
"expPerLvl": 120,
"hp": 672,
"hpPerLvl": 20,
"defense": 408,
"defPerLvl": 16,
"str": 107,
"strPerLvl": 10,
"dex": 86,
"dexPerLvl": 8,
"ar": 715,
"arPerLvl": 30,
"dmgMin": 24,
"dmgMax": 30,
"dmgPerLvl": 4,
"resist": 106,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 15,
"expPerLvl": 110,
"hp": 160,
"hpPerLvl": 8,
"defense": 80,
"defPerLvl": 4,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 10,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 37,
"expPerLvl": 110,
"hp": 336,
"hpPerLvl": 14,
"defense": 168,
"defPerLvl": 10,
"str": 77,
"strPerLvl": 10,
"dex": 62,
"dexPerLvl": 8,
"ar": 235,
"arPerLvl": 20,
"dmgMin": 12,
"dmgMax": 18,
"dmgPerLvl": 4,
"resist": 64,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 61,
"expPerLvl": 110,
"hp": 672,
"hpPerLvl": 20,
"defense": 408,
"defPerLvl": 16,
"str": 107,
"strPerLvl": 10,
"dex": 86,
"dexPerLvl": 8,
"ar": 715,
"arPerLvl": 30,
"dmgMin": 24,
"dmgMax": 30,
"dmgPerLvl": 4,
"resist": 106,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 18,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 9500,
"level": 37,
"expPerLvl": 120,
"hp": 302,
"hpPerLvl": 14,
"defense": 151,
"defPerLvl": 10,
"str": 73,
"strPerLvl": 10,
"dex": 58,
"dexPerLvl": 8,
"ar": 212,
"arPerLvl": 20,
"dmgMin": 10,
"dmgMax": 16,
"dmgPerLvl": 4,
"resist": 61,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 18,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 9500,
"level": 61,
"expPerLvl": 120,
"hp": 638,
"hpPerLvl": 20,
"defense": 391,
"defPerLvl": 16,
"str": 103,
"strPerLvl": 10,
"dex": 82,
"dexPerLvl": 8,
"ar": 692,
"arPerLvl": 30,
"dmgMin": 22,
"dmgMax": 28,
"dmgPerLvl": 4,
"resist": 103,
"resistPerLvl": 4,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 19,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 12000,
"level": 37,
"expPerLvl": 130,
"hp": 302,
"hpPerLvl": 14,
"defense": 151,
"defPerLvl": 10,
"str": 73,
"strPerLvl": 10,
"dex": 58,
"dexPerLvl": 8,
"ar": 212,
"arPerLvl": 20,
"dmgMin": 10,
"dmgMax": 16,
"dmgPerLvl": 4,
"resist": 61,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 19,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 12000,
"level": 61,
"expPerLvl": 130,
"hp": 638,
"hpPerLvl": 20,
"defense": 391,
"defPerLvl": 16,
"str": 103,
"strPerLvl": 10,
"dex": 82,
"dexPerLvl": 8,
"ar": 692,
"arPerLvl": 30,
"dmgMin": 22,
"dmgMax": 28,
"dmgPerLvl": 4,
"resist": 103,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 20,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 10000,
"level": 37,
"expPerLvl": 120,
"hp": 302,
"hpPerLvl": 14,
"defense": 151,
"defPerLvl": 10,
"str": 73,
"strPerLvl": 10,
"dex": 58,
"dexPerLvl": 8,
"ar": 212,
"arPerLvl": 20,
"dmgMin": 10,
"dmgMax": 16,
"dmgPerLvl": 4,
"resist": 61,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 20,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 10000,
"level": 61,
"expPerLvl": 120,
"hp": 638,
"hpPerLvl": 20,
"defense": 391,
"defPerLvl": 16,
"str": 103,
"strPerLvl": 10,
"dex": 82,
"dexPerLvl": 8,
"ar": 692,
"arPerLvl": 30,
"dmgMin": 22,
"dmgMax": 28,
"dmgPerLvl": 4,
"resist": 103,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 21,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 21000,
"level": 61,
"expPerLvl": 130,
"hp": 574,
"hpPerLvl": 20,
"defense": 352,
"defPerLvl": 16,
"str": 99,
"strPerLvl": 10,
"dex": 78,
"dexPerLvl": 8,
"ar": 623,
"arPerLvl": 30,
"dmgMin": 20,
"dmgMax": 26,
"dmgPerLvl": 4,
"resist": 100,
"resistPerLvl": 4,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 0,
"subTypeId": 22,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 27000,
"level": 61,
"expPerLvl": 140,
"hp": 574,
"hpPerLvl": 20,
"defense": 352,
"defPerLvl": 16,
"str": 99,
"strPerLvl": 10,
"dex": 78,
"dexPerLvl": 8,
"ar": 623,
"arPerLvl": 30,
"dmgMin": 20,
"dmgMax": 26,
"dmgPerLvl": 4,
"resist": 100,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 0,
"subTypeId": 23,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 21000,
"level": 61,
"expPerLvl": 130,
"hp": 574,
"hpPerLvl": 20,
"defense": 352,
"defPerLvl": 16,
"str": 99,
"strPerLvl": 10,
"dex": 78,
"dexPerLvl": 8,
"ar": 623,
"arPerLvl": 30,
"dmgMin": 20,
"dmgMax": 27,
"dmgPerLvl": 4,
"resist": 100,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 15,
"expPerLvl": 110,
"hp": 160,
"hpPerLvl": 9,
"defense": 80,
"defPerLvl": 5,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 12,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 49,
"expPerLvl": 110,
"hp": 466,
"hpPerLvl": 18,
"defense": 250,
"defPerLvl": 13,
"str": 92,
"strPerLvl": 10,
"dex": 74,
"dexPerLvl": 8,
"ar": 423,
"arPerLvl": 24,
"dmgMin": 18,
"dmgMax": 24,
"dmgPerLvl": 4,
"resist": 85,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 15,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 79,
"expPerLvl": 110,
"hp": 1006,
"hpPerLvl": 27,
"defense": 640,
"defPerLvl": 25,
"str": 130,
"strPerLvl": 10,
"dex": 104,
"dexPerLvl": 8,
"ar": 1143,
"arPerLvl": 36,
"dmgMin": 33,
"dmgMax": 39,
"dmgPerLvl": 4,
"resist": 138,
"resistPerLvl": 6,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 15,
"expPerLvl": 120,
"hp": 160,
"hpPerLvl": 9,
"defense": 80,
"defPerLvl": 5,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 12,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 49,
"expPerLvl": 120,
"hp": 466,
"hpPerLvl": 18,
"defense": 250,
"defPerLvl": 13,
"str": 92,
"strPerLvl": 10,
"dex": 74,
"dexPerLvl": 8,
"ar": 423,
"arPerLvl": 24,
"dmgMin": 18,
"dmgMax": 24,
"dmgPerLvl": 4,
"resist": 85,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 16,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1500,
"level": 79,
"expPerLvl": 120,
"hp": 1006,
"hpPerLvl": 27,
"defense": 640,
"defPerLvl": 25,
"str": 130,
"strPerLvl": 10,
"dex": 104,
"dexPerLvl": 8,
"ar": 1143,
"arPerLvl": 36,
"dmgMin": 33,
"dmgMax": 39,
"dmgPerLvl": 4,
"resist": 138,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 15,
"expPerLvl": 110,
"hp": 160,
"hpPerLvl": 9,
"defense": 80,
"defPerLvl": 5,
"str": 49,
"strPerLvl": 10,
"dex": 40,
"dexPerLvl": 8,
"ar": 15,
"arPerLvl": 12,
"dmgMin": 1,
"dmgMax": 7,
"dmgPerLvl": 4,
"resist": 25,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 49,
"expPerLvl": 110,
"hp": 466,
"hpPerLvl": 18,
"defense": 250,
"defPerLvl": 13,
"str": 92,
"strPerLvl": 10,
"dex": 74,
"dexPerLvl": 8,
"ar": 423,
"arPerLvl": 24,
"dmgMin": 18,
"dmgMax": 24,
"dmgPerLvl": 4,
"resist": 85,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 17,
"classId": 359,
"act": 3,
"difficulty": 1,
"seller": 252,
"hireCost": 1000,
"level": 79,
"expPerLvl": 110,
"hp": 1006,
"hpPerLvl": 27,
"defense": 640,
"defPerLvl": 25,
"str": 130,
"strPerLvl": 10,
"dex": 104,
"dexPerLvl": 8,
"ar": 1143,
"arPerLvl": 36,
"dmgMin": 33,
"dmgMax": 39,
"dmgPerLvl": 4,
"resist": 138,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 18,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 9500,
"level": 49,
"expPerLvl": 120,
"hp": 419,
"hpPerLvl": 18,
"defense": 225,
"defPerLvl": 13,
"str": 88,
"strPerLvl": 10,
"dex": 70,
"dexPerLvl": 8,
"ar": 381,
"arPerLvl": 24,
"dmgMin": 16,
"dmgMax": 22,
"dmgPerLvl": 4,
"resist": 82,
"resistPerLvl": 7,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 18,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 9500,
"level": 79,
"expPerLvl": 120,
"hp": 959,
"hpPerLvl": 27,
"defense": 615,
"defPerLvl": 25,
"str": 126,
"strPerLvl": 10,
"dex": 100,
"dexPerLvl": 8,
"ar": 1101,
"arPerLvl": 36,
"dmgMin": 31,
"dmgMax": 37,
"dmgPerLvl": 4,
"resist": 135,
"resistPerLvl": 4,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 19,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 12000,
"level": 49,
"expPerLvl": 130,
"hp": 419,
"hpPerLvl": 18,
"defense": 225,
"defPerLvl": 13,
"str": 88,
"strPerLvl": 10,
"dex": 70,
"dexPerLvl": 8,
"ar": 381,
"arPerLvl": 24,
"dmgMin": 16,
"dmgMax": 22,
"dmgPerLvl": 4,
"resist": 82,
"resistPerLvl": 7,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 19,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 12000,
"level": 79,
"expPerLvl": 130,
"hp": 959,
"hpPerLvl": 27,
"defense": 615,
"defPerLvl": 25,
"str": 126,
"strPerLvl": 10,
"dex": 100,
"dexPerLvl": 8,
"ar": 1101,
"arPerLvl": 36,
"dmgMin": 31,
"dmgMax": 37,
"dmgPerLvl": 4,
"resist": 135,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 20,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 10000,
"level": 49,
"expPerLvl": 120,
"hp": 419,
"hpPerLvl": 18,
"defense": 225,
"defPerLvl": 13,
"str": 88,
"strPerLvl": 10,
"dex": 70,
"dexPerLvl": 8,
"ar": 381,
"arPerLvl": 24,
"dmgMin": 16,
"dmgMax": 22,
"dmgPerLvl": 4,
"resist": 82,
"resistPerLvl": 7,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 20,
"classId": 359,
"act": 3,
"difficulty": 2,
"seller": 252,
"hireCost": 10000,
"level": 79,
"expPerLvl": 120,
"hp": 959,
"hpPerLvl": 27,
"defense": 615,
"defPerLvl": 25,
"str": 126,
"strPerLvl": 10,
"dex": 100,
"dexPerLvl": 8,
"ar": 1101,
"arPerLvl": 36,
"dmgMin": 31,
"dmgMax": 37,
"dmgPerLvl": 4,
"resist": 135,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 100,
"subTypeId": 21,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 21000,
"level": 79,
"expPerLvl": 130,
"hp": 863,
"hpPerLvl": 27,
"defense": 554,
"defPerLvl": 25,
"str": 122,
"strPerLvl": 10,
"dex": 96,
"dexPerLvl": 8,
"ar": 991,
"arPerLvl": 36,
"dmgMin": 29,
"dmgMax": 35,
"dmgPerLvl": 4,
"resist": 132,
"resistPerLvl": 4,
"hireDesc": 6,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
41,
47
]
},
{
"version": 100,
"subTypeId": 22,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 27000,
"level": 79,
"expPerLvl": 140,
"hp": 863,
"hpPerLvl": 27,
"defense": 554,
"defPerLvl": 25,
"str": 122,
"strPerLvl": 10,
"dex": 96,
"dexPerLvl": 8,
"ar": 991,
"arPerLvl": 36,
"dmgMin": 29,
"dmgMax": 35,
"dmgPerLvl": 4,
"resist": 132,
"resistPerLvl": 4,
"hireDesc": 7,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
55,
40,
45
]
},
{
"version": 100,
"subTypeId": 23,
"classId": 359,
"act": 3,
"difficulty": 3,
"seller": 252,
"hireCost": 21000,
"level": 79,
"expPerLvl": 130,
"hp": 863,
"hpPerLvl": 27,
"defense": 554,
"defPerLvl": 25,
"str": 122,
"strPerLvl": 10,
"dex": 96,
"dexPerLvl": 8,
"ar": 991,
"arPerLvl": 36,
"dmgMin": 29,
"dmgMax": 36,
"dmgPerLvl": 4,
"resist": 132,
"resistPerLvl": 4,
"hireDesc": 8,
"nameFirstKey": "merca222",
"nameLastKey": "merca241",
"wNameFirstId": 1040,
"wNameLastId": 1059,
"skills": [
38,
49
]
},
{
"version": 0,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 28,
"expPerLvl": 120,
"hp": 288,
"hpPerLvl": 14,
"defense": 180,
"defPerLvl": 7,
"str": 101,
"strPerLvl": 15,
"dex": 63,
"dexPerLvl": 10,
"ar": 150,
"arPerLvl": 17,
"dmgMin": 16,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 56,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 42,
"expPerLvl": 120,
"hp": 484,
"hpPerLvl": 21,
"defense": 278,
"defPerLvl": 20,
"str": 128,
"strPerLvl": 15,
"dex": 81,
"dexPerLvl": 10,
"ar": 388,
"arPerLvl": 27,
"dmgMin": 27,
"dmgMax": 31,
"dmgPerLvl": 8,
"resist": 81,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 75,
"expPerLvl": 120,
"hp": 1177,
"hpPerLvl": 35,
"defense": 938,
"defPerLvl": 40,
"str": 190,
"strPerLvl": 15,
"dex": 123,
"dexPerLvl": 10,
"ar": 1279,
"arPerLvl": 37,
"dmgMin": 60,
"dmgMax": 64,
"dmgPerLvl": 8,
"resist": 139,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 28,
"expPerLvl": 120,
"hp": 288,
"hpPerLvl": 14,
"defense": 180,
"defPerLvl": 7,
"str": 101,
"strPerLvl": 15,
"dex": 63,
"dexPerLvl": 10,
"ar": 150,
"arPerLvl": 17,
"dmgMin": 16,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 56,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 42,
"expPerLvl": 120,
"hp": 484,
"hpPerLvl": 21,
"defense": 278,
"defPerLvl": 20,
"str": 128,
"strPerLvl": 15,
"dex": 81,
"dexPerLvl": 10,
"ar": 388,
"arPerLvl": 27,
"dmgMin": 27,
"dmgMax": 31,
"dmgPerLvl": 8,
"resist": 81,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 75,
"expPerLvl": 120,
"hp": 1177,
"hpPerLvl": 35,
"defense": 938,
"defPerLvl": 40,
"str": 190,
"strPerLvl": 15,
"dex": 123,
"dexPerLvl": 10,
"ar": 1279,
"arPerLvl": 37,
"dmgMin": 60,
"dmgMax": 64,
"dmgPerLvl": 8,
"resist": 139,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 26,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 42,
"expPerLvl": 130,
"hp": 436,
"hpPerLvl": 21,
"defense": 250,
"defPerLvl": 20,
"str": 125,
"strPerLvl": 15,
"dex": 76,
"dexPerLvl": 10,
"ar": 349,
"arPerLvl": 27,
"dmgMin": 25,
"dmgMax": 29,
"dmgPerLvl": 8,
"resist": 78,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 26,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 75,
"expPerLvl": 130,
"hp": 1129,
"hpPerLvl": 35,
"defense": 910,
"defPerLvl": 40,
"str": 187,
"strPerLvl": 15,
"dex": 118,
"dexPerLvl": 10,
"ar": 1240,
"arPerLvl": 37,
"dmgMin": 58,
"dmgMax": 62,
"dmgPerLvl": 8,
"resist": 136,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 27,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 42,
"expPerLvl": 130,
"hp": 436,
"hpPerLvl": 21,
"defense": 250,
"defPerLvl": 20,
"str": 125,
"strPerLvl": 15,
"dex": 76,
"dexPerLvl": 10,
"ar": 349,
"arPerLvl": 27,
"dmgMin": 25,
"dmgMax": 29,
"dmgPerLvl": 8,
"resist": 78,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 27,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 75,
"expPerLvl": 130,
"hp": 1129,
"hpPerLvl": 35,
"defense": 910,
"defPerLvl": 40,
"str": 187,
"strPerLvl": 15,
"dex": 118,
"dexPerLvl": 10,
"ar": 1240,
"arPerLvl": 37,
"dmgMin": 58,
"dmgMax": 62,
"dmgPerLvl": 8,
"resist": 136,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 28,
"classId": 561,
"act": 5,
"difficulty": 3,
"seller": 515,
"hireCost": 32000,
"level": 75,
"expPerLvl": 140,
"hp": 1016,
"hpPerLvl": 35,
"defense": 819,
"defPerLvl": 40,
"str": 184,
"strPerLvl": 15,
"dex": 113,
"dexPerLvl": 10,
"ar": 1116,
"arPerLvl": 37,
"dmgMin": 56,
"dmgMax": 60,
"dmgPerLvl": 8,
"resist": 133,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 0,
"subTypeId": 29,
"classId": 561,
"act": 5,
"difficulty": 3,
"seller": 515,
"hireCost": 32000,
"level": 75,
"expPerLvl": 140,
"hp": 1016,
"hpPerLvl": 35,
"defense": 819,
"defPerLvl": 40,
"str": 184,
"strPerLvl": 15,
"dex": 113,
"dexPerLvl": 10,
"ar": 1116,
"arPerLvl": 37,
"dmgMin": 56,
"dmgMax": 60,
"dmgPerLvl": 8,
"resist": 133,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 28,
"expPerLvl": 120,
"hp": 288,
"hpPerLvl": 18,
"defense": 180,
"defPerLvl": 10,
"str": 101,
"strPerLvl": 15,
"dex": 63,
"dexPerLvl": 10,
"ar": 150,
"arPerLvl": 20,
"dmgMin": 16,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 56,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 58,
"expPerLvl": 120,
"hp": 828,
"hpPerLvl": 27,
"defense": 480,
"defPerLvl": 35,
"str": 158,
"strPerLvl": 15,
"dex": 101,
"dexPerLvl": 10,
"ar": 750,
"arPerLvl": 35,
"dmgMin": 39,
"dmgMax": 43,
"dmgPerLvl": 8,
"resist": 109,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 24,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 80,
"expPerLvl": 120,
"hp": 1422,
"hpPerLvl": 45,
"defense": 1250,
"defPerLvl": 50,
"str": 200,
"strPerLvl": 15,
"dex": 129,
"dexPerLvl": 10,
"ar": 1520,
"arPerLvl": 45,
"dmgMin": 61,
"dmgMax": 65,
"dmgPerLvl": 8,
"resist": 148,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 28,
"expPerLvl": 120,
"hp": 288,
"hpPerLvl": 18,
"defense": 180,
"defPerLvl": 10,
"str": 101,
"strPerLvl": 15,
"dex": 63,
"dexPerLvl": 10,
"ar": 150,
"arPerLvl": 20,
"dmgMin": 16,
"dmgMax": 20,
"dmgPerLvl": 6,
"resist": 56,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 58,
"expPerLvl": 120,
"hp": 828,
"hpPerLvl": 27,
"defense": 480,
"defPerLvl": 35,
"str": 158,
"strPerLvl": 15,
"dex": 101,
"dexPerLvl": 10,
"ar": 750,
"arPerLvl": 35,
"dmgMin": 39,
"dmgMax": 43,
"dmgPerLvl": 8,
"resist": 109,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 25,
"classId": 561,
"act": 5,
"difficulty": 1,
"seller": 515,
"hireCost": 9000,
"level": 80,
"expPerLvl": 120,
"hp": 1422,
"hpPerLvl": 45,
"defense": 1250,
"defPerLvl": 50,
"str": 200,
"strPerLvl": 15,
"dex": 129,
"dexPerLvl": 10,
"ar": 1520,
"arPerLvl": 45,
"dmgMin": 61,
"dmgMax": 65,
"dmgPerLvl": 8,
"resist": 148,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 26,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 58,
"expPerLvl": 130,
"hp": 745,
"hpPerLvl": 27,
"defense": 432,
"defPerLvl": 35,
"str": 155,
"strPerLvl": 15,
"dex": 96,
"dexPerLvl": 10,
"ar": 675,
"arPerLvl": 35,
"dmgMin": 37,
"dmgMax": 41,
"dmgPerLvl": 8,
"resist": 106,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 26,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 80,
"expPerLvl": 130,
"hp": 1339,
"hpPerLvl": 45,
"defense": 1202,
"defPerLvl": 50,
"str": 197,
"strPerLvl": 15,
"dex": 124,
"dexPerLvl": 10,
"ar": 1445,
"arPerLvl": 45,
"dmgMin": 59,
"dmgMax": 63,
"dmgPerLvl": 8,
"resist": 145,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 27,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 58,
"expPerLvl": 130,
"hp": 745,
"hpPerLvl": 27,
"defense": 432,
"defPerLvl": 35,
"str": 155,
"strPerLvl": 15,
"dex": 96,
"dexPerLvl": 10,
"ar": 675,
"arPerLvl": 35,
"dmgMin": 37,
"dmgMax": 41,
"dmgPerLvl": 8,
"resist": 106,
"resistPerLvl": 7,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 27,
"classId": 561,
"act": 5,
"difficulty": 2,
"seller": 515,
"hireCost": 18000,
"level": 80,
"expPerLvl": 130,
"hp": 1339,
"hpPerLvl": 45,
"defense": 1202,
"defPerLvl": 50,
"str": 197,
"strPerLvl": 15,
"dex": 124,
"dexPerLvl": 10,
"ar": 1445,
"arPerLvl": 45,
"dmgMin": 59,
"dmgMax": 63,
"dmgPerLvl": 8,
"resist": 145,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 28,
"classId": 561,
"act": 5,
"difficulty": 3,
"seller": 515,
"hireCost": 32000,
"level": 80,
"expPerLvl": 140,
"hp": 1205,
"hpPerLvl": 45,
"defense": 1082,
"defPerLvl": 50,
"str": 194,
"strPerLvl": 15,
"dex": 119,
"dexPerLvl": 10,
"ar": 1301,
"arPerLvl": 45,
"dmgMin": 57,
"dmgMax": 61,
"dmgPerLvl": 8,
"resist": 142,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
},
{
"version": 100,
"subTypeId": 29,
"classId": 561,
"act": 5,
"difficulty": 3,
"seller": 515,
"hireCost": 32000,
"level": 80,
"expPerLvl": 140,
"hp": 1205,
"hpPerLvl": 45,
"defense": 1082,
"defPerLvl": 50,
"str": 194,
"strPerLvl": 15,
"dex": 119,
"dexPerLvl": 10,
"ar": 1301,
"arPerLvl": 45,
"dmgMin": 57,
"dmgMax": 61,
"dmgPerLvl": 8,
"resist": 142,
"resistPerLvl": 4,
"hireDesc": 0,
"nameFirstKey": "MercX101",
"nameLastKey": "MercX167",
"wNameFirstId": 10835,
"wNameLastId": 10901,
"skills": [
126,
139
]
}
]
export interface HirelingCandidateDesc {
readonly mercId: number
readonly nameId: number
readonly seed: number
readonly actIndex: number
readonly classId: number
readonly subTypeId: number
readonly name: string
readonly level: number
readonly hp: number
readonly defense: number
readonly strength: number
readonly dexterity: number
readonly cost: number
readonly resist: number
readonly hireDescId: number
readonly hireDesc: string
readonly skills: readonly number[]
readonly line1: string
readonly line2: string
}
/**
* Maps a mercenary name ID to their act index (0..3) per D2Common.dll ordinal 10988 (0x6fd7c9e0).
*/
export function resolveHirelingAct(wMercName: number, expansion = true): number {
const version = expansion ? 100 : 0
for (const r of HIRELING_RECORDS) {
if (r.version === version && r.wNameFirstId <= wMercName && wMercName <= r.wNameLastId) {
return r.act - 1
}
}
// Fallbacks by known name ranges
if (wMercName >= 3411 && wMercName <= 3451) return 0
if (wMercName >= 1019 && wMercName <= 1039) return 1
if (wMercName >= 1040 && wMercName <= 1059) return 2
if (wMercName === 11021 || wMercName === 0x0421) return 2
if (wMercName >= 10835 && wMercName <= 10901) return 4
return 0
}
/**
* Resolves a mercenary name string from their TBL index per D2Client.dll 0x6faf9783.
*/
export function resolveHirelingName(wMercName: number, lang: 'ENG' | 'CHI' = 'CHI'): string {
// D2Client.dll 0x6faf978c: if wMercName == 0x0421 (1057), replace with 0x2b0d (11021 = "Jarulf")
const resolvedNameId = wMercName === 0x0421 ? 0x2b0d : wMercName
if (resolvedNameId === 0x2b0d) {
return lookupTbl('merca239', lang) ?? (lang === 'ENG' ? 'Jarulf' : '賈魯夫')
}
// Act 1 Rogue (string.tbl 3411..3444 -> merc01..merc34)
if (resolvedNameId >= 3411 && resolvedNameId <= 3451) {
const idx = resolvedNameId - 3411 + 1
const key = `merc${idx < 10 ? `0${idx}` : idx}`
return lookupTbl(key, lang) ?? (lang === 'ENG' ? `Rogue #${idx}` : `羅格 #${idx}`)
}
// Act 2 Desert Mercenary (patchstring.tbl 1019..1039 -> merca201..merca221)
if (resolvedNameId >= 1019 && resolvedNameId <= 1039) {
const idx = resolvedNameId - 1019 + 1
const key = `merca2${idx < 10 ? `0${idx}` : idx}`
return lookupTbl(key, lang) ?? (lang === 'ENG' ? `Desert Mercenary #${idx}` : `沙漠傭兵 #${idx}`)
}
// Act 3 Iron Wolf (patchstring.tbl 1040..1059 -> merca222..merca241)
if (resolvedNameId >= 1040 && resolvedNameId <= 1059) {
const idx = resolvedNameId - 1040 + 22
const key = `merca2${idx}`
return lookupTbl(key, lang) ?? (lang === 'ENG' ? `Iron Wolf #${idx}` : `鐵狼 #${idx}`)
}
// Act 5 Barbarian (patchstring.tbl 835..901 / global 10835..10901 -> MercX101..MercX167)
const barbId = resolvedNameId >= 10000 ? resolvedNameId - 10000 : resolvedNameId
if (barbId >= 835 && barbId <= 901) {
const idx = barbId - 835 + 101
const key = `MercX${idx}`
return lookupTbl(key, lang) ?? (lang === 'ENG' ? `Barbarian #${idx}` : `野蠻人 #${idx}`)
}
return lookupTbl(`merc${resolvedNameId}`, lang) ?? `Mercenary #${resolvedNameId}`
}
/**
* Resolves the hireling ability description string per D2Common.dll ordinal 10091 (0x6fd7c9c0).
*/
export function resolveHirelingDesc(hireDescId: number, lang: 'ENG' | 'CHI' = 'CHI'): string {
switch (hireDescId) {
case 1:
return lookupTbl('strhirespecial1', lang) ?? (lang === 'ENG' ? 'Fire Arrow' : '火箭')
case 2:
return lookupTbl('strhirespecial2', lang) ?? (lang === 'ENG' ? 'Cold Arrow' : '冰箭')
case 3:
return lookupTbl('PalMercEXST4X', lang) ?? (lang === 'ENG' ? 'Combat' : '戰鬥')
case 4:
return lookupTbl('PalMercExST1X', lang) ?? (lang === 'ENG' ? 'Defensive' : '防禦')
case 5:
return lookupTbl('PalMercEXST3X', lang) ?? (lang === 'ENG' ? 'Offensive' : '進攻')
case 6:
return lookupTbl('strhirespecial7', lang) ?? (lang === 'ENG' ? 'Fire' : '火')
case 7:
return lookupTbl('strhirespecial6', lang) ?? (lang === 'ENG' ? 'Cold' : '冷')
case 8:
return lookupTbl('strhirespecial5', lang) ?? (lang === 'ENG' ? 'Lightning' : '閃電')
default:
return ''
}
}
/**
* Formats a candidate into 2 lines for the scrollable list control per D2Client.dll 0x6faf9440.
*/
export function formatHirelingCandidateLines(
name: string,
level: number,
hp: number,
defense: number,
cost: number,
hireDesc: string,
lang: 'ENG' | 'CHI' = 'CHI',
): { line1: string; line2: string } {
const lvlLabel = lookupTbl('Level', lang) ?? (lang === 'ENG' ? 'Lvl' : '等級')
const lifeLabel = lookupTbl('HP', lang) ?? (lang === 'ENG' ? 'Life' : '生命')
const defLabel = lookupTbl('AC', lang) ?? (lang === 'ENG' ? 'Def' : '防禦')
const costLabel = lookupTbl('Cost', lang) ?? (lang === 'ENG' ? 'Cost' : '花費')
// Line 1: <Name> - Lvl: <lvl> Life: <hp> Def: <def> Cost: <cost>
const line1 = `${name} - ${lvlLabel}: ${level} ${lifeLabel}: ${hp} ${defLabel}: ${defense} ${costLabel}: ${cost}`
// Line 2: 2 leading spaces + HireDesc (or blank if no special ability)
const line2 = hireDesc ? ` ${hireDesc}` : ' '
return { line1, line2 }
}
/**
* Evaluates a candidate's authentic stats, level, and hire cost using Diablo II's 64-bit LCG
* per D2Common.dll ordinal 10458 (0x6fd7ccc0).
*/
export function resolveHirelingCandidate(
candidate: { readonly nameId: number; readonly seed: number },
playerLevel: number,
difficulty: number,
actIndex: number,
expansion = true,
lang: 'ENG' | 'CHI' = 'CHI',
): HirelingCandidateDesc {
const version = expansion ? 100 : 0
const targetAct = actIndex + 1
const targetDiff = difficulty + 1
// 1. Collect all base rows matching (version, act, difficulty) per 0x6fda3050
const actDiffRows = HIRELING_RECORDS.filter(
(r) => r.version === version && r.act === targetAct && r.difficulty === targetDiff,
)
let matchingRows = actDiffRows
if (actDiffRows.length > 0) {
const baseLevel = actDiffRows[0]!.level
const levelFiltered = actDiffRows.filter((r) => r.level === baseLevel)
if (levelFiltered.length > 0) {
matchingRows = levelFiltered
}
}
if (matchingRows.length === 0) {
matchingRows = HIRELING_RECORDS.filter((r) => r.act === targetAct)
}
if (matchingRows.length === 0) {
matchingRows = [HIRELING_RECORDS[0]!]
}
// 2. D2Common 64-bit LCG simulation (0x6fd7cd20..0x6fd7cd95)
let seedLo = candidate.seed >>> 0
let seedHi = 0x29a // 666
// Step 1: Subtype / row selection
const step1 = BigInt(seedLo) * 0x6ac690c5n + BigInt(seedHi)
seedLo = Number(step1 & 0xffffffffn) >>> 0
seedHi = Number((step1 >> 32n) & 0xffffffffn) >>> 0
const rowCount = matchingRows.length
const isPowerOfTwo = (rowCount & (rowCount - 1)) === 0
const rowIndex = isPowerOfTwo ? (seedLo & (rowCount - 1)) : (seedLo % rowCount)
const pRow = matchingRows[rowIndex] ?? matchingRows[0]!
// Step 2: Level selection
const step2 = BigInt(seedLo) * 0x6ac690c5n + BigInt(seedHi)
const seedLo2 = Number(step2 & 0xffffffffn) >>> 0
const levelOffset = (seedLo2 >>> 0) % 5
const effPlayerLevel = Math.max(1, playerLevel)
const mercLevel = Math.max(2, effPlayerLevel + levelOffset - 5)
const levelDelta = mercLevel - pRow.level
// Step 3: Compute exact stats
const hp = Math.max(40, pRow.hp + levelDelta * pRow.hpPerLvl)
const defense = Math.max(0, pRow.defense + levelDelta * pRow.defPerLvl)
const strength = Math.max(10, pRow.str + ((levelDelta * pRow.strPerLvl) >> 3))
const dexterity = Math.max(10, pRow.dex + ((levelDelta * pRow.dexPerLvl) >> 3))
const cost = Math.max(
pRow.hireCost,
Math.trunc((pRow.hireCost * (100 + 15 * levelDelta)) / 100),
)
const resist = Math.max(0, pRow.resist + ((levelDelta * pRow.resistPerLvl) >> 3))
const name = resolveHirelingName(candidate.nameId, lang)
const hireDesc = resolveHirelingDesc(pRow.hireDesc, lang)
const { line1, line2 } = formatHirelingCandidateLines(
name,
mercLevel,
hp,
defense,
cost,
hireDesc,
lang,
)
return {
mercId: candidate.nameId, // client uses wMercName as mercId for 0x36
nameId: candidate.nameId,
seed: candidate.seed,
actIndex,
classId: pRow.classId,
subTypeId: pRow.subTypeId,
name,
level: mercLevel,
hp,
defense,
strength,
dexterity,
cost,
resist,
hireDescId: pRow.hireDesc,
hireDesc,
skills: pRow.skills,
line1,
line2,
}
}
/**
* Resolves a list of candidates from raw { nameId, seed } pairs.
*/
export function resolveHirelingCandidates(
candidates: readonly { readonly nameId: number; readonly seed: number }[],
playerLevel: number,
difficulty: number,
actIndex: number,
expansion = true,
lang: 'ENG' | 'CHI' = 'CHI',
): readonly HirelingCandidateDesc[] {
return candidates.map((c) =>
resolveHirelingCandidate(c, playerLevel, difficulty, actIndex, expansion, lang),
)
}