Finished FPS agnosticism, removed particle engine

This commit is contained in:
Maruno17
2023-06-03 21:55:02 +01:00
parent 68de25562a
commit 1901675e33
39 changed files with 652 additions and 1504 deletions

View File

@@ -15,30 +15,31 @@
#
#===============================================================================
class HallOfFame_Scene
# When true, all pokémon will be in one line
# When false, all pokémon will be in two lines
# When true, all pokémon will be in one line.
# When false, all pokémon will be in two lines.
SINGLE_ROW_OF_POKEMON = false
# Make the pokémon movement ON in hall entry
# Make the pokémon movement ON in hall entry.
ANIMATION = true
# Speed in pokémon movement in hall entry. Don't use less than 2!
ANIMATIONSPEED = 32
# Time in seconds for a Pokémon to slide to its position from off-screen.
APPEAR_SPEED = 0.4
# Entry wait time (in seconds) between showing each Pokémon (and trainer).
# Waits for twice this tme when showing "Welcome to the Hall of Fame!".
ENTRY_WAIT_TIME = 3.0
# Wait time (in seconds) when showing "Welcome to the Hall of Fame!".
WELCOME_WAIT_TIME = 4.0
# Maximum number limit of simultaneous hall entries saved.
# 0 = Doesn't save any hall. -1 = no limit
# Prefer to use larger numbers (like 500 and 1000) than don't put a limit
# If a player exceed this limit, the first one will be removed
# Prefer to use larger numbers (like 500 and 1000) than don't put a limit.
# If a player exceed this limit, the first one will be removed.
HALL_ENTRIES_LIMIT = 50
# The entry music name. Put "" to doesn't play anything
# The entry music name. Put "" to doesn't play anything.
HALL_OF_FAME_BGM = "Hall of Fame"
# Allow eggs to be show and saved in hall
# Allow eggs to be show and saved in hall.
ALLOW_EGGS = true
# Remove the hallbars when the trainer sprite appears
# Remove the hallbars when the trainer sprite appears.
REMOVE_BARS_WHEN_SHOWING_TRAINER = true
# The final fade speed on entry
# The final fade speed on entry.
FINAL_FADE_DURATION = 1.0
# Sprite's opacity value when it isn't selected
# Sprite's opacity value when it isn't selected.
OPACITY = 64
TEXT_BASE_COLOR = Color.new(248, 248, 248)
TEXT_SHADOW_COLOR = Color.new(0, 0, 0)
@@ -68,8 +69,7 @@ class HallOfFame_Scene
@useMusic = (HALL_OF_FAME_BGM && HALL_OF_FAME_BGM != "")
pbBGMPlay(HALL_OF_FAME_BGM) if @useMusic
saveHallEntry
@xmovement = []
@ymovement = []
@movements = []
createBattlers
pbFadeInAndShow(@sprites) { pbUpdate }
end
@@ -92,14 +92,15 @@ class HallOfFame_Scene
end
def slowFadeOut(duration)
col = Color.new(0, 0, 0, 0)
timer_start = System.uptime
loop do
alpha = lerp(255, 0, duration, timer_start, System.uptime)
pbSetSpritesToColor(@sprites, Color.new(0, 0, 0, alpha))
col.alpha = lerp(0, 255, duration, timer_start, System.uptime)
@viewport.color = col
Graphics.update
Input.update
pbUpdate
break if alpha == 0
break if col.alpha == 255
end
end
@@ -132,120 +133,94 @@ class HallOfFame_Scene
# Return the x/y point position in screen for battler index number
# Don't use odd numbers!
def xpointformula(battlernumber)
ret = 0
if SINGLE_ROW_OF_POKEMON
ret = ((60 * (battlernumber / 2)) + 48) * (xpositionformula(battlernumber) - 1)
ret += (Graphics.width / 2) - 56
else
ret = 32 + (160 * xpositionformula(battlernumber))
ret = ((60 * (battlernumber / 2)) + 48) * (xpositionformula(battlernumber) - 1) # -48, 48, -108, 108, -168, 168
return ret + (Graphics.width / 2) # 208, 304, 148, 364, 88, 424
end
return ret
return 96 + (160 * xpositionformula(battlernumber)) # 256, 96, 456, 256, 456, 96
end
def ypointformula(battlernumber)
ret = 0
if SINGLE_ROW_OF_POKEMON
ret = 96 - (8 * (battlernumber / 2))
else
ret = 32 + (128 * ypositionformula(battlernumber) / 2)
end
return ret
return 180 - (32 * (battlernumber / 2)) if SINGLE_ROW_OF_POKEMON # 180, 180, 148, 148, 116, 116
return 96 + (64 * ypositionformula(battlernumber)) # 90, 90, 90, 160, 160, 160
end
# Returns 0, 1 or 2 as the x/y column value
# Returns 0, 1 or 2 as the x position value (left, middle, right column)
def xpositionformula(battlernumber)
ret = 0
if SINGLE_ROW_OF_POKEMON
ret = (battlernumber % 2) * 2
else
ret = (battlernumber / 3).even? ? (19 - battlernumber) % 3 : (19 + battlernumber) % 3
end
return ret
return (battlernumber % 2) * 2 if SINGLE_ROW_OF_POKEMON # 0, 2, 0, 2, 0, 2
return (1 - battlernumber) % 3 if (battlernumber / 3).even? # First 3 mons: 1, 0, 2
return (1 + battlernumber) % 3 # Second 3 mons: 1, 2, 0
end
# Returns 0, 1 or 2 as the y position value (top, middle, bottom row)
def ypositionformula(battlernumber)
ret = 0
if SINGLE_ROW_OF_POKEMON
ret = 1
else
ret = ((battlernumber / 3) % 2) * 2
end
return ret
return 1 if SINGLE_ROW_OF_POKEMON # 1, 1, 1, 1, 1, 1
return ((battlernumber / 3) % 2) * 2 # 0, 0, 0, 2, 2, 2
end
def moveSprite(i)
spritename = (i > -1) ? "pokemon#{i}" : "trainer"
speed = (i > -1) ? ANIMATIONSPEED : 2
if !ANIMATION # Skips animation
@sprites[spritename].x -= speed * @xmovement[i]
@xmovement[i] = 0
@sprites[spritename].y -= speed * @ymovement[i]
@ymovement[i] = 0
end
if @xmovement[i] != 0
direction = (@xmovement[i] > 0) ? -1 : 1
@sprites[spritename].x += speed * direction
@xmovement[i] += direction
end
if @ymovement[i] != 0
direction = (@ymovement[i] > 0) ? -1 : 1
@sprites[spritename].y += speed * direction
@ymovement[i] += direction
if !ANIMATION # Skips animation, place directly in end position
@sprites[spritename].x = @movements[i][1]
@sprites[spritename].y = @movements[i][3]
@movements[i][0] = @movements[i][1]
@movements[i][2] = @movements[i][3]
return
end
@movements[i][4] = System.uptime if !@movements[i][4]
speed = (i > -1) ? APPEAR_SPEED : APPEAR_SPEED * 3
@sprites[spritename].x = lerp(@movements[i][0], @movements[i][1], speed, @movements[i][4], System.uptime)
@sprites[spritename].y = lerp(@movements[i][2], @movements[i][3], speed, @movements[i][4], System.uptime)
@movements[i][0] = @movements[i][1] if @sprites[spritename].x == @movements[i][1]
@movements[i][2] = @movements[i][3] if @sprites[spritename].y == @movements[i][3]
end
def createBattlers(hide = true)
# Movement in animation
6.times do |i|
# Clear all 6 pokémon sprites and dispose the ones that exists every time
Settings::MAX_PARTY_SIZE.times do |i|
# Clear all pokémon sprites and dispose the ones that exists every time
# that this method is call
restartSpritePosition(@sprites, "pokemon#{i}")
next if i >= @hallEntry.size
xpoint = xpointformula(i)
ypoint = ypointformula(i)
pok = @hallEntry[i]
end_x = xpointformula(i)
end_y = ypointformula(i)
@sprites["pokemon#{i}"] = PokemonSprite.new(@viewport)
@sprites["pokemon#{i}"].setOffset(PictureOrigin::TOP_LEFT)
@sprites["pokemon#{i}"].setPokemonBitmap(pok)
@sprites["pokemon#{i}"].setPokemonBitmap(@hallEntry[i])
# This method doesn't put the exact coordinates
@sprites["pokemon#{i}"].x = xpoint
@sprites["pokemon#{i}"].y = ypoint
if @sprites["pokemon#{i}"].bitmap && !@sprites["pokemon#{i}"].disposed?
@sprites["pokemon#{i}"].x += (128 - @sprites["pokemon#{i}"].bitmap.width) / 2
@sprites["pokemon#{i}"].y += (128 - @sprites["pokemon#{i}"].bitmap.height) / 2
end
@sprites["pokemon#{i}"].z = 7 - i if SINGLE_ROW_OF_POKEMON
@sprites["pokemon#{i}"].x = end_x
@sprites["pokemon#{i}"].y = end_y
@sprites["pokemon#{i}"].z = Settings::MAX_PARTY_SIZE - i if SINGLE_ROW_OF_POKEMON
next if !hide
# Animation distance calculation
horizontal = 1 - xpositionformula(i)
vertical = 1 - ypositionformula(i)
xdistance = (horizontal == -1) ? -@sprites["pokemon#{i}"].bitmap.width : Graphics.width
ydistance = (vertical == -1) ? -@sprites["pokemon#{i}"].bitmap.height : Graphics.height
xdistance = ((xdistance - @sprites["pokemon#{i}"].x) / ANIMATIONSPEED).abs + 1
ydistance = ((ydistance - @sprites["pokemon#{i}"].y) / ANIMATIONSPEED).abs + 1
biggerdistance = (xdistance > ydistance) ? xdistance : ydistance
@xmovement[i] = biggerdistance
@xmovement[i] *= -1 if horizontal == -1
@xmovement[i] = 0 if horizontal == 0
@ymovement[i] = biggerdistance
@ymovement[i] *= -1 if vertical == -1
@ymovement[i] = 0 if vertical == 0
# Hide the battlers
@sprites["pokemon#{i}"].x += @xmovement[i] * ANIMATIONSPEED
@sprites["pokemon#{i}"].y += @ymovement[i] * ANIMATIONSPEED
x_direction = xpositionformula(i) - 1
y_direction = ypositionformula(i) - 1
distance = 0
if y_direction == 0
distance = (x_direction > 0) ? end_x : Graphics.width - end_x
distance += @sprites["pokemon#{i}"].bitmap.width / 2
else
distance = (y_direction > 0) ? end_y : Graphics.height - end_y
distance += @sprites["pokemon#{i}"].bitmap.height / 2
end
start_x = end_x - x_direction * distance
start_y = end_y - y_direction * distance
@sprites["pokemon#{i}"].x = start_x
@sprites["pokemon#{i}"].y = start_y
@movements[i] = [start_x, end_x, start_y, end_y]
end
end
def createTrainerBattler
@sprites["trainer"] = IconSprite.new(@viewport)
@sprites["trainer"].setBitmap(GameData::TrainerType.front_sprite_filename($player.trainer_type))
@sprites["trainer"].setBitmap(GameData::TrainerType.player_front_sprite_filename($player.trainer_type))
if SINGLE_ROW_OF_POKEMON
@sprites["trainer"].x = Graphics.width / 2
@sprites["trainer"].y = 178
@sprites["trainer"].y = 208
else
@sprites["trainer"].x = Graphics.width - 96
@sprites["trainer"].y = 160
end
@movements.push([Graphics.width / 2, @sprites["trainer"].x, @sprites["trainer"].y, @sprites["trainer"].y])
@sprites["trainer"].z = 9
@sprites["trainer"].ox = @sprites["trainer"].bitmap.width / 2
@sprites["trainer"].oy = @sprites["trainer"].bitmap.height / 2
@@ -253,13 +228,8 @@ class HallOfFame_Scene
@sprites["overlay"].bitmap.clear
@sprites["hallbars"].visible = false
end
@xmovement[@battlerIndex] = 0
@ymovement[@battlerIndex] = 0
if ANIMATION && !SINGLE_ROW_OF_POKEMON # Trainer Animation
startpoint = Graphics.width / 2
# 2 is the trainer speed
@xmovement[@battlerIndex] = (startpoint - @sprites["trainer"].x) / 2
@sprites["trainer"].x = startpoint
@sprites["trainer"].x = @movements.last[0]
else
timer_start = System.uptime
loop do
@@ -376,7 +346,9 @@ class HallOfFame_Scene
def pbUpdateAnimation
if @battlerIndex <= @hallEntry.size
if @xmovement[@battlerIndex] != 0 || @ymovement[@battlerIndex] != 0
if @movements[@battlerIndex] &&
(@movements[@battlerIndex][0] != @movements[@battlerIndex][1] ||
@movements[@battlerIndex][2] != @movements[@battlerIndex][3])
spriteIndex = (@battlerIndex < @hallEntry.size) ? @battlerIndex : -1
moveSprite(spriteIndex)
else
@@ -404,7 +376,7 @@ class HallOfFame_Scene
Graphics.update
Input.update
pbUpdate
break if System.uptime - timer_start >= ENTRY_WAIT_TIME * 2
break if System.uptime - timer_start >= WELCOME_WAIT_TIME
end
setPokemonSpritesOpacity(-1, OPACITY) if !SINGLE_ROW_OF_POKEMON
createTrainerBattler

View File

@@ -17,7 +17,7 @@ class PokemonSystem
attr_accessor :textinput
def initialize
@textspeed = 1 # Text speed (0=slow, 1=normal, 2=fast)
@textspeed = 1 # Text speed (0=slow, 1=medium, 2=fast, 3=instant)
@battlescene = 0 # Battle effects (animations) (0=on, 1=off)
@battlestyle = 0 # Battle style (0=switch, 1=set)
@sendtoboxes = 0 # Send to Boxes (0=manual, 1=automatic)
@@ -422,7 +422,7 @@ MenuHandlers.add(:options_menu, :text_speed, {
"name" => _INTL("Text Speed"),
"order" => 30,
"type" => EnumOption,
"parameters" => [_INTL("Slow"), _INTL("Normal"), _INTL("Fast")],
"parameters" => [_INTL("Slow"), _INTL("Mid"), _INTL("Fast"), _INTL("Inst")],
"description" => _INTL("Choose the speed at which text appears."),
"on_select" => proc { |scene| scene.sprites["textbox"].letterbyletter = true },
"get_proc" => proc { next $PokemonSystem.textspeed },

View File

@@ -5,26 +5,20 @@ class PokemonBoxIcon < IconSprite
def initialize(pokemon, viewport = nil)
super(0, 0, viewport)
@pokemon = pokemon
@release = SpriteInterpolator.new
@startRelease = false
@release_timer_start = nil
refresh
end
def releasing?
return @release.tweening?
return !@release_timer_start.nil?
end
def release
self.ox = self.src_rect.width / 2 # 32
self.ox = self.src_rect.width / 2 # 32
self.oy = self.src_rect.height / 2 # 32
self.x += self.src_rect.width / 2 # 32
self.x += self.src_rect.width / 2 # 32
self.y += self.src_rect.height / 2 # 32
@release.tween(self,
[[SpriteInterpolator::ZOOM_X, 0],
[SpriteInterpolator::ZOOM_Y, 0],
[SpriteInterpolator::OPACITY, 0]],
100)
@startRelease = true
@release_timer_start = System.uptime
end
def refresh
@@ -35,9 +29,17 @@ class PokemonBoxIcon < IconSprite
def update
super
@release.update
self.color = Color.new(0, 0, 0, 0)
dispose if @startRelease && !releasing?
if releasing?
time_now = System.uptime
self.zoom_x = lerp(1.0, 0.0, 1.5, @release_timer_start, System.uptime)
self.zoom_y = self.zoom_x
self.opacity = lerp(255, 0, 1.5, @release_timer_start, System.uptime)
self.color = Color.new(0, 0, 0, 0)
if self.opacity == 0
@release_timer_start = nil
dispose
end
end
end
end

View File

@@ -35,11 +35,11 @@ def pbDrawGauge(bitmap, rect, color, value, maxValue)
end
end
def calcPoint(x, y, distance, angle) # angle in degrees
angle -= (angle / 360.0).floor * 360 # normalize
angle = (angle / 360.0) * (2 * Math::PI) # convert to radians
angle = -angle % (2 * Math::PI) # normalize radians
point = [(Math.cos(angle) * distance), (Math.sin(angle) * distance)]
def calcPoint(x, y, distance, angle) # angle in degrees
angle -= (angle / 360.0).floor * 360 # normalize
angle = (angle / 360.0) * (2 * Math::PI) # convert to radians
angle = -angle % (2 * Math::PI) # normalize radians
point = [distance * Math.cos(angle), distance * Math.sin(angle)]
point[0] += x
point[1] += y
return point
@@ -670,6 +670,9 @@ end
#
#===============================================================================
class DirectFlowDiagram
# Distance travelled by a dot in 1 second.
DOT_SPEED = 80
def initialize(viewport = nil)
@points = []
@angles = []
@@ -681,21 +684,25 @@ class DirectFlowDiagram
@distance = 96
end
def dispose
@points.each { |point| point.dispose }
end
# 0=none, 1=weak, 2=strong
def setFlowStrength(strength)
@strength = strength
end
def visible=(value)
@points.each do |point|
point.visible = value
end
@points.each { |point| point.visible = value }
end
def dispose
@points.each do |point|
point.dispose
end
def color=(value)
@points.each { |point| point.color = value }
end
def setAngle(angle1)
@angle = angle1 - ((angle1 / 360).floor * 360)
end
def ensurePoint(j)
@@ -725,18 +732,9 @@ class DirectFlowDiagram
end
i += (@strength == 2) ? 16 : 32
end
@offset += (@strength == 2) ? 3 : 2
@offset %= @distance
end
def color=(value)
@points.each do |point|
point.color = value
end
end
def setAngle(angle1)
@angle = angle1 - ((angle1 / 360).floor * 360)
offset_delta = System.uptime * DOT_SPEED
offset_delta *= 1.5 if @strength == 2
@offset = offset_delta % @distance
end
end
@@ -744,6 +742,9 @@ end
#
#===============================================================================
class FlowDiagram
# Distance travelled by a dot in 1 second.
DOT_SPEED = 80
def initialize(viewport = nil)
@points = []
@angles = []
@@ -755,21 +756,21 @@ class FlowDiagram
@distance = 96
end
# 0=none, 1=weak, 2=strong
def setFlowStrength(strength)
@strength = strength
def dispose
@points.each { |point| point.dispose }
end
def visible=(value)
@points.each do |point|
point.visible = value
end
@points.each { |point| point.visible = value }
end
def dispose
@points.each do |point|
point.dispose
end
def color=(value)
@points.each { |point| point.color = value }
end
# 0=none, 1=weak, 2=strong
def setFlowStrength(strength)
@strength = strength
end
def ensurePoint(j)
@@ -781,6 +782,15 @@ class FlowDiagram
@points[j].visible = (@strength != 0)
end
def setRange(angle1, angle2)
@startAngle = angle1 - ((angle1 / 360).floor * 360)
@endAngle = angle2 - ((angle2 / 360).floor * 360)
if @startAngle == @endAngle && angle1 != angle2
@startAngle = 0
@endAngle = 359.99
end
end
def withinRange(angle, startAngle, endAngle)
if startAngle > endAngle
return (angle >= startAngle || angle <= endAngle) &&
@@ -808,23 +818,9 @@ class FlowDiagram
end
i += (@strength == 2) ? 10 : 20
end
@offset -= (@strength == 2) ? 3 : 2
@offset %= (360 * 6)
end
def color=(value)
@points.each do |point|
point.color = value
end
end
def setRange(angle1, angle2)
@startAngle = angle1 - ((angle1 / 360).floor * 360)
@endAngle = angle2 - ((angle2 / 360).floor * 360)
if @startAngle == @endAngle && angle1 != angle2
@startAngle = 0
@endAngle = 359.99
end
offset_delta = -System.uptime * DOT_SPEED
offset_delta *= 1.5 if @strength == 2
@offset = offset_delta % (360 * 6)
end
end
@@ -870,7 +866,7 @@ class PurifyChamberSetView < Sprite
setcount.times do |i|
@flows[i] = FlowDiagram.new(self.viewport) if !@flows[i]
angle = 360 - (i * 360 / setcount)
angle += 90 # start at 12 not 3 o'clock
angle += 90 # start at 12 not 3 o'clock
endAngle = angle - (360 / setcount)
@flows[i].setRange(endAngle, angle)
@flows[i].setFlowStrength(@chamber[@set].affinity(i))
@@ -913,7 +909,7 @@ class PurifyChamberSetView < Sprite
if pos.nil?
@cursor = 0
else
pos -= (pos / points).floor * points # modulus
pos -= (pos / points).floor * points # modulus
pos *= 2 if @chamber.setCount(@set) == PurifyChamber::SETSIZE
@cursor = pos + 1
end

View File

@@ -216,19 +216,19 @@ class PokemonEntryScene
pbPlayDecisionSE
break
end
elsif index == -1 # Insert a space
elsif index == -1 # Insert a space
if @sprites["entry"].insert(" ")
pbPlayDecisionSE
else
pbPlayBuzzerSE
end
elsif index == -2 # Change character set
elsif index == -2 # Change character set
pbPlayDecisionSE
@symtype += 1
@symtype = 0 if @symtype >= @@Characters.length
@sprites["entry2"].setCharset(@@Characters[@symtype][0])
@sprites["entry2"].setOtherCharset(@@Characters[@symtype][1])
else # Insert given character
else # Insert given character
if @sprites["entry"].insert(@sprites["entry2"].character)
pbPlayDecisionSE
else