AeThex-Engine-Core/engine/modules/aethex_lang/aethex_script.h
2026-02-24 01:55:30 -07:00

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 Godot 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;
};