From 85685447f80a70b1754e7e90d62bfcc5f10c4359 Mon Sep 17 00:00:00 2001 From: Nathan Whitehead Date: Fri, 23 Sep 2022 09:49:10 -0600 Subject: [PATCH] Add some readme text, add images. --- README.md | 34 +++++++++++++++++++++++++++++++--- doc/potwashpanic_font.png | Bin 0 -> 16447 bytes doc/potwashpanic_gameplay.png | Bin 0 -> 7671 bytes doc/potwashpanic_original.png | Bin 0 -> 6887 bytes 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 doc/potwashpanic_font.png create mode 100644 doc/potwashpanic_gameplay.png create mode 100644 doc/potwashpanic_original.png diff --git a/README.md b/README.md index 9304248..897b5c8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # PuzzleScript Retroarch Core +![Gameplay screen of Pot Wash Panic](doc/potwashpanic_gameplay.png) + This is a libretro core that plays PuzzleScript games. PuzzleScript games are usually online at the main PuzzleScript site: @@ -31,11 +33,33 @@ My family had trouble reading the pixel font when playing games, so I replaced t monospaced font. This can be controlled by the core option "Use custom anti-aliased font". After changing the option you need to restart the current game to have it take effect. Default is on. +![Title screen of Pot Wash Panic with antialiased font](doc/potwashpanic_font.png) + +![Title screen of Pot Wash Panic with original pixel font](doc/potwashpanic_original.png) + Many games have message text that refers to keys to press, so I added the RetroPad button names to the title screen but still show the correspondence to keyboard keys. So if a game talks about pressing `R` to restart, hopefully it makes sense what that means. I setup my own installation of RetroArch so that my keyboard bindings match the normal PuzzleScript bindings (so `X` keyboard key maps to `A` RetroPad button etc.) +## Installing binary releases + +Current binary releases are for Linux x86_64 and SEGA Genesis MINI console (Linux ARMv7). + +### Linux x86_64 + +To install on Linux x86_64, copy the release file `x64/puzzlescript_libretro.so` to your RetroArch cores folder. +This is a configurable location, my core folder is at `~/.config/retroarch/cores`. Also copy `x64/puzzlescript_libretro.info` into your +Core Info directory. Mine is set to `~/.config/retroarch/cores/`. + +### SEGA Genesis Mini + +To run the core on the SEGA Genesis Mini console, you need to have RetroArch installed using something like Project Lunar or Hakchi. +The installation of RetroArch needs to be able to read a USB stick. Once that is true, copy the release file `arm/puzzlescript_libretro.so` +to your RetroArch cores folder on the USB stick. The tested configuration is Project Lunar, copying the file to `/project_lunar/retroarch/cores/`. +You also want to copy your `.pz` files to the USB stick. In this configuration, I start the PuzzleScript core first then load the game +content. + ## Future work * Support saving and loading game state. @@ -44,7 +68,7 @@ PuzzleScript bindings (so `X` keyboard key maps to `A` RetroPad button etc.) * Add volume level control and other audio options. * Incorporate more accessibility features from: https://github.com/philschatz/puzzlescript -## Building source +## Building from source First install `gn` following instructions here: https://gn.googlesource.com/gn/ @@ -138,7 +162,7 @@ Each loop of the JavaScript main update thread hopefully happen within the game- has too large maps or too many complicated rules, the update may be late. In this case there should be a time underrun for game state update, but this should not affect the main thread doing audio and video callbacks. -In my limited testing on `x86_64` and the SEGA Genesis Mini armv7, performance was acceptable for almost all games +In my limited testing on `x86_64` and the SEGA Genesis Mini ARMv7, performance was acceptable for almost all games on `x86_64` and was highly game dependent for the SEGA Genesis Mini. Many realtime games were unplayable on the Mini, but many complicated puzzle games were entirely playable. Performance was generally limited by game state updates (not audio or video rendering). @@ -159,10 +183,14 @@ https://v8.dev/docs/ ## Generating releases -The `Dockerfile` is setup to build Linux x86_64 binary builds on Ubuntu 18.04. Run using Docker newer than 18.09 with: +The `Dockerfile` is setup to build Linux x86_64 and ARMv7 binary builds on Ubuntu 18.04. Run using Docker newer than 18.09 with: DOCKER_BUILDKIT=1 docker build -o ../release . +There were a few hacks needed to get things working with the slightly older Python. In particular the font generation using Pillow +seemed to be broken. So I generated the custom font using my Ubuntu 22.04 desktop and checked in the output for use in the +BuildKit build. + ## References PuzzleScript project: diff --git a/doc/potwashpanic_font.png b/doc/potwashpanic_font.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2049628647fc259412dd6dfb2bf17c25da741 GIT binary patch literal 16447 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

4$mB&o_N>Qf=OMc%J!ZF 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 u^FV$INYhCmcC@^?v{Ya4lf~ literal 0 HcmV?d00001 diff --git a/doc/potwashpanic_gameplay.png b/doc/potwashpanic_gameplay.png new file mode 100644 index 0000000000000000000000000000000000000000..5f37f4710ac46687b5026bd4d2413df885d692c2 GIT binary patch literal 7671 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 literal 0 HcmV?d00001 diff --git a/doc/potwashpanic_original.png b/doc/potwashpanic_original.png new file mode 100644 index 0000000000000000000000000000000000000000..06b4c0e366d26fabdd9ca791e7d7dd9fddae8790 GIT binary patch literal 6887 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 PehbZXad7$E( literal 0 HcmV?d00001