浏览代码

C#: Add random functions to GD class

Ignacio Etcheverry 6 年之前
父节点
当前提交
ce67808818
共有 3 个文件被更改,包括 87 次插入10 次删除
  1. 44 4
      modules/mono/glue/Managed/Files/GD.cs
  2. 30 3
      modules/mono/glue/gd_glue.cpp
  3. 13 3
      modules/mono/glue/gd_glue.h

+ 44 - 4
modules/mono/glue/Managed/Files/GD.cs

@@ -50,7 +50,7 @@ namespace Godot
             return godot_icall_GD_hash(var);
         }
 
-        public static Object InstanceFromId(int instanceId)
+        public static Object InstanceFromId(ulong instanceId)
         {
             return godot_icall_GD_instance_from_id(instanceId);
         }
@@ -110,6 +110,31 @@ namespace Godot
             godot_icall_GD_printt(what);
         }
 
+        public static double Randf()
+        {
+            return godot_icall_GD_randf();
+        }
+
+        public static uint Randi()
+        {
+            return godot_icall_GD_randi();
+        }
+
+        public static void Randomize()
+        {
+            godot_icall_GD_randomize();
+        }
+
+        public static double rand_range(double from, double to)
+        {
+            return godot_icall_GD_rand_range(from, to);
+        }
+
+        public static uint RandSeed(ulong seed, out ulong newSeed)
+        {
+            return godot_icall_GD_rand_seed(seed, out newSeed);
+        }
+
         public static int[] Range(int length)
         {
             var ret = new int[length];
@@ -174,7 +199,7 @@ namespace Godot
             return ret;
         }
 
-        public static void Seed(int seed)
+        public static void Seed(ulong seed)
         {
             godot_icall_GD_seed(seed);
         }
@@ -214,7 +239,7 @@ namespace Godot
         internal extern static int godot_icall_GD_hash(object var);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        internal extern static Object godot_icall_GD_instance_from_id(int instance_id);
+        internal extern static Object godot_icall_GD_instance_from_id(ulong instance_id);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         internal extern static void godot_icall_GD_print(object[] what);
@@ -232,7 +257,22 @@ namespace Godot
         internal extern static void godot_icall_GD_printt(object[] what);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        internal extern static void godot_icall_GD_seed(int seed);
+        internal extern static double godot_icall_GD_randf();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal extern static uint godot_icall_GD_randi();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal extern static void godot_icall_GD_randomize();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal extern static double godot_icall_GD_rand_range(double from, double to);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal extern static uint godot_icall_GD_rand_seed(ulong seed, out ulong newSeed);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        internal extern static void godot_icall_GD_seed(ulong seed);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         internal extern static string godot_icall_GD_str(object[] what);

+ 30 - 3
modules/mono/glue/gd_glue.cpp

@@ -52,7 +52,7 @@ MonoObject *godot_icall_GD_bytes2var(MonoArray *p_bytes) {
 	return GDMonoMarshal::variant_to_mono_object(ret);
 }
 
-MonoObject *godot_icall_GD_convert(MonoObject *p_what, int p_type) {
+MonoObject *godot_icall_GD_convert(MonoObject *p_what, int32_t p_type) {
 	Variant what = GDMonoMarshal::mono_object_to_variant(p_what);
 	const Variant *args[1] = { &what };
 	Variant::CallError ce;
@@ -65,7 +65,7 @@ int godot_icall_GD_hash(MonoObject *p_var) {
 	return GDMonoMarshal::mono_object_to_variant(p_var).hash();
 }
 
-MonoObject *godot_icall_GD_instance_from_id(int p_instance_id) {
+MonoObject *godot_icall_GD_instance_from_id(uint64_t p_instance_id) {
 	return GDMonoUtils::unmanaged_get_managed(ObjectDB::get_instance(p_instance_id));
 }
 
@@ -115,7 +115,29 @@ void godot_icall_GD_printt(MonoArray *p_what) {
 	print_line(str);
 }
 
-void godot_icall_GD_seed(int p_seed) {
+double godot_icall_GD_randf() {
+	return Math::randf();
+}
+
+uint32_t godot_icall_GD_randi() {
+	return Math::rand();
+}
+
+void godot_icall_GD_randomize() {
+	Math::randomize();
+}
+
+double godot_icall_GD_rand_range(double from, double to) {
+	return Math::random(from, to);
+}
+
+uint32_t godot_icall_GD_rand_seed(uint64_t seed, uint64_t *newSeed) {
+	int ret = Math::rand_from_seed(&seed);
+	*newSeed = seed;
+	return ret;
+}
+
+void godot_icall_GD_seed(uint64_t p_seed) {
 	Math::seed(p_seed);
 }
 
@@ -201,6 +223,11 @@ void godot_register_gd_icalls() {
 	mono_add_internal_call("Godot.GD::godot_icall_GD_printraw", (void *)godot_icall_GD_printraw);
 	mono_add_internal_call("Godot.GD::godot_icall_GD_prints", (void *)godot_icall_GD_prints);
 	mono_add_internal_call("Godot.GD::godot_icall_GD_printt", (void *)godot_icall_GD_printt);
+	mono_add_internal_call("Godot.GD::godot_icall_GD_randf", (void *)godot_icall_GD_randf);
+	mono_add_internal_call("Godot.GD::godot_icall_GD_randi", (void *)godot_icall_GD_randi);
+	mono_add_internal_call("Godot.GD::godot_icall_GD_randomize", (void *)godot_icall_GD_randomize);
+	mono_add_internal_call("Godot.GD::godot_icall_GD_rand_range", (void *)godot_icall_GD_rand_range);
+	mono_add_internal_call("Godot.GD::godot_icall_GD_rand_seed", (void *)godot_icall_GD_rand_seed);
 	mono_add_internal_call("Godot.GD::godot_icall_GD_seed", (void *)godot_icall_GD_seed);
 	mono_add_internal_call("Godot.GD::godot_icall_GD_str", (void *)godot_icall_GD_str);
 	mono_add_internal_call("Godot.GD::godot_icall_GD_str2var", (void *)godot_icall_GD_str2var);

+ 13 - 3
modules/mono/glue/gd_glue.h

@@ -37,11 +37,11 @@
 
 MonoObject *godot_icall_GD_bytes2var(MonoArray *p_bytes);
 
-MonoObject *godot_icall_GD_convert(MonoObject *p_what, int p_type);
+MonoObject *godot_icall_GD_convert(MonoObject *p_what, int32_t p_type);
 
 int godot_icall_GD_hash(MonoObject *p_var);
 
-MonoObject *godot_icall_GD_instance_from_id(int p_instance_id);
+MonoObject *godot_icall_GD_instance_from_id(uint64_t p_instance_id);
 
 void godot_icall_GD_print(MonoArray *p_what);
 
@@ -53,7 +53,17 @@ void godot_icall_GD_prints(MonoArray *p_what);
 
 void godot_icall_GD_printt(MonoArray *p_what);
 
-void godot_icall_GD_seed(int p_seed);
+double godot_icall_GD_randf();
+
+uint32_t godot_icall_GD_randi();
+
+void godot_icall_GD_randomize();
+
+double godot_icall_GD_rand_range(double from, double to);
+
+uint32_t godot_icall_GD_rand_seed(uint64_t seed, uint64_t *newSeed);
+
+void godot_icall_GD_seed(uint64_t p_seed);
 
 MonoString *godot_icall_GD_str(MonoArray *p_what);