1
0
mirror of synced 2024-11-24 14:30:11 +01:00
bemaniutils/bemani/backend/iidx/factory.py

163 lines
6.0 KiB
Python

from typing import List, Optional, Type
from bemani.backend.base import Base, Factory
from bemani.backend.iidx.stubs import (
IIDX1stStyle,
IIDX2ndStyle,
IIDX3rdStyle,
IIDX4thStyle,
IIDX5thStyle,
IIDX6thStyle,
IIDX7thStyle,
IIDX8thStyle,
IIDX9thStyle,
IIDX10thStyle,
IIDXRed,
IIDXHappySky,
IIDXDistorted,
IIDXGold,
IIDXDJTroopers,
IIDXEmpress,
IIDXSirius,
IIDXResortAnthem,
IIDXLincle,
)
from bemani.backend.iidx.tricoro import IIDXTricoro
from bemani.backend.iidx.spada import IIDXSpada
from bemani.backend.iidx.pendual import IIDXPendual
from bemani.backend.iidx.copula import IIDXCopula
from bemani.backend.iidx.sinobuz import IIDXSinobuz
from bemani.backend.iidx.cannonballers import IIDXCannonBallers
from bemani.backend.iidx.rootage import IIDXRootage
from bemani.backend.iidx.heroicverse import IIDXHeroicVerse
from bemani.backend.iidx.bistrover import IIDXBistrover
from bemani.common import Model, VersionConstants
from bemani.data import Config, Data
class IIDXFactory(Factory):
MANAGED_CLASSES: List[Type[Base]] = [
IIDX1stStyle,
IIDX2ndStyle,
IIDX3rdStyle,
IIDX4thStyle,
IIDX5thStyle,
IIDX6thStyle,
IIDX7thStyle,
IIDX8thStyle,
IIDX9thStyle,
IIDX10thStyle,
IIDXRed,
IIDXHappySky,
IIDXDistorted,
IIDXGold,
IIDXDJTroopers,
IIDXEmpress,
IIDXSirius,
IIDXResortAnthem,
IIDXLincle,
IIDXTricoro,
IIDXSpada,
IIDXPendual,
IIDXCopula,
IIDXSinobuz,
IIDXCannonBallers,
IIDXRootage,
IIDXHeroicVerse,
IIDXBistrover,
]
@classmethod
def register_all(cls) -> None:
for gamecode in ["JDJ", "JDZ", "KDZ", "LDJ"]:
Base.register(gamecode, IIDXFactory)
@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 < 2013100200:
return VersionConstants.IIDX_TRICORO
if date >= 2013100200 and date < 2014091700:
return VersionConstants.IIDX_SPADA
if date >= 2014091700 and date < 2015111100:
return VersionConstants.IIDX_PENDUAL
if date >= 2015111100 and date < 2016102600:
return VersionConstants.IIDX_COPULA
if date >= 2016102600 and date < 2017122100:
return VersionConstants.IIDX_SINOBUZ
if date >= 2017122100 and date < 2018110700:
return VersionConstants.IIDX_CANNON_BALLERS
if date >= 2018110700 and date < 2019101600:
return VersionConstants.IIDX_ROOTAGE
if date >= 2019101600 and date < 2020102800:
return VersionConstants.IIDX_HEROIC_VERSE
if date >= 2020102800:
return VersionConstants.IIDX_BISTROVER
return None
if model.gamecode == "JDJ":
return IIDXSirius(data, config, model)
if model.gamecode == "JDZ":
return IIDXResortAnthem(data, config, model)
if model.gamecode == "KDZ":
return IIDXLincle(data, config, model)
if model.gamecode == "LDJ":
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 ["JDJ", "JDZ", "KDZ", "LDJ"]:
return None
parentversion = version_from_date(parentmodel.version)
if parentversion == VersionConstants.IIDX_SPADA:
return IIDXTricoro(data, config, model)
if parentversion == VersionConstants.IIDX_PENDUAL:
return IIDXSpada(data, config, model)
if parentversion == VersionConstants.IIDX_COPULA:
return IIDXPendual(data, config, model)
if parentversion == VersionConstants.IIDX_SINOBUZ:
return IIDXCopula(data, config, model)
if parentversion == VersionConstants.IIDX_CANNON_BALLERS:
return IIDXSinobuz(data, config, model)
if parentversion == VersionConstants.IIDX_ROOTAGE:
return IIDXCannonBallers(data, config, model)
if parentversion == VersionConstants.IIDX_HEROIC_VERSE:
return IIDXRootage(data, config, model)
if parentversion == VersionConstants.IIDX_BISTROVER:
return IIDXHeroicVerse(data, config, model)
# Unknown older version
return None
version = version_from_date(model.version)
if version == VersionConstants.IIDX_TRICORO:
return IIDXTricoro(data, config, model)
if version == VersionConstants.IIDX_SPADA:
return IIDXSpada(data, config, model)
if version == VersionConstants.IIDX_PENDUAL:
return IIDXPendual(data, config, model)
if version == VersionConstants.IIDX_COPULA:
return IIDXCopula(data, config, model)
if version == VersionConstants.IIDX_SINOBUZ:
return IIDXSinobuz(data, config, model)
if version == VersionConstants.IIDX_CANNON_BALLERS:
return IIDXCannonBallers(data, config, model)
if version == VersionConstants.IIDX_ROOTAGE:
return IIDXRootage(data, config, model)
if version == VersionConstants.IIDX_HEROIC_VERSE:
return IIDXHeroicVerse(data, config, model)
if version == VersionConstants.IIDX_BISTROVER:
return IIDXBistrover(data, config, model)
# Unknown game version
return None