forked from Hay1tsme/artemis
add back games, conform them to new title dispatch
This commit is contained in:
parent
f18e939dd0
commit
7e3396a7ff
@ -1,4 +1,4 @@
|
||||
from twisted.web import resource
|
||||
from typing import Dict, Any
|
||||
import logging, coloredlogs
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
from twisted.web.http import Request
|
||||
@ -13,6 +13,7 @@ class TitleServlet():
|
||||
self.config = core_cfg
|
||||
self.config_folder = cfg_folder
|
||||
self.data = Data(core_cfg)
|
||||
self.title_registry: Dict[str, Any] = {}
|
||||
|
||||
self.logger = logging.getLogger("title")
|
||||
if not hasattr(self.logger, "initialized"):
|
||||
@ -34,9 +35,32 @@ class TitleServlet():
|
||||
|
||||
if "game_registry" not in globals():
|
||||
globals()["game_registry"] = Utils.get_all_titles()
|
||||
|
||||
for folder, mod in globals()["game_registry"].items():
|
||||
if hasattr(mod, "game_codes") and hasattr(mod, "index"):
|
||||
handler_cls = mod.index(self.config, self.config_folder)
|
||||
if hasattr(handler_cls, "setup"):
|
||||
handler_cls.setup()
|
||||
|
||||
for code in mod.game_codes:
|
||||
self.title_registry[code] = handler_cls
|
||||
|
||||
else:
|
||||
self.logger.error(f"{folder} missing game_code or index in __init__.py")
|
||||
|
||||
self.logger.info(f"Serving {len(globals()['game_registry'])} game codes")
|
||||
|
||||
def render_GET(self, request: Request, endpoints: dict) -> bytes:
|
||||
print(endpoints)
|
||||
|
||||
def handle_GET(self, request: Request):
|
||||
pass
|
||||
|
||||
def handle_POST(self, request: Request):
|
||||
pass
|
||||
def render_POST(self, request: Request, endpoints: dict) -> bytes:
|
||||
print(endpoints)
|
||||
code = endpoints["game"]
|
||||
if code not in self.title_registry:
|
||||
self.logger.warn(f"Unknown game code {code}")
|
||||
|
||||
index = self.title_registry[code]
|
||||
if not hasattr(index, "render_POST"):
|
||||
self.logger.warn(f"{code} does not dispatch on POST")
|
||||
|
||||
return index.render_POST(request, endpoints["version"], endpoints["endpoint"])
|
||||
|
@ -18,4 +18,5 @@ class Utils:
|
||||
|
||||
except ImportError as e:
|
||||
print(f"{dir} - {e}")
|
||||
raise
|
||||
return ret
|
||||
|
49
dbutils.py
49
dbutils.py
@ -1,6 +1,47 @@
|
||||
import yaml
|
||||
import argparse
|
||||
from core.config import CoreConfig
|
||||
from core.data import Data
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="ARTEMiS main entry point")
|
||||
parser.add_argument("--config", "-c", type=str, default="config", help="Configuration folder")
|
||||
args = parser.parse_args()
|
||||
if __name__=='__main__':
|
||||
parser = argparse.ArgumentParser(description="Database utilities")
|
||||
parser.add_argument("--config", "-c", type=str, help="Config folder to use", default="config")
|
||||
parser.add_argument("--version", "-v", type=str, help="Version of the database to upgrade/rollback to")
|
||||
parser.add_argument("--game", "-g", type=str, help="Game code of the game who's schema will be updated/rolled back. Ex. SDFE")
|
||||
parser.add_argument("action", type=str, help="DB Action, create, recreate, upgrade, or rollback")
|
||||
args = parser.parse_args()
|
||||
|
||||
cfg = CoreConfig()
|
||||
cfg.update(yaml.safe_load(open(f"{args.config}/core.yaml")))
|
||||
data = Data(cfg)
|
||||
|
||||
if args.action == "create":
|
||||
data.create_database()
|
||||
|
||||
elif args.action == "recreate":
|
||||
data.recreate_database()
|
||||
|
||||
elif args.action == "upgrade" or args.action == "rollback":
|
||||
if args.version is None:
|
||||
print("Must set game and version to migrate to")
|
||||
exit(0)
|
||||
|
||||
if args.game is None:
|
||||
print("No game set, upgrading core schema")
|
||||
data.migrate_database("CORE", int(args.version))
|
||||
|
||||
else:
|
||||
data.migrate_database(args.game, int(args.version), args.action)
|
||||
|
||||
elif args.action == "migrate":
|
||||
print("Migrating from old schema to new schema")
|
||||
data.restore_from_old_schema()
|
||||
|
||||
elif args.action == "dump":
|
||||
print("Dumping old schema to migrate to new schema")
|
||||
data.dump_db()
|
||||
|
||||
elif args.action == "generate":
|
||||
pass
|
||||
|
||||
data.logger.info("Done")
|
||||
|
6
example_config/chuni.yaml
Normal file
6
example_config/chuni.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
||||
|
||||
crypto:
|
||||
encrypted_only: False
|
9
example_config/cxb.yaml
Normal file
9
example_config/cxb.yaml
Normal file
@ -0,0 +1,9 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
||||
hostname: "localhost"
|
||||
ssl_enable: False
|
||||
port: 8082
|
||||
port_secure: 443
|
||||
ssl_cert: "cert/title.crt"
|
||||
ssl_key: "cert/title.key"
|
4
example_config/diva.yaml
Normal file
4
example_config/diva.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
||||
|
3
example_config/mai2.yaml
Normal file
3
example_config/mai2.yaml
Normal file
@ -0,0 +1,3 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
60
example_config/nginx_example.conf
Normal file
60
example_config/nginx_example.conf
Normal file
@ -0,0 +1,60 @@
|
||||
# Allnet
|
||||
server {
|
||||
listen 80;
|
||||
server_name naominet.jp;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8000/;
|
||||
}
|
||||
}
|
||||
|
||||
# Non-SSL titles
|
||||
server {
|
||||
listen 80;
|
||||
server_name your.hostname.here;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8080/;
|
||||
}
|
||||
}
|
||||
|
||||
# SSL titles
|
||||
server {
|
||||
listen 443 ssl default_server;
|
||||
listen [::]:443 ssl default_server;
|
||||
server_name your.hostname.here;
|
||||
|
||||
ssl_certificate /path/to/cert/title.crt;
|
||||
ssl_certificate_key /path/to/cert/title.key;
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:MozSSL:10m;
|
||||
ssl_session_tickets off;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers "ALL:@SECLEVEL=0";
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8080/;
|
||||
}
|
||||
}
|
||||
|
||||
# Billing
|
||||
server {
|
||||
listen 8443 ssl;
|
||||
server_name ib.naominet.jp;
|
||||
|
||||
ssl_certificate /path/to/cert/server.pem;
|
||||
ssl_certificate_key /path/to/cert/server.key;
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:MozSSL:10m;
|
||||
ssl_session_tickets off;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers "ALL:@SECLEVEL=1";
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:8444/;
|
||||
}
|
||||
}
|
3
example_config/ongeki.yaml
Normal file
3
example_config/ongeki.yaml
Normal file
@ -0,0 +1,3 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
32
example_config/wacca.yaml
Normal file
32
example_config/wacca.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
server:
|
||||
enable: True
|
||||
loglevel: "info"
|
||||
|
||||
mods:
|
||||
always_vip: True
|
||||
infinite_tickets: True
|
||||
infinite_wp: True
|
||||
|
||||
gates:
|
||||
enabled_gates:
|
||||
- 1
|
||||
- 2
|
||||
- 3
|
||||
- 4
|
||||
- 5
|
||||
- 6
|
||||
- 7
|
||||
- 8
|
||||
- 9
|
||||
- 10
|
||||
- 11
|
||||
- 12
|
||||
- 13
|
||||
- 14
|
||||
- 15
|
||||
- 16
|
||||
- 17
|
||||
- 18
|
||||
- 19
|
||||
- 21
|
||||
- 22
|
87
index.py
87
index.py
@ -4,10 +4,83 @@ import yaml
|
||||
from os import path, mkdir, access, W_OK
|
||||
from core import *
|
||||
|
||||
from twisted.web import server
|
||||
from twisted.web import server, resource
|
||||
from twisted.internet import reactor, endpoints
|
||||
from txroutes import Dispatcher
|
||||
from twisted.web.http import Request
|
||||
from routes import Mapper
|
||||
|
||||
class HttpDispatcher(resource.Resource):
|
||||
def __init__(self, cfg: CoreConfig, config_dir: str):
|
||||
super().__init__()
|
||||
self.config = cfg
|
||||
self.isLeaf = True
|
||||
self.map_get = Mapper()
|
||||
self.map_post = Mapper()
|
||||
|
||||
self.allnet = AllnetServlet(cfg, config_dir)
|
||||
self.title = TitleServlet(cfg, config_dir)
|
||||
|
||||
self.map_post.connect('allnet_poweron', '/sys/servlet/PowerOn', controller="allnet", action='handle_poweron', conditions=dict(method=['POST']))
|
||||
self.map_post.connect('allnet_downloadorder', '/sys/servlet/DownloadOrder', controller="allnet", action='handle_dlorder', conditions=dict(method=['POST']))
|
||||
self.map_post.connect('allnet_billing', '/request', controller="allnet", action='handle_billing_request', conditions=dict(method=['POST']))
|
||||
|
||||
self.map_get.connect("title_get", "/{game}/{version}/{endpoint:.*?}", controller="title", action="render_GET", requirements=dict(game=R"S..."))
|
||||
self.map_post.connect("title_post", "/{game}/{version}/{endpoint:.*?}", controller="title", action="render_POST", requirements=dict(game=R"S..."))
|
||||
|
||||
def render_POST(self, request: Request) -> bytes:
|
||||
test = self.map_get.match(request.uri.decode())
|
||||
if test is None:
|
||||
return b""
|
||||
|
||||
controller = getattr(self, test["controller"], None)
|
||||
if controller is None:
|
||||
return b""
|
||||
|
||||
handler = getattr(controller, test["action"], None)
|
||||
if handler is None:
|
||||
return b""
|
||||
|
||||
url_vars = test
|
||||
url_vars.pop("controller")
|
||||
url_vars.pop("action")
|
||||
|
||||
if len(url_vars) > 0:
|
||||
ret = handler(request, url_vars)
|
||||
else:
|
||||
ret = handler(request)
|
||||
|
||||
if type(ret) == str:
|
||||
return ret.encode()
|
||||
elif type(ret) == bytes:
|
||||
return ret
|
||||
else:
|
||||
return b""
|
||||
|
||||
def render_POST(self, request: Request) -> bytes:
|
||||
test = self.map_post.match(request.uri.decode())
|
||||
if test is None:
|
||||
return b""
|
||||
|
||||
controller = getattr(self, test["controller"], None)
|
||||
if controller is None:
|
||||
return b""
|
||||
|
||||
handler = getattr(controller, test["action"], None)
|
||||
if handler is None:
|
||||
return b""
|
||||
|
||||
url_vars = test
|
||||
url_vars.pop("controller")
|
||||
url_vars.pop("action")
|
||||
ret = handler(request, url_vars)
|
||||
|
||||
if type(ret) == str:
|
||||
return ret.encode()
|
||||
elif type(ret) == bytes:
|
||||
return ret
|
||||
else:
|
||||
return b""
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="ARTEMiS main entry point")
|
||||
parser.add_argument("--config", "-c", type=str, default="config", help="Configuration folder")
|
||||
@ -42,16 +115,8 @@ if __name__ == "__main__":
|
||||
billing_server_str = f"ssl:{cfg.billing.port}:interface={cfg.server.listen_address}"\
|
||||
f":privateKey={cfg.billing.ssl_key}:certKey={cfg.billing.ssl_cert}"
|
||||
|
||||
allnet_cls = AllnetServlet(cfg, args.config)
|
||||
title_cls = TitleServlet(cfg, args.config)
|
||||
dispatcher = HttpDispatcher(cfg, args.config)
|
||||
|
||||
dispatcher = Dispatcher()
|
||||
dispatcher.connect('allnet_poweron', '/sys/servlet/PowerOn', allnet_cls, action='handle_poweron', conditions=dict(method=['POST']))
|
||||
dispatcher.connect('allnet_downloadorder', '/sys/servlet/DownloadOrder', allnet_cls, action='handle_dlorder', conditions=dict(method=['POST']))
|
||||
dispatcher.connect('allnet_billing', '/request', allnet_cls, action='handle_billing_request', conditions=dict(method=['POST']))
|
||||
dispatcher.connect("title_get", "/{game}/{version}/{endpoint}", title_cls, action="handle_GET", conditions=dict(method=['GET']))
|
||||
dispatcher.connect("title_post", "/{game}/{version}/{endpoint}", title_cls, action="handle_POST", conditions=dict(method=['POST']))
|
||||
|
||||
endpoints.serverFromString(reactor, allnet_server_str).listen(server.Site(dispatcher))
|
||||
endpoints.serverFromString(reactor, adb_server_str).listen(AimedbFactory(cfg))
|
||||
|
||||
|
129
read.py
Normal file
129
read.py
Normal file
@ -0,0 +1,129 @@
|
||||
# vim: set fileencoding=utf-8
|
||||
import argparse
|
||||
import re
|
||||
import os
|
||||
import yaml
|
||||
import importlib
|
||||
import logging, coloredlogs
|
||||
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
from typing import List, Optional
|
||||
|
||||
from core import CoreConfig
|
||||
from core.utils import Utils
|
||||
|
||||
class BaseReader():
|
||||
def __init__(self, config: CoreConfig, version: int, bin_dir: Optional[str], opt_dir: Optional[str], extra: Optional[str]) -> None:
|
||||
self.logger = logging.getLogger("reader")
|
||||
self.config = config
|
||||
self.bin_dir = bin_dir
|
||||
self.opt_dir = opt_dir
|
||||
self.version = version
|
||||
self.extra = extra
|
||||
|
||||
|
||||
def get_data_directories(self, directory: str) -> List[str]:
|
||||
ret: List[str] = []
|
||||
|
||||
for root, dirs, files in os.walk(directory):
|
||||
for dir in dirs:
|
||||
if re.fullmatch("[A-Z0-9]{4,4}", dir) is not None:
|
||||
ret.append(f"{root}/{dir}")
|
||||
|
||||
return ret
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Import Game Information')
|
||||
parser.add_argument(
|
||||
'--series',
|
||||
action='store',
|
||||
type=str,
|
||||
required=True,
|
||||
help='The game series we are importing.',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--version',
|
||||
dest='version',
|
||||
action='store',
|
||||
type=int,
|
||||
required=True,
|
||||
help='The game version we are importing.',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--binfolder',
|
||||
dest='bin',
|
||||
action='store',
|
||||
type=str,
|
||||
help='Folder containing A000 base data',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--optfolder',
|
||||
dest='opt',
|
||||
action='store',
|
||||
type=str,
|
||||
help='Folder containing Option data folders',
|
||||
)
|
||||
parser.add_argument(
|
||||
"--config",
|
||||
type=str,
|
||||
default="config",
|
||||
help="Folder containing the core configuration for importing to DB. Defaults to 'config'.",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--extra",
|
||||
type=str,
|
||||
help="Any extra data that a reader might require.",
|
||||
)
|
||||
|
||||
# Parse args, validate invariants.
|
||||
args = parser.parse_args()
|
||||
|
||||
config = CoreConfig()
|
||||
config.update(yaml.safe_load(open(f"{args.config}/core.yaml")))
|
||||
|
||||
log_fmt_str = "[%(asctime)s] Reader | %(levelname)s | %(message)s"
|
||||
log_fmt = logging.Formatter(log_fmt_str)
|
||||
logger = logging.getLogger("reader")
|
||||
|
||||
fileHandler = TimedRotatingFileHandler("{0}/{1}.log".format(config.server.logs, "reader"), when="d", backupCount=10)
|
||||
fileHandler.setFormatter(log_fmt)
|
||||
|
||||
consoleHandler = logging.StreamHandler()
|
||||
consoleHandler.setFormatter(log_fmt)
|
||||
|
||||
logger.addHandler(fileHandler)
|
||||
logger.addHandler(consoleHandler)
|
||||
|
||||
logger.setLevel(logging.INFO)
|
||||
coloredlogs.install(level=logging.INFO, logger=logger, fmt=log_fmt_str)
|
||||
|
||||
if args.series is None or args.version is None:
|
||||
logger.error("Game or version not specified")
|
||||
parser.print_help()
|
||||
exit(1)
|
||||
|
||||
if args.bin is None and args.opt is None:
|
||||
logger.error("Must specify either bin or opt directory")
|
||||
parser.print_help()
|
||||
exit(1)
|
||||
|
||||
if args.bin is not None and (args.bin.endswith("\\") or args.bin.endswith("/")):
|
||||
bin_arg = args.bin[:-1]
|
||||
else:
|
||||
bin_arg = args.bin
|
||||
|
||||
if args.opt is not None and (args.opt.endswith("\\") or args.opt.endswith("/")):
|
||||
opt_arg = args.opt[:-1]
|
||||
else:
|
||||
opt_arg = args.opt
|
||||
|
||||
logger.info("Starting importer...")
|
||||
|
||||
titles = Utils.get_all_titles()
|
||||
|
||||
for dir, mod in titles.items():
|
||||
if args.series in mod.game_codes:
|
||||
handler = mod.reader(config, args.version, bin_arg, opt_arg, args.extra)
|
||||
handler.read()
|
||||
|
||||
logger.info("Done")
|
@ -12,4 +12,4 @@ inflection
|
||||
coloredlogs
|
||||
pylibmc
|
||||
wacky
|
||||
txroutes
|
||||
Routes
|
||||
|
@ -11,4 +11,4 @@ PyCryptodome
|
||||
inflection
|
||||
coloredlogs
|
||||
wacky
|
||||
txroutes
|
||||
Routes
|
||||
|
18
titles/chuni/__init__.py
Normal file
18
titles/chuni/__init__.py
Normal file
@ -0,0 +1,18 @@
|
||||
from titles.chuni.index import ChuniServlet
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.database import ChuniData
|
||||
from titles.chuni.read import ChuniReader
|
||||
|
||||
index = ChuniServlet
|
||||
database = ChuniData
|
||||
reader = ChuniReader
|
||||
|
||||
use_default_title = True
|
||||
include_protocol = True
|
||||
title_secure = False
|
||||
game_codes = [ChuniConstants.GAME_CODE, ChuniConstants.GAME_CODE_NEW]
|
||||
trailing_slash = True
|
||||
use_default_host = False
|
||||
host = ""
|
||||
|
||||
current_schema_version = 1
|
16
titles/chuni/air.py
Normal file
16
titles/chuni/air.py
Normal file
@ -0,0 +1,16 @@
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniAir(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_AIR
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.10.00"
|
||||
return ret
|
16
titles/chuni/airplus.py
Normal file
16
titles/chuni/airplus.py
Normal file
@ -0,0 +1,16 @@
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniAirPlus(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_AIR_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.15.00"
|
||||
return ret
|
18
titles/chuni/amazon.py
Normal file
18
titles/chuni/amazon.py
Normal file
@ -0,0 +1,18 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniAmazon(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_AMAZON
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.30.00"
|
||||
return ret
|
18
titles/chuni/amazonplus.py
Normal file
18
titles/chuni/amazonplus.py
Normal file
@ -0,0 +1,18 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniAmazonPlus(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_AMAZON_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.35.00"
|
||||
return ret
|
572
titles/chuni/base.py
Normal file
572
titles/chuni/base.py
Normal file
@ -0,0 +1,572 @@
|
||||
import logging
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
from time import strftime
|
||||
|
||||
import pytz
|
||||
from typing import Dict, Any
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.database import ChuniData
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniBase():
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
self.core_cfg = core_cfg
|
||||
self.game_cfg = game_cfg
|
||||
self.data = ChuniData(core_cfg)
|
||||
self.date_time_format = "%Y-%m-%d %H:%M:%S"
|
||||
self.logger = logging.getLogger("chuni")
|
||||
self.game = ChuniConstants.GAME_CODE
|
||||
self.version = ChuniConstants.VER_CHUNITHM
|
||||
|
||||
def handle_game_login_api_request(self, data: Dict) -> Dict:
|
||||
#self.data.base.log_event("chuni", "login", logging.INFO, {"version": self.version, "user": data["userId"]})
|
||||
return { "returnCode": 1 }
|
||||
|
||||
def handle_game_logout_api_request(self, data: Dict) -> Dict:
|
||||
#self.data.base.log_event("chuni", "logout", logging.INFO, {"version": self.version, "user": data["userId"]})
|
||||
return { "returnCode": 1 }
|
||||
|
||||
def handle_get_game_charge_api_request(self, data: Dict) -> Dict:
|
||||
game_charge_list = self.data.static.get_enabled_charges(self.version)
|
||||
|
||||
charges = []
|
||||
for x in range(len(game_charge_list)):
|
||||
charges.append({
|
||||
"orderId": x,
|
||||
"chargeId": game_charge_list[x]["chargeId"],
|
||||
"price": 1,
|
||||
"startDate": "2017-12-05 07:00:00.0",
|
||||
"endDate": "2099-12-31 00:00:00.0",
|
||||
"salePrice": 1,
|
||||
"saleStartDate": "2017-12-05 07:00:00.0",
|
||||
"saleEndDate": "2099-12-31 00:00:00.0"
|
||||
})
|
||||
return {
|
||||
"length": len(charges),
|
||||
"gameChargeList": charges
|
||||
}
|
||||
|
||||
def handle_get_game_event_api_request(self, data: Dict) -> Dict:
|
||||
game_events = self.data.static.get_enabled_events(self.version)
|
||||
|
||||
event_list = []
|
||||
for evt_row in game_events:
|
||||
tmp = {}
|
||||
tmp["id"] = evt_row["eventId"]
|
||||
tmp["type"] = evt_row["type"]
|
||||
tmp["startDate"] = "2017-12-05 07:00:00.0"
|
||||
tmp["endDate"] = "2099-12-31 00:00:00.0"
|
||||
event_list.append(tmp)
|
||||
|
||||
return {
|
||||
"type": data["type"],
|
||||
"length": len(event_list),
|
||||
"gameEventList": event_list
|
||||
}
|
||||
|
||||
def handle_get_game_idlist_api_request(self, data: Dict) -> Dict:
|
||||
return { "type": data["type"], "length": 0, "gameIdlistList": [] }
|
||||
|
||||
def handle_get_game_message_api_request(self, data: Dict) -> Dict:
|
||||
return { "type": data["type"], "length": "0", "gameMessageList": [] }
|
||||
|
||||
def handle_get_game_ranking_api_request(self, data: Dict) -> Dict:
|
||||
return { "type": data["type"], "gameRankingList": [] }
|
||||
|
||||
def handle_get_game_sale_api_request(self, data: Dict) -> Dict:
|
||||
return { "type": data["type"], "length": 0, "gameSaleList": [] }
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
reboot_start = datetime.strftime(datetime.now() - timedelta(hours=4), self.date_time_format)
|
||||
reboot_end = datetime.strftime(datetime.now() - timedelta(hours=3), self.date_time_format)
|
||||
return {
|
||||
"gameSetting": {
|
||||
"dataVersion": "1.00.00",
|
||||
"isMaintenance": "false",
|
||||
"requestInterval": 10,
|
||||
"rebootStartTime": reboot_start,
|
||||
"rebootEndTime": reboot_end,
|
||||
"isBackgroundDistribute": "false",
|
||||
"maxCountCharacter": 300,
|
||||
"maxCountItem": 300,
|
||||
"maxCountMusic": 300,
|
||||
},
|
||||
"isDumpUpload": "false",
|
||||
"isAou": "false",
|
||||
}
|
||||
|
||||
def handle_get_user_activity_api_request(self, data: Dict) -> Dict:
|
||||
user_activity_list = self.data.profile.get_profile_activity(data["userId"], data["kind"])
|
||||
|
||||
activity_list = []
|
||||
|
||||
for activity in user_activity_list:
|
||||
tmp = activity._asdict()
|
||||
tmp.pop("user")
|
||||
tmp["id"] = tmp["activityId"]
|
||||
tmp.pop("activityId")
|
||||
activity_list.append(tmp)
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(activity_list),
|
||||
"kind": data["kind"],
|
||||
"userActivityList": activity_list
|
||||
}
|
||||
|
||||
def handle_get_user_character_api_request(self, data: Dict) -> Dict:
|
||||
characters = self.data.item.get_characters(data["userId"])
|
||||
if characters is None: return {}
|
||||
next_idx = -1
|
||||
|
||||
characterList = []
|
||||
for x in range(int(data["nextIndex"]), len(characters)):
|
||||
tmp = characters[x]._asdict()
|
||||
tmp.pop("user")
|
||||
tmp.pop("id")
|
||||
characterList.append(tmp)
|
||||
|
||||
if len(characterList) >= int(data["maxCount"]):
|
||||
break
|
||||
|
||||
if len(characterList) >= int(data["maxCount"]) and len(characters) > int(data["maxCount"]) + int(data["nextIndex"]):
|
||||
next_idx = int(data["maxCount"]) + int(data["nextIndex"]) + 1
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(characterList),
|
||||
"nextIndex": next_idx,
|
||||
"userCharacterList": characterList
|
||||
}
|
||||
|
||||
def handle_get_user_charge_api_request(self, data: Dict) -> Dict:
|
||||
user_charge_list = self.data.profile.get_profile_charge(data["userId"])
|
||||
|
||||
charge_list = []
|
||||
for charge in user_charge_list:
|
||||
tmp = charge._asdict()
|
||||
tmp.pop("id")
|
||||
tmp.pop("user")
|
||||
charge_list.append(tmp)
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(charge_list),
|
||||
"userChargeList": charge_list
|
||||
}
|
||||
|
||||
def handle_get_user_course_api_request(self, data: Dict) -> Dict:
|
||||
user_course_list = self.data.score.get_courses(data["userId"])
|
||||
if user_course_list is None:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"nextIndex": -1,
|
||||
"userCourseList": []
|
||||
}
|
||||
|
||||
course_list = []
|
||||
next_idx = int(data["nextIndex"])
|
||||
max_ct = int(data["maxCount"])
|
||||
|
||||
for x in range(next_idx, len(user_course_list)):
|
||||
tmp = user_course_list[x]._asdict()
|
||||
tmp.pop("user")
|
||||
tmp.pop("id")
|
||||
course_list.append(tmp)
|
||||
|
||||
if len(user_course_list) >= max_ct:
|
||||
break
|
||||
|
||||
if len(user_course_list) >= max_ct:
|
||||
next_idx = next_idx + max_ct
|
||||
else:
|
||||
next_idx = -1
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(course_list),
|
||||
"nextIndex": next_idx,
|
||||
"userCourseList": course_list
|
||||
}
|
||||
|
||||
def handle_get_user_data_api_request(self, data: Dict) -> Dict:
|
||||
p = self.data.profile.get_profile_data(data["userId"], self.version)
|
||||
if p is None: return {}
|
||||
|
||||
profile = p._asdict()
|
||||
profile.pop("id")
|
||||
profile.pop("user")
|
||||
profile.pop("version")
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"userData": profile
|
||||
}
|
||||
|
||||
def handle_get_user_data_ex_api_request(self, data: Dict) -> Dict:
|
||||
p = self.data.profile.get_profile_data_ex(data["userId"], self.version)
|
||||
if p is None: return {}
|
||||
|
||||
profile = p._asdict()
|
||||
profile.pop("id")
|
||||
profile.pop("user")
|
||||
profile.pop("version")
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"userDataEx": profile
|
||||
}
|
||||
|
||||
def handle_get_user_duel_api_request(self, data: Dict) -> Dict:
|
||||
user_duel_list = self.data.item.get_duels(data["userId"])
|
||||
if user_duel_list is None: return {}
|
||||
|
||||
duel_list = []
|
||||
for duel in user_duel_list:
|
||||
tmp = duel._asdict()
|
||||
tmp.pop("id")
|
||||
tmp.pop("user")
|
||||
duel_list.append(tmp)
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(duel_list),
|
||||
"userDuelList": duel_list
|
||||
}
|
||||
|
||||
def handle_get_user_favorite_item_api_request(self, data: Dict) -> Dict:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"kind": data["kind"],
|
||||
"nextIndex": -1,
|
||||
"userFavoriteItemList": []
|
||||
}
|
||||
|
||||
def handle_get_user_favorite_music_api_request(self, data: Dict) -> Dict:
|
||||
"""
|
||||
This is handled via the webui, which we don't have right now
|
||||
"""
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"userFavoriteMusicList": []
|
||||
}
|
||||
|
||||
def handle_get_user_item_api_request(self, data: Dict) -> Dict:
|
||||
kind = int(int(data["nextIndex"]) / 10000000000)
|
||||
next_idx = int(int(data["nextIndex"]) % 10000000000)
|
||||
user_item_list = self.data.item.get_items(data["userId"], kind)
|
||||
|
||||
if user_item_list is None or len(user_item_list) == 0:
|
||||
return {"userId": data["userId"], "nextIndex": -1, "itemKind": kind, "userItemList": []}
|
||||
|
||||
items: list[Dict[str, Any]] = []
|
||||
for i in range(next_idx, len(user_item_list)):
|
||||
tmp = user_item_list[i]._asdict()
|
||||
tmp.pop("user")
|
||||
tmp.pop("id")
|
||||
items.append(tmp)
|
||||
if len(items) >= int(data["maxCount"]):
|
||||
break
|
||||
|
||||
xout = kind * 10000000000 + next_idx + len(items)
|
||||
|
||||
if len(items) < int(data["maxCount"]): nextIndex = 0
|
||||
else: nextIndex = xout
|
||||
|
||||
return {"userId": data["userId"], "nextIndex": nextIndex, "itemKind": kind, "length": len(items), "userItemList": items}
|
||||
|
||||
def handle_get_user_login_bonus_api_request(self, data: Dict) -> Dict:
|
||||
"""
|
||||
Unsure how to get this to trigger...
|
||||
"""
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 2,
|
||||
"userLoginBonusList": [
|
||||
{
|
||||
"presetId": '10',
|
||||
"bonusCount": '0',
|
||||
"lastUpdateDate": "1970-01-01 09:00:00",
|
||||
"isWatched": "true"
|
||||
},
|
||||
{
|
||||
"presetId": '20',
|
||||
"bonusCount": '0',
|
||||
"lastUpdateDate": "1970-01-01 09:00:00",
|
||||
"isWatched": "true"
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
def handle_get_user_map_api_request(self, data: Dict) -> Dict:
|
||||
user_map_list = self.data.item.get_maps(data["userId"])
|
||||
if user_map_list is None: return {}
|
||||
|
||||
map_list = []
|
||||
for map in user_map_list:
|
||||
tmp = map._asdict()
|
||||
tmp.pop("id")
|
||||
tmp.pop("user")
|
||||
map_list.append(tmp)
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(map_list),
|
||||
"userMapList": map_list
|
||||
}
|
||||
|
||||
def handle_get_user_music_api_request(self, data: Dict) -> Dict:
|
||||
music_detail = self.data.score.get_scores(data["userId"])
|
||||
if music_detail is None:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"nextIndex": -1,
|
||||
"userMusicList": [] #240
|
||||
}
|
||||
song_list = []
|
||||
next_idx = int(data["nextIndex"])
|
||||
max_ct = int(data["maxCount"])
|
||||
|
||||
for x in range(next_idx, len(music_detail)):
|
||||
found = False
|
||||
tmp = music_detail[x]._asdict()
|
||||
tmp.pop("user")
|
||||
tmp.pop("id")
|
||||
|
||||
for song in song_list:
|
||||
if song["userMusicDetailList"][0]["musicId"] == tmp["musicId"]:
|
||||
found = True
|
||||
song["userMusicDetailList"].append(tmp)
|
||||
song["length"] = len(song["userMusicDetailList"])
|
||||
|
||||
if not found:
|
||||
song_list.append({
|
||||
"length": 1,
|
||||
"userMusicDetailList": [tmp]
|
||||
})
|
||||
|
||||
if len(song_list) >= max_ct:
|
||||
break
|
||||
|
||||
if len(song_list) >= max_ct:
|
||||
next_idx += max_ct
|
||||
else:
|
||||
next_idx = 0
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(song_list),
|
||||
"nextIndex": next_idx,
|
||||
"userMusicList": song_list #240
|
||||
}
|
||||
|
||||
def handle_get_user_option_api_request(self, data: Dict) -> Dict:
|
||||
p = self.data.profile.get_profile_option(data["userId"])
|
||||
|
||||
option = p._asdict()
|
||||
option.pop("id")
|
||||
option.pop("user")
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"userGameOption": option
|
||||
}
|
||||
|
||||
def handle_get_user_option_ex_api_request(self, data: Dict) -> Dict:
|
||||
p = self.data.profile.get_profile_option_ex(data["userId"])
|
||||
|
||||
option = p._asdict()
|
||||
option.pop("id")
|
||||
option.pop("user")
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"userGameOptionEx": option
|
||||
}
|
||||
|
||||
def read_wtf8(self, src):
|
||||
return bytes([ord(c) for c in src]).decode("utf-8")
|
||||
|
||||
def handle_get_user_preview_api_request(self, data: Dict) -> Dict:
|
||||
profile = self.data.profile.get_profile_preview(data["userId"], self.version)
|
||||
if profile is None: return None
|
||||
profile_character = self.data.item.get_character(data["userId"], profile["characterId"])
|
||||
|
||||
if profile_character is None:
|
||||
chara = {}
|
||||
else:
|
||||
chara = profile_character._asdict()
|
||||
chara.pop("id")
|
||||
chara.pop("user")
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
# Current Login State
|
||||
"isLogin": False,
|
||||
"lastLoginDate": profile["lastPlayDate"],
|
||||
# User Profile
|
||||
"userName": profile["userName"],
|
||||
"reincarnationNum": profile["reincarnationNum"],
|
||||
"level": profile["level"],
|
||||
"exp": profile["exp"],
|
||||
"playerRating": profile["playerRating"],
|
||||
"lastGameId": profile["lastGameId"],
|
||||
"lastRomVersion": profile["lastRomVersion"],
|
||||
"lastDataVersion": profile["lastDataVersion"],
|
||||
"lastPlayDate": profile["lastPlayDate"],
|
||||
"trophyId": profile["trophyId"],
|
||||
"nameplateId": profile["nameplateId"],
|
||||
# Current Selected Character
|
||||
"userCharacter": chara,
|
||||
# User Game Options
|
||||
"playerLevel": profile["playerLevel"],
|
||||
"rating": profile["rating"],
|
||||
"headphone": profile["headphone"],
|
||||
"chargeState": "1",
|
||||
"userNameEx": profile["userName"],
|
||||
}
|
||||
|
||||
def handle_get_user_recent_rating_api_request(self, data: Dict) -> Dict:
|
||||
recet_rating_list = self.data.profile.get_profile_recent_rating(data["userId"])
|
||||
if recet_rating_list is None:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"userRecentRatingList": [],
|
||||
}
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": len(recet_rating_list["recentRating"]),
|
||||
"userRecentRatingList": recet_rating_list["recentRating"],
|
||||
}
|
||||
|
||||
def handle_get_user_region_api_request(self, data: Dict) -> Dict:
|
||||
# TODO: Region
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"userRegionList": [],
|
||||
}
|
||||
|
||||
def handle_get_user_team_api_request(self, data: Dict) -> Dict:
|
||||
# TODO: Team
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"teamId": 0
|
||||
}
|
||||
|
||||
def handle_get_team_course_setting_api_request(self, data: Dict) -> Dict:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"nextIndex": 0,
|
||||
"teamCourseSettingList": [],
|
||||
}
|
||||
|
||||
def handle_get_team_course_rule_api_request(self, data: Dict) -> Dict:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"length": 0,
|
||||
"nextIndex": 0,
|
||||
"teamCourseRuleList": [],
|
||||
}
|
||||
|
||||
def handle_upsert_user_all_api_request(self, data: Dict) -> Dict:
|
||||
upsert = data["upsertUserAll"]
|
||||
user_id = data["userId"]
|
||||
|
||||
if "userData" in upsert:
|
||||
try:
|
||||
upsert["userData"][0]["userName"] = self.read_wtf8(upsert["userData"][0]["userName"])
|
||||
except: pass
|
||||
|
||||
self.data.profile.put_profile_data(user_id, self.version, upsert["userData"][0])
|
||||
if "userDataEx" in upsert:
|
||||
self.data.profile.put_profile_data_ex(user_id, self.version, upsert["userDataEx"][0])
|
||||
if "userGameOption" in upsert:
|
||||
self.data.profile.put_profile_option(user_id, upsert["userGameOption"][0])
|
||||
if "userGameOptionEx" in upsert:
|
||||
self.data.profile.put_profile_option_ex(user_id, upsert["userGameOptionEx"][0])
|
||||
if "userRecentRatingList" in upsert:
|
||||
self.data.profile.put_profile_recent_rating(user_id, upsert["userRecentRatingList"])
|
||||
|
||||
if "userCharacterList" in upsert:
|
||||
for character in upsert["userCharacterList"]:
|
||||
self.data.item.put_character(user_id, character)
|
||||
|
||||
if "userMapList" in upsert:
|
||||
for map in upsert["userMapList"]:
|
||||
self.data.item.put_map(user_id, map)
|
||||
|
||||
if "userCourseList" in upsert:
|
||||
for course in upsert["userCourseList"]:
|
||||
self.data.score.put_course(user_id, course)
|
||||
|
||||
if "userDuelList" in upsert:
|
||||
for duel in upsert["userDuelList"]:
|
||||
self.data.item.put_duel(user_id, duel)
|
||||
|
||||
if "userItemList" in upsert:
|
||||
for item in upsert["userItemList"]:
|
||||
self.data.item.put_item(user_id, item)
|
||||
|
||||
if "userActivityList" in upsert:
|
||||
for activity in upsert["userActivityList"]:
|
||||
self.data.profile.put_profile_activity(user_id, activity)
|
||||
|
||||
if "userChargeList" in upsert:
|
||||
for charge in upsert["userChargeList"]:
|
||||
self.data.profile.put_profile_charge(user_id, charge)
|
||||
|
||||
if "userMusicDetailList" in upsert:
|
||||
for song in upsert["userMusicDetailList"]:
|
||||
self.data.score.put_score(user_id, song)
|
||||
|
||||
if "userPlaylogList" in upsert:
|
||||
for playlog in upsert["userPlaylogList"]:
|
||||
self.data.score.put_playlog(user_id, playlog)
|
||||
|
||||
if "userTeamPoint" in upsert:
|
||||
# TODO: team stuff
|
||||
pass
|
||||
|
||||
if "userMapAreaList" in upsert:
|
||||
for map_area in upsert["userMapAreaList"]:
|
||||
self.data.item.put_map_area(user_id, map_area)
|
||||
|
||||
if "userOverPowerList" in upsert:
|
||||
for overpower in upsert["userOverPowerList"]:
|
||||
self.data.profile.put_profile_overpower(user_id, overpower)
|
||||
|
||||
if "userEmoneyList" in upsert:
|
||||
for emoney in upsert["userEmoneyList"]:
|
||||
self.data.profile.put_profile_emoney(user_id, emoney)
|
||||
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_user_chargelog_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_client_bookkeeping_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_client_develop_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_client_error_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_client_setting_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_upsert_client_testmode_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
36
titles/chuni/config.py
Normal file
36
titles/chuni/config.py
Normal file
@ -0,0 +1,36 @@
|
||||
from core.config import CoreConfig
|
||||
from typing import Dict
|
||||
|
||||
class ChuniServerConfig():
|
||||
def __init__(self, parent_config: "ChuniConfig") -> None:
|
||||
self.__config = parent_config
|
||||
|
||||
@property
|
||||
def enable(self) -> bool:
|
||||
return CoreConfig.get_config_field(self.__config, 'chuni', 'server', 'enable', default=True)
|
||||
|
||||
@property
|
||||
def loglevel(self) -> int:
|
||||
return CoreConfig.str_to_loglevel(CoreConfig.get_config_field(self.__config, 'chuni', 'server', 'loglevel', default="info"))
|
||||
|
||||
class ChuniCryptoConfig():
|
||||
def __init__(self, parent_config: "ChuniConfig") -> None:
|
||||
self.__config = parent_config
|
||||
|
||||
@property
|
||||
def keys(self) -> Dict:
|
||||
"""
|
||||
in the form of:
|
||||
internal_version: [key, iv]
|
||||
all values are hex strings
|
||||
"""
|
||||
return CoreConfig.get_config_field(self.__config, 'chuni', 'crypto', 'keys', default={})
|
||||
|
||||
@property
|
||||
def encrypted_only(self) -> bool:
|
||||
return CoreConfig.get_config_field(self.__config, 'chuni', 'crypto', 'encrypted_only', default=False)
|
||||
|
||||
class ChuniConfig(dict):
|
||||
def __init__(self) -> None:
|
||||
self.server = ChuniServerConfig(self)
|
||||
self.crypto = ChuniCryptoConfig(self)
|
24
titles/chuni/const.py
Normal file
24
titles/chuni/const.py
Normal file
@ -0,0 +1,24 @@
|
||||
class ChuniConstants():
|
||||
GAME_CODE = "SDBT"
|
||||
GAME_CODE_NEW = "SDHD"
|
||||
|
||||
VER_CHUNITHM = 0
|
||||
VER_CHUNITHM_PLUS = 1
|
||||
VER_CHUNITHM_AIR = 2
|
||||
VER_CHUNITHM_AIR_PLUS = 3
|
||||
VER_CHUNITHM_STAR = 4
|
||||
VER_CHUNITHM_STAR_PLUS = 5
|
||||
VER_CHUNITHM_AMAZON = 6
|
||||
VER_CHUNITHM_AMAZON_PLUS = 7
|
||||
VER_CHUNITHM_CRYSTAL = 8
|
||||
VER_CHUNITHM_CRYSTAL_PLUS = 9
|
||||
VER_CHUNITHM_PARADISE = 10
|
||||
VER_CHUNITHM_NEW = 11
|
||||
VER_CHUNITHM_NEW_PLUS = 12
|
||||
|
||||
VERSION_NAMES = ["Chunithm", "Chunithm+", "Chunithm Air", "Chunithm Air+", "Chunithm Star", "Chunithm Star+", "Chunithm Amazon",
|
||||
"Chunithm Amazon+", "Chunithm Crystal", "Chunithm Crystal+", "Chunithm Paradise", "Chunithm New!!", "Chunithm New!!+"]
|
||||
|
||||
@classmethod
|
||||
def game_ver_to_string(cls, ver: int):
|
||||
return cls.VERSION_NAMES[ver]
|
18
titles/chuni/crystal.py
Normal file
18
titles/chuni/crystal.py
Normal file
@ -0,0 +1,18 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniCrystal(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_CRYSTAL
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.40.00"
|
||||
return ret
|
18
titles/chuni/crystalplus.py
Normal file
18
titles/chuni/crystalplus.py
Normal file
@ -0,0 +1,18 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniCrystalPlus(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_CRYSTAL_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.45.00"
|
||||
return ret
|
12
titles/chuni/database.py
Normal file
12
titles/chuni/database.py
Normal file
@ -0,0 +1,12 @@
|
||||
from core.data import Data
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.schema import *
|
||||
|
||||
class ChuniData(Data):
|
||||
def __init__(self, cfg: CoreConfig) -> None:
|
||||
super().__init__(cfg)
|
||||
|
||||
self.item = ChuniItemData(cfg, self.session)
|
||||
self.profile = ChuniProfileData(cfg, self.session)
|
||||
self.score = ChuniScoreData(cfg, self.session)
|
||||
self.static = ChuniStaticData(cfg, self.session)
|
172
titles/chuni/index.py
Normal file
172
titles/chuni/index.py
Normal file
@ -0,0 +1,172 @@
|
||||
from twisted.web.http import Request
|
||||
import logging, coloredlogs
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
import zlib
|
||||
import yaml
|
||||
import json
|
||||
import inflection
|
||||
import string
|
||||
from Crypto.Cipher import AES
|
||||
from Crypto.Util.Padding import pad
|
||||
|
||||
from core import CoreConfig
|
||||
from titles.chuni.config import ChuniConfig
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.plus import ChuniPlus
|
||||
from titles.chuni.air import ChuniAir
|
||||
from titles.chuni.airplus import ChuniAirPlus
|
||||
from titles.chuni.star import ChuniStar
|
||||
from titles.chuni.starplus import ChuniStarPlus
|
||||
from titles.chuni.amazon import ChuniAmazon
|
||||
from titles.chuni.amazonplus import ChuniAmazonPlus
|
||||
from titles.chuni.crystal import ChuniCrystal
|
||||
from titles.chuni.crystalplus import ChuniCrystalPlus
|
||||
from titles.chuni.paradise import ChuniParadise
|
||||
from titles.chuni.new import ChuniNew
|
||||
from titles.chuni.newplus import ChuniNewPlus
|
||||
|
||||
class ChuniServlet():
|
||||
def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None:
|
||||
self.core_cfg = core_cfg
|
||||
self.game_cfg = ChuniConfig()
|
||||
self.game_cfg.update(yaml.safe_load(open(f"{cfg_dir}/chuni.yaml")))
|
||||
|
||||
self.versions = [
|
||||
ChuniBase(core_cfg, self.game_cfg),
|
||||
ChuniPlus(core_cfg, self.game_cfg),
|
||||
ChuniAir(core_cfg, self.game_cfg),
|
||||
ChuniAirPlus(core_cfg, self.game_cfg),
|
||||
ChuniStar(core_cfg, self.game_cfg),
|
||||
ChuniStarPlus(core_cfg, self.game_cfg),
|
||||
ChuniAmazon(core_cfg, self.game_cfg),
|
||||
ChuniAmazonPlus(core_cfg, self.game_cfg),
|
||||
ChuniCrystal(core_cfg, self.game_cfg),
|
||||
ChuniCrystalPlus(core_cfg, self.game_cfg),
|
||||
ChuniParadise(core_cfg, self.game_cfg),
|
||||
ChuniNew(core_cfg, self.game_cfg),
|
||||
ChuniNewPlus(core_cfg, self.game_cfg),
|
||||
]
|
||||
|
||||
self.logger = logging.getLogger("chuni")
|
||||
|
||||
if not hasattr(self.logger, "inited"):
|
||||
log_fmt_str = "[%(asctime)s] Chunithm | %(levelname)s | %(message)s"
|
||||
log_fmt = logging.Formatter(log_fmt_str)
|
||||
fileHandler = TimedRotatingFileHandler("{0}/{1}.log".format(self.core_cfg.server.log_dir, "chuni"), encoding='utf8',
|
||||
when="d", backupCount=10)
|
||||
|
||||
fileHandler.setFormatter(log_fmt)
|
||||
|
||||
consoleHandler = logging.StreamHandler()
|
||||
consoleHandler.setFormatter(log_fmt)
|
||||
|
||||
self.logger.addHandler(fileHandler)
|
||||
self.logger.addHandler(consoleHandler)
|
||||
|
||||
self.logger.setLevel(self.game_cfg.server.loglevel)
|
||||
coloredlogs.install(level=self.game_cfg.server.loglevel, logger=self.logger, fmt=log_fmt_str)
|
||||
self.logger.inited = True
|
||||
|
||||
def render_POST(self, request: Request, version: int, url_path: str) -> bytes:
|
||||
req_raw = request.content.getvalue()
|
||||
url_split = url_path.split("/")
|
||||
encrtped = False
|
||||
internal_ver = 0
|
||||
endpoint = url_split[len(url_split) - 1]
|
||||
|
||||
if version < 105: # 1.0
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM
|
||||
elif version >= 105 and version < 110: # Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_PLUS
|
||||
elif version >= 110 and version < 115: # Air
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_AIR
|
||||
elif version >= 115 and version < 120: # Air Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_AIR_PLUS
|
||||
elif version >= 120 and version < 125: # Star
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_STAR
|
||||
elif version >= 125 and version < 130: # Star Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_STAR_PLUS
|
||||
elif version >= 130 and version < 135: # Amazon
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_AMAZON
|
||||
elif version >= 135 and version < 140: # Amazon Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_AMAZON_PLUS
|
||||
elif version >= 140 and version < 145: # Crystal
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_CRYSTAL
|
||||
elif version >= 145 and version < 150: # Crystal Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_CRYSTAL_PLUS
|
||||
elif version >= 150 and version < 200: # Paradise
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_PARADISE
|
||||
elif version >= 200 and version < 205: # New
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_NEW
|
||||
elif version >= 205 and version < 210: # New Plus
|
||||
internal_ver = ChuniConstants.VER_CHUNITHM_NEW_PLUS
|
||||
|
||||
if all(c in string.hexdigits for c in endpoint) and len(endpoint) == 32:
|
||||
# If we get a 32 character long hex string, it's a hash and we're
|
||||
# doing encrypted. The likelyhood of false positives is low but
|
||||
# technically not 0
|
||||
endpoint = request.getHeader("User-Agent").split("#")[0]
|
||||
try:
|
||||
crypt = AES.new(
|
||||
bytes.fromhex(self.game_cfg.crypto.keys[str(internal_ver)][0]),
|
||||
AES.MODE_CBC,
|
||||
bytes.fromhex(self.game_cfg.crypto.keys[str(internal_ver)][1])
|
||||
)
|
||||
|
||||
req_raw = crypt.decrypt(req_raw)
|
||||
|
||||
except:
|
||||
self.logger.error(f"Failed to decrypt v{version} request to {endpoint} -> {req_raw}")
|
||||
return zlib.compress("{\"stat\": \"0\"}".encode("utf-8"))
|
||||
|
||||
encrtped = True
|
||||
|
||||
if not encrtped and self.game_cfg.crypto.encrypted_only:
|
||||
self.logger.error(f"Unencrypted v{version} {endpoint} request, but config is set to encrypted only: {req_raw}")
|
||||
return zlib.compress("{\"stat\": \"0\"}".encode("utf-8"))
|
||||
|
||||
try:
|
||||
unzip = zlib.decompress(req_raw)
|
||||
|
||||
except zlib.error as e:
|
||||
self.logger.error(f"Failed to decompress v{version} {endpoint} request -> {e}")
|
||||
return b""
|
||||
|
||||
req_data = json.loads(unzip)
|
||||
|
||||
self.logger.info(f"v{version} {endpoint} request - {req_data}")
|
||||
|
||||
func_to_find = "handle_" + inflection.underscore(endpoint) + "_request"
|
||||
|
||||
try:
|
||||
handler = getattr(self.versions[internal_ver], func_to_find)
|
||||
resp = handler(req_data)
|
||||
|
||||
except AttributeError as e:
|
||||
self.logger.warning(f"Unhandled v{version} request {endpoint} - {e}")
|
||||
return zlib.compress("{\"stat\": \"0\"}".encode("utf-8"))
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error handling v{version} method {endpoint} - {e}")
|
||||
return zlib.compress("{\"stat\": \"0\"}".encode("utf-8"))
|
||||
|
||||
if resp == None:
|
||||
resp = {'returnCode': 1}
|
||||
|
||||
self.logger.info(f"Response {resp}")
|
||||
|
||||
zipped = zlib.compress(json.dumps(resp, ensure_ascii=False).encode("utf-8"))
|
||||
|
||||
if not encrtped:
|
||||
return zipped
|
||||
|
||||
padded = pad(zipped, 16)
|
||||
|
||||
crypt = AES.new(
|
||||
bytes.fromhex(self.game_cfg.crypto.keys[str(internal_ver)][0]),
|
||||
AES.MODE_CBC,
|
||||
bytes.fromhex(self.game_cfg.crypto.keys[str(internal_ver)][1])
|
||||
)
|
||||
|
||||
return crypt.encrypt(padded)
|
128
titles/chuni/new.py
Normal file
128
titles/chuni/new.py
Normal file
@ -0,0 +1,128 @@
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.database import ChuniData
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniNew(ChuniBase):
|
||||
|
||||
ITEM_TYPE = {
|
||||
"character": 20,
|
||||
"story": 21,
|
||||
"card": 22
|
||||
}
|
||||
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
self.core_cfg = core_cfg
|
||||
self.game_cfg = game_cfg
|
||||
self.data = ChuniData(core_cfg)
|
||||
self.date_time_format = "%Y-%m-%d %H:%M:%S"
|
||||
self.logger = logging.getLogger("chuni")
|
||||
self.game = ChuniConstants.GAME_CODE
|
||||
self.version = ChuniConstants.VER_CHUNITHM_NEW
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
match_start = datetime.strftime(datetime.now() - timedelta(hours=10), self.date_time_format)
|
||||
match_end = datetime.strftime(datetime.now() + timedelta(hours=10), self.date_time_format)
|
||||
reboot_start = datetime.strftime(datetime.now() - timedelta(hours=11), self.date_time_format)
|
||||
reboot_end = datetime.strftime(datetime.now() - timedelta(hours=10), self.date_time_format)
|
||||
return {
|
||||
"gameSetting": {
|
||||
"isMaintenance": "false",
|
||||
"requestInterval": 10,
|
||||
"rebootStartTime": reboot_start,
|
||||
"rebootEndTime": reboot_end,
|
||||
"isBackgroundDistribute": "false",
|
||||
"maxCountCharacter": 300,
|
||||
"maxCountItem": 300,
|
||||
"maxCountMusic": 300,
|
||||
"matchStartTime": match_start,
|
||||
"matchEndTime": match_end,
|
||||
"matchTimeLimit": 99,
|
||||
"matchErrorLimit": 9999,
|
||||
"romVersion": "2.00.00",
|
||||
"dataVersion": "2.00.00",
|
||||
"matchingUri": f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/200/ChuniServlet/",
|
||||
"matchingUriX": f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/200/ChuniServlet/",
|
||||
"udpHolePunchUri": f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/200/ChuniServlet/",
|
||||
"reflectorUri": f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/200/ChuniServlet/",
|
||||
},
|
||||
"isDumpUpload": "false",
|
||||
"isAou": "false",
|
||||
}
|
||||
|
||||
def handle_delete_token_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_create_token_api_request(self, data: Dict) -> Dict:
|
||||
return { "returnCode": "1" }
|
||||
|
||||
def handle_get_user_map_area_api_request(self, data: Dict) -> Dict:
|
||||
user_map_areas = self.data.item.get_map_areas(data["userId"])
|
||||
|
||||
map_areas = []
|
||||
for map_area in user_map_areas:
|
||||
tmp = map_area._asdict()
|
||||
tmp.pop("id")
|
||||
tmp.pop("user")
|
||||
map_areas.append(tmp)
|
||||
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"userMapAreaList": map_areas
|
||||
}
|
||||
|
||||
def handle_get_user_symbol_chat_setting_api_request(self, data: Dict) -> Dict:
|
||||
return {
|
||||
"userId": data["userId"],
|
||||
"symbolCharInfoList": []
|
||||
}
|
||||
|
||||
def handle_get_user_preview_api_request(self, data: Dict) -> Dict:
|
||||
profile = self.data.profile.get_profile_preview(data["userId"], self.version)
|
||||
if profile is None: return None
|
||||
profile_character = self.data.item.get_character(data["userId"], profile["characterId"])
|
||||
|
||||
if profile_character is None:
|
||||
chara = {}
|
||||
else:
|
||||
chara = profile_character._asdict()
|
||||
chara.pop("id")
|
||||
chara.pop("user")
|
||||
|
||||
data1 = {
|
||||
"userId": data["userId"],
|
||||
# Current Login State
|
||||
"isLogin": False,
|
||||
"lastLoginDate": profile["lastPlayDate"],
|
||||
# User Profile
|
||||
"userName": profile["userName"],
|
||||
"reincarnationNum": profile["reincarnationNum"],
|
||||
"level": profile["level"],
|
||||
"exp": profile["exp"],
|
||||
"playerRating": profile["playerRating"],
|
||||
"lastGameId": profile["lastGameId"],
|
||||
"lastRomVersion": profile["lastRomVersion"],
|
||||
"lastDataVersion": profile["lastDataVersion"],
|
||||
"lastPlayDate": profile["lastPlayDate"],
|
||||
"emoneyBrandId": 0,
|
||||
"trophyId": profile["trophyId"],
|
||||
# Current Selected Character
|
||||
"userCharacter": chara,
|
||||
# User Game Options
|
||||
"playerLevel": profile["playerLevel"],
|
||||
"rating": profile["rating"],
|
||||
"headphone": profile["headphone"],
|
||||
"chargeState": 0,
|
||||
"userNameEx": "0",
|
||||
"banState": 0,
|
||||
"classEmblemMedal": profile["classEmblemMedal"],
|
||||
"classEmblemBase": profile["classEmblemBase"],
|
||||
"battleRankId": profile["battleRankId"],
|
||||
}
|
||||
return data1
|
23
titles/chuni/newplus.py
Normal file
23
titles/chuni/newplus.py
Normal file
@ -0,0 +1,23 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.new import ChuniNew
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniNewPlus(ChuniNew):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_NEW_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["romVersion"] = "2.05.00"
|
||||
ret["gameSetting"]["dataVersion"] = "2.05.00"
|
||||
ret["gameSetting"]["matchingUri"] = f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/205/ChuniServlet/"
|
||||
ret["gameSetting"]["matchingUriX"] = f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/205/ChuniServlet/"
|
||||
ret["gameSetting"]["udpHolePunchUri"] = f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/205/ChuniServlet/"
|
||||
ret["gameSetting"]["reflectorUri"] = f"http://{self.core_cfg.server.hostname}:{self.core_cfg.title.port}/SDHD/205/ChuniServlet/"
|
||||
return ret
|
18
titles/chuni/paradise.py
Normal file
18
titles/chuni/paradise.py
Normal file
@ -0,0 +1,18 @@
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Dict, Any
|
||||
import pytz
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniParadise(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_PARADISE
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.50.00"
|
||||
return ret
|
16
titles/chuni/plus.py
Normal file
16
titles/chuni/plus.py
Normal file
@ -0,0 +1,16 @@
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniPlus(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.05.00"
|
||||
return ret
|
157
titles/chuni/read.py
Normal file
157
titles/chuni/read.py
Normal file
@ -0,0 +1,157 @@
|
||||
from typing import Optional
|
||||
from os import walk, path
|
||||
import xml.etree.ElementTree as ET
|
||||
from read import BaseReader
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.database import ChuniData
|
||||
from titles.chuni.const import ChuniConstants
|
||||
|
||||
class ChuniReader(BaseReader):
|
||||
def __init__(self, config: CoreConfig, version: int, bin_dir: Optional[str], opt_dir: Optional[str], extra: Optional[str]) -> None:
|
||||
super().__init__(config, version, bin_dir, opt_dir, extra)
|
||||
self.data = ChuniData(config)
|
||||
|
||||
try:
|
||||
self.logger.info(f"Start importer for {ChuniConstants.game_ver_to_string(version)}")
|
||||
except IndexError:
|
||||
self.logger.error(f"Invalid chunithm version {version}")
|
||||
exit(1)
|
||||
|
||||
def read(self) -> None:
|
||||
data_dirs = []
|
||||
if self.bin_dir is not None:
|
||||
data_dirs += self.get_data_directories(self.bin_dir)
|
||||
|
||||
if self.opt_dir is not None:
|
||||
data_dirs += self.get_data_directories(self.opt_dir)
|
||||
|
||||
for dir in data_dirs:
|
||||
self.logger.info(f"Read from {dir}")
|
||||
self.read_events(f"{dir}/event")
|
||||
self.read_music(f"{dir}/music")
|
||||
self.read_charges(f"{dir}/chargeItem")
|
||||
self.read_avatar(f"{dir}/avatarAccessory")
|
||||
|
||||
def read_events(self, evt_dir: str) -> None:
|
||||
for root, dirs, files in walk(evt_dir):
|
||||
for dir in dirs:
|
||||
if path.exists(f"{root}/{dir}/Event.xml"):
|
||||
with open(f"{root}/{dir}/Event.xml", 'rb') as fp:
|
||||
bytedata = fp.read()
|
||||
strdata = bytedata.decode('UTF-8')
|
||||
|
||||
xml_root = ET.fromstring(strdata)
|
||||
for name in xml_root.findall('name'):
|
||||
id = name.find('id').text
|
||||
name = name.find('str').text
|
||||
for substances in xml_root.findall('substances'):
|
||||
event_type = substances.find('type').text
|
||||
|
||||
result = self.data.static.put_event(self.version, id, event_type, name)
|
||||
if result is not None:
|
||||
self.logger.info(f"Inserted event {id}")
|
||||
else:
|
||||
self.logger.warn(f"Failed to insert event {id}")
|
||||
|
||||
def read_music(self, music_dir: str) -> None:
|
||||
for root, dirs, files in walk(music_dir):
|
||||
for dir in dirs:
|
||||
if path.exists(f"{root}/{dir}/Music.xml"):
|
||||
with open(f"{root}/{dir}/Music.xml", 'rb') as fp:
|
||||
bytedata = fp.read()
|
||||
strdata = bytedata.decode('UTF-8')
|
||||
|
||||
xml_root = ET.fromstring(strdata)
|
||||
for name in xml_root.findall('name'):
|
||||
song_id = name.find('id').text
|
||||
title = name.find('str').text
|
||||
|
||||
for artistName in xml_root.findall('artistName'):
|
||||
artist = artistName.find('str').text
|
||||
|
||||
for genreNames in xml_root.findall('genreNames'):
|
||||
for list_ in genreNames.findall('list'):
|
||||
for StringID in list_.findall('StringID'):
|
||||
genre = StringID.find('str').text
|
||||
|
||||
for jaketFile in xml_root.findall('jaketFile'): #nice typo, SEGA
|
||||
jacket_path = jaketFile.find('path').text
|
||||
|
||||
for fumens in xml_root.findall('fumens'):
|
||||
for MusicFumenData in fumens.findall('MusicFumenData'):
|
||||
fumen_path = MusicFumenData.find('file').find("path")
|
||||
|
||||
if fumen_path.text is not None:
|
||||
chart_id = MusicFumenData.find('type').find('id').text
|
||||
if chart_id == "4":
|
||||
level = float(xml_root.find("starDifType").text)
|
||||
we_chara = xml_root.find("worldsEndTagName").find("str").text
|
||||
else:
|
||||
level = float(f"{MusicFumenData.find('level').text}.{MusicFumenData.find('levelDecimal').text}")
|
||||
we_chara = None
|
||||
|
||||
result = self.data.static.put_music(
|
||||
self.version,
|
||||
song_id,
|
||||
chart_id,
|
||||
title,
|
||||
artist,
|
||||
level,
|
||||
genre,
|
||||
jacket_path,
|
||||
we_chara
|
||||
)
|
||||
|
||||
if result is not None:
|
||||
self.logger.info(f"Inserted music {song_id} chart {chart_id}")
|
||||
else:
|
||||
self.logger.warn(f"Failed to insert music {song_id} chart {chart_id}")
|
||||
|
||||
def read_charges(self, charge_dir: str) -> None:
|
||||
for root, dirs, files in walk(charge_dir):
|
||||
for dir in dirs:
|
||||
if path.exists(f"{root}/{dir}/ChargeItem.xml"):
|
||||
with open(f"{root}/{dir}/ChargeItem.xml", 'rb') as fp:
|
||||
bytedata = fp.read()
|
||||
strdata = bytedata.decode('UTF-8')
|
||||
|
||||
xml_root = ET.fromstring(strdata)
|
||||
for name in xml_root.findall('name'):
|
||||
id = name.find('id').text
|
||||
name = name.find('str').text
|
||||
expirationDays = xml_root.find('expirationDays').text
|
||||
consumeType = xml_root.find('consumeType').text
|
||||
sellingAppeal = bool(xml_root.find('sellingAppeal').text)
|
||||
|
||||
result = self.data.static.put_charge(self.version, id, name, expirationDays, consumeType, sellingAppeal)
|
||||
|
||||
if result is not None:
|
||||
self.logger.info(f"Inserted charge {id}")
|
||||
else:
|
||||
self.logger.warn(f"Failed to insert charge {id}")
|
||||
|
||||
def read_avatar(self, avatar_dir: str) -> None:
|
||||
for root, dirs, files in walk(avatar_dir):
|
||||
for dir in dirs:
|
||||
if path.exists(f"{root}/{dir}/AvatarAccessory.xml"):
|
||||
with open(f"{root}/{dir}/AvatarAccessory.xml", 'rb') as fp:
|
||||
bytedata = fp.read()
|
||||
strdata = bytedata.decode('UTF-8')
|
||||
|
||||
xml_root = ET.fromstring(strdata)
|
||||
for name in xml_root.findall('name'):
|
||||
id = name.find('id').text
|
||||
name = name.find('str').text
|
||||
category = xml_root.find('category').text
|
||||
for image in xml_root.findall('image'):
|
||||
iconPath = image.find('path').text
|
||||
for texture in xml_root.findall('texture'):
|
||||
texturePath = texture.find('path').text
|
||||
|
||||
result = self.data.static.put_avatar(self.version, id, name, category, iconPath, texturePath)
|
||||
|
||||
if result is not None:
|
||||
self.logger.info(f"Inserted avatarAccessory {id}")
|
||||
else:
|
||||
self.logger.warn(f"Failed to insert avatarAccessory {id}")
|
6
titles/chuni/schema/__init__.py
Normal file
6
titles/chuni/schema/__init__.py
Normal file
@ -0,0 +1,6 @@
|
||||
from titles.chuni.schema.profile import ChuniProfileData
|
||||
from titles.chuni.schema.score import ChuniScoreData
|
||||
from titles.chuni.schema.item import ChuniItemData
|
||||
from titles.chuni.schema.static import ChuniStaticData
|
||||
|
||||
__all__ = ["ChuniProfileData", "ChuniScoreData", "ChuniItemData", "ChuniStaticData"]
|
207
titles/chuni/schema/item.py
Normal file
207
titles/chuni/schema/item.py
Normal file
@ -0,0 +1,207 @@
|
||||
from typing import Dict, List, Optional
|
||||
from sqlalchemy import Table, Column, UniqueConstraint, PrimaryKeyConstraint, and_
|
||||
from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON
|
||||
from sqlalchemy.engine.base import Connection
|
||||
from sqlalchemy.schema import ForeignKey
|
||||
from sqlalchemy.sql import func, select
|
||||
from sqlalchemy.dialects.mysql import insert
|
||||
from sqlalchemy.engine import Row
|
||||
|
||||
from core.data.schema import BaseData, metadata
|
||||
|
||||
character = Table(
|
||||
"chuni_item_character",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("characterId", Integer),
|
||||
Column("level", Integer),
|
||||
Column("param1", Integer),
|
||||
Column("param2", Integer),
|
||||
Column("isValid", Boolean),
|
||||
Column("skillId", Integer),
|
||||
Column("isNewMark", Boolean),
|
||||
Column("playCount", Integer),
|
||||
Column("friendshipExp", Integer),
|
||||
Column("assignIllust", Integer),
|
||||
Column("exMaxLv", Integer),
|
||||
UniqueConstraint("user", "characterId", name="chuni_item_character_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
item = Table(
|
||||
"chuni_item_item",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("itemId", Integer),
|
||||
Column("itemKind", Integer),
|
||||
Column("stock", Integer),
|
||||
Column("isValid", Boolean),
|
||||
UniqueConstraint("user", "itemId", "itemKind", name="chuni_item_item_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
duel = Table(
|
||||
"chuni_item_duel",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("duelId", Integer),
|
||||
Column("progress", Integer),
|
||||
Column("point", Integer),
|
||||
Column("isClear", Boolean),
|
||||
Column("lastPlayDate", String(25)),
|
||||
Column("param1", Integer),
|
||||
Column("param2", Integer),
|
||||
Column("param3", Integer),
|
||||
Column("param4", Integer),
|
||||
UniqueConstraint("user", "duelId", name="chuni_item_duel_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
map = Table(
|
||||
"chuni_item_map",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("mapId", Integer),
|
||||
Column("position", Integer),
|
||||
Column("isClear", Boolean),
|
||||
Column("areaId", Integer),
|
||||
Column("routeNumber", Integer),
|
||||
Column("eventId", Integer),
|
||||
Column("rate", Integer),
|
||||
Column("statusCount", Integer),
|
||||
Column("isValid", Boolean),
|
||||
UniqueConstraint("user", "mapId", name="chuni_item_map_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
map_area = Table(
|
||||
"chuni_item_map_area",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("mapAreaId", Integer),
|
||||
Column("rate", Integer),
|
||||
Column("isClear", Boolean),
|
||||
Column("isLocked", Boolean),
|
||||
Column("position", Integer),
|
||||
Column("statusCount", Integer),
|
||||
Column("remainGridCount", Integer),
|
||||
UniqueConstraint("user", "mapAreaId", name="chuni_item_map_area_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
class ChuniItemData(BaseData):
|
||||
def put_character(self, user_id: int, character_data: Dict) -> Optional[int]:
|
||||
character_data["user"] = user_id
|
||||
|
||||
character_data = self.fix_bools(character_data)
|
||||
|
||||
sql = insert(character).values(**character_data)
|
||||
conflict = sql.on_duplicate_key_update(**character_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_character(self, user_id: int, character_id: int) -> Optional[Dict]:
|
||||
sql = select(character).where(and_(
|
||||
character.c.user == user_id,
|
||||
character.c.characterId == character_id
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def get_characters(self, user_id: int) -> Optional[List[Row]]:
|
||||
sql = select(character).where(character.c.user == user_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_item(self, user_id: int, item_data: Dict) -> Optional[int]:
|
||||
item_data["user"] = user_id
|
||||
|
||||
item_data = self.fix_bools(item_data)
|
||||
|
||||
sql = insert(item).values(**item_data)
|
||||
conflict = sql.on_duplicate_key_update(**item_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_items(self, user_id: int, kind: int = None) -> Optional[List[Row]]:
|
||||
if kind is None:
|
||||
sql = select(item).where(item.c.user == user_id)
|
||||
else:
|
||||
sql = select(item).where(and_(
|
||||
item.c.user == user_id,
|
||||
item.c.itemKind == kind
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_duel(self, user_id: int, duel_data: Dict) -> Optional[int]:
|
||||
duel_data["user"] = user_id
|
||||
|
||||
duel_data = self.fix_bools(duel_data)
|
||||
|
||||
sql = insert(duel).values(**duel_data)
|
||||
conflict = sql.on_duplicate_key_update(**duel_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_duels(self, user_id: int) -> Optional[List[Row]]:
|
||||
sql = select(duel).where(duel.c.user == user_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_map(self, user_id: int, map_data: Dict) -> Optional[int]:
|
||||
map_data["user"] = user_id
|
||||
|
||||
map_data = self.fix_bools(map_data)
|
||||
|
||||
sql = insert(map).values(**map_data)
|
||||
conflict = sql.on_duplicate_key_update(**map_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_maps(self, user_id: int) -> Optional[List[Row]]:
|
||||
sql = select(map).where(map.c.user == user_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_map_area(self, user_id: int, map_area_data: Dict) -> Optional[int]:
|
||||
map_area_data["user"] = user_id
|
||||
|
||||
map_area_data = self.fix_bools(map_area_data)
|
||||
|
||||
sql = insert(map_area).values(**map_area_data)
|
||||
conflict = sql.on_duplicate_key_update(**map_area_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_map_areas(self, user_id: int) -> Optional[List[Row]]:
|
||||
sql = select(map_area).where(map_area.c.user == user_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
551
titles/chuni/schema/profile.py
Normal file
551
titles/chuni/schema/profile.py
Normal file
@ -0,0 +1,551 @@
|
||||
from typing import Dict, List, Optional
|
||||
from sqlalchemy import Table, Column, UniqueConstraint, PrimaryKeyConstraint, and_
|
||||
from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, BigInteger
|
||||
from sqlalchemy.engine.base import Connection
|
||||
from sqlalchemy.schema import ForeignKey
|
||||
from sqlalchemy.engine import Row
|
||||
from sqlalchemy.sql import func, select
|
||||
from sqlalchemy.dialects.mysql import insert
|
||||
|
||||
from core.data.schema import BaseData, metadata
|
||||
|
||||
profile = Table(
|
||||
"chuni_profile_data",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("exp", Integer),
|
||||
Column("level", Integer),
|
||||
Column("point", Integer),
|
||||
Column("frameId", Integer),
|
||||
Column("isMaimai", Boolean),
|
||||
Column("trophyId", Integer),
|
||||
Column("userName", String(25)),
|
||||
Column("isWebJoin", Boolean),
|
||||
Column("playCount", Integer),
|
||||
Column("lastGameId", String(25)),
|
||||
Column("totalPoint", BigInteger),
|
||||
Column("characterId", Integer),
|
||||
Column("firstGameId", String(25)),
|
||||
Column("friendCount", Integer),
|
||||
Column("lastPlaceId", Integer),
|
||||
Column("nameplateId", Integer),
|
||||
Column("totalMapNum", Integer),
|
||||
Column("lastAllNetId", Integer),
|
||||
Column("lastClientId", String(25)),
|
||||
Column("lastPlayDate", String(25)),
|
||||
Column("lastRegionId", Integer),
|
||||
Column("playerRating", Integer),
|
||||
Column("totalHiScore", Integer),
|
||||
Column("webLimitDate", String(25)),
|
||||
Column("firstPlayDate", String(25)),
|
||||
Column("highestRating", Integer),
|
||||
Column("lastPlaceName", String(25)),
|
||||
Column("multiWinCount", Integer),
|
||||
Column("acceptResCount", Integer),
|
||||
Column("lastRegionName", String(25)),
|
||||
Column("lastRomVersion", String(25)),
|
||||
Column("multiPlayCount", Integer),
|
||||
Column("firstRomVersion", String(25)),
|
||||
Column("lastDataVersion", String(25)),
|
||||
Column("requestResCount", Integer),
|
||||
Column("successResCount", Integer),
|
||||
Column("eventWatchedDate", String(25)),
|
||||
Column("firstDataVersion", String(25)),
|
||||
Column("reincarnationNum", Integer),
|
||||
Column("playedTutorialBit", Integer),
|
||||
Column("totalBasicHighScore", Integer),
|
||||
Column("totalExpertHighScore", Integer),
|
||||
Column("totalMasterHighScore", Integer),
|
||||
Column("totalRepertoireCount", Integer),
|
||||
Column("firstTutorialCancelNum", Integer),
|
||||
Column("totalAdvancedHighScore", Integer),
|
||||
Column("masterTutorialCancelNum", Integer),
|
||||
Column("ext1", Integer), # Added in chunew
|
||||
Column("ext2", Integer),
|
||||
Column("ext3", Integer),
|
||||
Column("ext4", Integer),
|
||||
Column("ext5", Integer),
|
||||
Column("ext6", Integer),
|
||||
Column("ext7", Integer),
|
||||
Column("ext8", Integer),
|
||||
Column("ext9", Integer),
|
||||
Column("ext10", Integer),
|
||||
Column("extStr1", String(255)),
|
||||
Column("extStr2", String(255)),
|
||||
Column("extLong1", Integer),
|
||||
Column("extLong2", Integer),
|
||||
Column("mapIconId", Integer),
|
||||
Column("compatibleCmVersion", String(25)),
|
||||
Column("medal", Integer),
|
||||
Column("voiceId", Integer),
|
||||
Column("teamId", Integer, ForeignKey("chuni_profile_team.id", ondelete="SET NULL", onupdate="SET NULL")),
|
||||
Column("avatarBack", Integer, server_default="0"),
|
||||
Column("avatarFace", Integer, server_default="0"),
|
||||
Column("eliteRankPoint", Integer, server_default="0"),
|
||||
Column("stockedGridCount", Integer, server_default="0"),
|
||||
Column("netBattleLoseCount", Integer, server_default="0"),
|
||||
Column("netBattleHostErrCnt", Integer, server_default="0"),
|
||||
Column("netBattle4thCount", Integer, server_default="0"),
|
||||
Column("overPowerRate", Integer, server_default="0"),
|
||||
Column("battleRewardStatus", Integer, server_default="0"),
|
||||
Column("avatarPoint", Integer, server_default="0"),
|
||||
Column("netBattle1stCount", Integer, server_default="0"),
|
||||
Column("charaIllustId", Integer, server_default="0"),
|
||||
Column("avatarItem", Integer, server_default="0"),
|
||||
Column("userNameEx", String(8), server_default=""),
|
||||
Column("netBattleWinCount", Integer, server_default="0"),
|
||||
Column("netBattleCorrection", Integer, server_default="0"),
|
||||
Column("classEmblemMedal", Integer, server_default="0"),
|
||||
Column("overPowerPoint", Integer, server_default="0"),
|
||||
Column("netBattleErrCnt", Integer, server_default="0"),
|
||||
Column("battleRankId", Integer, server_default="0"),
|
||||
Column("netBattle3rdCount", Integer, server_default="0"),
|
||||
Column("netBattleConsecutiveWinCount", Integer, server_default="0"),
|
||||
Column("overPowerLowerRank", Integer, server_default="0"),
|
||||
Column("avatarWear", Integer, server_default="0"),
|
||||
Column("classEmblemBase", Integer, server_default="0"),
|
||||
Column("battleRankPoint", Integer, server_default="0"),
|
||||
Column("netBattle2ndCount", Integer, server_default="0"),
|
||||
Column("totalUltimaHighScore", Integer, server_default="0"),
|
||||
Column("skillId", Integer, server_default="0"),
|
||||
Column("lastCountryCode", String(5), server_default="JPN"),
|
||||
Column("isNetBattleHost", Boolean, server_default="0"),
|
||||
Column("avatarFront", Integer, server_default="0"),
|
||||
Column("avatarSkin", Integer, server_default="0"),
|
||||
Column("battleRewardCount", Integer, server_default="0"),
|
||||
Column("battleRewardIndex", Integer, server_default="0"),
|
||||
Column("netBattlePlayCount", Integer, server_default="0"),
|
||||
Column("exMapLoopCount", Integer, server_default="0"),
|
||||
Column("netBattleEndState", Integer, server_default="0"),
|
||||
Column("avatarHead", Integer, server_default="0"),
|
||||
UniqueConstraint("user", "version", name="chuni_profile_profile_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
profile_ex = Table(
|
||||
"chuni_profile_data_ex",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("ext1", Integer),
|
||||
Column("ext2", Integer),
|
||||
Column("ext3", Integer),
|
||||
Column("ext4", Integer),
|
||||
Column("ext5", Integer),
|
||||
Column("ext6", Integer),
|
||||
Column("ext7", Integer),
|
||||
Column("ext8", Integer),
|
||||
Column("ext9", Integer),
|
||||
Column("ext10", Integer),
|
||||
Column("ext11", Integer),
|
||||
Column("ext12", Integer),
|
||||
Column("ext13", Integer),
|
||||
Column("ext14", Integer),
|
||||
Column("ext15", Integer),
|
||||
Column("ext16", Integer),
|
||||
Column("ext17", Integer),
|
||||
Column("ext18", Integer),
|
||||
Column("ext19", Integer),
|
||||
Column("ext20", Integer),
|
||||
Column("medal", Integer),
|
||||
Column("extStr1", String(255)),
|
||||
Column("extStr2", String(255)),
|
||||
Column("extStr3", String(255)),
|
||||
Column("extStr4", String(255)),
|
||||
Column("extStr5", String(255)),
|
||||
Column("voiceId", Integer),
|
||||
Column("extLong1", Integer),
|
||||
Column("extLong2", Integer),
|
||||
Column("extLong3", Integer),
|
||||
Column("extLong4", Integer),
|
||||
Column("extLong5", Integer),
|
||||
Column("mapIconId", Integer),
|
||||
Column("compatibleCmVersion", String(25)),
|
||||
UniqueConstraint("user", "version", name="chuni_profile_data_ex_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
option = Table(
|
||||
"chuni_profile_option",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("speed", Integer),
|
||||
Column("bgInfo", Integer),
|
||||
Column("rating", Integer),
|
||||
Column("privacy", Integer),
|
||||
Column("judgePos", Integer),
|
||||
Column("matching", Integer),
|
||||
Column("guideLine", Integer),
|
||||
Column("headphone", Integer),
|
||||
Column("optionSet", Integer),
|
||||
Column("fieldColor", Integer),
|
||||
Column("guideSound", Integer),
|
||||
Column("successAir", Integer),
|
||||
Column("successTap", Integer),
|
||||
Column("judgeAttack", Integer),
|
||||
Column("playerLevel", Integer),
|
||||
Column("soundEffect", Integer),
|
||||
Column("judgeJustice", Integer),
|
||||
Column("successExTap", Integer),
|
||||
Column("successFlick", Integer),
|
||||
Column("successSkill", Integer),
|
||||
Column("successSlideHold", Integer),
|
||||
Column("successTapTimbre", Integer),
|
||||
Column("ext1", Integer), # Added in chunew
|
||||
Column("ext2", Integer),
|
||||
Column("ext3", Integer),
|
||||
Column("ext4", Integer),
|
||||
Column("ext5", Integer),
|
||||
Column("ext6", Integer),
|
||||
Column("ext7", Integer),
|
||||
Column("ext8", Integer),
|
||||
Column("ext9", Integer),
|
||||
Column("ext10", Integer),
|
||||
Column("categoryDetail", Integer, server_default="0"),
|
||||
Column("judgeTimingOffset_120", Integer, server_default="0"),
|
||||
Column("resultVoiceShort", Integer, server_default="0"),
|
||||
Column("judgeAppendSe", Integer, server_default="0"),
|
||||
Column("judgeCritical", Integer, server_default="0"),
|
||||
Column("trackSkip", Integer, server_default="0"),
|
||||
Column("selectMusicFilterLv", Integer, server_default="0"),
|
||||
Column("sortMusicFilterLv", Integer, server_default="0"),
|
||||
Column("sortMusicGenre", Integer, server_default="0"),
|
||||
Column("speed_120", Integer, server_default="0"),
|
||||
Column("judgeTimingOffset", Integer, server_default="0"),
|
||||
Column("mirrorFumen", Integer, server_default="0"),
|
||||
Column("playTimingOffset_120", Integer, server_default="0"),
|
||||
Column("hardJudge", Integer, server_default="0"),
|
||||
Column("notesThickness", Integer, server_default="0"),
|
||||
Column("fieldWallPosition", Integer, server_default="0"),
|
||||
Column("playTimingOffset", Integer, server_default="0"),
|
||||
Column("fieldWallPosition_120", Integer, server_default="0"),
|
||||
UniqueConstraint("user", name="chuni_profile_option_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
option_ex = Table(
|
||||
"chuni_profile_option_ex",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("ext1", Integer),
|
||||
Column("ext2", Integer),
|
||||
Column("ext3", Integer),
|
||||
Column("ext4", Integer),
|
||||
Column("ext5", Integer),
|
||||
Column("ext6", Integer),
|
||||
Column("ext7", Integer),
|
||||
Column("ext8", Integer),
|
||||
Column("ext9", Integer),
|
||||
Column("ext10", Integer),
|
||||
Column("ext11", Integer),
|
||||
Column("ext12", Integer),
|
||||
Column("ext13", Integer),
|
||||
Column("ext14", Integer),
|
||||
Column("ext15", Integer),
|
||||
Column("ext16", Integer),
|
||||
Column("ext17", Integer),
|
||||
Column("ext18", Integer),
|
||||
Column("ext19", Integer),
|
||||
Column("ext20", Integer),
|
||||
UniqueConstraint("user", name="chuni_profile_option_ex_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
recent_rating = Table(
|
||||
"chuni_profile_recent_rating",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("recentRating", JSON),
|
||||
UniqueConstraint("user", name="chuni_profile_recent_rating_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
region = Table(
|
||||
"chuni_profile_region",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("regionId", Integer),
|
||||
Column("playCount", Integer),
|
||||
UniqueConstraint("user", "regionId", name="chuni_profile_region_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
activity = Table(
|
||||
"chuni_profile_activity",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("kind", Integer),
|
||||
Column("activityId", Integer), # Reminder: Change this to ID in base.py or the game will be sad
|
||||
Column("sortNumber", Integer),
|
||||
Column("param1", Integer),
|
||||
Column("param2", Integer),
|
||||
Column("param3", Integer),
|
||||
Column("param4", Integer),
|
||||
UniqueConstraint("user", "kind", "activityId", name="chuni_profile_activity_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
charge = Table(
|
||||
"chuni_profile_charge",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("chargeId", Integer),
|
||||
Column("stock", Integer),
|
||||
Column("purchaseDate", String(25)),
|
||||
Column("validDate", String(25)),
|
||||
Column("param1", Integer),
|
||||
Column("param2", Integer),
|
||||
Column("paramDate", String(25)),
|
||||
UniqueConstraint("user", "chargeId", name="chuni_profile_charge_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
emoney = Table(
|
||||
"chuni_profile_emoney",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("ext1", Integer),
|
||||
Column("ext2", Integer),
|
||||
Column("ext3", Integer),
|
||||
Column("type", Integer),
|
||||
Column("emoneyBrand", Integer),
|
||||
Column("emoneyCredit", Integer),
|
||||
UniqueConstraint("user", "emoneyBrand", name="chuni_profile_emoney_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
overpower = Table(
|
||||
"chuni_profile_overpower",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("genreId", Integer),
|
||||
Column("difficulty", Integer),
|
||||
Column("rate", Integer),
|
||||
Column("point", Integer),
|
||||
UniqueConstraint("user", "genreId", "difficulty", name="chuni_profile_emoney_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
team = Table(
|
||||
"chuni_profile_team",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("teamName", String(255)),
|
||||
Column("teamPoint", Integer),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
class ChuniProfileData(BaseData):
|
||||
def put_profile_data(self, aime_id: int, version: int, profile_data: Dict) -> Optional[int]:
|
||||
profile_data["user"] = aime_id
|
||||
profile_data["version"] = version
|
||||
if "accessCode" in profile_data:
|
||||
profile_data.pop("accessCode")
|
||||
|
||||
profile_data = self.fix_bools(profile_data)
|
||||
|
||||
sql = insert(profile).values(**profile_data)
|
||||
conflict = sql.on_duplicate_key_update(**profile_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_data: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_preview(self, aime_id: int, version: int) -> Optional[Row]:
|
||||
sql = select([profile, option]).join(option, profile.c.user == option.c.user).filter(
|
||||
and_(profile.c.user == aime_id, profile.c.version == version)
|
||||
)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def get_profile_data(self, aime_id: int, version: int) -> Optional[Row]:
|
||||
sql = select(profile).where(and_(
|
||||
profile.c.user == aime_id,
|
||||
profile.c.version == version,
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_profile_data_ex(self, aime_id: int, version: int, profile_ex_data: Dict) -> Optional[int]:
|
||||
profile_ex_data["user"] = aime_id
|
||||
profile_ex_data["version"] = version
|
||||
if "accessCode" in profile_ex_data:
|
||||
profile_ex_data.pop("accessCode")
|
||||
|
||||
sql = insert(profile_ex).values(**profile_ex_data)
|
||||
conflict = sql.on_duplicate_key_update(**profile_ex_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_data_ex: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_data_ex(self, aime_id: int, version: int) -> Optional[Row]:
|
||||
sql = select(profile_ex).where(and_(
|
||||
profile_ex.c.user == aime_id,
|
||||
profile_ex.c.version == version,
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_profile_option(self, aime_id: int, option_data: Dict) -> Optional[int]:
|
||||
option_data["user"] = aime_id
|
||||
|
||||
sql = insert(option).values(**option_data)
|
||||
conflict = sql.on_duplicate_key_update(**option_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_option: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_option(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(option).where(option.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_profile_option_ex(self, aime_id: int, option_ex_data: Dict) -> Optional[int]:
|
||||
option_ex_data["user"] = aime_id
|
||||
|
||||
sql = insert(option_ex).values(**option_ex_data)
|
||||
conflict = sql.on_duplicate_key_update(**option_ex_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_option_ex: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_option_ex(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(option_ex).where(option_ex.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_profile_recent_rating(self, aime_id: int, recent_rating_data: List[Dict]) -> Optional[int]:
|
||||
sql = insert(recent_rating).values(
|
||||
user = aime_id,
|
||||
recentRating = recent_rating_data
|
||||
)
|
||||
conflict = sql.on_duplicate_key_update(recentRating = recent_rating_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_recent_rating: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_recent_rating(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(recent_rating).where(recent_rating.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_profile_activity(self, aime_id: int, activity_data: Dict) -> Optional[int]:
|
||||
# The game just uses "id" but we need to distinguish that from the db column "id"
|
||||
activity_data["user"] = aime_id
|
||||
activity_data["activityId"] = activity_data["id"]
|
||||
activity_data.pop("id")
|
||||
|
||||
sql = insert(activity).values(**activity_data)
|
||||
conflict = sql.on_duplicate_key_update(**activity_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_activity: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_activity(self, aime_id: int, kind: int) -> Optional[List[Row]]:
|
||||
sql = select(activity).where(and_(
|
||||
activity.c.user == aime_id,
|
||||
activity.c.kind == kind
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_profile_charge(self, aime_id: int, charge_data: Dict) -> Optional[int]:
|
||||
charge_data["user"] = aime_id
|
||||
|
||||
sql = insert(charge).values(**charge_data)
|
||||
conflict = sql.on_duplicate_key_update(**charge_data)
|
||||
result = self.execute(conflict)
|
||||
|
||||
if result is None:
|
||||
self.logger.warn(f"put_profile_charge: Failed to update! aime_id: {aime_id}")
|
||||
return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_charge(self, aime_id: int) -> Optional[List[Row]]:
|
||||
sql = select(charge).where(charge.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def add_profile_region(self, aime_id: int, region_id: int) -> Optional[int]:
|
||||
pass
|
||||
|
||||
def get_profile_regions(self, aime_id: int) -> Optional[List[Row]]:
|
||||
pass
|
||||
|
||||
def put_profile_emoney(self, aime_id: int, emoney_data: Dict) -> Optional[int]:
|
||||
emoney_data["user"] = aime_id
|
||||
|
||||
sql = insert(emoney).values(**emoney_data)
|
||||
conflict = sql.on_duplicate_key_update(**emoney_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_emoney(self, aime_id: int) -> Optional[List[Row]]:
|
||||
sql = select(emoney).where(emoney.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_profile_overpower(self, aime_id: int, overpower_data: Dict) -> Optional[int]:
|
||||
overpower_data["user"] = aime_id
|
||||
|
||||
sql = insert(overpower).values(**overpower_data)
|
||||
conflict = sql.on_duplicate_key_update(**overpower_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_profile_overpower(self, aime_id: int) -> Optional[List[Row]]:
|
||||
sql = select(overpower).where(overpower.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
178
titles/chuni/schema/score.py
Normal file
178
titles/chuni/schema/score.py
Normal file
@ -0,0 +1,178 @@
|
||||
from typing import Dict, List, Optional
|
||||
from sqlalchemy import Table, Column, UniqueConstraint, PrimaryKeyConstraint, and_
|
||||
from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, BigInteger
|
||||
from sqlalchemy.engine.base import Connection
|
||||
from sqlalchemy.schema import ForeignKey
|
||||
from sqlalchemy.engine import Row
|
||||
from sqlalchemy.sql import func, select
|
||||
from sqlalchemy.dialects.mysql import insert
|
||||
|
||||
from core.data.schema import BaseData, metadata
|
||||
|
||||
course = Table(
|
||||
"chuni_score_course",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("courseId", Integer),
|
||||
Column("classId", Integer),
|
||||
Column("playCount", Integer),
|
||||
Column("scoreMax", Integer),
|
||||
Column("isFullCombo", Boolean),
|
||||
Column("isAllJustice", Boolean),
|
||||
Column("isSuccess", Boolean),
|
||||
Column("scoreRank", Integer),
|
||||
Column("eventId", Integer),
|
||||
Column("lastPlayDate", String(25)),
|
||||
Column("param1", Integer),
|
||||
Column("param2", Integer),
|
||||
Column("param3", Integer),
|
||||
Column("param4", Integer),
|
||||
Column("isClear", Boolean),
|
||||
UniqueConstraint("user", "courseId", name="chuni_score_course_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
best_score = Table(
|
||||
"chuni_score_best",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("musicId", Integer),
|
||||
Column("level", Integer),
|
||||
Column("playCount", Integer),
|
||||
Column("scoreMax", Integer),
|
||||
Column("resRequestCount", Integer),
|
||||
Column("resAcceptCount", Integer),
|
||||
Column("resSuccessCount", Integer),
|
||||
Column("missCount", Integer),
|
||||
Column("maxComboCount", Integer),
|
||||
Column("isFullCombo", Boolean),
|
||||
Column("isAllJustice", Boolean),
|
||||
Column("isSuccess", Boolean),
|
||||
Column("fullChain", Integer),
|
||||
Column("maxChain", Integer),
|
||||
Column("scoreRank", Integer),
|
||||
Column("isLock", Boolean),
|
||||
Column("ext1", Integer),
|
||||
Column("theoryCount", Integer),
|
||||
UniqueConstraint("user", "musicId", "level", name="chuni_score_best_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
playlog = Table(
|
||||
"chuni_score_playlog",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("user", ForeignKey("aime_user.id", ondelete="cascade", onupdate="cascade"), nullable=False),
|
||||
Column("orderId", Integer),
|
||||
Column("sortNumber", Integer),
|
||||
Column("placeId", Integer),
|
||||
Column("playDate", String(20)),
|
||||
Column("userPlayDate", String(20)),
|
||||
Column("musicId", Integer),
|
||||
Column("level", Integer),
|
||||
Column("customId", Integer),
|
||||
Column("playedUserId1", Integer),
|
||||
Column("playedUserId2", Integer),
|
||||
Column("playedUserId3", Integer),
|
||||
Column("playedUserName1", String(20)),
|
||||
Column("playedUserName2", String(20)),
|
||||
Column("playedUserName3", String(20)),
|
||||
Column("playedMusicLevel1", Integer),
|
||||
Column("playedMusicLevel2", Integer),
|
||||
Column("playedMusicLevel3", Integer),
|
||||
Column("playedCustom1", Integer),
|
||||
Column("playedCustom2", Integer),
|
||||
Column("playedCustom3", Integer),
|
||||
Column("track", Integer),
|
||||
Column("score", Integer),
|
||||
Column("rank", Integer),
|
||||
Column("maxCombo", Integer),
|
||||
Column("maxChain", Integer),
|
||||
Column("rateTap", Integer),
|
||||
Column("rateHold", Integer),
|
||||
Column("rateSlide", Integer),
|
||||
Column("rateAir", Integer),
|
||||
Column("rateFlick", Integer),
|
||||
Column("judgeGuilty", Integer),
|
||||
Column("judgeAttack", Integer),
|
||||
Column("judgeJustice", Integer),
|
||||
Column("judgeCritical", Integer),
|
||||
Column("eventId", Integer),
|
||||
Column("playerRating", Integer),
|
||||
Column("isNewRecord", Boolean),
|
||||
Column("isFullCombo", Boolean),
|
||||
Column("fullChainKind", Integer),
|
||||
Column("isAllJustice", Boolean),
|
||||
Column("isContinue", Boolean),
|
||||
Column("isFreeToPlay", Boolean),
|
||||
Column("characterId", Integer),
|
||||
Column("skillId", Integer),
|
||||
Column("playKind", Integer),
|
||||
Column("isClear", Boolean),
|
||||
Column("skillLevel", Integer),
|
||||
Column("skillEffect", Integer),
|
||||
Column("placeName", String(255)),
|
||||
Column("isMaimai", Boolean),
|
||||
Column("commonId", Integer),
|
||||
Column("charaIllustId", Integer),
|
||||
Column("romVersion", String(255)),
|
||||
Column("judgeHeaven", Integer),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
class ChuniScoreData(BaseData):
|
||||
def get_courses(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(course).where(course.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_course(self, aime_id: int, course_data: Dict) -> Optional[int]:
|
||||
course_data["user"] = aime_id
|
||||
course_data = self.fix_bools(course_data)
|
||||
|
||||
sql = insert(course).values(**course_data)
|
||||
conflict = sql.on_duplicate_key_update(**course_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_scores(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(best_score).where(best_score.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_score(self, aime_id: int, score_data: Dict) -> Optional[int]:
|
||||
score_data["user"] = aime_id
|
||||
score_data = self.fix_bools(score_data)
|
||||
|
||||
sql = insert(best_score).values(**score_data)
|
||||
conflict = sql.on_duplicate_key_update(**score_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_playlogs(self, aime_id: int) -> Optional[Row]:
|
||||
sql = select(playlog).where(playlog.c.user == aime_id)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_playlog(self, aime_id: int, playlog_data: Dict) -> Optional[int]:
|
||||
playlog_data["user"] = aime_id
|
||||
playlog_data = self.fix_bools(playlog_data)
|
||||
|
||||
sql = insert(playlog).values(**playlog_data)
|
||||
conflict = sql.on_duplicate_key_update(**playlog_data)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
223
titles/chuni/schema/static.py
Normal file
223
titles/chuni/schema/static.py
Normal file
@ -0,0 +1,223 @@
|
||||
from typing import Dict, List, Optional
|
||||
from sqlalchemy import Table, Column, UniqueConstraint, PrimaryKeyConstraint, and_
|
||||
from sqlalchemy.types import Integer, String, TIMESTAMP, Boolean, JSON, Float
|
||||
from sqlalchemy.engine.base import Connection
|
||||
from sqlalchemy.engine import Row
|
||||
from sqlalchemy.schema import ForeignKey
|
||||
from sqlalchemy.sql import func, select
|
||||
from sqlalchemy.dialects.mysql import insert
|
||||
|
||||
from core.data.schema import BaseData, metadata
|
||||
|
||||
events = Table(
|
||||
"chuni_static_events",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("eventId", Integer),
|
||||
Column("type", Integer),
|
||||
Column("name", String(255)),
|
||||
Column("enabled", Boolean, server_default="1"),
|
||||
UniqueConstraint("version", "eventId", name="chuni_static_events_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
music = Table(
|
||||
"chuni_static_music",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("songId", Integer),
|
||||
Column("chartId", Integer),
|
||||
Column("title", String(255)),
|
||||
Column("artist", String(255)),
|
||||
Column("level", Float),
|
||||
Column("genre", String(255)),
|
||||
Column("jacketPath", String(255)),
|
||||
Column("worldsEndTag", String(20)),
|
||||
UniqueConstraint("version", "songId", "chartId", name="chuni_static_music_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
charge = Table(
|
||||
"chuni_static_charge",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("chargeId", Integer),
|
||||
Column("name", String(255)),
|
||||
Column("expirationDays", Integer),
|
||||
Column("consumeType", Integer),
|
||||
Column("sellingAppeal", Boolean),
|
||||
Column("enabled", Boolean, server_default="1"),
|
||||
UniqueConstraint("version", "chargeId", name="chuni_static_charge_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
avatar = Table(
|
||||
"chuni_static_avatar",
|
||||
metadata,
|
||||
Column("id", Integer, primary_key=True, nullable=False),
|
||||
Column("version", Integer, nullable=False),
|
||||
Column("avatarAccessoryId", Integer),
|
||||
Column("name", String(255)),
|
||||
Column("category", Integer),
|
||||
Column("iconPath", String(255)),
|
||||
Column("texturePath", String(255)),
|
||||
UniqueConstraint("version", "avatarAccessoryId", name="chuni_static_avatar_uk"),
|
||||
mysql_charset='utf8mb4'
|
||||
)
|
||||
|
||||
class ChuniStaticData(BaseData):
|
||||
def put_event(self, version: int, event_id: int, type: int, name: str) -> Optional[int]:
|
||||
sql = insert(events).values(
|
||||
version = version,
|
||||
eventId = event_id,
|
||||
type = type,
|
||||
name = name
|
||||
)
|
||||
|
||||
conflict = sql.on_duplicate_key_update(
|
||||
name = name
|
||||
)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def update_event(self, version: int, event_id: int, enabled: bool) -> Optional[bool]:
|
||||
sql = events.update(and_(events.c.version == version, events.c.eventId == event_id)).values(
|
||||
enabled = enabled
|
||||
)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None:
|
||||
self.logger.warn(f"update_event: failed to update event! version: {version}, event_id: {event_id}, enabled: {enabled}")
|
||||
return None
|
||||
|
||||
event = self.get_event(version, event_id)
|
||||
if event is None:
|
||||
self.logger.warn(f"update_event: failed to fetch event {event_id} after updating")
|
||||
return None
|
||||
return event["enabled"]
|
||||
|
||||
def get_event(self, version: int, event_id: int) -> Optional[Row]:
|
||||
sql = select(events).where(and_(events.c.version == version, events.c.eventId == event_id))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def get_enabled_events(self, version: int) -> Optional[List[Row]]:
|
||||
sql = select(events).where(and_(events.c.version == version, events.c.enabled == True))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def get_events(self, version: int) -> Optional[List[Row]]:
|
||||
sql = select(events).where(events.c.version == version)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def put_music(self, version: int, song_id: int, chart_id: int, title: int, artist: str,
|
||||
level: float, genre: str, jacketPath: str, we_tag: str) -> Optional[int]:
|
||||
|
||||
sql = insert(music).values(
|
||||
version = version,
|
||||
songId = song_id,
|
||||
chartId = chart_id,
|
||||
title = title,
|
||||
artist = artist,
|
||||
level = level,
|
||||
genre = genre,
|
||||
jacketPath = jacketPath,
|
||||
worldsEndTag = we_tag,
|
||||
)
|
||||
|
||||
conflict = sql.on_duplicate_key_update(
|
||||
title = title,
|
||||
artist = artist,
|
||||
level = level,
|
||||
genre = genre,
|
||||
jacketPath = jacketPath,
|
||||
worldsEndTag = we_tag,
|
||||
)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def put_charge(self, version: int, charge_id: int, name: str, expiration_days: int,
|
||||
consume_type: int, selling_appeal: bool) -> Optional[int]:
|
||||
sql = insert(charge).values(
|
||||
version = version,
|
||||
chargeId = charge_id,
|
||||
name = name,
|
||||
expirationDays = expiration_days,
|
||||
consumeType = consume_type,
|
||||
sellingAppeal = selling_appeal,
|
||||
)
|
||||
|
||||
conflict = sql.on_duplicate_key_update(
|
||||
name = name,
|
||||
expirationDays = expiration_days,
|
||||
consumeType = consume_type,
|
||||
sellingAppeal = selling_appeal,
|
||||
)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
||||
def get_enabled_charges(self, version: int) -> Optional[List[Row]]:
|
||||
sql = select(charge).where(and_(
|
||||
charge.c.version == version,
|
||||
charge.c.enabled == True
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def get_charges(self, version: int) -> Optional[List[Row]]:
|
||||
sql = select(charge).where(charge.c.version == version)
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchall()
|
||||
|
||||
def get_music_chart(self, version: int, song_id: int, chart_id: int) -> Optional[List[Row]]:
|
||||
sql = select(music).where(and_(
|
||||
music.c.version == version,
|
||||
music.c.songId == song_id,
|
||||
music.c.chartId == chart_id
|
||||
))
|
||||
|
||||
result = self.execute(sql)
|
||||
if result is None: return None
|
||||
return result.fetchone()
|
||||
|
||||
def put_avatar(self, version: int, avatarAccessoryId: int, name: str, category: int, iconPath: str, texturePath: str) -> Optional[int]:
|
||||
sql = insert(avatar).values(
|
||||
version = version,
|
||||
avatarAccessoryId = avatarAccessoryId,
|
||||
name = name,
|
||||
category = category,
|
||||
iconPath = iconPath,
|
||||
texturePath = texturePath,
|
||||
)
|
||||
|
||||
conflict = sql.on_duplicate_key_update(
|
||||
name = name,
|
||||
category = category,
|
||||
iconPath = iconPath,
|
||||
texturePath = texturePath,
|
||||
)
|
||||
|
||||
result = self.execute(conflict)
|
||||
if result is None: return None
|
||||
return result.lastrowid
|
||||
|
16
titles/chuni/star.py
Normal file
16
titles/chuni/star.py
Normal file
@ -0,0 +1,16 @@
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniStar(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_STAR
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.20.00"
|
||||
return ret
|
16
titles/chuni/starplus.py
Normal file
16
titles/chuni/starplus.py
Normal file
@ -0,0 +1,16 @@
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.chuni.base import ChuniBase
|
||||
from titles.chuni.const import ChuniConstants
|
||||
from titles.chuni.config import ChuniConfig
|
||||
|
||||
class ChuniStarPlus(ChuniBase):
|
||||
def __init__(self, core_cfg: CoreConfig, game_cfg: ChuniConfig) -> None:
|
||||
super().__init__(core_cfg, game_cfg)
|
||||
self.version = ChuniConstants.VER_CHUNITHM_STAR_PLUS
|
||||
|
||||
def handle_get_game_setting_api_request(self, data: Dict) -> Dict:
|
||||
ret = super().handle_get_game_setting_api_request(data)
|
||||
ret["gameSetting"]["dataVersion"] = "1.25.00"
|
||||
return ret
|
21
titles/cxb/__init__.py
Normal file
21
titles/cxb/__init__.py
Normal file
@ -0,0 +1,21 @@
|
||||
from titles.cxb.index import CxbServlet
|
||||
from titles.cxb.const import CxbConstants
|
||||
from titles.cxb.database import CxbData
|
||||
from titles.cxb.read import CxbReader
|
||||
|
||||
index = CxbServlet
|
||||
database = CxbData
|
||||
reader = CxbReader
|
||||
|
||||
use_default_title = False
|
||||
include_protocol = True
|
||||
title_secure = True
|
||||
game_codes = [CxbConstants.GAME_CODE]
|
||||
trailing_slash = True
|
||||
use_default_host = False
|
||||
|
||||
include_port = True
|
||||
uri = "http://$h:$p/" # If you care about the allnet response you're probably running with no SSL
|
||||
host = ""
|
||||
|
||||
current_schema_version = 1
|
426
titles/cxb/base.py
Normal file
426
titles/cxb/base.py
Normal file
@ -0,0 +1,426 @@
|
||||
import logging
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from base64 import b64encode
|
||||
from typing import Any, Dict
|
||||
from hashlib import md5
|
||||
from datetime import datetime
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.cxb.config import CxbConfig
|
||||
from titles.cxb.const import CxbConstants
|
||||
from titles.cxb.database import CxbData
|
||||
|
||||
class CxbBase():
|
||||
def __init__(self, cfg: CoreConfig, game_cfg: CxbConfig) -> None:
|
||||
self.config = cfg # Config file
|
||||
self.game_config = game_cfg
|
||||
self.data = CxbData(cfg) # Database
|
||||
self.game = CxbConstants.GAME_CODE
|
||||
self.logger = logging.getLogger("cxb")
|
||||
self.version = CxbConstants.VER_CROSSBEATS_REV
|
||||
|
||||
def handle_action_rpreq_request(self, data: Dict) -> Dict:
|
||||
return({})
|
||||
|
||||
def handle_action_hitreq_request(self, data: Dict) -> Dict:
|
||||
return({"data":[]})
|
||||
|
||||
def handle_auth_usercheck_request(self, data: Dict) -> Dict:
|
||||
profile = self.data.profile.get_profile_index(0, data["usercheck"]["authid"], self.version)
|
||||
if profile is not None:
|
||||
self.logger.info(f"User {data['usercheck']['authid']} has CXB profile")
|
||||
return({"exist": "true", "logout": "true"})
|
||||
|
||||
self.logger.info(f"No profile for aime id {data['usercheck']['authid']}")
|
||||
return({"exist": "false", "logout": "true"})
|
||||
|
||||
def handle_auth_entry_request(self, data: Dict) -> Dict:
|
||||
self.logger.info(f"New profile for {data['entry']['authid']}")
|
||||
return({"token": data["entry"]["authid"], "uid": data["entry"]["authid"]})
|
||||
|
||||
def handle_auth_login_request(self, data: Dict) -> Dict:
|
||||
profile = self.data.profile.get_profile_index(0, data["login"]["authid"], self.version)
|
||||
|
||||
if profile is not None:
|
||||
self.logger.info(f"Login user {data['login']['authid']}")
|
||||
return({"token": data["login"]["authid"], "uid": data["login"]["authid"]})
|
||||
|
||||
self.logger.warn(f"User {data['login']['authid']} does not have a profile")
|
||||
return({})
|
||||
|
||||
def handle_action_loadrange_request(self, data: Dict) -> Dict:
|
||||
range_start = data['loadrange']['range'][0]
|
||||
range_end = data['loadrange']['range'][1]
|
||||
uid = data['loadrange']['uid']
|
||||
|
||||
self.logger.info(f"Load data for {uid}")
|
||||
profile = self.data.profile.get_profile(uid, self.version)
|
||||
songs = self.data.score.get_best_scores(uid)
|
||||
|
||||
data1 = []
|
||||
index = []
|
||||
versionindex = []
|
||||
|
||||
for profile_index in profile:
|
||||
profile_data = profile_index["data"]
|
||||
|
||||
if int(range_start) == 800000:
|
||||
return({"index":range_start, "data":[], "version":10400})
|
||||
|
||||
if not ( int(range_start) <= int(profile_index[3]) <= int(range_end) ):
|
||||
continue
|
||||
#Prevent loading of the coupons within the profile to use the force unlock instead
|
||||
elif 500 <= int(profile_index[3]) <= 510:
|
||||
continue
|
||||
#Prevent loading of songs saved in the profile
|
||||
elif 100000 <= int(profile_index[3]) <= 110000:
|
||||
continue
|
||||
#Prevent loading of the shop list / unlocked titles & icons saved in the profile
|
||||
elif 200000 <= int(profile_index[3]) <= 210000:
|
||||
continue
|
||||
#Prevent loading of stories in the profile
|
||||
elif 900000 <= int(profile_index[3]) <= 900200:
|
||||
continue
|
||||
else:
|
||||
index.append(profile_index[3])
|
||||
data1.append(b64encode(bytes(json.dumps(profile_data, separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
'''
|
||||
100000 = Songs
|
||||
200000 = Shop
|
||||
300000 = Courses
|
||||
400000 = Events
|
||||
500000 = Challenges
|
||||
600000 = Bonuses
|
||||
700000 = rcLog
|
||||
800000 = Partners
|
||||
900000 = Stories
|
||||
'''
|
||||
|
||||
# Coupons
|
||||
for i in range(500,510):
|
||||
index.append(str(i))
|
||||
couponid = int(i) - 500
|
||||
dataValue = [{
|
||||
"couponId":str(couponid),
|
||||
"couponNum":"1",
|
||||
"couponLog":[],
|
||||
}]
|
||||
data1.append(b64encode(bytes(json.dumps(dataValue[0], separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
|
||||
# ShopList_Title
|
||||
for i in range(200000,201451):
|
||||
index.append(str(i))
|
||||
shopid = int(i) - 200000
|
||||
dataValue = [{
|
||||
"shopId":shopid,
|
||||
"shopState":"2",
|
||||
"isDisable":"t",
|
||||
"isDeleted":"f",
|
||||
"isSpecialFlag":"f"
|
||||
}]
|
||||
data1.append(b64encode(bytes(json.dumps(dataValue[0], separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
#ShopList_Icon
|
||||
for i in range(202000,202264):
|
||||
index.append(str(i))
|
||||
shopid = int(i) - 200000
|
||||
dataValue = [{
|
||||
"shopId":shopid,
|
||||
"shopState":"2",
|
||||
"isDisable":"t",
|
||||
"isDeleted":"f",
|
||||
"isSpecialFlag":"f"
|
||||
}]
|
||||
data1.append(b64encode(bytes(json.dumps(dataValue[0], separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
#Stories
|
||||
for i in range(900000,900003):
|
||||
index.append(str(i))
|
||||
storyid = int(i) - 900000
|
||||
dataValue = [{
|
||||
"storyId":storyid,
|
||||
"unlockState1":["t"] * 10,
|
||||
"unlockState2":["t"] * 10,
|
||||
"unlockState3":["t"] * 10,
|
||||
"unlockState4":["t"] * 10,
|
||||
"unlockState5":["t"] * 10,
|
||||
"unlockState6":["t"] * 10,
|
||||
"unlockState7":["t"] * 10,
|
||||
"unlockState8":["t"] * 10,
|
||||
"unlockState9":["t"] * 10,
|
||||
"unlockState10":["t"] * 10,
|
||||
"unlockState11":["t"] * 10,
|
||||
"unlockState12":["t"] * 10,
|
||||
"unlockState13":["t"] * 10,
|
||||
"unlockState14":["t"] * 10,
|
||||
"unlockState15":["t"] * 10,
|
||||
"unlockState16":["t"] * 10
|
||||
}]
|
||||
data1.append(b64encode(bytes(json.dumps(dataValue[0], separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
for song in songs:
|
||||
song_data = song["data"]
|
||||
songCode = []
|
||||
|
||||
songCode.append({
|
||||
"mcode": song_data['mcode'],
|
||||
"musicState": song_data['musicState'],
|
||||
"playCount": song_data['playCount'],
|
||||
"totalScore": song_data['totalScore'],
|
||||
"highScore": song_data['highScore'],
|
||||
"everHighScore": song_data['everHighScore'] if 'everHighScore' in song_data else ["0","0","0","0","0"],
|
||||
"clearRate": song_data['clearRate'],
|
||||
"rankPoint": song_data['rankPoint'],
|
||||
"normalCR": song_data['normalCR'] if 'normalCR' in song_data else ["0","0","0","0","0"],
|
||||
"survivalCR": song_data['survivalCR'] if 'survivalCR' in song_data else ["0","0","0","0","0"],
|
||||
"ultimateCR": song_data['ultimateCR'] if 'ultimateCR' in song_data else ["0","0","0","0","0"],
|
||||
"nohopeCR": song_data['nohopeCR'] if 'nohopeCR' in song_data else ["0","0","0","0","0"],
|
||||
"combo": song_data['combo'],
|
||||
"coupleUserId": song_data['coupleUserId'],
|
||||
"difficulty": song_data['difficulty'],
|
||||
"isFullCombo": song_data['isFullCombo'],
|
||||
"clearGaugeType": song_data['clearGaugeType'],
|
||||
"fieldType": song_data['fieldType'],
|
||||
"gameType": song_data['gameType'],
|
||||
"grade": song_data['grade'],
|
||||
"unlockState": song_data['unlockState'],
|
||||
"extraState": song_data['extraState']
|
||||
})
|
||||
index.append(song_data['index'])
|
||||
data1.append(b64encode(bytes(json.dumps(songCode[0], separators=(',', ':')), 'utf-8')).decode('utf-8'))
|
||||
|
||||
for v in index:
|
||||
try:
|
||||
v_profile = self.data.profile.get_profile_index(0, uid, self.version)
|
||||
v_profile_data = v_profile["data"]
|
||||
versionindex.append(int(v_profile_data["appVersion"]))
|
||||
except:
|
||||
versionindex.append('10400')
|
||||
|
||||
return({"index":index, "data":data1, "version":versionindex})
|
||||
|
||||
def handle_action_saveindex_request(self, data: Dict) -> Dict:
|
||||
save_data = data['saveindex']
|
||||
|
||||
try:
|
||||
#REV Omnimix Version Fetcher
|
||||
gameversion = data['saveindex']['data'][0][2]
|
||||
self.logger.warning(f"Game Version is {gameversion}")
|
||||
except:
|
||||
pass
|
||||
|
||||
if "10205" in gameversion:
|
||||
self.logger.info(f"Saving CrossBeats REV profile for {data['saveindex']['uid']}")
|
||||
#Alright.... time to bring the jank code
|
||||
|
||||
for value in data['saveindex']['data']:
|
||||
|
||||
if 'playedUserId' in value[1]:
|
||||
self.data.profile.put_profile(data['saveindex']['uid'], self.version, value[0], value[1])
|
||||
if 'mcode' not in value[1]:
|
||||
self.data.profile.put_profile(data['saveindex']['uid'], self.version, value[0], value[1])
|
||||
if 'shopId' in value:
|
||||
continue
|
||||
if 'mcode' in value[1] and 'musicState' in value[1]:
|
||||
song_json = json.loads(value[1])
|
||||
|
||||
songCode = []
|
||||
songCode.append({
|
||||
"mcode": song_json['mcode'],
|
||||
"musicState": song_json['musicState'],
|
||||
"playCount": song_json['playCount'],
|
||||
"totalScore": song_json['totalScore'],
|
||||
"highScore": song_json['highScore'],
|
||||
"clearRate": song_json['clearRate'],
|
||||
"rankPoint": song_json['rankPoint'],
|
||||
"combo": song_json['combo'],
|
||||
"coupleUserId": song_json['coupleUserId'],
|
||||
"difficulty": song_json['difficulty'],
|
||||
"isFullCombo": song_json['isFullCombo'],
|
||||
"clearGaugeType": song_json['clearGaugeType'],
|
||||
"fieldType": song_json['fieldType'],
|
||||
"gameType": song_json['gameType'],
|
||||
"grade": song_json['grade'],
|
||||
"unlockState": song_json['unlockState'],
|
||||
"extraState": song_json['extraState'],
|
||||
"index": value[0]
|
||||
})
|
||||
self.data.score.put_best_score(data['saveindex']['uid'], song_json['mcode'], self.version, value[0], songCode[0])
|
||||
return({})
|
||||
else:
|
||||
self.logger.info(f"Saving CrossBeats REV Sunrise profile for {data['saveindex']['uid']}")
|
||||
|
||||
#Sunrise
|
||||
try:
|
||||
profileIndex = save_data['index'].index('0')
|
||||
except:
|
||||
return({"data":""}) #Maybe
|
||||
|
||||
profile = json.loads(save_data["data"][profileIndex])
|
||||
aimeId = profile["aimeId"]
|
||||
i = 0
|
||||
|
||||
for index, value in enumerate(data["saveindex"]["data"]):
|
||||
if int(data["saveindex"]["index"][index]) == 101:
|
||||
self.data.profile.put_profile(aimeId, self.version, data["saveindex"]["index"][index], value)
|
||||
if int(data["saveindex"]["index"][index]) >= 700000 and int(data["saveindex"]["index"][index])<= 701000:
|
||||
self.data.profile.put_profile(aimeId, self.version, data["saveindex"]["index"][index], value)
|
||||
if int(data["saveindex"]["index"][index]) >= 500 and int(data["saveindex"]["index"][index]) <= 510:
|
||||
self.data.profile.put_profile(aimeId, self.version, data["saveindex"]["index"][index], value)
|
||||
if 'playedUserId' in value:
|
||||
self.data.profile.put_profile(aimeId, self.version, data["saveindex"]["index"][index], json.loads(value))
|
||||
if 'mcode' not in value and "normalCR" not in value:
|
||||
self.data.profile.put_profile(aimeId, self.version, data["saveindex"]["index"][index], json.loads(value))
|
||||
if 'shopId' in value:
|
||||
continue
|
||||
|
||||
# MusicList Index for the profile
|
||||
indexSongList = []
|
||||
for value in data["saveindex"]["index"]:
|
||||
if int(value) in range(100000,110000):
|
||||
indexSongList.append(value)
|
||||
|
||||
for index, value in enumerate(data["saveindex"]["data"]):
|
||||
if 'mcode' not in value:
|
||||
continue
|
||||
if 'playedUserId' in value:
|
||||
continue
|
||||
|
||||
data1 = json.loads(value)
|
||||
|
||||
songCode = []
|
||||
songCode.append({
|
||||
"mcode": data1['mcode'],
|
||||
"musicState": data1['musicState'],
|
||||
"playCount": data1['playCount'],
|
||||
"totalScore": data1['totalScore'],
|
||||
"highScore": data1['highScore'],
|
||||
"everHighScore": data1['everHighScore'],
|
||||
"clearRate": data1['clearRate'],
|
||||
"rankPoint": data1['rankPoint'],
|
||||
"normalCR": data1['normalCR'],
|
||||
"survivalCR": data1['survivalCR'],
|
||||
"ultimateCR": data1['ultimateCR'],
|
||||
"nohopeCR": data1['nohopeCR'],
|
||||
"combo": data1['combo'],
|
||||
"coupleUserId": data1['coupleUserId'],
|
||||
"difficulty": data1['difficulty'],
|
||||
"isFullCombo": data1['isFullCombo'],
|
||||
"clearGaugeType": data1['clearGaugeType'],
|
||||
"fieldType": data1['fieldType'],
|
||||
"gameType": data1['gameType'],
|
||||
"grade": data1['grade'],
|
||||
"unlockState": data1['unlockState'],
|
||||
"extraState": data1['extraState'],
|
||||
"index": indexSongList[i]
|
||||
})
|
||||
|
||||
self.data.score.put_best_score(aimeId, data1['mcode'], self.version, indexSongList[i], songCode[0])
|
||||
i += 1
|
||||
return({})
|
||||
|
||||
def handle_action_sprankreq_request(self, data: Dict) -> Dict:
|
||||
uid = data['sprankreq']['uid']
|
||||
self.logger.info(f"Get best rankings for {uid}")
|
||||
p = self.data.score.get_best_rankings(uid)
|
||||
|
||||
rankList: list[Dict[str, Any]] = []
|
||||
|
||||
for rank in p:
|
||||
if rank["song_id"] is not None:
|
||||
rankList.append({
|
||||
"sc": [rank["score"],rank["song_id"]],
|
||||
"rid": rank["rev_id"],
|
||||
"clear": rank["clear"]
|
||||
})
|
||||
else:
|
||||
rankList.append({
|
||||
"sc": [rank["score"]],
|
||||
"rid": rank["rev_id"],
|
||||
"clear": rank["clear"]
|
||||
})
|
||||
|
||||
return({
|
||||
"uid": data["sprankreq"]["uid"],
|
||||
"aid": data["sprankreq"]["aid"],
|
||||
"rank": rankList,
|
||||
"rankx":[1,1,1]
|
||||
})
|
||||
|
||||
def handle_action_getadv_request(self, data: Dict) -> Dict:
|
||||
return({"data":[{"r":"1","i":"100300","c":"20"}]})
|
||||
|
||||
def handle_action_getmsg_request(self, data: Dict) -> Dict:
|
||||
return({"msgs":[]})
|
||||
|
||||
def handle_auth_logout_request(self, data: Dict) -> Dict:
|
||||
return({"auth":True})
|
||||
|
||||
def handle_action_rankreg_request(self, data: Dict) -> Dict:
|
||||
uid = data['rankreg']['uid']
|
||||
self.logger.info(f"Put {len(data['rankreg']['data'])} rankings for {uid}")
|
||||
|
||||
for rid in data['rankreg']['data']:
|
||||
#REV S2
|
||||
if "clear" in rid:
|
||||
try:
|
||||
self.data.score.put_ranking(user_id=uid, rev_id=int(rid["rid"]), song_id=int(rid["sc"][1]), score=int(rid["sc"][0]), clear=rid["clear"])
|
||||
except:
|
||||
self.data.score.put_ranking(user_id=uid, rev_id=int(rid["rid"]), song_id=0, score=int(rid["sc"][0]), clear=rid["clear"])
|
||||
#REV
|
||||
else:
|
||||
try:
|
||||
self.data.score.put_ranking(user_id=uid, rev_id=int(rid["rid"]), song_id=int(rid["sc"][1]), score=int(rid["sc"][0]), clear=0)
|
||||
except:
|
||||
self.data.score.put_ranking(user_id=uid, rev_id=int(rid["rid"]), song_id=0, score=int(rid["sc"][0]), clear=0)
|
||||
return({})
|
||||
|
||||
def handle_action_addenergy_request(self, data: Dict) -> Dict:
|
||||
uid = data['addenergy']['uid']
|
||||
self.logger.info(f"Add energy to user {uid}")
|
||||
profile = self.data.profile.get_profile_index(0, uid, self.version)
|
||||
data1 = profile["data"]
|
||||
p = self.data.item.get_energy(uid)
|
||||
energy = p["energy"]
|
||||
|
||||
if not p:
|
||||
self.data.item.put_energy(uid, 5)
|
||||
|
||||
return({
|
||||
"class": data1["myClass"],
|
||||
"granted": "5",
|
||||
"total": "5",
|
||||
"threshold": "1000"
|
||||
})
|
||||
|
||||
array = []
|
||||
|
||||
newenergy = int(energy) + 5
|
||||
self.data.item.put_energy(uid, newenergy)
|
||||
|
||||
if int(energy) <= 995:
|
||||
array.append({
|
||||
"class": data1["myClass"],
|
||||
"granted": "5",
|
||||
"total": str(energy),
|
||||
"threshold": "1000"
|
||||
})
|
||||
else:
|
||||
array.append({
|
||||
"class": data1["myClass"],
|
||||
"granted": "0",
|
||||
"total": str(energy),
|
||||
"threshold": "1000"
|
||||
})
|
||||
return array[0]
|
||||
|
||||
def handle_action_eventreq_request(self, data: Dict) -> Dict:
|
||||
self.logger.info(data)
|
||||
return {"eventreq": ""}
|
||||
|
||||
def handle_action_stampreq_request(self, data: Dict) -> Dict:
|
||||
self.logger.info(data)
|
||||
return {"stampreq": ""}
|
41
titles/cxb/config.py
Normal file
41
titles/cxb/config.py
Normal file
@ -0,0 +1,41 @@
|
||||
from core.config import CoreConfig
|
||||
|
||||
class CxbServerConfig():
|
||||
def __init__(self, parent_config: "CxbConfig"):
|
||||
self.__config = parent_config
|
||||
|
||||
@property
|
||||
def enable(self) -> bool:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'enable', default=True)
|
||||
|
||||
@property
|
||||
def loglevel(self) -> int:
|
||||
return CoreConfig.str_to_loglevel(CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'loglevel', default="info"))
|
||||
|
||||
@property
|
||||
def hostname(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'hostname', default="localhost")
|
||||
|
||||
@property
|
||||
def ssl_enable(self) -> bool:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'ssl_enable', default=False)
|
||||
|
||||
@property
|
||||
def port(self) -> int:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'port', default=8082)
|
||||
|
||||
@property
|
||||
def port_secure(self) -> int:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'port_secure', default=443)
|
||||
|
||||
@property
|
||||
def ssl_cert(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'ssl_cert', default="cert/title.crt")
|
||||
|
||||
@property
|
||||
def ssl_key(self) -> str:
|
||||
return CoreConfig.get_config_field(self.__config, 'cxb', 'server', 'ssl_key', default="cert/title.key")
|
||||
|
||||
class CxbConfig(dict):
|
||||
def __init__(self) -> None:
|
||||
self.server = CxbServerConfig(self)
|
15
titles/cxb/const.py
Normal file
15
titles/cxb/const.py
Normal file
@ -0,0 +1,15 @@
|
||||
class CxbConstants():
|
||||
GAME_CODE = "SDCA"
|
||||
|
||||
CONFIG_NAME = "cxb.yaml"
|
||||
|
||||
VER_CROSSBEATS_REV = 0
|
||||
VER_CROSSBEATS_REV_SUNRISE_S1 = 1
|
||||
VER_CROSSBEATS_REV_SUNRISE_S2 = 2
|
||||
VER_CROSSBEATS_REV_SUNRISE_S2_OMNI = 3
|
||||
|
||||
VERSION_NAMES = ("crossbeats REV.", "crossbeats REV. SUNRISE", "crossbeats REV. SUNRISE S2", "crossbeats REV. SUNRISE S2 Omnimix")
|
||||
|
||||
@classmethod
|
||||
def game_ver_to_string(cls, ver: int):
|
||||
return cls.VERSION_NAMES[ver]
|
13
titles/cxb/database.py
Normal file
13
titles/cxb/database.py
Normal file
@ -0,0 +1,13 @@
|
||||
|
||||
from core.data import Data
|
||||
from core.config import CoreConfig
|
||||
from titles.cxb.schema import CxbProfileData, CxbScoreData, CxbItemData, CxbStaticData
|
||||
|
||||
class CxbData(Data):
|
||||
def __init__(self, cfg: CoreConfig) -> None:
|
||||
super().__init__(cfg)
|
||||
|
||||
self.profile = CxbProfileData(self.config, self.session)
|
||||
self.score = CxbScoreData(self.config, self.session)
|
||||
self.item = CxbItemData(self.config, self.session)
|
||||
self.static = CxbStaticData(self.config, self.session)
|
145
titles/cxb/index.py
Normal file
145
titles/cxb/index.py
Normal file
@ -0,0 +1,145 @@
|
||||
from twisted.web.http import Request
|
||||
from twisted.web import resource, server
|
||||
from twisted.internet import reactor, endpoints
|
||||
import yaml
|
||||
import json
|
||||
import re
|
||||
import inflection
|
||||
import logging, coloredlogs
|
||||
from logging.handlers import TimedRotatingFileHandler
|
||||
from typing import Dict
|
||||
|
||||
from core.config import CoreConfig
|
||||
from titles.cxb.config import CxbConfig
|
||||
from titles.cxb.const import CxbConstants
|
||||
from titles.cxb.rev import CxbRev
|
||||
from titles.cxb.rss1 import CxbRevSunriseS1
|
||||
from titles.cxb.rss2 import CxbRevSunriseS2
|
||||
|
||||
class CxbServlet(resource.Resource):
|
||||
def __init__(self, core_cfg: CoreConfig, cfg_dir: str) -> None:
|
||||
self.isLeaf = True
|
||||
self.cfg_dir = cfg_dir
|
||||
self.core_cfg = core_cfg
|
||||
self.game_cfg = CxbConfig()
|
||||
self.game_cfg.update(yaml.safe_load(open(f"{cfg_dir}/cxb.yaml")))
|
||||
|
||||
self.logger = logging.getLogger("cxb")
|
||||
log_fmt_str = "[%(asctime)s] CXB | %(levelname)s | %(message)s"
|
||||
log_fmt = logging.Formatter(log_fmt_str)
|
||||
fileHandler = TimedRotatingFileHandler("{0}/{1}.log".format(self.core_cfg.server.log_dir, "cxb"), encoding='utf8',
|
||||
when="d", backupCount=10)
|
||||
|
||||
fileHandler.setFormatter(log_fmt)
|
||||
|
||||
consoleHandler = logging.StreamHandler()
|
||||
consoleHandler.setFormatter(log_fmt)
|
||||
|
||||
self.logger.addHandler(fileHandler)
|
||||
self.logger.addHandler(consoleHandler)
|
||||
|
||||
self.logger.setLevel(self.game_cfg.server.loglevel)
|
||||
coloredlogs.install(level=self.game_cfg.server.loglevel, logger=self.logger, fmt=log_fmt_str)
|
||||
|
||||
self.versions = [
|
||||
CxbRev(core_cfg, self.game_cfg),
|
||||
CxbRevSunriseS1(core_cfg, self.game_cfg),
|
||||
CxbRevSunriseS2(core_cfg, self.game_cfg),
|
||||
]
|
||||
|
||||
def setup(self):
|
||||
if self.game_cfg.server.enable:
|
||||
endpoints.serverFromString(reactor, f"tcp:{self.game_cfg.server.port}:interface={self.core_cfg.server.listen_address}")\
|
||||
.listen(server.Site(CxbServlet(self.core_cfg, self.cfg_dir)))
|
||||
|
||||
if self.core_cfg.server.is_develop and self.game_cfg.server.ssl_enable:
|
||||
endpoints.serverFromString(reactor, f"ssl:{self.game_cfg.server.port_secure}"\
|
||||
f":interface={self.core_cfg.server.listen_address}:privateKey={self.game_cfg.server.ssl_key}:"\
|
||||
f"certKey={self.game_cfg.server.ssl_cert}")\
|
||||
.listen(server.Site(CxbServlet(self.core_cfg, self.cfg_dir)))
|
||||
|
||||
self.logger.info(f"Crossbeats title server ready on port {self.game_cfg.server.port} & {self.game_cfg.server.port_secure}")
|
||||
else:
|
||||
self.logger.info(f"Crossbeats title server ready on port {self.game_cfg.server.port}")
|
||||
|
||||
|
||||
def render_POST(self, request: Request):
|
||||
version = 0
|
||||
internal_ver = 0
|
||||
func_to_find = ""
|
||||
cmd = ""
|
||||
subcmd = ""
|
||||
req_url = request.uri.decode()
|
||||
url_split = req_url.split("/")
|
||||
req_bytes = request.content.getvalue()
|
||||
|
||||
try:
|
||||
req_json: Dict = json.loads(req_bytes)
|
||||
|
||||
except Exception as e:
|
||||
try:
|
||||
req_json: Dict = json.loads(req_bytes.decode().replace('"', '\\"').replace("'", '"'))
|
||||
|
||||
except Exception as f:
|
||||
self.logger.warn(f"Error decoding json: {e} / {f} - {req_url} - {req_bytes}")
|
||||
return b""
|
||||
|
||||
if req_json == {}:
|
||||
self.logger.warn(f"Empty json request to {req_url}")
|
||||
return b""
|
||||
|
||||
cmd = url_split[len(url_split) - 1]
|
||||
subcmd = list(req_json.keys())[0]
|
||||
|
||||
if subcmd == "dldate":
|
||||
if not type(req_json["dldate"]) is dict or "filetype" not in req_json["dldate"]:
|
||||
self.logger.warn(f"Malformed dldate request: {req_url} {req_json}")
|
||||
return b""
|
||||
|
||||
filetype = req_json["dldate"]["filetype"]
|
||||
filetype_split = filetype.split("/")
|
||||
version = int(filetype_split[0])
|
||||
filetype_inflect_split = inflection.underscore(filetype).split("/")
|
||||
|
||||
match = re.match("^([A-Za-z]*)(\d\d\d\d)$", filetype_split[len(filetype_split) - 1])
|
||||
if match:
|
||||
subcmd = f"{inflection.underscore(match.group(1))}xxxx"
|
||||
else:
|
||||
subcmd = f"{filetype_inflect_split[len(filetype_inflect_split) - 1]}"
|
||||
else:
|
||||
filetype = subcmd
|
||||
|
||||
func_to_find = f"handle_{cmd}_{subcmd}_request"
|
||||
|
||||
if version <= 10102:
|
||||
version_string = "Rev"
|
||||
internal_ver = CxbConstants.VER_CROSSBEATS_REV
|
||||
|
||||
elif version == 10113 or version == 10103:
|
||||
version_string = "Rev SunriseS1"
|
||||
internal_ver = CxbConstants.VER_CROSSBEATS_REV_SUNRISE_S1
|
||||
|
||||
elif version >= 10114 or version == 10104:
|
||||
version_string = "Rev SunriseS2"
|
||||
internal_ver = CxbConstants.VER_CROSSBEATS_REV_SUNRISE_S2
|
||||
|
||||
else:
|
||||
version_string = "Base"
|
||||
|
||||
self.logger.info(f"{version_string} Request {req_url} -> {filetype}")
|
||||
self.logger.debug(req_json)
|
||||
|
||||
try:
|
||||
handler = getattr(self.versions[internal_ver], func_to_find)
|
||||
resp = handler(req_json)
|
||||
|
||||
except AttributeError as e:
|
||||
self.logger.warning(f"Unhandled {version_string} request {req_url} - {e}")
|
||||
resp = {}
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error handling {version_string} method {req_url} - {e}")
|
||||
raise
|
||||
|
||||
self.logger.debug(f"{version_string} Response {resp}")
|
||||
return json.dumps(resp, ensure_ascii=False).encode("utf-8")
|
62
titles/cxb/read.py
Normal file
62
titles/cxb/read.py
Normal file
@ -0,0 +1,62 @@
|
||||
from typing import Optional, Dict, List
|
||||
from os import walk, path
|
||||
import urllib
|
||||
import csv
|
||||
|
||||
from read import BaseReader
|
||||
from core.config import CoreConfig
|
||||
from titles.cxb.database import CxbData
|
||||
from titles.cxb.const import CxbConstants
|
||||
|
||||
class CxbReader(BaseReader):
|
||||
def __init__(self, config: CoreConfig, version: int, bin_arg: Optional[str], opt_arg: Optional[str], extra: Optional[str]) -> None:
|
||||
super().__init__(config, version, bin_arg, opt_arg, extra)
|
||||
self.data = CxbData(config)
|
||||
|
||||
try:
|
||||
self.logger.info(f"Start importer for {CxbConstants.game_ver_to_string(version)}")
|
||||
except IndexError:
|
||||
self.logger.error(f"Invalid project cxb version {version}")
|
||||
exit(1)
|
||||
|
||||
def read(self) -> None:
|
||||
pull_bin_ram = True
|
||||
|
||||
if not path.exists(f"{self.bin_dir}"):
|
||||
self.logger.warn(f"Couldn't find csv file in {self.bin_dir}, skipping")
|
||||
pull_bin_ram = False
|
||||
|
||||
if pull_bin_ram:
|
||||
self.read_csv(f"{self.bin_dir}")
|
||||
|
||||
def read_csv(self, bin_dir: str) -> None:
|
||||
self.logger.info(f"Read csv from {bin_dir}")
|
||||
|
||||
try:
|
||||
fullPath = bin_dir + "/export.csv"
|
||||
with open(fullPath, encoding="UTF-8") as fp:
|
||||
reader = csv.DictReader(fp)
|
||||
for row in reader:
|
||||
song_id = row["mcode"]
|
||||
index = row["index"]
|
||||
title = row["name"]
|
||||
artist = row["artist"]
|
||||
genre = row["category"]
|
||||
|
||||
if not "N/A" in row["standard"]:
|
||||
self.logger.info(f"Added song {song_id} chart 0")
|
||||
self.data.static.put_music(self.version, song_id, index, 0, title, artist, genre, int(row["standard"].replace("Standard ","").replace("N/A","0")))
|
||||
if not "N/A" in row["hard"]:
|
||||
self.logger.info(f"Added song {song_id} chart 1")
|
||||
self.data.static.put_music(self.version, song_id, index, 1, title, artist, genre, int(row["hard"].replace("Hard ","").replace("N/A","0")))
|
||||
if not "N/A" in row["master"]:
|
||||
self.logger.info(f"Added song {song_id} chart 2")
|
||||
self.data.static.put_music(self.version, song_id, index, 2, title, artist, genre, int(row["master"].replace("Master ","").replace("N/A","0")))
|
||||
if not "N/A" in row["unlimited"]:
|
||||
self.logger.info(f"Added song {song_id} chart 3")
|
||||
self.data.static.put_music(self.version, song_id, index, 3, title, artist, genre, int(row["unlimited"].replace("Unlimited ","").replace("N/A","0")))
|
||||
if not "N/A" in row["easy"]:
|
||||
self.logger.info(f"Added song {song_id} chart 4")
|
||||
self.data.static.put_music(self.version, song_id, index, 4, title, artist, genre, int(row["easy"].replace("Easy ","").replace("N/A","0")))
|
||||
except:
|
||||
self.logger.warn(f"Couldn't read csv file in {self.bin_dir}, skipping")
|
256
titles/cxb/rev.py
Normal file
256
titles/cxb/rev.py
Normal file
@ -0,0 +1,256 @@
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from base64 import b64encode
|
||||
from typing import Any, Dict
|
||||
from hashlib import md5
|
||||
from datetime import datetime
|
||||
|
||||
from core.config import CoreConfig
|
||||
from core.data import Data, cached
|
||||
from titles.cxb.config import CxbConfig
|
||||
from titles.cxb.base import CxbBase
|
||||
from titles.cxb.const import CxbConstants
|
||||
|
||||
class CxbRev(CxbBase):
|
||||
def __init__(self, cfg: CoreConfig, game_cfg: CxbConfig) -> None:
|
||||
super().__init__(cfg, game_cfg)
|
||||
self.version = CxbConstants.VER_CROSSBEATS_REV
|
||||
|
||||
def handle_data_path_list_request(self, data: Dict) -> Dict:
|
||||
return { "data": "" }
|
||||
|
||||
def handle_data_putlog_request(self, data: Dict) -> Dict:
|
||||
if data["putlog"]["type"] == "ResultLog":
|
||||
score_data = json.loads(data["putlog"]["data"])
|
||||
userid = score_data['usid']
|
||||
|
||||
self.data.score.put_playlog(userid, score_data['mcode'], score_data['difficulty'], score_data["score"], int(Decimal(score_data["clearrate"]) * 100), score_data["flawless"], score_data["super"], score_data["cool"], score_data["fast"], score_data["fast2"], score_data["slow"], score_data["slow2"], score_data["fail"], score_data["combo"])
|
||||
return({"data":True})
|
||||
return {"data": True }
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_music_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/MusicArchiveList.csv") as music:
|
||||
lines = music.readlines()
|
||||
for line in lines:
|
||||
line_split = line.split(',')
|
||||
ret_str += f"{line_split[0]},{line_split[1]},{line_split[2]},{line_split[3]},{line_split[4]},{line_split[5]},{line_split[6]},{line_split[7]},{line_split[8]},{line_split[9]},{line_split[10]},{line_split[11]},{line_split[12]},{line_split[13]},{line_split[14]},\r\n"
|
||||
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_icon_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ItemListIcon\r\n"
|
||||
with open(r"titles/cxb/rev_data/Item/ItemArchiveList_Icon.csv", encoding="utf-8") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_skin_notes_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ItemListSkinNotes\r\n"
|
||||
with open(r"titles/cxb/rev_data/Item/ItemArchiveList_SkinNotes.csv", encoding="utf-8") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_skin_effect_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ItemListSkinEffect\r\n"
|
||||
with open(r"titles/cxb/rev_data/Item/ItemArchiveList_SkinEffect.csv", encoding="utf-8") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_skin_bg_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ItemListSkinBg\r\n"
|
||||
with open(r"titles/cxb/rev_data/Item/ItemArchiveList_SkinBg.csv", encoding="utf-8") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_title_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ItemListTitle\r\n"
|
||||
with open(r"titles/cxb/rev_data/Item/ItemList_Title.csv", encoding="shift-jis") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_shop_list_music_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ShopListMusic\r\n"
|
||||
with open(r"titles/cxb/rev_data/Shop/ShopList_Music.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_shop_list_icon_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ShopListIcon\r\n"
|
||||
with open(r"titles/cxb/rev_data/Shop/ShopList_Icon.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_shop_list_title_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ShopListTitle\r\n"
|
||||
with open(r"titles/cxb/rev_data/Shop/ShopList_Title.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_shop_list_skin_hud_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_shop_list_skin_arrow_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_shop_list_skin_hit_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_shop_list_sale_request(self, data: Dict) -> Dict:
|
||||
ret_str = "\r\n#ShopListSale\r\n"
|
||||
with open(r"titles/cxb/rev_data/Shop/ShopList_Sale.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_extra_stage_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_exxxxx_request(self, data: Dict) -> Dict:
|
||||
extra_num = int(data["dldate"]["filetype"][-4:])
|
||||
ret_str = ""
|
||||
with open(fr"titles/cxb/rev_data/Ex000{extra_num}.csv", encoding="shift-jis") as stage:
|
||||
lines = stage.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_bonus_list10100_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_free_coupon_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_news_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/NewsList.csv", encoding="UTF-8") as news:
|
||||
lines = news.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_tips_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_license_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/License_Offline.csv", encoding="UTF-8") as lic:
|
||||
lines = lic.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_course_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/Course/CourseList.csv", encoding="UTF-8") as course:
|
||||
lines = course.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_csxxxx_request(self, data: Dict) -> Dict:
|
||||
# Removed the CSVs since the format isnt quite right
|
||||
extra_num = int(data["dldate"]["filetype"][-4:])
|
||||
ret_str = ""
|
||||
with open(fr"titles/cxb/rev_data/Course/Cs000{extra_num}.csv", encoding="shift-jis") as course:
|
||||
lines = course.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_mission_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/MissionList.csv", encoding="shift-jis") as mission:
|
||||
lines = mission.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_mission_bonus_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_unlimited_mission_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_event_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/Event/EventArchiveList.csv", encoding="shift-jis") as mission:
|
||||
lines = mission.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_event_music_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_mission_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_achievement_single_high_score_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_achievement_single_accumulation_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_ranking_high_score_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_ranking_accumulation_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_ranking_stamp_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_ranking_store_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
def handle_data_event_ranking_area_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": ""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_event_stamp_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rev_data/Event/EventStampList.csv", encoding="shift-jis") as event:
|
||||
lines = event.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_event_stamp_map_list_csxxxx_request(self, data: Dict) -> Dict:
|
||||
return({"data": "1,2,1,1,2,3,9,5,6,7,8,9,10,\r\n"})
|
||||
|
||||
def handle_data_server_state_request(self, data: Dict) -> Dict:
|
||||
return({"data": True})
|
10
titles/cxb/rev_data/Course/CourseList.csv
Normal file
10
titles/cxb/rev_data/Course/CourseList.csv
Normal file
@ -0,0 +1,10 @@
|
||||
Cs0000,0,10001,1422284400,4096483201,0,-1,-1,100,0,クリアすると段位が「見習い」に昇格します。,-1,
|
||||
Cs0001,1,10001,1422284400,4096483201,0,-1,-1,110,0,クリアすると段位が「初段」に昇格します。,-1,
|
||||
Cs0002,2,10001,1422284400,4096483201,0,-1,-1,120,0,クリアすると段位が「二段」に昇格します。,-1,
|
||||
Cs0003,3,10001,1422284400,4096483201,0,-1,-1,130,0,クリアすると段位が「三段」に昇格します。,-1,
|
||||
Cs0004,4,10001,1422284400,4096483201,0,-1,-1,140,0,クリアすると段位が「四段」に昇格します。,-1,
|
||||
Cs0005,5,10001,1422284400,4096483201,0,-1,-1,150,0,クリアすると段位が「五段」に昇格します。,-1,
|
||||
Cs0006,6,10001,1422284400,4096483201,0,-1,-1,160,0,クリアすると段位が「六段」に昇格します。,-1,
|
||||
Cs0007,7,10001,1422284400,4096483201,0,-1,-1,170,0,クリアすると段位が「七段」に昇格します。,-1,
|
||||
Cs0008,8,10001,1422284400,4096483201,0,-1,-1,180,0,クリアすると段位が「八段」に昇格します。,-1,
|
||||
Cs0009,9,10001,1422284400,4096483201,0,-1,-1,190,0,クリアすると段位が「九段」に昇格します。,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0000.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0000.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0001.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0001.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0002.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0002.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0003.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0003.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0004.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0004.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0005.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0005.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0006.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0006.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0007.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0007.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0008.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0008.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rev_data/Course/Cs0009.csv
Normal file
4
titles/cxb/rev_data/Course/Cs0009.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,dazzli,4,1,-,-1,-1,2,-1,1,-1,1,
|
||||
2,hokoro,0,1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,sundro,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,sundro,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
39
titles/cxb/rev_data/Event/EventArchiveList.csv
Normal file
39
titles/cxb/rev_data/Event/EventArchiveList.csv
Normal file
@ -0,0 +1,39 @@
|
||||
Cs1000,0,10000,1443233520,4096483201,1,ev000,1,
|
||||
Cs1001,0,10000,1443233520,4096483201,1,ev001,1,
|
||||
Cs1002,0,10000,1443233520,4096483201,1,ev002,1,
|
||||
Cs1003,0,10000,1443233520,4096483201,1,ev003,1,
|
||||
Cs1004,0,10000,1443233520,4096483201,1,ev004,1,
|
||||
Cs1005,0,10000,1443233520,4096483201,1,ev005,1,
|
||||
Cs1006,0,10000,1443233520,4096483201,1,ev006,1,
|
||||
Cs1007,0,10000,1443233520,4096483201,1,ev007,1,
|
||||
Cs1008,0,10000,1443233520,4096483201,1,ev008,1,
|
||||
Cs1009,0,10000,1443233520,4096483201,1,ev009,1,
|
||||
Cs1010,0,10000,1443233520,4096483201,1,ev010,1,
|
||||
Cs1011,0,10000,1443233520,4096483201,1,ev011,1,
|
||||
Cs1012,0,10000,1443233520,4096483201,1,ev012,1,
|
||||
Cs1013,0,10000,1443233520,4096483201,1,ev013,1,
|
||||
Cs1014,0,10000,1443233520,4096483201,1,ev014,1,
|
||||
Cs1015,0,10000,1443233520,4096483201,1,ev015,1,
|
||||
Cs1016,0,10000,1443233520,4096483201,1,ev016,1,
|
||||
Cs1017,0,10000,1443233520,4096483201,1,ev017,1,
|
||||
Cs1018,0,10000,1443233520,4096483201,1,ev018,1,
|
||||
Cs1019,0,10000,1443233520,4096483201,1,ev019,1,
|
||||
Cs1020,0,10000,1443233520,4096483201,1,ev020,1,
|
||||
Cs1021,0,10000,1443233520,4096483201,1,ev021,1,
|
||||
Cs1022,0,10000,1443233520,4096483201,1,ev022,1,
|
||||
Cs1023,0,10000,1443233520,4096483201,1,ev023,1,
|
||||
Cs1024,0,10000,1443233520,4096483201,1,ev024,1,
|
||||
Cs1025,0,10000,1443233520,4096483201,1,ev025,1,
|
||||
Cs1026,0,10000,1443233520,4096483201,1,ev026,1,
|
||||
Cs1027,0,10000,1443233520,4096483201,1,ev027,1,
|
||||
Cs1028,0,10000,1443233520,4096483201,1,ev028,1,
|
||||
Cs1029,0,10000,1443233520,4096483201,1,ev029,1,
|
||||
Cs1030,0,10000,1443233520,4096483201,1,ev030,1,
|
||||
Cs1031,0,10000,1443233520,4096483201,1,ev031,1,
|
||||
Cs1032,0,10000,1443233520,4096483201,1,ev032,1,
|
||||
Cs1033,0,10000,1443233520,4096483201,1,ev033,1,
|
||||
Cs1034,0,10000,1443233520,4096483201,1,ev034,1,
|
||||
Cs1035,0,10000,1443233520,4096483201,1,ev035,1,
|
||||
Cs1036,0,10000,1443233520,4096483201,1,ev036,1,
|
||||
Cs1037,0,10000,1443233520,4096483201,1,ev037,1,
|
||||
Cs1038,0,10000,1443233520,4096483201,1,ev038,1,
|
|
39
titles/cxb/rev_data/Event/EventStampList.csv
Normal file
39
titles/cxb/rev_data/Event/EventStampList.csv
Normal file
@ -0,0 +1,39 @@
|
||||
Cs1000,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1001,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1002,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1003,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1004,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1005,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1006,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1007,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1008,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1009,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1010,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1011,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1012,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1013,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1014,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1015,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1016,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1017,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1018,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1019,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1020,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1021,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1022,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1023,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1024,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1025,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1026,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1027,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1028,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1029,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1030,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1031,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1032,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1033,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1034,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1035,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1036,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1037,1,1,1,1,1,1,1,1,1,1,
|
||||
Cs1038,1,1,1,1,1,1,1,1,1,1,
|
|
10
titles/cxb/rev_data/Ex0000.csv
Normal file
10
titles/cxb/rev_data/Ex0000.csv
Normal file
@ -0,0 +1,10 @@
|
||||
StageMax,ClearCount,StageNo.,MCODE,Diff(std),Diff(hrd),Diff(mas),Diff(ulm),Diff(esy),Level(op), Level(val), Grade(op),Grade(val),GT(nml),GT(svl),GT(ult),GT(nhp),GT(esy),HS(op),HS(val),APP,DAP,F-V,F-H,FT(ac),FT(tab),FT(pho),Combo(op),Combo(val),FullCombo,ClearRate(op),ClearRate(val)
|
||||
2,1,1,-,2,2,2,1,2,-1,-,1,1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,1,300,-1,-1,-,
|
||||
2,-,2,-,2,2,2,1,2,-1,-,1,1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,1,300,-1,-1,-,
|
||||
3,3,1,-,2,2,1,1,2,-1,-,1,2,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,2,-,2,2,1,1,2,-1,-,1,2,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,3,-,2,2,1,1,2,1,50,1,2,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,4,1,dynami:fronti:rebell:fronti2:auflcb:auflcb2,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,2,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,3,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,4,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
|
10
titles/cxb/rev_data/Ex0001.csv
Normal file
10
titles/cxb/rev_data/Ex0001.csv
Normal file
@ -0,0 +1,10 @@
|
||||
StageMax,ClearCount,StageNo.,MCODE,Diff(std),Diff(hrd),Diff(mas),Diff(ulm),Diff(esy),Level(op), Level(val), Grade(op),Grade(val),GT(nml),GT(svl),GT(ult),GT(nhp),GT(esy),HS(op),HS(val),APP,DAP,F-V,F-H,FT(ac),FT(tab),FT(pho),Combo(op),Combo(val),FullCombo,ClearRate(op),ClearRate(val)
|
||||
2,1,1,-,2,2,1,1,2,1,50,-1,-,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,1,-1,-,
|
||||
2,-,2,-,2,2,1,1,2,1,50,-1,-,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,1,-1,-,
|
||||
3,3,1,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,2,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,3,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,4,1,dynami:fronti:rebell:fronti2:auflcb:auflcb2,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,2,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,3,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,4,-,2,2,1,1,2,1,,-1,-,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
|
2
titles/cxb/rev_data/ExtraStageList.csv
Normal file
2
titles/cxb/rev_data/ExtraStageList.csv
Normal file
@ -0,0 +1,2 @@
|
||||
No.,Ver.,ESID,Title,StartTime,EndTime,出現曲MCODE,出現RP,出現エフェクト,Diff(std),Diff(hrd),Diff(mas),Diff(ulm),Diff(esy),GT(nml),GT(svl),GT(ult),GT(nhp),GT(esy),HS(op),HS(val),APP,DAP,F-V,F-H,FT(ac),FT(tab),FT(pho)
|
||||
1,1000,Ex0000,MEGALOMAN[i]A出現,1411697520.0288,1443233520.0288,megaro,0,3,2,2,1,2,2,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,
|
|
3
titles/cxb/rev_data/Item/ItemArchiveList_Icon.csv
Normal file
3
titles/cxb/rev_data/Item/ItemArchiveList_Icon.csv
Normal file
@ -0,0 +1,3 @@
|
||||
1000,ic0000,IconName0000,,
|
||||
1001,ic0001,IconName0001,,
|
||||
1002,ic0002,IconName0002,,
|
|
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinBg.csv
Normal file
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinBg.csv
Normal file
@ -0,0 +1,3 @@
|
||||
3000,skb0000,SkinName0000,,
|
||||
3001,skb0001,SkinName0001,,
|
||||
3002,skb0002,SkinName0002,,
|
|
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinEffect.csv
Normal file
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinEffect.csv
Normal file
@ -0,0 +1,3 @@
|
||||
5000,ske0000,SkinName0000,,
|
||||
5001,ske0001,SkinName0001,,
|
||||
5002,ske0002,SkinName0002,,
|
|
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinNotes.csv
Normal file
3
titles/cxb/rev_data/Item/ItemArchiveList_SkinNotes.csv
Normal file
@ -0,0 +1,3 @@
|
||||
4000,skt0000,SkinName0000,,
|
||||
4001,skt0001,SkinName0001,,
|
||||
4002,skt0002,SkinName0002,,
|
|
3
titles/cxb/rev_data/Item/ItemList_Title.csv
Normal file
3
titles/cxb/rev_data/Item/ItemList_Title.csv
Normal file
@ -0,0 +1,3 @@
|
||||
2000,スーパーゴリラ,4,
|
||||
2001,ふつうのゴリラ,3,
|
||||
2002,モンキー,0,
|
|
89
titles/cxb/rev_data/License_Offline.csv
Normal file
89
titles/cxb/rev_data/License_Offline.csv
Normal file
@ -0,0 +1,89 @@
|
||||
英雄の証 ~ 4Version/カプコンサウンドチーム
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
灼熱の刃 ~ ディノバルド
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
古代の息吹き
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
Theme of Ryu -SFIV Arrange-/Capcom Sound Team / Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Ultra Street Fighter IV/Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Theme of Chun-Li -SFIV Arrange-/Capcom Sound Team / Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Street Fighter V/Masahiro Aoki
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
英雄の証/MHF-G 2015 Version
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
異ヲ辿リシモノ -対峙-/若林タカツグ
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
QLWA(グルーヴコースター 3 リンクフィーバーより)/t+pazolite
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
グルーヴ・ザ・ハート(グルーヴコースター 3 リンクフィーバーより)/ビートまりお+あまね
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
Got hive of Ra(グルーヴコースター 3 リンクフィーバーより)/E.G.G.
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
LINK LINK FEVER!!!(グルーヴコースター 3 リンクフィーバーより)/リンカ (CV:豊田萌絵)
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
SAKURA EXHAUST/RIO HAMAMOTO(BNSI)「太鼓の達人」より
|
||||
©BANDAI NAMCO Entertainment Inc.
|
||||
|
||||
カリソメ(グルーヴコースター 3 リンクフィーバーより)/コンプ(豚乙女) × ichigo(岸田教団 & THE明星ロケッツ)
|
||||
©上海アリス幻樂団
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
そして誰もいなくなった(グルーヴコースター 3 リンクフィーバーより)/コバヤシユウヤ(IOSYS) × あにー(TaNaBaTa)
|
||||
©上海アリス幻樂団
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Font Design by Fontworks Inc.
|
||||
DynaFont is a registered Trademark of DynaComware Taiwan Inc.
|
||||
Ogg Vorbis is Copyright ©2015, Xiph. Org Foundation
|
||||
The font used on this product is provided by Hakusyu Fonts co,.Ltd.
|
||||
キャスティング・ライツクリアランス
|
||||
株式会社ビーイング
|
||||
JASRAC許諾第V-1512134号
|
||||
e-License許諾番号GS35000
|
||||
VOCALOID and VOCALO are trademarks of Yamaha Corporation.
|
||||
|
||||
OMNiMIX v1.2
|
|
4
titles/cxb/rev_data/MissionList.csv
Normal file
4
titles/cxb/rev_data/MissionList.csv
Normal file
@ -0,0 +1,4 @@
|
||||
MissionID,Text,Type,Value_op,Value,Mcode,Difficulty_op,Difficulty,Level_op,Level,Grade_op,Grade,GaugeType_op,GaugeType,HiSpeed_op,HiSpeed,APP,DAP,FlipV,FlipH,Fullcombo,Combo_op,Combo,ClearRate_op,ClearRate,StartTime,StartEnd,District,CoupleId
|
||||
0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||
1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,ExtraStage‚ÅMEGALOMAN[i]A‚ðƒNƒŠƒA‚·‚é,0,-1,-1,megaro,-1,-1,-1,-1,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
|
471
titles/cxb/rev_data/MusicArchiveList.csv
Normal file
471
titles/cxb/rev_data/MusicArchiveList.csv
Normal file
@ -0,0 +1,471 @@
|
||||
tutori2,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori3,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori4,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori8,10000,1000000,30,150,350,0,0,1,1,1,0,0,0,100345,
|
||||
sateli,10000,100000,280,490,770,820,170,1,1,1,1,1,0,100300,
|
||||
nature,10000,100000,140,240,530,750,50,1,1,1,1,1,3,100301,
|
||||
purple,10000,100000,220,540,640,730,140,1,1,1,1,1,0,100307,
|
||||
hearts,10000,100000,180,380,680,770,80,1,1,1,1,1,0,100308,
|
||||
phasea,10000,100000,160,380,650,750,90,1,1,1,1,1,0,100310,
|
||||
planet,10000,100000,170,360,490,710,100,1,1,1,1,1,1,100311,
|
||||
firefo,10000,100000,130,360,570,830,70,1,1,1,1,1,0,100314,
|
||||
kounen,10000,100000,210,400,660,780,100,1,1,1,1,1,3,100315,
|
||||
essenc,10000,100000,250,500,700,760,110,1,1,1,1,1,0,100316,
|
||||
summer,10000,100000,230,570,790,890,130,1,1,1,1,1,0,100317,
|
||||
tanosi,10000,100000,250,450,700,800,160,1,1,1,1,1,7,100319,
|
||||
picora,10000,100000,150,380,660,750,80,1,1,1,1,1,1,100320,
|
||||
devils,10000,100000,270,400,800,0,150,1,1,1,0,1,0,100323,
|
||||
techno,10000,100000,160,380,510,740,90,1,1,1,1,1,1,100328,
|
||||
glowww,10000,100000,170,280,420,600,80,1,1,1,1,1,7,100335,
|
||||
powerr,10000,100000,190,380,690,790,120,1,1,1,1,1,0,100336,
|
||||
amater,10000,100000,210,480,650,790,130,1,1,1,1,1,0,100340,
|
||||
advers,10000,100000,150,480,710,830,90,1,1,1,1,1,1,100349,
|
||||
venera,10000,100000,150,430,680,750,80,1,1,1,1,1,0,100353,
|
||||
dazaii,10000,100000,210,430,730,770,120,1,1,1,1,1,3,100357,
|
||||
thesig,10000,100000,210,380,560,730,100,1,1,1,1,1,3,100365,
|
||||
hosita,10000,100000,160,360,480,650,100,1,1,1,1,1,9999,100344,
|
||||
bluede,10000,100000,220,410,580,700,120,1,1,1,1,1,5,100372,
|
||||
emerao,10000,100000,300,530,850,0,190,1,1,1,0,1,1,100373,
|
||||
megaro,10000,100000,550,800,930,980,0,1,1,1,1,0,0,100129,
|
||||
angeli,10000,100000,330,560,820,900,220,1,1,1,1,1,0,100330,
|
||||
moonli,10000,100000,140,430,610,730,80,1,1,1,1,1,9999,100342,
|
||||
yumemi,10000,100000,120,350,590,690,60,1,1,1,1,1,9999,100369,
|
||||
pinkym,10000,100000,240,440,740,810,160,1,1,1,1,1,0,100348,
|
||||
dynami2,10000,100000,180,510,780,800,80,1,1,1,1,1,0,100370,
|
||||
reseed3,10000,100000,200,550,760,800,100,1,1,1,1,1,0,100306,
|
||||
toucho,10000,200000,90,280,440,650,50,1,1,1,1,1,1,100002,
|
||||
ameoto,10000,200000,120,260,470,630,60,1,1,1,1,1,1,100003,
|
||||
kimito,10000,200000,100,260,490,660,70,1,1,1,1,1,1,100004,
|
||||
giantk,10000,200000,250,530,710,780,110,1,1,1,1,1,3,100021,
|
||||
breakd,10000,200000,230,340,570,740,110,1,1,1,1,1,2,100015,
|
||||
dazzlj,10000,200000,350,600,800,900,160,1,1,1,1,1,1,100028,
|
||||
ididid,10000,200000,290,460,720,810,160,1,1,1,1,1,1,100093,
|
||||
sundro,10000,200000,240,470,750,830,140,1,1,1,1,1,3,100042,
|
||||
auflcb,10000,200000,130,430,810,0,80,1,1,1,0,1,0,100063,
|
||||
dennou,10000,200000,290,600,760,870,150,1,1,1,1,1,1,100045,
|
||||
hokoro,10000,200000,290,570,710,810,140,1,1,1,1,1,1,100068,
|
||||
landin,10000,200000,260,330,490,670,130,1,1,1,1,1,1,100005,
|
||||
tomorr,10000,100000,150,240,440,620,80,1,1,1,1,1,7,100362,
|
||||
daybyd,10000,100000,130,260,380,590,60,1,1,1,1,1,7,100363,
|
||||
syoujo,10000,100000,190,350,530,780,80,1,1,1,1,1,1,100309,
|
||||
destru,10000,100000,190,410,620,720,100,1,1,1,1,1,0,100352,
|
||||
gingat,10000,200000,130,290,460,610,50,1,1,1,1,1,0,100041,
|
||||
daisak,10000,200000,280,360,600,750,120,1,1,1,1,1,0,100066,
|
||||
paradi,10000,100000,160,280,530,640,100,1,1,1,1,1,3,100376,
|
||||
pigooo,10000,100000,190,340,590,840,130,1,1,1,1,1,6,100377,
|
||||
season,10000,300000,150,280,440,650,80,1,1,1,1,1,1,100386,
|
||||
canonn,10000,300000,170,280,500,830,70,1,1,1,1,1,1,100387,
|
||||
rhapso,10000,300000,180,340,620,740,60,1,1,1,1,1,1,100388,
|
||||
turkis,10000,300000,190,390,640,840,110,1,1,1,1,1,1,100389,
|
||||
biohaz,10000,300000,150,300,510,640,60,1,1,1,1,1,9999,100390,
|
||||
monhan,10000,300000,100,260,360,540,50,1,1,1,1,1,9999,100391,
|
||||
gyakut2,10000,300000,130,350,430,560,50,1,1,1,1,1,9999,100392,
|
||||
street,10000,300000,130,340,470,660,70,1,1,1,1,1,9999,100393,
|
||||
rockma2,10000,300000,210,340,490,760,140,1,1,1,1,1,9999,100394,
|
||||
auflcb3,10000,100000,160,360,660,860,60,1,1,1,1,1,9999,100374,
|
||||
irohaa,10000,100000,190,410,550,760,120,1,1,1,1,1,0,100325,
|
||||
ibelie,10000,100000,270,470,780,820,140,1,1,1,1,1,0,100326,
|
||||
monhan2,10000,300000,120,240,430,680,60,1,1,1,1,1,9999,100409,
|
||||
monhan3,10000,300000,180,280,450,730,80,1,1,1,1,1,9999,100410,
|
||||
yejiii,10000,100000,220,360,630,790,100,1,1,1,1,1,0,100418,
|
||||
histor,10000,100000,200,360,560,820,110,1,1,1,1,1,0,100419,
|
||||
chaset,10000,100000,150,310,580,760,80,1,1,1,1,1,9999,100338,
|
||||
metall,10000,100000,160,280,570,770,80,1,1,1,1,1,1,100412,
|
||||
letmeg,10000,100000,180,320,500,720,120,1,1,1,1,1,1,100327,
|
||||
hontno,10000,200000,120,260,530,660,90,1,1,1,1,1,1,100010,
|
||||
azitat,10000,200000,240,550,700,830,140,1,1,1,1,1,0,100024,
|
||||
hellom,10000,100000,180,370,580,720,70,1,1,1,1,1,1,100360,
|
||||
laught,10000,100000,200,350,510,710,70,1,1,1,1,1,1,100337,
|
||||
bluede2,10000,100000,160,360,560,810,90,1,1,1,1,1,1,100426,
|
||||
street2,10000,300000,210,370,550,730,140,1,1,1,1,1,9999,100423,
|
||||
street3,10000,300000,240,380,570,740,130,1,1,1,1,1,9999,100424,
|
||||
street4,10000,300000,170,320,510,780,110,1,1,1,1,1,9999,100425,
|
||||
silbur,10000,100000,200,350,540,750,90,1,1,1,1,1,1,100421,
|
||||
spicaa,10000,100000,230,360,560,780,100,1,1,1,1,1,1,100422,
|
||||
tricko,10000,100000,230,340,560,750,110,1,1,1,1,1,0,100438,
|
||||
thisis,10000,100000,230,370,600,740,120,1,1,1,1,1,4,100435,
|
||||
rising,10000,100000,230,380,660,850,140,1,1,1,1,1,4,100436,
|
||||
orbita,10000,100000,200,380,620,740,120,1,1,1,1,1,5,100411,
|
||||
dddddd,10000,100000,130,330,530,690,90,1,1,1,1,1,5,100433,
|
||||
pyroma,10000,100000,220,420,700,840,80,1,1,1,1,1,4,100427,
|
||||
touchn,10000,100000,270,460,680,860,150,1,1,1,1,1,8,100312,
|
||||
onlyll,10000,100000,210,320,560,690,130,1,1,1,1,1,9999,100359,
|
||||
upside,10000,100000,180,270,480,670,80,1,1,1,1,1,1,100313,
|
||||
istanb,10000,100000,410,490,900,980,230,1,1,1,1,1,3,100322,
|
||||
memori,10000,100000,260,380,650,840,130,1,1,1,1,1,9999,100371,
|
||||
straye,10000,100000,250,360,610,730,140,1,1,1,1,1,4,100350,
|
||||
rearhy,10000,100000,170,320,520,690,70,1,1,1,1,1,9999,100358,
|
||||
hereco,10000,100000,160,340,510,680,110,1,1,1,1,1,4,100432,
|
||||
thesun,10000,100000,250,400,720,870,130,1,1,1,1,1,4,100441,
|
||||
sayona,10000,100000,200,340,530,710,100,1,1,1,1,1,9999,100343,
|
||||
flameu,10000,100000,180,360,570,650,100,1,1,1,1,1,1,100380,
|
||||
raidon,10000,100000,300,380,580,870,130,1,1,1,1,1,1,100434,
|
||||
riseup,10000,100000,180,410,670,770,70,1,1,1,1,1,4,100437,
|
||||
sunglo,10000,100000,180,390,590,720,100,1,1,1,1,1,7,100431,
|
||||
kinbos,10000,100000,220,380,640,770,120,1,1,1,1,1,3,100439,
|
||||
densho,10000,100000,280,420,740,900,170,1,1,1,1,1,5,100430,
|
||||
aiohoo,10000,300000,180,290,420,660,100,1,1,1,1,1,1,100471,
|
||||
entert,10000,300000,150,330,540,870,90,1,1,1,1,1,6,100472,
|
||||
takeit,10000,100000,200,380,650,830,120,1,1,1,1,1,4,100457,
|
||||
harmon,10000,100000,200,360,490,650,120,1,1,1,1,1,7,100449,
|
||||
avemar,10000,300000,160,310,530,750,80,1,1,1,1,1,5,100428,
|
||||
mateki,10000,300000,180,350,540,790,100,1,1,1,1,1,5,100429,
|
||||
lovech,10000,100000,160,300,460,680,80,1,1,1,1,1,7,100445,
|
||||
akaihe,10000,300000,210,320,500,690,80,1,1,1,1,1,1,100473,
|
||||
juicys,10000,300000,180,260,450,830,100,1,1,1,1,1,7,100474,
|
||||
codena,10000,100000,180,350,480,680,90,1,1,1,1,1,1,100468,
|
||||
groove,10000,300000,220,400,520,730,100,1,1,1,1,1,103,100475,
|
||||
kansho,10000,100000,130,270,550,740,70,1,1,1,1,1,9999,100450,
|
||||
overcl2,10000,100000,230,420,580,740,120,1,1,1,1,1,3,100486,
|
||||
taikoo,10000,300000,130,390,500,750,60,1,1,1,1,1,104,100483,
|
||||
groove2,10000,300000,150,400,580,850,90,1,1,1,1,1,9999,100480,
|
||||
overcl,10000,100000,120,350,570,860,80,1,1,1,1,1,4,100487,
|
||||
notoss,10000,100000,120,420,650,910,80,1,1,1,1,1,4,100466,
|
||||
machup,10000,100000,170,320,410,710,90,1,1,1,1,1,6,100447,
|
||||
groove3,10000,300000,180,340,640,850,100,1,1,1,1,1,105,100488,
|
||||
groove4,10000,300000,220,350,500,750,120,1,1,1,1,1,106,100489,
|
||||
everyt,10000,100000,220,300,740,0,130,1,1,1,0,1,5,100482,
|
||||
lespri,10000,100000,250,570,800,0,130,1,1,1,0,1,5,100465,
|
||||
groove5,10000,300000,240,370,670,0,140,1,1,1,0,1,0,100491,
|
||||
honeyo,10000,100000,320,630,880,930,240,1,1,1,1,1,6,100490,
|
||||
groove6,10000,300000,300,640,790,0,220,1,1,1,0,1,3,100494,
|
||||
sunglo2,10000,100000,210,360,670,810,110,1,1,1,1,1,6,100495,
|
||||
fourte,10000,100000,240,500,740,800,140,1,1,1,1,1,5,100498,
|
||||
monhan4,10000,300000,120,400,510,620,50,1,1,1,1,1,9999,100496,
|
||||
monhan5,10000,300000,120,350,420,650,100,1,1,1,1,1,9999,100497,
|
||||
darkpa,10000,100000,260,390,700,840,160,1,1,1,1,1,3,100504,
|
||||
hervor,10000,100000,280,390,730,810,180,1,1,1,1,1,5,100505,
|
||||
cirnon,10000,300000,240,400,600,790,170,1,1,1,1,1,9999,100499,
|
||||
marisa,10000,300000,250,410,620,850,180,1,1,1,1,1,9999,100500,
|
||||
yakini,10000,300000,250,340,580,820,130,1,1,1,1,1,9999,100501,
|
||||
justic,10000,300000,190,360,570,830,140,1,1,1,1,1,1,100502,
|
||||
sintyo,10000,300000,250,460,700,830,160,1,1,1,1,1,6,100503,
|
||||
ascand,10000,100000,320,540,800,900,180,1,1,1,1,1,0,100347,
|
||||
blackl,10000,100000,190,410,730,840,120,1,1,1,1,1,3,100506,
|
||||
childr,10000,200000,240,390,560,620,140,1,1,1,1,1,0,100043,
|
||||
tsukai,10000,200000,190,440,720,760,130,1,1,1,1,1,1,100044,
|
||||
rideon,10000,200000,290,410,600,800,160,1,1,1,1,1,1,100067,
|
||||
minest,10000,100000,210,390,620,760,130,1,1,1,1,1,1,100507,
|
||||
ordine,10000,100000,250,430,730,820,190,1,1,1,1,1,3,100508,
|
||||
dreamw,10000,100000,260,370,620,750,160,1,1,1,1,1,0,100509,
|
||||
minerv,10000,100000,320,610,900,0,250,1,1,1,0,1,4,100510,
|
||||
wannab,10000,200000,90,230,400,650,50,1,1,1,1,1,3,100001,
|
||||
sekain,10000,100000,260,390,690,780,160,1,1,1,1,1,1,100511,
|
||||
farawa,10000,100000,230,360,600,760,180,1,1,1,1,1,7,100512,
|
||||
crissc,10000,200000,370,630,860,910,170,1,1,1,1,1,4,100100,
|
||||
speedy,10000,100000,220,550,770,0,110,1,1,1,0,1,8,100324,
|
||||
xxxrev,10000,100000,210,340,560,730,150,1,1,1,1,1,0,100513,
|
||||
higame,10000,200000,200,300,580,710,130,1,1,1,1,1,3,100016,
|
||||
theepi,10000,200000,190,400,610,750,140,1,1,1,1,1,3,100022,
|
||||
anomie,10000,200000,220,380,610,770,150,1,1,1,1,1,0,100023,
|
||||
crocus,10000,100000,260,370,600,720,150,1,1,1,1,1,7,100524,
|
||||
lavien,10000,100000,270,410,710,800,180,1,1,1,1,1,5,100546,
|
||||
megaro2,10000,100000,0,0,990,1000,0,0,0,1,1,0,4,100361,
|
||||
chipnn,10000,100000,270,340,610,790,160,1,1,1,1,1,6,100541,
|
||||
yiyoyi,10000,200000,140,330,560,700,70,1,1,1,1,1,3,100007,
|
||||
binary,10000,200000,170,350,640,890,140,1,1,1,1,1,1,100014,
|
||||
makaim,10000,200000,300,500,770,0,230,1,1,1,0,1,3,100054,
|
||||
gyakut,10000,200000,150,210,460,640,60,1,1,1,1,1,1,100055,
|
||||
basara,10000,200000,190,370,640,730,140,1,1,1,1,1,0,100056,
|
||||
daybre,10000,300000,160,320,530,720,90,1,1,1,1,1,0,100514,
|
||||
umiyur,10000,300000,140,280,460,640,80,1,1,1,1,1,1,100515,
|
||||
chalur,10000,300000,180,400,600,720,140,1,1,1,1,1,9999,100516,
|
||||
melanc,10000,300000,150,300,500,630,100,1,1,1,1,1,7,100517,
|
||||
konofu,10000,300000,230,350,620,810,110,1,1,1,1,1,1,100518,
|
||||
bladem,10000,100000,280,380,630,750,170,1,1,1,1,1,4,100526,
|
||||
southw,10000,100000,180,270,570,680,120,1,1,1,1,1,7,100536,
|
||||
ryuuse,10000,100000,210,320,590,0,130,1,1,1,0,1,1,100537,
|
||||
redhea,10000,300000,270,390,590,720,100,1,1,1,1,1,0,100519,
|
||||
warnin,10000,300000,250,360,610,740,120,1,1,1,1,1,9999,100520,
|
||||
topsec,10000,300000,240,340,510,640,130,1,1,1,1,1,9999,100521,
|
||||
dddoll,10000,300000,260,380,550,630,140,1,1,1,1,1,9999,100522,
|
||||
tracee,10000,300000,190,310,490,650,90,1,1,1,1,1,0,100548,
|
||||
drivin,10000,200000,230,400,660,760,80,1,1,1,1,1,7,100111,
|
||||
genzit,10000,200000,180,460,730,820,120,1,1,1,1,1,0,100118,
|
||||
aerial,10000,200000,110,280,560,710,50,1,1,1,1,1,1,100039,
|
||||
einher,10000,100000,290,400,740,800,160,1,1,1,1,1,4,100532,
|
||||
ariell,10000,100000,190,320,640,730,150,1,1,1,1,1,7,100540,
|
||||
firstl,10000,100000,250,360,650,770,170,1,1,1,1,1,1,100542,
|
||||
heartl,10000,100000,230,300,640,0,110,1,1,1,0,1,1,100550,
|
||||
erasee,10000,100000,220,350,580,680,120,1,1,1,1,1,0,100551,
|
||||
regene,10000,100000,200,300,560,700,130,1,1,1,1,1,0,100530,
|
||||
allelu,10000,100000,280,350,640,750,160,1,1,1,1,1,9999,100549,
|
||||
lighto,10000,100000,250,330,600,740,120,1,1,1,1,1,1,100543,
|
||||
termin,10000,100000,240,340,630,790,130,1,1,1,1,1,7,100552,
|
||||
ryuuse2,10000,100000,200,360,620,750,130,1,1,1,1,1,1,100556,
|
||||
prizmm,10000,100000,210,300,540,0,120,1,1,1,0,1,1,100547,
|
||||
samalv,10000,200000,190,390,580,770,130,1,1,1,1,1,6,100098,
|
||||
palpit,10000,100000,290,550,840,920,180,1,1,1,1,1,8,100544,
|
||||
gainen,10000,100000,260,370,630,0,150,1,1,1,0,1,9999,100558,
|
||||
moonsh,10000,100000,230,360,620,0,100,1,1,1,0,1,3,100525,
|
||||
moonki,10000,100000,250,390,640,0,130,1,1,1,0,1,1,100559,
|
||||
moonri,10000,200000,210,380,580,850,140,1,1,1,1,1,0,100560,
|
||||
goaway,10000,100000,230,450,590,700,100,1,1,1,1,1,0,100561,
|
||||
itback,10000,100000,230,380,710,0,120,1,1,1,0,1,3,100567,
|
||||
redhhh,10000,100000,240,390,770,0,130,1,1,1,0,1,4,100569,
|
||||
actual,10000,100000,250,380,800,0,140,1,1,1,0,1,0,100568,
|
||||
zonzon,10000,200000,160,330,630,670,50,1,1,1,1,1,1,100367,
|
||||
memorm,10000,100000,260,370,730,0,150,1,1,1,0,1,0,100565,
|
||||
kokoro,10000,100000,200,430,650,690,120,1,1,1,1,1,1,100554,
|
||||
poweri,10000,100000,260,490,750,910,130,1,1,1,1,1,4,100563,
|
||||
nisenn,10000,100000,0,0,760,0,0,0,0,1,0,0,8,100555,
|
||||
yukiya,10000,200000,190,400,610,0,110,1,1,1,0,1,3,100096,
|
||||
zankyo,10000,200000,180,380,570,740,100,1,1,1,1,1,5,100124,
|
||||
overlp,10000,200000,170,300,510,0,90,1,1,1,0,1,7,100119,
|
||||
fracta,10000,100000,310,520,830,0,190,1,1,1,0,1,3,100529,
|
||||
cantst,10000,100000,230,420,650,0,110,1,1,1,0,1,0,100455,
|
||||
primaa,10000,100000,180,350,540,750,120,1,1,1,1,1,0,100527,
|
||||
cyberg,10000,100000,230,350,600,0,120,1,1,1,0,1,0,100448,
|
||||
freakw,10000,200000,220,420,650,660,130,1,1,1,1,1,0,100018,
|
||||
aquali,10000,200000,160,340,580,0,110,1,1,1,0,1,4,100006,
|
||||
takesc,10000,100000,270,370,690,0,100,1,1,1,0,1,1,100572,
|
||||
cthugh,10000,100000,250,480,730,0,140,1,1,1,0,1,0,100531,
|
||||
thetaa,10000,100000,210,340,620,0,110,1,1,1,0,1,1,100571,
|
||||
nekofu,10000,300000,220,340,570,800,100,1,1,1,1,1,6,100493,
|
||||
howtru,10000,200000,120,250,530,740,80,1,1,1,1,1,0,100057,
|
||||
romanc,10000,200000,280,550,780,0,100,1,1,1,0,1,0,100047,
|
||||
kotobu,10000,200000,320,710,900,0,250,1,1,1,0,1,0,100573,
|
||||
xmasss,10000,300000,180,380,560,770,80,1,1,1,1,1,101,100417,
|
||||
galaxy,10000,300000,160,320,430,670,100,1,1,1,1,1,0,100600,
|
||||
rebell,10000,1000000,490,630,910,0,0,1,1,1,0,0,0,100601,
|
||||
anothe,10000,1000000,270,370,730,760,0,1,1,1,1,0,0,100602,
|
||||
addict,10000,1000000,200,340,520,620,0,1,1,1,1,0,0,100603,
|
||||
dirtyy,10000,1000000,150,280,590,740,0,1,1,1,1,0,0,100604,
|
||||
levelf,10000,300000,110,280,450,630,50,1,1,1,1,1,0,100605,
|
||||
omnive,10000,1000000,340,520,830,860,0,1,1,1,1,0,0,100606,
|
||||
kakuse,10000,1000000,170,550,750,0,0,1,1,1,0,0,0,100607,
|
||||
unbeli,10000,300000,130,260,380,620,70,1,1,1,1,1,0,100608,
|
||||
sonzai,10000,1000000,260,400,590,660,0,1,1,1,1,0,0,100609,
|
||||
okonik,10000,1000000,260,450,670,0,0,1,1,1,0,0,0,100610,
|
||||
crssho,10000,1000000,350,600,850,0,100,1,1,1,0,1,0,100611,
|
||||
reanim,10000,1000000,280,440,700,800,0,1,1,1,1,0,0,100612,
|
||||
kamino,10000,1000000,400,620,780,0,150,1,1,1,0,1,0,100613,
|
||||
fiveee,10000,300000,180,370,610,710,100,1,1,1,1,1,0,100614,
|
||||
granda,10000,1000000,210,380,790,0,0,1,1,1,0,0,0,100615,
|
||||
fronti2,10000,1000000,460,690,890,0,90,1,1,1,0,1,0,100616,
|
||||
saigon,10000,1000000,190,310,570,0,0,1,1,1,0,0,0,100617,
|
||||
replay,10000,300000,180,440,630,700,80,1,1,1,1,1,0,100618,
|
||||
mousou,10000,1000000,160,260,540,0,0,1,1,1,0,0,0,100619,
|
||||
aheadd,10000,300000,130,250,350,580,70,1,1,1,1,1,0,100620,
|
||||
musicr1,10000,100000,220,330,580,740,120,1,1,1,1,1,0,100621,
|
||||
getthe,10000,300000,170,370,490,660,60,1,1,1,1,1,0,100622,
|
||||
design,10000,1000000,150,390,680,690,0,1,1,1,1,0,0,100623,
|
||||
garnet,10000,1000000,260,460,700,940,0,1,1,1,1,0,0,100624,
|
||||
hopesb,10000,300000,100,250,440,610,70,1,1,1,1,1,0,100625,
|
||||
shooti,10000,300000,150,370,490,690,70,1,1,1,1,1,0,100626,
|
||||
dangan,10000,1000000,280,580,810,0,0,1,1,1,0,0,0,100627,
|
||||
impact,10000,1000000,240,600,720,900,200,1,1,1,1,1,0,100628,
|
||||
lightm,10000,300000,260,330,540,710,110,1,1,1,1,1,0,100629,
|
||||
miiroo,10000,300000,220,390,580,680,110,1,1,1,1,1,0,100630,
|
||||
voiceo,10000,1000000,180,340,580,590,0,1,1,1,1,0,0,100631,
|
||||
cosmol,10000,1000000,360,640,870,0,250,1,1,1,0,1,0,100632,
|
||||
vividd,10000,300000,160,350,550,650,90,1,1,1,1,1,0,100633,
|
||||
splash,10000,1000000,260,500,710,0,0,1,1,1,0,0,0,100634,
|
||||
donuth,10000,300000,220,400,540,800,110,1,1,1,1,1,0,100635,
|
||||
senbon,10000,300000,200,280,540,740,120,1,1,1,1,1,0,100636,
|
||||
kmtyju,10000,300000,240,310,570,740,120,1,1,1,1,1,0,100637,
|
||||
fronti,10000,1000000,480,650,820,0,130,1,1,1,0,1,0,100638,
|
||||
nueraa,10000,1000000,220,430,750,530,0,1,1,1,1,0,0,100639,
|
||||
childe,10000,300000,90,240,340,560,40,1,1,1,1,1,0,100640,
|
||||
dazzli2,10000,1000000,350,600,820,0,190,1,1,1,0,1,0,100641,
|
||||
perfec,10000,1000000,390,640,780,0,0,1,1,1,0,0,0,100642,
|
||||
flower,10000,300000,70,200,400,650,60,1,1,1,1,1,0,100643,
|
||||
frgmnt,10000,1000000,330,630,740,650,100,1,1,1,1,1,0,100644,
|
||||
headph,10000,1000000,240,320,520,0,0,1,1,1,0,0,0,100645,
|
||||
crsang,10000,1000000,270,530,670,0,130,1,1,1,0,1,0,100646,
|
||||
musicr4,10000,100000,190,320,580,0,120,1,1,1,0,1,0,100647,
|
||||
imaxim,10000,1000000,440,690,900,870,0,1,1,1,1,0,0,100648,
|
||||
azitat2,10000,1000000,230,520,660,0,80,1,1,1,0,1,0,100649,
|
||||
dynami,10000,1000000,260,540,680,0,110,1,1,1,0,1,0,100650,
|
||||
incave,10000,1000000,220,440,760,780,0,1,1,1,1,0,0,100651,
|
||||
aktuki,10000,1000000,260,580,840,0,100,1,1,1,0,1,0,100652,
|
||||
kindof,10000,1000000,140,290,480,0,0,1,1,1,0,0,0,100653,
|
||||
mikaku,10000,1000000,190,310,540,0,0,1,1,1,0,0,0,100654,
|
||||
strang,10000,1000000,120,280,550,0,0,1,1,1,0,0,0,100655,
|
||||
hesper,10000,1000000,360,610,920,930,0,1,1,1,1,0,0,100656,
|
||||
breaka,10000,300000,150,310,450,680,70,1,1,1,1,1,0,100657,
|
||||
myname,10000,1000000,60,140,300,570,0,1,1,1,1,0,0,100658,
|
||||
amaiko,10000,1000000,150,370,600,0,0,1,1,1,0,0,0,100659,
|
||||
reseed2,10000,1000000,220,470,630,0,0,1,1,1,0,0,0,100660,
|
||||
kingst,10000,1000000,380,630,740,0,120,1,1,1,0,1,0,100661,
|
||||
ramram,10000,1000000,230,340,670,0,0,1,1,1,0,0,0,100662,
|
||||
murasa,10000,1000000,280,410,760,0,0,1,1,1,0,0,0,100663,
|
||||
happyd,10000,1100000,220,410,730,790,180,1,1,1,1,1,0,100664,
|
||||
izimed,10000,300000,190,390,690,770,90,1,1,1,1,1,0,100665,
|
||||
wastel,10000,1000000,40,120,230,400,0,1,1,1,1,0,0,100666,
|
||||
assign,10000,1000000,260,430,610,620,0,1,1,1,1,0,0,100667,
|
||||
jahaci,10000,1000000,170,290,590,0,0,1,1,1,0,0,0,100668,
|
||||
hisuii,10000,1000000,220,470,700,0,0,1,1,1,0,0,0,100669,
|
||||
godkno,10000,300000,100,260,450,640,60,1,1,1,1,1,0,100670,
|
||||
roadof,10000,300000,150,360,500,750,70,1,1,1,1,1,0,100671,
|
||||
rokuch,10000,300000,210,350,620,810,110,1,1,1,1,1,0,100672,
|
||||
valent,10000,300000,270,330,590,770,100,1,1,1,1,1,0,100673,
|
||||
unfini,10000,300000,160,320,500,710,80,1,1,1,1,1,0,100674,
|
||||
auflcb2,10000,1000000,220,370,750,0,100,1,1,1,0,1,0,100675,
|
||||
burnin,10000,1000000,180,280,600,850,150,1,1,1,1,1,0,100676,
|
||||
sphere,10000,1000000,200,380,730,0,0,1,1,1,0,0,0,100677,
|
||||
dropou,10000,300000,170,310,460,690,140,1,1,1,1,1,0,100678,
|
||||
xencou,10000,300000,200,320,520,600,80,1,1,1,1,1,0,100679,
|
||||
killyk,10000,300000,130,420,630,760,60,1,1,1,1,1,0,100680,
|
||||
missil,10000,1000000,160,380,590,0,0,1,1,1,0,0,0,100681,
|
||||
burstt,10000,300000,120,250,460,630,70,1,1,1,1,1,0,100682,
|
||||
musicr2,10000,100000,220,330,580,0,120,1,1,1,0,1,0,100683,
|
||||
isingl,10000,1000000,250,440,800,0,120,1,1,1,0,1,0,100684,
|
||||
lvless,10000,1000000,230,380,600,0,0,1,1,1,0,0,0,100685,
|
||||
sapphi,10000,1000000,290,440,810,0,0,1,1,1,0,0,0,100686,
|
||||
musicr3,10000,100000,190,320,580,720,120,1,1,1,1,1,0,100687,
|
||||
deeout,10000,1000000,180,340,630,810,0,1,1,1,1,0,0,100688,
|
||||
sugars,10000,300000,170,300,420,660,60,1,1,1,1,1,0,100689,
|
||||
mercur,10000,1000000,140,350,660,0,0,1,1,1,0,0,0,100690,
|
||||
zizizi,10000,1000000,300,570,880,960,0,1,1,1,1,0,0,100691,
|
||||
wegooo,10000,300000,180,340,540,680,100,1,1,1,1,1,0,100692,
|
||||
alonee,10000,300000,110,210,360,480,50,1,1,1,1,1,0,100693,
|
||||
nuheat,10000,1000000,290,440,650,850,0,1,1,1,1,0,0,100694,
|
||||
granro,10000,300000,150,280,430,600,80,1,1,1,1,1,0,100695,
|
||||
sister,10000,300000,100,270,460,630,70,1,1,1,1,1,0,100696,
|
||||
lotusl,10000,1000000,200,360,640,0,0,1,1,1,0,0,0,100697,
|
||||
yukari,10000,1000000,310,500,760,840,0,1,1,1,1,0,0,100698,
|
||||
flawli,10000,300000,170,300,400,590,80,1,1,1,1,1,0,100699,
|
||||
nightf,10000,1000000,150,280,460,710,0,1,1,1,1,0,0,100700,
|
||||
random,10000,100000,0,0,0,0,0,0,0,0,0,0,0,100701,
|
||||
wiwwtw,10000,1000000,260,380,620,0,0,1,1,1,0,0,0,100702,
|
||||
inneru,10000,300000,220,360,480,670,90,1,1,1,1,1,0,100703,
|
||||
taishi,10000,1000000,190,350,580,0,0,1,1,1,0,0,0,100704,
|
||||
daysss,10000,1000000,380,590,810,810,0,1,1,1,1,0,0,100705,
|
||||
bokuwa,10000,300000,230,340,550,690,160,1,1,1,1,1,0,100706,
|
||||
showww,10000,300000,180,350,510,790,150,1,1,1,1,1,0,100707,
|
||||
nevers,10000,300000,260,320,650,750,150,1,1,1,1,1,0,100708,
|
||||
bleeze,10000,300000,160,310,470,620,90,1,1,1,1,1,0,100709,
|
||||
dreami,10000,1000000,140,370,650,0,0,1,1,1,0,0,0,100710,
|
||||
allune,10000,1000000,140,350,710,0,0,1,1,1,0,0,0,100711,
|
||||
always,10000,1000000,130,270,490,0,0,1,1,1,0,0,0,100712,
|
||||
anomie2,10000,1000000,160,430,840,0,0,1,1,1,0,0,0,100713,
|
||||
aquali2,10000,1000000,220,430,600,810,0,1,1,1,1,0,0,100714,
|
||||
astaro,10000,1000000,230,400,740,0,0,1,1,1,0,0,0,100715,
|
||||
bassan,10000,1000000,200,320,660,0,0,1,1,1,0,0,0,100716,
|
||||
zonzon2,10000,1000000,130,270,680,750,0,1,1,1,1,0,0,100717,
|
||||
bouled,10000,1000000,190,300,570,0,0,1,1,1,0,0,0,100718,
|
||||
brandn,10000,1000000,90,390,660,720,0,1,1,1,1,0,0,100719,
|
||||
bravee,10000,1000000,350,600,820,0,250,1,1,1,0,-1,0,100720,
|
||||
breakd2,10000,1000000,340,640,740,0,0,1,1,1,0,0,0,100721,
|
||||
buffet,10000,1000000,380,550,680,0,300,1,1,1,0,-1,0,100722,
|
||||
buzzke,10000,1000000,180,330,580,770,0,1,1,1,1,0,0,100723,
|
||||
cashhh,10000,1000000,190,250,640,0,0,1,1,1,0,0,0,100724,
|
||||
cloudb,10000,1000000,370,660,740,0,250,1,1,1,0,-1,0,100725,
|
||||
clouds,10000,1000000,130,250,470,0,0,1,1,1,0,0,0,100726,
|
||||
codepa,10000,1000000,290,550,700,0,150,1,1,1,0,-1,0,100727,
|
||||
comear,10000,1000000,380,560,830,0,250,1,1,1,0,-1,0,100728,
|
||||
crysta,10000,1000000,370,560,810,0,300,1,1,1,0,-1,0,100729,
|
||||
curseo,10000,1000000,220,360,740,0,0,1,1,1,0,0,0,100730,
|
||||
datami,10000,1000000,180,360,660,0,0,1,1,1,0,0,0,100731,
|
||||
defaul,10000,1000000,210,330,480,0,0,1,1,1,0,0,0,100732,
|
||||
design2,10000,1000000,250,430,680,0,0,1,1,1,0,0,0,100733,
|
||||
diamon,10000,1000000,100,260,330,0,0,1,1,1,0,0,0,100734,
|
||||
dispel,10000,1000000,280,480,800,0,0,1,1,1,0,0,0,100735,
|
||||
distan,10000,1000000,200,300,680,0,0,1,1,1,0,0,0,100736,
|
||||
dokibl,10000,1000000,150,230,670,0,0,1,1,1,0,0,0,100737,
|
||||
dontwa,10000,1000000,130,340,690,0,0,1,1,1,0,0,0,100738,
|
||||
drgirl,10000,1000000,190,350,540,730,0,1,1,1,1,0,0,100739,
|
||||
eterna,10000,1000000,120,210,390,0,0,1,1,1,0,0,0,100740,
|
||||
everkr,10000,1000000,180,290,410,0,0,1,1,1,0,0,0,100741,
|
||||
everwh,10000,1000000,200,310,580,0,0,1,1,1,0,0,0,100742,
|
||||
farthe,10000,1000000,300,560,780,870,0,1,1,1,1,0,0,100743,
|
||||
filame,10000,1000000,230,380,630,0,0,1,1,1,0,0,0,100744,
|
||||
flameu2,10000,1000000,170,240,590,0,0,1,1,1,0,0,0,100745,
|
||||
freeee,10000,1000000,190,390,690,0,0,1,1,1,0,0,0,100746,
|
||||
funkyb2,10000,1000000,210,340,560,0,0,1,1,1,0,0,0,100747,
|
||||
granda2,10000,1000000,240,410,730,830,0,1,1,1,1,0,0,100748,
|
||||
hsphsp,10000,1000000,120,250,690,0,0,1,1,1,0,0,0,100749,
|
||||
halluc,10000,1000000,400,520,870,0,0,1,1,1,0,0,0,100750,
|
||||
indigo,10000,1000000,170,330,500,750,0,1,1,1,1,0,0,100751,
|
||||
inters,10000,1000000,250,420,770,0,0,1,1,1,0,0,0,100752,
|
||||
incave2,10000,1000000,310,570,880,0,0,1,1,1,0,0,0,100753,
|
||||
ioniza,10000,1000000,170,340,700,850,0,1,1,1,1,0,0,100754,
|
||||
guilty,10000,1000000,150,280,500,0,0,1,1,1,0,0,0,100755,
|
||||
keraun,10000,1000000,250,520,790,0,0,1,1,1,0,0,0,100756,
|
||||
landin2,10000,1000000,200,340,590,660,0,1,1,1,1,0,0,100757,
|
||||
videog,10000,1000000,210,370,620,0,0,1,1,1,0,0,0,100758,
|
||||
loseyo,10000,1000000,200,300,710,0,0,1,1,1,0,0,0,100759,
|
||||
machin,10000,1000000,120,280,720,0,0,1,1,1,0,0,0,100760,
|
||||
makeit,10000,1000000,110,240,480,0,0,1,1,1,0,0,0,100761,
|
||||
daydre,10000,1000000,190,360,800,0,0,1,1,1,0,0,0,100762,
|
||||
metron,10000,1000000,200,440,710,0,0,1,1,1,0,0,0,100763,
|
||||
milkyw,10000,1000000,220,310,600,0,0,1,1,1,0,0,0,100764,
|
||||
nayuta,10000,1000000,170,370,680,0,0,1,1,1,0,0,0,100766,
|
||||
nightm,10000,1000000,200,490,730,0,0,1,1,1,0,0,0,100767,
|
||||
otherw,10000,1000000,230,410,760,0,0,1,1,1,0,0,0,100768,
|
||||
overth,10000,1000000,330,570,820,0,250,1,1,1,0,-1,0,100769,
|
||||
uuuuuu,10000,1000000,230,370,740,0,0,1,1,1,0,0,0,100770,
|
||||
rainin,10000,1000000,160,410,690,0,0,1,1,1,0,0,0,100771,
|
||||
raisey,10000,1000000,230,550,750,0,150,1,1,1,0,-1,0,100772,
|
||||
resona,10000,1000000,170,320,640,0,0,1,1,1,0,0,0,100773,
|
||||
reuniv,10000,1000000,140,230,410,0,0,1,1,1,0,0,0,100774,
|
||||
rhythm,10000,1000000,370,560,780,0,250,1,1,1,0,-1,0,100775,
|
||||
rushhh,10000,1000000,250,370,750,0,0,1,1,1,0,0,0,100776,
|
||||
steeee,10000,1000000,300,580,870,0,0,1,1,1,0,0,0,100777,
|
||||
sangey,10000,1000000,270,470,850,0,0,1,1,1,0,0,0,100778,
|
||||
senpai,10000,1000000,380,540,770,0,250,1,1,1,0,-1,0,100779,
|
||||
sestea,10000,1000000,270,470,760,0,0,1,1,1,0,0,0,100780,
|
||||
silver,10000,1000000,280,400,690,0,0,1,1,1,0,0,0,100781,
|
||||
sodama,10000,1000000,200,400,650,0,0,1,1,1,0,0,0,100782,
|
||||
stardu,10000,1000000,190,330,640,0,0,1,1,1,0,0,0,100783,
|
||||
starti,10000,1000000,170,310,540,700,0,1,1,1,1,0,0,100784,
|
||||
sunday,10000,1000000,180,290,460,670,0,1,1,1,1,0,0,100785,
|
||||
sundro2,10000,1000000,300,480,790,820,0,1,1,1,1,0,0,100786,
|
||||
sunnyd,10000,1000000,230,380,590,0,0,1,1,1,0,0,0,100787,
|
||||
superl,10000,1000000,150,320,590,0,0,1,1,1,0,0,0,100788,
|
||||
switch,10000,1000000,160,350,690,0,0,1,1,1,0,0,0,100789,
|
||||
theepi2,10000,1000000,220,370,650,0,0,1,1,1,0,0,0,100790,
|
||||
epipha,10000,1000000,150,300,700,0,0,1,1,1,0,0,0,100791,
|
||||
thekin,10000,1000000,220,520,750,0,0,1,1,1,0,0,0,100792,
|
||||
timele,10000,1000000,160,330,720,0,0,1,1,1,0,0,0,100793,
|
||||
tokyoo,10000,1000000,150,330,710,0,0,1,1,1,0,0,0,100794,
|
||||
toooma,10000,1000000,300,510,770,0,0,1,1,1,0,0,0,100795,
|
||||
toucho2,10000,1000000,170,320,520,780,0,1,1,1,1,0,0,100796,
|
||||
tayuta,10000,1000000,260,350,720,0,0,1,1,1,0,0,0,100797,
|
||||
ultrix,10000,1000000,270,450,760,0,0,1,1,1,0,0,0,100798,
|
||||
underw,10000,1000000,290,460,690,860,0,1,1,1,1,0,0,100799,
|
||||
virtua,10000,1000000,150,350,630,0,0,1,1,1,0,0,0,100800,
|
||||
voiceo2,10000,1000000,140,380,670,0,0,1,1,1,0,0,0,100801,
|
||||
wannab2,10000,1000000,260,410,690,0,0,1,1,1,0,0,0,100802,
|
||||
wiwwtw2,10000,1000000,200,430,670,720,0,1,1,1,1,0,0,100803,
|
||||
wingso,10000,1000000,200,530,710,0,0,1,1,1,0,0,0,100804,
|
||||
winter,10000,1000000,140,240,410,0,0,1,1,1,0,0,0,100805,
|
||||
iineee,10000,1000000,210,400,810,0,0,1,1,1,0,0,0,100806,
|
||||
illumi,10000,1000000,100,250,460,630,0,1,1,1,1,0,0,100807,
|
||||
yellll,10000,1000000,80,170,520,0,0,1,1,1,0,0,0,100808,
|
||||
eschat,10000,1000000,360,570,770,0,250,1,1,1,0,-1,0,100809,
|
||||
counte,10000,1000000,290,340,710,0,0,1,1,1,0,0,0,100810,
|
||||
gimcho,10000,1000000,180,390,700,0,0,1,1,1,0,0,0,100811,
|
||||
surviv,10000,1000000,240,400,650,0,0,1,1,1,0,0,0,100812,
|
||||
turkis3,10000,1000000,60,200,480,0,0,1,1,1,0,0,0,100814,
|
||||
picora2,10000,1000000,280,530,800,0,0,1,1,1,0,0,0,100815,
|
||||
fortis,10000,1000000,200,370,530,0,0,1,1,1,0,0,0,100816,
|
||||
hedban,10000,1000000,160,430,660,0,0,1,1,1,0,0,0,100817,
|
||||
megitu,10000,1000000,150,300,490,0,0,1,1,1,0,0,0,100818,
|
||||
rockma,10000,1000000,270,480,730,0,0,1,1,1,0,0,0,100819,
|
||||
kounen2,10000,1000000,210,430,730,0,0,1,1,1,0,0,0,100820,
|
||||
saisyu,10000,1000000,180,360,560,0,0,1,1,1,0,0,0,100821,
|
||||
yuukan,10000,1000000,220,330,780,0,0,1,1,1,0,0,0,100822,
|
||||
modern,10000,1000000,200,320,560,0,0,1,1,1,0,0,0,100823,
|
||||
miraie,10000,1000000,210,350,660,0,0,1,1,1,0,0,0,100824,
|
||||
ranfes,10000,1000000,200,420,650,0,0,1,1,1,0,0,0,100825,
|
||||
nemure,10000,1000000,150,380,670,760,0,1,1,1,1,0,0,100826,
|
||||
yuwaku,10000,1000000,150,260,430,0,0,1,1,1,0,0,0,100827,
|
||||
dontst,10000,1000000,150,320,560,700,0,1,1,1,1,0,0,100828,
|
||||
mottai,10000,1000000,100,260,360,0,0,1,1,1,0,0,0,100829,
|
||||
slysly,10000,1000000,100,330,580,0,0,1,1,1,0,0,0,100830,
|
||||
lookam,10000,1000000,170,340,670,0,0,1,1,1,0,0,0,100831,
|
||||
feverr,10000,1000000,280,480,680,0,0,1,1,1,0,0,0,100832,
|
||||
fashio,10000,1000000,80,240,390,0,0,1,1,1,0,0,0,100833,
|
||||
hagito,10000,1000000,120,260,500,0,0,1,1,1,0,0,0,100834,
|
||||
invade,10000,1000000,100,280,470,0,0,1,1,1,0,0,0,100835,
|
||||
ainoch,10000,1000000,170,400,590,0,0,1,1,1,0,0,0,100836,
|
||||
nakama,10000,1000000,140,320,530,0,0,1,1,1,0,0,0,100837,
|
||||
ninjar,10000,1000000,80,230,410,650,0,1,1,1,1,0,0,100838,
|
||||
parall,10000,1000000,140,350,610,0,0,1,1,1,0,0,0,100839,
|
||||
yukifu,10000,1000000,130,290,510,0,0,1,1,1,0,0,0,100840,
|
||||
furiso,10000,1000000,120,240,440,740,0,1,1,1,1,0,0,100841,
|
||||
honeyj,10000,100000,320,630,880,930,240,1,1,1,1,1,6,100842,
|
||||
emeraj,10000,100000,300,530,850,0,190,1,1,1,0,1,1,100843,
|
||||
dazzlo,10000,200000,350,600,800,900,160,1,1,1,1,1,1,100844,
|
|
10
titles/cxb/rev_data/NewsList.csv
Normal file
10
titles/cxb/rev_data/NewsList.csv
Normal file
@ -0,0 +1,10 @@
|
||||
1,1,1601510400,4096483201,1,0,0,0,1,0,news0001,,,1,1,
|
||||
2,1,1601510400,4096483201,1,0,0,0,1,0,news0002,,,1,1,
|
||||
3,1,1601510400,4096483201,1,0,0,0,1,0,news0003,,,1,1,
|
||||
4,1,1601510400,4096483201,1,0,0,0,1,0,news0004,,,1,1,
|
||||
5,1,1601510400,4096483201,0,0,0,1,1,0,news0005,,,1,1,
|
||||
6,1,1601510400,4096483201,1,0,0,0,1,0,news0006,,,1,1,
|
||||
7,1,1601510400,4096483201,1,0,0,0,1,0,news0007,,,1,1,
|
||||
8,1,1601510400,4096483201,1,0,0,0,1,0,news0008,,,1,1,
|
||||
9,1,1601510400,4096483201,1,0,0,0,1,0,news0009,,,1,1,
|
||||
10,1,1601510400,4096483201,1,0,0,0,1,0,news0010,,,1,1,
|
|
4
titles/cxb/rev_data/Shop/ShopList_Icon.csv
Normal file
4
titles/cxb/rev_data/Shop/ShopList_Icon.csv
Normal file
@ -0,0 +1,4 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
1000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,ic0000,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
1001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,ic0001,10,1,Next Frontier (Master)をクリア,0,-1,-1,megaro,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
1002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ic0002,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
|
13
titles/cxb/rev_data/Shop/ShopList_Music.csv
Normal file
13
titles/cxb/rev_data/Shop/ShopList_Music.csv
Normal file
@ -0,0 +1,13 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,MusicCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op),HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
0,1,1.00.00,3,1,-,1411697520.0288,1443233520.0288,megaro,0,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
1,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,nature,10,2,???,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
2,3,1.00.00,2,-1,-,1412103600.0288,1443639598.992,hopesb,30,1,「Landing on the moon」をSTANDARD以上でクリアする。,0,-1,-1,landin,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3,4,1.00.00,1,-1,-,1412103600.0288,1443639598.992,flower,10,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
4,5,1.00.02,1,-1,1&2&3,1412103600.0288,1443639598.992,reseed3,10,0,「Human Nature」「Hopes Bright」「Flowerwall」をクリアする。,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5,6,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,dennou,20,1,-,0,-1,-1,flower,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
6,7,1.00.00,2,-1,5&7,1411697520.0288,1443233520.0288,romanc,10,1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
7,8,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,landin,40,1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
8,9,1.00.00,1,-1,7,1411697520.0288,1443233520.0288,ididid,50,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
9,10,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,crissc,60,0,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,2,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,,,
|
||||
10,11,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,dazzli,70,1,MASTER以上の4曲S+以上クリアする。,1,1,4,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
11,12,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,izimed,987654,1,MASTER以上の7曲S+以上クリアする。,1,1,7,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
|
3
titles/cxb/rev_data/Shop/ShopList_Sale.csv
Normal file
3
titles/cxb/rev_data/Shop/ShopList_Sale.csv
Normal file
@ -0,0 +1,3 @@
|
||||
saleID.,開始日,終了日,ShopID,Price,
|
||||
0,1411696799.9712,1443236400,0,7000,
|
||||
1,1411783199.9712,1443322800,1,7000,
|
|
4
titles/cxb/rev_data/Shop/ShopList_SkinBg.csv
Normal file
4
titles/cxb/rev_data/Shop/ShopList_SkinBg.csv
Normal file
@ -0,0 +1,4 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
3000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skb0000,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skb0001,10,1,Next Frontier (Master)をクリア,0,-1,-1,bleeze,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,skb0002,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
|
11
titles/cxb/rev_data/Shop/ShopList_SkinEffect.csv
Normal file
11
titles/cxb/rev_data/Shop/ShopList_SkinEffect.csv
Normal file
@ -0,0 +1,11 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
5000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,ske0000,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,ske0001,10,1,Next Frontier (Master)をクリア,0,-1,-1,megaro,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0002,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
||||
5003,4,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0003,10,0,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5004,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0004,10,2,2曲クリア,1,1,2,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5005,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0005,10,2,3曲クリア,1,1,3,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5006,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0006,10,2,4曲クリア,1,1,4,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5007,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0007,10,2,5曲クリア,1,1,5,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5008,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0008,10,2,6曲クリア,1,1,6,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5009,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,ske0009,10,2,7曲クリア,1,1,7,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
|
6
titles/cxb/rev_data/Shop/ShopList_SkinNotes.csv
Normal file
6
titles/cxb/rev_data/Shop/ShopList_SkinNotes.csv
Normal file
@ -0,0 +1,6 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
4000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skt0000,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
4001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skt0001,10,1,Next Frontier (Master)をクリア,0,-1,-1,megaro,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
4002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,skt0002,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
||||
4003,4,1.00.00,1,-1,-,1412103600.0288,1443639598.992,skt0003,10,0,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
4004,5,1.00.00,1,-1,-,1412103600.0288,1443639598.992,skt0004,10,2,aaaaaaaaaaaaaaaaa,1,1,20,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
|
4
titles/cxb/rev_data/Shop/ShopList_Title.csv
Normal file
4
titles/cxb/rev_data/Shop/ShopList_Title.csv
Normal file
@ -0,0 +1,4 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
2000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
2001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,,10,1,Next Frontier (Master)をクリア,0,-1,-1,megaro,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
2002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
|
116
titles/cxb/rev_data/SkinArchiveList.csv
Normal file
116
titles/cxb/rev_data/SkinArchiveList.csv
Normal file
@ -0,0 +1,116 @@
|
||||
mu000,01e0caad-eaee-4810-90ae-6f45abe5c266,
|
||||
ig000,dcac41a7-7816-406e-b750-283e06e77a1b,
|
||||
bg000,e3dc498b-79bd-4110-a0a9-7ab6538ec6a6,
|
||||
mu001,c4dc9846-df4b-4c3d-89b7-e19ae9288de1,
|
||||
ig001,13bc8578-e2bf-45ba-ad10-23831e95f8de,
|
||||
bg001,19a69ba1-a408-4f0c-a923-1d42e7d9eb0e,
|
||||
mu999,3e83ee1c-6936-4e21-a10c-5d359749bb83,
|
||||
ig002,73a5a9d6-c862-4cd0-a36f-26fe73da78de,
|
||||
ig003,9e1d3817-ef60-4d8d-9beb-c0749b6b51fd,
|
||||
ig004,90e6f2da-9678-4847-8435-30f238f214ab,
|
||||
ig005,681c7bb1-8f73-4753-8945-f46572716bff,
|
||||
th000,6a422181-03e0-4b97-b443-22ad0004e85a,
|
||||
th001,ad9dfefd-a687-4cca-8e89-6245c94e52c9,
|
||||
th999,fbf16d3c-1718-4b7d-af3d-68f8b8e18867,
|
||||
ig006,578d6c5c-10f6-4c0e-a99b-29bab4938ade,
|
||||
ev999,a02c3fb7-53bc-4380-93da-57988ed3b9d2,
|
||||
mu002,aef73754-f2e7-47c4-bfb3-eb5366aa2b6d,
|
||||
ig007,3ac11d24-3dbe-4800-a2ed-6bbc4e093c6d,
|
||||
bg002,70ae1a4e-1c4d-4f12-a326-c3fac0e87045,
|
||||
th002,9ee6fd76-4b9c-44c2-90be-a50530f0313f,
|
||||
mu003,09c4fd8b-111b-4dbb-92c3-94fcfb14a311,
|
||||
ig008,869bb37b-0abb-4c4f-a56a-03f7ee98ea14,
|
||||
bg003,d4165292-3140-41e4-bde9-a1a530c462ab,
|
||||
th003,6053e709-d3c5-4110-9b07-47876bba00cf,
|
||||
ig009,b8e368c3-085c-467b-9654-90c63cb390f7,
|
||||
ig010,7e3e2b96-0cf9-4920-9264-6f284019dee7,
|
||||
bg999,5ba48136-a854-4299-8790-c1c371945eb0,
|
||||
bg004,25cb7abb-ad50-469a-9d28-440f3ffec9e8,
|
||||
ig011,7b92ac76-9750-4efe-ad92-e43844d8e9e2,
|
||||
mu004,abfa94c5-a303-4c7a-bacd-bbbda7d3877e,
|
||||
ig012,de774207-7a71-42cd-b54e-054b67199f7d,
|
||||
bg005,2aa16e78-893a-4e34-95ef-c7d205a40ea3,
|
||||
th004,6589a0cc-0b2d-46b2-a21c-49ad68deeff5,
|
||||
mu005,f1ce21fc-f512-43e5-af39-001278d6e8ac,
|
||||
ig013,364a9449-bb7b-47ed-b72b-4f7a5583966b,
|
||||
bg006,b2212579-69b0-480e-a4ab-685bf5c2599d,
|
||||
th005,9392bbee-3762-4d19-a382-1bc1e4d38dc5,
|
||||
ig014,45ecd41a-976f-42cb-bbb7-9c70946f7793,
|
||||
ig015,a2f8cb15-e579-41d4-958a-42cfb3db08f2,
|
||||
ig016,fd991b2f-22a2-4b4b-95ec-06ae70fa4cf8,
|
||||
ig020,b0d366c4-644f-403f-aa0b-87ec781c5a47,
|
||||
ig030,c3a59d08-0c9b-4577-9e3c-3b828a5dbae4,
|
||||
mu007,cc4d20dd-0db2-4128-b366-cc466c074edd,
|
||||
mu008,873550c2-8c69-4d32-9af0-b1193a3297ff,
|
||||
mu009,966b2c02-f467-4b12-811c-d5df28378b88,
|
||||
mu010,93b7cf77-5f4e-4060-839c-d07ea1cb9293,
|
||||
mu011,8fa1af29-61d4-4ed3-bf5d-1755cc63f597,
|
||||
mu013,e62242b0-22c5-435c-a904-97fc815113b3,
|
||||
mu014,f5ba080a-be40-4d99-a7b5-65ac370c6625,
|
||||
mu015,492e20bb-5394-4159-938e-0c626a69fbb8,
|
||||
mu016,c3db7891-26f1-4070-bd58-fb193c3d6b98,
|
||||
mu017,c43be79b-90ff-4a3c-90a0-4b01f16175b8,
|
||||
mu018,3cbc6540-95c5-40ba-a17b-b37044695bbd,
|
||||
mu012,d4407594-5928-4606-8831-0becd9a82e79,
|
||||
th007,4db1a0a5-f0a8-4909-83eb-d5a53de174fc,
|
||||
ig017,52c31a94-ef44-4dbd-a26a-4aa43590c998,
|
||||
ig018,2ea1ba61-352c-4ff3-8854-ae34ec6a3cb8,
|
||||
ig019,f79e01a8-f325-409c-8b55-b40fd09f485b,
|
||||
ig021,0abe9547-fc5d-4677-8469-7da6b0dcc46d,
|
||||
ig022,b2eba0ca-08f3-412b-a4ff-df301aef59a5,
|
||||
ig023,2a615618-df3c-4eb5-8f9a-cdceed2f70b2,
|
||||
ig024,bac5cd51-1ae3-483e-bac0-ddd0aa79a544,
|
||||
ig025,39241b3b-c3bb-4852-9bc1-b5ad4950788d,
|
||||
ig026,c5e90844-2e42-4702-95c0-536f1f707b69,
|
||||
ig027,243e96c0-c3bb-4cbf-8714-39e637a1fc4c,
|
||||
ig028,c9663a15-3379-4c26-833e-c0cbe75f1725,
|
||||
ig029,bd4f1868-530f-47ff-8ad9-331f025a30cd,
|
||||
ig031,a50830c8-85cf-4b90-9f76-369c6786aa10,
|
||||
ig032,7547c19d-c0e8-4fa2-bb02-a0818c908f1d,
|
||||
ig033,f8163e70-a91b-4c37-8ff0-c519ac41789d,
|
||||
ig034,32649798-7da7-4bef-94ae-eac2823dbdca,
|
||||
ig035,f61efc53-582e-424b-9c6a-27b714414ac7,
|
||||
ig036,31c83605-88f3-4190-a875-40afca619bc7,
|
||||
ig037,c7c94234-e593-47cc-9440-3ae6e5700d4e,
|
||||
ig038,414fed22-596a-4b82-b322-0592b6284c6c,
|
||||
ig039,6832ca35-7187-4ca9-a677-c5587f3dfc37,
|
||||
ig040,3e1a72fd-de2a-4de1-b9cb-c6b70e8dd865,
|
||||
ig042,6b689c36-f388-48e8-93d3-2c73c71b2279,
|
||||
ig043,f5d69985-5662-40e2-a184-2da3258f77ea,
|
||||
ig044,8b0605fe-06de-4b2a-9c31-a229b8b5da3f,
|
||||
mu019,31ad932c-990e-4967-90b6-188f2c656dbb,
|
||||
bg007,28f01dfc-e73d-4701-a2d1-ac929785ea98,
|
||||
bg008,ba10a865-19f1-4953-a115-3b711768f9bf,
|
||||
bg009,7459ec1c-07dd-43fd-89ad-7cd5a6acf704,
|
||||
bg010,d464e672-3b16-4b18-966e-55822d831023,
|
||||
bg011,8a8558b8-da63-4efe-90ee-42da6aa742c4,
|
||||
bg012,9aac6c96-38d4-4869-a255-bffa2a941bd7,
|
||||
bg013,a7afb95b-d57d-4530-86e9-4930e2eaaff5,
|
||||
bg014,17369ad5-64fb-43c6-a13b-1427187c4711,
|
||||
bg015,594e5fa6-ebdf-495d-84c7-c4680d5e754b,
|
||||
bg016,e1cb508a-2644-4a75-9d9f-1458e3e8cf96,
|
||||
bg017,27a7bfbd-2fef-4254-86d3-60d4e279cfed,
|
||||
bg018,4d8f37e0-eb2e-4286-a4eb-3fd378ad94cc,
|
||||
bg019,dc582ac8-1fa8-438f-a791-d486f17c9029,
|
||||
mu006,f068ffc0-87c5-4caf-b206-dc1ba5516c99,
|
||||
th998,141f4a98-09bf-4a52-b42e-571fadcc53eb,
|
||||
ig045,a8b3d9ff-839d-4016-9ce6-9d9bb63d1d36,
|
||||
ig046,a2e9997b-64a8-4874-b0c5-17093441a2f5,
|
||||
th006,2bd08a14-c84e-47d2-b0d5-e9f0c8937b98,
|
||||
ig047,a210e6d6-82af-4081-aeae-196e6b3528c0,
|
||||
th008,cd740e0a-d10c-47cc-a7b8-bff2d03977cb,
|
||||
th009,a0b39026-4615-4087-b3de-4bced4ec926d,
|
||||
th010,013cfef7-029c-448d-9740-e649b89baa28,
|
||||
th011,caf1bf2d-9e04-4b12-a13b-502fe9abbd99,
|
||||
th012,3689be3f-33bd-4672-b78c-5ea4d46cd15d,
|
||||
th013,c8ea8eac-b71d-446e-827b-e6092892a086,
|
||||
th014,64af0cbc-ba40-4794-8197-496a2109d4ec,
|
||||
th015,b3d4fc6b-4aba-4c80-8bd0-5b4fce6bf57b,
|
||||
th016,513f56cc-a5d9-4bd1-8209-29b2b87fac53,
|
||||
th017,0803f23d-587b-443d-a9c4-0fce063be8fc,
|
||||
th018,7abbeec8-9a22-4f83-9116-14274cf64479,
|
||||
th019,78ef3012-f687-46a1-ad64-a8ae20f33319,
|
||||
ig049,c37a2a37-e42b-4adf-85f4-86509032b42d,
|
||||
ig050,1368f1bd-a407-4273-ae4b-db6bec4d2cf9,
|
||||
ig051,a64f5b47-5e2e-442d-95e3-2be7c7071253,
|
||||
ig052,a419e87c-6187-4a2f-bd22-e86c92153395,
|
|
257
titles/cxb/rss1.py
Normal file
257
titles/cxb/rss1.py
Normal file
@ -0,0 +1,257 @@
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from base64 import b64encode
|
||||
from typing import Any, Dict
|
||||
from hashlib import md5
|
||||
from datetime import datetime
|
||||
|
||||
from core.config import CoreConfig
|
||||
from core.data import Data, cached
|
||||
from titles.cxb.config import CxbConfig
|
||||
from titles.cxb.base import CxbBase
|
||||
from titles.cxb.const import CxbConstants
|
||||
|
||||
class CxbRevSunriseS1(CxbBase):
|
||||
def __init__(self, cfg: CoreConfig, game_cfg: CxbConfig) -> None:
|
||||
super().__init__(cfg, game_cfg)
|
||||
self.version = CxbConstants.VER_CROSSBEATS_REV_SUNRISE_S1
|
||||
|
||||
def handle_data_path_list_request(self, data: Dict) -> Dict:
|
||||
return { "data": "" }
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_music_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rss1_data/MusicArchiveList.csv") as music:
|
||||
lines = music.readlines()
|
||||
for line in lines:
|
||||
line_split = line.split(',')
|
||||
ret_str += f"{line_split[0]},{line_split[1]},{line_split[2]},{line_split[3]},{line_split[4]},{line_split[5]},{line_split[6]},{line_split[7]},{line_split[8]},{line_split[9]},{line_split[10]},{line_split[11]},{line_split[12]},{line_split[13]},{line_split[14]},\r\n"
|
||||
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_item_list_detail_request(self, data: Dict) -> Dict:
|
||||
#ItemListIcon load
|
||||
ret_str = "#ItemListIcon\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Item/ItemList_Icon.csv", encoding="shift-jis") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ItemListTitle load
|
||||
ret_str += "\r\n#ItemListTitle\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Item/ItemList_Title.csv", encoding="shift-jis") as item:
|
||||
lines = item.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_shop_list_detail_request(self, data: Dict) -> Dict:
|
||||
#ShopListIcon load
|
||||
ret_str = "#ShopListIcon\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_Icon.csv", encoding="utf-8") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListMusic load
|
||||
ret_str += "\r\n#ShopListMusic\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_Music.csv", encoding="utf-8") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListSale load
|
||||
ret_str += "\r\n#ShopListSale\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_Sale.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListSkinBg load
|
||||
ret_str += "\r\n#ShopListSkinBg\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_SkinBg.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListSkinEffect load
|
||||
ret_str += "\r\n#ShopListSkinEffect\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_SkinEffect.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListSkinNotes load
|
||||
ret_str += "\r\n#ShopListSkinNotes\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_SkinNotes.csv", encoding="shift-jis") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
|
||||
#ShopListTitle load
|
||||
ret_str += "\r\n#ShopListTitle\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Shop/ShopList_Title.csv", encoding="utf-8") as shop:
|
||||
lines = shop.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_extra_stage_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_ex0001_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_one_more_extra_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_bonus_list10100_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_oe0001_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_free_coupon_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_news_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rss1_data/NewsList.csv", encoding="UTF-8") as news:
|
||||
lines = news.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_tips_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_release_info_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_random_music_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rss1_data/MusicArchiveList.csv") as music:
|
||||
lines = music.readlines()
|
||||
count = 0
|
||||
for line in lines:
|
||||
line_split = line.split(",")
|
||||
ret_str += str(count) + "," + line_split[0] + "," + line_split[0] + ",\r\n"
|
||||
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_license_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rss1_data/License.csv", encoding="UTF-8") as licenses:
|
||||
lines = licenses.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_course_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
with open(r"titles/cxb/rss1_data/Course/CourseList.csv", encoding="UTF-8") as course:
|
||||
lines = course.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_csxxxx_request(self, data: Dict) -> Dict:
|
||||
extra_num = int(data["dldate"]["filetype"][-4:])
|
||||
ret_str = ""
|
||||
with open(fr"titles/cxb/rss1_data/Course/Cs{extra_num}.csv", encoding="shift-jis") as course:
|
||||
lines = course.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data":ret_str})
|
||||
|
||||
def handle_data_mission_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_mission_bonus_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_unlimited_mission_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_partner_list_request(self, data: Dict) -> Dict:
|
||||
ret_str = ""
|
||||
# Lord forgive me for the sins I am about to commit
|
||||
for i in range(0,10):
|
||||
ret_str += f"80000{i},{i},{i},0,10000,,\r\n"
|
||||
ret_str += f"80000{i},{i},{i},1,10500,,\r\n"
|
||||
ret_str += f"80000{i},{i},{i},2,10500,,\r\n"
|
||||
for i in range(10,13):
|
||||
ret_str += f"8000{i},{i},{i},0,10000,,\r\n"
|
||||
ret_str += f"8000{i},{i},{i},1,10500,,\r\n"
|
||||
ret_str += f"8000{i},{i},{i},2,10500,,\r\n"
|
||||
ret_str +="\r\n---\r\n0,150,100,100,100,100,\r\n"
|
||||
for i in range(1,130):
|
||||
ret_str +=f"{i},100,100,100,100,100,\r\n"
|
||||
|
||||
ret_str += "---\r\n"
|
||||
return({"data": ret_str})
|
||||
|
||||
@cached(lifetime=86400)
|
||||
def handle_data_partnerxxxx_request(self, data: Dict) -> Dict:
|
||||
partner_num = int(data["dldate"]["filetype"][-4:])
|
||||
ret_str = f"{partner_num},,{partner_num},1,10000,\r\n"
|
||||
with open(r"titles/cxb/rss1_data/Partner0000.csv") as partner:
|
||||
lines = partner.readlines()
|
||||
for line in lines:
|
||||
ret_str += f"{line[:-1]}\r\n"
|
||||
return({"data": ret_str})
|
||||
|
||||
def handle_data_server_state_request(self, data: Dict) -> Dict:
|
||||
return({"data": True})
|
||||
|
||||
def handle_data_settings_request(self, data: Dict) -> Dict:
|
||||
return({"data": "2,\r\n"})
|
||||
|
||||
def handle_data_story_list_request(self, data: Dict) -> Dict:
|
||||
#story id, story name, game version, start time, end time, course arc, unlock flag, song mcode for menu
|
||||
ret_str = "\r\n"
|
||||
ret_str += f"st0000,RISING PURPLE,10104,1464370990,4096483201,Cs1000,-1,purple,\r\n"
|
||||
ret_str += f"st0001,REBEL YELL,10104,1467999790,4096483201,Cs1000,-1,chaset,\r\n"
|
||||
ret_str += f"st0002,REMNANT,10104,1502127790,4096483201,Cs1000,-1,overcl,\r\n"
|
||||
return({"data": ret_str})
|
||||
|
||||
def handle_data_stxxxx_request(self, data: Dict) -> Dict:
|
||||
story_num = int(data["dldate"]["filetype"][-4:])
|
||||
ret_str = ""
|
||||
for i in range(1,11):
|
||||
ret_str +=f"{i},st000{story_num}_{i-1},,,,,,,,,,,,,,,,1,,-1,1,\r\n"
|
||||
return({"data": ret_str})
|
||||
|
||||
def handle_data_event_stamp_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":"Cs1032,1,1,1,1,1,1,1,1,1,1,\r\n"})
|
||||
|
||||
def handle_data_premium_list_request(self, data: Dict) -> Dict:
|
||||
return({"data": "1,,,,10,,,,,99,,,,,,,,,100,,\r\n"})
|
||||
|
||||
def handle_data_event_list_request(self, data: Dict) -> Dict:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_event_detail_list_request(self, data: Dict) -> Dict:
|
||||
event_id = data["dldate"]["filetype"].split("/")[2]
|
||||
if "EventStampMapListCs1002" in event_id:
|
||||
return({"data":"1,2,1,1,2,3,9,5,6,7,8,9,10,\r\n"})
|
||||
elif "EventStampList" in event_id:
|
||||
return({"data":"Cs1002,1,1,1,1,1,1,1,1,1,1,\r\n"})
|
||||
else:
|
||||
return({"data":""})
|
||||
|
||||
def handle_data_event_stamp_map_list_csxxxx_request(self, data: Dict) -> Dict:
|
||||
event_id = data["dldate"]["filetype"].split("/")[2]
|
||||
if "EventStampMapListCs1002" in event_id:
|
||||
return({"data":"1,2,1,1,2,3,9,5,6,7,8,9,10,\r\n"})
|
||||
else:
|
||||
return({"data":""})
|
5
titles/cxb/rss1_data/Course/CourseList.csv
Normal file
5
titles/cxb/rss1_data/Course/CourseList.csv
Normal file
@ -0,0 +1,5 @@
|
||||
Cs0000,0,10001,1422284400,4096483201,0,-1,-1,100,5,クリアすると段位が「見習い」に昇格します。,-1,
|
||||
Cs0001,1,10001,1422284400,4096483201,0,-1,-1,110,5,クリアすると段位が「初段」に昇格します。,-1,
|
||||
Cs0002,2,10001,1422284400,4096483201,0,-1,-1,120,5,クリアすると段位が「二段」に昇格します。,-1,
|
||||
Cs0003,3,10001,1422284400,4096483201,0,-1,-1,130,5,クリアすると段位が「三段」に昇格します。,-1,
|
||||
Cs0004,4,10001,1422284400,4096483201,0,-1,-1,140,5,クリアすると段位が「四段」に昇格します。,-1,
|
|
4
titles/cxb/rss1_data/Course/Cs0000.csv
Normal file
4
titles/cxb/rss1_data/Course/Cs0000.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,okonik,4,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,okonik,0,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,okonik,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,okonik,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rss1_data/Course/Cs0001.csv
Normal file
4
titles/cxb/rss1_data/Course/Cs0001.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,okonik,4,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,okonik,0,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,okonik,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,okonik,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rss1_data/Course/Cs0002.csv
Normal file
4
titles/cxb/rss1_data/Course/Cs0002.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,okonik,4,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,okonik,0,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,okonik,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,okonik,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rss1_data/Course/Cs0003.csv
Normal file
4
titles/cxb/rss1_data/Course/Cs0003.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,okonik,4,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,okonik,0,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,okonik,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,okonik,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
4
titles/cxb/rss1_data/Course/Cs0004.csv
Normal file
4
titles/cxb/rss1_data/Course/Cs0004.csv
Normal file
@ -0,0 +1,4 @@
|
||||
1,okonik,4,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,okonik,0,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
3,okonik,1,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
||||
4,okonik,3,-1,-,-1,-1,-1,-1,-1,-1,-1,
|
|
10
titles/cxb/rss1_data/Ex0000.csv
Normal file
10
titles/cxb/rss1_data/Ex0000.csv
Normal file
@ -0,0 +1,10 @@
|
||||
StageMax,ClearCount,StageNo.,MCODE,Diff(std),Diff(hrd),Diff(mas),Diff(ulm),Diff(esy),Level(op), Level(val), Grade(op),Grade(val),GT(nml),GT(svl),GT(ult),GT(nhp),GT(esy),HS(op),HS(val),APP,DAP,F-V,F-H,FT(ac),FT(tab),FT(pho),Combo(op),Combo(val),FullCombo,ClearRate(op),ClearRate(val)
|
||||
2,1,1,-,2,2,2,1,2,-1,-,1,1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,1,300,-1,-1,-,
|
||||
2,-,2,-,2,2,2,1,2,-1,-,1,1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,1,300,-1,-1,-,
|
||||
3,3,1,-,2,2,1,1,2,-1,-,1,2,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,2,-,2,2,1,1,2,-1,-,1,2,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
3,-,3,-,2,2,1,1,2,1,50,1,2,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,4,1,dynami:fronti:rebell:fronti2:auflcb:auflcb2,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,2,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,3,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
||||
4,-,4,-,2,2,1,1,2,-1,-,1,-1,-1,-1,-1,-1,-1,1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-,-1,-1,-,
|
|
2
titles/cxb/rss1_data/ExtraStageList.csv
Normal file
2
titles/cxb/rss1_data/ExtraStageList.csv
Normal file
@ -0,0 +1,2 @@
|
||||
No.,Ver.,ESID,Title,StartTime,EndTime,出現曲MCODE,出現RP,出現エフェクト,Diff(std),Diff(hrd),Diff(mas),Diff(ulm),Diff(esy),GT(nml),GT(svl),GT(ult),GT(nhp),GT(esy),HS(op),HS(val),APP,DAP,F-V,F-H,FT(ac),FT(tab),FT(pho)
|
||||
1,1000,Ex0000,MEGALOMAN[i]A出現,1411697520.0288,1443233520.0288,megaro,0,3,2,2,1,2,2,2,2,1,2,2,1,-2,-1,-1,-1,-1,-1,-1,-1,
|
|
3
titles/cxb/rss1_data/Item/ItemList_Icon.csv
Normal file
3
titles/cxb/rss1_data/Item/ItemList_Icon.csv
Normal file
@ -0,0 +1,3 @@
|
||||
1000,ic0000,IconName0000,,
|
||||
1001,ic0001,IconName0001,,
|
||||
1002,ic0002,IconName0002,,
|
|
3
titles/cxb/rss1_data/Item/ItemList_Title.csv
Normal file
3
titles/cxb/rss1_data/Item/ItemList_Title.csv
Normal file
@ -0,0 +1,3 @@
|
||||
2000,スーパーゴリラ,4,
|
||||
2001,ふつうのゴリラ,3,
|
||||
2002,モンキー,0,
|
|
89
titles/cxb/rss1_data/License.csv
Normal file
89
titles/cxb/rss1_data/License.csv
Normal file
@ -0,0 +1,89 @@
|
||||
英雄の証 ~ 4Version/カプコンサウンドチーム
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
灼熱の刃 ~ ディノバルド
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
古代の息吹き
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
Theme of Ryu -SFIV Arrange-/Capcom Sound Team / Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Ultra Street Fighter IV/Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Theme of Chun-Li -SFIV Arrange-/Capcom Sound Team / Hideyuki Fukasawa
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
Street Fighter V/Masahiro Aoki
|
||||
©CAPCOM U.S.A., INC. ALL RIGHTS RESERVED.
|
||||
|
||||
英雄の証/MHF-G 2015 Version
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
異ヲ辿リシモノ -対峙-/若林タカツグ
|
||||
© CAPCOM CO., LTD. ALL RIGHTS RESERVED.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
QLWA(グルーヴコースター 3 リンクフィーバーより)/t+pazolite
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
グルーヴ・ザ・ハート(グルーヴコースター 3 リンクフィーバーより)/ビートまりお+あまね
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
Got hive of Ra(グルーヴコースター 3 リンクフィーバーより)/E.G.G.
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
LINK LINK FEVER!!!(グルーヴコースター 3 リンクフィーバーより)/リンカ (CV:豊田萌絵)
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
SAKURA EXHAUST/RIO HAMAMOTO(BNSI)「太鼓の達人」より
|
||||
©BANDAI NAMCO Entertainment Inc.
|
||||
|
||||
カリソメ(グルーヴコースター 3 リンクフィーバーより)/コンプ(豚乙女) × ichigo(岸田教団 & THE明星ロケッツ)
|
||||
©上海アリス幻樂団
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
そして誰もいなくなった(グルーヴコースター 3 リンクフィーバーより)/コバヤシユウヤ(IOSYS) × あにー(TaNaBaTa)
|
||||
©上海アリス幻樂団
|
||||
© TAITO CORPORATION 1978,2016 ALL RIGHTS RESERVED.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Font Design by Fontworks Inc.
|
||||
DynaFont is a registered Trademark of DynaComware Taiwan Inc.
|
||||
Ogg Vorbis is Copyright ©2015, Xiph. Org Foundation
|
||||
The font used on this product is provided by Hakusyu Fonts co,.Ltd.
|
||||
キャスティング・ライツクリアランス
|
||||
株式会社ビーイング
|
||||
JASRAC許諾第V-1512134号
|
||||
e-License許諾番号GS35000
|
||||
VOCALOID and VOCALO are trademarks of Yamaha Corporation.
|
||||
|
||||
OMNiMIX v1.2
|
|
4
titles/cxb/rss1_data/MissionList.csv
Normal file
4
titles/cxb/rss1_data/MissionList.csv
Normal file
@ -0,0 +1,4 @@
|
||||
MissionID,Text,Type,Value_op,Value,Mcode,Difficulty_op,Difficulty,Level_op,Level,Grade_op,Grade,GaugeType_op,GaugeType,HiSpeed_op,HiSpeed,APP,DAP,FlipV,FlipH,Fullcombo,Combo_op,Combo,ClearRate_op,ClearRate,StartTime,StartEnd,District,CoupleId
|
||||
0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||
1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
||||
2,ExtraStageでMEGALOMAN[i]Aをクリアする,0,-1,-1,megaro,-1,-1,-1,-1,1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
|
|
472
titles/cxb/rss1_data/MusicArchiveList.csv
Normal file
472
titles/cxb/rss1_data/MusicArchiveList.csv
Normal file
@ -0,0 +1,472 @@
|
||||
tutori2,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori3,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori4,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori6,10000,100000,10,10,10,10,10,0,0,0,0,0,0,100000,
|
||||
tutori8,10000,1000000,30,150,350,0,0,1,1,1,0,0,0,100345,
|
||||
sateli,10000,100000,280,490,770,820,170,1,1,1,1,1,0,100300,
|
||||
nature,10000,100000,140,240,530,750,50,1,1,1,1,1,3,100301,
|
||||
purple,10000,100000,220,540,640,730,140,1,1,1,1,1,0,100307,
|
||||
hearts,10000,100000,180,380,680,770,80,1,1,1,1,1,0,100308,
|
||||
phasea,10000,100000,160,380,650,750,90,1,1,1,1,1,0,100310,
|
||||
planet,10000,100000,170,360,490,710,100,1,1,1,1,1,1,100311,
|
||||
firefo,10000,100000,130,360,570,830,70,1,1,1,1,1,0,100314,
|
||||
kounen,10000,100000,210,400,660,780,100,1,1,1,1,1,3,100315,
|
||||
essenc,10000,100000,250,500,700,760,110,1,1,1,1,1,0,100316,
|
||||
summer,10000,100000,230,570,790,890,130,1,1,1,1,1,0,100317,
|
||||
tanosi,10000,100000,250,450,700,800,160,1,1,1,1,1,7,100319,
|
||||
picora,10000,100000,150,380,660,750,80,1,1,1,1,1,1,100320,
|
||||
devils,10000,100000,270,400,800,0,150,1,1,1,0,1,0,100323,
|
||||
techno,10000,100000,160,380,510,740,90,1,1,1,1,1,1,100328,
|
||||
glowww,10000,100000,170,280,420,600,80,1,1,1,1,1,7,100335,
|
||||
powerr,10000,100000,190,380,690,790,120,1,1,1,1,1,0,100336,
|
||||
amater,10000,100000,210,480,650,790,130,1,1,1,1,1,0,100340,
|
||||
advers,10000,100000,150,480,710,830,90,1,1,1,1,1,1,100349,
|
||||
venera,10000,100000,150,430,680,750,80,1,1,1,1,1,0,100353,
|
||||
dazaii,10000,100000,210,430,730,770,120,1,1,1,1,1,3,100357,
|
||||
thesig,10000,100000,210,380,560,730,100,1,1,1,1,1,3,100365,
|
||||
hosita,10000,100000,160,360,480,650,100,1,1,1,1,1,9999,100344,
|
||||
bluede,10000,100000,220,410,580,700,120,1,1,1,1,1,5,100372,
|
||||
emerao,10000,100000,300,530,850,0,190,1,1,1,0,1,1,100373,
|
||||
megaro,10000,100000,550,800,930,980,0,1,1,1,1,0,0,100129,
|
||||
angeli,10000,100000,330,560,820,900,220,1,1,1,1,1,0,100330,
|
||||
moonli,10000,100000,140,430,610,730,80,1,1,1,1,1,9999,100342,
|
||||
yumemi,10000,100000,120,350,590,690,60,1,1,1,1,1,9999,100369,
|
||||
pinkym,10000,100000,240,440,740,810,160,1,1,1,1,1,0,100348,
|
||||
dynami2,10000,100000,180,510,780,800,80,1,1,1,1,1,0,100370,
|
||||
reseed3,10000,100000,200,550,760,800,100,1,1,1,1,1,0,100306,
|
||||
toucho,10000,200000,90,280,440,650,50,1,1,1,1,1,1,100002,
|
||||
ameoto,10000,200000,120,260,470,630,60,1,1,1,1,1,1,100003,
|
||||
kimito,10000,200000,100,260,490,660,70,1,1,1,1,1,1,100004,
|
||||
giantk,10000,200000,250,530,710,780,110,1,1,1,1,1,3,100021,
|
||||
breakd,10000,200000,230,340,570,740,110,1,1,1,1,1,2,100015,
|
||||
dazzlj,10000,200000,350,600,800,900,160,1,1,1,1,1,1,100028,
|
||||
ididid,10000,200000,290,460,720,810,160,1,1,1,1,1,1,100093,
|
||||
sundro,10000,200000,240,470,750,830,140,1,1,1,1,1,3,100042,
|
||||
auflcb,10000,200000,130,430,810,0,80,1,1,1,0,1,0,100063,
|
||||
dennou,10000,200000,290,600,760,870,150,1,1,1,1,1,1,100045,
|
||||
hokoro,10000,200000,290,570,710,810,140,1,1,1,1,1,1,100068,
|
||||
landin,10000,200000,260,330,490,670,130,1,1,1,1,1,1,100005,
|
||||
tomorr,10000,100000,150,240,440,620,80,1,1,1,1,1,7,100362,
|
||||
daybyd,10000,100000,130,260,380,590,60,1,1,1,1,1,7,100363,
|
||||
syoujo,10000,100000,190,350,530,780,80,1,1,1,1,1,1,100309,
|
||||
destru,10000,100000,190,410,620,720,100,1,1,1,1,1,0,100352,
|
||||
gingat,10000,200000,130,290,460,610,50,1,1,1,1,1,0,100041,
|
||||
daisak,10000,200000,280,360,600,750,120,1,1,1,1,1,0,100066,
|
||||
paradi,10000,100000,160,280,530,640,100,1,1,1,1,1,3,100376,
|
||||
pigooo,10000,100000,190,340,590,840,130,1,1,1,1,1,6,100377,
|
||||
season,10000,300000,150,280,440,650,80,1,1,1,1,1,1,100386,
|
||||
canonn,10000,300000,170,280,500,830,70,1,1,1,1,1,1,100387,
|
||||
rhapso,10000,300000,180,340,620,740,60,1,1,1,1,1,1,100388,
|
||||
turkis,10000,300000,190,390,640,840,110,1,1,1,1,1,1,100389,
|
||||
biohaz,10000,300000,150,300,510,640,60,1,1,1,1,1,9999,100390,
|
||||
monhan,10000,300000,100,260,360,540,50,1,1,1,1,1,9999,100391,
|
||||
gyakut2,10000,300000,130,350,430,560,50,1,1,1,1,1,9999,100392,
|
||||
street,10000,300000,130,340,470,660,70,1,1,1,1,1,9999,100393,
|
||||
rockma2,10000,300000,210,340,490,760,140,1,1,1,1,1,9999,100394,
|
||||
auflcb3,10000,100000,160,360,660,860,60,1,1,1,1,1,9999,100374,
|
||||
irohaa,10000,100000,190,410,550,760,120,1,1,1,1,1,0,100325,
|
||||
ibelie,10000,100000,270,470,780,820,140,1,1,1,1,1,0,100326,
|
||||
monhan2,10000,300000,120,240,430,680,60,1,1,1,1,1,9999,100409,
|
||||
monhan3,10000,300000,180,280,450,730,80,1,1,1,1,1,9999,100410,
|
||||
yejiii,10000,100000,220,360,630,790,100,1,1,1,1,1,0,100418,
|
||||
histor,10000,100000,200,360,560,820,110,1,1,1,1,1,0,100419,
|
||||
chaset,10000,100000,150,310,580,760,80,1,1,1,1,1,9999,100338,
|
||||
metall,10000,100000,160,280,570,770,80,1,1,1,1,1,1,100412,
|
||||
letmeg,10000,100000,180,320,500,720,120,1,1,1,1,1,1,100327,
|
||||
hontno,10000,200000,120,260,530,660,90,1,1,1,1,1,1,100010,
|
||||
azitat,10000,200000,240,550,700,830,140,1,1,1,1,1,0,100024,
|
||||
hellom,10000,100000,180,370,580,720,70,1,1,1,1,1,1,100360,
|
||||
laught,10000,100000,200,350,510,710,70,1,1,1,1,1,1,100337,
|
||||
bluede2,10000,100000,160,360,560,810,90,1,1,1,1,1,1,100426,
|
||||
street2,10000,300000,210,370,550,730,140,1,1,1,1,1,9999,100423,
|
||||
street3,10000,300000,240,380,570,740,130,1,1,1,1,1,9999,100424,
|
||||
street4,10000,300000,170,320,510,780,110,1,1,1,1,1,9999,100425,
|
||||
silbur,10000,100000,200,350,540,750,90,1,1,1,1,1,1,100421,
|
||||
spicaa,10000,100000,230,360,560,780,100,1,1,1,1,1,1,100422,
|
||||
tricko,10000,100000,230,340,560,750,110,1,1,1,1,1,0,100438,
|
||||
thisis,10000,100000,230,370,600,740,120,1,1,1,1,1,4,100435,
|
||||
rising,10000,100000,230,380,660,850,140,1,1,1,1,1,4,100436,
|
||||
orbita,10000,100000,200,380,620,740,120,1,1,1,1,1,5,100411,
|
||||
dddddd,10000,100000,130,330,530,690,90,1,1,1,1,1,5,100433,
|
||||
pyroma,10000,100000,220,420,700,840,80,1,1,1,1,1,4,100427,
|
||||
touchn,10000,100000,270,460,680,860,150,1,1,1,1,1,8,100312,
|
||||
onlyll,10000,100000,210,320,560,690,130,1,1,1,1,1,9999,100359,
|
||||
upside,10000,100000,180,270,480,670,80,1,1,1,1,1,1,100313,
|
||||
istanb,10000,100000,410,490,900,980,230,1,1,1,1,1,3,100322,
|
||||
memori,10000,100000,260,380,650,840,130,1,1,1,1,1,9999,100371,
|
||||
straye,10000,100000,250,360,610,730,140,1,1,1,1,1,4,100350,
|
||||
rearhy,10000,100000,170,320,520,690,70,1,1,1,1,1,9999,100358,
|
||||
hereco,10000,100000,160,340,510,680,110,1,1,1,1,1,4,100432,
|
||||
thesun,10000,100000,250,400,720,870,130,1,1,1,1,1,4,100441,
|
||||
sayona,10000,100000,200,340,530,710,100,1,1,1,1,1,9999,100343,
|
||||
flameu,10000,100000,180,360,570,650,100,1,1,1,1,1,1,100380,
|
||||
raidon,10000,100000,300,380,580,870,130,1,1,1,1,1,1,100434,
|
||||
riseup,10000,100000,180,410,670,770,70,1,1,1,1,1,4,100437,
|
||||
sunglo,10000,100000,180,390,590,720,100,1,1,1,1,1,7,100431,
|
||||
kinbos,10000,100000,220,380,640,770,120,1,1,1,1,1,3,100439,
|
||||
densho,10000,100000,280,420,740,900,170,1,1,1,1,1,5,100430,
|
||||
aiohoo,10000,300000,180,290,420,660,100,1,1,1,1,1,1,100471,
|
||||
entert,10000,300000,150,330,540,870,90,1,1,1,1,1,6,100472,
|
||||
takeit,10000,100000,200,380,650,830,120,1,1,1,1,1,4,100457,
|
||||
harmon,10000,100000,200,360,490,650,120,1,1,1,1,1,7,100449,
|
||||
avemar,10000,300000,160,310,530,750,80,1,1,1,1,1,5,100428,
|
||||
mateki,10000,300000,180,350,540,790,100,1,1,1,1,1,5,100429,
|
||||
lovech,10000,100000,160,300,460,680,80,1,1,1,1,1,7,100445,
|
||||
akaihe,10000,300000,210,320,500,690,80,1,1,1,1,1,1,100473,
|
||||
juicys,10000,300000,180,260,450,830,100,1,1,1,1,1,7,100474,
|
||||
codena,10000,100000,180,350,480,680,90,1,1,1,1,1,1,100468,
|
||||
groove,10000,300000,220,400,520,730,100,1,1,1,1,1,103,100475,
|
||||
kansho,10000,100000,130,270,550,740,70,1,1,1,1,1,9999,100450,
|
||||
overcl2,10000,100000,230,420,580,740,120,1,1,1,1,1,3,100486,
|
||||
taikoo,10000,300000,130,390,500,750,60,1,1,1,1,1,104,100483,
|
||||
groove2,10000,300000,150,400,580,850,90,1,1,1,1,1,9999,100480,
|
||||
overcl,10000,100000,120,350,570,860,80,1,1,1,1,1,4,100487,
|
||||
notoss,10000,100000,120,420,650,910,80,1,1,1,1,1,4,100466,
|
||||
machup,10000,100000,170,320,410,710,90,1,1,1,1,1,6,100447,
|
||||
groove3,10000,300000,180,340,640,850,100,1,1,1,1,1,105,100488,
|
||||
groove4,10000,300000,220,350,500,750,120,1,1,1,1,1,106,100489,
|
||||
everyt,10000,100000,220,300,740,0,130,1,1,1,0,1,5,100482,
|
||||
lespri,10000,100000,250,570,800,0,130,1,1,1,0,1,5,100465,
|
||||
groove5,10000,300000,240,370,670,0,140,1,1,1,0,1,0,100491,
|
||||
honeyo,10000,100000,320,630,880,930,240,1,1,1,1,1,6,100490,
|
||||
groove6,10000,300000,300,640,790,0,220,1,1,1,0,1,3,100494,
|
||||
sunglo2,10000,100000,210,360,670,810,110,1,1,1,1,1,6,100495,
|
||||
fourte,10000,100000,240,500,740,800,140,1,1,1,1,1,5,100498,
|
||||
monhan4,10000,300000,120,400,510,620,50,1,1,1,1,1,9999,100496,
|
||||
monhan5,10000,300000,120,350,420,650,100,1,1,1,1,1,9999,100497,
|
||||
darkpa,10000,100000,260,390,700,840,160,1,1,1,1,1,3,100504,
|
||||
hervor,10000,100000,280,390,730,810,180,1,1,1,1,1,5,100505,
|
||||
cirnon,10000,300000,240,400,600,790,170,1,1,1,1,1,9999,100499,
|
||||
marisa,10000,300000,250,410,620,850,180,1,1,1,1,1,9999,100500,
|
||||
yakini,10000,300000,250,340,580,820,130,1,1,1,1,1,9999,100501,
|
||||
justic,10000,300000,190,360,570,830,140,1,1,1,1,1,1,100502,
|
||||
sintyo,10000,300000,250,460,700,830,160,1,1,1,1,1,6,100503,
|
||||
ascand,10000,100000,320,540,800,900,180,1,1,1,1,1,0,100347,
|
||||
blackl,10000,100000,190,410,730,840,120,1,1,1,1,1,3,100506,
|
||||
childr,10000,200000,240,390,560,620,140,1,1,1,1,1,0,100043,
|
||||
tsukai,10000,200000,190,440,720,760,130,1,1,1,1,1,1,100044,
|
||||
rideon,10000,200000,290,410,600,800,160,1,1,1,1,1,1,100067,
|
||||
minest,10000,100000,210,390,620,760,130,1,1,1,1,1,1,100507,
|
||||
ordine,10000,100000,250,430,730,820,190,1,1,1,1,1,3,100508,
|
||||
dreamw,10000,100000,260,370,620,750,160,1,1,1,1,1,0,100509,
|
||||
minerv,10000,100000,320,610,900,0,250,1,1,1,0,1,4,100510,
|
||||
wannab,10000,200000,90,230,400,650,50,1,1,1,1,1,3,100001,
|
||||
sekain,10000,100000,260,390,690,780,160,1,1,1,1,1,1,100511,
|
||||
farawa,10000,100000,230,360,600,760,180,1,1,1,1,1,7,100512,
|
||||
crissc,10000,200000,370,630,860,910,170,1,1,1,1,1,4,100100,
|
||||
speedy,10000,100000,220,550,770,0,110,1,1,1,0,1,8,100324,
|
||||
xxxrev,10000,100000,210,340,560,730,150,1,1,1,1,1,0,100513,
|
||||
higame,10000,200000,200,300,580,710,130,1,1,1,1,1,3,100016,
|
||||
theepi,10000,200000,190,400,610,750,140,1,1,1,1,1,3,100022,
|
||||
anomie,10000,200000,220,380,610,770,150,1,1,1,1,1,0,100023,
|
||||
crocus,10000,100000,260,370,600,720,150,1,1,1,1,1,7,100524,
|
||||
lavien,10000,100000,270,410,710,800,180,1,1,1,1,1,5,100546,
|
||||
megaro2,10000,100000,0,0,990,1000,0,0,0,1,1,0,4,100361,
|
||||
chipnn,10000,100000,270,340,610,790,160,1,1,1,1,1,6,100541,
|
||||
yiyoyi,10000,200000,140,330,560,700,70,1,1,1,1,1,3,100007,
|
||||
binary,10000,200000,170,350,640,890,140,1,1,1,1,1,1,100014,
|
||||
makaim,10000,200000,300,500,770,0,230,1,1,1,0,1,3,100054,
|
||||
gyakut,10000,200000,150,210,460,640,60,1,1,1,1,1,1,100055,
|
||||
basara,10000,200000,190,370,640,730,140,1,1,1,1,1,0,100056,
|
||||
daybre,10000,300000,160,320,530,720,90,1,1,1,1,1,0,100514,
|
||||
umiyur,10000,300000,140,280,460,640,80,1,1,1,1,1,1,100515,
|
||||
chalur,10000,300000,180,400,600,720,140,1,1,1,1,1,9999,100516,
|
||||
melanc,10000,300000,150,300,500,630,100,1,1,1,1,1,7,100517,
|
||||
konofu,10000,300000,230,350,620,810,110,1,1,1,1,1,1,100518,
|
||||
bladem,10000,100000,280,380,630,750,170,1,1,1,1,1,4,100526,
|
||||
southw,10000,100000,180,270,570,680,120,1,1,1,1,1,7,100536,
|
||||
ryuuse,10000,100000,210,320,590,0,130,1,1,1,0,1,1,100537,
|
||||
redhea,10000,300000,270,390,590,720,100,1,1,1,1,1,0,100519,
|
||||
warnin,10000,300000,250,360,610,740,120,1,1,1,1,1,9999,100520,
|
||||
topsec,10000,300000,240,340,510,640,130,1,1,1,1,1,9999,100521,
|
||||
dddoll,10000,300000,260,380,550,630,140,1,1,1,1,1,9999,100522,
|
||||
tracee,10000,300000,190,310,490,650,90,1,1,1,1,1,0,100548,
|
||||
drivin,10000,200000,230,400,660,760,80,1,1,1,1,1,7,100111,
|
||||
genzit,10000,200000,180,460,730,820,120,1,1,1,1,1,0,100118,
|
||||
aerial,10000,200000,110,280,560,710,50,1,1,1,1,1,1,100039,
|
||||
einher,10000,100000,290,400,740,800,160,1,1,1,1,1,4,100532,
|
||||
ariell,10000,100000,190,320,640,730,150,1,1,1,1,1,7,100540,
|
||||
firstl,10000,100000,250,360,650,770,170,1,1,1,1,1,1,100542,
|
||||
heartl,10000,100000,230,300,640,0,110,1,1,1,0,1,1,100550,
|
||||
erasee,10000,100000,220,350,580,680,120,1,1,1,1,1,0,100551,
|
||||
regene,10000,100000,200,300,560,700,130,1,1,1,1,1,0,100530,
|
||||
allelu,10000,100000,280,350,640,750,160,1,1,1,1,1,9999,100549,
|
||||
lighto,10000,100000,250,330,600,740,120,1,1,1,1,1,1,100543,
|
||||
termin,10000,100000,240,340,630,790,130,1,1,1,1,1,7,100552,
|
||||
ryuuse2,10000,100000,200,360,620,750,130,1,1,1,1,1,1,100556,
|
||||
prizmm,10000,100000,210,300,540,0,120,1,1,1,0,1,1,100547,
|
||||
samalv,10000,200000,190,390,580,770,130,1,1,1,1,1,6,100098,
|
||||
palpit,10000,100000,290,550,840,920,180,1,1,1,1,1,8,100544,
|
||||
gainen,10000,100000,260,370,630,0,150,1,1,1,0,1,9999,100558,
|
||||
moonsh,10000,100000,230,360,620,0,100,1,1,1,0,1,3,100525,
|
||||
moonki,10000,100000,250,390,640,0,130,1,1,1,0,1,1,100559,
|
||||
moonri,10000,200000,210,380,580,850,140,1,1,1,1,1,0,100560,
|
||||
goaway,10000,100000,230,450,590,700,100,1,1,1,1,1,0,100561,
|
||||
itback,10000,100000,230,380,710,0,120,1,1,1,0,1,3,100567,
|
||||
redhhh,10000,100000,240,390,770,0,130,1,1,1,0,1,4,100569,
|
||||
actual,10000,100000,250,380,800,0,140,1,1,1,0,1,0,100568,
|
||||
zonzon,10000,200000,160,330,630,670,50,1,1,1,1,1,1,100367,
|
||||
memorm,10000,100000,260,370,730,0,150,1,1,1,0,1,0,100565,
|
||||
kokoro,10000,100000,200,430,650,690,120,1,1,1,1,1,1,100554,
|
||||
poweri,10000,100000,260,490,750,910,130,1,1,1,1,1,4,100563,
|
||||
nisenn,10000,100000,0,0,760,0,0,0,0,1,0,0,8,100555,
|
||||
yukiya,10000,200000,190,400,610,0,110,1,1,1,0,1,3,100096,
|
||||
zankyo,10000,200000,180,380,570,740,100,1,1,1,1,1,5,100124,
|
||||
overlp,10000,200000,170,300,510,0,90,1,1,1,0,1,7,100119,
|
||||
fracta,10000,100000,310,520,830,0,190,1,1,1,0,1,3,100529,
|
||||
cantst,10000,100000,230,420,650,0,110,1,1,1,0,1,0,100455,
|
||||
primaa,10000,100000,180,350,540,750,120,1,1,1,1,1,0,100527,
|
||||
cyberg,10000,100000,230,350,600,0,120,1,1,1,0,1,0,100448,
|
||||
freakw,10000,200000,220,420,650,660,130,1,1,1,1,1,0,100018,
|
||||
aquali,10000,200000,160,340,580,0,110,1,1,1,0,1,4,100006,
|
||||
takesc,10000,100000,270,370,690,0,100,1,1,1,0,1,1,100572,
|
||||
cthugh,10000,100000,250,480,730,0,140,1,1,1,0,1,0,100531,
|
||||
thetaa,10000,100000,210,340,620,0,110,1,1,1,0,1,1,100571,
|
||||
nekofu,10000,300000,220,340,570,800,100,1,1,1,1,1,6,100493,
|
||||
howtru,10000,200000,120,250,530,740,80,1,1,1,1,1,0,100057,
|
||||
romanc,10000,200000,280,550,780,0,100,1,1,1,0,1,0,100047,
|
||||
kotobu,10000,200000,320,710,900,0,250,1,1,1,0,1,0,100573,
|
||||
xmasss,10000,300000,180,380,560,770,80,1,1,1,1,1,101,100417,
|
||||
galaxy,10000,300000,160,320,430,670,100,1,1,1,1,1,0,100600,
|
||||
rebell,10000,1000000,490,630,910,0,0,1,1,1,0,0,0,100601,
|
||||
anothe,10000,1000000,270,370,730,760,0,1,1,1,1,0,0,100602,
|
||||
addict,10000,1000000,200,340,520,620,0,1,1,1,1,0,0,100603,
|
||||
dirtyy,10000,1000000,150,280,590,740,0,1,1,1,1,0,0,100604,
|
||||
levelf,10000,300000,110,280,450,630,50,1,1,1,1,1,0,100605,
|
||||
omnive,10000,1000000,340,520,830,860,0,1,1,1,1,0,0,100606,
|
||||
kakuse,10000,1000000,170,550,750,0,0,1,1,1,0,0,0,100607,
|
||||
unbeli,10000,300000,130,260,380,620,70,1,1,1,1,1,0,100608,
|
||||
sonzai,10000,1000000,260,400,590,660,0,1,1,1,1,0,0,100609,
|
||||
okonik,10000,1000000,260,450,670,0,0,1,1,1,0,0,0,100610,
|
||||
crssho,10000,1000000,350,600,850,0,100,1,1,1,0,1,0,100611,
|
||||
reanim,10000,1000000,280,440,700,800,0,1,1,1,1,0,0,100612,
|
||||
kamino,10000,1000000,400,620,780,0,150,1,1,1,0,1,0,100613,
|
||||
fiveee,10000,300000,180,370,610,710,100,1,1,1,1,1,0,100614,
|
||||
granda,10000,1000000,210,380,790,0,0,1,1,1,0,0,0,100615,
|
||||
fronti2,10000,1000000,460,690,890,0,90,1,1,1,0,1,0,100616,
|
||||
saigon,10000,1000000,190,310,570,0,0,1,1,1,0,0,0,100617,
|
||||
replay,10000,300000,180,440,630,700,80,1,1,1,1,1,0,100618,
|
||||
mousou,10000,1000000,160,260,540,0,0,1,1,1,0,0,0,100619,
|
||||
aheadd,10000,300000,130,250,350,580,70,1,1,1,1,1,0,100620,
|
||||
musicr1,10000,100000,220,330,580,740,120,1,1,1,1,1,0,100621,
|
||||
getthe,10000,300000,170,370,490,660,60,1,1,1,1,1,0,100622,
|
||||
design,10000,1000000,150,390,680,690,0,1,1,1,1,0,0,100623,
|
||||
garnet,10000,1000000,260,460,700,940,0,1,1,1,1,0,0,100624,
|
||||
hopesb,10000,300000,100,250,440,610,70,1,1,1,1,1,0,100625,
|
||||
shooti,10000,300000,150,370,490,690,70,1,1,1,1,1,0,100626,
|
||||
dangan,10000,1000000,280,580,810,0,0,1,1,1,0,0,0,100627,
|
||||
impact,10000,1000000,240,600,720,900,200,1,1,1,1,1,0,100628,
|
||||
lightm,10000,300000,260,330,540,710,110,1,1,1,1,1,0,100629,
|
||||
miiroo,10000,300000,220,390,580,680,110,1,1,1,1,1,0,100630,
|
||||
voiceo,10000,1000000,180,340,580,590,0,1,1,1,1,0,0,100631,
|
||||
cosmol,10000,1000000,360,640,870,0,250,1,1,1,0,1,0,100632,
|
||||
vividd,10000,300000,160,350,550,650,90,1,1,1,1,1,0,100633,
|
||||
splash,10000,1000000,260,500,710,0,0,1,1,1,0,0,0,100634,
|
||||
donuth,10000,300000,220,400,540,800,110,1,1,1,1,1,0,100635,
|
||||
senbon,10000,300000,200,280,540,740,120,1,1,1,1,1,0,100636,
|
||||
kmtyju,10000,300000,240,310,570,740,120,1,1,1,1,1,0,100637,
|
||||
fronti,10000,1000000,480,650,820,0,130,1,1,1,0,1,0,100638,
|
||||
nueraa,10000,1000000,220,430,750,530,0,1,1,1,1,0,0,100639,
|
||||
childe,10000,300000,90,240,340,560,40,1,1,1,1,1,0,100640,
|
||||
dazzli2,10000,1000000,350,600,820,0,190,1,1,1,0,1,0,100641,
|
||||
perfec,10000,1000000,390,640,780,0,0,1,1,1,0,0,0,100642,
|
||||
flower,10000,300000,70,200,400,650,60,1,1,1,1,1,0,100643,
|
||||
frgmnt,10000,1000000,330,630,740,650,100,1,1,1,1,1,0,100644,
|
||||
headph,10000,1000000,240,320,520,0,0,1,1,1,0,0,0,100645,
|
||||
crsang,10000,1000000,270,530,670,0,130,1,1,1,0,1,0,100646,
|
||||
musicr4,10000,100000,190,320,580,0,120,1,1,1,0,1,0,100647,
|
||||
imaxim,10000,1000000,440,690,900,870,0,1,1,1,1,0,0,100648,
|
||||
azitat2,10000,1000000,230,520,660,0,80,1,1,1,0,1,0,100649,
|
||||
dynami,10000,1000000,260,540,680,0,110,1,1,1,0,1,0,100650,
|
||||
incave,10000,1000000,220,440,760,780,0,1,1,1,1,0,0,100651,
|
||||
aktuki,10000,1000000,260,580,840,0,100,1,1,1,0,1,0,100652,
|
||||
kindof,10000,1000000,140,290,480,0,0,1,1,1,0,0,0,100653,
|
||||
mikaku,10000,1000000,190,310,540,0,0,1,1,1,0,0,0,100654,
|
||||
strang,10000,1000000,120,280,550,0,0,1,1,1,0,0,0,100655,
|
||||
hesper,10000,1000000,360,610,920,930,0,1,1,1,1,0,0,100656,
|
||||
breaka,10000,300000,150,310,450,680,70,1,1,1,1,1,0,100657,
|
||||
myname,10000,1000000,60,140,300,570,0,1,1,1,1,0,0,100658,
|
||||
amaiko,10000,1000000,150,370,600,0,0,1,1,1,0,0,0,100659,
|
||||
reseed2,10000,1000000,220,470,630,0,0,1,1,1,0,0,0,100660,
|
||||
kingst,10000,1000000,380,630,740,0,120,1,1,1,0,1,0,100661,
|
||||
ramram,10000,1000000,230,340,670,0,0,1,1,1,0,0,0,100662,
|
||||
murasa,10000,1000000,280,410,760,0,0,1,1,1,0,0,0,100663,
|
||||
happyd,10000,1100000,220,410,730,790,180,1,1,1,1,1,0,100664,
|
||||
izimed,10000,300000,190,390,690,770,90,1,1,1,1,1,0,100665,
|
||||
wastel,10000,1000000,40,120,230,400,0,1,1,1,1,0,0,100666,
|
||||
assign,10000,1000000,260,430,610,620,0,1,1,1,1,0,0,100667,
|
||||
jahaci,10000,1000000,170,290,590,0,0,1,1,1,0,0,0,100668,
|
||||
hisuii,10000,1000000,220,470,700,0,0,1,1,1,0,0,0,100669,
|
||||
godkno,10000,300000,100,260,450,640,60,1,1,1,1,1,0,100670,
|
||||
roadof,10000,300000,150,360,500,750,70,1,1,1,1,1,0,100671,
|
||||
rokuch,10000,300000,210,350,620,810,110,1,1,1,1,1,0,100672,
|
||||
valent,10000,300000,270,330,590,770,100,1,1,1,1,1,0,100673,
|
||||
unfini,10000,300000,160,320,500,710,80,1,1,1,1,1,0,100674,
|
||||
auflcb2,10000,1000000,220,370,750,0,100,1,1,1,0,1,0,100675,
|
||||
burnin,10000,1000000,180,280,600,850,150,1,1,1,1,1,0,100676,
|
||||
sphere,10000,1000000,200,380,730,0,0,1,1,1,0,0,0,100677,
|
||||
dropou,10000,300000,170,310,460,690,140,1,1,1,1,1,0,100678,
|
||||
xencou,10000,300000,200,320,520,600,80,1,1,1,1,1,0,100679,
|
||||
killyk,10000,300000,130,420,630,760,60,1,1,1,1,1,0,100680,
|
||||
missil,10000,1000000,160,380,590,0,0,1,1,1,0,0,0,100681,
|
||||
burstt,10000,300000,120,250,460,630,70,1,1,1,1,1,0,100682,
|
||||
musicr2,10000,100000,220,330,580,0,120,1,1,1,0,1,0,100683,
|
||||
isingl,10000,1000000,250,440,800,0,120,1,1,1,0,1,0,100684,
|
||||
lvless,10000,1000000,230,380,600,0,0,1,1,1,0,0,0,100685,
|
||||
sapphi,10000,1000000,290,440,810,0,0,1,1,1,0,0,0,100686,
|
||||
musicr3,10000,100000,190,320,580,720,120,1,1,1,1,1,0,100687,
|
||||
deeout,10000,1000000,180,340,630,810,0,1,1,1,1,0,0,100688,
|
||||
sugars,10000,300000,170,300,420,660,60,1,1,1,1,1,0,100689,
|
||||
mercur,10000,1000000,140,350,660,0,0,1,1,1,0,0,0,100690,
|
||||
zizizi,10000,1000000,300,570,880,960,0,1,1,1,1,0,0,100691,
|
||||
wegooo,10000,300000,180,340,540,680,100,1,1,1,1,1,0,100692,
|
||||
alonee,10000,300000,110,210,360,480,50,1,1,1,1,1,0,100693,
|
||||
nuheat,10000,1000000,290,440,650,850,0,1,1,1,1,0,0,100694,
|
||||
granro,10000,300000,150,280,430,600,80,1,1,1,1,1,0,100695,
|
||||
sister,10000,300000,100,270,460,630,70,1,1,1,1,1,0,100696,
|
||||
lotusl,10000,1000000,200,360,640,0,0,1,1,1,0,0,0,100697,
|
||||
yukari,10000,1000000,310,500,760,840,0,1,1,1,1,0,0,100698,
|
||||
flawli,10000,300000,170,300,400,590,80,1,1,1,1,1,0,100699,
|
||||
nightf,10000,1000000,150,280,460,710,0,1,1,1,1,0,0,100700,
|
||||
random,10000,100000,0,0,0,0,0,0,0,0,0,0,0,100701,
|
||||
wiwwtw,10000,1000000,260,380,620,0,0,1,1,1,0,0,0,100702,
|
||||
inneru,10000,300000,220,360,480,670,90,1,1,1,1,1,0,100703,
|
||||
taishi,10000,1000000,190,350,580,0,0,1,1,1,0,0,0,100704,
|
||||
daysss,10000,1000000,380,590,810,810,0,1,1,1,1,0,0,100705,
|
||||
bokuwa,10000,300000,230,340,550,690,160,1,1,1,1,1,0,100706,
|
||||
showww,10000,300000,180,350,510,790,150,1,1,1,1,1,0,100707,
|
||||
nevers,10000,300000,260,320,650,750,150,1,1,1,1,1,0,100708,
|
||||
bleeze,10000,300000,160,310,470,620,90,1,1,1,1,1,0,100709,
|
||||
dreami,10000,1000000,140,370,650,0,0,1,1,1,0,0,0,100710,
|
||||
allune,10000,1000000,140,350,710,0,0,1,1,1,0,0,0,100711,
|
||||
always,10000,1000000,130,270,490,0,0,1,1,1,0,0,0,100712,
|
||||
anomie2,10000,1000000,160,430,840,0,0,1,1,1,0,0,0,100713,
|
||||
aquali2,10000,1000000,220,430,600,810,0,1,1,1,1,0,0,100714,
|
||||
astaro,10000,1000000,230,400,740,0,0,1,1,1,0,0,0,100715,
|
||||
bassan,10000,1000000,200,320,660,0,0,1,1,1,0,0,0,100716,
|
||||
zonzon2,10000,1000000,130,270,680,750,0,1,1,1,1,0,0,100717,
|
||||
bouled,10000,1000000,190,300,570,0,0,1,1,1,0,0,0,100718,
|
||||
brandn,10000,1000000,90,390,660,720,0,1,1,1,1,0,0,100719,
|
||||
bravee,10000,1000000,350,600,820,0,250,1,1,1,0,-1,0,100720,
|
||||
breakd2,10000,1000000,340,640,740,0,0,1,1,1,0,0,0,100721,
|
||||
buffet,10000,1000000,380,550,680,0,300,1,1,1,0,-1,0,100722,
|
||||
buzzke,10000,1000000,180,330,580,770,0,1,1,1,1,0,0,100723,
|
||||
cashhh,10000,1000000,190,250,640,0,0,1,1,1,0,0,0,100724,
|
||||
cloudb,10000,1000000,370,660,740,0,250,1,1,1,0,-1,0,100725,
|
||||
clouds,10000,1000000,130,250,470,0,0,1,1,1,0,0,0,100726,
|
||||
codepa,10000,1000000,290,550,700,0,150,1,1,1,0,-1,0,100727,
|
||||
comear,10000,1000000,380,560,830,0,250,1,1,1,0,-1,0,100728,
|
||||
crysta,10000,1000000,370,560,810,0,300,1,1,1,0,-1,0,100729,
|
||||
curseo,10000,1000000,220,360,740,0,0,1,1,1,0,0,0,100730,
|
||||
datami,10000,1000000,180,360,660,0,0,1,1,1,0,0,0,100731,
|
||||
defaul,10000,1000000,210,330,480,0,0,1,1,1,0,0,0,100732,
|
||||
design2,10000,1000000,250,430,680,0,0,1,1,1,0,0,0,100733,
|
||||
diamon,10000,1000000,100,260,330,0,0,1,1,1,0,0,0,100734,
|
||||
dispel,10000,1000000,280,480,800,0,0,1,1,1,0,0,0,100735,
|
||||
distan,10000,1000000,200,300,680,0,0,1,1,1,0,0,0,100736,
|
||||
dokibl,10000,1000000,150,230,670,0,0,1,1,1,0,0,0,100737,
|
||||
dontwa,10000,1000000,130,340,690,0,0,1,1,1,0,0,0,100738,
|
||||
drgirl,10000,1000000,190,350,540,730,0,1,1,1,1,0,0,100739,
|
||||
eterna,10000,1000000,120,210,390,0,0,1,1,1,0,0,0,100740,
|
||||
everkr,10000,1000000,180,290,410,0,0,1,1,1,0,0,0,100741,
|
||||
everwh,10000,1000000,200,310,580,0,0,1,1,1,0,0,0,100742,
|
||||
farthe,10000,1000000,300,560,780,870,0,1,1,1,1,0,0,100743,
|
||||
filame,10000,1000000,230,380,630,0,0,1,1,1,0,0,0,100744,
|
||||
flameu2,10000,1000000,170,240,590,0,0,1,1,1,0,0,0,100745,
|
||||
freeee,10000,1000000,190,390,690,0,0,1,1,1,0,0,0,100746,
|
||||
funkyb2,10000,1000000,210,340,560,0,0,1,1,1,0,0,0,100747,
|
||||
granda2,10000,1000000,240,410,730,830,0,1,1,1,1,0,0,100748,
|
||||
hsphsp,10000,1000000,120,250,690,0,0,1,1,1,0,0,0,100749,
|
||||
halluc,10000,1000000,400,520,870,0,0,1,1,1,0,0,0,100750,
|
||||
indigo,10000,1000000,170,330,500,750,0,1,1,1,1,0,0,100751,
|
||||
inters,10000,1000000,250,420,770,0,0,1,1,1,0,0,0,100752,
|
||||
incave2,10000,1000000,310,570,880,0,0,1,1,1,0,0,0,100753,
|
||||
ioniza,10000,1000000,170,340,700,850,0,1,1,1,1,0,0,100754,
|
||||
guilty,10000,1000000,150,280,500,0,0,1,1,1,0,0,0,100755,
|
||||
keraun,10000,1000000,250,520,790,0,0,1,1,1,0,0,0,100756,
|
||||
landin2,10000,1000000,200,340,590,660,0,1,1,1,1,0,0,100757,
|
||||
videog,10000,1000000,210,370,620,0,0,1,1,1,0,0,0,100758,
|
||||
loseyo,10000,1000000,200,300,710,0,0,1,1,1,0,0,0,100759,
|
||||
machin,10000,1000000,120,280,720,0,0,1,1,1,0,0,0,100760,
|
||||
makeit,10000,1000000,110,240,480,0,0,1,1,1,0,0,0,100761,
|
||||
daydre,10000,1000000,190,360,800,0,0,1,1,1,0,0,0,100762,
|
||||
metron,10000,1000000,200,440,710,0,0,1,1,1,0,0,0,100763,
|
||||
milkyw,10000,1000000,220,310,600,0,0,1,1,1,0,0,0,100764,
|
||||
nayuta,10000,1000000,170,370,680,0,0,1,1,1,0,0,0,100766,
|
||||
nightm,10000,1000000,200,490,730,0,0,1,1,1,0,0,0,100767,
|
||||
otherw,10000,1000000,230,410,760,0,0,1,1,1,0,0,0,100768,
|
||||
overth,10000,1000000,330,570,820,0,250,1,1,1,0,-1,0,100769,
|
||||
uuuuuu,10000,1000000,230,370,740,0,0,1,1,1,0,0,0,100770,
|
||||
rainin,10000,1000000,160,410,690,0,0,1,1,1,0,0,0,100771,
|
||||
raisey,10000,1000000,230,550,750,0,150,1,1,1,0,-1,0,100772,
|
||||
resona,10000,1000000,170,320,640,0,0,1,1,1,0,0,0,100773,
|
||||
reuniv,10000,1000000,140,230,410,0,0,1,1,1,0,0,0,100774,
|
||||
rhythm,10000,1000000,370,560,780,0,250,1,1,1,0,-1,0,100775,
|
||||
rushhh,10000,1000000,250,370,750,0,0,1,1,1,0,0,0,100776,
|
||||
steeee,10000,1000000,300,580,870,0,0,1,1,1,0,0,0,100777,
|
||||
sangey,10000,1000000,270,470,850,0,0,1,1,1,0,0,0,100778,
|
||||
senpai,10000,1000000,380,540,770,0,250,1,1,1,0,-1,0,100779,
|
||||
sestea,10000,1000000,270,470,760,0,0,1,1,1,0,0,0,100780,
|
||||
silver,10000,1000000,280,400,690,0,0,1,1,1,0,0,0,100781,
|
||||
sodama,10000,1000000,200,400,650,0,0,1,1,1,0,0,0,100782,
|
||||
stardu,10000,1000000,190,330,640,0,0,1,1,1,0,0,0,100783,
|
||||
starti,10000,1000000,170,310,540,700,0,1,1,1,1,0,0,100784,
|
||||
sunday,10000,1000000,180,290,460,670,0,1,1,1,1,0,0,100785,
|
||||
sundro2,10000,1000000,300,480,790,820,0,1,1,1,1,0,0,100786,
|
||||
sunnyd,10000,1000000,230,380,590,0,0,1,1,1,0,0,0,100787,
|
||||
superl,10000,1000000,150,320,590,0,0,1,1,1,0,0,0,100788,
|
||||
switch,10000,1000000,160,350,690,0,0,1,1,1,0,0,0,100789,
|
||||
theepi2,10000,1000000,220,370,650,0,0,1,1,1,0,0,0,100790,
|
||||
epipha,10000,1000000,150,300,700,0,0,1,1,1,0,0,0,100791,
|
||||
thekin,10000,1000000,220,520,750,0,0,1,1,1,0,0,0,100792,
|
||||
timele,10000,1000000,160,330,720,0,0,1,1,1,0,0,0,100793,
|
||||
tokyoo,10000,1000000,150,330,710,0,0,1,1,1,0,0,0,100794,
|
||||
toooma,10000,1000000,300,510,770,0,0,1,1,1,0,0,0,100795,
|
||||
toucho2,10000,1000000,170,320,520,780,0,1,1,1,1,0,0,100796,
|
||||
tayuta,10000,1000000,260,350,720,0,0,1,1,1,0,0,0,100797,
|
||||
ultrix,10000,1000000,270,450,760,0,0,1,1,1,0,0,0,100798,
|
||||
underw,10000,1000000,290,460,690,860,0,1,1,1,1,0,0,100799,
|
||||
virtua,10000,1000000,150,350,630,0,0,1,1,1,0,0,0,100800,
|
||||
voiceo2,10000,1000000,140,380,670,0,0,1,1,1,0,0,0,100801,
|
||||
wannab2,10000,1000000,260,410,690,0,0,1,1,1,0,0,0,100802,
|
||||
wiwwtw2,10000,1000000,200,430,670,720,0,1,1,1,1,0,0,100803,
|
||||
wingso,10000,1000000,200,530,710,0,0,1,1,1,0,0,0,100804,
|
||||
winter,10000,1000000,140,240,410,0,0,1,1,1,0,0,0,100805,
|
||||
iineee,10000,1000000,210,400,810,0,0,1,1,1,0,0,0,100806,
|
||||
illumi,10000,1000000,100,250,460,630,0,1,1,1,1,0,0,100807,
|
||||
yellll,10000,1000000,80,170,520,0,0,1,1,1,0,0,0,100808,
|
||||
eschat,10000,1000000,360,570,770,0,250,1,1,1,0,-1,0,100809,
|
||||
counte,10000,1000000,290,340,710,0,0,1,1,1,0,0,0,100810,
|
||||
gimcho,10000,1000000,180,390,700,0,0,1,1,1,0,0,0,100811,
|
||||
surviv,10000,1000000,240,400,650,0,0,1,1,1,0,0,0,100812,
|
||||
turkis3,10000,1000000,60,200,480,0,0,1,1,1,0,0,0,100814,
|
||||
picora2,10000,1000000,280,530,800,0,0,1,1,1,0,0,0,100815,
|
||||
fortis,10000,1000000,200,370,530,0,0,1,1,1,0,0,0,100816,
|
||||
hedban,10000,1000000,160,430,660,0,0,1,1,1,0,0,0,100817,
|
||||
megitu,10000,1000000,150,300,490,0,0,1,1,1,0,0,0,100818,
|
||||
rockma,10000,1000000,270,480,730,0,0,1,1,1,0,0,0,100819,
|
||||
kounen2,10000,1000000,210,430,730,0,0,1,1,1,0,0,0,100820,
|
||||
saisyu,10000,1000000,180,360,560,0,0,1,1,1,0,0,0,100821,
|
||||
yuukan,10000,1000000,220,330,780,0,0,1,1,1,0,0,0,100822,
|
||||
modern,10000,1000000,200,320,560,0,0,1,1,1,0,0,0,100823,
|
||||
miraie,10000,1000000,210,350,660,0,0,1,1,1,0,0,0,100824,
|
||||
ranfes,10000,1000000,200,420,650,0,0,1,1,1,0,0,0,100825,
|
||||
nemure,10000,1000000,150,380,670,760,0,1,1,1,1,0,0,100826,
|
||||
yuwaku,10000,1000000,150,260,430,0,0,1,1,1,0,0,0,100827,
|
||||
dontst,10000,1000000,150,320,560,700,0,1,1,1,1,0,0,100828,
|
||||
mottai,10000,1000000,100,260,360,0,0,1,1,1,0,0,0,100829,
|
||||
slysly,10000,1000000,100,330,580,0,0,1,1,1,0,0,0,100830,
|
||||
lookam,10000,1000000,170,340,670,0,0,1,1,1,0,0,0,100831,
|
||||
feverr,10000,1000000,280,480,680,0,0,1,1,1,0,0,0,100832,
|
||||
fashio,10000,1000000,80,240,390,0,0,1,1,1,0,0,0,100833,
|
||||
hagito,10000,1000000,120,260,500,0,0,1,1,1,0,0,0,100834,
|
||||
invade,10000,1000000,100,280,470,0,0,1,1,1,0,0,0,100835,
|
||||
ainoch,10000,1000000,170,400,590,0,0,1,1,1,0,0,0,100836,
|
||||
nakama,10000,1000000,140,320,530,0,0,1,1,1,0,0,0,100837,
|
||||
ninjar,10000,1000000,80,230,410,650,0,1,1,1,1,0,0,100838,
|
||||
parall,10000,1000000,140,350,610,0,0,1,1,1,0,0,0,100839,
|
||||
yukifu,10000,1000000,130,290,510,0,0,1,1,1,0,0,0,100840,
|
||||
furiso,10000,1000000,120,240,440,740,0,1,1,1,1,0,0,100841,
|
||||
honeyj,10000,100000,320,630,880,930,240,1,1,1,1,1,6,100842,
|
||||
emeraj,10000,100000,300,530,850,0,190,1,1,1,0,1,1,100843,
|
||||
dazzlo,10000,200000,350,600,800,900,160,1,1,1,1,1,1,100844,
|
|
2
titles/cxb/rss1_data/NewsList.csv
Normal file
2
titles/cxb/rss1_data/NewsList.csv
Normal file
@ -0,0 +1,2 @@
|
||||
1,1,1601510400,4096483201,1,0,0,0,1,0,news1069,,,1,1,
|
||||
2,1,1601510400,4096483201,1,0,0,0,1,0,news1070,,,1,1,
|
|
100
titles/cxb/rss1_data/Partner0000.csv
Normal file
100
titles/cxb/rss1_data/Partner0000.csv
Normal file
@ -0,0 +1,100 @@
|
||||
1,0,100,100,100,100,100,100,100,100,0,0,
|
||||
2,100,110,101,101,103,101,101,101,101,1000,0,
|
||||
3,210,120,102,102,106,102,102,102,102,0,0,
|
||||
4,331,130,103,103,109,103,103,103,103,0,0,
|
||||
5,464,140,104,104,112,104,104,104,104,1001,0,
|
||||
6,610,150,105,105,115,105,105,105,105,1002,0,
|
||||
7,771,160,106,106,118,106,106,106,106,1003,0,
|
||||
8,948,170,107,107,121,107,107,107,107,0,0,
|
||||
9,1143,180,108,108,124,108,108,108,108,0,0,
|
||||
10,1357,190,109,109,127,109,109,109,109,1004,0,
|
||||
11,1593,200,110,110,130,110,110,110,110,0,0,
|
||||
12,1853,210,111,111,133,111,111,111,111,0,0,
|
||||
13,2138,220,112,112,136,112,112,112,112,0,0,
|
||||
14,2452,230,113,113,139,113,113,113,113,0,0,
|
||||
15,2797,240,114,114,142,114,114,114,114,1005,0,
|
||||
16,3177,250,115,115,145,115,115,115,115,0,0,
|
||||
17,3594,260,116,116,148,116,116,116,116,0,0,
|
||||
18,4054,270,117,117,151,117,117,117,117,0,0,
|
||||
19,4559,280,118,118,154,118,118,118,118,0,0,
|
||||
20,5115,290,119,119,157,119,119,119,119,1006,1,
|
||||
21,5727,300,120,120,160,120,120,120,120,0,1,
|
||||
22,6400,310,121,121,163,121,121,121,121,0,1,
|
||||
23,7140,320,122,122,166,122,122,122,122,0,1,
|
||||
24,7954,330,123,123,169,123,123,123,123,0,1,
|
||||
25,8849,340,124,124,172,124,124,124,124,0,1,
|
||||
26,9834,350,125,125,175,125,125,125,125,0,1,
|
||||
27,10918,360,126,126,178,126,126,126,126,0,1,
|
||||
28,12109,370,127,127,181,127,127,127,127,0,1,
|
||||
29,13420,380,128,128,184,128,128,128,128,0,1,
|
||||
30,14863,390,129,129,187,129,129,129,129,0,1,
|
||||
31,16449,400,130,130,190,130,130,130,130,0,1,
|
||||
32,18194,410,131,131,193,131,131,131,131,0,1,
|
||||
33,20113,420,132,132,196,132,132,132,132,0,1,
|
||||
34,22225,430,133,133,199,133,133,133,133,0,1,
|
||||
35,24547,440,134,134,202,134,134,134,134,0,1,
|
||||
36,27102,450,135,135,205,135,135,135,135,0,1,
|
||||
37,29912,460,136,136,208,136,136,136,136,0,1,
|
||||
38,33003,470,137,137,211,137,137,137,137,0,1,
|
||||
39,36404,480,138,138,214,138,138,138,138,0,1,
|
||||
40,40144,490,139,139,217,139,139,139,139,0,1,
|
||||
41,44259,500,140,140,220,140,140,140,140,0,1,
|
||||
42,48785,510,141,141,223,141,141,141,141,0,1,
|
||||
43,53763,520,142,142,226,142,142,142,142,0,1,
|
||||
44,59240,530,143,143,229,143,143,143,143,0,1,
|
||||
45,65264,540,144,144,232,144,144,144,144,0,1,
|
||||
46,71890,550,145,145,235,145,145,145,145,0,1,
|
||||
47,79179,560,146,146,238,146,146,146,146,0,1,
|
||||
48,87197,570,147,147,241,147,147,147,147,0,1,
|
||||
49,96017,580,148,148,244,148,148,148,148,0,1,
|
||||
50,105718,590,149,149,247,149,149,149,149,0,2,
|
||||
51,116390,600,150,150,250,150,150,150,150,0,2,
|
||||
52,128129,610,151,151,253,151,151,151,151,0,2,
|
||||
53,141042,620,152,152,256,152,152,152,152,0,2,
|
||||
54,155247,630,153,153,259,153,153,153,153,0,2,
|
||||
55,170871,640,154,154,262,154,154,154,154,0,2,
|
||||
56,188059,650,155,155,265,155,155,155,155,0,2,
|
||||
57,206965,660,156,156,268,156,156,156,156,0,2,
|
||||
58,227761,670,157,157,271,157,157,157,157,0,2,
|
||||
59,250637,680,158,158,274,158,158,158,158,0,2,
|
||||
60,275801,690,159,159,277,159,159,159,159,0,2,
|
||||
61,303481,700,160,160,280,160,160,160,160,0,2,
|
||||
62,333929,710,161,161,283,161,161,161,161,0,2,
|
||||
63,367422,720,162,162,286,162,162,162,162,0,2,
|
||||
64,404265,730,163,163,289,163,163,163,163,0,2,
|
||||
65,444791,740,164,164,292,164,164,164,164,0,2,
|
||||
66,489370,750,165,165,295,165,165,165,165,0,2,
|
||||
67,538407,760,166,166,298,166,166,166,166,0,2,
|
||||
68,592348,770,167,167,301,167,167,167,167,0,2,
|
||||
69,651683,780,168,168,304,168,168,168,168,0,2,
|
||||
70,716951,790,169,169,307,169,169,169,169,0,2,
|
||||
71,788746,800,170,170,310,170,170,170,170,0,2,
|
||||
72,867721,810,171,171,313,171,171,171,171,0,2,
|
||||
73,954593,820,172,172,316,172,172,172,172,0,2,
|
||||
74,1050153,830,173,173,319,173,173,173,173,0,2,
|
||||
75,1155268,840,174,174,322,174,174,174,174,0,2,
|
||||
76,1270895,850,175,175,325,175,175,175,175,0,2,
|
||||
77,1398084,860,176,176,328,176,176,176,176,0,2,
|
||||
78,1537993,870,177,177,331,177,177,177,177,0,2,
|
||||
79,1691892,880,178,178,334,178,178,178,178,0,2,
|
||||
80,1861182,890,179,179,337,179,179,179,179,0,2,
|
||||
81,2047400,900,180,180,340,180,180,180,180,0,2,
|
||||
82,2252240,910,181,181,343,181,181,181,181,0,2,
|
||||
83,2477564,920,182,182,346,182,182,182,182,0,2,
|
||||
84,2725420,930,183,183,349,183,183,183,183,0,2,
|
||||
85,2998062,940,184,184,352,184,184,184,184,0,2,
|
||||
86,3297969,950,185,185,355,185,185,185,185,0,2,
|
||||
87,3627865,960,186,186,358,186,186,186,186,0,2,
|
||||
88,3990752,970,187,187,361,187,187,187,187,0,2,
|
||||
89,4389927,980,188,188,364,188,188,188,188,0,2,
|
||||
90,4829020,990,189,189,367,189,189,189,189,0,2,
|
||||
91,5312022,1000,190,190,370,190,190,190,190,0,2,
|
||||
92,5843324,1010,191,191,373,191,191,191,191,0,2,
|
||||
93,6427757,1020,192,192,376,192,192,192,192,0,2,
|
||||
94,7070633,1030,193,193,379,193,193,193,193,0,2,
|
||||
95,7777796,1040,194,194,382,194,194,194,194,0,2,
|
||||
96,8555676,1050,195,195,385,195,195,195,195,0,2,
|
||||
97,9411343,1060,196,196,388,196,196,196,196,0,2,
|
||||
98,10352578,1070,197,197,391,197,197,197,197,0,2,
|
||||
99,11387935,1080,198,198,394,198,198,198,198,0,2,
|
||||
100,12526829,1090,199,199,397,199,199,199,199,0,2,
|
|
3
titles/cxb/rss1_data/Shop/ShopList_Icon.csv
Normal file
3
titles/cxb/rss1_data/Shop/ShopList_Icon.csv
Normal file
@ -0,0 +1,3 @@
|
||||
1000,1,10000,1,-1,-,1411697520,1670178694,ic0000,10,1,,1,先行解禁,1,-,
|
||||
1001,2,10000,1,-1,-,1411697520,1670178694,ic0001,10,1,,1,先行解禁,1,-,
|
||||
1002,3,10000,1,-1,-,1412103600,1670178694,ic0002,10,2,,1,先行解禁,1,-,
|
|
13
titles/cxb/rss1_data/Shop/ShopList_Music.csv
Normal file
13
titles/cxb/rss1_data/Shop/ShopList_Music.csv
Normal file
@ -0,0 +1,13 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,MusicCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op),HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
0,1,1.00.00,3,1,-,1411697520.0288,1443233520.0288,megaro,0,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
1,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,nature,10,2,???,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
2,3,1.00.00,2,-1,-,1412103600.0288,1443639598.992,hopesb,30,1,「Landing on the moon」をSTANDARD以上でクリアする。,0,-1,-1,landin,1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3,4,1.00.00,1,-1,-,1412103600.0288,1443639598.992,flower,10,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
4,5,1.00.02,1,-1,1&2&3,1412103600.0288,1443639598.992,reseed3,10,0,「Human Nature」「Hopes Bright」「Flowerwall」をクリアする。,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5,6,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,dennou,20,1,-,0,-1,-1,flower,1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
6,7,1.00.00,2,-1,5&7,1411697520.0288,1443233520.0288,romanc,10,1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
7,8,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,landin,40,1,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
8,9,1.00.00,1,-1,7,1411697520.0288,1443233520.0288,ididid,50,0,-,-1,-1,-1,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
9,10,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,crissc,60,0,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,2,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,,,
|
||||
10,11,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,dazzli,70,1,MASTER以上の4曲S+以上クリアする。,1,1,4,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
||||
11,12,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,izimed,987654,1,MASTER以上の7曲S+以上クリアする。,1,1,7,-,1,2,-1,0,1,1,1,2,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,,,
|
|
3
titles/cxb/rss1_data/Shop/ShopList_Sale.csv
Normal file
3
titles/cxb/rss1_data/Shop/ShopList_Sale.csv
Normal file
@ -0,0 +1,3 @@
|
||||
saleID.,<2C>J<EFBFBD>n<EFBFBD><6E>,<2C>I<EFBFBD><49><EFBFBD><EFBFBD>,ShopID,Price,
|
||||
0,1411696799,1443236400,0,7000,
|
||||
1,1411783199,1443322800,1,7000,
|
|
4
titles/cxb/rss1_data/Shop/ShopList_SkinBg.csv
Normal file
4
titles/cxb/rss1_data/Shop/ShopList_SkinBg.csv
Normal file
@ -0,0 +1,4 @@
|
||||
shopID.,整理用No.,Ver.,出現フラグ,出現フラグ参照ID,条件,出現時間,消滅時間,ItemCode,価格,表示タイプ,Text,Type,Value(op),Value,対象曲,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,プレイ日,地域,
|
||||
3000,1,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skb0000,10,1,MASTER以上の2曲S+以上フルコンボクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3001,2,1.00.00,1,-1,-,1411697520.0288,1443233520.0288,skb0001,10,1,Next Frontier (Master)をクリア,0,-1,-1,bleeze,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
3002,3,1.00.00,1,-1,-,1412103600.0288,1443639598.992,skb0002,10,2,Master以上を1曲をS+以上でクリアする。,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
|
11
titles/cxb/rss1_data/Shop/ShopList_SkinEffect.csv
Normal file
11
titles/cxb/rss1_data/Shop/ShopList_SkinEffect.csv
Normal file
@ -0,0 +1,11 @@
|
||||
shopID.,<2C><><EFBFBD><EFBFBD><EFBFBD>pNo.,Ver.,<2C>o<EFBFBD><6F><EFBFBD>t<EFBFBD><74><EFBFBD>O,<2C>o<EFBFBD><6F><EFBFBD>t<EFBFBD><74><EFBFBD>O<EFBFBD>Q<EFBFBD><51>ID,<2C><><EFBFBD><EFBFBD>,<2C>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>Ŏ<EFBFBD><C58E><EFBFBD>,ItemCode,<2C><><EFBFBD>i,<2C>\<5C><><EFBFBD>^<5E>C<EFBFBD>v,Text,Type,Value(op),Value,<2C>Ώۋ<CE8F>,Difficulty(op),Difficulty,Level(op),Level,Grade(Op),Grade,GaugeType(op),GaugeType,HS(op)i,HS,APP,DAP,F-V,F-H,FullCombo,Combo(op),Combo,ClearRate(op),ClearRate,<2C>v<EFBFBD><76><EFBFBD>C<EFBFBD><43>,<2C>n<EFBFBD><6E>,
|
||||
5000,1,10000,1,-1,-,1411697520,1443233520,ske0000,10,1,MASTER<45>ȏ<EFBFBD><C88F>2<EFBFBD><32>S+<2B>ȏ<EFBFBD>t<EFBFBD><74><EFBFBD>R<EFBFBD><52><EFBFBD>{<7B>N<EFBFBD><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>B,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5001,2,10000,1,-1,-,1411697520,1443233520,ske0001,10,1,Next Frontier (Master<65>j<EFBFBD><6A><EFBFBD>N<EFBFBD><4E><EFBFBD>A,0,-1,-1,megaro,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5002,3,10000,1,-1,-,1412103600,1443639598,ske0002,10,2,Master<65>ȏ<EFBFBD><C88F>1<EFBFBD>Ȃ<EFBFBD>S+<2B>ȏ<EFBFBD>ŃN<C583><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>B,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,1,
|
||||
5003,4,10000,1,-1,-,1412103600,1443639598,ske0003,10,0,Master<65>ȏ<EFBFBD><C88F>1<EFBFBD>Ȃ<EFBFBD>S+<2B>ȏ<EFBFBD>ŃN<C583><4E><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD>B,1,1,1,-,1,2,-1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5004,5,10000,1,-1,-,1412103600,1443639598,ske0004,10,2,2<>ȃN<C883><4E><EFBFBD>A,1,1,2,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5005,5,10000,1,-1,-,1412103600,1443639598,ske0005,10,2,3<>ȃN<C883><4E><EFBFBD>A,1,1,3,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5006,5,10000,1,-1,-,1412103600,1443639598,ske0006,10,2,4<>ȃN<C883><4E><EFBFBD>A,1,1,4,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5007,5,10000,1,-1,-,1412103600,1443639598,ske0007,10,2,5<>ȃN<C883><4E><EFBFBD>A,1,1,5,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5008,5,10000,1,-1,-,1412103600,1443639598,ske0008,10,2,6<>ȃN<C883><4E><EFBFBD>A,1,1,6,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
||||
5009,5,10000,1,-1,-,1412103600,1443639598,ske0009,10,2,7<>ȃN<C883><4E><EFBFBD>A,1,1,7,-,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user