Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3766 miembros registrados.
El último usuario registrado es stranger2525.

Nuestros miembros han publicado un total de 85792 mensajes en 12216 argumentos.

[XP] Advanced Battle Drops

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Advanced Battle Drops

Mensaje por Wecoc el 2017-04-05, 17:45

Éste script modifica el modo en el que funcionan los dropeos de objetos, dinero y también experiencia de los enemigos.
Los de cada enemigo funcionan como siempre, pero además permite asignar a cada grupo enemigo dropeos extra (ilimitados) que se añadirán a la lista.
Es un script simple pero da bastante más control a esa característica de las batallas, siempre he pensado que es mejor controlarlo por tropa enemiga en vez de por enemigo. Además, permite drops ilimitados, drops con condiciones avanzadas y drops "en grupo".

El script consta de dos partes, la primera es donde se hace la configuración y es compatible con todo, mientras que la segunda parte puede que haya que adaptarla si estáis usando sistemas de batalla (o mejor dicho sistemas de victoria) distintos al default. Está todo explicado en el script.
No funciona en batallas en mapa (ABS), pero tampoco tiene mucho sentido en esas.

Aquí pongo el script, ponedlo encima de main. Créditos opcionales.

Código:
#==============================================================================
# ** [XP] Advanced Battle Drops
#------------------------------------------------------------------------------
# Autor: Wecoc (créditos opcionales)
#------------------------------------------------------------------------------
# Éste script modifica el modo en el que funcionan los drop de los enemigos.
# Los de cada enemigo funcionan como siempre, pero además permite asignar a cada
# grupo enemigo dropeos extra (ilimitados) que se añadirán a la lista.
#==============================================================================

#==============================================================================
# * Parte 1 - Configuración
#------------------------------------------------------------------------------
# En ésta parte defines para cada tropa enemiga los tesoros extra que dropeará.
# Se ha marcado la parte a modificar y se puso un ejemplo.
# Se usa el siguiente esquema:
#------------------------------------------------------------------------------
# * ITEMS
# > self.set_item_drop(ID tropa, ID item, probabilidad)
#
# Por ejemplo:
# > self.set_item_drop(1, 1, 75)
#
# La probabilidad por defecto vale 100.
# Puedes añadir varios iguales si quieres que se puedan dropear hasta 2 items
# iguales, cada uno con un 75% de probabilidad.
#
# Detrás puedes añadir una condición, por ejemplo:
# > self.set_item_drop(1, 1, 75, "$game_switches[1] == true")
#
# Además el valor de ID del item puede ser una array. Eso significaría que hay
# un 75% de probabilidades que uno de los items de esa lista aparezca:
# > self.set_item_drop(1, [1, 2, 3, 4, 5], 75)
#
# * WEAPONS
# > self.set_weapon_drop(ID tropa, ID weapon, probabilidad)
# Funciona exactamente igual que los Items
#
# * ARMORS
# > self.set_weapon_drop(ID tropa, ID armor, probabilidad)
# Funciona exactamente igual que los Items
#
# * GOLD
# > self.set_gold_drop(ID tropa, cantidad, amplitud)
#
# Por ejemplo:
# > self.set_item_drop(1, 100, 10)
#
# Eso significaría un valor entre 95 y 105
# La amplitud por defecto es 0.
# Detrás puedes añadir una condición exactamente igual que con los items
#
# * EXP
# > self.set_extra_exp(ID tropa, cantidad, amplitud)
# Funciona exactamente igual que el gold.
#
#==============================================================================

module Battle_Drops  
  @@troops = {}
  #--------------------------------------------------------------------------
  def self.troops
    @@troops
  end
  #--------------------------------------------------------------------------
  def self.set_item_drop(troop_id, item_id, perc=100, condition=nil)
    if @@troops[troop_id].nil?
      @@troops[troop_id] = {}
    end
    if @@troops[troop_id]["Items"].nil?
      @@troops[troop_id]["Items"] = []
    end
    @@troops[troop_id]["Items"].push([item_id, perc, condition])
  end
  #--------------------------------------------------------------------------
  def self.set_weapon_drop(troop_id, weapon_id, perc=100, condition=nil)
    if @@troops[troop_id].nil?
      @@troops[troop_id] = {}
    end
    if @@troops[troop_id]["Weapons"].nil?
      @@troops[troop_id]["Weapons"] = []
    end
    @@troops[troop_id]["Weapons"].push([weapon_id, perc, condition])
  end
  #--------------------------------------------------------------------------
  def self.set_armor_drop(troop_id, armor_id, perc=100, condition=nil)
    if @@troops[troop_id].nil?
      @@troops[troop_id] = {}
    end
    if @@troops[troop_id]["Armors"].nil?
      @@troops[troop_id]["Armors"] = []
    end
    @@troops[troop_id]["Armors"].push([armor_id, perc, condition])
  end
  #--------------------------------------------------------------------------
  def self.set_gold_drop(troop_id, gold, amp=0, condition=nil)
    if @@troops[troop_id].nil?
      @@troops[troop_id] = {}
    end
    if @@troops[troop_id]["Gold"].nil?
      @@troops[troop_id]["Gold"] = []
    end
    @@troops[troop_id]["Gold"].push([gold, amp, condition])
  end
  #--------------------------------------------------------------------------
  def self.set_extra_exp(troop_id, exp, amp=0, condition=nil)
    if @@troops[troop_id].nil?
      @@troops[troop_id] = {}
    end
    if @@troops[troop_id]["Exp"].nil?
      @@troops[troop_id]["Exp"] = []
    end
    @@troops[troop_id]["Exp"].push([exp, amp, condition])
  end
  
  #===================== CONFIGURACIÓN ========================
  
  #self.set_item_drop(1, 1, 75)
  
  #===================== CONFIGURACIÓN ========================
end

class Scene_Battle
  #--------------------------------------------------------------------------
  alias adv_battle_drops_main main unless $@
  def main
    get_troop_treasures
    adv_battle_drops_main
  end
  #--------------------------------------------------------------------------
  def get_troop_treasures
    @troop_treasures = {}
    @troop_treasures["Items"]   = []
    @troop_treasures["Weapons"] = []
    @troop_treasures["Armors"]  = []
    @troop_treasures["Gold"]    = []
    @troop_treasures["Exp"]     = []
    troop_id = $game_temp.battle_troop_id
    return if Battle_Drops.troops[troop_id].nil?
    if !Battle_Drops.troops[troop_id]["Items"].nil?
      for data in Battle_Drops.troops[troop_id]["Items"]
        if data[2] != nil
          next if (eval(data[2]) == false)
        end
        if rand(100) < data[1]
          if data[0].is_a?(Array)
            item = data[0][rand(data[0].size)]
          else
            item = data[0]
          end
          @troop_treasures["Items"].push(item)
        end
      end
    end
    if !Battle_Drops.troops[troop_id]["Weapons"].nil?
      for data in Battle_Drops.troops[troop_id]["Weapons"]
        if data[2] != nil
          next if eval(data[2]) == false
        end
        if rand(100) < data[1]
          if data[0].is_a?(Array)
            item = data[0][rand(data[0].size)]
          else
            item = data[0]
          end
          @troop_treasures["Weapons"].push(item)
        end
      end
    end
    if !Battle_Drops.troops[troop_id]["Armors"].nil?
      for data in Battle_Drops.troops[troop_id]["Armors"]
        if data[2] != nil
          next if eval(data[2]) == false
        end
        if rand(100) < data[1]
          if data[0].is_a?(Array)
            item = data[0][rand(data[0].size)]
          else
            item = data[0]
          end
          @troop_treasures["Armors"].push(item)
        end
      end
    end
    if !Battle_Drops.troops[troop_id]["Gold"].nil?
      for data in Battle_Drops.troops[troop_id]["Gold"]
        if data[2] != nil
          next if eval(data[2]) == false
        end
        gold = data[0] + rand(data[1] / 2) - rand(data[1] / 2)
        @troop_treasures["Gold"].push(gold) if gold > 0
      end
    end
    if !Battle_Drops.troops[troop_id]["Exp"].nil?
      for data in Battle_Drops.troops[troop_id]["Exp"]
        if data[2] != nil
          next if eval(data[2]) == false
        end
        exp = data[0] + rand(data[1] / 2) - rand(data[1] / 2)
        @troop_treasures["Exp"].push(exp) if exp > 0
      end
    end
  end
end

#==============================================================================
# * Parte 2 - Victoria (RTP)
#------------------------------------------------------------------------------
# Ésta parte modifica el método de victoria para añadir los componentes extra
# de victoria dependiendo de la tropa.
# Ésta versión usa el método propio del RTP, si se usa un script de victoria
# avanzada hay que adaptarlo a ese.
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Start After Battle Phase
  #--------------------------------------------------------------------------
  def start_phase5
    @phase = 5
    $game_system.me_play($game_system.battle_end_me)
    $game_system.bgm_play($game_temp.map_bgm)
    exp = 0
    gold = 0
    treasures = []
    for troop_exp in @troop_treasures["Exp"]
      exp += troop_exp
    end
    for troop_gold in @troop_treasures["Gold"]
      gold += troop_gold
    end
    for troop_item in @troop_treasures["Items"]
      treasures.push($data_items[troop_item])
    end
    for troop_weapon in @troop_treasures["Weapons"]
      treasures.push($data_weapons[troop_weapon])
    end
    for troop_armor in @troop_treasures["Armors"]
      treasures.push($data_armors[troop_armor])
    end
    for enemy in $game_troop.enemies
      unless enemy.hidden
        exp += enemy.exp
        gold += enemy.gold
        if rand(100) < enemy.treasure_prob
          if enemy.item_id > 0
            treasures.push($data_items[enemy.item_id])
          end
          if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
          end
          if enemy.armor_id > 0
            treasures.push($data_armors[enemy.armor_id])
          end
        end
      end
    end
    # Obtaining EXP
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      if actor.cant_get_exp? == false
        last_level = actor.level
        actor.exp += exp
        if actor.level > last_level
          @status_window.level_up(i)
        end
      end
    end
    # Obtaining gold
    $game_party.gain_gold(gold)
    # Obtaining items
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    @result_window = Window_BattleResult.new(exp, gold, treasures)
    @phase5_wait_count = 100
  end
end

Espero que os sea de utilidad.

Extra:
He hecho otra versión de la Parte 2 ésta vez compatible con el Battle Result by A3D Ver. 1.02 (link). Mirando ésto quizá se entienda mejor cómo adaptar mi script a victorias personalizadas. No es nada complicado, especialmente para los que tengan una base de scripts. Mi script tiene que ir debajo del de victoria personalizada para que funcione.

Código:
#==============================================================================
# * Parte 2 - Victoria (A3D)
#------------------------------------------------------------------------------
# Ésta parte modifica el método de victoria para añadir los componentes extra
# de victoria dependiendo de la tropa.
# Ésta versión usa el método propio del script Battle Result by A3D Ver. 1.02
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ? After battle phase start
  #--------------------------------------------------------------------------
  def start_phase5
    # It moves to phase 5
    @phase = 5
    # Performing battle end ME
    $game_system.me_play($game_system.battle_end_me)
    # You reset to BGM before the battle starting
    $game_system.bgm_play($game_temp.map_bgm)
    # Initializing EXP, the gold and the treasure
    exp = 0
    gold = 0
    treasures = []
    # Add Battle Troop Treasures
    for troop_exp in @troop_treasures["Exp"]
      exp += troop_exp
    end
    for troop_gold in @troop_treasures["Gold"]
      gold += troop_gold
    end
    for troop_item in @troop_treasures["Items"]
      treasures.push($data_items[troop_item])
    end
    for troop_weapon in @troop_treasures["Weapons"]
      treasures.push($data_weapons[troop_weapon])
    end
    for troop_armor in @troop_treasures["Armors"]
      treasures.push($data_armors[troop_armor])
    end
    # Loop
    for enemy in $game_troop.enemies
      # When the enemy hides and it is not state
      unless enemy.hidden
        # Adding acquisition EXP and the gold
        exp += enemy.exp
        gold += enemy.gold
        # Treasure appearance decision
        if rand(100) < enemy.treasure_prob
          if enemy.item_id > 0
            treasures.push($data_items[enemy.item_id])
          end
          if enemy.weapon_id > 0
            treasures.push($data_weapons[enemy.weapon_id])
          end
          if enemy.armor_id > 0
            treasures.push($data_armors[enemy.armor_id])
          end
        end
      end
    end
    # Treasure acquisition
    for item in treasures
      case item
      when RPG::Item
        $game_party.gain_item(item.id, 1)
      when RPG::Weapon
        $game_party.gain_weapon(item.id, 1)
      when RPG::Armor
        $game_party.gain_armor(item.id, 1)
      end
    end
    # Create Variable & Window
    @phase5_step = 1
    @wait_window_appear = A3D::WAIT_WINDOW_APPEAR
    @wait_running_number = A3D::WAIT_RUNNING_NUMBER
    @resultreceive_window = Window_ResultReceive.new(exp, gold, treasures)
    @resultgold_window = Window_ResultGold.new
    @resultparty_window = Window_ResultParty.new
    @actor_level_before = []
    @resultlevel_window = []
    @resultskill_window = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      @actor_level_before[i] = actor.level
      @resultlevel_window[i] = Window_ResultLevel.new(i)
      @resultskill_window[i] = Window_ResultSkill.new(i)
    end
  end
end

Espero que os sea de utilidad.
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Battle Drops

Mensaje por BlazeCrimson el 2017-04-05, 18:50

Gran aporte como siempre, éste lo quisiera adaptar para Descendencia Carmesí, sin duda tiene mucho jugo para exprimir: los condicionales, romper la limitación a uno y la posibilidad entre varios de una lista.

Saludos. gcool

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1124

Gracias : 110

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Battle Drops

Mensaje por Wecoc el 2017-04-10, 18:36

Gracias, agradezco tu comentario.

He hecho otro script que requiere el Advanced Battle Drops y lo que hace es que el grupo enemigo pueda usar un objeto si lo tiene en su lista de objetos dropeados, lo que da más realismo. Además en la configuración hay de opción de hacer que si lo usan y es un objeto consumible realmente se gaste, por lo que ya no lo dropearan.

Se puede definir para cada tipo de enemigo sus condiciones de uso de un objeto concreto, se hace desde el script pero de un modo similar a como funcionan las acciones de enemigo en la base de datos; normalmente lo único que habrá que ponerle es el "rating" (de 0 a 10), es decir la probabilidad de uso de ese objeto, que por defecto si no está en esa lista sería 0. Mirad el principio del script y lo veréis más claro.

Código:
#==============================================================================
# ** [XP] Enemy Item Actions
#------------------------------------------------------------------------------
# Autor: Wecoc (créditos opcionales)
#------------------------------------------------------------------------------
# Éste script requiere el Advanced Battle Drops y debe quedar debajo de ese.
# El enemigo puede usar los items que tiene el grupo enemigo (treasures).
#==============================================================================

module Battle_Drops
  #--------------------------------------------------------------------------
  # Opción: Quitar ese item de la lista de treasures cuando el enemigo lo usa
  #--------------------------------------------------------------------------
  DISCARD_WHEN_USED = true
  #--------------------------------------------------------------------------
  # Define aquí las posibles acciones de cada enemigo, siguiendo ésto:
  # Enemy ID => [[Item ID, rating, condition], ...]
  #  Enemy ID  - Nº del enemigo en la base de datos
  #  Item ID  - Nº del item en la base de datos
  #  rating    - prioridad de 0 a 10, opcional (por defecto vale 5)
  #  condition - código a evaluar, opcional solo para scripters
  #--------------------------------------------------------------------------
  PROPERTIES = {1 => [[1, 3], [2, 4], [3, 5]]}
  #--------------------------------------------------------------------------
end

class RPG::Enemy::Action
  define_method(:item_id) {@item_id ||= 0}
  attr_accessor :item_id
end

class Scene_Battle
  attr_reader :troop_treasures
end

class Game_Enemy
  #--------------------------------------------------------------------------
  # * Make Action
  #--------------------------------------------------------------------------
  def make_action
    self.current_action.clear
    return unless self.movable?
    available_actions = []
    rating_max = 0
    # Current actions
    for action in self.actions
      action.item_id = 0
      n = $game_temp.battle_turn
      a = action.condition_turn_a
      b = action.condition_turn_b
      if (b == 0 and n != a) or
        (b > 0 and (n < 1 or n < a or n % b != a % b))
        next
      end
      if self.hp * 100.0 / self.maxhp > action.condition_hp
        next
      end
      if $game_party.max_level < action.condition_level
        next
      end
      switch_id = action.condition_switch_id
      if switch_id > 0 and $game_switches[switch_id] == false
        next
      end
      available_actions.push(action)
      if action.rating > rating_max
        rating_max = action.rating
      end
    end
    # Item actions
    if $scene.is_a?(Scene_Battle)
      treasures = $scene.troop_treasures["Items"]
      if Battle_Drops::PROPERTIES.keys.include?(@enemy_id)
        data = Battle_Drops::PROPERTIES[@enemy_id]
        for item_id in treasures
          properties = data.select{|i| i[0] == item_id}[0]
          next if properties.nil?
          action = RPG::Enemy::Action.new
          action.kind = 2
          action.item_id = item_id
          unless properties[1].nil?
            action.rating = properties[1]
          end
          unless properties[2].nil?
            n = $game_temp.battle_turn
            next if self.instance_eval(properties[2]) == false
          end
          available_actions.push(action)
          if action.rating > rating_max
            rating_max = action.rating
          end
        end
      end
    end
    # Calculate total with max rating value at 3 (exclude 0 or less)
    ratings_total = 0
    for action in available_actions
      if action.rating > rating_max - 3
        ratings_total += action.rating - (rating_max - 3)
      end
    end
    if ratings_total > 0
      value = rand(ratings_total)
      for action in available_actions
        if action.rating > rating_max - 3
          if value < action.rating - (rating_max - 3)
            self.current_action.kind = action.kind
            self.current_action.basic = action.basic
            self.current_action.skill_id = action.skill_id
            self.current_action.item_id = action.item_id
            self.current_action.decide_random_target_for_enemy
            return
          else
            value -= action.rating - (rating_max - 3)
          end
        end
      end
    end
  end
end

class Game_Troop
  def item_can_use?(item_id)
    occasion = $data_items[item_id].occasion
    if $game_temp.in_battle
      return (occasion == 0 or occasion == 1)
    end
    return (occasion == 0 or occasion == 2)
  end
end

class Scene_Battle
  alias wecenemy_item_action_result make_item_action_result
  def make_item_action_result
    @item = $data_items[@active_battler.current_action.item_id]
    if @action_battler.is_a?(Game_Actor)
      wecenemy_item_action_result
      return
    end
    unless $game_troop.item_can_use?(@item.id)
      @phase4_step = 1
      return
    end
    if @item.consumable
      if Battle_Drops::DISCARD_WHEN_USED
        index = @troop_treasures["Items"].index(@item.id)
        @troop_treasures["Items"].delete_at(index)
      end
    end
    @help_window.set_text(@item.name, 1)
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    @common_event_id = @item.common_event_id
    index = @active_battler.current_action.target_index
    target = $game_party.smooth_target_actor(index)
    set_target_battlers(@item.scope)
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
end

No sé si ya lo había dicho pero:
Espero que os sea de utilidad.
(lo repetí dos veces antes sin querer xDD)

Saludos.
avatar
Wecoc
Administrador
Administrador



Créditos 9370

Gracias : 517

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Advanced Battle Drops

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.