mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-05 05:57:59 +08:00
Ready to update to v2.8.1
Wait for chart constants and character values.
This commit is contained in:
25
README.md
25
README.md
@@ -65,21 +65,24 @@ It is just so interesting. What it can do is under exploration.
|
||||
>
|
||||
> Tips: When updating, please keep the original database in case of data loss.
|
||||
|
||||
|
||||
### Version 2.8
|
||||
- 适用于Arcaea 3.11.2版本 For Arcaea 3.11.2
|
||||
<!--
|
||||
### Version 2.8.1
|
||||
- 适用于Arcaea 3.12.0版本 For Arcaea 3.12.0
|
||||
- 更新了歌曲数据库 Update the song database.
|
||||
- 新增对Link Play的支持 Add support for Link Play.
|
||||
- 搭档**彩梦**已觉醒 Uncap the character **ayu**.
|
||||
- 新搭档**维塔**已解锁 Unlock the character **Vita**.
|
||||
- 新增对**维塔**的技能支持 Add support for the skill of **Vita**.
|
||||
- 修正世界模式进度计算方式 Revise the algorithm of world mode progress.
|
||||
- 修复世界模式下 **对立(风暴)** 数值计算错误的问题 Fix the wrong value of **Tairitsu(Tempest)** in the World Mode.
|
||||
|
||||
|
||||
- 以下是累积更新 The following are cumulative updates:
|
||||
- 修复注册接口端点多了个杠的问题 Fix an unexpected slash at the registered interface endpoint.
|
||||
- 新搭档**白姬**已解锁 Unlock the character **shirahime**.
|
||||
- 修正两个角色的数值问题 Fix the values of two characters.
|
||||
- 新搭档**玛莉嘉**已解锁 Unlock the character **marija**.
|
||||
- #35 集成式接口优化(By Young-Lord) Optimize `aggregate` interface. (By Young-Lord)
|
||||
- 新增填写Link Play服务器地址的选项,解决地址无法正确自动获取的问题 Add the option of filling in Link Play server address, which can solve the problem that the address cannot be obtained automatically.
|
||||
- 修复高版本iOS客户端无法登陆的问题 Fix a bug that the high version of iOS client cannot log in.
|
||||
- 修复有关下载的安全性问题 Fix a safety problem about downloading.
|
||||
- 修复有不同音频的Beyond谱面无法下载的问题 Fix a bug about unable to download a beyond chart which has another audio file.
|
||||
-->
|
||||
|
||||
> 提示:Link Play可能存在大量bug
|
||||
> Tips: There may be many bugs in Link Play system.
|
||||
|
||||
|
||||
## 运行环境与依赖 Running environment and requirements
|
||||
|
||||
@@ -4,7 +4,7 @@ import json
|
||||
|
||||
# 数据库初始化文件,删掉arcaea_database.db文件后运行即可,谨慎使用
|
||||
|
||||
ARCAEA_SERVER_VERSION = 'v2.8'
|
||||
ARCAEA_SERVER_VERSION = 'v2.8.1'
|
||||
|
||||
|
||||
def main(path='./'):
|
||||
@@ -299,46 +299,46 @@ def main(path='./'):
|
||||
|
||||
# 搭档初始化
|
||||
char = ['hikari', 'tairitsu', 'kou', 'sapphire', 'lethe', '', 'Tairitsu(Axium)', 'Tairitsu(Grievous Lady)', 'stella', 'Hikari & Fisica', 'ilith', 'eto', 'luna', 'shirabe', 'Hikari(Zero)', 'Hikari(Fracture)', 'Hikari(Summer)', 'Tairitsu(Summer)', 'Tairitsu & Trin',
|
||||
'ayu', 'Eto & Luna', 'yume', 'Seine & Hikari', 'saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'haruna', 'nono', 'MTA-XXX', 'MDA-21', 'kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'sia', 'DORO*C', 'Tairitsu(Tempest)', 'brillante', 'Ilith(Summer)', 'etude', 'Alice & Tenniel', 'Luna & Mia', 'areus', 'seele', 'isabelle', 'mir', 'lagrange', 'linka', 'nami', 'Saya & Elizabeth', 'lily', 'kanae(midsummer)', 'alice&tenniel(minuet)', 'tairitsu(elegy)', 'marija']
|
||||
'ayu', 'Eto & Luna', 'yume', 'Seine & Hikari', 'saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'haruna', 'nono', 'MTA-XXX', 'MDA-21', 'kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'sia', 'DORO*C', 'Tairitsu(Tempest)', 'brillante', 'Ilith(Summer)', 'etude', 'Alice & Tenniel', 'Luna & Mia', 'areus', 'seele', 'isabelle', 'mir', 'lagrange', 'linka', 'nami', 'Saya & Elizabeth', 'lily', 'kanae(midsummer)', 'alice&tenniel(minuet)', 'tairitsu(elegy)', 'marija', 'vita']
|
||||
|
||||
skill_id = ['gauge_easy', '', '', '', 'note_mirror', '', '', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere',
|
||||
'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', '', 'note_mirror|visual_hide_far', 'frags_ongeki', 'gauge_areus', 'gauge_seele', 'gauge_isabelle', 'gauge_exhaustion', 'skill_lagrange', 'gauge_safe_10', 'frags_nami', 'skill_elizabeth', 'skill_lily', 'skill_kanae_midsummer', '', '', 'visual_ghost_skynotes']
|
||||
'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', '', 'note_mirror|visual_hide_far', 'frags_ongeki', 'gauge_areus', 'gauge_seele', 'gauge_isabelle', 'gauge_exhaustion', 'skill_lagrange', 'gauge_safe_10', 'frags_nami', 'skill_elizabeth', 'skill_lily', 'skill_kanae_midsummer', '', '', 'visual_ghost_skynotes', 'skill_vita']
|
||||
|
||||
skill_id_uncap = ['', '', 'frags_kou', '', 'visual_ink', '', '', '', '', '', '', 'eto_uncap', 'luna_uncap', 'shirabe_entry_fee',
|
||||
'', '', '', '', '', 'ayu_uncap', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
|
||||
'', '', '', '', '', 'ayu_uncap', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
|
||||
|
||||
skill_unlock_level = [0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 8, 0, 14, 0, 0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8]
|
||||
0, 0, 0, 8, 0, 14, 0, 0, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0]
|
||||
|
||||
frag1 = [55, 55, 60, 50, 47, 0, 47, 57, 41, 22, 50, 54, 60, 56, 78, 42, 41, 61, 52, 50, 52, 32,
|
||||
42, 55, 45, 58, 43, 0.5, 68, 50, 62, 45, 45, 52, 44, 27, 59, 0, 45, 50, 50, 47, 47, 61, 43, 42, 50, 25, 58, 50, 61, 45, 45, 38]
|
||||
42, 55, 45, 58, 43, 0.5, 68, 50, 62, 45, 45, 52, 44, 27, 59, 0, 45, 50, 50, 47, 47, 61, 43, 42, 50, 25, 58, 50, 61, 45, 45, 38, 33]
|
||||
|
||||
prog1 = [35, 55, 47, 50, 60, 0, 60, 70, 58, 45, 70, 45, 42, 46, 61, 67, 49, 44, 28, 45, 24, 46, 52,
|
||||
59, 62, 33, 58, 25, 63, 69, 50, 45, 45, 51, 34, 70, 62, 70, 45, 32, 32, 61, 47, 47, 37, 42, 50, 50, 45, 41, 61, 45, 45, 58]
|
||||
59, 62, 33, 58, 25, 63, 69, 50, 45, 45, 51, 34, 70, 62, 70, 45, 32, 32, 61, 47, 47, 37, 42, 50, 50, 45, 41, 61, 45, 45, 58, 50]
|
||||
|
||||
overdrive1 = [35, 55, 25, 50, 47, 0, 72, 57, 41, 7, 10, 32, 65, 31, 61, 53, 31, 47, 38, 12, 39, 18,
|
||||
48, 65, 45, 55, 44, 25, 46, 44, 33, 45, 45, 37, 25, 27, 50, 20, 45, 63, 21, 47, 61, 47, 65, 80, 50, 30, 49, 15, 34, 45, 45, 38]
|
||||
48, 65, 45, 55, 44, 25, 46, 44, 33, 45, 45, 37, 25, 27, 50, 20, 45, 63, 21, 47, 61, 47, 65, 80, 50, 30, 49, 15, 34, 45, 45, 38, 65]
|
||||
|
||||
frag20 = [78, 80, 90, 75, 70, 0, 70, 79, 65, 40, 50, 80, 90, 82, 0, 61, 67, 92, 85, 50, 86, 52,
|
||||
65, 85, 67, 88, 64, 0.5, 95, 70, 95, 50, 80, 87, 71, 50, 85, 0, 80, 75, 50, 70, 70, 90, 65, 80, 100, 50, 68, 60, 90, 67, 50, 60]
|
||||
65, 85, 67, 88, 64, 0.5, 95, 70, 95, 50, 80, 87, 71, 50, 85, 0, 80, 75, 50, 70, 70, 90, 65, 80, 100, 50, 68, 60, 90, 67, 50, 60, 51]
|
||||
|
||||
prog20 = [61, 80, 70, 75, 90, 0, 90, 102, 84, 78, 105, 67, 63, 68, 0, 99, 80, 66, 46, 83, 40, 73,
|
||||
80, 90, 93, 50, 86, 78, 89, 98, 75, 80, 50, 64, 55, 100, 90, 110, 80, 50, 74, 90, 70, 70, 56, 80, 100, 55, 65, 59, 90, 50, 90, 90]
|
||||
80, 90, 93, 50, 86, 78, 89, 98, 75, 80, 50, 64, 55, 100, 90, 110, 80, 50, 74, 90, 70, 70, 56, 80, 100, 55, 65, 59, 90, 50, 90, 90, 75]
|
||||
|
||||
overdrive20 = [61, 80, 47, 75, 70, 0, 95, 79, 65, 31, 50, 59, 90, 58, 0, 78, 50, 70, 62, 49, 64,
|
||||
46, 73, 95, 67, 84, 70, 78, 69, 70, 50, 80, 80, 63, 25, 50, 72, 55, 50, 95, 55, 70, 90, 70, 99, 80, 100, 40, 69, 62, 51, 90, 67, 60]
|
||||
46, 73, 95, 67, 84, 70, 78, 69, 70, 50, 80, 80, 63, 25, 50, 72, 55, 50, 95, 55, 70, 90, 70, 99, 80, 100, 40, 69, 62, 51, 90, 67, 60, 100]
|
||||
|
||||
frag30 = [88, 90, 100, 75, 80, 0, 70, 79, 65, 40, 50, 90, 100, 92, 0, 61, 67, 92, 85, 50, 86, 62,
|
||||
65, 85, 67, 88, 74, 0.5, 105, 80, 95, 50, 80, 87, 71, 50, 95, 0, 80, 75, 50, 70, 80, 100, 65, 80, 100, 50, 68, 60, 90, 67, 50, 60]
|
||||
65, 85, 67, 88, 74, 0.5, 105, 80, 95, 50, 80, 87, 71, 50, 95, 0, 80, 75, 50, 70, 80, 100, 65, 80, 100, 50, 68, 60, 90, 67, 50, 60, 51]
|
||||
|
||||
prog30 = [71, 90, 80, 75, 100, 0, 90, 102, 84, 78, 105, 77, 73, 78, 0, 99, 80, 66, 46, 93, 40, 83,
|
||||
80, 90, 93, 50, 96, 88, 99, 108, 75, 80, 50, 64, 55, 100, 100, 110, 80, 50, 74, 90, 80, 80, 56, 80, 100, 55, 65, 59, 90, 50, 90, 90]
|
||||
80, 90, 93, 50, 96, 88, 99, 108, 75, 80, 50, 64, 55, 100, 100, 110, 80, 50, 74, 90, 80, 80, 56, 80, 100, 55, 65, 59, 90, 50, 90, 90, 75]
|
||||
|
||||
overdrive30 = [71, 90, 57, 75, 80, 0, 95, 79, 65, 31, 50, 69, 100, 68, 0, 78, 50, 70, 62, 59, 64,
|
||||
56, 73, 95, 67, 84, 80, 88, 79, 80, 50, 80, 80, 63, 25, 50, 82, 55, 50, 95, 55, 70, 100, 80, 99, 80, 100, 40, 69, 62, 51, 90, 67, 60]
|
||||
56, 73, 95, 67, 84, 80, 88, 79, 80, 50, 80, 80, 63, 25, 50, 82, 55, 50, 95, 55, 70, 100, 80, 99, 80, 100, 40, 69, 62, 51, 90, 67, 60, 100]
|
||||
|
||||
char_type = [1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 2, 0, 0, 0, 2, 3, 1, 0, 0, 0, 1,
|
||||
0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]
|
||||
|
||||
char_core = {
|
||||
0: [{'core_id': 'core_hollow', 'amount': 25}, {'core_id': 'core_desolate', 'amount': 5}],
|
||||
@@ -359,7 +359,7 @@ def main(path='./'):
|
||||
19: [{'core_id': 'core_colorful', 'amount': 30}]
|
||||
}
|
||||
|
||||
for i in range(0, 54):
|
||||
for i in range(0, 55):
|
||||
skill_requires_uncap = 1 if i == 2 else 0
|
||||
|
||||
if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36, 21, 42, 43, 11, 12, 19]:
|
||||
@@ -386,12 +386,12 @@ def main(path='./'):
|
||||
c.execute('''insert into item values(?,"core",1,'')''', (i,))
|
||||
|
||||
world_songs = ["babaroque", "shadesoflight", "kanagawa", "lucifer", "anokumene", "ignotus", "rabbitintheblackroom", "qualia", "redandblue", "bookmaker", "darakunosono", "espebranch", "blacklotus", "givemeanightmare", "vividtheory", "onefr", "gekka", "vexaria3", "infinityheaven3", "fairytale3", "goodtek3", "suomi", "rugie", "faintlight", "harutopia", "goodtek", "dreaminattraction", "syro", "diode", "freefall", "grimheart", "blaster",
|
||||
"cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3", "purpleverse", "moonheart3", "glow", "enchantedlove", "take", "lifeispiano", "vandalism", "nexttoyou3", "lostcivilization3", "turbocharger", "bookmaker3", "laqryma3", "kyogenkigo", "hivemind", "seclusion", "quonwacca3", "bluecomet", "energysynergymatrix", "gengaozo", "lastendconductor3", "antithese3", "qualia3", "kanagawa3", "heavensdoor3", "pragmatism3"]
|
||||
"cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3", "purpleverse", "moonheart3", "glow", "enchantedlove", "take", "lifeispiano", "vandalism", "nexttoyou3", "lostcivilization3", "turbocharger", "bookmaker3", "laqryma3", "kyogenkigo", "hivemind", "seclusion", "quonwacca3", "bluecomet", "energysynergymatrix", "gengaozo", "lastendconductor3", "antithese3", "qualia3", "kanagawa3", "heavensdoor3", "pragmatism3", "nulctrl", "avril"]
|
||||
for i in world_songs:
|
||||
c.execute('''insert into item values(?,"world_song",1,'')''', (i,))
|
||||
|
||||
world_unlocks = ["scenery_chap1", "scenery_chap2",
|
||||
"scenery_chap3", "scenery_chap4", "scenery_chap5"]
|
||||
"scenery_chap3", "scenery_chap4", "scenery_chap5", "scenery_chap6"]
|
||||
for i in world_unlocks:
|
||||
c.execute('''insert into item values(?,"world_unlock",1,'')''', (i,))
|
||||
|
||||
|
||||
@@ -1054,5 +1054,77 @@
|
||||
],
|
||||
"orig_price": 100,
|
||||
"price": 100
|
||||
},
|
||||
{
|
||||
"name": "internetoverdose",
|
||||
"items": [
|
||||
{
|
||||
"type": "single",
|
||||
"id": "internetoverdose",
|
||||
"is_available": true
|
||||
},
|
||||
{
|
||||
"type": "core",
|
||||
"amount": 1,
|
||||
"id": "core_generic",
|
||||
"is_available": true
|
||||
}
|
||||
],
|
||||
"orig_price": 100,
|
||||
"price": 100
|
||||
},
|
||||
{
|
||||
"name": "macromod",
|
||||
"items": [
|
||||
{
|
||||
"type": "single",
|
||||
"id": "macromod",
|
||||
"is_available": true
|
||||
},
|
||||
{
|
||||
"type": "core",
|
||||
"amount": 1,
|
||||
"id": "core_generic",
|
||||
"is_available": true
|
||||
}
|
||||
],
|
||||
"orig_price": 100,
|
||||
"price": 100
|
||||
},
|
||||
{
|
||||
"name": "neowings",
|
||||
"items": [
|
||||
{
|
||||
"type": "single",
|
||||
"id": "neowings",
|
||||
"is_available": true
|
||||
},
|
||||
{
|
||||
"type": "core",
|
||||
"amount": 1,
|
||||
"id": "core_generic",
|
||||
"is_available": true
|
||||
}
|
||||
],
|
||||
"orig_price": 100,
|
||||
"price": 100
|
||||
},
|
||||
{
|
||||
"name": "kissinglucifer",
|
||||
"items": [
|
||||
{
|
||||
"type": "single",
|
||||
"id": "kissinglucifer",
|
||||
"is_available": true
|
||||
},
|
||||
{
|
||||
"type": "core",
|
||||
"amount": 1,
|
||||
"id": "core_generic",
|
||||
"is_available": true
|
||||
}
|
||||
],
|
||||
"orig_price": 100,
|
||||
"price": 100
|
||||
}
|
||||
]
|
||||
@@ -508,7 +508,7 @@ def arc_score_post(user_id, song_id, difficulty, score, shiny_perfect_count, per
|
||||
x = c.fetchone()
|
||||
if x:
|
||||
re = server.arcworld.world_update(
|
||||
c, user_id, song_id, difficulty, rating, clear_type, beyond_gauge, x[0], x[1], x[2])
|
||||
c, user_id, song_id, difficulty, rating, clear_type, beyond_gauge, health, x[0], x[1], x[2])
|
||||
re['global_rank'] = get_user_world_rank(c, user_id) # 更新世界排名
|
||||
re["user_rating"] = ptt
|
||||
else:
|
||||
|
||||
@@ -352,7 +352,7 @@ def climb_step(user_id, map_id, step, prev_capture, prev_position):
|
||||
return rewards, steps, curr_position, curr_capture, info
|
||||
|
||||
|
||||
def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gauge, stamina_multiply=1, fragment_multiply=100, prog_boost_multiply=0):
|
||||
def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gauge, health, stamina_multiply=1, fragment_multiply=100, prog_boost_multiply=0):
|
||||
# 成绩上传后世界模式更新,返回字典
|
||||
|
||||
step_times = stamina_multiply * fragment_multiply / \
|
||||
@@ -373,6 +373,11 @@ def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gau
|
||||
is_skill_sealed = x[3] if x and x[3] is not None else 1
|
||||
skill = False
|
||||
skill_uncap = False
|
||||
level = 1
|
||||
exp = 0
|
||||
frag = 50
|
||||
prog = 50
|
||||
overdrive = 50
|
||||
if not is_skill_sealed:
|
||||
if x:
|
||||
skill = True
|
||||
@@ -381,55 +386,76 @@ def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gau
|
||||
if x[5] is not None and x[5] == 1:
|
||||
skill_uncap = False
|
||||
|
||||
c.execute('''select frag1,prog1,overdrive1,frag20,prog20,overdrive20,frag30,prog30,overdrive30,skill_id,skill_id_uncap from character where character_id=?''', (character_id,))
|
||||
x = c.fetchone()
|
||||
c.execute('''select frag1,prog1,overdrive1,frag20,prog20,overdrive20,frag30,prog30,overdrive30,skill_id,skill_id_uncap from character where character_id=?''', (character_id,))
|
||||
x = c.fetchone()
|
||||
|
||||
if Config.CHARACTER_FULL_UNLOCK:
|
||||
c.execute('''select level, exp from user_char_full where user_id = :a and character_id = :b''', {
|
||||
'a': user_id, 'b': character_id})
|
||||
else:
|
||||
c.execute('''select level, exp from user_char where user_id = :a and character_id = :b''', {
|
||||
'a': user_id, 'b': character_id})
|
||||
y = c.fetchone()
|
||||
if y:
|
||||
level = y[0]
|
||||
exp = y[1]
|
||||
else:
|
||||
level = 1
|
||||
exp = 0
|
||||
|
||||
if x:
|
||||
flag = server.character.calc_char_value(level, x[0], x[3], x[6])
|
||||
prog = server.character.calc_char_value(level, x[1], x[4], x[7])
|
||||
overdrive = server.character.calc_char_value(level, x[2], x[5], x[8])
|
||||
if x[9] is not None and x[9] != '' and skill:
|
||||
skill = x[9]
|
||||
if Config.CHARACTER_FULL_UNLOCK:
|
||||
c.execute('''select level, exp from user_char_full where user_id = :a and character_id = :b''', {
|
||||
'a': user_id, 'b': character_id})
|
||||
else:
|
||||
c.execute('''select level, exp from user_char where user_id = :a and character_id = :b''', {
|
||||
'a': user_id, 'b': character_id})
|
||||
y = c.fetchone()
|
||||
if y:
|
||||
level = y[0]
|
||||
exp = y[1]
|
||||
else:
|
||||
level = 1
|
||||
exp = 0
|
||||
|
||||
if x:
|
||||
frag = server.character.calc_char_value(level, x[0], x[3], x[6])
|
||||
prog = server.character.calc_char_value(level, x[1], x[4], x[7])
|
||||
overdrive = server.character.calc_char_value(
|
||||
level, x[2], x[5], x[8])
|
||||
if x[9] is not None and x[9] != '' and skill:
|
||||
skill = x[9]
|
||||
else:
|
||||
skill = None
|
||||
if x[10] is not None and x[9] != '' and skill_uncap:
|
||||
skill_uncap = x[10]
|
||||
else:
|
||||
skill_uncap = None
|
||||
else:
|
||||
frag = 0
|
||||
prog = 0
|
||||
overdrive = 0
|
||||
skill = None
|
||||
if x[10] is not None and x[9] != '' and skill_uncap:
|
||||
skill_uncap = x[10]
|
||||
else:
|
||||
skill_uncap = None
|
||||
else:
|
||||
flag = 0
|
||||
prog = 0
|
||||
overdrive = 0
|
||||
skill = None
|
||||
skill_uncap = None
|
||||
|
||||
skill_special = ''
|
||||
if skill_uncap is not None and skill_uncap and skill_uncap in ['eto_uncap', 'luna_uncap', 'ayu_uncap', 'skill_vita']:
|
||||
skill_special = skill_uncap
|
||||
elif skill is not None and skill and skill in ['eto_uncap', 'luna_uncap', 'ayu_uncap', 'skill_vita']:
|
||||
skill_special = skill
|
||||
|
||||
c.execute('''select current_map from user where user_id = :a''', {
|
||||
'a': user_id})
|
||||
map_id = c.fetchone()[0]
|
||||
|
||||
if beyond_gauge == 0: # 是否是beyond挑战
|
||||
prog_tempest = 0
|
||||
if not is_skill_sealed and character_id == 35:
|
||||
# 风暴对立
|
||||
if Config.CHARACTER_FULL_UNLOCK:
|
||||
prog_tempest = 60
|
||||
else:
|
||||
c.execute(
|
||||
'''select sum(level) from user_char where user_id=?''', (user_id,))
|
||||
prog_tempest = int(x[0]) / 10 if x else 0
|
||||
if prog_tempest > 60:
|
||||
prog_tempest = 60
|
||||
elif prog_tempest < 0:
|
||||
prog_tempest = 0
|
||||
|
||||
base_step = 2.5 + 2.45*rating**0.5
|
||||
step = base_step * (prog/50) * step_times
|
||||
step = base_step * (prog + prog_tempest) / 50 * step_times
|
||||
else:
|
||||
info = get_world_info(map_id)
|
||||
if clear_type == 0:
|
||||
base_step = 8/9 + (rating/1.3)**0.5
|
||||
base_step = 25/28 + (rating)**0.5 * 0.43
|
||||
else:
|
||||
base_step = 8/3 + (rating/1.3)**0.5
|
||||
base_step = 75/28 + (rating)**0.5 * 0.43
|
||||
|
||||
if character_id in info['character_affinity']:
|
||||
affinity_multiplier = info['affinity_multiplier'][info['character_affinity'].index(
|
||||
@@ -437,7 +463,17 @@ def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gau
|
||||
else:
|
||||
affinity_multiplier = 1
|
||||
|
||||
step = base_step * (prog/50) * step_times * affinity_multiplier
|
||||
if skill_special == 'skill_vita':
|
||||
# vita技能,overdrive随回忆率提升,提升量最多为10
|
||||
# 此处采用线性函数
|
||||
overdrive_extra = 0
|
||||
if 0 < health <= 100:
|
||||
overdrive_extra = health / 10
|
||||
|
||||
overdrive += overdrive_extra
|
||||
|
||||
step = base_step * overdrive / 50 * \
|
||||
step_times * affinity_multiplier
|
||||
|
||||
c.execute('''select * from user_world where user_id = :a and map_id =:b''',
|
||||
{'a': user_id, 'b': map_id})
|
||||
@@ -447,13 +483,9 @@ def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gau
|
||||
|
||||
rewards, steps, curr_position, curr_capture, info = climb_step(
|
||||
user_id, map_id, step, y[3], y[2])
|
||||
# Eto和Luna的技能
|
||||
|
||||
# Eto、Luna、Ayu的技能
|
||||
character_bonus_progress = None
|
||||
skill_special = ''
|
||||
if skill_uncap is not None and skill_uncap and skill_uncap in ['eto_uncap', 'luna_uncap', 'ayu_uncap']:
|
||||
skill_special = skill_uncap
|
||||
elif skill is not None and skill and skill in ['eto_uncap', 'luna_uncap', 'ayu_uncap']:
|
||||
skill_special = skill
|
||||
if skill_special == 'eto_uncap':
|
||||
# eto觉醒技能,获得残片奖励时世界模式进度加7
|
||||
fragment_flag = False
|
||||
@@ -513,60 +545,40 @@ def world_update(c, user_id, song_id, difficulty, rating, clear_type, beyond_gau
|
||||
else:
|
||||
exp = Constant.LEVEL_STEPS[level]
|
||||
|
||||
re = {
|
||||
"rewards": rewards,
|
||||
"exp": exp,
|
||||
"level": level,
|
||||
"base_progress": base_step,
|
||||
"progress": step,
|
||||
"user_map": {
|
||||
"user_id": user_id,
|
||||
"curr_position": curr_position,
|
||||
"curr_capture": curr_capture,
|
||||
"is_locked": int2b(y[4]),
|
||||
"map_id": map_id,
|
||||
"prev_capture": y[3],
|
||||
"prev_position": y[2],
|
||||
"beyond_health": info['beyond_health']
|
||||
},
|
||||
"char_stats": {
|
||||
"character_id": character_id,
|
||||
"frag": frag,
|
||||
"prog": prog,
|
||||
"overdrive": overdrive
|
||||
},
|
||||
"current_stamina": calc_stamina(max_stamina_ts, stamina),
|
||||
"max_stamina_ts": max_stamina_ts
|
||||
}
|
||||
|
||||
if beyond_gauge == 0:
|
||||
re = {
|
||||
"rewards": rewards,
|
||||
"exp": exp,
|
||||
"level": level,
|
||||
"base_progress": base_step,
|
||||
"progress": step,
|
||||
"user_map": {
|
||||
"user_id": user_id,
|
||||
"curr_position": curr_position,
|
||||
"curr_capture": curr_capture,
|
||||
"is_locked": int2b(y[4]),
|
||||
"map_id": map_id,
|
||||
"prev_capture": y[3],
|
||||
"prev_position": y[2],
|
||||
"beyond_health": info['beyond_health'],
|
||||
"steps": steps
|
||||
},
|
||||
"char_stats": {
|
||||
"character_id": character_id,
|
||||
"frag": flag,
|
||||
"prog": prog,
|
||||
"overdrive": overdrive
|
||||
},
|
||||
"current_stamina": calc_stamina(max_stamina_ts, stamina),
|
||||
"max_stamina_ts": max_stamina_ts
|
||||
}
|
||||
re["user_map"]["steps"] = steps
|
||||
else:
|
||||
re = {
|
||||
"rewards": rewards,
|
||||
"exp": exp,
|
||||
"level": level,
|
||||
"base_progress": base_step,
|
||||
"progress": step,
|
||||
"user_map": {
|
||||
"user_id": user_id,
|
||||
"curr_position": curr_position,
|
||||
"curr_capture": curr_capture,
|
||||
"is_locked": int2b(y[4]),
|
||||
"map_id": map_id,
|
||||
"prev_capture": y[3],
|
||||
"prev_position": y[2],
|
||||
"beyond_health": info['beyond_health'],
|
||||
"step_count": len(steps)
|
||||
},
|
||||
"char_stats": {
|
||||
"character_id": character_id,
|
||||
"frag": flag,
|
||||
"prog": prog,
|
||||
"overdrive": overdrive
|
||||
},
|
||||
"current_stamina": calc_stamina(max_stamina_ts, stamina),
|
||||
"max_stamina_ts": max_stamina_ts
|
||||
}
|
||||
re["user_map"]["steps"] = len(steps)
|
||||
|
||||
if character_id == 35 and not is_skill_sealed:
|
||||
re['char_stats']['prog_tempest'] = prog_tempest
|
||||
re['char_stats']['prog'] += prog_tempest
|
||||
|
||||
if character_bonus_progress is not None:
|
||||
re['character_bonus_progress'] = character_bonus_progress
|
||||
|
||||
@@ -433,7 +433,23 @@ class Constant:
|
||||
"mi": 3,
|
||||
"c": True,
|
||||
"r": True
|
||||
}, {
|
||||
"ma": 12,
|
||||
"mi": 1,
|
||||
"c": True,
|
||||
"r": True
|
||||
}, {
|
||||
"ma": 12,
|
||||
"mi": 2,
|
||||
"c": True,
|
||||
"r": True
|
||||
}, {
|
||||
"ma": 12,
|
||||
"mi": 3,
|
||||
"c": True,
|
||||
"r": True
|
||||
}]
|
||||
|
||||
unlocklist_data = [{
|
||||
"unlock_key": "worldvanquisher|1|0",
|
||||
"complete": 1
|
||||
@@ -476,6 +492,9 @@ class Constant:
|
||||
}, {
|
||||
"unlock_key": "snowwhite|2|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "snowwhite|1|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "senkyou|1|0",
|
||||
"complete": 1
|
||||
@@ -650,6 +669,9 @@ class Constant:
|
||||
}, {
|
||||
"unlock_key": "lucifer|1|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "nulctrl|2|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "lostdesire|2|0",
|
||||
"complete": 1
|
||||
@@ -872,6 +894,9 @@ class Constant:
|
||||
}, {
|
||||
"unlock_key": "equilibrium_challenge|1|102",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "nulctrl|1|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "aterlbus|2|0",
|
||||
"complete": 1
|
||||
@@ -1052,9 +1077,6 @@ class Constant:
|
||||
}, {
|
||||
"unlock_key": "grievouslady|0|101",
|
||||
"complete": 100
|
||||
}, {
|
||||
"unlock_key": "snowwhite|1|0",
|
||||
"complete": 1
|
||||
}, {
|
||||
"unlock_key": "partyvinyl|1|0",
|
||||
"complete": 1
|
||||
|
||||
@@ -19,7 +19,7 @@ class Config():
|
||||
游戏API地址前缀
|
||||
Game API's URL prefix
|
||||
'''
|
||||
GAME_API_PREFIX = '/merikuri/17'
|
||||
GAME_API_PREFIX = '/bridge/18'
|
||||
'''
|
||||
--------------------
|
||||
'''
|
||||
@@ -30,7 +30,7 @@ class Config():
|
||||
Allowed game versions
|
||||
If it is blank, all are allowed.
|
||||
'''
|
||||
ALLOW_APPVERSION = ['3.5.3', '3.5.3c', '3.11.2', '3.11.2c']
|
||||
ALLOW_APPVERSION = ['3.5.3', '3.5.3c', '3.12.0', '3.12.0c']
|
||||
'''
|
||||
--------------------
|
||||
'''
|
||||
@@ -236,7 +236,7 @@ class Config():
|
||||
'''
|
||||
--------------------
|
||||
是否全解锁世界场景
|
||||
If unlocking all world scenerys is enabled
|
||||
If unlocking all world sceneries is enabled
|
||||
'''
|
||||
WORLD_SCENERY_FULL_UNLOCK = True
|
||||
'''
|
||||
|
||||
@@ -418,7 +418,7 @@ def all_character():
|
||||
def change_character():
|
||||
# 修改角色数据
|
||||
skill_ids = ['No_skill', 'gauge_easy', 'note_mirror', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere',
|
||||
'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume', 'note_mirror|visual_hide_far', 'frags_ongeki', 'gauge_areus', 'gauge_seele', 'gauge_isabelle', 'gauge_exhaustion', 'skill_lagrange', 'gauge_safe_10', 'frags_nami', 'skill_elizabeth', 'skill_lily', 'skill_kanae_midsummer', 'eto_uncap', 'luna_uncap', 'frags_preferred_song', 'visual_ghost_skynotes', 'ayu_uncap']
|
||||
'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume', 'note_mirror|visual_hide_far', 'frags_ongeki', 'gauge_areus', 'gauge_seele', 'gauge_isabelle', 'gauge_exhaustion', 'skill_lagrange', 'gauge_safe_10', 'frags_nami', 'skill_elizabeth', 'skill_lily', 'skill_kanae_midsummer', 'eto_uncap', 'luna_uncap', 'frags_preferred_song', 'visual_ghost_skynotes', 'ayu_uncap', 'skill_vita']
|
||||
return render_template('web/changechar.html', skill_ids=skill_ids)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user