mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2025-12-14 08:06:23 +08:00
- Add support for missions - PTT mechanism: Change first play protection to new best protection - Adapt to the new difficulty ETR - Uncap DORO*C - Incomplete support for "pick_ticket" - Fix requirements: cryptography >= 35.0.0 Note: This is an intermediate test version, only for Arcaea 5.4.0c. Next version will adapt to 5.4.0.
241 lines
5.6 KiB
Python
241 lines
5.6 KiB
Python
from .item import Fragment, ItemCore, ItemStamina, PickTicket, WorldSong
|
|
|
|
|
|
class Mission:
|
|
mission_id: str = None
|
|
items: list = []
|
|
|
|
def __init__(self, c=None):
|
|
self.c = c
|
|
self.user = None
|
|
self._status: int = None
|
|
|
|
if self.c is not None:
|
|
for i in self.items:
|
|
i.c = self.c
|
|
|
|
def to_dict(self, has_items=False) -> dict:
|
|
r = {
|
|
'mission_id': self.mission_id,
|
|
'status': self.status,
|
|
}
|
|
if has_items:
|
|
r['items'] = [x.to_dict() for x in self.items]
|
|
return r
|
|
|
|
@property
|
|
def status(self) -> str:
|
|
if self._status == 1:
|
|
return 'inprogress'
|
|
elif self._status == 2:
|
|
return 'cleared'
|
|
elif self._status == 3:
|
|
return 'prevclaimedfragmission'
|
|
elif self._status == 4:
|
|
return 'claimed'
|
|
|
|
return 'locked'
|
|
|
|
def user_claim_mission(self, user):
|
|
# param: user - User 类或子类的实例
|
|
if user is not None:
|
|
self.user = user
|
|
|
|
self.c.execute('''insert or replace into user_mission (user_id, mission_id, status) values (?, ?, 4)''',
|
|
(self.user.user_id, self.mission_id))
|
|
for i in self.items:
|
|
i.user_claim_item(self.user)
|
|
self._status = 4
|
|
|
|
def user_clear_mission(self, user):
|
|
# param: user - User 类或子类的实例
|
|
if user is not None:
|
|
self.user = user
|
|
|
|
self.c.execute('''insert or replace into user_mission (user_id, mission_id, status) values (?, ?, 2)''',
|
|
(self.user.user_id, self.mission_id))
|
|
self._status = 2
|
|
|
|
def select_user_mission(self, user):
|
|
# param: user - User 类或子类的实例
|
|
if user is not None:
|
|
self.user = user
|
|
|
|
self._status = 0
|
|
self.c.execute('''select status from user_mission where user_id=? and mission_id=?''',
|
|
(self.user.user_id, self.mission_id))
|
|
x = self.c.fetchone()
|
|
|
|
if x and x[0]:
|
|
self._status = x[0]
|
|
|
|
|
|
class M11(Mission):
|
|
mission_id = 'mission_1_1_tutorial'
|
|
items = [Fragment(amount=10)]
|
|
|
|
|
|
class M12(Mission):
|
|
mission_id = 'mission_1_2_clearsong'
|
|
items = [Fragment(amount=10)]
|
|
|
|
|
|
class M13(Mission):
|
|
mission_id = 'mission_1_3_settings'
|
|
items = [Fragment(amount=10)]
|
|
|
|
|
|
class M14(Mission):
|
|
mission_id = 'mission_1_4_allsongsview'
|
|
items = [Fragment(amount=10)]
|
|
|
|
|
|
class M15(Mission):
|
|
mission_id = 'mission_1_5_fragunlock'
|
|
items = [ItemCore(core_type='core_generic', amount=1)]
|
|
|
|
|
|
class M1E(Mission):
|
|
mission_id = 'mission_1_end'
|
|
items = [Fragment(amount=100)]
|
|
|
|
|
|
class M21(Mission):
|
|
mission_id = 'mission_2_1_account'
|
|
items = [Fragment(amount=20)]
|
|
|
|
|
|
class M22(Mission):
|
|
mission_id = 'mission_2_2_profile'
|
|
items = [Fragment(amount=20)]
|
|
|
|
|
|
class M23(Mission):
|
|
mission_id = 'mission_2_3_partner'
|
|
items = [Fragment(amount=20)]
|
|
|
|
|
|
class M24(Mission):
|
|
mission_id = 'mission_2_4_usestamina'
|
|
items = [ItemCore(core_type='core_generic', amount=1)]
|
|
|
|
|
|
class M25(Mission):
|
|
mission_id = 'mission_2_5_prologuestart'
|
|
items = [ItemCore(core_type='core_generic', amount=1)]
|
|
|
|
|
|
class M2E(Mission):
|
|
mission_id = 'mission_2_end'
|
|
items = [ItemCore(core_type='core_generic', amount=3)]
|
|
|
|
|
|
class M31(Mission):
|
|
mission_id = 'mission_3_1_prsclear'
|
|
items = [Fragment(amount=50)]
|
|
|
|
|
|
class M32(Mission):
|
|
mission_id = 'mission_3_2_etherdrop'
|
|
items = [ItemStamina(amount=2)]
|
|
|
|
|
|
class M33(Mission):
|
|
mission_id = 'mission_3_3_step50'
|
|
items = [Fragment(amount=50)]
|
|
|
|
|
|
class M34(Mission):
|
|
mission_id = 'mission_3_4_frag60'
|
|
items = [ItemStamina(amount=2)]
|
|
|
|
|
|
class M3E(Mission):
|
|
mission_id = 'mission_3_end'
|
|
items = [ItemStamina(amount=6)]
|
|
|
|
|
|
class M41(Mission):
|
|
mission_id = 'mission_4_1_exgrade'
|
|
items = [Fragment(amount=100)]
|
|
|
|
|
|
class M42(Mission):
|
|
mission_id = 'mission_4_2_potential350'
|
|
items = [ItemStamina(amount=2)]
|
|
|
|
|
|
class M43(Mission):
|
|
mission_id = 'mission_4_3_twomaps'
|
|
items = [Fragment(amount=100)]
|
|
|
|
|
|
class M44(Mission):
|
|
mission_id = 'mission_4_4_worldsongunlock'
|
|
items = [ItemCore(core_type='core_generic', amount=3)]
|
|
|
|
|
|
class M45(Mission):
|
|
mission_id = 'mission_4_5_prologuefinish'
|
|
items = [ItemStamina(amount=2)]
|
|
|
|
|
|
_innocence = WorldSong()
|
|
_innocence.amount = 1
|
|
_innocence.item_id = 'innocence'
|
|
|
|
|
|
class M4E(Mission):
|
|
mission_id = 'mission_4_end'
|
|
items = [_innocence]
|
|
|
|
|
|
class M51(Mission):
|
|
mission_id = 'mission_5_1_songgrouping'
|
|
items = [Fragment(amount=50)]
|
|
|
|
|
|
class M52(Mission):
|
|
mission_id = 'mission_5_2_partnerlv12'
|
|
items = [Fragment(amount=250)]
|
|
|
|
|
|
class M53(Mission):
|
|
mission_id = 'mission_5_3_cores'
|
|
items = [ItemCore(core_type='core_generic', amount=3)]
|
|
|
|
|
|
class M54(Mission):
|
|
mission_id = 'mission_5_4_courseclear'
|
|
items = [ItemCore(core_type='core_generic', amount=3)]
|
|
|
|
|
|
class M5E(Mission):
|
|
mission_id = 'mission_5_end'
|
|
items = [PickTicket()]
|
|
|
|
|
|
MISSION_DICT = {i.mission_id: i for i in Mission.__subclasses__()}
|
|
|
|
|
|
class UserMissionList:
|
|
def __init__(self, c=None, user=None):
|
|
self.c = c
|
|
self.user = user
|
|
|
|
self.missions: list = []
|
|
|
|
def select_all(self):
|
|
self.missions = []
|
|
self.c.execute('''select mission_id, status from user_mission where user_id=?''',
|
|
(self.user.user_id,))
|
|
for i in self.c.fetchall():
|
|
x = MISSION_DICT[i[0]]()
|
|
x._status = i[1]
|
|
self.missions.append(x)
|
|
|
|
return self
|
|
|
|
def to_dict_list(self) -> list:
|
|
return [i.to_dict() for i in self.missions]
|