Skip to content

Commit

Permalink
games-arcade/shovel-knight: Work around crash when a controller is co…
Browse files Browse the repository at this point in the history
…nnected

Signed-off-by: James Le Cuirot <[email protected]>
  • Loading branch information
chewi committed Jun 24, 2023
1 parent bc188ce commit b1988d7
Showing 1 changed file with 110 additions and 0 deletions.
110 changes: 110 additions & 0 deletions games-arcade/shovel-knight/shovel-knight-4.1b-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=8

inherit desktop unpacker wrapper xdg

MY_PN="ShovelKnight"
DESCRIPTION="Sweeping classic action adventure with an 8-bit retro aesthetic"
HOMEPAGE="https://yachtclubgames.com/games/shovel-knight-treasure-trove/"
SRC_URI="${PN//-/_}_treasure_trove_4_1b_arby_s_46298.sh"
S="${WORKDIR}/data/noarch/game"

LICENSE="Yacht-Club-Games-EULA"
SLOT="0"
KEYWORDS="-* ~amd64 ~x86"
IUSE="+joystick"
RESTRICT="bindist fetch splitdebug"

# I packaged Box2D in the hope of unbundling it but it turns out this
# game uses a custom version. -- Chewi :(

RDEPEND="
media-libs/glew:1.10
virtual/opengl
!x86? ( media-libs/libsdl2[joystick?,opengl,sound,video] )
x86? ( !joystick? ( media-libs/libsdl2[opengl,sound,video] ) )
"

BDEPEND="
dev-util/patchelf
"

DIR="/opt/${PN}"
QA_PREBUILT="${DIR#/}/*"

pkg_nofetch() {
einfo "Please buy and download ${SRC_URI} from:"
einfo " https://www.gog.com/game/${PN//-/_}"
einfo "and move it to your distfiles directory."
}

src_unpack() {
unpack_zip ${A}
}

src_install() {
local BITS=$(usex amd64 64 32) LIB=

exeinto "${DIR}"
doexe ${BITS}/${MY_PN}
make_wrapper ${MY_PN} ./${MY_PN} "${DIR}"

exeinto "${DIR}"/lib
doexe ${BITS}/lib/lib{Box2D.so.*,fmod*-*.so}

for LIB in ${BITS}/lib/libfmod*-*.so; do
LIB=${LIB##*/}

# The FMOD libraries are duplicated rather than symlinked, which is
# silly, so create our own symlinks. Both sets of names are needed.
dosym "${LIB}" "${DIR}/lib/${LIB%-*}.so"

# The SONAMEs are also unset, which upsets our QA check, so fix.
patchelf --set-soname "${LIB%-*}.so" "${ED}${DIR}/lib/${LIB}" || die
done

if use joystick; then
local SDL=libSDL2-2.0.so.0
local SDLj=libSDL2-joystick.so

if use x86; then
# Under x86, using our own SDL2 causes the game to crash when a
# controller is connected, even after applying the workaround below.
# It is seemingly caused by a change to the SDL_GetJoystickGUIDInfo
# signature. We must therefore use the bundled SDL2.
doexe ${BITS}/lib/${SDL}
else
# The game uses internal SDL2 joystick functions. These functions
# have since been hidden and some have been removed. Using our own
# SDL2 therefore causes the game to crash when a controller is
# connected. We still want to use our own SDL2 for things like
# Wayland, but we can work around this by loading both, using the
# bundled one as a fallback.
newexe ${BITS}/lib/${SDL} ${SDLj}

# The bundled SDL2 SONAME has to be set to something different.
patchelf --set-soname ${SDLj} "${ED}${DIR}"/lib/${SDLj} || die

# We need to add the new SONAME as a NEEDED entry, but the order is
# important, so we also need to remove the existing NEEDED entry
# first and add it back again afterwards.
patchelf \
--remove-needed ${SDL} \
--add-needed ${SDLj} \
--add-needed ${SDL} \
"${ED}${DIR}"/${MY_PN} || die
fi
fi

# The RUNPATHs are not entirely correct so fix up.
patchelf --set-rpath '$ORIGIN/lib' "${ED}${DIR}"/${MY_PN} || die
patchelf --set-rpath '$ORIGIN' "${ED}${DIR}"/lib/libfmodevent*.so || die

insinto "${DIR}"
doins -r data/

newicon -s 256 ../support/icon.png ${PN}.png
make_desktop_entry ${MY_PN} "Shovel Knight"
}

0 comments on commit b1988d7

Please sign in to comment.