pokeradar

This commit is contained in:
infinitefusion
2022-01-02 14:05:29 -05:00
parent 1b0577139c
commit 1b931732a0
17 changed files with 137 additions and 76 deletions

View File

@@ -2,20 +2,16 @@ class PokemonGlobalMetadata
attr_accessor :pokeradarBattery
end
class PokemonTemp
attr_accessor :pokeradar # [species, level, chain count, grasses (x,y,ring,rarity)]
attr_accessor :pokeradar # [species, level, chain count, grasses (x,y,ring,rarity)]
end
################################################################################
# Using the Poke Radar
################################################################################
def pbCanUsePokeRadar?
# Can't use Radar if not in tall grass
terrain = $game_map.terrain_tag($game_player.x,$game_player.y)
terrain = $game_map.terrain_tag($game_player.x, $game_player.y)
if !terrain.land_wild_encounters || !terrain.shows_grass_rustle
pbMessage(_INTL("Can't use that here."))
return false
@@ -33,9 +29,9 @@ def pbCanUsePokeRadar?
# Debug
return true if $DEBUG && Input.press?(Input::CTRL)
# Can't use Radar if it isn't fully charged
if $PokemonGlobal.pokeradarBattery && $PokemonGlobal.pokeradarBattery>0
if $PokemonGlobal.pokeradarBattery && $PokemonGlobal.pokeradarBattery > 0
pbMessage(_INTL("The battery has run dry!\nFor it to recharge, you need to walk another {1} steps.",
$PokemonGlobal.pokeradarBattery))
$PokemonGlobal.pokeradarBattery))
return false
end
return true
@@ -43,12 +39,39 @@ end
def pbUsePokeRadar
return false if !pbCanUsePokeRadar?
$PokemonTemp.pokeradar = [0,0,0,[]] if !$PokemonTemp.pokeradar
$PokemonGlobal.pokeradarBattery = 50
$PokemonTemp.pokeradar = [0, 0, 0, []] if !$PokemonTemp.pokeradar
$PokemonGlobal.pokeradarBattery = Settings::POKERADAR_BATTERY_STEPS
rareAllowed = canEncounterRarePokemon()
playPokeradarLightAnimation(rareAllowed)
pbWait(20)
pbPokeRadarHighlightGrass
return true
end
#can only encounter rare if have seen every encounterable land pokemon on the route
def canEncounterRarePokemon()
processed = []
for encounter in $PokemonEncounters.listPossibleEncounters($PokemonEncounters.pbEncounterType)
species = encounter[0]
if !processed.include?(species)
if $Trainer.seen[species]
processed << species
else
return false
end
end
end
return true
end
def playPokeradarLightAnimation(rareAllowed = false)
if rareAllowed
$scene.spriteset.addUserAnimation(Settings::POKERADAR_LIGHT_ANIMATION_GREEN_ID, $game_player.x, $game_player.y, true)
else
$scene.spriteset.addUserAnimation(Settings::POKERADAR_LIGHT_ANIMATION_RED_ID, $game_player.x, $game_player.y, true)
end
end
def pbPokeRadarCancel
$PokemonTemp.pokeradar = nil
end
@@ -57,57 +80,49 @@ def listUnseenPokemonInCurrentRoute(encounterType)
processed = []
unseen = []
for encounter in $PokemonEncounters.listPossibleEncounters(encounterType)
species = encounter[0]
species = encounter[1]
if !processed.include?(species)
if $Trainer.seen?(species)
processed<<species
processed << species
else
unseen<<species
processed<<species
unseen << species
processed << species
end
end
end
return unseen
end
#can only encounter rare if have seen every encounterable land pokemon on the route
def canEncounterRarePokemon()
processed = []
for encounter in $PokemonEncounters.listPossibleEncounters($PokemonEncounters.pbEncounterType)
species = encounter[0]
if !processed.include?(species)
if $Trainer.seen[species]
processed<<species
else
return false
end
end
end
return true
#pokedex register seen doesn't work correctly so temporarily removed
unseenPokemon = listUnseenPokemonInCurrentRoute($PokemonEncounters.encounter_type)
return unseenPokemon.length == 0
end
def pbPokeRadarHighlightGrass(showmessage=true)
grasses = [] # x, y, ring (0-3 inner to outer), rarity
def pbPokeRadarHighlightGrass(showmessage = true)
grasses = [] # x, y, ring (0-3 inner to outer), rarity§
# Choose 1 random tile from each ring around the player
for i in 0...4
r = rand((i+1)*8)
r = rand((i + 1) * 8)
# Get coordinates of randomly chosen tile
x = $game_player.x
y = $game_player.y
if r<=(i+1)*2
x = $game_player.x-i-1+r
y = $game_player.y-i-1
elsif r<=(i+1)*6-2
x = [$game_player.x+i+1,$game_player.x-i-1][r%2]
y = $game_player.y-i+((r-1-(i+1)*2)/2).floor
if r <= (i + 1) * 2
x = $game_player.x - i - 1 + r
y = $game_player.y - i - 1
elsif r <= (i + 1) * 6 - 2
x = [$game_player.x + i + 1, $game_player.x - i - 1][r % 2]
y = $game_player.y - i + ((r - 1 - (i + 1) * 2) / 2).floor
else
x = $game_player.x-i+r-(i+1)*6
y = $game_player.y+i+1
x = $game_player.x - i + r - (i + 1) * 6
y = $game_player.y + i + 1
end
# Add tile to grasses array if it's a valid grass tile
if x>=0 && x<$game_map.width &&
y>=0 && y<$game_map.height
if x >= 0 && x < $game_map.width &&
y >= 0 && y < $game_map.height
terrain = $game_map.terrain_tag(x, y)
if terrain.land_wild_encounters && terrain.shows_grass_rustle
# Choose a rarity for the grass (0=normal, 1=rare, 2=shiny)
@@ -118,11 +133,11 @@ def pbPokeRadarHighlightGrass(showmessage=true)
v = rand(65536) / v
s = 2 if v == 0
end
grasses.push([x,y,i,s])
grasses.push([x, y, i, s])
end
end
end
if grasses.length==0
if grasses.length == 0
# No shaking grass found, break the chain
pbMessage(_INTL("The grassy patch remained quiet...")) if showmessage
pbPokeRadarCancel
@@ -130,16 +145,16 @@ def pbPokeRadarHighlightGrass(showmessage=true)
# Show grass rustling animations
for grass in grasses
case grass[3]
when 0 # Normal rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_NORMAL_ANIMATION_ID,grass[0],grass[1],true,1)
when 1 # Vigorous rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_VIGOROUS_ANIMATION_ID,grass[0],grass[1],true,1)
when 2 # Shiny rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_SHINY_ANIMATION_ID,grass[0],grass[1],true,1)
when 0 # Normal rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_NORMAL_ANIMATION_ID, grass[0], grass[1], true, 1)
when 1 # Vigorous rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_VIGOROUS_ANIMATION_ID, grass[0], grass[1], true, 1)
when 2 # Shiny rustle
$scene.spriteset.addUserAnimation(Settings::RUSTLE_SHINY_ANIMATION_ID, grass[0], grass[1], true, 1)
end
end
$PokemonTemp.pokeradar[3] = grasses if $PokemonTemp.pokeradar
pbWait(Graphics.frame_rate/2)
pbWait(Graphics.frame_rate / 2)
end
end
@@ -186,16 +201,16 @@ end
################################################################################
EncounterModifier.register(proc { |encounter|
if GameData::EncounterType.get($PokemonTemp.encounterType).type != :land ||
$PokemonGlobal.bicycle || $PokemonGlobal.partner
$PokemonGlobal.bicycle || $PokemonGlobal.partner
pbPokeRadarCancel
next encounter
end
ring = pbPokeRadarGetShakingGrass
if ring >= 0 # Encounter triggered by stepping into rustling grass
if ring >= 0 # Encounter triggered by stepping into rustling grass
# Get rarity of shaking grass
rarity = 0 # 0 = rustle, 1 = vigorous rustle, 2 = shiny rustle
rarity = 0 # 0 = rustle, 1 = vigorous rustle, 2 = shiny rustle
$PokemonTemp.pokeradar[3].each { |g| rarity = g[3] if g[2] == ring }
if $PokemonTemp.pokeradar[2] > 0 # Chain count, i.e. is chaining
if $PokemonTemp.pokeradar[2] > 0 # Chain count, i.e. is chaining
if rarity == 2 || rand(100) < 86 + ring * 4 + ($PokemonTemp.pokeradar[2] / 4).floor
# Continue the chain
encounter = [$PokemonTemp.pokeradar[0], $PokemonTemp.pokeradar[1]]
@@ -208,67 +223,69 @@ EncounterModifier.register(proc { |encounter|
end
pbPokeRadarCancel
end
else # Not chaining; will start one
else
# Not chaining; will start one
# Force random wild encounter, vigorous shaking means rarer species
encounter = pbPokeRadarGetEncounter(rarity)
$PokemonTemp.forceSingleBattle = true
end
else # Encounter triggered by stepping in non-rustling grass
pbPokeRadarCancel if encounter
else
# Encounter triggered by stepping in non-rustling grass
pbPokeRadarCancel if encounter && $PokemonGlobal.repel <= 0
end
next encounter
})
Events.onWildPokemonCreate += proc { |_sender,e|
Events.onWildPokemonCreate += proc { |_sender, e|
pokemon = e[0]
next if !$PokemonTemp.pokeradar
grasses = $PokemonTemp.pokeradar[3]
next if !grasses
for grass in grasses
next if $game_player.x!=grass[0] || $game_player.y!=grass[1]
pokemon.shiny = true if grass[3]==2
next if $game_player.x != grass[0] || $game_player.y != grass[1]
pokemon.shiny = true if grass[3] == 2
break
end
}
Events.onWildBattleEnd += proc { |_sender,e|
species = e[0]
level = e[1]
Events.onWildBattleEnd += proc { |_sender, e|
species = e[0]
level = e[1]
decision = e[2]
if $PokemonTemp.pokeradar && (decision==1 || decision==4) # Defeated/caught
if $PokemonTemp.pokeradar && (decision == 1 || decision == 4) # Defeated/caught
$PokemonTemp.pokeradar[0] = species
$PokemonTemp.pokeradar[1] = level
$PokemonTemp.pokeradar[2] += 1
$PokemonTemp.pokeradar[2] = 40 if $PokemonTemp.pokeradar[2]>40
$PokemonTemp.pokeradar[2] = 40 if $PokemonTemp.pokeradar[2] > 40
pbPokeRadarHighlightGrass(false)
else
pbPokeRadarCancel
end
}
Events.onStepTaken += proc { |_sender,_e|
Events.onStepTaken += proc { |_sender, _e|
if $PokemonGlobal.pokeradarBattery && $PokemonGlobal.pokeradarBattery > 0 &&
!$PokemonTemp.pokeradar
!$PokemonTemp.pokeradar
$PokemonGlobal.pokeradarBattery -= 1
end
terrain = $game_map.terrain_tag($game_player.x,$game_player.y)
terrain = $game_map.terrain_tag($game_player.x, $game_player.y)
if !terrain.land_wild_encounters || !terrain.shows_grass_rustle
pbPokeRadarCancel
end
}
Events.onMapChange += proc { |_sender,_e|
Events.onMapChange += proc { |_sender, _e|
pbPokeRadarCancel
}
################################################################################
# Item handlers
################################################################################
ItemHandlers::UseInField.add(:POKERADAR,proc { |item|
ItemHandlers::UseInField.add(:POKERADAR, proc { |item|
next (pbCanUsePokeRadar?) ? pbUsePokeRadar : 0
})
ItemHandlers::UseFromBag.add(:POKERADAR,proc { |item|
ItemHandlers::UseFromBag.add(:POKERADAR, proc { |item|
next (pbCanUsePokeRadar?) ? 2 : 0
})