just like mess
This commit is contained in:
parent
dcd490b1c7
commit
767fd4877d
@ -5,6 +5,7 @@
|
|||||||
# -------------------------------
|
# -------------------------------
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
import logging
|
||||||
import contextlib
|
import contextlib
|
||||||
from xml.etree import ElementTree
|
from xml.etree import ElementTree
|
||||||
from xml.etree.ElementTree import Element
|
from xml.etree.ElementTree import Element
|
||||||
@ -13,7 +14,6 @@ from typing import List, TYPE_CHECKING, Union, Dict, Optional, Generator
|
|||||||
# third party package
|
# third party package
|
||||||
from defusedxml.ElementTree import parse
|
from defusedxml.ElementTree import parse
|
||||||
|
|
||||||
import pyglet.graphics
|
|
||||||
# pyglet
|
# pyglet
|
||||||
from pyglet.math import Vec4
|
from pyglet.math import Vec4
|
||||||
from pyglet.text import Label
|
from pyglet.text import Label
|
||||||
@ -23,6 +23,7 @@ from pyglet.graphics import Batch, Group
|
|||||||
|
|
||||||
# Difficult Rocket
|
# Difficult Rocket
|
||||||
from Difficult_Rocket import DR_option
|
from Difficult_Rocket import DR_option
|
||||||
|
from Difficult_Rocket.utils.translate import tr
|
||||||
from Difficult_Rocket.api.types import Fonts, Options
|
from Difficult_Rocket.api.types import Fonts, Options
|
||||||
from Difficult_Rocket.command.line import CommandText
|
from Difficult_Rocket.command.line import CommandText
|
||||||
from Difficult_Rocket.client.screen import BaseScreen
|
from Difficult_Rocket.client.screen import BaseScreen
|
||||||
@ -32,7 +33,10 @@ if TYPE_CHECKING:
|
|||||||
from Difficult_Rocket.client import ClientWindow
|
from Difficult_Rocket.client import ClientWindow
|
||||||
|
|
||||||
if DR_option.use_DR_rust:
|
if DR_option.use_DR_rust:
|
||||||
from libs.Difficult_Rocket_rs import PartDatas, CenterCamera_rs
|
from libs.Difficult_Rocket_rs import CenterCamera_rs, SR1PartData
|
||||||
|
|
||||||
|
|
||||||
|
logger = logging.getLogger('client')
|
||||||
|
|
||||||
|
|
||||||
def get_sr1_part(part_xml: Element) -> Optional[SR1PartData]:
|
def get_sr1_part(part_xml: Element) -> Optional[SR1PartData]:
|
||||||
@ -121,6 +125,7 @@ class SR1ShipRender(BaseScreen):
|
|||||||
self.camera_rs = CenterCamera_rs(main_window,
|
self.camera_rs = CenterCamera_rs(main_window,
|
||||||
min_zoom=(1 / 2) ** 10, max_zoom=10)
|
min_zoom=(1 / 2) ** 10, max_zoom=10)
|
||||||
self.rust_parts = None
|
self.rust_parts = None
|
||||||
|
self.part_list_rs =
|
||||||
|
|
||||||
def load_xml(self, file_path: str) -> bool:
|
def load_xml(self, file_path: str) -> bool:
|
||||||
try:
|
try:
|
||||||
@ -182,7 +187,6 @@ class SR1ShipRender(BaseScreen):
|
|||||||
for part_xml in parts:
|
for part_xml in parts:
|
||||||
if part_xml.tag != 'Part':
|
if part_xml.tag != 'Part':
|
||||||
continue # 如果不是部件,则跳过
|
continue # 如果不是部件,则跳过
|
||||||
# print(f"tag: {part.tag} attrib: {part.attrib}")
|
|
||||||
part = get_sr1_part(part_xml)
|
part = get_sr1_part(part_xml)
|
||||||
if part.id in self.part_data:
|
if part.id in self.part_data:
|
||||||
print(f'hey! warning! id{part.id}')
|
print(f'hey! warning! id{part.id}')
|
||||||
@ -194,11 +198,6 @@ class SR1ShipRender(BaseScreen):
|
|||||||
except GeneratorExit:
|
except GeneratorExit:
|
||||||
self.drawing = False
|
self.drawing = False
|
||||||
self.need_draw = False
|
self.need_draw = False
|
||||||
|
|
||||||
if DR_option.use_DR_rust:
|
|
||||||
print(type(self.part_data))
|
|
||||||
self.rust_parts = PartDatas(self.part_data)
|
|
||||||
# print(self.rust_parts.get_rust_pointer())
|
|
||||||
print(len(self.part_data))
|
print(len(self.part_data))
|
||||||
print(time.perf_counter_ns() - start_time)
|
print(time.perf_counter_ns() - start_time)
|
||||||
self.rendered = True
|
self.rendered = True
|
||||||
@ -322,7 +321,7 @@ class SR1ShipRender(BaseScreen):
|
|||||||
elif command.re_match('get_buf'):
|
elif command.re_match('get_buf'):
|
||||||
|
|
||||||
def screenshot(window):
|
def screenshot(window):
|
||||||
from libs.pyglet.gl import GLubyte, GLint, GL_RGBA, GL_UNSIGNED_BYTE, \
|
from libs.pyglet.gl import GLubyte, GL_RGBA, GL_UNSIGNED_BYTE, \
|
||||||
glReadPixels
|
glReadPixels
|
||||||
import pyglet
|
import pyglet
|
||||||
|
|
||||||
|
@ -31,21 +31,6 @@ if TYPE_CHECKING:
|
|||||||
def part_list_read_test(file_name: Optional[str] = "./configs/PartList.xml") -> None: ...
|
def part_list_read_test(file_name: Optional[str] = "./configs/PartList.xml") -> None: ...
|
||||||
|
|
||||||
|
|
||||||
class PartDatas:
|
|
||||||
""" 用于在 PyObj 里塞一个浓眉大眼的 HashMap<uszie, SR1PartData>"""
|
|
||||||
|
|
||||||
def __new__(cls, py_part_data: Dict[int, SR1PartData]) -> "PartDatas": ...
|
|
||||||
|
|
||||||
def get_rust_pointer(self) -> int: ...
|
|
||||||
|
|
||||||
|
|
||||||
def better_update_parts(render: SR1ShipRender,
|
|
||||||
option: SR1ShipRender_Option,
|
|
||||||
window: BaseScreen,
|
|
||||||
parts: PartDatas,
|
|
||||||
sr1_xml_scale: int) -> bool: ...
|
|
||||||
|
|
||||||
|
|
||||||
class Camera_rs:
|
class Camera_rs:
|
||||||
""" 用于闲的没事 用 rust 写一个 camera """
|
""" 用于闲的没事 用 rust 写一个 camera """
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
* -------------------------------
|
* -------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mod render;
|
|
||||||
mod simulator;
|
mod simulator;
|
||||||
mod sr1_data;
|
mod sr1_data;
|
||||||
mod sr1_render;
|
mod render;
|
||||||
|
mod logger;
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
use pyo3::prelude::*;
|
use pyo3::prelude::*;
|
||||||
@ -33,10 +33,8 @@ fn test_call(py_obj: &PyAny) -> PyResult<bool> {
|
|||||||
fn module_init(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
|
fn module_init(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
|
||||||
m.add_function(wrap_pyfunction!(get_version_str, m)?)?;
|
m.add_function(wrap_pyfunction!(get_version_str, m)?)?;
|
||||||
m.add_function(wrap_pyfunction!(test_call, m)?)?;
|
m.add_function(wrap_pyfunction!(test_call, m)?)?;
|
||||||
m.add_function(wrap_pyfunction!(sr1_render::better_update_parts, m)?)?;
|
|
||||||
m.add_function(wrap_pyfunction!(simulator::simluation, m)?)?;
|
m.add_function(wrap_pyfunction!(simulator::simluation, m)?)?;
|
||||||
m.add_function(wrap_pyfunction!(sr1_data::part_list::read_part_list_py, m)?)?;
|
m.add_function(wrap_pyfunction!(sr1_data::part_list::read_part_list_py, m)?)?;
|
||||||
m.add_class::<sr1_render::types::PartDatas>()?;
|
|
||||||
m.add_class::<render::camera::CameraRs>()?;
|
m.add_class::<render::camera::CameraRs>()?;
|
||||||
m.add_class::<render::camera::CenterCameraRs>()?;
|
m.add_class::<render::camera::CenterCameraRs>()?;
|
||||||
m.add_class::<render::screen::PartFrame>()?;
|
m.add_class::<render::screen::PartFrame>()?;
|
||||||
|
8
libs/Difficult_Rocket_rs/src/src/logger.rs
Normal file
8
libs/Difficult_Rocket_rs/src/src/logger.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* -------------------------------
|
||||||
|
* Difficult Rocket
|
||||||
|
* Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
|
||||||
|
* All rights reserved
|
||||||
|
* -------------------------------
|
||||||
|
*/
|
||||||
|
|
@ -14,7 +14,7 @@ pub mod part_list {
|
|||||||
// use quick_xml::de::from_str;
|
// use quick_xml::de::from_str;
|
||||||
use serde_xml_rs::from_str;
|
use serde_xml_rs::from_str;
|
||||||
|
|
||||||
use crate::types::sr1::{SR1PartAttr, SR1PartList, SR1PartType};
|
use crate::types::sr1::{SR1PartList, SR1PartType, SR1PartTypeAttr};
|
||||||
use crate::types::sr1::{SR1PartListTrait, SR1PartTypeData};
|
use crate::types::sr1::{SR1PartListTrait, SR1PartTypeData};
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
@ -236,10 +236,10 @@ pub mod part_list {
|
|||||||
|
|
||||||
impl SR1PartTypeData for RawPartType {
|
impl SR1PartTypeData for RawPartType {
|
||||||
fn to_sr_part_type(&self) -> SR1PartType {
|
fn to_sr_part_type(&self) -> SR1PartType {
|
||||||
let part_attr: Option<SR1PartAttr> = match self.r#type {
|
let part_attr: Option<SR1PartTypeAttr> = match self.r#type {
|
||||||
SR1PartTypeEnum::tank => {
|
SR1PartTypeEnum::tank => {
|
||||||
let tank = self.tank.unwrap();
|
let tank = self.tank.unwrap();
|
||||||
Some(SR1PartAttr::Tank {
|
Some(SR1PartTypeAttr::Tank {
|
||||||
fuel: tank.fuel,
|
fuel: tank.fuel,
|
||||||
dry_mass: tank.dry_mass,
|
dry_mass: tank.dry_mass,
|
||||||
fuel_type: tank.fuel_type.unwrap_or(0),
|
fuel_type: tank.fuel_type.unwrap_or(0),
|
||||||
@ -247,7 +247,7 @@ pub mod part_list {
|
|||||||
}
|
}
|
||||||
SR1PartTypeEnum::engine => {
|
SR1PartTypeEnum::engine => {
|
||||||
let engine = self.engine.unwrap();
|
let engine = self.engine.unwrap();
|
||||||
Some(SR1PartAttr::Engine {
|
Some(SR1PartTypeAttr::Engine {
|
||||||
power: engine.power,
|
power: engine.power,
|
||||||
consumption: engine.consumption,
|
consumption: engine.consumption,
|
||||||
size: engine.size,
|
size: engine.size,
|
||||||
@ -258,7 +258,7 @@ pub mod part_list {
|
|||||||
}
|
}
|
||||||
SR1PartTypeEnum::rcs => {
|
SR1PartTypeEnum::rcs => {
|
||||||
let rcs = self.rcs.unwrap();
|
let rcs = self.rcs.unwrap();
|
||||||
Some(SR1PartAttr::Rcs {
|
Some(SR1PartTypeAttr::Rcs {
|
||||||
power: rcs.power,
|
power: rcs.power,
|
||||||
consumption: rcs.consumption,
|
consumption: rcs.consumption,
|
||||||
size: rcs.size,
|
size: rcs.size,
|
||||||
@ -266,13 +266,13 @@ pub mod part_list {
|
|||||||
}
|
}
|
||||||
SR1PartTypeEnum::solar => {
|
SR1PartTypeEnum::solar => {
|
||||||
let solar = self.solar.unwrap();
|
let solar = self.solar.unwrap();
|
||||||
Some(SR1PartAttr::Solar {
|
Some(SR1PartTypeAttr::Solar {
|
||||||
charge_rate: solar.charge_rate,
|
charge_rate: solar.charge_rate,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
SR1PartTypeEnum::lander => {
|
SR1PartTypeEnum::lander => {
|
||||||
let lander = self.lander.unwrap();
|
let lander = self.lander.unwrap();
|
||||||
Some(SR1PartAttr::Lander {
|
Some(SR1PartTypeAttr::Lander {
|
||||||
max_angle: lander.max_angle,
|
max_angle: lander.max_angle,
|
||||||
min_length: lander.min_length,
|
min_length: lander.min_length,
|
||||||
max_length: lander.max_length,
|
max_length: lander.max_length,
|
||||||
@ -335,18 +335,6 @@ pub mod part_list {
|
|||||||
println!("{:?}\n", part_data);
|
println!("{:?}\n", part_data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_sr_part_list(&self, name: Option<String>) -> SR1PartList {
|
|
||||||
let mut part_list = Vec::new();
|
|
||||||
for part_data in self.part_types.iter() {
|
|
||||||
println!("{}", part_data.id.to_string());
|
|
||||||
part_list.push(part_data.to_sr_part_type());
|
|
||||||
}
|
|
||||||
SR1PartList {
|
|
||||||
types: part_list,
|
|
||||||
name: name.unwrap_or("NewPartList".to_string()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SR1PartListTrait for RawPartList {
|
impl SR1PartListTrait for RawPartList {
|
||||||
@ -402,7 +390,7 @@ pub mod ship {
|
|||||||
use serde_xml_rs::from_str;
|
use serde_xml_rs::from_str;
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Ship {
|
pub struct RawShip {
|
||||||
#[serde(rename = "Parts")]
|
#[serde(rename = "Parts")]
|
||||||
pub parts: Parts,
|
pub parts: Parts,
|
||||||
#[serde(rename = "Connections")]
|
#[serde(rename = "Connections")]
|
||||||
@ -476,12 +464,12 @@ pub mod ship {
|
|||||||
#[serde(rename = "Staging")]
|
#[serde(rename = "Staging")]
|
||||||
pub stages: Vec<Staging>,
|
pub stages: Vec<Staging>,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub throttle: i8,
|
pub throttle: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct Tank {
|
pub struct Tank {
|
||||||
pub fuel: i64,
|
pub fuel: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
@ -536,4 +524,8 @@ pub mod ship {
|
|||||||
#[serde(rename = "childPart")]
|
#[serde(rename = "childPart")]
|
||||||
pub child_part: i64,
|
pub child_part: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pub fn read_ship_from_file(file_name: String) -> Result<RawShip, String> {
|
||||||
|
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
@ -1,122 +0,0 @@
|
|||||||
/*
|
|
||||||
* -------------------------------
|
|
||||||
* Difficult Rocket
|
|
||||||
* Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
|
|
||||||
* All rights reserved
|
|
||||||
* -------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
use crate::types::sr1::SR1PartData;
|
|
||||||
use pyo3::intern;
|
|
||||||
use pyo3::prelude::*;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::time;
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
pub mod types {
|
|
||||||
use pyo3::intern;
|
|
||||||
use pyo3::prelude::*;
|
|
||||||
use pyo3::types::PyDict;
|
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
use crate::types::sr1::SR1PartData;
|
|
||||||
|
|
||||||
pub struct Point {
|
|
||||||
pub x: f64,
|
|
||||||
pub y: f64,
|
|
||||||
pub id: usize,
|
|
||||||
pub type_: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[pyclass(name = "PartDatas")]
|
|
||||||
pub struct PartDatas {
|
|
||||||
pub part_structs: HashMap<i64, SR1PartData>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl PartDatas {
|
|
||||||
fn get_rust_data(&self) -> &HashMap<i64, SR1PartData> {
|
|
||||||
return &self.part_structs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[pymethods]
|
|
||||||
impl PartDatas {
|
|
||||||
#[new]
|
|
||||||
fn py_new(py_part_data: &PyDict) -> PyResult<Self> {
|
|
||||||
let datas: HashMap<i64, SR1PartData> = part_data_tp_SR1PartDatas(py_part_data)?;
|
|
||||||
return Ok(PartDatas {
|
|
||||||
part_structs: datas,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
pub fn part_data_to_SR1PartData(input: &PyAny) -> PyResult<SR1PartData> {
|
|
||||||
let connections = match input.getattr(intern!(input.py(), "connections")) {
|
|
||||||
Ok(ok) => ok.extract()?,
|
|
||||||
_ => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
return Ok(SR1PartData {
|
|
||||||
x: input.getattr(intern!(input.py(), "x"))?.extract()?,
|
|
||||||
y: input.getattr(intern!(input.py(), "y"))?.extract()?,
|
|
||||||
id: input.getattr(intern!(input.py(), "id"))?.extract()?,
|
|
||||||
p_type: input.getattr(intern!(input.py(), "p_type"))?.extract()?,
|
|
||||||
active: input.getattr(intern!(input.py(), "active"))?.extract()?,
|
|
||||||
angle: input.getattr(intern!(input.py(), "angle"))?.extract()?,
|
|
||||||
angle_v: input.getattr(intern!(input.py(), "angle_v"))?.extract()?,
|
|
||||||
editor_angle: input
|
|
||||||
.getattr(intern!(input.py(), "editor_angle"))?
|
|
||||||
.extract()?,
|
|
||||||
flip_x: input.getattr(intern!(input.py(), "flip_x"))?.extract()?,
|
|
||||||
flip_y: input.getattr(intern!(input.py(), "flip_y"))?.extract()?,
|
|
||||||
explode: input.getattr(intern!(input.py(), "explode"))?.extract()?,
|
|
||||||
textures: input.getattr(intern!(input.py(), "textures"))?.extract()?,
|
|
||||||
connections, // connections: input.getattr(intern!(input.py(), "connections"))?.extract()?,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(non_snake_case)]
|
|
||||||
pub fn part_data_tp_SR1PartDatas(input: &PyDict) -> PyResult<HashMap<i64, SR1PartData>> {
|
|
||||||
let mut result: HashMap<i64, SR1PartData> = HashMap::with_capacity(input.len());
|
|
||||||
for key in input.iter() {
|
|
||||||
result.insert(key.0.extract()?, part_data_to_SR1PartData(key.1)?);
|
|
||||||
}
|
|
||||||
return Ok(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[pyfunction]
|
|
||||||
#[allow(unused_variables)]
|
|
||||||
pub fn better_update_parts(
|
|
||||||
render: &PyAny,
|
|
||||||
option: &PyAny,
|
|
||||||
window: &PyAny,
|
|
||||||
parts: &types::PartDatas,
|
|
||||||
sr1_xml_scale: i32,
|
|
||||||
) -> PyResult<bool> {
|
|
||||||
if !render
|
|
||||||
.getattr(intern!(render.py(), "rendered"))?
|
|
||||||
.is_true()?
|
|
||||||
{
|
|
||||||
return Ok(false);
|
|
||||||
}
|
|
||||||
let start_time = time::Instant::now();
|
|
||||||
let x_center: f32 = window.getattr(intern!(window.py(), "width"))?.extract()?;
|
|
||||||
let y_center: f32 = window.getattr(intern!(window.py(), "height"))?.extract()?;
|
|
||||||
let x_center: f32 = x_center / 2.0;
|
|
||||||
let y_center: f32 = y_center / 2.0;
|
|
||||||
let datas: &HashMap<i64, SR1PartData> = &parts.part_structs;
|
|
||||||
let part_sprites = render.getattr(intern!(render.py(), "parts_sprite"))?;
|
|
||||||
let get_stuf_time = start_time.elapsed();
|
|
||||||
|
|
||||||
for keys in datas {
|
|
||||||
let sprite = part_sprites.get_item(keys.0)?;
|
|
||||||
let new_x: f64 = keys.1.x * sr1_xml_scale as f64 + x_center as f64;
|
|
||||||
let new_y: f64 = keys.1.y * sr1_xml_scale as f64 + y_center as f64;
|
|
||||||
sprite.setattr(intern!(sprite.py(), "x"), new_x)?;
|
|
||||||
sprite.setattr(intern!(sprite.py(), "y"), new_y)?;
|
|
||||||
}
|
|
||||||
let run_time = start_time.elapsed();
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
@ -51,23 +51,36 @@ pub mod sr1 {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct SR1PartData {
|
pub struct SR1PartData {
|
||||||
|
// 单独的属性
|
||||||
|
pub attr: Option<SR1PartDataAttr>,
|
||||||
|
// 基本状态属性
|
||||||
pub x: f64,
|
pub x: f64,
|
||||||
pub y: f64,
|
pub y: f64,
|
||||||
pub id: i64,
|
pub id: i64,
|
||||||
pub p_type: String,
|
|
||||||
pub active: bool,
|
|
||||||
pub angle: f64, // 弧度制
|
pub angle: f64, // 弧度制
|
||||||
pub angle_v: f64,
|
pub angle_v: f64,
|
||||||
pub editor_angle: usize,
|
// 状态属性
|
||||||
|
pub part_type: String,
|
||||||
|
pub active: bool,
|
||||||
|
pub editor_angle: i32,
|
||||||
pub flip_x: bool,
|
pub flip_x: bool,
|
||||||
pub flip_y: bool,
|
pub flip_y: bool,
|
||||||
|
// 降落伞属性
|
||||||
|
pub chute_x: f64,
|
||||||
|
pub chute_y: f64,
|
||||||
|
pub chute_angle: f64,
|
||||||
|
pub chute_height: f64,
|
||||||
|
pub inflate: bool,
|
||||||
|
pub inflation: bool,
|
||||||
|
pub deployed: bool,
|
||||||
|
// 太阳能板属性
|
||||||
|
pub extension: f64,
|
||||||
|
|
||||||
pub explode: bool,
|
pub explode: bool,
|
||||||
pub textures: String,
|
|
||||||
pub connections: Option<Vec<((usize, usize), (isize, isize))>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub enum SR1PartAttr {
|
pub enum SR1PartTypeAttr {
|
||||||
Tank {
|
Tank {
|
||||||
fuel: f64,
|
fuel: f64,
|
||||||
dry_mass: f64,
|
dry_mass: f64,
|
||||||
@ -103,6 +116,22 @@ pub mod sr1 {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum SR1PartDataAttr {
|
||||||
|
Tank {
|
||||||
|
fuel: f64,
|
||||||
|
},
|
||||||
|
Engine {
|
||||||
|
fuel: f64,
|
||||||
|
},
|
||||||
|
Pod {
|
||||||
|
name: String,
|
||||||
|
throttle: f64,
|
||||||
|
current_stage: u32,
|
||||||
|
steps: Vec<(i64, bool)>,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct Damage {
|
pub struct Damage {
|
||||||
pub disconnect: i32,
|
pub disconnect: i32,
|
||||||
@ -171,7 +200,7 @@ pub mod sr1 {
|
|||||||
// 部件碰撞箱
|
// 部件碰撞箱
|
||||||
pub attach_points: Option<Vec<AttachPoint>>,
|
pub attach_points: Option<Vec<AttachPoint>>,
|
||||||
// 部件连接点
|
// 部件连接点
|
||||||
pub attr: Option<SR1PartAttr>, // 部件特殊属性
|
pub attr: Option<SR1PartTypeAttr>, // 部件特殊属性
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -243,7 +272,7 @@ pub mod sr1 {
|
|||||||
fn to_raw_part_type(&self) -> RawPartType {
|
fn to_raw_part_type(&self) -> RawPartType {
|
||||||
let tank: Option<Tank> = match &self.attr {
|
let tank: Option<Tank> = match &self.attr {
|
||||||
Some(attr) => match attr {
|
Some(attr) => match attr {
|
||||||
SR1PartAttr::Tank {
|
SR1PartTypeAttr::Tank {
|
||||||
fuel,
|
fuel,
|
||||||
dry_mass,
|
dry_mass,
|
||||||
fuel_type,
|
fuel_type,
|
||||||
@ -258,7 +287,7 @@ pub mod sr1 {
|
|||||||
};
|
};
|
||||||
let engine: Option<Engine> = match &self.attr {
|
let engine: Option<Engine> = match &self.attr {
|
||||||
Some(attr) => match attr {
|
Some(attr) => match attr {
|
||||||
SR1PartAttr::Engine {
|
SR1PartTypeAttr::Engine {
|
||||||
power,
|
power,
|
||||||
consumption,
|
consumption,
|
||||||
size,
|
size,
|
||||||
@ -279,7 +308,7 @@ pub mod sr1 {
|
|||||||
};
|
};
|
||||||
let rcs: Option<Rcs> = match &self.attr {
|
let rcs: Option<Rcs> = match &self.attr {
|
||||||
Some(attr) => match attr {
|
Some(attr) => match attr {
|
||||||
SR1PartAttr::Rcs {
|
SR1PartTypeAttr::Rcs {
|
||||||
power,
|
power,
|
||||||
consumption,
|
consumption,
|
||||||
size,
|
size,
|
||||||
@ -294,7 +323,7 @@ pub mod sr1 {
|
|||||||
};
|
};
|
||||||
let solar: Option<Solar> = match &self.attr {
|
let solar: Option<Solar> = match &self.attr {
|
||||||
Some(attr) => match attr {
|
Some(attr) => match attr {
|
||||||
SR1PartAttr::Solar { charge_rate } => Some(Solar {
|
SR1PartTypeAttr::Solar { charge_rate } => Some(Solar {
|
||||||
charge_rate: *charge_rate,
|
charge_rate: *charge_rate,
|
||||||
}),
|
}),
|
||||||
_ => None,
|
_ => None,
|
||||||
@ -303,7 +332,7 @@ pub mod sr1 {
|
|||||||
};
|
};
|
||||||
let lander: Option<Lander> = match &self.attr {
|
let lander: Option<Lander> = match &self.attr {
|
||||||
Some(attr) => match attr {
|
Some(attr) => match attr {
|
||||||
SR1PartAttr::Lander {
|
SR1PartTypeAttr::Lander {
|
||||||
max_angle,
|
max_angle,
|
||||||
min_length,
|
min_length,
|
||||||
max_length,
|
max_length,
|
||||||
@ -366,6 +395,7 @@ pub mod sr1 {
|
|||||||
pub struct SR1Ship {
|
pub struct SR1Ship {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub description: String,
|
pub description: String,
|
||||||
|
pub parts: Vec<SR1PartData>,
|
||||||
pub connections: Vec<String>,
|
pub connections: Vec<String>,
|
||||||
pub lift_off: bool,
|
pub lift_off: bool,
|
||||||
pub touch_ground: bool,
|
pub touch_ground: bool,
|
||||||
|
Loading…
Reference in New Issue
Block a user