ai-startup-skills
创业公司做 AI 产品的 7 步 Agent Skill 合集:验证 → BP → 政策 → 路演 → 获客 → 定价 → 注册。
Translation pending
A Holiday Island rewrite in Rust
Translation pending
OtherRust · PythonGitHub @DoridianOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A decompilation and native port of Holiday Island (Sunflowers, 1996) to Rust, for Linux, Windows, macOS and WebAssembly.
Play it in your browser: https://doridian.github.io/HolidayIsland/ (the page asks for the CD image, docs/web.md), or download it for Linux, Windows or macOS from the releases (Packages).
Status: playable. The whole game is ported: the start menu, a
random island or any of the 13 scenarios (the six of the expanded
edition's UPGRADE\ too), building, roads, terraforming, the guests,
the settlements and the people on the island, the money menu and the
yearly accounts, the computer opponents, the auctions, sabotage, the
events and disasters, the TV news and films, the overview map, the
info box, the options, the high scores and the end of the game. Games
are saved and loaded in the original's format
(docs/savegame.md), and the sound, the music and
the films (Cinepak and MS ADPCM, decoded in pure Rust,
docs/films.md) play. On top of the original:
HOLIDAY.EXEThe port is a non-matching decompilation like the
Afterlife port: the code
behaves like the original, but doesn't compile to the same bytes. The
stack is winit, wgpu and cpal, with a resizable window and a fullscreen
toggle; see docs/port-architecture.md.
HOLIDAY.EXE is a 16-bit Windows 3.1 program written in Borland
Delphi 1; docs/binaries.md has the details.
This repository contains no game data files or original code, with one exception: the game's texts. Its German and English texts, strings and formats are in lang/, as UTF-8 text, one folder per language, so the port shows either language whatever the game folder's. The rest of the game data (pictures, films, sounds, the data tables) comes from the original CD, which a script can download for you from the Internet Archive.
tools/fetch_archive_org.py orig/
This downloads the German CD (an ISO, 210 MB) from
https://archive.org/details/Holiday_Island_1996_Bomico_DE and checks its
SHA-1. It extracts the CD's files and then the installer archive _FILES.1
(HOLIDAY.EXE, the DLLs and the rest of what the installer would copy) into
orig/ (gitignored), and checks the key files against
docs/binaries.md. --keep-iso FILE keeps the ISO, and --iso FILE
uses one you already have.
If you have your own image of the CD (ISO or BIN/CUE):
tools/extract_cd.py /path/to/HolidayIsland.iso orig/
tools/extract_install.py orig/_FILES.1 orig/
Both print the SHA-256 of every file they write.
The English UK release comes from The Collection Chamber's DOSBox
installer (Install-HOI.exe and Install-HOI.D01):
tools/extract-hoi-installer.py DOWNLOAD_DIR orig-en/
Its HOLIDAY.EXE is a later build than the German CD's, with fixes and
six more scenarios in UPGRADE\. The port follows that build: it
takes its fixes, and plays UPGRADE\'s scenarios when the game's folder
has it, so the German folder plays as before and the English one with
the new scenarios. Every text comes from the port's own language data
(lang/), German or English: the folder's language by
default, or the one --lang=de|en or language= in settings.ini
picks, so either folder plays fully in either language (the expanded
edition's texts in German are the port's translation). The speech is the
folder's (docs/language.md).
docs/versions.md has the differences.
Every push builds the port as one file per platform
(.github/workflows/build.yml); a v* tag publishes them on its release:
holiday-island-linux-x86_64.AppImage, holiday-island-linux-arm64.AppImageholiday-island-windows-x86_64.exe (the C runtime linked in)holiday-island-macos.dmg: Holiday Island.app, for Apple silicon and
Intel (signed ad hoc only: the first start needs a right click, Open)holiday-island-web.zip: the browser build, as on the Pages siteNone of them carries game data. Started without the game's folder (from
its icon) and with no orig in the working directory, the port asks for
the game with the system's file dialog: the CD image (.iso, .bin) or
HOLIDAY.EXE in the game's folder (the German CD's files, the English
release's). If the music has no SoundFont yet (Music), it then
asks for one too, which it copies to its data directory; cancelled, the
music is silent. It keeps the game's path in its data directory
(game-path.txt in ~/.local/share/holiday-island,
%APPDATA%\Holiday Island, ~/Library/Application Support/Holiday Island)
and doesn't ask again while it's there; deleting the file asks again. On
Linux the dialog is the desktop's (xdg-desktop-portal, else zenity).
The icon is the port's own (tools/make-icon.py).
cargo run --release -p holiday -- orig
The argument is the directory with the game's files (HOLIDAY.EXE,
GRAFIK\, DATA\, the films and sounds); its texts are the port's own
(lang/), in German or English (--lang=de|en). It plays the intro, then shows the
background with the start menu on it. Start shows the main screen with
the scenario's island, or a new island made from the menu's settings
for a normal game; "Altes Spiel fortsetzen" loads a saved one. The arrow keys and the
number pad scroll it (Ctrl for bigger steps), so do its scroll bars and
the mouse wheel (Shift for across), Insert and Delete turn it, a right
click moves it. The button bar's tool buttons (or F1 to F12)
pick the tools; a click on the island uses them. The button bar's
first button opens the file menu (saving, loading, a new game);
Escape asks whether to quit.
Fixes of the original's bugs and the port's extensions (a bigger map in a
bigger window without a second title bar, windows that stack like a
desktop's, scroll arrows that repeat, the mouse wheel) are on by default.
In a game, the options' "INFO" button lists them to switch one by one,
or all off for the original; the list saves them in the port's
settings.ini. --original switches everything off for a run (and
"INFO" shows the credits again), --enhance=KEY=on|off one of them, and
--enhancements lists the keys (--help the other options). Details in
docs/original-bugs.md.
Humans take the seats the original gives to computer opponents; two or
more can play the same seat. A signaling server (holiday-server,
cargo run --release -p server) introduces the players, who then talk
directly over WebRTC:
holiday --host=island --signal=ws://server:3536 orig # the host picks the game on the start menu
holiday --join=island --signal=ws://server:3536 orig # each other player
The browser build joins the same games. German and English players can share a game. Details in docs/networking.md.
The game's music is MIDI, and the port renders it with a SoundFont, which
the game doesn't ship. tools/get-soundfont.sh downloads
GeneralUser GS by
S. Christian Collins (GS-compatible, like the Roland Sound Canvas the music
was written on) into the port's data directory, where the game finds it.
--soundfont=FILE.sf2 or HOLIDAY_SOUNDFONT pick another; without one the
music is silent. --sound=hi|lo|off picks the effects' quality and
--no-audio turns all sound off. Details in docs/sound.md.
Needs Ghidra 12 at /opt/ghidra (or GHIDRA_INSTALL_DIR) and Java 21+.
tools/ghidra/setup.sh # import and analyze orig/HOLIDAY.EXE (~15 s)
tools/gh decompile 1000:0011 # the entry point
tools/gh pstrings -x CD # Pascal strings, with referencing functions
docs/decomp-workflow.md covers the approach, the Ghidra tooling, Delphi 1 specifics and the rules. Names and signatures are shared through symbols/.
tools/fetch_archive_org.py: downloads the CD from archive.org and extracts it.tools/extract_cd.py: pure-Python ISO9660 extractor for ISO and BIN/CUE images.tools/extract_install.py: lists or extracts the installer archives (_FILES.1, _SETUP.1).tools/lzhuf.py: the LZHUF decoder those archives use.tools/extract-hoi-installer.py: unpacks the English release from its DOSBox installer.tools/gh, tools/ghidra/: headless Ghidra setup and CLI for the decompilation.tools/get-soundfont.sh: downloads the SoundFont the music plays with.tools/build-web.sh: builds the browser version into web/.The port and the project:
UPGRADE\The game:
Holiday Island is © Sunflowers Interactive Entertainment Software. This project is not affiliated with or endorsed by Sunflowers, Bomico or Ubisoft. It's intended for owners of the original game, for preservation and interoperability.
The code in this repository is licensed under the GNU Affero General Public License v3.0 or later. The game's texts in lang/ are Sunflowers' (but the port's own strings and translations) and aren't covered by this license; the rest of the game data isn't included.