Hey everyone,
I'm super excited to be sharing my first ever PICO-8 game with you today. It's a two player battle game similar to 'Worms' where two tanks fight to the death on fully destructible terrain.
CONTROLS:
- Movement: Left + Right
- Aim: Up + Down
- Shoot: X
GOAL:
Destroy the terrain under your opponent. The first tank to reach the bottom of the screen loses!
GOOD LUCK AND HAVE FUN! :)
Finally "done" :)
> You awake from your rest in the void with a voice repeating in your head.
> It says: 'meow meow meow meow mexow' and you know what must be done:
> It's time to retrieve the book of Magu F'ahn.
You're a cat, you're magical, it's you and your wand against insurmountable odds, cats, and infinite pigeons.
A retro fps with 8 singleplayer maps and 3 "botmatch" maps. Select maps from main menu, all botmatch maps unlocked from the start, singleplayer maps unlock as you complete them.
You can also play this on the PICO-8 BBS
Controls
- Arrow keys - move (strafe if mouselook enabled)
- Z/C - strafe/sidestep (hold, then press left and right, unused with mouselook enabled)
V1.1 Changes:
- Level 12 is completely redone
- Current level number is shown in top right
- Auto jumping is prevented
- Wolrd 3(level 9-12) invisible blocks are a bit more visible
- Hitting the top of a block is more forgiving
You are a slime that can only jump once, but with the help of jump coins you'll be able to jump once more.
This is my first game made with Pico-8 and my first try at game dev as a whole.
Please enjoy :)
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 [ [size=16][color=#ffaabb] [ Continue Reading.. ] [/color][/size] ](/bbs/?pid=78580#p) |
So I spent a few hours over the last few days recreating a flash game I found online a while back (http://abagames.sakura.ne.jp/flash/ffs/).
I challenged myself to try to recreate the game without looking at the code the original developer provided. After that I added powerups to add a new spin on the original game.
It's missing sound effects and music, but otherwise I've added music and sfx and the game is basically done.
I was wondering what colors were useable for the background and when I went to go look I was sad because darkgreen wasn't useable :| I was wondering if more colors that aren't used for text colors could be background colors! IDK it's not really important but I would love a darkgreen background option.
[EDIT: forgot that the mouse has dark blue when pal swapped img. : o]
Left and Right arrow keys to move paddle, press Up or mouse key to launch!
Inspired by the 70+ video playlist by Lazy Devs, I'm happy to share with you the results of my first real game project.
Ultra Breakout features 10 levels and multiple control options including mouse and touch. There is a slight point advantage to using the standard controls and a slight point disadvantage to using mouse controls.
I hope you enjoy the quick diversion and checkout the original project here. Good luck breaking your personal highscores!
Hi everyone, I'm fairly new to programming and Pico8.
I'm trying to add powerups to one of my games. I've made an empty table and a function to create each powerup within it.
The problem I'm having is that I'd like one single random powerup to be created depending on the score (say when score==5)
I've managed to do this but the problem was that a second powerup gets created before the player has the chance to up the score.
I've tried to use time() and also creating a boolean but I haven't managed to get 1 single powerup on screen at a time, I either get more than one or nothing.
What would be the best way to do this?
here's the code I have at the moment:
function _init() score=0 powerups={} end function _update() if score==5 then powerup=true end if powerup==true then create_powerup() end end function _draw() for capsule in all(powerups) do spr(capsule.sp,capsule.x,capsule.y) end end --powerups powerups_start=5 total_powerups=4 fall=1 function create_powerup() capsule={ sp=powerups_start+flr(rnd(total_powerups)), x=flr(rnd(100)+20), y=flr(rnd(10))+20 } add(powerups,capsule) powerup=false if powerup==false then del(powerups,capsule) end end function update_powerup() for capsule in all(powerups) do capsule.y+=fall if capsule.x>=player.x and capsule.x<=player.x+player.w and capsule.y==player.y-player.h then sfx(2) lives.left+=1 del(powerups,capsule) end if capsule.y>128 then del(powerups,capsule) end end end |
Thanks in advance!
A simple game about fixing very simple circuitry.
Hopefully it should be fairly self explainitory but you might have to do a little thinking for yourself.
Made in two weeks, a twofold task to myself - get it done in time (I originally intended 1 week but that was unrealistic) and actually finish something! :P
This is my first published PICO-8 cart but by no means my first attempt.
I am not really an artist and definitely not a musician so appologies if these are not the best. (You can mute just the music from the pause menu)
I really enjoyed the process of making this and thought I would share it. It is in a finished state but it may need some difficulty tweaking at some point.
I would like to give credit to:
- nerdyteachers.com for showing me how to do screen shake. Found
This is a basic, and not very efficient benchmarking/profiling cart.
It can handle simple nesting and repeated calls for a given label, averaging the results.
Usage
Begin and end profiling:
bm("Label") -- code bm() |
Call at the beginning of update to clear stored data:
bm:reset() |
Enable or disable benchmarking:
bm:toggle() |
Show benchmarking results when enabled:
bm:draw() |
As stated in the title, you can now use up to 32 colors at the same time in pico-8 now.
The feature was revealed by Zep in this thread: https://www.lexaloffle.com/bbs/?tid=38555
This makes all the suggestions I gave in that thread possible and more.
You can't simply use all colors all over the screen though. You have 2 screen palettes and you basically have to select which palette you will use on each drawn line on the screen. In the gif above, the screen is divided into 2 halves, each with its own palette.
Palette Scanlines
Here is the code I used for both screen palettes:
--regular screen palette pal(( { [0]=128+9,9,1,128+12, 13,12,6,7, 8+(curr_shield==6 and 128 or 0),2,128+10,128+11, 128+15,10,4,15}),1) --values 0x10 and 0x30 to 0x3f change the effect poke(0x5f5f,0x10) --new colors on the affected line pal({[0]=2,0x8d,1,0x81,0x8d,0x8c,0x86,0x87,0x88,0x81,3,0x83,0x86,0x8a,0x82,0x87},2) [ [size=16][color=#ffaabb] [ Continue Reading.. ] [/color][/size] ](/bbs/?pid=78518#p) |
Mayhem is my PICO-8 remake of Julian Gollop's 1985 masterpiece: Chaos Battle of Wizards. It is a game I have tried and failed to make many times, but it looks like maybe this time was the charm! I did not blindly remake the original game. Instead, I have taken heavy inspiration from it while trying to make it my own.
This is the first fully playable beta release (v1.0.0b1). Unfortunately, I ran out of tokens for adding AI players, but you should be able to have some hot-seat fun with a friend or three.
Changes:
- 2020/08/22 (v1.0.0b1):
- First completely playable version of the game.
- Hot seat only (I ran out of tokens to do AI as well).
- 2020/07/27:
- Walking & flying movement.
First coding I did using PICO-8 trying to get used to it
and I made a character edit/select screen, lets you change colour of clothes/skin
Hello! I am setting up a Pico 8 Console in my shed, but can't get the screen scaling just right. This is running on a raspberry pi, and otherwise seems to work great.
However, Pico 8 runs either much too small, or just a fraction too big.
These are the settings I am using in config.txt.
Is anyone able to help?
// :: Video Settings window_size 768 576 // window width, height screen_size 768 576 // screen width, height (stretched to window) pixel_perfect 0 // :: Window Settings windowed 1 // 1 to start up in windowed mode window_position -1 -1 // x and y position of window (-1, -1 to let the window manager decide) frameless 1 // 1 to use a window with no frame fullscreen_method 0 // 0 maximized window (linux) 1 borderless desktop-sized window 2 fullscreen |
Hello.
I am running Pico-8 using this bat file, so that it stays portable, and all files, settings and carts are kept in one folder (I really don't like how Pico-8 puts stuff in a random folder that Windows people usually never use).
start pico8.exe -music_volume 0 -home . -root_path . -desktop_path . %*
I also changed -music_volume to 0 in the config.txt file.
However, every time I run Pico-8, the setting in the config file gets reverted back to 256 and the music volume always stays on.
Also, every time I run Pico-8, I maximize the window (not full screen), but the next time I run it, it always starts as a small window, not a maximized window.
What am I doing wrong?