can punch self
This commit is contained in:
@@ -7,3 +7,5 @@ unsafe impl ExtensionLibrary for MyExtension {
|
||||
}
|
||||
|
||||
pub mod player;
|
||||
pub mod mon;
|
||||
pub mod mon_move;
|
||||
|
||||
74
src/rust/src/mon.rs
Normal file
74
src/rust/src/mon.rs
Normal file
@@ -0,0 +1,74 @@
|
||||
use godot::prelude::*;
|
||||
|
||||
use godot::classes::{ISprite2D, Sprite2D};
|
||||
#[derive(GodotClass, Debug)]
|
||||
#[class(base=Sprite2D)]
|
||||
pub struct Mon {
|
||||
base: Base<Sprite2D>,
|
||||
name: GString,
|
||||
hp: i32,
|
||||
damage: i32,
|
||||
level_d: i32,
|
||||
}
|
||||
|
||||
#[godot_api]
|
||||
impl ISprite2D for Mon {
|
||||
fn init(base: Base<Sprite2D>) -> Self {
|
||||
Self{
|
||||
base: base,
|
||||
name: "my_name".into(),
|
||||
hp: 100,
|
||||
damage: 0,
|
||||
level_d: 0,
|
||||
}
|
||||
}
|
||||
|
||||
fn ready(&mut self) {
|
||||
self.hp_change()
|
||||
}
|
||||
}
|
||||
|
||||
use crate::mon_move;
|
||||
#[godot_api]
|
||||
impl Mon {
|
||||
#[func]
|
||||
pub fn mon_name(&self) -> GString {
|
||||
self.name.clone()
|
||||
}
|
||||
|
||||
#[func]
|
||||
pub fn hp(&self) -> f32 {
|
||||
(self.hp - self.damage) as f32 / self.hp as f32
|
||||
}
|
||||
|
||||
#[func]
|
||||
pub fn tackled(&mut self) {
|
||||
self.recv(mon_move::TACKLE);
|
||||
self.hp_change()
|
||||
}
|
||||
|
||||
fn hp_change(&mut self) {
|
||||
self.base_mut().emit_signal("hp_changed", &[]);
|
||||
}
|
||||
|
||||
#[signal]
|
||||
fn hp_changed();
|
||||
}
|
||||
|
||||
impl Mon {
|
||||
fn recv(&mut self, m: mon_move::MonMove) {
|
||||
m.use_on(self);
|
||||
}
|
||||
|
||||
pub fn hit_for(&mut self, power: i32) {
|
||||
self.damage += power;
|
||||
}
|
||||
|
||||
pub fn damage_scalar(&self) -> f32 {
|
||||
let mut result = 1.0;
|
||||
for _ in 0..self.level_d {
|
||||
result /= 2.0;
|
||||
}
|
||||
result
|
||||
}
|
||||
}
|
||||
18
src/rust/src/mon_move.rs
Normal file
18
src/rust/src/mon_move.rs
Normal file
@@ -0,0 +1,18 @@
|
||||
use crate::mon;
|
||||
|
||||
pub struct MonMove {
|
||||
power: i32,
|
||||
}
|
||||
|
||||
impl MonMove {
|
||||
const fn new(power: i32) -> Self {
|
||||
Self{power: power}
|
||||
}
|
||||
|
||||
pub fn use_on(&self, dest: &mut mon::Mon) {
|
||||
let power = self.power as f32 * dest.damage_scalar();
|
||||
dest.hit_for(power as i32);
|
||||
}
|
||||
}
|
||||
|
||||
pub const TACKLE: MonMove = MonMove::new(25);
|
||||
@@ -1,4 +1,6 @@
|
||||
use godot::{prelude::*, classes::{ISprite2D, Sprite2D}};
|
||||
use godot::prelude::*;
|
||||
|
||||
use godot::classes::{ISprite2D, Sprite2D};
|
||||
#[derive(GodotClass)]
|
||||
#[class(base=Sprite2D)]
|
||||
struct BreeLPlayer {
|
||||
@@ -41,5 +43,3 @@ impl BreeLPlayer {
|
||||
eprintln!("drop");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user