diff options
Diffstat (limited to 'gnu/packages/game-development.scm')
-rw-r--r-- | gnu/packages/game-development.scm | 211 |
1 files changed, 190 insertions, 21 deletions
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm index 4c1b97f041..04f2b061fc 100644 --- a/gnu/packages/game-development.scm +++ b/gnu/packages/game-development.scm @@ -48,6 +48,7 @@ #:use-module (ice-9 match) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) + #:use-module (guix gexp) #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix svn-download) @@ -94,6 +95,7 @@ #:use-module (gnu packages pkg-config) #:use-module (gnu packages pulseaudio) #:use-module (gnu packages python) + #:use-module (gnu packages python-web) #:use-module (gnu packages python-xyz) #:use-module (gnu packages readline) #:use-module (gnu packages qt) @@ -1207,26 +1209,24 @@ to create fully featured games and multimedia programs in the python language.") license:lgpl2.1+)))) (define-public python-pygame-sdl2 + ;; Using latest git commit as of 2022-06-17, because there is no tagged + ;; release for renpy 8. + ;; Revert back to URLs once renpy 8 is released! (let ((real-version "2.1.0") - (renpy-version "7.4.11")) + ;;(renpy-version "8.0.0") + (commit "1705c6e3004dcb1daf859560bcd52eb093e97d45")) (package (inherit python-pygame) (name "python-pygame-sdl2") - (version (string-append real-version "-for-renpy-" renpy-version)) + (version (git-version real-version "0" commit)) (source (origin - (method url-fetch) - (uri (string-append "https://www.renpy.org/dl/" renpy-version - "/pygame_sdl2-" version ".tar.gz")) - (sha256 (base32 "0nxvca16299jx6sp0ys29rqixcs21ymhqwjfkbchhss0yar7qjgz")) - (modules '((guix build utils))) - (snippet - '(begin - ;; drop generated sources - (delete-file-recursively "gen") - (delete-file-recursively "gen3") - (delete-file-recursively "gen-static") - #t)))) + (method git-fetch) + (uri (git-reference + (url "https://github.com/renpy/pygame_sdl2") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 (base32 "1g0arhpd59zypspk36sgajf1kzavppfkv766vifvxar60968rrjn")))) (build-system python-build-system) (arguments `(#:tests? #f ; tests require pygame to be installed first @@ -1257,16 +1257,21 @@ While it aims to be used as a drop-in replacement, it appears to be developed mainly for Ren'py.") (license (list license:lgpl2.1 license:zlib))))) -(define-public renpy +;; Using nightly from 2022-06-16. +;; Revert back to URLs once renpy 8 is released! +(define %renpy-commit "3e854bc7cb1642ca18b061a0c6e349f168965c43") +(define-public python-renpy (package - (name "renpy") - (version "7.4.11") + (name "python-renpy") + (version (git-version "7.99.99" "0" %renpy-commit)) (source (origin - (method url-fetch) - (uri (string-append "https://www.renpy.org/dl/" version - "/renpy-" version "-source.tar.bz2")) - (sha256 (base32 "0zkhg2sd2hglm9dkansf4h8sq7lm7iqslzl763ambp4kyfdvd07q")) + (method git-fetch) + (uri (git-reference + (url "https://github.com/renpy/renpy") + (commit %renpy-commit))) + (file-name (git-file-name name version)) + (sha256 (base32 "11g7hqhw4gbkx5ib2wsawrznmjbn8r9zkgf2sg39z56h96y8wfbn")) (modules '((guix build utils))) (patches (search-patches @@ -1342,6 +1347,170 @@ the launcher and common Ren'py code provided by the @code{renpy} package and are only used to bootstrap it.") (license license:expat))) +(define-public renpy + (package + (inherit python-renpy) + (name "renpy") + (build-system python-build-system) + (arguments + (list + #:tests? #f ; see python-renpy + #:modules '((srfi srfi-1) + (guix build python-build-system) + (guix build utils)) + #:imported-modules `((srfi srfi-1) ,@%python-build-system-modules) + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'fix-commands + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "launcher/game/choose_directory.rpy" + (("/usr/bin/python") + (search-input-file inputs "/bin/python3"))) + (substitute* "launcher/game/front_page.rpy" + (("xdg-open") + (search-input-file inputs "/bin/xdg-open"))) + (substitute* "launcher/game/project.rpy" + (("cmd = \\[ executable, \"-EO\", sys.argv\\[0\\] \\]") + (string-append "cmd = [ \"" (assoc-ref outputs "out") + "/bin/renpy\" ]")) + ;; Projects are still created in the usual style, so we need + ;; to adjust the path. + (("cmd.append\\(self.path\\)") + "cmd.append(self.path + \"/game\")")))) + (add-after 'unpack 'drop-game-from-paths + (lambda _ + (substitute* (list "launcher/game/gui7.rpy" + "launcher/game/gui7/images.py") + ((", \"game\",") ",")) + #t)) + (add-before 'build 'start-xserver + (lambda* (#:key inputs native-inputs #:allow-other-keys) + (let ((Xvfb (search-input-file (or native-inputs inputs) + "/bin/Xvfb"))) + (setenv "HOME" (getcwd)) + (system (format #f "~a :1 &" Xvfb)) + (setenv "DISPLAY" ":1")))) + (replace 'build + (lambda _ + (invoke "python" "renpy.py" "launcher" "quit") + (invoke "python" "renpy.py" "the_question" "quit") + (invoke "python" "renpy.py" "tutorial" "quit"))) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; Here we install our custom renpy program. + ;; After finishing this step, "out" will have the following: + ;; |-- bin/renpy + ;; `-- share/renpy ; i.e. path_to_renpy_base() + ;; |-- common + ;; `-- gui + ;; + ;; Note that common shares the source files that would be installed + ;; by python2-renpy (which are instead deleted from that package), + ;; but also contains their byte-compiled versions. + ;; On other systems, renpy_base would point to site-packages or + ;; even somewhere in /opt. + ;; The former approach is not as straightforward as it seems + ;; -- it causes renpy to load files twice for some weird reason -- + ;; and the latter is impossible on Guix. Hence the detour through + ;; share/renpy and the custom renpy program. + ;; + ;; As a convention, other games should be installed as + ;; subdirectories of share/renpy in their respective outputs as + ;; well. This differs from the traditional layout, which is + ;; roughly the following: + ;; `-- Super Awesome Game + ;; |-- game ; <- the folder we actually want + ;; |-- lib ; compiled renpy module and dependencies + ;; |-- renpy ; yet another copy of Ren'py's code + ;; | |-- common ; the common folder from above + ;; | `-- ... ; Python code (source + compiled) + ;; |-- Super Awesome Game.py + ;; `-- Super Awesome Game.sh + (let* ((out (assoc-ref outputs "out")) + (bin/renpy (string-append out "/bin/renpy"))) + (copy-recursively "renpy/common" + (string-append out "/share/renpy/common")) + (copy-recursively "gui" + (string-append out "/share/renpy/gui")) + + (mkdir-p (string-append out "/bin")) + (copy-file #$(local-file (search-auxiliary-file "renpy/renpy.in")) + bin/renpy) + (substitute* bin/renpy + (("@PYTHON@") (search-input-file inputs "bin/python3")) + (("@RENPY_BASE@") (string-append out "/share/renpy"))) + (chmod bin/renpy #o755)))) + + (add-after 'install 'install-games + (lambda* (#:key inputs outputs #:allow-other-keys) + (define renpy (assoc-ref outputs "out")) + ;; TODO: We should offer a renpy-build-system to make the + ;; installation of Ren'py games easier. + (define* (install-renpy-game #:key output game name (renpy renpy) + #:allow-other-keys) + (let* ((name (or name (basename game))) + (launcher (string-append output "/bin/renpy-" name)) + (share (string-append output "/share/renpy/" name))) + (copy-recursively (string-append game "/game") share) + (mkdir-p (string-append output "/bin")) + (with-output-to-file launcher + (lambda () + (format #t + "#!~a~%~a ~a \"$@\"" + (search-input-file inputs "/bin/bash") + (string-append renpy "/bin/renpy") + share))) + (chmod launcher #o755))) + + (install-renpy-game #:output (assoc-ref outputs "out") + #:game "launcher") + + (install-renpy-game #:output (assoc-ref outputs "the-question") + #:game "the_question" + #:name "the-question") + + (install-renpy-game #:output (assoc-ref outputs "tutorial") + #:game "tutorial"))) + (replace 'wrap + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (site (string-append "/lib/python" + (python-version + (assoc-ref inputs "python")) + "/site-packages"))) + (wrap-program (string-append out "/bin/renpy") + `("GUIX_PYTHONPATH" = + (,@(delete-duplicates + (map + (lambda (store-path) + (string-append store-path site)) + (cons (assoc-ref outputs "out") + (map cdr + (filter + (lambda (input) + (string-prefix? "python" (car input))) + inputs)))))))))))))) + (inputs (list bash-minimal + python + python-pefile + python-requests + python-renpy + python-six + `(,python "tk") + xdg-utils)) + (propagated-inputs '()) + (native-inputs (list xorg-server-for-tests)) + (outputs (list "out" "tutorial" "the-question")) + (home-page "https://www.renpy.org/") + (synopsis "Visual Novel Engine") + (description "Ren'Py is a visual novel engine that helps you use words, +images, and sounds to tell interactive stories that run on computers and +mobile devices. These can be both visual novels and life simulation games. +The easy to learn script language allows anyone to efficiently write large +visual novels, while its Python scripting is enough for complex simulation +games.") + (license license:expat))) + (define-public python-pyxel (package (name "python-pyxel") |