Compare commits
9 Commits
master
...
andy/updat
Author | SHA1 | Date | |
---|---|---|---|
7e8a3174da | |||
5ba61cf461 | |||
1d9787402c | |||
bca78c0611 | |||
647bba57da | |||
1e5bbb51ff | |||
ba0a6cf327 | |||
226577f91a | |||
23a3d1212e |
@ -12,7 +12,5 @@ fn main() {
|
||||
elseware::common::mainloop::run_server(patch_state, patch_config.port).await;
|
||||
});
|
||||
|
||||
async_std::task::block_on(async move {
|
||||
patch_loop.await
|
||||
});
|
||||
async_std::task::block_on(patch_loop);
|
||||
}
|
||||
|
@ -220,12 +220,8 @@ where
|
||||
let mut buf = [0u8; 1];
|
||||
loop {
|
||||
let peek = socket.peek(&mut buf).await;
|
||||
match peek {
|
||||
Ok(len) if len == 0 => {
|
||||
break
|
||||
},
|
||||
_ => {
|
||||
}
|
||||
if let Ok(0) = peek {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1029,10 +1029,30 @@ impl Mag {
|
||||
MAG_STATS.get(&self.mag).map(|stats| {
|
||||
MAG_FEEDING_TABLES.get(stats.feed_table).map(|feeding_table| {
|
||||
feeding_table.get(&tool).map(|feed_stats| {
|
||||
self.def = std::cmp::max(std::cmp::max((self.def as i16) + feed_stats.def, 0) as u16, self.def()*100);
|
||||
self.pow = std::cmp::max(std::cmp::max((self.pow as i16) + feed_stats.pow, 0) as u16, self.pow()*100);
|
||||
self.dex = std::cmp::max(std::cmp::max((self.dex as i16) + feed_stats.dex, 0) as u16, self.dex()*100);
|
||||
self.mnd = std::cmp::max(std::cmp::max((self.mnd as i16) + feed_stats.mnd, 0) as u16, self.mind()*100);
|
||||
self.def = {
|
||||
if (self.def as i16 + feed_stats.def) < ((self.def()*100) as i16) {
|
||||
self.def
|
||||
} else {
|
||||
std::cmp::max(std::cmp::max((self.def as i16) + feed_stats.def, 0) as u16, self.def()*100)
|
||||
}};
|
||||
self.pow = {
|
||||
if (self.pow as i16 + feed_stats.pow) < ((self.pow()*100) as i16) {
|
||||
self.pow
|
||||
} else {
|
||||
std::cmp::max(std::cmp::max((self.pow as i16) + feed_stats.pow, 0) as u16, self.pow()*100)
|
||||
}};
|
||||
self.dex = {
|
||||
if (self.dex as i16 + feed_stats.dex) < ((self.dex()*100) as i16) {
|
||||
self.dex
|
||||
} else {
|
||||
std::cmp::max(std::cmp::max((self.dex as i16) + feed_stats.dex, 0) as u16, self.dex()*100)
|
||||
}};
|
||||
self.mnd = {
|
||||
if (self.mnd as i16 + feed_stats.mnd) < ((self.mind()*100) as i16) {
|
||||
self.mnd
|
||||
} else {
|
||||
std::cmp::max(std::cmp::max((self.mnd as i16) + feed_stats.mnd, 0) as u16, self.mind()*100)
|
||||
}};
|
||||
self.iq = std::cmp::min(((self.iq as i16) + feed_stats.iq as i16) as u8, 200);
|
||||
self.synchro = std::cmp::min(((self.synchro as i8) + feed_stats.syn) as u8, 120);
|
||||
})
|
||||
@ -1188,7 +1208,7 @@ mod test {
|
||||
f.read_to_string(&mut s).unwrap();
|
||||
|
||||
let mut feed: HashMap<String, Vec<HashMap<String, MagFeedTable>>> = toml::from_str(&s).unwrap();
|
||||
let feed = feed.remove("feedtable".into()).unwrap();
|
||||
let feed = feed.remove("feedtable").unwrap();
|
||||
let _feed = feed.into_iter()
|
||||
.map(|table| {
|
||||
table.into_iter()
|
||||
@ -1219,7 +1239,7 @@ mod test {
|
||||
}
|
||||
assert!(mag == Mag {
|
||||
mag: MagType::Sato,
|
||||
def: 507,
|
||||
def: 509,
|
||||
pow: 5019,
|
||||
dex: 4505,
|
||||
mnd: 0,
|
||||
|
@ -1,12 +1,11 @@
|
||||
#![allow(clippy::type_complexity)]
|
||||
#![allow(incomplete_features)]
|
||||
#![feature(inline_const)]
|
||||
#![feature(drain_filter)]
|
||||
#![feature(extract_if)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(once_cell)]
|
||||
#![feature(test)]
|
||||
#![feature(error_generic_member_access)]
|
||||
#![feature(provide_any)]
|
||||
#![feature(lazy_cell)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
|
@ -484,7 +484,7 @@ impl<EG: EntityGateway + Clone> CharacterServerState<EG> {
|
||||
async fn set_flag(&mut self, id: ClientId, setflag: &SetFlag) -> Result<std::option::IntoIter<SendCharacterPacket>, anyhow::Error> {
|
||||
let mut client = self.clients.write().await;
|
||||
let client = client.get_mut(&id).ok_or_else(|| CharacterError::ClientNotFound(id))?;
|
||||
let mut user = client.user.as_mut().unwrap();
|
||||
let user = client.user.as_mut().unwrap();
|
||||
user.flags = setflag.flags;
|
||||
self.entity_gateway.save_user(user).await.unwrap();
|
||||
Ok(None.into_iter())
|
||||
@ -515,7 +515,7 @@ impl<EG: EntityGateway + Clone> CharacterServerState<EG> {
|
||||
async fn character_preview(&mut self, id: ClientId, preview: &CharacterPreview) -> Result<Vec<SendCharacterPacket>, anyhow::Error> {
|
||||
let mut client = self.clients.write().await;
|
||||
let client = client.get_mut(&id).ok_or_else(|| CharacterError::ClientNotFound(id))?;
|
||||
let mut user = client.user.as_mut().unwrap();
|
||||
let user = client.user.as_mut().unwrap();
|
||||
if user.flags == USERFLAG_NEWCHAR {
|
||||
new_character(&mut self.entity_gateway, user, preview).await?
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ impl BoxDropTable {
|
||||
fn random_box_drop<R: Rng>(&self, map_area: &MapArea, rng: &mut R) -> Option<ItemDropType> {
|
||||
self.rare_drop(map_area, rng).or_else(|| {
|
||||
let rate = self.box_rates.rates_by_area(map_area);
|
||||
let type_weights = WeightedIndex::new(&[rate.weapon_rate, rate.armor_rate, rate.shield_rate, rate.unit_rate,
|
||||
let type_weights = WeightedIndex::new([rate.weapon_rate, rate.armor_rate, rate.shield_rate, rate.unit_rate,
|
||||
rate.tool_rate, rate.meseta_rate, rate.nothing_rate]).unwrap();
|
||||
let btype = type_weights.sample(rng);
|
||||
match btype {
|
||||
|
@ -46,7 +46,7 @@ impl GenericArmorTable {
|
||||
}
|
||||
|
||||
fn armor_type<R: Rng>(&self, area_map: &MapArea, rng: &mut R) -> ArmorType {
|
||||
let rank_weights = WeightedIndex::new(&[self.rank_rates.rank0, self.rank_rates.rank1, self.rank_rates.rank2,
|
||||
let rank_weights = WeightedIndex::new([self.rank_rates.rank0, self.rank_rates.rank1, self.rank_rates.rank2,
|
||||
self.rank_rates.rank3, self.rank_rates.rank4]).unwrap();
|
||||
let rank = rank_weights.sample(rng) as i32;
|
||||
let armor_level = std::cmp::max(0i32, self.armor_set as i32 - 3i32 + rank + area_map.drop_area_value().unwrap_or(0) as i32);
|
||||
@ -80,7 +80,7 @@ impl GenericArmorTable {
|
||||
}
|
||||
|
||||
pub fn slots<R: Rng>(&self, _area_map: &MapArea, rng: &mut R) -> usize {
|
||||
let slot_weights = WeightedIndex::new(&[self.slot_rates.slot0, self.slot_rates.slot1, self.slot_rates.slot2,
|
||||
let slot_weights = WeightedIndex::new([self.slot_rates.slot0, self.slot_rates.slot1, self.slot_rates.slot2,
|
||||
self.slot_rates.slot3, self.slot_rates.slot4]).unwrap();
|
||||
slot_weights.sample(rng)
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ impl GenericShieldTable {
|
||||
}
|
||||
|
||||
fn shield_type<R: Rng>(&self, area_map: &MapArea, rng: &mut R) -> ShieldType {
|
||||
let rank_weights = WeightedIndex::new(&[self.rank_rates.rank0, self.rank_rates.rank1, self.rank_rates.rank2,
|
||||
let rank_weights = WeightedIndex::new([self.rank_rates.rank0, self.rank_rates.rank1, self.rank_rates.rank2,
|
||||
self.rank_rates.rank3, self.rank_rates.rank4]).unwrap();
|
||||
let rank = rank_weights.sample(rng) as i32;
|
||||
let shield_level = std::cmp::max(0i32, self.shield_set as i32 - 3i32 + rank + area_map.drop_area_value().unwrap_or(0) as i32);
|
||||
|
@ -240,7 +240,7 @@ impl AttributeTable {
|
||||
|
||||
|
||||
fn generate_attribute<R: Rng>(&self, pattern: &PercentPatternType, rates: &AttributeRate, rng: &mut R) -> Option<WeaponAttribute> {
|
||||
let attribute_weights = WeightedIndex::new(&[rates.none, rates.native, rates.abeast, rates.machine, rates.dark, rates.hit]).unwrap();
|
||||
let attribute_weights = WeightedIndex::new([rates.none, rates.native, rates.abeast, rates.machine, rates.dark, rates.hit]).unwrap();
|
||||
let attr = match attribute_weights.sample(rng) {
|
||||
0 => return None,
|
||||
1 => Attribute::Native,
|
||||
@ -253,7 +253,7 @@ impl AttributeTable {
|
||||
|
||||
let percents = self.percent_rates.get_by_pattern(pattern);
|
||||
|
||||
let value_weights = WeightedIndex::new(&percents.as_array()).unwrap();
|
||||
let value_weights = WeightedIndex::new(percents.as_array()).unwrap();
|
||||
let value = value_weights.sample(rng);
|
||||
let percent = ((value + 1) * 5) as i8;
|
||||
|
||||
@ -477,7 +477,7 @@ impl GenericWeaponTable {
|
||||
let pattern = std::cmp::min(area % ratio.inc, 3);
|
||||
|
||||
let weights = self.grind_rates.grind_rate[pattern as usize];
|
||||
let grind_choice = WeightedIndex::new(&weights).unwrap();
|
||||
let grind_choice = WeightedIndex::new(weights).unwrap();
|
||||
grind_choice.sample(rng)
|
||||
}
|
||||
|
||||
|
@ -226,7 +226,7 @@ pub async fn liberta_kit<EG: EntityGateway>(entity_gateway: &mut EG, used_cell:
|
||||
|
||||
fn jack_o_lantern() -> Result<Vec<ApplyItemAction>, anyhow::Error>
|
||||
{
|
||||
let mag_rate = WeightedIndex::new(&[13, 13, 13, 13, 12, 12, 12, 12]).unwrap();
|
||||
let mag_rate = WeightedIndex::new([13, 13, 13, 13, 12, 12, 12, 12]).unwrap();
|
||||
let mag_type = match mag_rate.sample(&mut rand_chacha::ChaChaRng::from_entropy()) {
|
||||
0 => ToolType::CellOfMag502,
|
||||
1 => ToolType::CellOfMag213,
|
||||
|
@ -323,6 +323,7 @@ impl std::cmp::PartialEq for BankItemDetail {
|
||||
|
||||
impl std::cmp::Eq for BankItemDetail {}
|
||||
|
||||
#[allow(clippy::non_canonical_partial_ord_impl)]
|
||||
impl std::cmp::PartialOrd for BankItemDetail {
|
||||
fn partial_cmp(&self, other: &BankItemDetail) -> Option<std::cmp::Ordering> {
|
||||
let mut self_bytes = [0u8; 4];
|
||||
@ -360,6 +361,7 @@ impl std::cmp::PartialEq for BankItem {
|
||||
|
||||
impl std::cmp::Eq for BankItem {}
|
||||
|
||||
#[allow(clippy::non_canonical_partial_ord_impl)]
|
||||
impl std::cmp::PartialOrd for BankItem {
|
||||
fn partial_cmp(&self, other: &BankItem) -> Option<std::cmp::Ordering> {
|
||||
self.item.partial_cmp(&other.item)
|
||||
|
@ -96,13 +96,13 @@ pub struct FloorState {
|
||||
impl FloorState {
|
||||
pub fn take_item(&mut self, item_id: &ClientItemId) -> Option<FloorItem> {
|
||||
let item = self.local.0
|
||||
.drain_filter(|item| {
|
||||
.extract_if(|item| {
|
||||
item.item_id == *item_id
|
||||
})
|
||||
.next();
|
||||
item.or_else(|| {
|
||||
self.shared.0
|
||||
.drain_filter(|item| {
|
||||
.extract_if(|item| {
|
||||
item.item_id == *item_id
|
||||
})
|
||||
.next()
|
||||
|
@ -9,6 +9,7 @@ use std::convert::TryInto;
|
||||
|
||||
use futures::stream::StreamExt;
|
||||
|
||||
#[allow(clippy::manual_try_fold)]
|
||||
pub async fn join_room(id: ClientId,
|
||||
clients: &Clients,
|
||||
client_location: &ClientLocation,
|
||||
|
@ -342,8 +342,8 @@ impl<R: Rng + SeedableRng> ArmorShop<R> {
|
||||
|
||||
pub fn generate_armor_list(&mut self, character_level: usize) -> Vec<ArmorShopItem> {
|
||||
self.generate_frame_list(character_level).into_iter()
|
||||
.chain(self.generate_barrier_list(character_level).into_iter())
|
||||
.chain(self.generate_unit_list(character_level).into_iter())
|
||||
.chain(self.generate_barrier_list(character_level))
|
||||
.chain(self.generate_unit_list(character_level))
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
@ -36,16 +36,7 @@ impl Ord for ToolShopItem {
|
||||
|
||||
impl PartialOrd for ToolShopItem {
|
||||
fn partial_cmp(&self, other: &ToolShopItem) -> Option<std::cmp::Ordering> {
|
||||
let a = match self {
|
||||
ToolShopItem::Tool(t) => Tool{tool : *t}.as_individual_bytes(),
|
||||
ToolShopItem::Tech(t) => t.as_bytes(),
|
||||
};
|
||||
let b = match other {
|
||||
ToolShopItem::Tool(t) => Tool{tool : *t}.as_individual_bytes(),
|
||||
ToolShopItem::Tech(t) => t.as_bytes(),
|
||||
};
|
||||
|
||||
a.partial_cmp(&b)
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
@ -285,7 +276,7 @@ impl<R: Rng + SeedableRng> ToolShop<R> {
|
||||
pub fn generate_tool_list(&mut self, character_level: usize) -> Vec<ToolShopItem> {
|
||||
let mut tools = Vec::new().into_iter()
|
||||
.chain(self.tools.0.clone().into_iter().map(ToolShopItem::Tool))
|
||||
.chain(self.generate_techs(character_level).into_iter())
|
||||
.chain(self.generate_techs(character_level))
|
||||
.collect::<Vec<_>>();
|
||||
tools.sort();
|
||||
tools
|
||||
|
@ -412,7 +412,7 @@ impl<R: Rng + SeedableRng> WeaponShop<R> {
|
||||
.last()
|
||||
.unwrap();
|
||||
|
||||
let attr_choice = WeightedIndex::new(&[tier.none, tier.native, tier.abeast, tier.machine, tier.dark, tier.hit]).unwrap();
|
||||
let attr_choice = WeightedIndex::new([tier.none, tier.native, tier.abeast, tier.machine, tier.dark, tier.hit]).unwrap();
|
||||
let attr = match attr_choice.sample(&mut self.rng) {
|
||||
0 => return None,
|
||||
1 => Attribute::Native,
|
||||
@ -439,7 +439,7 @@ impl<R: Rng + SeedableRng> WeaponShop<R> {
|
||||
.last()
|
||||
.unwrap();
|
||||
|
||||
let attr_choice = WeightedIndex::new(&[tier.none, tier.native, tier.abeast, tier.machine, tier.dark, tier.hit]).unwrap();
|
||||
let attr_choice = WeightedIndex::new([tier.none, tier.native, tier.abeast, tier.machine, tier.dark, tier.hit]).unwrap();
|
||||
let attr = match attr_choice.sample(&mut self.rng) {
|
||||
0 => return None,
|
||||
1 => Attribute::Native,
|
||||
|
@ -4,7 +4,7 @@ use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::EntityGateway;
|
||||
use elseware::entity::account::{UserAccountEntity, NewUserAccountEntity, NewUserSettingsEntity};
|
||||
use elseware::entity::character::{CharacterEntity, NewCharacterEntity};
|
||||
use elseware::entity::item::{Meseta, BankName, BankIdentifier};
|
||||
use elseware::entity::item::{Meseta, BankIdentifier};
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket};
|
||||
use elseware::ship::room::Difficulty;
|
||||
|
||||
@ -16,7 +16,7 @@ use libpso::{utf8_to_array, utf8_to_utf16_array};
|
||||
|
||||
|
||||
//TODO: remove kb_conf_preset
|
||||
pub async fn new_user_character<EG: EntityGateway + Clone>(entity_gateway: &mut EG, username: &str, password: &str, kb_conf_preset: usize) -> (UserAccountEntity, CharacterEntity) {
|
||||
pub async fn new_user_character<EG: EntityGateway + Clone>(entity_gateway: &mut EG, username: &str, password: &str, _kb_conf_preset: usize) -> (UserAccountEntity, CharacterEntity) {
|
||||
let new_user = NewUserAccountEntity {
|
||||
email: format!("{}@pso.com", username),
|
||||
username: username.into(),
|
||||
|
@ -2,7 +2,7 @@ use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket};
|
||||
|
||||
use libpso::character::settings::{DEFAULT_KEYBOARD_CONFIG1, DEFAULT_KEYBOARD_CONFIG2, DEFAULT_KEYBOARD_CONFIG3, DEFAULT_KEYBOARD_CONFIG4};
|
||||
use libpso::character::settings::{DEFAULT_KEYBOARD_CONFIG1, DEFAULT_KEYBOARD_CONFIG4};
|
||||
use libpso::packet::ship::*;
|
||||
|
||||
#[path = "common.rs"]
|
||||
@ -35,7 +35,7 @@ async fn test_save_options() {
|
||||
async fn test_change_keyboard_mappings() {
|
||||
let mut entity_gateway = InMemoryGateway::default();
|
||||
|
||||
let (user1, char1) = new_user_character(&mut entity_gateway, "a1", "a", 2).await;
|
||||
let (user1, _char1) = new_user_character(&mut entity_gateway, "a1", "a", 2).await;
|
||||
|
||||
let mut ship = Box::new(ShipServerState::builder()
|
||||
.gateway(entity_gateway.clone())
|
||||
|
@ -3,7 +3,6 @@ use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::common::leveltable::CharacterLevelTable;
|
||||
use elseware::ship::ship::{ShipServerState, SendShipPacket, RecvShipPacket};
|
||||
use elseware::ship::monster::MonsterType;
|
||||
use elseware::ship::location::RoomId;
|
||||
use elseware::ship::map::variant::{MapVariant, MapVariantMode};
|
||||
use elseware::ship::map::maps::Maps;
|
||||
use elseware::ship::map::area::MapArea;
|
||||
|
@ -1,11 +1,7 @@
|
||||
use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::entity::character::SectionID;
|
||||
use elseware::common::leveltable::CharacterLevelTable;
|
||||
use elseware::entity::gateway::InMemoryGateway;
|
||||
use elseware::ship::ship::{ShipServerState, SendShipPacket, RecvShipPacket};
|
||||
use elseware::ship::room::{Episode, Difficulty};
|
||||
use elseware::ship::monster::MonsterType;
|
||||
use elseware::ship::location::RoomId;
|
||||
use elseware::ship::drops::{DropTable, MonsterDropStats, MonsterDropType};
|
||||
use elseware::ship::drops::rare_drop_table::{RareDropTable, RareDropRate, RareDropItem};
|
||||
use elseware::ship::map::{Maps, MapVariant, MapArea, MapVariantMode, MapEnemy};
|
||||
|
@ -2,8 +2,6 @@ use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket};
|
||||
use elseware::entity::character::TechLevel;
|
||||
//use elseware::ship::items::{ClientItemId, ActiveItemEntityId, HeldItemType, FloorItemType};
|
||||
|
||||
use libpso::packet::ship::*;
|
||||
use libpso::packet::messages::*;
|
||||
|
@ -1,11 +1,8 @@
|
||||
use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket};
|
||||
use elseware::ship::location::RoomId;
|
||||
|
||||
use libpso::packet::ship::*;
|
||||
//use libpso::packet::messages::*;
|
||||
|
||||
#[path = "common.rs"]
|
||||
mod common;
|
||||
|
@ -1,7 +1,7 @@
|
||||
use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket, ShipError};
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket};
|
||||
use elseware::ship::room::Difficulty;
|
||||
use elseware::ship::items::state::ItemStateError;
|
||||
|
||||
|
@ -2,7 +2,7 @@ use std::convert::TryInto;
|
||||
use elseware::common::serverstate::{ClientId, ServerState};
|
||||
use elseware::entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use elseware::entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket, ShipError};
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket};
|
||||
use elseware::entity::item::{Meseta, ItemEntity};
|
||||
use elseware::ship::packet::handler::trade::TradeError;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user