summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/dictionary.cpp14
-rw-r--r--core/dictionary.h2
-rw-r--r--core/io/networked_multiplayer_peer.cpp29
-rw-r--r--core/io/networked_multiplayer_peer.h40
-rw-r--r--core/io/resource_format_binary.cpp24
-rw-r--r--core/make_binders.py5
-rw-r--r--core/method_bind.cpp7
-rw-r--r--core/method_bind.h8
-rw-r--r--core/object.h2
-rw-r--r--core/object_type_db.cpp17
-rw-r--r--core/object_type_db.h1
-rw-r--r--core/os/keyboard.cpp21
-rw-r--r--core/os/keyboard.h3
-rw-r--r--core/script_language.h6
-rw-r--r--core/ustring.cpp2
-rw-r--r--core/variant.h4
-rw-r--r--core/variant_call.cpp50
17 files changed, 223 insertions, 12 deletions
diff --git a/core/dictionary.cpp b/core/dictionary.cpp
index 6204a87054..6770b798f1 100644
--- a/core/dictionary.cpp
+++ b/core/dictionary.cpp
@@ -232,6 +232,20 @@ Error Dictionary::parse_json(const String& p_json) {
return OK;
}
+Dictionary Dictionary::copy() const {
+
+ Dictionary n(is_shared());
+
+ List<Variant> keys;
+ get_key_list(&keys);
+
+ for(List<Variant>::Element *E=keys.front();E;E=E->next()) {
+ n[E->get()]=operator[](E->get());
+ }
+
+ return n;
+}
+
String Dictionary::to_json() const {
return JSON::print(*this);
diff --git a/core/dictionary.h b/core/dictionary.h
index ae79fab9c3..6a5f4e20e6 100644
--- a/core/dictionary.h
+++ b/core/dictionary.h
@@ -83,6 +83,8 @@ public:
Array keys() const;
Array values() const;
+ Dictionary copy() const;
+
Dictionary(const Dictionary& p_from);
Dictionary(bool p_shared=false);
~Dictionary();
diff --git a/core/io/networked_multiplayer_peer.cpp b/core/io/networked_multiplayer_peer.cpp
new file mode 100644
index 0000000000..79f3e129e1
--- /dev/null
+++ b/core/io/networked_multiplayer_peer.cpp
@@ -0,0 +1,29 @@
+#include "networked_multiplayer_peer.h"
+
+
+void NetworkedMultiplayerPeer::_bind_methods() {
+
+ ObjectTypeDB::bind_method(_MD("set_transfer_mode","mode"), &NetworkedMultiplayerPeer::set_transfer_mode );
+ ObjectTypeDB::bind_method(_MD("set_target_peer","id"), &NetworkedMultiplayerPeer::set_target_peer );
+ ObjectTypeDB::bind_method(_MD("set_channel","id"), &NetworkedMultiplayerPeer::set_channel );
+
+ ObjectTypeDB::bind_method(_MD("get_packet_peer"), &NetworkedMultiplayerPeer::get_packet_peer );
+ ObjectTypeDB::bind_method(_MD("get_packet_channel"), &NetworkedMultiplayerPeer::get_packet_channel );
+
+ ObjectTypeDB::bind_method(_MD("poll"), &NetworkedMultiplayerPeer::poll );
+
+
+ BIND_CONSTANT( TARGET_ALL_PEERS );
+
+ BIND_CONSTANT( TRANSFER_MODE_UNRELIABLE );
+ BIND_CONSTANT( TRANSFER_MODE_RELIABLE );
+ BIND_CONSTANT( TRANSFER_MODE_ORDERED );
+
+ ADD_SIGNAL( MethodInfo("peer_connected",PropertyInfo(Variant::INT,"id")));
+ ADD_SIGNAL( MethodInfo("peer_disconnected",PropertyInfo(Variant::INT,"id")));
+}
+
+NetworkedMultiplayerPeer::NetworkedMultiplayerPeer() {
+
+
+}
diff --git a/core/io/networked_multiplayer_peer.h b/core/io/networked_multiplayer_peer.h
new file mode 100644
index 0000000000..f140b57b8b
--- /dev/null
+++ b/core/io/networked_multiplayer_peer.h
@@ -0,0 +1,40 @@
+#ifndef NETWORKED_MULTIPLAYER_PEER_H
+#define NETWORKED_MULTIPLAYER_PEER_H
+
+#include "io/packet_peer.h"
+
+class NetworkedMultiplayerPeer : public PacketPeer {
+
+ OBJ_TYPE(NetworkedMultiplayerPeer,PacketPeer);
+
+protected:
+ static void _bind_methods();
+public:
+
+ enum {
+ TARGET_ALL_PEERS=0xFFFFFF // send to this for all peers
+ };
+
+ enum TransferMode {
+ TRANSFER_MODE_UNRELIABLE,
+ TRANSFER_MODE_RELIABLE,
+ TRANSFER_MODE_ORDERED
+ };
+
+ virtual void set_transfer_mode(TransferMode p_mode)=0;
+ virtual void set_target_peer(int p_peer)=0;
+ virtual void set_channel(int p_channel)=0;
+
+
+ virtual int get_packet_peer() const=0;
+ virtual int get_packet_channel() const=0;
+
+
+ virtual void poll()=0;
+
+ NetworkedMultiplayerPeer();
+};
+
+VARIANT_ENUM_CAST( NetworkedMultiplayerPeer::TransferMode )
+
+#endif // NetworkedMultiplayerPeer_H
diff --git a/core/io/resource_format_binary.cpp b/core/io/resource_format_binary.cpp
index 343a54e0d7..a620dc0fef 100644
--- a/core/io/resource_format_binary.cpp
+++ b/core/io/resource_format_binary.cpp
@@ -447,13 +447,17 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant& r_v) {
} break;
case VARIANT_INPUT_EVENT: {
+ InputEvent ev;
+ ev.type=f->get_32(); //will only work for null though.
+ r_v=ev;
+
} break;
case VARIANT_DICTIONARY: {
- uint32_t len=f->get_32();
- Dictionary d(len&0x80000000); //last bit means shared
- len&=0x7FFFFFFF;
- for(uint32_t i=0;i<len;i++) {
+ uint32_t len=f->get_32();
+ Dictionary d(len&0x80000000); //last bit means shared
+ len&=0x7FFFFFFF;
+ for(uint32_t i=0;i<len;i++) {
Variant key;
Error err = parse_variant(key);
ERR_FAIL_COND_V(err,ERR_FILE_CORRUPT);
@@ -466,11 +470,11 @@ Error ResourceInteractiveLoaderBinary::parse_variant(Variant& r_v) {
} break;
case VARIANT_ARRAY: {
- uint32_t len=f->get_32();
- Array a(len&0x80000000); //last bit means shared
- len&=0x7FFFFFFF;
+ uint32_t len=f->get_32();
+ Array a(len&0x80000000); //last bit means shared
+ len&=0x7FFFFFFF;
a.resize(len);
- for(uint32_t i=0;i<len;i++) {
+ for(uint32_t i=0;i<len;i++) {
Variant val;
Error err = parse_variant(val);
ERR_FAIL_COND_V(err,ERR_FILE_CORRUPT);
@@ -1725,7 +1729,9 @@ void ResourceFormatSaverBinaryInstance::write_variant(const Variant& p_property,
case Variant::INPUT_EVENT: {
f->store_32(VARIANT_INPUT_EVENT);
- WARN_PRINT("Can't save InputEvent (maybe it could..)");
+ InputEvent event=p_property;
+ f->store_32(0); //event type none, nothing else suported for now.
+
} break;
case Variant::DICTIONARY: {
diff --git a/core/make_binders.py b/core/make_binders.py
index c14f07ac83..7584722965 100644
--- a/core/make_binders.py
+++ b/core/make_binders.py
@@ -62,6 +62,8 @@ public:
#else
set_argument_count($argc$);
#endif
+
+ $ifret _set_returns(true); $
};
};
@@ -140,6 +142,9 @@ public:
#else
set_argument_count($argc$);
#endif
+ $ifret _set_returns(true); $
+
+
};
};
diff --git a/core/method_bind.cpp b/core/method_bind.cpp
index b41fa33887..a99d0af636 100644
--- a/core/method_bind.cpp
+++ b/core/method_bind.cpp
@@ -64,6 +64,12 @@ void MethodBind::_set_const(bool p_const) {
_const=p_const;
}
+void MethodBind::_set_returns(bool p_returns) {
+
+ _returns=p_returns;
+}
+
+
StringName MethodBind::get_name() const {
return name;
}
@@ -118,6 +124,7 @@ MethodBind::MethodBind() {
argument_types=NULL;
#endif
_const=false;
+ _returns=false;
}
MethodBind::~MethodBind() {
diff --git a/core/method_bind.h b/core/method_bind.h
index 30a848270d..072953743c 100644
--- a/core/method_bind.h
+++ b/core/method_bind.h
@@ -154,6 +154,9 @@ VARIANT_ENUM_CAST( wchar_t );
VARIANT_ENUM_CAST( Margin );
VARIANT_ENUM_CAST( Orientation );
VARIANT_ENUM_CAST( HAlign );
+VARIANT_ENUM_CAST( Variant::Type );
+VARIANT_ENUM_CAST( Variant::Operator );
+VARIANT_ENUM_CAST( InputEvent::Type );
class MethodBind {
@@ -170,11 +173,13 @@ class MethodBind {
StringName ret_type;
#endif
bool _const;
+ bool _returns;
protected:
void _set_const(bool p_const);
+ void _set_returns(bool p_returns);
#ifdef DEBUG_METHODS_ENABLED
virtual Variant::Type _gen_argument_type(int p_arg) const=0;
void _generate_argument_types(int p_count);
@@ -261,6 +266,7 @@ public:
void set_name(const StringName& p_name);
_FORCE_INLINE_ int get_method_id() const { return method_id; }
_FORCE_INLINE_ bool is_const() const { return _const; }
+ _FORCE_INLINE_ bool has_return() const { return _returns; }
void set_default_arguments(const Vector<Variant>& p_defargs);
@@ -321,7 +327,7 @@ public:
virtual bool is_const() const { return false; }
virtual String get_instance_type() const { return T::get_type_static(); }
- MethodBindNative() { call_method=NULL; }
+ MethodBindNative() { call_method=NULL; _set_returns(true);}
};
diff --git a/core/object.h b/core/object.h
index d7b0f09df9..400ab3070e 100644
--- a/core/object.h
+++ b/core/object.h
@@ -68,6 +68,8 @@ enum PropertyHint {
PROPERTY_HINT_IMAGE_COMPRESS_LOSSY,
PROPERTY_HINT_IMAGE_COMPRESS_LOSSLESS,
PROPERTY_HINT_OBJECT_ID,
+ PROPERTY_HINT_TYPE_STRING, ///< a type string, the hint is the base type to choose
+ PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE, ///< so something else can provide this (used in scripts)
PROPERTY_HINT_MAX,
};
diff --git a/core/object_type_db.cpp b/core/object_type_db.cpp
index 4998263961..ba98797a89 100644
--- a/core/object_type_db.cpp
+++ b/core/object_type_db.cpp
@@ -549,6 +549,23 @@ bool ObjectTypeDB::has_signal(StringName p_type,StringName p_signal) {
return false;
}
+bool ObjectTypeDB::get_signal(StringName p_type,StringName p_signal,MethodInfo *r_signal) {
+
+ TypeInfo *type=types.getptr(p_type);
+ TypeInfo *check=type;
+ while(check) {
+ if (check->signal_map.has(p_signal)) {
+ if (r_signal) {
+ *r_signal=check->signal_map[p_signal];
+ }
+ return true;
+ }
+ check=check->inherits_ptr;
+ }
+
+ return false;
+}
+
void ObjectTypeDB::add_property(StringName p_type,const PropertyInfo& p_pinfo, const StringName& p_setter, const StringName& p_getter, int p_index) {
diff --git a/core/object_type_db.h b/core/object_type_db.h
index 4922e1b67f..3fcd38aa31 100644
--- a/core/object_type_db.h
+++ b/core/object_type_db.h
@@ -462,6 +462,7 @@ public:
static void add_signal(StringName p_type,const MethodInfo& p_signal);
static bool has_signal(StringName p_type,StringName p_signal);
+ static bool get_signal(StringName p_type,StringName p_signal,MethodInfo *r_signal);
static void get_signal_list(StringName p_type,List<MethodInfo> *p_signals,bool p_no_inheritance=false);
static void add_property(StringName p_type,const PropertyInfo& p_pinfo, const StringName& p_setter, const StringName& p_getter, int p_index=-1);
diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp
index 4c0a074a07..9710638234 100644
--- a/core/os/keyboard.cpp
+++ b/core/os/keyboard.cpp
@@ -429,6 +429,27 @@ static const _KeyCodeReplace _keycode_replace_neo[]={
{0,0}
};
+int keycode_get_count() {
+
+ const _KeyCodeText *kct =&_keycodes[0];
+
+ int count=0;
+ while(kct->text) {
+
+ count++;
+ kct++;
+ }
+ return count;
+}
+
+int keycode_get_value_by_index(int p_index) {
+ return _keycodes[p_index].code;
+}
+
+const char* keycode_get_name_by_index(int p_index) {
+ return _keycodes[p_index].text;
+}
+
int latin_keyboard_keycode_convert(int p_keycode) {
diff --git a/core/os/keyboard.h b/core/os/keyboard.h
index 80472acc09..fd52d331c8 100644
--- a/core/os/keyboard.h
+++ b/core/os/keyboard.h
@@ -328,6 +328,9 @@ enum KeyModifierMask {
String keycode_get_string(uint32_t p_code);
bool keycode_has_unicode(uint32_t p_unicode);
int find_keycode(const String& p_code);
+int keycode_get_count();
+int keycode_get_value_by_index(int p_index);
+const char* keycode_get_name_by_index(int p_index);
int latin_keyboard_keycode_convert(int p_keycode);
#endif
diff --git a/core/script_language.h b/core/script_language.h
index 6d75b83aaf..0e3f298790 100644
--- a/core/script_language.h
+++ b/core/script_language.h
@@ -98,6 +98,9 @@ public:
virtual void set_source_code(const String& p_code)=0;
virtual Error reload(bool p_keep_state=false)=0;
+ virtual bool has_method(const StringName& p_method) const=0;
+ virtual MethodInfo get_method_info(const StringName& p_method) const=0;
+
virtual bool is_tool() const=0;
virtual String get_node_type() const=0;
@@ -110,6 +113,7 @@ public:
virtual bool get_property_default_value(const StringName& p_property,Variant& r_value) const=0;
virtual void update_exports() {} //editor tool
+ virtual void get_method_list(List<MethodInfo> *p_list) const=0;
Script() {}
@@ -177,7 +181,7 @@ public:
virtual void get_reserved_words(List<String> *p_words) const=0;
virtual void get_comment_delimiters(List<String> *p_delimiters) const=0;
virtual void get_string_delimiters(List<String> *p_delimiters) const=0;
- virtual String get_template(const String& p_class_name, const String& p_base_class_name) const=0;
+ virtual Ref<Script> get_template(const String& p_class_name, const String& p_base_class_name) const=0;
virtual bool validate(const String& p_script, int &r_line_error,int &r_col_error,String& r_test_error, const String& p_path="",List<String> *r_functions=NULL) const=0;
virtual Script *create_script() const=0;
virtual bool has_named_classes() const=0;
diff --git a/core/ustring.cpp b/core/ustring.cpp
index 6788ada1bb..0d887210c3 100644
--- a/core/ustring.cpp
+++ b/core/ustring.cpp
@@ -3491,7 +3491,7 @@ bool String::is_valid_integer() const {
return false;
int from=0;
- if (operator[](0)=='+' || operator[](0)=='-')
+ if (len!=1 && (operator[](0)=='+' || operator[](0)=='-'))
from++;
for(int i=from;i<len;i++) {
diff --git a/core/variant.h b/core/variant.h
index 87bf20f8ee..b8b028a760 100644
--- a/core/variant.h
+++ b/core/variant.h
@@ -395,6 +395,10 @@ public:
void get_method_list(List<MethodInfo> *p_list) const;
bool has_method(const StringName& p_method) const;
+ static Vector<Variant::Type> get_method_argument_types(Variant::Type p_type,const StringName& p_method);
+ static Vector<Variant> get_method_default_arguments(Variant::Type p_type,const StringName& p_method);
+ static Variant::Type get_method_return_type(Variant::Type p_type,const StringName& p_method,bool* r_has_return=NULL);
+ static Vector<StringName> get_method_argument_names(Variant::Type p_type,const StringName& p_method);
void set_named(const StringName& p_index, const Variant& p_value, bool *r_valid=NULL);
Variant get_named(const StringName& p_index, bool *r_valid=NULL) const;
diff --git a/core/variant_call.cpp b/core/variant_call.cpp
index 7956c14c2c..069c20bc6e 100644
--- a/core/variant_call.cpp
+++ b/core/variant_call.cpp
@@ -1173,6 +1173,56 @@ bool Variant::has_method(const StringName& p_method) const {
}
+Vector<Variant::Type> Variant::get_method_argument_types(Variant::Type p_type,const StringName& p_method) {
+
+ const _VariantCall::TypeFunc &fd = _VariantCall::type_funcs[p_type];
+
+ const Map<StringName,_VariantCall::FuncData>::Element *E = fd.functions.find(p_method);
+ if (!E)
+ return Vector<Variant::Type>();
+
+ return E->get().arg_types;
+}
+
+Vector<StringName> Variant::get_method_argument_names(Variant::Type p_type,const StringName& p_method) {
+
+
+ const _VariantCall::TypeFunc &fd = _VariantCall::type_funcs[p_type];
+
+ const Map<StringName,_VariantCall::FuncData>::Element *E = fd.functions.find(p_method);
+ if (!E)
+ return Vector<StringName>();
+
+ return E->get().arg_names;
+
+}
+
+Variant::Type Variant::get_method_return_type(Variant::Type p_type,const StringName& p_method,bool* r_has_return) {
+
+ const _VariantCall::TypeFunc &fd = _VariantCall::type_funcs[p_type];
+
+ const Map<StringName,_VariantCall::FuncData>::Element *E = fd.functions.find(p_method);
+ if (!E)
+ return Variant::NIL;
+
+ if (r_has_return)
+ *r_has_return=E->get().return_type;
+
+ return E->get().return_type;
+}
+
+Vector<Variant> Variant::get_method_default_arguments(Variant::Type p_type,const StringName& p_method) {
+
+ const _VariantCall::TypeFunc &fd = _VariantCall::type_funcs[p_type];
+
+ const Map<StringName,_VariantCall::FuncData>::Element *E = fd.functions.find(p_method);
+ if (!E)
+ return Vector<Variant>();
+
+ return E->get().default_args;
+
+}
+
void Variant::get_method_list(List<MethodInfo> *p_list) const {