1from functools import lru_cache 2 3from fsgs.drivers.gamedriver import GameDriver 4 5 6class PlatformHandler: 7 def __init__(self, loader_class=None, runner_class=None): 8 self.loader_class = loader_class 9 self.runner_class = runner_class 10 11 @classmethod 12 def create(cls, platform_id): 13 class_ = cls.get_platform_class(platform_id) 14 return class_() 15 16 @classmethod 17 def get_platform_class(cls, platform_id): 18 platform_id = platform_id.lower() 19 try: 20 return platforms[platform_id] 21 except KeyError: 22 return UnsupportedPlatform 23 24 @classmethod 25 @lru_cache() 26 def get_platform_name(cls, platform_id): 27 return cls.get_platform_class(platform_id).PLATFORM_NAME 28 29 @classmethod 30 @lru_cache() 31 def get_platform_ids(cls): 32 return sorted(platforms.keys()) 33 34 def get_loader(self, fsgs): 35 if self.loader_class is None: 36 raise Exception("loader class is None for " + repr(self)) 37 return self.loader_class(fsgs) 38 39 def get_runner(self, fsgs) -> GameDriver: 40 if self.runner_class is None: 41 raise Exception("runner class is None for " + repr(self)) 42 return self.runner_class(fsgs) 43 44 def driver(self, fsgc): 45 return self.get_runner(fsgc) 46 47 def loader(self, fsgc): 48 return self.get_loader(fsgc) 49 50 51class Platform(PlatformHandler): 52 AMIGA = "amiga" 53 ARCADE = "arcade" 54 A2600 = "a2600" 55 A5200 = "a5200" 56 A7800 = "a7800" 57 ATARI = "atari" 58 C64 = "c64" 59 CD32 = "cd32" 60 CDTV = "cdtv" 61 CPC = "cpc" 62 DOS = "dos" 63 GB = "gb" 64 GBA = "gba" 65 GBC = "gbc" 66 LYNX = "lynx" 67 MSX = "msx" 68 N64 = "n64" 69 NDS = "nds" 70 NEOGEO = "neogeo" 71 NES = "nes" 72 NGC = "ngc" 73 PSX = "psx" 74 SNES = "snes" 75 SGG = "sgg" 76 SMD = "smd" 77 SMS = "sms" 78 TG16 = "tg16" 79 TGCD = "tgcd" 80 ZXS = "zxs" 81 82 def get_loader(self, fsgc): 83 return self.loader(fsgc) 84 85 def get_runner(self, fsgc): 86 return self.driver(fsgc) 87 88 def driver(self, fsgc): 89 raise NotImplementedError() 90 91 def loader(self, fsgc): 92 raise NotImplementedError() 93 94 95from fsgs.platforms.amiga import AmigaPlatformHandler 96from fsgs.platforms.amstrad_cpc import AmstradCPCPlatformHandler 97from fsgs.platforms.arcade.arcadeplatform import ArcadePlatformHandler 98from fsgs.platforms.atari_2600 import Atari2600PlatformHandler 99from fsgs.platforms.atari5200 import Atari5200PlatformHandler 100from fsgs.platforms.atari7800 import Atari7800PlatformHandler 101from fsgs.platforms.atari.atariplatform import AtariSTPlatformHandler 102from fsgs.platforms.cd32 import CD32PlatformHandler 103from fsgs.platforms.cdtv import CDTVPlatformHandler 104from fsgs.platforms.commodore64 import Commodore64Platform 105from fsgs.platforms.dos.dosplatform import DOSPlatformHandler 106from fsgs.platforms.gameboy import GameBoyPlatform 107from fsgs.platforms.gameboyadvance import GameBoyAdvancePlatform 108from fsgs.platforms.gameboycolor import GameBoyColorPlatform 109from fsgs.platforms.gamegear import GameGearPlatform 110from fsgs.platforms.lynx import LynxPlatformHandler 111from fsgs.platforms.mastersystem import MasterSystemPlatform 112from fsgs.platforms.megadrive import MegaDrivePlatform 113from fsgs.platforms.msx import MsxPlatformHandler 114from fsgs.platforms.nintendo64 import Nintendo64Platform 115from fsgs.platforms.nintendods import NintendoDSPlatform 116from fsgs.platforms.neogeo import NeoGeoPlatform 117from fsgs.platforms.gamecube import GameCubePlatform 118from fsgs.platforms.nintendo import NintendoPlatform 119from fsgs.platforms.playstation import PlayStationPlatform 120from fsgs.platforms.supernintendo import SuperNintendoPlatformHandler 121from fsgs.platforms.turbografx16 import TurboGrafx16Platform 122from fsgs.platforms.turbografxcd import TurboGrafxCDPlatform 123from fsgs.platforms.zxs import SpectrumPlatformHandler 124 125 126class UnsupportedPlatform(PlatformHandler): 127 PLATFORM_NAME = "Unsupported" 128 129 130platforms = { 131 Platform.AMIGA: AmigaPlatformHandler, 132 Platform.ARCADE: ArcadePlatformHandler, 133 Platform.A2600: Atari2600PlatformHandler, 134 Platform.A5200: Atari5200PlatformHandler, 135 Platform.A7800: Atari7800PlatformHandler, 136 Platform.ATARI: AtariSTPlatformHandler, 137 Platform.C64: Commodore64Platform, 138 Platform.CD32: CD32PlatformHandler, 139 Platform.CDTV: CDTVPlatformHandler, 140 Platform.CPC: AmstradCPCPlatformHandler, 141 Platform.DOS: DOSPlatformHandler, 142 Platform.GB: GameBoyPlatform, 143 Platform.GBA: GameBoyAdvancePlatform, 144 Platform.GBC: GameBoyColorPlatform, 145 Platform.LYNX: LynxPlatformHandler, 146 Platform.MSX: MsxPlatformHandler, 147 Platform.N64: Nintendo64Platform, 148 Platform.NDS: NintendoDSPlatform, 149 Platform.NEOGEO: NeoGeoPlatform, 150 Platform.NES: NintendoPlatform, 151 Platform.NGC: GameCubePlatform, 152 Platform.SNES: SuperNintendoPlatformHandler, 153 Platform.PSX: PlayStationPlatform, 154 Platform.SGG: GameGearPlatform, 155 Platform.SMD: MegaDrivePlatform, 156 Platform.SMS: MasterSystemPlatform, 157 Platform.TG16: TurboGrafx16Platform, 158 Platform.TGCD: TurboGrafxCDPlatform, 159 Platform.ZXS: SpectrumPlatformHandler, 160} 161PLATFORM_IDS = platforms.keys() 162 163 164def normalize_platform_id(platform_id): 165 platform_id = platform_id.lower().replace("-", "").replace("_", "") 166 # noinspection SpellCheckingInspection 167 if platform_id in ["st", "atarist"]: 168 return Platform.ATARI 169 elif platform_id in ["commodorecdtv"]: 170 return Platform.CDTV 171 elif platform_id in ["amigacd32"]: 172 return Platform.CD32 173 elif platform_id in ["amstradcpc"]: 174 return Platform.CPC 175 elif platform_id in ["msdos"]: 176 return Platform.DOS 177 elif platform_id in ["gameboy"]: 178 return Platform.GB 179 elif platform_id in ["gameboyadvance"]: 180 return Platform.GBA 181 elif platform_id in ["gameboycolor"]: 182 return Platform.GBC 183 elif platform_id in ["nintendo", "famicom"]: 184 return Platform.NES 185 elif platform_id in ["nintendo64"]: 186 return Platform.N64 187 elif platform_id in ["nintendods"]: 188 return Platform.NDS 189 elif platform_id in ["nintendogamecube", "gamecube", "gc"]: 190 return Platform.NGC 191 elif platform_id in ["supernintendo", "supernes", "superfamicom"]: 192 return Platform.SNES 193 elif platform_id in ["zxspectrum"]: 194 return Platform.ZXS 195 elif platform_id in ["mastersystem", "segamastersystem"]: 196 return Platform.SMS 197 elif platform_id in ["megadrive", "segamegadrive", "genesis"]: 198 return Platform.SMD 199 elif platform_id in ["atari2600"]: 200 return Platform.A2600 201 elif platform_id in ["atari5200"]: 202 return Platform.A5200 203 elif platform_id in ["atari78600"]: 204 return Platform.A7800 205 elif platform_id in ["turbografx16"]: 206 return Platform.TG16 207 elif platform_id in ["gamegear", "sgg"]: 208 return Platform.SGG 209 return platform_id 210