InitCommit

update 1.4.2 source code
master
kaia 2024-02-03 18:36:09 -06:00
commit ece4ffd123
216 changed files with 79783 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
# Godot 4+ specific ignores
.godot/
.export/
.itchio/
.steam/

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2016-2023 The Godot Engine community
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
[configuration]
entry_symbol = "git_plugin_init"
compatibility_minimum = "4.1.0"
[libraries]
macos.editor = "macos/libgit_plugin.macos.editor.universal.dylib"
windows.editor.x86_64 = "win64/libgit_plugin.windows.editor.x86_64.dll"
linux.editor.x86_64 = "linux/libgit_plugin.linux.editor.x86_64.so"
linux.editor.arm64 = "linux/libgit_plugin.linux.editor.arm64.so"
linux.editor.rv64 = ""

View File

@ -0,0 +1,7 @@
[plugin]
name="Godot Git Plugin"
description="This plugin lets you interact with Git without leaving the Godot editor. More information can be found at https://github.com/godotengine/godot-git-plugin/wiki"
author="twaritwaikar"
version="v3.1.0"
script="godot-git-plugin.gd"

View File

@ -0,0 +1,7 @@
[plugin]
name="ElgatoStreamDeck"
description="A plugin to interface with Elgato Stream Deck devices."
author="Boyne Games"
version="1.0.0"
script="plugin.gd"

View File

@ -0,0 +1,12 @@
@tool
extends EditorPlugin
const AUTOLOAD_NAME = "ElgatoStreamDeck"
func _enter_tree():
add_autoload_singleton(AUTOLOAD_NAME, "res://addons/godot-streamdeck-addon/singleton.gd")
pass
func _exit_tree():
remove_autoload_singleton(AUTOLOAD_NAME)
pass

View File

@ -0,0 +1,84 @@
extends Node
const ButtonAction = {
EMIT_SIGNAL = "games.boyne.godot.emitsignal",
SWITCH_SCENE = "games.boyne.godot.switchscene",
RELOAD_SCENE = "games.boyne.godot.reloadscene",
}
const ButtonEvent = {
KEY_UP = "keyUp",
KEY_DOWN = "keyDown"
}
signal on_key_up
signal on_key_down
const PLUGIN_NAME = "games.boyne.godot.sdPlugin"
const WEBSOCKET_URL = "127.0.0.1:%s/ws"
var _socket := WebSocketPeer.new()
var _config := ConfigFile.new()
func _ready() -> void:
if Saving.settings.has("useStreamDeck"):
if !Saving.settings["useStreamDeck"]:
return
else:
return
_load_config(_get_config_path())
_socket.connect_to_url(_get_websocket_url())
func _process(delta) -> void:
_socket.poll()
var state = _socket.get_ready_state()
match state:
WebSocketPeer.STATE_OPEN:
while _socket.get_available_packet_count():
var data = JSON.parse_string(_socket.get_packet().get_string_from_utf8())
if !(data.event == ButtonEvent.KEY_DOWN || data.event == ButtonEvent.KEY_UP):
return
if data != null && data.has("action") && data.has("payload"):
match data.action:
ButtonAction.EMIT_SIGNAL:
var signalInput = ""
if data.payload.settings.has("signalInput"):
signalInput = data.payload.settings.signalInput
match data.event:
ButtonEvent.KEY_UP:
on_key_up.emit(signalInput)
ButtonEvent.KEY_DOWN:
on_key_down.emit(signalInput)
ButtonAction.SWITCH_SCENE:
if data.payload.settings.has("scenePath"):
var scenePath = data.payload.settings.scenePath
get_tree().change_scene_to_file(scenePath)
ButtonAction.RELOAD_SCENE:
get_tree().reload_current_scene()
WebSocketPeer.STATE_CLOSING:
pass
WebSocketPeer.STATE_CLOSED:
set_process(false)
func _get_websocket_url() -> String:
return WEBSOCKET_URL % _config.get_value("bridge", "port", "8080")
func _get_config_path() -> String:
match OS.get_name():
"Windows":
return "%s/Elgato/StreamDeck/Plugins/%s/plugin.ini" % [OS.get_config_dir(), PLUGIN_NAME]
"macOS":
return "%s/com.elgato.StreamDeck/Plugins/%s/plugin.ini" % [OS.get_config_dir(), PLUGIN_NAME]
return ""
func _load_config(path: String) -> void:
var file = FileAccess.open(path, FileAccess.READ)
_config.parse(file.get_as_text())

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

357
autoload/global.gd Normal file
View File

@ -0,0 +1,357 @@
extends Node
#Global Node Reference
var main = null
var spriteEdit = null
var fail = null
var mouse = null
var spriteList = null
var chain = null
var animationTick = 0
var filtering = false
#Object Selection
var heldSprite = null
var lastArray = []
var i = 0
var reparentMode = false
var scrollSelection = 0
var backgroundColor = Color(0.0,0.0,0.0,0.0)
#Blink
var blinkSpeed = 1.0
var blinkChance = 200
var blink = false
var blinkTick = 0
#Audio Listener
var currentMicrophone = null
var speaking = false
var spectrum
var volume = 0
var volumeSensitivity = 0.0
var volumeLimit = 0.0
var senseLimit = 0.0
#Speak Signals
signal startSpeaking
signal stopSpeaking
var micResetTime = 180
var updatePusherNode = null
var rand = RandomNumberGenerator.new()
func _ready():
spectrum = AudioServer.get_bus_effect_instance(1, 1)
if !Saving.settings.has("useStreamDeck"):
Saving.settings["useStreamDeck"] = false
if Saving.settings.has("secondsToMicReset"):
Global.micResetTime = Saving.settings["secondsToMicReset"]
else:
Saving.settings["secondsToMicReset"] = 180
createMicrophone()
func createMicrophone():
var playa = AudioStreamPlayer.new()
var mic = AudioStreamMicrophone.new()
playa.stream = mic
playa.autoplay = true
playa.bus = "MIC"
add_child(playa)
currentMicrophone = playa
await get_tree().create_timer(micResetTime).timeout
if currentMicrophone != playa:
return
deleteAllMics()
currentMicrophone = null
await get_tree().create_timer(0.25).timeout
createMicrophone()
func deleteAllMics():
for child in get_children():
child.queue_free()
func _process(delta):
animationTick += 1
volume = spectrum.get_magnitude_for_frequency_range(20, 20000).length()
if currentMicrophone != null:
volumeSensitivity = lerp(volumeSensitivity,0.0,delta*2)
if volume>volumeLimit:
volumeSensitivity = 1.0
var prev = speaking
speaking = volumeSensitivity > senseLimit
if prev != speaking:
if speaking:
emit_signal("startSpeaking")
else:
emit_signal("stopSpeaking")
if main != null and heldSprite != null:
if Input.is_action_just_pressed("zDown"):
heldSprite.z -= 1
heldSprite.setZIndex()
pushUpdate("Moved sprite layer.")
if Input.is_action_just_pressed("zUp"):
heldSprite.z += 1
heldSprite.setZIndex()
pushUpdate("Moved sprite layer.")
if main.editMode:
if Input.is_action_just_pressed("reparent"):
reparentMode = !reparentMode
Global.chain.enable(reparentMode)
else:
reparentMode = false
Global.chain.enable(reparentMode)
if main.editMode:
if reparentMode:
RenderingServer.set_default_clear_color(Color.POWDER_BLUE)
else:
RenderingServer.set_default_clear_color(Color.GRAY)
blinking()
scrollSprites()
if !main.fileSystemOpen:
if Input.is_action_just_pressed("refresh"):
refresh()
if Input.is_action_just_pressed("unlink"):
unlinkSprite()
if Input.is_action_pressed("control"):
if Input.is_action_just_pressed("saveImages"):
saveImagesFromData()
func select(areas):
if main.fileSystemOpen:
return
for area in areas:
if area.is_in_group("penis"):
return
var prevSpr = heldSprite
if areas.size() <= 0:
heldSprite = null
i = 0
lastArray = []
return
if areas != lastArray:
heldSprite = areas[0].get_parent().get_parent().get_parent()
i = 0
else:
i += 1
if i >= areas.size():
i = 0
heldSprite = areas[i].get_parent().get_parent().get_parent()
var count = heldSprite.path.get_slice_count("/") - 1
var i1 = heldSprite.path.get_slice("/",count)
pushUpdate("Selected sprite \"" + i1 + "\"" + ".")
heldSprite.set_physics_process(true)
if reparentMode:
if prevSpr == heldSprite:
reparentMode = false
return
if heldSprite.parentId == prevSpr.id:
return
linkSprite(prevSpr,heldSprite)
Global.chain.enable(reparentMode)
lastArray = areas.duplicate()
spriteEdit.setImage()
func linkSprite(sprite,newParent):
if sprite == newParent:
reparentMode = false
return
if newParent.parentId == sprite.id:
reparentMode = false
return
if sprite.is_ancestor_of(newParent):
pushUpdate("Can't link to own child sprite!")
reparentMode = false
return
sprite.reparent(newParent.sprite,true)
sprite.parentId = newParent.id
sprite.parentSprite = newParent
reparentMode = false
Global.spriteList.updateData()
var count = sprite.path.get_slice_count("/") - 1
var i1 = sprite.path.get_slice("/",count)
count = newParent.path.get_slice_count("/") - 1
var i2 = newParent.path.get_slice("/",count)
pushUpdate("Linked sprite \"" + i1 + "\" to sprite \"" + i2 + "\".")
newParent.set_physics_process(true)
func scrollSprites():
if Input.is_action_pressed("control"):
return
if !main.editMode:
return
if main.fileSystemOpen:
return
for area in mouse.area.get_overlapping_areas():
if area.is_in_group("penis"):
return
var scroll = 0
if heldSprite == null:
scrollSelection = 0
if Input.is_action_just_pressed("scrollUp"):
scroll-=1
if Input.is_action_just_pressed("scrollDown"):
scroll+=1
if scroll == 0:
return
var obj = get_tree().get_nodes_in_group("saved")
if obj.size() <= 0:
return
scrollSelection += scroll
if scrollSelection >= obj.size():
scrollSelection = 0
elif scrollSelection < 0:
scrollSelection = obj.size() - 1
heldSprite = obj[scrollSelection]
var count = heldSprite.path.get_slice_count("/") - 1
var i1 = heldSprite.path.get_slice("/",count)
pushUpdate("Selected sprite \"" + i1 + "\"" + ".")
heldSprite.set_physics_process(true)
spriteEdit.setImage()
func blinking():
blinkTick += 1
if blinkTick == 0:
blink = false
if rand.randf_range(-1.0,1.0) > 0.5:
blinkTick = (420 * blinkSpeed) + 1
if blinkTick > 420 * blinkSpeed:
if rand.randi() % int(blinkChance) == 0:
blink = true
blinkTick = -12
func epicFail(err):
print(fail)
if fail == null:
return
fail.get_node("type").text = ""
match err:
ERR_FILE_CORRUPT:
fail.get_node("type").text = "FILE CORRUPT"
ERR_FILE_NOT_FOUND:
fail.get_node("type").text = "FILE NOT FOUND"
ERR_FILE_CANT_OPEN:
fail.get_node("type").text = "FILE CANT OPEN"
ERR_FILE_ALREADY_IN_USE:
fail.get_node("type").text = "FILE IN USE"
ERR_FILE_NO_PERMISSION:
fail.get_node("type").text = "MISSING PERMISSION"
ERR_INVALID_DATA:
fail.get_node("type").text = "DATA INVALID"
ERR_FILE_CANT_READ:
fail.get_node("type").text = "CANT READ FILE"
fail.visible = true
await get_tree().create_timer(2.5).timeout
fail.visible = false
func refresh():
var objs = get_tree().get_nodes_in_group("saved")
for object in objs:
object.replaceSprite(object.path)
object.sprite.frame = 0
object.remadePolygon = false
pushUpdate("Refreshed all sprites.")
func unlinkSprite():
if heldSprite == null:
return
if heldSprite.parentId == null:
return
var glob = heldSprite.global_position
glob = Vector2(int(glob.x),int(glob.y))
heldSprite.get_parent().remove_child(heldSprite)
main.origin.add_child(heldSprite)
heldSprite.set_owner(main.origin)
heldSprite.parentId = null
heldSprite.parentSprite = null
heldSprite.position = glob - main.origin.position
Global.spriteList.updateData()
pushUpdate("Unlinked sprite.")
func saveImagesFromData():
var sprites = get_tree().get_nodes_in_group("saved")
if sprites.size() <= 0:
return
for sprite in sprites:
var img = sprite.imageData
var array = sprite.path.split("/",false)
var length = sprite.path.length() - array[array.size()-1].length()
DirAccess.make_dir_recursive_absolute(sprite.path.left(length-1))
img.save_png(sprite.path)
pushUpdate("Saved all avatar images to computer.")
func pushUpdate(text):
if is_instance_valid(updatePusherNode):
updatePusherNode.pushUpdate(text)

136
autoload/saving.gd Normal file
View File

@ -0,0 +1,136 @@
extends Node
var key = "creature"
var data = {}
var default = {
"0": {
"drag": 0,
"identification": 930245150,
"offset": "Vector2(0, 0)",
"parentId": null,
"path": "user://defaultAvatar/body.png",
"pos": "Vector2(0, 0)",
"rotDrag": 0,
"showBlink": 0,
"showTalk": 0,
"type": "sprite",
"xAmp": 9,
"xFrq": 0.002,
"yAmp": 11,
"yFrq": 0.004,
"zindex": -1 },
"1": {
"drag": 1,
"identification": 456157398,
"offset": "Vector2(0, 0)",
"parentId": 930245150,
"path": "user://defaultAvatar/head.png",
"pos": "Vector2(0, 0)",
"rotDrag": 0,
"showBlink": 0,
"showTalk": 0,
"type": "sprite",
"xAmp": 0,
"xFrq": 0,
"yAmp": 0,
"yFrq": 0,
"zindex": 0 },
"2": { "drag": 4, "identification": 928082759, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/hair.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 0, "showTalk": 0, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": -2 }, "3": { "drag": 0, "identification": 346749260, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/mouth1.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 0, "showTalk": 1, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 0 }, "4": { "drag": 0, "identification": 348929106, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/mouth2.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 0, "showTalk": 2, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 0 }, "5": { "drag": 0, "identification": 66364456, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/eye1.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 1, "showTalk": 2, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 0 }, "6": { "drag": 0, "identification": 261040117, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/eye2.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 1, "showTalk": 1, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 0 }, "7": { "drag": 0, "identification": 291459997, "offset": "Vector2(0, 0)", "parentId": 456157398, "path": "user://defaultAvatar/eye3.png", "pos": "Vector2(0, 0)", "rotDrag": 0, "showBlink": 2, "showTalk": 0, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 0 }, "8": { "drag": 0, "identification": 148065686, "offset": "Vector2(-74, 92)", "parentId": 456157398, "path": "user://defaultAvatar/hat.png", "pos": "Vector2(72, -89)", "rotDrag": -2, "showBlink": 0, "showTalk": 0, "type": "sprite", "xAmp": 0, "xFrq": 0, "yAmp": 0, "yFrq": 0, "zindex": 2 } }
var settings = {
"newUser":true,
"lastAvatar":"",
"volume":0.185,
"sense":0.25,
"windowSize":Vector2i(1280,720),
"useStreamDeck":false,
"bounce":250,
"gravity":1000,
"maxFPS":60,
"secondsToMicReset":180,
"backgroundColor":var_to_str(Color(0.0,0.0,0.0,0.0)),
"filtering":false,
"costumeKeys":["1","2","3","4","5","6","7","8","9","0"],
"blinkSpeed":1.0,
"blinkChance":200,
"bounceOnCostumeChange":false,
}
var settingsPath = "user://settings.pngtp"
func _ready():
var datas = read_save(settingsPath)
if datas == null:
return
else:
settings = datas.duplicate()
func _exit_tree():
write_settings(settingsPath)
func read_save(path):
if path == "default":
return DefaultAvatarData.data
if OS.has_feature('web'):
var JSONstr = JavaScriptBridge.eval("window.localStorage.getItem('" + key + "');")
if (JSONstr):
return JSON.parse_string(JSONstr)
else:
return null
else:
var file = FileAccess.open(path, FileAccess.READ)
if not file:
return null
var newData = JSON.parse_string(file.get_as_text())
file.close()
return newData
func write_save(path):
if OS.has_feature('web'):
JavaScriptBridge.eval("window.localStorage.setItem('" + key + "', '" + JSON.stringify(data) + "');")
else:
var file = FileAccess.open(path, FileAccess.WRITE)
file.store_line(JSON.stringify(data))
file.close()
func write_settings(path):
var file = FileAccess.open(path, FileAccess.WRITE)
file.store_line(JSON.stringify(settings))
file.close()
func clearSave():
if OS.has_feature('web'):
var JSONstr = JavaScriptBridge.eval("window.localStorage.getItem('" + key + "');")
if (JSONstr):
JavaScriptBridge.eval("window.localStorage.removeItem('" + key + "');")
else:
return null
else:
var file = FileAccess.open("user://" + key + ".save", FileAccess.READ)
if not file:
return null
file.close()
var dir = DirAccess.open("user://")
dir.remove(key + ".save")
data = {}
func open_site(url):
if OS.has_feature('web'):
JavaScriptBridge.eval("window.open(\"" + url + "\");")
else:
print("Could not open site " + url + " without an HTML5 build")
func switchToSite(url):
if OS.has_feature('web'):
JavaScriptBridge.eval("window.open(\"" + url + "\", \"_parent\");")
else:
print("Could not switch to site " + url + " without an HTML5 build")

23
bin/gdexample.gdextension Normal file
View File

@ -0,0 +1,23 @@
[configuration]
entry_symbol = "example_library_init"
compatibility_minimum = "4.1"
[libraries]
macos.debug = "res://bin/libgdexamplemacostemplate_debug.framework/libgdexamplemacostemplate_debug.dylib"
macos.release = "res://bin/libgdexamplemacostemplate_release.framework/libgdexamplemacostemplate_release.dylib"
windows.debug.x86_32 = "res://bin/libgdexample.windows.template_debug.x86_32.dll"
windows.release.x86_32 = "res://bin/libgdexample.windows.template_release.x86_32.dll"
windows.debug.x86_64 = "res://bin/libgdexample.windows.template_debug.x86_64.dll"
windows.release.x86_64 = "res://bin/libgdexample.windows.template_release.x86_64.dll"
linux.debug.x86_64 = "res://bin/libgdexample.linux.template_debug.x86_64.so"
linux.release.x86_64 = "res://bin/libgdexample.linux.template_release.x86_64.so"
linux.debug.arm64 = "res://bin/libgdexample.linux.template_debug.arm64.so"
linux.release.arm64 = "res://bin/libgdexample.linux.template_release.arm64.so"
linux.debug.rv64 = "res://bin/libgdexample.linux.template_debug.rv64.so"
linux.release.rv64 = "res://bin/libgdexample.linux.template_release.rv64.so"
android.debug.x86_64 = "res://bin/libgdexample.android.template_debug.x86_64.so"
android.release.x86_64 = "res://bin/libgdexample.android.template_release.x86_64.so"
android.debug.arm64 = "res://bin/libgdexample.android.template_debug.arm64.so"
android.release.arm64 = "res://bin/libgdexample.android.template_release.arm64.so"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

22
default_bus_layout.tres Normal file
View File

@ -0,0 +1,22 @@
[gd_resource type="AudioBusLayout" load_steps=3 format=3 uid="uid://cg7wt8xagjs7o"]
[sub_resource type="AudioEffectRecord" id="AudioEffectRecord_ucpvm"]
resource_name = "Record"
format = 0
[sub_resource type="AudioEffectSpectrumAnalyzer" id="AudioEffectSpectrumAnalyzer_skwrq"]
resource_name = "SpectrumAnalyzer"
buffer_length = 0.1
fft_size = 0
[resource]
bus/1/name = &"MIC"
bus/1/solo = false
bus/1/mute = false
bus/1/bypass_fx = false
bus/1/volume_db = -80.0
bus/1/send = &"Master"
bus/1/effect/0/effect = SubResource("AudioEffectRecord_ucpvm")
bus/1/effect/0/enabled = true
bus/1/effect/1/effect = SubResource("AudioEffectSpectrumAnalyzer_skwrq")
bus/1/effect/1/enabled = true

204
export_presets.cfg Normal file
View File

@ -0,0 +1,204 @@
[preset.0]
name="Windows Desktop"
platform="Windows Desktop"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path=".export/release 1.4.2/windows/PNGTUBER PLUS 1.4.2 WINDOWS.exe"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.0.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=false
texture_format/etc2=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
codesign/timestamp_server_url=""
codesign/digest_algorithm=1
codesign/description=""
codesign/custom_options=PackedStringArray()
application/modify_resources=true
application/icon="res://finalIcon.ico"
application/console_wrapper_icon=""
application/icon_interpolation=4
application/file_version=""
application/product_version=""
application/company_name="kaiakairos"
application/product_name="PNGTuber Plus"
application/file_description=""
application/copyright=""
application/trademarks=""
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="Expand-Archive -LiteralPath '{temp_dir}\\{archive_name}' -DestinationPath '{temp_dir}'
$action = New-ScheduledTaskAction -Execute '{temp_dir}\\{exe_name}' -Argument '{cmd_args}'
$trigger = New-ScheduledTaskTrigger -Once -At 00:00
$settings = New-ScheduledTaskSettingsSet
$task = New-ScheduledTask -Action $action -Trigger $trigger -Settings $settings
Register-ScheduledTask godot_remote_debug -InputObject $task -Force:$true
Start-ScheduledTask -TaskName godot_remote_debug
while (Get-ScheduledTask -TaskName godot_remote_debug | ? State -eq running) { Start-Sleep -Milliseconds 100 }
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue"
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
[preset.1]
name="Linux/X11"
platform="Linux/X11"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path=".export/release 1.4.2/LINUX/PNGTUBER PLUS 1.4.2 LINUX.x86_64"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.1.options]
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
texture_format/bptc=true
texture_format/s3tc=true
texture_format/etc=false
texture_format/etc2=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
export DISPLAY=:0
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
\"{temp_dir}/{exe_name}\" {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
[preset.2]
name="macOS"
platform="macOS"
runnable=true
dedicated_server=false
custom_features=""
export_filter="all_resources"
include_filter=""
exclude_filter=""
export_path=".export/release 1.4.2/mac/PNGTUBER PLUS 1.4.2 MAC.zip"
encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
[preset.2.options]
export/distribution_type=1
binary_format/architecture="universal"
custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
application/icon=""
application/icon_interpolation=4
application/bundle_identifier="com.kaiakairos.game"
application/signature=""
application/app_category="Productivity"
application/short_version="1.4.2"
application/version="1.4.2"
application/copyright=""
application/copyright_localized={}
application/min_macos_version="10.12"
display/high_res=true
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
xcode/sdk_name="macosx13.1"
xcode/xcode_version="1420"
xcode/xcode_build="14C18"
codesign/codesign=1
codesign/installer_identity=""
codesign/apple_team_id=""
codesign/identity=""
codesign/entitlements/custom_file=""
codesign/entitlements/allow_jit_code_execution=false
codesign/entitlements/allow_unsigned_executable_memory=false
codesign/entitlements/allow_dyld_environment_variables=false
codesign/entitlements/disable_library_validation=true
codesign/entitlements/audio_input=true
codesign/entitlements/camera=false
codesign/entitlements/location=false
codesign/entitlements/address_book=false
codesign/entitlements/calendars=false
codesign/entitlements/photos_library=false
codesign/entitlements/apple_events=false
codesign/entitlements/debugging=false
codesign/entitlements/app_sandbox/enabled=false
codesign/entitlements/app_sandbox/network_server=false
codesign/entitlements/app_sandbox/network_client=false
codesign/entitlements/app_sandbox/device_usb=false
codesign/entitlements/app_sandbox/device_bluetooth=false
codesign/entitlements/app_sandbox/files_downloads=0
codesign/entitlements/app_sandbox/files_pictures=0
codesign/entitlements/app_sandbox/files_music=0
codesign/entitlements/app_sandbox/files_movies=0
codesign/entitlements/app_sandbox/helper_executables=[]
codesign/custom_options=PackedStringArray()
notarization/notarization=0
privacy/microphone_usage_description="So the guy can go up and down!"
privacy/microphone_usage_description_localized={}
privacy/camera_usage_description=""
privacy/camera_usage_description_localized={}
privacy/location_usage_description=""
privacy/location_usage_description_localized={}
privacy/address_book_usage_description=""
privacy/address_book_usage_description_localized={}
privacy/calendar_usage_description=""
privacy/calendar_usage_description_localized={}
privacy/photos_library_usage_description=""
privacy/photos_library_usage_description_localized={}
privacy/desktop_folder_usage_description=""
privacy/desktop_folder_usage_description_localized={}
privacy/documents_folder_usage_description=""
privacy/documents_folder_usage_description_localized={}
privacy/downloads_folder_usage_description=""
privacy/downloads_folder_usage_description_localized={}
privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
ssh_remote_deploy/extra_args_ssh=""
ssh_remote_deploy/extra_args_scp=""
ssh_remote_deploy/run_script="#!/usr/bin/env bash
unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
open \"{temp_dir}/{exe_name}.app\" --args {cmd_args}"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name}.app/Contents/MacOS/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""

BIN
finalIcon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

BIN
font/I-pixel-u.ttf Normal file

Binary file not shown.

33
font/I-pixel-u.ttf.import Normal file
View File

@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://1aomxu84k6ov"
path="res://.godot/imported/I-pixel-u.ttf-93d60f2456fb1937becfef150a570544.fontdata"
[deps]
source_file="res://font/I-pixel-u.ttf"
dest_files=["res://.godot/imported/I-pixel-u.ttf-93d60f2456fb1937becfef150a570544.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

BIN
font/g.ttf Normal file

Binary file not shown.

33
font/g.ttf.import Normal file
View File

@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bj7gm7e6634it"
path="res://.godot/imported/g.ttf-9f6d8c807fc8c8b1e0b9d659d48298ec.fontdata"
[deps]
source_file="res://font/g.ttf"
dest_files=["res://.godot/imported/g.ttf-9f6d8c807fc8c8b1e0b9d659d48298ec.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

BIN
font/goober_pixel.ttf Normal file

Binary file not shown.

View File

@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://ukj8gv8ucqsg"
path="res://.godot/imported/goober_pixel.ttf-62c290ad12346c410d17e4f718a25b74.fontdata"
[deps]
source_file="res://font/goober_pixel.ttf"
dest_files=["res://.godot/imported/goober_pixel.ttf-62c290ad12346c410d17e4f718a25b74.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

BIN
icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

34
icon.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://064sfo8cbef5"
path="res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://icon.png"
dest_files=["res://.godot/imported/icon.png-487276ed1e3a0c39cad0279d744ee560.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

1
icon.svg Normal file
View File

@ -0,0 +1 @@
<svg height="128" width="128" xmlns="http://www.w3.org/2000/svg"><rect x="2" y="2" width="124" height="124" rx="14" fill="#363d52" stroke="#212532" stroke-width="4"/><g transform="scale(.101) translate(122 122)"><g fill="#fff"><path d="M105 673v33q407 354 814 0v-33z"/><path fill="#478cbf" d="m105 673 152 14q12 1 15 14l4 67 132 10 8-61q2-11 15-15h162q13 4 15 15l8 61 132-10 4-67q3-13 15-14l152-14V427q30-39 56-81-35-59-83-108-43 20-82 47-40-37-88-64 7-51 8-102-59-28-123-42-26 43-46 89-49-7-98 0-20-46-46-89-64 14-123 42 1 51 8 102-48 27-88 64-39-27-82-47-48 49-83 108 26 42 56 81zm0 33v39c0 276 813 276 813 0v-39l-134 12-5 69q-2 10-14 13l-162 11q-12 0-16-11l-10-65H447l-10 65q-4 11-16 11l-162-11q-12-3-14-13l-5-69z"/><path d="M483 600c3 34 55 34 58 0v-86c-3-34-55-34-58 0z"/><circle cx="725" cy="526" r="90"/><circle cx="299" cy="526" r="90"/></g><g fill="#414042"><circle cx="307" cy="532" r="60"/><circle cx="717" cy="532" r="60"/></g></g></svg>

After

Width:  |  Height:  |  Size: 950 B

38
icon.svg.import Normal file
View File

@ -0,0 +1,38 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://brxkjnudq5pbi"
path.s3tc="res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://icon.svg"
dest_files=["res://.godot/imported/icon.svg-218a8f2b3041327d8a5756f3a245f83b.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
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=0
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@ -0,0 +1,10 @@
extends Node2D
@onready var editSprite = $Edit/Fancy
@onready var editButton = $Edit/Button
func _process(delta):
if Rect2(editButton.get_parent().position-Vector2(24,24),editButton.size).has_point(get_local_mouse_position()):
editSprite.scale = lerp(editSprite.scale,Vector2(1.2,1.2),0.2)
else:
editSprite.scale = lerp(editSprite.scale,Vector2(1.0,1.0),0.2)

View File

@ -0,0 +1,64 @@
extends Node2D
@onready var addButton = $Add/addButton
@onready var addSprite = $Add/Fancy3
@onready var linkButton = $Link/linkButton
@onready var linkSprite = $Link/Fancy2
@onready var exitButton = $Exit/Button2
@onready var exitSprite = $Exit/Fancy3
@onready var saveButton = $Save/saveButton
@onready var saveSprite = $Save/Fancy4
@onready var loadButton = $Load/loadButton
@onready var loadSprite = $Load/Fancy5
@onready var repButton = $ReplaceSprite/replaceButton
@onready var repSprite = $ReplaceSprite/Fancy6
@onready var dupButton = $DuplicateSprite/duplicateButton
@onready var dupSprite = $DuplicateSprite/Fancy
@onready var buttons = [addButton,linkButton,exitButton,saveButton,loadButton,repButton,dupButton]
@onready var sprites = [addSprite,linkSprite,exitSprite,saveSprite,loadSprite,repSprite,dupSprite]
func _process(delta):
var s = 0
for b in range(buttons.size()):
if buttons[b] == null:
continue
if Rect2(buttons[b].get_parent().position-Vector2(24,24),buttons[b].size).has_point(get_local_mouse_position()):
sprites[s].scale = lerp(sprites[s].scale,Vector2(1.2,1.2),0.2)
if Input.is_action_pressed("mouse_left"):
sprites[s].scale = Vector2(0.6,0.6)
match b:
0:
Global.mouse.text = "Add new sprite"
1:
Global.mouse.text = "Link sprite"
2:
Global.mouse.text = "Exit edit mode"
3:
Global.mouse.text = "Save avatar"
4:
Global.mouse.text = "Load avatar"
5:
Global.mouse.text = "Replace sprite"
6:
Global.mouse.text = "Duplicate sprite"
else:
sprites[s].scale = lerp(sprites[s].scale,Vector2(1.0,1.0),0.2)
s += 1
var newColor = Color.DARK_SLATE_GRAY if Global.heldSprite == null else Color.WHITE
linkSprite.get_parent().modulate = newColor
repSprite.get_parent().modulate = newColor
dupSprite.get_parent().modulate = newColor
func _notification(what):
if what == 30:
$MoveMenuDown.position.y = get_window().size.y

View File

@ -0,0 +1,17 @@
extends Node2D
@onready var buttonScene = preload("res://ui_scenes/microphoneSelect/mic_select_button.tscn")
@onready var container = $ScrollContainer/VBoxContainer
func _ready():
showMicMenu()
func showMicMenu():
for child in container.get_children():
child.queue_free()
var inputList = AudioServer.get_input_device_list()
for input in inputList:
var newButton = buttonScene.instantiate()
newButton.micName = input
container.add_child(newButton)

14
main_scenes/Tutorial.gd Normal file
View File

@ -0,0 +1,14 @@
extends Node2D
@onready var rect = $NinePatchRect
@onready var tween = null
func _on_button_pressed():
if tween != null:
tween.stop()
rect.visible = !rect.visible
rect.scale = Vector2(0.0,0.0)
tween = get_tree().create_tween()
tween.tween_property(rect,"scale",Vector2(1,1),0.5).set_trans(Tween.TRANS_ELASTIC).set_ease(Tween.EASE_OUT)

612
main_scenes/main.gd Normal file
View File

@ -0,0 +1,612 @@
extends Node2D
var editMode = true
#Node Reference
@onready var origin = $OriginMotion/Origin
@onready var camera = $Camera2D
@onready var controlPanel = $ControlPanel
@onready var editControls = $EditControls
@onready var tutorial = $Tutorial
@onready var spriteViewer = $EditControls/SpriteViewer
@onready var viewerArrows = $ViewerArrows
@onready var spriteList = $EditControls/SpriteList
@onready var fileDialog = $FileDialog
@onready var replaceDialog = $ReplaceDialog
@onready var saveDialog = $SaveDialog
@onready var loadDialog = $LoadDialog
@onready var lines = $Lines
@onready var settingsMenu = $ControlPanel/SettingsMenu
@onready var pushUpdates = $PushUpdates
@onready var shadow = $shadowSprite
#Scene Reference
@onready var spriteObject = preload("res://ui_scenes/selectedSprite/spriteObject.tscn")
var saveLoaded = false
#Motion
var yVel = 0
var bounceSlider = 250
var bounceGravity = 1000
#Costumes
var costume = 1
var bounceOnCostumeChange = false
#Zooming
var scaleOverall = 100
var bounceChange = 0.0
#IMPORTANT
var fileSystemOpen = false
#background input capture
signal emptiedCapture
signal pressedKey
var costumeKeys = ["1","2","3","4","5","6","7","8","9","0"]
func _ready():
Global.main = self
Global.fail = $Failed
Global.connect("startSpeaking",onSpeak)
ElgatoStreamDeck.on_key_down.connect(changeCostumeStreamDeck)
if Saving.settings["newUser"]:
_on_load_dialog_file_selected("default")
Saving.settings["newUser"] = false
saveLoaded = true
else:
_on_load_dialog_file_selected(Saving.settings["lastAvatar"])
$ControlPanel/volumeSlider.value = Saving.settings["volume"]
$ControlPanel/sensitiveSlider.value = Saving.settings["sense"]
get_window().size = str_to_var(Saving.settings["windowSize"])
if Saving.settings.has("bounce"):
bounceSlider = Saving.settings["bounce"]
else:
Saving.settings["bounce"] = 250
if Saving.settings.has("maxFPS"):
Engine.max_fps = Saving.settings["maxFPS"]
else:
Saving.settings["maxFPS"] = 60
if Saving.settings.has("backgroundColor"):
Global.backgroundColor = str_to_var(Saving.settings["backgroundColor"])
else:
Saving.settings["backgroundColor"] = var_to_str(Color(0.0,0.0,0.0,0.0))
if Saving.settings.has("filtering"):
Global.filtering = Saving.settings["filtering"]
else:
Saving.settings["filtering"] = false
if Saving.settings.has("gravity"):
bounceGravity = Saving.settings["gravity"]
else:
Saving.settings["gravity"] = 1000
if Saving.settings.has("costumeKeys"):
costumeKeys = Saving.settings["costumeKeys"]
else:
Saving.settings["costumeKeys"] = costumeKeys
if Saving.settings.has("blinkSpeed"):
Global.blinkSpeed = Saving.settings["blinkSpeed"]
else:
Saving.settings["blinkSpeed"] = 1.0
if Saving.settings.has("blinkChance"):
Global.blinkChance = Saving.settings["blinkChance"]
else:
Saving.settings["blinkChance"] = 200
if Saving.settings.has("bounceOnCostumeChange"):
bounceOnCostumeChange = Saving.settings["bounceOnCostumeChange"]
else:
Saving.settings["bounceOnCostumeChange"] = false
saveLoaded = true
RenderingServer.set_default_clear_color(Global.backgroundColor)
swapMode()
settingsMenu.setvalues()
changeCostume(1)
var s = get_viewport().get_visible_rect().size
origin.position = s*0.5
camera.position = origin.position
func _process(delta):
var hold = origin.get_parent().position.y
origin.get_parent().position.y += yVel * delta
if origin.get_parent().position.y > 0:
origin.get_parent().position.y = 0
bounceChange = hold - origin.get_parent().position.y
yVel += bounceGravity*delta
if Input.is_action_just_pressed("openFolder"):
OS.shell_open(ProjectSettings.globalize_path("user://"))
moveSpriteMenu(delta)
zoomScene()
fileSystemOpen = isFileSystemOpen()
followShadow()
func followShadow():
shadow.visible = is_instance_valid(Global.heldSprite)
if !shadow.visible:
return
shadow.global_position = Global.heldSprite.sprite.global_position + Vector2(6,6)
shadow.global_rotation = Global.heldSprite.sprite.global_rotation
shadow.offset = Global.heldSprite.sprite.offset
shadow.texture = Global.heldSprite.sprite.texture
shadow.hframes = Global.heldSprite.sprite.hframes
shadow.frame = Global.heldSprite.sprite.frame
func isFileSystemOpen():
for obj in [replaceDialog,fileDialog,saveDialog,loadDialog]:
if obj.visible:
if obj == replaceDialog:
return true
Global.heldSprite = null
return true
return false
#Displays control panel whether or not application is focused
func _notification(what):
match what:
SceneTree.NOTIFICATION_APPLICATION_FOCUS_OUT:
controlPanel.visible = false
pushUpdates.visible = false
SceneTree.NOTIFICATION_APPLICATION_FOCUS_IN:
if !editMode:
controlPanel.visible = true
pushUpdates.visible = true
30:
onWindowSizeChange()
func onWindowSizeChange():
if !saveLoaded:
return
Saving.settings["windowSize"] = var_to_str(get_window().size)
var s = get_viewport().get_visible_rect().size
origin.position = s*0.5
lines.position = s*0.5
lines.drawLine()
camera.position = origin.position
controlPanel.position = camera.position + (s/(camera.zoom*2.0))
tutorial.position = controlPanel.position
editControls.position = camera.position - (s/(camera.zoom*2.0))
viewerArrows.position = editControls.position
spriteList.position.x = s.x - 233
pushUpdates.position.y = controlPanel.position.y
pushUpdates.position.x = editControls.position.x
func zoomScene():
#Handles Zooming
if Input.is_action_pressed("control"):
if Input.is_action_just_pressed("scrollUp"):
if scaleOverall < 400:
camera.zoom += Vector2(0.1,0.1)
scaleOverall += 10
changeZoom()
if Input.is_action_just_pressed("scrollDown"):
if scaleOverall > 10:
camera.zoom -= Vector2(0.1,0.1)
scaleOverall -= 10
changeZoom()
$ControlPanel/ZoomLabel.modulate.a = lerp($ControlPanel/ZoomLabel.modulate.a,0.0,0.02)
func changeZoom():
var newZoom = Vector2(1.0,1.0) / camera.zoom
controlPanel.scale = newZoom
tutorial.scale = newZoom
editControls.scale = newZoom
viewerArrows.scale = newZoom
lines.scale = newZoom
pushUpdates.scale = newZoom
Global.mouse.scale = newZoom
$ControlPanel/ZoomLabel.modulate.a = 6.0
$ControlPanel/ZoomLabel.text = "Zoom : " + str(scaleOverall) + "%"
Global.pushUpdate("Set zoom to " + str(scaleOverall) + "%")
onWindowSizeChange()
#When the user speaks!
func onSpeak():
if origin.get_parent().position.y > -16:
yVel = bounceSlider * -1
#Swaps between edit mode and view mode
func swapMode():
Global.heldSprite = null
editMode = !editMode
Global.pushUpdate("Toggled editing mode.")
get_viewport().transparent_bg = !editMode
if Global.backgroundColor.a != 0.0:
get_viewport().transparent_bg = false
RenderingServer.set_default_clear_color(Global.backgroundColor)
#processing
editControls.set_process(editMode)
controlPanel.set_process(!editMode)
#visibility
editControls.visible = editMode
tutorial.visible = editMode
controlPanel.visible = !editMode
lines.visible = editMode
spriteList.visible = editMode
#Adds sprite object to scene
func add_image(path):
var rand = RandomNumberGenerator.new()
var id = rand.randi()
var sprite = spriteObject.instantiate()
sprite.path = path
sprite.id = id
origin.add_child(sprite)
sprite.position = Vector2.ZERO
Global.spriteList.updateData()
Global.pushUpdate("Added new sprite.")
#Opens File Dialog
func _on_add_button_pressed():
fileDialog.visible = true
#Runs when selecting image in File Dialog
func _on_file_dialog_file_selected(path):
add_image(path)
func _on_save_button_pressed():
$SaveDialog.visible = true
func _on_load_button_pressed():
$LoadDialog.visible = true
#LOAD AVATAR
func _on_load_dialog_file_selected(path):
var data = Saving.read_save(path)
if data == null:
return
origin.queue_free()
var new = Node2D.new()
$OriginMotion.add_child(new)
origin = new
for item in data:
var sprite = spriteObject.instantiate()
sprite.path = data[item]["path"]
sprite.id = data[item]["identification"]
sprite.parentId = data[item]["parentId"]
sprite.offset = str_to_var(data[item]["offset"])
sprite.z = data[item]["zindex"]
sprite.dragSpeed = data[item]["drag"]
sprite.xFrq = data[item]["xFrq"]
sprite.xAmp = data[item]["xAmp"]
sprite.yFrq = data[item]["yFrq"]
sprite.yAmp = data[item]["yAmp"]
sprite.rdragStr = data[item]["rotDrag"]
sprite.showOnTalk = data[item]["showTalk"]
sprite.showOnBlink = data[item]["showBlink"]
if data[item].has("rLimitMin"):
sprite.rLimitMin = data[item]["rLimitMin"]
if data[item].has("rLimitMax"):
sprite.rLimitMax = data[item]["rLimitMax"]
if data[item].has("costumeLayers"):
sprite.costumeLayers = str_to_var(data[item]["costumeLayers"]).duplicate()
if sprite.costumeLayers.size() < 8:
for i in range(5):
sprite.costumeLayers.append(1)
if data[item].has("stretchAmount"):
sprite.stretchAmount = data[item]["stretchAmount"]
if data[item].has("ignoreBounce"):
sprite.ignoreBounce = data[item]["ignoreBounce"]
if data[item].has("frames"):
sprite.frames = data[item]["frames"]
if data[item].has("animSpeed"):
sprite.animSpeed = data[item]["animSpeed"]
if data[item].has("imageData"):
sprite.loadedImageData = data[item]["imageData"]
if data[item].has("clipped"):
sprite.clipped = data[item]["clipped"]
origin.add_child(sprite)
sprite.position = str_to_var(data[item]["pos"])
changeCostume(1)
Saving.settings["lastAvatar"] = path
Global.spriteList.updateData()
Global.pushUpdate("Loaded avatar at: " + path)
onWindowSizeChange()
#SAVE AVATAR
func _on_save_dialog_file_selected(path):
var data = {}
var nodes = get_tree().get_nodes_in_group("saved")
var id = 0
for child in nodes:
if child.type == "sprite":
data[id] = {}
data[id]["type"] = "sprite"
data[id]["path"] = child.path
data[id]["imageData"] = Marshalls.raw_to_base64(child.imageData.save_png_to_buffer())
data[id]["identification"] = child.id
data[id]["parentId"] = child.parentId
data[id]["pos"] = var_to_str(child.position)
data[id]["offset"] = var_to_str(child.offset)
data[id]["zindex"] = child.z
data[id]["drag"] = child.dragSpeed
data[id]["xFrq"] = child.xFrq
data[id]["xAmp"] = child.xAmp
data[id]["yFrq"] = child.yFrq
data[id]["yAmp"] = child.yAmp
data[id]["rotDrag"] = child.rdragStr
data[id]["showTalk"] = child.showOnTalk
data[id]["showBlink"] = child.showOnBlink
data[id]["rLimitMin"] = child.rLimitMin
data[id]["rLimitMax"] = child.rLimitMax
data[id]["costumeLayers"] = var_to_str(child.costumeLayers)
data[id]["stretchAmount"] = child.stretchAmount
data[id]["ignoreBounce"] = child.ignoreBounce
data[id]["frames"] = child.frames
data[id]["animSpeed"] = child.animSpeed
data[id]["clipped"] = child.clipped
id += 1
Saving.settings["lastAvatar"] = path
Saving.data = data.duplicate()
Saving.write_save(path)
Global.pushUpdate("Saved avatar at: " + path)
func _on_link_button_pressed():
Global.reparentMode = true
Global.chain.enable(Global.reparentMode)
Global.pushUpdate("Linking sprite...")
func _on_kofi_pressed():
OS.shell_open("https://ko-fi.com/kaiakairos")
Global.pushUpdate("Support me on ko-fi!")
func _on_twitter_pressed():
OS.shell_open("https://twitter.com/kaiakairos")
Global.pushUpdate("Follow me on twitter!")
func _on_replace_button_pressed():
if Global.heldSprite == null:
return
$ReplaceDialog.visible = true
func _on_replace_dialog_file_selected(path):
Global.heldSprite.replaceSprite(path)
Global.spriteList.updateData()
Global.pushUpdate("Replacing sprite with: " + path)
func _on_replace_dialog_visibility_changed():
$EditControls/ScreenCover/CollisionShape2D.disabled = !$ReplaceDialog.visible
func _on_duplicate_button_pressed():
if Global.heldSprite == null:
return
var rand = RandomNumberGenerator.new()
var id = rand.randi()
var sprite = spriteObject.instantiate()
sprite.path = Global.heldSprite.path
sprite.id = id
sprite.parentId = Global.heldSprite.parentId
sprite.dragSpeed = Global.heldSprite.dragSpeed
sprite.showOnTalk = Global.heldSprite.showOnTalk
sprite.showOnBlink = Global.heldSprite.showOnBlink
sprite.z = Global.heldSprite.z
sprite.xFrq = Global.heldSprite.xFrq
sprite.xAmp = Global.heldSprite.xAmp
sprite.yFrq = Global.heldSprite.yFrq
sprite.yAmp = Global.heldSprite.yAmp
sprite.rdragStr = Global.heldSprite.rdragStr
sprite.offset = Global.heldSprite.offset
sprite.rLimitMin = Global.heldSprite.rLimitMin
sprite.rLimitMax = Global.heldSprite.rLimitMax
sprite.frames = Global.heldSprite.frames
sprite.animSpeed = Global.heldSprite.animSpeed
sprite.costumeLayers = Global.heldSprite.costumeLayers
origin.add_child(sprite)
sprite.position = Global.heldSprite.position + Vector2(16,16)
Global.heldSprite = sprite
Global.spriteList.updateData()
Global.pushUpdate("Duplicated sprite.")
func changeCostumeStreamDeck(id: String):
match id:
"1":changeCostume(1)
"2":changeCostume(2)
"3":changeCostume(3)
"4":changeCostume(4)
"5":changeCostume(5)
"6":changeCostume(6)
"7":changeCostume(7)
"8":changeCostume(8)
"9":changeCostume(9)
"10":changeCostume(10)
func changeCostume(newCostume):
costume = newCostume
Global.heldSprite = null
var nodes = get_tree().get_nodes_in_group("saved")
for sprite in nodes:
if sprite.costumeLayers[newCostume-1] == 1:
sprite.visible = true
sprite.changeCollision(true)
else:
sprite.visible = false
sprite.changeCollision(false)
Global.spriteEdit.layerSelected()
spriteList.updateAllVisible()
if bounceOnCostumeChange:
onSpeak()
Global.pushUpdate("Change costume: " + str(newCostume))
func moveSpriteMenu(delta):
#moves sprite viewer editor thing around
var size = get_viewport().get_visible_rect().size
var windowLength = 1187
$ViewerArrows/Arrows.position.y = size.y - 25
if !Global.spriteEdit.visible:
$ViewerArrows/Arrows.visible = false
$ViewerArrows/Arrows2.visible = false
return
if size.y > windowLength+50:
Global.spriteEdit.position.y = 66
$ViewerArrows/Arrows.visible = false
$ViewerArrows/Arrows2.visible = false
return
if Global.spriteEdit.position.y < 16:
$ViewerArrows/Arrows2.visible = true
else:
$ViewerArrows/Arrows2.visible = false
if Global.spriteEdit.position.y > size.y-windowLength+2:
$ViewerArrows/Arrows.visible = true
else:
$ViewerArrows/Arrows.visible = false
if $EditControls/MoveMenuUp.overlaps_area(Global.mouse.area):
Global.spriteEdit.position.y += (delta*432.0)
elif $EditControls/MoveMenuDown.overlaps_area(Global.mouse.area):
Global.spriteEdit.position.y -= (delta*432.0)
if Global.spriteEdit.position.y > 66:
Global.spriteEdit.position.y = 66
elif Global.spriteEdit.position.y < size.y-windowLength:
Global.spriteEdit.position.y = size.y-windowLength
#UNAMED BUT THIS IS THE MICROPHONE MENU BUTTON
func _on_button_pressed():
$ControlPanel/MicInputSelect.visible = !$ControlPanel/MicInputSelect.visible
settingsMenu.visible = false
func _on_settings_buttons_pressed():
settingsMenu.visible = !settingsMenu.visible
func _on_background_input_capture_bg_key_pressed(node, keys_pressed):
var keyStrings = []
for i in keys_pressed:
if keys_pressed[i]:
keyStrings.append(OS.get_keycode_string(i) if !OS.get_keycode_string(i).strip_edges().is_empty() else "Keycode" + str(i))
if fileSystemOpen:
return
if keyStrings.size() <= 0:
emit_signal("emptiedCapture")
return
if settingsMenu.awaitingCostumeInput >= 0:
if keyStrings[0] == "Keycode1":
if !settingsMenu.hasMouse:
emit_signal("pressedKey")
return
var currentButton = costumeKeys[settingsMenu.awaitingCostumeInput]
costumeKeys[settingsMenu.awaitingCostumeInput] = keyStrings[0]
Saving.settings["costumeKeys"] = costumeKeys
Global.pushUpdate("Changed costume " + str(settingsMenu.awaitingCostumeInput+1) + " hotkey from \"" + currentButton + "\" to \"" + keyStrings[0] + "\"")
emit_signal("pressedKey")
for key in keyStrings:
var i = costumeKeys.find(key)
if i >= 0:
changeCostume(i+1)

14747
main_scenes/main.tscn Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,14 @@
extends Node2D
@onready var h = $h
@onready var v = $v
func drawLine():
var s = get_viewport().get_visible_rect().size
v.clear_points()
v.add_point(Vector2(0,-s.y))
v.add_point(Vector2(0,s.y))
h.clear_points()
h.add_point(Vector2(-s.x,0))
h.add_point(Vector2(s.x,0))

150
project.godot Normal file
View File

@ -0,0 +1,150 @@
; Engine configuration file.
; It's best edited using the editor UI and not directly,
; since the parameters that go here are not all obvious.
;
; Format:
; [section] ; section goes between []
; param=value ; assign values to parameters
config_version=5
[application]
config/name="PNGTuberPlus"
run/main_scene="res://main_scenes/main.tscn"
config/features=PackedStringArray("4.1", "GL Compatibility")
run/max_fps=60
boot_splash/bg_color=Color(0.0313726, 0.0313726, 0.0313726, 1)
boot_splash/image="res://splash.png"
boot_splash/fullsize=false
boot_splash/use_filter=false
config/icon="res://icon.png"
[audio]
driver/enable_input=true
[autoload]
Saving="*res://autoload/saving.gd"
Global="*res://autoload/global.gd"
ElgatoStreamDeck="*res://addons/godot-streamdeck-addon/singleton.gd"
DefaultAvatarData="*res://autoload/defaultAvatarData.gd"
[debug]
gdscript/warnings/unused_parameter=0
[display]
window/size/viewport_width=1280
window/size/viewport_height=720
window/size/transparent=true
window/per_pixel_transparency/allowed=true
window/vsync/vsync_mode=0
[dotnet]
project/assembly_name="PNGTuberPlus"
[editor]
version_control/plugin_name="GitPlugin"
version_control/autoload_on_startup=true
[editor_plugins]
enabled=PackedStringArray("res://addons/godot-streamdeck-addon/plugin.cfg")
[input]
mouse_left={
"deadzone": 0.5,
"events": [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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
origin={
"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":79,"key_label":0,"unicode":111,"echo":false,"script":null)
]
}
move_up={
"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":87,"key_label":0,"unicode":119,"echo":false,"script":null)
]
}
move_left={
"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":65,"key_label":0,"unicode":97,"echo":false,"script":null)
]
}
move_right={
"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":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
move_down={
"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":83,"key_label":0,"unicode":115,"echo":false,"script":null)
]
}
reparent={
"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":80,"key_label":0,"unicode":112,"echo":false,"script":null)
]
}
zDown={
"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":81,"key_label":0,"unicode":113,"echo":false,"script":null)
]
}
zUp={
"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":69,"key_label":0,"unicode":101,"echo":false,"script":null)
]
}
openFolder={
"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":4194305,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
scrollUp={
"deadzone": 0.5,
"events": [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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
, 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":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
scrollDown={
"deadzone": 0.5,
"events": [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":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
, 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":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
refresh={
"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":82,"key_label":0,"unicode":114,"echo":false,"script":null)
]
}
unlink={
"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":85,"key_label":0,"unicode":117,"echo":false,"script":null)
]
}
control={
"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":4194326,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
saveImages={
"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":76,"key_label":0,"unicode":108,"echo":false,"script":null)
]
}
[rendering]
textures/canvas_textures/default_texture_filter=0
textures/canvas_textures/default_texture_repeat=1
renderer/rendering_method="gl_compatibility"
renderer/rendering_method.mobile="gl_compatibility"
environment/defaults/default_clear_color=Color(0.376471, 0.376471, 0.376471, 1)

BIN
rcedit-x64.exe Normal file

Binary file not shown.

11
shader/wobble.gdshader Normal file
View File

@ -0,0 +1,11 @@
shader_type canvas_item;
uniform sampler2D noise_texture:repeat_enable;
uniform float distortion_strengh: hint_range(0, 0.1) = 1.0;
uniform float speed: hint_range(0.1, 10) = 1.0;
void fragment() {
vec4 noise_pixel = texture(noise_texture, UV + floor(TIME*speed)/3.0);
vec2 uv_offset = (noise_pixel.rg * 2.0 - 1.0) * distortion_strengh;
COLOR = texture(TEXTURE, UV + uv_offset);
}

BIN
splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

34
splash.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fbd6lye4drsy"
path="res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://splash.png"
dest_files=["res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.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

BIN
test/Sprite-0001.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dq837ls2kiahp"
path="res://.godot/imported/Sprite-0001.png-288a5a360e6243176c931d64aeb64a51.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/Sprite-0001.png"
dest_files=["res://.godot/imported/Sprite-0001.png-288a5a360e6243176c931d64aeb64a51.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

BIN
test/Sprite-0002.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cd1nle3uo2hgv"
path="res://.godot/imported/Sprite-0002.png-44a3947905db447766957a7ed13bc868.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/Sprite-0002.png"
dest_files=["res://.godot/imported/Sprite-0002.png-44a3947905db447766957a7ed13bc868.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

BIN
test/line.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 B

34
test/line.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://gw3r4dno1vmt"
path="res://.godot/imported/line.png-e6919bfefa2d351d67eca50c945bf0f4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/line.png"
dest_files=["res://.godot/imported/line.png-e6919bfefa2d351d67eca50c945bf0f4.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

BIN
test/testBody.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 B

34
test/testBody.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dfghbqnl8a62n"
path="res://.godot/imported/testBody.png-d4fd852332093ed7032c65478a334eaa.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/testBody.png"
dest_files=["res://.godot/imported/testBody.png-d4fd852332093ed7032c65478a334eaa.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

BIN
test/testHead1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

34
test/testHead1.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgfxeysr8lvix"
path="res://.godot/imported/testHead1.png-c2e8ddcf4f84e7fd7bc874494e0306de.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/testHead1.png"
dest_files=["res://.godot/imported/testHead1.png-c2e8ddcf4f84e7fd7bc874494e0306de.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

BIN
test/testHead2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

34
test/testHead2.png.import Normal file
View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dc56e3if2ojsg"
path="res://.godot/imported/testHead2.png-0ca5d9b3f241d6e0c571075aa46c47bc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://test/testHead2.png"
dest_files=["res://.godot/imported/testHead2.png-0ca5d9b3f241d6e0c571075aa46c47bc.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

5
ui_scenes/VolumeBar.gd Normal file
View File

@ -0,0 +1,5 @@
extends TextureProgressBar
func _process(delta):
value = Global.volume

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xxhqegm7rq6n"
path="res://.godot/imported/add.png-a96d2ebf66567409af9823c7762836b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/add.png"
dest_files=["res://.godot/imported/add.png-a96d2ebf66567409af9823c7762836b5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=0
compress/normal_map=2
compress/channel_pack=1
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=0

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clarf70be0y3j"
path="res://.godot/imported/button.png-4ed9f61c3161d9d75e8c2e8cfb2ab720.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/button.png"
dest_files=["res://.godot/imported/button.png-4ed9f61c3161d9d75e8c2e8cfb2ab720.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://goff8ioh380e"
path="res://.godot/imported/buttonBack.png-d5bbf4150b7e8db325429c7cce0515c0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/buttonBack.png"
dest_files=["res://.godot/imported/buttonBack.png-d5bbf4150b7e8db325429c7cce0515c0.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bs2c34vipucwm"
path="res://.godot/imported/duplicate.png-835d2058d83cbbe21e0c2f26998f9912.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/duplicate.png"
dest_files=["res://.godot/imported/duplicate.png-835d2058d83cbbe21e0c2f26998f9912.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkvpm0tfnewo7"
path="res://.godot/imported/edit.png-6f01984962a518eef5e6f7a90ee9b879.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/edit.png"
dest_files=["res://.godot/imported/edit.png-6f01984962a518eef5e6f7a90ee9b879.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c5jh6c65tusu5"
path="res://.godot/imported/exit.png-5b4951474a2f017ad82fdc4a84cffa01.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/exit.png"
dest_files=["res://.godot/imported/exit.png-5b4951474a2f017ad82fdc4a84cffa01.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://da4jthat2oas4"
path="res://.godot/imported/fancy.png-2199986caacc7dc162b3e9646e986dad.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/fancy.png"
dest_files=["res://.godot/imported/fancy.png-2199986caacc7dc162b3e9646e986dad.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbkvrk3fntaj1"
path="res://.godot/imported/link.png-20345aa1214cc9819bf248a140a6c37a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/link.png"
dest_files=["res://.godot/imported/link.png-20345aa1214cc9819bf248a140a6c37a.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dcsvrpj5f5bfv"
path="res://.godot/imported/links.png-8661ed7da679eb37ec65406284435b63.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/links.png"
dest_files=["res://.godot/imported/links.png-8661ed7da679eb37ec65406284435b63.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://spe6dnii3msy"
path="res://.godot/imported/load.png-81254b42cc2b78f8208070b9c120e02c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/load.png"
dest_files=["res://.godot/imported/load.png-81254b42cc2b78f8208070b9c120e02c.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://7jjnsor4vat2"
path="res://.godot/imported/save.png-de94af95d58599e821f85b5e97f537f3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/save.png"
dest_files=["res://.godot/imported/save.png-de94af95d58599e821f85b5e97f537f3.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bgo8xod6ma5s8"
path="res://.godot/imported/setting.png-9fa533ab246cef07d9efa0670bb13e58.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/button sprites/setting.png"
dest_files=["res://.godot/imported/setting.png-9fa533ab246cef07d9efa0670bb13e58.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://djf1mbv36vr68"
path="res://.godot/imported/micButtong.png-15ddc94949ace3b271af08acc8cbb2a9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/microphoneSelect/micButtong.png"
dest_files=["res://.godot/imported/micButtong.png-15ddc94949ace3b271af08acc8cbb2a9.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,23 @@
extends Control
var micName = ""
func _ready():
$Label.text = micName
func _on_button_pressed():
if !get_parent().get_parent().get_parent().visible:
return
AudioServer.input_device = micName
Global.deleteAllMics()
Global.currentMicrophone = null
get_parent().get_parent().get_parent().visible = false
await get_tree().create_timer(1.0).timeout
Global.createMicrophone()

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,24 @@
extends Node2D
var text = ""
@onready var label = $Tooltip/Label
@onready var area = $Area2D
func _ready():
Global.mouse = self
func _process(delta):
if Global.main.editMode:
if text != "":
label.text = text
visible = true
else:
visible = false
global_position = get_global_mouse_position()
if Input.is_action_just_pressed("mouse_left"):
Global.select(area.get_overlapping_areas())
else:
visible = false
text = ""

View File

@ -0,0 +1,45 @@
[gd_scene load_steps=6 format=3 uid="uid://fxku5nddarp8"]
[ext_resource type="Script" path="res://ui_scenes/mouse/mouse_cursor.gd" id="1_t6obd"]
[ext_resource type="Texture2D" uid="uid://23rqddatjku3" path="res://ui_scenes/mouse/tooltipBox.png" id="2_qcn8h"]
[ext_resource type="FontFile" uid="uid://ukj8gv8ucqsg" path="res://font/goober_pixel.ttf" id="3_v627m"]
[sub_resource type="CircleShape2D" id="CircleShape2D_y1fm1"]
radius = 1.0
[sub_resource type="LabelSettings" id="LabelSettings_a4hxj"]
font = ExtResource("3_v627m")
font_size = 31
[node name="MouseCursor" type="Node2D"]
script = ExtResource("1_t6obd")
[node name="Area2D" type="Area2D" parent="."]
collision_layer = 2048
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource("CircleShape2D_y1fm1")
[node name="Tooltip" type="Node2D" parent="."]
z_index = 4096
position = Vector2(-24, 46)
[node name="NinePatchRect" type="NinePatchRect" parent="Tooltip"]
offset_left = 9.0
offset_top = -4.0
offset_right = 168.0
offset_bottom = 48.0
texture = ExtResource("2_qcn8h")
region_rect = Rect2(0, 0, 48, 48)
patch_margin_left = 8
patch_margin_top = 8
patch_margin_right = 8
patch_margin_bottom = 8
[node name="Label" type="Label" parent="Tooltip"]
offset_left = 7.0
offset_top = 7.0
offset_right = 173.0
offset_bottom = 41.0
label_settings = SubResource("LabelSettings_a4hxj")
horizontal_alignment = 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://23rqddatjku3"
path="res://.godot/imported/tooltipBox.png-fbd17edca11f36259ef2d1e9921dc393.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ui_scenes/mouse/tooltipBox.png"
dest_files=["res://.godot/imported/tooltipBox.png-fbd17edca11f36259ef2d1e9921dc393.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,39 @@
extends Node2D
@onready var vbox = $VBoxContainer
var tick = 0
func _ready():
Global.updatePusherNode = self
set_process(false)
func pushUpdate(text):
var label = Label.new()
label.text = text
label.add_theme_color_override("font_outline_color",Color.BLACK)
label.add_theme_constant_override("outline_size",6)
vbox.add_child(label)
var count = vbox.get_children().size()
if count > 5:
vbox.get_child(0).queue_free()
modulate.a = 1.0
tick = 0
set_process(true)
func _process(delta):
tick += 1
if tick >= 240:
modulate.a -= delta
if modulate.a <= 0.0:
for child in vbox.get_children():
child.queue_free()
set_process(false)

Some files were not shown because too many files have changed in this diff Show More