diff --git a/src/router/card.rs b/src/router/card.rs index 6a892ea..2fd472c 100644 --- a/src/router/card.rs +++ b/src/router/card.rs @@ -13,6 +13,39 @@ pub fn routes(cfg: &mut web::ServiceConfig) { ); } +fn exp_cap(master_card_id: i64, evolved: bool) -> i64 { + let card = &databases::CARD_LIST[master_card_id.to_string()]; + let rarity = card["rarity"].to_string(); + let curve = card["masterCardLevelId"].as_i64().unwrap_or(0); + let max_level = if evolved { + databases::CARD_EVOLVE[&rarity]["maxLevel"].as_i64().unwrap_or(0) + } else { + databases::CARD_RARITY[&rarity]["maxLevel"].as_i64().unwrap_or(0) + }; + databases::CARD_LEVEL[format!("{}_{}", curve, max_level)].as_i64().unwrap_or(i64::MAX) +} + +fn skill_exp_cap(master_card_id: i64) -> i64 { + let card = &databases::CARD_LIST[master_card_id.to_string()]; + let rarity = card["rarity"].to_string(); + let skill_curve = databases::CARD_RARITY[&rarity]["masterCardSkillLevelId"].to_string(); + databases::CARD_SKILL_MAX[skill_curve].as_i64().unwrap_or(i64::MAX) +} + +fn material_item_list(user: &JsonValue, body: &JsonValue) -> JsonValue { + let mut rv = array![]; + for mat in body["material_item_list"].members() { + let mid = mat["master_item_id"].as_i64(); + for it in user["item_list"].members() { + if it["master_item_id"].as_i64() == mid { + rv.push(it.clone()).unwrap(); + break; + } + } + } + rv +} + // Chats will only ever be used when evolving fn do_reinforce(user: &mut JsonValue, body: &JsonValue, exp_id: &str, money_multiplier: i64, evolve: bool, missions: &mut JsonValue, chats: &mut JsonValue, clear_mission_ids: &mut JsonValue) -> JsonValue { for (i, data) in user["card_list"].members().enumerate() { @@ -37,6 +70,18 @@ fn do_reinforce(user: &mut JsonValue, body: &JsonValue, exp_id: &str, money_mult } } + if exp_id == "exp" { + let cap = exp_cap(card["master_card_id"].as_i64().unwrap(), !card["evolve"].is_empty()); + if card["exp"].as_i64().unwrap() > cap { + card["exp"] = cap.into(); + } + } else if exp_id == "skill_exp" { + let cap = skill_exp_cap(card["master_card_id"].as_i64().unwrap()); + if card["skill_exp"].as_i64().unwrap() > cap { + card["skill_exp"] = cap.into(); + } + } + user["card_list"][i] = card.clone(); for data in user["point_list"].members_mut() { @@ -68,12 +113,12 @@ async fn reinforce(req: HttpRequest, body: String) -> impl Responder { let mut clear_mission_ids = array![]; let card = do_reinforce(&mut user, &body, "exp", 1, false, &mut array![], &mut array![], &mut clear_mission_ids); - + userdata::save_acc(&key, user.clone()); - + global::api(&req, Some(object!{ card: card, - item_list: user["item_list"].clone(), + item_list: material_item_list(&user, &body), point_list: user["point_list"].clone(), clear_mission_ids: clear_mission_ids })) @@ -86,12 +131,12 @@ async fn skill_reinforce(req: HttpRequest, body: String) -> impl Responder { let mut clear_mission_ids = array![]; let card = do_reinforce(&mut user, &body, "skill_exp", 10, false, &mut array![], &mut array![], &mut clear_mission_ids); - + userdata::save_acc(&key, user.clone()); - + global::api(&req, Some(object!{ card: card, - item_list: user["item_list"].clone(), + item_list: material_item_list(&user, &body), point_list: user["point_list"].clone(), clear_mission_ids: clear_mission_ids })) @@ -110,11 +155,13 @@ async fn evolve(req: HttpRequest, body: String) -> impl Responder { userdata::save_acc(&key, user.clone()); userdata::save_acc_chats(&key, chats); userdata::save_acc_missions(&key, missions); - + global::api(&req, Some(object!{ card: card, - item_list: user["item_list"].clone(), + item_list: material_item_list(&user, &body), point_list: user["point_list"].clone(), - clear_mission_ids: clear_mission_ids + clear_mission_ids: clear_mission_ids, + gift_list: array![], + updated_value_list: array![] })) } diff --git a/src/router/databases/mod.rs b/src/router/databases/mod.rs index cd8826c..11067d9 100644 --- a/src/router/databases/mod.rs +++ b/src/router/databases/mod.rs @@ -246,4 +246,28 @@ lazy_static! { } info }; + + pub static ref CARD_RARITY: JsonValue = index_by(&t("card_rarity"), "rarity"); + + pub static ref CARD_EVOLVE: JsonValue = index_by(&t("card_evolve"), "rarity"); + + pub static ref CARD_LEVEL: JsonValue = { + let mut info = object! {}; + for data in t("card_level").members() { + info[format!("{}_{}", data["id"], data["level"])] = data["exp"].clone(); + } + info + }; + + pub static ref CARD_SKILL_MAX: JsonValue = { + let mut info = object! {}; + for data in t("card_skill_level").members() { + let id = data["id"].to_string(); + let exp = data["exp"].as_i64().unwrap_or(0); + if exp > info[&id].as_i64().unwrap_or(0) { + info[id] = exp.into(); + } + } + info + }; }