Skip to content

Commit 0b38ae6

Browse files
committed
Debug and Display for Builtings
1 parent 5e18af8 commit 0b38ae6

37 files changed

+2753
-449
lines changed

.github/workflows/full-ci.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,45 @@ jobs:
154154
run: cargo test $GDEXT_FEATURES ${{ matrix.rust-extra-args }}
155155

156156

157+
miri-test:
158+
name: miri-test
159+
runs-on: ubuntu-20.04
160+
steps:
161+
- uses: actions/checkout@v4
162+
163+
- name: "Install Rust"
164+
uses: ./.github/composite/rust
165+
with:
166+
rust: nightly
167+
components: miri
168+
169+
- name: "Setup Miri"
170+
run: cargo miri setup
171+
172+
- name: "Compile tests"
173+
run: cargo miri test -p godot-cell --no-run
174+
175+
- name: "Test stacked borrows"
176+
run: cargo miri test -p godot-cell
177+
178+
- name: "Test tree borrows"
179+
run: MIRIFLAGS="-Zmiri-tree-borrows" cargo miri test -p godot-cell
180+
181+
proptest:
182+
name: proptest
183+
runs-on: ubuntu-20.04
184+
steps:
185+
- uses: actions/checkout@v4
186+
187+
- name: "Install Rust"
188+
uses: ./.github/composite/rust
189+
190+
- name: "Compile tests"
191+
run: cargo test -p godot-cell --features="proptest" --no-run
192+
193+
- name: "Test"
194+
run: cargo test -p godot-cell --features="proptest"
195+
157196
# For complex matrix workflow, see https://stackoverflow.com/a/65434401
158197
godot-itest:
159198
name: godot-itest (${{ matrix.name }})

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ members = [
66
"godot-ffi",
77
"godot-core",
88
"godot-macros",
9+
"godot-cell",
910
"godot",
1011

1112
# Godot integration

examples/dodge-the-creeps/rust/src/hud.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,53 +15,53 @@ impl Hud {
1515

1616
#[func]
1717
pub fn show_message(&self, text: GString) {
18-
let mut message_label = self.base.get_node_as::<Label>("MessageLabel");
18+
let mut message_label = self.base().get_node_as::<Label>("MessageLabel");
1919
message_label.set_text(text);
2020
message_label.show();
2121

22-
let mut timer = self.base.get_node_as::<Timer>("MessageTimer");
22+
let mut timer = self.base().get_node_as::<Timer>("MessageTimer");
2323
timer.start();
2424
}
2525

2626
pub fn show_game_over(&self) {
2727
self.show_message("Game Over".into());
2828

29-
let mut timer = self.base.get_tree().unwrap().create_timer(2.0).unwrap();
30-
timer.connect("timeout".into(), self.base.callable("show_start_button"));
29+
let mut timer = self.base().get_tree().unwrap().create_timer(2.0).unwrap();
30+
timer.connect("timeout".into(), self.base().callable("show_start_button"));
3131
}
3232

3333
#[func]
3434
fn show_start_button(&mut self) {
35-
let mut message_label = self.base.get_node_as::<Label>("MessageLabel");
35+
let mut message_label = self.base().get_node_as::<Label>("MessageLabel");
3636
message_label.set_text("Dodge the\nCreeps!".into());
3737
message_label.show();
3838

39-
let mut button = self.base.get_node_as::<Button>("StartButton");
39+
let mut button = self.base().get_node_as::<Button>("StartButton");
4040
button.show();
4141
}
4242

4343
#[func]
4444
pub fn update_score(&self, score: i64) {
45-
let mut label = self.base.get_node_as::<Label>("ScoreLabel");
45+
let mut label = self.base().get_node_as::<Label>("ScoreLabel");
4646

4747
label.set_text(score.to_string().into());
4848
}
4949

5050
#[func]
5151
fn on_start_button_pressed(&mut self) {
52-
let mut button = self.base.get_node_as::<Button>("StartButton");
52+
let mut button = self.base().get_node_as::<Button>("StartButton");
5353
button.hide();
5454

5555
// Note: this works only because `start_game` is a deferred signal.
5656
// This method keeps a &mut Hud, and start_game calls Main::new_game(), which itself accesses this Hud
5757
// instance through Gd<Hud>::bind_mut(). It will try creating a 2nd &mut reference, and thus panic.
5858
// Deferring the signal is one option to work around it.
59-
self.base.emit_signal("start_game".into(), &[]);
59+
self.base_mut().emit_signal("start_game".into(), &[]);
6060
}
6161

6262
#[func]
6363
fn on_message_timer_timeout(&self) {
64-
let mut message_label = self.base.get_node_as::<Label>("MessageLabel");
64+
let mut message_label = self.base().get_node_as::<Label>("MessageLabel");
6565
message_label.hide()
6666
}
6767
}

examples/dodge-the-creeps/rust/src/main_scene.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ pub struct Main {
2424
impl Main {
2525
#[func]
2626
fn game_over(&mut self) {
27-
let mut score_timer = self.base.get_node_as::<Timer>("ScoreTimer");
28-
let mut mob_timer = self.base.get_node_as::<Timer>("MobTimer");
27+
let mut score_timer = self.base().get_node_as::<Timer>("ScoreTimer");
28+
let mut mob_timer = self.base().get_node_as::<Timer>("MobTimer");
2929

3030
score_timer.stop();
3131
mob_timer.stop();
3232

33-
let mut hud = self.base.get_node_as::<Hud>("Hud");
33+
let mut hud = self.base().get_node_as::<Hud>("Hud");
3434
hud.bind_mut().show_game_over();
3535

3636
self.music().stop();
@@ -39,16 +39,16 @@ impl Main {
3939

4040
#[func]
4141
pub fn new_game(&mut self) {
42-
let start_position = self.base.get_node_as::<Marker2D>("StartPosition");
43-
let mut player = self.base.get_node_as::<player::Player>("Player");
44-
let mut start_timer = self.base.get_node_as::<Timer>("StartTimer");
42+
let start_position = self.base().get_node_as::<Marker2D>("StartPosition");
43+
let mut player = self.base().get_node_as::<player::Player>("Player");
44+
let mut start_timer = self.base().get_node_as::<Timer>("StartTimer");
4545

4646
self.score = 0;
4747

4848
player.bind_mut().start(start_position.get_position());
4949
start_timer.start();
5050

51-
let mut hud = self.base.get_node_as::<Hud>("Hud");
51+
let mut hud = self.base().get_node_as::<Hud>("Hud");
5252
let hud = hud.bind_mut();
5353
hud.update_score(self.score);
5454
hud.show_message("Get Ready".into());
@@ -58,8 +58,8 @@ impl Main {
5858

5959
#[func]
6060
fn on_start_timer_timeout(&self) {
61-
let mut mob_timer = self.base.get_node_as::<Timer>("MobTimer");
62-
let mut score_timer = self.base.get_node_as::<Timer>("ScoreTimer");
61+
let mut mob_timer = self.base().get_node_as::<Timer>("MobTimer");
62+
let mut score_timer = self.base().get_node_as::<Timer>("ScoreTimer");
6363
mob_timer.start();
6464
score_timer.start();
6565
}
@@ -68,14 +68,14 @@ impl Main {
6868
fn on_score_timer_timeout(&mut self) {
6969
self.score += 1;
7070

71-
let mut hud = self.base.get_node_as::<Hud>("Hud");
71+
let mut hud = self.base().get_node_as::<Hud>("Hud");
7272
hud.bind_mut().update_score(self.score);
7373
}
7474

7575
#[func]
7676
fn on_mob_timer_timeout(&mut self) {
7777
let mut mob_spawn_location = self
78-
.base
78+
.base()
7979
.get_node_as::<PathFollow2D>("MobPath/MobSpawnLocation");
8080

8181
let mut mob_scene = self.mob_scene.instantiate_as::<RigidBody2D>();
@@ -91,7 +91,7 @@ impl Main {
9191

9292
mob_scene.set_rotation(direction);
9393

94-
self.base.add_child(mob_scene.clone().upcast());
94+
self.base_mut().add_child(mob_scene.clone().upcast());
9595

9696
let mut mob = mob_scene.cast::<mob::Mob>();
9797
let range = {
@@ -102,7 +102,7 @@ impl Main {
102102

103103
mob.set_linear_velocity(Vector2::new(range, 0.0).rotated(real::from_f32(direction)));
104104

105-
let mut hud = self.base.get_node_as::<Hud>("Hud");
105+
let mut hud = self.base().get_node_as::<Hud>("Hud");
106106
hud.connect("start_game".into(), mob.callable("on_start_game"));
107107
}
108108

@@ -132,7 +132,7 @@ impl INode for Main {
132132
// If the resource does not exist or has an incompatible type, this panics.
133133
// There is also try_load() if you want to check whether loading succeeded.
134134
self.mob_scene = load("res://Mob.tscn");
135-
self.music = Some(self.base.get_node_as("Music"));
136-
self.death_sound = Some(self.base.get_node_as("DeathSound"));
135+
self.music = Some(self.base().get_node_as("Music"));
136+
self.death_sound = Some(self.base().get_node_as("DeathSound"));
137137
}
138138
}

examples/dodge-the-creeps/rust/src/mob.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ pub struct Mob {
1616
impl Mob {
1717
#[func]
1818
fn on_visibility_screen_exited(&mut self) {
19-
self.base.queue_free();
19+
self.base_mut().queue_free();
2020
}
2121

2222
#[func]
2323
fn on_start_game(&mut self) {
24-
self.base.queue_free();
24+
self.base_mut().queue_free();
2525
}
2626
}
2727

@@ -37,7 +37,7 @@ impl IRigidBody2D for Mob {
3737

3838
fn ready(&mut self) {
3939
let mut sprite = self
40-
.base
40+
.base()
4141
.get_node_as::<AnimatedSprite2D>("AnimatedSprite2D");
4242

4343
sprite.play();

examples/dodge-the-creeps/rust/src/player.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,23 @@ impl Player {
1818

1919
#[func]
2020
fn on_player_body_entered(&mut self, _body: Gd<PhysicsBody2D>) {
21-
self.base.hide();
22-
self.base.emit_signal("hit".into(), &[]);
21+
self.base_mut().hide();
22+
self.base_mut().emit_signal("hit".into(), &[]);
2323

2424
let mut collision_shape = self
25-
.base
25+
.base()
2626
.get_node_as::<CollisionShape2D>("CollisionShape2D");
2727

2828
collision_shape.set_deferred("disabled".into(), true.to_variant());
2929
}
3030

3131
#[func]
3232
pub fn start(&mut self, pos: Vector2) {
33-
self.base.set_global_position(pos);
34-
self.base.show();
33+
self.base_mut().set_global_position(pos);
34+
self.base_mut().show();
3535

3636
let mut collision_shape = self
37-
.base
37+
.base()
3838
.get_node_as::<CollisionShape2D>("CollisionShape2D");
3939

4040
collision_shape.set_disabled(false);
@@ -52,14 +52,14 @@ impl IArea2D for Player {
5252
}
5353

5454
fn ready(&mut self) {
55-
let viewport = self.base.get_viewport_rect();
55+
let viewport = self.base().get_viewport_rect();
5656
self.screen_size = viewport.size;
57-
self.base.hide();
57+
self.base_mut().hide();
5858
}
5959

6060
fn process(&mut self, delta: f64) {
6161
let mut animated_sprite = self
62-
.base
62+
.base()
6363
.get_node_as::<AnimatedSprite2D>("AnimatedSprite2D");
6464

6565
let mut velocity = Vector2::new(0.0, 0.0);
@@ -101,11 +101,11 @@ impl IArea2D for Player {
101101
}
102102

103103
let change = velocity * real::from_f64(delta);
104-
let position = self.base.get_global_position() + change;
104+
let position = self.base().get_global_position() + change;
105105
let position = Vector2::new(
106106
position.x.clamp(0.0, self.screen_size.x),
107107
position.y.clamp(0.0, self.screen_size.y),
108108
);
109-
self.base.set_global_position(position);
109+
self.base_mut().set_global_position(position);
110110
}
111111
}

godot-cell/Cargo.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[package]
2+
name = "godot-cell"
3+
version = "0.1.0"
4+
edition = "2021"
5+
rust-version = "1.70"
6+
license = "MPL-2.0"
7+
keywords = ["gamedev", "godot", "engine", "ffi"]
8+
categories = ["game-engines", "graphics"]
9+
10+
[features]
11+
proptest = ["dep:proptest"]
12+
13+
[dependencies]
14+
proptest = { version = "1.4.0", optional = true }

0 commit comments

Comments
 (0)