diff --git a/Data/Map237.rxdata b/Data/Map237.rxdata
index 4ff22275b..4b2708af1 100644
Binary files a/Data/Map237.rxdata and b/Data/Map237.rxdata differ
diff --git a/Data/Map243.rxdata b/Data/Map243.rxdata
index bfb76a8e9..410edcabd 100644
Binary files a/Data/Map243.rxdata and b/Data/Map243.rxdata differ
diff --git a/Data/Map356.rxdata b/Data/Map356.rxdata
index f33de4d9b..948a1832e 100644
Binary files a/Data/Map356.rxdata and b/Data/Map356.rxdata differ
diff --git a/Data/Map788.rxdata b/Data/Map788.rxdata
index fa2d30359..b8481bd72 100644
Binary files a/Data/Map788.rxdata and b/Data/Map788.rxdata differ
diff --git a/Data/MapInfos.rxdata b/Data/MapInfos.rxdata
index f1e69f26e..dee433ae9 100644
Binary files a/Data/MapInfos.rxdata and b/Data/MapInfos.rxdata differ
diff --git a/Data/SPRITE_CREDS b/Data/SPRITE_CREDS
index d3afa7b70..6bed9f893 100644
--- a/Data/SPRITE_CREDS
+++ b/Data/SPRITE_CREDS
@@ -10098,11 +10098,10 @@
166.334,Lora-mun#5661
166.338,Pokeapache#7582
166.342,Retrogamer#9934
-166.346,
166.352,Xenophacilus#7867
166.354,Moonabloom#2081
166.356,gupaulino#2624
-166.36,NPC-ARTS#8564
+166.36,NPC-ARTS#8564S
166.369,Moon_Tah#2688
166.37,Ashbright#6398
166.375,Lord Ca_Club#9654
@@ -13353,7 +13352,6 @@
188.131,Zergla#9945
188.133,CarbonGames75#9231
188.14,Koroblin#4006
-188.142,
188.142a,BHP Obrut#0341
188.147,Milchik#6233
188.148,Milchik#6233
@@ -14895,7 +14893,6 @@
197.334,mammuth use ursaluna#3114
197.336,thornsoflight
197.336a,TysonTurnpike#9909
-197.336b,
197.337,MetalXLemmy#7970
197.339,AkumaDelta#2364
197.34,Dynte#0539
@@ -19524,7 +19521,6 @@
229.244a,Aiytee#2046
229.249,JezusOfJordanTTV#1796
229.25,Tooby_Two#2536
-229.253a,
229.256,mammuth use ursaluna#3114
229.26,Lunar#0258
229.262a,Quote.lass#3684
@@ -26122,7 +26118,6 @@
275.282,mud#4550
275.284,theeastgamer0#4466
275.287,mammuth use ursaluna#3114
-275.287a,
275.287b,Head Empty#7054
275.287c,mud#4550
275.287f,YourSupraSugarDaddy#7825
@@ -27020,7 +27015,6 @@
282.218,Shayzisᴼᶻᵃᵏᶦ ¯\_(ツ)_/¯#0270
282.22,Jaters#2779
282.220,Knuckles3&Knuckles#7559
-282.222,
282.223,kiwikelly
282.224,MJxPimouss#7015
282.23,Jaters#2779
@@ -32961,7 +32955,6 @@
327.9,IridescentMirage#2413
327.92,DanonZer#6110
327.94,Skyboy#9244
-327.99,
328.100,Maelmc#9965
328.101,Maelmc#9965
328.102,Spagalapof#5624
@@ -35779,8 +35772,6 @@
346.23,Sonic11110#6073
346.234,camiska#5369
346.234a,camiska#5369
-346.234b,
-346.234c,
346.235,Hypest Avid#2240
346.239,AussieJo#6727
346.25,Count Scabula#9527
@@ -45506,7 +45497,6 @@
406.100,TeeOhEss#4617
406.101,War#0084
406.101a,War#0084
-406.102a,
406.103,Elitay#5331
406.104,Charred Lizard#8595
406.105,DaTorre#4703
@@ -45856,7 +45846,6 @@
407.278,jojo97#3521
407.279,Fish Games#4056
407.28,xigzagoon#9354
-407.280,
407.281,Fish Games#4056
407.292,Sensei Farm#6760
407.294,ClawsHDi#9101
@@ -47121,7 +47110,6 @@
418.160,Holgast#1562
418.17,Retrogamer#9934
418.177,Riviera#0906
-418.17a,
418.194,ZeroCipher#2416
418.198,Quote.lass#3684
418.220,Mr. Person (Prinplup enjoyer)#2491
@@ -54696,7 +54684,6 @@
94.335a,PinkPoffin#6403
94.337,Baltes#3911
94.338a,Blackboots#7369
-mammuth use ursaluna#3114
94.339,Sunset Sailor Fox#8957
94.34b,Universez#0767
94.34,mammuth use ursaluna#3114
diff --git a/Data/Scripts/007_Objects and windows/011_Messages.rb b/Data/Scripts/007_Objects and windows/011_Messages.rb
index 85d44421b..6aef3ef56 100644
--- a/Data/Scripts/007_Objects and windows/011_Messages.rb
+++ b/Data/Scripts/007_Objects and windows/011_Messages.rb
@@ -424,10 +424,9 @@ def pbDisplayBattleFactoryPointsWindow(msgwindow)
pbDisplayVariableWindow(msgwindow, "Tokens", VAR_BATTLE_FACTORY_TOKENS)
end
-
-def pbDisplayVariableWindow(msgwindow,name,variable_id)
+def pbDisplayVariableWindow(msgwindow, name, variable_id)
pointsString = $game_variables[variable_id].to_s
- pointswindow = Window_AdvancedTextPokemon.new(_INTL("{1}:\n{2}",name, pointsString))
+ pointswindow = Window_AdvancedTextPokemon.new(_INTL("{1}:\n{2}", name, pointsString))
pointswindow.setSkin("Graphics/Windowskins/goldskin")
pointswindow.resizeToFit(pointswindow.text, Graphics.width)
pointswindow.width = 160 if pointswindow.width <= 160
@@ -441,11 +440,11 @@ def pbDisplayVariableWindow(msgwindow,name,variable_id)
return pointswindow
end
-def pbDisplayTwoVariableWindow(msgwindow,name1,variable1_id,name2, variable2_id)
+def pbDisplayTwoVariableWindow(msgwindow, name1, variable1_id, name2, variable2_id)
pointsString1 = $game_variables[variable1_id].to_s
pointsString2 = $game_variables[variable2_id].to_s
- pointswindow = Window_AdvancedTextPokemon.new(_INTL("{1}:{2}\n{3}:{4}",name1, pointsString1,name2,pointsString2))
+ pointswindow = Window_AdvancedTextPokemon.new(_INTL("{1}:{2}\n{3}:{4}", name1, pointsString1, name2, pointsString2))
pointswindow.setSkin("Graphics/Windowskins/goldskin")
pointswindow.resizeToFit(pointswindow.text, Graphics.width)
pointswindow.width = 160 if pointswindow.width <= 160
@@ -551,10 +550,10 @@ end
# Main message-displaying function
#===============================================================================
def pbMessageDisplayNoSound(msgwindow, message, letterbyletter = true, commandProc = nil)
- pbMessageDisplay(msgwindow,message,letterbyletter,commandProc,false)
+ pbMessageDisplay(msgwindow, message, letterbyletter, commandProc, false)
end
-def pbMessageDisplay(msgwindow, message, letterbyletter = true, commandProc = nil,withSound=true)
+def pbMessageDisplay(msgwindow, message, letterbyletter = true, commandProc = nil, withSound = true)
return if !msgwindow
oldletterbyletter = msgwindow.letterbyletter
msgwindow.letterbyletter = (letterbyletter) ? true : false
@@ -730,15 +729,17 @@ def pbMessageDisplay(msgwindow, message, letterbyletter = true, commandProc = ni
param = controls[i][1]
case control
when "f"
- isFusion = param.to_i > NB_POKEMON
- head = getBasePokemonID(param.to_i, false)
- body = getBasePokemonID(param.to_i, true)
- facewindow.dispose if facewindow
- path = obtainPokemonSpritePath(body, head, $game_variables[VAR_CUSTOM_SPRITES_ENABLED] == 0)
- facewindow = isFusion ? PictureWindow.new(path) : PictureWindow.new("Graphics/Battlers/#{head}/#{head}.png")
- pbPositionNearMsgWindow(facewindow, msgwindow, :left)
- facewindow.viewport = msgwindow.viewport
- facewindow.z = msgwindow.z
+ if param.to_i > 0
+ isFusion = param.to_i > NB_POKEMON
+ head = getBasePokemonID(param.to_i, false)
+ body = getBasePokemonID(param.to_i, true)
+ facewindow.dispose if facewindow
+ path = obtainPokemonSpritePath(body, head, $game_variables[VAR_CUSTOM_SPRITES_ENABLED] == 0)
+ facewindow = isFusion ? PictureWindow.new(path) : PictureWindow.new("Graphics/Battlers/#{head}/#{head}.png")
+ pbPositionNearMsgWindow(facewindow, msgwindow, :left)
+ facewindow.viewport = msgwindow.viewport
+ facewindow.z = msgwindow.z
+ end
when "ff"
facewindow.dispose if facewindow
facewindow = FaceWindowVX.new(param)
@@ -876,9 +877,9 @@ def pbMessageNoSound(message, commands = nil, cmdIfCancel = 0, skin = nil, defau
msgwindow = pbCreateMessageWindow(nil, skin)
if commands
ret = pbMessageDisplayNoSound(msgwindow, message, true,
- proc { |msgwindow|
- next Kernel.pbShowCommands(msgwindow, commands, cmdIfCancel, defaultCmd, &block)
- }, &block)
+ proc { |msgwindow|
+ next Kernel.pbShowCommands(msgwindow, commands, cmdIfCancel, defaultCmd, &block)
+ }, &block)
else
pbMessageDisplay(msgwindow, message, &block)
end
@@ -887,7 +888,6 @@ def pbMessageNoSound(message, commands = nil, cmdIfCancel = 0, skin = nil, defau
return ret
end
-
def pbConfirmMessage(message, &block)
return (pbMessage(message, [_INTL("Yes"), _INTL("No")], 2, &block) == 0)
end
diff --git a/Data/Scripts/011_Battle/005_Battle scene/007_Scene_Initialize.rb b/Data/Scripts/011_Battle/005_Battle scene/007_Scene_Initialize.rb
index 55e7d588d..127004c1b 100644
--- a/Data/Scripts/011_Battle/005_Battle scene/007_Scene_Initialize.rb
+++ b/Data/Scripts/011_Battle/005_Battle scene/007_Scene_Initialize.rb
@@ -74,7 +74,7 @@ class PokeBattle_Scene
# Opposing trainer(s) sprites
if @battle.trainerBattle?
@battle.opponent.each_with_index do |p,i|
- pbCreateTrainerFrontSprite(i,p.trainer_type,@battle.opponent.length)
+ pbCreateTrainerFrontSprite(i,p.trainer_type,@battle.opponent.length,p.sprite_override)
end
end
# Data boxes and Pokémon sprites
@@ -181,8 +181,10 @@ class PokeBattle_Scene
trainer.oy = trainer.bitmap.height
end
- def pbCreateTrainerFrontSprite(idxTrainer,trainerType,numTrainers=1)
+ def pbCreateTrainerFrontSprite(idxTrainer,trainerType,numTrainers=1,sprite_override=nil)
trainerFile = GameData::TrainerType.front_sprite_filename(trainerType)
+ trainerFile = sprite_override if sprite_override
+
spriteX, spriteY = PokeBattle_SceneConstants.pbTrainerPosition(1,idxTrainer,numTrainers)
trainer = pbAddSprite("trainer_#{idxTrainer+1}",spriteX,spriteY,trainerFile,@viewport)
return if !trainer.bitmap
diff --git a/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb b/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb
index 3baee3c84..7bace88df 100644
--- a/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb
+++ b/Data/Scripts/012_Overworld/002_Battle triggering/001_Overworld_BattleStarting.rb
@@ -515,6 +515,53 @@ def pbTrainerBattleCore(*args)
return decision
end
+def convert_pokemon_to_pokemon_hash(pokemon)
+ pokemon_hash = Hash.new
+ pokemon_hash[:species] = pokemon.species
+ pokemon_hash[:level] = pokemon.level
+ return pokemon_hash
+end
+
+
+
+#party: array of pokemon team
+# [[:SPECIES,level], ... ]
+#
+def customTrainerBattle(trainerName, trainerType, party_array, default_level=50, endSpeech="", sprite_override=nil)
+
+
+ # trainerID= "customTrainer"
+ #
+ # trainer_info_hash = {}
+ # trainer_info_hash[:id] = trainerID
+ # trainer_info_hash[:id_number] = 0
+ # trainer_info_hash[:name] = trainerName
+ # trainer_info_hash[:version] = 0
+ # trainer_info_hash[:items] = []
+ # trainer_info_hash[:lose_text] = endSpeech
+ # trainer_info_hash[:pokemon] = party
+
+ #trainer = GameData::Trainer.new(trainer_info_hash)
+ trainer = NPCTrainer.new(trainerName,trainerType,sprite_override)
+ trainer.lose_text=endSpeech
+ party = []
+ party_array.each { |pokemon|
+ if pokemon.is_a?(Pokemon)
+ party << pokemon
+ elsif pokemon.is_a?(Symbol)
+ party << Pokemon.new(pokemon,default_level,trainer)
+ end
+ }
+ trainer.party=party
+ Events.onTrainerPartyLoad.trigger(nil,trainer)
+
+
+
+ decision = pbTrainerBattleCore(trainer)
+ # Return true if the player won the battle, and false if any other result
+ return (decision==1)
+end
+
#===============================================================================
# Standard methods that start a trainer battle of various sizes
#===============================================================================
diff --git a/Data/Scripts/015_Trainers and player/001_Trainer.rb b/Data/Scripts/015_Trainers and player/001_Trainer.rb
index 9c9681df9..0a9a09716 100644
--- a/Data/Scripts/015_Trainers and player/001_Trainer.rb
+++ b/Data/Scripts/015_Trainers and player/001_Trainer.rb
@@ -8,6 +8,7 @@ class Trainer
attr_accessor :language
attr_accessor :party
attr_accessor :quests
+ attr_accessor :sprite_override
def inspect
str = super.chop
@@ -204,12 +205,13 @@ class Trainer
#=============================================================================
- def initialize(name, trainer_type)
+ def initialize(name, trainer_type, sprite_override=nil)
@trainer_type = GameData::TrainerType.get(trainer_type).id
@name = name
@id = rand(2 ** 16) | rand(2 ** 16) << 16
@language = pbGetLanguage
@party = []
+ @sprite_override = sprite_override
end
end
@@ -220,7 +222,7 @@ class NPCTrainer < Trainer
attr_accessor :items
attr_accessor :lose_text
- def initialize(name, trainer_type)
+ def initialize(name, trainer_type, sprite_override=nil)
super
@items = []
@lose_text = nil
diff --git a/Data/Scripts/016_UI/005_UI_Party.rb b/Data/Scripts/016_UI/005_UI_Party.rb
index e0533479a..8fea1ee90 100644
--- a/Data/Scripts/016_UI/005_UI_Party.rb
+++ b/Data/Scripts/016_UI/005_UI_Party.rb
@@ -1155,7 +1155,7 @@ class PokemonPartyScreen
def pbPokemonRename(pkmn, pkmnid)
cmd = 0
loop do
- speciesname = PBSpecies.getName(pkmn.species)
+ speciesname = pkmn.speciesName
msg = [_INTL("{1} has the nickname {2}.", speciesname, pkmn.name),
_INTL("{1} has no nickname.", speciesname)][pkmn.name == speciesname ? 1 : 0]
cmd = @scene.pbShowCommands(msg, [
diff --git a/Data/Scripts/050_AddOns/Gen 2.rb b/Data/Scripts/050_AddOns/Gen 2.rb
index 834f6b78d..4f99f0c9e 100644
--- a/Data/Scripts/050_AddOns/Gen 2.rb
+++ b/Data/Scripts/050_AddOns/Gen 2.rb
@@ -145,6 +145,7 @@ end
#param2 = true pour body, false pour head
#return int du pokemon de base
def getBasePokemonID(pokemon, body = true)
+ return nil if pokemon <= 0
if pokemon.is_a?(Symbol)
dex_number = GameData::Species.get(pokemon).id_number
pokemon = dex_number
diff --git a/Data/Scripts/050_AddOns/GeneralUtils.rb b/Data/Scripts/050_AddOns/GeneralUtils.rb
index cd8c9533f..e518c6705 100644
--- a/Data/Scripts/050_AddOns/GeneralUtils.rb
+++ b/Data/Scripts/050_AddOns/GeneralUtils.rb
@@ -60,7 +60,7 @@ def addNewTripleFusion(pokemon1,pokemon2,pokemon3,level = 1)
end
pokemon = TripleFusion.new(pokemon1,pokemon2,pokemon3,level)
-
+ pokemon.calc_stats
pbMessage(_INTL("{1} obtained {2}!\\me[Pkmn get]\\wtnp[80]\1", $Trainer.name, pokemon.name))
pbNicknameAndStore(pokemon)
#$Trainer.pokedex.register(pokemon)
diff --git a/Data/Scripts/050_AddOns/SpriteCreditsUtils.rb b/Data/Scripts/050_AddOns/SpriteCreditsUtils.rb
index 4db9a324a..951061de0 100644
--- a/Data/Scripts/050_AddOns/SpriteCreditsUtils.rb
+++ b/Data/Scripts/050_AddOns/SpriteCreditsUtils.rb
@@ -125,11 +125,42 @@ def list_all_spriters()
return names_list
end
+def generateCurrentGalleryBattle(level = nil, number_of_pokemon = 3)
+ spriter_name = pbGet(259)
+ #set highest level in party if nil
+ if !level
+ level = $Trainer.highest_level_pokemon_in_party
+ end
+ possible_battlers = []
+ for i in 0..5
+ sprite = pbGet(VAR_GALLERY_FEATURED_SPRITES)[i]
+ species = getPokemonSpeciesFromSprite(sprite)
+ possible_battlers << species if species
+ end
+
+ selected_battlers_idx = possible_battlers.sample(number_of_pokemon)
+ party = []
+ selected_battlers_idx.each { |species|
+ party << Pokemon.new(species, level)
+ }
+ customTrainerBattle(spriter_name,
+ :PAINTER,
+ party,
+ level,
+ pick_spriter_losing_dialog(spriter_name),
+ pick_trainer_sprite(spriter_name)
+ )
+
+end
+
def generateArtGallery(nbSpritesDisplayed = 6, saveArtistNameInVariable = 1, saveSpritesInVariable = 2, saveAllArtistSpritesInVariable = 3, artistName = nil)
artistName = nil if artistName == 0
creditsMap = map_sprites_by_artist
featuredArtist = artistName ? artistName : getRandomSpriteArtist(creditsMap, nbSpritesDisplayed)
if featuredArtist
+ if !creditsMap[featuredArtist] #try again if issue
+ return generateArtGallery(nbSpritesDisplayed,saveSpritesInVariable,saveSpritesInVariable,saveSpritesInVariable,artistName)
+ end
featuredSprites = creditsMap[featuredArtist].shuffle.take(nbSpritesDisplayed)
pbSet(saveArtistNameInVariable, File.basename(featuredArtist, '#*'))
pbSet(saveSpritesInVariable, featuredSprites)
@@ -143,7 +174,7 @@ def format_artist_name(full_name)
return File.basename(full_name, '#*')
end
-def getRandomSpriteArtist(creditsMap = nil, minimumNumberOfSprites = 1, giveUpAfterX = 50)
+def getRandomSpriteArtist(creditsMap = nil, minimumNumberOfSprites = 10, giveUpAfterX = 50)
creditsMap = map_sprites_by_artist if !creditsMap
i = 0
while i < giveUpAfterX
diff --git a/Data/Scripts/050_AddOns/TrainerGeneratorUtils.rb b/Data/Scripts/050_AddOns/TrainerGeneratorUtils.rb
new file mode 100644
index 000000000..444d14eb8
--- /dev/null
+++ b/Data/Scripts/050_AddOns/TrainerGeneratorUtils.rb
@@ -0,0 +1,36 @@
+
+def pick_trainer_sprite(spriter_name)
+ possible_types = "abcd"
+ trainer_type_index = select_number_from_seed(spriter_name,0,3)
+ path = _INTL("Graphics/Trainers/trainer116{1}",possible_types[trainer_type_index].to_s)
+ return path
+end
+
+def select_number_from_seed(seed, min_value, max_value)
+ hash = 137
+ seed.each_byte do |byte|
+ hash = ((hash << 5) + hash) + byte
+ end
+ srand(hash)
+ selected_number = rand(min_value..max_value)
+ selected_number
+end
+
+def pick_spriter_losing_dialog(spriter_name)
+ possible_dialogs = [
+ "Oh... I lost...",
+ "I did my best!",
+ "You're too strong!",
+ "You win!",
+ "What a fight!",
+ "That was fun!",
+ "Ohh, that's too bad",
+ "I should've sprited some stronger Pokémon!",
+ "So much for that!",
+ "Should've seen that coming!",
+ "I can't believe it!",
+ "What a surprise!"
+ ]
+ index = select_number_from_seed(spriter_name,0,possible_dialogs.size-1)
+ return possible_dialogs[index]
+end
diff --git a/Data/Scripts/050_AddOns/TripleFusion.rb b/Data/Scripts/050_AddOns/TripleFusion.rb
index c6931323f..8f097473e 100644
--- a/Data/Scripts/050_AddOns/TripleFusion.rb
+++ b/Data/Scripts/050_AddOns/TripleFusion.rb
@@ -17,6 +17,12 @@ class TripleFusion < Pokemon
super(:ZAPMOLTICUNO,level,owner,withMoves,recheck_form)
end
+
+
+ def types
+ return [@species1_data.type1, @species2_data.type1,@species3_data.type1]
+ end
+
def baseStats
ret = {}
GameData::Stat.each_main do |s|
@@ -33,6 +39,9 @@ class TripleFusion < Pokemon
return (nicknamed?) ? @name : @species_name
end
+ def speciesName
+ return @species_name
+ end
def generate_triple_fusion_name()
part1 = split_string_with_syllables(@species1_data.name)[0]
@@ -58,6 +67,23 @@ class TripleFusion < Pokemon
end
+ def ability_id
+ if !@ability
+ abil_index = ability_index
+ if !@ability # Natural ability or no hidden ability defined
+ chosen_poke_for_ability= rand(1..3)
+ if chosen_poke_for_ability == 1
+ @ability = @species1_data.abilities[abil_index] || @species1_data.abilities[0]
+ elsif chosen_poke_for_ability == 2
+ @ability = @species2_data.abilities[abil_index] || @species2_data.abilities[0]
+ else
+ @ability = @species3_data.abilities[abil_index] || @species3_data.abilities[0]
+ end
+
+ end
+ end
+ return @ability
+ end
end
diff --git a/Data/System.rxdata b/Data/System.rxdata
index ac6ee1099..f52b4428a 100644
Binary files a/Data/System.rxdata and b/Data/System.rxdata differ