PixelProtocol (pipro) is a protocol for defining what is being sent between the GUI client and the game engine.
It's for implementing games where old-school looking pixel art can be appreciated.
- 256 indexed colors.
- A size of 320x200 pixels is recommended.
- Should be possible to implement both in 16-bit assembly for DOS and in a browser.
- 4-channel audio with multiple waveforms and ADSR envelopes.
- Text rendering with 8 font slots and scaling.
- Advanced sprite operations including rotation, scaling, and collision detection.
- Timing control and frame synchronization.
- Memory management for palettes and screen buffers.
-
Q: Wouldn't it be cooler if Vulkan commands was sent instead? Or OpenGL? Or SDL2?
-
A: Protocols for OpenGL over network already exists and I want to keep things really simple.
-
Q: Can't you just use VNC?
-
A: No, I want something specifically for games or demoscene demos that use 320x200 pixels, 256 colors.
- Version: 0.2
| name | type | description |
|---|---|---|
| ver | uint16 | protocol version |
| width | uint16 | width |
| height | uint16 | height |
| commands | []uint16 | list of commands (uint8 cmd + uint8 argument) |
The commands can be streamed.
| cmd | uint8 argument | |
|---|---|---|
| 0x00 | choose palette color | prepare for filling the palette |
| 0x01 | set red value of chosen palette color | set the color |
| 0x02 | set green value of chosen palette color | set the color |
| 0x03 | set blue value of chosen palette color | set the color |
| cmd | uint8 argument | |
|---|---|---|
| 0x04 | choose pixel color | prepare for drawing |
| 0x05 | set x position | |
| 0x06 | set y position | |
| 0x07 | add to x position | |
| 0x08 | add to y position | |
| 0x09 | plot | draw a pixel |
-
Q: What is the "add to x position" command for?
-
A: since all arguments are bytes, it's needed to be able to specify X coordinates from 256..320.
-
Q: Isn't that a bit impractical?
-
A: Perhaps, but it makes the protocol very simple and uniform. All commands takes a byte as an argument.
| cmd | uint8 argument | |
|---|---|---|
| 0x0a | clear | clear everything with the selected color |
| cmd | uint8 argument | |
|---|---|---|
| 0x0b | draw linewise until nonblack or end | for filling the pixel buffer |
| 0x0c | draw backwards linewise until nonblack or end | for filling the pixel buffer |
| cmd | uint8 argument | |
|---|---|---|
| 0x0d | flip | update all pixels |
| 0x0e | sprite flip | update pixels where sprites have been |
| cmd | uint8 argument | |
|---|---|---|
| 0x0f | choose color for start of line | prepare to draw a line |
| 0x10 | choose color for end of line | prepare to draw a line |
| cmd | uint8 argument | |
|---|---|---|
| 0x11 | set x coordinate for start of line | prepare to draw a line |
| 0x12 | set y coordinate for start of line | prepare to draw a line |
| 0x13 | set x coordinate for end of line | prepare to draw a line |
| 0x14 | set y coordinate for end of line | prepare to draw a line |
| cmd | uint8 argument | |
|---|---|---|
| 0x15 | add to x coordinate for start of line | prepare to draw a line |
| 0x16 | add to y coordinate for start of line | prepare to draw a line |
| 0x17 | add to x coordinate for end of line | prepare to draw a line |
| 0x18 | add to y coordinate for end of line | prepare to draw a line |
| cmd | uint8 argument | |
|---|---|---|
| 0x19 | draw a line | draw the line |
| cmd | uint8 argument | |
|---|---|---|
| 0x1a | choose color for p0 | prepare to draw a filled triangle |
| 0x1b | choose color for p1 | prepare to draw a filled triangle |
| 0x1c | choose color for p2 | prepare to draw a filled triangle |
| cmd | uint8 argument | |
|---|---|---|
| 0x1d | set x coordinate for p0 | prepare to draw a filled triangle |
| 0x1e | set y coordinate for p0 | prepare to draw a filled triangle |
| 0x1f | set x coordinate for p1 | prepare to draw a filled triangle |
| 0x20 | set y coordinate for p1 | prepare to draw a filled triangle |
| 0x21 | set x coordinate for p2 | prepare to draw a filled triangle |
| 0x22 | set y coordinate for p2 | prepare to draw a filled triangle |
| cmd | uint8 argument | |
|---|---|---|
| 0x23 | add to x coordinate for p0 | prepare to draw a filled triangle |
| 0x24 | add to y coordinate for p0 | prepare to draw a filled triangle |
| 0x25 | add to x coordinate for p1 | prepare to draw a filled triangle |
| 0x26 | add to y coordinate for p1 | prepare to draw a filled triangle |
| 0x27 | add to x coordinate for p2 | prepare to draw a filled triangle |
| 0x28 | add to y coordinate for p2 | prepare to draw a filled triangle |
| cmd | uint8 argument | |
|---|---|---|
| 0x29 | draw a filled or empty triangle | 0 for empty, 1 for filled |
| cmd | uint8 argument | |
|---|---|---|
| 0x2a | choose a random color for the pixel | |
| 0x2b | choose random colors for the line | |
| 0x2c | choose random colors for the triangle |
| cmd | uint8 argument | |
|---|---|---|
| 0x2d | choose random coordinates for the pixel | |
| 0x2e | choose random coordinates for the line | |
| 0x2f | choose random coordinates for the triangle |
| cmd | uint8 argument | |
|---|---|---|
| 0x30 | choose sprite ID | select a sprite to work with |
| 0x31 | set sprite width | set sprite width |
| 0x32 | set sprite height | set sprite height |
| 0x33 | clear sprite | clear contents |
| 0x34 | push pixel | adds N pixels of the selected color |
| 0x35 | push empty | add N transparent pixels |
| 0x36 | set x coordinate for drawing the sprite | |
| 0x37 | set y coordinate for drawing the sprite | |
| 0x38 | add to x coordinate for drawing the sprite | |
| 0x39 | add to y coordinate for drawing the sprite | |
| 0x3a | draw sprite | draw the current sprite, 2 for dbl. size |
| cmd | uint8 argument | |
|---|---|---|
| 0x40 | set convolution filter 0 | blur is 0,1,0,1,1,1,0,1,0 div 5 |
| 0x41 | set convolution filter 1 | flame is 0,1,0,1,1,1,0,0,0 div 4 |
| 0x42 | set convolution filter 2 | |
| 0x43 | set convolution filter 3 | the uint8 is treated as a range from |
| 0x44 | set convolution filter 4 | 0.0 to 1.0 |
| 0x45 | set convolution filter 5 | |
| 0x46 | set convolution filter 6 | |
| 0x47 | set convolution filter 7 | |
| 0x48 | set convolution filter 8 | |
| 0x49 | set convolution division | |
| 0x4a | use convolution filter |
For returning the state of the client:
Commands that return an uint16:
| cmd | uint8 argument | |
|---|---|---|
| 0x60 | is Esc | is Escape being pressed? |
| 0x61 | is up | is W, up or joystick up pressed? args: 0 for both, 1 for P1, 2 for P2 |
| Player1 has WASD and Joy1, Player2 has arrows and Joy2 | ||
| 0x62 | is left | is A, left or joystick left pressed? |
| 0x63 | is down | is S, down or joystick down pressed? |
| 0x64 | is right | is D, right or joystick right pressed? |
| 0x65 | is A | is Return, Comma (,) or joystick A pressed? |
| 0x66 | is B | is Space, Dot (.) or joystick B pressed? |
| cmd | uint8 argument | |
|---|---|---|
| 0x67 | is shift held down | uint8 argument: 0 for left, 1 for right, 2 for any, returns 1 for held down |
| 0x68 | is alt held down | |
| 0x69 | is ctrl held down | |
| 0x6a | is super held down |
| cmd | uint8 argument | |
|---|---|---|
| 0x6b | get keybuffer | returns: 0 if empty, keycode of first in keybuffer if not empty |
| cmd | uint8 argument | |
|---|---|---|
| 0x6c | get mouse x coordinate | |
| 0x6d | get mouse y coordinate | |
| 0x6e | get mouse buttons | returns: 0 for none, 1 for left, 2 for right and 3 for middle |
| cmd | uint8 argument | |
|---|---|---|
| 0x6f | joy button | uint8 argument: button ID, returns: 1 for pressed |
A channel must be set up for receiving the uint16 values that are returned by these functions.
| cmd | uint8 argument | |
|---|---|---|
| 0x70 | set audio channel | select channel 0-3 for audio operations |
| 0x71 | set frequency | set frequency (0-255, maps to Hz range) |
| 0x72 | set frequency high byte | extend frequency range |
| 0x73 | set volume | set volume (0-255) |
| 0x74 | set waveform | 0=square, 1=triangle, 2=sawtooth, 3=noise |
| 0x75 | play tone | play tone for N frames |
| 0x76 | stop channel | stop audio on selected channel |
| 0x77 | set envelope attack | attack time (0-255) |
| 0x78 | set envelope decay | decay time (0-255) |
| 0x79 | set envelope sustain | sustain level (0-255) |
| 0x7a | set envelope release | release time (0-255) |
| 0x7b | play sample | play predefined sample ID |
| cmd | uint8 argument | |
|---|---|---|
| 0x80 | set font | select font 0-7 |
| 0x81 | set text color | color for text foreground |
| 0x82 | set text background color | color for text background (255=transparent) |
| 0x83 | set text x position | x position for text |
| 0x84 | set text y position | y position for text |
| 0x85 | add to text x position | for positions > 255 |
| 0x86 | add to text y position | for positions > 255 |
| 0x87 | print character | print ASCII character |
| 0x88 | print string | print null-terminated string (follows in stream) |
| 0x89 | set text scale | scale factor 1-8 |
| cmd | uint8 argument | |
|---|---|---|
| 0x90 | set circle center x | x coordinate for circle center |
| 0x91 | set circle center y | y coordinate for circle center |
| 0x92 | add to circle center x | for coordinates > 255 |
| 0x93 | add to circle center y | for coordinates > 255 |
| 0x94 | set circle radius | radius in pixels |
| 0x95 | draw circle | 0=outline, 1=filled |
| 0x96 | set rectangle x | top-left x coordinate |
| 0x97 | set rectangle y | top-left y coordinate |
| 0x98 | add to rectangle x | for coordinates > 255 |
| 0x99 | add to rectangle y | for coordinates > 255 |
| 0x9a | set rectangle width | width in pixels |
| 0x9b | set rectangle height | height in pixels |
| 0x9c | draw rectangle | 0=outline, 1=filled |
| cmd | uint8 argument | |
|---|---|---|
| 0xa0 | wait frames | wait N frames (60fps assumed) |
| 0xa1 | set frame rate | set target FPS (0=unlimited) |
| 0xa2 | get frame counter | returns current frame number (uint16) |
| 0xa3 | reset frame counter | reset frame counter to 0 |
| 0xa4 | sync to vblank | wait for vertical blank |
| cmd | uint8 argument | |
|---|---|---|
| 0xb0 | set sprite rotation | rotation angle (0-255 = 0-360°) |
| 0xb1 | set sprite scale x | horizontal scale (128=1.0x) |
| 0xb2 | set sprite scale y | vertical scale (128=1.0x) |
| 0xb3 | set sprite flip | 0=none, 1=horizontal, 2=vertical, 3=both |
| 0xb4 | check sprite collision | check if two sprites collide (returns uint16) |
| 0xb5 | set sprite layer | drawing layer/depth (0-255) |
| 0xb6 | set sprite alpha | transparency (0=transparent, 255=opaque) |
| cmd | uint8 argument | |
|---|---|---|
| 0xc0 | save palette | save current palette to slot N |
| 0xc1 | load palette | load palette from slot N |
| 0xc2 | save screen | save current screen to buffer N |
| 0xc3 | load screen | load screen from buffer N |
| 0xc4 | copy region | copy rectangular region (params follow) |
| cmd | uint8 argument | |
|---|---|---|
| 0xfe | toggle fullscreen | enable or disable fullscreen mode |
| 0xff | exit | end the program |