Compare commits

..

5 commits

Author SHA1 Message Date
YYHEggEgg
5982523c98 command: player kick [uid] [reason] 2024-07-31 00:41:20 +08:00
YYHEggEgg
28a3c8d154 Gacha Model bugfix: post_configure on creating 2024-07-31 00:37:13 +08:00
YYHEggEgg
2041d8dd03 Gacha impl 2024-07-30 16:53:54 +08:00
YYHEggEgg
d67db9f57a Proto (Gacha related) 2024-07-30 16:52:35 +08:00
YYHEggEgg
dcb0e49345 Implement static config gacha needed 2024-07-30 10:41:18 +08:00
18 changed files with 130 additions and 2251 deletions

View file

@ -1,32 +0,0 @@
[
{
"ID": 0,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "Normal"
},
{
"ID": 1001,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "Hack_Maincity"
},
{
"ID": 1002,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "WorkShop_OnMission"
},
{
"ID": 1003,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "SummerActivity_Ready"
},
{
"ID": 1004,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "SummerActivity_Start"
},
{
"ID": 1005,
"PlayEventName": "Play_BGM_Maincity",
"StateName": "Mission_Accomplish"
}
]

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,7 @@
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use chrono::{prelude::Local, DateTime}; use chrono::{prelude::Local, DateTime};
use proto::GachaAddedItemType; use serde::Deserialize;
use serde::{Deserialize, Deserializer};
use tracing; use tracing;
#[derive(Debug, Default, Deserialize)] #[derive(Debug, Default, Deserialize)]
@ -126,21 +125,11 @@ pub struct MustGainItem {
pub category_tag: String, pub category_tag: String,
} }
#[derive(Debug, Default, Deserialize)]
pub struct FreeSelectItem {
pub milestones: Vec<u32>,
pub rarity: u32,
pub category_tags: Vec<String>,
pub free_select_progress_record_tag: String,
pub free_select_usage_record_tag: String,
}
#[derive(Debug, Default, Deserialize)] #[derive(Debug, Default, Deserialize)]
pub struct DiscountPolicyCollection { pub struct DiscountPolicyCollection {
pub ten_pull_discount_map: HashMap<String, TenPullDiscount>, pub ten_pull_discount_map: HashMap<String, TenPullDiscount>,
pub must_gain_item_map: HashMap<String, MustGainItem>, pub must_gain_item_map: HashMap<String, MustGainItem>,
pub advanced_guarantee_map: HashMap<String, AdvancedGuarantee>, pub advanced_guarantee_map: HashMap<String, AdvancedGuarantee>,
pub free_select_map: HashMap<String, FreeSelectItem>,
} }
impl DiscountPolicyCollection { impl DiscountPolicyCollection {
@ -158,21 +147,6 @@ pub struct GachaCategoryInfo {
pub is_promotional_items: bool, pub is_promotional_items: bool,
pub item_ids: Vec<u32>, pub item_ids: Vec<u32>,
pub category_weight: u32, pub category_weight: u32,
#[serde(default, deserialize_with = "from_str")]
pub item_type: GachaAddedItemType,
}
pub fn from_str<'de, D>(deserializer: D) -> Result<GachaAddedItemType, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
let result = GachaAddedItemType::from_str_name(&s);
match result {
Some(val) => Ok(val),
None => Ok(GachaAddedItemType::None)
}
} }
#[derive(Debug, Default, Deserialize)] #[derive(Debug, Default, Deserialize)]

View file

@ -1,12 +0,0 @@
use serde::Deserialize;
template_id!(MainCityBgmConfig u32 id);
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct MainCityBgmConfigTemplate {
#[serde(rename = "ID")]
pub id: MainCityBgmConfigID,
pub play_event_name: String,
pub state_name: String,
}

View file

@ -84,7 +84,6 @@ template_tables! {
WeaponTemplate; WeaponTemplate;
MainCityObjectTemplate; MainCityObjectTemplate;
MainCityDefaultObjectTemplate; MainCityDefaultObjectTemplate;
MainCityBgmConfigTemplate;
ArchiveFileQuestTemplate; ArchiveFileQuestTemplate;
ArchiveBattleQuestTemplate; ArchiveBattleQuestTemplate;
} }

View file

@ -138,13 +138,12 @@ pub async fn kick(
} }
let uid = args[0].parse::<u32>()?; let uid = args[0].parse::<u32>()?;
let default_reason = DisconnectReason::ServerKick.into();
let reason = match args.get(1) { let reason = match args.get(1) {
Some(arg) => match arg.parse::<i32>() { Some(arg) => match arg.parse::<i32>() {
Ok(val) => val, Ok(val) => val,
Err(_err) => default_reason, Err(_err) => 1,
}, },
None => default_reason, None => 1,
}; };
let reason_str = match DisconnectReason::try_from(reason) { let reason_str = match DisconnectReason::try_from(reason) {
Ok(converted_enum) => converted_enum.as_str_name().to_owned(), Ok(converted_enum) => converted_enum.as_str_name().to_owned(),

View file

@ -1,19 +1,8 @@
use std::{ use data::gacha::{gacha_config::*, global_gacha_config};
cmp::min,
collections::{
hash_map::Entry::{Occupied, Vacant},
HashSet,
},
};
use data::{
gacha::{gacha_config::*, global_gacha_config},
tables::{AvatarBaseID, WeaponID},
};
use proto::*;
use super::*; use super::*;
use chrono::{DateTime, Local}; use chrono::{DateTime, Local};
use proto::*;
pub async fn on_get_gacha_data( pub async fn on_get_gacha_data(
_session: &NetSession, _session: &NetSession,
@ -32,7 +21,7 @@ pub async fn on_get_gacha_data(
Ok(GetGachaDataScRsp { Ok(GetGachaDataScRsp {
retcode: Retcode::RetSucc.into(), retcode: Retcode::RetSucc.into(),
gacha_type: req.gacha_type, gacha_type: req.gacha_type,
gacha_data: Some(generate_all_gacha_info(_player, &Local::now())), gacha_data: Some(generate_all_gacha_info(_player)),
}) })
} }
} }
@ -44,8 +33,6 @@ pub async fn on_do_gacha(
) -> NetResult<DoGachaScRsp> { ) -> NetResult<DoGachaScRsp> {
let gachaconf = global_gacha_config(); let gachaconf = global_gacha_config();
let gacha_model = &mut _player.gacha_model; let gacha_model = &mut _player.gacha_model;
let item_model = &mut _player.item_model;
let role_model = &mut _player.role_model;
let pull_time = Local::now(); let pull_time = Local::now();
let target_pool = get_gacha_pool( let target_pool = get_gacha_pool(
&gachaconf.character_gacha_pool_list, &gachaconf.character_gacha_pool_list,
@ -53,20 +40,16 @@ pub async fn on_do_gacha(
&pull_time, &pull_time,
); );
if let None = target_pool { if let None = target_pool {
tracing::info!(
"refuse gacha because: pool of parent_schedule_id {} not found",
req.gacha_parent_schedule_id
);
return Ok(DoGachaScRsp { return Ok(DoGachaScRsp {
retcode: Retcode::RetFail.into(), retcode: Retcode::RetSucc.into(),
..Default::default() ..Default::default()
}); });
}; };
let target_pool = target_pool.unwrap(); let target_pool = target_pool.unwrap();
// tracing::info!("cost_item_count: {}", req.cost_item_count); // TODO: Validate cost_item_count
// tracing::info!("cost_item_count: {}", body.cost_item_count);
let mut pull_count = if req.cost_item_count > 1 { 10 } else { 1 }; let mut pull_count = if req.cost_item_count > 1 { 10 } else { 1 };
let mut cost_count = pull_count;
if pull_count == 10 { if pull_count == 10 {
let discount_tag = &gachaconf.common_properties.ten_pull_discount_tag; let discount_tag = &gachaconf.common_properties.ten_pull_discount_tag;
@ -84,291 +67,32 @@ pub async fn on_do_gacha(
let usage = status_bin.discount_usage_map.get_mut(discount_tag).unwrap(); let usage = status_bin.discount_usage_map.get_mut(discount_tag).unwrap();
if *usage < discount_policy.use_limit { if *usage < discount_policy.use_limit {
*usage += 1; *usage += 1;
// cost_count = discount_policy.discounted_prize;
} }
} }
} }
if cost_count != req.cost_item_count {
tracing::info!(
"refuse gacha because: expected cost item {cost_count}, found {}",
req.cost_item_count
);
return Ok(DoGachaScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
} else {
// TODO: cost resource
}
let mut gain_item_list: Vec<GainItemInfo> = vec![]; let mut gain_item_list: Vec<GainItemInfo> = vec![];
while pull_count > 0 { while pull_count > 0 {
let pull_result = gacha_model.perform_pull_pool(&pull_time, target_pool); let pull_result = gacha_model.perform_pull_pool(&pull_time, target_pool);
let extra_item_bin = pull_result.extra_item_bin.clone().unwrap(); let extra_item_bin = pull_result.extra_item_bin.unwrap();
let uid = match GachaAddedItemType::try_from(pull_result.item_type) {
Ok(enum_val) => match enum_val {
GachaAddedItemType::Weapon => match WeaponID::new(pull_result.obtained_item_id) {
Some(id) => item_model.add_weapon(id).value(),
None => 0,
},
GachaAddedItemType::Character => {
match AvatarBaseID::new(pull_result.obtained_item_id) {
Some(id) => {
role_model.add_avatar(id);
0
}
None => 0,
}
}
_ => 0,
},
Err(_err) => 0,
};
if extra_item_bin.extra_item_id != 0 {
item_model.add_resource(
extra_item_bin.extra_item_id,
extra_item_bin.extra_item_count,
);
}
gain_item_list.push(GainItemInfo { gain_item_list.push(GainItemInfo {
item_id: pull_result.obtained_item_id, item_id: pull_result.obtained_item_id,
extra_item_id: extra_item_bin.extra_item_id, extra_item_id: extra_item_bin.extra_item_id,
extra_item_count: extra_item_bin.extra_item_count, extra_item_count: extra_item_bin.extra_item_count,
uid,
num: 1, num: 1,
..GainItemInfo::default() ..GainItemInfo::default()
}); });
pull_count -= 1; pull_count -= 1;
gacha_model.gacha_bin.gacha_records.push(pull_result);
} }
Ok(DoGachaScRsp { Ok(DoGachaScRsp {
retcode: Retcode::RetSucc.into(), retcode: Retcode::RetSucc.into(),
gain_item_list, gain_item_list,
gacha_data: Some(generate_all_gacha_info(_player, &pull_time)), gacha_data: Some(generate_all_gacha_info(_player)),
cost_item_count: req.cost_item_count, cost_item_count: req.cost_item_count,
}) })
} }
pub async fn on_gacha_free_agent(
_session: &NetSession,
_player: &mut Player,
req: GachaFreeAgentCsReq,
) -> NetResult<GachaFreeAgentScRsp> {
let gachaconf = global_gacha_config();
let gacha_model = &mut _player.gacha_model;
let role_model = &mut _player.role_model;
let pull_time = Local::now();
let target_pool = get_gacha_pool(
&gachaconf.character_gacha_pool_list,
&req.gacha_parent_schedule_id,
&pull_time,
);
if let None = target_pool {
tracing::info!(
"refuse free agent because: pool of parent_schedule_id {} not found",
req.gacha_parent_schedule_id
);
return Ok(GachaFreeAgentScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
};
let target_pool = target_pool.unwrap();
let gacha_bin = &mut _player.gacha_model.gacha_bin;
let sharing_guarantee_category_tag = &target_pool.sharing_guarantee_info_category;
let status_bin = gacha_bin
.gacha_status_map
.get_mut(sharing_guarantee_category_tag)
.unwrap();
let mut free_select_policy: Option<&FreeSelectItem> = None;
let mut free_select_progress: u32 = 0;
let mut free_select_required_pull: u32 = 0;
for discount_policy_tag in target_pool.discount_policy_tags.iter() {
if gachaconf
.discount_policies
.free_select_map
.contains_key(discount_policy_tag)
{
let policy = gachaconf
.discount_policies
.free_select_map
.get(discount_policy_tag)
.unwrap();
let free_select_demand_idx = usize::try_from(
*(status_bin
.discount_usage_map
.get(&policy.free_select_usage_record_tag)
.unwrap()),
)
.unwrap();
if policy.milestones.len() <= free_select_demand_idx {
continue;
}
let free_select_actual_progress = status_bin
.discount_usage_map
.get(&policy.free_select_progress_record_tag)
.unwrap();
free_select_policy = Some(policy);
free_select_required_pull = policy
.milestones
.get(free_select_demand_idx)
.unwrap()
.to_owned();
free_select_progress = min(free_select_required_pull, *free_select_actual_progress);
}
}
if let None = free_select_policy {
tracing::info!(
"refuse free agent because: pool of parent_schedule_id {} hasn't defined free agent discount yet (or used up chance)",
req.gacha_parent_schedule_id
);
return Ok(GachaFreeAgentScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
} else if free_select_progress < free_select_required_pull {
tracing::info!(
"refuse free agent because: use pulled {free_select_progress} (after last free agent) in parent_schedule_id {}, required {free_select_required_pull}",
req.gacha_parent_schedule_id
);
return Ok(GachaFreeAgentScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
}
let free_select_policy = free_select_policy.unwrap();
let mut has_demanded_item = false;
for rarity_items in target_pool.gacha_items.iter() {
if rarity_items.rarity != free_select_policy.rarity {
continue;
}
for (category_tag, category) in rarity_items.categories.iter() {
if !free_select_policy.category_tags.contains(category_tag) {
continue;
}
has_demanded_item |= category.item_ids.contains(&req.avatar_id);
}
}
if !has_demanded_item {
tracing::info!(
"refuse free agent because: pool of parent_schedule_id {} doesn't have demanded item {}",
req.gacha_parent_schedule_id, req.avatar_id
);
return Ok(GachaFreeAgentScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
}
role_model.add_avatar(AvatarBaseID::new(req.avatar_id).unwrap());
(*status_bin
.discount_usage_map
.get_mut(&free_select_policy.free_select_usage_record_tag)
.unwrap()) += 1;
(*status_bin
.discount_usage_map
.get_mut(&free_select_policy.free_select_progress_record_tag)
.unwrap()) -= free_select_required_pull;
Ok(GachaFreeAgentScRsp {
retcode: Retcode::RetSucc.into(),
})
}
pub async fn on_choose_gacha_up(
_session: &NetSession,
_player: &mut Player,
req: ChooseGachaUpCsReq,
) -> NetResult<ChooseGachaUpScRsp> {
let gachaconf = global_gacha_config();
let gacha_model = &mut _player.gacha_model;
let pull_time = Local::now();
let target_pool = get_gacha_pool(
&gachaconf.character_gacha_pool_list,
&req.gacha_parent_schedule_id,
&pull_time,
);
if let None = target_pool {
return Ok(ChooseGachaUpScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
};
let target_pool = target_pool.unwrap();
for rarity_items in target_pool.gacha_items.iter() {
if rarity_items.rarity != gachaconf.common_properties.s_item_rarity {
continue;
}
for guarantee_policy_tag in rarity_items.category_guarantee_policy_tags.iter() {
let category_guarantee_policy = gachaconf
.category_guarantee_policy_map
.get(guarantee_policy_tag)
.unwrap();
if !category_guarantee_policy.chooseable {
continue;
}
let mut up_category: Option<&String> = None;
for (category_tag, category) in rarity_items.categories.iter() {
if category.item_ids.contains(&req.item_id) {
up_category = Some(category_tag);
break;
}
}
if let None = up_category {
return Ok(ChooseGachaUpScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
});
};
let up_category = up_category.unwrap();
let progress_bin = gacha_model
.gacha_bin
.gacha_status_map
.get_mut(&target_pool.sharing_guarantee_info_category)
.unwrap()
.rarity_status_map
.get_mut(&rarity_items.rarity)
.unwrap();
match progress_bin
.categories_chosen_guarantee_item_map
.entry(guarantee_policy_tag.clone())
{
Occupied(mut occupied_entry) => {
occupied_entry.insert(req.item_id);
}
Vacant(vacant_entry) => {
vacant_entry.insert(req.item_id);
}
};
match progress_bin
.categories_chosen_guarantee_category_map
.entry(up_category.clone())
{
Occupied(mut occupied_entry) => {
occupied_entry.insert(up_category.clone());
}
Vacant(vacant_entry) => {
vacant_entry.insert(up_category.clone());
}
};
return Ok(ChooseGachaUpScRsp {
retcode: Retcode::RetSucc.into(),
..Default::default()
});
}
}
Ok(ChooseGachaUpScRsp {
retcode: Retcode::RetFail.into(),
..Default::default()
})
}
fn generate_gacha_info_from_pool( fn generate_gacha_info_from_pool(
gacha_bin: &GachaModelBin, gacha_bin: &GachaModelBin,
target_pool: &CharacterGachaPool, target_pool: &CharacterGachaPool,
@ -390,13 +114,34 @@ fn generate_gacha_info_from_pool(
.get(&common_properties.a_item_rarity) .get(&common_properties.a_item_rarity)
.unwrap() .unwrap()
.pity; .pity;
let mut up_s_item_list: Vec<u32> = vec![];
let mut up_a_item_list: Vec<u32> = vec![];
let mut s_guarantee: u32 = 0;
let mut a_guarantee: u32 = 0;
for rarity_items in target_pool.gacha_items.iter() {
for category in rarity_items.categories.values() {
let probability_model = gachaconf
.probability_model_map
.get(&rarity_items.probability_model_tag)
.unwrap();
if rarity_items.rarity == common_properties.s_item_rarity {
if category.is_promotional_items {
up_s_item_list = category.item_ids.clone();
}
s_guarantee = probability_model.maximum_guarantee_pity - pity_s + 1;
}
if rarity_items.rarity == common_properties.a_item_rarity {
if category.is_promotional_items {
up_a_item_list = category.item_ids.clone();
}
a_guarantee = probability_model.maximum_guarantee_pity - pity_a + 1;
}
}
}
let mut discount_ten_roll_prize: u32 = 0; let mut discount_ten_roll_prize: u32 = 0;
let mut discount_avaliable_num: u32 = 0; let mut discount_avaliable_num: u32 = 0;
let mut advanced_s_guarantee: u32 = 0; let mut advanced_s_guarantee: u32 = 0;
let mut free_select_progress: u32 = 0;
let mut free_select_required_pull: u32 = 0;
let mut free_select_policy: Option<&FreeSelectItem> = None;
for discount_policy_tag in target_pool.discount_policy_tags.iter() { for discount_policy_tag in target_pool.discount_policy_tags.iter() {
if common_properties.newcomer_advanced_s_tag == *discount_policy_tag { if common_properties.newcomer_advanced_s_tag == *discount_policy_tag {
let policy = gachaconf let policy = gachaconf
@ -426,123 +171,6 @@ fn generate_gacha_info_from_pool(
discount_ten_roll_prize = policy.discounted_prize; discount_ten_roll_prize = policy.discounted_prize;
discount_avaliable_num = policy.use_limit - discount_usage; discount_avaliable_num = policy.use_limit - discount_usage;
} }
} else if gachaconf
.discount_policies
.free_select_map
.contains_key(discount_policy_tag)
{
let policy = gachaconf
.discount_policies
.free_select_map
.get(discount_policy_tag)
.unwrap();
let free_select_demand_idx = usize::try_from(
*(status_bin
.discount_usage_map
.get(&policy.free_select_usage_record_tag)
.unwrap()),
)
.unwrap();
if policy.milestones.len() <= free_select_demand_idx {
continue;
}
let free_select_actual_progress = status_bin
.discount_usage_map
.get(&policy.free_select_progress_record_tag)
.unwrap();
free_select_policy = Some(policy);
free_select_required_pull = policy
.milestones
.get(free_select_demand_idx)
.unwrap()
.to_owned();
free_select_progress = min(free_select_required_pull, *free_select_actual_progress);
}
}
let mut up_s_item_list: Vec<u32> = vec![];
let mut up_a_item_list: Vec<u32> = vec![];
let mut free_select_item_list: Vec<u32> = vec![];
let mut chooseable_up_list: Vec<u32> = vec![];
let mut chosen_up_item: u32 = 0;
let mut s_guarantee: u32 = 0;
let mut a_guarantee: u32 = 0;
for rarity_items in target_pool.gacha_items.iter() {
let mut chooseable_up_included_category_tags: Option<&HashSet<String>> = None;
let mut chooseable_policy_tag: Option<&String> = None;
for guarantee_policy_tag in rarity_items.category_guarantee_policy_tags.iter() {
let category_guarantee_policy = gachaconf
.category_guarantee_policy_map
.get(guarantee_policy_tag)
.unwrap();
if !category_guarantee_policy.chooseable {
continue;
}
chooseable_policy_tag = Some(guarantee_policy_tag);
chooseable_up_included_category_tags =
Some(&category_guarantee_policy.included_category_tags);
if let Some(item) = status_bin
.rarity_status_map
.get(&rarity_items.rarity)
.unwrap()
.categories_chosen_guarantee_item_map
.get(guarantee_policy_tag)
{
chosen_up_item = item.clone();
}
}
for (category_tag, category) in rarity_items.categories.iter() {
let probability_model = gachaconf
.probability_model_map
.get(&rarity_items.probability_model_tag)
.unwrap();
let maximum_pity = &probability_model.maximum_guarantee_pity;
if rarity_items.rarity == common_properties.s_item_rarity {
if category.is_promotional_items {
up_s_item_list = category.item_ids.clone();
}
// tracing::info!("pity_s: {pity_s}");
// thread 'tokio-runtime-worker' panicked at nap_gameserver\src\handlers\gacha.rs:369:31:
// attempt to subtract with overflow
s_guarantee = maximum_pity - min(pity_s, maximum_pity.clone()) + 1;
}
if rarity_items.rarity == common_properties.a_item_rarity {
if category.is_promotional_items {
up_a_item_list = category.item_ids.clone();
}
// tracing::info!("pity_a: {pity_a}");
a_guarantee = maximum_pity - min(pity_a, maximum_pity.clone()) + 1;
}
if let Some(val) = free_select_policy {
if val.rarity == rarity_items.rarity && val.category_tags.contains(category_tag) {
free_select_item_list.append(&mut category.item_ids.clone());
}
}
if let Some(tags) = chooseable_up_included_category_tags {
if tags.contains(category_tag) {
chooseable_up_list.append(&mut category.item_ids.clone());
}
}
}
if let Some(priority_policy_tag) = chooseable_policy_tag {
// if let Some(item) = status_bin
// .rarity_status_map
// .get(&rarity_items.rarity)
// .unwrap()
// .categories_chosen_guarantee_item_map
// .get(priority_policy_tag)
// {
if rarity_items.rarity == gachaconf.common_properties.s_item_rarity {
up_s_item_list = vec![];
} else if rarity_items.rarity == gachaconf.common_properties.a_item_rarity {
up_a_item_list = vec![];
}
// }
} }
} }
@ -551,7 +179,7 @@ fn generate_gacha_info_from_pool(
need_item_count: 1, need_item_count: 1,
}]; }];
let mut result = Gacha { Gacha {
gacha_schedule_id: target_pool.gacha_schedule_id, gacha_schedule_id: target_pool.gacha_schedule_id,
gacha_parent_schedule_id: target_pool.gacha_parent_schedule_id, gacha_parent_schedule_id: target_pool.gacha_parent_schedule_id,
gacha_type: target_pool.gacha_type, gacha_type: target_pool.gacha_type,
@ -559,46 +187,32 @@ fn generate_gacha_info_from_pool(
end_timestamp: target_pool.end_time.timestamp(), end_timestamp: target_pool.end_time.timestamp(),
discount_avaliable_num, discount_avaliable_num,
discount_ten_roll_prize, discount_ten_roll_prize,
up_s_item_list,
up_a_item_list,
advanced_s_guarantee, advanced_s_guarantee,
s_guarantee, s_guarantee,
a_guarantee, a_guarantee,
need_item_info_list, need_item_info_list,
free_select_progress, // iehkehofjop: target_pool.gacha_parent_schedule_id,
free_select_required_pull, // eggcehlgkii: 223,
free_select_item_list, // ijoahiepmfo: 101,
chosen_up_item,
// nammdglepbk: 563,
// hgmcofcjmbg: 101,
// akggbhgkifd: chooseable_up_list.clone(),
chooseable_up_list,
..Gacha::default() ..Gacha::default()
};
if up_s_item_list.len() > 0 {
result.up_s_item_list = up_s_item_list;
} }
if up_a_item_list.len() > 0 {
result.up_a_item_list = up_a_item_list;
}
result
} }
fn generate_all_gacha_info(_player: &Player, now: &DateTime<Local>) -> GachaData { fn generate_all_gacha_info(_player: &Player) -> GachaData {
let gachaconf = global_gacha_config(); let gachaconf = global_gacha_config();
let gacha_bin = &_player.gacha_model.gacha_bin; let gacha_bin = &_player.gacha_model.gacha_bin;
let mut gacha_list: Vec<Gacha> = vec![]; let mut gacha_list: Vec<Gacha> = vec![];
for target_pool in gachaconf.character_gacha_pool_list.iter() { for target_pool in gachaconf.character_gacha_pool_list.iter() {
if target_pool.is_still_open(now) { gacha_list.push(generate_gacha_info_from_pool(
gacha_list.push(generate_gacha_info_from_pool( &gacha_bin,
&gacha_bin, target_pool,
target_pool, &gachaconf.common_properties,
&gachaconf.common_properties, ));
));
}
} }
// tracing::info!("gacha_list: {:?}", gacha_list);
GachaData { GachaData {
random_number: 6167, random_number: 0,
gacha_pool: Some(GachaPool { gacha_list }), gacha_pool: Some(GachaPool { gacha_list }),
..GachaData::default() ..GachaData::default()
} }

View file

@ -120,8 +120,6 @@ req_handlers! {
quest::BeginArchiveBattleQuest; quest::BeginArchiveBattleQuest;
quest::FinishArchiveQuest; quest::FinishArchiveQuest;
gacha::DoGacha; gacha::DoGacha;
gacha::ChooseGachaUp;
gacha::GachaFreeAgent;
} }
notify_handlers! { notify_handlers! {

View file

@ -85,13 +85,8 @@ pub async fn on_begin_archive_battle_quest(
let quest_id = ArchiveBattleQuestID::new(req.quest_id).ok_or(Retcode::RetFail)?; let quest_id = ArchiveBattleQuestID::new(req.quest_id).ok_or(Retcode::RetFail)?;
player.game_instance = GameInstance::Hollow( player.game_instance = GameInstance::Hollow(
HollowGame::create_archive_battle( HollowGame::create_archive_battle(quest_id, ELocalPlayType::ArchiveBattle, &req.avatars)
quest_id, .map_err(LogicError::from)?,
ELocalPlayType::ArchiveBattle,
&req.avatars,
req.buddy_id,
)
.map_err(LogicError::from)?,
); );
let world_init_notify = player.game_instance.create_world_init_notify()?; let world_init_notify = player.game_instance.create_world_init_notify()?;

View file

@ -1,25 +0,0 @@
use std::collections::HashMap;
use proto::EquippedBuddyData;
use crate::logic::{BaseProperty, BuddyTeamType};
pub struct EquippedBuddyDataItem {
pub buddy_id: u32,
pub buddy_team: BuddyTeamType,
pub override_property_map: HashMap<BaseProperty, i32>,
}
impl EquippedBuddyDataItem {
pub fn to_client(&self) -> EquippedBuddyData {
EquippedBuddyData {
buddy_id: self.buddy_id,
r#type: self.buddy_team.to_protocol().into(),
mp_property_override_map: self
.override_property_map
.iter()
.map(|(prop, value)| (*prop as u32, *value))
.collect(),
}
}
}

View file

@ -1,7 +1,4 @@
mod avatar; mod avatar;
mod buddy;
mod team;
pub use avatar::InLevelAvatarDataItem; pub use avatar::InLevelAvatarDataItem;
pub use buddy::EquippedBuddyDataItem; mod team;
pub use team::TeamDataItem; pub use team::TeamDataItem;

View file

@ -1,16 +1,13 @@
use std::collections::HashMap; use std::collections::HashMap;
use crate::logic::BuddyTeamType; use super::InLevelAvatarDataItem;
use super::{EquippedBuddyDataItem, InLevelAvatarDataItem};
pub struct TeamDataItem { pub struct TeamDataItem {
pub avatar_member_list: Vec<InLevelAvatarDataItem>, pub avatar_member_list: Vec<InLevelAvatarDataItem>,
pub equipped_buddy_list: Vec<EquippedBuddyDataItem>,
} }
impl TeamDataItem { impl TeamDataItem {
pub fn new(avatars: &[u32], buddy_id: u32) -> Self { pub fn new(avatars: &[u32]) -> Self {
Self { Self {
avatar_member_list: avatars avatar_member_list: avatars
.iter() .iter()
@ -19,13 +16,6 @@ impl TeamDataItem {
mp_property_override: HashMap::new(), mp_property_override: HashMap::new(),
}) })
.collect(), .collect(),
equipped_buddy_list: (buddy_id != 0)
.then_some(vec![EquippedBuddyDataItem {
buddy_id,
buddy_team: BuddyTeamType::Assisting,
override_property_map: HashMap::new(),
}])
.unwrap_or_default(),
} }
} }
} }

View file

@ -259,22 +259,3 @@ pub enum BaseProperty {
Luck = 5, Luck = 5,
AllDamageResist = 43, AllDamageResist = 43,
} }
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i32)]
pub enum BuddyTeamType {
Unknown = 0,
Fighting = 1,
Assisting = 2,
}
impl BuddyTeamType {
pub fn to_protocol(&self) -> ::proto::BuddyTeamType {
match *self {
Self::Unknown => ::proto::BuddyTeamType::Unknown,
Self::Fighting => ::proto::BuddyTeamType::Fighting,
Self::Assisting => ::proto::BuddyTeamType::Assisting,
}
}
}

View file

@ -52,42 +52,10 @@ impl GachaModel {
&mut progress_bin.categories_progress_map, &mut progress_bin.categories_progress_map,
&category_guarantee_policy_tag, &category_guarantee_policy_tag,
); );
let guarantee_policy = gachaconf
.category_guarantee_policy_map
.get(category_guarantee_policy_tag)
.unwrap();
if !guarantee_policy.chooseable {
continue;
}
get_or_add(
&mut progress_bin.categories_chosen_guarantee_progress_map,
&category_guarantee_policy_tag,
);
} }
} }
for discount_policy_tag in gacha_pool.discount_policy_tags.iter() { for discount_policy_tag in gacha_pool.discount_policy_tags.iter() {
if gachaconf get_or_add(&mut status_bin.discount_usage_map, &discount_policy_tag);
.discount_policies
.free_select_map
.contains_key(discount_policy_tag)
{
let policy = gachaconf
.discount_policies
.free_select_map
.get(discount_policy_tag)
.unwrap();
get_or_add(
&mut status_bin.discount_usage_map,
&policy.free_select_progress_record_tag,
);
get_or_add(
&mut status_bin.discount_usage_map,
&policy.free_select_usage_record_tag,
);
} else {
get_or_add(&mut status_bin.discount_usage_map, &discount_policy_tag);
}
} }
} }
self self
@ -102,14 +70,8 @@ impl GachaModel {
let (rarity_items, progress_bin, status_bin, probability_model) = let (rarity_items, progress_bin, status_bin, probability_model) =
determine_rarity(&gacha_bin, target_pool); determine_rarity(&gacha_bin, target_pool);
let (category_tag, category) = determine_category(rarity_items, progress_bin, target_pool); let (category_tag, category) = determine_category(rarity_items, progress_bin, target_pool);
let result = determine_gacha_result( let result =
pull_time, determine_gacha_result(pull_time, category, target_pool, status_bin, rarity_items);
category,
target_pool,
status_bin,
progress_bin,
rarity_items,
);
update_pity(&mut gacha_bin, rarity_items, probability_model, target_pool); update_pity(&mut gacha_bin, rarity_items, probability_model, target_pool);
update_category_guarantee_info(&mut gacha_bin, rarity_items, &category_tag, target_pool); update_category_guarantee_info(&mut gacha_bin, rarity_items, &category_tag, target_pool);
update_discount(&mut gacha_bin, target_pool, &category_tag, rarity_items); update_discount(&mut gacha_bin, target_pool, &category_tag, rarity_items);
@ -234,27 +196,9 @@ fn determine_category<'bin, 'conf>(
let mut category_tag_inited = false; let mut category_tag_inited = false;
let mut category_tag_result: HashSet<String> = HashSet::new(); let mut category_tag_result: HashSet<String> = HashSet::new();
// First of all, if there's a chooseable category and // First of all, if there's a chooseable category and
// it is SELECTED then we MUST give that category's item. // it's can be triggered, then we MUST give that
for guarantee_policy_tag in rarity_items.category_guarantee_policy_tags.iter() { // category's item.
let category_guarantee_policy = gachaconf // TODO: Only Genshin can do
.category_guarantee_policy_map
.get(guarantee_policy_tag)
.unwrap();
if !category_guarantee_policy.chooseable {
continue;
}
// As we found a policy defined chooseable, we
// should head to look whether the user chose
// the category he want.
if let Some(category_tag) = progress_bin
.categories_chosen_guarantee_category_map
.get(guarantee_policy_tag)
{
// User chose a category; our work are done here.
category_tag_result.insert(category_tag.clone());
category_tag_inited = true;
}
}
// Then we should take a look at MustGainItem. // Then we should take a look at MustGainItem.
if !category_tag_inited { if !category_tag_inited {
for discount_policy_tag in target_pool.discount_policy_tags.iter() { for discount_policy_tag in target_pool.discount_policy_tags.iter() {
@ -318,49 +262,14 @@ fn determine_gacha_result<'bin, 'conf>(
category: &'conf GachaCategoryInfo, category: &'conf GachaCategoryInfo,
target_pool: &'conf CharacterGachaPool, target_pool: &'conf CharacterGachaPool,
status_bin: &'bin GachaStatusBin, status_bin: &'bin GachaStatusBin,
progress_bin: &'bin GachaProgressBin,
rarity_items: &'conf GachaAvailableItemsInfo, rarity_items: &'conf GachaAvailableItemsInfo,
) -> GachaRecordBin { ) -> GachaRecordBin {
let gachaconf = gacha::global_gacha_config(); let gachaconf = gacha::global_gacha_config();
let item_pool_len = category.item_ids.len() as u32; let item_pool_len = category.item_ids.len() as u32;
let mut item_id: Option<&u32> = None; let item_id = category
// We should see whether user's search priority exists. .item_ids
for guarantee_policy_tag in rarity_items.category_guarantee_policy_tags.iter() { .get(rand::thread_rng().gen_range(0..item_pool_len) as usize)
let category_guarantee_policy = gachaconf .unwrap();
.category_guarantee_policy_map
.get(guarantee_policy_tag)
.unwrap();
if !category_guarantee_policy.chooseable {
continue;
}
// Firstly, judge whether the user failed enough times.
// The user is limited to get only this category's item,
// so we should record the user's failure to get his
// selected item elsewhere.
if progress_bin
.categories_chosen_guarantee_progress_map
.get(guarantee_policy_tag)
.unwrap()
< &category_guarantee_policy.trigger_on_failure_times
{
continue;
}
// We directly look whether user chose an UP item.
if let Some(item) = progress_bin
.categories_chosen_guarantee_item_map
.get(guarantee_policy_tag)
{
item_id = Some(item);
}
}
let item_id = match item_id {
Some(val) => val,
None => category
.item_ids
.get(rand::thread_rng().gen_range(0..item_pool_len) as usize)
.unwrap(),
};
let mut extra_item_id: u32 = 0; let mut extra_item_id: u32 = 0;
let mut extra_item_count: u32 = 0; let mut extra_item_count: u32 = 0;
@ -370,7 +279,6 @@ fn determine_gacha_result<'bin, 'conf>(
.get(extra_items_policy_tag) .get(extra_items_policy_tag)
.unwrap(); .unwrap();
// TODO: apply_on_owned_count in a context with bag // TODO: apply_on_owned_count in a context with bag
// TODO: That's what RoleModel should do, not me.
if extra_items_policy.apply_on_owned_count == 0 { if extra_items_policy.apply_on_owned_count == 0 {
extra_item_id = extra_items_policy.id; extra_item_id = extra_items_policy.id;
extra_item_count = extra_items_policy.count; extra_item_count = extra_items_policy.count;
@ -387,7 +295,6 @@ fn determine_gacha_result<'bin, 'conf>(
gacha_id: target_pool.gacha_schedule_id.clone(), gacha_id: target_pool.gacha_schedule_id.clone(),
progress_map: status_bin.rarity_status_map.clone(), progress_map: status_bin.rarity_status_map.clone(),
extra_item_bin: Some(extra_item_bin), extra_item_bin: Some(extra_item_bin),
item_type: category.item_type.into(),
} }
} }
@ -488,18 +395,4 @@ fn update_discount<'bin, 'conf>(
*usage += 1; *usage += 1;
} }
} }
for (policy_tag, policy) in gachaconf.discount_policies.free_select_map.iter() {
if !target_pool.discount_policy_tags.contains(policy_tag) {
continue;
}
let status_bin = gacha_bin
.gacha_status_map
.get_mut(&target_pool.sharing_guarantee_info_category)
.unwrap();
let progress = status_bin
.discount_usage_map
.get_mut(&policy.free_select_progress_record_tag)
.unwrap();
*progress += 1;
}
} }

View file

@ -1,4 +1,4 @@
use data::tables::{AvatarBaseID, MainCityBgmConfigID, SectionConfigID}; use data::tables::{AvatarBaseID, SectionConfigID};
use proto::*; use proto::*;
use thiserror::Error; use thiserror::Error;
@ -14,7 +14,6 @@ use super::NapGameMode;
pub struct FrontendGame { pub struct FrontendGame {
section_id: SectionConfigID, section_id: SectionConfigID,
frontend_avatar_id: AvatarBaseID, frontend_avatar_id: AvatarBaseID,
main_city_bgm: MainCityBgmConfigID,
scene_unit_mgr: SceneUnitManager, scene_unit_mgr: SceneUnitManager,
camera_x: u32, camera_x: u32,
camera_y: u32, camera_y: u32,
@ -31,8 +30,6 @@ pub enum FrontendGameError {
} }
impl FrontendGame { impl FrontendGame {
const DEFAULT_BGM_ID: u32 = 1005;
pub fn new( pub fn new(
section_id: SectionConfigID, section_id: SectionConfigID,
avatar_id: AvatarBaseID, avatar_id: AvatarBaseID,
@ -43,7 +40,6 @@ impl FrontendGame {
let instance = Self { let instance = Self {
section_id, section_id,
main_city_time, main_city_time,
main_city_bgm: MainCityBgmConfigID::new_unchecked(Self::DEFAULT_BGM_ID),
scene_unit_mgr: SceneUnitManager::new(section_id), scene_unit_mgr: SceneUnitManager::new(section_id),
frontend_avatar_id: avatar_id, frontend_avatar_id: avatar_id,
camera_x: 0xFFFFFFFF, camera_x: 0xFFFFFFFF,
@ -69,7 +65,6 @@ impl NapGameMode for FrontendGame {
hall_scene_info: Some(HallSceneInfo { hall_scene_info: Some(HallSceneInfo {
section_id: self.section_id.value(), section_id: self.section_id.value(),
frontend_avatar_id: self.frontend_avatar_id.value(), frontend_avatar_id: self.frontend_avatar_id.value(),
main_city_bgm_id: self.main_city_bgm.value(),
camera_x: self.camera_x, camera_x: self.camera_x,
camera_y: self.camera_y, camera_y: self.camera_y,
transform: self transform: self

View file

@ -4,7 +4,7 @@ use proto::{DungeonInfo, DungeonItemData, FightSceneInfo, SceneInfo, WeatherPool
use thiserror::Error; use thiserror::Error;
use crate::logic::{ use crate::logic::{
battle::{EquippedBuddyDataItem, InLevelAvatarDataItem, TeamDataItem}, battle::{InLevelAvatarDataItem, TeamDataItem},
ELocalPlayType, ESceneType, TimePeriodType, WeatherType, ELocalPlayType, ESceneType, TimePeriodType, WeatherType,
}; };
@ -38,7 +38,7 @@ impl HollowGame {
weather: WeatherType::SunShine, weather: WeatherType::SunShine,
start_timestamp: util::cur_timestamp() as i64, start_timestamp: util::cur_timestamp() as i64,
play_type, play_type,
team_data: TeamDataItem::new(avatars, 0), team_data: TeamDataItem::new(avatars),
}) })
} }
@ -46,7 +46,6 @@ impl HollowGame {
archive_battle_quest_id: ArchiveBattleQuestID, archive_battle_quest_id: ArchiveBattleQuestID,
play_type: ELocalPlayType, play_type: ELocalPlayType,
avatars: &[u32], avatars: &[u32],
buddy_id: u32,
) -> Result<Self, HollowGameError> { ) -> Result<Self, HollowGameError> {
let template = archive_battle_quest_id.template(); let template = archive_battle_quest_id.template();
@ -57,7 +56,7 @@ impl HollowGame {
weather: WeatherType::SunShine, weather: WeatherType::SunShine,
start_timestamp: util::cur_timestamp() as i64, start_timestamp: util::cur_timestamp() as i64,
play_type, play_type,
team_data: TeamDataItem::new(avatars, buddy_id), team_data: TeamDataItem::new(avatars),
}) })
} }
} }
@ -95,12 +94,6 @@ impl NapGameMode for HollowGame {
.iter() .iter()
.map(InLevelAvatarDataItem::to_client) .map(InLevelAvatarDataItem::to_client)
.collect(), .collect(),
buddy_list: self
.team_data
.equipped_buddy_list
.iter()
.map(EquippedBuddyDataItem::to_client)
.collect(),
..Default::default() ..Default::default()
}) })
} }

View file

@ -2270,7 +2270,7 @@ pub struct PlayerSyncScNotify {
#[prost(message, optional, tag = "12")] #[prost(message, optional, tag = "12")]
pub gchokpdeeci: ::core::option::Option<Mbhjjoafcmc>, pub gchokpdeeci: ::core::option::Option<Mbhjjoafcmc>,
#[prost(message, optional, tag = "13")] #[prost(message, optional, tag = "13")]
pub buddy: ::core::option::Option<BuddySync>, pub kplhefeipee: ::core::option::Option<Onacbnhpicf>,
#[prost(message, optional, tag = "14")] #[prost(message, optional, tag = "14")]
pub mobpkchjfai: ::core::option::Option<Phnapedndek>, pub mobpkchjfai: ::core::option::Option<Phnapedndek>,
#[prost(message, optional, tag = "15")] #[prost(message, optional, tag = "15")]
@ -2406,7 +2406,7 @@ pub struct Khhjipglbll {
pub bcbcjioepod: u32, pub bcbcjioepod: u32,
#[xor(2704)] #[xor(2704)]
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub buddy_id: u32, pub buddy: u32,
#[prost(uint32, repeated, tag = "11")] #[prost(uint32, repeated, tag = "11")]
pub avatars: ::prost::alloc::vec::Vec<u32>, pub avatars: ::prost::alloc::vec::Vec<u32>,
#[xor(9370)] #[xor(9370)]
@ -2760,7 +2760,7 @@ pub struct Iedkhplmbab {
pub struct StartTrialFightingMissionCsReq { pub struct StartTrialFightingMissionCsReq {
#[xor(15246)] #[xor(15246)]
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub buddy_id: u32, pub buddy: u32,
#[xor(3842)] #[xor(3842)]
#[prost(uint32, tag = "11")] #[prost(uint32, tag = "11")]
pub quest_id: u32, pub quest_id: u32,
@ -2800,8 +2800,8 @@ pub struct Eoaebmjlfjc {
pub struct EquippedBuddyData { pub struct EquippedBuddyData {
#[xor(8856)] #[xor(8856)]
#[prost(uint32, tag = "9")] #[prost(uint32, tag = "9")]
pub buddy_id: u32, pub buddy: u32,
#[prost(enumeration = "BuddyTeamType", tag = "6")] #[prost(enumeration = "Hneekphmejf", tag = "6")]
pub r#type: i32, pub r#type: i32,
#[prost(map = "uint32, int32", tag = "10")] #[prost(map = "uint32, int32", tag = "10")]
pub mp_property_override_map: ::std::collections::HashMap<u32, i32>, pub mp_property_override_map: ::std::collections::HashMap<u32, i32>,
@ -5821,7 +5821,7 @@ pub struct Mcmkalpefjk {
pub struct Aibcmljaojd { pub struct Aibcmljaojd {
#[xor(3014)] #[xor(3014)]
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub main_city_bgm_id: u32, pub naffoonclpe: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[cmdid(1091)] #[cmdid(1091)]
@ -5916,7 +5916,7 @@ pub struct Lpjpfoaehlg {
pub lbmgeignmef: u32, pub lbmgeignmef: u32,
#[xor(2510)] #[xor(2510)]
#[prost(uint32, tag = "8")] #[prost(uint32, tag = "8")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -6844,7 +6844,7 @@ pub struct Pofhbffcjap {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct ChooseGachaUpScRsp { pub struct Nhffnnompfh {
#[xor(4109)] #[xor(4109)]
#[prost(int32, tag = "2")] #[prost(int32, tag = "2")]
pub retcode: i32, pub retcode: i32,
@ -7859,7 +7859,7 @@ pub struct LogBattleStatistics {
#[prost(message, optional, tag = "13")] #[prost(message, optional, tag = "13")]
pub ncfafdpojjh: ::core::option::Option<Bacignlfind>, pub ncfafdpojjh: ::core::option::Option<Bacignlfind>,
#[prost(message, repeated, tag = "14")] #[prost(message, repeated, tag = "14")]
pub buddy_list: ::prost::alloc::vec::Vec<Jaokcopjeip>, pub lmailahlomk: ::prost::alloc::vec::Vec<Jaokcopjeip>,
#[prost(uint32, tag = "15")] #[prost(uint32, tag = "15")]
pub mlagnchinll: u32, pub mlagnchinll: u32,
#[prost(message, optional, tag = "17")] #[prost(message, optional, tag = "17")]
@ -8538,7 +8538,7 @@ pub struct HallSceneInfo {
pub hoagdhfnhhp: u32, pub hoagdhfnhhp: u32,
#[xor(4796)] #[xor(4796)]
#[prost(uint32, tag = "4")] #[prost(uint32, tag = "4")]
pub main_city_bgm_id: u32, pub naffoonclpe: u32,
#[prost(message, optional, tag = "12")] #[prost(message, optional, tag = "12")]
pub position: ::core::option::Option<Transform>, pub position: ::core::option::Option<Transform>,
#[xor(6272)] #[xor(6272)]
@ -8695,7 +8695,7 @@ pub struct BeginArchiveBattleQuestCsReq {
pub quest_id: u32, pub quest_id: u32,
#[xor(1830)] #[xor(1830)]
#[prost(uint32, tag = "11")] #[prost(uint32, tag = "11")]
pub buddy_id: u32, pub buddy: u32,
#[prost(bool, tag = "1")] #[prost(bool, tag = "1")]
pub is_story: bool, pub is_story: bool,
#[prost(uint32, repeated, tag = "2")] #[prost(uint32, repeated, tag = "2")]
@ -9176,7 +9176,7 @@ pub struct Bijjamapnjm {
pub struct Bffgkjikbhp { pub struct Bffgkjikbhp {
#[xor(3555)] #[xor(3555)]
#[prost(uint32, tag = "14")] #[prost(uint32, tag = "14")]
pub buddy_id: u32, pub buddy: u32,
#[xor(10954)] #[xor(10954)]
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub lbmgeignmef: u32, pub lbmgeignmef: u32,
@ -9395,7 +9395,7 @@ pub struct Kmkbpddeaoe {
pub struct Bhmhgadoncc { pub struct Bhmhgadoncc {
#[xor(5509)] #[xor(5509)]
#[prost(uint32, tag = "14")] #[prost(uint32, tag = "14")]
pub buddy_id: u32, pub buddy: u32,
#[xor(10314)] #[xor(10314)]
#[prost(int32, tag = "12")] #[prost(int32, tag = "12")]
pub nledmfjbmmo: i32, pub nledmfjbmmo: i32,
@ -10824,7 +10824,7 @@ pub struct Gccdaofpapp {
pub struct Ihilkekkdmh { pub struct Ihilkekkdmh {
#[xor(10553)] #[xor(10553)]
#[prost(uint32, tag = "13")] #[prost(uint32, tag = "13")]
pub buddy_id: u32, pub buddy: u32,
#[xor(13840)] #[xor(13840)]
#[prost(int32, tag = "1")] #[prost(int32, tag = "1")]
pub retcode: i32, pub retcode: i32,
@ -12833,7 +12833,7 @@ pub struct Okkjjhonnik {
pub ajichmhgblg: u32, pub ajichmhgblg: u32,
#[xor(1870)] #[xor(1870)]
#[prost(uint32, tag = "7")] #[prost(uint32, tag = "7")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -16216,7 +16216,7 @@ pub struct NeedItemInfo {
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct Onlmpmgcdle { pub struct Onlmpmgcdle {
#[prost(message, repeated, tag = "13")] #[prost(message, repeated, tag = "13")]
pub buddy_list: ::prost::alloc::vec::Vec<EquippedBuddyData>, pub lmailahlomk: ::prost::alloc::vec::Vec<EquippedBuddyData>,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[cmdid(5211)] #[cmdid(5211)]
@ -16488,7 +16488,7 @@ pub struct DungeonItemData {
#[prost(message, repeated, tag = "6")] #[prost(message, repeated, tag = "6")]
pub dldfgemogip: ::prost::alloc::vec::Vec<Ljcocgillfb>, pub dldfgemogip: ::prost::alloc::vec::Vec<Ljcocgillfb>,
#[prost(message, repeated, tag = "14")] #[prost(message, repeated, tag = "14")]
pub buddy_list: ::prost::alloc::vec::Vec<BuddyInfo>, pub lmailahlomk: ::prost::alloc::vec::Vec<BuddyInfo>,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -16638,7 +16638,7 @@ pub struct Ejjimjcohgg {
pub feanogfdcjh: u32, pub feanogfdcjh: u32,
#[xor(3653)] #[xor(3653)]
#[prost(uint32, tag = "9")] #[prost(uint32, tag = "9")]
pub main_city_bgm_id: u32, pub naffoonclpe: u32,
#[prost(message, repeated, tag = "3")] #[prost(message, repeated, tag = "3")]
pub imfhefkhano: ::prost::alloc::vec::Vec<Ckndhmekhfm>, pub imfhefkhano: ::prost::alloc::vec::Vec<Ckndhmekhfm>,
} }
@ -17052,7 +17052,7 @@ pub struct Fkibbohbdin {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct BuddySync { pub struct Onacbnhpicf {
#[prost(uint32, repeated, tag = "1")] #[prost(uint32, repeated, tag = "1")]
pub kghfhlopgjb: ::prost::alloc::vec::Vec<u32>, pub kghfhlopgjb: ::prost::alloc::vec::Vec<u32>,
#[prost(uint32, repeated, tag = "9")] #[prost(uint32, repeated, tag = "9")]
@ -17066,7 +17066,7 @@ pub struct BuddySync {
#[prost(uint32, tag = "3")] #[prost(uint32, tag = "3")]
pub lpfeinagkha: u32, pub lpfeinagkha: u32,
#[prost(message, repeated, tag = "2")] #[prost(message, repeated, tag = "2")]
pub buddy_list: ::prost::alloc::vec::Vec<BuddyInfo>, pub lmailahlomk: ::prost::alloc::vec::Vec<BuddyInfo>,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -17266,7 +17266,7 @@ pub struct Ilehibpgief {
pub struct Fjppbkgebcl { pub struct Fjppbkgebcl {
#[xor(7354)] #[xor(7354)]
#[prost(uint32, tag = "8")] #[prost(uint32, tag = "8")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -20840,7 +20840,7 @@ pub struct Ghgbhljlmde {
pub bikhplpcalp: ::std::collections::HashMap<u32, u32>, pub bikhplpcalp: ::std::collections::HashMap<u32, u32>,
#[xor(4986)] #[xor(4986)]
#[prost(uint32, tag = "6")] #[prost(uint32, tag = "6")]
pub buddy_id: u32, pub buddy: u32,
#[xor(1495)] #[xor(1495)]
#[prost(uint32, tag = "5")] #[prost(uint32, tag = "5")]
pub ihgcjhffkdf: u32, pub ihgcjhffkdf: u32,
@ -20969,8 +20969,8 @@ pub struct Acobofkfjgj {
pub struct Oidkngmaipi { pub struct Oidkngmaipi {
#[xor(8441)] #[xor(8441)]
#[prost(uint32, tag = "14")] #[prost(uint32, tag = "14")]
pub buddy_id: u32, pub buddy: u32,
#[prost(enumeration = "BuddyTeamType", tag = "7")] #[prost(enumeration = "Hneekphmejf", tag = "7")]
pub ddogpdoomde: i32, pub ddogpdoomde: i32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
@ -21192,7 +21192,7 @@ pub struct Labghjgfhhh {
pub lbmgeignmef: u32, pub lbmgeignmef: u32,
#[xor(13505)] #[xor(13505)]
#[prost(uint32, tag = "4")] #[prost(uint32, tag = "4")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -21227,7 +21227,7 @@ pub struct Gmgoddaldob {
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub pmnjlmekmbc: u32, pub pmnjlmekmbc: u32,
#[prost(uint32, tag = "2")] #[prost(uint32, tag = "2")]
pub buddy_id: u32, pub buddy: u32,
#[prost(bool, tag = "3")] #[prost(bool, tag = "3")]
pub majldghlkab: bool, pub majldghlkab: bool,
#[prost(bytes = "vec", tag = "4")] #[prost(bytes = "vec", tag = "4")]
@ -21748,7 +21748,7 @@ pub struct GetBuddyDataScRsp {
#[prost(uint32, tag = "12")] #[prost(uint32, tag = "12")]
pub lpfeinagkha: u32, pub lpfeinagkha: u32,
#[prost(message, repeated, tag = "5")] #[prost(message, repeated, tag = "5")]
pub buddy_list: ::prost::alloc::vec::Vec<BuddyInfo>, pub lmailahlomk: ::prost::alloc::vec::Vec<BuddyInfo>,
#[prost(uint32, repeated, tag = "10")] #[prost(uint32, repeated, tag = "10")]
pub kghfhlopgjb: ::prost::alloc::vec::Vec<u32>, pub kghfhlopgjb: ::prost::alloc::vec::Vec<u32>,
} }
@ -22137,7 +22137,7 @@ pub struct Kakpeoaekgb {
pub struct Mbchikbhcmp { pub struct Mbchikbhcmp {
#[xor(8473)] #[xor(8473)]
#[prost(uint32, tag = "10")] #[prost(uint32, tag = "10")]
pub buddy_id: u32, pub buddy: u32,
#[prost(bool, tag = "6")] #[prost(bool, tag = "6")]
pub aobemkmdkgo: bool, pub aobemkmdkgo: bool,
#[prost(message, repeated, tag = "14")] #[prost(message, repeated, tag = "14")]
@ -22295,7 +22295,7 @@ pub struct Gacha {
pub gacha_info_list_webview: ::prost::alloc::string::String, pub gacha_info_list_webview: ::prost::alloc::string::String,
#[xor(9009)] #[xor(9009)]
#[prost(uint32, tag = "419")] #[prost(uint32, tag = "419")]
pub chosen_up_item: u32, pub ekjlhhdekka: u32,
#[prost(string, tag = "923")] #[prost(string, tag = "923")]
pub fjohnbicmce: ::prost::alloc::string::String, pub fjohnbicmce: ::prost::alloc::string::String,
#[xor(1379)] #[xor(1379)]
@ -22404,7 +22404,7 @@ pub struct Aecgodfnpao {
pub lbmgeignmef: u32, pub lbmgeignmef: u32,
#[xor(7503)] #[xor(7503)]
#[prost(uint32, tag = "12")] #[prost(uint32, tag = "12")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
@ -22612,7 +22612,7 @@ pub struct Ghojoimpnad {
pub ndcnfidonje: u32, pub ndcnfidonje: u32,
#[xor(8060)] #[xor(8060)]
#[prost(uint32, tag = "2")] #[prost(uint32, tag = "2")]
pub buddy_id: u32, pub buddy: u32,
#[xor(15324)] #[xor(15324)]
#[prost(uint32, tag = "1")] #[prost(uint32, tag = "1")]
pub lbmgeignmef: u32, pub lbmgeignmef: u32,
@ -24257,7 +24257,7 @@ pub struct Enaagloodio {
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ecjcmfjjgdp { pub struct Ecjcmfjjgdp {
#[prost(int32, tag = "1")] #[prost(int32, tag = "1")]
pub buddy_id: i32, pub buddy: i32,
#[prost(int32, repeated, tag = "2")] #[prost(int32, repeated, tag = "2")]
pub jpncidefiba: ::prost::alloc::vec::Vec<i32>, pub jpncidefiba: ::prost::alloc::vec::Vec<i32>,
#[prost(message, optional, tag = "3")] #[prost(message, optional, tag = "3")]
@ -24558,7 +24558,7 @@ pub struct Obpccjhnbpe {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct ChooseGachaUpCsReq { pub struct Pahjnbjogon {
#[xor(3180)] #[xor(3180)]
#[prost(uint32, tag = "6")] #[prost(uint32, tag = "6")]
pub item_id: u32, pub item_id: u32,
@ -25751,7 +25751,7 @@ pub struct DungeonInfo {
#[prost(message, optional, tag = "3")] #[prost(message, optional, tag = "3")]
pub ncfafdpojjh: ::core::option::Option<Kalfjemiaaa>, pub ncfafdpojjh: ::core::option::Option<Kalfjemiaaa>,
#[prost(message, optional, tag = "8")] #[prost(message, optional, tag = "8")]
pub buddy: ::core::option::Option<EquippedBuddyData>, pub kplhefeipee: ::core::option::Option<EquippedBuddyData>,
#[prost(bool, tag = "1724")] #[prost(bool, tag = "1724")]
pub gjhgpapkmod: bool, pub gjhgpapkmod: bool,
#[prost(bool, tag = "1109")] #[prost(bool, tag = "1109")]
@ -25769,7 +25769,7 @@ pub struct DungeonInfo {
#[prost(map = "uint32, int32", tag = "7")] #[prost(map = "uint32, int32", tag = "7")]
pub njfikojmpcm: ::std::collections::HashMap<u32, i32>, pub njfikojmpcm: ::std::collections::HashMap<u32, i32>,
#[prost(message, repeated, tag = "1395")] #[prost(message, repeated, tag = "1395")]
pub buddy_list: ::prost::alloc::vec::Vec<EquippedBuddyData>, pub lmailahlomk: ::prost::alloc::vec::Vec<EquippedBuddyData>,
#[prost(message, optional, tag = "2")] #[prost(message, optional, tag = "2")]
pub dungeon_item_data: ::core::option::Option<DungeonItemData>, pub dungeon_item_data: ::core::option::Option<DungeonItemData>,
#[prost(message, optional, tag = "5")] #[prost(message, optional, tag = "5")]
@ -27252,7 +27252,7 @@ pub struct Aicalelcmii {
pub kplhkiofbah: bool, pub kplhkiofbah: bool,
#[xor(3343)] #[xor(3343)]
#[prost(uint32, tag = "7")] #[prost(uint32, tag = "7")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[cmdid(4100)] #[cmdid(4100)]
@ -27531,7 +27531,7 @@ pub struct TipsInfo {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct GachaFreeAgentCsReq { pub struct Ieimfkpmegp {
#[xor(378)] #[xor(378)]
#[prost(uint32, tag = "12")] #[prost(uint32, tag = "12")]
pub gacha_parent_schedule_id: u32, pub gacha_parent_schedule_id: u32,
@ -28678,7 +28678,7 @@ pub struct Bkkmkacnhne {}
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct Dpijpabbknc { pub struct Dpijpabbknc {
#[prost(message, optional, tag = "1")] #[prost(message, optional, tag = "1")]
pub buddy_id: ::core::option::Option<StringEntry>, pub buddy: ::core::option::Option<StringEntry>,
#[prost(enumeration = "Afnpekehlge", tag = "2")] #[prost(enumeration = "Afnpekehlge", tag = "2")]
pub ddogpdoomde: i32, pub ddogpdoomde: i32,
} }
@ -29634,7 +29634,7 @@ pub struct Jlgmobeofhe {
pub jipabmjagbi: u32, pub jipabmjagbi: u32,
#[xor(12923)] #[xor(12923)]
#[prost(uint32, tag = "4")] #[prost(uint32, tag = "4")]
pub buddy_id: u32, pub buddy: u32,
#[xor(11558)] #[xor(11558)]
#[prost(uint32, tag = "14")] #[prost(uint32, tag = "14")]
pub pmnjlmekmbc: u32, pub pmnjlmekmbc: u32,
@ -30207,7 +30207,7 @@ pub struct Dlenhbdpddl {
#[prost(uint32, tag = "5")] #[prost(uint32, tag = "5")]
pub uid: u32, pub uid: u32,
#[prost(message, repeated, tag = "7")] #[prost(message, repeated, tag = "7")]
pub buddy_list: ::prost::alloc::vec::Vec<Fjppbkgebcl>, pub lmailahlomk: ::prost::alloc::vec::Vec<Fjppbkgebcl>,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[cmdid(1394)] #[cmdid(1394)]
@ -30566,7 +30566,7 @@ pub struct Jcfdccfejcg {
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct Jaokcopjeip { pub struct Jaokcopjeip {
#[prost(int32, tag = "1")] #[prost(int32, tag = "1")]
pub buddy_id: i32, pub buddy: i32,
#[prost(int64, tag = "2")] #[prost(int64, tag = "2")]
pub cjehpadgajn: i64, pub cjehpadgajn: i64,
#[prost(int32, tag = "3")] #[prost(int32, tag = "3")]
@ -31687,7 +31687,7 @@ pub struct Amhlhmjgcpk {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct GachaFreeAgentScRsp { pub struct Idonpiailid {
#[xor(3883)] #[xor(3883)]
#[prost(int32, tag = "3")] #[prost(int32, tag = "3")]
pub retcode: i32, pub retcode: i32,
@ -32158,7 +32158,7 @@ pub struct Hphfnebchnb {
pub struct Hoeafbihgpd { pub struct Hoeafbihgpd {
#[xor(1739)] #[xor(1739)]
#[prost(uint32, tag = "3")] #[prost(uint32, tag = "3")]
pub buddy_id: u32, pub buddy: u32,
} }
#[derive(proto_gen::CmdID)] #[derive(proto_gen::CmdID)]
#[cmdid(3238)] #[cmdid(3238)]
@ -33225,7 +33225,7 @@ pub struct Gkegfnbpiok {
pub star: u32, pub star: u32,
#[xor(15011)] #[xor(15011)]
#[prost(uint32, tag = "3")] #[prost(uint32, tag = "3")]
pub buddy_id: u32, pub buddy: u32,
#[xor(810)] #[xor(810)]
#[prost(uint32, tag = "5")] #[prost(uint32, tag = "5")]
pub exp: u32, pub exp: u32,
@ -33399,7 +33399,7 @@ pub struct Jcincgmdflc {
pub olcifcglpdd: ::prost::alloc::vec::Vec<u32>, pub olcifcglpdd: ::prost::alloc::vec::Vec<u32>,
#[xor(3275)] #[xor(3275)]
#[prost(uint32, tag = "11")] #[prost(uint32, tag = "11")]
pub buddy_id: u32, pub buddy: u32,
#[xor(10845)] #[xor(10845)]
#[prost(uint32, tag = "13")] #[prost(uint32, tag = "13")]
pub quest_id: u32, pub quest_id: u32,
@ -33777,7 +33777,7 @@ pub struct Jhinopamaoa {
pub avatars: ::prost::alloc::vec::Vec<u32>, pub avatars: ::prost::alloc::vec::Vec<u32>,
#[xor(6842)] #[xor(6842)]
#[prost(uint32, tag = "14")] #[prost(uint32, tag = "14")]
pub buddy_id: u32, pub buddy: u32,
#[prost(uint32, repeated, tag = "3")] #[prost(uint32, repeated, tag = "3")]
pub obpdhglkbgk: ::prost::alloc::vec::Vec<u32>, pub obpdhglkbgk: ::prost::alloc::vec::Vec<u32>,
#[xor(8158)] #[xor(8158)]
@ -34490,7 +34490,7 @@ pub struct Jiflifhgkhk {
pub is_story: bool, pub is_story: bool,
#[xor(7590)] #[xor(7590)]
#[prost(uint32, tag = "5")] #[prost(uint32, tag = "5")]
pub buddy_id: u32, pub buddy: u32,
#[prost(bool, tag = "14")] #[prost(bool, tag = "14")]
pub jcflmpbcojd: bool, pub jcflmpbcojd: bool,
} }
@ -48346,32 +48346,32 @@ impl DungeonContentDropPoolType {
#[derive(proto_gen::XorFields)] #[derive(proto_gen::XorFields)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)] #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)] #[repr(i32)]
pub enum BuddyTeamType { pub enum Hneekphmejf {
None = 0, Jhlmmfkphgb = 0,
Unknown = 1, Kjppindjool = 1,
Fighting = 2, Ehemncmjnkg = 2,
Assisting = 3, Lddkjjhcikb = 3,
} }
impl BuddyTeamType { impl Hneekphmejf {
/// String value of the enum field names used in the ProtoBuf definition. /// String value of the enum field names used in the ProtoBuf definition.
/// ///
/// The values are not transformed in any way and thus are considered stable /// The values are not transformed in any way and thus are considered stable
/// (if the ProtoBuf definition does not change) and safe for programmatic use. /// (if the ProtoBuf definition does not change) and safe for programmatic use.
pub fn as_str_name(&self) -> &'static str { pub fn as_str_name(&self) -> &'static str {
match self { match self {
BuddyTeamType::None => "BUDDY_TEAM_TYPE_NONE", Hneekphmejf::Jhlmmfkphgb => "HNEEKPHMEJF_JHLMMFKPHGB",
BuddyTeamType::Unknown => "BUDDY_TEAM_TYPE_UNKNOWN", Hneekphmejf::Kjppindjool => "HNEEKPHMEJF_KJPPINDJOOL",
BuddyTeamType::Fighting => "BUDDY_TEAM_TYPE_FIGHTING", Hneekphmejf::Ehemncmjnkg => "HNEEKPHMEJF_EHEMNCMJNKG",
BuddyTeamType::Assisting => "BUDDY_TEAM_TYPE_ASSISTING", Hneekphmejf::Lddkjjhcikb => "HNEEKPHMEJF_LDDKJJHCIKB",
} }
} }
/// Creates an enum from field names used in the ProtoBuf definition. /// Creates an enum from field names used in the ProtoBuf definition.
pub fn from_str_name(value: &str) -> ::core::option::Option<Self> { pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
match value { match value {
"BUDDY_TEAM_TYPE_NONE" => Some(Self::None), "HNEEKPHMEJF_JHLMMFKPHGB" => Some(Self::Jhlmmfkphgb),
"BUDDY_TEAM_TYPE_UNKNOWN" => Some(Self::Unknown), "HNEEKPHMEJF_KJPPINDJOOL" => Some(Self::Kjppindjool),
"BUDDY_TEAM_TYPE_FIGHTING" => Some(Self::Fighting), "HNEEKPHMEJF_EHEMNCMJNKG" => Some(Self::Ehemncmjnkg),
"BUDDY_TEAM_TYPE_ASSISTING" => Some(Self::Assisting), "HNEEKPHMEJF_LDDKJJHCIKB" => Some(Self::Lddkjjhcikb),
_ => None, _ => None,
} }
} }

View file

@ -117,7 +117,6 @@ pub struct MainCityModelBin {
#[prost(uint32, tag = "3")] #[prost(uint32, tag = "3")]
pub section_id: u32, pub section_id: u32,
} }
/// The progress record of a specified rarity. All maps' keys are category_guarantee_policy_tag.
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
pub struct GachaProgressBin { pub struct GachaProgressBin {
@ -130,24 +129,12 @@ pub struct GachaProgressBin {
::prost::alloc::string::String, ::prost::alloc::string::String,
u32, u32,
>, >,
/// The selected priority (category) for a Chooseable category. /// The selected priority for a Chooseable category.
#[prost(map = "string, string", tag = "3")] #[prost(map = "string, string", tag = "3")]
pub categories_chosen_guarantee_category_map: ::std::collections::HashMap< pub category_chosen_guarantee_map: ::std::collections::HashMap<
::prost::alloc::string::String, ::prost::alloc::string::String,
::prost::alloc::string::String, ::prost::alloc::string::String,
>, >,
/// The selectedpriority (a specified item) for a Chooseable category.
#[prost(map = "string, uint32", tag = "4")]
pub categories_chosen_guarantee_item_map: ::std::collections::HashMap<
::prost::alloc::string::String,
u32,
>,
/// The failure times for selected priority (a specified item).
#[prost(map = "string, uint32", tag = "5")]
pub categories_chosen_guarantee_progress_map: ::std::collections::HashMap<
::prost::alloc::string::String,
u32,
>,
} }
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
@ -175,8 +162,6 @@ pub struct GachaRecordBin {
pub progress_map: ::std::collections::HashMap<u32, GachaProgressBin>, pub progress_map: ::std::collections::HashMap<u32, GachaProgressBin>,
#[prost(message, optional, tag = "5")] #[prost(message, optional, tag = "5")]
pub extra_item_bin: ::core::option::Option<GachaExtraItemBin>, pub extra_item_bin: ::core::option::Option<GachaExtraItemBin>,
#[prost(enumeration = "GachaAddedItemType", tag = "6")]
pub item_type: i32,
} }
#[allow(clippy::derive_partial_eq_without_eq)] #[allow(clippy::derive_partial_eq_without_eq)]
#[derive(Clone, PartialEq, ::prost::Message)] #[derive(Clone, PartialEq, ::prost::Message)]
@ -219,35 +204,3 @@ pub struct PlayerDataBin {
#[prost(message, optional, tag = "6")] #[prost(message, optional, tag = "6")]
pub gacha_model: ::core::option::Option<GachaModelBin>, pub gacha_model: ::core::option::Option<GachaModelBin>,
} }
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum GachaAddedItemType {
None = 0,
Weapon = 1,
Character = 2,
Bangboo = 3,
}
impl GachaAddedItemType {
/// String value of the enum field names used in the ProtoBuf definition.
///
/// The values are not transformed in any way and thus are considered stable
/// (if the ProtoBuf definition does not change) and safe for programmatic use.
pub fn as_str_name(&self) -> &'static str {
match self {
GachaAddedItemType::None => "GACHA_ADDED_ITEM_TYPE_NONE",
GachaAddedItemType::Weapon => "GACHA_ADDED_ITEM_TYPE_WEAPON",
GachaAddedItemType::Character => "GACHA_ADDED_ITEM_TYPE_CHARACTER",
GachaAddedItemType::Bangboo => "GACHA_ADDED_ITEM_TYPE_BANGBOO",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
match value {
"GACHA_ADDED_ITEM_TYPE_NONE" => Some(Self::None),
"GACHA_ADDED_ITEM_TYPE_WEAPON" => Some(Self::Weapon),
"GACHA_ADDED_ITEM_TYPE_CHARACTER" => Some(Self::Character),
"GACHA_ADDED_ITEM_TYPE_BANGBOO" => Some(Self::Bangboo),
_ => None,
}
}
}