This commit is contained in:
2024-09-23 22:37:10 -07:00
parent a4c18e7cf6
commit 7f1f1a8a14
17 changed files with 479 additions and 25 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://crd2bngqon872"
path="res://.godot/imported/icon.png-b7032f7af70248c068afb9d98de50ab4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/fabimakesgames.embed_game/assets/icon.png"
dest_files=["res://.godot/imported/icon.png-b7032f7af70248c068afb9d98de50ab4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@@ -0,0 +1,9 @@
[gd_resource type="Shortcut" load_steps=2 format=3 uid="uid://dvlydk5ftl206"]
[sub_resource type="InputEventKey" id="InputEventKey_myaxp"]
device = -1
ctrl_pressed = true
keycode = 4194336
[resource]
events = [SubResource("InputEventKey_myaxp")]

View File

@@ -0,0 +1,6 @@
[gd_scene format=3 uid="uid://bb4xl1j6cf78w"]
[node name="EmbedButton" type="CheckButton"]
offset_right = 44.0
offset_bottom = 24.0
theme_type_variation = &"MainScreenButton"

View File

@@ -0,0 +1,232 @@
@tool
extends EditorPlugin
const debug: bool = false
var debugger: EditorDebugger
var sesh: EditorDebuggerSession
var last_main_screen_rect: Rect2i
var plugin_control: PanelContainer
var hbox: HBoxContainer
var activate_button: Button
var top_bar_button: Button
var last_main_screen_not_embed: String
var is_playing_scene: bool
var was_playing_scene: bool
var embed_game:= EmbedGame.new()
var cached_game_handle: int = 0
func _enter_tree():
add_autoload_singleton("EmbedGameAutoload","res://addons/fabimakesgames.embed_game/embed_game_autoload.gd")
## add checkbutton and reparent 'embed' button
_add_control_elements()
## CONNECT SIGNALS
debugger = EditorDebugger.new()
debugger.new_session.connect(register_debugger_session)
debugger._on_return_focus.connect(self._on_return_focus)
debugger._on_handle_transmitted.connect(self._on_handle_received)
add_debugger_plugin(debugger)
##connect main screen size to game window
var main_screen := EditorInterface.get_editor_main_screen()
main_screen_changed.connect(_on_main_screen_changed)
#initialize vars
was_playing_scene = EditorInterface.get_playing_scene() != ""
is_playing_scene = EditorInterface.get_playing_scene() != ""
if not ProjectSettings.has_setting("embed_game/padding"):
ProjectSettings.set_setting("embed_game/padding", int(0))
ProjectSettings.set_initial_value("embed_game/padding", int(0))
ProjectSettings.save()
func _exit_tree():
hbox.queue_free()
remove_debugger_plugin(debugger)
remove_autoload_singleton("EmbedGameAutoload")
func _build():
cached_game_handle = 0 ## make sure the game handle will be gotten anew
if activate_button.button_pressed:
top_bar_button.visible = true
EditorInterface.set_main_screen_editor("Embed")
return true
func _on_activate_button_toggled(flag: bool):
self.queue_save_layout() ## saves setting
#if not is_playing_scene: return
if flag:
embed_window()
if is_playing_scene:
top_bar_button.visible = true
EditorInterface.set_main_screen_editor("Embed")
else:
unembed_window()
EditorInterface.set_main_screen_editor(last_main_screen_not_embed)
plugin_control.visible = false
top_bar_button.visible = false
## from project instance
func _on_handle_received(data: Array) -> void:
cached_game_handle = data[0]
if activate_button.button_pressed:
embed_window()
func _get_window_layout(configuration: ConfigFile) -> void:
configuration.set_value("embed_window", "is_enabled", activate_button.button_pressed)
func _set_window_layout(configuration: ConfigFile) -> void:
activate_button.button_pressed = configuration.get_value("embed_window","is_enabled", false)
func _add_control_elements():
var top_buttons:= get_top_buttons()
for i in top_buttons:
if i.text == "Embed":
top_bar_button = i
hbox = HBoxContainer.new()
hbox.name = "Embed"
last_main_screen_not_embed = top_buttons[0].name ## so it's never an empty string
top_bar_button.get_parent().add_child(hbox)
top_bar_button.reparent(hbox)
top_bar_button.shortcut = load("res://addons/fabimakesgames.embed_game/config/embed_shortcut.tres")
top_bar_button.visible = false
activate_button = preload("res://addons/fabimakesgames.embed_game/embed_button.tscn").instantiate()
activate_button.toggled.connect(_on_activate_button_toggled)
hbox.add_child(activate_button,true)
## add empty panel
plugin_control = PanelContainer.new()
EditorInterface.get_editor_main_screen().add_child(plugin_control)
plugin_control.hide()
func _process(delta: float) -> void:
if not activate_button.button_pressed: return
## UPDATE PLACEMENT WHEN MOVING EDITOR WINDOW ONLY
_update_screen_rect_if_required()
## removes embed view on quitting the play mode
is_playing_scene = EditorInterface.get_playing_scene() != ""
if not is_playing_scene:
cached_game_handle = 0 ## reset game handle e.g. no running instance.
if was_playing_scene and not is_playing_scene:
top_bar_button.visible = false
EditorInterface.set_main_screen_editor(last_main_screen_not_embed)
was_playing_scene = is_playing_scene
func _on_return_focus(data):
var keycode: int = data[0]
var f_key_number = keycode - 4194332
var top_buttons:= get_top_buttons()
if f_key_number < top_buttons.size():
if f_key_number == 4: ## is KEY_F5
EditorInterface.set_main_screen_editor("Embed")
else:
var desired_tab: String = top_buttons[f_key_number].name
EditorInterface.set_main_screen_editor(desired_tab)
#region Window Management
func _update_screen_rect_if_required() -> void:
var main_screen := EditorInterface.get_editor_main_screen()
var main_screen_rect:= Rect2i(
main_screen.global_position + Vector2.ONE * _get_padding() / 2,
main_screen.size - Vector2.ONE * _get_padding()
)
if main_screen_rect != last_main_screen_rect:
embed_game.set_window_rect(cached_game_handle, main_screen_rect)
last_main_screen_rect = main_screen_rect
func _force_update_window_rect() -> void:
var main_screen := EditorInterface.get_editor_main_screen()
var main_screen_rect:= Rect2i(
main_screen.global_position,
main_screen.size
)
embed_game.set_window_rect(cached_game_handle, main_screen_rect)
last_main_screen_rect = main_screen_rect
func get_handle_editor() -> int:
var window := self.get_window().get_window_id()
return DisplayServer.window_get_native_handle(DisplayServer.WINDOW_HANDLE, window)
func _get_padding() -> int:
return ProjectSettings.get_setting("embed_game/padding", 2)
func embed_window() -> void:
embed_game.show_window(cached_game_handle, false) ## takes longer but looks nicer
embed_game.store_window_style(cached_game_handle)
embed_game.set_window_borderless(cached_game_handle)
embed_game.make_child(get_handle_editor(), cached_game_handle)
_force_update_window_rect()
embed_game.show_window(cached_game_handle, true)
func unembed_window() -> void:
embed_game.show_window(cached_game_handle, false)
embed_game.unmake_child(cached_game_handle) ##revert window style must come before unmake child, else window moves downwards
embed_game.revert_window_style(cached_game_handle)
embed_game.show_window(cached_game_handle, true)
func _on_main_screen_changed(screen_name: String) -> void:
if screen_name != "Embed":
last_main_screen_not_embed = screen_name
if activate_button.button_pressed:
embed_game.show_window(cached_game_handle,false)
else:
embed_game.show_window(cached_game_handle,true)
#region Helper Functions
func get_top_buttons() -> Array[Node]:
var cont := Control.new()
add_control_to_container(CustomControlContainer.CONTAINER_TOOLBAR, cont)
var btns := cont.get_parent().get_child(2).get_children()
remove_control_from_container(CustomControlContainer.CONTAINER_TOOLBAR, cont)
return btns
#endregion
#region Editor Plugin specific functions
func _has_main_screen():
return true
func _get_plugin_name():
return "Embed"
func _make_visible(visible):
plugin_control.visible = visible
func _get_plugin_icon():
return preload("res://addons/fabimakesgames.embed_game/assets/icon.png")
#region Debugger Setup
class EditorDebugger extends EditorDebuggerPlugin:
signal new_session(session:EditorDebuggerSession)
signal _on_return_focus(session: EditorDebuggerSession)
signal _on_handle_transmitted(session: EditorDebuggerSession)
func _has_capture(prefix):
if prefix == "return_focus": return true
if prefix == "transmit_handle": return true
return true
func _capture(message, data, session_id):
if message == "return_focus:":
_on_return_focus.emit(data)
return true
if message == "transmit_handle:":
_on_handle_transmitted.emit(data)
return true
func _setup_session(session_id):
new_session.emit(get_session(session_id))
func register_debugger_session(dbgs: EditorDebuggerSession):
sesh = dbgs
#endregion

View File

@@ -0,0 +1,14 @@
extends Node
func _ready() -> void:
if !OS.has_feature("editor"): ## remove plugin autoloads in exported builds
queue_free()
EngineDebugger.send_message("transmit_handle:",[DisplayServer.window_get_native_handle(DisplayServer.WINDOW_HANDLE, self.get_window().get_window_id())])
func _input(event: InputEvent) -> void:
if event is InputEventKey:
if event.ctrl_pressed and event.pressed:
if event.keycode >= KEY_F1 and event.keycode <= KEY_F9:
EngineDebugger.send_message("return_focus:", [event.keycode])

View File

@@ -0,0 +1,7 @@
[plugin]
name="fabimakesgames.EmbedGame"
description="Embeds the game window in the Editor"
author="fabimakesgames/fabimakesgames"
version="1.0"
script="embed_game.gd"

View File

@@ -19,6 +19,7 @@ boot_splash/show_image=false
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
DialogueController="*res://src/game/DialogueController.cs"
EmbedGameAutoload="*res://addons/fabimakesgames.embed_game/embed_game_autoload.gd"
[dialogue_manager]
@@ -37,7 +38,7 @@ project/assembly_name="GameJamDungeon"
[editor_plugins]
enabled=PackedStringArray("res://addons/SimpleDungeons/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg")
enabled=PackedStringArray("res://addons/SimpleDungeons/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg", "res://addons/fabimakesgames.embed_game/plugin.cfg")
[file_customization]

View File

@@ -36,7 +36,7 @@ namespace GameJamDungeon
AppLogic.Set(AppRepo);
Menu.NewGame += OnNewGame;
Menu.Quit += OnQuit;
Input.MouseMode = Input.MouseModeEnum.Captured;
Input.MouseMode = Input.MouseModeEnum.Visible;
this.Provide();
}

View File

@@ -13,6 +13,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
stretch = true
[node name="GameWindow" type="SubViewport" parent="SubViewportContainer"]
unique_name_in_owner = true

View File

@@ -26,12 +26,15 @@ shader_parameter/enable_recolor = false
[sub_resource type="Resource" id="Resource_qjdoa"]
script = ExtResource("7_1lafu")
Damage = 0
ThrowableItemTags = []
Name = "Test Item"
Description = ""
Texture = ExtResource("6_3qv3u")
SpawnRate = 0.5
ThrowSpeed = 12.0
HealHPAmount = 0
HealVTAmount = 0
ThrowDamage = 5
[sub_resource type="BoxShape3D" id="BoxShape3D_qkug6"]
size = Vector3(0.371643, 0.289612, 0.286743)
@@ -51,6 +54,7 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
stretch = true
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
transparent_bg = true

View File

@@ -400,6 +400,7 @@ public partial class InventoryMenu : Control, IInventoryMenu
else if (currentItem is IUsableItem usableItem)
{
usableItem.Use();
GameRepo.PlayerData.Inventory.Remove(usableItem);
if (_currentIndex >= ItemSlots.Length - 1)
_currentIndex--;
if (_currentIndex <= 0)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1385,19 +1385,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.46669, -1.76808, 9.35347)
unique_name_in_owner = true
[node name="EnemySpawn1" type="Marker3D" parent="EnemySpawnPoints"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.21313, -0.746347, -7.94688)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.21313, -1.98058, -7.94688)
[node name="EnemySpawn2" type="Marker3D" parent="EnemySpawnPoints"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -1.12848, -7.94688)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -2.36271, -7.94688)
[node name="EnemySpawn3" type="Marker3D" parent="EnemySpawnPoints"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -0.662478, 5.40586)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -1.89671, 5.40586)
[node name="EnemySpawn4" type="Marker3D" parent="EnemySpawnPoints"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5927, -0.720595, 5.40586)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5927, -1.95482, 5.40586)
[node name="EnemySpawn5" type="Marker3D" parent="EnemySpawnPoints"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.73702, -0.882075, 5.40586)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.73702, -2.1163, 5.40586)
[node name="ItemDatabase" parent="." instance=ExtResource("18_mnyg7")]
unique_name_in_owner = true
@@ -1423,7 +1423,7 @@ shape = SubResource("BoxShape3D_acrk2")
[node name="Minimap" type="MeshInstance3D" parent="Minimap Manager"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.301735, -2.00828, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.301735, -2.09192, 0)
visible = false
layers = 2
mesh = SubResource("PlaneMesh_24fob")

View File

@@ -375,7 +375,7 @@ shape = SubResource("BoxShape3D_hs4wf")
[node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00341564, 1.40507, 0.645068)
cull_mask = 1048573
cull_mask = 1048569
fov = 45.0
near = 0.001