aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--godot/native/GoalTriggerBox.gdns8
-rw-r--r--godot/native/game.gdnlib6
-rw-r--r--godot/scenes/Die.tscn29
-rw-r--r--godot/scenes/Game.tscn38
-rw-r--r--godot/scenes/levels/GoalTriggerZone.tscn14
-rw-r--r--godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn12
-rw-r--r--godot/scripts/GoalTriggerBox.gd22
-rw-r--r--godot/scripts/LevelLoader.gd55
-rw-r--r--lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dllbin482304 -> 578048 bytes
-rwxr-xr-xlib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.sobin29349984 -> 30387968 bytes
-rw-r--r--rust/src/basic_die.rs85
-rw-r--r--rust/src/buff_ball.rs91
-rw-r--r--rust/src/buff_bounce.rs52
-rw-r--r--rust/src/buff_extra.rs4
-rw-r--r--rust/src/buff_phase.rs27
-rw-r--r--rust/src/goal_trigger.rs30
-rw-r--r--rust/src/lib.rs12
17 files changed, 366 insertions, 119 deletions
diff --git a/godot/native/GoalTriggerBox.gdns b/godot/native/GoalTriggerBox.gdns
new file mode 100644
index 0000000..249df19
--- /dev/null
+++ b/godot/native/GoalTriggerBox.gdns
@@ -0,0 +1,8 @@
+[gd_resource type="NativeScript" load_steps=2 format=2]
+
+[ext_resource path="res://native/game.gdnlib" type="GDNativeLibrary" id=1]
+
+[resource]
+resource_name = "GoalTriggerZone"
+class_name = "GoalTriggerZone"
+library = ExtResource( 1 )
diff --git a/godot/native/game.gdnlib b/godot/native/game.gdnlib
index 439db91..b7c3ec4 100644
--- a/godot/native/game.gdnlib
+++ b/godot/native/game.gdnlib
@@ -11,14 +11,14 @@ Android.arm64-v8a="res://../lib/aarch64-linux-android/libcode_with_your_friends2
Android.armeabi-v7a="res://../lib/armv7-linux-androideabi/libcode_with_your_friends2022.so"
Android.x86="res://../lib/i686-linux-android/libcode_with_your_friends2022.so"
Android.x86_64="res://../lib/x86_64-linux-android/libcode_with_your_friends2022.so"
-HTML5.wasm32 = "res://../lib/wasm32-unknown-emscripten/code_with_your_friends2022.wasm"
+HTML5.wasm32="res://../lib/wasm32-unknown-emscripten/code_with_your_friends2022.wasm"
iOS.arm64="res://../lib/aarch64-apple-ios/libcode_with_your_friends2022.a"
OSX.64="res://../lib/x86_64-apple-darwin/libcode_with_your_friends2022.dylib"
Server.32="res://../lib/i686-unknown-linux-gnu/libcode_with_your_friends2022.so"
Server.64="res://../lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so"
-# Windows.32="res://../lib/i686-pc-windows-gnu/code_with_your_friends2022.dll"
+#Windows.32="res://../lib/i686-pc-windows-gnu/code_with_your_friends2022.dll"
Windows.32="res://../lib/i686-pc-windows-msvc/code_with_your_friends2022.dll"
-# Windows.64="res://../lib/x86_64-pc-windows-gnu/code_with_your_friends2022.dll"
+#Windows.64="res://../lib/x86_64-pc-windows-gnu/code_with_your_friends2022.dll"
Windows.64="res://../lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll"
X11.32="res://../lib/i686-unknown-linux-gnu/libcode_with_your_friends2022.so"
X11.64="res://../lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so"
diff --git a/godot/scenes/Die.tscn b/godot/scenes/Die.tscn
index 813f7b7..57594ed 100644
--- a/godot/scenes/Die.tscn
+++ b/godot/scenes/Die.tscn
@@ -1,4 +1,8 @@
+<<<<<<< HEAD:godot/scenes/objects/W8.tscn
+[gd_scene load_steps=6 format=2]
+=======
[gd_scene load_steps=5 format=2]
+>>>>>>> menu:godot/scenes/Die.tscn
[ext_resource path="res://scenes/Die.gd" type="Script" id=1]
[ext_resource path="res://assets/game_objects/W8baseColor_Mat.material" type="Material" id=2]
@@ -21,17 +25,37 @@ surfaces/0 = {
[sub_resource type="ConvexPolygonShape" id=2]
points = PoolVector3Array( -0.0850063, -0.879389, -0.0282584, 0.0288993, 0.929375, 0.0289349, 0.0288993, 0.929375, -0.0289349, 0.929367, -0.0289314, 0.0289314, -0.0289784, -0.0289338, 0.929338, -0.929369, 0.028929, 0.028929, 0.0288993, -0.0289349, -0.929375, 0.0288993, -0.929375, 0.0289349, -0.0850063, 0.0282584, -0.879389, 0.0282247, 0.084959, 0.87945, 0.857489, 0.056933, -0.0855785, -0.879454, -0.0849424, 0.0282549, 0.0570775, -0.885814, -0.0571088, 0.0570775, -0.0571088, 0.885814, -0.0571532, 0.885743, -0.0571043, -0.0571532, 0.885743, 0.0571043, 0.0570775, 0.0571088, -0.885814, -0.885806, -0.057097, -0.057097, 0.879446, 0.0849494, 0.0282572, 0.857335, -0.0571018, -0.0855632, -0.0571532, 0.0571043, 0.885743, -0.0571532, -0.885743, 0.0571043, -0.885806, 0.057097, -0.057097, -0.0571532, -0.0571043, -0.885743, 0.0570775, 0.0571088, 0.885814, -0.0571532, -0.885743, -0.0571043, -0.0571532, 0.0571043, -0.885743, 0.0570775, -0.885814, 0.0571088, 0.0570775, 0.885814, 0.0571088, -0.0571532, -0.0571043, 0.885743, -0.885806, 0.057097, 0.057097, 0.0570775, 0.885814, -0.0571088, 0.0570775, -0.0571088, -0.885814, 0.857335, -0.0571018, 0.0855632, -0.885806, -0.057097, 0.057097, 0.857489, 0.056933, 0.0855785, 0.929425, 0.0287513, -0.0289333, 0.929367, -0.0289314, -0.0289314, -0.0289784, 0.929338, -0.0289338, 0.0288993, 0.0289349, -0.929375, -0.929369, -0.028929, -0.028929, -0.0283039, -0.87942, -0.0849561, 0.084933, 0.0282608, 0.879461, -0.0289784, 0.929338, 0.0289338, -0.0289784, -0.0289338, -0.929338, -0.0289784, 0.0289338, 0.929338, 0.0288993, -0.0289349, 0.929375, 0.0288993, -0.929375, -0.0289349, -0.0289784, -0.929338, 0.0289338, -0.929369, 0.028929, -0.028929, -0.0283039, 0.0849561, -0.87942, -0.879454, -0.0282549, 0.0849424, 0.879512, 0.0280816, 0.0849558, 0.879446, -0.0849494, -0.0282572, -0.0282988, -0.822574, 0.141805, 0.17021, 0.0280745, -0.794261, -0.879454, 0.0849424, -0.0282549, -0.0283039, 0.87942, 0.0849561, 0.0282247, 0.87945, -0.084959, 0.0282247, -0.084959, -0.87945, -0.879454, -0.0282549, -0.0849424, -0.0850063, 0.0282584, 0.879389, -0.0850063, 0.879389, 0.0282584, 0.084933, -0.0282608, 0.879461 )
+<<<<<<< HEAD:godot/scenes/objects/W8.tscn
+[sub_resource type="SphereShape" id=3]
+
+[sub_resource type="SphereMesh" id=4]
+
+[node name="RigidBody" type="RigidBody"]
+=======
[node name="Die" type="RigidBody"]
script = ExtResource( 1 )
+>>>>>>> menu:godot/scenes/Die.tscn
-[node name="Cone" type="MeshInstance" parent="."]
+[node name="MeshDie" type="MeshInstance" parent="."]
mesh = SubResource( 1 )
skeleton = NodePath("../..")
material/0 = null
-[node name="CollisionShape" type="CollisionShape" parent="."]
+[node name="CollisionShapeDie" type="CollisionShape" parent="."]
shape = SubResource( 2 )
+<<<<<<< HEAD:godot/scenes/objects/W8.tscn
+[node name="CollisionShapeSphere" type="CollisionShape" parent="."]
+transform = Transform( 0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0 )
+shape = SubResource( 3 )
+disabled = true
+
+[node name="MeshSphere" type="MeshInstance" parent="."]
+transform = Transform( 0.7, 0, 0, 0, 0.7, 0, 0, 0, 0.7, 0, 0, 0 )
+visible = false
+mesh = SubResource( 4 )
+material/0 = ExtResource( 2 )
+=======
[node name="CamRoot" type="Spatial" parent="."]
[node name="Horizontal" type="Spatial" parent="CamRoot"]
@@ -40,3 +64,4 @@ shape = SubResource( 2 )
[node name="Camera" type="ClippedCamera" parent="CamRoot/Horizontal/Vertical"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 10.1285 )
+>>>>>>> menu:godot/scenes/Die.tscn
diff --git a/godot/scenes/Game.tscn b/godot/scenes/Game.tscn
index 0896836..710e5b5 100644
--- a/godot/scenes/Game.tscn
+++ b/godot/scenes/Game.tscn
@@ -1,13 +1,51 @@
+<<<<<<< HEAD
+[gd_scene load_steps=8 format=2]
+
+[ext_resource path="res://native/Game.gdns" type="Script" id=1]
+[ext_resource path="res://scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn" type="PackedScene" id=2]
+[ext_resource path="res://scripts/LevelLoader.gd" type="Script" id=3]
+[ext_resource path="res://scenes/levels/GoalTriggerZone.tscn" type="PackedScene" id=4]
+[ext_resource path="res://scenes/objects/Player.tscn" type="PackedScene" id=5]
+
+[sub_resource type="CubeMesh" id=2]
+
+[sub_resource type="SphereMesh" id=3]
+=======
[gd_scene load_steps=5 format=2]
[ext_resource path="res://scenes/Game.gd" type="Script" id=1]
[ext_resource path="res://scenes/levels/test_scene_movement/TestSceneMovement.tscn" type="PackedScene" id=2]
[ext_resource path="res://assets/theme.tres" type="Theme" id=3]
[ext_resource path="res://assets/fonts/format.tres" type="DynamicFont" id=4]
+>>>>>>> menu
[node name="Game" type="Spatial"]
script = ExtResource( 1 )
+[node name="LevelLoader" type="Node" parent="."]
+script = ExtResource( 3 )
+
+[node name="Level1" type="Spatial" parent="."]
+
+[node name="MeshInstance" type="MeshInstance" parent="Level1"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.99199, 0 )
+mesh = SubResource( 2 )
+material/0 = null
+
+[node name="GoalTriggerZone" parent="Level1" instance=ExtResource( 4 )]
+
+[node name="Level2" type="Spatial" parent="."]
+visible = false
+
+[node name="MeshInstance" type="MeshInstance" parent="Level2"]
+transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.99549, 0 )
+mesh = SubResource( 3 )
+material/0 = null
+
+[node name="PlayerRoot" parent="." instance=ExtResource( 5 )]
+input/camera_mouse_sensitivity = Vector2( 0.005, 0.005 )
+input/shoot_sensitivity = 0.005
+
[node name="TestScene" parent="." instance=ExtResource( 2 )]
[node name="PausePopup" type="Control" parent="."]
diff --git a/godot/scenes/levels/GoalTriggerZone.tscn b/godot/scenes/levels/GoalTriggerZone.tscn
new file mode 100644
index 0000000..861db4d
--- /dev/null
+++ b/godot/scenes/levels/GoalTriggerZone.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=2]
+
+[ext_resource path="res://scripts/GoalTriggerBox.gd" type="Script" id=1]
+
+[sub_resource type="BoxShape" id=1]
+
+[node name="GoalTriggerZone" type="Area"]
+transform = Transform( 10, 0, 0, 0, 10, 0, 0, 0, 10, 20, 0, 0 )
+script = ExtResource( 1 )
+
+[node name="CollisionShape" type="CollisionShape" parent="."]
+shape = SubResource( 1 )
+
+[connection signal="body_entered" from="." to="." method="_on_Area2_body_entered"]
diff --git a/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn b/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
index 0820451..c1c8707 100644
--- a/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
+++ b/godot/scenes/levels/test_scene_uuuhhh/TestSceneUuuhhh.tscn
@@ -1,19 +1,15 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=4 format=2]
[ext_resource path="res://scenes/levels/test_scene_uuuhhh/Wall.tscn" type="PackedScene" id=1]
[ext_resource path="res://scenes/levels/test_scene_uuuhhh/Floor.tscn" type="PackedScene" id=2]
-[ext_resource path="res://scenes/scripts/roblox-cube.gd" type="Script" id=3]
[ext_resource path="res://assets/sounds/Uuhhh.mp3" type="AudioStream" id=4]
+<<<<<<< HEAD
+=======
[ext_resource path="res://scenes/Die.tscn" type="PackedScene" id=5]
+>>>>>>> menu
[node name="TestScene" type="Spatial"]
-[node name="W8" parent="." instance=ExtResource( 5 )]
-transform = Transform( 0.990268, 0.0360207, 0.134431, 0, 0.965926, -0.258819, -0.139173, 0.2563, 0.956525, -2.57174, 1.79727, 8.45058 )
-contacts_reported = 3
-contact_monitor = true
-script = ExtResource( 3 )
-
[node name="Floor" parent="." instance=ExtResource( 2 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0290833, -0.981747, 0.00208664 )
diff --git a/godot/scripts/GoalTriggerBox.gd b/godot/scripts/GoalTriggerBox.gd
new file mode 100644
index 0000000..17e98ad
--- /dev/null
+++ b/godot/scripts/GoalTriggerBox.gd
@@ -0,0 +1,22 @@
+extends Area
+
+const Loader = preload("res://scripts/LevelLoader.gd")
+var loader: Loader = null
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ loader = get_node("/root/Game/LevelLoader")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+#func _process(delta):
+# pass
+
+
+func _on_Area2_body_entered(body: RigidBody):
+ # return when body is not a rigidbody
+ if body == null:
+ return
+
+ loader.load_next_level()
+
diff --git a/godot/scripts/LevelLoader.gd b/godot/scripts/LevelLoader.gd
new file mode 100644
index 0000000..2aec587
--- /dev/null
+++ b/godot/scripts/LevelLoader.gd
@@ -0,0 +1,55 @@
+extends Node
+
+const NUM_LEVELS = 9
+
+# player node
+var player: Spatial = null
+
+# level control
+var current_level_id = 0
+var levels = []
+
+# stroke control
+var current_strokes = 0
+var strokes_per_level = []
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ for i in range(NUM_LEVELS):
+ levels.append(get_node("/root/Game/Level%d" % (i+1)))
+
+ current_strokes = 0
+ levels[0].show()
+
+ player = get_node("/root/Game/PlayerRoot")
+
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+#func _process(delta):
+# pass
+
+func load_next_level():
+ levels[current_level_id].hide()
+ current_level_id = current_level_id + 1
+
+ if current_level_id >= NUM_LEVELS:
+ # TODO load main menu
+ return
+
+ # load next level
+ levels[current_level_id].show()
+
+ # save current strokes and reset
+ strokes_per_level.append(current_strokes)
+ current_strokes = 0
+
+ # TODO teleport player back
+
+
+func add_stroke():
+ current_strokes += 1
+
+
+func revoke_stroke():
+ current_strokes -= 1
+
diff --git a/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
index 115f39f..9c500ba 100644
--- a/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
+++ b/lib/x86_64-pc-windows-msvc/code_with_your_friends2022.dll
Binary files differ
diff --git a/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so b/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
index 03ade02..962bdb5 100755
--- a/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
+++ b/lib/x86_64-unknown-linux-gnu/libcode_with_your_friends2022.so
Binary files differ
diff --git a/rust/src/basic_die.rs b/rust/src/basic_die.rs
index 2a61197..304df90 100644
--- a/rust/src/basic_die.rs
+++ b/rust/src/basic_die.rs
@@ -1,6 +1,12 @@
use std::borrow::Borrow;
use gdnative::api::*;
use gdnative::prelude::*;
+use gdnative::core_types::VariantArray;
+use crate::buff_trait::Buff;
+use crate::buff_ball::BuffBall;
+use crate::buff_bounce::BuffBounce;
+use crate::buff_phase::BuffPhase;
+use crate::buff_extra::BuffExtra;
/// the input state for the player
enum InputState {
@@ -8,9 +14,10 @@ enum InputState {
Shooting,
Moving
}
-
+
type SpatialRef = Option<Ref<Spatial>>;
+type NodeRef = Option<Ref<Node>>;
/// the basic die used by the player
#[derive(NativeClass)]
@@ -31,6 +38,10 @@ pub struct BasicDie {
mouse_sensitivity: Vector2,
#[property(path="input/shoot_sensitivity")]
shoot_sensitivity: f32,
+ #[property(path="input/current_buff_index")]
+ current_buff_index: i32,
+
+ all_buffs: [Option<Box<dyn Buff>>; 5],
input_state: InputState,
current_force: f32,
@@ -44,6 +55,7 @@ pub struct BasicDie {
node_camera_arm_horizontal: SpatialRef,
node_camera_arm_vertical: SpatialRef,
node_camera: SpatialRef,
+ node_loader: NodeRef,
}
#[methods]
@@ -62,6 +74,8 @@ impl BasicDie {
stopping_min_ms: 1000,
mouse_sensitivity: Vector2 { x: 1.0, y: 1.0 },
shoot_sensitivity: 1.0,
+ current_buff_index: 0,
+ all_buffs: [None, None, None, None, None],
input_state: InputState::Default,
current_force: 0.0,
@@ -75,6 +89,7 @@ impl BasicDie {
node_camera_arm_horizontal: None,
node_camera_arm_vertical: None,
node_camera: None,
+ node_loader: None,
}
}
@@ -109,13 +124,35 @@ impl BasicDie {
self.node_camera_arm_vertical = search_node(&self.node_camera_arm_horizontal, String::from("CameraArmVertical"));
self.node_camera = search_node(&self.node_camera_arm_vertical, String::from("Camera"));
+ // look for the level loader in the hierarchy
+ self.node_loader = owner.get_node("/root/Game/LevelLoader");
+
godot_print!("{:?}", self.node_camera_root);
godot_print!("{:?}", self.node_camera_arm_horizontal);
godot_print!("{:?}", self.node_camera_arm_vertical);
godot_print!("{:?}", self.node_camera);
+ godot_print!("{:?}", self.node_loader);
self.node_die = search_node(&None, String::from("W8"));
+ let die = match self.node_die {
+ None => { godot_warn!("No W8 assigned."); return; },
+ Some(node) =>
+ match node.assume_safe().cast::<RigidBody>() {
+ None => { godot_warn!("W8 is not a RigidBody."); return; },
+ Some(rb) => rb.claim()
+ }
+ };
+
+ self.all_buffs = [
+ None,
+ Some(Box::new(BuffBall ::new(Box::new(die)))),
+ Some(Box::new(BuffBounce::new(Box::new(die)))),
+ Some(Box::new(BuffPhase ::new(Box::new(die)))),
+ Some(Box::new(BuffExtra ::new())),
+ ];
+
+ godot_print!("Current Buff: {}", self.current_buff_index);
godot_print!("Player is ready");
}
@@ -138,8 +175,16 @@ impl BasicDie {
}
}
- // detect if the die stops moving
let delta_ms = OS::godot_singleton().get_ticks_msec() - self.last_shot_time;
+
+ // deactivate the Ball Buff after 5 seconds
+ if matches!(self.input_state, InputState::Moving)
+ && delta_ms > 5000
+ && self.current_buff_index == 1 {
+ self.stop_die(_owner);
+ }
+
+ // detect if the die stops moving
if matches!(self.input_state, InputState::Moving)
&& (delta_ms > self.stopping_min_ms) {
@@ -148,6 +193,8 @@ impl BasicDie {
if current_vel <= self.stopping_velocity {
self.input_state = InputState::Default;
godot_print!("Die stopped moving at velocity {} after {} ms", current_vel, delta_ms);
+
+ self.stop_die(_owner);
}
};
}
@@ -317,5 +364,39 @@ impl BasicDie {
die.apply_impulse(die.transform().origin, impulse_dir);
self.last_shot_time = OS::godot_singleton().get_ticks_msec();
+
+ // call the stuff in GDScript
+ match self.node_loader {
+ Some(loader) => {
+ let save_loader = loader.assume_safe();
+ save_loader.call("add_stroke", &[]);
+ },
+ None => godot_warn!("No node loader assigned"),
+ }
+ }
+
+ unsafe fn stop_die(&mut self, owner: &Spatial) {
+ //deactivate the old buff
+ godot_print!("Current Buff: {}", self.current_buff_index);
+ match self.all_buffs[self.current_buff_index as usize] {
+ Some(ref mut buff) => buff.revert_buff(),
+ None => {}
+ }
+
+ // get the facing direction of the die and determine the next buff based on that
+ match self.node_die {
+ Some(die) => {
+ let forward = die.assume_safe().global_transform().basis.c().normalized();
+ godot_print!("forward: {} | {} | {}", forward.x, forward.y, forward.z);
+ },
+ None => {}
+ }
+
+ // apply the current buff
+ godot_print!("Current Buff: {}", self.current_buff_index);
+ match self.all_buffs[self.current_buff_index as usize] {
+ Some(ref mut buff) => buff.execute_buff(),
+ None => {}
+ }
}
}
diff --git a/rust/src/buff_ball.rs b/rust/src/buff_ball.rs
index 4b89dbb..219e675 100644
--- a/rust/src/buff_ball.rs
+++ b/rust/src/buff_ball.rs
@@ -2,71 +2,66 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffBall {
+pub struct BuffBall {
name: String,
description: String,
-
- die_body: Option<Ref<RigidBody>>,
- sphere_body: Option<Ref<RigidBody>>
+ collision_die: Ref<CollisionShape>,
+ collision_sphere: Ref<CollisionShape>,
+ mesh_die: Ref<MeshInstance>,
+ mesh_sphere: Ref<MeshInstance>,
}
impl BuffBall {
- fn new(die_body: Option<Ref<RigidBody>>, sphere_body: Option<Ref<RigidBody>>) -> Self {
+
+ pub fn new(die_body: Box<Ref<RigidBody>>) -> Self {
+
+ // find a collision shape
+ fn search<T: SubClass<Node>> (die_body: &Box<Ref<RigidBody>>, name: String) -> Option<Ref<T>> {
+ unsafe{
+ match die_body.assume_safe().get_node(&name) {
+ None => {
+ godot_warn!("Could not find {}", name);
+ None
+ }
+ Some(node) => {
+ match node.assume_safe().cast::<T>() {
+ None => {
+ godot_warn!("{} is not a {}", name, std::any::type_name::<T>());
+ None
+ },
+ Some(cs) => Some(cs.claim())
+ }
+ }
+ }
+ }
+ }
+
BuffBall {
name: String::from("Ball"),
description: String::from("Roll the dice"),
-
- die_body,
- sphere_body
+ collision_die: search::<CollisionShape>(&die_body, String::from("CollisionShapeDie" )).unwrap(),
+ collision_sphere: search::<CollisionShape>(&die_body, String::from("CollisionShapeSphere")).unwrap(),
+ mesh_die: search::<MeshInstance>(&die_body, String::from("MeshDie" )).unwrap(),
+ mesh_sphere: search::<MeshInstance>(&die_body, String::from("MeshSphere")).unwrap(),
}
}
}
impl Buff for BuffBall {
unsafe fn execute_buff(&mut self) {
- // make sure the sphere rigid body exists
- match &self.sphere_body {
- Some(sphere) => {
- // make sure the dice rigid body exists
- match &self.die_body {
- Some(die) => {
- // get the safe references from the ref<>
- let save_sphere = sphere.assume_safe();
- let save_die = die.assume_safe();
-
- // set the properties of the rigid bodies
- save_die.set_process(false);
- save_sphere.set_process(true);
- save_sphere.show();
- },
- None => godot_warn!("Die body not assigned")
- }
- },
- None => godot_warn!("Sphere body not assigned")
- }
+ self.collision_die.assume_safe().set_disabled(true);
+ self.collision_sphere.assume_safe().set_disabled(false);
+ self.mesh_die.assume_safe().set_visible(false);
+ self.mesh_sphere.assume_safe().set_visible(true);
+ godot_print!("Ball activated");
}
unsafe fn revert_buff(&mut self) {
- // make sure the sphere rigid body exists
- match &self.sphere_body {
- Some(sphere) => {
- // make sure the dice rigid body exists
- match &self.die_body {
- Some(die) => {
- // get the safe references from the ref<>
- let save_sphere = sphere.assume_safe();
- let save_die = die.assume_safe();
-
- // set the properties of the rigid bodies
- save_die.set_process(true);
- save_sphere.set_process(false);
- save_sphere.hide();
- },
- None => godot_warn!("Die body not assigned")
- }
- },
- None => godot_warn!("Sphere body not assigned")
- }
+ self.collision_die.assume_safe().set_disabled(false);
+ self.collision_sphere.assume_safe().set_disabled(true);
+ self.mesh_sphere.assume_safe().set_visible(false);
+ self.mesh_die.assume_safe().set_visible(true);
+ godot_print!("Ball deactivated");
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/buff_bounce.rs b/rust/src/buff_bounce.rs
index 179642d..cb9ded8 100644
--- a/rust/src/buff_bounce.rs
+++ b/rust/src/buff_bounce.rs
@@ -2,22 +2,21 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffBounce {
+pub struct BuffBounce {
name: String,
description: String,
- rigid_body: Option<Ref<RigidBody>>,
+ rigid_body: Box<Ref<RigidBody>>,
target_bounciness: f64,
previous_bounciness: f64
}
impl BuffBounce {
- fn new(rigid_body: Option<Ref<RigidBody>>) -> Self {
+ pub fn new(rigid_body: Box<Ref<RigidBody>>) -> Self {
BuffBounce {
name: String::from("Bounce"),
description: String::from("Let's the die bounce more than usual."),
rigid_body,
-
target_bounciness: 1.0,
previous_bounciness: 0.0
}
@@ -25,43 +24,30 @@ impl BuffBounce {
}
impl Buff for BuffBounce {
- unsafe fn execute_buff(&mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- let safe_body = body.assume_safe();
- // get the physics material
- match safe_body.physics_material_override() {
- Some(mat) => {
- let save_mat = mat.assume_safe();
- self.previous_bounciness = save_mat.bounce();
- save_mat.set_bounce(self.target_bounciness);
- },
- None => godot_warn!("Physics material was not found")
- }
+ unsafe fn execute_buff(&mut self) {
+ // get the physics material
+ match self.rigid_body.assume_safe().physics_material_override() {
+ Some(mat) => {
+ let save_mat = mat.assume_safe();
+ self.previous_bounciness = save_mat.bounce();
+ save_mat.set_bounce(self.target_bounciness);
},
- None => godot_warn!("No rigid body initialized to apply properties to")
+ None => godot_warn!("Physics material was not found")
}
+ godot_print!("Bounce activated");
}
unsafe fn revert_buff(&mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- let safe_body = body.assume_safe();
-
- // get the physics material
- match safe_body.physics_material_override() {
- Some(mat) => {
- let save_mat = mat.assume_safe();
- save_mat.set_bounce(self.previous_bounciness);
- },
- None => godot_warn!("Physics material was not found")
- }
+ // get the physics material
+ match self.rigid_body.assume_safe().physics_material_override() {
+ Some(mat) => {
+ let save_mat = mat.assume_safe();
+ save_mat.set_bounce(self.previous_bounciness);
},
- None => godot_warn!("No rigid body initialized to apply properties to")
+ None => godot_warn!("Physics material was not found")
}
+ godot_print!("Bounce deactivated");
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/buff_extra.rs b/rust/src/buff_extra.rs
index 473cdde..a7b7902 100644
--- a/rust/src/buff_extra.rs
+++ b/rust/src/buff_extra.rs
@@ -2,13 +2,13 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffExtra {
+pub struct BuffExtra {
name: String,
description: String,
}
impl BuffExtra {
- fn new() -> Self {
+ pub fn new() -> Self {
BuffExtra {
name: String::from("Extra Stroke"),
description: String::from("One additional stroke that doesn't count"),
diff --git a/rust/src/buff_phase.rs b/rust/src/buff_phase.rs
index e64508e..f69fecc 100644
--- a/rust/src/buff_phase.rs
+++ b/rust/src/buff_phase.rs
@@ -2,16 +2,16 @@ use gdnative::api::*;
use gdnative::prelude::*;
use crate::buff_trait::Buff;
-struct BuffPhase {
+pub struct BuffPhase {
name: String,
description: String,
- rigid_body: Option<Ref<RigidBody>>,
+ rigid_body: Box<Ref<RigidBody>>,
wall_layer_bit: i64,
}
impl BuffPhase {
- fn new(rigid_body: Option<Ref<RigidBody>>) -> Self {
+ pub fn new(rigid_body: Box<Ref<RigidBody>>) -> Self {
// calculate the bit for the mask to enable/ disable collision detection
let mask_layer = 2;
let mask_bit = 2_i64.pow(mask_layer - 1);
@@ -20,7 +20,6 @@ impl BuffPhase {
name: String::from("Phase"),
description: String::from("Phases through thin fences"),
rigid_body,
-
wall_layer_bit: mask_bit,
}
}
@@ -28,26 +27,12 @@ impl BuffPhase {
impl Buff for BuffPhase {
unsafe fn execute_buff(&mut self) {
- match &self.rigid_body {
- Some(body) => {
- // actually disable the collision to the fences
- let save_body = body.assume_safe();
- save_body.set_collision_mask_bit(self.wall_layer_bit, false);
- },
- None => godot_warn!("Rigid body not found")
- }
+ // actually disable the collision to the fences
+ self.rigid_body.assume_safe().set_collision_mask_bit(self.wall_layer_bit, false);
}
unsafe fn revert_buff(& mut self) {
- // make sure the rigid body exists
- match &self.rigid_body {
- Some(body) => {
- // actually enable the collision again
- let save_body = body.assume_safe();
- save_body.set_collision_mask_bit(self.wall_layer_bit, false);
- },
- None => godot_warn!("Rigid body not found")
- }
+ self.rigid_body.assume_safe().set_collision_mask_bit(self.wall_layer_bit, false);
}
fn get_name(self) -> GodotString {
diff --git a/rust/src/goal_trigger.rs b/rust/src/goal_trigger.rs
new file mode 100644
index 0000000..457eb7b
--- /dev/null
+++ b/rust/src/goal_trigger.rs
@@ -0,0 +1,30 @@
+use gdnative::api::*;
+use gdnative::prelude::*;
+use gdnative::core_types::VariantArray;
+use gdnative::object::*;
+
+/// The SpinningCube "class"
+#[derive(NativeClass)]
+#[inherit(Node)]
+pub struct GoalTriggerZone {
+ level_loader: Option<Ref<Node>>,
+}
+
+#[methods]
+impl GoalTriggerZone {
+ fn new(_owner: &Node) -> Self {
+ GoalTriggerZone {
+ level_loader: None,
+ }
+ }
+
+ #[export]
+ unsafe fn _ready(&mut self, owner: &Node) {
+ // TODO get loader
+ }
+
+ #[export]
+ fn overlap(&mut self, owner: &Node) {
+ godot_print!("OVERLAPPED");
+ }
+}
diff --git a/rust/src/lib.rs b/rust/src/lib.rs
index f683d35..c8afc06 100644
--- a/rust/src/lib.rs
+++ b/rust/src/lib.rs
@@ -3,12 +3,24 @@ mod buff_phase;
mod buff_trait;
mod buff_ball;
mod buff_extra;
+<<<<<<< HEAD
+pub mod goal_trigger;
+mod test;
+=======
+>>>>>>> menu
mod basic_die;
use gdnative::prelude::{godot_init, InitHandle};
// Function that registers all exposed classes to Godot
fn init(handle: InitHandle) {
+<<<<<<< HEAD
+ handle.add_class::<game::Game>();
+ handle.add_class::<spinning_cube::SpinningCube>();
+ handle.add_class::<goal_trigger::GoalTriggerZone>();
+ handle.add_class::<test::SpinningCubeReverse>();
+=======
+>>>>>>> menu
handle.add_class::<basic_die::BasicDie>();
}