mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2026-07-22 15:47:00 +00:00
Update 6.8
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
class PokemonChallenges_Scene
|
||||
VISIBLE_BUTTONS = 3 # Number of buttons visible at once
|
||||
Y_START = 41
|
||||
Y_GAP = 108
|
||||
BUTTONS_X = 60
|
||||
|
||||
def pbStartScene(challenges)
|
||||
@challenges = []
|
||||
@index = 0
|
||||
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
|
||||
@viewport.z = 99999
|
||||
@sprites = {}
|
||||
|
||||
# Background
|
||||
@sprites["background"] = IconSprite.new(0, 0, @viewport)
|
||||
if isDarkMode
|
||||
@sprites["background"].setBitmap("Graphics/Pictures/Pokegear/bg_dark")
|
||||
else
|
||||
@sprites["background"].setBitmap("Graphics/Pictures/Pokegear/bg")
|
||||
end
|
||||
@sprites["header"] = IconSprite.new(0, 0, @viewport)
|
||||
@sprites["header"].setBitmap("Graphics/Pictures/Challenges/bg_header")
|
||||
|
||||
# Buttons
|
||||
@buttons = []
|
||||
|
||||
$Trainer.challenges.keys.each_with_index do |challenge_id, i|
|
||||
challenge = $Trainer.challenges[challenge_id]
|
||||
next unless challenge
|
||||
@challenges << challenge
|
||||
btn = ChallengeButton.new(challenge, BUTTONS_X, Y_START + i * Y_GAP, @viewport)
|
||||
@sprites["button#{i}"] = btn
|
||||
@buttons << btn
|
||||
end
|
||||
displayTextElements
|
||||
pbFadeInAndShow(@sprites) { pbUpdate }
|
||||
end
|
||||
|
||||
def displayTextElements
|
||||
Kernel.pbClearText
|
||||
Kernel.pbDisplayText(_INTL("POKÉCHALLENGE"), 256,-8,99999, pbColor(:ORANGE), pbColor(:BROWN))
|
||||
Kernel.pbDisplayText($Trainer.nb_completed_challenges.to_s, 450,-6,99999, pbColor(:GREEN), pbColor(:DARKGREEN))
|
||||
if @buttons.empty?
|
||||
showEmptyMessage
|
||||
end
|
||||
end
|
||||
def showEmptyMessage
|
||||
text_pos_x =240
|
||||
text_pos_y =100
|
||||
text_color = pbColor(:WHITE)
|
||||
line_height = 36
|
||||
Kernel.pbDisplayText(_INTL("You finished all your PokéChallenges!"), text_pos_x, text_pos_y,99999, text_color)
|
||||
Kernel.pbDisplayText(_INTL("You'll be assigned new ones tomorrow."), text_pos_x, text_pos_y+line_height,99999, text_color)
|
||||
end
|
||||
def pbUpdate
|
||||
# Update selection
|
||||
@buttons.each_with_index do |btn, idx|
|
||||
btn.selected = (idx == @index)
|
||||
end
|
||||
|
||||
# Scroll calculation
|
||||
scroll_offset = 0
|
||||
if @index >= VISIBLE_BUTTONS
|
||||
Kernel.pbClearText
|
||||
@sprites["header"].visible=false
|
||||
scroll_offset = (@index - VISIBLE_BUTTONS + 1) * Y_GAP
|
||||
else
|
||||
displayTextElements
|
||||
@sprites["header"].visible=true
|
||||
end
|
||||
|
||||
# Move buttons according to scroll
|
||||
@buttons.each_with_index do |btn, idx|
|
||||
btn.y = Y_START + idx * Y_GAP - scroll_offset
|
||||
end
|
||||
if @buttons.empty?
|
||||
showEmptyMessage
|
||||
end
|
||||
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
end
|
||||
|
||||
def pbScene
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
|
||||
if Input.trigger?(Input::BACK)
|
||||
pbPlayCloseMenuSE
|
||||
break
|
||||
elsif Input.trigger?(Input::USE)
|
||||
if @challenges.empty?
|
||||
pbPlayCloseMenuSE
|
||||
break
|
||||
end
|
||||
pbPlayDecisionSE
|
||||
challenge = @challenges[@index]
|
||||
|
||||
if @buttons[@index].can_claim_reward
|
||||
$Trainer.remove_challenge(challenge.id)
|
||||
removeChallengeAt(@index)
|
||||
pbSEPlay("GUI storage show party panel")
|
||||
receiveChallengeReward(challenge)
|
||||
pbUpdate
|
||||
else
|
||||
pbSEPlay("GUI sel buzzer",80)
|
||||
pbMessage(_INTL("The reward can only be collected once you complete the challenge!"))
|
||||
end
|
||||
elsif Input.trigger?(Input::UP)
|
||||
pbPlayCursorSE if @challenges.length > 1
|
||||
@index -= 1
|
||||
@index = @challenges.length - 1 if @index < 0
|
||||
elsif Input.trigger?(Input::DOWN)
|
||||
pbPlayCursorSE if @challenges.length > 1
|
||||
@index += 1
|
||||
@index = 0 if @index >= @challenges.length
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def receiveChallengeReward(challenge)
|
||||
money_reward = challenge.money_reward
|
||||
item_reward = challenge.item_reward
|
||||
quantity = item_reward.length
|
||||
pbReceiveMoney(money_reward)
|
||||
pbReceiveItem(item_reward[0], quantity)
|
||||
$Trainer.money += money_reward
|
||||
|
||||
end
|
||||
|
||||
def challengeCompleted?(challenge_id)
|
||||
return $Trainer.completed_challenge?(challenge_id)
|
||||
end
|
||||
|
||||
#Removes the challenge button sprite
|
||||
def removeChallengeAt(index)
|
||||
btn = @buttons[index]
|
||||
btn.dispose
|
||||
@sprites.delete_if { |_, v| v == btn }
|
||||
@buttons.delete_at(index)
|
||||
@challenges.delete_at(index)
|
||||
|
||||
if @index >= @buttons.length
|
||||
@index = @buttons.length - 1
|
||||
end
|
||||
@index = 0 if @index < 0
|
||||
end
|
||||
|
||||
def pbEndScene
|
||||
pbFadeOutAndHide(@sprites) { pbUpdate }
|
||||
pbDisposeSpriteHash(@sprites)
|
||||
Kernel.pbClearText
|
||||
@viewport.dispose
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,38 @@
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class PokemonChallenges_Screen
|
||||
def initialize(scene)
|
||||
@scene = scene
|
||||
end
|
||||
|
||||
def pbStartScreen
|
||||
challenges = getChallengesList
|
||||
$Trainer.pokenav.last_opened_challenges = pbGetTimeNow
|
||||
@scene.pbStartScene(challenges)
|
||||
@scene.pbScene
|
||||
@scene.pbEndScene
|
||||
end
|
||||
|
||||
|
||||
def getChallengesList
|
||||
last_opened = $Trainer.pokenav.last_opened_challenges
|
||||
if shouldRefreshChallenges(last_opened)
|
||||
$Trainer.refresh_challenges()
|
||||
$PokemonTemp.fuse_count_today = 0
|
||||
$PokemonTemp.unfuse_count_today = 0
|
||||
end
|
||||
|
||||
return $Trainer.challenges.values
|
||||
end
|
||||
|
||||
|
||||
def shouldRefreshChallenges(last_opened_date)
|
||||
return true if last_opened_date.nil?
|
||||
#return Time.now.to_date > last_opened_date
|
||||
return timeDateGreaterThan(pbGetTimeNow,last_opened_date)
|
||||
#return pbGetTimeNow.to_date > last_opened_date #Replace Time.now by pbGetTimeNow everywhere to use in-game days for testing
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
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
|
||||
Reference in New Issue
Block a user