[Enhance] Support uncapped Kanae's skill

- Add support for `skill_kanae_uncap`
- For Arcaea 5.2.6
This commit is contained in:
Lost-MSth
2024-01-15 23:33:09 +08:00
parent 746712718b
commit 2edf559373
6 changed files with 83 additions and 44 deletions

View File

@@ -120,6 +120,18 @@ class Character(CollectionItemMixin):
self.uncap_cores: list = []
self.voice: list = None
@property
def frag_value(self) -> float:
return self.frag.get_value(self.level)
@property
def prog_value(self) -> float:
return self.prog.get_value(self.level)
@property
def overdrive_value(self) -> float:
return self.overdrive.get_value(self.level)
@property
def skill_id_displayed(self) -> str:
return None

View File

@@ -1,6 +1,6 @@
from .config_manager import Config
ARCAEA_SERVER_VERSION = 'v2.11.3.2.test'
ARCAEA_SERVER_VERSION = 'v2.11.3.2'
ARCAEA_LOG_DATBASE_VERSION = 'v1.1'

View File

@@ -308,6 +308,7 @@ class UserInfo(User):
self.max_stamina_notification_enabled = False
self.prog_boost: int = 0
self.beyond_boost_gauge: float = 0
self.kanae_stored_prog: float = 0
self.next_fragstam_ts: int = None
self.world_mode_locked_end_ts: int = None
self.current_map: 'Map' = None
@@ -501,6 +502,7 @@ class UserInfo(User):
"current_map": self.current_map.map_id,
"prog_boost": self.prog_boost,
"beyond_boost_gauge": self.beyond_boost_gauge,
"kanae_stored_prog": self.kanae_stored_prog,
"next_fragstam_ts": self.next_fragstam_ts,
"max_stamina_ts": self.stamina.max_stamina_ts,
"stamina": self.stamina.stamina,
@@ -559,6 +561,7 @@ class UserInfo(User):
self.stamina.set_value(x[32], x[33])
self.world_mode_locked_end_ts = x[34] if x[34] else -1
self.beyond_boost_gauge = x[35] if x[35] else 0
self.kanae_stored_prog = x[36] if x[36] else 0
return self
@@ -616,7 +619,7 @@ class UserInfo(User):
查询user表有关世界模式打歌的信息
'''
self.c.execute(
'''select character_id, max_stamina_ts, stamina, is_skill_sealed, is_char_uncapped, is_char_uncapped_override, current_map, world_mode_locked_end_ts, beyond_boost_gauge from user where user_id=?''', (self.user_id,))
'''select character_id, max_stamina_ts, stamina, is_skill_sealed, is_char_uncapped, is_char_uncapped_override, current_map, world_mode_locked_end_ts, beyond_boost_gauge, kanae_stored_prog from user where user_id=?''', (self.user_id,))
x = self.c.fetchone()
if not x:
raise NoData('No user.', 108, -3)
@@ -630,6 +633,7 @@ class UserInfo(User):
self.current_map = UserMap(self.c, x[6], self)
self.world_mode_locked_end_ts = x[7] if x[7] else -1
self.beyond_boost_gauge = x[8] if x[8] else 0
self.kanae_stored_prog = x[9] if x[9] else 0
@property
def global_rank(self) -> int:

View File

@@ -440,13 +440,14 @@ class UserStamina(Stamina):
class WorldSkillMixin:
def before_calculate(self) -> None:
factory_dict = {'skill_vita': self._skill_vita,
'skill_mika': self._skill_mika,
'skill_ilith_ivy': self._skill_ilith_ivy,
'ilith_awakened_skill': self._ilith_awakened_skill,
'skill_hikari_vanessa': self._skill_hikari_vanessa,
'skill_mithra': self._skill_mithra
}
factory_dict = {
'skill_vita': self._skill_vita,
'skill_mika': self._skill_mika,
'skill_ilith_ivy': self._skill_ilith_ivy,
'ilith_awakened_skill': self._ilith_awakened_skill,
'skill_hikari_vanessa': self._skill_hikari_vanessa,
'skill_mithra': self._skill_mithra
}
if self.user_play.beyond_gauge == 0 and self.character_used.character_id == 35 and self.character_used.skill_id_displayed:
self._special_tempest()
@@ -454,14 +455,15 @@ class WorldSkillMixin:
factory_dict[self.character_used.skill_id_displayed]()
def after_climb(self) -> None:
factory_dict = {'eto_uncap': self._eto_uncap,
'ayu_uncap': self._ayu_uncap,
'skill_fatalis': self._skill_fatalis,
'skill_amane': self._skill_amane,
'skill_maya': self._skill_maya,
'luna_uncap': self._luna_uncap,
'skill_kanae_uncap': self._skill_kanae_uncap
}
factory_dict = {
'eto_uncap': self._eto_uncap,
'ayu_uncap': self._ayu_uncap,
'skill_fatalis': self._skill_fatalis,
'skill_amane': self._skill_amane,
'skill_maya': self._skill_maya,
'luna_uncap': self._luna_uncap,
'skill_kanae_uncap': self._skill_kanae_uncap
}
if self.character_used.skill_id_displayed in factory_dict:
factory_dict[self.character_used.skill_id_displayed]()
@@ -597,8 +599,11 @@ class WorldSkillMixin:
def _skill_kanae_uncap(self) -> None:
'''
kanae 觉醒技能,保存世界模式 progress 并在下次结算
直接加减在 progress 最后
技能存储 base_progress * PROG / 50下一次消耗全部存储值无视技能和搭档但需要非技能隐藏状态
'''
pass
self.kanae_stored_progress = self.progress_normalized
self.user.current_map.reclimb(self.final_progress)
class BaseWorldPlay(WorldSkillMixin):
@@ -615,12 +620,8 @@ class BaseWorldPlay(WorldSkillMixin):
self.user_play = user_play
self.character_used = None
self.progress_normalized: float = None
self.character_bonus_progress_normalized: float = None
# kanae_stored_progress: float
# kanae_added_progress: float
# partner_multiply: float
# wpaid: str
def to_dict(self) -> dict:
@@ -651,10 +652,7 @@ class BaseWorldPlay(WorldSkillMixin):
"max_stamina_ts": self.user.stamina.max_stamina_ts,
'world_mode_locked_end_ts': self.user.world_mode_locked_end_ts,
'beyond_boost_gauge': self.user.beyond_boost_gauge,
# 'kanae_stored_progress': 7114000, # 往群愿里塞
# 'kanae_added_progress': 514000, # 群愿往外拿
# 'wpaid': 'helloworld', # world play id ???
# 'partner_multiply': 456, #
}
if self.character_used.skill_id_displayed == 'skill_maya':
@@ -691,11 +689,11 @@ class BaseWorldPlay(WorldSkillMixin):
raise NotImplementedError
@property
def final_progress(self) -> float:
def progress_normalized(self) -> float:
raise NotImplementedError
def get_step(self) -> None:
# to get self.progress_normalized
@property
def final_progress(self) -> float:
raise NotImplementedError
def update(self) -> None:
@@ -711,6 +709,9 @@ class BaseWorldPlay(WorldSkillMixin):
self.user.character.select_character_info()
if not self.user.is_skill_sealed:
self.character_used = self.user.character
if self.user_play.beyond_gauge == 0 and self.user.kanae_stored_prog > 0:
# 实在不想拆开了,在这里判断一下,注意这段不会在 BeyondWorldPlay 中执行
self.kanae_added_progress = self.user.kanae_stored_prog
else:
self.character_used.character_id = self.user.character.character_id
self.character_used.level.level = self.user.character.level.level
@@ -721,7 +722,6 @@ class BaseWorldPlay(WorldSkillMixin):
self.user.current_map.select_map_info()
self.before_calculate()
self.get_step()
self.user.current_map.climb(self.final_progress)
self.after_climb()
@@ -755,6 +755,10 @@ class WorldPlay(BaseWorldPlay):
self.prog_tempest: float = None
self.prog_skill_increase: float = None
self.kanae_added_progress: float = None # 群愿往外拿
self.kanae_stored_progress: float = None # 往群愿里塞
# self.user.kanae_stored_prog: float 群愿有的
def to_dict(self) -> dict:
r = super().to_dict()
@@ -773,6 +777,12 @@ class WorldPlay(BaseWorldPlay):
r['char_stats']['prog'] += self.prog_tempest # 没试过要不要这样
r['char_stats']['prog_tempest'] = self.prog_tempest
if self.kanae_added_progress is not None:
r['kanae_added_progress'] = self.kanae_added_progress
if self.kanae_stored_progress is not None:
r['kanae_stored_progress'] = self.kanae_stored_progress
r['partner_adjusted_prog'] = self.partner_adjusted_prog
r["user_map"]["steps"] = [x.to_dict()
@@ -793,7 +803,7 @@ class WorldPlay(BaseWorldPlay):
@property
def final_progress(self) -> float:
return (self.progress_normalized + (self.character_bonus_progress_normalized or 0)) * self.step_times
return (self.progress_normalized + (self.character_bonus_progress_normalized or 0)) * self.step_times + (self.kanae_added_progress or 0) - (self.kanae_stored_progress or 0)
@property
def partner_adjusted_prog(self) -> float:
@@ -805,9 +815,9 @@ class WorldPlay(BaseWorldPlay):
prog += self.prog_skill_increase
return prog
def get_step(self) -> None:
self.progress_normalized = self.base_progress * \
(self.partner_adjusted_prog / 50)
@property
def progress_normalized(self) -> float:
return self.base_progress * (self.partner_adjusted_prog / 50)
def update(self) -> None:
'''世界模式更新'''
@@ -819,6 +829,17 @@ class WorldPlay(BaseWorldPlay):
self.user.update_user_one_column(
'beyond_boost_gauge', self.user.beyond_boost_gauge)
# 更新kanae存储进度
if self.kanae_stored_progress is not None:
self.user.kanae_stored_prog = self.kanae_stored_progress
self.user.update_user_one_column(
'kanae_stored_prog', self.user.kanae_stored_prog)
return
if self.kanae_added_progress is None:
return
self.kanae_stored_progress = 0
self.user.update_user_one_column('kanae_stored_prog', 0)
class BeyondWorldPlay(BaseWorldPlay):
@@ -844,6 +865,14 @@ class BeyondWorldPlay(BaseWorldPlay):
def final_progress(self) -> float:
return self.progress_normalized * self.step_times
@property
def progress_normalized(self) -> float:
overdrive = self.character_used.overdrive_value
if self.over_skill_increase:
overdrive += self.over_skill_increase
return self.base_progress * (overdrive / 50) * self.affinity_multiplier
def to_dict(self) -> dict:
r = super().to_dict()
@@ -851,6 +880,8 @@ class BeyondWorldPlay(BaseWorldPlay):
r['pre_boost_progress'] = self.progress_normalized * \
self.user_play.fragment_multiply / 100
# r['partner_multiply'] = self.affinity_multiplier # ?
if self.over_skill_increase is not None:
r['char_stats']['over_skill_increase'] = self.over_skill_increase
@@ -870,12 +901,3 @@ class BeyondWorldPlay(BaseWorldPlay):
self.user.beyond_boost_gauge = 0
self.user.update_user_one_column(
'beyond_boost_gauge', self.user.beyond_boost_gauge)
def get_step(self) -> None:
overdrive = self.character_used.overdrive.get_value(
self.character_used.level)
if self.over_skill_increase:
overdrive += self.over_skill_increase
self.progress_normalized = self.base_progress * \
(overdrive / 50) * self.affinity_multiplier

View File

@@ -34,7 +34,8 @@ next_fragstam_ts int,
max_stamina_ts int,
stamina int,
world_mode_locked_end_ts int,
beyond_boost_gauge real default 0
beyond_boost_gauge real default 0,
kanae_stored_prog real default 0
);
create table if not exists login(access_token text,
user_id int,

View File

@@ -60,7 +60,7 @@ def finale_end():
return success_return({})
@bp.route('/applog/me', methods=['POST'])
@bp.route('/applog/me/log', methods=['POST'])
def applog_me():
# 异常日志,不处理
return success_return({})