mirror of
https://github.com/drmext/MonkeyBusiness.git
synced 2025-02-10 07:48:20 +01:00
Fix slow loading and Area/Machine scores
This commit is contained in:
parent
2b8f7c7d39
commit
dcd8a013bc
@ -40,17 +40,22 @@ def get_common(ddr_id, game_version, idx):
|
|||||||
async def usergamedata_advanced(request: Request):
|
async def usergamedata_advanced(request: Request):
|
||||||
request_info = await core_process_request(request)
|
request_info = await core_process_request(request)
|
||||||
game_version = request_info['game_version']
|
game_version = request_info['game_version']
|
||||||
|
is_omni = True if request_info['rev'] == 'O' else False
|
||||||
response = None
|
response = None
|
||||||
|
|
||||||
mode = request_info['root'][0].find('data/mode').text
|
data = request_info['root'][0].find('data')
|
||||||
refid = request_info['root'][0].find('data/refid').text
|
mode = data.find('mode').text
|
||||||
|
gamesession = data.find('gamesession').text
|
||||||
|
refid = data.find('refid').text
|
||||||
|
|
||||||
|
default = 'X0000000000000000000000000000000'[:-len(gamesession)]+gamesession
|
||||||
|
|
||||||
db = get_db()
|
db = get_db()
|
||||||
|
|
||||||
all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid)
|
all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid)
|
||||||
|
|
||||||
if mode == 'usernew':
|
if mode == 'usernew':
|
||||||
shoparea = request_info['root'][0].find('data/shoparea').text
|
shoparea = data.find('shoparea').text
|
||||||
|
|
||||||
if 'ddr_id' not in all_profiles_for_card:
|
if 'ddr_id' not in all_profiles_for_card:
|
||||||
ddr_id = random.randint(10000000, 99999999)
|
ddr_id = random.randint(10000000, 99999999)
|
||||||
@ -68,6 +73,8 @@ async def usergamedata_advanced(request: Request):
|
|||||||
'rival_1_ddr_id': 0,
|
'rival_1_ddr_id': 0,
|
||||||
'rival_2_ddr_id': 0,
|
'rival_2_ddr_id': 0,
|
||||||
'rival_3_ddr_id': 0,
|
'rival_3_ddr_id': 0,
|
||||||
|
'single_grade': 0,
|
||||||
|
'double_grade': 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid)
|
db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid)
|
||||||
@ -81,31 +88,21 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'userload':
|
elif mode == 'userload' and refid != default:
|
||||||
single_grade = 0
|
|
||||||
double_grade = 0
|
|
||||||
all_scores = {}
|
all_scores = {}
|
||||||
if all_profiles_for_card is not None:
|
if all_profiles_for_card is not None:
|
||||||
ddr_id = all_profiles_for_card['ddr_id']
|
ddr_id = all_profiles_for_card['ddr_id']
|
||||||
profile = get_game_profile(refid, game_version)
|
profile = get_game_profile(refid, game_version)
|
||||||
|
|
||||||
single_grade = profile.get('single_grade', 0)
|
single_grade = profile.get('single_grade', 0)
|
||||||
double_grade = profile.get('double_grade', 0)
|
double_grade = profile.get('double_grade', 0)
|
||||||
for record in db.table('ddr_scores_best').search(where('game_version') == game_version):
|
|
||||||
mcode = str(record['mcode'])
|
for record in db.table('ddr_scores_best').search((where('game_version') == game_version)& (where('ddr_id') == ddr_id)):
|
||||||
if mcode not in all_scores.keys():
|
mcode = record['mcode']
|
||||||
scores = []
|
difficulty = record['difficulty']
|
||||||
for difficulty in range(10):
|
if mcode not in all_scores:
|
||||||
s = db.table('ddr_scores_best').get(
|
all_scores[mcode] = [[0, 0, 0, 0, 0] for x in range(10)]
|
||||||
(where('ddr_id') == ddr_id)
|
all_scores[mcode][difficulty] = ([1, record['rank'], record['lamp'], record['score'], record['ghostid']])
|
||||||
& (where('game_version') == game_version)
|
|
||||||
& (where('mcode') == int(mcode))
|
|
||||||
& (where('difficulty') == difficulty)
|
|
||||||
)
|
|
||||||
if s == None:
|
|
||||||
scores.append([0, 0, 0, 0, 0])
|
|
||||||
else:
|
|
||||||
scores.append([1, s['rank'], s['lamp'], s['score'], s['ghostid']])
|
|
||||||
all_scores[mcode] = scores
|
|
||||||
|
|
||||||
response = E.response(
|
response = E.response(
|
||||||
E.playerdata(
|
E.playerdata(
|
||||||
@ -174,13 +171,31 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'usersave':
|
elif mode == 'ghostload':
|
||||||
timestamp = time.time()
|
ghostid = int(data.find('ghostid').text)
|
||||||
|
record = db.table('ddr_scores').get(doc_id=ghostid)
|
||||||
|
|
||||||
data = request_info['root'][0].find('data')
|
response = E.response(
|
||||||
|
E.playerdata(
|
||||||
|
E.result(0, __type="s32"),
|
||||||
|
E.ghostdata(
|
||||||
|
E.code(record['ddr_id'], __type="s32"),
|
||||||
|
E.mcode(record['mcode'], __type="u32"),
|
||||||
|
E.notetype(record['difficulty'], __type="u8"),
|
||||||
|
E.ghostsize(record['ghostsize'], __type="s32"),
|
||||||
|
E.ghost(record['ghost'], __type="string"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
elif mode == 'usersave' and refid != default:
|
||||||
|
timestamp = time.time()
|
||||||
|
|
||||||
ddr_id = int(data.find('ddrcode').text)
|
ddr_id = int(data.find('ddrcode').text)
|
||||||
playstyle = int(data.find('playstyle').text)
|
playstyle = int(data.find('playstyle').text)
|
||||||
|
pcbid = data.find('pcbid').text
|
||||||
|
shoparea = data.find('shoparea').text
|
||||||
|
|
||||||
note = data.findall('note')
|
note = data.findall('note')
|
||||||
|
|
||||||
if int(data.find('isgameover').text) == 0:
|
if int(data.find('isgameover').text) == 0:
|
||||||
@ -227,6 +242,8 @@ async def usergamedata_advanced(request: Request):
|
|||||||
db.table('ddr_scores').insert(
|
db.table('ddr_scores').insert(
|
||||||
{
|
{
|
||||||
'timestamp': timestamp,
|
'timestamp': timestamp,
|
||||||
|
'pcbid': pcbid,
|
||||||
|
'shoparea': shoparea,
|
||||||
'game_version': game_version,
|
'game_version': game_version,
|
||||||
'ddr_id': ddr_id,
|
'ddr_id': ddr_id,
|
||||||
'playstyle': playstyle,
|
'playstyle': playstyle,
|
||||||
@ -307,40 +324,25 @@ async def usergamedata_advanced(request: Request):
|
|||||||
& (where('difficulty') == difficulty)
|
& (where('difficulty') == difficulty)
|
||||||
)
|
)
|
||||||
|
|
||||||
wr = db.table('ddr_scores_wr').get(
|
|
||||||
(where('game_version') == game_version)
|
|
||||||
& (where('mcode') == mcode)
|
|
||||||
& (where('difficulty') == difficulty)
|
|
||||||
)
|
|
||||||
wr = {} if wr is None else wr
|
|
||||||
|
|
||||||
if best_score_data.get('score', 0) > wr.get('score', 0):
|
|
||||||
wr_score_data = best_score_data
|
|
||||||
|
|
||||||
wr_score_data['ghostid'] = ghostid.doc_id
|
|
||||||
|
|
||||||
db.table('ddr_scores_wr').upsert(
|
|
||||||
wr_score_data,
|
|
||||||
(where('game_version') == game_version)
|
|
||||||
& (where('mcode') == mcode)
|
|
||||||
& (where('difficulty') == difficulty)
|
|
||||||
)
|
|
||||||
|
|
||||||
# workaround to save the correct dan grade by using the course mcode
|
|
||||||
# because omnimix force unlocks all dan courses with <grade __type="u8">1</grade> in coursedb.xml
|
|
||||||
elif int(data.find('isgameover').text) == 1:
|
elif int(data.find('isgameover').text) == 1:
|
||||||
n = note[0]
|
single_grade = int(data.find('grade/single_grade').text)
|
||||||
|
double_grade = int(data.find('grade/double_grade').text)
|
||||||
profile = get_profile(refid)
|
profile = get_profile(refid)
|
||||||
game_profile = profile['version'].get(str(game_version), {})
|
game_profile = profile['version'].get(str(game_version), {})
|
||||||
|
# workaround to save the correct dan grade by using the course mcode
|
||||||
|
# because omnimix force unlocks all dan courses with <grade __type="u8">1</grade> in coursedb.xml
|
||||||
|
if is_omni:
|
||||||
|
n = note[0]
|
||||||
mcode = int(n.find('mcode').text)
|
mcode = int(n.find('mcode').text)
|
||||||
if int(n.find('clearkind').text) != 1:
|
if int(n.find('clearkind').text) != 1:
|
||||||
for idx, d in enumerate(range(1000, 1011), start=1):
|
for grade, course_id in enumerate(range(1000, 1011), start=1):
|
||||||
if playstyle == 0:
|
if playstyle == 0 and mcode in (course_id, course_id + 11):
|
||||||
if mcode in (d, d + 11):
|
single_grade = grade
|
||||||
game_profile['single_grade'] = max(idx, game_profile.get('single_grade', idx))
|
elif playstyle == 1 and mcode in (course_id + 1000, course_id + 1000 + 11):
|
||||||
elif playstyle == 1:
|
double_grade = grade
|
||||||
if mcode in (d + 1000, d + 1000 + 11):
|
|
||||||
game_profile['double_grade'] = max(idx, game_profile.get('double_grade', idx))
|
game_profile['single_grade'] = max(single_grade, game_profile.get('single_grade', single_grade))
|
||||||
|
game_profile['double_grade'] = max(double_grade, game_profile.get('double_grade', double_grade))
|
||||||
|
|
||||||
profile['version'][str(game_version)] = game_profile
|
profile['version'][str(game_version)] = game_profile
|
||||||
db.table('ddr_profile').upsert(profile, where('card') == refid)
|
db.table('ddr_profile').upsert(profile, where('card') == refid)
|
||||||
@ -351,24 +353,91 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'inheritance':
|
elif mode == 'rivalload':
|
||||||
response = E.response(
|
loadflag = int(data.find('loadflag').text)
|
||||||
E.playerdata(
|
ddrcode = int(data.find('ddrcode').text)
|
||||||
E.result(0, __type="s32"),
|
pcbid = data.find('pcbid').text
|
||||||
E.InheritanceStatus(1, __type="s32"),
|
shoparea = data.find('shoparea').text
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if mode == 'rivalload':
|
if loadflag == 1:
|
||||||
shoparea = request_info['root'][0].find('data/shoparea').text
|
all_scores = {}
|
||||||
loadflag = int(request_info['root'][0].find('data/loadflag').text)
|
for record in db.table('ddr_scores').search(
|
||||||
ddrcode = int(request_info['root'][0].find('data/ddrcode').text)
|
(where('game_version') == game_version)
|
||||||
pcbid = request_info['root'][0].find('data/pcbid').text
|
& (where('pcbid') == pcbid)
|
||||||
|
& (where('ddr_id') != 0)
|
||||||
|
):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
if loadflag in (1, 2, 4):
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
scores = []
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
for s in db.table('ddr_scores_wr'):
|
'game_version': game_version,
|
||||||
scores.append(s)
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
|
elif loadflag == 2:
|
||||||
|
all_scores = {}
|
||||||
|
for record in db.table('ddr_scores').search(
|
||||||
|
(where('game_version') == game_version)
|
||||||
|
& (where('shoparea') == shoparea)
|
||||||
|
& (where('ddr_id') != 0)
|
||||||
|
):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
|
'game_version': game_version,
|
||||||
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
|
elif loadflag == 4:
|
||||||
|
all_scores = {}
|
||||||
|
for record in db.table('ddr_scores').search((where('game_version') == game_version) & (where('ddr_id') != 0)):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
|
'game_version': game_version,
|
||||||
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
elif loadflag in (8, 16, 32):
|
elif loadflag in (8, 16, 32):
|
||||||
scores = []
|
scores = []
|
||||||
@ -396,21 +465,19 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'ghostload':
|
elif mode == 'inheritance':
|
||||||
ghostid = int(request_info['root'][0].find('data/ghostid').text)
|
|
||||||
record = db.table('ddr_scores').get(doc_id=ghostid)
|
|
||||||
|
|
||||||
response = E.response(
|
response = E.response(
|
||||||
E.playerdata(
|
E.playerdata(
|
||||||
E.result(0, __type="s32"),
|
E.result(0, __type="s32"),
|
||||||
E.ghostdata(
|
E.InheritanceStatus(1, __type="s32"),
|
||||||
E.code(record['ddr_id'], __type="s32"),
|
|
||||||
E.mcode(record['mcode'], __type="u32"),
|
|
||||||
E.notetype(record['difficulty'], __type="u8"),
|
|
||||||
E.ghostsize(record['ghostsize'], __type="s32"),
|
|
||||||
E.ghost(record['ghost'], __type="string"),
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
response = E.response(
|
||||||
|
E.playerdata(
|
||||||
|
E.result(1, __type="s32"),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
response_body, response_headers = await core_prepare_response(request, response)
|
response_body, response_headers = await core_prepare_response(request, response)
|
||||||
|
@ -40,17 +40,22 @@ def get_common(ddr_id, game_version, idx):
|
|||||||
async def usergamedata_advanced(request: Request):
|
async def usergamedata_advanced(request: Request):
|
||||||
request_info = await core_process_request(request)
|
request_info = await core_process_request(request)
|
||||||
game_version = request_info['game_version']
|
game_version = request_info['game_version']
|
||||||
|
is_omni = True if request_info['rev'] == 'O' else False
|
||||||
response = None
|
response = None
|
||||||
|
|
||||||
mode = request_info['root'][0].find('data/mode').text
|
data = request_info['root'][0].find('data')
|
||||||
refid = request_info['root'][0].find('data/refid').text
|
mode = data.find('mode').text
|
||||||
|
gamesession = data.find('gamesession').text
|
||||||
|
refid = data.find('refid').text
|
||||||
|
|
||||||
|
default = 'X0000000000000000000000000000000'[:-len(gamesession)]+gamesession
|
||||||
|
|
||||||
db = get_db()
|
db = get_db()
|
||||||
|
|
||||||
all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid)
|
all_profiles_for_card = db.table('ddr_profile').get(Query().card == refid)
|
||||||
|
|
||||||
if mode == 'usernew':
|
if mode == 'usernew':
|
||||||
shoparea = request_info['root'][0].find('data/shoparea').text
|
shoparea = data.find('shoparea').text
|
||||||
|
|
||||||
if 'ddr_id' not in all_profiles_for_card:
|
if 'ddr_id' not in all_profiles_for_card:
|
||||||
ddr_id = random.randint(10000000, 99999999)
|
ddr_id = random.randint(10000000, 99999999)
|
||||||
@ -68,6 +73,8 @@ async def usergamedata_advanced(request: Request):
|
|||||||
'rival_1_ddr_id': 0,
|
'rival_1_ddr_id': 0,
|
||||||
'rival_2_ddr_id': 0,
|
'rival_2_ddr_id': 0,
|
||||||
'rival_3_ddr_id': 0,
|
'rival_3_ddr_id': 0,
|
||||||
|
'single_grade': 0,
|
||||||
|
'double_grade': 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid)
|
db.table('ddr_profile').upsert(all_profiles_for_card, where('card') == refid)
|
||||||
@ -81,26 +88,21 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'userload':
|
elif mode == 'userload' and refid != default:
|
||||||
all_scores = {}
|
all_scores = {}
|
||||||
if all_profiles_for_card is not None:
|
if all_profiles_for_card is not None:
|
||||||
ddr_id = all_profiles_for_card['ddr_id']
|
ddr_id = all_profiles_for_card['ddr_id']
|
||||||
for record in db.table('ddr_scores_best').search(where('game_version') == game_version):
|
profile = get_game_profile(refid, game_version)
|
||||||
mcode = str(record['mcode'])
|
|
||||||
if mcode not in all_scores.keys():
|
single_grade = profile.get('single_grade', 0)
|
||||||
scores = []
|
double_grade = profile.get('double_grade', 0)
|
||||||
for difficulty in range(10):
|
|
||||||
s = db.table('ddr_scores_best').get(
|
for record in db.table('ddr_scores_best').search((where('game_version') == game_version)& (where('ddr_id') == ddr_id)):
|
||||||
(where('ddr_id') == ddr_id)
|
mcode = record['mcode']
|
||||||
& (where('game_version') == game_version)
|
difficulty = record['difficulty']
|
||||||
& (where('mcode') == int(mcode))
|
if mcode not in all_scores:
|
||||||
& (where('difficulty') == difficulty)
|
all_scores[mcode] = [[0, 0, 0, 0, 0] for x in range(10)]
|
||||||
)
|
all_scores[mcode][difficulty] = ([1, record['rank'], record['lamp'], record['score'], record['ghostid']])
|
||||||
if s == None:
|
|
||||||
scores.append([0, 0, 0, 0, 0])
|
|
||||||
else:
|
|
||||||
scores.append([1, s['rank'], s['lamp'], s['score'], s['ghostid']])
|
|
||||||
all_scores[mcode] = scores
|
|
||||||
|
|
||||||
response = E.response(
|
response = E.response(
|
||||||
E.playerdata_2(
|
E.playerdata_2(
|
||||||
@ -128,8 +130,8 @@ async def usergamedata_advanced(request: Request):
|
|||||||
E.savedata(0, __type="s64"),
|
E.savedata(0, __type="s64"),
|
||||||
) for event in [e for e in range(1, 100) if e not in [4, 6, 7, 8, 14, 47]]],
|
) for event in [e for e in range(1, 100) if e not in [4, 6, 7, 8, 14, 47]]],
|
||||||
E.grade(
|
E.grade(
|
||||||
E.single_grade(0, __type="u32"),
|
E.single_grade(single_grade, __type="u32"),
|
||||||
E.double_grade(0, __type="u32"),
|
E.double_grade(double_grade, __type="u32"),
|
||||||
),
|
),
|
||||||
E.golden_league(
|
E.golden_league(
|
||||||
E.league_class(0, __type="s32"),
|
E.league_class(0, __type="s32"),
|
||||||
@ -169,15 +171,34 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'usersave':
|
elif mode == 'ghostload':
|
||||||
|
ghostid = int(data.find('ghostid').text)
|
||||||
|
record = db.table('ddr_scores').get(doc_id=ghostid)
|
||||||
|
|
||||||
|
response = E.response(
|
||||||
|
E.playerdata_2(
|
||||||
|
E.result(0, __type="s32"),
|
||||||
|
E.ghostdata(
|
||||||
|
E.code(record['ddr_id'], __type="s32"),
|
||||||
|
E.mcode(record['mcode'], __type="u32"),
|
||||||
|
E.notetype(record['difficulty'], __type="u8"),
|
||||||
|
E.ghostsize(record['ghostsize'], __type="s32"),
|
||||||
|
E.ghost(record['ghost'], __type="string"),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
elif mode == 'usersave' and refid != default:
|
||||||
timestamp = time.time()
|
timestamp = time.time()
|
||||||
|
|
||||||
data = request_info['root'][0].find('data')
|
|
||||||
|
|
||||||
if not int(data.find('isgameover').text) == 1:
|
|
||||||
ddr_id = int(data.find('ddrcode').text)
|
ddr_id = int(data.find('ddrcode').text)
|
||||||
playstyle = int(data.find('playstyle').text)
|
playstyle = int(data.find('playstyle').text)
|
||||||
|
pcbid = data.find('pcbid').text
|
||||||
|
shoparea = data.find('shoparea').text
|
||||||
|
|
||||||
note = data.findall('note')
|
note = data.findall('note')
|
||||||
|
|
||||||
|
if int(data.find('isgameover').text) == 0:
|
||||||
for n in note:
|
for n in note:
|
||||||
if int(n.find('stagenum').text) != 0:
|
if int(n.find('stagenum').text) != 0:
|
||||||
mcode = int(n.find('mcode').text)
|
mcode = int(n.find('mcode').text)
|
||||||
@ -221,6 +242,8 @@ async def usergamedata_advanced(request: Request):
|
|||||||
db.table('ddr_scores').insert(
|
db.table('ddr_scores').insert(
|
||||||
{
|
{
|
||||||
'timestamp': timestamp,
|
'timestamp': timestamp,
|
||||||
|
'pcbid': pcbid,
|
||||||
|
'shoparea': shoparea,
|
||||||
'game_version': game_version,
|
'game_version': game_version,
|
||||||
'ddr_id': ddr_id,
|
'ddr_id': ddr_id,
|
||||||
'playstyle': playstyle,
|
'playstyle': playstyle,
|
||||||
@ -301,24 +324,28 @@ async def usergamedata_advanced(request: Request):
|
|||||||
& (where('difficulty') == difficulty)
|
& (where('difficulty') == difficulty)
|
||||||
)
|
)
|
||||||
|
|
||||||
wr = db.table('ddr_scores_wr').get(
|
elif int(data.find('isgameover').text) == 1:
|
||||||
(where('game_version') == game_version)
|
single_grade = int(data.find('grade/single_grade').text)
|
||||||
& (where('mcode') == mcode)
|
double_grade = int(data.find('grade/double_grade').text)
|
||||||
& (where('difficulty') == difficulty)
|
profile = get_profile(refid)
|
||||||
)
|
game_profile = profile['version'].get(str(game_version), {})
|
||||||
wr = {} if wr is None else wr
|
# workaround to save the correct dan grade by using the course mcode
|
||||||
|
# because omnimix force unlocks all dan courses with <grade __type="u8">1</grade> in coursedb.xml
|
||||||
|
if is_omni:
|
||||||
|
n = note[0]
|
||||||
|
mcode = int(n.find('mcode').text)
|
||||||
|
if int(n.find('clearkind').text) != 1:
|
||||||
|
for grade, course_id in enumerate(range(1000, 1011), start=1):
|
||||||
|
if playstyle == 0 and mcode in (course_id, course_id + 11):
|
||||||
|
single_grade = grade
|
||||||
|
elif playstyle == 1 and mcode in (course_id + 1000, course_id + 1000 + 11):
|
||||||
|
double_grade = grade
|
||||||
|
|
||||||
if best_score_data.get('score', 0) > wr.get('score', 0):
|
game_profile['single_grade'] = max(single_grade, game_profile.get('single_grade', single_grade))
|
||||||
wr_score_data = best_score_data
|
game_profile['double_grade'] = max(double_grade, game_profile.get('double_grade', double_grade))
|
||||||
|
|
||||||
wr_score_data['ghostid'] = ghostid.doc_id
|
profile['version'][str(game_version)] = game_profile
|
||||||
|
db.table('ddr_profile').upsert(profile, where('card') == refid)
|
||||||
db.table('ddr_scores_wr').upsert(
|
|
||||||
wr_score_data,
|
|
||||||
(where('game_version') == game_version)
|
|
||||||
& (where('mcode') == mcode)
|
|
||||||
& (where('difficulty') == difficulty)
|
|
||||||
)
|
|
||||||
|
|
||||||
response = E.response(
|
response = E.response(
|
||||||
E.playerdata_2(
|
E.playerdata_2(
|
||||||
@ -326,24 +353,91 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'inheritance':
|
elif mode == 'rivalload':
|
||||||
response = E.response(
|
loadflag = int(data.find('loadflag').text)
|
||||||
E.playerdata_2(
|
ddrcode = int(data.find('ddrcode').text)
|
||||||
E.result(0, __type="s32"),
|
pcbid = data.find('pcbid').text
|
||||||
E.InheritanceStatus(1, __type="s32"),
|
shoparea = data.find('shoparea').text
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if mode == 'rivalload':
|
if loadflag == 1:
|
||||||
shoparea = request_info['root'][0].find('data/shoparea').text
|
all_scores = {}
|
||||||
loadflag = int(request_info['root'][0].find('data/loadflag').text)
|
for record in db.table('ddr_scores').search(
|
||||||
ddrcode = int(request_info['root'][0].find('data/ddrcode').text)
|
(where('game_version') == game_version)
|
||||||
pcbid = request_info['root'][0].find('data/pcbid').text
|
& (where('pcbid') == pcbid)
|
||||||
|
& (where('ddr_id') != 0)
|
||||||
|
):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
if loadflag in (1, 2, 4):
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
scores = []
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
for s in db.table('ddr_scores_wr'):
|
'game_version': game_version,
|
||||||
scores.append(s)
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
|
elif loadflag == 2:
|
||||||
|
all_scores = {}
|
||||||
|
for record in db.table('ddr_scores').search(
|
||||||
|
(where('game_version') == game_version)
|
||||||
|
& (where('shoparea') == shoparea)
|
||||||
|
& (where('ddr_id') != 0)
|
||||||
|
):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
|
'game_version': game_version,
|
||||||
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
|
elif loadflag == 4:
|
||||||
|
all_scores = {}
|
||||||
|
for record in db.table('ddr_scores').search((where('game_version') == game_version) & (where('ddr_id') != 0)):
|
||||||
|
ddr_id = record['ddr_id']
|
||||||
|
playstyle = record['playstyle']
|
||||||
|
mcode = record['mcode']
|
||||||
|
difficulty = record['difficulty']
|
||||||
|
score = record['score']
|
||||||
|
|
||||||
|
if (playstyle, mcode, difficulty) not in all_scores or score > all_scores[(playstyle, mcode, difficulty)].get("score"):
|
||||||
|
all_scores[playstyle, mcode, difficulty] = {
|
||||||
|
'game_version': game_version,
|
||||||
|
'ddr_id': ddr_id,
|
||||||
|
'playstyle': playstyle,
|
||||||
|
'mcode': mcode,
|
||||||
|
'difficulty': difficulty,
|
||||||
|
'rank': record['rank'],
|
||||||
|
'lamp': record['lamp'],
|
||||||
|
'score': score,
|
||||||
|
'exscore': record['exscore'],
|
||||||
|
'ghostid': record.doc_id
|
||||||
|
}
|
||||||
|
scores = list(all_scores.values())
|
||||||
|
|
||||||
elif loadflag in (8, 16, 32):
|
elif loadflag in (8, 16, 32):
|
||||||
scores = []
|
scores = []
|
||||||
@ -376,21 +470,19 @@ async def usergamedata_advanced(request: Request):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if mode == 'ghostload':
|
elif mode == 'inheritance':
|
||||||
ghostid = int(request_info['root'][0].find('data/ghostid').text)
|
|
||||||
record = db.table('ddr_scores').get(doc_id=ghostid)
|
|
||||||
|
|
||||||
response = E.response(
|
response = E.response(
|
||||||
E.playerdata_2(
|
E.playerdata_2(
|
||||||
E.result(0, __type="s32"),
|
E.result(0, __type="s32"),
|
||||||
E.ghostdata(
|
E.InheritanceStatus(1, __type="s32"),
|
||||||
E.code(record['ddr_id'], __type="s32"),
|
|
||||||
E.mcode(record['mcode'], __type="u32"),
|
|
||||||
E.notetype(record['difficulty'], __type="u8"),
|
|
||||||
E.ghostsize(record['ghostsize'], __type="s32"),
|
|
||||||
E.ghost(record['ghost'], __type="string"),
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
response = E.response(
|
||||||
|
E.playerdata(
|
||||||
|
E.result(1, __type="s32"),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
response_body, response_headers = await core_prepare_response(request, response)
|
response_body, response_headers = await core_prepare_response(request, response)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user