From 6354361db2341d5129b4c0cd7e192dbfd73db4aa Mon Sep 17 00:00:00 2001 From: drmext <71258889+drmext@users.noreply.github.com> Date: Wed, 12 Oct 2022 15:32:07 +0000 Subject: [PATCH] Implement rivals, venue top, and target graphs for IIDX 29 --- modules/iidx/iidx29music.py | 133 ++++++++++++++++++++++++++++++++---- modules/iidx/iidx29pc.py | 90 +++++++++++++++++++++++- 2 files changed, 206 insertions(+), 17 deletions(-) diff --git a/modules/iidx/iidx29music.py b/modules/iidx/iidx29music.py index f0fef53..a468d53 100644 --- a/modules/iidx/iidx29music.py +++ b/modules/iidx/iidx29music.py @@ -34,19 +34,44 @@ async def iidx29music_getrank(request: Request): all_scores = {} db = get_db() + + profile = db.table('iidx_profile').get(where('iidx_id') == iidxid)['version'][str(game_version)] + + if play_style == 0: + rivals = [ + profile.get("sp_rival_1_iidx_id", 0), + profile.get("sp_rival_2_iidx_id", 0), + profile.get("sp_rival_3_iidx_id", 0), + profile.get("sp_rival_4_iidx_id", 0), + profile.get("sp_rival_5_iidx_id", 0), + ] + elif play_style == 1: + rivals = [ + profile.get("dp_rival_1_iidx_id", 0), + profile.get("dp_rival_2_iidx_id", 0), + profile.get("dp_rival_3_iidx_id", 0), + profile.get("dp_rival_4_iidx_id", 0), + profile.get("dp_rival_5_iidx_id", 0), + ] + for record in db.table('iidx_scores_best').search( (where('music_id') < (game_version + 1) * 1000) - & (where('iidx_id') == iidxid) & (where('play_style') == play_style) ): + if record['iidx_id'] == iidxid: + rival_idx = -1 + elif record['iidx_id'] in rivals: + rival_idx = rivals.index(record['iidx_id']) + else: + continue music_id = record['music_id'] clear_flg = record['clear_flg'] ex_score = record['ex_score'] miss_count = record['miss_count'] chart_id = record['chart_id'] - if music_id not in all_scores: - all_scores[music_id] = { + if (rival_idx, music_id) not in all_scores: + all_scores[rival_idx, music_id] = { 0: {'clear_flg': -1, 'ex_score': -1, 'miss_count': -1}, 1: {'clear_flg': -1, 'ex_score': -1, 'miss_count': -1}, 2: {'clear_flg': -1, 'ex_score': -1, 'miss_count': -1}, @@ -54,20 +79,57 @@ async def iidx29music_getrank(request: Request): 4: {'clear_flg': -1, 'ex_score': -1, 'miss_count': -1}, } - all_scores[music_id][chart_id]['clear_flg'] = clear_flg - all_scores[music_id][chart_id]['ex_score'] = ex_score - all_scores[music_id][chart_id]['miss_count'] = miss_count + all_scores[rival_idx, music_id][chart_id]['clear_flg'] = clear_flg + all_scores[rival_idx, music_id][chart_id]['ex_score'] = ex_score + all_scores[rival_idx, music_id][chart_id]['miss_count'] = miss_count + + top_scores = {} + for record in db.table('iidx_scores_best').search( + (where('music_id') < (game_version + 1) * 1000) + & (where('play_style') == play_style) + ): + music_id = record['music_id'] + ex_score = record['ex_score'] + chart_id = record['chart_id'] + iidx_id = record['iidx_id'] + + if music_id not in top_scores: + top_scores[music_id] = { + 0: {'djname': "", 'clear_flg': -1, 'ex_score': -1}, + 1: {'djname': "", 'clear_flg': -1, 'ex_score': -1}, + 2: {'djname': "", 'clear_flg': -1, 'ex_score': -1}, + 3: {'djname': "", 'clear_flg': -1, 'ex_score': -1}, + 4: {'djname': "", 'clear_flg': -1, 'ex_score': -1}, + } + + if ex_score > top_scores[music_id][chart_id]['ex_score']: + top_name = db.table('iidx_profile').get(where('iidx_id') == iidx_id)['version'][str(game_version)]['djname'] + top_scores[music_id][chart_id]['djname'] = top_name + top_scores[music_id][chart_id]['clear_flg'] = 1 + top_scores[music_id][chart_id]['ex_score'] = ex_score response = E.response( E.IIDX29music( E.style(type=play_style), *[E.m([ - -1, + i, k, - *[all_scores[k][d]['clear_flg'] for d in range(5)], - *[all_scores[k][d]['ex_score'] for d in range(5)], - *[all_scores[k][d]['miss_count'] for d in range(5)], - ], __type='s16') for k in all_scores] + *[all_scores[i, k][d]['clear_flg'] for d in range(5)], + *[all_scores[i, k][d]['ex_score'] for d in range(5)], + *[all_scores[i, k][d]['miss_count'] for d in range(5)], + ], __type='s16') for i, k in all_scores], + *[E.top( + E.detail([ + k, + *[top_scores[k][d]['clear_flg'] for d in range(5)], + *[top_scores[k][d]['ex_score'] for d in range(5)], + ], __type='s16'), + name0=top_scores[k][0]['djname'], + name1=top_scores[k][1]['djname'], + name2=top_scores[k][2]['djname'], + name3=top_scores[k][3]['djname'], + name4=top_scores[k][4]['djname'] + ) for k in top_scores] ) ) @@ -323,9 +385,14 @@ async def iidx29music_reg(request: Request): async def iidx29music_appoint(request: Request): request_info = await core_process_request(request) - iidxid = int(request_info['root'][0].attrib['iidxid']) - music_id = int(request_info['root'][0].attrib['mid']) - chart_id = int(request_info['root'][0].attrib['clid']) + root = request_info['root'][0] + + iidxid = int(root.attrib['iidxid']) + music_id = int(root.attrib['mid']) + chart_id = int(root.attrib['clid']) + ctype = int(root.attrib['ctype']) + subtype = root.attrib['subtype'] + db = get_db() record = db.table('iidx_scores_best').get( @@ -343,6 +410,44 @@ async def iidx29music_appoint(request: Request): __size=len(record['ghost']) // 2, )) + if ctype == 1: + sdata = db.table('iidx_scores_best').get( + (where('iidx_id') == int(subtype)) + & (where('music_id') == music_id) + & (where('chart_id') == chart_id) + ) + elif ctype in (2, 4, 10): + sdata = { + 'game_version': 29, + 'ghost': "", + 'ex_score': 0, + 'iidx_id': 0, + 'name': "", + 'pid': 13 + } + + for record in db.table('iidx_scores_best').search( + (where('music_id') == music_id) + & (where('chart_id') == chart_id) + ): + if record['ex_score'] > sdata['ex_score']: + sdata['game_version'] = record['game_version'] + sdata['ghost'] = record['ghost'] + sdata['ex_score'] = record['ex_score'] + sdata['iidx_id'] = record['iidx_id'] + sdata['pid'] = record['pid'] + + if ctype in (1, 2, 4, 10) and sdata['ex_score'] != 0: + vals.append(E.sdata( + sdata['ghost'], + score=sdata['ex_score'], + name=db.table('iidx_profile').get(where('iidx_id') == sdata['iidx_id'])['version'][str(sdata['game_version'])]['djname'], + pid=sdata['pid'], + __type="bin", + __size=len(sdata['ghost']) // 2, + )) + + response = E.response( E.IIDX29music( *vals diff --git a/modules/iidx/iidx29pc.py b/modules/iidx/iidx29pc.py index b0f527f..42a5413 100644 --- a/modules/iidx/iidx29pc.py +++ b/modules/iidx/iidx29pc.py @@ -18,12 +18,24 @@ def get_profile(cid): ) +def get_profile_by_id(iidx_id): + return get_db().table('iidx_profile').get( + where('iidx_id') == iidx_id + ) + + def get_game_profile(cid, game_version): profile = get_profile(cid) return profile['version'].get(str(game_version), None) +def get_game_profile_by_id(iidx_id, game_version): + profile = get_profile_by_id(iidx_id) + + return profile['version'].get(str(game_version), None) + + def get_id_from_profile(cid): profile = get_db().table('iidx_profile').get( where('card') == cid @@ -58,6 +70,44 @@ async def iidx29pc_get(request: Request): profile = get_game_profile(cid, game_version) djid, djid_split = get_id_from_profile(cid) + rival_ids = [ + profile.get("sp_rival_1_iidx_id", 0), + profile.get("sp_rival_2_iidx_id", 0), + profile.get("sp_rival_3_iidx_id", 0), + profile.get("sp_rival_4_iidx_id", 0), + profile.get("sp_rival_5_iidx_id", 0), + profile.get("dp_rival_1_iidx_id", 0), + profile.get("dp_rival_2_iidx_id", 0), + profile.get("dp_rival_3_iidx_id", 0), + profile.get("dp_rival_4_iidx_id", 0), + profile.get("dp_rival_5_iidx_id", 0), + ] + rivals = {} + for idx, r in enumerate(rival_ids): + if r == 0: + continue + rivals[idx] = {} + rivals[idx]['spdp'] = 1 if idx < 5 else 2 + + rival_profile = get_game_profile_by_id(r, game_version) + rdjid = "%08d" % r + rdjid_split = '-'.join([rdjid[:4], rdjid[4:]]) + + rivals[idx]['djid'] = rdjid + rivals[idx]['djid_split'] = rdjid_split + rivals[idx]['djname'] = rival_profile['djname'] + rivals[idx]['region'] = rival_profile['region'] + rivals[idx]['sa'] = rival_profile['sach'] + rivals[idx]['sg'] = rival_profile['grade_single'] + rivals[idx]['da'] = rival_profile['dach'] + rivals[idx]['dg'] = rival_profile['grade_double'] + rivals[idx]['body'] = rival_profile['body'] + rivals[idx]['face'] = rival_profile['face'] + rivals[idx]['hair'] = rival_profile['hair'] + rivals[idx]['hand'] = rival_profile['hand'] + rivals[idx]['head'] = rival_profile['head'] + + response = E.response( E.IIDX29pc( E.pcdata( @@ -154,7 +204,28 @@ async def iidx29pc_get(request: Request): profile["kokokara_start"], ], __type="s16"), - E.rlist(), + E.rlist( + *[E.rival( + E.is_robo(0, __type="bool"), + E.shop(name=config.arcade), + E.qprodata( + body=rivals[r]['body'], + face=rivals[r]['face'], + hair=rivals[r]['hair'], + hand=rivals[r]['hand'], + head=rivals[r]['head'], + ), + da=rivals[r]['da'], + dg=rivals[r]['dg'], + djname=rivals[r]['djname'], + id=rivals[r]['djid'], + id_str=rivals[r]['djid_split'], + pid=rivals[r]['region'], + sa=rivals[r]['sa'], + sg=rivals[r]['sg'], + spdp=rivals[r]['spdp'], + )for r in rivals], + ), E.ir_data(), E.secret_course_data(), E.deller(deller=profile['deller'], rate=0), @@ -850,7 +921,7 @@ async def iidx29pc_reg(request: Request): '_show_category_rival_winlose': 1, '_show_category_all_rival_play': 0, '_show_category_arena_winlose': 1, - '_show_rival_shop_info': 0, + '_show_rival_shop_info': 1, '_hide_play_count': 0, '_show_score_graph_cutin': 1, '_hide_iidx_id': 0, @@ -860,7 +931,20 @@ async def iidx29pc_reg(request: Request): 'skin_customize_flag_frame': 0, 'skin_customize_flag_bgm': 0, - 'skin_customize_flag_lane': 0 + 'skin_customize_flag_lane': 0, + + # Rivals + 'sp_rival_1_iidx_id': 0, + 'sp_rival_2_iidx_id': 0, + 'sp_rival_3_iidx_id': 0, + 'sp_rival_4_iidx_id': 0, + 'sp_rival_5_iidx_id': 0, + + 'dp_rival_1_iidx_id': 0, + 'dp_rival_2_iidx_id': 0, + 'dp_rival_3_iidx_id': 0, + 'dp_rival_4_iidx_id': 0, + 'dp_rival_5_iidx_id': 0 } db.upsert(all_profiles_for_card, where('card') == cid)