[game-data-packager] 02/02: DOSBox integration proof of concept + freeware Skyroads game

Alexandre Detiste detiste-guest at moszumanska.debian.org
Mon Jan 11 14:19:58 UTC 2016


This is an automated email from the git hooks/post-receive script.

detiste-guest pushed a commit to branch master
in repository game-data-packager.

commit 75c9ed54806db75b6dcbd075f561a0cc6d51a445
Author: Alexandre Detiste <alexandre.detiste at gmail.com>
Date:   Mon Jan 11 15:18:44 2016 +0100

    DOSBox integration proof of concept + freeware Skyroads game
---
 data/wip/skyroads.yaml             | 123 +++++++++++++++++++++++++++++++++++++
 game_data_packager/games/dosbox.py | 102 ++++++++++++++++++++++++++++++
 runtime/dosgame.py                 |  75 ++++++++++++++++++++++
 3 files changed, 300 insertions(+)

diff --git a/data/wip/skyroads.yaml b/data/wip/skyroads.yaml
new file mode 100644
index 0000000..73388f6
--- /dev/null
+++ b/data/wip/skyroads.yaml
@@ -0,0 +1,123 @@
+---
+longname: SkyRoads
+copyright: © 1993 Bluemoon
+plugin: dosbox
+genre: Flight simulator
+
+packages:
+  skyroads-data:
+    install:
+    - assets
+    # .exe is explicitely stated again
+    # so main_exe algorithm can see it
+    # before group expansion
+    - skyroads.exe
+    license:
+    - readme.txt
+
+files:
+  skyroads.zip:
+    download: http://www.bluemoon.ee/history/skyroads/skyroads.zip
+    unpack:
+     format: zip
+    provides:
+    - assets
+    - readme.txt
+
+groups:
+  archives: |
+    593740    e5918f9bdb604507d0434619ed7d9faa skyroads.zip
+    683       dc1034d32e560960018bf1104e8be6b8 readme.txt
+  assets: |
+    30472     fc59ede3b3015ddabbc5b7be52271df7 skyroads.exe
+    6398      86f74c07f370f79ed6ae0efb8ab7bae7 demo.rec
+    407       7b43fe96a98481e2d5d694a5d30eb528 ful_disp.dat
+    395       1a4ad8227cbce196bb2f1975d3d45e7b oxy_disp.dat
+    3903      591e7a22dc25044b4cf7b170ff160e60 speed.dat
+    32100     b0e0eb6c45c0269dfe05edf5fbf02213 intro.snd
+    25807     22fee57a5aa2bea2fcea6825f7617bf5 sfx.snd
+
+    44808     28664bdffbfae0c7a1ff40570a5327ff anim.lzs
+    8167      1eaa43e89d11e37c3e800a362635f73c cars.lzs
+    10860     c3cc104af58d1b9ad2c6f507fbafa928 dashbrd.lzs
+    26695     9e4455e78e36e9f92bc485d912d5f190 gomenu.lzs
+    60606     4ca283916522bf70e04982614aaa1e86 helpmenu.lzs
+    20874     2a484f6baca7bb20e7f58dffdb4b09b6 intro.lzs
+    1140      2dc7798dffb2d73cebd7070d4f9d2075 mainmenu.lzs
+    16821     39c82a6594b71507af96fcac83259c57 muzax.lzs
+    17102     80b0a02ae5a785c869cdd64edf0ae412 roads.lzs
+    24666     4cc0f839bb497d63de2ca8490d286eed setmenu.lzs
+    98148     a003196ae39c17dd339f8a5ded2e6be0 trekdat.lzs
+    26645     12fc0010f32cfb3389bcec6e3a2f289b world0.lzs
+    15696     660885a1aae50a01ea36c6f76c64c295 world1.lzs
+    27755     dac9802774eb98ac7b7ce327b97b4534 world2.lzs
+    24082     179a760941741a27dd73b2e7875cb65c world3.lzs
+    31341     83d1d3623a40a150d01b7dc7e5021e43 world4.lzs
+    20047     fe3d2195af01fadd5f4766cb1218bf7a world5.lzs
+    18642     6dd96d7c7a99017ffd767bd42c6aa76d world6.lzs
+    29960     72a16c456291f8782a60e5c290c47749 world7.lzs
+    14989     520076e4a113ffbf3e92848e3ebca73d world8.lzs
+    21312     7257c2fb813fba24156d47e13026381e world9.lzs
+
+sha1sums: |
+  978d2209a4c3979cde1bc54a6b533f797b09f754 skyroads.zip
+  1d920dfe68f13cf671f9c4d186af0996adedc1ac skyroads.exe
+
+  38953df85c8755b3679a5e15c3aefabe1802cf1e anim.lzs
+  b5ebc592f0bda84899cde427fed35d2bba082c57 cars.lzs
+  8087aa755d5b6f6f649da27814c031b4e0c964a3 dashbrd.lzs
+  ff083a36f9f3714f55e18d4e6f801f809f378412 demo.rec
+  0a8958fbd19da2169080b5d2b99b6caa3a68d14d ful_disp.dat
+  4a8828bb9b16abb9cfc8571d5a27a65db280b9f3 gomenu.lzs
+  79932a6659677325a1e5af3bfa0a93adb70b65d9 helpmenu.lzs
+  407cd731ae3f33d639ac69a6c0434e2d7e48d6a7 intro.lzs
+  0017117682d08ad7ef21910f2f56f4471b5f060d intro.snd
+  f64866866dd736f20e7b7701015813279d71f6bc mainmenu.lzs
+  4bd030b75b600ef1d15ed7d978d299215f30ace7 muzax.lzs
+  3d4ec42bae73ea66ad1489b8c42660910014d3b5 oxy_disp.dat
+  057c02b4b6f1074354e5d6e851a9c9fe210778a3 roads.lzs
+  5c26326eee221a973aea8cf199b133cd69364d49 setmenu.lzs
+  52305353866e52f99824f3425e96be0f6391fdf3 sfx.snd
+  2f932e199c52ae9f949d54729be0f235da2c6018 speed.dat
+  4138a729efb8ff3c1b8651c0113c87192eb13ad6 trekdat.lzs
+  1131f09c263601372f8ba7cfb1aff25966899d03 world0.lzs
+  74b4d88ee2c41c6d75a6436f1ee6ceff5ff2f941 world1.lzs
+  8a9d576ca1be66c49684179f8010ff1c88d7bd64 world2.lzs
+  47103f1e4a7fd9b7a5c5d2b26ebc8f3011df6375 world3.lzs
+  1839df885cf98bd379acaaa50218f41bd47d98f9 world4.lzs
+  642880b1b2c0d8e009343924e31c1f01c4ce3eb1 world5.lzs
+  b03a185fd0e54502d62d9262e156fae4c5c4fee6 world6.lzs
+  0ff352113ca5b85e95b7dd960eb7ad14dd6a91d7 world7.lzs
+  6fbc392cf90196bcae48e38faa4ce1cc97a5a47f world8.lzs
+  23eb55b0e84721261429b9fcb850a5274b561065 world9.lzs
+
+sha256sums: |
+  6630fcf84f568dd505303ab0dd5f8c79e576ee2c93c585f973c62956ef667afc anim.lzs
+  86b7832783bde0b67443104eba66196ed8ba31148339192db00c67eaddf9929e cars.lzs
+  c1ad75492f9d93fa9e40c17b39fbd4c21ee6d9188547fea09fbc41c9e719ea8c dashbrd.lzs
+  2bb53c6cd62f2cd2a8657cd05bf9e33054570c1e3e98dd89e18587156867016e demo.rec
+  a6f50b73abd0d2ebf97508cf12e2b9f7b29aeff29b794a2ab595ede9c93a12b5 ful_disp.dat
+  8852c378ecdb9165183924ca81b3b0ace9ed73b1cca5ac364fbfe18f6abc885f gomenu.lzs
+  f016e6eb479e163dca426b3111b796067eea62dbf9011ba99b65d0f0da1660a8 helpmenu.lzs
+  f37fa5819914e4f968a7b884fa8c827dcdf4be9e6a567e9b9da4fdd62bd276e5 intro.lzs
+  f2eff08cf5ed7986c89232d21468b53c7cce5826f519585d44d97eec58bb510c intro.snd
+  45b0dbb2866f8b84b0253ca002fab01fba0c53b1f8593b1fb18119e570ae3a07 mainmenu.lzs
+  be741b53f33a1d7a488b1a66d7df4a20ca44c4d7a252a2984e2325f7a8b0d8a4 muzax.lzs
+  a5d00c24e3b0d6cb14792926055445fa970e2109e8da2ff4ff2b72fe81ec3d6f oxy_disp.dat
+  eae3754bcbf9db20f076e330038d29401b2b5eb400bb148d772edb4ba23442ce roads.lzs
+  86fd9ad57ea787beda20f00b4dce1ed4d1ae0e4b2645cb529b65ae734f6df636 setmenu.lzs
+  7c17c601f5e58ef9c286cf9e6c19aa8fd287cfa6836be3920dbb78d904c3ea4e sfx.snd
+  c3a55223e359749555535e138ef4219bc94458639e44f70edf3cfcb2f28c26ac skyroads.exe
+  97bff2d41fdde4953d986cb2d9011718f302ff46bb8d21abbb267343b086b7fc speed.dat
+  513b572fc159f6e8219fd3b53f5f8e51df71ef0df7e4e6c72219b08755f3819b trekdat.lzs
+  e120ca2f8a9fb44c5f921b0f76bfa178ad79b19ba94c9e0627bebf0672b21358 world0.lzs
+  c1c41f5730010aa2b4051697ce02d381fdb4f6b4d4ab9cd4d3c80c19353aee91 world1.lzs
+  bd40edbe99818554749616dd248fa15aef76f4f2da932d5193d91f5fe254426b world2.lzs
+  cebeafebd64fab9e68c91aa4a8c1f68e07fe0cec0fa7070ae5c35b65f655b0bc world3.lzs
+  fc125d221b6a713cbce24b9a4fe39bfff2cef564980080e8a981a7c93bb217c1 world4.lzs
+  d64735b3565ece174976ff36f94b2d71cea2abf91be2bde35112f6e61d72f83a world5.lzs
+  f96b0ea6f2ddbedc2d4deeeb3b3cd24d457d55ad42a5b5a876d6d384a8410d59 world6.lzs
+  1e66a77e5594ab114e285ce4414ed27228c7fa38a398d60cf46527a3baf75b63 world7.lzs
+  696087230a90766d445c1d946bcc97980961595c837b792870e018c5ced234e2 world8.lzs
+  3ea0c840e723fe097d92f84e3747007f662a21eb3ef6e0f532624fc1f9c63178 world9.lzs
+...
diff --git a/game_data_packager/games/dosbox.py b/game_data_packager/games/dosbox.py
new file mode 100755
index 0000000..704b463
--- /dev/null
+++ b/game_data_packager/games/dosbox.py
@@ -0,0 +1,102 @@
+#!/usr/bin/python3
+# encoding=utf-8
+#
+# Copyright © 2016 Alexandre Detiste <alexandre at detiste.be>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# You can find the GPL license text on a Debian system under
+# /usr/share/common-licenses/GPL-2.
+
+# this is just a proof-of-concept,
+# please don't start packaging 10.000 DOS games
+
+import configparser
+import logging
+import os
+
+from .. import GameData
+from ..build import (PackagingTask)
+from ..util import (mkdir_p)
+
+logger = logging.getLogger('game-data-packager.games.dosbox')
+
+class DosboxGameData(GameData):
+    """Special subclass of GameData for DOS games.
+
+    These games will need the "dosgame" runtime
+    provided by src:game-data-packager.
+    """
+
+    def __init__(self, shortname, data):
+        super(DosboxGameData, self).__init__(shortname, data)
+
+        for p in self.packages.values():
+            p.install_to = '$assets/dosbox/' + p.name[:len(p.name)-5]
+            p.depends = 'dosgame'
+            p.main_exe = None
+            if 'main_exe' in self.data['packages'][p.name]:
+                p.main_exe = self.data['packages'][p.name]['main_exe']
+            else:
+                for wanted in p.install:
+                    filename, ext = os.path.splitext(wanted)
+                    if (filename not in ('config', 'install', 'setup')
+                        and ext in ('.com','.exe')):
+                        assert p.main_exe is None
+                        p.main_exe = filename
+            assert p.main_exe
+
+    def construct_task(self, **kwargs):
+        return DosboxTask(self, **kwargs)
+
+class DosboxTask(PackagingTask):
+    def fill_extra_files(self, package, destdir):
+        super(DosboxTask, self).fill_extra_files(package, destdir)
+
+        pgm = package.name[:len(package.name)-5]
+        mkdir_p(os.path.join(destdir, self.packaging.BINDIR))
+        os.symlink('dosgame',
+                   os.path.join(destdir, self.packaging.BINDIR, pgm))
+
+        appdir = os.path.join(destdir, 'usr/share/applications')
+        mkdir_p(appdir)
+
+        desktop = configparser.RawConfigParser()
+        desktop.optionxform = lambda option: option
+        desktop['Desktop Entry'] = {}
+        entry = desktop['Desktop Entry']
+        entry['Name'] = package.longname or self.game.longname
+        entry['Icon'] = 'dosbox'
+        entry['GenericName'] = self.game.genre + ' game'
+        entry['Exec'] = pgm
+        entry['Terminal'] = 'false'
+        entry['Type'] = 'Application'
+        entry['Categories'] = 'Game;'
+
+        with open(os.path.join(appdir, '%s.desktop' % package.name),
+                  'w', encoding='utf-8') as output:
+             desktop.write(output, space_around_delimiters=False)
+
+
+        # minimal information needed by the runtime
+        dosgame = configparser.RawConfigParser()
+        dosgame.optionxform = lambda option: option
+        dosgame['Dos Game'] = {}
+        entry = dosgame['Dos Game']
+        entry['Dir'] = package.main_exe
+        entry['Exe'] = package.main_exe
+
+        install_to = self.packaging.substitute(package.install_to,
+                       package.name).lstrip('/')
+        with open(os.path.join(destdir, install_to, 'dosgame.inf'),
+                  'w', encoding='utf-8') as output:
+             dosgame.write(output, space_around_delimiters=False)
+
+GAME_DATA_SUBCLASS = DosboxGameData
diff --git a/runtime/dosgame.py b/runtime/dosgame.py
new file mode 100755
index 0000000..44e8b9f
--- /dev/null
+++ b/runtime/dosgame.py
@@ -0,0 +1,75 @@
+#!/usr/bin/python3
+# encoding=utf-8
+#
+# Copyright © 2016 Alexandre Detiste <alexandre at detiste.be>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# You can find the GPL license text on a Debian system under
+# /usr/share/common-licenses/GPL-2
+
+# this goes in "/usr/games/dosgame"
+
+import configparser
+import os
+import sys
+import subprocess
+
+game = os.path.basename(sys.argv[0])
+
+srcroot = '/usr/share/games/dosbox/'
+srcdir  = os.path.join(srcroot, game)
+inf = os.path.join(srcdir, 'dosgame.inf')
+
+if game == 'dosgame':
+    print('Supported games:')
+    print('\n'.join(os.listdir(srcroot)))
+    exit(0)
+
+config = configparser.ConfigParser()
+config.read(inf, encoding='utf-8')
+for section in config.sections():
+    # this .inf file could also include
+    # other sections that would be
+    # copied as-is into dosbox.cfg
+    assert(section == "Dos Game")
+    dir = config[section]['Dir']
+    exe = config[section]['Exe']
+
+destroot = os.path.expanduser('~/.dosbox')
+destdir = os.path.join(destroot, dir)
+autoexec = os.path.join(destdir, 'dosbox.cfg')
+
+# XXX: currenlty only work with games that
+#      have all assets in a single directory
+#
+#      some games needs to be able to write in subdirs
+#      and will need extensive linkfarms,
+#      while other are ok with symlinked subdirs
+if not os.path.isdir(destdir):
+    os.makedirs(destdir)
+    for dirpath, dirnames, filenames in os.walk(srcdir):
+        for fn in filenames:
+            if fn == 'dosgame.inf':
+                continue
+            full = os.path.join(dirpath, fn)
+            os.symlink(full, os.path.join(destdir, fn))
+
+if not os.path.isfile(autoexec):
+    with open(autoexec, 'w', encoding='ascii') as of:
+        of.write('[Autoexec]\n')
+        of.write('@ECHO OFF\n')
+        of.write('MOUNT C %s\n' % destroot)
+        of.write('C:\n')
+        of.write('CD %s\n' % dir)
+        of.write('%s\n' % exe)
+        of.write('EXIT\n')
+
+subprocess.call(['dosbox', '-conf', autoexec])

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/game-data-packager.git



More information about the Pkg-games-commits mailing list