Log In  

The Pixel Toy (TpxT)

2nd picotron game ever made!?

To play, copy and paste code below (click "show") into picotron playground (or actual picotron when it comes out!)

If it says "clipboard can not be read", then don't use base Firefox. if you aren't using base Firefox, then give picotron clipboard permissions in site settings.

vvv Code vvv

--  ThePixelToy
--  by antibrain

--[[

todo:
maybe some sort of GOL type
sounds/graphics/prebuilt maps when ptron 0.1 comes out
scene loader from clipboard to make something like TPT's save browser
more pixel types
more reactions
make neut/prot act like they do in TPT instead of acting like GAS/FIRE
saving/loading saves to hard disc. maybe using printh as file? cartdata?
chemestry?
air pressure
heat
simulate each pixel individualy so we can track its heat, speed, mass, weight, etc.
virus because virus in TPT is very satisfying
make fill/line tool not terrible
deco layers
ability to change sim speed
full keyboard support?

]]--
j=0
dc=5
size=0
sim=1

function _update() --update loop
    mx,my,mb=get_mouse() --get mouse data
    simulatepixels() --simulate pixels
   controls() --allow game to be controlled
end

function _draw() --draw loop
 mousedraw() --draw with mouse
 ui() --draw ui
end

function simulatepixels()
if sim==1 then
for i=1,4000 do --4000 times per frame (30fps?)

        local x=rnd(480) --get random x and
        local y=rnd(270) --y values and
        local c=pget(x,y) --get the color of that pixel.
        if c==8 then --is red

            if pget(x,y+1)!=5 and pget(x,y+1)!=7 then --check all bordering pixels and if any of them arent a wall
                pset(x,y+1,c) --then set it to red
            end
            if pget(x,y-1)!=5 and pget(x,y-1)!=7 then --repeat for all other bordering pixels
                pset(x,y-1,c)
            end
            if pget(x+1,y)!=5 and pget(x+1,y)!=7 then
                pset(x+1,y,c)
            end
            if pget(x-1,y)!=5 and pget(x-1,y)!=7 then
                pset(x-1,y,c)
            end     
        end 

        if c==15 then --sand
         if pget(x,y+1)==0 then --sand

            pset(x,y+1,c) --f a l l
            pset(x,y,0) 
         end
         if pget(x,y+1)==12 then 
            pset(x,y+1,c)
            pset(x,y,12)
         end
         if pget(x,y+1)==1 then
            pset(x,y+1,c)
            pset(x,y,1)
         end
        end

        if c==2 or c==10 or c==11 then --gas (fire?)/neut/prot (i couldnt get neut/prot to act normal so i gave up :p )
                local j=flr(rnd(4)) --pick random number
                local q=flr(rnd(2))
                if q==1 and c==2 then --decay randoly
                    pset(x,y,0)
                end
                if q!=4 and j==0 and pget(x+1,y)==0 then --go in random direction
                    pset(x,y,0)
                    pset(x+1,y,c)
                end
                if q!=4 and j==1 and pget(x-1,y)==0 then    
                    pset(x,y,0)
                    pset(x-1,y,c)
                end
                if q!=4 and j==2 and pget(x,y+1)==0 then
                    pset(x,y,0)
                    pset(x,y+1,c)
                end
                if q!=4 and j==3 and pget(x,y-1)==0 then
                    pset(x,y,0)
                    pset(x,y-1,c)
                end
                if c==11 then
                    if pget(x+1,y)==1 and pget(x+1,y)==0 then
                     pset(x+1,y,11)
                    end
                    if pget(x-1,y)==1 and pget(x-1,y)==0 then
                     pset(x-1,y,11)
                    end
                    if pget(x,y+1)==1 and pget(x,y+1)==0 then
                     pset(x,y+1,11)
                    end
                    if pget(x,y-1)==1 and pget(x,y-1)==0 then
                     pset(x,y-1,11)
                    end

                end
                if c==2 and pget(x,y+1)==12 or pget(x,y-1)==12 or pget(x-1,y)==12 or pget(x+1,y)==12 then
                    pset(x,y,0)
                end
        end
        if c==12 or c==1 or c==9 then --warder/deut/lava physics

            if pget(x,y+1)==0 then --let it fall down
                pset(x,y,0)
                pset(x,y+1,c)
            elseif pget(x-1,y)==0 then --if there's an open space and it isnt in free-fall,
                pset(x-1,y,c) --allow it to drip left and
                pset(x,y,0)
            elseif pget(x+1,y)==0 then
                pset(x+1,y,c) --right as well
                pset(x,y,0)
            end
            if c==1 and pget(x,y+1)==11 or pget(x,y-1)==11 or pget(x-1,y)==11 or pget(x+1,y)==11 then
                pset(x,y,11)
            end
        end
        if c==16 then --remove fill border
            pset(x,y,0)
        end
        if c==3 or c==4 then --wood/plant/foliage
         if pget(x,y+1)==2 or pget(x,y+1)==9 then
          pset(x,y,2)
         end
         if pget(x,y-1)==2 or pget(x,y-1)==9 then
          pset(x,y,2)
         end
         if pget(x+1,y)==2 or pget(x+1,y)==9 then
          pset(x,y,2)
         end
         if pget(x-1,y)==2 or pget(x-1,y)==9 then
          pset(x,y,2)
         end
         if c==3 then
          if pget(x,y+1)==12 then
           pset(x,y+1,3)
          end
          if pget(x,y-1)==12 then
           pset(x,y-1,3)
          end
          if pget(x+1,y)==12 then
           pset(x+1,y,3)
          end
          if pget(x-1,y)==12 then
           pset(x-1,y,3)
          end
        end
        end
        if c==14 then
         if pget(x,y+1)==0 then
          pset(x,y,0)
          pset(x,y+1,14)
         end
         if pget(x,y+1)>0 and pget(x,y+1)!=5 and pget(x,y+1)!=14 and pget(x,y+1)!=29 then
          circfill(x-4,y-4,16,2)
         end
        end
        if c==6 then
            if pget(x,y+1)==10 or pget(x,y+1)==9 then
                pset(x,y,9)
            end
            if pget(x,y-1)==10 or pget(x,y-1)==9 then
                pset(x,y,9)
            end
            if pget(x+1,y)==10 or pget(x+1,y)==9 then
                pset(x,y,9)
            end
            if pget(x-1,y)==10 or pget(x-1,y)==9 then
                pset(x,y,9)
            end

        end
        if c==7 then
            if pget(x,y+1)==0 then
                pset(x,y,0)
                pset(x,y+1,7)
            end
            if pget(x,y+1)==12 then
                pset(x,y+1,7)
            end
            if pget(x,y-1)==12 then
                pset(x,y-1,7)
            end
            if pget(x+1,y)==12 then
                pset(x+1,y,7)
            end
            if pget(x-1,y)==12 then
                pset(x-1,y,7)
            end

            if pget(x,y+1)==2 or pget(x,y+1)==9 then
                pset(x,y,12)
            end
            if pget(x,y-1)==2 or pget(x,y-1)==9 then
                pset(x,y,12)
            end
            if pget(x+1,y)==2 or pget(x+1,y)==9 then
                pset(x,y,12)
            end
            if pget(x-1,y)==2 or pget(x-1,y)==9 then
                pset(x,y,12)
            end
        end
        if c==9 then
            local q
            if pget(x+1,y)==6 and q==0 then
                pset(x+1,y,c)
            end
            if pget(x-1,y)==6 and q==0 then
                pset(x-1,y,c)
            end
            if pget(x,y+1)==6 and q==0 then
                pset(x,y+1,c)
            end
            if pget(x,y-1)==6 and q==0 then
                pset(x,y-1,c)
            end

            if pget(x+1,y)==12 or pget(x-1,y)==12 or pget(x,y+1)==12 or pget(x,y-1)==12 then
                pset(x,y,6)
                q=1
            else
             q=0
            end

        end
    end
end
end

function mousedraw()

if mb==1 and not(btn(5)) then --if left click then
  circfill(mx,my,size,dc) --draw red/wall at mouse pos
 elseif mb==2 then --if right click (or ctrl click)
  circfill(mx,my,size,0) --erase (draw black at mouse pos)
 end
if btn(5) then --check if x is pressed
    if mb==1 and j==0 then --only do this once per fill!
        ox=mx --set old mx to mc
        oy=my --same for old my
        j=1 --j
    end
    if mb==1 then-- if mousedown
     omb=1 --set old mouse click to 1
     rect(ox,oy,mx,my,16) --fill outline
    elseif omb==1 then --if its one then
     rectfill(ox,oy,mx,my,dc) --fill
     omb=0 --set old mouse button to 0 (because mouse was released)
     ox=nil --nil ox and oy
     oy=nil
     j=0 --j
    end
else
    ox=nil --if x isnt pressed, nil x and y, then j
    oy=nil
    j=0 
end

end

function ui() --ui bar
 rectfill(0,0,480,8,29) --bar
 circfill(4,4,2,dc) --current color
 rect(0,0,8,8,5) --outline on current color
 print("size:"..flr(size),50,1,0)--brush size
 print(scolor,12,1,0)
 print("Cpu: "..flr(stat(1)*10),100,1,0) 
 if sim==1 then
    print("running",445,1,0)
 else
   print("paused!",445,1,0)
 end 
 if dc==0 then scolor="erase"end
 if dc==1 then scolor="deut"end
 if dc==2 then scolor="fire"end
 if dc==3 then scolor="plant"end
 if dc==4 then scolor="wood"end
 if dc==5 then scolor="wall"end
 if dc==6 then scolor="stone"end
 if dc==7 then scolor="snow"end
 if dc==8 then scolor="eater"end
 if dc==9 then scolor="lava"end
 if dc==10 then scolor="proton"end
 if dc==11 then scolor="neutron"end
 if dc==12 then scolor="water"end
 if dc==13 then scolor="paint"end
 if dc==14 then scolor="bomb"end
 if dc==15 then scolor="sand"end
end

function controls() --controls
        if btn(1) then dc+=0.1 end --change brush color
        if btn(0) then dc-=0.1 end
        if dc<0 then dc=0 end --dont let color be too much or little or else
        if dc>15 then dc=15 end --the screen dies :(
        if btn(2) then size+=0.1 end --change brush size
        if btn(3) then size-=0.1 end
       if size<0 then size=0 end--dont let it go negative
        if btn(4)==true then sim=0 else sim=1 end --pause when z is held
        if btn(1)==false and btn(0)==false then dc=flr(dc) end
end

As you can tell, this is based off of The Powder Toy (which you should play!) this is not intended to be a recreation of TPT, more like a demake.

TPT download: https://powdertoy.co.uk/

PicoTron playground: https://www.lexaloffle.com/picotron.php?page=playground

PicoTron main page: (Buy it. gun.png) https://www.picotron.net/

First picotron game ever made: https://www.lexaloffle.com/bbs/?tid=52328

Controls (This game)

Left click - Draw with selected pixel.
Right click - Erase (draw black).

Up/Down - Change brush size.
Left/Right - Change pixel type.
X (hold) - Rectangular fill (Hold x and press and drag Lclick, then release when ready to fill).
Z (hold) - Pauses simulation while held.

Basic reactions (and images!):

Plant and wood burn.

Neutrons eat Deuterium.
Plant eats water.
Water can freeze.

Lava and fire and protons are hot.
Bomb is bomb.

Stone melts when hot.

paint does nothing (just for drawing)

Water and lava dont mix!

And more?

Comment if you'd like to see any additions! ill add them if they are reasonable/are possible.

Thanks for checking this out! i hope you have fun with it.

P#134696 2023-09-21 03:30 ( Edited 2023-09-22 20:16)

1

can you add some pictures here?

P#134738 2023-09-21 22:09

Thanks for the suggestion, @merwok ! i just added some images for the game. sorry i took awhile, i was having some technical issues with picotron not reading my clipboard.

P#134778 2023-09-22 19:59

[Please log in to post a comment]