Files
infinitefusion-e18/Data/Scripts/052_InfiniteFusion/ImprovedShinies/Shinies_Bitmap.rb
2025-06-07 08:16:50 -04:00

153 lines
4.6 KiB
Ruby

class Bitmap
def hue_customcolor(rules_string)
return if rules_string.nil? || rules_string == "nil"
if rules_string.include?("&")
rules_string.split("&").each do |part|
part = part.strip
next if part.empty?
hue_customcolor(part)
end
return
end
rules = rules_string.split("|").map do |str|
parts = str.split(".")
{
from: parts[0].split.map(&:to_f),
to: parts[1].split.map(&:to_f)
}
end
width.times do |x|
height.times do |y|
color = get_pixel(x, y)
next if color.alpha == 0
r, g, b = color.red.to_f, color.green.to_f, color.blue.to_f
# Avoid division by zero
r = 10 if r <= 10
g = 10 if g <= 10
b = 10 if b <= 10
min_distance = Float::INFINITY
closest_rule = nil
rules.each do |rule|
from = rule[:from]
# Avoid division by zero
from[0] = 10 if from[0] <= 10
from[1] = 10 if from[1] <= 10
from[2] = 10 if from[2] <= 10
dist = (r - from[0])**2 + (g - from[1])**2 + (b - from[2])**2
if dist < min_distance
min_distance = dist
closest_rule = rule
end
end
next unless closest_rule
from = closest_rule[:from]
to = closest_rule[:to]
# Avoid multiplication by zero
to[0] = 10 if to[0] <= 10
to[1] = 10 if to[1] <= 10
to[2] = 10 if to[2] <= 10
r_factor = r / from[0]
g_factor = g / from[1]
b_factor = b / from[2]
adjusted_r = (to[0] * r_factor).clamp(0, 255)
adjusted_g = (to[1] * g_factor).clamp(0, 255)
adjusted_b = (to[2] * b_factor).clamp(0, 255)
set_pixel(x, y, Color.new(adjusted_r.to_i, adjusted_g.to_i, adjusted_b.to_i, color.alpha))
end
end
end
def update_shiny_cache(dex_number, name)
if isFusion(dex_number)
body_id = getBodyID(dex_number)
head_id = getHeadID(dex_number, body_id)
shiny_directory = "Graphics/Battlers/Shiny/#{head_id}.#{body_id}"
else
shiny_directory = "Graphics/Battlers/Shiny/#{dex_number}"
end
return unless Dir.exist?(shiny_directory)
# browse files in shiny_directory
Dir.foreach(shiny_directory) do |file|
next if file == "." || file == ".." # Ignorer les entrées spéciales
file_path = File.join(shiny_directory, file)
# delete files whose name contains "name"
if File.file?(file_path) && file.include?(name)
File.delete(file_path)
end
end
end
def hue_rename(dex_number, name, newname)
if isFusion(dex_number)
body_id = getBodyID(dex_number)
head_id = getHeadID(dex_number, body_id)
shiny_directory = "Graphics/Battlers/Shiny/#{head_id}.#{body_id}"
else
shiny_directory = "Graphics/Battlers/Shiny/#{dex_number}"
end
return unless Dir.exist?(shiny_directory)
Dir.entries(shiny_directory).each do |file|
next unless file.include?(name) && file.end_with?(".png")
old_path = "#{shiny_directory}/#{file}"
new_file = file.sub(name, newname)
new_path = "#{shiny_directory}/#{new_file}"
File.rename(old_path, new_path)
end
end
def hue_changecolors(dex_number, bodyShiny, headShiny, alt = "")
if isFusion(dex_number)
body_id = getBodyID(dex_number)
head_id = getHeadID(dex_number, body_id)
shiny_directory = "Graphics/Battlers/Shiny/#{head_id}.#{body_id}"
shiny_file_path = "#{shiny_directory}/#{head_id}.#{body_id}"
offsets = [SHINY_COLOR_OFFSETS[body_id], SHINY_COLOR_OFFSETS[head_id]]
else
shiny_directory = "Graphics/Battlers/Shiny/#{dex_number}"
shiny_file_path = "#{shiny_directory}/#{dex_number}"
offsets = [SHINY_COLOR_OFFSETS[dex_number]]
end
# Determine the destination folders
shiny_file_path += alt + "_bodyShiny" if bodyShiny
shiny_file_path += alt + "_headShiny" if headShiny
shiny_file_path += alt +".png"
if File.exist?(shiny_file_path)
return
end
offset = offsets.compact.max_by { |o| o.keys.count }
return unless offset
onetime = true
offset.keys.each do |version|
value = offset&.dig(version)
if value.is_a?(String) && onetime
onetime = false
hue_customcolor(GameData::Species.calculateCustomShinyHueOffset(dex_number, bodyShiny, headShiny))
Dir.mkdir(shiny_directory) unless Dir.exist?(shiny_directory)
self.save_to_png(shiny_file_path)
elsif !value.is_a?(String)
hue_change(GameData::Species.calculateShinyHueOffset(dex_number, bodyShiny, headShiny, version))
end
end
end
end