1
0
mirror of synced 2024-12-15 15:51:15 +01:00
bemaniutils/bemani/backend/iidx/factory.py
2019-12-08 21:43:49 +00:00

134 lines
4.6 KiB
Python

from typing import Dict, Optional, Any
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.common import Model, VersionConstants
from bemani.data import Data
class IIDXFactory(Factory):
MANAGED_CLASSES = [
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,
]
@classmethod
def register_all(cls) -> None:
for game in ['JDJ', 'JDZ', 'KDZ', 'LDJ']:
Base.register(game, IIDXFactory)
@classmethod
def create(cls, data: Data, config: Dict[str, Any], 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:
return VersionConstants.IIDX_CANNON_BALLERS
return None
if model.game == 'JDJ':
return IIDXSirius(data, config, model)
if model.game == 'JDZ':
return IIDXResortAnthem(data, config, model)
if model.game == 'KDZ':
return IIDXLincle(data, config, model)
if model.game == '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.game 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)
# 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)
# Unknown game version
return None