From 6f2ffcdef793587e53723a4664ed1004bec2ba5a Mon Sep 17 00:00:00 2001 From: Connor Olding Date: Thu, 7 Sep 2017 22:11:57 +0000 Subject: [PATCH] fix frameskip stuff and give mario an extra life --- main.lua | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/main.lua b/main.lua index 36ceb39..1df0544 100644 --- a/main.lua +++ b/main.lua @@ -513,7 +513,7 @@ local function handle_tiles() end local function prepare_epoch() - print('preparing epoch '..tostring(epoch_i)..'. this might take a while.') + print('preparing epoch '..tostring(epoch_i)..'.') base_params = network:collect() empty(trial_noise) empty(trial_rewards) @@ -633,7 +633,7 @@ local function do_reset() local state = get_state() -- be a little more descriptive. if state == 'dead' and get_timer() == 0 then state = 'timeup' end - print("resetting in state: "..state..". reward:", reward) + print("reward:", reward, "("..state..")") if trial_i >= 0 then trial_rewards[trial_i] = reward end @@ -653,7 +653,7 @@ local function do_reset() -- set lives to 0. you only got one shot! -- unless you get a 1-up, in which case, please continue! - W(0x75A, 0) + W(0x75A, 1) --max_time = min(log(epoch_i) * 10 + 100, cap_time) max_time = min(8 * sqrt(360 / epoch_trials * (epoch_i - 1)) + 100, cap_time) @@ -695,12 +695,33 @@ init() local dummy_softmax_values = {0, 0} local function doit(dummy) + local ingame_paused = get_state() == "paused" + + -- every few frames mario stands still, forcibly decrease the timer. + -- this includes having the game paused. + -- TODO: more robust. doesn't detect moonwalking against a wall. + local timer = get_timer() + if ingame_paused or random() > 1 - timer_loser and R(0x1D) == 0 and R(0x57) == 0 then + timer = timer - 1 + end + timer = clamp(timer, 0, max_time) + if enable_network then + set_timer(timer) + end + + local tf0 = total_frames % 1000 + local tf1 = (total_frames % 1000000 - tf0) / 1000 + local tf2 = (total_frames - tf0 - tf1) / 10000000 + gui.text(12, 212, ("%03i,%03i,%03i"):format(tf2,tf1,tf0), '#FFFFFF', '#0000003F') + screen_scroll_delta = screen_scroll_delta + R(0x775) if dummy == true then gui.text(96, 16, ("%+4i"):format(reward), '#FFFFFF', '#0000003F') return end + total_frames = total_frames + frameskip + empty(sprite_input) empty(tile_input) empty(extra_input) @@ -724,8 +745,6 @@ local function doit(dummy) handle_misc() handle_tiles() - local ingame_paused = get_state() == "paused" - local coins = R(0x7ED) * 10 + R(0x7EE) local coins_delta = coins - coins_old -- handle wrap-around. @@ -762,18 +781,6 @@ local function doit(dummy) --if ingame_paused then reward = reward - 1 end if ingame_paused then reward = reward - 402; reset = true end - -- every few frames mario stands still, forcibly decrease the timer. - -- this includes having the game paused. - -- TODO: more robust. doesn't detect moonwalking against a wall. - local timer = get_timer() - if ingame_paused or random() > 1 - timer_loser and R(0x1D) == 0 and R(0x57) == 0 then - timer = timer - 1 - end - timer = clamp(timer, 0, max_time) - if enable_network then - set_timer(timer) - end - -- if we've run out of time while the game is paused... -- that's cheating! unpause. force_start = ingame_paused and timer == 0