diff --git a/Difficult_Rocket/__init__.py b/Difficult_Rocket/__init__.py index 8eaa263..9fda9d2 100644 --- a/Difficult_Rocket/__init__.py +++ b/Difficult_Rocket/__init__.py @@ -22,9 +22,9 @@ from Difficult_Rocket.api.types import Options from libs.MCDR.version import Version -game_version = Version("0.7.1.2") # 游戏版本 +game_version = Version("0.7.1.4") # 游戏版本 build_version = Version("1.1.0.0") # 编译文件版本(与游戏本体无关) -DR_rust_version = Version("0.2.5.3") # DR 的 Rust 编写部分的版本 +DR_rust_version = Version("0.2.5.4") # DR 的 Rust 编写部分的版本 Api_version = Version("0.0.0.1") # API 版本 __version__ = game_version diff --git a/libs/Difficult_Rocket_rs/src/src/lib.rs b/libs/Difficult_Rocket_rs/src/src/lib.rs index 5d0de00..540ad8f 100644 --- a/libs/Difficult_Rocket_rs/src/src/lib.rs +++ b/libs/Difficult_Rocket_rs/src/src/lib.rs @@ -16,7 +16,7 @@ use pyo3::prelude::*; #[pyfunction] fn get_version_str() -> String { - return String::from("0.2.5.3"); + return "0.2.5.4".to_string(); } #[pyfunction] diff --git a/libs/Difficult_Rocket_rs/src/src/sr1_data.rs b/libs/Difficult_Rocket_rs/src/src/sr1_data.rs index e945dd9..e8334f9 100644 --- a/libs/Difficult_Rocket_rs/src/src/sr1_data.rs +++ b/libs/Difficult_Rocket_rs/src/src/sr1_data.rs @@ -98,6 +98,20 @@ pub mod part_list { pub points: Vec, } + impl AttachPoints { + pub fn new(attachs: Vec) -> Self { + AttachPoints { points: attachs } + } + + pub fn insert(&mut self, attach: AttachPoint) { + self.points.push(attach); + } + + pub fn unzip(&self) -> Vec { + self.points.clone() + } + } + #[derive(Debug, Serialize, Deserialize, Copy, Clone)] pub struct Damage { pub disconnect: i32, @@ -253,6 +267,8 @@ pub mod part_list { }; let damage = self.damage.unwrap_or(Damage {disconnect: 0, explode: 0, explosion_power: Some(0u32), explosion_size: Some(0u32) }); + let attach_points = if let Some(attach_points) = &self.attach_points { + Some(attach_points.unzip()) } else { None }; SR1PartType { id: self.id.clone(), name: self.name.clone(), @@ -272,9 +288,9 @@ pub mod part_list { drag: self.drag.unwrap_or(0.0), hidden: self.hidden.unwrap_or(false), buoyancy: self.buoyancy.unwrap_or(0.0), - // shape: self.shape.clone().unwrap_or(vec![]), shape: None, damage: damage.to_damage(), + attach_points, attr: part_attr, } } diff --git a/libs/Difficult_Rocket_rs/src/src/types.rs b/libs/Difficult_Rocket_rs/src/src/types.rs index aa41ed3..39e7e31 100644 --- a/libs/Difficult_Rocket_rs/src/src/types.rs +++ b/libs/Difficult_Rocket_rs/src/src/types.rs @@ -8,9 +8,10 @@ pub mod sr1 { - use super::math::{Shape, Point2D}; - use crate::sr1_data::part_list::{RawPartList, RawPartType, SR1PartTypeEnum, Location}; + // use super::math::{Shape, Point2D}; + use crate::sr1_data::part_list::{RawPartList, RawPartType, SR1PartTypeEnum}; use crate::sr1_data::part_list::Damage as RawDamage; + use crate::sr1_data::part_list::{Tank, Engine, Solar, Rcs, Lander, AttachPoint, AttachPoints, Shape as RawShape}; #[inline] pub fn map_ptype_textures(ptype: String) -> String { @@ -63,7 +64,7 @@ pub mod sr1 { pub connections: Option> } - #[derive(Clone)] + #[derive(Copy, Clone)] pub enum SR1PartAttr { Tank { fuel: f64, @@ -87,7 +88,7 @@ pub mod sr1 { consumption: f64, size: f64, }, - Solar { charge_rate: f64, }, + Solar { charge_rate: f64 }, Lander { max_angle: f64, min_length: f64, @@ -162,18 +163,30 @@ pub mod sr1 { // 综合属性 pub damage: Damage, // 部件受损相关属性 - pub shape: Option, + pub shape: Option>, // 部件碰撞箱 + pub attach_points: Option>, + // 部件连接点 pub attr: Option // 部件特殊属性 } - #[derive(Clone)] + #[derive(Debug, Clone)] pub struct SR1PartList { pub types: Vec, pub name: String, } + impl SR1PartList { + pub fn to_raw_part_list(&self) -> RawPartList { + let mut types: Vec = Vec::new(); + for part_type in &self.types { + types.insert(0, part_type.to_raw_part_type()); + } + RawPartList{part_types: types} + } + } + pub trait SR1PartTypeData { fn to_sr_part_type(&self) -> SR1PartType; fn to_raw_part_type(&self) -> RawPartType; @@ -197,10 +210,6 @@ pub mod sr1 { SR1PartList::new(name, types) } - // pub fn part_type_new(part_type: RawPartType) -> Self { - // let mut types: Vec = Vec::new(); - // } - pub fn insert_part(&mut self, part: SR1PartType) -> () { self.types.insert(0, part); } @@ -212,7 +221,43 @@ pub mod sr1 { } fn to_raw_part_type(&self) -> RawPartType { - // let shape = crate::sr1_data::part_list::Shape; + let tank: Option = match &self.attr { + Some(attr) => { + match attr { + SR1PartAttr::Tank {fuel, dry_mass, fuel_type} => { + Some(Tank {fuel: *fuel, dry_mass: *dry_mass, fuel_type: Some(*fuel_type)}) + } _ => None } } _ => None }; + let engine: Option = match &self.attr { + Some(attr) => { + match attr { + SR1PartAttr::Engine {power, consumption, size, turn, fuel_type, throttle_exponential } => { + Some(Engine {power: *power, consumption: *consumption, throttle_exponential: Some(*throttle_exponential), + size: *size, turn: *turn, fuel_type: Some(*fuel_type)}) + } _ => None } } _ => None }; + let rcs: Option = match &self.attr { + Some(attr) => { + match attr { + SR1PartAttr::Rcs {power, consumption, size } => { + Some(Rcs {power: *power, consumption: *consumption, size: *size }) + } _ => None } } _ => None }; + let solar: Option = match &self.attr { + Some(attr) => { + match attr { + SR1PartAttr::Solar {charge_rate } => { + Some(Solar {charge_rate: *charge_rate }) + } _ => None } } _ => None }; + let lander: Option = match &self.attr { + Some(attr) => { + match attr { + SR1PartAttr::Lander {max_angle, min_length, max_length, angle_speed, length_speed, width } => { + Some(Lander {max_angle: *max_angle, min_length: *min_length, max_length: *max_length, + angle_speed: Some(*angle_speed), length_speed: Some(*length_speed), width: *width }) + } _ => None } } _ => None }; + let attach_point: Option = match &self.attach_points { + Some(attach_points) => { + if attach_points.len() > 0 { + Some(AttachPoints::new(attach_points.clone())) + } else { None } } _ => None }; RawPartType { id: self.id.clone(), name: self.name.clone(), @@ -233,14 +278,13 @@ pub mod sr1 { hidden: Some(self.hidden), buoyancy: Some(self.buoyancy), damage: Some(self.damage.to_raw_damage()), - tank: None, - engine: None, - rcs: None, - solar: None, - // shape: Some(self.shape.clone()), - shape: None, + tank, + engine, + rcs, + solar, + shape: self.shape.clone(), attach_points: None, - lander: None, + lander, } } } @@ -250,6 +294,14 @@ pub mod sr1 { #[allow(unused)] pub mod math { + pub trait Rotatable { + // 懒了,直接实现一个协议得了 + #[inline] + fn rotate(&self, angle: f64) -> Self; + #[inline] + fn rotate_radius(&self, radius: f64) -> Self; + } + #[derive(Clone, Copy)] pub struct Point2D { pub x: f64, @@ -258,11 +310,11 @@ pub mod math { impl Point2D { pub fn new(x: f64, y: f64) -> Self { - Point2D{x, y} + Point2D { x, y } } #[inline] - pub fn new_00() -> Self { Point2D { x: 0.0, y :0.0 } } + pub fn new_00() -> Self { Point2D { x: 0.0, y: 0.0 } } #[inline] pub fn distance(&self, other: &Point2D) -> f64 { @@ -275,10 +327,16 @@ pub mod math { pub fn distance_00(&self) -> f64 { self.distance(&Point2D::new(0.0, 0.0)) } + } + + impl Rotatable for Point2D { + #[inline] + fn rotate(&self, angle: f64) -> Self { + self.rotate_radius(angle.to_radians()) + } #[inline] - pub fn rotate_angle(&self, angle: f64) -> Self { - let radius = angle.to_radians(); + fn rotate_radius(&self, radius: f64) -> Self { let sin = radius.sin(); let cos = radius.cos(); let x = self.x * cos - self.y * sin; @@ -287,6 +345,7 @@ pub mod math { } } + #[derive(Clone, Copy)] pub struct CircularArc { pub r: f64, @@ -310,6 +369,16 @@ pub mod math { pub end: Point2D, // end point } + + impl Rotatable for OneTimeLine { + fn rotate(&self, angle: f64) -> Self { + self.rotate_radius(angle.to_radians()) + } + + fn rotate_radius(&self, radius: f64) -> Self { + OneTimeLine::point_new(&self.start.rotate_radius(radius), &self.end.rotate_radius(radius)) + } + } #[derive(Clone, Copy)] pub enum Edge { @@ -322,7 +391,7 @@ pub mod math { pub pos: Point2D, pub angle: f64, // 旋转角度 角度值 - pub bounds: Vec + pub bounds: Vec, } impl Shape { @@ -346,12 +415,12 @@ pub mod math { edges = edges.iter().map(|edge| { match edge { Edge::OneTimeLine(line) => { - let start = line.start.rotate_angle(angle); - let end = line.end.rotate_angle(angle); + let start = line.start.rotate(angle); + let end = line.end.rotate(angle); Edge::OneTimeLine(OneTimeLine::point_new(&start, &end)) }, Edge::CircularArc(arc) => { - let pos = arc.pos.rotate_angle(angle); + let pos = arc.pos.rotate(angle); Edge::CircularArc(CircularArc{ r: arc.r, pos, start_angle: arc.start_angle, end_angle: arc.end_angle }) } } @@ -404,10 +473,6 @@ pub mod math { } } - pub fn rotate(&self, angle: f64) -> Self { - OneTimeLine::point_new(&self.start.rotate_angle(angle), &self.end.rotate_angle(angle)) - } - pub fn point_d() -> f64 { 1.0 }