UnderminersTeam / UndertaleModTool

The most complete tool for modding, decompiling and unpacking Undertale (and other Game Maker: Studio games!)
GNU General Public License v3.0
1.07k stars 205 forks source link

(Undertale Yellow) Compiler/Decompiler messes up gml_Object_obj_mainmenu_debug_Step_0 #1576

Open 32th-System opened 6 months ago

32th-System commented 6 months ago

Describe the bug

Attempting to recompile gml_Object_obj_mainmenu_debug_Step_0 results in the wrong code. In this wrong code, using the left and right arrow keys on the FOLLOWER and ROOM options freezes the game Original code from the decompiler

if live_call()
    return global.live_result;
scr_get_input()
if global.down_keyp
{
    if (menu_selection < 8)
        menu_selection += 1
    else
        menu_selection = 0
    audio_play_sound(snd_mo_pop, 1, false)
}
if global.up_keyp
{
    if (menu_selection > 0)
        menu_selection -= 1
    else
        menu_selection = 8
    audio_play_sound(snd_mo_pop, 1, false)
}
switch menu_selection
{
    case 0:
        if keyboard_multicheck_pressed(0)
            scr_loadgame()
        break
    case 1:
        var i = 0
        while (i < array_length(route_list))
        {
            if (route_selection == route_list[i])
            {
                if global.left_keyp
                {
                    if (i > 0)
                        route_selection = route_list[(i - 1)]
                    else
                        route_selection = route_list[(array_length(route_list) - 1)]
                    break
                }
                else if global.right_keyp
                {
                    if (i < (array_length(route_list) - 1))
                        route_selection = route_list[(i + 1)]
                    else
                        route_selection = route_list[0]
                    break
                }
                else
                {
                    i++
                    continue
                }
            }
            else
            {
                i++
                continue
            }
        }
        break
    case 2:
        if (global.left_keyp || global.right_keyp)
        {
            if (bonus_items == 1)
                bonus_items = 0
            else
                bonus_items = 1
            break
        }
        else
            break
    case 3:
        i = 0
        while (i < array_length(follower_list))
        {
            if (follower_selection == follower_list[i])
            {
                if global.left_keyp
                {
                    if (i > 0)
                        follower_selection = follower_list[(i - 1)]
                    else
                        follower_selection = follower_list[(array_length(follower_list) - 1)]
                    break
                }
                else if global.right_keyp
                {
                    if (i < (array_length(follower_list) - 1))
                        follower_selection = follower_list[(i + 1)]
                    else
                        follower_selection = follower_list[0]
                    break
                }
                else
                {
                    i++
                    continue
                }
            }
            else
            {
                i++
                continue
            }
        }
        break
    case 4:
        var hold_left = 0
        if global.left_key
        {
            hold_delay_left -= 1
            if (hold_delay_left <= 0)
            {
                hold_left = 1
                hold_delay_left = hold_delay_max
            }
        }
        else
        {
            hold_delay_left = (hold_delay_max * 4)
            hold_left = 0
        }
        var hold_right = 0
        if global.right_key
        {
            hold_delay_right -= 1
            if (hold_delay_right <= 0)
            {
                hold_right = 1
                hold_delay_right = hold_delay_max
            }
        }
        else
        {
            hold_delay_right = (hold_delay_max * 4)
            hold_right = 0
        }
        var room_index_current = ds_list_find_index(room_list, room_selection)
        i = 0
        while (i < ds_list_size(room_list))
        {
            if (global.left_keyp || hold_left)
            {
                if (room_index_current > 0)
                    room_selection = ds_list_find_value(room_list, (room_index_current - 1))
                else
                    room_selection = ds_list_find_value(room_list, (ds_list_size(room_list) - 1))
                break
            }
            else if (global.right_keyp || hold_right)
            {
                if (room_index_current < (ds_list_size(room_list) - 1))
                    room_selection = ds_list_find_value(room_list, (room_index_current + 1))
                else
                    room_selection = ds_list_find_value(room_list, 0)
                break
            }
            else
            {
                i++
                continue
            }
        }
        break
    case 5:
        if keyboard_multicheck_pressed(0)
        {
            var world_value = 0
            scr_initialize()
            new_room = asset_get_index(room_selection)
            xx = 320
            yy = 240
            global.party_member = follower_selection
            switch route_selection
            {
                case "PACIFIST":
                    global.route = 2
                    break
                case "NEUTRAL":
                    global.route = 1
                    break
                case "GENO":
                    global.route = 1
                    break
            }

            if (bonus_items == 1)
            {
                global.player_weapon = "Wild Revolver"
                global.player_armor_modifier = "Fancy Holster"
                global.player_armor_modifier_defense = script_execute(gml_Script_scr_determine_armor_modifier_defense)
                global.player_weapon_modifier_attack = script_execute(gml_Script_scr_determine_weapon_modifier_attack)
            }
            obj_pl.x = xx
            obj_pl.y = yy
            obj_pl.direction = 90
            obj_pl.image_alpha = 1
            room = new_room
            if (global.party_member != noone)
                instance_create(obj_pl.x, obj_pl.y, global.party_member)
        }
        break
    case 6:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            cutscene_battle_initiate("ceroba", "true", 0)
            instance_create_depth(0, 0, -1000, obj_ceroba_debugger)
        }
        break
    case 7:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            global.battle_enemy_name = "flowey"
            global.battling_boss = 1
            global.battle_start = 1
            global.sound_carry_overworld = 0
            room_goto(rm_battle_flowey)
            global.death_count[7] = 1
            alarm[0] = 1
            persistent = true
            global.cutscene = true
            obj_pl.image_alpha = 0
            global.flag[15] = 3
            global.dunes_flag[24] = 2
            global.sworks_flag[20] = 3
            global.sworks_flag[31] = 3
            global.flag[17] = 2
            global.dunes_flag[40] = 1
        }
        if keyboard_multicheck_pressed(1)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            global.battling_boss = 1
            global.battle_start = 1
            global.sound_carry_overworld = 0
            room_goto(rm_battle_flowey_phase_2)
            global.cutscene = true
            obj_pl.image_alpha = 0
        }
        break
    case 8:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            cutscene_battle_initiate("martlet genocide final", "true", 0)
            instance_create_depth(0, 0, -1000, obj_martlet_debugger)
        }
}

Original disassembly

.localvar 2 arguments
.localvar 31 i 14121
.localvar 15985 hold_left 14122
.localvar 15986 hold_right 14123
.localvar 15987 room_index_current 14124
.localvar 14688 world_value 14125

:[0]
call.i gml_Script_live_call(argc=0)
conv.v.b
bf [2]

:[1]
pushglb.v global.live_result
ret.v

:[2]
call.i gml_Script_scr_get_input(argc=0)
popz.v
pushglb.v global.down_keyp
conv.v.b
bf [7]

:[3]
push.v self.menu_selection
pushi.e 8
cmp.i.v LT
bf [5]

:[4]
push.v self.menu_selection
pushi.e 1
add.i.v
pop.v.v self.menu_selection
b [6]

:[5]
pushi.e 0
pop.v.i self.menu_selection

:[6]
pushi.e 0
conv.i.v
pushi.e 1
conv.i.v
pushi.e 260
conv.i.v
call.i audio_play_sound(argc=3)
popz.v

:[7]
pushglb.v global.up_keyp
conv.v.b
bf [12]

:[8]
push.v self.menu_selection
pushi.e 0
cmp.i.v GT
bf [10]

:[9]
push.v self.menu_selection
pushi.e 1
sub.i.v
pop.v.v self.menu_selection
b [11]

:[10]
pushi.e 8
pop.v.i self.menu_selection

:[11]
pushi.e 0
conv.i.v
pushi.e 1
conv.i.v
pushi.e 260
conv.i.v
call.i audio_play_sound(argc=3)
popz.v

:[12]
push.v self.menu_selection
dup.v 0
pushi.e 0
cmp.i.v EQ
bt [22]

:[13]
dup.v 0
pushi.e 1
cmp.i.v EQ
bt [25]

:[14]
dup.v 0
pushi.e 2
cmp.i.v EQ
bt [40]

:[15]
dup.v 0
pushi.e 3
cmp.i.v EQ
bt [49]

:[16]
dup.v 0
pushi.e 4
cmp.i.v EQ
bt [64]

:[17]
dup.v 0
pushi.e 5
cmp.i.v EQ
bt [94]

:[18]
dup.v 0
pushi.e 6
cmp.i.v EQ
bt [107]

:[19]
dup.v 0
pushi.e 7
cmp.i.v EQ
bt [110]

:[20]
dup.v 0
pushi.e 8
cmp.i.v EQ
bt [115]

:[21]
b [117]

:[22]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [24]

:[23]
call.i gml_Script_scr_loadgame(argc=0)
popz.v

:[24]
b [117]

:[25]
pushi.e 0
pop.v.i local.i

:[26]
pushloc.v local.i
push.v self.route_list
call.i array_length(argc=1)
cmp.v.v LT
bf [39]

:[27]
push.v self.route_selection
pushi.e -1
pushloc.v local.i
conv.v.i
push.v [array]self.route_list
cmp.v.v EQ
bf [38]

:[28]
pushglb.v global.left_keyp
conv.v.b
bf [33]

:[29]
pushloc.v local.i
pushi.e 0
cmp.i.v GT
bf [31]

:[30]
pushi.e -1
pushloc.v local.i
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection
b [32]

:[31]
pushi.e -1
push.v self.route_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection

:[32]
b [39]

:[33]
pushglb.v global.right_keyp
conv.v.b
bf [38]

:[34]
pushloc.v local.i
push.v self.route_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [36]

:[35]
pushi.e -1
pushloc.v local.i
pushi.e 1
add.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection
b [37]

:[36]
pushi.e -1
pushi.e 0
push.v [array]self.route_list
pop.v.v self.route_selection

:[37]
b [39]

:[38]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [26]

:[39]
b [117]

:[40]
pushglb.v global.left_keyp
conv.v.b
bt [42]

:[41]
pushglb.v global.right_keyp
conv.v.b
b [43]

:[42]
push.e 1

:[43]
bf [48]

:[44]
push.v self.bonus_items
pushi.e 1
cmp.b.v EQ
bf [46]

:[45]
pushi.e 0
pop.v.b self.bonus_items
b [47]

:[46]
pushi.e 1
pop.v.b self.bonus_items

:[47]
b [117]

:[48]
b [117]

:[49]
pushi.e 0
pop.v.i local.i

:[50]
pushloc.v local.i
push.v self.follower_list
call.i array_length(argc=1)
cmp.v.v LT
bf [63]

:[51]
push.v self.follower_selection
pushi.e -1
pushloc.v local.i
conv.v.i
push.v [array]self.follower_list
cmp.v.v EQ
bf [62]

:[52]
pushglb.v global.left_keyp
conv.v.b
bf [57]

:[53]
pushloc.v local.i
pushi.e 0
cmp.i.v GT
bf [55]

:[54]
pushi.e -1
pushloc.v local.i
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection
b [56]

:[55]
pushi.e -1
push.v self.follower_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection

:[56]
b [63]

:[57]
pushglb.v global.right_keyp
conv.v.b
bf [62]

:[58]
pushloc.v local.i
push.v self.follower_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [60]

:[59]
pushi.e -1
pushloc.v local.i
pushi.e 1
add.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection
b [61]

:[60]
pushi.e -1
pushi.e 0
push.v [array]self.follower_list
pop.v.v self.follower_selection

:[61]
b [63]

:[62]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [50]

:[63]
b [117]

:[64]
pushi.e 0
pop.v.b local.hold_left
pushglb.v global.left_key
conv.v.b
bf [68]

:[65]
push.v self.hold_delay_left
pushi.e 1
sub.i.v
pop.v.v self.hold_delay_left
push.v self.hold_delay_left
pushi.e 0
cmp.i.v LTE
bf [67]

:[66]
pushi.e 1
pop.v.b local.hold_left
push.v self.hold_delay_max
pop.v.v self.hold_delay_left

:[67]
b [69]

:[68]
push.v self.hold_delay_max
pushi.e 4
mul.i.v
pop.v.v self.hold_delay_left
pushi.e 0
pop.v.b local.hold_left

:[69]
pushi.e 0
pop.v.b local.hold_right
pushglb.v global.right_key
conv.v.b
bf [73]

:[70]
push.v self.hold_delay_right
pushi.e 1
sub.i.v
pop.v.v self.hold_delay_right
push.v self.hold_delay_right
pushi.e 0
cmp.i.v LTE
bf [72]

:[71]
pushi.e 1
pop.v.b local.hold_right
push.v self.hold_delay_max
pop.v.v self.hold_delay_right

:[72]
b [74]

:[73]
push.v self.hold_delay_max
pushi.e 4
mul.i.v
pop.v.v self.hold_delay_right
pushi.e 0
pop.v.b local.hold_right

:[74]
push.v self.room_selection
push.v self.room_list
call.i ds_list_find_index(argc=2)
pop.v.v local.room_index_current
pushi.e 0
pop.v.i local.i

:[75]
pushloc.v local.i
push.v self.room_list
call.i ds_list_size(argc=1)
cmp.v.v LT
bf [93]

:[76]
pushglb.v global.left_keyp
conv.v.b
bt [78]

:[77]
pushloc.v local.hold_left
conv.v.b
b [79]

:[78]
push.e 1

:[79]
bf [84]

:[80]
pushloc.v local.room_index_current
pushi.e 0
cmp.i.v GT
bf [82]

:[81]
pushloc.v local.room_index_current
pushi.e 1
sub.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection
b [83]

:[82]
push.v self.room_list
call.i ds_list_size(argc=1)
pushi.e 1
sub.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection

:[83]
b [93]

:[84]
pushglb.v global.right_keyp
conv.v.b
bt [86]

:[85]
pushloc.v local.hold_right
conv.v.b
b [87]

:[86]
push.e 1

:[87]
bf [92]

:[88]
pushloc.v local.room_index_current
push.v self.room_list
call.i ds_list_size(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [90]

:[89]
pushloc.v local.room_index_current
pushi.e 1
add.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection
b [91]

:[90]
pushi.e 0
conv.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection

:[91]
b [93]

:[92]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [75]

:[93]
b [117]

:[94]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [106]

:[95]
pushi.e 0
pop.v.i local.world_value
call.i gml_Script_scr_initialize(argc=0)
popz.v
push.v self.room_selection
call.i asset_get_index(argc=1)
pop.v.v self.new_room
pushi.e 320
pop.v.i self.xx
pushi.e 240
pop.v.i self.yy
push.v self.follower_selection
pop.v.v global.party_member
push.v self.route_selection
dup.v 0
push.s "PACIFIST"@15976
cmp.s.v EQ
bt [99]

:[96]
dup.v 0
push.s "NEUTRAL"@15973
cmp.s.v EQ
bt [100]

:[97]
dup.v 0
push.s "GENO"@15975
cmp.s.v EQ
bt [101]

:[98]
b [102]

:[99]
pushi.e 2
pop.v.i global.route
b [102]

:[100]
pushi.e 1
pop.v.i global.route
b [102]

:[101]
pushi.e 1
pop.v.i global.route
b [102]

:[102]
popz.v
push.v self.bonus_items
pushi.e 1
cmp.b.v EQ
bf [104]

:[103]
push.s "Wild Revolver"@1830
pop.v.s global.player_weapon
push.s "Fancy Holster"@1841
pop.v.s global.player_armor_modifier
push.i gml_Script_scr_determine_armor_modifier_defense
conv.i.v
call.i script_execute(argc=1)
pop.v.v global.player_armor_modifier_defense
push.i gml_Script_scr_determine_weapon_modifier_attack
conv.i.v
call.i script_execute(argc=1)
pop.v.v global.player_weapon_modifier_attack

:[104]
push.v self.xx
pop.v.v 1031.x
push.v self.yy
pop.v.v 1031.y
pushi.e 90
pop.v.i 1031.direction
pushi.e 1
pop.v.i 1031.image_alpha
push.v self.new_room
pop.v.v builtin.room
pushglb.v global.party_member
pushi.e -4
cmp.i.v NEQ
bf [106]

:[105]
pushglb.v global.party_member
push.v 1031.y
push.v 1031.x
call.i gml_Script_instance_create(argc=3)
popz.v

:[106]
b [117]

:[107]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [109]

:[108]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 0
conv.b.v
push.s "true"@15988
conv.s.v
push.s "ceroba"@370
conv.s.v
call.i gml_Script_cutscene_battle_initiate(argc=3)
popz.v
pushi.e 534
conv.i.v
pushi.e -1000
conv.i.v
pushi.e 0
conv.i.v
pushi.e 0
conv.i.v
call.i instance_create_depth(argc=4)
popz.v

:[109]
b [117]

:[110]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [112]

:[111]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
push.s "flowey"@637
pop.v.s global.battle_enemy_name
pushi.e 1
pop.v.b global.battling_boss
pushi.e 1
pop.v.b global.battle_start
pushi.e 0
pop.v.b global.sound_carry_overworld
pushi.e 225
conv.i.v
call.i room_goto(argc=1)
popz.v
push.i 231612
setowner.e
pushi.e 1
conv.i.v
pushi.e -5
pushi.e 7
pop.v.v [array]self.death_count
push.i 68168
setowner.e
pushi.e 1
conv.i.v
pushi.e -1
pushi.e 0
pop.v.v [array]self.alarm
pushi.e 1
pop.v.b self.persistent
pushi.e 1
pop.v.b global.cutscene
pushi.e 0
pop.v.i 1031.image_alpha
push.i 231578
setowner.e
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 15
pop.v.v [array]self.flag
push.i 231085
setowner.e
pushi.e 2
conv.i.v
pushi.e -5
pushi.e 24
pop.v.v [array]self.dunes_flag
push.i 231495
setowner.e
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 20
pop.v.v [array]self.sworks_flag
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 31
pop.v.v [array]self.sworks_flag
push.i 231578
setowner.e
pushi.e 2
conv.i.v
pushi.e -5
pushi.e 17
pop.v.v [array]self.flag
push.i 231085
setowner.e
pushi.e 1
conv.i.v
pushi.e -5
pushi.e 40
pop.v.v [array]self.dunes_flag

:[112]
pushi.e 1
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [114]

:[113]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 1
pop.v.b global.battling_boss
pushi.e 1
pop.v.b global.battle_start
pushi.e 0
pop.v.b global.sound_carry_overworld
pushi.e 235
conv.i.v
call.i room_goto(argc=1)
popz.v
pushi.e 1
pop.v.b global.cutscene
pushi.e 0
pop.v.i 1031.image_alpha

:[114]
b [117]

:[115]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [117]

:[116]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 0
conv.b.v
push.s "true"@15988
conv.s.v
push.s "martlet genocide final"@2993
conv.s.v
call.i gml_Script_cutscene_battle_initiate(argc=3)
popz.v
pushi.e 1860
conv.i.v
pushi.e -1000
conv.i.v
pushi.e 0
conv.i.v
pushi.e 0
conv.i.v
call.i instance_create_depth(argc=4)
popz.v

:[117]
popz.v

:[end]

Decompilation after recompilation

if live_call()
    return global.live_result;
scr_get_input()
if global.down_keyp
{
    if (menu_selection < 8)
        menu_selection += 1
    else
        menu_selection = 0
    audio_play_sound(snd_mo_pop, 1, false)
}
if global.up_keyp
{
    if (menu_selection > 0)
        menu_selection -= 1
    else
        menu_selection = 8
    audio_play_sound(snd_mo_pop, 1, false)
}
switch menu_selection
{
    case 0:
        if keyboard_multicheck_pressed(0)
            scr_loadgame()
        break
    case 1:
        var i = 0
        while (i < array_length(route_list))
        {
            if (route_selection == route_list[i])
            {
                if global.left_keyp
                {
                    if (i > 0)
                        route_selection = route_list[(i - 1)]
                    else
                        route_selection = route_list[(array_length(route_list) - 1)]
                }
                else if global.right_keyp
                {
                    if (i < (array_length(route_list) - 1))
                        route_selection = route_list[(i + 1)]
                    else
                        route_selection = route_list[0]
                }
                else
                {
                    i++
                    continue
                }
            }
            else
            {
                i++
                continue
            }
        }
    case 2:
        if (global.left_keyp || global.right_keyp)
        {
            if (bonus_items == 1)
                bonus_items = 0
            else
                bonus_items = 1
            break
        }
        else
            break
    case 3:
        i = 0
        while (i < array_length(follower_list))
        {
            if (follower_selection == follower_list[i])
            {
                if global.left_keyp
                {
                    if (i > 0)
                        follower_selection = follower_list[(i - 1)]
                    else
                        follower_selection = follower_list[(array_length(follower_list) - 1)]
                }
                else if global.right_keyp
                {
                    if (i < (array_length(follower_list) - 1))
                        follower_selection = follower_list[(i + 1)]
                    else
                        follower_selection = follower_list[0]
                }
                else
                {
                    i++
                    continue
                }
            }
            else
            {
                i++
                continue
            }
        }
    case 4:
        var hold_left = 0
        if global.left_key
        {
            hold_delay_left -= 1
            if (hold_delay_left <= 0)
            {
                hold_left = 1
                hold_delay_left = hold_delay_max
            }
        }
        else
        {
            hold_delay_left = (hold_delay_max * 4)
            hold_left = 0
        }
        var hold_right = 0
        if global.right_key
        {
            hold_delay_right -= 1
            if (hold_delay_right <= 0)
            {
                hold_right = 1
                hold_delay_right = hold_delay_max
            }
        }
        else
        {
            hold_delay_right = (hold_delay_max * 4)
            hold_right = 0
        }
        var room_index_current = ds_list_find_index(room_list, room_selection)
        i = 0
        while (i < ds_list_size(room_list))
        {
            if (global.left_keyp || hold_left)
            {
                if (room_index_current > 0)
                    room_selection = ds_list_find_value(room_list, (room_index_current - 1))
                else
                    room_selection = ds_list_find_value(room_list, (ds_list_size(room_list) - 1))
            }
            else if (global.right_keyp || hold_right)
            {
                if (room_index_current < (ds_list_size(room_list) - 1))
                    room_selection = ds_list_find_value(room_list, (room_index_current + 1))
                else
                    room_selection = ds_list_find_value(room_list, 0)
            }
            else
            {
                i++
                continue
            }
        }
    case 5:
        if keyboard_multicheck_pressed(0)
        {
            var world_value = 0
            scr_initialize()
            new_room = asset_get_index(room_selection)
            xx = 320
            yy = 240
            global.party_member = follower_selection
            switch route_selection
            {
                case "PACIFIST":
                    global.route = 2
                    break
                case "NEUTRAL":
                    global.route = 1
                    break
                case "GENO":
                    global.route = 1
                    break
            }

            if (bonus_items == 1)
            {
                global.player_weapon = "Wild Revolver"
                global.player_armor_modifier = "Fancy Holster"
                global.player_armor_modifier_defense = script_execute(gml_Script_scr_determine_armor_modifier_defense)
                global.player_weapon_modifier_attack = script_execute(gml_Script_scr_determine_weapon_modifier_attack)
            }
            obj_pl.x = xx
            obj_pl.y = yy
            obj_pl.direction = 90
            obj_pl.image_alpha = 1
            room = new_room
            if (global.party_member != noone)
                instance_create(obj_pl.x, obj_pl.y, global.party_member)
        }
        break
    case 6:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            cutscene_battle_initiate("ceroba", "true", 0)
            instance_create_depth(0, 0, -1000, obj_ceroba_debugger)
        }
        break
    case 7:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            global.battle_enemy_name = "flowey"
            global.battling_boss = 1
            global.battle_start = 1
            global.sound_carry_overworld = 0
            room_goto(rm_battle_flowey)
            global.death_count[7] = 1
            alarm[0] = 1
            persistent = true
            global.cutscene = true
            obj_pl.image_alpha = 0
            global.flag[15] = 3
            global.dunes_flag[24] = 2
            global.sworks_flag[20] = 3
            global.sworks_flag[31] = 3
            global.flag[17] = 2
            global.dunes_flag[40] = 1
        }
        if keyboard_multicheck_pressed(1)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            global.battling_boss = 1
            global.battle_start = 1
            global.sound_carry_overworld = 0
            room_goto(rm_battle_flowey_phase_2)
            global.cutscene = true
            obj_pl.image_alpha = 0
        }
        break
    case 8:
        if keyboard_multicheck_pressed(0)
        {
            scr_initialize()
            scene = 0
            cutscene_timer = 0
            cutscene_battle_initiate("martlet genocide final", "true", 0)
            instance_create_depth(0, 0, -1000, obj_martlet_debugger)
        }
}

Disassembly after recompilation

.localvar 2 arguments
.localvar 31 i 14121
.localvar 15985 hold_left 14122
.localvar 15986 hold_right 14123
.localvar 15987 room_index_current 14124
.localvar 14688 world_value 14125

:[0]
call.i gml_Script_live_call(argc=0)
conv.v.b
bf [2]

:[1]
pushglb.v global.live_result
ret.v

:[2]
call.i gml_Script_scr_get_input(argc=0)
popz.v
pushglb.v global.down_keyp
conv.v.b
bf [7]

:[3]
push.v self.menu_selection
pushi.e 8
cmp.i.v LT
bf [5]

:[4]
push.v self.menu_selection
pushi.e 1
add.i.v
pop.v.v self.menu_selection
b [6]

:[5]
pushi.e 0
pop.v.i self.menu_selection

:[6]
pushi.e 0
conv.i.v
pushi.e 1
conv.i.v
pushi.e 260
conv.i.v
call.i audio_play_sound(argc=3)
popz.v

:[7]
pushglb.v global.up_keyp
conv.v.b
bf [12]

:[8]
push.v self.menu_selection
pushi.e 0
cmp.i.v GT
bf [10]

:[9]
push.v self.menu_selection
pushi.e 1
sub.i.v
pop.v.v self.menu_selection
b [11]

:[10]
pushi.e 8
pop.v.i self.menu_selection

:[11]
pushi.e 0
conv.i.v
pushi.e 1
conv.i.v
pushi.e 260
conv.i.v
call.i audio_play_sound(argc=3)
popz.v

:[12]
push.v self.menu_selection
dup.v 0
pushi.e 0
cmp.i.v EQ
bt [22]

:[13]
dup.v 0
pushi.e 1
cmp.i.v EQ
bt [25]

:[14]
dup.v 0
pushi.e 2
cmp.i.v EQ
bt [45]

:[15]
dup.v 0
pushi.e 3
cmp.i.v EQ
bt [55]

:[16]
dup.v 0
pushi.e 4
cmp.i.v EQ
bt [75]

:[17]
dup.v 0
pushi.e 5
cmp.i.v EQ
bt [108]

:[18]
dup.v 0
pushi.e 6
cmp.i.v EQ
bt [121]

:[19]
dup.v 0
pushi.e 7
cmp.i.v EQ
bt [124]

:[20]
dup.v 0
pushi.e 8
cmp.i.v EQ
bt [129]

:[21]
b [131]

:[22]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [24]

:[23]
call.i gml_Script_scr_loadgame(argc=0)
popz.v

:[24]
b [131]

:[25]
pushi.e 0
pop.v.i local.i

:[26]
pushloc.v local.i
push.v self.route_list
call.i array_length(argc=1)
cmp.v.v LT
bf [44]

:[27]
push.v self.route_selection
pushi.e -1
pushloc.v local.i
conv.v.i
push.v [array]self.route_list
cmp.v.v EQ
bf [42]

:[28]
pushglb.v global.left_keyp
conv.v.b
bf [34]

:[29]
pushloc.v local.i
pushi.e 0
cmp.i.v GT
bf [31]

:[30]
pushi.e -1
pushloc.v local.i
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection
b [32]

:[31]
pushi.e -1
push.v self.route_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection

:[32]
b [131]

:[33]
b [41]

:[34]
pushglb.v global.right_keyp
conv.v.b
bf [40]

:[35]
pushloc.v local.i
push.v self.route_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [37]

:[36]
pushi.e -1
pushloc.v local.i
pushi.e 1
add.i.v
conv.v.i
push.v [array]self.route_list
pop.v.v self.route_selection
b [38]

:[37]
pushi.e -1
pushi.e 0
push.v [array]self.route_list
pop.v.v self.route_selection

:[38]
b [131]

:[39]
b [41]

:[40]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [26]

:[41]
b [43]

:[42]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [26]

:[43]
b [26]

:[44]
b [131]

:[45]
pushglb.v global.left_keyp
conv.v.b
bt [47]

:[46]
pushglb.v global.right_keyp
conv.v.b
b [48]

:[47]
push.e 1

:[48]
bf [54]

:[49]
push.v self.bonus_items
pushi.e 1
cmp.i.v EQ
bf [51]

:[50]
pushi.e 0
pop.v.i self.bonus_items
b [52]

:[51]
pushi.e 1
pop.v.i self.bonus_items

:[52]
b [131]

:[53]
b [55]

:[54]
b [131]

:[55]
pushi.e 0
pop.v.i local.i

:[56]
pushloc.v local.i
push.v self.follower_list
call.i array_length(argc=1)
cmp.v.v LT
bf [74]

:[57]
push.v self.follower_selection
pushi.e -1
pushloc.v local.i
conv.v.i
push.v [array]self.follower_list
cmp.v.v EQ
bf [72]

:[58]
pushglb.v global.left_keyp
conv.v.b
bf [64]

:[59]
pushloc.v local.i
pushi.e 0
cmp.i.v GT
bf [61]

:[60]
pushi.e -1
pushloc.v local.i
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection
b [62]

:[61]
pushi.e -1
push.v self.follower_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection

:[62]
b [131]

:[63]
b [71]

:[64]
pushglb.v global.right_keyp
conv.v.b
bf [70]

:[65]
pushloc.v local.i
push.v self.follower_list
call.i array_length(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [67]

:[66]
pushi.e -1
pushloc.v local.i
pushi.e 1
add.i.v
conv.v.i
push.v [array]self.follower_list
pop.v.v self.follower_selection
b [68]

:[67]
pushi.e -1
pushi.e 0
push.v [array]self.follower_list
pop.v.v self.follower_selection

:[68]
b [131]

:[69]
b [71]

:[70]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [56]

:[71]
b [73]

:[72]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [56]

:[73]
b [56]

:[74]
b [131]

:[75]
pushi.e 0
pop.v.i local.hold_left
pushglb.v global.left_key
conv.v.b
bf [79]

:[76]
push.v self.hold_delay_left
pushi.e 1
sub.i.v
pop.v.v self.hold_delay_left
push.v self.hold_delay_left
pushi.e 0
cmp.i.v LTE
bf [78]

:[77]
pushi.e 1
pop.v.i local.hold_left
push.v self.hold_delay_max
pop.v.v self.hold_delay_left

:[78]
b [80]

:[79]
push.v self.hold_delay_max
pushi.e 4
mul.i.v
pop.v.v self.hold_delay_left
pushi.e 0
pop.v.i local.hold_left

:[80]
pushi.e 0
pop.v.i local.hold_right
pushglb.v global.right_key
conv.v.b
bf [84]

:[81]
push.v self.hold_delay_right
pushi.e 1
sub.i.v
pop.v.v self.hold_delay_right
push.v self.hold_delay_right
pushi.e 0
cmp.i.v LTE
bf [83]

:[82]
pushi.e 1
pop.v.i local.hold_right
push.v self.hold_delay_max
pop.v.v self.hold_delay_right

:[83]
b [85]

:[84]
push.v self.hold_delay_max
pushi.e 4
mul.i.v
pop.v.v self.hold_delay_right
pushi.e 0
pop.v.i local.hold_right

:[85]
push.v self.room_selection
push.v self.room_list
call.i ds_list_find_index(argc=2)
pop.v.v local.room_index_current
pushi.e 0
pop.v.i local.i

:[86]
pushloc.v local.i
push.v self.room_list
call.i ds_list_size(argc=1)
cmp.v.v LT
bf [107]

:[87]
pushglb.v global.left_keyp
conv.v.b
bt [89]

:[88]
pushloc.v local.hold_left
conv.v.b
b [90]

:[89]
push.e 1

:[90]
bf [96]

:[91]
pushloc.v local.room_index_current
pushi.e 0
cmp.i.v GT
bf [93]

:[92]
pushloc.v local.room_index_current
pushi.e 1
sub.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection
b [94]

:[93]
push.v self.room_list
call.i ds_list_size(argc=1)
pushi.e 1
sub.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection

:[94]
b [131]

:[95]
b [106]

:[96]
pushglb.v global.right_keyp
conv.v.b
bt [98]

:[97]
pushloc.v local.hold_right
conv.v.b
b [99]

:[98]
push.e 1

:[99]
bf [105]

:[100]
pushloc.v local.room_index_current
push.v self.room_list
call.i ds_list_size(argc=1)
pushi.e 1
sub.i.v
cmp.v.v LT
bf [102]

:[101]
pushloc.v local.room_index_current
pushi.e 1
add.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection
b [103]

:[102]
pushi.e 0
conv.i.v
push.v self.room_list
call.i ds_list_find_value(argc=2)
pop.v.v self.room_selection

:[103]
b [131]

:[104]
b [106]

:[105]
push.v local.i
push.e 1
add.i.v
pop.v.v local.i
b [86]

:[106]
b [86]

:[107]
b [131]

:[108]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [120]

:[109]
pushi.e 0
pop.v.i local.world_value
call.i gml_Script_scr_initialize(argc=0)
popz.v
push.v self.room_selection
call.i asset_get_index(argc=1)
pop.v.v self.new_room
pushi.e 320
pop.v.i self.xx
pushi.e 240
pop.v.i self.yy
push.v self.follower_selection
pop.v.v global.party_member
push.v self.route_selection
dup.v 0
push.s "PACIFIST"@15976
cmp.s.v EQ
bt [113]

:[110]
dup.v 0
push.s "NEUTRAL"@15973
cmp.s.v EQ
bt [114]

:[111]
dup.v 0
push.s "GENO"@15975
cmp.s.v EQ
bt [115]

:[112]
b [116]

:[113]
pushi.e 2
pop.v.i global.route
b [116]

:[114]
pushi.e 1
pop.v.i global.route
b [116]

:[115]
pushi.e 1
pop.v.i global.route
b [116]

:[116]
popz.v
push.v self.bonus_items
pushi.e 1
cmp.i.v EQ
bf [118]

:[117]
push.s "Wild Revolver"@1830
pop.v.s global.player_weapon
push.s "Fancy Holster"@1841
pop.v.s global.player_armor_modifier
push.i gml_Script_scr_determine_armor_modifier_defense
conv.i.v
call.i script_execute(argc=1)
pop.v.v global.player_armor_modifier_defense
push.i gml_Script_scr_determine_weapon_modifier_attack
conv.i.v
call.i script_execute(argc=1)
pop.v.v global.player_weapon_modifier_attack

:[118]
push.v self.xx
pop.v.v 1031.x
push.v self.yy
pop.v.v 1031.y
pushi.e 90
pop.v.i 1031.direction
pushi.e 1
pop.v.i 1031.image_alpha
push.v self.new_room
pop.v.v builtin.room
pushglb.v global.party_member
pushi.e -4
cmp.i.v NEQ
bf [120]

:[119]
pushglb.v global.party_member
push.v 1031.y
push.v 1031.x
call.i gml_Script_instance_create(argc=3)
popz.v

:[120]
b [131]

:[121]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [123]

:[122]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 0
conv.i.v
push.s "true"@15988
conv.s.v
push.s "ceroba"@370
conv.s.v
call.i gml_Script_cutscene_battle_initiate(argc=3)
popz.v
pushi.e 534
conv.i.v
pushi.e -1000
conv.i.v
pushi.e 0
conv.i.v
pushi.e 0
conv.i.v
call.i instance_create_depth(argc=4)
popz.v

:[123]
b [131]

:[124]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [126]

:[125]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
push.s "flowey"@637
pop.v.s global.battle_enemy_name
pushi.e 1
pop.v.i global.battling_boss
pushi.e 1
pop.v.i global.battle_start
pushi.e 0
pop.v.i global.sound_carry_overworld
pushi.e 225
conv.i.v
call.i room_goto(argc=1)
popz.v
pushi.e 1
conv.i.v
pushi.e -5
pushi.e 7
pop.v.v [array]self.death_count
pushi.e 1
conv.i.v
pushi.e -1
pushi.e 0
pop.v.v [array]self.alarm
pushi.e 1
pop.v.i self.persistent
pushi.e 1
pop.v.i global.cutscene
pushi.e 0
pop.v.i 1031.image_alpha
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 15
pop.v.v [array]self.flag
pushi.e 2
conv.i.v
pushi.e -5
pushi.e 24
pop.v.v [array]self.dunes_flag
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 20
pop.v.v [array]self.sworks_flag
pushi.e 3
conv.i.v
pushi.e -5
pushi.e 31
pop.v.v [array]self.sworks_flag
pushi.e 2
conv.i.v
pushi.e -5
pushi.e 17
pop.v.v [array]self.flag
pushi.e 1
conv.i.v
pushi.e -5
pushi.e 40
pop.v.v [array]self.dunes_flag

:[126]
pushi.e 1
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [128]

:[127]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 1
pop.v.i global.battling_boss
pushi.e 1
pop.v.i global.battle_start
pushi.e 0
pop.v.i global.sound_carry_overworld
pushi.e 235
conv.i.v
call.i room_goto(argc=1)
popz.v
pushi.e 1
pop.v.i global.cutscene
pushi.e 0
pop.v.i 1031.image_alpha

:[128]
b [131]

:[129]
pushi.e 0
conv.i.v
call.i gml_Script_keyboard_multicheck_pressed(argc=1)
conv.v.b
bf [131]

:[130]
call.i gml_Script_scr_initialize(argc=0)
popz.v
pushi.e 0
pop.v.i self.scene
pushi.e 0
pop.v.i self.cutscene_timer
pushi.e 0
conv.i.v
push.s "true"@15988
conv.s.v
push.s "martlet genocide final"@2993
conv.s.v
call.i gml_Script_cutscene_battle_initiate(argc=3)
popz.v
pushi.e 1860
conv.i.v
pushi.e -1000
conv.i.v
pushi.e 0
conv.i.v
pushi.e 0
conv.i.v
call.i instance_create_depth(argc=4)
popz.v

:[131]
popz.v

:[end]

Reproducing steps

  1. Open gml_Object_obj_mainmenu_debug_Step_0 under Code
  2. Make the compiler recompile the code (change a single character, change it back, then click outside the code editor area)

To access this debug main menu, open gml_Object_obj_undertalelogoINTRO_Step_0, and replace this code

    if first_time
        room_goto(rm_mmfirst)
    else
        room_goto(rm_mainmenu)

with

    room_goto(rm_mainmenu_debug)

Setup Details

BenjaminUrquhart commented 6 months ago

Probably a duplicate of #235 (same symptoms and involves a while loop)

colinator27 commented 13 hours ago

This will be fixed when the new decompiler is merged in, along with an important and unrelated compiler fix I just made (which is in the same fork as the new decompiler, currently).