From 84124d7f7b111dd0e1c79de8d1b017094dc310e3 Mon Sep 17 00:00:00 2001 From: JailGamer Date: Sun, 24 May 2026 18:47:04 +0200 Subject: [PATCH] =?UTF-8?q?[CHG]=20Canviada=20una=20expressi=C3=B3=20de=20?= =?UTF-8?q?l'abad=20[FIX]=20Corregida=20col=C2=B7lisi=C3=B3=20en=20la=20fi?= =?UTF-8?q?reball=20[CHG]=20Mogut=20debug=20a=20game=5Fdebug=20[NEW]=20Sta?= =?UTF-8?q?ge=20manager=20per=20a=20gesti=C3=B3=20de=20nivells?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/abad.lua | 2 +- data/fireball.lua | 67 ++++++---- data/game.lua | 309 ++----------------------------------------- data/game_debug.lua | 156 ++++++++++++++++++++++ data/scenes.lua | 18 +-- data/stage1.lua | 25 +--- data/stage1_boss.lua | 10 +- data/stage_mgr.lua | 55 ++++++++ data/tiles.gif | Bin 12174 -> 12189 bytes 9 files changed, 277 insertions(+), 365 deletions(-) create mode 100644 data/game_debug.lua create mode 100644 data/stage_mgr.lua diff --git a/data/abad.lua b/data/abad.lua index 7cb2033..cf9f79e 100644 --- a/data/abad.lua +++ b/data/abad.lua @@ -88,7 +88,7 @@ function abad_add_mood(abad_x, spr_off_x, abad_y, spr_off_y, flip, mood) if mood~="normal" then if mood=="sorpresa" then mood_y = 0 - elseif mood=="enfadat" then + elseif mood=="sobrat" then mood_y = 4 elseif mood=="interessant" then mood_y = 8 diff --git a/data/fireball.lua b/data/fireball.lua index 2b1eb84..f3aaae8 100644 --- a/data/fireball.lua +++ b/data/fireball.lua @@ -42,6 +42,8 @@ function fireball.draw() end function fireball.update() + if fireball.hab == -1 then return end + if fireball.power==2 and fireball.power>fireball.size then fireball.wait = fireball.wait + 1 fireball.x1=abad.x+abad.bb.x+(abad.bb.w//2) @@ -78,10 +80,8 @@ function fireball.update() fireball.h=fireball.w fireball.bb = {x=0,y=0,w=4*fireball.size,h=4*fireball.size} return - end + end - - if fireball.hab == -1 then return end -- fireball.wait=fireball.wait+1 --if fireball.wait==3 then @@ -91,35 +91,46 @@ function fireball.update() -- fireball.hab=-1 -- return --end - if fireball.power==1 then - if arc_check_tile(fireball.x,fireball.y)=20 then --- parpadeig=true --- if menu_count>40 then menu_count=0 end --- end --- draw.rect(28,33+(10*(pausa_option-1)),73,9,14) --- if (not parpadeig) then draw.rect(28,33+(10*(pausa_option-1)),73,9,13) end --- --- --draw.rect(28,33+(10*(pausa_option-1)),73,9,13) --- --- draw.text("CONTINUAR",30,35,14) --- draw.text("MUSICA:",30,45,14) --- if music.enabled() then --- draw.text("SI",91,45,15) --- else --- draw.text("NO",91,45,15) --- end --- draw.text("SÓ:",30,55,14) --- if sound.enabled() then --- draw.text("SI",91,55,15) --- else --- draw.text("NO",91,55,15) --- end --- draw.text("EIXIR",30,65,14) --- --- if key.press(key.ESCAPE) then --- surf.source(back) --- draw.surf(0,0,128,96,0,0) --- surf.source(tiles) --- game_update = pause_old_update --- elseif key.press(keyDown) or pad.press(btnDown) then --- pausa_option = pausa_option + 1 --- if pausa_option == 5 then pausa_option = 1 end --- elseif key.press(keyUp) or pad.press(btnUp) then --- pausa_option = pausa_option - 1 --- if pausa_option == 0 then pausa_option = 4 end --- elseif key.press(keyShoot) or pad.press(btnShoot) then --- if pausa_option==1 then --- surf.source(back) --- draw.surf(0,0,128,96,0,0) --- surf.source(tiles) --- game_update = pause_old_update --- elseif pausa_option==2 then --- music.enabled(not music.enabled()) --- elseif pausa_option==3 then --- sound.enabled(not sound.enabled()) --- else --- game_exit() --- game_init(true) --- end --- end --- end - -function print_analisis_field ( field ) - local field_state=" " - if boss.analisis[field] then field_state="X" end - print(" [ "..field_state.." ] "..field) -end - -function print_analisis() - print("--------------------------------------------") - print_analisis_field("can_chase_abad") - print_analisis_field("can_climb") - print_analisis_field("can_shot") - print_analisis_field("can_super") - print_analisis_field("can_go_altar") - print_analisis_field("falling") - print_analisis_field("going_to_fall") - print_analisis_field("target_reached") - print("X= "..boss.x..", OX= "..boss.x_old) - print(" ") -end - -function special_keys() - if key.press(key.A) then - boss.x_old = boss.x - boss.x = boss.x-1 - print_analisis() - end - if key.press(key.S) then - boss.y_old = boss.y - boss.y = boss.y+1 - print_analisis() - end - if key.press(key.D) then - -- boss.x_old = boss.x - -- boss.x = boss.x+1 - -- print_analisis() - dialeg.new( "Hola mundo!", abad ) - end - if key.press(key.F) then - -- boss.x_old = boss.x - -- boss.x = boss.x+1 - -- print_analisis() - dialeg.new( "Ma cuando arribo a casa", premiere ) - end - if key.press(key.W) then - boss.y_old = boss.y - boss.y = boss.y-1 - print_analisis() - end - if key.press(key.W) then - boss.y_old = boss.y - boss.y = boss.y-1 - print_analisis() - end - if key.press(key.F) then - boss._pause = not boss._pause - end - if key.press(key.N1) then - -- abad prev room - local hab = abad.hab-1 - if hab<0 then hab=0 end - local hab_x = 4 - local hab_y = 3 - local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) - end - if key.press(key.N2) then - -- abad next room - local hab = abad.hab+1 - if hab<0 then hab=0 end - local hab_x = 4 - local hab_y = 3 - local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) - abad:move(abad_x, abad_y) - local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) - end - if key.press(key.N8) then - -- local abad_x, abad_y = coords.room_to_world ( 31, 8, 3 ) - -- print(abad_x..", "..abad_y) - -- abad:move(abad_x, abad_y) - -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) - imp.mode="away" - imp.mode_cooldown = 60000 - print("away") - end - if key.press(key.N9) then - -- mapa_restore_backup() - -- set_actors_enabled_by_room(true, "boss", 44, 55) - -- viewp:free_move() - imp.mode="chase" - imp.mode_cooldown = 60000 - print("chase") - end - if key.press(key.N0) then - -- abad go to room - -- local abad_x, abad_y = coords.room_to_world ( 34, 3, 3 ) - -- print(abad_x..", "..abad_y) - -- abad:move(abad_x, abad_y) - -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) - imp.init() - end -end - -function debug_info() - -- fps_print() - -- if true then return end - font.current(font_default) - -- viewp:print() - -- msg_print(0,14,"ABAD= "..abad.x..", "..abad.y, true) - -- msg_print(0,21,"VIEW= "..viewp.x..", "..viewp.y, true) - local hab, xx, yy = coords.world_to_tile(abad.x, abad.y) - msg_print(0,28,hab.." ( "..xx..", "..yy.." )", true) - -- msg_print(0,35,hab.." ( "..xx..", "..yy.." )", true) - -- msg_print(0,42," JH= "..abad.jump_height,true) - - -- view_coord(abad.x+8, abad.y+0, 16, 32, 6) - -- view_coord(abad.x+abad.bb.x, abad.y+abad.bb.h, 2, 2, 4) - -- view_coord(abad.x+abad.bb.x+abad.bb.w, abad.y+abad.bb.h, 2, 2, 2) - -- view_coord(abad.x, abad.y, 2, 2, 3) - - -- if key.press(key.T) then - -- view_tile_id = not view_tile_id - -- view_checking_tile = false - -- end - -- if key.press(key.C) then - -- view_checking_tile = not view_checking_tile - -- view_tile_id = false - -- end - -- - -- if view_tile_id then - -- write_tile(abad.x, abad.y, 0, true, "R") - -- write_tile(abad.x, abad.y+16, 0, true, "R") - -- write_tile(abad.x, abad.y+32, 0, true, "R") - -- - -- write_tile(abad.x+16, abad.y+32, 0, true, "C") - -- - -- write_tile(abad.x+32, abad.y, 0, true, "L") - -- write_tile(abad.x+32, abad.y+16, 0, true, "L") - -- write_tile(abad.x+32, abad.y+32, 0, true, "L") - -- end - -- - -- if view_checking_tile then - -- local msg = "FLIP= true" - -- if not abad.flip then - -- msg ="FLIP= false" - -- view_coord(abad.x+abad.bb.w+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) - -- else - -- view_coord(abad.x+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) - -- end - -- msg_print(abad.x, abad.y-8,msg) - -- end - font.current(font_sf) -end - states:registrar("game", {game_init, update_game} ) + +require "game_debug" \ No newline at end of file diff --git a/data/game_debug.lua b/data/game_debug.lua new file mode 100644 index 0000000..45a90f4 --- /dev/null +++ b/data/game_debug.lua @@ -0,0 +1,156 @@ +DEBUG = false + +-- DEBUG --------------------------------------------------- +function print_analisis_field ( field ) + local field_state=" " + if boss.analisis[field] then field_state="X" end + print(" [ "..field_state.." ] "..field) +end + +function print_analisis() + print("--------------------------------------------") + print_analisis_field("can_chase_abad") + print_analisis_field("can_climb") + print_analisis_field("can_shot") + print_analisis_field("can_super") + print_analisis_field("can_go_altar") + print_analisis_field("falling") + print_analisis_field("going_to_fall") + print_analisis_field("target_reached") + print("X= "..boss.x..", OX= "..boss.x_old) + print(" ") +end + +function special_keys() + if key.press(key.A) then + boss.x_old = boss.x + boss.x = boss.x-1 + print_analisis() + end + if key.press(key.S) then + boss.y_old = boss.y + boss.y = boss.y+1 + print_analisis() + end + if key.press(key.D) then + -- boss.x_old = boss.x + -- boss.x = boss.x+1 + -- print_analisis() + dialeg.new( "Hola mundo!", abad ) + end + if key.press(key.F) then + -- boss.x_old = boss.x + -- boss.x = boss.x+1 + -- print_analisis() + dialeg.new( "Ma cuando arribo a casa", premiere ) + end + if key.press(key.W) then + boss.y_old = boss.y + boss.y = boss.y-1 + print_analisis() + end + if key.press(key.W) then + boss.y_old = boss.y + boss.y = boss.y-1 + print_analisis() + end + if key.press(key.F) then + boss._pause = not boss._pause + end + if key.press(key.N1) then + -- abad prev room + local hab = abad.hab-1 + if hab<0 then hab=0 end + local hab_x = 4 + local hab_y = 3 + local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) + abad:move(abad_x, abad_y) + local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + end + if key.press(key.N2) then + -- abad next room + local hab = abad.hab+1 + if hab<0 then hab=0 end + local hab_x = 4 + local hab_y = 3 + local abad_x, abad_y = coords.room_to_world ( hab, hab_x, hab_y) + abad:move(abad_x, abad_y) + local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + end + if key.press(key.N8) then + -- local abad_x, abad_y = coords.room_to_world ( 31, 8, 3 ) + -- print(abad_x..", "..abad_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + imp.mode="away" + imp.mode_cooldown = 60000 + print("away") + end + if key.press(key.N9) then + -- mapa_restore_backup() + -- set_actors_enabled_by_room(true, "boss", 44, 55) + -- viewp:free_move() + imp.mode="chase" + imp.mode_cooldown = 60000 + print("chase") + end + if key.press(key.N0) then + -- abad go to room + -- local abad_x, abad_y = coords.room_to_world ( 34, 3, 3 ) + -- print(abad_x..", "..abad_y) + -- abad:move(abad_x, abad_y) + -- local scr_ax, scr_ay = viewp:screen_coords(abad_x, abad_y) + imp.init() + end +end + +function debug_info() + -- fps_print() + -- if true then return end + font.current(font_default) + -- viewp:print() + -- msg_print(0,14,"ABAD= "..abad.x..", "..abad.y, true) + -- msg_print(0,21,"VIEW= "..viewp.x..", "..viewp.y, true) + local hab, xx, yy = coords.world_to_tile(abad.x, abad.y) + msg_print(0,28,hab.." ( "..xx..", "..yy.." )", true) + -- msg_print(0,35,hab.." ( "..xx..", "..yy.." )", true) + -- msg_print(0,42," JH= "..abad.jump_height,true) + + -- view_coord(abad.x+8, abad.y+0, 16, 32, 6) + -- view_coord(abad.x+abad.bb.x, abad.y+abad.bb.h, 2, 2, 4) + -- view_coord(abad.x+abad.bb.x+abad.bb.w, abad.y+abad.bb.h, 2, 2, 2) + -- view_coord(abad.x, abad.y, 2, 2, 3) + + -- if key.press(key.T) then + -- view_tile_id = not view_tile_id + -- view_checking_tile = false + -- end + -- if key.press(key.C) then + -- view_checking_tile = not view_checking_tile + -- view_tile_id = false + -- end + -- + -- if view_tile_id then + -- write_tile(abad.x, abad.y, 0, true, "R") + -- write_tile(abad.x, abad.y+16, 0, true, "R") + -- write_tile(abad.x, abad.y+32, 0, true, "R") + -- + -- write_tile(abad.x+16, abad.y+32, 0, true, "C") + -- + -- write_tile(abad.x+32, abad.y, 0, true, "L") + -- write_tile(abad.x+32, abad.y+16, 0, true, "L") + -- write_tile(abad.x+32, abad.y+32, 0, true, "L") + -- end + -- + -- if view_checking_tile then + -- local msg = "FLIP= true" + -- if not abad.flip then + -- msg ="FLIP= false" + -- view_coord(abad.x+abad.bb.w+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) + -- else + -- view_coord(abad.x+abad.bb.x-1, abad.y+abad.bb.h-4, 2, 2, 2) + -- end + -- msg_print(abad.x, abad.y-8,msg) + -- end + font.current(font_sf) +end diff --git a/data/scenes.lua b/data/scenes.lua index 6b21b7f..fd82a5a 100644 --- a/data/scenes.lua +++ b/data/scenes.lua @@ -28,13 +28,13 @@ scene={ scenes={ lluita_imp= { - {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Eh!?","...","MANTE! Tu de qui eres?"},die=20}, - {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","Aaaarrrrgghhh",""},die=20,musica=audio_song_imp}, - {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Ah! Que eres foraster","Que fas açí? Has","vingut a per pelailles?"},die=20}, - {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","Grwuuuunnnn",""},die=20}, - {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Pos jo lo unic que","tinc es un grapat","de cacaus"},die=20}, - {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","GROOOOAAAARRR",""},die=20}, - {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Haver parat en Alcoi!","A mi que me contes!"," CACAUS A MI!!!!"},die=20}, + {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Eh!?","...","MANTE! Tu de qui eres?"}, mood="estranyat"}, + {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","Aaaarrrrgghhh",""},musica=audio_song_imp}, + {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Ah! Que eres foraster","Que fas açí? Has","vingut a per pelailles?"}}, + {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","Grwuuuunnnn",""}}, + {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Pos jo lo unic que","tinc es un grapat","de cacaus"}}, + {x=avatar_imp_x, y=avatar_imp_y,flip=true,audio="imp",text={"","GROOOOAAAARRR",""}}, + {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Haver parat en Alcoi!","A mi que me contes!"," CACAUS A MI!!!!"},mood="sobrat"}, }, llibre_trobat={ {x=avatar_abad2_x,y=avatar_abad_y,flip=false,audio="abad",text={"Este llibre...","Es el de les tècniques","especials dels abad..."},mood="interessant"}, @@ -161,8 +161,8 @@ scenes={ stage1_ending={ {x=avatar_batman_x,y=avatar_batman_y,flip=true,audio="batman",musica=audio_song_batman,text={"Te pensaves que anaves", "a recuperar-los tan fàcil","moniato!"},die=20}, {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"Torna'm els meus cacaus","lladre!","Com t'agarre..."},die=20}, - {x=avatar_batman_x,y=avatar_batman_y,flip=true,audio="batman",text={"Si vols els cacaus","hauràs d'agarrar-me", ""},die=20}, - {x=avatar_batman_x,y=avatar_batman_y,flip=true,audio="batman",text={"I mes te val no tardar","perque estan bonissims", "Torradets en el seu punt"},die=20}, + {x=avatar_batman_x,y=avatar_batman_y,flip=true,audio="batman",text={"Vols els cacaus?","Ales no te'n veig", "JAJAJAJAJA"},die=20}, + {x=avatar_batman_x,y=avatar_batman_y,flip=true,audio="batman",text={"Crrrkkkk","Estan bonissims!", "Torradets en el seu punt"},die=20}, }, stage1_ending_2={ {x=avatar_abad_x,y=avatar_abad_y,flip=false,audio="abad",text={"elalien!","Premiere!","Que feu ací!?"},die=20}, diff --git a/data/stage1.lua b/data/stage1.lua index a3e1427..8c217da 100644 --- a/data/stage1.lua +++ b/data/stage1.lua @@ -1,10 +1,3 @@ -stages = {} - -stages.actors={} -stages.boss_loaded = false -stages.boss_ready = false -stages.boss_finished = false -boss = nil function stages.stage1_init() stages.actors={} @@ -193,7 +186,7 @@ function stages.stage1_init() -- table.insert( actors, sign.new(10, 6 , 3, 0, false) ) -- L local abad_x, abad_y = coords.room_to_world ( 10, 4, 3 ) - -- local abad_x, abad_y = coords.room_to_world ( 54, 8, 3 ) + local abad_x, abad_y = coords.room_to_world ( 54, 8, 3 ) -- table.insert( actors, trigger.new(8,4,3,triggers.escena_stage1_ending,"stage1 ending","TR09") ) -- local abad_x, abad_y = coords.room_to_world ( 8, 9, 3 ) @@ -205,9 +198,6 @@ function stages.stage1_init() remote_view_init() viewp:free_move() - - stages.boss_ready = false - stages.boss_loaded = false end function stages.stage1_toBatcave() @@ -232,17 +222,11 @@ function stages.stage1_toBatcave() -- table.insert( actors, sign.new(40, 10, 3, 0, false) ) -- R -- table.insert( actors, sign.new(42, 1 , 2, 90, false) ) -- D table.insert( stages.actors, sign.new(53, 4 , 3, 0, false) ) -- R - print("GO TO BATCAVE") + -- print("GO TO BATCAVE") end end function stages.stage1_update() - -- print("stage1_update") - -- fireball.update() - -- if (abad.energia<=abad.max_energia/2) then - -- -- Requeriment: tindre mitja clau - -- premiere.healer_init() - -- end stages.stage1_toBatcave() for key,actor in pairs(stages.actors) do if viewp:inside(actor.x, actor.y, actor.w, actor.h) and actor~=abad then @@ -270,11 +254,6 @@ function stages.stage1_draw_front() -- boss_meter:draw() end -function stages.stage2_init() - -- print("stage 2 init") -end - --- require "stage1_maps" require "stage1_world_map" require "stage1_boss_map" require "stage1_boss" diff --git a/data/stage1_boss.lua b/data/stage1_boss.lua index b2a61b4..b513ea4 100644 --- a/data/stage1_boss.lua +++ b/data/stage1_boss.lua @@ -79,8 +79,8 @@ function stages.stage1_boss_intro_init() boss.enabled=true boss.reason="" boss:fight() - load_boss_stage() - stages.boss_loaded = true + -- load_boss_stage() + stages.load_boss_stage() states:next() end @@ -129,16 +129,12 @@ function stages.stage1_boss_outro_end() local abad_x, abad_y = coords.room_to_world ( 54, 9, 3 ) abad:move(abad_x, abad_y) abad_make_safe( true ) - stages.stage1_boss_finished() remove_actor(boss) - unload_boss_stage() + stages.unload_boss_stage() music.stop() mapa_restore_backup() set_actors_enabled_by_room(true, "boss", stage1_boss_mapa.r0.r, stage1_boss_mapa.r1.r) - stages.boss_ready = false - stages.boss_finished = false - stages.boss_loaded = false viewp:free_move() states:finish() end diff --git a/data/stage_mgr.lua b/data/stage_mgr.lua new file mode 100644 index 0000000..47af155 --- /dev/null +++ b/data/stage_mgr.lua @@ -0,0 +1,55 @@ +stages = {} + +stages.stage = 1 +stages.stage_loaded = 0 +stages.last_stage = 1 + +stages.actors={} +stages.boss_loaded = false +stages.boss_ready = false +stages.boss_finished = false +boss = nil + +stages.stage_init = nil +stages.stage_update = nil +stages.stage_draw_back = nil +stages.stage_draw_middle = nil +stages.stage_draw_front = nil + +function stages.load_stage( init ) + init = init or false + stages.stage_init = stages["stage"..stages.stage.."_init"] + stages.stage_update = stages["stage"..stages.stage.."_update"] + stages.stage_draw_back = stages["stage"..stages.stage.."_draw_back"] + stages.stage_draw_middle = stages["stage"..stages.stage.."_draw_middle"] + stages.stage_draw_front = stages["stage"..stages.stage.."_draw_front"] + stages.stage_loaded = stages.stage + stages.boss_ready = false + stages.boss_loaded = false + if init then stages.stage_init() end +end + +function stages.load_boss_stage() + stages.stage_init = stages["stage"..stages.stage.."_boss_init"] + stages.stage_update = stages["stage"..stages.stage.."_boss_update"] + stages.stage_draw_back = stages["stage"..stages.stage.."_boss_draw_back"] + stages.stage_draw_middle = stages["stage"..stages.stage.."_boss_draw_middle"] + stages.stage_draw_front = stages["stage"..stages.stage.."_boss_draw_front"] + stages.boss_loaded = true +end + +function stages.unload_boss_stage() + stages.boss_ready = false + stages.boss_finished = false + stages.boss_loaded = false + stages.load_stage(false) +end + +function stages.next_stage() + stages.stage = stages.stage + 1 + if stages.stage>stages.last_stage then + states:executar("title",false) + else + stages.load_stage(true) + end +end \ No newline at end of file diff --git a/data/tiles.gif b/data/tiles.gif index 5a351ca043c68555ed4f2148968bf56c0c152c4b..f4c5622442b5284d914774592484024c045b1879 100644 GIT binary patch delta 11276 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 CDhqS~ delta 11260 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