1
0
mirror of synced 2024-12-25 04:04:51 +01:00
bemaniutils/bemani/backend/ddr/factory.py

114 lines
3.6 KiB
Python

from typing import List, Optional, Type
from bemani.backend.base import Base, Factory
from bemani.backend.ddr.stubs import (
DDRX,
DDRSuperNova2,
DDRSuperNova,
DDRExtreme,
DDR7thMix,
DDR6thMix,
DDR5thMix,
DDR4thMix,
DDR3rdMix,
DDR2ndMix,
DDR1stMix,
)
from bemani.backend.ddr.ddrx2 import DDRX2
from bemani.backend.ddr.ddrx3 import DDRX3
from bemani.backend.ddr.ddr2013 import DDR2013
from bemani.backend.ddr.ddr2014 import DDR2014
from bemani.backend.ddr.ddrace import DDRAce
from bemani.backend.ddr.ddra20 import DDRA20
from bemani.common import Model, VersionConstants
from bemani.data import Config, Data
class DDRFactory(Factory):
MANAGED_CLASSES: List[Type[Base]] = [
DDR1stMix,
DDR2ndMix,
DDR4thMix,
DDR3rdMix,
DDR5thMix,
DDR6thMix,
DDR7thMix,
DDRExtreme,
DDRSuperNova,
DDRSuperNova2,
DDRX,
DDRX2,
DDRX3,
DDR2013,
DDR2014,
DDRAce,
DDRA20,
]
@classmethod
def register_all(cls) -> None:
for gamecode in ["HDX", "JDX", "KDX", "MDX"]:
Base.register(gamecode, DDRFactory)
@classmethod
def create(
cls,
data: Data,
config: Config,
model: Model,
parentmodel: Optional[Model] = None,
) -> Optional[Base]:
def version_from_date(date: int) -> Optional[int]:
if date < 2014051200:
return VersionConstants.DDR_2013
elif date >= 2014051200 and date < 2016033000:
return VersionConstants.DDR_2014
elif date >= 2016033000 and date < 2019042300:
return VersionConstants.DDR_ACE
elif date >= 2019042300:
return VersionConstants.DDR_A20
return None
if model.gamecode == "HDX":
return DDRX(data, config, model)
if model.gamecode == "JDX":
return DDRX2(data, config, model)
if model.gamecode == "KDX":
return DDRX3(data, config, model)
if model.gamecode == "MDX":
if model.version is None:
if parentmodel is None:
return None
# We have no way to tell apart newer versions. However, we can make
# an educated guess if we happen to be summoned for old profile lookup.
if parentmodel.gamecode not in ["HDX", "JDX", "KDX", "MDX"]:
return None
parentversion = version_from_date(parentmodel.version)
if parentversion == VersionConstants.DDR_A20:
return DDRAce(data, config, model)
if parentversion == VersionConstants.DDR_ACE:
return DDR2014(data, config, model)
if parentversion == VersionConstants.DDR_2014:
return DDR2013(data, config, model)
if parentversion == VersionConstants.DDR_2013:
return DDRX3(data, config, model)
# Unknown older version
return None
version = version_from_date(model.version)
if version == VersionConstants.DDR_2013:
return DDR2013(data, config, model)
if version == VersionConstants.DDR_2014:
return DDR2014(data, config, model)
if version == VersionConstants.DDR_ACE:
return DDRAce(data, config, model)
if version == VersionConstants.DDR_A20:
return DDRA20(data, config, model)
# Unknown game version
return None