更新c01s05院长书房;更新prop hud选中与交互效果
@ -4,7 +4,6 @@
|
||||
## A collection of dialogue lines for use with [code]DialogueManager[/code].
|
||||
class_name DialogueResource extends Resource
|
||||
|
||||
|
||||
const _DialogueManager = preload("./dialogue_manager.gd")
|
||||
const DialogueLine = preload("./dialogue_line.gd")
|
||||
|
||||
@ -30,14 +29,38 @@ const DialogueLine = preload("./dialogue_line.gd")
|
||||
## Get the next printable line of dialogue, starting from a referenced line ([code]title[/code] can
|
||||
## be a title string or a stringified line number). Runs any mutations along the way and then returns
|
||||
## the first dialogue line encountered.
|
||||
func get_next_dialogue_line(title: String, extra_game_states: Array = [], mutation_behaviour: _DialogueManager.MutationBehaviour = _DialogueManager.MutationBehaviour.Wait) -> DialogueLine:
|
||||
return await Engine.get_singleton("DialogueManager").get_next_dialogue_line(self, title, extra_game_states, mutation_behaviour)
|
||||
func get_next_dialogue_line(
|
||||
title: String,
|
||||
extra_game_states: Array = [],
|
||||
mutation_behaviour: _DialogueManager.MutationBehaviour = _DialogueManager.MutationBehaviour.Wait
|
||||
) -> DialogueLine:
|
||||
return await Engine.get_singleton("DialogueManager").get_next_dialogue_line(
|
||||
self, title, extra_game_states, mutation_behaviour
|
||||
)
|
||||
|
||||
|
||||
## Get the list of any titles found in the file.
|
||||
func get_titles() -> PackedStringArray:
|
||||
func get_titles() -> Array:
|
||||
return titles.keys()
|
||||
|
||||
|
||||
func get_ordered_titles() -> Array:
|
||||
var splitted = raw_text.split("\n")
|
||||
var ordered_titles = []
|
||||
for line in splitted:
|
||||
if line.begins_with("~ "):
|
||||
ordered_titles.append(line.substr(2).strip_edges())
|
||||
# # check ordered_titles consistency to titles
|
||||
# for title in ordered_titles:
|
||||
# if not titles.has(title):
|
||||
# printerr("Title %s not found in titles" % title)
|
||||
# ordered_titles.remove(title)
|
||||
# for title in titles.keys():
|
||||
# if not ordered_titles.has(title):
|
||||
# printerr("Title %s not found in ordered_titles" % title)
|
||||
# ordered_titles.append(title)
|
||||
return ordered_titles
|
||||
|
||||
|
||||
func _to_string() -> String:
|
||||
return "<DialogueResource titles=\"%s\">" % [",".join(titles.keys())]
|
||||
return '<DialogueResource titles="%s">' % [",".join(titles.keys())]
|
||||
|
BIN
asset/art/scene/c01/s05_院长房间/bg_房间背景.png
Normal file
After Width: | Height: | Size: 197 KiB |
Before Width: | Height: | Size: 128 KiB |
BIN
asset/art/scene/c01/s05_院长房间/e_床.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 4.7 KiB |
BIN
asset/art/scene/c01/s05_院长房间/e_画框.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 4.4 KiB |
BIN
asset/art/scene/c01/s05_院长房间/e_门.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
asset/art/scene/c01/s05_院长房间/e_鸡毛掸子.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 4.1 KiB |
BIN
asset/art/scene/c01/s05_院长房间/l_房间背景.png
Normal file
After Width: | Height: | Size: 143 KiB |
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 141 KiB |
@ -1,4 +1,6 @@
|
||||
keys,zh_Hans,_character,_notes,_tags,en
|
||||
t89c0f4a8de,x年,,,,
|
||||
t356af5308e,下午一点,,,,
|
||||
t344c97cf2c,据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。,,,,
|
||||
tdb119a3714,有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。,,,,
|
||||
ta750647b12,《申报》,,,,
|
||||
|
|
@ -1,3 +1,8 @@
|
||||
~ c01_院长座钟
|
||||
x年 [ID:t89c0f4a8de]
|
||||
下午一点 [ID:t356af5308e]
|
||||
=> END
|
||||
|
||||
~ c02_鼠疫海报
|
||||
据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。 [ID:t344c97cf2c]
|
||||
有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。 [ID:tdb119a3714]
|
||||
|
@ -1,4 +1,5 @@
|
||||
keys,zh_Hans,en,_character,_notes,_tags
|
||||
c01_纸包钥匙,一张纸条包着钥匙,,,,
|
||||
ui_退出,退出,Exit,,,
|
||||
ui_阅读,阅读,Read,,,
|
||||
ui_收起,收起,Hold,,,
|
||||
@ -19,7 +20,9 @@ notes_无法触碰,无法触碰,,,,
|
||||
notes_挂画,挂画,,,,
|
||||
notes_相框,相框,,,,
|
||||
notes_寻人启事,寻人启事,,,,
|
||||
c01_纸包钥匙,一张纸条包着钥匙,,,,
|
||||
c01_鸡毛掸子,这是鸡毛掸子吗?,,,,
|
||||
c01_院长书桌,书桌上好像有本书,,,,
|
||||
c01_院长座钟,唔...下午一点了,,,,
|
||||
c02_绳子剪刀,绳子和剪刀,,,,
|
||||
c02_寻人启事1,似乎是一张寻人启事,,,,
|
||||
c02_寻人启事2,脸的部分被撕掉了,看不清,,,,
|
||||
|
|
@ -8,15 +8,15 @@
|
||||
~ PropItems
|
||||
# texture 路径从 "res://asset/art/prop/" 之后算起
|
||||
# c01
|
||||
令牌[#texture=c01/令牌物品.png] [ID:prop_令牌]
|
||||
装有灵魂的令牌[#texture=c01/装有灵魂的令牌物品.png] [ID:prop_装有灵魂的令牌]
|
||||
令牌 [#texture=c01/令牌物品.png] [ID:prop_令牌]
|
||||
装有灵魂的令牌 [#texture=c01/装有灵魂的令牌物品.png] [ID:prop_装有灵魂的令牌]
|
||||
# c02
|
||||
小猫玩具的脑袋[#texture=c02/小猫玩具脑袋物品.png] [ID:prop_小猫玩具的脑袋]
|
||||
绳子[#texture=c02/绳子物品.png] [ID:prop_绳子]
|
||||
1012钥匙[#texture=c02/1012钥匙物品.png] [ID:prop_1012钥匙]
|
||||
老虎钳[#texture=c02/老虎钳物品.png] [ID:prop_老虎钳]
|
||||
3014旋转锁钥匙[#texture=c02/3014旋转锁钥匙物品.png] [ID:prop_3014旋转锁钥匙]
|
||||
小猫玩具[#texture=c02/小猫玩具完整物品.png] [ID:prop_小猫玩具完整]
|
||||
小猫玩具的脑袋 [#texture=c02/小猫玩具脑袋物品.png] [ID:prop_小猫玩具的脑袋]
|
||||
绳子 [#texture=c02/绳子物品.png] [ID:prop_绳子]
|
||||
1012钥匙 [#texture=c02/1012钥匙物品.png] [ID:prop_1012钥匙]
|
||||
老虎钳 [#texture=c02/老虎钳物品.png] [ID:prop_老虎钳]
|
||||
3014旋转锁钥匙 [#texture=c02/3014旋转锁钥匙物品.png] [ID:prop_3014旋转锁钥匙]
|
||||
小猫玩具 [#texture=c02/小猫玩具完整物品.png] [ID:prop_小猫玩具完整]
|
||||
=> END!
|
||||
|
||||
# notes 通用
|
||||
@ -25,11 +25,11 @@
|
||||
=> END
|
||||
|
||||
~ notes_锁住了
|
||||
锁住了[ID:notes_锁住了]
|
||||
锁住了 [ID:notes_锁住了]
|
||||
=> END
|
||||
|
||||
~ notes_打不开
|
||||
打不开[ID:notes_打不开]
|
||||
打不开 [ID:notes_打不开]
|
||||
=> END
|
||||
|
||||
~ notes_干掉的血迹
|
||||
@ -57,8 +57,16 @@
|
||||
=> END
|
||||
|
||||
# c01
|
||||
~ c01_纸包钥匙
|
||||
一张纸条包着钥匙 [ID:c01_纸包钥匙]
|
||||
~ c01_鸡毛掸子
|
||||
这是鸡毛掸子吗? [ID:c01_鸡毛掸子]
|
||||
=> END
|
||||
|
||||
~ c01_院长书桌
|
||||
书桌上好像有本书 [ID:c01_院长书桌]
|
||||
=> END
|
||||
|
||||
~ c01_院长座钟
|
||||
唔...下午一点了 [ID:c01_院长座钟]
|
||||
=> END
|
||||
|
||||
# c02
|
||||
@ -80,7 +88,7 @@
|
||||
=> END
|
||||
|
||||
~ c02_老鼠洞
|
||||
一个老鼠洞[ID:c02_老鼠洞1]
|
||||
一个老鼠洞 [ID:c02_老鼠洞1]
|
||||
在这种楼里挺常见的 [ID:c02_老鼠洞2]
|
||||
=> END
|
||||
|
||||
|
@ -83,7 +83,8 @@ func reload_frames():
|
||||
func _on_mapping_submitted(new_text: String):
|
||||
# clear the old mapping
|
||||
var sprite_frames = animated_sprite.sprite_frames as SpriteFrames
|
||||
sprite_frames.remove_animation(mapping_name)
|
||||
if sprite_frames.has_animation(mapping_name):
|
||||
sprite_frames.remove_animation(mapping_name)
|
||||
mapping_name = new_text
|
||||
frames_config.data.mapping[frame_dir_name] = mapping_name
|
||||
reload_frames()
|
||||
|
@ -21,7 +21,7 @@ size_flags_vertical = 4
|
||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="PanelContainer/CenterContainer"]
|
||||
unique_name_in_owner = true
|
||||
sprite_frames = ExtResource("2_4hiuy")
|
||||
animation = &"climbing_down"
|
||||
animation = &"c00_吕萍_记笔记_right"
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="."]
|
||||
layout_mode = 2
|
||||
|
@ -16,8 +16,11 @@ func get_player() -> MainPlayer:
|
||||
return get_node_or_null("/root/Main/MainPlayer") as MainPlayer
|
||||
|
||||
|
||||
func get_prop_hud() -> PropHud:
|
||||
return get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud
|
||||
func get_current_selected_prop() -> String:
|
||||
var prop_hud = get_node_or_null("/root/Main/UILayer/PropHUD") as PropHud
|
||||
if prop_hud and prop_hud.selected:
|
||||
return prop_hud.inventory.current_item_key()
|
||||
return ""
|
||||
|
||||
|
||||
func pop_os(lines := []):
|
||||
|
@ -37,6 +37,7 @@ buses/default_bus_layout="res://config/default_bus_layout.tres"
|
||||
[autoload]
|
||||
|
||||
DebugMenu="*res://addons/debug_menu/debug_menu.tscn"
|
||||
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
|
||||
GlobalConfigManager="*res://manager/config_manager/global_config_manager.gd"
|
||||
ArchiveManager="*res://manager/archive_manager/archive_manager.gd"
|
||||
CameraFocusMarker="*res://scene/camera/camera_focus_marker.tscn"
|
||||
@ -46,7 +47,6 @@ AudioManager="*res://manager/audio_manager/audio_manager.gd"
|
||||
EventManager="*res://manager/event_manager/event_manager.gd"
|
||||
CgManager="*res://manager/cg_manager/cg_manager.gd"
|
||||
InputManager="res://manager/input/input_manager.gd"
|
||||
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
|
||||
|
||||
[dialogue_manager]
|
||||
|
||||
@ -137,6 +137,11 @@ prop_right={
|
||||
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":16,"position":Vector2(427, 48),"global_position":Vector2(446, 139),"factor":0.0300018,"button_index":5,"canceled":false,"pressed":true,"double_click":false,"script":null)
|
||||
]
|
||||
}
|
||||
prop_select={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":88,"key_label":0,"unicode":120,"location":0,"echo":false,"script":null)
|
||||
]
|
||||
}
|
||||
toggle_journal={
|
||||
"deadzone": 0.5,
|
||||
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null)
|
||||
|
@ -115,6 +115,6 @@ func _get_property_list() -> Array[Dictionary]:
|
||||
"name": "hook_dialogue_title",
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
|
||||
"hint_string": ",".join(dialogue_res.titles.keys())
|
||||
"hint_string": ",".join(dialogue_res.get_ordered_titles())
|
||||
}
|
||||
]
|
||||
|
@ -1,7 +1,8 @@
|
||||
extends StaticBody2D
|
||||
extends Sprite2D
|
||||
|
||||
@export var entity_name: String = ""
|
||||
@export var state: String = ""
|
||||
@export var prop_key := ""
|
||||
@export var interacted := false
|
||||
@export var texture_before: Texture2D
|
||||
@export var texture_after: Texture2D
|
||||
|
||||
@ -25,4 +26,5 @@ func _on_cancel(_body = null) -> void:
|
||||
|
||||
|
||||
func _on_interacted() -> void:
|
||||
pass
|
||||
var key = SceneManager.get_current_selected_prop()
|
||||
print("prop_key", key)
|
||||
|
@ -1,18 +1,14 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://cw3q5pvciumil"]
|
||||
[gd_scene load_steps=5 format=3 uid="uid://cw3q5pvciumil"]
|
||||
|
||||
[ext_resource type="Script" path="res://scene/entity/interactable.gd" id="1_6nrd3"]
|
||||
[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_bvj74"]
|
||||
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="3_qsms8"]
|
||||
[ext_resource type="Texture2D" uid="uid://birl0unx22cmc" path="res://asset/art/scene/c02/s04_院子现实版/e_铁门.png" id="4_4pvt4"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8d3b4"]
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(35, 70)
|
||||
|
||||
[node name="Interactable" type="StaticBody2D"]
|
||||
collision_layer = 4
|
||||
collision_mask = 5
|
||||
input_pickable = true
|
||||
[node name="Interactable" type="Sprite2D"]
|
||||
script = ExtResource("1_6nrd3")
|
||||
|
||||
[node name="Sfx" parent="." instance=ExtResource("2_bvj74")]
|
||||
@ -27,9 +23,3 @@ collision_layer = 0
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
|
||||
unique_name_in_owner = true
|
||||
shape = SubResource("RectangleShape2D_8d3b4")
|
||||
|
||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="."]
|
||||
polygon = PackedVector2Array(-13.5, -86.5, -13.5, 51, -11.5, 52.5, -11.5, 55.1, -5.8, 53.5, 2.3, 69.5, 3.1, 69.5, 5.8, 76.7, 5.1, 78.5, 3.1, 78.5, 4.4, 86.5, 13.5, 86.5, 13.5, -72.5, 5.4, -72.5, -2.5, -82.2, -2.5, -86.5)
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
texture = ExtResource("4_4pvt4")
|
||||
|
@ -21,6 +21,7 @@ var content_key: String = ""
|
||||
@onready var area2d = %Area2D as Area2D
|
||||
|
||||
@onready var sfx = %Sfx
|
||||
@onready var container = %Container
|
||||
@onready var cover_rect = %Cover as TextureRect
|
||||
@onready var content_label = %ContentLabel as Label
|
||||
@onready var tip_label = %TipLabel as Label
|
||||
@ -31,13 +32,6 @@ var tip_notes = "Q: " + tr("ui_退出") + " " + "E: " + tr("ui_收起")
|
||||
static var content_dialogue = (
|
||||
preload("res://asset/dialogue/inspect_content.dialogue") as DialogueResource
|
||||
)
|
||||
static var content_titles = ""
|
||||
|
||||
|
||||
static func _static_init() -> void:
|
||||
# preload all titles from content_dialogue
|
||||
content_titles = ",".join(content_dialogue.titles.keys())
|
||||
|
||||
|
||||
var status := STATUS_NORAML
|
||||
var blinking_tween: Tween
|
||||
@ -46,17 +40,15 @@ var inspected_time = 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
$InspectLayer.layer = GlobalConfig.CANVAS_LAYER_PROP_INSPECTOR
|
||||
sign_mark.interacted.connect(_on_interacted)
|
||||
sign_mark.cancel.connect(_on_cancel)
|
||||
|
||||
container.modulate.a = 0.0
|
||||
content_label.text = _get_tr_content()
|
||||
content_label.modulate.a = 0.0
|
||||
tip_label.text = tip_cover
|
||||
tip_label.modulate.a = 0.0
|
||||
cover_rect.modulate.a = 0.0
|
||||
cover_rect.texture = texture_cover
|
||||
|
||||
|
||||
func _get_tr_content():
|
||||
if content_key == "":
|
||||
return ""
|
||||
@ -83,20 +75,19 @@ func _on_interacted() -> void:
|
||||
status = STATUS_INSPECTING_COVER
|
||||
sign_mark.show_sign = false
|
||||
SceneManager.freeze_player(0)
|
||||
cover_rect.texture = texture_cover
|
||||
tip_label.text = tip_cover
|
||||
_blink_label(true)
|
||||
elif status == STATUS_INSPECTING_COVER:
|
||||
sfx.play()
|
||||
status = STATUS_INSPECTING_NOTES
|
||||
tip_label.text = tip_notes
|
||||
create_tween().tween_property(content_label, "modulate:a", 1.0, 0.2)
|
||||
create_tween().tween_property(cover_rect, "modulate:a", 1.0, 0.15)
|
||||
create_tween().tween_property(container, "modulate:a", 1.0, 0.15)
|
||||
elif status == STATUS_INSPECTING_NOTES:
|
||||
sfx.play()
|
||||
status = STATUS_INSPECTING_COVER
|
||||
tip_label.text = tip_cover
|
||||
create_tween().tween_property(content_label, "modulate:a", 0.0, 0.15)
|
||||
create_tween().tween_property(cover_rect, "modulate:a", 0.0, 0.2)
|
||||
create_tween().tween_property(container, "modulate:a", 0.0, 0.15)
|
||||
|
||||
|
||||
func _blink_label(init := true):
|
||||
@ -114,9 +105,8 @@ func _blink_label(init := true):
|
||||
func _on_cancel(_body = null):
|
||||
# inspected_time = Time.get_ticks_msec()
|
||||
status = STATUS_NORAML
|
||||
cover_rect.modulate.a = 0.0
|
||||
var tween = create_tween()
|
||||
tween.tween_property(content_label, "modulate:a", 0.0, 0.15)
|
||||
tween.tween_property(container, "modulate:a", 0.0, 0.15)
|
||||
if blinking_tween and blinking_tween.is_running():
|
||||
blinking_tween.kill()
|
||||
tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15)
|
||||
@ -139,12 +129,12 @@ func _get(property: StringName) -> Variant:
|
||||
return null
|
||||
|
||||
|
||||
func _get_property_list() -> Array[Dictionary]: # only show notes_ properties in editor
|
||||
func _get_property_list() -> Array[Dictionary]: # only show notes_ properties in editor
|
||||
if Engine.is_editor_hint() and editor_filter and editor_filter != "none":
|
||||
var filted_titles = content_dialogue.titles.keys().filter(_filter_property)
|
||||
var filted_titles = content_dialogue.get_ordered_titles().filter(_filter_property)
|
||||
return [
|
||||
{
|
||||
"name": "note_key",
|
||||
"name": "content_key",
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
|
||||
"hint_string": ",".join(filted_titles)
|
||||
@ -155,9 +145,10 @@ func _get_property_list() -> Array[Dictionary]: # only show notes_ properties in
|
||||
"name": "content_key",
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
|
||||
"hint_string": content_titles
|
||||
"hint_string": ",".join(content_dialogue.get_ordered_titles())
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
func _filter_property(property: StringName) -> bool:
|
||||
return property.find(editor_filter) >= 0
|
||||
return property.find(editor_filter) >= 0
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=10 format=3 uid="uid://ci5anaxsa1apl"]
|
||||
[gd_scene load_steps=11 format=3 uid="uid://ci5anaxsa1apl"]
|
||||
|
||||
[ext_resource type="Script" path="res://scene/entity/local_inspectable.gd" id="1_85el0"]
|
||||
[ext_resource type="PackedScene" uid="uid://c85t6stvytvjn" path="res://scene/entity/ux/sfx.tscn" id="2_h0c2s"]
|
||||
@ -7,6 +7,7 @@
|
||||
[ext_resource type="PackedScene" uid="uid://c4tipnj1cr1j3" path="res://scene/entity/ux/sign.tscn" id="4_do8tr"]
|
||||
[ext_resource type="SpriteFrames" uid="uid://c3s8u4ifaucpj" path="res://config/animation/entity_sprite_frames.tres" id="6_e77p4"]
|
||||
[ext_resource type="Script" path="res://scene/entity/ux/animated_sound_sprite_2d.gd" id="7_bhwlx"]
|
||||
[ext_resource type="Texture2D" uid="uid://cpht56skg054p" path="res://asset/art/scene/c01/s05_院长房间/e_座钟.png" id="8_53i12"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_4fuic"]
|
||||
resource_local_to_scene = true
|
||||
@ -18,6 +19,7 @@ font_size = 11
|
||||
|
||||
[node name="LocalInspectable" type="Sprite2D"]
|
||||
script = ExtResource("1_85el0")
|
||||
content_key = ""
|
||||
|
||||
[node name="Sfx" parent="." instance=ExtResource("2_h0c2s")]
|
||||
unique_name_in_owner = true
|
||||
@ -53,9 +55,20 @@ unique_name_in_owner = true
|
||||
shape = SubResource("RectangleShape2D_4fuic")
|
||||
|
||||
[node name="InspectLayer" type="CanvasLayer" parent="."]
|
||||
layer = 110
|
||||
layer = 11
|
||||
|
||||
[node name="AspectRatioContainer" type="AspectRatioContainer" parent="InspectLayer"]
|
||||
[node name="Root" type="Control" parent="InspectLayer"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="Container" type="PanelContainer" parent="InspectLayer/Root"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(1, 1, 1, 0)
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
@ -63,42 +76,40 @@ grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="Cover" type="TextureRect" parent="InspectLayer/AspectRatioContainer"]
|
||||
[node name="Cover" type="TextureRect" parent="InspectLayer/Root/Container"]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
mouse_filter = 2
|
||||
texture = ExtResource("8_53i12")
|
||||
|
||||
[node name="ContentLabel" type="Label" parent="InspectLayer/AspectRatioContainer"]
|
||||
[node name="ContentLabel" type="Label" parent="InspectLayer/Root/Container"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(1, 1, 1, 0)
|
||||
z_index = 100
|
||||
custom_minimum_size = Vector2(130, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
text = "据闻奉贤县分水墩又有七人染受鼠疫,病状可怖,闻医官药治无用,免职。
|
||||
有地方人称鼠疫为妖邪作祟,甚为惊骇,一时人心惶惶,竟有聚众滋闹之事,政府以防疫事宜关系紧要,拟赴分水墩一带调查防疫事宜云。
|
||||
|
||||
《申报》
|
||||
民国五年一月十三日"
|
||||
label_settings = SubResource("LabelSettings_c3c2j")
|
||||
vertical_alignment = 1
|
||||
autowrap_mode = 3
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="InspectLayer/AspectRatioContainer"]
|
||||
[node name="MarginContainer" type="MarginContainer" parent="InspectLayer/Root"]
|
||||
layout_mode = 2
|
||||
offset_top = 263.0
|
||||
offset_right = 564.0
|
||||
offset_bottom = 316.0
|
||||
size_flags_vertical = 8
|
||||
mouse_filter = 2
|
||||
theme_override_constants/margin_bottom = 38
|
||||
|
||||
[node name="TipLabel" type="Label" parent="InspectLayer/AspectRatioContainer/MarginContainer"]
|
||||
[node name="TipLabel" type="Label" parent="InspectLayer/Root/MarginContainer"]
|
||||
unique_name_in_owner = true
|
||||
modulate = Color(1, 1, 1, 0)
|
||||
z_index = 100
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 8
|
||||
text = "Q: 退出 E: 阅读"
|
||||
text = "Q: ui_退出 E: ui_阅读"
|
||||
horizontal_alignment = 1
|
||||
vertical_alignment = 1
|
||||
|
@ -1,6 +1,7 @@
|
||||
@tool
|
||||
extends Sprite2D
|
||||
|
||||
@export_enum("os", "ballon") var mode = "os"
|
||||
@export_enum("items", "c01", "c02", "c03", "c04", "c05", "c06") var dialogue := "items":
|
||||
set(val):
|
||||
dialogue = val
|
||||
@ -14,7 +15,7 @@ extends Sprite2D
|
||||
if is_node_ready():
|
||||
notify_property_list_changed()
|
||||
var note_key := ""
|
||||
@export_enum("none", "notes", "c01", "c02", "c03", "c04", "c05", "c06") var editor_filter := "notes":
|
||||
@export_enum("none", "notes", "c01", "c02", "c03", "c04", "c05", "c06") var editor_filter := "none":
|
||||
set(val):
|
||||
editor_filter = val
|
||||
if is_node_ready():
|
||||
@ -34,6 +35,8 @@ var mutex = Mutex.new()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
area2d.body_entered.connect(_reset)
|
||||
area2d.body_exited.connect(_on_cancel)
|
||||
sign_mark.interacted.connect(_on_interacted)
|
||||
@ -47,15 +50,14 @@ func _on_interacted() -> void:
|
||||
printerr("Note key is not set")
|
||||
return
|
||||
%Sfx.play()
|
||||
# SceneManager.focus_node(self)
|
||||
# CameraFocusMarker.tween_zoom(1.1, 1.5)
|
||||
# DialogueManager.show_dialogue_balloon(dialogue_res, note_key)
|
||||
# # TODO note viewing animation
|
||||
# SceneManager.freeze_player(0, "")
|
||||
# interacting = true
|
||||
# DialogueManager.dialogue_ended.connect(_on_dialogue_ended, CONNECT_ONE_SHOT)
|
||||
# var player = SceneManager.get_player()
|
||||
# DialogueManager.show_dialogue_balloon_scene(player, dialogue_res, note_key)
|
||||
match mode:
|
||||
"os":
|
||||
_show_os()
|
||||
"ballon":
|
||||
_show_balloon()
|
||||
|
||||
|
||||
func _show_os():
|
||||
var lines = []
|
||||
var current_line = await dialogue_res.get_next_dialogue_line(note_key)
|
||||
while current_line:
|
||||
@ -64,16 +66,28 @@ func _on_interacted() -> void:
|
||||
current_line = await dialogue_res.get_next_dialogue_line(current_line.next_id)
|
||||
else:
|
||||
break
|
||||
# if current_line.has("text"):
|
||||
# lines.append(current_line)
|
||||
# if current_line.has("next_id") and current_line.next_id != "end":
|
||||
# current_line = dialogue_res.lines[current_line.next_id]
|
||||
# else:
|
||||
# break
|
||||
SceneManager.pop_os(lines)
|
||||
SceneManager.freeze_player(1.0, "")
|
||||
|
||||
|
||||
func _show_balloon():
|
||||
# SceneManager.focus_node(self)
|
||||
# CameraFocusMarker.tween_zoom(1.1, 1.5)
|
||||
DialogueManager.show_dialogue_balloon(dialogue_res, note_key)
|
||||
# TODO note viewing animation
|
||||
SceneManager.freeze_player(0, "")
|
||||
interacting = true
|
||||
DialogueManager.dialogue_ended.connect(_on_ballon_ended, CONNECT_ONE_SHOT)
|
||||
# var player = SceneManager.get_player()
|
||||
# DialogueManager.show_dialogue_balloon_scene(player, dialogue_res, note_key)
|
||||
|
||||
|
||||
func _on_ballon_ended(_res):
|
||||
interacting = false
|
||||
SceneManager.release_player()
|
||||
# SceneManager.focus_player_and_reset_zoom()
|
||||
|
||||
|
||||
func _set(property: StringName, value: Variant) -> bool:
|
||||
if property == "note_key":
|
||||
note_key = value
|
||||
@ -93,10 +107,10 @@ func _get_property_list() -> Array[Dictionary]:
|
||||
# only show notes_ properties in editor
|
||||
var titles = ""
|
||||
if Engine.is_editor_hint() and editor_filter and editor_filter != "none":
|
||||
var filted_titles = dialogue_res.titles.keys().filter(_filter_property)
|
||||
var filted_titles = dialogue_res.get_ordered_titles().filter(_filter_property)
|
||||
titles = ",".join(filted_titles)
|
||||
else:
|
||||
titles = ",".join(dialogue_res.titles.keys())
|
||||
titles = ",".join(dialogue_res.get_ordered_titles())
|
||||
return [
|
||||
{
|
||||
"name": "note_key",
|
||||
@ -111,12 +125,6 @@ func _filter_property(property: StringName) -> bool:
|
||||
return property.find(editor_filter) >= 0
|
||||
|
||||
|
||||
# func _on_dialogue_ended(_res):
|
||||
# interacting = false
|
||||
# SceneManager.release_player()
|
||||
# SceneManager.focus_player_and_reset_zoom()
|
||||
|
||||
|
||||
func _on_cancel(_body = null):
|
||||
interacting = false
|
||||
|
||||
|
@ -12,7 +12,6 @@ size = Vector2(40, 60)
|
||||
|
||||
[node name="Note" type="Sprite2D"]
|
||||
script = ExtResource("1_3igk8")
|
||||
editor_filter = "notes_"
|
||||
note_key = ""
|
||||
|
||||
[node name="Sfx" parent="." instance=ExtResource("2_qocmg")]
|
||||
|
@ -77,6 +77,6 @@ func _get_property_list() -> Array[Dictionary]:
|
||||
"name": "dialogue_title",
|
||||
"type": TYPE_STRING,
|
||||
"hint": PROPERTY_HINT_ENUM_SUGGESTION,
|
||||
"hint_string": ",".join(dialogue_res.titles.keys())
|
||||
"hint_string": ",".join(dialogue_res.get_ordered_titles())
|
||||
}
|
||||
]
|
||||
|
@ -1,5 +1,7 @@
|
||||
# @tool
|
||||
extends Sprite2D
|
||||
|
||||
@export var immediately := true
|
||||
@export_enum("left", "right", "1", "2", "3", "4", "5", "6", "7", "8", "9") var portal_name := "left":
|
||||
set(value):
|
||||
#if portal_name:
|
||||
@ -10,7 +12,13 @@ extends Sprite2D
|
||||
@export var target_scene := "c02_s00"
|
||||
@export_enum("none", "left", "right", "1", "2", "3", "4", "5", "6", "7", "8", "9")
|
||||
var target_portal := "none"
|
||||
|
||||
@export var default_texture: Texture2D
|
||||
@export var opened_texture: Texture2D
|
||||
@export var opened := false:
|
||||
set(new_val):
|
||||
opened = new_val
|
||||
if is_node_ready():
|
||||
_checkout_texture()
|
||||
|
||||
@onready var sign_mark = %Sign as Sign
|
||||
@onready var area2d = %Area2D as Area2D
|
||||
@ -22,6 +30,9 @@ var action_times := 0
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
name = "portal_" + portal_name
|
||||
_checkout_texture()
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
area2d.body_entered.connect(_reset)
|
||||
area2d.body_exited.connect(_on_cancel)
|
||||
sign_mark.interacted.connect(_on_interacted)
|
||||
@ -34,6 +45,11 @@ func _ready() -> void:
|
||||
# label.name = "Label"
|
||||
# add_child(label)
|
||||
|
||||
func _checkout_texture():
|
||||
if opened:
|
||||
texture = opened_texture
|
||||
else:
|
||||
texture = default_texture
|
||||
|
||||
func _on_interacted() -> void:
|
||||
if target_portal == "none":
|
||||
@ -44,7 +60,7 @@ func _on_interacted() -> void:
|
||||
print("传送前往", target_scene, target_portal)
|
||||
var ground_loader = SceneManager.get_ground_loader() as GroundLoader
|
||||
if ground_loader:
|
||||
ground_loader.transition_to_scene(target_scene, target_portal)
|
||||
ground_loader.transition_to_scene(target_scene, target_portal, immediately)
|
||||
|
||||
|
||||
func _on_cancel(_body = null):
|
||||
@ -54,7 +70,6 @@ func _on_cancel(_body = null):
|
||||
func _reset(_body):
|
||||
activated = true
|
||||
|
||||
|
||||
# 暂时不启用自动传送
|
||||
# func _input(event: InputEvent) -> void:
|
||||
# # 长按自动传送
|
||||
|
@ -10,7 +10,7 @@
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(45, 130)
|
||||
|
||||
[node name="Portal" type="Sprite2D"]
|
||||
[node name="portal_left" type="Sprite2D"]
|
||||
script = ExtResource("1_jyh6v")
|
||||
|
||||
[node name="Sfx" parent="." instance=ExtResource("3_6khux")]
|
||||
|
@ -103,6 +103,14 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
if activated:
|
||||
if event.is_action_pressed("interact"):
|
||||
interacted.emit()
|
||||
if is_inside_tree():
|
||||
# grab focus 放在 emit 后面,避免在 emit 时 prop hud 失去 focus
|
||||
# 传送时会导致 is_inside_tree 为 false,此时也无需与 prop hud 抢占 focus
|
||||
focus_mode = FOCUS_ALL
|
||||
grab_focus()
|
||||
elif event.is_action_pressed("cancel"):
|
||||
cancel.emit()
|
||||
get_viewport().set_input_as_handled()
|
||||
release_focus()
|
||||
var viewport = get_viewport()
|
||||
if viewport:
|
||||
viewport.set_input_as_handled()
|
||||
|
@ -24,6 +24,8 @@ func _ready() -> void:
|
||||
script = ExtResource("1_0vrlo")
|
||||
scene_config = SubResource("Resource_6ux50")
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||
|
||||
[node name="BGColorRect" type="ColorRect" parent="."]
|
||||
custom_minimum_size = Vector2(664, 318)
|
||||
anchors_preset = 4
|
||||
@ -45,10 +47,10 @@ offset = Vector2(0, -120)
|
||||
[node name="DeployLayer" type="Node2D" parent="."]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="PortalLeft" parent="DeployLayer" instance=ExtResource("3_t73yw")]
|
||||
[node name="portal_left" parent="DeployLayer" instance=ExtResource("3_t73yw")]
|
||||
position = Vector2(26, -1)
|
||||
|
||||
[node name="PortalRight" parent="DeployLayer" instance=ExtResource("3_t73yw")]
|
||||
[node name="portal_right" parent="DeployLayer" instance=ExtResource("3_t73yw")]
|
||||
position = Vector2(530, 0)
|
||||
portal_name = "right"
|
||||
|
||||
|
@ -31,7 +31,7 @@ func _ready() -> void:
|
||||
entrance_portal = archive_portal
|
||||
if current_scene and entrance_portal:
|
||||
transition_to_scene(current_scene, entrance_portal, true)
|
||||
elif ground:
|
||||
elif ground:
|
||||
ground.queue_free()
|
||||
ground = null
|
||||
|
||||
@ -124,7 +124,7 @@ func _set_camera_and_player_boundary():
|
||||
var bg = ground.get_node("BGSprite2D")
|
||||
# set current_boarder by bg size
|
||||
if bg.texture and not Engine.is_editor_hint():
|
||||
var size = bg.texture.get_size()
|
||||
var size = bg.texture.get_size() * bg.scale
|
||||
# camera rect
|
||||
var camera_size = Vector2(max(564.0, size.x), max(size.y, 316.0))
|
||||
var camera_upleft = Vector2(0, -camera_size.y / 2.0)
|
||||
|
@ -1,15 +1,22 @@
|
||||
[gd_scene load_steps=12 format=3 uid="uid://dlx5xxbg53rb8"]
|
||||
[gd_scene load_steps=22 format=3 uid="uid://dlx5xxbg53rb8"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dayyx4jerj7io" path="res://scene/ground/ground.tscn" id="1_ff4yb"]
|
||||
[ext_resource type="Script" path="res://config/deploy/scene_config.gd" id="2_ve5ly"]
|
||||
[ext_resource type="Texture2D" uid="uid://bx5we5pgnlhl5" path="res://asset/art/scene/c01/s05_院长房间/bg_房间背景.png" id="3_3r1q2"]
|
||||
[ext_resource type="Texture2D" uid="uid://dkufmwg07maun" path="res://asset/art/scene/c01/s05_院长房间/全局参考.png" id="3_7u4bh"]
|
||||
[ext_resource type="Texture2D" uid="uid://difymnwnet6lk" path="res://asset/art/scene/c01/s05_院长房间/bg_背景.png" id="3_f4ne6"]
|
||||
[ext_resource type="Texture2D" uid="uid://bp2r4s6v6ag2f" path="res://asset/art/scene/c01/s05_院长房间/fg_前景.png" id="3_vmr0f"]
|
||||
[ext_resource type="Texture2D" uid="uid://ch7ic6i6ewoi7" path="res://asset/art/scene/c01/s05_院长房间/e_门.png" id="4_gdhoy"]
|
||||
[ext_resource type="Texture2D" uid="uid://bkbr5ubkif1e6" path="res://asset/art/scene/c01/s05_院长房间/e_打开的门.png" id="5_cddn7"]
|
||||
[ext_resource type="PackedScene" uid="uid://ci5anaxsa1apl" path="res://scene/entity/local_inspectable.tscn" id="6_v72k7"]
|
||||
[ext_resource type="Texture2D" uid="uid://cpht56skg054p" path="res://asset/art/scene/c01/s05_院长房间/e_座钟.png" id="7_3tetc"]
|
||||
[ext_resource type="Texture2D" uid="uid://qw8jwid7j8qw" path="res://asset/art/scene/c01/s05_院长房间/e_床.png" id="7_xakd0"]
|
||||
[ext_resource type="Texture2D" uid="uid://bt17wvt5nw6a7" path="res://asset/art/scene/c01/s05_院长房间/e_钢琴.png" id="8_mnduo"]
|
||||
[ext_resource type="Texture2D" uid="uid://iteaoon750bx" path="res://asset/art/scene/c01/s05_院长房间/e_桌椅.png" id="9_x837o"]
|
||||
[ext_resource type="PackedScene" uid="uid://jr1yd46wm5je" path="res://scene/entity/note.tscn" id="10_18v0g"]
|
||||
[ext_resource type="Texture2D" uid="uid://diw7l2qdwbyoc" path="res://asset/art/scene/c01/s05_院长房间/e_画框.png" id="11_6gq1s"]
|
||||
[ext_resource type="Texture2D" uid="uid://dx3ym8inpuj5b" path="res://asset/art/scene/c01/s05_院长房间/e_鸡毛掸子.png" id="12_jtglg"]
|
||||
[ext_resource type="PackedScene" uid="uid://cw3q5pvciumil" path="res://scene/entity/interactable.tscn" id="14_lq1ou"]
|
||||
[ext_resource type="Texture2D" uid="uid://cyqnkcx3qx100" path="res://asset/art/scene/c01/s05_院长房间/l_房间背景.png" id="15_6p040"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6jwab"]
|
||||
resource_local_to_scene = true
|
||||
@ -19,43 +26,113 @@ player_y = 45
|
||||
footstep_type = "concrete"
|
||||
bgm = ""
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_6i5gw"]
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(40, 60)
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_6bim4"]
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(10, 60)
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_dq2na"]
|
||||
resource_local_to_scene = true
|
||||
size = Vector2(10, 60)
|
||||
|
||||
[node name="S05院长房间" type="Node2D"]
|
||||
|
||||
[node name="Ground" parent="." instance=ExtResource("1_ff4yb")]
|
||||
scene_config = SubResource("Resource_6jwab")
|
||||
|
||||
[node name="BGSprite2D" parent="Ground" index="1"]
|
||||
position = Vector2(45, -38)
|
||||
texture = ExtResource("3_f4ne6")
|
||||
[node name="BGSprite2D" parent="Ground" index="2"]
|
||||
position = Vector2(23, -118)
|
||||
scale = Vector2(0.333, 0.333)
|
||||
texture = ExtResource("3_3r1q2")
|
||||
|
||||
[node name="PortalLeft" parent="Ground/DeployLayer" index="0"]
|
||||
position = Vector2(90, 11)
|
||||
|
||||
[node name="PortalRight" parent="Ground/DeployLayer" index="1"]
|
||||
position = Vector2(473, 19)
|
||||
texture = ExtResource("5_cddn7")
|
||||
[node name="portal_right" parent="Ground/DeployLayer" index="1"]
|
||||
position = Vector2(502, 9)
|
||||
texture = ExtResource("4_gdhoy")
|
||||
target_scene = "c01_s05"
|
||||
target_portal = "left"
|
||||
default_texture = ExtResource("4_gdhoy")
|
||||
opened_texture = ExtResource("5_cddn7")
|
||||
|
||||
[node name="座钟" parent="Ground/DeployLayer" index="2" instance=ExtResource("6_v72k7")]
|
||||
position = Vector2(316, 26)
|
||||
position = Vector2(334, 16)
|
||||
texture = ExtResource("7_3tetc")
|
||||
texture_cover = ExtResource("7_3tetc")
|
||||
editor_filter = "c01"
|
||||
content_key = "c01_院长座钟"
|
||||
|
||||
[node name="钢琴" parent="Ground/DeployLayer" index="3" instance=ExtResource("6_v72k7")]
|
||||
position = Vector2(232, 57)
|
||||
[node name="床" parent="Ground/DeployLayer" index="3" instance=ExtResource("6_v72k7")]
|
||||
position = Vector2(84, 45)
|
||||
texture = ExtResource("7_xakd0")
|
||||
|
||||
[node name="钢琴" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_v72k7")]
|
||||
position = Vector2(413, 47)
|
||||
texture = ExtResource("8_mnduo")
|
||||
|
||||
[node name="桌椅" type="Sprite2D" parent="Ground/DeployLayer" index="4"]
|
||||
position = Vector2(384, 52)
|
||||
[node name="桌椅" parent="Ground/DeployLayer" index="5" instance=ExtResource("10_18v0g")]
|
||||
position = Vector2(154, 42)
|
||||
texture = ExtResource("9_x837o")
|
||||
editor_filter = "c01"
|
||||
note_key = "c01_院长书桌"
|
||||
|
||||
[node name="Sign" parent="Ground/DeployLayer/桌椅" index="1"]
|
||||
offset_top = -21.0
|
||||
offset_bottom = 59.0
|
||||
|
||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/桌椅/Area2D" index="0"]
|
||||
shape = SubResource("RectangleShape2D_6i5gw")
|
||||
|
||||
[node name="画框" parent="Ground/DeployLayer" index="6" instance=ExtResource("10_18v0g")]
|
||||
position = Vector2(277, -28)
|
||||
texture = ExtResource("11_6gq1s")
|
||||
editor_filter = "c01"
|
||||
|
||||
[node name="Sign" parent="Ground/DeployLayer/画框" index="1"]
|
||||
offset_left = 6.0
|
||||
offset_top = -1.0
|
||||
offset_right = 89.0
|
||||
offset_bottom = 79.0
|
||||
|
||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/画框/Area2D" index="0"]
|
||||
position = Vector2(11, -1)
|
||||
shape = SubResource("RectangleShape2D_6bim4")
|
||||
|
||||
[node name="鸡毛掸子" parent="Ground/DeployLayer" index="7" instance=ExtResource("10_18v0g")]
|
||||
position = Vector2(269, 20)
|
||||
texture = ExtResource("12_jtglg")
|
||||
editor_filter = "c01"
|
||||
note_key = "c01_鸡毛掸子"
|
||||
|
||||
[node name="Area2D" parent="Ground/DeployLayer/鸡毛掸子" index="3"]
|
||||
position = Vector2(-7, 0)
|
||||
|
||||
[node name="CollisionShape2D" parent="Ground/DeployLayer/鸡毛掸子/Area2D" index="0"]
|
||||
shape = SubResource("RectangleShape2D_dq2na")
|
||||
|
||||
[node name="Interactable" parent="Ground/DeployLayer" index="8" instance=ExtResource("14_lq1ou")]
|
||||
position = Vector2(210, 36)
|
||||
|
||||
[node name="PointLight2D" type="PointLight2D" parent="Ground/AmbientLayer" index="0"]
|
||||
visible = false
|
||||
position = Vector2(283, 0)
|
||||
texture = ExtResource("15_6p040")
|
||||
texture_scale = 0.33
|
||||
height = 40.0
|
||||
|
||||
[node name="FGSprite2D" parent="Ground/ParallaxForeground/FGParallaxLayer" index="0"]
|
||||
position = Vector2(62, 35)
|
||||
position = Vector2(22, 49)
|
||||
texture = ExtResource("3_vmr0f")
|
||||
|
||||
[node name="参考" type="Sprite2D" parent="Ground"]
|
||||
visible = false
|
||||
modulate = Color(1, 1, 1, 0.219608)
|
||||
position = Vector2(276, 2)
|
||||
scale = Vector2(0.26, 0.26)
|
||||
position = Vector2(281, -1)
|
||||
scale = Vector2(0.333, 0.333)
|
||||
texture = ExtResource("3_7u4bh")
|
||||
|
||||
[editable path="Ground"]
|
||||
[editable path="Ground/DeployLayer/桌椅"]
|
||||
[editable path="Ground/DeployLayer/画框"]
|
||||
[editable path="Ground/DeployLayer/鸡毛掸子"]
|
||||
|
@ -22,24 +22,24 @@ scene_config = SubResource("Resource_p1xa1")
|
||||
[node name="BGSprite2D" parent="Ground" index="1"]
|
||||
texture = ExtResource("2_ni1a4")
|
||||
|
||||
[node name="PortalLeft" parent="Ground/DeployLayer" index="0"]
|
||||
[node name="portal_left" parent="Ground/DeployLayer" index="0"]
|
||||
position = Vector2(78, 27)
|
||||
|
||||
[node name="PortalRight" parent="Ground/DeployLayer" index="1"]
|
||||
[node name="portal_right" parent="Ground/DeployLayer" index="1"]
|
||||
position = Vector2(392, 2)
|
||||
portal_name = "right"
|
||||
target_scene = "c02_s02"
|
||||
target_portal = "left"
|
||||
|
||||
[node name="Note" parent="Ground/DeployLayer" index="2" instance=ExtResource("3_6lnxd")]
|
||||
position = Vector2(250, -22)
|
||||
editor_filter = "c02"
|
||||
note_key = "c02_寻人启事"
|
||||
|
||||
[node name="Note门口" parent="Ground/DeployLayer" index="3" instance=ExtResource("3_6lnxd")]
|
||||
position = Vector2(311, -27)
|
||||
mode = "ballon"
|
||||
dialogue = "c02"
|
||||
editor_filter = "c02"
|
||||
note_key = "c02_s01_menpai"
|
||||
note_key = "c02_s01_门口"
|
||||
|
||||
[node name="Ambush" parent="Ground/DeployLayer" index="4" instance=ExtResource("6_vgxa0")]
|
||||
position = Vector2(135, 56)
|
||||
|
@ -11,15 +11,13 @@ class_name PropHud extends Control
|
||||
@export_group("Inventory")
|
||||
@export var inventory: PropInventory
|
||||
@export_group("UI-UX")
|
||||
@export var display_time := 1.5 # 不包含渐入渐出(约 0.6s)的时长
|
||||
@export var display_time := 2.5 # 不包含渐入渐出(约 0.6s)的时长
|
||||
@export var locked := false
|
||||
@export var selected := false:
|
||||
set(value):
|
||||
selected = value
|
||||
if value:
|
||||
%Mark.visible = true
|
||||
else:
|
||||
%Mark.visible = false
|
||||
if is_node_ready():
|
||||
%Mark.visible = value
|
||||
|
||||
@onready var sfx = %Sfx as Sfx
|
||||
@onready var left_btn = %LeftButton as TextureButton
|
||||
@ -31,6 +29,7 @@ class_name PropHud extends Control
|
||||
@onready var title_label = %TitleLabel as Label
|
||||
|
||||
var items_dict := {}
|
||||
# 从配置文件加载 prop items
|
||||
var item_config_res = preload("res://asset/dialogue/item_description.dialogue")
|
||||
var item_config_title = "PropItems"
|
||||
var texture_path_prefix = "res://asset/art/prop/"
|
||||
@ -48,25 +47,31 @@ func _ready() -> void:
|
||||
_load_from_archive()
|
||||
if Engine.is_editor_hint():
|
||||
return
|
||||
focus_exited.connect(_on_focus_exited)
|
||||
ArchiveManager.archive_loaded.connect(_load_from_archive)
|
||||
# tween timer
|
||||
timer.wait_time = display_time
|
||||
timer.one_shot = true
|
||||
timer.autostart = false
|
||||
timer.timeout.connect(toggle_details.bind(false))
|
||||
timer.timeout.connect(_on_timer_timeout)
|
||||
add_child(timer)
|
||||
# connect signals
|
||||
left_btn.pressed.connect(on_left_pressed)
|
||||
right_btn.pressed.connect(on_right_pressed)
|
||||
panel.pressed.connect(_on_panel_pressed)
|
||||
mark.modulate.a = 0.0
|
||||
%Mark.visible = selected
|
||||
mark.modulate.a = 0.8
|
||||
title_label.modulate.a = 0.0
|
||||
# _toggle_btn_ability(false)
|
||||
left_btn.modulate.a = 0.5
|
||||
right_btn.modulate.a = 0.5
|
||||
mouse_entered.connect(_on_mouse_entered)
|
||||
mouse_exited.connect(_on_mouse_exited)
|
||||
selected = selected
|
||||
|
||||
|
||||
func _on_focus_exited() -> void:
|
||||
if selected:
|
||||
selected = false
|
||||
|
||||
|
||||
func _load_items():
|
||||
@ -127,7 +132,8 @@ func _update_prop_display_with_texture():
|
||||
func on_left_pressed() -> void:
|
||||
sfx.play()
|
||||
_mouse_moved_on_listening()
|
||||
inventory.index_wrap_add(-1)
|
||||
if inventory.index_wrap_add(-1):
|
||||
selected = false
|
||||
_update_prop_display_with_texture()
|
||||
_tween_container(true)
|
||||
|
||||
@ -135,7 +141,8 @@ func on_left_pressed() -> void:
|
||||
func on_right_pressed() -> void:
|
||||
sfx.play()
|
||||
_mouse_moved_on_listening()
|
||||
inventory.index_wrap_add(1)
|
||||
if inventory.index_wrap_add(1):
|
||||
selected = false
|
||||
_update_prop_display_with_texture()
|
||||
_tween_container(false)
|
||||
|
||||
@ -154,6 +161,10 @@ func _tween_container(left_to_right := true) -> void:
|
||||
|
||||
func _on_panel_pressed() -> void:
|
||||
sfx.play()
|
||||
if not selected:
|
||||
focus_mode = FOCUS_ALL
|
||||
grab_focus()
|
||||
selected = true
|
||||
_mouse_moved_on_listening()
|
||||
print("panel")
|
||||
|
||||
@ -174,6 +185,10 @@ func _mouse_moved_on_listening() -> void:
|
||||
timer.start(display_time)
|
||||
|
||||
|
||||
func _on_timer_timeout() -> void:
|
||||
toggle_details(false)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if locked:
|
||||
return
|
||||
@ -183,6 +198,9 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
elif event.is_action_pressed("prop_right"):
|
||||
on_right_pressed()
|
||||
get_viewport().set_input_as_handled()
|
||||
elif event.is_action_pressed("prop_select"):
|
||||
_on_panel_pressed()
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
@ -199,19 +217,18 @@ func toggle_details(display := true) -> void:
|
||||
if display:
|
||||
displaying = true
|
||||
_toggle_btn_ability(true)
|
||||
display_tween.tween_property(mark, "modulate:a", 0.5, 0.2)
|
||||
display_tween.parallel().tween_property(title_label, "modulate:a", 1.0, 0.2)
|
||||
display_tween.parallel().tween_property(left_btn, "modulate:a", 1.0, 0.5)
|
||||
display_tween.parallel().tween_property(right_btn, "modulate:a", 1.0, 0.5)
|
||||
display_tween.tween_property(mark, "modulate:a", 1.0, 0.2)
|
||||
display_tween.parallel().tween_property(title_label, "modulate:a", 1.0, 0.3)
|
||||
display_tween.parallel().tween_property(left_btn, "modulate:a", 1.0, 0.3)
|
||||
display_tween.parallel().tween_property(right_btn, "modulate:a", 1.0, 0.3)
|
||||
display_tween.parallel().tween_property(mark, "modulate:a", 1.0, 0.3)
|
||||
display_tween.parallel().tween_property(mark, "scale", Vector2(1.1, 1.1), 0.3).set_trans(
|
||||
Tween.TRANS_CUBIC
|
||||
)
|
||||
display_tween.tween_property(mark, "scale", Vector2.ONE, 0.3).set_trans(Tween.TRANS_CUBIC)
|
||||
display_tween.tween_property(mark, "scale", Vector2.ONE, 0.2).set_trans(Tween.TRANS_CUBIC)
|
||||
timer.start(display_time)
|
||||
else:
|
||||
displaying = false
|
||||
display_tween.tween_property(mark, "modulate:a", 0.0, 0.6)
|
||||
display_tween.tween_property(mark, "modulate:a", 0.8, 0.6)
|
||||
display_tween.parallel().tween_property(title_label, "modulate:a", 0.0, 0.6)
|
||||
display_tween.parallel().tween_property(left_btn, "modulate:a", 0.5, 0.5)
|
||||
display_tween.parallel().tween_property(right_btn, "modulate:a", 0.5, 0.5)
|
||||
@ -233,3 +250,15 @@ func enable_prop_item(prop_key: String) -> void:
|
||||
inventory.enable_item(prop_key)
|
||||
_load_texture_cache()
|
||||
_update_prop_display_with_texture()
|
||||
# save to archive immediately
|
||||
ArchiveManager.save_all()
|
||||
|
||||
|
||||
func disable_prop_item(prop_key: String) -> void:
|
||||
if not inventory or not prop_key:
|
||||
return
|
||||
inventory.disable_item(prop_key)
|
||||
_load_texture_cache()
|
||||
_update_prop_display_with_texture()
|
||||
# save to archive immediately
|
||||
ArchiveManager.save_all()
|
||||
|
@ -21,7 +21,6 @@ offset_bottom = 504.0
|
||||
scale = Vector2(0.3, 0.3)
|
||||
mouse_filter = 1
|
||||
script = ExtResource("1_bbv0a")
|
||||
enable_item = false
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
layout_mode = 0
|
||||
@ -70,6 +69,7 @@ offset_right = 65.0
|
||||
offset_bottom = 65.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
mouse_filter = 1
|
||||
|
||||
[node name="PropContainer" type="CenterContainer" parent="VBoxContainer/HBoxContainer/HudPanel/Container"]
|
||||
unique_name_in_owner = true
|
||||
@ -93,6 +93,7 @@ texture = ExtResource("8_l2cwd")
|
||||
|
||||
[node name="Mark" type="TextureRect" parent="VBoxContainer/HBoxContainer/HudPanel"]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchors_preset = 3
|
||||
anchor_left = 1.0
|
||||
|
@ -16,7 +16,16 @@ func enable_item(prop_key: String) -> void:
|
||||
# emit_changed()
|
||||
|
||||
|
||||
func index_wrap_add(delta: int) -> void:
|
||||
func disable_item(prop_key: String) -> void:
|
||||
if enabled_items.has(prop_key):
|
||||
enabled_items.erase(prop_key)
|
||||
# wrap index
|
||||
current_index = wrapi(current_index, 0, enabled_items.size())
|
||||
|
||||
|
||||
# return true if the index changed
|
||||
func index_wrap_add(delta: int) -> bool:
|
||||
current_index += delta
|
||||
current_index = wrapi(current_index, 0, enabled_items.size())
|
||||
# emit_changed()
|
||||
return not enabled_items.is_empty()
|
||||
|
@ -19,6 +19,7 @@ environment = ExtResource("9_jsof5")
|
||||
|
||||
[node name="GroundLoader" parent="." instance=ExtResource("10_8rc5n")]
|
||||
position = Vector2(1, 0)
|
||||
current_scene = "c01_s05"
|
||||
|
||||
[node name="MainPlayer" parent="." instance=ExtResource("6_6geb0")]
|
||||
unique_name_in_owner = true
|
||||
@ -29,7 +30,6 @@ scale = Vector2(0.6, 0.6)
|
||||
|
||||
[node name="PropInspector" parent="." instance=ExtResource("5_ux0rw")]
|
||||
unique_name_in_owner = true
|
||||
visible = false
|
||||
|
||||
[node name="UILayer" type="CanvasLayer" parent="."]
|
||||
layer = 12
|
||||
@ -74,7 +74,7 @@ metadata/_edit_use_anchors_ = true
|
||||
|
||||
[node name="PropHUD" parent="UILayer" instance=ExtResource("4_t7gb2")]
|
||||
scale = Vector2(0.24, 0.24)
|
||||
enable_item = null
|
||||
display_time = 1.5
|
||||
metadata/_edit_use_anchors_ = true
|
||||
|
||||
[node name="Journal" parent="." instance=ExtResource("10_durpa")]
|
||||
|
@ -12,6 +12,8 @@ enum MOVEMENT_STATUS {
|
||||
CLIMBING,
|
||||
}
|
||||
|
||||
@export var shadow_color := Color(0.1, 0.1, 0.1, 0.7)
|
||||
var shadow_y := 0.0
|
||||
@export var player_movement_rect := Rect2(50, -500, 1400, 1000)
|
||||
@export var velocity_ratio := 1.0
|
||||
@export var action_locked := false:
|
||||
@ -44,15 +46,20 @@ enum MOVEMENT_STATUS {
|
||||
@onready var footstep_timer = %FootstepTimer as Timer
|
||||
@onready var sprite = %AnimatedSprite2D as AnimatedSprite2D
|
||||
@onready var os_pivot = %OSPivot as Control
|
||||
@onready var os_contaner = %PanelContainer as PanelContainer
|
||||
@onready var os_label = %OSLabel as DialogueLabel
|
||||
|
||||
# animation -> {frame -> {shadow polygon}}
|
||||
var animation_shadow_polygons = {}
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# _reset_face_direction()
|
||||
footstep_timer.timeout.connect(_on_footstep_timer_timeout)
|
||||
footstep_timer.stop()
|
||||
SceneManager.focus_player()
|
||||
os_label.modulate.a = 0.0
|
||||
os_contaner.modulate.a = 0.0
|
||||
sprite.frame_changed.connect(queue_redraw)
|
||||
|
||||
|
||||
func _on_footstep_timer_timeout():
|
||||
@ -118,7 +125,7 @@ func set_facing_direction(direction: Vector2) -> void:
|
||||
|
||||
func _play_animation() -> void:
|
||||
# reset the os label position on animation changed.
|
||||
_reset_os_position()
|
||||
_reset_os_and_shadow_position()
|
||||
match current_status:
|
||||
MOVEMENT_STATUS.IDLE:
|
||||
if facing_direction.x > 0.0:
|
||||
@ -153,16 +160,16 @@ func _play_animation() -> void:
|
||||
sprite.play(&"laying_moving_l")
|
||||
footstep_timer.wait_time = 2.0 / 3.0
|
||||
footstep_timer.start()
|
||||
MOVEMENT_STATUS.CLIMBING_STAY:
|
||||
sprite.play(&"climbing_stay")
|
||||
footstep_timer.stop()
|
||||
MOVEMENT_STATUS.CLIMBING:
|
||||
if facing_direction.y > 0.0:
|
||||
sprite.play(&"climbing_down")
|
||||
else:
|
||||
sprite.play(&"climbing_up")
|
||||
footstep_timer.wait_time = 2.0 / 3.0
|
||||
footstep_timer.start()
|
||||
# MOVEMENT_STATUS.CLIMBING_STAY:
|
||||
# sprite.play(&"climbing_stay")
|
||||
# footstep_timer.stop()
|
||||
# MOVEMENT_STATUS.CLIMBING:
|
||||
# if facing_direction.y > 0.0:
|
||||
# sprite.play(&"climbing_down")
|
||||
# else:
|
||||
# sprite.play(&"climbing_up")
|
||||
# footstep_timer.wait_time = 2.0 / 3.0
|
||||
# footstep_timer.start()
|
||||
|
||||
|
||||
func _get_speed(direction: Vector2) -> Vector2:
|
||||
@ -239,10 +246,61 @@ func release_player():
|
||||
_play_animation()
|
||||
|
||||
|
||||
func _reset_os_position():
|
||||
func _draw() -> void:
|
||||
var animation = sprite.animation
|
||||
if not animation:
|
||||
return
|
||||
if not animation_shadow_polygons.has(animation):
|
||||
_build_shadow_polygons(animation)
|
||||
var animation_polygons = animation_shadow_polygons[animation]
|
||||
if animation_polygons.has(sprite.frame):
|
||||
draw_polygon(animation_polygons[sprite.frame], [shadow_color])
|
||||
else:
|
||||
printerr("No shadow polygon found for frame %d" % sprite.frame)
|
||||
|
||||
|
||||
func _build_shadow_polygons(animation):
|
||||
var frames = sprite.sprite_frames
|
||||
var coords_dict = {}
|
||||
for i in frames.get_frame_count(animation):
|
||||
var texture = frames.get_frame_texture(animation, i) as Texture2D
|
||||
if not texture:
|
||||
continue
|
||||
var image = texture.get_image()
|
||||
var x_min = 10000
|
||||
var x_max = -1
|
||||
for y in range(texture.get_height()):
|
||||
for x in range(texture.get_width()):
|
||||
var color = image.get_pixel(x, y)
|
||||
if color.a > 0.0:
|
||||
x_min = min(x_min, x)
|
||||
x_max = max(x_max, x)
|
||||
if x_min >= x_max:
|
||||
continue
|
||||
var oval_ab: Vector2
|
||||
oval_ab.x = (x_max - x_min) * 0.5
|
||||
oval_ab.y = max(3.0, oval_ab.x * 0.12)
|
||||
var x_offset = (x_max - x_min) * 0.5 + x_min - texture.get_width() * 0.5
|
||||
var coords: PackedVector2Array
|
||||
# build shadow oval shape with segments.
|
||||
var segments = 16
|
||||
for j in range(segments):
|
||||
var angle = PI * 2 / segments * j
|
||||
var x = cos(angle) * oval_ab.x + x_offset
|
||||
var y = sin(angle) * oval_ab.y + shadow_y
|
||||
coords.append(Vector2(x, y))
|
||||
coords_dict[i] = coords
|
||||
animation_shadow_polygons[animation] = coords_dict
|
||||
|
||||
|
||||
func _reset_os_and_shadow_position():
|
||||
if sprite.animation:
|
||||
var size = sprite.sprite_frames.get_frame_texture(sprite.animation, 0).get_size()
|
||||
var texture = sprite.sprite_frames.get_frame_texture(sprite.animation, 0) as Texture2D
|
||||
var size = texture.get_size()
|
||||
# reset the os label position
|
||||
os_pivot.position.y = -size.y * 0.5 - 4.0
|
||||
# reset the shadow position
|
||||
shadow_y = size.y * 0.5
|
||||
|
||||
|
||||
var os_tween: Tween
|
||||
@ -253,13 +311,13 @@ func pop_os(lines := []):
|
||||
os_tween.kill()
|
||||
os_tween = create_tween()
|
||||
os_label.text = ""
|
||||
os_tween.tween_property(os_label, "modulate:a", 1.0, 0.1)
|
||||
os_tween.tween_property(os_contaner, "modulate:a", 1.0, 0.2)
|
||||
for line in lines:
|
||||
var duration = max(min(4.0, line.text.length() * 0.2), 2.0)
|
||||
var duration = max(min(4.0, line.text.length() * 0.2), 2.0) - 0.4
|
||||
os_tween.tween_callback(_os_load_line.bind(line))
|
||||
os_tween.tween_callback(os_label.type_out)
|
||||
os_tween.tween_interval(duration)
|
||||
os_tween.tween_property(os_label, "modulate:a", 0.0, 0.1)
|
||||
os_tween.tween_property(os_contaner, "modulate:a", 0.0, 0.2)
|
||||
|
||||
|
||||
func _os_load_line(line):
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://cjhw5ecygrqty"]
|
||||
[gd_scene load_steps=8 format=3 uid="uid://cjhw5ecygrqty"]
|
||||
|
||||
[ext_resource type="Script" path="res://scene/player/main_player.gd" id="1_3a78y"]
|
||||
[ext_resource type="SpriteFrames" uid="uid://c3s8u4ifaucpj" path="res://config/animation/entity_sprite_frames.tres" id="2_3w63u"]
|
||||
@ -9,6 +9,18 @@
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_fno82"]
|
||||
size = Vector2(78.25, 205.062)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lq4rc"]
|
||||
bg_color = Color(0.0313726, 0.0313726, 0.0313726, 0.729412)
|
||||
border_color = Color(0.8, 0.8, 0.8, 0.160784)
|
||||
corner_radius_top_left = 6
|
||||
corner_radius_top_right = 6
|
||||
corner_radius_bottom_right = 6
|
||||
corner_radius_bottom_left = 6
|
||||
expand_margin_left = 6.0
|
||||
expand_margin_top = 6.0
|
||||
expand_margin_right = 6.0
|
||||
expand_margin_bottom = 6.0
|
||||
|
||||
[node name="MainPlayer" type="CharacterBody2D"]
|
||||
collision_mask = 2
|
||||
script = ExtResource("1_3a78y")
|
||||
@ -38,26 +50,39 @@ layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_top = -20.0
|
||||
offset_bottom = -20.0
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="OSPivot"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
custom_minimum_size = Vector2(120, 0)
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchors_preset = 7
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -25.0
|
||||
offset_top = -6.0
|
||||
offset_right = 25.0
|
||||
offset_bottom = 6.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -60.0
|
||||
offset_top = -12.0
|
||||
offset_right = 60.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
grow_vertical = 0
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 8
|
||||
mouse_filter = 2
|
||||
|
||||
[node name="OSLabel" type="RichTextLabel" parent="OSPivot/MarginContainer"]
|
||||
[node name="PanelContainer" type="PanelContainer" parent="OSPivot/MarginContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(50, 0)
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 4
|
||||
size_flags_vertical = 4
|
||||
mouse_filter = 2
|
||||
theme_override_styles/panel = SubResource("StyleBoxFlat_lq4rc")
|
||||
|
||||
[node name="OSLabel" type="RichTextLabel" parent="OSPivot/MarginContainer/PanelContainer"]
|
||||
unique_name_in_owner = true
|
||||
custom_minimum_size = Vector2(120, 0)
|
||||
layout_mode = 2
|
||||
size_flags_vertical = 8
|
||||
mouse_filter = 2
|
||||
theme_override_fonts/normal_font = ExtResource("4_4jk1c")
|
||||
bbcode_enabled = true
|
||||
|
@ -9,6 +9,7 @@ font_size = 11
|
||||
|
||||
[node name="PropInspector" type="CanvasLayer"]
|
||||
layer = 11
|
||||
visible = false
|
||||
script = ExtResource("1_2wpwe")
|
||||
|
||||
[node name="TextureRect" type="TextureRect" parent="."]
|
||||
|