Pico-8, mon coup de coeur !

Posté le 23/03/2021 dans Lua

Pico-8

Pico-8 est ce qu'on appelle une Fantasy Console, c'est-à-dire qu'il s'agit d'une console virtuelle 8 bits imaginaire. C'est un peu comme une cousine de la Game Boy n'ayant jamais existée. Et comme toutes les consoles, elle a des contraintes et des limitations. Sa résolution est fixée à 128x128 pixels, le nombre de couleurs limité à 16 et la taille de la cartouche contenant le code du jeu ne peut pas dépasser 32 kilo-octets.

Mais pourquoi avoir mis ces contraintes ? N'est-ce pas gênant ? Et bien, c'est là qu'opère toute la magie de cette console.

Ses limitations stimulent la créativité !

  • La résolution et la taille de la carte est fixe, ce qui permet d'avoir une vision globale du nombre de niveaux que notre jeu sera capable de supporter.
  • La limitation de la taille de la cartouche nous force à écrire du code simple et efficace.
  • Le style graphique sera forcément du pixel art.
  • On est obligé de piocher dans les couleurs proposées, donc pas besoin de réfléchir à des palettes de couleurs.
  • Les sons utilisables sont également proposés, à l'instar des couleurs.

Du coup, le fait d'avoir un cadre imposé permet d'éviter de se poser trop de question sur notre jeu.

Tous les outils sont intégrés !

En effet, Pico-8 propose un éditeur de code, un éditeur de son, un éditeur de musique, un éditeur de niveaux et un éditeur de pixel art. Tout est intégré et se suffit à lui-même !

Pico-8

Grâce à tout ça, on peut se concentrer uniquement sur les aspects créatifs de notre jeu, comme le game design, le gameplay, le scénario, ou la musique.

Facile à prendre en main !

La cerise sur le gâteau est sa facilité de prise en main. Le combo Lua/outils intégrés permet de très vite se lancer dans la création de ton premier jeu ! La communauté est excellente et il existe de très bon tutoriels sur le net.

Favorise le partage !

Le fichier du jeu est la cartouche intégrale du jeu. Il est donc très simple de l'extraire et de la partager, que ça soit sur itch.io ou sur sur le hub Pico-8.

Parfait pour les Game Jams

Pour finir, sa facilité de prise en main et son cadre imposé le rendent parfait pour les Game Jams. De gros projets ont utilisé Pico-8 dans des Game Jams pour prototyper leur jeu, comme Celeste !

Mais non libre

Malheurseusement, l'outil est non-libre et donc payant. Je n'ai pas l'habitude de promouvoir des logiciels payants, mais celui-ci est tellement bien pensé que je pense que ça vaut réellement le coup. Si vraiment ça te bloque, tu peux te tourner vers un équivalent open source appelé TIC-80.

Mes jeux

Tu peux jeter un oeil aux jeux que j'ai codé pour des Game Jams avec Pico-8. J'ai tenté de découvrir différents styles de jeux :

Shoot The Moon Solène Is Missing
  • Badaboom, un petit jeu d'arcade à l'ancienne basé sur une scène du film Le 5ème élément, donc le code source est disponible ici aussi.
Badaboom Hellhound

Le code

Au niveau du code, tu pourras trouver de nombreuses similarités avec Löve qu'on a étudié précédemment.

Tu as aussi les trois fonctions init, update et draw dans lesquelles tout ce passe. De la même manière il te faudra gérer l'état de ton jeu et les différents écrans. Tu ne seras vraiment pas dépaysé !

Voici un exemple complet d'une cartouche, celle de Hellhound, pour te faire une idée !

pico-8 cartridge // http://www.pico-8.com
version 29
__lua__
-- hellhound
-- mobo
function _init()
    state=2
end

function _update60()
    if (state==0) update_game()
    if (state==1) update_gameover()
    if (state==2) update_gamestart()
end

function _draw()
    if (state==0) draw_game()
    if (state==1) draw_gameover()
    if (state==2) draw_gamestart()
end
-->8
-- game start
function update_gamestart()
    if (btnp(⬆️)) init_game()
end

function draw_gamestart()
    cls()
    map(0, 0, 0, 0, 128, 64)
    camera(0,384)
    rectfill(31,73+384,105,109+384,8)
    rectfill(28,70+384,102,106+384,0)
    print("Hellhound",34,76+384,8)
    print("⬆️ to start",34,96+384,8)
end
-->8
-- game over
function update_gameover()
    if (btnp(⬆️)) init_game()
    if music_start then
        music_start=false
        music(-1)
    end
end

function draw_gameover()
    cls()
    map(0, 0, 0, 0, 128, 64)
    camera(0,384)
    rectfill(31,73+384,105,109+384,8)
    rectfill(28,70+384,102,106+384,0)
    print("Game over",34,76+384,8)
    print("Score:"..ticks,34,86+384,8)
    print("⬆️ to retry",34,96+384,8)
end
-->8
--game
function init_game()
    state=0
    ticks=0
    music_start=false
    cam=create_camera(0,512-128,1,2,32)
    p=create_player(8,62*8)
    bullets=create_bullets()
    enemies=create_enemies()
    explosions=create_explosions()
    spawns={
        {x=10*8,y=62*8},{x=13*8,y=62*8},{x=6*8,y=58*8},
        {x=6*8,y=54*8}, {x=3*8,y=51*8}, {x=1*8,y=51*8},
        {x=10*8,y=56*8}, {x=12*8,y=56*8}, {x=21*8,y=56*8},
        {x=21*8,y=62*8}, {x=25*8,y=62*8}, {x=29*8,y=62*8},
        {x=27*8,y=58*8}, {x=30*8,y=58*8}, {x=29*8,y=55*8},
        {x=29*8,y=51*8}
    }
    for s in all(spawns) do
        enemies:spawn(s.x,s.y)
    end
end

function update_game()
    ticks+=1
    if not music_start then
        music(0)
        music_start=true
    end
    p:update()
    cam:update()
    bullets:update()
    enemies:update()
    explosions:update()
end

function draw_game()
    cls(7)
    palt(0, false)
    palt(15, true)
    --camera
    cam:draw()
    -- map
    map(0, 0, 0, 0, 128, 64)
    -- items
    p:draw()
    enemies:draw()
    bullets:draw()
    explosions:draw()
    -- hud
    camera(0,0)
    print('score: '..ticks,0,0,10)
    spr(16,0,120)
    for i=1,p.life do
        rectfill(0+i*8, 125, 8+i*8, 127, 10)
    end
end
-->8
-- camera
function create_camera(x,y,dx,dy,margin)
    local c={
        x=x,y=y,dx=dx,dy=dy,speed=speed,margin=margin,
        update=function(self)
            if (p.x-cam.x<(64-cam.margin)) then
                cam.x=mid(0,cam.x-cam.dx,1024-128)
            elseif (p.x-cam.x>(64+cam.margin)) then
                cam.x=mid(0,cam.x+cam.dx,1024-128)
            end
            if (p.y-cam.y<(64-cam.margin)) then
                cam.y=mid(0,cam.y-cam.dy,512-128)
            elseif (p.y-cam.y>(64+cam.margin)) then
                cam.y=mid(0,cam.y+cam.dy,512-128)
            end
        end,
        draw=function(self)
            camera(cam.x,cam.y)
        end
    }
    return c
end
-->8
-- player
function create_player(x,y)
    local p={
        x=x,y=y,w=8,h=8,dx=0,dy=0,acc=0.08,dcc=0.9,max_dx=1,max_dy=2,
        gravity=0.15,jump_speed=-1.75,jump_hold_time=0,ungrounded_time=0,max_jump_press=15,
        jump_forgiveness=10,grounded=false,is_jumping=false,flip=false,
        anims=anims(self),curanim="idle",curframe=1,animtick=0,attack_tick=0,
        life=15,
        set_anim=function(self,anim)
            if(anim==self.curanim)return--early out.
            local a=self.anims[anim]
            self.animtick=a.ticks--ticks count down.
            self.curanim=anim
            self.curframe=1
        end,
        update=function(self)
            move(self)
            jump(self)
            fall(self)
            attack(self)
            animate(self)
            hurt(self)
        end,
        draw=function(self)
            local a=self.anims[self.curanim]
            local frame=a.frames[self.curframe]
            spr(frame, self.x, self.y,1,1,self.flip)
        end
    }
    return p
end

function move(self)
    if btn(⬅️) then
        self.dx-=self.acc
        self.flip=true
        if (self.grounded) self:set_anim("run")
    elseif btn(➡️) then
        self.dx+=self.acc
        self.flip=false
        if (self.grounded) self:set_anim("run")
    else
        self.dx*=self.dcc
        if (self.grounded and self.dx>0) self:set_anim("slide")
        if (self.grounded and self.dx<=0) self:set_anim("idle")
    end
    if is_solid(self.x+self.dx,self.y) then
        self.dx=0
    end
    self.dx=mid(-self.max_dx,self.dx,self.max_dx)
    self.x+=self.dx
end

function jump(self)
    if btn(🅾️) then
        local canJump=self.grounded or (self.ungrounded_time > 0 and self.ungrounded_time <= self.jump_forgiveness) and not self.is_jumping
        if self.jump_hold_time>0 or canJump then
            if (self.jump_hold_time==1) sfx(3)
            self.is_jumping=true
            self.jump_hold_time+=1
            if self.jump_hold_time<self.max_jump_press then
                self.dy=self.jump_speed
            end
        end

    else
        self.jump_hold_time=0
    end
end

function fall(self)
    self.dy+=self.gravity
    if is_solid(self.x,self.y+self.dy) then
        self.dy=0
        self.grounded=true
        self.is_jumping = false
        self.ungrounded_time = 0
    else
        self.grounded=false
        self.ungrounded_time+=1
    end
    if(not self.grounded) self:set_anim("jump")
    self.dy=mid(-self.max_dy,self.dy,self.max_dy)
    self.y+=self.dy
end

function attack(self)
    if btn() then
        if (p.attack_tick%15==0) then
            bullets:shoot()
        end
        if(self.grounded) self:set_anim("attack")
        if(not self.grounded) self:set_anim("airattack")
        p.attack_tick+=1
    else
        p.attack_tick=0
    end
end

function anims(self)
    return {
        ["idle"]={ticks=15,frames={1,2,3,4}},
        ["run"]={ticks=5,frames={5,6}},
        ["jump"]={ticks=1,frames={10}},
        ["slide"]={ticks=1,frames={1}},
        ["attack"]={ticks=1,frames={7}},
        ["airattack"]={ticks=1,frames={11}},
        ["climb"]={ticks=10,frames={8,9}},
    }
end

function hurt(self)
    if ticks%35==0 then
        p.life-=1
    end
    --death
    if p.life<=0 then
        sfx(2)
        state=1
    end
end
-->8
-- bullets
function create_bullets()
    return {
        items={},
        update=function(self)
            for b in all(self.items) do
                b.x+=b.speed
                animate(b)
                if b.x<0 or b.x>1024 or is_solid(b.x,b.y) then
                    del(self.items,b)
                end
            end
        end,
        draw=function(self)
            for b in all(self.items) do
                local a=b.anims[b.curanim]
                local frame=a.frames[b.curframe]
                spr(frame,b.x,b.y,1,1,b.flip)
            end
        end,
        shoot=function(self)
            sfx(1)
            local new_bullet={
                x=p.flip and p.x-4 or p.x+4,
                y=p.y,
                speed=p.flip and -1.5 or 1.5,
                flip=p.flip,
                anims={["shoot"]={ticks=5,frames={12,13,14,15}}},
                curanim="shoot",curframe=1,animtick=0
            }
            add(self.items, new_bullet)
        end
    }
end
-->8
-- enemies
function create_enemies()
    return {
        items={},
        update=function(self)
            for e in all(self.items) do
                if (not e.flip) e.x+=e.speed
                if (e.flip) e.x-=e.speed
                animate(e)
                if is_solid(e.x,e.y) or not is_solid(e.x,e.y+8) then
                    e.flip=not e.flip
                end
                -- killed ?
                for b in all(bullets.items) do
                    if collide(e,b) then
                        explosions:add(b.x+4,b.y+2)
                        del(bullets.items,b)
                        e.life-=1
                        if e.life==0 then
                            if (p.life<15) p.life+=1
                            sfx(0)
                            del(enemies.items,e)
                            local random_spawn=rnd(spawns)
                            enemies:spawn(random_spawn.x,random_spawn.y)
                        end
                    end
                end
            end
        end,
        draw=function(self)
            for e in all(self.items) do
                local a=e.anims[e.curanim]
                local frame=a.frames[e.curframe]
                spr(frame,e.x,e.y,1,1,e.flip)
            end
        end,
        spawn=function(self,x,y)
            local new_enemy={
                x=x,
                y=y,
                speed=1,
                life=1,
                flip=false,
                anims={["run"]={ticks=5,frames=rnd{{17,18},{33,34},{49,50},{19,20},{35,36}}}},
                curanim="run",curframe=1,animtick=0
            }
            add(self.items, new_enemy)
        end
    }
end
-->8
--explosions
function create_explosions(x,y)
    return {
        items={},
        update=function(self)
            for e in all(self.items) do
                e.timer+=1
                if e.timer==13 then
                    del(self.items,e)
                end
            end
        end,
        draw=function(self)
            for e in all(self.items) do
                circ(e.x,e.y,e.timer/3,
                8+e.timer%3)
            end
        end,
        add=function(self,x,y)
            add(self.items,{x=x,y=y,timer=0})
        end
    }
end
-->8
-- misc
function is_solid(x, y, flag)
    flag = flag or 0
    if(fget(mget(flr(x/8),flr(y/8)),flag))return true
    if(fget(mget(flr((x+7)/8),flr(y/8)),flag))return true
    if(fget(mget(flr(x/8),flr((y+7)/8)),flag))return true
    if(fget(mget(flr((x+7)/8),flr((y+7)/8)),flag))return true
    return false
end

function collide(a,b)
    return not (a.x>b.x+8
        or a.y>b.y+8
        or a.x+8<b.x
        or a.y+8<b.y)
end

function animate(self)
    self.animtick-=1
    if self.animtick<=0 then
        self.curframe+=1
        local a=self.anims[self.curanim]
        self.animtick=a.ticks
        if self.curframe>#a.frames then
            self.curframe=1
        end
    end
end


__gfx__
00000000ffff8ff8ffffffffffff8ff8ffffffffffff8ff8ffff8ff8ffff8ff8f8080000f8080000ffff8ff8ffff8ff8ffffffffffffffffffffffffffffffff
00000000ffff0000ffff8ff8ffff0000ffff8ff8ffff0000ffff0000ffff0000ff000000ff000000ffff0000ffff0000fff2222ffff2222ffff2222ffff2222f
00700700ff000808ff000000ff000808ff000000ff000808ff000808ff000808ff080000ff080000ff000808ff000808ff288882ff228882ff222882ff228882
00077000f0000000f0000808f0000000f0000808f0000000f0000000f0000000f8000000f8000000f0000000f0000000f2899aa8f22899a8f2228998f22899a8
00077000f0000000f0000000f0000787f0000000f0000000f0000000f0000787fff00000fff00000f0000000f00007872899aaa822899aa8222899a822899aa8
0070070000000000f000000000000888f0000787000000000000000000000888fff00000fff000000000000000000888f2899aa8f22899a8f2228998f22899a8
00000000f000000000000000f000000000000888f0000000f0000000f0000000ffff0000ffff0000f0000000f0000000ff288882ff228882ff222882ff228882
00000000ff0f0ff0ff0f0ff0ff0f0ff0ff0f0ff0ff0f0ff0f0f0ff0fff0f0ff0ffffff0ffffffff0fffffffffffffffffff2222ffff2222ffff2222ffff2222f
ffffffffff444444ff444444ff333333ff3333330000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
fffffffff44eeeeef44eeeeef33eeeeef33eeeee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
fffffffff4eee1e1f4eee1e1f3eee1e1f3eee1e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
faafaafff44eeeeef44eee8ef33eeeeef33eee8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
faaa7afff44eeeeef44eee8ef33eeeeef33eee8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
faaaaafff3333333fe33333ef5555555fe55555e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
ffaaaffffe33333ef3333333fe55555ef55555550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
fffaffffffeefeeffffeefeeffeefeeffffeefee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000ff999999ff999999ff888888ff8888880000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f99eeeeef99eeeeef88eeeeef88eeeee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f9eee1e1f9eee1e1f8eee1e1f8eee1e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f99eeeeef99eee8ef88eeeeef88eee8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f99eeeeef99eee8ef88eeeeef88eee8e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f4444444fe44444efcccccccfeccccce0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000fe44444ef4444444fecccccefccccccc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000ffeefeeffffeefeeffeefeeffffeefee0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000ff555555ff55555500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f55eeeeef55eeeee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f5eee1e1f5eee1e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f55eeeeef55eee8e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f55eeeeef55eee8e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000f9999999fe99999e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000fe99999ef999999900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000ffeefeeffffeefee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
55555555000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000882222222222288200000000
55555555000002200200022002000000000200200220020000200000000001100100011001000000000100100110010000100000828822222228828200000000
55555555002200000002022000000200000002200220022000002200001100000001011000000100000001100110011000001100282882222288282200000000
55555555002200000000000000000000000000000000000000002200001100000000000000000000000000000000000000001100282288222882282200000000
55555555000000002020202020202020202020202020202000000000000000001010101010101010101010101010101000000000228228828822822200000000
55555555020000222222222222222222222222222222222222000020010000111111111111111111111111111111111111000010228222282222822200000000
55555555000002222822228888222282222228822288282222200020000001111c1111cccc1111c111111cc111cc1c1111100010222828828828222200000000
5555555500000222882882882828288222882882828828822220000000000111cc1cc1cc1c1c1cc111cc1cc1c1cc1cc111100000228882222288822200000000
00000000000002882222222222222222222222222222222222220000000001cc1111111111111111111111111111111111110000288282222282882200000000
000000000220228822eee22222666662222222222266652222200000011011cc11ddd11111666661111111111166651111100000888888888888888200000000
00000000022002222ee8ee2226666666222222222660665282220000011001111dd8dd11166666661111111116606651c1110000222282222282222200000000
0000000000002228ee898ee2260060062222222266606665822000200000111cdd898dd1160060061111111166606665c1100010222228222822222200000000
0000000000200228e89a98e2266060662222222266000665222200000010011cd89a98d116606066111111116600066511110000222228222822222200000000
00000000000022222e444e2222666662622226226660666588200200000011111d444d11116666616111161166606665cc100100222222828222222200000000
000000000200028822e4e22222626262266662226666666588220220010001cc11d4d111116161611666611166666665cc110110222222828222222200000000
000000000000222822242222222222226222262266666665222000000000111c1114111111111111611116116666666511100000222222282222222200000000
222222220000022222222222222222222222222222222222822200000000011111111111111111111111111111111111c1110000cc11111111111cc100000000
22222222000022882222222222222222222222222222222222200220000011cc1111111111111111111111111111111111100110c1cc1111111cc1c100000000
222222220020022822222222222222222222222222222222882202200010011c11111111111111111111111111111111cc1101101c1cc11111cc1c1100000000
222222220000222222222222222222222222222222222222882000000000111111111111111111111111111111111111cc1000001c11cc111cc11c1100000000
222222220000022822222222222222222222222222222222222200000000011c111111111111111111111111111111111111000011c11cc1cc11c11100000000
222222220000222222222222222222222222222222222222882002200000111111111111111111111111111111111111cc10011011c1111c1111c11100000000
22222222020002882222222222222222222222222222222282220200010001cc11111111111111111111111111111111c1110100111c1cc1cc1c111100000000
22222222000022822222222222222222222222222222222222200000000011c1111111111111111111111111111111111110000011ccc11111ccc11100000000
1111111100000222882882882882828228828822288288282220000000000111cc1cc1cc1cc1c1c11cc1cc111cc1cc1c111000001cc1c11111c1cc1100000000
1111111102000222882222822822228828822222228288222220000001000111cc1111c11c1111cc1cc1111111c1cc1111100000ccccccccccccccc100000000
111111110200002222222222222222222222222222222222220000200100001111111111111111111111111111111111110000101111c11111c1111100000000
1111111100000000020202020202020202020202020202020000000000000000010101010101010101010101010101010000000011111c111c11111100000000
1111111100220000000000000000000000000000000000000000220000110000000000000000000000000000000000000000110011111c111c11111100000000
11111111002200000220200000200000022000000220022000002200001100000110100000100000011000000110011000001100111111c1c111111100000000
11111111000002000220002000000020020020000020022002200000000001000110001000000010010010000010011001100000111111c1c111111100000000
111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111c1111111100000000
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040404040004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040404040000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000040400040000000000000000000000000000000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040404040000000000000000000000000000000000000004040404000404040004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000004040404040000040000000000000000000000000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000040404040400040000040400000000000000000000000000000000000404040400000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000400000000000000000000000000000000000000000000000000000404
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000404040400000004040004040400000000000000040000000404000000000000000000000000000000000000000004040400040004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000004040400000000000000000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000404040404040000000000000404040400000000000000000000000000000000040400000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000040404040400000000000000000000000000000000040000000000000000000404000000000000000000000004040404040000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000004040400000000000000000000000000000000000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000404040400040000040000000000000000000000000404000000000000000000040404040400000004
05050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050505050504
00000000000404040400000004040400000000000000000000000000040000040000000000000000000000000000040404000000000000000000000000000004
1424543444543424342434543444246405057484b494a48494a484b48494a4c40505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000040404000000000000000000000000040000000000000000000000000000000004040000000000000000000404040004
16060606060606060606060606d4e465050576d6e607070707070707070707c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000040400000000000000000000040000000000000000000000000000000000000400000000000000000000000004
15062506060606060606060606d5e566050576d7e707070707070707078507c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000404000000000000000404040404
16350606060606060606060606060666050576070707070707070707070795c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000040000000000000000000000040000000000000000000000000000000000040400000000000000000000000004
16572757470606060606060606060665050576070707070707070707079797c60505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000040404040004040400000000040000000000000000000000000000000404000000000000000000000004040404
15060606160606060606060606060666050575070707070707b50707070707c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000004040000000000000000000000000000000004
15060606163506060606060606060665050576070707070787b7a707070707c60505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000404000000000000000000000000000000000004
160606061737373706060606060606665494750785070707070707070707a5c60505050505050505050505050505050505050505050505050505050505050504
00000404040400000000000000000000000000000000000404040404000000040000000000000000000004040400000000000000000000000000040404000004
15060606060606060606060606550606450707070707070707070707a7b7a7c60505050505050505050505050505050505050505050505050505050505050504
00000000000404000000000000000000000000000000040400000000000000040000000000000000000404000000000000000000000000000000000000000004
160606060606060606063737373737663797769797a7a70707070707070707c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000040400000000000000000000000000000000000000000004
160606060606060606060606060606650505750707070707070707070795a5c50505050505050505050505050505050505050505050505050505050505050504
00000000000404040404040000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000004040404
1506060606064747570606060606066505057507070707070707a7a7b787a7c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000404040404000000000000040000000000000000000000000000000000000000000000000000000004000004
16060606060666060606060625060666050576070707070707070707070707c60505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000040404040404000000000000000000000000040000000000000000000000000000000000000000000000000000040404040404
15060606273767060637060606060665050576070707b7a707070707078507c60505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000004040400040000000000000000000000000000000000000000000000000000040000000004
150606576745060606060606060635660505750707079507070707070707b5c50505050505050505050505050505050505050505050505050505050505050504
00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000040000000004
1727374757273747273727374757476705057787a787a7b797879787a797b7c70505050505050505050505050505050505050505050505050505050505050504
04040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404
__gff__
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010101010101010101010101000000000100000000010100000000010000000001000000000101000000000100000000010101010101010101010101000000
0000000000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
4040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000040404000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000040404000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000004040004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000404000004040404000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000040400000004000404040000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000004040400000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000004040000000004000000040400000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000404000000000004000000000004040000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000040404000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000040400000000000004000000000000040000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000004040000000000000004000000000000000404000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4040404040404040404040000040404040404040404040404040404040404040000000000000000000000000000000000000000000004000000000000000004000000000000000004040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000404000000000000000004000000000000000000040000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000004040400000000000000000000000000000000040000000000000000000000000000000000000000000400000000000000000004000000000000000000000400000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000040400000000000000000004000000000000000000000404000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000040404040400000000000000000000000000000000040000000000000000000000000000000000000004040000000000000000000004000000000000000000000004040000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000404040400000000000000000000000000040000000000000000000000000000000000040404000000000000000000000004000000000000000000000000040000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000404000000000000000000000000040000000000000000000000000000000004040000000000000000000000000004000000000000000000000000000400000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000040400000000000000000000000000000004000000000000000000000000000004000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000040000000000000000000000000404040000000000000000000000000000000004000000000000000000000000000004040000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000404040404040000000000000000040000000000000000000000040400000000000000000000000000000000000004000000000000000000000000000000000400000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000400000000000000000000000000040000000000000000000404040000000000000000000000000000000000000004000000000000000000000000000000000004040000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000404040400000000000000000000000000040000000000000004040400000000000000000000000000000000000000000004000000000000000000000000000000000000040400000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000400000000000000000000000000000000040000000000000004000000000000000000000000000000000000000000000004000000000000000000000000000000000000000404000000000000000000000400000000000000000000000000000000000000000000000000000000000000040
4000000000000000004040404040400000000000000000000000000000000000000000000000404000000000000000000000000000000000000000000000004000000000000000000000000000000000000000004040000000000000000000000000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000040400000000000000000000000000000000000000000000000000000000000000000000000000000000040
4000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000404000000000000000000000000000000000000000000000000000000000000000000000000000000040
4040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040000000000000000000404040
__sfx__
00010000160001602016030160401705016050160501605016050150501305012050100500e0500c0500a05008050060400302000010000000000000000000000000000000000000000000000000000000000000
000100002e7102d7302d7502d7502d7502d7502c7502b7502b7502a7502775024750227501f75016750117500d750087500675005740057400473003720027100271000700007000070000700007000070000700
000300000d1200a140091500915009150091500815007150051500415003150021500115000150001500015000150001500015000150001500015000150001500015000140001200011000110001100011000110
0101000011320123201332015320163201a3201b3201e320213202232026320293202c3202e320333203432035320003000030000300003000030000300003000030000300003000030000300003000030000300
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
010f00000003100001000310000100001000010000100001000310000100031000010000100001000010000100031000010003100001000010000100001000010000100001000010000100001000010000100001
__music__
02 0a424344

Plutôt simple et efficace non ?

Amuse-toi bien et sois créatif !