전투 Actor 스탯 Row 레이아웃

EXE actor 초기화 루틴 기준으로 monster HP view와 실제 actor struct offset의 8바이트 차이를 정리한 자료.

요약

Offset Mapping

actual rowexported HP viewactorwidthrolestatusevidence
+0x00+0x00dwordactor prefix zero/reserved구조 확인, 의미 후보0x40bec8에서 row prefix 8바이트를 actor +0x00으로 memcpy한다.
+0x04+0x04byte x2battle action source/type prefix고신뢰actor +0x04는 0x434218에서 action table branch(1/2)를 고르고, +0x05는 type 1 branch의 table index로 쓰인다.
+0x06+0x06u16level / level-like battle value고신뢰actor +0x06은 hit/avoid와 damage random 폭에서 attacker/target level 값처럼 쓰인다. 원숭이 actual row 값은 2.
+0x08+0x00+0x08u32 source -> actor wordHP source, actor current/max/base HP확정0x40bef4가 row +0x08을 actor +0x08에 쓰고 +0x0a/+0x0c로 복사한다.
+0x0a+0x02+0x0eu16MP source, actor current/max/base MP확정0x40bf2a가 row +0x0a를 actor +0x0e에 쓰고 +0x10/+0x12로 복사한다.
+0x0c+0x04+0x14u8 -> wordEXP base/current EXP확정0x40bf60이 enemy row +0x0c를 actor +0x14로 복사한다. 0x42157b 경험치 공식은 defeated enemy +0x14를 base EXP로 읽고, 0x40e085..0x40e095는 산출 EXP를 live player actor +0x14에 더한다.
+0x16wordfixed 100 coefficient확정0x40bf70이 actor +0x16 = 100으로 직접 초기화한다.
+0x0e+0x06+0x1cu16attack axis고신뢰0x40bf79 memcpy source row +0x0e -> actor +0x1c. 0x43461f/0x434737 damage formula에서 attacker +0x70 * actor +0x1c로 쓰인다.
+0x10+0x08+0x1eu16저장된 튜닝 축 / 현 전투 공식 미사용공식 미사용 확인 / 이름 보류row +0x0e..+0x37 block 안에서 actor +0x1e로 복사되고 전체 몬스터 80개에 20..200 범위 값이 있다. 다만 .text 직접 접근 스캔에서 전투 actor word/byte read/write [actor+0x1e]는 없고, 보이는 +0x1e 접근은 display/helper object callback pointer 구조다. damage family byte5가 0x10..0x19인 물리/속성 공식은 target +0x1c+family로 actor +0x2c 이후를 읽으므로 +0x1e에 닿지 않는다.
+0x12+0x0a+0x20u16defense axis고신뢰0x43461f/0x434737 damage formula에서 target +0x7a * actor +0x20로 쓰인다.
+0x14+0x0c+0x22u16technique / hit axis고신뢰0x434218 hit/avoid에서 attacker +0x06 + +0x22, 0x4344ab status gate에서 attacker +0x74 * +0x22로 쓰인다.
+0x16+0x0e+0x24u16agility / avoid axis고신뢰0x434218 hit/avoid에서 target +0x06 + +0x24와 target +0x7c 계수로 회피 점수를 만든다.
+0x18+0x10+0x26u16luck axis / status-critical resistance-side axis고신뢰플레이어 row의 장비/레벨업 루틴에서 actor +0x26이 운으로 확정됐다. 전투 공식에서는 critical/status gate의 attacker/target luck-side 축으로 쓰인다.
+0x1a+0x12+0x28u16숨은 상태/크리티컬 발동률 계수역할 확정 / UI 비표시0x4343db에서 attacker +0x28이 RNG range/base로 쓰이고, 통과 시 attacker +0x62 bit 0x10을 세운다. 0x4344ab 상태 성공 gate에서도 attacker-side 계수로 읽힌다. 플레이어 상태창/장비/레벨업 운 경로와 분리되어 있고 몬스터 대부분이 100이라 상태창 운으로 단정하면 안 된다.
+0x1c+0x14+0x2au16initial battle mode/status id확정actor +0x2a로 복사된 뒤 0x433940이 0x48bcaa 자세/상태 계수 테이블 index로 읽는다. 0x434e84..0x43512e 상태/버프 루틴도 +0x2a에 상태 id를 쓰고 +0x66에 이전값을 저장한다. 몬스터 row 대부분의 1은 초기 보통 상태로 해석된다.
+0x1e+0x16+0x2cu8 tablefamily/rate table start고신뢰target +0x1c+family damage 보정은 family 0x10부터 actor +0x2c table을 읽고, hit/avoid는 actor +0x36+unitByte6을 읽는다. enemy_stat_table의 actual row +0x28..+0x2b가 actor +0x36..+0x39 hit-class table로 복사된다. hit class는 0=상단/공중/상승, 1=일반, 2=하단/지면/다운, 3=잡기/밀착 특수로 본다.
+0x32+0x2a+0x40u8 item + u8 chance/rangeitem drop id / item drop probability divisor루틴 확정 / 현재 연속 몬스터 테이블 전부 0보상 핸들러 0x43577c가 defeated actor +0x40 item id와 +0x41 확률/분모를 읽는다. actor row copy상 source는 actual +0x32/+0x33, HP-view +0x2a/+0x2b다. 현재 80개 연속 몬스터 row에서는 모두 0이라 일반 몬스터 보상은 EXP/골드만 있고 아이템 드롭은 비활성으로 본다.
+0x36+0x2e+0x44u16gold/reward source고신뢰exported monster table의 gold 값과 일치하고, row +0x0e..+0x37 memcpy에 포함되어 actor +0x44로 복사된다.
next +0x04+0x34u16 boundary markernext row prefix marker used as exported monster name id구조 확인exported +0x34는 actual current row 내부가 아니라 다음 actual row +0x04다. 이름 anchor로는 유효하지만 current actor에는 복사되지 않는다.

Sample Rows

nameactual rowHP viewprefixlevelHPMPEXP base+1c atk+1e+20 def+22 tech+24 agi+26+28+2a init state+36..+39 hit classgoldboundary name id
원숭이0x00457d400x00457d4800 00 00 00 02 04 02 0021502219301222143010010x4b 0x64 0x64 0x7d30x0205
멧돼지0x00457e580x00457e6000 00 00 00 02 09 03 0032203127301627224510010x32 0x64 0x96 0x6440x020a
슬라임0x00457f380x00457f4000 00 00 00 02 0d 04 0042002726702332102010010x19 0x64 0xc8 0x1910x020e
박쥐0x004581a00x004581a800 00 00 00 02 18 06 006802527201045407510010x7d 0x64 0x00 0x0050x0219
파워0x004582b80x004582c000 00 00 00 02 1d 0b 0011300099511005660374010010x64 0x64 0x64 0x0010000x021e
스피드0x004582f00x004582f800 00 00 00 02 1e 0b 0011300099464050644810010010x64 0x64 0x64 0x0010000x021f
숙련주작권사0x004583600x0045836800 00 00 00 02 20 0f 001512403775506576635010010x64 0x5a 0x5a 0x64500x0221
숙련창룡권사0x004583980x004583a000 00 00 00 02 21 0f 001511603770506879685010010x5a 0x5a 0x6e 0x5a500x0222
숙련현무권사0x004583d00x004583d800 00 00 00 02 22 0f 001512003772507073655010010x5f 0x55 0x55 0xaf500x0223
주작권사0x004587180x0045872000 00 00 00 02 31 0c 00128203070505259515010010x5a 0x64 0x64 0x64200x0232
창룡권사0x004587500x0045875800 00 00 00 02 32 0c 00127503066505564545010010x5a 0x64 0x64 0x64200x0233
현무권사0x004587880x0045879000 00 00 00 02 33 0c 00128903068505856485010010x5a 0x64 0x6e 0x64200x0234
주작성령0x004589b80x004589c000 00 00 00 02 3d 12 001817803985507185807710010x73 0x64 0x4b 0x6400x023e
창룡성령0x004589f00x004589f800 00 00 00 02 3e 12 0018189039811007390837710010x73 0x64 0x4b 0x6400x023f
현무성령0x00458a280x00458a3000 00 00 00 02 3f 12 001820003983757587787710010x73 0x64 0x4b 0x6400x0240
폭호0x00458b780x00458b8000 00 00 00 02 45 23 003515000100140701401401107010010x64 0x5f 0x69 0x6410000x0246
데드드래곤0x00458d380x00458d4000 00 00 00 02 4d 31 00491250088176991661701355010010x64 0x64 0x6e 0x466000x024e

+1e Distribution

전체 80개 몬스터 row의 exported +0x08 / actor +0x1e 값 분포. 값은 존재하지만 현재 확인된 전투 공식에서는 소비되지 않는다.

valuecountexamples
209독사, 구렁이, 화사, 수사, 뢰사, 박쥐, 큰박쥐, 흡혈박쥐, 마왕박쥐
251초류권사
304원숭이, 취한원숭이, 멧돼지, 구멍멧돼지
352돌기멧돼지, 외뿔멧돼지
404스피드, 근육맨1호, 권법가, 바니-S
461격투가
5027맹호권사범, 숙련주작권사, 숙련창룡권사, 숙련현무권사, 백호권사범, 근육맨, 핀푸, 핀푸, 탕, 탕
602근육맨2호, 근육맨
652귀갑권사, 암각권총통
673견원이, 언원이, 문원이
704슬라임, 마왕슬라임, 폭호, 투귀
753바위슬라임, 현무성령, 야차
806불꽃슬라임, 물슬라임, 벼락슬라임, 동작석상, 해골, 해골전사
851스컬나이트
891뇌룡
902린샹, 지옥의마인
911화룡
951빙룡
992유령, 데드드래곤
1004파워, 창룡성령, 리치, 두개골

Equipment Stat Contrast

장비 f00~f04는 상태창 스탯으로 이미 별도 디코드되어 있다. 몬스터 actor +0x26/+0x28과 같은 전투 공식 축을 이 장비 필드명에 그대로 덮어쓰지 않는다.

namerecordstat summarybattle modifiersequipment skillsraw
명주·귀신살0x0048b3ea운 +25f13 +10기본기=마시기(MP 0, 술취함 상태 변경), 개인공격기=인사불성 철권(MP 12, 개인, 타격/무속성, 넘어짐), 전체공격기=노익장 대폭발(MP 16, 전체, 울부짖음/충격, 행동정지), 특수기=천조족(MP 1, 자기/보조, MP회복)00 00 00 00 19 00 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 01 09 22 39 41
호랑이 도복0x0048b4a2공격력 +30 방어력 +25 기술력 +5 순발력 +12 운 +5f06 +5, f11 +10, f12 +10, f13 +10, f14 +10, f22 +10, f23 +101e 19 05 0c 05 00 05 00 00 00 00 0a 0a 0a 0a 00 00 00 00 00 00 00 0a 0a 00 81 00 00 00 00
백호 도복0x0048b4fe공격력 +25 방어력 +32 기술력 +10 순발력 +16 운 +10f06 +10, f08 +10, f09 +10, f10 +10, f11 +20, f12 +10, f13 +10, f19 +10, f20 +10, f21 +10, f22 +10, f23 +1019 20 0a 10 0a 00 0a 00 0a 0a 0a 14 0a 0a 00 00 00 00 00 0a 0a 0a 0a 0a 00 81 00 00 00 00
호랑이발톱0x0048b612공격력 +50 기술력 +5 운 +5f11 +15, f12 +15, f14 +15기본기=꼬챙이 꿰기(MP 0, 개인, 울부짖음/충격), 개인공격기=맹호열지조(MP 16, 개인, 베기/공중, 넘어짐), 전체공격기=맹호단공아(MP 25, 전체, 베기/공중)32 00 05 00 05 00 00 00 00 00 00 0f 0f 00 0f 00 00 00 00 00 00 00 00 00 00 02 08 1b 2e 00
마인아수라0x0048b83a공격력 +50 기술력 +25기본기=마구베기(MP 0, 개인, 기공/광파), 개인공격기=난도질(MP 30, 개인, 베기/공중, 10타), 전체공격기=투신의 춤(MP 30, 전체, 베기/공중, 3타), 특수기=신격방어(MP 10, 자기/보조, 회복/방어)32 00 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 04 13 22 27
투신의 갑옷0x0048b94e방어력 +50 운 +10f08 +10, f09 +10, f10 +10, f11 +20, f13 +10, f14 +20, f18 +20, f20 +10, f22 +10, f23 +500 32 00 00 0a 00 00 00 0a 0a 0a 14 00 0a 14 00 00 00 14 00 0a 00 0a 05 00 84 00 00 00 00

Disassembly Evidence

0x0040be38 actor initializer row copy
  40bec5:	83 c4 0c             	add    esp,0xc
  40bec8:	6a 08                	push   0x8
  40beca:	8b 45 f8             	mov    eax,DWORD PTR [ebp-0x8]
  40bed3:	2b c1                	sub    eax,ecx
  40bed5:	8d 04 c5 60 7c 45 00 	lea    eax,[eax*8+0x457c60]
  40bedc:	50                   	push   eax
  40bef2:	2b c1                	sub    eax,ecx
  40bef4:	66 8b 04 c5 68 7c 45 	mov    ax,WORD PTR [eax*8+0x457c68]
  40befb:	00
  40befc:	8b 4d fc             	mov    ecx,DWORD PTR [ebp-0x4]
  40beff:	66 89 41 08          	mov    WORD PTR [ecx+0x8],ax
  40bf03:	8b 45 fc             	mov    eax,DWORD PTR [ebp-0x4]
  40bf28:	2b c1                	sub    eax,ecx
  40bf2a:	66 8b 04 c5 6a 7c 45 	mov    ax,WORD PTR [eax*8+0x457c6a]
  40bf31:	00
  40bf32:	8b 4d fc             	mov    ecx,DWORD PTR [ebp-0x4]
  40bf35:	66 89 41 0e          	mov    WORD PTR [ecx+0xe],ax
  40bf39:	8b 45 fc             	mov    eax,DWORD PTR [ebp-0x4]
  40bf5e:	2b c1                	sub    eax,ecx
  40bf60:	66 0f b6 04 c5 6c 7c 	movzx  ax,BYTE PTR [eax*8+0x457c6c]
  40bf67:	45 00
  40bf69:	8b 4d fc             	mov    ecx,DWORD PTR [ebp-0x4]
  40bf6c:	66 89 41 14          	mov    WORD PTR [ecx+0x14],ax
  40bf70:	8b 45 fc             	mov    eax,DWORD PTR [ebp-0x4]
  40bf73:	66 c7 40 16 64 00    	mov    WORD PTR [eax+0x16],0x64
  40bf79:	6a 2a                	push   0x2a
  40bf7b:	8b 45 f8             	mov    eax,DWORD PTR [ebp-0x8]
  40bf84:	2b c1                	sub    eax,ecx
  40bf86:	8d 04 c5 60 7c 45 00 	lea    eax,[eax*8+0x457c60]
  40bf8d:	83 c0 0e             	add    eax,0xe
  40bf90:	50                   	push   eax
  40bf91:	8b 45 fc             	mov    eax,DWORD PTR [ebp-0x4]
  40bf94:	83 c0 1c             	add    eax,0x1c
  40bf97:	50                   	push   eax
0x00434218 hit/avoid formula fields
  4342a2:	66 8b 48 06          	mov    cx,WORD PTR [eax+0x6]
  4342ab:	66 8b 50 22          	mov    dx,WORD PTR [eax+0x22]
  4342b8:	66 8b 40 74          	mov    ax,WORD PTR [eax+0x74]
  4342c5:	66 8b 48 24          	mov    cx,WORD PTR [eax+0x24]
  4342ce:	66 8b 50 06          	mov    dx,WORD PTR [eax+0x6]
  4342db:	66 8b 40 7c          	mov    ax,WORD PTR [eax+0x7c]
  4342e8:	8a 48 06             	mov    cl,BYTE PTR [eax+0x6]
  4342ee:	66 0f b6 44 01 36    	movzx  ax,BYTE PTR [ecx+eax*1+0x36]
0x004343db critical/alternate candidate fields
  4343e7:	66 8b 40 28          	mov    ax,WORD PTR [eax+0x28]
  4343f2:	66 8b 40 72          	mov    ax,WORD PTR [eax+0x72]
  4343ff:	66 8b 48 26          	mov    cx,WORD PTR [eax+0x26]
  434408:	66 8b 50 7e          	mov    dx,WORD PTR [eax+0x7e]
  43449d:	80 c9 10             	or     cl,0x10
0x004344ab status gate fields
  4344b9:	8a 48 6c             	mov    cl,BYTE PTR [eax+0x6c]
  4344ce:	66 8b 48 26          	mov    cx,WORD PTR [eax+0x26]
  4344f1:	66 8b 48 28          	mov    cx,WORD PTR [eax+0x28]
  43451d:	66 8b 50 22          	mov    dx,WORD PTR [eax+0x22]
  434537:	66 8b 48 26          	mov    cx,WORD PTR [eax+0x26]
  43455a:	8a 48 6c             	mov    cl,BYTE PTR [eax+0x6c]
  434560:	66 0f b6 44 01 39    	movzx  ax,BYTE PTR [ecx+eax*1+0x39]
  43459e:	c6 40 6c 00          	mov    BYTE PTR [eax+0x6c],0x0
  434611:	c6 40 6c 00          	mov    BYTE PTR [eax+0x6c],0x0
0x0043461f damage formula fields
  43462d:	66 8b 48 70          	mov    cx,WORD PTR [eax+0x70]
  434636:	66 8b 50 1c          	mov    dx,WORD PTR [eax+0x1c]
  434660:	66 8b 48 7a          	mov    cx,WORD PTR [eax+0x7a]
  434669:	66 8b 50 20          	mov    dx,WORD PTR [eax+0x20]
  434693:	8a 48 6b             	mov    cl,BYTE PTR [eax+0x6b]
  434745:	66 8b 48 70          	mov    cx,WORD PTR [eax+0x70]
  43474e:	66 8b 50 1c          	mov    dx,WORD PTR [eax+0x1c]
  434778:	66 8b 48 7a          	mov    cx,WORD PTR [eax+0x7a]
  434781:	66 8b 50 20          	mov    dx,WORD PTR [eax+0x20]
  4347ab:	8a 48 6b             	mov    cl,BYTE PTR [eax+0x6b]
0x0040dfb8 victory EXP fanout
  40e010:	8a 48 62             	mov    cl,BYTE PTR [eax+0x62]
  40e013:	f6 c1 40             	test   cl,0x40
  40e047:	8a 48 62             	mov    cl,BYTE PTR [eax+0x62]
  40e04a:	f6 c1 80             	test   cl,0x80
  40e06e:	e8 08 35 01 00       	call   0x42157b
  40e085:	66 8b 51 14          	mov    dx,WORD PTR [ecx+0x14]
  40e095:	66 89 41 14          	mov    WORD PTR [ecx+0x14],ax
  40e0a9:	e8 88 76 02 00       	call   0x435736
0x0042157b EXP reward formula
  421589:	66 8b 48 06          	mov    cx,WORD PTR [eax+0x6]
  421592:	66 8b 50 06          	mov    dx,WORD PTR [eax+0x6]
  4215a3:	66 8b 48 06          	mov    cx,WORD PTR [eax+0x6]
  4215ac:	66 8b 50 06          	mov    dx,WORD PTR [eax+0x6]
  4215c0:	66 8b 48 06          	mov    cx,WORD PTR [eax+0x6]
  4215c9:	66 8b 50 06          	mov    dx,WORD PTR [eax+0x6]
  4215f2:	66 8b 48 06          	mov    cx,WORD PTR [eax+0x6]
  4215fb:	66 8b 50 06          	mov    dx,WORD PTR [eax+0x6]
  42160c:	66 8b 48 14          	mov    cx,WORD PTR [eax+0x14]
  421615:	66 8b 50 14          	mov    dx,WORD PTR [eax+0x14]
  42163d:	66 8b 48 14          	mov    cx,WORD PTR [eax+0x14]
  421666:	66 8b 48 14          	mov    cx,WORD PTR [eax+0x14]
  4216a9:	8a 8c c0 98 77 45 00 	mov    cl,BYTE PTR [eax+eax*8+0x457798]
  4216d5:	c1 e8 01             	shr    eax,0x1
  421710:	8a 8c c0 99 77 45 00 	mov    cl,BYTE PTR [eax+eax*8+0x457799]
  42173c:	c1 e8 01             	shr    eax,0x1
0x00435736 gold reward / inactive item-drop handler
  435744:	66 8b 48 44          	mov    cx,WORD PTR [eax+0x44]
  43574b:	a1 e0 76 45 00       	mov    eax,ds:0x4576e0
  435753:	3d 3f 42 0f 00       	cmp    eax,0xf423f
  43575e:	c7 05 e0 76 45 00 3f 	mov    DWORD PTR ds:0x4576e0,0xf423f
  435772:	66 8b 48 44          	mov    cx,WORD PTR [eax+0x44]
  435776:	01 0d e0 76 45 00    	add    DWORD PTR ds:0x4576e0,ecx
  435781:	8a 48 40             	mov    cl,BYTE PTR [eax+0x40]
  43578f:	66 0f b6 40 41       	movzx  ax,BYTE PTR [eax+0x41]
  4357ad:	8a 40 40             	mov    al,BYTE PTR [eax+0x40]
  4357b1:	e8 dd c8 fe ff       	call   0x422093
  4357bc:	8a 40 40             	mov    al,BYTE PTR [eax+0x40]

남은 미확정