1
0
mirror of https://git.ngram.ca/OpenJam/rc-servers synced 2026-08-23 23:08:52 +00:00

Save CRF rating garage state and consider CRF purchase price #70

This commit is contained in:
NG (Graham)
2026-01-04 16:04:30 -05:00
parent 0e68730996
commit 901bf76e19
8 changed files with 142 additions and 58 deletions

View File

@@ -4,8 +4,8 @@ use oj_rc_factory::VehicleFactoryAdapter;
const CODE: u8 = 166;
const SLOT_PARAM_KEY: u8 = 43; // in; int
//const FREE_CURRENCY_COST_PARAM_KEY: u8 = 5; // in; int
//const PREMIUM_CURRENCY_COST_PARAM_KEY: u8 = 6; // in; int
const FREE_CURRENCY_COST_PARAM_KEY: u8 = 5; // in; int
const PAID_CURRENCY_COST_PARAM_KEY: u8 = 6; // in; int
const FACTORY_ID_PARAM_KEY: u8 = 94; // in; int
@@ -19,32 +19,44 @@ async fn do_handling(params: ParameterTable<()>, user: &crate::UserTy, factory:
user_info.new_slot(None).await?.slot_i
};
if let Some(Typed::Int(factory_id)) = params.remove(&FACTORY_ID_PARAM_KEY) {
// TODO charge for robot?
let vehicle = factory.vehicle(factory_id as _).await.map_err(|e| {
log::error!("Failed to retrieve vehicle {} (for copy-construct) from factory: {}", factory_id, e);
oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16
})?;
if let Some((vehicle_to_copy, vehicle_meta)) = vehicle {
// parse cube data for weapon order
let mut cursor = std::io::Cursor::new(&vehicle_to_copy.cube_data);
let weapons = weapon_order.guess_weapons(&mut cursor);
// save to database
let to_save = oj_rc_core::persist::user::VehicleData {
name: Some(vehicle_meta.name),
slot,
robot_data: vehicle_to_copy.cube_data,
colour_data: vehicle_to_copy.colour_data,
weapon_order: weapons,
crf_id: Some(factory_id),
};
user_info.save_slot(to_save, cpu_counter).await?;
} else {
log::warn!("Failed to retrieve (for copy-construct) non-existent factory vehicle {}", factory_id);
return Err(oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16);
if let Some(Typed::Int(free_cost)) = params.remove(&FREE_CURRENCY_COST_PARAM_KEY) {
if free_cost < 0 {
return Err(oj_rc_core::data::error_codes::WebServicesError::NotEnoughMoney as i16);
}
if let Some(Typed::Int(paid_cost)) = params.remove(&PAID_CURRENCY_COST_PARAM_KEY) {
if paid_cost < 0 {
return Err(oj_rc_core::data::error_codes::WebServicesError::NotEnoughMoney as i16);
}
let vehicle = factory.vehicle(factory_id as _).await.map_err(|e| {
log::error!("Failed to retrieve vehicle {} (for copy-construct) from factory: {}", factory_id, e);
oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16
})?;
if let Some((vehicle_to_copy, vehicle_meta)) = vehicle {
// parse cube data for weapon order
let mut cursor = std::io::Cursor::new(&vehicle_to_copy.cube_data);
let weapons = weapon_order.guess_weapons(&mut cursor);
// save to database
let to_save = oj_rc_core::persist::user::VehicleData {
name: Some(vehicle_meta.name),
slot,
robot_data: vehicle_to_copy.cube_data,
colour_data: vehicle_to_copy.colour_data,
weapon_order: weapons,
crf_id: Some(factory_id),
was_rated: Some(false),
};
user_info.save_slot(to_save, cpu_counter).await?;
user_info.currency_debit(oj_rc_core::persist::user::CurrencyType::Free, free_cost as _).await?;
if paid_cost > 0 {
user_info.currency_debit(oj_rc_core::persist::user::CurrencyType::Paid, paid_cost as _).await?;
}
} else {
log::warn!("Failed to retrieve (for copy-construct) non-existent factory vehicle {}", factory_id);
return Err(oj_rc_core::data::error_codes::WebServicesError::DatabaseError as i16);
}
}
}
}
Ok(params.into())
}

View File

@@ -81,6 +81,7 @@ async fn do_save(params: ParameterTable<()>, user: &crate::UserTy, cpu_counter:
colour_data: colour_data.vec,
weapon_order: weapon_order_filtered,
crf_id: None,
was_rated: None,
};
user_info.save_slot(vehicle_data, cpu_counter).await?;
let mut params_out = std::collections::HashMap::with_capacity(1);