java pts ai decompiler

gattsu

Выдающийся
Проверенный
Победитель в номинации 2018
Победитель в номинации 2017
За веру и верность форуму
За заслуги перед форумом
Преподаватель
Сообщения
165
Розыгрыши
0
Репутация
1 457
Реакции
293
Баллы
1 393
"Наша песня хороша, начинай сначало."

Прочитав много литературу, на тему декомпиляции и компиляторов. Пилю такой вот декомпилятор.
На данном этапе генерирует синтаксическое дерево операций, из ai байт кода

Цель: Реализовать декомпилятор и коппилятор, птс скриптов в java код. Постепенно подключить и поменять аи на java сервере.

TODO
- линковать jump, jtrue, jfalse по индексу в дереве. Привязывать метки к узлам дерева(маркирова узлы метками)
- Разметить все функции: количество аргументов, возвращаемое значение(сигнатура функции не интересна, на данном этапе)
- Развернуть взятие полей (event )
- сделать генерацию промежуточного кода

ПС Исходный код полностью сырой. Если не знаете, что к чему, не лезьте, с глупыми вопросами

Пример citizen:
до
Код:
class 1 citizen : default_npc
handler 3 138    //  TALKED
    variable_begin
        "talker"
        "myself"
        "_choiceN"
        "_code"
        "_from_choice"
    variable_end

    push_parameter NoFnHi
    push_const 1
    equal
    branch_false L1
L0
    exit_handler
L1
    push_parameter FriendShip1
    push_const 0
    equal
    branch_false L3
L2
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter fnHi
    func_call 184680516    //  func[ShowPage]
    shift_sp -2
    shift_sp -1
    jump L4
L3
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter FriendShip1
    func_call 184680579    //  func[OwnItemCount]
    shift_sp -2
    push_const 0
    greater
    push_reg_sp
    fetch_i
    branch_true L5
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter FriendShip2
    func_call 184680579    //  func[OwnItemCount]
    shift_sp -2
    push_const 0
    greater
    or
    push_reg_sp
    fetch_i
    branch_true L5
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter FriendShip3
    func_call 184680579    //  func[OwnItemCount]
    shift_sp -2
    push_const 0
    greater
    or
    push_reg_sp
    fetch_i
    branch_true L5
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter FriendShip4
    func_call 184680579    //  func[OwnItemCount]
    shift_sp -2
    push_const 0
    greater
    or
    push_reg_sp
    fetch_i
    branch_true L5
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter FriendShip5
    func_call 184680579    //  func[OwnItemCount]
    shift_sp -2
    push_const 0
    greater
    or
L5
    branch_false L7
L6
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter fnHi
    func_call 184680516    //  func[ShowPage]
    shift_sp -2
    shift_sp -1
    jump L8
L7
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter fnNoFriend
    func_call 184680516    //  func[ShowPage]
    shift_sp -2
    shift_sp -1
L8
L4
handler_end

handler 13 98    //  CREATED
    variable_begin
        "myself"
        "_choiceN"
        "_code"
        "_from_choice"
    variable_end

    push_parameter MoveAroundSocial
    push_const 0
    greater
    push_reg_sp
    fetch_i
    branch_true L9
    push_parameter MoveAroundSocial1
    push_const 0
    greater
    or
L9
    branch_false L11
L10
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_const 1671
    push_const 10000
    func_call 184680487    //  func[AddTimerEx]
    shift_sp -2
    shift_sp -1
L11
    push_parameter HavePet
    push_const 1
    equal
    branch_false L13
L12
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_parameter silhouette
S1. "pet_around_pet_manager"
    push_string S1
    push_const 0
    push_const 0
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  x
    push_const 8
    add
    fetch_d
    push_const 10
    add
    func_call 184615005    //  func[FloatToInt]
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  y
    push_const 16
    add
    fetch_d
    push_const 10
    add
    func_call 184615005    //  func[FloatToInt]
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  z
    push_const 24
    add
    fetch_d
    func_call 184615005    //  func[FloatToInt]
    shift_sp -1
    push_const 0
    push_const 0
    push_const 0
    push_const 0
    func_call 185270503    //  func[CreateOnePrivateEx]
    shift_sp -11
    shift_sp -1
L13
    call_super
handler_end

handler 12 173    //  TIMER_FIRED_EX
    variable_begin
        "timer_id"
        "myself"
        "_choiceN"
        "_code"
        "_from_choice"
    variable_end

    push_event    //  timer_id
    push_const 236
    add
    fetch_i4
    push_const 1671
    equal
    branch_false L15
L14
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  hp
    push_const 392
    add
    fetch_d
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  max_hp
    push_const 1216
    add
    fetch_d
    push_const 0.4
    mul
    greater
    push_reg_sp
    fetch_i
    branch_false L16
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  alive
    push_const 104
    add
    fetch_i4
    push_const 0
    not_equal
    and
    push_reg_sp
    fetch_i
    branch_false L16
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  p_state
    push_const 280
    add
    fetch_i4
    push_const 3
    not_equal
    and
L16
    branch_false L18
L17
    push_parameter MoveAroundSocial
    push_const 0
    greater
    push_reg_sp
    fetch_i
    branch_true L19
    push_parameter MoveAroundSocial1
    push_const 0
    greater
    or
L19
    branch_false L21
L20
    push_parameter MoveAroundSocial
    push_const 0
    greater
    push_reg_sp
    fetch_i
    branch_false L22
    push_event    //  gg
    push_const 632
    add
    fetch_i
    push_const 100
    func_call 218169344    //  func[Rand]
    shift_sp -1
    push_const 40
    less
    and
L22
    branch_false L24
L23
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i
    push_const 3
    push_parameter MoveAroundSocial
    push_const 1000
    mul
    push_const 30
    div
    push_const 50
    func_call 184811541    //  func[AddEffectActionDesire]
    shift_sp -4
    shift_sp -1
    jump L25
L24
    push_parameter MoveAroundSocial1
    push_const 0
    greater
    push_reg_sp
    fetch_i
    branch_false L26
    push_event    //  gg
    push_const 632
    add
    fetch_i
    push_const 100
    func_call 218169344    //  func[Rand]
    shift_sp -1
    push_const 40
    less
    and
L26
    branch_false L28
L27
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i
    push_const 2
    push_parameter MoveAroundSocial1
    push_const 1000
    mul
    push_const 30
    div
    push_const 50
    func_call 184811541    //  func[AddEffectActionDesire]
    shift_sp -4
    shift_sp -1
L28
L25
L21
L18
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_const 1671
    push_const 10000
    func_call 184680487    //  func[AddTimerEx]
    shift_sp -2
    shift_sp -1
L15
    call_super
handler_end

handler 32 410    //  MENU_SELECTED
    variable_begin
        "talker"
        "ask"
        "reply"
        "fhtml0"
        "myself"
        "_choiceN"
        "_code"
        "_from_choice"
    variable_end

    push_event    //  ask
    push_const 160
    add
    fetch_i4
    push_const 1000
    negate
    equal
    branch_false L30
L29
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_reg_sp
    fetch_i
    push_const 0
    equal
    branch_false L33
L32
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_parameter fnHi
    func_call 184680516    //  func[ShowPage]
    shift_sp -2
    shift_sp -1
    jump L31
    jump L34
L33
    push_reg_sp
    fetch_i
    push_const 1
    equal
    branch_false L35
L34
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  residence_id
    push_const 824
    add
    fetch_i4
    push_const 0
    greater
    branch_false L37
L36
    push_event    //  myself
    push_const 704
    add
    fetch_i
    func_call 184549553    //  func[Castle_GetPledgeId]
    branch_false L39
L38
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
    push_parameter fnFeudInfo
    func_call 184680582    //  func[FHTML_SetFileName]
    shift_sp -2
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S2. "my_pledge_name"
    push_string S2
    push_event    //  myself
    push_const 704
    add
    fetch_i
    func_call 184549527    //  func[Castle_GetPledgeName]
    func_call 184746121    //  func[FHTML_SetStr]
    shift_sp -3
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S3. "my_owner_name"
    push_string S3
    push_event    //  myself
    push_const 704
    add
    fetch_i
    func_call 184549528    //  func[Castle_GetOwnerName]
    func_call 184746121    //  func[FHTML_SetStr]
    shift_sp -3
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S4. "current_tax_rate"
    push_string S4
    push_event    //  myself
    push_const 704
    add
    fetch_i
    func_call 184549531    //  func[Residence_GetTaxRateCurrent]
    func_call 184746119    //  func[FHTML_SetInt]
    shift_sp -3
    shift_sp -1
    jump L40
L39
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
    push_parameter fnNoFeudInfo
    func_call 184680582    //  func[FHTML_SetFileName]
    shift_sp -2
    shift_sp -1
L40
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  residence_id
    push_const 824
    add
    fetch_i4
    push_const 7
    less
    branch_false L42
L41
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S5. "kingdom_name"
    push_string S5
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_const 1001000
S6. ""
    push_string S6
S7. ""
    push_string S7
S8. ""
    push_string S8
S9. ""
    push_string S9
S10. ""
    push_string S10
    func_call 184942731    //  func[MakeFString]
    shift_sp -6
    func_call 184746121    //  func[FHTML_SetStr]
    shift_sp -3
    shift_sp -1
    jump L43
L42
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S11. "kingdom_name"
    push_string S11
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_const 1001100
S12. ""
    push_string S12
S13. ""
    push_string S13
S14. ""
    push_string S14
S15. ""
    push_string S15
S16. ""
    push_string S16
    func_call 184942731    //  func[MakeFString]
    shift_sp -6
    func_call 184746121    //  func[FHTML_SetStr]
    shift_sp -3
    shift_sp -1
L43
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
S17. "feud_name"
    push_string S17
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_const 1001000
    push_event    //  myself
    push_const 704
    add
    fetch_i    //  sm
    push_const 544
    add
    fetch_i    //  residence_id
    push_const 824
    add
    fetch_i4
    add
S18. ""
    push_string S18
S19. ""
    push_string S19
S20. ""
    push_string S20
S21. ""
    push_string S21
S22. ""
    push_string S22
    func_call 184942731    //  func[MakeFString]
    shift_sp -6
    func_call 184746121    //  func[FHTML_SetStr]
    shift_sp -3
    shift_sp -1
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    push_event    //  fhtml0
    push_const 520
    add
    fetch_i
    func_call 184680586    //  func[ShowFHTML]
    shift_sp -2
    shift_sp -1
    jump L44
L37
L44
    jump L31
    jump L45
L35
L45
L31
    shift_sp -1
L30
    push_event    //  ask
    push_const 160
    add
    fetch_i4
    push_const 303
    negate
    equal
    branch_false L47
L46
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_const 203
    equal
    branch_false L49
L48
    push_event    //  myself
    push_const 704
    add
    fetch_i
    func_call 184549715    //  func[GetSSQStatus]
    push_const 3
    equal
    branch_false L51
L50
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  talker
    push_const 40
    add
    fetch_i
    func_call 184615265    //  func[GetSSQPart]
    shift_sp -1
    push_const 0
    not_equal
    branch_false L53
L52
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_event    //  talker
    push_const 40
    add
    fetch_i
    func_call 184680529    //  func[ShowMultisell]
    shift_sp -2
    shift_sp -1
L53
L51
    jump L54
L49
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_const 532
    equal
    push_reg_sp
    fetch_i
    branch_true L55
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_const 549
    equal
    or
L55
    branch_false L57
L56
    jump L59
L58
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_event    //  talker
    push_const 40
    add
    fetch_i
    func_call 184680529    //  func[ShowMultisell]
    shift_sp -2
    shift_sp -1
    jump L60
L59
L60
    jump L61
L57
    push_event    //  myself
    push_const 704
    add
    fetch_i
    push_event    //  reply
    push_const 164
    add
    fetch_i4
    push_event    //  talker
    push_const 40
    add
    fetch_i
    func_call 184680529    //  func[ShowMultisell]
    shift_sp -2
    shift_sp -1
L61
L54
L47
handler_end

class_end
После
Код:
class citizen : default_npc {

handler TALKED
t0 = param NoFnHi
t1 = 1
t2 = t0 == t1
t3 = jfalse 1
t4 = return
t5 = param FriendShip1
t6 = 0
t7 = t5 == t6
t8 = jfalse 3
t9 = event
t10 = 704
t11 = t9 + t10
t12 = fetch t11
t13 = event
t14 = 40
t15 = t13 + t14
t16 = fetch t15
t17 = param fnHi
t18 = call ShowPage(t12, t16, t17)
t19 = jump 4
t20 = event
t21 = 704
t22 = t20 + t21
t23 = fetch t22
t24 = event
t25 = 40
t26 = t24 + t25
t27 = fetch t26
t28 = param FriendShip1
t29 = call OwnItemCount(t19, t23, t27, t28)
t30 = 0
t31 = t29 > t30
t32 = t31
t33 = fetch t32
t34 = jfalse 5
t35 = event
t36 = 704
t37 = t35 + t36
t38 = fetch t37
t39 = event
t40 = 40
t41 = t39 + t40
t42 = fetch t41
t43 = param FriendShip2
t44 = call OwnItemCount(t34, t38, t42, t43)
t45 = 0
t46 = t44 > t45
t47 = t33 || t46
t48 = t47
t49 = fetch t48
t50 = jfalse 5
t51 = event
t52 = 704
t53 = t51 + t52
t54 = fetch t53
t55 = event
t56 = 40
t57 = t55 + t56
t58 = fetch t57
t59 = param FriendShip3
t60 = call OwnItemCount(t50, t54, t58, t59)
t61 = 0
t62 = t60 > t61
t63 = t49 || t62
t64 = t63
t65 = fetch t64
t66 = jfalse 5
t67 = event
t68 = 704
t69 = t67 + t68
t70 = fetch t69
t71 = event
t72 = 40
t73 = t71 + t72
t74 = fetch t73
t75 = param FriendShip4
t76 = call OwnItemCount(t66, t70, t74, t75)
t77 = 0
t78 = t76 > t77
t79 = t65 || t78
t80 = t79
t81 = fetch t80
t82 = jfalse 5
t83 = event
t84 = 704
t85 = t83 + t84
t86 = fetch t85
t87 = event
t88 = 40
t89 = t87 + t88
t90 = fetch t89
t91 = param FriendShip5
t92 = call OwnItemCount(t82, t86, t90, t91)
t93 = 0
t94 = t92 > t93
t95 = t81 || t94
t96 = jfalse 7
t97 = event
t98 = 704
t99 = t97 + t98
t100 = fetch t99
t101 = event
t102 = 40
t103 = t101 + t102
t104 = fetch t103
t105 = param fnHi
t106 = call ShowPage(t100, t104, t105)
t107 = jump 8
t108 = event
t109 = 704
t110 = t108 + t109
t111 = fetch t110
t112 = event
t113 = 40
t114 = t112 + t113
t115 = fetch t114
t116 = param fnNoFriend
t117 = call ShowPage(t111, t115, t116)
handler_end

handler CREATED
t0 = param MoveAroundSocial
t1 = 0
t2 = t0 > t1
t3 = t2
t4 = fetch t3
t5 = jfalse 9
t6 = param MoveAroundSocial1
t7 = 0
t8 = t6 > t7
t9 = t5 || t8
t10 = jfalse 11
t11 = event
t12 = 704
t13 = t11 + t12
t14 = fetch t13
t15 = 1671
t16 = 10000
t17 = call AddTimerEx(t14, t15, t16)
t18 = param HavePet
t19 = 1
t20 = t18 == t19
t21 = jfalse 13
t22 = event
t23 = 704
t24 = t22 + t23
t25 = fetch t24
t26 = param silhouette
t27 = "pet_around_pet_manager"
t28 = 0
t29 = 0
t30 = event
t31 = 704
t32 = t30 + t31
t33 = fetch t32
t34 = event
t35 = 704
t36 = t34 + t35
t37 = fetch t36
t38 = 544
t39 = t37 + t38
t40 = fetch t39
t41 = 8
t42 = t40 + t41
t43 = fetch t42
t44 = 10
t45 = t43 + t44
t46 = call FloatToInt(t33, t45)
t47 = event
t48 = 704
t49 = t47 + t48
t50 = fetch t49
t51 = event
t52 = 704
t53 = t51 + t52
t54 = fetch t53
t55 = 544
t56 = t54 + t55
t57 = fetch t56
t58 = 16
t59 = t57 + t58
t60 = fetch t59
t61 = 10
t62 = t60 + t61
t63 = call FloatToInt(t50, t62)
t64 = event
t65 = 704
t66 = t64 + t65
t67 = fetch t66
t68 = event
t69 = 704
t70 = t68 + t69
t71 = fetch t70
t72 = 544
t73 = t71 + t72
t74 = fetch t73
t75 = 24
t76 = t74 + t75
t77 = fetch t76
t78 = call FloatToInt(t67, t77)
t79 = 0
t80 = 0
t81 = 0
t82 = 0
t83 = call CreateOnePrivateEx(t25, t26, t27, t28, t29, t46, t63, t78, t79, t80, t81, t82)
t84 = super
handler_end

handler TIMER_FIRED_EX
t0 = event
t1 = 236
t2 = t0 + t1
t3 = fetch t2
t4 = 1671
t5 = t3 == t4
t6 = jfalse 15
t7 = event
t8 = 704
t9 = t7 + t8
t10 = fetch t9
t11 = 544
t12 = t10 + t11
t13 = fetch t12
t14 = 392
t15 = t13 + t14
t16 = fetch t15
t17 = event
t18 = 704
t19 = t17 + t18
t20 = fetch t19
t21 = 544
t22 = t20 + t21
t23 = fetch t22
t24 = 1216
t25 = t23 + t24
t26 = fetch t25
t27 = 0.4
t28 = t26 * t27
t29 = t16 > t28
t30 = t29
t31 = fetch t30
t32 = jfalse 16
t33 = event
t34 = 704
t35 = t33 + t34
t36 = fetch t35
t37 = 544
t38 = t36 + t37
t39 = fetch t38
t40 = 104
t41 = t39 + t40
t42 = fetch t41
t43 = 0
t44 = t42 != t43
t45 = t32 && t44
t46 = t45
t47 = fetch t46
t48 = jfalse 16
t49 = event
t50 = 704
t51 = t49 + t50
t52 = fetch t51
t53 = 280
t54 = t52 + t53
t55 = fetch t54
t56 = 3
t57 = t55 != t56
t58 = t48 && t57
t59 = jfalse 18
t60 = param MoveAroundSocial
t61 = 0
t62 = t60 > t61
t63 = t62
t64 = fetch t63
t65 = jfalse 19
t66 = param MoveAroundSocial1
t67 = 0
t68 = t66 > t67
t69 = t65 || t68
t70 = jfalse 21
t71 = param MoveAroundSocial
t72 = 0
t73 = t71 > t72
t74 = t73
t75 = fetch t74
t76 = jfalse 22
t77 = event
t78 = 632
t79 = t77 + t78
t80 = fetch t79
t81 = 100
t82 = call Rand(t80, t81)
t83 = 40
t84 = t82 < t83
t85 = t76 && t84
t86 = jfalse 24
t87 = event
t88 = 704
t89 = t87 + t88
t90 = fetch t89
t91 = event
t92 = 704
t93 = t91 + t92
t94 = fetch t93
t95 = 544
t96 = t94 + t95
t97 = fetch t96
t98 = 3
t99 = param MoveAroundSocial
t100 = 1000
t101 = t99 * t100
t102 = 30
t103 = t101 / t102
t104 = 50
t105 = call AddEffectActionDesire(t90, t97, t98, t103, t104)
t106 = jump 25
t107 = param MoveAroundSocial1
t108 = 0
t109 = t107 > t108
t110 = t109
t111 = fetch t110
t112 = jfalse 26
t113 = event
t114 = 632
t115 = t113 + t114
t116 = fetch t115
t117 = 100
t118 = call Rand(t116, t117)
t119 = 40
t120 = t118 < t119
t121 = t112 && t120
t122 = jfalse 28
t123 = event
t124 = 704
t125 = t123 + t124
t126 = fetch t125
t127 = event
t128 = 704
t129 = t127 + t128
t130 = fetch t129
t131 = 544
t132 = t130 + t131
t133 = fetch t132
t134 = 2
t135 = param MoveAroundSocial1
t136 = 1000
t137 = t135 * t136
t138 = 30
t139 = t137 / t138
t140 = 50
t141 = call AddEffectActionDesire(t126, t133, t134, t139, t140)
t142 = event
t143 = 704
t144 = t142 + t143
t145 = fetch t144
t146 = 1671
t147 = 10000
t148 = call AddTimerEx(t145, t146, t147)
t149 = super
handler_end

handler MENU_SELECTED
t0 = event
t1 = 160
t2 = t0 + t1
t3 = fetch t2
t4 = 1000
t5 = -t4
t6 = t3 == t5
t7 = jfalse 30
t8 = event
t9 = 164
t10 = t8 + t9
t11 = fetch t10
t12 = t11
t13 = fetch t12
t14 = 0
t15 = t13 == t14
t16 = jfalse 33
t17 = event
t18 = 704
t19 = t17 + t18
t20 = fetch t19
t21 = event
t22 = 40
t23 = t21 + t22
t24 = fetch t23
t25 = param fnHi
t26 = call ShowPage(t20, t24, t25)
t27 = jump 31
t28 = jump 34
t29 = t28
t30 = fetch t29
t31 = 1
t32 = t30 == t31
t33 = jfalse 35
t34 = event
t35 = 704
t36 = t34 + t35
t37 = fetch t36
t38 = 544
t39 = t37 + t38
t40 = fetch t39
t41 = 824
t42 = t40 + t41
t43 = fetch t42
t44 = 0
t45 = t43 > t44
t46 = jfalse 37
t47 = event
t48 = 704
t49 = t47 + t48
t50 = fetch t49
t51 = call Castle_GetPledgeId(t50)
t52 = jfalse 39
t53 = event
t54 = 704
t55 = t53 + t54
t56 = fetch t55
t57 = event
t58 = 520
t59 = t57 + t58
t60 = fetch t59
t61 = param fnFeudInfo
t62 = call FHTML_SetFileName(t56, t60, t61)
t63 = event
t64 = 704
t65 = t63 + t64
t66 = fetch t65
t67 = event
t68 = 520
t69 = t67 + t68
t70 = fetch t69
t71 = "my_pledge_name"
t72 = event
t73 = 704
t74 = t72 + t73
t75 = fetch t74
t76 = call Castle_GetPledgeName(t75)
t77 = call FHTML_SetStr(t66, t70, t71, t76)
t78 = event
t79 = 704
t80 = t78 + t79
t81 = fetch t80
t82 = event
t83 = 520
t84 = t82 + t83
t85 = fetch t84
t86 = "my_owner_name"
t87 = event
t88 = 704
t89 = t87 + t88
t90 = fetch t89
t91 = call Castle_GetOwnerName(t90)
t92 = call FHTML_SetStr(t81, t85, t86, t91)
t93 = event
t94 = 704
t95 = t93 + t94
t96 = fetch t95
t97 = event
t98 = 520
t99 = t97 + t98
t100 = fetch t99
t101 = "current_tax_rate"
t102 = event
t103 = 704
t104 = t102 + t103
t105 = fetch t104
t106 = call Residence_GetTaxRateCurrent(t105)
t107 = call FHTML_SetInt(t96, t100, t101, t106)
t108 = jump 40
t109 = event
t110 = 704
t111 = t109 + t110
t112 = fetch t111
t113 = event
t114 = 520
t115 = t113 + t114
t116 = fetch t115
t117 = param fnNoFeudInfo
t118 = call FHTML_SetFileName(t112, t116, t117)
t119 = event
t120 = 704
t121 = t119 + t120
t122 = fetch t121
t123 = 544
t124 = t122 + t123
t125 = fetch t124
t126 = 824
t127 = t125 + t126
t128 = fetch t127
t129 = 7
t130 = t128 < t129
t131 = jfalse 42
t132 = event
t133 = 704
t134 = t132 + t133
t135 = fetch t134
t136 = event
t137 = 520
t138 = t136 + t137
t139 = fetch t138
t140 = "kingdom_name"
t141 = event
t142 = 704
t143 = t141 + t142
t144 = fetch t143
t145 = 1001000
t146 = ""
t147 = ""
t148 = ""
t149 = ""
t150 = ""
t151 = call MakeFString(t144, t145, t146, t147, t148, t149, t150)
t152 = call FHTML_SetStr(t135, t139, t140, t151)
t153 = jump 43
t154 = event
t155 = 704
t156 = t154 + t155
t157 = fetch t156
t158 = event
t159 = 520
t160 = t158 + t159
t161 = fetch t160
t162 = "kingdom_name"
t163 = event
t164 = 704
t165 = t163 + t164
t166 = fetch t165
t167 = 1001100
t168 = ""
t169 = ""
t170 = ""
t171 = ""
t172 = ""
t173 = call MakeFString(t166, t167, t168, t169, t170, t171, t172)
t174 = call FHTML_SetStr(t157, t161, t162, t173)
t175 = event
t176 = 704
t177 = t175 + t176
t178 = fetch t177
t179 = event
t180 = 520
t181 = t179 + t180
t182 = fetch t181
t183 = "feud_name"
t184 = event
t185 = 704
t186 = t184 + t185
t187 = fetch t186
t188 = 1001000
t189 = event
t190 = 704
t191 = t189 + t190
t192 = fetch t191
t193 = 544
t194 = t192 + t193
t195 = fetch t194
t196 = 824
t197 = t195 + t196
t198 = fetch t197
t199 = t188 + t198
t200 = ""
t201 = ""
t202 = ""
t203 = ""
t204 = ""
t205 = call MakeFString(t187, t199, t200, t201, t202, t203, t204)
t206 = call FHTML_SetStr(t178, t182, t183, t205)
t207 = event
t208 = 704
t209 = t207 + t208
t210 = fetch t209
t211 = event
t212 = 40
t213 = t211 + t212
t214 = fetch t213
t215 = event
t216 = 520
t217 = t215 + t216
t218 = fetch t217
t219 = call ShowFHTML(t210, t214, t218)
t220 = jump 44
t221 = jump 31
t222 = jump 45
t223 = event
t224 = 160
t225 = t223 + t224
t226 = fetch t225
t227 = 303
t228 = -t227
t229 = t226 == t228
t230 = jfalse 47
t231 = event
t232 = 164
t233 = t231 + t232
t234 = fetch t233
t235 = 203
t236 = t234 == t235
t237 = jfalse 49
t238 = event
t239 = 704
t240 = t238 + t239
t241 = fetch t240
t242 = call GetSSQStatus(t241)
t243 = 3
t244 = t242 == t243
t245 = jfalse 51
t246 = event
t247 = 704
t248 = t246 + t247
t249 = fetch t248
t250 = event
t251 = 40
t252 = t250 + t251
t253 = fetch t252
t254 = call GetSSQPart(t249, t253)
t255 = 0
t256 = t254 != t255
t257 = jfalse 53
t258 = event
t259 = 704
t260 = t258 + t259
t261 = fetch t260
t262 = event
t263 = 164
t264 = t262 + t263
t265 = fetch t264
t266 = event
t267 = 40
t268 = t266 + t267
t269 = fetch t268
t270 = call ShowMultisell(t261, t265, t269)
t271 = jump 54
t272 = event
t273 = 164
t274 = t272 + t273
t275 = fetch t274
t276 = 532
t277 = t275 == t276
t278 = t277
t279 = fetch t278
t280 = jfalse 55
t281 = event
t282 = 164
t283 = t281 + t282
t284 = fetch t283
t285 = 549
t286 = t284 == t285
t287 = t280 || t286
t288 = jfalse 57
t289 = jump 59
t290 = event
t291 = 704
t292 = t290 + t291
t293 = fetch t292
t294 = event
t295 = 164
t296 = t294 + t295
t297 = fetch t296
t298 = event
t299 = 40
t300 = t298 + t299
t301 = fetch t300
t302 = call ShowMultisell(t293, t297, t301)
t303 = jump 60
t304 = jump 61
t305 = event
t306 = 704
t307 = t305 + t306
t308 = fetch t307
t309 = event
t310 = 164
t311 = t309 + t310
t312 = fetch t311
t313 = event
t314 = 40
t315 = t313 + t314
t316 = fetch t315
t317 = call ShowMultisell(t308, t312, t316)
handler_end

}

 

    Mifesto

    Баллов: 19
    Спасибо за вклад в развитие форума

    ツsmile10ツ

    Баллов: 38
    Спасибо за вклад в развитие форума

    0wn3d

    Баллов: 54
    Спасибо за вклад в развитие форума

Фантомные операции - которые помещают в стек значение и захватываются другими операциями, являются частью выражения.
Ряд инструкций являются ТОЛЬКО фантомными, они либо должны захватываться или зачищаться инструкцией shift_sp. В последнем случае, мертвый код, если не происходит захват таких инструкций.

Конечные операции - котрые не захватываются другими операциями.

Правило 1:
Все команды, которые не помещают значение в стек, являются конечными.

Конечными операциями могут быть не все команды. Группа конечных операций включает в себя:
- func_call - имеет двойственное состояние, не может захватыватся, если функция не возвращает значение.
Только конечные. Не могут захватываться
- branch_false, branch_true, jump
- assign, assign4

Все остальные команды, не могут быть конечными, если они остаются в стеке нужно гененрировать исключение.

Некоторые конечные операции могут быть фантомными, например вызов функции может быть часть аргументом другого вызова функции.

На основе данных утверждений будем формировать отображения и дерево разбора, обработки набора инструкций.

Помечать некоторые выражание флагом shift, если инструкция shift_sp зачищает стек, и данная операция попадает под эту зачистку.
Нужно для нормализации отображения.

Правило 2:
Все аргументы функции должны быть помечены shift флагом. Не допускается повторное использование аргументов.

Аргумент this, первый аргумент вызываемой функции. В случае, если функцияя возвращает значение, результат помещается на место первого аргумента(this).

Возможны "висячие" фантомные операции, такими являются операции которые являются частью логического выражения для условных переходов.
Набор команд может дублировать некоторые значение для повторного использования, в потоке нескольких условных переходов.
Так как команды условного перехода захватывают значение из стека и не помещают туда другого.

При операции присвоение возможно дублирование, в случае инкримента
i0++ : i0 = i0 + 1
Так как с синтаксической точки зрение, данное выражение возвращает значение операции инкримента, то есть по адресу i0.
 
  • Мне нравится
Реакции: kick
Эвристический алгоритм для вычисление сигнатуры функции. Количество её аргументов и наличие возвращаемого значения.

Указатель this, первый аргумент функции.

Правило 1:
Функции захватывает минимум одно значение в стеке, при вызове, указатель this.


Правило 2:
Возвращаемое значение помещается, в стеке, вместо указателя this.


Правило 3:
Компилятор ai языка высокого уровня генерирует код, виртуальной машины ai, для вызова функции, с зачисткой стека. После вызова используя инструкцию shift_sp. В коде происходит зачистка двумя командами shift_sp. Первая комада shift_sp зачищает аргументы, вторая команда shift_sp зачищает возвращаемое значение/указатель this.


Исходя из этих трех правил можно сделать предположение на количество аргументов и возвращаемого значение у функции. Путем просмотра кода наперед, при достижении команды вызова функции.

Может существовать ситуация с однозначной сигнатурой и с неоднозначной сигнатурой

Шаблон 1
О сигнатуре можно сказать однозначно, если зачищается аргументы и указатель. Данная функцие не имеет возвращаемого значения и сумма по модулю операндов, двух комнад shift_sp, является количеством аргументов.
Пример
Код:
func_call N
shift_sp X
shift_sp Y
...
ret = false
argcN = |X + Y|

Примечание: Значение операнда, инструкции shift_sp, всегда меньше нуля(>0)
*ret - наличие возвращаемого значения
*argcN - количество аргументов, для функции, с индексом N.

Шаблон 2
О сигнатуре можно сказать однозначно, если после func_call, следует одна инструкции shift_sp X, и значение операнда X, данной инструкции, по модулю больше одного. Из этого следует, что данная функция возвращает значение и количество аргументов равно значению по модулю операнда X плюс один.
Пример
Код:
func_call N
shift_sp X
...
ret = true
argcN = |X| + 1
где |X| > 1

Примечание: единица это указатель this/return value, так как функция возвращает значение и данное значение ипользует другая инструкция.


Шаблон 3
О сигнатуре можно сказать однозначно, если после func_call, не следует ни одной инструкции shift_sp. Тогда данная функция возвращает значение и имеет один аргумент, указатель this.

Код:
func_call N
...
ret = true
argcN = 1

Примечание: Возвращаемое значение, данной функции, используется другой инструкцией.

Шаблон 4
О сигнатуре нельзя сказать однозначно, если после func_call, следует только одна инструкция shift_sp, и её операнд равен единице по модулю(-1).

Код:
func_call N
shift_sp -1
...
ret = true|false
argcN = min(1, 2)

В данной ситуации у функции может быть от одного до двух аргументов. Если один аргумент, то не существует возвращаемого значение, если два то есть возвращаемое значение.

Чтобы решить неоднозначность, нужно отслеживать захват. Если данную функции, помещая в стек, при разборе, захватывает другая инструкция, значит функция имеет два аргумент и возвращает значение. Если захват не происходит, значит функция не возвращает значение и имеет один аргумент.

Способы решения неоднозначности:

Решение 1
В случае, когда предыдущее вхождение не является адресом на объект, тогда функция имеет два аргумента и возвращает значение. Для определения данной ситуации, можно сделать обратный просмотр инструкций. Если предыдущая инструкция не является fetch_i или push_reg_sp. Возможна ситуация когда fetch_i возвращает примитивное значение, типа long, размерностью 64 бита.
ret = true
argc = 2

Решение 2
Когда следующая инструкция, после shifp_sp, является метка, jump, exit_handler, call_super или отсутствует вовсе. Тогда функция имеет один аргумент и не возвращает значения.
Примечание: Метки, перехода, хранятся в потоке инструкций.
ret = false
argc = 1

Решение 3
Если в стеке находится одно вхождение, тогда функция имеет один аргумент и не возвращает значение
ret = false
argc = 1

Решение 4
Если функция является частью других выражений. Арифм выражения, аргументом другой функции, условием перехода, присвоение и т.п. Для выявления данной ситуации можно просмотреть следующую инструкцию, после shift_sp. Если следующая инструкция является:
add, add_string, and, assign, assign4, bit_and, bit_or, branch_true, branch_false, div, equal, greater, greater_equal, less, less_equal, mod, mul, negate, not, not_equal, or, sub, func_call
тогда функция возвращает значение и имеет два аргумента.
ret = true
argc = 2

Решение 4.1
Может быть ситуация, когда возвращаемое значение является левой частью в узле операций или не последним аргументом функции. Тогда надо рассматривать, как операцию, вторую инструкцию, после shift_sp, а первую за ней должны быть операции помещения в стек значений push_const, push_string, push_paramter, push_property. За исключением push_event.
ret = true
argc = 2

Решение 5
Если при просмотре назад, на 5 позиции, в коде, инструкцией является метка, тогда функция имеет один аргумент и не возвращает значение.
Примечание: код генерируется так, что последовательность аргументов не может быть разорвана меткой.
Код:
0: L%d:
1: push_event
2: push_const %d
3: add
4: fetch_i
5: func_call %d
6: shift_sp -1
ret = false
argc = 1
 
Последнее редактирование:
Дополнил алгоритм.
Код алгоритма
Код:
    @Override
    public void ex_func_call(int index) {
        Function func = env.test(index);
        scan: {
            if(func.complete)
                break scan; 
            func.name = getFunctionName();
            Instruction i0 = next(1), i1 = next(2), i2 = next(3);     
            //Template 1
            if(i0.is(SHIFT_SP) && i1 != null && i1.is(SHIFT_SP)) {
                func.argc = -(i0.operand + i1.operand);
                func.ret = false;
                func.complete = true;
                break scan;
            }
            //Template 2
            if(i0.is(SHIFT_SP) && i0.operand < -1) {
                func.argc = -i0.operand + 1;
                func.ret = true;
                func.complete = true;
                break scan;
            }
            //Template 3
            if(i0.not(SHIFT_SP)) {
                func.argc = 1;
                func.ret = true;
                func.complete = true;
                break scan;
            }
            //Template 4
            //Solution 1
            if(prev(1).not(FETCH_I, PUSH_REG_SP)) {
                func.argc = 2;
                func.ret = true;
                func.complete = true;
                break scan;
            }
            //Solution 2
            if(i1 == null || i1.is(LABEL, JUMP, CALL_SUPER, EXIT_HANDLER)) {
                func.argc = 1;
                func.ret = false;
                func.complete = true;
                break scan;
            }
            //Solution 3
            if(stack.size() == 1) {
                func.argc = 1;
                func.ret = false;
                func.complete = true;
                break scan;
            }
            //Solution 4
            if(i1 != null && i1.is(ADD, ADD_STRING, AND, ASSIGN, ASSIGN4, BIT_AND, BIT_OR, BRANCH_TRUE, BRANCH_FALSE, DIV, EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL, MOD, MUL, NEGATE, NOT, NOT_EQUAL, OR, SUB, FUNC_CALL)) {
                func.argc = 2;
                func.ret = true;
                func.complete = true;
                break scan;
            }
            //Solution 4.1
            if(i1 != null && i1.is(PUSH_CONST, PUSH_CONST_F, PUSH_PARAMETER, PUSH_PROPERTY, PUSH_STRING) && i2 != null && i2.is(ADD, ADD_STRING, AND, ASSIGN, ASSIGN4, BIT_AND, BIT_OR, BRANCH_TRUE, BRANCH_FALSE, DIV, EQUAL, GREATER, GREATER_EQUAL, LESS, LESS_EQUAL, MOD, MUL, NEGATE, NOT, NOT_EQUAL, OR, SUB, FUNC_CALL)) {
                func.argc = 2;
                func.ret = true;
                func.complete = true;
                break scan;
            }
            System.err.println("not solved signature " + trace());
            System.exit(0);
        }
        super.ex_func_call(index);
    }
 
  • Мне нравится
Реакции: kick
Обновил репозиторий. Добавил рабочию реализацию алгоритма. sart.decompiler.ai.Scanner
Дополнил алгорит Решением 5
Результат работы алгоритма для хроники с4, 100% определение все сигнар.
Результат:
Формат строк:
index#name#ret#argc
index - индекс функции
name - имя функции
ret - возвращает значение
argc - количество аргументов
Код:
335544320#Next#true#1
184680706#ShowQuestionMark#false#3
268500993#Decrement#false#2
167837697#GetSpawnDefineByNick#true#2
335544321#RandomSelectOne#true#1
302055424#GetRoomInfo#true#2
167837696#GetSpawnDefine#true#2
268500992#Increment#false#2
184877319#DeleteRadar#false#6
184680704#ShowTutorialHTML#false#3
167837699#DecreaseTotal#true#2
234946563#IncCount#false#2
235012096#Spawn#false#3
234881026#Despawn#false#1
184877318#ShowRadar#false#6
268500994#Exchange#false#2
167837698#IncreaseTotal#true#2
268435459#GetValue#true#1
234946565#LoadDBNpcInfo#false#2
184615172#CloseTutorialHTML#false#2
184811777#ShowTutorialHTML2#false#5
234946564#DecCount#true#2
235077638#SendScriptEvent#false#4
167903236#AddTimerEx#false#3
268566532#CompareExchange#true#3
234946567#SetDBLoaded#false#2
184680709#EnableTutorialEvent#false#3
235470849#SpawnEx#false#10
234946568#RegToRespawnTimer#false#2
184680712#DeleteAllRadar#false#3
184942859#EvolvePet#false#7
184811786#CreatePet#false#5
184680716#DestroyPet#false#3
184615183#TB_RegisterMember#false#2
184680717#RideWyvern#false#3
184615182#TB_RegisterPledge#false#2
184680722#TB_GetPledgeRegisterStatus#false#3
184615184#TB_GetNpcType#false#2
184615187#TB_GetBattleRoyalPledgeList#false#2
184680721#TB_SetNpcType#false#3
184680726#ChangeSubJob#false#3
184746263#RenewSubJob#false#4
184746260#GetSubJobList#false#4
184680725#CreateSubJob#false#3
184615195#OpenSiegeInfo#false#2
184680734#SetControlTowerLevel#false#3
184680735#GetControlTowerLevel#false#3
184680732#SetDoorHpLevel#false#3
184680733#GetDoorHpLevel#false#3
184549667#GetHateInfoCount#true#1
184877345#AddHateInfo#false#6
184615207#GetMaxHateInfo#true#2
184680746#RemoveAllHateInfoIF#false#3
184615209#RemoveHateInfoByCreature#false#2
184549675#Lotto_GetState#true#1
184746287#Lotto_BuyTicket#false#4
184549677#Lotto_GetRoundNumber#true#1
184746286#Lotto_ShowBuyingPage#false#4
184549680#Lotto_GetAccumulatedReward#true#1
184615217#Lotto_MakeFinalRewardFHTML#false#2
184680754#Lotto_ShowPrevRewardPage#false#3
184680755#Lotto_GiveReward#false#3
184680759#GetMaxSellableCount#true#3
184549685#Lotto_GetChosenNumber#true#1
184680756#Lotto_ShowCurRewardPage#false#3
184680762#GetCurrentSeedPrice#true#3
184680763#GetNextSeedSellCountSet#true#3
184680760#GetCurrentSeedSellCountSet#true#3
184680761#GetCurrentSeedRemainCount#true#3
184680767#GetSeedDefaultPrice#true#3
184680764#GetNextSeedPrice#true#3
184680770#GetProcurementType#true#3
184680771#GetRemainProcureCropCount#true#3
184680768#GetProcurementRate#true#3
184680769#GetProcurementCount#true#3
184680774#GetNextProcurementType#true#3
184680772#GetNextProcurementRate#true#3
184680773#GetNextProcurementCount#true#3
184680778#ShowSellSeedList#false#3
184680779#ShowProcureCropList#false#3
184680777#GetCropClassidByOrderNum#true#3
184680783#ShowSeedSetting#false#3
184746317#ShowCropInfo#false#4
184746316#ShowSeedInfo#false#4
184615246#ShowManorDefaultInfo#false#2
184680784#ShowCropSetting#false#3
184549714#GetSSQRoundNumber#true#1
184549715#GetSSQStatus#true#1
184680785#ShowProcureCropDetail#false#3
184549716#GetSSQWinner#true#1
184615253#GetSSQSealOwner#true#2
184746331#GetDepositedSSQItemCount#true#4
184811870#DeleteDepositedSSQItem#false#5
184615258#GetTimeOfSSQ#true#2
184942941#DepositSSQItemEx#true#7
184615263#GetTicketBuyCount#true#2
184942937#AddSSQMember#true#7
184615265#GetSSQPart#true#2
184942951#AddTimeAttackRecord#false#7
184680800#SetTicketBuyCount#false#3
184811878#GetTimeAttackRecordInfo#true#5
184615267#IsJoinableToDawn#true#2
184615269#RegisterToEventListener#false#2
184746347#AddTimeAttackFee#false#4
184680810#GetPartyFromEventRoom#true#3
184746345#ClearEventRoom#false#4
184746344#AddPartyToEventRoom#true#4
184811887#GiveTimeAttackReward#false#5
184680814#GetTimeAttackRewardFlag#true#3
184615276#GetTimeAttackFee#true#2
184680813#IsWinnerOfTimeAttackEvent#true#3
184680818#CreateBingoBoard#false#3
184615281#GetAngleFromTarget#true#2
184680823#IsSelectedBingoNumber#true#3
184680820#GetNumberFromBingoBoard#true#3
184942960#TeleportParty#false#7
184680821#SelectBingoNumber#false#3
184615286#GetBingoSelectCount#true#2
184746363#AddLog#false#4
184615289#ClearBingoBoard#false#2
184811900#AddLogEx#false#5
184615288#GetMatchedBingoLineCount#true#2
184549754#CanLotto#true#1
184615293#IsNewbie#true#2
184680831#ShowQuestMark#false#3
184615294#ShowQuestInfoList#false#2
184746369#GetHTMLCookie#true#4
184746368#SetHTMLCookie#false#4
184615301#GetOlympiadPoint#true#2
184615300#AddOlympiad#false#2
184877443#GetCloestPositionList#true#6
184615303#AddClassFreeOlympiad#false#2
184615302#IsMainClass#true#2
184549768#GetOlympiadWaitingCount#true#1
184549769#GetClassFreeOlympiadWaitingCount#true#1
184615306#RemoveOlympiad#false#2
184615311#GetStatusForOlympiadField#true#2
184680844#GetRankByOlympiadRankOrder#true#3
184680845#GetNameByOlympiadRankOrder#true#3
184615313#GetPlayer2ForOlympiadField#true#2
184680850#ObserveOlympiad#false#3
184615312#GetPlayer1ForOlympiadField#true#2
184615315#SetNobless#false#2
184615317#GetPreviousOlympiadPoint#true#2
184680854#DeletePreviousOlympiadPoint#false#3
184615316#SetHero#false#2
184549784#GetMyMaker#true#1
184615321#SetEnchantOfWeapon#false#2
184549787#RemoveAllDesire#false#1
184615325#ChangeMoveType#false#2
184615324#GetPartyFromID#true#2
184680864#UpdatePCCafePoint#true#3
184877473#GiveItemByPCCafePoint#false#6
251658240#Next#true#1
184614913#IsNullCreature#true#2
285278209#SetParty#false#2
218169344#Rand#true#2
218365957#SendMakerScriptEvent#false#5
285278208#GetMemberID#true#2
218103809#GetTimeOfDay#true#1
318832640#GetPosition#true#2
251658242#RandomSelectOne#true#1
184614915#IsNullHateInfo#true#2
285212674#Clear#false#1
218169347#GetNpcMaker#true#2
251789313#SetInfo#false#3
218169346#GetL2Time#true#2
218103812#AllocCodeInfoList#true#1
285212676#PartyChanged#true#1
184680455#AddMoveAroundDesire#false#3
184614916#IsNullParty#true#2
218234887#CreateRoomInfoList#true#3
218169350#GetNPCFromID#true#2
218169353#Announce#false#2
218234890#GetDateTime#true#3
218169352#GetRoomInfoList#true#2
218169355#IsNull#true#2
184745993#AddAttackDesire#false#4
184680456#AddDoNothingDesire#false#3
218431503#InstantTeleportEx#false#6
218234894#IsSameString#true#3
184745998#AddFleeDesireEx#false#4
184680463#AddFollowDesire#false#3
184811530#AddAttackDesireEx#false#5
184680461#AddFleeDesire#false#3
218300428#SendScriptEvent#false#4
184811540#AddMoveToDesire#false#5
184811541#AddEffectActionDesire#false#5
184811543#AddMoveToTargetDesire#false#5
185008147#AddUseSkillDesireEx#false#8
184811537#AddMoveToWayPointDesire#false#5
184877074#AddUseSkillDesire#false#6
184614934#AddPetDefaultDesire_Follow#false#2
184549401#RemoveAllAttackDesire#false#1
184614938#RemoveAttackDesire#false#2
184746008#AddMoveSuperPointDesire#false#4
184549403#RandomizeAttackDesire#false#1
184549405#GetTopDesireValue#true#1
184549406#GetLifeTime#true#1
184746012#MakeAttackEvent#false#4
184549407#GetTick#true#1
184549408#GetCurrentTick#true#1
184614945#GetDirection#true#2
184746019#SetCookie#false#4
184680487#AddTimerEx#false#3
184680484#GetCookie#true#3
184549414#StopMove#false#1
184746021#SetTeleportPosOnLost#false#4
184614953#GetIndexFromCreature#true#2
184614955#GetCreatureFromID#true#2
184614954#GetCreatureFromIndex#true#2
184614956#IsStaticObjectID#true#2
184614959#GetStaticObjectFromID#true#2
184614961#UnregisterGlobalMap#false#2
184614963#GetSummon#true#2
184680496#RegisterGlobalMap#false#3
184614962#GetGlobalMap#true#2
184746039#BroadcastScriptEvent#false#4
184549428#GetTimeHour#true#1
184614966#LookNeighbor#false#2
184680501#Summon_SetOption#false#3
184549433#GetPathfindFailCount#true#1
184614971#CanAttack#true#2
184614973#Say#false#2
184549436#IsSpoiled#true#1
184811576#BroadcastScriptEventEx#false#5
184680515#ShoutEx#false#3
184614976#EquipItem#false#2
185073739#Teleport#false#9
184614978#Shout#false#2
184680513#Talk#false#3
184680518#ShowSystemMessageStr#false#3
184746055#BroadcastSystemMessage#false#4
184680516#ShowPage#false#3
184680517#ShowSystemMessage#false#3
184811596#InstantTeleport#false#5
184680522#ShowTelPosListPage#false#3
184942670#SellPreview#false#7
184942671#Sell#false#7
184549453#InstantRandomTeleportInMyTerritory#false#1
185008201#ShowSysMsgToParty2#false#8
184680529#ShowMultisell#false#3
184614997#StaticObjectDistFromMe#true#2
184614996#DistFromMe#true#2
184942672#Buy#false#7
184614999#SetTimerPeriod#false#2
184680536#GetWayPointDelay#true#3
184615003#OpenHennaListForUnquip#false#2
184680537#ChangeStopType#false#3
184615002#OpenHennaItemListForEquip#false#2
184615005#FloatToInt#true#2
184680543#HaveMemo#true#3
184615004#IntToStr#true#2
184615006#GetMemoCount#true#2
184680547#GetMemoState#true#3
184680544#SetMemo#false#3
184746081#SetMemoState#false#4
184746087#SetFlagJournal#false#4
184746086#SetJournal#false#4
184811618#SetMemoStateEx#false#5
184680549#RemoveMemo#false#3
184746084#GetMemoStateEx#true#4
184615017#SetCurrentQuestID#false#2
184680554#GetOneTimeQuestFlag#true#3
184746091#SetOneTimeQuestFlag#false#4
184680558#SetDBValue#false#3
184680559#HavePledgePower#true#3
184680556#GetInventoryInfo#true#3
184680557#GetAbnormalLevel#true#3
184615024#Party_GetCount#true#2
184615027#GetLeaderOfParty#true#2
184680561#Party_GetCreature#true#3
184615026#Party_GetLeader#true#2
184680564#GetMemberOfParty#true#3
184615033#GetParty#true#2
184615032#Pledge_GetLeader#true#2
184615035#GetPledgeByIndex#true#2
184615034#GetPledge#true#2
184746111#GiveItem1#false#4
184746110#OwnItemCountEx#true#4
184680579#OwnItemCount#true#3
184746114#DeleteItem1#false#4
184746112#DropItem1#false#4
184680582#FHTML_SetFileName#false#3
184746119#FHTML_SetInt#false#4
184549509#GetLastAttacker#true#1
184811649#DropItem2#false#5
184680580#GetItemData#true#3
184680586#ShowFHTML#false#3
184746121#FHTML_SetStr#false#4
184615053#GetPledgeSkillLevel#true#2
184942731#MakeFString#true#7
184615062#IsMyLord#true#2
184549527#Castle_GetPledgeName#true#1
184549528#Castle_GetOwnerName#true#1
184549529#Castle_GetSiegeTime#true#1
184549530#Residence_GetTaxRate#true#1
184549531#Residence_GetTaxRateCurrent#true#1
184615068#Residence_SetTaxRate#false#2
184680610#Residence_VaultSaveMoney#false#3
184680609#Residence_VaultTakeOutMoney#false#3
184615077#Castle_GateOpenClose#false#2
184549543#Castle_IsUnderSiege#true#1
184615078#Castle_GetPledgeState#true#2
184549546#Castle_BanishOthers#false#1
184549549#Castle_GetRawSiegeTime#true#1
184549550#Castle_GetRawSystemTime#true#1
184549553#Castle_GetPledgeId#true#1
184680624#Castle_GateOpenClose2#false#3
184549554#Castle_GetLifeControlLevel#true#1
184746167#Agit_SetDeco#false#4
184549557#Agit_GetCostFailDay#true#1
184615097#Agit_GetDecoLevel#true#2
184680632#Agit_ResetDeco#false#3
184615098#Agit_GetDecoExpire#true#2
184680638#Agit_GetDecoFee#true#3
184680639#Area_SetOnOff#false#3
184680637#Agit_GetDecoDay#true#3
184680642#ShowSkillList#false#3
184680640#AddChoice#false#3
184615107#ShowEnchantSkillList#false#2
184680641#ShowChoicePage#false#3
184680646#ShowEnchantSkillMessage#false#3
184746180#ShowGrowSkillMessage#false#4
184746187#ShowEtcSkillList#false#4
184811724#ShowGrowEtcSkillMessage#false#5
184680656#IsInCategory#true#3
184549586#Residence_GetTaxIncome#true#1
184680657#ClassChange#false#3
184549587#Residence_GetTaxIncomeReserved#true#1
184549588#Manor_GetSeedIncome#true#1
184549589#IsManorSettingTime#true#1
184615127#Skill_GetConsumeHP#true#2
184615129#Skill_GetEffectPoint#true#2
184615128#Skill_GetConsumeMP#true#2
184615131#Skill_GetAbnormalType#true#2
184615130#Skill_GetAttribute#true#2
184615133#Skill_InReuseDelay#true#2
184680670#UseSkill#false#3
184746211#UseSpiritShot#false#4
184811750#CreateOnePrivate#false#5
184615138#UseSoulShot#false#2
184615141#CreatePrivates#false#2
184615140#SetPrivateID#false#2
184746219#IncrementParam#false#4
184549609#Maker_GetNpcCount#true#1
184615146#Maker_FindNpcByKey#true#2
185270503#CreateOnePrivateEx#false#12
184746223#EffectMusic#false#4
184746222#VoiceEffect#false#4
184680685#SoundEffect#false#3
184549616#Despawn#false#1
185008375#EarthQuakeByNPC#false#8
184549617#Suicide#false#1
184811765#InstantTeleportInMyTerritory#false#5
185270521#SpecialCamera#false#12
184615156#InMyTerritory#true#2
184811768#EarthQuakeToParty#false#5
184615167#StrToInt#true#2
184680700#PledgeLevelUp#false#3
 
Все не дает мне покоя список variable_begin, у хендлеров класса.
Гипотеза:
Список полей указанных, в variablе, сохраняются при вызове супер хендлера и восстанавливаются предыдущие значения при возврате. Так как возможна перезапись этих полей в контексте одного аи, в супер хендлере.
 
Набор идиом для преобразования в промежуточное представление

Определение:
Идиома - последовательность инструкций, которая имеет логический смысл, который не может быть получен из отдельных инструкций.

Соглашение о нотации
% - операнды
$ - подстановочное значение

Будем использовать набор идиом для преобразования стекового машинного кода в промежуточный код, с трех адресным набором инструкций, регистровая машина.

getfield %id1, %id2, %id3

%id1 - куда записывается результат. Результатом является объект типа поля.
%id2 - смещение поля
%id3 - объект с которого берется поле.

Данная инструкция берет поле из объекта %id3 по смещению %id2 и записывает значение в %id1

Пример 1
Код:
push_event
push_const %d
add
fetch_$t

$t - набор из i, i4, d, f.

Результат:
getfield N, %d, event

N - индекс в таблице символов.
%d - константа из команды push_const
event - базовый объект события

Валидация:
%d должно быть целочисленным значением, больше нуля.

Примечание:
Тип взятие значению по адресу может использоваться в анализе потока данных, для восстановления структур.

Пример 2
Код:
getfield %id1, %id2, %id3
push_const %d
fetch_$t
$t - набор из i, i4, d, f
Результат
getfield %id4, %d, %id1

Далее буду пополнять набор идиом для преобразования.
 
Последнее редактирование:
  • Мне нравится
Реакции: kick
Назад
Сверху Снизу