Converted Shadow Pokémon PBS file to a section-based format, improved Shadow Pokémon mechanics

This commit is contained in:
Maruno17
2021-11-21 00:44:41 +00:00
parent 048a18b415
commit b445f26a88
25 changed files with 761 additions and 204 deletions

View File

@@ -231,6 +231,7 @@ module GameData
BerryPlant.load
Species.load
SpeciesMetrics.load
ShadowPokemon.load
Ribbon.load
Encounter.load
TrainerType.load

View File

@@ -4,7 +4,6 @@
class Game_Temp
attr_accessor :town_map_data
attr_accessor :phone_messages_data
attr_accessor :shadow_movesets_data
attr_accessor :regional_dexes_data
attr_accessor :battle_animations_data
attr_accessor :move_to_battle_animation_data
@@ -15,7 +14,6 @@ def pbClearData
if $game_temp
$game_temp.town_map_data = nil
$game_temp.phone_messages_data = nil
$game_temp.shadow_movesets_data = nil
$game_temp.regional_dexes_data = nil
$game_temp.battle_animations_data = nil
$game_temp.move_to_battle_animation_data = nil
@@ -52,17 +50,6 @@ def pbLoadPhoneData
return $game_temp.phone_messages_data
end
#===============================================================================
# Method to get Shadow Pokémon moveset data.
#===============================================================================
def pbLoadShadowMovesets
$game_temp = Game_Temp.new if !$game_temp
if !$game_temp.shadow_movesets_data
$game_temp.shadow_movesets_data = load_data("Data/shadow_movesets.dat") || []
end
return $game_temp.shadow_movesets_data
end
#===============================================================================
# Method to get Regional Dexes data.
#===============================================================================

View File

@@ -0,0 +1,32 @@
module GameData
class ShadowPokemon
attr_reader :id
attr_reader :moves
attr_reader :gauge_size
attr_reader :flags
DATA = {}
DATA_FILENAME = "shadow_pokemon.dat"
SCHEMA = {
"GaugeSize" => [:gauge_size, "v"],
"Moves" => [:moves, "*s"], # Not enumerated when compiled
"Flags" => [:flags, "*s"]
}
HEART_GAUGE_SIZE = 4000 # Default gauge size
extend ClassMethodsSymbols
include InstanceMethods
def initialize(hash)
@id = hash[:id]
@moves = hash[:moves] || []
@gauge_size = hash[:gauge_size] || HEART_GAUGE_SIZE
@flags = hash[:flags] || []
end
def has_flag?(flag)
return @flags.any? { |f| f.downcase == flag.downcase }
end
end
end

View File

@@ -71,7 +71,7 @@ class Battle
evYield.each_key { |stat| evYield[stat] *= 2 }
end
# Gain EVs for each stat in turn
if pkmn.shadowPokemon? && pkmn.saved_ev
if pkmn.shadowPokemon? && pkmn.heartStage <= 3 && pkmn.saved_ev
pkmn.saved_ev.each_value { |e| evTotal += e }
GameData::Stat.each_main do |s|
evGain = evYield[s.id].clamp(0, Pokemon::EV_STAT_LIMIT - pkmn.ev[s.id] - pkmn.saved_ev[s.id])
@@ -178,11 +178,14 @@ class Battle
pkmn.name,debugInfo))
end
# Give Exp
$stats.total_exp_gained += expGained
if pkmn.shadowPokemon?
pkmn.exp += expGained
if pkmn.heartStage <= 3
pkmn.exp += expGained
$stats.total_exp_gained += expGained
end
return
end
$stats.total_exp_gained += expGained
tempExp1 = pkmn.exp
battler = pbFindBattler(idxParty)
loop do # For each level gained in turn...

View File

@@ -43,7 +43,7 @@ class Battle
if battler.shadowPokemon?
if battler.inHyperMode?
battler.pokemon.hyper_mode = false
battler.pokemon.adjustHeart(-300)
battler.pokemon.change_heart_gauge("call")
pbDisplay(_INTL("{1} came to its senses from the Trainer's call!",battler.pbThis))
else
pbDisplay(_INTL("But nothing happened!"))

View File

@@ -574,7 +574,6 @@ class Battle
if b.inHyperMode?
if pbRandom(100)<10
b.pokemon.hyper_mode = false
b.pokemon.adjustHeart(-50)
pbDisplay(_INTL("{1} came to its senses!",b.pbThis))
else
pbDisplay(_INTL("{1} is in Hyper Mode!",b.pbThis))

View File

@@ -34,7 +34,7 @@ class Battle::Move::Confusion < Battle::Move
@pp = -1
@target = 0
@priority = 0
@flags = ""
@flags = []
@addlEffect = 0
@calcType = nil
@powerBoost = false
@@ -63,7 +63,7 @@ class Battle::Move::Struggle < Battle::Move
@pp = -1
@target = 0
@priority = 0
@flags = ""
@flags = ["Contact", "CanProtect"]
@addlEffect = 0
@calcType = nil
@powerBoost = false

View File

@@ -187,9 +187,7 @@ class Battle::Battler
def pbInitPokemon(*arg)
if self.pokemonIndex>0 && inHyperMode?
# Called out of Hyper Mode
self.pokemon.hyper_mode = false
self.pokemon.adjustHeart(-50)
end
__shadow__pbInitPokemon(*arg)
# Called into battle
@@ -198,7 +196,7 @@ class Battle::Battler
self.type1 = :SHADOW
self.type2 = :SHADOW
end
self.pokemon.adjustHeart(-30) if pbOwnedByPlayer?
self.pokemon.change_heart_gauge("battle") if pbOwnedByPlayer?
end
end
@@ -216,7 +214,7 @@ class Battle::Battler
def pbHyperMode
return if fainted? || !shadowPokemon? || inHyperMode? || !pbOwnedByPlayer?
p = self.pokemon
if @battle.pbRandom(p.heart_gauge) <= Pokemon::HEART_GAUGE_SIZE / 4
if @battle.pbRandom(p.heart_gauge) <= p.max_gauge_size / 4
p.hyper_mode = true
@battle.pbDisplay(_INTL("{1}'s emotions rose to a fever pitch!\nIt entered Hyper Mode!",self.pbThis))
end
@@ -234,39 +232,37 @@ end
#===============================================================================
# Shadow item effects.
#===============================================================================
def pbRaiseHappinessAndReduceHeart(pkmn, scene, heart_amount)
def pbRaiseHappinessAndReduceHeart(pkmn, scene, multiplier)
if !pkmn.shadowPokemon? || (pkmn.happiness == 255 && pkmn.heart_gauge == 0)
scene.pbDisplay(_INTL("It won't have any effect."))
return false
end
if pkmn.happiness == 255
stage = pkmn.heart_gauge
pkmn.adjustHeart(-heart_amount)
scene.pbDisplay(_INTL("{1} adores you!\nThe door to its heart opened a little.", pkmn.name))
pkmn.check_ready_to_purify if pkmn.heart_gauge != stage
elsif pkmn.heart_gauge == 0
pkmn.changeHappiness("vitamin")
old_gauge = pkmn.heart_gauge
old_happiness = pkmn.happiness
pkmn.changeHappiness("vitamin")
pkmn.change_heart_gauge("scent", multiplier)
if pkmn.heart_gauge == old_gauge
scene.pbDisplay(_INTL("{1} turned friendly.", pkmn.name))
elsif pkmn.happiness == old_happiness
scene.pbDisplay(_INTL("{1} adores you!\nThe door to its heart opened a little.", pkmn.name))
pkmn.check_ready_to_purify
else
stage = pkmn.heart_gauge
pkmn.changeHappiness("vitamin")
pkmn.adjustHeart(-heart_amount)
scene.pbDisplay(_INTL("{1} turned friendly.\nThe door to its heart opened a little.", pkmn.name))
pkmn.check_ready_to_purify if pkmn.heart_gauge != stage
pkmn.check_ready_to_purify
end
return true
end
ItemHandlers::UseOnPokemon.add(:JOYSCENT,proc { |item,pokemon,scene|
pbRaiseHappinessAndReduceHeart(pokemon,scene,500)
pbRaiseHappinessAndReduceHeart(pokemon, scene, 1)
})
ItemHandlers::UseOnPokemon.add(:EXCITESCENT,proc { |item,pokemon,scene|
pbRaiseHappinessAndReduceHeart(pokemon,scene,1000)
pbRaiseHappinessAndReduceHeart(pokemon, scene, 2)
})
ItemHandlers::UseOnPokemon.add(:VIVIDSCENT,proc { |item,pokemon,scene|
pbRaiseHappinessAndReduceHeart(pokemon,scene,2000)
pbRaiseHappinessAndReduceHeart(pokemon, scene, 3)
})
ItemHandlers::UseOnPokemon.add(:TIMEFLUTE,proc { |item,pokemon,scene|
@@ -291,21 +287,21 @@ ItemHandlers::CanUseInBattle.copy(:JOYSCENT,:EXCITESCENT,:VIVIDSCENT)
ItemHandlers::BattleUseOnBattler.add(:JOYSCENT,proc { |item,battler,scene|
battler.pokemon.hyper_mode = false
battler.pokemon.adjustHeart(-100)
battler.pokemon.change_heart_gauge("scent", 1)
scene.pbDisplay(_INTL("{1} came to its senses from the {2}!",battler.pbThis,GameData::Item.get(item).name))
next true
})
ItemHandlers::BattleUseOnBattler.add(:EXCITESCENT,proc { |item,battler,scene|
battler.pokemon.hyper_mode = false
battler.pokemon.adjustHeart(-200)
battler.pokemon.change_heart_gauge("scent", 2)
scene.pbDisplay(_INTL("{1} came to its senses from the {2}!",battler.pbThis,GameData::Item.get(item).name))
next true
})
ItemHandlers::BattleUseOnBattler.add(:VIVIDSCENT,proc { |item,battler,scene|
battler.pokemon.hyper_mode = false
battler.pokemon.adjustHeart(-300)
battler.pokemon.change_heart_gauge("scent", 3)
scene.pbDisplay(_INTL("{1} came to its senses from the {2}!",battler.pbThis,GameData::Item.get(item).name))
next true
})
@@ -416,25 +412,23 @@ Events.onEndBattle += proc { |_sender,_e|
}
Events.onStepTaken += proc {
for pkmn in $player.able_party
$player.able_party.each do |pkmn|
next if pkmn.heart_gauge == 0
stage = pkmn.heartStage
pkmn.adjustHeart(-1)
case pkmn.heartStage
when 0
pkmn.check_ready_to_purify
when stage
else
pkmn.update_shadow_moves
pkmn.heart_gauge_step_counter = 0 if !pkmn.heart_gauge_step_counter
pkmn.heart_gauge_step_counter += 1
if pkmn.heart_gauge_step_counter >= 256
old_stage = pkmn.heartStage
pkmn.change_heart_gauge("walking")
new_stage = pkmn.heartStage
if new_stage == 0
pkmn.check_ready_to_purify
elsif new_stage != old_stage
pkmn.update_shadow_moves
end
pkmn.heart_gauge_step_counter = 0
end
end
if ($PokemonGlobal.purifyChamber rescue nil)
$PokemonGlobal.purifyChamber.update
end
$PokemonGlobal.day_care.slots.each do |slot|
next if !slot.filled? || !slot.pokemon.shadowPokemon?
old_stage = slot.pokemon.heartStage
slot.pokemon.adjustHeart(-1)
slot.pokemon.update_shadow_moves if slot.pokemon.heartStage != old_stage
end
}

View File

@@ -8,7 +8,7 @@ class Pokemon
attr_accessor :saved_exp
attr_accessor :saved_ev
attr_accessor :shadow_moves
HEART_GAUGE_SIZE = 3840
attr_accessor :heart_gauge_step_counter
alias :__shadow_expeq :exp=
def exp=(value)
@@ -29,15 +29,74 @@ class Pokemon
return @heart_gauge || 0
end
def shadow_data
ret = GameData::ShadowPokemon.try_get(species_data.id)
ret = GameData::ShadowPokemon.try_get(@species) if !ret
return ret
end
def max_gauge_size
data = shadow_data
return (data) ? data.gauge_size : GameData::ShadowPokemon::HEART_GAUGE_SIZE
end
def adjustHeart(value)
return if !shadowPokemon?
@heart_gauge = (self.heart_gauge + value).clamp(0, HEART_GAUGE_SIZE)
@heart_gauge = (self.heart_gauge + value).clamp(0, max_gauge_size)
end
def change_heart_gauge(method, multiplier = 1)
return if !shadowPokemon?
heart_amounts = {
# [sending into battle, call to, walking 256 steps, using scent]
:HARDY => [110, 300, 100, 90],
:LONELY => [ 70, 330, 100, 130],
:BRAVE => [130, 270, 90, 80],
:ADAMANT => [110, 270, 110, 80],
:NAUGHTY => [120, 270, 110, 70],
:BOLD => [110, 270, 90, 100],
:DOCILE => [100, 360, 80, 120],
:RELAXED => [ 90, 270, 110, 100],
:IMPISH => [120, 300, 100, 80],
:LAX => [100, 270, 90, 110],
:TIMID => [ 70, 330, 110, 120],
:HASTY => [130, 300, 70, 100],
:SERIOUS => [100, 330, 110, 90],
:JOLLY => [120, 300, 90, 90],
:NAIVE => [100, 300, 120, 80],
:MODEST => [ 70, 300, 120, 110],
:MILD => [ 80, 270, 100, 120],
:QUIET => [100, 300, 100, 100],
:BASHFUL => [ 80, 300, 90, 130],
:RASH => [ 90, 300, 90, 120],
:CALM => [ 80, 300, 110, 110],
:GENTLE => [ 70, 300, 130, 100],
:SASSY => [130, 240, 100, 70],
:CAREFUL => [ 90, 300, 100, 110],
:QUIRKY => [130, 270, 80, 90]
}
amt = 100
case method
when "battle"
amt = (heart_amounts[@nature]) ? heart_amounts[@nature][0] : 100
when "call"
amt = (heart_amounts[@nature]) ? heart_amounts[@nature][1] : 300
when "walking"
amt = (heart_amounts[@nature]) ? heart_amounts[@nature][2] : 100
when "scent"
amt = (heart_amounts[@nature]) ? heart_amounts[@nature][3] : 100
amt *= multiplier
else
raise _INTL("Unknown heart gauge-changing method: {1}", method.to_s)
end
adjustHeart(-amt)
end
def heartStage
return 0 if !shadowPokemon?
stage_size = HEART_GAUGE_SIZE / 5.0
return ([self.heart_gauge, HEART_GAUGE_SIZE].min / stage_size).ceil
max_size = max_gauge_size
stage_size = max_size / 5.0
return ([self.heart_gauge, max_size].min / stage_size).ceil
end
def shadowPokemon?
@@ -48,36 +107,42 @@ class Pokemon
return (self.heart_gauge == 0 || @hp == 0) ? false : @hyper_mode
end
alias __shadow__changeHappiness changeHappiness
def changeHappiness(method)
return if shadowPokemon? && heartStage >= 4
__shadow__changeHappiness(method)
end
def makeShadow
@shadow = true
@heart_gauge = HEART_GAUGE_SIZE
@hyper_mode = false
@saved_exp = 0
@saved_ev = {}
GameData::Stat.each_main { |s| @saved_ev[s.id] = 0 }
@heart_gauge = max_gauge_size
@heart_gauge_step_counter = 0
@shadow_moves = []
# Retrieve Shadow moveset for this Pokémon
shadow_moveset = pbLoadShadowMovesets[species_data.id]
shadow_moveset = pbLoadShadowMovesets[@species] if !shadow_moveset || shadow_moveset.length == 0
data = shadow_data
# Record this Pokémon's Shadow moves
if shadow_moveset && shadow_moveset.length > 0
for i in 0...[shadow_moveset.length, MAX_MOVES].min
@shadow_moves[i] = shadow_moveset[i]
if data
data.moves.each do |m|
@shadow_moves.push(m.to_sym) if GameData::Move.exists?(m.to_sym)
break if @shadow_moves.length >= MAX_MOVES
end
elsif GameData::Move.exists?(:SHADOWRUSH)
# No Shadow moveset defined; just use Shadow Rush
@shadow_moves[0] = :SHADOWRUSH
else
raise _INTL("Expected Shadow moves or Shadow Rush to be defined, but they weren't.")
end
if @shadow_moves.empty? && GameData::Move.exists?(:SHADOWRUSH)
@shadow_moves.push(:SHADOWRUSH)
end
# Record this Pokémon's original moves
@moves.each_with_index { |m, i| @shadow_moves[MAX_MOVES + i] = m.id }
# Update moves
update_shadow_moves
if !@shadow_moves.empty?
@moves.each_with_index { |m, i| @shadow_moves[MAX_MOVES + i] = m.id }
update_shadow_moves
end
end
def update_shadow_moves(relearn_all_moves = false)
return if !@shadow_moves
return if !@shadow_moves || @shadow_moves.empty?
# Not a Shadow Pokémon (any more); relearn all its original moves
if !shadowPokemon?
if @shadow_moves.length > MAX_MOVES

View File

@@ -375,7 +375,7 @@ class PokemonSummary_Scene
dexNumShadow = (@pokemon.shiny?) ? Color.new(224,152,144) : Color.new(176,176,176)
# If a Shadow Pokémon, draw the heart gauge area and bar
if @pokemon.shadowPokemon?
shadowfract = @pokemon.heart_gauge.to_f / Pokemon::HEART_GAUGE_SIZE
shadowfract = @pokemon.heart_gauge.to_f / @pokemon.max_gauge_size
imagepos = [
["Graphics/Pictures/Summary/overlay_shadow",224,240],
["Graphics/Pictures/Summary/overlay_shadowbar",242,280,0,0,(shadowfract*248).floor,-1]
@@ -632,7 +632,7 @@ class PokemonSummary_Scene
# Determine which stats are boosted and lowered by the Pokémon's nature
statshadows = {}
GameData::Stat.each_main { |s| statshadows[s.id] = shadow }
if !@pokemon.shadowPokemon? || @pokemon.heartStage > 3
if !@pokemon.shadowPokemon? || @pokemon.heartStage <= 3
@pokemon.nature_for_stats.stat_changes.each do |change|
statshadows[change[0]] = Color.new(136,96,72) if change[1] > 0
statshadows[change[0]] = Color.new(64,120,152) if change[1] < 0

View File

@@ -666,8 +666,9 @@ class Window_PurifyChamberSets < Window_DrawableCommand
end
if @chamber.getShadow(index)
pbDrawGauge(self.contents, Rect.new(rect.x+16,rect.y+18,48,8),
Color.new(192,0,256), @chamber.getShadow(index).heart_gauge,
Pokemon::HEART_GAUGE_SIZE)
Color.new(192,0,256),
@chamber.getShadow(index).heart_gauge,
@chamber.getShadow(index).max_gauge_size)
end
pbDrawTextPositions(self.contents,textpos)
end
@@ -957,7 +958,7 @@ class PurifyChamberSetView < SpriteWrapper
Color.new(248,248,248),Color.new(128,128,128)])
# draw heart gauge
pbDrawGauge(@info.bitmap, Rect.new(@info.bitmap.width*3/4,8,@info.bitmap.width*1/4,8),
Color.new(192,0,256), pkmn.heart_gauge, Pokemon::HEART_GAUGE_SIZE)
Color.new(192,0,256), pkmn.heart_gauge, pkmn.max_gauge_size)
# draw flow gauge
pbDrawGauge(@info.bitmap,Rect.new(@info.bitmap.width*3/4,24+8,@info.bitmap.width*1/4,8),
Color.new(0,0,248),@chamber.chamberFlow(@set),6)

View File

@@ -1144,7 +1144,7 @@ DebugMenuCommands.register("createpbs", {
"pokemon_metrics.txt",
"regional_dexes.txt",
"ribbons.txt",
"shadow_movesets.txt",
"shadow_pokemon.txt",
"town_map.txt",
"trainer_types.txt",
"trainers.txt",
@@ -1169,7 +1169,7 @@ DebugMenuCommands.register("createpbs", {
when 13 then Compiler.write_pokemon_metrics
when 14 then Compiler.write_regional_dexes
when 15 then Compiler.write_ribbons
when 16 then Compiler.write_shadow_movesets
when 16 then Compiler.write_shadow_pokemon
when 17 then Compiler.write_town_map
when 18 then Compiler.write_trainer_types
when 19 then Compiler.write_trainers

View File

@@ -1132,10 +1132,10 @@ PokemonDebugMenuCommands.register("shadowpkmn", {
if pkmn.shadowPokemon?
oldheart = pkmn.heart_gauge
params = ChooseNumberParams.new
params.setRange(0, Pokemon::HEART_GAUGE_SIZE)
params.setRange(0, pkmn.max_gauge_size)
params.setDefaultValue(pkmn.heart_gauge)
val = pbMessageChooseNumber(
_INTL("Set the heart gauge (max. {1}).", Pokemon::HEART_GAUGE_SIZE),
_INTL("Set the heart gauge (max. {1}).", pkmn.max_gauge_size),
params) { screen.pbUpdate }
if val != oldheart
pkmn.adjustHeart(val - oldheart)

View File

@@ -729,7 +729,7 @@ module Compiler
compile_pokemon # Depends on Move, Item, Type, Ability
compile_pokemon_forms # Depends on Species, Move, Item, Type, Ability
compile_pokemon_metrics # Depends on Species
compile_shadow_movesets # Depends on Species, Move
compile_shadow_pokemon # Depends on Species
compile_regional_dexes # Depends on Species
compile_ribbons # No dependencies
compile_encounters # Depends on Species
@@ -768,7 +768,7 @@ module Compiler
"player_metadata.dat",
"regional_dexes.dat",
"ribbons.dat",
"shadow_movesets.dat",
"shadow_pokemon.dat",
"species.dat",
"species_metrics.dat",
"town_map.dat",
@@ -793,7 +793,7 @@ module Compiler
"pokemon_metrics.txt",
"regional_dexes.txt",
"ribbons.txt",
"shadow_movesets.txt",
"shadow_pokemon.txt",
"town_map.txt",
"trainer_types.txt",
"trainers.txt",

View File

@@ -368,8 +368,8 @@ module Compiler
flags.push("CanMirrorMove") if line[12][/e/]
flags.push("ThawsUser") if line[12][/g/]
flags.push("HighCriticalHitRate") if line[12][/h/]
flags.push("Bite") if line[12][/i/]
flags.push("Punch") if line[12][/j/]
flags.push("Biting") if line[12][/i/]
flags.push("Punching") if line[12][/j/]
flags.push("Sound") if line[12][/k/]
flags.push("Powder") if line[12][/l/]
flags.push("Pulse") if line[12][/m/]
@@ -969,33 +969,68 @@ module Compiler
end
#=============================================================================
# Compile Shadow movesets
# Compile Shadow Pokémon data
#=============================================================================
def compile_shadow_movesets(path = "PBS/shadow_movesets.txt")
def compile_shadow_pokemon(path = "PBS/shadow_pokemon.txt")
compile_pbs_file_message_start(path)
sections = {}
if safeExists?(path)
idx = 0
pbCompilerEachCommentedLine(path) { |line, _line_no|
if line[/^\s*(\w+)\s*=\s*(.*)$/]
echo "." if idx % 50 == 0
idx += 1
Graphics.update if idx % 250 == 0
GameData::ShadowPokemon::DATA.clear
schema = GameData::ShadowPokemon::SCHEMA
shadow_hash = nil
old_format = nil
# Read each line of shadow_pokemon.txt at a time and compile it into a
# Shadow Pokémon's data
idx = 0
pbCompilerEachPreppedLine(path) { |line, line_no|
echo "." if idx % 250 == 0
idx += 1
if line[/^\s*\[\s*(.+)\s*\]\s*$/] # New section [species_id]
old_format = false if old_format.nil?
if old_format
raise _INTL("Can't mix old and new formats.\r\n{1}", FileLineData.linereport)
end
# Add previous Shadow Pokémon's data to records
GameData::ShadowPokemon.register(shadow_hash) if shadow_hash
# Parse species ID
species_id = $~[1].to_sym
if GameData::ShadowPokemon.exists?(species_id)
raise _INTL("Shadow Pokémon data for species '{1}' is defined twice.\r\n{2}", species_id, FileLineData.linereport)
end
# Construct Shadow Pokémon hash
shadow_hash = {
:id => species_id
}
elsif line[/^\s*(\w+)\s*=\s*(.*)\s*$/] # XXX=YYY lines
old_format = true if old_format.nil?
if old_format
key = $1
value = $2
value = value.split(",")
species = parseSpecies(key)
moves = []
for i in 0...[Pokemon::MAX_MOVES, value.length].min
move = parseMove(value[i], true)
moves.push(move) if move
end
moves.compact!
sections[species] = moves if moves.length > 0
value.each { |val| val.strip! }
value.delete_if { |val| nil_or_empty?(val) }
# Construct Shadow Pokémon hash
shadow_hash = {
:id => species,
:moves => value
}
# Add Shadow Pokémons data to records
GameData::ShadowPokemon.register(shadow_hash)
shadow_hash = nil
else
# Parse property and value
property_name = $~[1]
line_schema = schema[property_name]
next if !line_schema
property_value = pbGetCsvRecord($~[2], line_no, line_schema)
# Record XXX=YYY setting
shadow_hash[line_schema[0]] = property_value
end
}
end
save_data(sections, "Data/shadow_movesets.dat")
end
}
# Add last item's data to records
GameData::ShadowPokemon.register(shadow_hash) if shadow_hash
# Save all data
GameData::ShadowPokemon.save
process_pbs_file_message_end
end

View File

@@ -513,21 +513,21 @@ module Compiler
end
#=============================================================================
# Save Shadow movesets to PBS file
# Save Shadow Pokémon data to PBS file
#=============================================================================
def write_shadow_movesets(path = "PBS/shadow_movesets.txt")
def write_shadow_pokemon(path = "PBS/shadow_pokemon.txt")
write_pbs_file_message_start(path)
shadow_movesets = pbLoadShadowMovesets
File.open(path, "wb") { |f|
idx = 0
add_PBS_header_to_file(f)
f.write("\#-------------------------------\r\n")
GameData::Species.each do |species_data|
GameData::ShadowPokemon.each do |shadow|
echo "." if idx % 150 == 0
idx += 1
moveset = shadow_movesets[species_data.id]
next if !moveset || moveset.length == 0
f.write(sprintf("%s = %s\r\n", species_data.id, moveset.join(",")))
f.write("\#-------------------------------\r\n")
f.write(sprintf("[%s]\r\n", shadow.id))
f.write(sprintf("GaugeSize = %d\r\n", shadow.gauge_size))
f.write(sprintf("Moves = %s\r\n", shadow.moves.join(","))) if shadow.moves.length > 0
f.write(sprintf("Flags = %s\r\n", shadow.flags.join(","))) if shadow.flags.length > 0
end
}
process_pbs_file_message_end
@@ -901,7 +901,7 @@ module Compiler
write_pokemon
write_pokemon_forms
write_pokemon_metrics
write_shadow_movesets
write_shadow_pokemon
write_regional_dexes
write_ribbons
write_encounters

View File

@@ -1,85 +0,0 @@
# See the documentation on the wiki to learn how to edit this file.
#-------------------------------
BUTTERFREE = SHADOWRUSH,SHADOWMIST
BEEDRILL = SHADOWBLITZ,SHADOWHOLD
PIDGEOTTO = SHADOWBLITZ,SHADOWPANIC
RATICATE = SHADOWRUSH,SHADOWDOWN
SPEAROW = SHADOWBLITZ,SHADOWPANIC
ARBOK = SHADOWRUSH,SHADOWHALF
VULPIX = SHADOWHOLD,SHADOWWAVE
PARAS = SHADOWBLITZ,SHADOWSHED
VENOMOTH = SHADOWRUSH,SHADOWMIST
DUGTRIO = SHADOWBREAK,SHADOWSHED,SHADOWSKY
MEOWTH = SHADOWRUSH,SHADOWHOLD
GOLDUCK = SHADOWRAVE,SHADOWMIST
PRIMEAPE = SHADOWSTORM,SHADOWRUSH
GROWLITHE = SHADOWBLITZ,SHADOWWAVE
POLIWRATH = SHADOWSTORM,SHADOWRUSH,SHADOWSKY
WEEPINBELL = SHADOWRAVE,SHADOWHOLD
RAPIDASH = SHADOWRAVE,SHADOWSKY,SHADOWDOWN
MAGNETON = SHADOWHOLD,SHADOWRAVE,SHADOWSKY
FARFETCHD = SHADOWBREAK,SHADOWSKY,SHADOWPANIC
DODRIO = SHADOWBLITZ,SHADOWSHED
SEEL = SHADOWWAVE,SHADOWMIST
GRIMER = SHADOWBLITZ,SHADOWHOLD
SHELLDER = SHADOWBLITZ,SHADOWSHED
HYPNO = SHADOWSTORM,SHADOWDOWN
VOLTORB = SHADOWRUSH,SHADOWPANIC
EXEGGUTOR = SHADOWSTORM,SHADOWSHED,SHADOWHOLD,SHADOWEND
MAROWAK = SHADOWEND,SHADOWPANIC
HITMONLEE = SHADOWRUSH,SHADOWDOWN,SHADOWHALF
HITMONCHAN = SHADOWRUSH,SHADOWDOWN
LICKITUNG = SHADOWRUSH,SHADOWPANIC
RHYDON = SHADOWEND,SHADOWPANIC,SHADOWDOWN,SHADOWHOLD
CHANSEY = SHADOWRAVE,SHADOWHOLD
TANGELA = SHADOWRAVE,SHADOWHOLD
KANGASKHAN = SHADOWRUSH,SHADOWMIST
STARMIE = SHADOWSTORM,SHADOWMIST,SHADOWBREAK
MRMIME = SHADOWSTORM,SHADOWSHED
SCYTHER = SHADOWRUSH,SHADOWMIST
ELECTABUZZ = SHADOWSTORM,SHADOWMIST,SHADOWHALF,SHADOWBREAK
MAGMAR = SHADOWRAVE,SHADOWRUSH,SHADOWSHED
PINSIR = SHADOWBREAK,SHADOWSHED
TAUROS = SHADOWHOLD,SHADOWSHED,SHADOWRUSH,SHADOWSKY
LAPRAS = SHADOWSTORM,SHADOWSHED,SHADOWSKY
SNORLAX = SHADOWEND,SHADOWSHED
ARTICUNO = SHADOWCHILL,SHADOWSHED,SHADOWRUSH,SHADOWSKY
ZAPDOS = SHADOWBOLT,SHADOWRUSH,SHADOWSKY,SHADOWSHED
MOLTRES = SHADOWFIRE,SHADOWSHED,SHADOWMIST,SHADOWBREAK
DRAGONITE = SHADOWDOWN,SHADOWRUSH,SHADOWSHED,SHADOWSTORM
LEDYBA = SHADOWBLITZ,SHADOWSHED
SPINARAK = SHADOWBLITZ,SHADOWMIST
TOGEPI = SHADOWRAVE,SHADOWSHED
NATU = SHADOWBLITZ,SHADOWSHED
MAREEP = SHADOWBLITZ,SHADOWSHED
PINECO = SHADOWBLITZ,SHADOWSHED
TEDDIURSA = SHADOWBLITZ,SHADOWMIST
MAGCARGO = SHADOWRAVE,SHADOWSHED
SWINUB = SHADOWBLITZ,SHADOWWAVE
HOUNDOUR = SHADOWBLITZ,SHADOWSHED
LUGIA = SHADOWBLAST,SHADOWSHED,SHADOWDOWN,SHADOWSTORM
POOCHYENA = SHADOWBLITZ,SHADOWHOLD
SEEDOT = SHADOWWAVE,SHADOWHOLD
SWELLOW = SHADOWBREAK,SHADOWMIST,SHADOWHALF,SHADOWSKY
RALTS = SHADOWWAVE,SHADOWHOLD
SHROOMISH = SHADOWBLITZ,SHADOWMIST
MAKUHITA = SHADOWBLITZ,SHADOWSHED
NOSEPASS = SHADOWWAVE,SHADOWMIST
DELCATTY = SHADOWRUSH,SHADOWWAVE
SABLEYE = SHADOWBLITZ,SHADOWHOLD
MAWILE = SHADOWRUSH,SHADOWWAVE
MANECTRIC = SHADOWMIST,SHADOWEND,SHADOWSKY
ROSELIA = SHADOWWAVE,SHADOWSHED
GULPIN = SHADOWBLITZ,SHADOWHOLD
CARVANHA = SHADOWBLITZ,SHADOWHOLD
NUMEL = SHADOWBLITZ,SHADOWSHED
ALTARIA = SHADOWBREAK,SHADOWMIST,SHADOWRAVE
ZANGOOSE = SHADOWRUSH,SHADOWMIST
LUNATONE = SHADOWWAVE,SHADOWSKY
SOLROCK = SHADOWRAVE,SHADOWSKY,SHADOWPANIC
BALTOY = SHADOWBLITZ,SHADOWMIST
BANETTE = SHADOWRUSH,SHADOWHOLD
DUSKULL = SHADOWHOLD,SHADOWWAVE
SNORUNT = SHADOWSHED,SHADOWWAVE
SPHEAL = SHADOWWAVE,SHADOWMIST
SALAMENCE = SHADOWRUSH,SHADOWHOLD

525
PBS/shadow_pokemon.txt Normal file
View File

@@ -0,0 +1,525 @@
# See the documentation on the wiki to learn how to edit this file.
#-------------------------------
[BUTTERFREE]
GaugeSize = 4000
Moves = SHADOWRUSH,SHADOWMIST
#-------------------------------
[BEEDRILL]
GaugeSize = 4500
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[PIDGEOTTO]
GaugeSize = 4000
Moves = SHADOWBLITZ,SHADOWPANIC
#-------------------------------
[RATICATE]
GaugeSize = 6000
Moves = SHADOWRUSH,SHADOWDOWN
#-------------------------------
[SPEAROW]
GaugeSize = 4500
Moves = SHADOWBLITZ,SHADOWPANIC
#-------------------------------
[ARBOK]
GaugeSize = 5000
Moves = SHADOWRUSH,SHADOWHALF
#-------------------------------
[VULPIX]
GaugeSize = 2000
Moves = SHADOWWAVE,SHADOWHOLD
#-------------------------------
[PARAS]
GaugeSize = 4000
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[VENOMOTH]
GaugeSize = 4000
Moves = SHADOWRUSH,SHADOWMIST
#-------------------------------
[DUGTRIO]
GaugeSize = 5000
Moves = SHADOWBREAK,SHADOWSHED,SHADOWSKY
#-------------------------------
[MEOWTH]
GaugeSize = 3500
Moves = SHADOWRUSH,SHADOWHOLD
#-------------------------------
[GOLDUCK]
GaugeSize = 6500
Moves = SHADOWRAVE,SHADOWMIST
#-------------------------------
[PRIMEAPE]
GaugeSize = 6000
Moves = SHADOWRUSH,SHADOWSTORM
#-------------------------------
[GROWLITHE]
GaugeSize = 4000
Moves = SHADOWBLITZ,SHADOWWAVE
#-------------------------------
[POLIWRATH]
GaugeSize = 7500
Moves = SHADOWSTORM,SHADOWRUSH,SHADOWSKY
#-------------------------------
[WEEPINBELL]
GaugeSize = 4000
Moves = SHADOWRAVE,SHADOWHOLD
#-------------------------------
[RAPIDASH]
GaugeSize = 6000
Moves = SHADOWRAVE,SHADOWDOWN,SHADOWSKY
#-------------------------------
[MAGNETON]
GaugeSize = 4500
Moves = SHADOWRAVE,SHADOWHOLD,SHADOWSKY
#-------------------------------
[FARFETCHD]
GaugeSize = 5500
Moves = SHADOWBREAK,SHADOWSKY,SHADOWPANIC
#-------------------------------
[DODRIO]
GaugeSize = 8000
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[SEEL]
GaugeSize = 3500
Moves = SHADOWWAVE,SHADOWMIST
#-------------------------------
[GRIMER]
GaugeSize = 3000
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[SHELLDER]
GaugeSize = 4000
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[HYPNO]
GaugeSize = 5500
Moves = SHADOWSTORM,SHADOWDOWN
#-------------------------------
[VOLTORB]
GaugeSize = 2500
Moves = SHADOWRUSH,SHADOWPANIC
#-------------------------------
[EXEGGUTOR]
GaugeSize = 9000
Moves = SHADOWSTORM,SHADOWSHED,SHADOWHOLD,SHADOWEND
#-------------------------------
[MAROWAK]
GaugeSize = 6500
Moves = SHADOWEND,SHADOWPANIC
#-------------------------------
[HITMONLEE]
GaugeSize = 7000
Moves = SHADOWRUSH,SHADOWDOWN,SHADOWHALF
#-------------------------------
[HITMONCHAN]
GaugeSize = 6000
Moves = SHADOWRUSH,SHADOWDOWN
#-------------------------------
[LICKITUNG]
GaugeSize = 5000
Moves = SHADOWRUSH,SHADOWPANIC
#-------------------------------
[RHYDON]
GaugeSize = 7000
Moves = SHADOWEND,SHADOWDOWN,SHADOWPANIC,SHADOWHOLD
#-------------------------------
[CHANSEY]
GaugeSize = 4000
Moves = SHADOWRAVE,SHADOWHOLD
#-------------------------------
[TANGELA]
GaugeSize = 4000
Moves = SHADOWRAVE,SHADOWHOLD
#-------------------------------
[KANGASKHAN]
GaugeSize = 6000
Moves = SHADOWRUSH,SHADOWMIST
#-------------------------------
[STARMIE]
GaugeSize = 7500
Moves = SHADOWSTORM,SHADOWBREAK,SHADOWMIST
#-------------------------------
[MRMIME]
GaugeSize = 6500
Moves = SHADOWSTORM,SHADOWSHED
#-------------------------------
[SCYTHER]
GaugeSize = 8000
Moves = SHADOWRUSH,SHADOWMIST
#-------------------------------
[ELECTABUZZ]
GaugeSize = 7000
Moves = SHADOWBREAK,SHADOWMIST,SHADOWHALF,SHADOWSTORM
#-------------------------------
[MAGMAR]
GaugeSize = 7000
Moves = SHADOWRAVE,SHADOWRUSH,SHADOWSHED
#-------------------------------
[PINSIR]
GaugeSize = 7000
Moves = SHADOWBREAK,SHADOWSHED
#-------------------------------
[TAUROS]
GaugeSize = 9000
Moves = SHADOWRUSH,SHADOWHOLD,SHADOWSHED,SHADOWSKY
#-------------------------------
[LAPRAS]
GaugeSize = 6000
Moves = SHADOWSTORM,SHADOWSHED,SHADOWSKY
#-------------------------------
[SNORLAX]
GaugeSize = 9000
Moves = SHADOWEND,SHADOWSHED
#-------------------------------
[ARTICUNO]
GaugeSize = 10000
Moves = SHADOWCHILL,SHADOWSHED,SHADOWSKY,SHADOWRUSH
#-------------------------------
[ZAPDOS]
GaugeSize = 10000
Moves = SHADOWBOLT,SHADOWSHED,SHADOWSKY,SHADOWRUSH
#-------------------------------
[MOLTRES]
GaugeSize = 10000
Moves = SHADOWFIRE,SHADOWSHED,SHADOWHOLD,SHADOWRUSH
#-------------------------------
[DRAGONITE]
GaugeSize = 9000
Moves = SHADOWRUSH,SHADOWDOWN,SHADOWSHED,SHADOWSTORM
#-------------------------------
[BAYLEEF]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[QUILAVA]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[CROCONAW]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[FURRET]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[NOCTOWL]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[LEDYBA]
GaugeSize = 2500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[LEDIAN]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[SPINARAK]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWMIST
#-------------------------------
[ARIADOS]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[TOGEPI]
GaugeSize = 4500
Moves = SHADOWRAVE,SHADOWSHED
#-------------------------------
[TOGETIC]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[NATU]
GaugeSize = 2500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[MAREEP]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[FLAAFFY]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[SUDOWOODO]
GaugeSize = 10000
Moves = SHADOWRUSH
#-------------------------------
[SKIPLOOM]
GaugeSize = 3000
Moves = SHADOWRUSH
#-------------------------------
[AIPOM]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[SUNFLORA]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[YANMA]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[QUAGSIRE]
GaugeSize = 4000
Moves = SHADOWRUSH
#-------------------------------
[MURKROW]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[MISDREAVUS]
GaugeSize = 4000
Moves = SHADOWRUSH
#-------------------------------
[PINECO]
GaugeSize = 2500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[FORRETRESS]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[DUNSPARCE]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[GLIGAR]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[GRANBULL]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[QWILFISH]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[SCIZOR]
GaugeSize = 8000
Moves = SHADOWRUSH
#-------------------------------
[SHUCKLE]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[HERACROSS]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[SNEASEL]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[TEDDIURSA]
GaugeSize = 3000
Moves = SHADOWBLITZ,SHADOWMIST
#-------------------------------
[URSARING]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[SLUGMA]
GaugeSize = 4000
Moves = SHADOWRUSH
#-------------------------------
[MAGCARGO]
GaugeSize = 5500
Moves = SHADOWRAVE,SHADOWSHED
#-------------------------------
[SWINUB]
GaugeSize = 2500
Moves = SHADOWBLITZ,SHADOWWAVE
#-------------------------------
[PILOSWINE]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[REMORAID]
GaugeSize = 4000
Moves = SHADOWRUSH
#-------------------------------
[DELIBIRD]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[MANTINE]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[SKARMORY]
GaugeSize = 13000
Moves = SHADOWRUSH
#-------------------------------
[HOUNDOUR]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[HOUNDOOM]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[STANTLER]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[SMEARGLE]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[HITMONTOP]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[MILTANK]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[RAIKOU]
GaugeSize = 13000
Moves = SHADOWRUSH
#-------------------------------
[ENTEI]
GaugeSize = 13000
Moves = SHADOWRUSH
#-------------------------------
[SUICUNE]
GaugeSize = 13000
Moves = SHADOWRUSH
#-------------------------------
[TYRANITAR]
GaugeSize = 20000
Moves = SHADOWRUSH
#-------------------------------
[LUGIA]
GaugeSize = 12000
Moves = SHADOWBLAST,SHADOWSHED,SHADOWDOWN,SHADOWSTORM
#-------------------------------
[POOCHYENA]
GaugeSize = 2500
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[SEEDOT]
GaugeSize = 1500
Moves = SHADOWWAVE,SHADOWHOLD
#-------------------------------
[SWELLOW]
GaugeSize = 7000
Moves = SHADOWBREAK,SHADOWSKY,SHADOWHALF,SHADOWMIST
#-------------------------------
[RALTS]
GaugeSize = 2200
Moves = SHADOWWAVE,SHADOWHOLD
#-------------------------------
[SHROOMISH]
GaugeSize = 1800
Moves = SHADOWBLITZ,SHADOWMIST
#-------------------------------
[MAKUHITA]
GaugeSize = 2000
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[NOSEPASS]
GaugeSize = 4000
Moves = SHADOWWAVE,SHADOWMIST
#-------------------------------
[DELCATTY]
GaugeSize = 2500
Moves = SHADOWRUSH,SHADOWWAVE
#-------------------------------
[SABLEYE]
GaugeSize = 7000
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[MAWILE]
GaugeSize = 2500
Moves = SHADOWRUSH,SHADOWWAVE
#-------------------------------
[MEDITITE]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[MANECTRIC]
GaugeSize = 7000
Moves = SHADOWEND,SHADOWMIST,SHADOWSKY
#-------------------------------
[ROSELIA]
GaugeSize = 3000
Moves = SHADOWWAVE,SHADOWSHED
#-------------------------------
[GULPIN]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[CARVANHA]
GaugeSize = 1700
Moves = SHADOWBLITZ,SHADOWHOLD
#-------------------------------
[NUMEL]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWSHED
#-------------------------------
[VIBRAVA]
GaugeSize = 6000
Moves = SHADOWRUSH
#-------------------------------
[SWABLU]
GaugeSize = 5000
Moves = SHADOWRUSH
#-------------------------------
[ALTARIA]
GaugeSize = 6500
Moves = SHADOWBREAK,SHADOWMIST,SHADOWRAVE
#-------------------------------
[ZANGOOSE]
GaugeSize = 5000
Moves = SHADOWRUSH,SHADOWMIST
#-------------------------------
[LUNATONE]
GaugeSize = 5000
Moves = SHADOWWAVE,SHADOWSHED,SHADOWSKY
#-------------------------------
[SOLROCK]
GaugeSize = 7500
Moves = SHADOWRAVE,SHADOWPANIC,SHADOWSKY
#-------------------------------
[BALTOY]
GaugeSize = 1500
Moves = SHADOWBLITZ,SHADOWMIST
#-------------------------------
[BANETTE]
GaugeSize = 7000
Moves = SHADOWRUSH,SHADOWHOLD
#-------------------------------
[DUSKULL]
GaugeSize = 2200
Moves = SHADOWWAVE,SHADOWHOLD
#-------------------------------
[TROPIUS]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[ABSOL]
GaugeSize = 7000
Moves = SHADOWRUSH
#-------------------------------
[SNORUNT]
GaugeSize = 2500
Moves = SHADOWWAVE,SHADOWSHED
#-------------------------------
[SPHEAL]
GaugeSize = 1500
Moves = SHADOWWAVE,SHADOWMIST
#-------------------------------
[SALAMENCE]
GaugeSize = 9000
Moves = SHADOWRUSH,SHADOWHOLD
#-------------------------------
[METAGROSS]
GaugeSize = 15000
Moves = SHADOWRUSH