@zep
A couple of devs are investing into multicart games (like 5 or more data carts).
We are all put back by the artificial loading times (eg minutes)
Would it be possible for the fat client to either ignore load time throttling, or only activat throttling for the published version?
I want the multicart multiverse, not loading screens ;)






Using the cough undocumented cough stat(102) from a game hosted on itch.io, I got back:
v6p9d9t4.ssl.hwcdn.net |
This is indeed the url of the iframe (which doesn't help).
A more correct behavior would be to report the parent page url, with the benefits of:
- having a predictable outcome
- actually preventing rogue hosting (somehow...)
Note: Looking at the HTML, I see that url is retrieved from:
var str = window.location.hostname; |
Using that alternate code would fix the bug:
var str = (parent !== window) ? document.referrer : document.location; |

Ce post est la version française de: PICO-8 Giveaway
Initié par @Liquidream, plusieurs developpeurs offrent des licences pico8 à des jeunes (et moins jeunes) qui n'auraient pas les moyens mais pleins d'idées!
Participation
Pour avoir une chance de gagner, repondez à la discussion officielle avec un petit message:
- pourquoi vous voulez une licence?
- quel jeu(x) comptez-vous créer?
Les Règles
- Ouvert à tous (sauf ceux qui peuvent se payer une licence ET un sandwich!)
- Une seule entrée par personne
- Date de cloture (ouch!) Samedi 6 Juillet @ 11:00 (heure Paris)
- Les gagnants seront choisis au hasard
- Il y aura autant de gagnants que de licences offertes
- La licence sera attribuées via un compte mail (message privé)
Bonne chance 😁🤞


Ghost Rally
Game
The game is a race-against-yourself rally game. It features accurate rigid body physics and car handling.
Goal is to beat yourself every lap!
Enjoy racing as in the 80's, whith over powered cars very close to the public!
tip hitting any of the lil' dudes:
![]() |
[0x0] |
warning the game is complete yet the car handling is really picky - I am releasing it as is, as I can't tweak the gameplay without breaking the physic engine :/








.jpg)

I am writing data to a p8 file from a Python program - format for 0x0-0x3200 ROM range is ok.
Issue is sfx section - each sfx (68 bytes) is actually written as 84 bytes (??) with empty bits left and right.
I have no clue what is the masking/bitshifting/... logic between my input value and the resulting p8 string.
Example:
poke4(0x3200,0x1234.5678) cstore() |
produces:
__sfx__ 000100003813534011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
wtf??

Case solved: issue was triggered by one of my USB sticks constantly sending inputs
When exporting Tiny Sim, some keys are stuck:


Project started following a question on 3d clipping on this forum and quickly spiraled into a full blown 3d renderer with support for real-time shadows and camera space clipping :/
Shadows are calculated in real-time by extruding a shadow volume from each lit face.
Resulting polygons are added to the face and rendered/sorted with the face.
The shadows are globals e.g. self-shadowing is supported, see torus scene.
Performance-wise this is bordering what pico can support, as many clipping operations are required to generate shadow polygons. There is room for optimization (vertex cache, smart selection of clipping planes) left to the reader!
Sources
Project (including how to add custom 3d models) is available here:


Since forum updates, new gif uploads are rendered as broken links.
See: https://www.lexaloffle.com/bbs/?pid=59400#p
Be a X-Wing pilot!
Take a seat in the most advanced fighter of the galaxy. Fight against the evil empire!
Use proton torpedo to quickly dismiss enemy forces or your 4 blasters (aiming skill required).
Go through 4 epic missions, from space to Deathstar and back.
Flight Manual

Copyright Notice
Starwars logo/music/... credits to their respective owners. Don't sue me :/
Dev Log
This is a demake of the X68000 Attack of the Deathstar game, (kind of) complete with space/ground/trench missions.
This version departs from the original with a less arcade/grinding gameplay.
The un-minified version can be found (as usual) on my Github page (includes all 3d assets).









Hi,
Coroutines are an essential part of my game engines.
However, I don't get how I can do both:
- raise an error when something bad happens
- silently handle proper coroutine termination
coresume returns a pair (is running,exception).
Thing is exception is set even during normal termination!!
note: costatus doesn't help as it immediately flips to "dead" when the coroutine crashes.
Something like that doesn't work, e.g. I get an assert even after genuine termination:
local co function _init() co=cocreate(function() for i=1,10 do yield() end -- syntax error test -- i=k/10 end) end function _update() if co then local r,e=coresume(co) print(costatus(co)) if not r then if(e) assert(r,e) -- never reached co=nil end end end |


As a temporary side project, I hastily ported Randy Gaul ImpulseEngine to pico-8/LUA.
Usage
Requires a mouse
- left mouse button: create a random shape at mouse cursor or drag shapes
- right mouse button: show/hide world or body options
- button c: show/hide debug information
Dev Log
The physic engine is a direct port from Randy Gaul's work, detailled in a series of articles:
How to Create a Custom 2D Physics Engine
Anti-Aliased Asteroids
Hastily crafted Asteroids clone complementary of the anti-aliased line thead:
https://www.lexaloffle.com/bbs/?tid=30810

Changelog
1.3:
- Added: Teleport ('c' button)! Up to 3 chances (sort of...) to get out of trouble

- Changed: inertia cranked up, use your thrusters!
- Changed: safe time is now 2s
- Changed: thrust is now 'up' only
- Fixed: Saucer Invasion!
1.2:
- Fixed: incorrect font rendering
- Fixed: incorrect high score message on game over
- Changed: reduced number of rocks to 4
1.1:
- Fixed: crash with dead player
- Changed: multiple rocks types
- Added: saucer!
- Added: highscore (saved in cart data)
- Added: multiple CRT effects (enjoy @Felice!)
- Bug: couple of chars incorrectly rendered
1.0f: temp. fix by @Felice (tks!)
1.0: initial release (did not work)
[h2]Tech. Details








This cart is just to provoke @zep (or any other true Pico-8 genius) into releasing a fast anti-aliasing demo cart!
The code is a LUA port of that paper:
http://jamesarich.weebly.com/uploads/1/4/0/3/14035069/480xprojectreport.pdf

Note: I don't get how an incremental line drawing routine (a la Bresenham) can be that slow (compared to the native version). 270% cpu usage for 16 lines sigh...



While playing with the very handy picotool utility, I discovered that simply removing tabs on my well formatted code I was able to save 813 compressed bytes!!!
Seriously???
I've spent days trying to remove code, reshuffle stuff to save 50-100 bytes and simply making my code unreadable beats any of these optimizations??
:_[



Back 30 years ago, After Burner and Thunderblade ruled the arcades.
As a kid, I only had an Amiga and near zero coding skills to produce very (very) weak clones.
Now a seasoned programmer with the mighty power of PICO-8, I can beat a Sega X board!
Well, err...:

Credits
• Chris Butler (player + tank sprites lifted from the C64 1989 version)
• gamax92 for midi to pico-8 program
• dw817 (david w) for image decompression code (http://writerscafe.org/dw817)
• pico-8 community
What's Missing
• gameplay tweaking...
• levels 2,3,4,5
• gazillions of buildings on screen!
Tech Details
Map:
Drawn using sprite sheet (2), you can tweak the level using colors:
4: tank
6,7,13: building
8: enemy helicopter
9: Battleship boss
10: swtich to chase mode
11: switch to top-down mode
15: end_game (use carrefully!)
Title screen:
Title image is loaded from a stringified image, decompression done 'asynchronously' with yield.
Main screen:
Buildings are mostly drawn with many rectfill using a big checkerboard pattern to simulate windows/floors.
Everything is z-sorted (w actually ;) before being drawn. This 'zbuffer' is in charge of drawing every asset.
Game screen manager:
A light version of what I've extensively used during my XNA period. Allows nice decoupling between game loop and other loops (title, game over).
Coroutines:
Used only for rare events (like player dying) to easily control animation and state changes.
Lessons Learned
• PICO-8 is a fantastic platform. Forces you to keep things simple (say that to my dozen or so failed Unity attempts...)
• token count is everything
• Coroutines are unfortunately too slow to be used in the core game loop
• Throw OOP techniques out. The nice class:method() construct eats up too many tokens - had to rewrite half of the code to stays within the limits :[
• bnot-cheating the platform is way too easy (but resisted against!)
• Did I say token count is everything?






Working on my game, I often find myself wondering how much cpu such or such construct uses.
I do my benchmarks using stat(1).
Issue is, my measures are all over the place according to the number of samples :[
Ex: Let's bench band vs. % and shr vs / @ 100 calcs/update
Good, % is almost free, / is slightly better than shr
Let's try 200:
Hu? shr is now better than /
Push it to 300:
Back to "normal"
400:
WTF?
How come number of samples for a given run is turning results upside down?
Note: if I push number of iterator further, I tend to have stable results - but who's performing 5000% per update cycle?!?
On top of that, @zep, we should be provided with op cost of basic operations (similar to cpu specs).
Reference code:
function bench(name,n,fn) local t0=stat(1) for i=1,n do fn(i) end return {name,(stat(1)-t0)} end function stat2pct(s) return flr(1000*s)/10 end function bench_draw(name1,stat1,name2,stat2,y) print(name1.." vs. "..name2,1,y,7) y+=6 local total=stat1+stat2 local pct1,pct2=stat1/total,stat2/total local c1,c2=8,11 if(stat1<stat2) c1=11 c2=8 local x=flr(128*pct1) rectfill(0,y,x+1,y+6,c1) x+=1 print(stat2pct(stat1),x/2,y+1,0) local x2=128*pct2 local msgx2=x+x2/2 if(x2<1) then x=127 x2=127 msgx2=120 end rectfill(x,y,x+x2,y+6,c2) print(stat2pct(stat2),msgx2,y+1,0) y+=8 return y end local res={} local n=100 function _update60() if(btnp(0)) n-=100 if(btnp(1)) n+=100 n=max(n,100) res={} add(res,bench("band",n,function() j=band(546,127) end)) add(res,bench("%",n,function() j=546%128 end)) add(res,bench("shr",n,function() j=90/8 end)) add(res,bench("/",n,function() j=shr(90,3) end)) end function _draw() cls(0) rectfill(0,0,127,6,1) print(n.." iterations - \139\145 to change",1,1,7) local y=9 for i=1,#res,2 do y=bench_draw(res[i][1],res[i][2],res[i+1][1],res[i+1][2],y) end end |


