[gnome-games/wip/exalm/sharp-x68000: 196/203] Add Sharp X68000 platform



commit 98bda52f1dc03b78f6e12cf9b8ea42e3cb81ae87
Author: Exalm <exalm7659 gmail com>
Date:   Tue Apr 3 02:42:37 2018 +0500

    Add Sharp X68000 platform

 data/org.gnome.Games.desktop.in.in                 |   2 +-
 meson_options.txt                                  |   1 +
 plugins/meson.build                                |   1 +
 plugins/sharp-x68000/data/meson.build              |   1 +
 plugins/sharp-x68000/data/sharp-x68000.plugin      |   6 +
 plugins/sharp-x68000/meson.build                   |   2 +
 plugins/sharp-x68000/src/meson.build               |  16 ++
 .../src/sharp-x68000-game-factory.vala             | 169 +++++++++++++++++++++
 plugins/sharp-x68000/src/sharp-x68000-plugin.vala  |  20 +++
 po/POTFILES.in                                     |   1 +
 src/retro/retro-core-source.vala                   |   3 +-
 11 files changed, 219 insertions(+), 3 deletions(-)
---
diff --git a/data/org.gnome.Games.desktop.in.in b/data/org.gnome.Games.desktop.in.in
index 51633c24..05cf6ec5 100644
--- a/data/org.gnome.Games.desktop.in.in
+++ b/data/org.gnome.Games.desktop.in.in
@@ -11,4 +11,4 @@ Terminal=false
 Type=Application
 StartupNotify=true
 Categories=GNOME;GTK;Player;Game;
-MimeType=application/vnd.nintendo.snes.rom;application/x-amiga-disk-format;application/x-atari-2600-rom;application/x-atari-7800-rom;application/x-atari-lynx-rom;application/x-cue;application/x-dc-rom;application/x-desktop;application/x-doom-wad;application/x-fds-disk;application/x-gameboy-color-rom;application/x-gameboy-rom;application/x-gamecube-rom;application/x-gamegear-rom;application/x-gba-rom;application/x-genesis-32x-rom;application/x-genesis-rom;application/x-love-game;application/x-mame-rom;application/x-ms-dos-executable;application/x-n64-rom;application/x-neo-geo-pocket-color-rom;application/x-neo-geo-pocket-rom;application/x-nes-rom;application/x-nintendo-ds-rom;application/x-pc-engine-rom;application/x-playstation-rom;application/x-saturn-rom;application/x-sega-cd-rom;application/x-sega-pico-rom;application/x-sg1000-rom;application/x-sms-rom;application/x-virtual-boy-rom;application/x-wii-rom;application/x-wii-wad;application/x-wonderswan-color-rom;application/
 x-wonder
 swan-rom;application/zip;
+MimeType=application/vnd.nintendo.snes.rom;application/x-amiga-disk-format;application/x-atari-2600-rom;application/x-atari-7800-rom;application/x-atari-lynx-rom;application/x-cue;application/x-dc-rom;application/x-desktop;application/x-doom-wad;application/x-fds-disk;application/x-gameboy-color-rom;application/x-gameboy-rom;application/x-gamecube-rom;application/x-gamegear-rom;application/x-gba-rom;application/x-genesis-32x-rom;application/x-genesis-rom;application/x-love-game;application/x-mame-rom;application/x-ms-dos-executable;application/x-n64-rom;application/x-neo-geo-pocket-color-rom;application/x-neo-geo-pocket-rom;application/x-nes-rom;application/x-nintendo-ds-rom;application/x-pc-engine-rom;application/x-playstation-rom;application/x-saturn-rom;application/x-sega-cd-rom;application/x-sega-pico-rom;application/x-sg1000-rom;application/x-sms-rom;application/x-virtual-boy-rom;application/x-wii-rom;application/x-wii-wad;application/x-wonderswan-color-rom;application/
 x-wonder
 swan-rom;application/zip;application/x-x68k-rom;
diff --git a/meson_options.txt b/meson_options.txt
index 3956cf6d..589a0bf8 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -20,6 +20,7 @@ option ('nintendo-ds-plugin',   description: 'Support for Nintendo DS games',
 option ('playstation-plugin',   description: 'Support for PlayStation games',   type: 'boolean')
 option ('sega-cd-plugin',       description: 'Support for Sega CD games',       type: 'boolean')
 option ('sega-saturn-plugin',   description: 'Support for Sega Saturn games',   type: 'boolean')
+option ('sharp-x68000-plugin',  description: 'Support for Sharp X68000 games',  type: 'boolean')
 option ('steam-plugin',         description: 'Support for Steam games',         type: 'boolean')
 option ('turbografx-cd-plugin', description: 'Support for TurboGrafx-CD games', type: 'boolean')
 option ('virtual-boy-plugin',   description: 'Support for Virtual Boy games',   type: 'boolean')
diff --git a/plugins/meson.build b/plugins/meson.build
index 53265cfb..a6bff076 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -9,6 +9,7 @@ plugins = [
   'playstation',
   'sega-cd',
   'sega-saturn',
+  'sharp-x68000',
   'steam',
   'turbografx-cd',
   'virtual-boy',
diff --git a/plugins/sharp-x68000/data/meson.build b/plugins/sharp-x68000/data/meson.build
new file mode 100644
index 00000000..0d4b6c49
--- /dev/null
+++ b/plugins/sharp-x68000/data/meson.build
@@ -0,0 +1 @@
+install_data (plugin_name + '.plugin', install_dir: plugins_dir)
diff --git a/plugins/sharp-x68000/data/sharp-x68000.plugin b/plugins/sharp-x68000/data/sharp-x68000.plugin
new file mode 100644
index 00000000..8070e816
--- /dev/null
+++ b/plugins/sharp-x68000/data/sharp-x68000.plugin
@@ -0,0 +1,6 @@
+[Plugin]
+Module=libgames-sharp-x68000-plugin
+Name=Sharp X68000 Plugin
+Description=Provides support for Sharp X68000 games.
+Authors=Alexander Mikhaylenko <exalm7659 gmail com>
+Copyright=Copyright © 2018 Alexander Mikhaylenko
diff --git a/plugins/sharp-x68000/meson.build b/plugins/sharp-x68000/meson.build
new file mode 100644
index 00000000..d7e84900
--- /dev/null
+++ b/plugins/sharp-x68000/meson.build
@@ -0,0 +1,2 @@
+subdir ('data')
+subdir ('src')
diff --git a/plugins/sharp-x68000/src/meson.build b/plugins/sharp-x68000/src/meson.build
new file mode 100644
index 00000000..a1a9352f
--- /dev/null
+++ b/plugins/sharp-x68000/src/meson.build
@@ -0,0 +1,16 @@
+vala_sources = [
+  'sharp-x68000-plugin.vala',
+]
+
+c_args = [
+  '-DG_LOG_DOMAIN="GamesSharpX68000"'
+]
+
+shared_module (
+  'games-' + plugin_name + '-plugin',
+  vala_sources,
+  dependencies: gnome_games_dep,
+  c_args: c_args,
+  install: true,
+  install_dir: plugins_dir
+)
diff --git a/plugins/sharp-x68000/src/sharp-x68000-game-factory.vala 
b/plugins/sharp-x68000/src/sharp-x68000-game-factory.vala
new file mode 100644
index 00000000..6b4751be
--- /dev/null
+++ b/plugins/sharp-x68000/src/sharp-x68000-game-factory.vala
@@ -0,0 +1,169 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+public class Games.SharpX68000GameFactory : Object, UriGameFactory {
+       private const string FINGERPRINT_PREFIX = "sharp-x68000";
+       private const string MIME_TYPE = "application/x-x68k-rom";
+       private const string PLATFORM = "SharpX68000";
+       private const string ICON_NAME = "media-floppy-symbolic";
+
+       private HashTable<string, PartialGameData?> uris_for_game;
+       private HashTable<Uri, Game> game_for_uri;
+       private GenericSet<Game> games;
+
+       private struct PartialGameData {
+               Uri?[] uris;
+               string?[] titles;
+       }
+
+       public SharpX68000GameFactory () {
+               uris_for_game = new HashTable<string, PartialGameData?> (str_hash, str_equal);
+               game_for_uri = new HashTable<Uri, Game> (Uri.hash, Uri.equal);
+               games = new GenericSet<Game> (direct_hash, direct_equal);
+       }
+
+       public string[] get_mime_types () {
+               return { MIME_TYPE };
+       }
+
+       public async Game? query_game_for_uri (Uri uri) {
+               Idle.add (this.query_game_for_uri.callback);
+               yield;
+
+               if (game_for_uri.contains (uri))
+                       return game_for_uri[uri];
+
+               return null;
+       }
+
+       public async void add_uri (Uri uri) {
+               try {
+                       add_uri_with_error (uri);
+               }
+               catch (Error e) {
+                       debug (e.message);
+               }
+       }
+
+       private void add_uri_with_error (Uri uri) throws Error {
+               if (game_for_uri.contains (uri))
+                       return;
+
+               var file = uri.to_file ();
+               var file_info = file.query_info (FileAttribute.STANDARD_CONTENT_TYPE, 
FileQueryInfoFlags.NONE);
+               var mime_type = file_info.get_content_type ();
+
+               if (mime_type != MIME_TYPE)
+                       return;
+
+               var path = file.get_path ();
+               print ("%s\n", path);
+
+               var regex = /\((Dis[ck] (\d+)) of (\d+)\)/;
+               MatchInfo match_info;
+               if (regex.match (path, 0, out match_info)) {
+                       // The game has multiple disks
+                       var title = match_info.fetch (1);
+                       var index = int.parse (match_info.fetch (2));
+                       var total = int.parse (match_info.fetch (3));
+                       print ("%d %d\n", index, total);
+
+                       if (index > 0 && total > 0) {
+                               var game_id = regex.replace (path, path.length, 0, "");
+                               print ("%s\n", game_id);
+                               if (!uris_for_game.contains (game_id))
+                                       uris_for_game.insert(game_id, { new Uri?[total], new string?[total] 
});
+                               uris_for_game.lookup(game_id).uris[index - 1] = uri;
+                               uris_for_game.lookup(game_id).titles[index - 1] = title;
+
+                               var data = uris_for_game.lookup(game_id);
+                               bool complete = true;
+                               foreach (var u in data.uris)
+                                       if (u == null)
+                                               complete = false;
+
+                               if (complete) {
+                                       var media_set = new MediaSet ();
+                                       for (var i = 0; i < total; i++) {
+                                               var media = new Media (new GenericTitle (data.titles[i]));
+                                               media.add_uri (data.uris[i]);
+                                               media_set.add_media (media);
+                                       }
+                                       media_set.icon = GLib.Icon.new_for_string (ICON_NAME);
+
+                                       var game = create_game (uri, media_set);
+
+                                       foreach (var u in data.uris)
+                                               game_for_uri[u] = game;
+
+                                       games.add (game);
+                                       game_added (game);
+                               }
+
+                               return;
+                       }
+               }
+
+               print ("The game is single-disk\n");
+
+               var game = create_game (uri);
+
+               game_for_uri[uri] = game;
+               games.add (game);
+
+               game_added (game);
+/*
+//             File bin_file;
+//             var disc_id = uri.to_string
+
+               // Check whether we already have a media and by extension a media set
+               // and a game for this disc ID. If such a case, simply add the new URI.
+               if (media_for_disc_id.contains (disc_id)) {
+                       var media = media_for_disc_id.lookup (disc_id);
+                       media.add_uri (uri);
+                       game_for_uri[uri] = game_for_disc_set_id[disc_set_id];
+
+                       return;
+               }
+/*
+               var media_set = new MediaSet ();
+               foreach (var game_media in new_medias_array)
+                       media_set.add_media (game_media);
+               media_set.icon = GLib.Icon.new_for_string (ICON_NAME);
+               var game = create_game (media_set, disc_set_id, uri);
+
+               // Creating the Medias, MediaSet and Game worked, we can save them.
+
+               foreach (var new_disc_id in new_medias.get_keys ())
+                       media_for_disc_id[new_disc_id] = new_medias[new_disc_id];
+*/
+
+//             var game = create_game (uri);
+
+//             game_for_uri[uri] = game;
+//             games.add (game);
+
+//             game_added (game);
+       }
+
+       public async void foreach_game (GameCallback game_callback) {
+               games.foreach ((game) => game_callback (game));
+       }
+
+       private Game create_game (Uri uri, MediaSet? media_set = null) throws Error {
+               var uid = new FingerprintUid (uri, FINGERPRINT_PREFIX);
+               var title = new FilenameTitle (uri);
+               var icon = new DummyIcon ();
+               var media = new GriloMedia (title, MIME_TYPE);
+               var cover = new CompositeCover ({
+                       new LocalCover (uri),
+                       new GriloCover (media, uid)});
+               var core_source = new RetroCoreSource (PLATFORM, { MIME_TYPE });
+               RetroRunner runner;
+               if (media_set != null)
+                       runner = new RetroRunner.for_media_set (core_source, media_set, uid, title);
+               else
+                       runner = new RetroRunner (core_source, uri, uid, title);
+
+               return new GenericGame (title, icon, cover, runner);
+       }
+}
diff --git a/plugins/sharp-x68000/src/sharp-x68000-plugin.vala 
b/plugins/sharp-x68000/src/sharp-x68000-plugin.vala
new file mode 100644
index 00000000..681f751c
--- /dev/null
+++ b/plugins/sharp-x68000/src/sharp-x68000-plugin.vala
@@ -0,0 +1,20 @@
+// This file is part of GNOME Games. License: GPL-3.0+.
+
+private class Games.SharpX68000Plugin : Object, Plugin {
+       private const string MIME_TYPE = "application/x-x68k-rom";
+
+       public string[] get_mime_types () {
+               return { MIME_TYPE };
+       }
+
+       public UriGameFactory[] get_uri_game_factories () {
+               var factory = new SharpX68000GameFactory ();
+
+               return { factory };
+       }
+}
+
+[ModuleInit]
+public Type register_games_plugin (TypeModule module) {
+       return typeof(Games.SharpX68000Plugin);
+}
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ce98eebf..c10a92ba 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -41,6 +41,7 @@ plugins/sega-cd/src/sega-cd-header.vala
 plugins/sega-cd/src/sega-cd-plugin.vala
 plugins/sega-saturn/src/sega-saturn-header.vala
 plugins/sega-saturn/src/sega-saturn-plugin.vala
+plugins/sharp-x68000/src/sharp-x68000-plugin.vala
 plugins/steam/src/steam-plugin.vala
 plugins/steam/src/steam-registry.vala
 plugins/steam/src/steam-title.vala
diff --git a/src/retro/retro-core-source.vala b/src/retro/retro-core-source.vala
index e31be989..4cbaf5f8 100644
--- a/src/retro/retro-core-source.vala
+++ b/src/retro/retro-core-source.vala
@@ -77,9 +77,8 @@ public class Games.RetroCoreSource : Object {
 
                var platforms_dir = Application.get_platforms_dir ();
                var platform_id = platform.get_id ();
-               var firmware_dir = File.new_for_path (@"$platforms_dir/$platform_id/system");
                var firmware_path = core_descriptor.get_firmware_path (firmware);
-               var firmware_file = firmware_dir.get_child (firmware_path);
+               var firmware_file = File.new_for_path(@"$platforms_dir/$platform/system/" + firmware_path);
                if (!firmware_file.query_exists ())
                        throw new RetroError.FIRMWARE_NOT_FOUND (_("This game requires the %s firmware file 
to run."), firmware_file.get_path ());
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]