(define-module (tw packages games)
#:use-module (guile) ; for `geiser-eval-buffer-and-go' to work properly
#:use-module ((ice-9 string-fun) #:select (string-replace-substring))
#:use-module (gnu packages audio)
#:use-module (gnu packages base)
#:use-module (gnu packages compression)
#:use-module (gnu packages fonts)
#:use-module (gnu packages fontutils)
#:use-module (gnu packages gcc)
#:use-module (gnu packages guile)
#:use-module (gnu packages image)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages sdl)
#:use-module (gnu packages textutils)
#:use-module (guix build utils)
#:use-module (guix build-system copy)
#:use-module (guix build-system gnu)
#:use-module (guix build-system trivial)
#:use-module (guix download)
#:use-module (guix gexp)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (guix packages))
(define-public simutrans-pak128
;; Install paks as propagated-inputs of simutrans, so they go in
;; Simutrans' data directory, where Simutrans expects them.
(package
(name "simutrans-pak128") ; note: needs simutrans >= 123
(version "2.8.2")
(source (origin
(method url-fetch)
(uri (string-append
"mirror://sourceforge/simutrans/pak128/"
"pak128%202.8.2%20for%20ST%20123up/simupak128-2.8.2-for123.zip"))
(sha256 (base32 "0hzpb6bh1lh0fdcpxlbfw5j74xz65gxl8yx5094rqf5zflvz10py"))))
(native-inputs (list unzip)) ; shouldn't copy-build-system / origin handle this?
(build-system copy-build-system)
(arguments '(#:install-plan '(("pak128" "share/games/simutrans/pak128"))))
(home-page "https://forum.simutrans.com/index.php?board=26.0")
(synopsis "Graphical pak set for Simutrans, 128x128 tile size")
(description
(string-append
"When Simutrans could only support 64px size graphics, pak128 already started. "
"First pak to feature a complex economy and have a very wide variety of objects. "
"It contains roughly 7 times more graphic data than pak64 and thus requires by far "
"the largest amount of RAM and processing power of all Simutrans sets."))
(license license:artistic2.0)))
(define simutrans-paths-patch
(plain-file "simutrans-paths.patch" "\
This patch stores user-specific config in $XDG_CONFIG_HOME/simutrans
rather than ~/simutrans.
--- a/sys/simsys.cc 2022-09-25 01:36:18.951636483 +0200
+++ b/sys/simsys.cc 2022-09-25 01:36:44.615457050 +0200
@@ -395,7 +395,11 @@
#elif defined __ANDROID__
tstrncpy(buffer,SDL_GetPrefPath(\"Simutrans Team\",\"simutrans\"),lengthof(buffer));
#else
- sprintf(buffer, \"%s/simutrans\", getenv(\"HOME\"));
+ if (getenv(\"XDG_CONFIG_HOME\") == NULL) {
+ sprintf(buffer, \"%s/.config/simutrans\", getenv(\"HOME\"));
+ } else {
+ sprintf(buffer, \"%s/simutrans\", getenv(\"XDG_CONFIG_HOME\"));
+ }
#endif
// create directory and subdirectories
"))
(define simutrans-desktop-entry "\
[Desktop Entry]
Name=Simutrans
Comment=Transportation simulator
Exec=simutrans
Icon=simutrans
Terminal=false
Type=Application
Categories=Game;Simulation;
")
(define simutrans-appdata-xml "\
com.simutrans.simutranssimutrans.desktopSimutransTransportation simulatorCC0-1.0Artistic-1.0
Simutrans is a free transportation simulator: the player operates a transportation \
company and has to transport goods and passengers between factories and different cities.
https://screenshots.debian.net/screenshots/000/001/205/large.pnghttps://forum.simutrans.com/index.php?board=8.0https://www.simutrans.com/
")
(define-public simutrans/pak128
;; Based off the Arch Linux package:
;; https://github.com/archlinux/svntogit-community/blob/packages/simutrans/trunk/PKGBUILD
;; I took the idea of a wrapper script from the Nix package:
;; https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/simutrans/default.nix
(package
(name "simutrans")
(version "123.0.1")
(source (origin
(method url-fetch/zipbomb)
(uri (let ((version/- (string-replace-substring version "." "-")))
(string-append "mirror://sourceforge/simutrans/simutrans/"
version/- "/simutrans-src-" version/- ".zip")))
;; Use `guix hash -H sha256 '.
(sha256 (base32 "0sgl2hrgjd2cyw3fbcvpq29dwf0w2sdlpp8ccic5bys1vv43iswd"))
(patches (list simutrans-paths-patch))))
(build-system gnu-build-system)
(arguments
`(#:make-flags
'("VERBOSE=1" "OPTIMISE=1" "OSTYPE=linux" "BACKEND=sdl2" "MULTI_THREAD=1"
"USE_ZSTD=1" "USE_FREETYPE=1" "USE_FLUIDSYNTH_MIDI=1")
#:tests? #f ; tests don't work as SDL2 can't find a video device
#:test-target "test" ; run "make test" for tests
#:phases
(modify-phases %standard-phases
(replace 'bootstrap
(lambda _
(invoke "find" "." "-type" "f" "-exec" "dos2unix" "-q" "{}" ";")
(substitute* "Makefile"
(("\\\\#define") "#define"))))
(replace 'configure
(lambda _
(copy-file "config.template" "config.default")))
(replace 'install
(lambda* (#:key inputs outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
;; Install "real" simutrans executable into libexec, as we need a wrapper script.
(with-directory-excursion "build/default"
(rename-file "sim" "simutrans"))
(install-file "build/default/simutrans"
(string-append out "/libexec"))
;; Install wrapper script to pass the right workdir to simutrans.
(mkdir-p (string-append out "/bin"))
(with-output-to-file (string-append out "/bin/simutrans")
(lambda ()
(format #t "#! ~a/bin/guile --no-auto-compile\n!#\n~s\n"
(assoc-ref inputs "guile")
`(apply execl ,(string-append out "/libexec/simutrans") "simutrans"
"-set_workdir" ,(string-append out "/share/games/simutrans")
(cdr (command-line))))))
(chmod (string-append out "/bin/simutrans") #o755)
;; Install game data bundled with simutrans (not the pak).
(mkdir-p (string-append out "/share/games/simutrans"))
(copy-recursively
"simutrans" (string-append out "/share/games/simutrans"))
;; Install a symlink to our pak, as simutrans needs all its data in one directory.
(let ((pak (assoc-ref inputs "simutrans-pak128")))
(symlink (string-append pak "/share/games/simutrans/pak128")
(string-append out "/share/games/simutrans/pak128")))
;; Install extra helper files.
(install-file "simutrans.svg"
(string-append out "/share/icons/hicolor/scalable/apps"))
(mkdir-p (string-append out "/share/applications"))
(with-output-to-file
(string-append out "/share/applications/simutrans.desktop")
(lambda () (display ,simutrans-desktop-entry)))
(mkdir-p (string-append out "/share/metainfo"))
(with-output-to-file
(string-append out "/share/metainfo/simutrans.appdata.xml")
(lambda () (display ,simutrans-appdata-xml)))))))))
(inputs `(,zlib ,bzip2 ,libpng ,sdl2 ; these are required
(,zstd "lib") ,freetype ,fluidsynth ; these are technically optional
,guile-3.0 ,simutrans-pak128))
(native-inputs (list pkg-config findutils dos2unix)) ; build-time deps
(home-page "https://www.simutrans.com/")
(synopsis "Transportation simulation game")
(description
(string-append
"Simutrans is a freeware and open-source transportation simulator. "
"Your goal is to establish a successful transport company. "
"Transport passengers, mail and goods by rail, road, ship, and even air. "
"Interconnect districts, cities, public buildings, industries and tourist "
"attractions by building a transport network you always dreamed of. "
"This package comes bundled with simutrans-pak128."))
(license (license:non-copyleft
"file://simutrans/license.txt"
"This is Simutrans' custom artistic license."))))