277 lines
12 KiB
C++
277 lines
12 KiB
C++
/**************************************************************************/
|
|
/* aethex_script.h */
|
|
/**************************************************************************/
|
|
/* This file is part of: */
|
|
/* AETHEX ENGINE */
|
|
/* https://aethex.foundation */
|
|
/**************************************************************************/
|
|
/* Copyright (c) 2026-present AeThex Labs. */
|
|
/* Based on AETHEX ENGINE, MIT License. */
|
|
/**************************************************************************/
|
|
|
|
#pragma once
|
|
|
|
#include "core/io/resource_loader.h"
|
|
#include "core/io/resource_saver.h"
|
|
#include "core/object/script_language.h"
|
|
#include "core/templates/rb_set.h"
|
|
|
|
class AeThexScript;
|
|
class AeThexScriptInstance;
|
|
|
|
/**
|
|
* AeThex Scripting Language
|
|
*
|
|
* A cross-platform scripting language that can:
|
|
* - Run natively in the AeThex Engine
|
|
* - Export to Roblox (Lua)
|
|
* - Export to UEFN (Verse)
|
|
* - Export to Unity (C#)
|
|
* - Export to Web (JavaScript)
|
|
*
|
|
* Syntax example:
|
|
* reality MyGame {
|
|
* platforms: [roblox, uefn, web]
|
|
* }
|
|
*
|
|
* journey OnPlayerJoin(player) {
|
|
* notify "Welcome, " + player.name + "!"
|
|
* sync player.data across [roblox, uefn]
|
|
* }
|
|
*/
|
|
class AeThexScriptLanguage : public ScriptLanguage {
|
|
static AeThexScriptLanguage *singleton;
|
|
|
|
HashMap<StringName, Variant> global_constants;
|
|
|
|
public:
|
|
static AeThexScriptLanguage *get_singleton() { return singleton; }
|
|
|
|
// Language identification
|
|
virtual String get_name() const override { return "AeThex"; }
|
|
virtual String get_type() const override { return "AeThexScript"; }
|
|
virtual String get_extension() const override { return "aethex"; }
|
|
|
|
// Script management
|
|
virtual void init() override;
|
|
virtual void finish() override;
|
|
virtual bool supports_builtin_mode() const override { return true; }
|
|
virtual bool can_inherit_from_file() const override { return true; }
|
|
|
|
// Execution
|
|
virtual Vector<String> get_reserved_words() const override;
|
|
virtual bool is_control_flow_keyword(const String &p_keyword) const override;
|
|
virtual Vector<String> get_comment_delimiters() const override;
|
|
virtual Vector<String> get_doc_comment_delimiters() const override;
|
|
virtual Vector<String> get_string_delimiters() const override;
|
|
|
|
// Template generation
|
|
virtual Ref<Script> make_template(const String &p_template, const String &p_class_name, const String &p_base_class_name) const override;
|
|
virtual Vector<ScriptTemplate> get_built_in_templates(const StringName &p_object) override;
|
|
|
|
// Code validation
|
|
virtual bool validate(const String &p_script, const String &p_path = "", List<String> *r_functions = nullptr,
|
|
List<ScriptLanguage::ScriptError> *r_errors = nullptr, List<ScriptLanguage::Warning> *r_warnings = nullptr,
|
|
HashSet<int> *r_safe_lines = nullptr) const override;
|
|
virtual int find_function(const String &p_function, const String &p_code) const override;
|
|
virtual String make_function(const String &p_class, const String &p_name, const PackedStringArray &p_args) const override;
|
|
|
|
// Debugging
|
|
virtual String debug_get_error() const override;
|
|
virtual int debug_get_stack_level_count() const override;
|
|
virtual int debug_get_stack_level_line(int p_level) const override;
|
|
virtual String debug_get_stack_level_function(int p_level) const override;
|
|
virtual String debug_get_stack_level_source(int p_level) const override;
|
|
virtual void debug_get_stack_level_locals(int p_level, List<String> *p_locals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1) override;
|
|
virtual void debug_get_stack_level_members(int p_level, List<String> *p_members, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1) override;
|
|
virtual void debug_get_globals(List<String> *p_globals, List<Variant> *p_values, int p_max_subitems = -1, int p_max_depth = -1) override;
|
|
virtual String debug_parse_stack_level_expression(int p_level, const String &p_expression, int p_max_subitems = -1, int p_max_depth = -1) override;
|
|
|
|
// Profiling
|
|
virtual void profiling_start() override {}
|
|
virtual void profiling_stop() override {}
|
|
virtual void profiling_set_save_native_calls(bool p_enable) override {}
|
|
virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) override { return 0; }
|
|
virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) override { return 0; }
|
|
|
|
// Frame management
|
|
virtual void frame() override;
|
|
|
|
// Threading
|
|
virtual bool handles_global_class_type(const String &p_type) const override;
|
|
virtual String get_global_class_name(const String &p_path, String *r_base_type = nullptr, String *r_icon_path = nullptr, bool *r_is_abstract = nullptr, bool *r_is_tool = nullptr) const override;
|
|
|
|
// Required abstract implementations
|
|
virtual void auto_indent_code(String &p_code, int p_from_line, int p_to_line) const override {}
|
|
virtual void add_global_constant(const StringName &p_variable, const Variant &p_value) override;
|
|
virtual void reload_all_scripts() override {}
|
|
virtual void reload_scripts(const Array &p_scripts, bool p_soft_reload) override {}
|
|
virtual void reload_tool_script(const Ref<Script> &p_script, bool p_soft_reload) override {}
|
|
virtual void get_recognized_extensions(List<String> *p_extensions) const override;
|
|
virtual void get_public_functions(List<MethodInfo> *p_functions) const override {}
|
|
virtual void get_public_constants(List<Pair<String, Variant>> *p_constants) const override {}
|
|
virtual void get_public_annotations(List<MethodInfo> *p_annotations) const override {}
|
|
|
|
// Export targets - unique to AeThex
|
|
enum ExportTarget {
|
|
EXPORT_ENGINE, // Native AeThex Engine
|
|
EXPORT_ROBLOX, // Lua for Roblox
|
|
EXPORT_UEFN, // Verse for Fortnite
|
|
EXPORT_UNITY, // C# for Unity
|
|
EXPORT_WEB, // JavaScript for web
|
|
};
|
|
|
|
String export_to_target(const String &p_source, ExportTarget p_target) const;
|
|
|
|
AeThexScriptLanguage();
|
|
virtual ~AeThexScriptLanguage();
|
|
};
|
|
|
|
/**
|
|
* AeThex Script Resource
|
|
*/
|
|
class AeThexScript : public Script {
|
|
GDCLASS(AeThexScript, Script);
|
|
|
|
friend class AeThexScriptLanguage;
|
|
friend class AeThexScriptInstance;
|
|
|
|
bool tool = false;
|
|
bool valid = false;
|
|
String source_code;
|
|
String path;
|
|
|
|
// Compiled data
|
|
struct CompiledFunction {
|
|
String name;
|
|
Vector<String> parameters;
|
|
String body;
|
|
bool is_journey = false; // AeThex journey (cross-platform function)
|
|
};
|
|
|
|
Vector<CompiledFunction> functions;
|
|
HashMap<StringName, Variant> constants;
|
|
HashSet<String> target_platforms; // roblox, uefn, unity, web
|
|
|
|
protected:
|
|
static void _bind_methods();
|
|
|
|
public:
|
|
// Script interface
|
|
virtual bool can_instantiate() const override;
|
|
virtual Ref<Script> get_base_script() const override;
|
|
virtual StringName get_global_name() const override;
|
|
virtual bool inherits_script(const Ref<Script> &p_script) const override;
|
|
virtual StringName get_instance_base_type() const override;
|
|
virtual ScriptInstance *instance_create(Object *p_this) override;
|
|
virtual PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override;
|
|
virtual bool instance_has(const Object *p_this) const override;
|
|
|
|
virtual bool has_source_code() const override;
|
|
virtual String get_source_code() const override;
|
|
virtual void set_source_code(const String &p_code) override;
|
|
virtual Error reload(bool p_keep_state = false) override;
|
|
|
|
#ifdef TOOLS_ENABLED
|
|
virtual Vector<DocData::ClassDoc> get_documentation() const override;
|
|
virtual String get_class_icon_path() const override;
|
|
virtual PropertyInfo get_class_category() const override;
|
|
#endif
|
|
|
|
virtual bool has_method(const StringName &p_method) const override;
|
|
virtual MethodInfo get_method_info(const StringName &p_method) const override;
|
|
|
|
virtual bool is_tool() const override { return tool; }
|
|
virtual bool is_valid() const override { return valid; }
|
|
virtual bool is_abstract() const override { return false; }
|
|
|
|
virtual const Variant get_rpc_config() const override;
|
|
|
|
virtual ScriptLanguage *get_language() const override;
|
|
|
|
#ifdef TOOLS_ENABLED
|
|
virtual StringName get_doc_class_name() const override;
|
|
#endif
|
|
|
|
virtual bool has_script_signal(const StringName &p_signal) const override;
|
|
virtual void get_script_signal_list(List<MethodInfo> *r_signals) const override;
|
|
|
|
virtual bool get_property_default_value(const StringName &p_property, Variant &r_value) const override;
|
|
|
|
virtual void update_exports() override;
|
|
virtual void get_script_method_list(List<MethodInfo> *p_list) const override;
|
|
virtual void get_script_property_list(List<PropertyInfo> *p_list) const override;
|
|
|
|
virtual int get_member_line(const StringName &p_member) const override;
|
|
|
|
virtual void get_constants(HashMap<StringName, Variant> *p_constants) override;
|
|
virtual void get_members(HashSet<StringName> *p_constants) override;
|
|
|
|
// AeThex-specific: Cross-platform export
|
|
String export_to_lua() const; // For Roblox
|
|
String export_to_verse() const; // For UEFN
|
|
String export_to_csharp() const; // For Unity
|
|
String export_to_javascript() const; // For Web
|
|
|
|
const HashSet<String> &get_target_platforms() const { return target_platforms; }
|
|
|
|
AeThexScript();
|
|
~AeThexScript();
|
|
};
|
|
|
|
/**
|
|
* AeThex Script Instance (runtime)
|
|
*/
|
|
class AeThexScriptInstance : public ScriptInstance {
|
|
friend class AeThexScript;
|
|
|
|
Object *owner = nullptr;
|
|
Ref<AeThexScript> script;
|
|
HashMap<StringName, Variant> members;
|
|
|
|
public:
|
|
virtual bool set(const StringName &p_name, const Variant &p_value) override;
|
|
virtual bool get(const StringName &p_name, Variant &r_ret) const override;
|
|
virtual void get_property_list(List<PropertyInfo> *p_properties) const override;
|
|
virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override;
|
|
virtual void validate_property(PropertyInfo &p_property) const override;
|
|
|
|
virtual bool property_can_revert(const StringName &p_name) const override;
|
|
virtual bool property_get_revert(const StringName &p_name, Variant &r_ret) const override;
|
|
|
|
virtual Object *get_owner() override { return owner; }
|
|
virtual void get_method_list(List<MethodInfo> *p_list) const override;
|
|
virtual bool has_method(const StringName &p_method) const override;
|
|
|
|
virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override;
|
|
|
|
virtual void notification(int p_notification, bool p_reversed = false) override;
|
|
|
|
virtual Ref<Script> get_script() const override;
|
|
virtual ScriptLanguage *get_language() override;
|
|
|
|
void set_script(const Ref<AeThexScript> &p_script) { script = p_script; }
|
|
void set_owner(Object *p_owner) { owner = p_owner; }
|
|
|
|
AeThexScriptInstance();
|
|
~AeThexScriptInstance();
|
|
};
|
|
|
|
/**
|
|
* Resource format loaders/savers for .aethex files
|
|
*/
|
|
class ResourceFormatLoaderAeThexScript : public ResourceFormatLoader {
|
|
public:
|
|
virtual Ref<Resource> load(const String &p_path, const String &p_original_path = "", Error *r_error = nullptr,
|
|
bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE) override;
|
|
virtual void get_recognized_extensions(List<String> *p_extensions) const override;
|
|
virtual bool handles_type(const String &p_type) const override;
|
|
virtual String get_resource_type(const String &p_path) const override;
|
|
};
|
|
|
|
class ResourceFormatSaverAeThexScript : public ResourceFormatSaver {
|
|
public:
|
|
virtual Error save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags = 0) override;
|
|
virtual void get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const override;
|
|
virtual bool recognize(const Ref<Resource> &p_resource) const override;
|
|
};
|