p_x, p_y = 24,16 step_timer = 0 player_sprite_number = 50 the_map = {} function crystals(story_state) add(inventory, make_item(library.item_blueprints.crystal)) change_screen(screen_conversation({{ph_p, "you can use these crystals for a lot."}})) sfx(9) toast("received crystal!") end the_map["5,0"]=crystals the_map["6,0"]=crystals function barrel(story_state) sfx(1) change_screen(screen_conversation({{ph_p, "it's a barrel!"}})) end the_map["2,1"]=barrel the_map["10,10"]=barrel the_map["3,1"]=function() -- the atelier! sfx(4) change_screen(screen_workbench) end the_map["12,1"]=function() --at the well. give us ssome water add(inventory, make_item(library.item_blueprints.well_water)) change_screen(screen_conversation({{ph_p, "slurp!"}})) toast("received water!") sfx(0) end the_map["3,10"] = script_charcoal_seller the_map["11,5"] = script_neighbor the_map["9,5"] = script_lenore the_map["9,8"] = script_library the_map["11,13"] = script_witch function herbs(story_state) add(inventory, make_item(library.item_blueprints.herb)) change_screen(screen_conversation({ {ph_p, "ooh, healing herbs! i'll take some. not more than 1/3 the patch though!"} })) sfx(8) toast("received herbs!") end the_map["13,12"] = herbs the_map["14,12"] = herbs the_map["12,13"] = herbs the_map["13,13"] = herbs the_map["14,13"] = herbs the_map["12,14"] = herbs the_map["13,14"] = herbs the_map["14,14"] = herbs function beach(story_state) add(inventory, make_item(library.item_blueprints.sand)) change_screen(screen_conversation({ {ph_p, "how many grains of sand does it take before it becomes a pile?"} })) sfx(6) toast("received sand!") end the_map["3,15"] = beach the_map["4,15"] = beach the_map["5,15"] = beach the_map["6,15"] = beach the_map["7,15"] = beach function interact(x, y) result = the_map[flr(x) .. "," .. flr(y)] if result ~= nil then result(story) end end function flags_from_xy(x, y) return fget(mget(x/8, 16+y/8)) end function walkaround_update() moved=false dx, dy = 0, 0 if btn(0) then dx = -1 end if btn(1) then dx = 1 end if btn(2) then dy = -1 end if btn(3) then dy = 1 end if dx == -1 then flip_x, up, down = true, false, false end if dx == 1 then flip_x, up, down = false, false, false end if dy == -1 then up, down = true, false end if dy == 1 then up, down = false, true end if dx ~= 0 or dy ~= 0 then moved = true end if flags_from_xy(p_x + dx, p_y + dy) & 0x80 == 0 then p_x, p_y = p_x + dx, p_y + dy end if moved then t_x, t_y = p_x + 8*dx, p_y + 8*dy elseif up then t_x, t_y = p_x, p_y - 8 elseif down then t_x, t_y = p_x, p_y + 8 elseif flip_x then t_x, t_y = p_x - 8, p_y else t_x, t_y = p_x + 8, p_y end if btnp(4) then interact(t_x/8, t_y/8) end end function walkaround_draw() cls() rectfill(8,8,120,120,3) map(0,16,0,0,16,16) -- draw the town map update_player_sprite() spr(player_sprite_number, p_x-4, p_y-8, 1,1, flip_x) map(0,16,0,0,16,16, 0x40) -- redraw the tiles which are supposed to appear over the player! (flag 6) end function update_player_sprite() if up then player_sprite_number = 52 + (player_sprite_number % 2) elseif down then player_sprite_number = 50 + (player_sprite_number % 2) else player_sprite_number = 48 + (player_sprite_number % 2) end if moved then step_timer += 1 if step_timer > 4 then step_timer = 0 if player_sprite_number % 2 == 0 then player_sprite_number += 1 elseif player_sprite_number % 2 ~= 0 then player_sprite_number -= 1 end end end end screen_walkaround = {update=walkaround_update, draw=walkaround_draw} screen_walkaround = screen_conversation({ {ph_p, [[oh, and this is the town! all sorts of things to do here.]]}, {ph_p, [[like i could go get water from the well to the east,]]}, {ph_p, [[or pick up some charcoal from the red house to the southwest!]]}, {ph_p, [[just face a building and press 🅾️!]]} }, function() screen_walkaround = {draw=walkaround_draw, update=walkaround_update} change_screen(screen_walkaround) end, screen_walkaround) fireworks = {} stars = {} drag = 0.1 fireworks_frequency = 8 function work(f) if f == nil or f.vx == nil or f.vy == nil or f.x == nil or f.y == nil then return 0 end -- why is this necessary. local vel = sqrt(f.vx*f.vx + f.vy*f.vy) f.x += f.vx f.y += f.vy f.vx = f.vx*(1-(drag*vel)) f.vy = f.vy*(1-(drag*vel)) return vel end function fireworks_update() walkaround_update() local new_fireworks = {} local new_stars = {} if rnd(100) < fireworks_frequency then add(new_fireworks, { x=rnd(128), y=rnd(112)+16, vx=rnd(0.4)-0.2, vy=-5+rnd(1), c=rnd({10, 8, 7}) }) end for f in all(fireworks) do local v = work(f) if (v < 0.2 or v > 100) and (f.x ~= nil and f.y ~= nil and f.c ~= nil) then for i=1,10 do local theta = rnd(2) add(new_stars,{ x=f.x, y=f.y, vx=sin(theta)*2, vy=cos(theta)*2, c=f.c }) end sfx(8) else add(new_fireworks, f) end end for s in all(stars) do local v = work(s) if v > 0.2 and v < 100 then add(new_stars, s) end end fireworks = new_fireworks stars = new_stars end function fireworks_draw() walkaround_draw() for f in all(fireworks) do circfill(f.x, f.y, 1, f.c) end for s in all(stars) do circfill(s.x, s.y, 1, s.c) end end