Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #==============================================================================
- # ■ Pokemon_Battle_Wild
- # Pokemon Script Project - Krosk
- # 20/07/07
- #-----------------------------------------------------------------------------
- # Corrigé par RhenaudTheLukark
- #-----------------------------------------------------------------------------
- # Scène à ne pas modifier de préférence
- #-----------------------------------------------------------------------------
- # Système de Combat - Pokémon Sauvage
- #-----------------------------------------------------------------------------
- #-----------------------------------------------------------------------------
- # 0: Normal, 1: Poison, 2: Paralysé, 3: Brulé, 4:Sommeil, 5:Gelé, 8: Toxic
- # @confuse (6), @flinch (7)
- #-----------------------------------------------------------------------------
- # 1 Normal 2 Feu 3 Eau 4 Electrique 5 Plante 6 Glace 7 Combat 8 Poison 9 Sol
- # 10 Vol 11 Psy 12 Insecte 13 Roche 14 Spectre 15 Dragon 16 Acier 17 Tenebres
- #-----------------------------------------------------------------------------
- #-----------------------------------------------------------------------------
- # $battle_var.action_id
- # 0 : Phase de Sélection
- # 1 : Sélection Item
- # 2 : Switch Pokémon
- # 4 : Switch Fin de Tour
- #-----------------------------------------------------------------------------
- #-----------------------------------------------------------------------------
- # Ordre de déroulement du combat (update)
- #
- #
- #-----------------------------------------------------------------------------
- module POKEMON_S
- #------------------------------------------------------------
- # Pokemon_Battle_Wild
- # scene
- #------------------------------------------------------------
- class Pokemon_Battle_Wild < Pokemon_Battle_Core
- attr_accessor :z_level
- attr_accessor :actor_status
- attr_accessor :actor
- #------------------------------------------------------------
- # Fonction d'initialisation
- # Appel: $scene = POKEMON_S::Pokemon_Battle_Wild.new(
- # party, pokemon, ia)
- # party: $pokemon_party (classe Pokemon_Party)
- # pokemon: class Pokemon
- # ia: Fausse AI
- #------------------------------------------------------------
- def initialize(party, pokemon, ia = false, lose_able = false)
- @z_level = 0
- @ia = ia
- @lose = lose_able
- $battle_var.reset
- # Assignations données des Pokémons
- @enemy = pokemon
- ###@enemy = $pokemon_party.actors[0].clone
- if not(@enemy.given_name.include?("sauvage"))
- @enemy.given_name += " sauvage"
- end
- $battle_var.enemy_party.actors[0] = @enemy
- @party = party
- # Mise à jour Pokedex: Pokémon vu
- $data_pokedex[@enemy.id][0] = true
- # Génération ordre de combat
- @battle_order = Array.new(@party.size)
- @battle_order.fill {|i| i}
- # Désignation 1er Pokémon au combat
- # @actor désigne le (class) Pokémon
- actor_index = 0
- @actor = @party.actors[actor_index]
- if @actor == nil
- print("Attention, vous n'avez pas de Pokémon dans votre équipe! Réglez ce bug.")
- end
- while @actor.dead?
- actor_index += 1
- @actor = @party.actors[actor_index]
- end
- # Correction ordre combat (Pokémon vivant en premier)
- @battle_order = switch(@battle_order, 0, actor_index)
- # Remise à zéro résultat
- $battle_var.result_flee = false
- $battle_var.result_win = false
- $battle_var.result_defeat = false
- # Initialisation des variables de combat
- @phase = 0
- # 0 Non décidé, 1 Attaque, 2 Switch, 3 Item, 4 Fuite
- @actor_action = 0
- @enemy_action = 0
- @start_actor_battler = Player.battler # $trainer_battler
- @start_enemy_battler = @enemy.battler_face
- $battle_var.have_fought.push(@actor.party_index)
- $battle_var.battle_order = @battle_order
- $battle_var.in_battle = true
- @actor.reset_stat_stage
- @enemy.reset_stat_stage
- @actor.skill_effect_reset
- @enemy.skill_effect_reset
- @actor_skill = nil
- @enemy_skill = nil
- @actor.ability_active = false
- @enemy.ability_active = false
- @item_id = 0 # item utilisé
- end
- #------------------------------------------------------------
- # Animations pré-combat
- #------------------------------------------------------------
- def pre_battle_transition
- # Jingle et BGM
- $game_system.bgm_play($game_system.battle_bgm, 80)
- Audio.me_play("Audio/ME/battle_jingle.mid", 80)
- Graphics.freeze
- # Sélection transition
- s = (rand(BATTLE_TRANS)+1).to_s
- @background.bitmap = RPG::Cache.picture("black.png")
- Graphics.transition(100, "Graphics/Transitions/battle"+ s +".png")
- Audio.me_stop
- # Dessin
- Graphics.freeze
- @background.bitmap = RPG::Cache.battleback(@battleback_name)
- @message_background.bitmap = RPG::Cache.battleback(BATTLE_MSG)
- @enemy_sprite.bitmap = RPG::Cache.battler(@start_enemy_battler, 0)
- ###@enemy_sprite.bitmap = RPG::Cache.battler("ENEMY.png", 0)
- @enemy_sprite.ox = @enemy_sprite.bitmap.width / 2
- @enemy_sprite.oy = @enemy_sprite.bitmap.height / 2
- @enemy_sprite.x -= 782
- @enemy_sprite.color = Color.new(60,60,60,128)
- @enemy_ground.bitmap = RPG::Cache.battleback(@ground_name)
- @enemy_ground.ox = @enemy_ground.bitmap.width / 2
- @enemy_ground.oy = @enemy_ground.bitmap.height / 2
- @enemy_ground.zoom_x = @enemy_ground.zoom_y = 2.0/3
- @enemy_ground.x -= 782
- @actor_ground.bitmap = RPG::Cache.battleback(@ground_name)
- @actor_ground.ox = @actor_ground.bitmap.width / 2
- @actor_ground.oy = @actor_ground.bitmap.height
- @actor_ground.x += 782
- @actor_sprite.bitmap = RPG::Cache.battler(@start_actor_battler, 0)
- @actor_sprite.ox = @actor_sprite.bitmap.width / 2
- @actor_sprite.oy = @actor_sprite.bitmap.height
- @actor_sprite.x += 782
- Graphics.transition(50, "Graphics/Transitions/battle0.png")
- end
- def pre_battle_animation
- # Glissement des sprites
- loop do
- @enemy_sprite.x += 17
- @enemy_ground.x += 17
- @actor_sprite.x -= 17
- @actor_ground.x -= 17
- Graphics.update
- if @enemy_sprite.x == 464
- until @enemy_sprite.color.alpha <= 0
- @enemy_sprite.color.alpha -= 20
- Graphics.update
- end
- break
- end
- end
- # Texte
- draw_text("Un " + @enemy.given_name, "apparait!")
- if FileTest.exist?(@enemy.cry)
- Audio.se_play(@enemy.cry)
- end
- # Arrivé du panel de l'adversaire
- @enemy_status.x -= 300
- @enemy_status.visible = true
- if @enemy.shiny
- animation = $data_animations[496]
- @enemy_sprite.animation(animation, true)
- end
- loop do
- @enemy_sprite.x -= 3*(-1)**(@enemy_sprite.x)
- @enemy_status.x += 20
- @enemy_sprite.update
- Graphics.update
- if @enemy_status.x == 23
- until not(@enemy_sprite.effect?)
- @enemy_sprite.update
- Graphics.update
- end
- @enemy_sprite.x = 464
- break
- end
- end
- # Attente appui de touche
- loop do
- Graphics.update
- Input.update
- if Input.trigger?(Input::C)
- $game_system.se_play($data_system.decision_se)
- break
- end
- end
- # Dégagement du sprite dresseur
- loop do
- @actor_sprite.x -= 20
- Graphics.update
- if @actor_sprite.x <= -200
- @actor_sprite.bitmap = RPG::Cache.battler(@actor.battler_back, 0)
- ###@actor_sprite.bitmap = RPG::Cache.battler("ACTOR.png", 0)
- break
- end
- end
- # Envoi du pokémon (animation)
- launch_pokemon
- @text_window.contents.clear
- Graphics.update
- end
- #------------------------------------------------------------
- # Déroulement
- #------------------------------------------------------------
- def enemy_skill_decision
- action = true
- # ------- ---------- --------- --------
- # Saut de phase de sélection (ennemi)
- # action = false : saut
- # action = true : pas de saut
- # ------- ---------- --------- --------
- action = phase_jump(true)
- @enemy_action = 1
- # Décision skill ennemi
- if not(@actor.dead?) and action
- list = []
- for i in 0..@enemy.skills_set.size - 1
- list.push(i)
- end
- list.shuffle!
- # Skill sans PP // Lutte
- @enemy_skill = Skill.new(165)
- # ----------
- for i in list
- if @enemy.skills_set[i].usable?
- @enemy_skill = @enemy.skills_set[i]
- end
- end
- end
- if @ia and not(@actor.dead?) and action
- # Skill sans PP // Lutte
- @enemy_skill = Skill.new(165)
- rate_list = {}
- i = 0
- for skill in @enemy.skills_set
- if skill.usable?
- rate_list[i] = ia_rate_calculation(skill, @enemy, @actor)
- else
- rate_list[i] = 0
- end
- i += 1
- end
- # Tri dans l'ordre decroissant de valeur
- sorted_list = rate_list.sort {|a,b| b[1]<=>a[1]}
- #for element in sorted_list
- # print(@enemy.skills_set[element[0]].name)
- # print(element[1])
- #end
- # Decision prioritaire: max dégat ou soin
- # Valeur seuil: 200
- # si une attaque/défense dépasse ce seuil, il est choisi
- if sorted_list[0][1] > 200
- @enemy_skill = @enemy.skills_set[sorted_list[0][0]]
- else
- # Decision par pallier
- i = rand(100)
- # Taux de decision
- taux = [100, 25, 5, 0]
- for a in 0..3
- if i <= taux[a] and sorted_list[a] != nil and sorted_list[a][1] != 0
- @enemy_skill = @enemy.skills_set[sorted_list[a][0]]
- end
- end
- end
- end
- if not(action) # Reprise du skill précédent
- @enemy_skill = $battle_var.enemy_last_used
- end
- end
- #------------------------------------------------------------
- # Rounds
- #------------------------------------------------------------
- def end_battle_check
- @actor_status.refresh
- @enemy_status.refresh
- if @enemy.dead? and not(@party.dead?)
- end_battle_victory
- elsif @actor.dead?
- if @party.dead?
- end_battle_defeat
- else
- draw_text("Voulez-vous appeler", "un autre Pokémon?")
- if draw_choice
- $battle_var.window_index = @action_window.index
- scene = POKEMON_S::Pokemon_Party_Menu.new(0)
- scene.main
- return_data = scene.return_data
- # Switch de Pokémon
- if $battle_var.action_id == 4 or $battle_var.action_id == 6
- @switch_id = return_data
- actor_pokemon_switch
- end
- elsif run_able?(@actor, @enemy)
- run
- else
- fail_flee
- $battle_var.window_index = @action_window.index
- scene = POKEMON_S::Pokemon_Party_Menu.new(0)
- scene.main
- return_data = scene.return_data
- # Switch de Pokémon
- if $battle_var.action_id == 4 or $battle_var.action_id == 6
- @switch_id = return_data
- actor_pokemon_switch
- end
- end
- end
- end
- end
- #------------------------------------------------------------
- # Items
- #------------------------------------------------------------
- def actor_item_use # items à utiliser
- # Item déjà utilisé ie remplacé par 0
- if @item_id == 0
- return
- end
- if Item.data(@item_id)["flee"]
- end_battle_flee
- return
- end
- if Item.data(@item_id)["ball"]
- ball_data = Item.data(@item_id)["ball"]
- if catch_pokemon(ball_data)
- @enemy.given_name = @enemy.name
- @enemy.ball_data = ball_data
- # Changement de surnom
- draw_text("Voulez-vous changer le", "surnom de #{@enemy.given_name} ?")
- if draw_choice
- draw_text("")
- scene = POKEMON_S::Pokemon_Name.new(@enemy, @z_level + 50)
- scene.main
- end
- # Intégration au PC
- if $pokemon_party.size < 6
- $pokemon_party.add(@enemy)
- else
- $pokemon_party.store_captured(@enemy)
- string1 = @enemy.given_name
- string2 = "est envoyé au PC."
- draw_text(string1, string2)
- wait(40)
- end
- $battle_var.result_win = true
- end_battle
- end
- end
- end
- #------------------------------------------------------------
- # Lancer de pokéball
- #------------------------------------------------------------
- def catch_pokemon(ball_data)
- # Initialisation des données
- ball_name = ball_data[0]
- ball_rate = ball_data[1]
- ball_sprite = ball_data[2]
- ball_open_sprite = ball_data[3]
- ball_color = ball_data[4]
- if @enemy.asleep? or @enemy.frozen?
- status_multiplier = 2
- elsif @enemy.burn? or @enemy.paralyzed? or
- @enemy.poisoned? or @enemy.toxic?
- status_multiplier = 1.5
- else
- status_multiplier = 1
- end
- if ball_rate.type == Array
- case ball_rate[0]
- when "type"
- if ball_rate[1].include?(@enemy.type1)
- ball_rate = ball_rate[2]
- elsif ball_rate[1].include?(@enemy.type2)
- ball_rate = ball_rate[2]
- elsif ball_rate[3] != nil
- ball_rate = ball_rate[3]
- else
- ball_rate = 1
- end
- when "id"
- if ball_rate[1].include?(@enemy.id)
- ball_rate = ball_rate[2]
- elsif ball_rate[3] != nil
- ball_rate = ball_rate[3]
- else
- ball_rate = 1
- end
- when "level"
- max = 99
- if ball_rate[2] != nil
- max = ball_rate[2]
- end
- ball_rate = eval( sprintf( ball_rate[1], @enemy.level ) )
- if ball_rate <= 1
- ball_rate = 1
- end
- if ball_rate >= max
- ball_rate = max
- end
- when "time"
- max = 99
- if ball_rate[2] != nil
- max = ball_rate[2]
- end
- ball_rate = eval( sprintf( ball_rate[1], $battle_var.round ) )
- if ball_rate <= 1
- ball_rate = 1
- end
- if ball_rate >= max
- ball_rate = max
- end
- else
- ball_rate = 1
- end
- end
- multiplier = @enemy.rareness * (ball_rate)
- maxhp = @enemy.maxhp_basis
- hp = @enemy.hp
- catch_rate = Integer((((maxhp * 3 - hp * 2)*multiplier).to_f/(maxhp*3).to_f)*status_multiplier)
- catch_value = Integer(1048560 / (Math.sqrt(Math.sqrt(16711680/catch_rate.to_f))))
- list = [rand(65536), rand(65536), rand(65536), rand(65536)]
- j = 4 # nombre de fois que la balle oscille
- for i in list
- j -= i > catch_value ? 1 : 0
- end
- # Procédure / Animation
- # Lancer
- draw_text(Player.name + " utilise", ball_name + "!")
- @ball_sprite = Sprite.new
- @ball_sprite.bitmap = RPG::Cache.picture(ball_sprite)
- @ball_sprite.x = -25
- @ball_sprite.y = 270
- @ball_sprite.z = @z_level + 16
- t = 0.0
- pi = Math::PI
- loop do
- t += 16
- @ball_sprite.y = (270.0 - 230.0 * Math.sin(2 * pi / 3.0 * t / 445.0)).to_i
- @ball_sprite.x = -15 + t
- Graphics.update
- if @ball_sprite.x >= 445
- @ball_sprite.bitmap = RPG::Cache.picture(ball_open_sprite)
- break
- end
- end
- count = j
- # "Aspiration"
- @enemy_sprite.color = ball_color
- @enemy_sprite.color.alpha = 0
- @ball_sprite.z -= 2
- until @enemy_sprite.color.alpha >= 255
- @flash_sprite.opacity += 50
- @enemy_sprite.color.alpha += 50
- Graphics.update
- end
- Audio.se_play("Audio/SE/Pokeopen.wav")
- loop do
- @enemy_sprite.zoom_x -= 0.1
- @enemy_sprite.zoom_y -= 0.1
- @enemy_sprite.opacity -= 25
- @flash_sprite.opacity -= 25
- Graphics.update
- if @enemy_sprite.zoom_x <= 0.1
- @flash_sprite.opacity = 0
- @enemy_sprite.opacity = 0
- break
- end
- end
- @ball_sprite.bitmap = RPG::Cache.picture(ball_sprite)
- # Oscillement
- t = 0
- r = 0
- loop do
- t += 1
- @ball_sprite.y = 81 + 50*(1-Math.exp(-t/20.0)*(Math.cos(t*2*pi/30.0)).abs)
- if @ball_sprite.y >= 81+45 and r < 6
- r += 1
- Audio.se_play("Audio/SE/Pokerebond.wav")
- end
- Graphics.update
- if t >= 60
- break
- end
- end
- while count > 0
- count -= 1
- t = 0
- Audio.se_play("Audio/SE/Pokemove.wav")
- loop do
- t += 4
- @ball_sprite.angle = 40*Math.sin(2*pi*t/100.0)
- @ball_sprite.x = 449 - 12*Math.sin(2*pi*t/100.0)
- @ball_sprite.y = 131 + 12*Math.sin(2*pi*t/100.0)
- Graphics.update
- if t == 100
- @ball_sprite.angle = 0
- break
- end
- end
- end
- if j != 4
- # Echappé
- @ball_sprite.bitmap = RPG::Cache.picture(ball_open_sprite)
- @ball_sprite.z -= 1
- Audio.se_stop
- Audio.se_play("Audio/SE/Pokeopenbreak.wav")
- @enemy_sprite.oy = @enemy_sprite.bitmap.height
- @enemy_sprite.y += @enemy_sprite.bitmap.height / 2
- loop do
- @enemy_sprite.opacity += 25
- @enemy_sprite.zoom_x += 0.1
- @enemy_sprite.zoom_y += 0.1
- @ball_sprite.opacity -= 25
- @flash_sprite.opacity += 25
- Graphics.update
- if @enemy_sprite.zoom_x >= 1
- @enemy_sprite.oy = @enemy_sprite.bitmap.height / 2
- @enemy_sprite.y -= @enemy_sprite.bitmap.height / 2
- Graphics.update
- @ball_sprite.dispose
- break
- end
- end
- until @enemy_sprite.color.alpha <= 0
- @enemy_sprite.color.alpha -= 25
- @flash_sprite.opacity -= 25
- Graphics.update
- end
- @enemy_sprite.color.alpha = 0
- @enemy_sprite.opacity = 255
- @flash_sprite.opacity = 0
- Graphics.update
- string1 = j == 3 ? "Mince!" : j == 2 ? "Aaaah!" : j == 1 ? "Raah!" : "Oh non!"
- string2 = j == 3 ? "Ca y était presque!" : j == 2 ? "Presque!" : j == 1 ? "Ca y était presque!" : "Le POKéMON s'est libéré!"
- draw_text(string1, string2)
- wait(40)
- else
- # Attrapé
- Audio.me_play("Audio/ME/PkmRS-Caught.mid")
- @enemy_caught = true
- draw_text("Et hop! " + @enemy.given_name , "est attrapé!")
- wait(90)
- wait_hit
- until @ball_sprite.opacity <= 0
- @ball_sprite.opacity -= 25
- Graphics.update
- end
- end
- if j != 4
- return false
- elsif j == 4
- return true
- end
- end
- #------------------------------------------------------------
- # Fin de combat
- #------------------------------------------------------------
- def end_battle_victory
- #Audio.bgm_fade(800)
- $battle_var.result_win = true
- @actor_status.z = @z_level + 15
- #$game_system.me_play($game_system.battle_end_me)
- Audio.me_play("Audio/ME/fainted_jingle.mid")
- Audio.bgm_play("Audio/BGM/PkmRS-Victory.mid")
- # Réduction du nombre de participants
- $battle_var.have_fought.uniq!
- for index in $battle_var.have_fought
- actor = $pokemon_party.actors[index]
- if actor.dead?
- $battle_var.have_fought.delete(index)
- end
- end
- number = $battle_var.have_fought.length
- @enemy.skill_effect_reset
- @enemy.reset_stat_stage
- evolve_checklist = []
- type = 1
- # PIECE RUNE/AMULET COIN
- money_rate = 1
- # EXP SHARE/MULTI EXP
- exp_share_number = 0
- for pokemon in $pokemon_party.actors
- if not(pokemon.dead?) and Item.data(pokemon.item_hold)["expshare"]
- exp_share_number += 1
- end
- end
- # Exp de bataille
- for actor in $pokemon_party.actors
- if actor.dead?
- next
- end
- amount = nil
- if $battle_var.have_fought.include?(actor.party_index)
- amount = actor.exp_calculation(@enemy.battle_list, @enemy.level, number, type, exp_share_number)
- # Tag objet
- if Item.data(actor.item_hold)["amuletcoin"]
- money_rate = 2
- end
- end
- if Item.data(actor.item_hold)["expshare"] and
- not($battle_var.have_fought.include?(actor.party_index)) and not(actor.dead?)
- amount = actor.exp_calculation(@enemy.battle_list, @enemy.level, number, type, exp_share_number, 0)
- end
- if amount != nil
- actor.skill_effect_reset
- actor.reset_stat_stage
- actor.add_bonus(@enemy.battle_list)
- draw_text(actor.given_name + " a gagné", amount.to_s + " points d'expérience!")
- Graphics.update
- wait_hit
- for i in 1..amount
- actor.add_exp_battle(1)
- if actor.level_check
- actor.level_up(self)
- evolve_checklist.push(actor)
- end
- if actor == @actor
- if @actor.exp_list[@actor.level+1] != nil and @actor.level < MAX_LEVEL
- divide = (@actor.exp_list[@actor.level+1]-@actor.exp_list[@actor.level])/192
- if divide == 0
- divide = 1
- end
- if (@actor.exp - @actor.exp_list[@actor.level])%divide == 0
- @actor_status.exp_refresh
- Graphics.update
- end
- end
- end
- end
- end
- end
- @actor_status.refresh
- Graphics.update
- if $battle_var.money_payday > 0
- draw_text(Player.name + " gagne " + ($battle_var.money_payday).to_s + "$", "grâce à Jackpot!")
- $pokemon_party.add_money($battle_var.money_payday)
- wait(40)
- end
- wait(30)
- $game_system.bgm_play($game_temp.map_bgm)
- for actor in evolve_checklist
- info = actor.evolve_check
- if info != false
- scene = POKEMON_S::Pokemon_Evolve.new(actor, info, @z_level + 200)
- scene.main
- end
- end
- end_battle
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement