diff --git a/src/router/lottery/mod.rs b/src/router/lottery/mod.rs index d98256f..f9f7feb 100644 --- a/src/router/lottery/mod.rs +++ b/src/router/lottery/mod.rs @@ -102,33 +102,49 @@ fn get_card(lottery_id: String, lottery_number: String) -> JsonValue { CARDS[lottery_id][lottery_number].clone() } -fn get_random_cards(id: i64, count: usize) -> JsonValue { - let total_ratio: i64 = RARITY[id.to_string()].members().into_iter().map(|item| item["ratio"].as_i64().unwrap()).sum(); +fn get_random_card(item: &JsonValue, rv: &mut JsonValue, rng: &mut rand::rngs::ThreadRng) { + let lottery_id = item["masterLotteryItemId"].as_i64().unwrap(); + + let mut random_id = 0; + while random_id == 0 { + let card = rng.gen_range(1..POOL[lottery_id.to_string()][POOL[lottery_id.to_string()].len() - 1].as_i64().unwrap() + 1); + if !get_card_master_id(lottery_id.to_string(), card.to_string()).is_none() { + random_id = card; + break; + } + } + let to_push = object!{ + "id": get_card_master_id(lottery_id.to_string(), random_id.to_string()).unwrap(), + "master_card_id": get_card_master_id(lottery_id.to_string(), random_id.to_string()).unwrap(), + "master_lottery_item_id": lottery_id, + "master_lottery_item_number": random_id + }; + rv.push(to_push).unwrap(); +} + +fn get_random_cards(id: i64, mut count: usize) -> JsonValue { + let total_ratio: i64 = RARITY[id.to_string()].members().into_iter().map(|item| if item["ensured"].as_i32().unwrap() == 1 { 0 } else { item["ratio"].as_i64().unwrap() }).sum(); let mut rng = rand::thread_rng(); let mut rv = array![]; + let mut promised = false; + + for (_i, item) in RARITY[id.to_string()].members().enumerate() { + if item["ensured"].as_i32().unwrap() == 1 { + get_random_card(&item, &mut rv, &mut rng); + promised = true; + break; + } + } + if promised { + count -= 1; + } for _i in 0..count { let random_number: i64 = rng.gen_range(1..total_ratio + 1); let mut cumulative_ratio = 0; for (_i, item) in RARITY[id.to_string()].members().enumerate() { cumulative_ratio += item["ratio"].as_i64().unwrap(); if random_number <= cumulative_ratio { - let lottery_id = item["masterLotteryItemId"].as_i64().unwrap(); - - let mut random_id = 0; - while random_id == 0 { - let card = rng.gen_range(1..POOL[lottery_id.to_string()][POOL[lottery_id.to_string()].len() - 1].as_i64().unwrap() + 1); - if !get_card_master_id(lottery_id.to_string(), card.to_string()).is_none() { - random_id = card; - break; - } - } - let to_push = object!{ - "id": get_card_master_id(lottery_id.to_string(), random_id.to_string()).unwrap(), - "master_card_id": get_card_master_id(lottery_id.to_string(), random_id.to_string()).unwrap(), - "master_lottery_item_id": lottery_id, - "master_lottery_item_number": random_id - }; - rv.push(to_push).unwrap(); + get_random_card(&item, &mut rv, &mut rng); break; } } @@ -156,31 +172,17 @@ pub fn lottery_post(req: HttpRequest, body: String) -> HttpResponse { let mut missions = userdata::get_acc_missions(&key); let mut cleared_missions = array![]; - let mut cardstogive; - let lottery_id = body["master_lottery_id"].as_i64().unwrap(); - if user["tutorial_step"].as_i32().unwrap() != 130 { - cardstogive = get_random_cards(body["master_lottery_id"].as_i64().unwrap(), 9); - let item_id = (body["master_lottery_id"].to_string().parse::().unwrap() * 100) + 1; - //tutorial - let new_card = object!{ - "master_card_id": get_card_master_id(item_id.to_string(), String::from("1")).unwrap(), - "master_lottery_item_id": item_id, - "master_lottery_item_number": 1 - }; - cardstogive.push(new_card).unwrap(); - } else { - let price = PRICE[lottery_id.to_string()][body["master_lottery_price_number"].to_string()].clone(); - - if price["consumeType"].as_i32().unwrap() == 1 { - items::remove_gems(&mut user, price["price"].as_i64().unwrap()); - } else if price["consumeType"].as_i32().unwrap() == 4 { - items::use_item(price["masterItemId"].as_i64().unwrap(), price["price"].as_i64().unwrap(), &mut user); - } - - cardstogive = get_random_cards(lottery_id, price["count"].as_usize().unwrap()); + let price = PRICE[lottery_id.to_string()][body["master_lottery_price_number"].to_string()].clone(); + + if price["consumeType"].as_i32().unwrap() == 1 { + items::remove_gems(&mut user, price["price"].as_i64().unwrap()); + } else if price["consumeType"].as_i32().unwrap() == 4 { + items::use_item(price["masterItemId"].as_i64().unwrap(), price["price"].as_i64().unwrap(), &mut user); } + let cardstogive = get_random_cards(lottery_id, price["count"].as_usize().unwrap()); + let lottery_type = LOTTERY[lottery_id.to_string()]["category"].as_i32().unwrap(); let mut new_cards = array![]; diff --git a/src/router/user.rs b/src/router/user.rs index d2c6eaf..8ad0852 100644 --- a/src/router/user.rs +++ b/src/router/user.rs @@ -416,18 +416,23 @@ pub fn initialize(req: HttpRequest, body: String) -> HttpResponse { let mut user = userdata::get_acc(&key); let mut user2 = userdata::get_acc_home(&key); let mut missions = userdata::get_acc_missions(&key); - let ur = user["card_list"][user["card_list"].len() - 1]["master_card_id"].clone(); + let mut chats = userdata::get_acc_chats(&key); + let id = body["master_character_id"].as_i64().unwrap(); - let id = ur.as_i32().unwrap(); //todo - user["user"]["favorite_master_card_id"] = id.into(); - user["user"]["guest_smile_master_card_id"] = id.into(); - user["user"]["guest_cool_master_card_id"] = id.into(); - user["user"]["guest_pure_master_card_id"] = id.into(); - user2["home"]["preset_setting"][0]["illust_master_card_id"] = id.into(); + crate::router::chat::add_chat(id, 1, &mut chats); + + let id = id.to_string(); + + let ur = user["card_list"][0]["master_card_id"].as_i64().unwrap(); + + user["user"]["favorite_master_card_id"] = ur.into(); + user["user"]["guest_smile_master_card_id"] = ur.into(); + user["user"]["guest_cool_master_card_id"] = ur.into(); + user["user"]["guest_pure_master_card_id"] = ur.into(); + user2["home"]["preset_setting"][0]["illust_master_card_id"] = ur.into(); user["gem"]["free"] = (3000).into(); user["gem"]["total"] = (3000).into(); - let id = body["master_character_id"].to_string(); let userr = &id[id.len() - 2..].parse::().unwrap(); let cardstoreward: JsonValue; @@ -459,9 +464,10 @@ pub fn initialize(req: HttpRequest, body: String) -> HttpResponse { } } //todo - should the chosen character be in the team twice? - user["deck_list"][0]["main_card_ids"][4] = ur; + user["deck_list"][0]["main_card_ids"][4] = ur.into(); userdata::save_acc(&key, user.clone()); + userdata::save_acc_chats(&key, chats); userdata::save_acc_home(&key, user2); userdata::save_acc_missions(&key, missions);