718 lines
14 KiB
Markdown
718 lines
14 KiB
Markdown
# AeThex API Reference
|
|
|
|
Complete reference for AeThex-specific features and APIs.
|
|
|
|
## Table of Contents
|
|
|
|
- [Cloud Services](#cloud-services)
|
|
- [AI Assistant](#ai-assistant)
|
|
- [Studio Bridge](#studio-bridge)
|
|
- [Multiplayer](#multiplayer)
|
|
- [Authentication](#authentication)
|
|
- [Cloud Saves](#cloud-saves)
|
|
- [Analytics](#analytics)
|
|
|
|
---
|
|
|
|
## Cloud Services
|
|
|
|
### AeThexCloud Singleton
|
|
|
|
Global singleton for all cloud operations.
|
|
|
|
```gdscript
|
|
# Available everywhere as 'AeThexCloud'
|
|
var cloud = AeThexCloud
|
|
```
|
|
|
|
#### Methods
|
|
|
|
##### `connect_to_cloud() -> bool`
|
|
Establish connection to AeThex cloud services.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
if AeThexCloud.connect_to_cloud():
|
|
print("Connected to cloud!")
|
|
else:
|
|
print("Connection failed")
|
|
```
|
|
|
|
**Returns:** `true` if connection successful
|
|
|
|
---
|
|
|
|
##### `get_connection_status() -> String`
|
|
Get current cloud connection status.
|
|
|
|
```gdscript
|
|
var status = AeThexCloud.get_connection_status()
|
|
# Returns: "connected", "disconnected", "connecting", "error"
|
|
```
|
|
|
|
---
|
|
|
|
##### `disconnect_from_cloud()`
|
|
Disconnect from cloud services.
|
|
|
|
```gdscript
|
|
func _exit_tree():
|
|
AeThexCloud.disconnect_from_cloud()
|
|
```
|
|
|
|
---
|
|
|
|
## Multiplayer
|
|
|
|
### Quick Setup (3 Lines)
|
|
|
|
```gdscript
|
|
extends Node
|
|
|
|
func _ready():
|
|
# That's it - multiplayer is ready!
|
|
AeThexMultiplayer.create_room("my-game-room")
|
|
AeThexMultiplayer.connect("player_joined", self, "_on_player_joined")
|
|
AeThexMultiplayer.connect("player_left", self, "_on_player_left")
|
|
|
|
func _on_player_joined(player_id: int):
|
|
print("Player %d joined!" % player_id)
|
|
|
|
func _on_player_left(player_id: int):
|
|
print("Player %d left" % player_id)
|
|
```
|
|
|
|
### AeThexMultiplayer Singleton
|
|
|
|
#### Methods
|
|
|
|
##### `create_room(room_name: String, max_players: int = 8) -> bool`
|
|
Create a new multiplayer room.
|
|
|
|
```gdscript
|
|
var success = AeThexMultiplayer.create_room("lobby-1", 4)
|
|
if success:
|
|
print("Room created! Code:", AeThexMultiplayer.get_room_code())
|
|
```
|
|
|
|
**Parameters:**
|
|
- `room_name` - Unique room identifier
|
|
- `max_players` - Maximum players allowed (default: 8)
|
|
|
|
**Returns:** `true` if room created successfully
|
|
|
|
---
|
|
|
|
##### `join_room(room_code: String) -> bool`
|
|
Join an existing room using a room code.
|
|
|
|
```gdscript
|
|
func join_clicked():
|
|
var code = $RoomCodeInput.text
|
|
if AeThexMultiplayer.join_room(code):
|
|
get_tree().change_scene("res://game.tscn")
|
|
```
|
|
|
|
**Returns:** `true` if join successful
|
|
|
|
---
|
|
|
|
##### `get_room_code() -> String`
|
|
Get the current room's join code.
|
|
|
|
```gdscript
|
|
var code = AeThexMultiplayer.get_room_code()
|
|
$CodeLabel.text = "Code: " + code
|
|
```
|
|
|
|
---
|
|
|
|
##### `leave_room()`
|
|
Leave current multiplayer session.
|
|
|
|
```gdscript
|
|
func quit_to_menu():
|
|
AeThexMultiplayer.leave_room()
|
|
get_tree().change_scene("res://menu.tscn")
|
|
```
|
|
|
|
---
|
|
|
|
##### `get_players() -> Array`
|
|
Get list of all players in room.
|
|
|
|
```gdscript
|
|
var players = AeThexMultiplayer.get_players()
|
|
for player in players:
|
|
print("Player ID:", player.id)
|
|
print("Username:", player.username)
|
|
print("Is Ready:", player.is_ready)
|
|
```
|
|
|
|
**Returns:** Array of player dictionaries with:
|
|
- `id` (int) - Unique player ID
|
|
- `username` (String) - Display name
|
|
- `is_ready` (bool) - Ready status
|
|
- `ping` (int) - Latency in ms
|
|
|
|
---
|
|
|
|
##### `send_message(type: String, data: Dictionary)`
|
|
Send custom message to all players.
|
|
|
|
```gdscript
|
|
func shoot_projectile(position: Vector2, direction: Vector2):
|
|
AeThexMultiplayer.send_message("projectile_spawn", {
|
|
"position": position,
|
|
"direction": direction,
|
|
"owner_id": get_tree().get_network_unique_id()
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
#### Signals
|
|
|
|
##### `player_joined(player_id: int)`
|
|
Emitted when a player joins the room.
|
|
|
|
```gdscript
|
|
func _on_player_joined(player_id):
|
|
var player_node = spawn_player(player_id)
|
|
$PlayersNode.add_child(player_node)
|
|
```
|
|
|
|
---
|
|
|
|
##### `player_left(player_id: int)`
|
|
Emitted when a player leaves.
|
|
|
|
```gdscript
|
|
func _on_player_left(player_id):
|
|
var player = $PlayersNode.get_node(str(player_id))
|
|
if player:
|
|
player.queue_free()
|
|
```
|
|
|
|
---
|
|
|
|
##### `room_closed()`
|
|
Emitted when room host closes the room.
|
|
|
|
```gdscript
|
|
func _on_room_closed():
|
|
show_message("Host closed the room")
|
|
get_tree().change_scene("res://menu.tscn")
|
|
```
|
|
|
|
---
|
|
|
|
##### `message_received(from_id: int, type: String, data: Dictionary)`
|
|
Emitted when custom message is received.
|
|
|
|
```gdscript
|
|
func _on_message_received(from_id, type, data):
|
|
match type:
|
|
"projectile_spawn":
|
|
spawn_projectile(data.position, data.direction)
|
|
"chat_message":
|
|
add_chat_message(data.username, data.text)
|
|
```
|
|
|
|
---
|
|
|
|
### RPC Alternative
|
|
|
|
Use familiar Godot RPC syntax - works automatically with AeThex multiplayer:
|
|
|
|
```gdscript
|
|
# Define synchronized variable
|
|
puppet var position = Vector2()
|
|
|
|
# Call remote function
|
|
rpc("update_position", global_position)
|
|
|
|
# Remote function
|
|
remote func update_position(new_pos):
|
|
position = new_pos
|
|
```
|
|
|
|
---
|
|
|
|
## Authentication
|
|
|
|
### AeThexAuth Singleton
|
|
|
|
#### Methods
|
|
|
|
##### `login_with_email(email: String, password: String) -> Dictionary`
|
|
Login with email and password.
|
|
|
|
```gdscript
|
|
func login_clicked():
|
|
var result = await AeThexAuth.login_with_email(
|
|
$EmailInput.text,
|
|
$PasswordInput.text
|
|
)
|
|
|
|
if result.success:
|
|
print("Logged in as:", result.user.username)
|
|
get_tree().change_scene("res://menu.tscn")
|
|
else:
|
|
$ErrorLabel.text = result.error
|
|
```
|
|
|
|
**Returns:** Dictionary with:
|
|
- `success` (bool)
|
|
- `user` (Dictionary) - User info if successful
|
|
- `error` (String) - Error message if failed
|
|
|
|
---
|
|
|
|
##### `login_as_guest() -> Dictionary`
|
|
Create temporary guest account.
|
|
|
|
```gdscript
|
|
func play_as_guest():
|
|
var result = await AeThexAuth.login_as_guest()
|
|
if result.success:
|
|
start_game()
|
|
```
|
|
|
|
---
|
|
|
|
##### `login_with_google() -> Dictionary`
|
|
OAuth login with Google.
|
|
|
|
```gdscript
|
|
func google_login_clicked():
|
|
var result = await AeThexAuth.login_with_google()
|
|
if result.success:
|
|
start_game()
|
|
```
|
|
|
|
---
|
|
|
|
##### `register(email: String, password: String, username: String) -> Dictionary`
|
|
Create new account.
|
|
|
|
```gdscript
|
|
func register_clicked():
|
|
var result = await AeThexAuth.register(
|
|
$EmailInput.text,
|
|
$PasswordInput.text,
|
|
$UsernameInput.text
|
|
)
|
|
|
|
if result.success:
|
|
print("Account created!")
|
|
else:
|
|
show_error(result.error)
|
|
```
|
|
|
|
---
|
|
|
|
##### `logout()`
|
|
Log out current user.
|
|
|
|
```gdscript
|
|
func logout_clicked():
|
|
AeThexAuth.logout()
|
|
get_tree().change_scene("res://login.tscn")
|
|
```
|
|
|
|
---
|
|
|
|
##### `get_current_user() -> Dictionary`
|
|
Get currently logged in user.
|
|
|
|
```gdscript
|
|
var user = AeThexAuth.get_current_user()
|
|
if user:
|
|
$UsernameLabel.text = user.username
|
|
$AvatarTexture.texture = load_avatar(user.avatar_url)
|
|
```
|
|
|
|
**Returns:** Dictionary with:
|
|
- `id` (String) - User ID
|
|
- `username` (String) - Display name
|
|
- `email` (String) - Email address
|
|
- `avatar_url` (String) - Avatar image URL
|
|
- `is_guest` (bool) - Whether guest account
|
|
|
|
---
|
|
|
|
##### `is_logged_in() -> bool`
|
|
Check if user is logged in.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
if not AeThexAuth.is_logged_in():
|
|
get_tree().change_scene("res://login.tscn")
|
|
```
|
|
|
|
---
|
|
|
|
## Cloud Saves
|
|
|
|
### AeThexSaves Singleton
|
|
|
|
Automatic cloud save synchronization.
|
|
|
|
#### Methods
|
|
|
|
##### `save_game(slot: String, data: Dictionary) -> bool`
|
|
Save game data to cloud.
|
|
|
|
```gdscript
|
|
func save_game():
|
|
var save_data = {
|
|
"level": current_level,
|
|
"health": player.health,
|
|
"inventory": player.inventory,
|
|
"position": {
|
|
"x": player.position.x,
|
|
"y": player.position.y
|
|
}
|
|
}
|
|
|
|
if AeThexSaves.save_game("slot_1", save_data):
|
|
print("Game saved!")
|
|
else:
|
|
print("Save failed")
|
|
```
|
|
|
|
**Parameters:**
|
|
- `slot` - Save slot name (e.g., "slot_1", "autosave")
|
|
- `data` - Dictionary of game data (auto-serialized)
|
|
|
|
**Returns:** `true` if save successful
|
|
|
|
---
|
|
|
|
##### `load_game(slot: String) -> Dictionary`
|
|
Load game data from cloud.
|
|
|
|
```gdscript
|
|
func load_game():
|
|
var data = await AeThexSaves.load_game("slot_1")
|
|
|
|
if data:
|
|
current_level = data.level
|
|
player.health = data.health
|
|
player.inventory = data.inventory
|
|
player.position = Vector2(data.position.x, data.position.y)
|
|
print("Game loaded!")
|
|
else:
|
|
print("No save found")
|
|
```
|
|
|
|
**Returns:** Dictionary with save data, or `null` if not found
|
|
|
|
---
|
|
|
|
##### `get_save_slots() -> Array`
|
|
List all available save slots.
|
|
|
|
```gdscript
|
|
func show_load_menu():
|
|
var slots = await AeThexSaves.get_save_slots()
|
|
|
|
for slot in slots:
|
|
var button = SaveSlotButton.new()
|
|
button.text = slot.name
|
|
button.metadata = slot.timestamp
|
|
$SavesList.add_child(button)
|
|
```
|
|
|
|
**Returns:** Array of dictionaries with:
|
|
- `name` (String) - Slot name
|
|
- `timestamp` (int) - Unix timestamp
|
|
- `size_bytes` (int) - Save file size
|
|
|
|
---
|
|
|
|
##### `delete_save(slot: String) -> bool`
|
|
Delete a save slot.
|
|
|
|
```gdscript
|
|
func delete_clicked():
|
|
if AeThexSaves.delete_save("slot_1"):
|
|
print("Save deleted")
|
|
```
|
|
|
|
---
|
|
|
|
##### `set_auto_save(enabled: bool, interval: float = 60.0)`
|
|
Configure automatic saving.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
# Auto-save every 2 minutes
|
|
AeThexSaves.set_auto_save(true, 120.0)
|
|
```
|
|
|
|
**Parameters:**
|
|
- `enabled` - Whether auto-save is active
|
|
- `interval` - Seconds between auto-saves (default: 60)
|
|
|
|
---
|
|
|
|
#### Signals
|
|
|
|
##### `save_completed(slot: String)`
|
|
Emitted when save finishes.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
AeThexSaves.connect("save_completed", self, "_on_save_done")
|
|
|
|
func _on_save_done(slot):
|
|
show_notification("Game saved!")
|
|
```
|
|
|
|
---
|
|
|
|
##### `sync_started()`
|
|
Emitted when cloud sync begins.
|
|
|
|
```gdscript
|
|
func _on_sync_started():
|
|
$SyncIndicator.visible = true
|
|
```
|
|
|
|
---
|
|
|
|
##### `sync_completed()`
|
|
Emitted when cloud sync finishes.
|
|
|
|
```gdscript
|
|
func _on_sync_completed():
|
|
$SyncIndicator.visible = false
|
|
```
|
|
|
|
---
|
|
|
|
## AI Assistant
|
|
|
|
### AeThexAI Singleton
|
|
|
|
In-game AI help and code generation.
|
|
|
|
#### Methods
|
|
|
|
##### `ask_question(question: String) -> String`
|
|
Get AI answer to a question.
|
|
|
|
```gdscript
|
|
func help_button_clicked():
|
|
var answer = await AeThexAI.ask_question(
|
|
"How do I add a jump mechanic?"
|
|
)
|
|
$HelpText.text = answer
|
|
```
|
|
|
|
---
|
|
|
|
##### `generate_code(prompt: String, language: String = "gdscript") -> String`
|
|
Generate code from description.
|
|
|
|
```gdscript
|
|
func generate_clicked():
|
|
var code = await AeThexAI.generate_code(
|
|
"Create a health bar that decreases when player takes damage",
|
|
"gdscript"
|
|
)
|
|
$CodeEditor.text = code
|
|
```
|
|
|
|
**Parameters:**
|
|
- `prompt` - Description of desired code
|
|
- `language` - "gdscript", "csharp", or "cpp"
|
|
|
|
---
|
|
|
|
##### `explain_code(code: String) -> String`
|
|
Get explanation of code.
|
|
|
|
```gdscript
|
|
func explain_clicked():
|
|
var explanation = await AeThexAI.explain_code($CodeEditor.text)
|
|
$ExplanationLabel.text = explanation
|
|
```
|
|
|
|
---
|
|
|
|
##### `suggest_fix(error_message: String, code: String) -> String`
|
|
Get suggestion for fixing an error.
|
|
|
|
```gdscript
|
|
func _on_error_occurred(error):
|
|
var fix = await AeThexAI.suggest_fix(error, $CodeEditor.text)
|
|
show_suggestion_popup(fix)
|
|
```
|
|
|
|
---
|
|
|
|
## Analytics
|
|
|
|
### AeThexAnalytics Singleton
|
|
|
|
Track game events and player behavior.
|
|
|
|
#### Methods
|
|
|
|
##### `track_event(event_name: String, properties: Dictionary = {})`
|
|
Log custom event.
|
|
|
|
```gdscript
|
|
func level_completed():
|
|
AeThexAnalytics.track_event("level_complete", {
|
|
"level": current_level,
|
|
"time_seconds": level_time,
|
|
"score": player_score
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
##### `track_screen(screen_name: String)`
|
|
Track screen view.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
AeThexAnalytics.track_screen("main_menu")
|
|
```
|
|
|
|
---
|
|
|
|
##### `set_user_property(key: String, value)`
|
|
Set user attribute.
|
|
|
|
```gdscript
|
|
func _ready():
|
|
AeThexAnalytics.set_user_property("player_level", 5)
|
|
AeThexAnalytics.set_user_property("vip_status", true)
|
|
```
|
|
|
|
---
|
|
|
|
## Studio Bridge
|
|
|
|
### AeThexStudio Singleton
|
|
|
|
Communicate with Studio IDE.
|
|
|
|
#### Methods
|
|
|
|
##### `send_to_studio(command: String, args: Dictionary = {})`
|
|
Send command to Studio.
|
|
|
|
```gdscript
|
|
func debug_node():
|
|
AeThexStudio.send_to_studio("highlight_node", {
|
|
"path": get_path()
|
|
})
|
|
```
|
|
|
|
---
|
|
|
|
##### `log_message(message: String, type: String = "info")`
|
|
Send log message to Studio console.
|
|
|
|
```gdscript
|
|
func custom_log(msg):
|
|
AeThexStudio.log_message(msg, "debug")
|
|
# Types: "info", "warning", "error", "debug"
|
|
```
|
|
|
|
---
|
|
|
|
## Environment Variables
|
|
|
|
Configure AeThex through environment variables:
|
|
|
|
```bash
|
|
# Cloud API endpoint
|
|
export AETHEX_API_URL="https://api.aethex.games"
|
|
|
|
# Disable cloud features
|
|
export AETHEX_OFFLINE_MODE="true"
|
|
|
|
# Studio connection
|
|
export AETHEX_STUDIO_PORT="9002"
|
|
|
|
# Debug logging
|
|
export AETHEX_DEBUG="true"
|
|
```
|
|
|
|
Or in project settings:
|
|
|
|
```gdscript
|
|
# project.godot
|
|
[aethex]
|
|
api_url="https://api.aethex.games"
|
|
offline_mode=false
|
|
studio_port=9002
|
|
debug_mode=false
|
|
```
|
|
|
|
---
|
|
|
|
## Error Codes
|
|
|
|
Common error codes and solutions:
|
|
|
|
| Code | Meaning | Solution |
|
|
|------|---------|----------|
|
|
| `CLOUD_001` | Connection timeout | Check internet connection |
|
|
| `CLOUD_002` | Authentication failed | Re-login required |
|
|
| `CLOUD_003` | Rate limit exceeded | Wait and retry |
|
|
| `MP_001` | Room full | Join different room |
|
|
| `MP_002` | Invalid room code | Check code and retry |
|
|
| `SAVE_001` | Save quota exceeded | Delete old saves |
|
|
| `AUTH_001` | Invalid credentials | Check email/password |
|
|
| `AUTH_002` | Account exists | Use different email |
|
|
|
|
---
|
|
|
|
## Best Practices
|
|
|
|
### Connection Management
|
|
```gdscript
|
|
func _ready():
|
|
# Always check connection before cloud operations
|
|
if not AeThexCloud.is_connected():
|
|
AeThexCloud.connect_to_cloud()
|
|
await AeThexCloud.connection_established
|
|
```
|
|
|
|
### Error Handling
|
|
```gdscript
|
|
func save_game():
|
|
var result = AeThexSaves.save_game("slot_1", data)
|
|
if not result:
|
|
# Fallback to local save
|
|
save_locally(data)
|
|
```
|
|
|
|
### Multiplayer State Sync
|
|
```gdscript
|
|
# Use @rpc for automatic synchronization
|
|
@rpc("any_peer", "reliable")
|
|
func update_position(pos: Vector2):
|
|
position = pos
|
|
|
|
func _physics_process(delta):
|
|
if is_multiplayer_master():
|
|
rpc("update_position", position)
|
|
```
|
|
|
|
---
|
|
|
|
## See Also
|
|
|
|
- [Getting Started Guide](../GETTING_STARTED.md)
|
|
- [Cloud Services Architecture](CLOUD_SERVICES_ARCHITECTURE.md)
|
|
- [Multiplayer Tutorial](tutorials/MULTIPLAYER_TUTORIAL.md)
|
|
- [Studio Bridge Guide](STUDIO_BRIDGE_GUIDE.md)
|