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