diff --git a/graphics/player/palettes/default.tex b/graphics/player/palettes/default.tex new file mode 100644 index 0000000..7e62095 Binary files /dev/null and b/graphics/player/palettes/default.tex differ diff --git a/menus/file_select_panel.gd b/menus/file_select_panel.gd index e99a8b0..a2259c6 100644 --- a/menus/file_select_panel.gd +++ b/menus/file_select_panel.gd @@ -60,7 +60,7 @@ func refresh(): $"%DeathCounter".text = "%04d" % file.get_total_deaths() $"%TimeCounter".text = "%02d:%02d" % [file.play_time / 3600.0, fmod(file.play_time / 60.0, 60.0)] $"%Difficulty".text = Game.DIFFICULTY_NAMES[file.difficulty] - var palette = load("res://graphics/player/palettes/%s.png" % file.palette) + var palette = load("res://graphics/player/palettes/%s.tex" % file.palette) $"%Palette".material.set_shader_param("palette", palette) else: file = null diff --git a/menus/level_select_scholar.gd b/menus/level_select_scholar.gd index a40c083..8d636fa 100644 --- a/menus/level_select_scholar.gd +++ b/menus/level_select_scholar.gd @@ -29,7 +29,7 @@ onready var shards_block: HBoxContainer = $"%ShardsBlock" onready var shards_needed: Label = $"%ShardsNeeded" func _ready() -> void: - var palette = load("res://graphics/player/palettes/%s.png" % Game.current_palette) + var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) player_sprite.material.set_shader_param("palette", palette) $ShardCount.text = "%02d" % Save.current_file.get_total_shards() Fade.fade_in(Options.transition_speed_secs) diff --git a/objects/lore/hills/sg.gd b/objects/lore/hills/sg.gd index 746f96b..41aa41c 100644 --- a/objects/lore/hills/sg.gd +++ b/objects/lore/hills/sg.gd @@ -2,5 +2,5 @@ extends HBoxContainer func _ready() -> void: - var palette = load("res://graphics/player/palettes/%s.png" % Game.current_palette) + var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) $Panel/TextureRect.material.set_shader_param("palette", palette) diff --git a/objects/lore/hills/sg_palette_lore.gd b/objects/lore/hills/sg_palette_lore.gd index cd1add3..61fabed 100644 --- a/objects/lore/hills/sg_palette_lore.gd +++ b/objects/lore/hills/sg_palette_lore.gd @@ -1,5 +1,5 @@ extends TextureRect func _ready(): - var palette = load("res://graphics/player/palettes/%s.png" % Game.current_palette) + var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) material.set_shader_param("palette", palette) diff --git a/objects/player/player.gd b/objects/player/player.gd index 41b2e13..4edd0e1 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -70,7 +70,7 @@ onready var hitbox: Area2D = $"%Hitbox" # OVERRIDES # func _ready() -> void: #set palette - var palette = load("res://graphics/player/palettes/%s.png" % Game.current_palette) + var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) sprite.material.set_shader_param("palette", palette) $"%CFox".material.set_shader_param("palette", palette) $"%DissolveParticles".material.set_shader_param("palette", palette) diff --git a/objects/player/player.tscn b/objects/player/player.tscn index 85edbd5..5ad07be 100644 --- a/objects/player/player.tscn +++ b/objects/player/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=42 format=2] +[gd_scene load_steps=43 format=2] [ext_resource path="res://objects/player/player.gd" type="Script" id=1] [ext_resource path="res://graphics/player/palettes/default.png" type="Texture" id=2] @@ -11,6 +11,7 @@ [ext_resource path="res://addons/godot_state_charts/compound_state.gd" type="Script" id=9] [ext_resource path="res://addons/godot_state_charts/transition.gd" type="Script" id=10] [ext_resource path="res://addons/godot_state_charts/atomic_state.gd" type="Script" id=11] +[ext_resource path="res://graphics/player/palettes/default.tex" type="Texture" id=12] [ext_resource path="res://graphics/player/sg.png" type="Texture" id=14] [ext_resource path="res://graphics/particles/dust.png" type="Texture" id=18] [ext_resource path="res://ui/2ndpuberty_outline.tres" type="Material" id=25] @@ -19,7 +20,7 @@ shader = ExtResource( 3 ) shader_param/border_color = Color( 0, 0, 0, 1 ) shader_param/border_corners = true -shader_param/palette = ExtResource( 2 ) +shader_param/palette = ExtResource( 12 ) [sub_resource type="Shader" id=26] code = "// Recolor diff --git a/project.godot b/project.godot index 3639f08..f54d298 100644 --- a/project.godot +++ b/project.godot @@ -34,6 +34,11 @@ _global_script_classes=[ { "language": "GDScript", "path": "res://menus/main_menu.gd" }, { +"base": "ImageTexture", +"class": "PaletteTexture", +"language": "GDScript", +"path": "res://scripts/palette_texture.gd" +}, { "base": "State", "class": "ParallelState", "language": "GDScript", @@ -70,6 +75,7 @@ _global_script_class_icons={ "CompoundState": "res://addons/godot_state_charts/compound_state.svg", "LevelEntry": "", "MainMenu": "", +"PaletteTexture": "", "ParallelState": "res://addons/godot_state_charts/parallel_state.svg", "RadioButtons": "", "State": "res://addons/godot_state_charts/state.svg", diff --git a/scripts/palette_texture.gd b/scripts/palette_texture.gd new file mode 100644 index 0000000..e9348b8 --- /dev/null +++ b/scripts/palette_texture.gd @@ -0,0 +1,50 @@ +tool +class_name PaletteTexture +extends ImageTexture + + +export (Array, Color) var colors := [] setget _set_colors +export var convert_from: Texture = null setget _convert_from + + +var _data := PoolByteArray() + + +func _init() -> void: + colors.resize(16) + colors.fill(Color.white) + _data.resize(16 * 4) + _data.fill(255) + _update_image() + + +func _set_colors(new_array: Array) -> void: + if new_array.size() == 16: + colors = new_array + _update_image() + + +func _update_image() -> void: + for i in colors.size(): + var c: Color = colors[i] + var j: int = i * 4 + _data[j] = c.r8 + _data[j + 1] = c.g8 + _data[j + 2] = c.b8 + _data[j + 3] = c.a8 + + var image := Image.new() + image.create_from_data(4, 4, false, Image.FORMAT_RGBA8, _data) + create_from_image(image, 0) + + +func _convert_from(texture: Texture) -> void: + if texture != null and texture.get_size() == Vector2(4.0, 4.0): + var image := texture.get_data() + image.lock() + for x in 4: + for y in 4: + colors[x + (y * 4)] = image.get_pixel(x, y) + print(colors[x + (y * 4)]) + image.unlock() + _update_image() diff --git a/scripts/sg_palette.gd b/scripts/sg_palette.gd index 3628f2b..f413bc3 100644 --- a/scripts/sg_palette.gd +++ b/scripts/sg_palette.gd @@ -1,5 +1,5 @@ extends Node2D func _ready(): - var palette = load("res://graphics/player/palettes/%s.png" % Game.current_palette) + var palette = load("res://graphics/player/palettes/%s.tex" % Game.current_palette) material.set_shader_param("palette", palette)