forked from 2ndbeam/evolution-rs
Compare commits
No commits in common. "master" and "master" have entirely different histories.
7 changed files with 811 additions and 1207 deletions
1888
Cargo.lock
generated
1888
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
10
Cargo.toml
10
Cargo.toml
|
|
@ -1,13 +1,19 @@
|
||||||
|
cargo-features = ["codegen-backend"]
|
||||||
|
|
||||||
[package]
|
[package]
|
||||||
name = "evolution-rs"
|
name = "evolution-rs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2024"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bevy = "0.17.3"
|
bevy = { version = "0.15.2", features = ["dynamic_linking", "wayland"] }
|
||||||
|
bevy-trait-query = "0.7.0"
|
||||||
|
log = { version = "*", features = ["max_level_debug", "release_max_level_warn"] }
|
||||||
|
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
opt-level = 1
|
opt-level = 1
|
||||||
|
codegen-backend = "cranelift"
|
||||||
|
|
||||||
[profile.dev.package."*"]
|
[profile.dev.package."*"]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
codegen-backend = "llvm"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
use bevy::prelude::Component;
|
|
||||||
|
|
||||||
#[derive(Component)]
|
|
||||||
pub struct AnimalProperty;
|
|
||||||
63
src/lib.rs
63
src/lib.rs
|
|
@ -1,10 +1,17 @@
|
||||||
use crate::{animal_properties::AnimalProperty, card::Card, hand::Hand};
|
use bevy::{
|
||||||
use bevy::{ecs::system::SystemId, prelude::*};
|
ecs::system::SystemId,
|
||||||
|
prelude::*
|
||||||
|
};
|
||||||
|
use crate::{
|
||||||
|
card::Card,
|
||||||
|
hand::Hand,
|
||||||
|
properties::TestProperty
|
||||||
|
};
|
||||||
|
|
||||||
pub mod animal;
|
|
||||||
pub mod animal_properties;
|
|
||||||
pub mod card;
|
pub mod card;
|
||||||
pub mod hand;
|
pub mod hand;
|
||||||
|
pub mod animal;
|
||||||
|
pub mod properties;
|
||||||
pub mod plugins;
|
pub mod plugins;
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
|
|
@ -12,13 +19,16 @@ pub struct JustUpdated;
|
||||||
|
|
||||||
#[derive(Resource)]
|
#[derive(Resource)]
|
||||||
pub struct Systems {
|
pub struct Systems {
|
||||||
pub update_hand_dimensions: SystemId,
|
pub update_hand_dimensions: SystemId
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
pub fn setup(
|
||||||
|
mut commands: Commands,
|
||||||
|
asset_server: Res<AssetServer>,
|
||||||
|
) {
|
||||||
let updhd_id = commands.register_system(update_hand_dimensions);
|
let updhd_id = commands.register_system(update_hand_dimensions);
|
||||||
commands.insert_resource(Systems {
|
commands.insert_resource(Systems {
|
||||||
update_hand_dimensions: updhd_id,
|
update_hand_dimensions: updhd_id
|
||||||
});
|
});
|
||||||
commands.spawn(Camera2d);
|
commands.spawn(Camera2d);
|
||||||
commands.spawn((
|
commands.spawn((
|
||||||
|
|
@ -27,7 +37,7 @@ pub fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
Sprite {
|
Sprite {
|
||||||
image: asset_server.load("sprites/hand_9s.png"),
|
image: asset_server.load("sprites/hand_9s.png"),
|
||||||
image_mode: SpriteImageMode::Sliced(TextureSlicer {
|
image_mode: SpriteImageMode::Sliced(TextureSlicer {
|
||||||
border: BorderRect::all(4.),
|
border: BorderRect::square(4.),
|
||||||
center_scale_mode: SliceScaleMode::Stretch,
|
center_scale_mode: SliceScaleMode::Stretch,
|
||||||
sides_scale_mode: SliceScaleMode::Stretch,
|
sides_scale_mode: SliceScaleMode::Stretch,
|
||||||
..default()
|
..default()
|
||||||
|
|
@ -41,7 +51,7 @@ pub fn test_setup_hand(
|
||||||
mut commands: Commands,
|
mut commands: Commands,
|
||||||
asset_server: Res<AssetServer>,
|
asset_server: Res<AssetServer>,
|
||||||
systems: Res<Systems>,
|
systems: Res<Systems>,
|
||||||
query: Single<Entity, With<Hand>>,
|
query: Single<Entity, With<Hand>>
|
||||||
) {
|
) {
|
||||||
let hand_id = query.into_inner();
|
let hand_id = query.into_inner();
|
||||||
for _ in 0..4 {
|
for _ in 0..4 {
|
||||||
|
|
@ -50,26 +60,21 @@ pub fn test_setup_hand(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_card(
|
pub fn create_card(
|
||||||
cmd: &mut Commands,
|
commands: &mut Commands,
|
||||||
asset_server: &Res<AssetServer>,
|
asset_server: &Res<AssetServer>,
|
||||||
hand_entity: Option<Entity>,
|
hand_entity: Option<Entity>,
|
||||||
systems: &Res<Systems>,
|
systems: &Res<Systems>
|
||||||
) {
|
) {
|
||||||
let card = cmd
|
let mut card = commands.spawn((
|
||||||
.spawn((
|
Card,
|
||||||
Card,
|
TestProperty,
|
||||||
AnimalProperty,
|
Transform::from_xyz(0., 0., 0.),
|
||||||
Transform::from_xyz(0., 0., 0.),
|
Sprite::from_image(asset_server.load("sprites/card_back_placeholder.png"))
|
||||||
Sprite::from_image(asset_server.load("sprites/card_back_placeholder.png")),
|
));
|
||||||
))
|
if let Some(hand) = hand_entity {
|
||||||
.id();
|
card.set_parent(hand);
|
||||||
|
commands.entity(hand).insert(JustUpdated);
|
||||||
if let Some(hand) = hand_entity
|
commands.run_system(systems.update_hand_dimensions);
|
||||||
&& let Ok(mut hand_commands) = cmd.get_entity(hand)
|
|
||||||
{
|
|
||||||
hand_commands.add_child(card);
|
|
||||||
hand_commands.insert(JustUpdated);
|
|
||||||
cmd.run_system(systems.update_hand_dimensions);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -90,10 +95,8 @@ pub fn update_hand_dimensions(
|
||||||
let hand_height = ver_margin * 2. + sprite_size.y;
|
let hand_height = ver_margin * 2. + sprite_size.y;
|
||||||
let hand_offset = (hand_total_width - sprite_size.x - hor_margin) / 2.;
|
let hand_offset = (hand_total_width - sprite_size.x - hor_margin) / 2.;
|
||||||
|
|
||||||
for (index, child_id) in hand.2.iter().enumerate() {
|
for (index, &child_id) in hand.2.iter().enumerate() {
|
||||||
let Ok(mut child) = c_query.get_mut(child_id) else {
|
let Ok(mut child) = c_query.get_mut(child_id) else { continue; };
|
||||||
continue;
|
|
||||||
};
|
|
||||||
let offset_x = (sprite_size.x + hor_margin) * (index as f32) - hand_offset;
|
let offset_x = (sprite_size.x + hor_margin) * (index as f32) - hand_offset;
|
||||||
let offset_y = 0.;
|
let offset_y = 0.;
|
||||||
child.0.translation = Vec3::from((Vec2::new(offset_x, offset_y), 1.));
|
child.0.translation = Vec3::from((Vec2::new(offset_x, offset_y), 1.));
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,10 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use evolution_rs::{plugins::*, setup, test_setup_hand};
|
use evolution_rs::{
|
||||||
|
plugins::*,
|
||||||
|
setup, test_setup_hand
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Надо придумать способ подгружать все ассеты, а затем уже исполнять программу
|
// Надо придумать способ подгружать все ассеты, а затем уже исполнять программу
|
||||||
// Суть в том, что есть AssetServer::wait_for_asset(handle), который возвращает Future, то есть ассинхронное вычисление или типо того
|
// Суть в том, что есть AssetServer::wait_for_asset(handle), который возвращает Future, то есть ассинхронное вычисление или типо того
|
||||||
|
|
@ -12,7 +16,7 @@ use evolution_rs::{plugins::*, setup, test_setup_hand};
|
||||||
// P.S. оставляю комменты в коде, потому что так надёжнее, чем сообщениями, которые можно потерять
|
// P.S. оставляю комменты в коде, потому что так надёжнее, чем сообщениями, которые можно потерять
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins((DefaultPlugins,BasePropertiesPlugin))
|
||||||
.add_systems(Startup, (setup, test_setup_hand).chain())
|
.add_systems(Startup, (setup, test_setup_hand).chain())
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,19 @@
|
||||||
|
use bevy::prelude::{App,Plugin};
|
||||||
|
|
||||||
|
use crate::properties::{Property, TestProperty};
|
||||||
|
|
||||||
|
pub struct BasePropertiesPlugin;
|
||||||
|
|
||||||
|
impl Plugin for BasePropertiesPlugin
|
||||||
|
{
|
||||||
|
fn build(&self, app: &mut App) {
|
||||||
|
// Моды должны будут делать кастомный плагин и подгружать его при загрузке мода
|
||||||
|
|
||||||
|
use bevy_trait_query::RegisterExt;
|
||||||
|
|
||||||
|
app
|
||||||
|
.register_component_as::<dyn Property, TestProperty>();
|
||||||
|
//.add_systems(schedule, <ЗДЕСЬ ДОЛЖНА БЫТЬ СИСТЕМА ДЛЯ УСЛОВИЯ>)
|
||||||
|
//.add_systems(schedule, <ЗДЕСЬ ДОЛЖНА БЫТЬ СИСТЕМА ДЛЯ ТРИГГЕРА);
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/properties/mod.rs
Normal file
25
src/properties/mod.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
use bevy_trait_query;
|
||||||
|
use bevy::prelude::Component;
|
||||||
|
|
||||||
|
// Базовый трейт для свойства животного
|
||||||
|
// Интересно, будет ли участвовать в моддинге
|
||||||
|
|
||||||
|
#[bevy_trait_query::queryable]
|
||||||
|
pub trait Property{
|
||||||
|
fn check_condition(self : &Self) -> bool;
|
||||||
|
fn trigger(self : &Self);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct TestProperty;
|
||||||
|
|
||||||
|
impl Property for TestProperty
|
||||||
|
{
|
||||||
|
fn check_condition(self: &Self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn trigger(self: &Self) {
|
||||||
|
println!("Testing property!");
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue