Refactored code that draws party screen panels

This commit is contained in:
Maruno17
2022-06-13 22:54:44 +01:00
parent 8d4015c903
commit cc540b0132

View File

@@ -170,6 +170,12 @@ class PokemonPartyPanel < SpriteWrapper
attr_reader :switching attr_reader :switching
attr_reader :text attr_reader :text
TEXT_BASE_COLOR = Color.new(248, 248, 248)
TEXT_SHADOW_COLOR = Color.new(40, 40, 40)
HP_BAR_WIDTH = 96
STATUS_ICON_WIDTH = 44
STATUS_ICON_HEIGHT = 16
def initialize(pokemon, index, viewport = nil) def initialize(pokemon, index, viewport = nil)
super(viewport) super(viewport)
@pokemon = pokemon @pokemon = pokemon
@@ -213,6 +219,7 @@ class PokemonPartyPanel < SpriteWrapper
@helditemsprite.z = self.z + 3 @helditemsprite.z = self.z + 3
@overlaysprite = BitmapSprite.new(Graphics.width, Graphics.height, viewport) @overlaysprite = BitmapSprite.new(Graphics.width, Graphics.height, viewport)
@overlaysprite.z = self.z + 4 @overlaysprite.z = self.z + 4
pbSetSystemFont(@overlaysprite.bitmap)
@hpbar = AnimatedBitmap.new("Graphics/Pictures/Party/overlay_hp") @hpbar = AnimatedBitmap.new("Graphics/Pictures/Party/overlay_hp")
@statuses = AnimatedBitmap.new(_INTL("Graphics/Pictures/statuses")) @statuses = AnimatedBitmap.new(_INTL("Graphics/Pictures/statuses"))
@selected = false @selected = false
@@ -253,12 +260,11 @@ class PokemonPartyPanel < SpriteWrapper
end end
def text=(value) def text=(value)
if @text != value return if @text == value
@text = value @text = value
@refreshBitmap = true @refreshBitmap = true
refresh refresh
end end
end
def pokemon=(value) def pokemon=(value)
@pokemon = value @pokemon = value
@@ -269,33 +275,27 @@ class PokemonPartyPanel < SpriteWrapper
end end
def selected=(value) def selected=(value)
if @selected != value return if @selected == value
@selected = value @selected = value
refresh refresh
end end
end
def preselected=(value) def preselected=(value)
if @preselected != value return if @preselected == value
@preselected = value @preselected = value
refresh refresh
end end
end
def switching=(value) def switching=(value)
if @switching != value return if @switching == value
@switching = value @switching = value
refresh refresh
end end
end
def hp; return @pokemon.hp; end def hp; return @pokemon.hp; end
def refresh def refresh_panel_graphic
return if disposed? return if !@panelbgsprite || @panelbgsprite.disposed?
return if @refreshing
@refreshing = true
if @panelbgsprite && !@panelbgsprite.disposed?
if self.selected if self.selected
if self.preselected if self.preselected
@panelbgsprite.changeBitmap("swapsel2") @panelbgsprite.changeBitmap("swapsel2")
@@ -319,9 +319,11 @@ class PokemonPartyPanel < SpriteWrapper
@panelbgsprite.y = self.y @panelbgsprite.y = self.y
@panelbgsprite.color = self.color @panelbgsprite.color = self.color
end end
if @hpbgsprite && !@hpbgsprite.disposed?
def refresh_hp_bar_graphic
return if !@hpbgsprite || @hpbgsprite.disposed?
@hpbgsprite.visible = (!@pokemon.egg? && !(@text && @text.length > 0)) @hpbgsprite.visible = (!@pokemon.egg? && !(@text && @text.length > 0))
if @hpbgsprite.visible return if !@hpbgsprite.visible
if self.preselected || (self.selected && @switching) if self.preselected || (self.selected && @switching)
@hpbgsprite.changeBitmap("swap") @hpbgsprite.changeBitmap("swap")
elsif @pokemon.fainted? elsif @pokemon.fainted?
@@ -333,54 +335,80 @@ class PokemonPartyPanel < SpriteWrapper
@hpbgsprite.y = self.y + 50 @hpbgsprite.y = self.y + 50
@hpbgsprite.color = self.color @hpbgsprite.color = self.color
end end
end
if @ballsprite && !@ballsprite.disposed? def refresh_ball_graphic
return if !@ballsprite || @ballsprite.disposed?
@ballsprite.changeBitmap((self.selected) ? "sel" : "desel") @ballsprite.changeBitmap((self.selected) ? "sel" : "desel")
@ballsprite.x = self.x + 10 @ballsprite.x = self.x + 10
@ballsprite.y = self.y @ballsprite.y = self.y
@ballsprite.color = self.color @ballsprite.color = self.color
end end
if @pkmnsprite && !@pkmnsprite.disposed?
def refresh_pokemon_icon
return if !@pkmnsprite || @pkmnsprite.disposed?
@pkmnsprite.x = self.x + 60 @pkmnsprite.x = self.x + 60
@pkmnsprite.y = self.y + 40 @pkmnsprite.y = self.y + 40
@pkmnsprite.color = self.color @pkmnsprite.color = self.color
@pkmnsprite.selected = self.selected @pkmnsprite.selected = self.selected
end end
if @helditemsprite&.visible && !@helditemsprite.disposed?
def refresh_held_item_icon
return if !@helditemsprite || @helditemsprite.disposed? || !@helditemsprite.visible
@helditemsprite.x = self.x + 62 @helditemsprite.x = self.x + 62
@helditemsprite.y = self.y + 48 @helditemsprite.y = self.y + 48
@helditemsprite.color = self.color @helditemsprite.color = self.color
end end
if @overlaysprite && !@overlaysprite.disposed?
@overlaysprite.x = self.x def refresh_overlay_information
@overlaysprite.y = self.y return if !@refreshBitmap
@overlaysprite.color = self.color
end
if @refreshBitmap
@refreshBitmap = false
@overlaysprite.bitmap&.clear @overlaysprite.bitmap&.clear
basecolor = Color.new(248, 248, 248) draw_name
shadowcolor = Color.new(40, 40, 40) draw_level
draw_hp
draw_status
draw_gender
draw_shiny_icon
draw_annotation
end
def draw_name
pbDrawTextPositions(@overlaysprite.bitmap,
[[@pokemon.name, 96, 22, 0, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]])
end
def draw_level
return if @pokemon.egg?
# "Lv" graphic
pbDrawImagePositions(@overlaysprite.bitmap,
[["Graphics/Pictures/Party/overlay_lv", 20, 70, 0, 0, 22, 14]])
# Level number
pbSetSmallFont(@overlaysprite.bitmap)
pbDrawTextPositions(@overlaysprite.bitmap,
[[@pokemon.level.to_s, 42, 68, 0, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]])
pbSetSystemFont(@overlaysprite.bitmap) pbSetSystemFont(@overlaysprite.bitmap)
textpos = [] end
# Draw Pokémon name
textpos.push([@pokemon.name, 96, 22, 0, basecolor, shadowcolor]) def draw_hp
if !@pokemon.egg? return if @pokemon.egg? || (@text && @text.length > 0)
if !@text || @text.length == 0 # HP numbers
# Draw HP numbers hp_text = sprintf("% 3d /% 3d", @pokemon.hp, @pokemon.totalhp)
textpos.push([sprintf("% 3d /% 3d", @pokemon.hp, @pokemon.totalhp), 224, 66, 1, basecolor, shadowcolor]) pbDrawTextPositions(@overlaysprite.bitmap,
# Draw HP bar [[hp_text, 224, 66, 1, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]])
if @pokemon.hp > 0 # HP bar
w = @pokemon.hp * 96 / @pokemon.totalhp.to_f if @pokemon.able?
w = @pokemon.hp * HP_BAR_WIDTH / @pokemon.totalhp.to_f
w = 1 if w < 1 w = 1 if w < 1
w = ((w / 2).round) * 2 w = ((w / 2).round) * 2 # Round to the nearest 2 pixels
hpzone = 0 hpzone = 0
hpzone = 1 if @pokemon.hp <= (@pokemon.totalhp / 2).floor hpzone = 1 if @pokemon.hp <= (@pokemon.totalhp / 2).floor
hpzone = 2 if @pokemon.hp <= (@pokemon.totalhp / 4).floor hpzone = 2 if @pokemon.hp <= (@pokemon.totalhp / 4).floor
hprect = Rect.new(0, hpzone * 8, w, 8) hprect = Rect.new(0, hpzone * 8, w, 8)
@overlaysprite.bitmap.blt(128, 52, @hpbar.bitmap, hprect) @overlaysprite.bitmap.blt(128, 52, @hpbar.bitmap, hprect)
end end
# Draw status end
def draw_status
return if @pokemon.egg? || (@text && @text.length > 0)
status = -1 status = -1
if @pokemon.fainted? if @pokemon.fainted?
status = GameData::Status.count - 1 status = GameData::Status.count - 1
@@ -389,39 +417,48 @@ class PokemonPartyPanel < SpriteWrapper
elsif @pokemon.pokerusStage == 1 elsif @pokemon.pokerusStage == 1
status = GameData::Status.count status = GameData::Status.count
end end
if status >= 0 return if status < 0
statusrect = Rect.new(0, 16 * status, 44, 16) statusrect = Rect.new(0, STATUS_ICON_HEIGHT * status, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT)
@overlaysprite.bitmap.blt(78, 68, @statuses.bitmap, statusrect) @overlaysprite.bitmap.blt(78, 68, @statuses.bitmap, statusrect)
end end
def draw_gender
return if @pokemon.egg? || @pokemon.genderless?
gender_text = (@pokemon.male?) ? _INTL("") : _INTL("")
base_color = (@pokemon.male?) ? Color.new(0, 112, 248) : Color.new(232, 32, 16)
shadow_color = (@pokemon.male?) ? Color.new(120, 184, 232) : Color.new(248, 168, 184)
pbDrawTextPositions(@overlaysprite.bitmap,
[[gender_text, 224, 22, 0, base_color, shadow_color]])
end end
# Draw gender symbol
if @pokemon.male? def draw_shiny_icon
textpos.push([_INTL(""), 224, 22, 0, Color.new(0, 112, 248), Color.new(120, 184, 232)]) return if @pokemon.egg? || !@pokemon.shiny?
elsif @pokemon.female?
textpos.push([_INTL(""), 224, 22, 0, Color.new(232, 32, 16), Color.new(248, 168, 184)])
end
# Draw shiny icon
if @pokemon.shiny?
pbDrawImagePositions(@overlaysprite.bitmap, pbDrawImagePositions(@overlaysprite.bitmap,
[["Graphics/Pictures/shiny", 80, 48, 0, 0, 16, 16]]) [["Graphics/Pictures/shiny", 80, 48, 0, 0, 16, 16]])
end end
end
pbDrawTextPositions(@overlaysprite.bitmap, textpos) def draw_annotation
# Draw level text return if !@text || @text.length == 0
if !@pokemon.egg?
pbDrawImagePositions(@overlaysprite.bitmap,
[["Graphics/Pictures/Party/overlay_lv", 20, 70, 0, 0, 22, 14]])
pbSetSmallFont(@overlaysprite.bitmap)
pbDrawTextPositions(@overlaysprite.bitmap, pbDrawTextPositions(@overlaysprite.bitmap,
[[@pokemon.level.to_s, 42, 68, 0, basecolor, shadowcolor]]) [[@text, 96, 62, 0, TEXT_BASE_COLOR, TEXT_SHADOW_COLOR]])
end
# Draw annotation text
if @text && @text.length > 0
pbSetSystemFont(@overlaysprite.bitmap)
pbDrawTextPositions(@overlaysprite.bitmap,
[[@text, 96, 62, 0, basecolor, shadowcolor]])
end end
def refresh
return if disposed?
return if @refreshing
@refreshing = true
refresh_panel_graphic
refresh_hp_bar_graphic
refresh_ball_graphic
refresh_pokemon_icon
refresh_held_item_icon
if @overlaysprite && !@overlaysprite.disposed?
@overlaysprite.x = self.x
@overlaysprite.y = self.y
@overlaysprite.color = self.color
end end
refresh_overlay_information
@refreshBitmap = false
@refreshing = false @refreshing = false
end end