feat: Implement stigmata standard reroll

This commit is contained in:
Naruse
2024-11-18 13:06:18 +08:00
parent 7ab78d6c47
commit c9870f5d66
7 changed files with 181 additions and 8 deletions

View File

@@ -14,6 +14,16 @@ class Weapon:
is_extracted : bool
equip_avatar_id: int
@dataclasses.dataclass
class RuneList:
rune_id : int
strength_percent : int
@dataclasses.dataclass
class RuneGroup:
unique_id : int
rune_list : list[RuneList]
@dataclasses.dataclass
class Stigmata:
item_id : int
@@ -24,6 +34,8 @@ class Stigmata:
promote_times : int
is_locked : bool
equip_avatar_id : int
rune_list : list[RuneList] = dataclasses.field(default_factory=list)
wait_select_rune_group_list: list[RuneGroup] = dataclasses.field(default_factory=list)
@dataclasses.dataclass
class InventoryManager:

View File

@@ -1,7 +1,7 @@
import dataclasses
from database import mongo
from game_server.game.avatar.avatar_manager import AvatarManager,Skill,AvatarSubSkill,AvatarTeamManager
from game_server.game.inventory.inventory_manager import InventoryManager,Material,Weapon,Stigmata
from game_server.game.inventory.inventory_manager import InventoryManager,Material,Weapon,Stigmata,RuneList,RuneGroup
from game_server.game.elf.elf_manager import ElfManager,ElfSkill
from game_server.game.enum.item_type import MainType
@@ -107,7 +107,14 @@ class Player:
refine_value=item['RefineValue'],
promote_times=item['PromoteTimes'],
is_locked=item['IsLocked'],
equip_avatar_id=item['EquipAvatarID']
equip_avatar_id=item['EquipAvatarID'],
rune_list=[
RuneList(
rune_id=rune['RuneId'],
strength_percent=rune['strengthPercent']
)
for rune in item['RuneLists']
]
)
self.inventory.stigmata_items[item['UniqueID']] = stigmata

View File

@@ -1,15 +1,14 @@
import betterproto
from typing import List
from game_server.net.session import Session
from game_server.resource import ResourceManager
from game_server.resource.configdb.weapon_data import WeaponData
from game_server.resource.configdb.stigmata_data import StigmataData
from lib.proto import (
GetEquipmentDataReq,
GetEquipmentDataRsp,
Material,
Weapon,
Stigmata,
StigmataRuneGroup,
StigmataRune
)
async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Message:
@@ -23,7 +22,8 @@ async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Mess
level=weapon.level,
exp=weapon.exp,
is_protected=weapon.is_locked,
is_extracted=weapon.is_extracted
is_extracted=weapon.is_extracted,
homology_level=3
)
for id, weapon in session.player.inventory.weapon_items.items()
],
@@ -33,10 +33,30 @@ async def handle(session: Session, msg: GetEquipmentDataReq) -> betterproto.Mess
id=stigmata.item_id,
level=stigmata.level,
exp=stigmata.exp,
slot_num=stigmata.slot_num,
slot_num=2,
refine_value=stigmata.refine_value,
promote_times=stigmata.promote_times,
is_protected=stigmata.is_locked
is_protected=stigmata.is_locked,
rune_list=[
StigmataRune(
rune_id=rune.rune_id,
strength_percent=rune.strength_percent
)
for rune in stigmata.rune_list
],
wait_select_rune_group_list=[
StigmataRuneGroup(
unique_id=index,
rune_list=[
StigmataRune(
rune_id=rune.rune_id,
strength_percent=rune.strength_percent
)
for rune in affix.rune_list
]
)
for index,affix in enumerate(stigmata.wait_select_rune_group_list, start=1)
]
)
for id, stigmata in session.player.inventory.stigmata_items.items()
],

View File

@@ -0,0 +1,74 @@
import betterproto
import random
from game_server.net.session import Session
from game_server.resource import ResourceManager
from game_server.resource.configdb.affix_list import AffixListData
from game_server.game.inventory.inventory_manager import RuneList,RuneGroup
from lib.proto import (
RefineStigmataRuneReq,
RefineStigmataRuneRsp,
StigmataRuneGroup,
StigmataRune,
StigmataRefineTimesType,
GetEquipmentDataReq
)
def generate_affix_and_percentage(affix_ids):
affix_id1, affix_id2 = random.choice(affix_ids), random.choice(affix_ids)
percentage1, percentage2 = [
random.randint(*r) for r in random.choices(
[(20, 50), (50, 70), (80, 100)], weights=[50, 40, 10], k=2
)
]
return {"affix1": affix_id1, "percentage1": percentage1, "affix2": affix_id2, "percentage2": percentage2}
async def handle(session: Session, msg: RefineStigmataRuneReq) -> betterproto.Message:
stigmata_data = session.player.inventory.stigmata_items.get(msg.unique_id)
affix_ids = [affix.affixID for affix in ResourceManager.instance().values(AffixListData)]
result = []
if msg.times_type == StigmataRefineTimesType.STIGMATA_REFINE_TIMES_TEN.value:
result = [generate_affix_and_percentage(affix_ids) for _ in range(10)]
else:
result.append(generate_affix_and_percentage(affix_ids))
stigmata_data.wait_select_rune_group_list = []
stigmata_data.wait_select_rune_group_list.extend(
[
RuneGroup(
unique_id=index,
rune_list=[
RuneList(
rune_id=affix['affix1'],
strength_percent=affix['percentage1']
),
RuneList(
rune_id=affix['affix2'],
strength_percent=affix['percentage2']
)
]
)
for index, affix in enumerate(result, start=1)
]
)
await session.process_packet(session.create_packet(GetEquipmentDataReq()))
return RefineStigmataRuneRsp(
retcode=0,
rune_group_list=[
StigmataRuneGroup(
unique_id=index,
rune_list=[
StigmataRune(
rune_id=affix['affix1'],
strength_percent=affix['percentage1']
),
StigmataRune(
rune_id=affix['affix2'],
strength_percent=affix['percentage2']
),
]
)
for index, affix in enumerate(result, start=1)
],
times_type=10 if msg.times_type > 0 else 1
)

View File

@@ -0,0 +1,38 @@
import betterproto
from game_server.net.session import Session
from game_server.game.inventory.inventory_manager import RuneList
from game_server.game.enum.data_type import DataType
from database import mongo
from lib.proto import (
SelectNewStigmataRuneReq,
SelectNewStigmataRuneRsp,
GetEquipmentDataReq
)
async def handle(session: Session, msg: SelectNewStigmataRuneReq) -> betterproto.Message:
stigmata_data = session.player.inventory.stigmata_items.get(msg.unique_id)
if msg.select_unique_id > 0 and msg.is_select:
affix_data = [affix for affix in stigmata_data.wait_select_rune_group_list if msg.select_unique_id == affix.unique_id][0]
stigmata_data.rune_list = []
stigmata_data.rune_list.extend(
[
RuneList(
rune_id=rune.rune_id,
strength_percent=rune.strength_percent
)
for rune in affix_data.rune_list
]
)
mongo.save(session,DataType.STIGMATA,[msg.unique_id])
stigmata_data.wait_select_rune_group_list = []
await session.process_packet(session.create_packet(GetEquipmentDataReq()))
return SelectNewStigmataRuneRsp(
retcode=0,
select_unique_id=msg.select_unique_id,
is_select=msg.is_select
)

View File

@@ -0,0 +1,15 @@
from dataclasses import dataclass
from game_server.resource.base_resource import BaseResource
from game_server.resource.decorators import GameResource
@dataclass
@GameResource("resources/ExcelOutputAsset/AffixList.json")
class AffixListData(BaseResource):
affixID: int
level: int
def on_load(self) -> bool:
return self.level == 3
def get_index(self) -> str:
return str(self.affixID)