I'm working on my first PICO-8 game which is also the first time I really got into programming. Now I almost hit the token count but I don't really know how to shorten the code. I also admit I got really careless when writing the code and was mostly just happy whenever it worked. In at least three instances I'm 100% certain there needs to be a much more efficient way to code, any experienced programmer will probably cringe so bear with me.
But I'd really appreciate any help!
The first code is a function that adds text to the screen with each sentence delayed.
oprint2() is just a function I copied from Sophie Houldens talkthrough of Curse of Greed which adds an outline to the text.
Right now there are six texts but I want this function to work with an even greater number of texts and to able to make changes without so much hussle!
The text content and the if-statements to trigger them are always different.
The text style/colors are always the same. Right now I have individual timer variables are for each text which I realize is horrible. If it helps, I'd have no problem with all texts having the same speed.
function intro()
camera()
controls()
if ending_init==0 then
if help==1 then
if game_start_t <= 320 then
oprint2(" move\n\n ⬅️ ⬆️ ⬇️ ➡️",8,24,0,15)
end
if game_start_t >= 180 and game_start_t <= 460 then
oprint2("\n\n search for hints\n\n ❎",8,44,0,15)
end
if game_start_t >= 370 and game_start_t <= 530 then
oprint2("\n\nsearch through our belongings\n\n ❎",8,64,0,15)
end
if game_start_t >= 500 and game_start_t <= 700 then
oprint2("\n\n surrender\n\n 🅾️",8,84,0,15)
end
if game_start_t <= 710 then
game_start_t += 1
end
end
if p.keys >= 1 and dget(2)!=1 then
if key_timer <= 240 then
oprint2(" a key",8,24,0,15)
end
if key_timer >= 50 and key_timer <= 270 then
oprint2("\n\n opens either a chest\n\n or a door",8,34,0,15)
end
if key_timer >= 120 and key_timer <= 300 then
oprint2(" and might only fit once.",8,82,0,15)
end
if key_timer <= 310 then
key_timer+=1
else
dset(2,1)
end
end
if steponfv >= 1 and dget(3)!=1 then
if stepon_timer <= 240 then
oprint2("every small decision",8,24,0,15)
end
if stepon_timer >= 50 and stepon_timer <= 270 then
oprint2("\n\n will\n\n influence",8,34,0,15)
end
if stepon_timer >= 120 and stepon_timer <= 300 then
oprint2(" our fate.",8,82,0,15)
end
if stepon_timer <= 310 then
stepon_timer+=1
else
dset(3,1)
end
end
if musx == 7 and musy == 3 then
if restart_timer >= 350 and restart_timer <= 600 then
oprint2("the heart of the desert",8,24,0,15)
end
if restart_timer >= 700 and restart_timer <= 1000 then
oprint2("\n\nwhere everything ends\n\n and everything begins ...",8,34,0,15)
end
if restart_timer >= 1100 and restart_timer <= 1400 then
oprint2("we came so far this time",8,54,0,15)
end
if restart_timer >= 1500 and restart_timer <= 1800 then
oprint2("are you ready\n\n to unlearn everything\n\n again ...?",8,74,0,15)
end
restart_timer+=1
if restart_timer >= 1980 then
poke(rnd(23800),rnd(0x100))
end
end
if musx == 1 and musy == 0 and hiddendoorv == 0 and greedv == 0 and steponv == 0 and steponfv == 0 and textreadv==0 and ending_i==0 then
if east_timer >= 50 and east_timer <= 250 then
oprint2("this is not the empty room ...",8,24,0,15)
end
if east_timer >= 200 and east_timer <= 300 then
oprint2("we shall head east\n\n and ascend!",8,44,0,15)
end
if east_timer <= 310 then
east_timer+=1
end
end
if musx == 4 and musy == 0 and hiddendoorv != 0 and textreadv !=0 then
if empty_timer >= 30 and empty_timer <= 120 then
oprint2("my mind is restless",8,24,0,15)
end
if empty_timer >= 140 and empty_timer <= 220 then
oprint2("the noise is unbearing",8,44,0,15)
end
if empty_timer <= 230 then
empty_timer+=1
end
end
end
end |
The second code teleports the player from certain map tiles to others when stepped on.
Sometimes it works two ways but then it changes to one tile in either x or y to prevent a loop.
My problem is again that the if-statements are always different so I don't know how to group them together and sometimes there are multiple if-statements or they require different variables than p.x and p.y.
function desert_teleport()
if ending_init== 0 then
if greedv >= greed_one then
if p.x == 1 and p.y == 1 then
p.x = 49
p.y = 1
end
elseif hiddendoorv >= hiddendoor_one then
if p.x == 4 and p.y == 6 then
p.x = 88
p.y = 54
end
elseif textreadv >= textread_one then
if p.x == 79 and p.y == 60 then
p.x = 121
p.y = 25
end
end
if (p.x >= 112 and p.x <= 127 and p.y == 47) or (p.y >= 16 and p.y <= 47 and p.x == 127) then
p.x = flr(rnd(14)) + 97
p.y = flr(rnd(14)) + 34
elseif (p.y >= 16 and p.y <= 32 and p.x == 112) or (p.x >= 96 and p.x <= 111 and p.y == 32) then
p.x = flr(rnd(14)) + 113
p.y = flr(rnd(14)) + 34
elseif (p.y >= 32 and p.y <= 63 and p.x == 96) or (p.x >= 96 and p.x <= 111 and p.y == 63) then
p.x = flr(rnd(14)) + 113
p.y = flr(rnd(14)) + 17
elseif (p.y >= 2 and p.y <= 13 and p.x == 31) then
p.x = flr(rnd(12)) + 65
p.y = flr(rnd(12)) + 1
elseif p.x == 79 and p.y == 60 then
p.x = 17
p.y = 37
elseif p.x == 16 and p.y == 37 then
p.x = 78
p.y = 60
elseif p.x == 35 and p.y == 15 then
p.x = 89
p.y = 49
elseif p.x == 89 and p.y == 48 then
p.x = 35
p.y = 14
elseif p.x == 40 and p.y == 0 then
p.x = 99
p.y = 30
elseif p.x == 99 and p.y == 31 then
p.x = 40
p.y = 1
elseif p.x == 6 and p.y == 63 then
p.x = 107
p.y = 17
elseif p.x == 107 and p.y == 16 then
p.x = 6
p.y = 62
elseif p.x == 92 and p.y == 31 then
p.x = 19
p.y = 30
elseif p.x == 19 and p.y == 31 then
p.x = 92
p.y = 32
elseif p.x == 0 and p.y == 10 then
p.x = 110
p.y = 22
elseif p.x == 111 and p.y == 22 then
p.x = 1
p.y = 10
elseif p.x == 16 and p.y == 28 then
p.x = 110
p.y = 25
elseif p.x == 111 and p.y == 25 then
p.x = 17
p.y = 28
elseif p.x == 56 and p.y == 0 then
p.x = 40
p.y = 42
elseif p.x == 79 and p.y == 41 then
p.x = 1
p.y = 38
elseif p.x == 0 and p.y == 38 then
p.x = 78
p.y = 41
elseif p.x == 47 and p.y == 17 then
p.x = 1
p.y = 56
elseif p.x == 0 and p.y == 56 then
p.x = 46
p.y = 17
elseif p.x == 41 and p.y == 31 then
p.x = 39
p.y = 49
elseif p.x == 39 and p.y == 31 then
p.x = 88
p.y = 1
elseif p.x == 38 and p.y == 48 then
p.x = 40
p.y = 30
elseif p.x == 40 and p.y == 48 then
p.x = 69
p.y = 46
elseif p.x == 89 and p.y == 63 then
p.x = 118
p.y = 57
elseif (p.x >= 16 and p.x <= 31 and p.y == 0) or (p.x >= 97 and p.x <= 110 and p.y == 0) then
p.x = 88
p.y = 10
end
end
if ending_init==1 then
if p.x == 0 or p.x == 127 or p.y == 0 or p.y >= 63 then
p.x = flr(rnd(125)) + 2
p.y = flr(rnd(61)) + 2
end
end
end |
The last function switches out certain maptiles with others if some conditions are met. I have a lot of different tables and functions of this kind but for brevity I'll just post two.
Compared to the first two I think they are less awful but I still feel they could be optimized.
trap_table ={109,109,109,79,79,79,79,79,49,50,24,24,25,25,40,40,41,41,96,96,112,112,75,76,91,115,117,117,100,101}
function place_traps()
for a=0,127 do
for b=0,63 do
if mget(a, b) == 109 then
mset(a, b, trap_table[flr(rnd(#trap_table))+1])
end
end
end
end
function place_corrupt()
for a=0,127 do
for b=0,63 do
if mget(a,b)==79 or mget(a,b)==5 or mget(a,b)==14 or mget(a,b)==15 or mget(a,b)==46 or mget(a,b)==47 then
mset(a,b,trap_table[flr(rnd(#trap_table))+1])
elseif mget(a,b)==17 or mget(a,b)==52 then
mset(a,b,106)
elseif mget(a,b)==18 or mget(a,b)==88 then
mset(a,b,107)
elseif mget(a,b)==19 then
mset(a,b,122)
elseif mget(a,b)==77 then
mset(a,b,83)
elseif mget(a,b)==78 then
mset(a,b,84)
elseif mget(a,b)==66 then
mset(a,b,92)
elseif mget(a,b)==82 then
mset(a,b,108)
elseif mget(a,b)==67 or mget(a,b)==68 or mget(a,b)==85 or mget(a,b)==74 or mget(a,b)==98 then
mset(a,b,122)
elseif mget(a,b)==56 then
mset(a,b,93)
elseif mget(a,b)==12 or mget(a,b)==13 or mget(a,b)==127 then
mset(a,b,flr(rnd(2))+126)
elseif
mget(a,b)==28 or mget(a,b)==29 or mget(a,b)==8 then
mset(a,b,flr(rnd(2))+7)
elseif mget(a,b)==53 or mget(a,b)==54 or mget(a,b)==124 then
mset(a,b,flr(rnd(2))+123)
end
end
end
end |
Sorry for so much text but I thought I'd just post them 1:1 like they are in the game.
Thanks for any help!





  10 comments