mirror of
https://github.com/Lost-MSth/Arcaea-server.git
synced 2026-02-14 12:27:26 +08:00
[Enhance] Missions & ETR
- 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.
This commit is contained in:
240
latest version/core/mission.py
Normal file
240
latest version/core/mission.py
Normal file
@@ -0,0 +1,240 @@
|
||||
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]
|
||||
Reference in New Issue
Block a user