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