Files
infinitefusion-e18/Data/Scripts/053_PIF_Hoenn/PokeNav/Challenges/ChallengesUI/ChallengeButton.rb
T
2026-07-10 15:42:06 -04:00

129 lines
3.4 KiB
Ruby

#===============================================================================
#
#===============================================================================
class ChallengeButton < SpriteWrapper
attr_reader :challenge
attr_reader :selected
attr_reader :can_claim_reward
DESC_Y = 10
LINE_HEIGHT = 22
REWARD_LINE = DESC_Y + LINE_HEIGHT * 2
def initialize(challenge, x, y, viewport=nil)
super(viewport)
@challenge = challenge
@can_claim_reward = @challenge.completed
@selected = false
graphics_completed = "Graphics/Pictures/Challenges/button_complete_#{@challenge.category.to_s}"
graphics_incompleted = "Graphics/Pictures/Challenges/button_incomplete_#{@challenge.category.to_s}"
image_path = @can_claim_reward ? graphics_completed : graphics_incompleted
@cursor = AnimatedBitmap.new(image_path)
@contents = BitmapWrapper.new(@cursor.width, @cursor.height)
self.bitmap = @contents
self.x = x
self.y = y
pbSetSystemFont(self.bitmap)
refresh
end
def dispose
@cursor.dispose
@contents.dispose
super
end
def selected=(val)
oldsel = @selected
@selected = val
refresh if oldsel != val
end
def refresh
self.bitmap.clear
# Draw background
rect = Rect.new(0, 0, @cursor.width, @cursor.height / 2)
rect.y = @cursor.height / 2 if @selected
self.bitmap.blt(0, 0, @cursor.bitmap, rect)
# Text colors
text_color = @can_claim_reward ? Color.new(0,255,0) : Color.new(248,248,248)
shadow_color = Color.new(40,40,40)
# Description text
desc_lines = wrap_text(@challenge.description, @contents, @cursor.width - 40)[0, 2]
textpos = []
y_offset = DESC_Y
desc_lines.each do |line|
textpos << [line, 10, y_offset, 0, text_color, shadow_color, false]
y_offset += LINE_HEIGHT
end
reward_y = REWARD_LINE
reward_text = @can_claim_reward ? _INTL("Collect") : _INTL("Reward")
claim_color = @can_claim_reward ? Color.new(80, 220, 255) : Color.new(255, 215, 120)
textpos << [
"#{reward_text} $#{@challenge.money_reward}",
10, reward_y, 0,
claim_color, shadow_color, false
]
pbDrawTextPositions(self.bitmap, textpos)
# --------------------------------------------------
# Draw item reward icons
# --------------------------------------------------
return if !@challenge.item_reward || @challenge.item_reward.empty?
icon_x = 170 # starting X (adjust to taste)
icon_y = reward_y #- 4 # align with text nicely
icon_size = 48
icon_gap = 8
@challenge.item_reward.each do |item|
icon_path = GameData::Item.icon_filename(item)
next if !icon_path
icon = Bitmap.new(icon_path)
src_rect = Rect.new(0, 0, icon.width, icon.height)
self.bitmap.stretch_blt(
Rect.new(icon_x, icon_y, icon_size, icon_size),
icon,
src_rect
)
icon.dispose
icon_x += icon_size + icon_gap
end
end
# Helper method to wrap text into multiple lines
def wrap_text(text, bitmap, max_width)
words = text.split(" ")
lines = []
line = ""
words.each do |word|
test_line = line.empty? ? word : "#{line} #{word}"
if bitmap.text_size(test_line).width > max_width
lines << line
line = word
else
line = test_line
end
end
lines << line unless line.empty?
return lines
end
end