Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ APP_SPACE = 2031616
# Upsilon, the N0110 and N0115's custom software, gives .nwa apps less RAM: NumPlay-Upsilon.nwa has
# the games that fit it (NumPlay draws their text there: see launcher/src/compat.c)
UPSILON_RAM = 107674
UPSILON_GAMES = crossyroad blockblast portal tetris chess flappybird pacman snake connectfour solitaire g2048 minesweeper \
UPSILON_GAMES = crossyroad blockblast portal tetris dinorun chess flappybird pacman snake connectfour solitaire g2048 minesweeper \
breakout numvisuals

# NumPlay and its discreet versions: the same app, with another name and icon
Expand Down
25 changes: 14 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<h1 align="center">NumPlay</h1>

<p align="center">
<b>17 free games for your NumWorks calculator, in one app.</b><br>
<b>19 free games for your NumWorks calculator, in one app.</b><br>
Plus five big games that install on their own. For the N0110, N0115 and N0120, in English, French and Chinese.
</p>

Expand Down Expand Up @@ -47,16 +47,17 @@ All of these come in one app, **NumPlay.nwa**.
<td align="center"><a href="games/blockblast/README.md"><img src="docs/media/thumb_blockblast.png" width="120" alt="Block Blast"><br><b>Block Blast</b></a></td>
<td align="center"><a href="games/portal/README.md"><img src="docs/media/thumb_portal.png" width="120" alt="Portal Returns"><br><b>Portal Returns</b></a></td>
<td align="center"><a href="games/tetris/README.md"><img src="docs/media/thumb_tetris.png" width="120" alt="Tetris"><br><b>Tetris</b></a></td>
<td align="center"><a href="games/chess/README.md"><img src="docs/media/thumb_chess.png" width="120" alt="Chess"><br><b>Chess</b></a></td>
<td align="center"><a href="games/dinorun/README.md"><img src="docs/media/thumb_dinorun.png" width="120" alt="Chrome Dino"><br><b>Chrome Dino</b></a></td>
</tr>
<tr>
<td align="center"><a href="games/chess/README.md"><img src="docs/media/thumb_chess.png" width="120" alt="Chess"><br><b>Chess</b></a></td>
<td align="center"><a href="games/flappybird/README.md"><img src="docs/media/thumb_flappybird.png" width="120" alt="Flappy Bird"><br><b>Flappy Bird</b></a></td>
<td align="center"><a href="games/pacman/README.md"><img src="docs/media/thumb_pacman.png" width="120" alt="Pac-Man"><br><b>Pac-Man</b></a></td>
<td align="center"><a href="games/snake/README.md"><img src="docs/media/thumb_snake.png" width="120" alt="Snake"><br><b>Snake</b></a></td>
<td align="center"><a href="games/connectfour/README.md"><img src="docs/media/thumb_connectfour.png" width="120" alt="Connect Four"><br><b>Connect Four</b></a></td>
<td align="center"><a href="games/solitaire/README.md"><img src="docs/media/thumb_solitaire.png" width="120" alt="Solitaire"><br><b>Solitaire</b></a></td>
</tr>
<tr>
<td align="center"><a href="games/solitaire/README.md"><img src="docs/media/thumb_solitaire.png" width="120" alt="Solitaire"><br><b>Solitaire</b></a></td>
<td align="center"><a href="games/g2048/README.md"><img src="docs/media/thumb_g2048.png" width="120" alt="2048"><br><b>2048</b></a></td>
<td align="center"><a href="games/minesweeper/README.md"><img src="docs/media/thumb_minesweeper.png" width="120" alt="Minesweeper"><br><b>Minesweeper</b></a></td>
<td align="center"><a href="games/breakout/README.md"><img src="docs/media/thumb_breakout.png" width="120" alt="Block Breaker"><br><b>Block Breaker</b></a></td>
Expand Down Expand Up @@ -107,7 +108,7 @@ You need your calculator, its USB cable, and a computer with **Google Chrome** o
| --- | --- | --- |
| N0120 | Epsilon 23.2 or newer (the calculator's own software) | Everything |
| N0110, N0115 | Epsilon 23.2 or newer | Everything. These models are about 2.5 times slower, so the big games show fewer frames per second, but they keep their speed. |
| N0110, N0115 | Upsilon | NumPlay-Upsilon.nwa: 14 games (see Other versions) |
| N0110, N0115 | Upsilon | NumPlay-Upsilon.nwa: 15 games (see Other versions) |
| Any | Custom software built from Epsilon 25.2's source | Everything. These builds can give apps less memory (133 KB): on one that gives even less, a game that needs more says how much on its card. |

To see your calculator's model and software, open **Settings**, then **About**. To update the software, go to [my.numworks.com](https://my.numworks.com) with the calculator plugged in.
Expand All @@ -123,7 +124,7 @@ To see your calculator's model and software, open **Settings**, then **About**.
| [NumPlay-Matrices.nwa](https://github.com/Mason363/NumPlay/releases/latest/download/NumPlay-Matrices.nwa) | The same app, in disguise: it looks like a math app called **Matrices**. |
| [NumPlay-French.nwa](https://github.com/Mason363/NumPlay/releases/latest/download/NumPlay-French.nwa) | NumPlay en français : tous les jeux, en français. |
| [NumPlay-Chinese.nwa](https://github.com/Mason363/NumPlay/releases/latest/download/NumPlay-Chinese.nwa) | NumPlay 中文版:所有游戏,简体中文。 |
| [NumPlay-Upsilon.nwa](https://github.com/Mason363/NumPlay/releases/latest/download/NumPlay-Upsilon.nwa) | For calculators running **Upsilon**: the 14 games that fit in the memory it gives apps. |
| [NumPlay-Upsilon.nwa](https://github.com/Mason363/NumPlay/releases/latest/download/NumPlay-Upsilon.nwa) | For calculators running **Upsilon**: the 15 games that fit in the memory it gives apps. |

<img src="docs/media/home_invisible.png" width="240" alt="The home screen with NumPlay-Invisible: the spot after Settings looks empty"> <img src="docs/media/home_matrices.png" width="240" alt="The home screen with NumPlay-Matrices among the calculator's own apps">

Expand Down Expand Up @@ -199,6 +200,7 @@ NumPlay is a fan project, made out of love for these games and for the NumWorks
- **[Gabriele Cirulli](https://github.com/gabrielecirulli/2048)** made 2048.
- **Block Blast!** by [Hungry Studio](https://www.hungrystudio.com) inspired NumPlay's Block Blast, written in C for NumPlay with no code or art from it. Its blocks, scoring and colours follow measurements of the app by the players behind [blockblast-Self-Improvement-loop](https://github.com/Kucze3205/blockblast-Self-Improvement-loop).
- Snake, Solitaire and Block Breaker look and play like **Google's games** in Search. They are drawn from scratch; nothing is taken from Google.
- **Chrome's dinosaur game** by Google inspired Chrome Dino, which ports its rules, numbers and pictures from [Chromium's source](https://chromium.googlesource.com/chromium/src/+/main/components/neterror/resources/dino_game/) (BSD license). **[LilyTheCatgirl](https://github.com/LilyTheCuteCatgirl)** brought it to NumPlay. Not affiliated with Google.
- **[gd3ds](https://github.com/AleFunky/gd3ds)** by AleFunky and friends, whose research into Geometry Dash made NumDash possible. Clubstep, Deadlocked and Dash also rely on [gdsolver](https://github.com/gdsolver/gdsolver)'s measurements of Geometry Dash 2.2, level data from [gmdkit](https://github.com/UHDanke/gmdkit) by HDanke and checks against [GDRWeb](https://github.com/iliasHDZ/GDRWeb) by IliasHDZ.
- **Balatro** by LocalThunk inspired NumPlay's Balatro, which uses art adapted from the game and the **m6x11** font by Daniel Linssen.
- **Minecraft** by Mojang inspired NumBlocks, which follows Minecraft 1.8.8 exactly: it makes its worlds the way Minecraft 1.8.8 does and uses its blocks, items, recipes, textures, font and screens.
Expand All @@ -222,7 +224,7 @@ NumPlay is a fan project, made out of love for these games and for the NumWorks

NumPlay is licensed under the [GNU General Public License v3.0](LICENSE). Copyright (c) 2026 Mason Chen. Code and fonts from others keep their own licenses: the `UNLICENSE` files in the games' folders and the [LICENSES](LICENSES) folder. The names, artwork and music of the games NumPlay is inspired by belong to their makers and are not covered by it.

<sub>Unofficial fan games, not affiliated with NumWorks, RobTop Games (Geometry Dash), Hipster Whale (Crossy Road), the makers of Drive Mad, LocalThunk or Playstack (Balatro), Mike Klubnika or Critical Reflex (Buckshot Roulette), Hungry Studio (Block Blast!), Mojang or Microsoft (Minecraft), Maddy Makes Games (Celeste), Team Cherry (Hollow Knight), Toby Fox (Undertale), Florian van Strien (The Final Earth 2), The Powder Toy's developers (The Powder Toy), MateoConLechuga (Portal Returns), Valve (Portal), .GEARS (Flappy Bird), Bandai Namco (Pac-Man), Hasbro (Connect Four), Google (Snake, Solitaire, Block Breaker, Doodle Champion Island Games), STUDIO4°C or Microsoft (Minesweeper). Tetris is a trademark of The Tetris Company, Minecraft of Mojang Synergies AB, Pac-Man of Bandai Namco and Connect Four of Hasbro.</sub>
<sub>Unofficial fan games, not affiliated with NumWorks, RobTop Games (Geometry Dash), Hipster Whale (Crossy Road), the makers of Drive Mad, LocalThunk or Playstack (Balatro), Mike Klubnika or Critical Reflex (Buckshot Roulette), Hungry Studio (Block Blast!), Mojang or Microsoft (Minecraft), Maddy Makes Games (Celeste), Team Cherry (Hollow Knight), Toby Fox (Undertale), Florian van Strien (The Final Earth 2), The Powder Toy's developers (The Powder Toy), MateoConLechuga (Portal Returns), Valve (Portal), .GEARS (Flappy Bird), Bandai Namco (Pac-Man), Hasbro (Connect Four), Google (Snake, Solitaire, Block Breaker, Chrome Dino, Doodle Champion Island Games), STUDIO4°C or Microsoft (Minesweeper). Tetris is a trademark of The Tetris Company, Chrome of Google LLC, Minecraft of Mojang Synergies AB, Pac-Man of Bandai Namco and Connect Four of Hasbro.</sub>

## Gallery

Expand All @@ -244,30 +246,31 @@ NumPlay is licensed under the [GNU General Public License v3.0](LICENSE). Copyri
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/tetris.gif" width="100%" alt="Tetris on a real NumWorks calculator: pieces drop and a line clears"><br><a href="games/tetris/README.md"><b>Tetris</b></a></td>
<td align="center"><img src="docs/media/gallery/dinorun.gif" width="100%" alt="Chrome Dino: jumping over cacti, then night falls and a pterodactyl flies by"><br><a href="games/dinorun/README.md"><b>Chrome Dino</b></a></td>
<td align="center"><img src="docs/media/gallery/chess.gif" width="100%" alt="Chess: the opening moves of a game against a bot"><br><a href="games/chess/README.md"><b>Chess</b></a></td>
<td align="center"><img src="docs/media/gallery/flappybird.gif" width="100%" alt="Flappy Bird: flapping through the pipes"><br><a href="games/flappybird/README.md"><b>Flappy Bird</b></a></td>
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/flappybird.gif" width="100%" alt="Flappy Bird: flapping through the pipes"><br><a href="games/flappybird/README.md"><b>Flappy Bird</b></a></td>
<td align="center"><img src="docs/media/gallery/pacman.gif" width="100%" alt="Pac-Man: eating dots in the maze"><br><a href="games/pacman/README.md"><b>Pac-Man</b></a></td>
<td align="center"><img src="docs/media/gallery/snake.gif" width="100%" alt="Snake: the snake eats apples and grows"><br><a href="games/snake/README.md"><b>Snake</b></a></td>
<td align="center"><img src="docs/media/gallery/connectfour.gif" width="100%" alt="Connect Four: winning a round against the computer"><br><a href="games/connectfour/README.md"><b>Connect Four</b></a></td>
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/connectfour.gif" width="100%" alt="Connect Four: winning a round against the computer"><br><a href="games/connectfour/README.md"><b>Connect Four</b></a></td>
<td align="center"><img src="docs/media/gallery/solitaire.gif" width="100%" alt="Solitaire: moving cards between the columns"><br><a href="games/solitaire/README.md"><b>Solitaire</b></a></td>
<td align="center"><img src="docs/media/gallery/g2048.gif" width="100%" alt="2048: sliding and merging tiles up to 128"><br><a href="games/g2048/README.md"><b>2048</b></a></td>
<td align="center"><img src="docs/media/gallery/minesweeper.gif" width="100%" alt="Minesweeper: opening the field, flagging the mines and winning"><br><a href="games/minesweeper/README.md"><b>Minesweeper</b></a></td>
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/minesweeper.gif" width="100%" alt="Minesweeper: opening the field, flagging the mines and winning"><br><a href="games/minesweeper/README.md"><b>Minesweeper</b></a></td>
<td align="center"><img src="docs/media/gallery/breakout.gif" width="100%" alt="Block Breaker: the ball breaks bricks"><br><a href="games/breakout/README.md"><b>Block Breaker</b></a></td>
<td align="center"><img src="docs/media/gallery/numvisuals.gif" width="100%" alt="NumVisuals: moving backgrounds, from northern lights to a lava lamp"><br><a href="games/numvisuals/README.md"><b>NumVisuals</b></a></td>
<td align="center"><img src="docs/media/gallery/numpowder.gif" width="100%" alt="NumPowder: water floods the sand, then lava pours in and boils it"><br><a href="games/numpowder/README.md"><b>NumPowder</b></a></td>
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/numpowder.gif" width="100%" alt="NumPowder: water floods the sand, then lava pours in and boils it"><br><a href="games/numpowder/README.md"><b>NumPowder</b></a></td>
<td align="center"><img src="docs/media/gallery/finalearth2.gif" width="100%" alt="The Final Earth 2: building a house in a city on a floating island"><br><a href="games/finalearth2/README.md"><b>The Final Earth 2</b></a></td>
<td align="center"><img src="docs/media/gallery/hollowknight.gif" width="100%" alt="Hollow Knight: fighting the False Knight and Hornet"><br><a href="games/hollowknight/README.md"><b>Hollow Knight</b></a></td>
<td align="center"><img src="docs/media/gallery/celeste.gif" width="100%" alt="Celeste on a real NumWorks calculator: Madeline climbs the first level"><br><a href="games/celeste/README.md"><b>Celeste</b></a></td>
</tr>
<tr>
<td align="center"><img src="docs/media/gallery/celeste.gif" width="100%" alt="Celeste on a real NumWorks calculator: Madeline climbs the first level"><br><a href="games/celeste/README.md"><b>Celeste</b></a></td>
<td align="center"><img src="docs/media/gallery/championisland.gif" width="100%" alt="Champion Island: climbing, artistic swimming and the marathon"><br><a href="games/championisland/README.md"><b>Champion Island</b></a></td>
<td align="center"><img src="docs/media/gallery/undertale.gif" width="100%" alt="Undertale: Flowey's friendliness pellets, Toriel's tile puzzle and her fire"><br><a href="games/undertale/README.md"><b>Undertale</b></a></td>
</tr>
Expand Down
2 changes: 1 addition & 1 deletion _config.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
title: NumPlay
description: "18 games for the NumWorks calculator in one app: NumDash, Crossy Road, NumBlocks, NumDrive, Balatro, Buckshot Roulette, Block Blast, Portal Returns, Tetris, Chess, Flappy Bird, Pac-Man, Snake and more, plus NumVisuals."
description: "19 games for the NumWorks calculator in one app: NumDash, Crossy Road, NumBlocks, NumDrive, Balatro, Buckshot Roulette, Block Blast, Portal Returns, Tetris, Chrome Dino, Chess, Flappy Bird, Pac-Man, Snake and more, plus NumVisuals."
theme: jekyll-theme-cayman
exclude: [games, launcher, tools, tests, build, LICENSES, Makefile, .github]
Binary file added docs/media/gallery/dinorun.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/media/launcher.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/thumb_dinorun.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions docs/play.md
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,21 @@ Name the fallen human, then walk and talk your way through the Ruins, Snowdin, W

<br clear="right">

## Chrome Dino

<img src="../games/dinorun/docs/shot.png" width="320" align="right" alt="Chrome Dino: the T-rex jumps over a low pterodactyl">

| Key | What it does |
| --- | --- |
| **OK** or **Up** (or 8) | Jump: hold it to jump higher |
| **Down** (or 2) | Duck, or in the air, come down faster |
| **EXE** | After a crash, play again at once |
| **Back** | Pause menu (with Quit game) |

Chrome's game when you're offline, as Chrome plays it. Run as far as you can: jump the cacti and the low pterodactyls, duck under the ones flying at head height. You go faster and faster, and every 700 points night falls for a while. Your best score is kept.

<br clear="right">

## Chess

<img src="media/chess.gif" width="320" align="right" alt="Chess against a bot">
Expand Down
1 change: 1 addition & 0 deletions games/dinorun/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
output/
32 changes: 32 additions & 0 deletions games/dinorun/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
Chrome Dino ports the rules, numbers and pictures of Chrome's dinosaur game, the T-Rex Runner of
Chromium (https://chromium.googlesource.com/chromium/src/+/main/components/neterror/resources/dino_game/):
its game code and its sprite sheet, components/neterror/resources/images/default_100_percent/offline/
100-offline-sprite.png, which src/sprites.h is made from. They come under Chromium's license:

Copyright 2015 The Chromium Authors

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google LLC nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
49 changes: 49 additions & 0 deletions games/dinorun/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Chrome Dino: output/dinorun.nwa on its own, output/module.o for NumPlay (see ../../tools/npmodule.py).
#
# make build | check | host-test | sprites SHEET=100-offline-sprite.png (Chromium's, see tools/sprites.py)
Q ?= @
CC = arm-none-eabi-gcc
NWLINK ?= npx --yes -- nwlink@1.0.0
OUT = output
SRC = src/main.c
HEADERS = ../common/epsilon_app.h ../common/epsilon_files.h ../common/np_lz.h ../common/np_text.h src/sprites.h
FLAGS = -std=c11 $(shell $(NWLINK) eadk-cflags-device) -Os -Wall -Wextra -Wno-unused-parameter \
-fno-math-errno -fno-tree-loop-distribute-patterns -flto -fno-fat-lto-objects \
-fwhole-program -fvisibility=internal
LINK = -Wl,--relocatable -nostartfiles --specs=nano.specs -Wl,-e,main \
-Wl,-u,eadk_app_name -Wl,-u,eadk_app_icon -Wl,-u,eadk_api_level \
-Wl,--gc-sections -flinker-output=nolto-rel

.PHONY: build check clean module sim-module host-test sprites
build: $(OUT)/dinorun.nwa
$(OUT):
$(Q) mkdir -p $(OUT)
$(OUT)/icon.o: src/icon.png | $(OUT)
$(Q) $(NWLINK) png-icon-o $< $@
$(OUT)/dinorun.nwa: $(SRC) $(HEADERS) $(OUT)/icon.o
$(Q) $(CC) $(FLAGS) $(LINK) $(SRC) $(OUT)/icon.o -o $@
$(Q) arm-none-eabi-strip --strip-unneeded $@
check: $(OUT)/dinorun.nwa
$(Q) $(NWLINK) nwa-bin $< $(OUT)/dinorun.bin
@echo "Chrome Dino installs as $$(wc -c < $(OUT)/dinorun.bin) bytes"
clean:
$(Q) rm -rf $(OUT)

module: $(OUT)/module.o
$(OUT)/module.o: $(SRC) $(HEADERS) | $(OUT)
$(Q) $(CC) $(FLAGS) -Wl,--relocatable -nostartfiles -nostdlib -Wl,-e,main \
-flinker-output=nolto-rel $(SRC) -o $@
sim-module: $(OUT)/sim-module.o
$(OUT)/sim-module.o: $(SRC) $(HEADERS) | $(OUT)
$(Q) mkdir -p $(OUT)/sim
$(Q) cc -std=c11 -O2 -fPIC $(shell $(NWLINK) eadk-cflags-simulator) \
-Dmain=np_dinorun_main -c $(SRC) -o $(OUT)/sim/main.o
$(Q) ld -r $(OUT)/sim/main.o -exported_symbol _np_dinorun_main -o $@

host-test: | $(OUT)
cc -std=c11 -O1 -g -Wall -Wextra -Wno-unused-parameter -fsanitize=address,undefined -fno-omit-frame-pointer \
-DHOST -DPLATFORM_DEVICE=0 -Itests tests/test_dino.c -lm -o $(OUT)/host-test
$(OUT)/host-test

sprites:
python3 tools/sprites.py $(SHEET)
Loading