Web
Analytics
Log In  
25

Cart [#55974#] | Copy | Code | 2018-08-31 | Link
25

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).

Tie Fighters

All flying NPCs are following boids behavior (seek, avoid, follow) and are really a blast to watch in pack (imho)!
Baddies will try to get on your six to fry good old r2d2 :/

Proton Torpedo

Proton flight path is following Proportional Navigation rules. Gives a nice interception path (and the math is cool :)

3d Engine

Engine is a edge renderer (wireframe only as you certainly noticed!). It supports faces with an arbitrary number of edges to reduce visual cluter and achieve good performance.

Face culling is using object-space culling, the normal.point constant is pre-calculated when model is loaded.

Quaternions functions ported from ThreeJS.

3d Sound

(sort of...) Sound volume is changed at runtime according to sound emitter location, using the PICO-8 "feature" that sfx can be modified without impacting currently playing sound.
Note: sfx 63 is reserved for that use.

Software Pipeline

3d assets are modeled in Blender, exported in sprite/map format using a Python exporter .

Models are unpacked from spritesheet/map memory at startup and made available in a global table.

All game data are expressed as JSON strings, supporting references to global functions. Ex:

_g.update_player=function(self)
  self.x+=1
  self.y+=0.5
end()
local player=json_parse('{"x":0,"y":0,"update":"update_player"}')
-- works!
player:update()

Mini json parser from Tyler Neylon: lua JSON parser

Code is minified using picotool.
Music lifted from "public" MIDI files, simplified and converted with midi2pico.

Changelog

1.0:

  • Initial public version
  • Bug: not able to restart after gameover (will be fixed soon)

1.1:

  • change: redone control scheme (flat turn, optional roll)
  • change: removed boost
  • change: laser auto lock
  • change: difficulty curve
  • fixed: NPC flight AI
  • fixed: torpedo aiming

1.2:

  • added: menu to switch view
  • changed: turret & tie fire lead (+ random chance to miss)
  • changed: tie fighter difficulty ramp up
  • fixed: random hit on NPC (distance function overflow)
  • fixed: reworked trench to keep 60 fps
  • removed: in-game help
P#53727 2018-06-23 09:45 ( Edited 2018-09-04 17:11)

9

Cart [#52460#] | Copy | Code | 2018-05-06 | Link
9

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

My contribution is mostly on a clean 2d vector and 2x2 matrix object oriented library.
It makes vector/matrix math very concise to work (and easy to port from C++ code!):

local v1,v2=vec(3,4),vec(5,6)
local v3=v1+v2
-- rotation matrix
local m=mat:make_r(0.4)
local r=m*v3

Note: I don't plan to expand the library beyond this demo, feel free to make a game out of it!

The cart now include a context menu that could be fairly easily reused for other carts.

Missing Features:

  • Optimisation pass (currently supports ~4/5 objects max)

Change Log

1.0:

  • initial revision

1.2:

  • added: support for circles

1.3:

  • fixed: force reset
  • changed: left click now creates a new body
  • added: right click menu to control world or object settings
P#52222 2018-05-01 08:32 ( Edited 2018-05-06 12:44)

15

Cart [#50248#] | Copy | Code | 2018-03-11 | Link
15

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)

Tech. Details

Not much really - using bits of my Pico 8 "game toolkit":

  • anti-aliased circle fill (using mid-point error for the shading)
  • multiple "CRT" shaders (find out how to switch between them!)
  • a couple of future functions using yield
  • vector font rendering

Credits

  • Felice: anti-aliased line optimisation genius!
  • Trammell Hudson: Asteroids font (https://trmm.net/Asteroids_font)
  • Atari: for the art cover (my lawers are on the copyright case :)
P#49676 2018-02-25 17:01 ( Edited 2018-08-21 16:55)

8

Cart [#49509#] | Copy | Code | 2018-02-22 | Link
8

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...

algorithm
P#49510 2018-02-22 15:16 ( Edited 2018-02-28 02:42)

23

Cart [#50452#] | Copy | Code | 2018-03-15 | Link
23

Suzie and Bob are trapped in a merciless world. Can you fight your way out?

Gameplay Elements

  • Random maps
  • Multiple biomes

  • Multiple enemies
  • Multiple weapons (but one at a time!)
  • Loop-based difficulty
  • Supports keyboard/mouse

Controls


Keyboard:

  • arrow keys: move & gun direction
  • bttn 1: fire & lock direction
  • bttn 2: pick up weapon

Mouse (selected in option menu):

  • arrow keys: move
  • mouse: gun direction
  • left click: fire
  • right click: pick up weapon

Note: any resemblance with a famous Vlambeer game must be purely accidental...

Changelog


1.2:

  • fixed: woobly sprites
  • fixed: actors stuck on corners
  • fixed: warp in/out effect
  • changed: impact feedback
  • changed: health upgrade on loop

1.1:

  • fixed: unexpected god mode
  • fixed: boss hp
  • fixed: boss attack
  • changed: tweaked game speed
  • change:balanced high level gameplay (loop)

1.0:

  • preview version

Dev Log


2nd finished game (last was Thunderblade). Took 4 months to complete & refine.
Un-minified source available on Github:
freds72/pico8/carts/nuke.p8

Tech Highlights
JSon Rules!
All entities (actors, weapons, particles, levels) defined using json (worth 3500 tokens!). A lightweight parser (450 tokens) converts strings into lua tables.

Entities are created using a parent template with support for:

  • lua references
  • random values
  • method & attributes override

Rotating Sprites
Player weapon (and couple of other sprites) are rotated in real-time using an optimized sprite routine. It is fast enough to allow ~10+ sprites on screen (before tanking FPS!)

Performance
An actor map is maintained each frame. It allows immediate bullet/actors lookup.
Only player/npc collisions are checked to ensure player cannot zip through enemies.

A-* path is refreshed for a single npc per frame. It ensures a large number of npc’s can be created without too much cpu stress.

Sprites are added to buckets matching their y pixel coordinate.
Saves both cpu and tokens as no global sort is required :]

Toolchain
Cart is minified using picotool (19k compressed). All json attributes are replaced by their short equivalent using output from minification script:
cat nuke.p8 | minify | replace > nuke_mini.p8

Missing In Action:

  • RPG aspects (upgrades/xp/abilities...)
  • Good music (for total lack of musical skills!!)
  • Scoreboard

Credits

shooter 2d
P#48516 2018-01-24 15:49 ( Edited 2018-03-15 17:52)

12

Cart [#44887#] | Copy | Code | 2017-10-03 | Link
12

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?

arcade retro
P#44889 2017-10-03 16:02 ( Edited 2017-10-20 02:38)


:: More
X
About | Contact | Updates | Terms of Use
Follow Lexaloffle:        
Generated 2018-09-20 09:37 | 0.423s | 1835k | Q:67