fix frameskip stuff and give mario an extra life

This commit is contained in:
Connor Olding 2017-09-07 22:11:57 +00:00
parent 3b4e195ae6
commit 6f2ffcdef7

View file

@ -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