Skip to content

Commit

Permalink
Merge branch 'fgs-port' into port-x64
Browse files Browse the repository at this point in the history
# Conflicts:
#	.github/workflows/c-cpp.yml
  • Loading branch information
Raf committed Oct 3, 2024
2 parents 8533189 + 2a5c3a3 commit d5ee41f
Show file tree
Hide file tree
Showing 20 changed files with 351 additions and 2 deletions.
39 changes: 38 additions & 1 deletion .github/workflows/c-cpp.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,46 @@ jobs:
path: bin/
retention-days: 0

build-flatpak-bundle:
name: "Build flatpak bundle"
runs-on: ubuntu-latest
needs: [build-x86_64-linux]
container:
image: bilelmoussaoui/flatpak-github-actions:freedesktop-23.08
options: --privileged
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: pd-x86_64-linux
path: dist/linux/bin/

- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with:
bundle: io.github.fgsfdsfgs.perfect_dark.flatpak
manifest-path: dist/linux/io.github.fgsfdsfgs.perfect_dark.yaml
cache-key: flatpak-builder-${{ github.sha }}
upload-artifact: true

# - name: Build Flatpak bundle
# run: |
# cd dist/linux/
# flatpak-builder build --force-clean io.github.fgsfdsfgs.perfect_dark.yaml
# flatpak build-export export build
# flatpak build-bundle export io.github.fgsfdsfgs.perfect_dark.flatpak io.github.fgsfdsfgs.perfect_dark

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: io.github.fgsfdsfgs.perfect_dark.flatpak
path: io.github.fgsfdsfgs.perfect_dark.flatpak
retention-days: 0


publish-latest-build:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/port-x64'
needs: [build-x86_64-windows, build-x86_64-linux]
needs: [build-x86_64-windows, build-x86_64-linux, build-flatpak-bundle]
permissions:
contents: write
steps:
Expand All @@ -98,6 +134,7 @@ jobs:
pushd ci-artifacts
tar czf ../ci-release/pd-x86_64-linux.tar.gz pd-x86_64-linux
zip -r ../ci-release/pd-x86_64-windows.zip pd-x86_64-windows
mv io.github.fgsfdsfgs.perfect_dark.flatpak/io.github.fgsfdsfgs.perfect_dark.flatpak ../ci-release/
popd
git tag --force ci-dev-build-x64 port-x64
git push --force origin ci-dev-build-x64
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*.exe
pd.*.z64
build
.flatpak-builder
extracted
src/assets/*/*.bin
src/assets/*/*.ctl
Expand Down
9 changes: 8 additions & 1 deletion Makefile.port
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,10 @@ CXX_O_FILES := $(patsubst %.cpp, $(B_DIR)/%.o, $(CXX_FILES))

O_FILES := $(C_O_FILES) $(CXX_O_FILES)

ifneq (,$(findstring windows,$(TARGET_PLATFORM)))
O_FILES += $(B_DIR)/icon.res
endif

INCLUDES = \
-I include \
-I include/PR \
Expand All @@ -247,7 +251,7 @@ else
LD := $(CC)
endif

$(C_O_FILES): OPT_LVL := $(GCC_OPT_LVL)
$(O_FILES): OPT_LVL := $(GCC_OPT_LVL)

COMMON_CFLAGS := $(C_DEFINES) -DAVOID_UB=1 $(INCLUDES) $(TARGET_CFLAGS) -g \
-fno-inline-functions \
Expand Down Expand Up @@ -322,6 +326,9 @@ $(B_DIR)/%.o: %.cpp $(JSON_HEADERS)
@mkdir -p $(dir $@)
$(CXX) -c $(CXXFLAGS) $(OPT_LVL) -o $@ $<

$(B_DIR)/%.res: dist/windows/%.rc
windres $< -O coff -o $@

################################################################################
# Clean rules

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ There are minor graphics- and gameplay-related issues, and possibly occasional c
* experimental high framerate support (up to 240 FPS):
* set `Game.TickRateDivisor` to `0` in `pd.ini` to activate;
* in practice the game will have issues running faster than ~165 FPS, so use VSync or `Video.FramerateLimit` to cap it.
* emulate the Transfer Pak functionality the game has on the Nintendo 64 to unlock some cheats automatically.

Currently only 32-bit platforms are supported, namely x86 Windows and Linux.
Note that 32-bit binaries will still work on 64-bit versions of those platforms,
Expand All @@ -58,6 +59,8 @@ If you want to use a PAL or JPN ROM instead, put them into the `data` directory
* PAL: ROM name `pd.pal-final.z64`, EXE name `pd.pal.exe`.
* JPN: ROM name `pd.jpn-final.z64`, EXE name `pd.jpn.exe`.

Optionally, you can also put your Perfect Dark for GameBoy Color ROM named `pd.gbc` in the `data` directory if you want to emulate having the Nintendo 64's Transfer Pak and unlock some cheats automatically.

Additional information can be found in the [wiki](https://github.com/fgsfdsfgs/perfect_dark/wiki).

A GPU supporting OpenGL 3.0 or above is required to run the port.
Expand Down Expand Up @@ -134,5 +137,6 @@ It might be possible to build a 32-bit ARM executable, but this has not been tes
* [Ship of Harkinian team](https://github.com/Kenix3/libultraship/tree/main/src/graphic/Fast3D), Emill and MaikelChan for the libultraship version of fast3d that this port uses;
* lieff for [minimp3](https://github.com/lieff/minimp3);
* Mouse Injector and 1964GEPD authors for some of the 60FPS- and mouselook-related fixes;
* NicNamSam for the icon;
* everyone who has submitted pull requests and issues to this repository and tested the port;
* probably more I'm forgetting.
9 changes: 9 additions & 0 deletions dist/linux/io.github.fgsfdsfgs.perfect_dark.desktop
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[Desktop Entry]
Name=Perfect Dark
Comment=Modern source port of Perfect Dark
Exec=pd
Icon=io.github.fgsfdsfgs.perfect_dark
Terminal=false
Type=Application
Categories=Game;ActionGame;
StartupNotify=false
45 changes: 45 additions & 0 deletions dist/linux/io.github.fgsfdsfgs.perfect_dark.metainfo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>io.github.fgsfdsfgs.perfect_dark</id>
<name>Perfect Dark</name>
<developer id="io.github.fgsfdsfgs.perfect_dark">
<name>Perfect Dark Contributors</name>
<url>https://github.com/fgsfdsfgs/perfect_dark/graphs/contributors</url>
</developer>
<launchable type="desktop-id">io.github.fgsfdsfgs.perfect_dark.desktop</launchable>
<summary>Modern cross-platform port of Perfect Dark</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>MIT</project_license>
<url type="homepage">https://github.com/fgsfdsfgs/perfect_dark/</url>
<description>
<p>This is a port of Ryan Dywer's decompilation of classic N64 shooter Perfect Dark to modern systems.</p>
</description>
<!--
<screenshots>
<screenshot type="default">
<image type="source">https://gitlab.com/fpiesche/dxx-rebirth-assets/-/raw/c6e7e79eebe92905f84f07a635ffab5122a94bd1/d1x/screenshots/retromode.png</image>
<caption>"Retro mode": the default graphics setup, like the original game but in high resolution</caption>
<screenshots>
-->
<categories>
<category>Game</category>
<category>ActionGame</category>
<category>Shooter</category>
</categories>
<keywords>
<keyword>n64</keyword>
<keyword>scifi</keyword>
<keyword>cyberpunk</keyword>
<keyword>retro</keyword>
<keyword>sourceport</keyword>
<keyword>port</keyword>
</keywords>
<releases>
<release version="latest" date="2024-05-14"/>
</releases>
<content_rating type="oars-1.1">
<content_attribute id="violence-realistic">moderate</content_attribute>
<content_attribute id="violence-bloodshed">mild</content_attribute>
</content_rating>
<update_contact>https://github.com/fgsfdsfgs/perfect_dark/</update_contact>
</component>
Binary file added dist/linux/io.github.fgsfdsfgs.perfect_dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions dist/linux/io.github.fgsfdsfgs.perfect_dark.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/sh

# Create user data directories if necessary
userdirs=( roms saves mods )
for path in "${userdirs[@]}"; do
if [ ! -d "${XDG_DATA_HOME}/${path}" ]; then
mkdir -p "${XDG_DATA_HOME}/${path}"
fi
done

# Default to pd as executable but switch to jpn/pal if the NTSC rom
# is missing but JPN/PAL are present.
executable="pd"
if [ -f ${XDG_DATA_HOME}/roms/pd.ntsc-final.z64 ] | \
[ -f ${XDG_DATA_HOME}/roms/pd.ntsc-1.0.z64 ]; then
executable="pd"
elif [ -f ${XDG_DATA_HOME}/roms/pd.jpn-final.z64 ]; then
executable="pd.jpn"
elif [ -f ${XDG_DATA_HOME}/roms/pd.pal-final.z64 ]; then
executable="pd.pal"
fi

# If first parameter passed to this script is one of the pd executables,
# run that regardless of ROM auto-detection above and pass the remaining
# parameters to it; otherwise pass all arguments to the executable selected
# above
case $1 in
"pd."*)
executable=$1
params="${@:2}"
;;
*)
params="$@"
;;
esac

# Run game
$executable --basedir ${XDG_DATA_HOME}/roms --savedir ${XDG_DATA_HOME}/saves $params
93 changes: 93 additions & 0 deletions dist/linux/io.github.fgsfdsfgs.perfect_dark.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
app-id: io.github.fgsfdsfgs.perfect_dark
runtime: org.freedesktop.Platform
runtime-version: &runtime-version '23.08'
sdk: org.freedesktop.Sdk
command: io.github.fgsfdsfgs.perfect_dark.sh

finish-args:
# multiarch is required for 32bit binaries
- --allow=multiarch
# hardware 3D and controller access
- --device=all
# X11 + XShm access
- --share=ipc
- --socket=x11
# Audio
- --socket=pulseaudio
# Enable network for multiplayer
- --share=network

# Parameters for 32-bit extensions
x-gl-version: &gl-version '1.4'
x-gl-versions: &gl-versions 23.08;1.4
x-gl-merge-dirs: &gl-merge-dirs vulkan/icd.d;glvnd/egl_vendor.d;egl/egl_external_platform.d;OpenCL/vendors;lib/dri;lib/d3d;lib/gbm;vulkan/explicit_layer.d;vulkan/implicit_layer.d

add-extensions:
org.freedesktop.Platform.Compat.i386:
directory: lib/i386-linux-gnu
version: '23.08'

org.freedesktop.Platform.GL32:
directory: lib/i386-linux-gnu/GL
version: *gl-version
versions: *gl-versions
subdirectories: true
no-autodownload: true
autodelete: false
add-ld-path: lib
merge-dirs: *gl-merge-dirs
download-if: active-gl-driver
enable-if: active-gl-driver
autoprune-unless: active-gl-driver

org.freedesktop.Platform.GL32.Debug:
directory: lib/debug/lib/i386-linux-gnu/GL
version: *gl-version
versions: *gl-versions
subdirectories: true
no-autodownload: true
merge-dirs: *gl-merge-dirs
enable-if: active-gl-driver
autoprune-unless: active-gl-driver

org.freedesktop.Platform.VAAPI.Intel.i386:
directory: lib/i386-linux-gnu/dri/intel-vaapi-driver
version: *runtime-version
versions: *runtime-version
autodelete: false
no-autodownload: true
add-ld-path: lib
download-if: have-intel-gpu
autoprune-unless: have-intel-gpu

modules:
- name: perfect_dark
buildsystem: simple
sources:
- type: file
path: bin/pd
- type: file
path: bin/pd.jpn
- type: file
path: bin/pd.pal
- type: file
path: io.github.fgsfdsfgs.perfect_dark.sh
- type: file
path: io.github.fgsfdsfgs.perfect_dark.png
- type: file
path: io.github.fgsfdsfgs.perfect_dark.metainfo.xml
- type: file
path: io.github.fgsfdsfgs.perfect_dark.desktop
build-commands: []
post-install:
# create extension mountpoints
- mkdir -p /app/lib/i386-linux-gnu
- mkdir -p /app/lib/i386-linux-gnu/GL
- mkdir -p /app/lib/debug/lib/i386-linux-gnu/GL
- mkdir -p /app/lib/i386-linux-gnu/dri/intel-vaapi-driver
# port
- install -Dm 755 -t /app/bin/ pd*
- install -Dm 755 ${FLATPAK_ID}.sh /app/bin/${FLATPAK_ID}.sh
- install -Dm 644 ${FLATPAK_ID}.desktop /app/share/applications/${FLATPAK_ID}.desktop
- install -Dm 644 ${FLATPAK_ID}.metainfo.xml /app/share/metainfo/${FLATPAK_ID}.metainfo.xml
- install -Dm 644 ${FLATPAK_ID}.png /app/share/icons/hicolor/256x256/apps/${FLATPAK_ID}.png
Binary file added dist/windows/icon.ico
Binary file not shown.
1 change: 1 addition & 0 deletions dist/windows/icon.rc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
id ICON icon.ico
2 changes: 2 additions & 0 deletions port/include/romdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ u8 *romdataSegGetDataEnd(const char *segName);
u32 romdataSegGetSize(const char *segName);
u32 romdataFileGetEstimatedSize(u32 size, FileType filetype);

s32 romdataCheckGbcRom(void);

#endif
2 changes: 2 additions & 0 deletions port/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ int main(int argc, const char **argv)
audioInit();
romdataInit();

g_ValidGbcRomFound = romdataCheckGbcRom();

gameInit();

if (fsGetModDir()) {
Expand Down
50 changes: 50 additions & 0 deletions port/src/romdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@

#define ROMDATA_MAX_FILES 2048

#define GBC_ROM_NAME "pd.gbc"
#define GBC_ROM_SIZE 4194304

u8 *g_RomFile;
u32 g_RomFileSize;

Expand Down Expand Up @@ -398,6 +401,53 @@ s32 romdataInit(void)
return 0;
}

static inline bool romdataCheckGbcRomContents(const u8 *gbcRomFile, const u32 gbcRomSize)
{
if (gbcRomSize != GBC_ROM_SIZE) {
return false;
}

// ROM title
if (memcmp(gbcRomFile + 0x134, "PerfDark VPDE", 15) != 0) {
return false;
}

// Licensee code
if (memcmp(gbcRomFile + 0x144, "4Y", 2) != 0) {
return false;
}

// Header and global checksums
if (gbcRomFile[0x14D] != 0xA1 || gbcRomFile[0x14E] != 0xAD || gbcRomFile[0x14F] != 0x0F) {
return false;
}

return true;
}

s32 romdataCheckGbcRom(void)
{
if (fsFileSize(GBC_ROM_NAME) < 0) {
// bail early if it doesn't exist to avoid generating error messages
return false;
}

u32 gbcRomSize = 0;
u8 *gbcRomFile = fsFileLoad(GBC_ROM_NAME, &gbcRomSize);
if (!gbcRomFile) {
return false;
}

const bool ret = romdataCheckGbcRomContents(gbcRomFile, gbcRomSize);
sysMemFree(gbcRomFile);

if (ret) {
sysLogPrintf(LOG_NOTE, "romdataCheckGbcRom: valid GBC rom found");
}

return ret;
}

s32 romdataFileGetSize(s32 fileNum)
{
if (fileNum < 1 || fileNum >= ROMDATA_MAX_FILES) {
Expand Down
Loading

0 comments on commit d5ee41f

Please sign in to comment.