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 4193 miembros registrados.
El último usuario registrado es Godot.

Nuestros miembros han publicado un total de 85199 mensajes en 12130 argumentos.

[XP] Trucos de asignaciones en la Base de Datos

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Wecoc el 2017-07-21, 20:36

En éste topic mostraré algunos modos poco usuales de usar las ranuras de la Base de Datos.

1. Clases en la ranura de Personajes



Ésto nos puede interesar si en nuestro juego los personajes no tienen una clase fija si no un sistema de selección de clases. En VX y posteriores los parámetros que hasta ahora son de actor pasan a estar en la ranura de profesión; eso es adecuado en esos casos, puesto que sea quien sea el personaje a veces nos interesará más que su parámetro fuerza dependa de su profesión, por decir algo.

Para hacer eso en XP creamos una ranura con cada profesión dentro de Personajes (manteniendo iguales las del apartado Profesiones) tal como se ve en la imagen.

Ahí definimos los niveles inicial y final, la curva de experiencia, los parámetros y el estado fijado de las ranuras para esa clase. El personaje pasará a usar esos según su clase.

Luego se pone el script que pongo a continuación encima de main. La única línea que hay que cambiar es la del principio del todo con la global CLASS_ACTORS. En ella se define para cada ID de clase qué ID de actor hemos asignado. Algunas clases pueden no definirse dentro de los actores, en ese caso los parámetros usados si el actor tiene una de esas clases seguirán siendo sus parámetros normales.

Código:
#==============================================================================
# ** [XP] Clases en la ranura de Personajes
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  CLASS_ACTORS = {1=>9, 2=>10, 3=>11, 4=>12, 5=>13, 6=>14, 7=>15, 8=>16}
  #--------------------------------------------------------------------------
  alias refresh_data_class_id class_id= unless $@
  def class_id=(class_id)
    refresh_data_class_id(class_id)
    refresh_data
  end
  #--------------------------------------------------------------------------
  def refresh_data
    make_exp_list
    self.exp = @exp
    self.hp = @hp
    self.sp = @sp
  end
  #--------------------------------------------------------------------------
  def class_actor
    if CLASS_ACTORS.keys.include?(@class_id)
      return $data_actors[CLASS_ACTORS[@class_id]]
    else
      return $data_actors[@actor_id]
    end
  end
  #--------------------------------------------------------------------------
  def make_exp_list
    actor = class_actor
    @exp_list[1] = 0
    pow_i = 2.4 + actor.exp_inflation / 100.0
    for i in 2..100
      if i > actor.final_level
        @exp_list[i] = 0
      else
        n = actor.exp_basis * ((i + 3) ** pow_i) / (5 ** pow_i)
        @exp_list[i] = @exp_list[i-1] + Integer(n)
      end
    end
  end
  #--------------------------------------------------------------------------
  def level=(level)
    level = [[level, class_actor.final_level].min, 1].max
    self.exp = @exp_list[level]
  end
  #--------------------------------------------------------------------------
  def base_maxhp
    return class_actor.parameters[0, @level]
  end
  #--------------------------------------------------------------------------
  def base_maxsp
    return class_actor.parameters[1, @level]
  end
  #--------------------------------------------------------------------------
  def base_str
    n = class_actor.parameters[2, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.str_plus : 0
    n += armor1 != nil ? armor1.str_plus : 0
    n += armor2 != nil ? armor2.str_plus : 0
    n += armor3 != nil ? armor3.str_plus : 0
    n += armor4 != nil ? armor4.str_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  def base_dex
    n = class_actor.parameters[3, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.dex_plus : 0
    n += armor1 != nil ? armor1.dex_plus : 0
    n += armor2 != nil ? armor2.dex_plus : 0
    n += armor3 != nil ? armor3.dex_plus : 0
    n += armor4 != nil ? armor4.dex_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  def base_agi
    n = class_actor.parameters[4, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.agi_plus : 0
    n += armor1 != nil ? armor1.agi_plus : 0
    n += armor2 != nil ? armor2.agi_plus : 0
    n += armor3 != nil ? armor3.agi_plus : 0
    n += armor4 != nil ? armor4.agi_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  def base_int
    n = class_actor.parameters[5, @level]
    weapon = $data_weapons[@weapon_id]
    armor1 = $data_armors[@armor1_id]
    armor2 = $data_armors[@armor2_id]
    armor3 = $data_armors[@armor3_id]
    armor4 = $data_armors[@armor4_id]
    n += weapon != nil ? weapon.int_plus : 0
    n += armor1 != nil ? armor1.int_plus : 0
    n += armor2 != nil ? armor2.int_plus : 0
    n += armor3 != nil ? armor3.int_plus : 0
    n += armor4 != nil ? armor4.int_plus : 0
    return [[n, 1].max, 999].min
  end
  #--------------------------------------------------------------------------
  def equip_fix?(equip_type)
    case equip_type
    when 0  # Weapon
      return class_actor.weapon_fix
    when 1  # Shield
      return class_actor.armor1_fix
    when 2  # Head
      return class_actor.armor2_fix
    when 3  # Body
      return class_actor.armor3_fix
    when 4  # Accessory
      return class_actor.armor4_fix
    end
    return false
  end
end

Si alguno de los puntos mencionados (experiencia, fijado de equipo...) no interesa sobreescribirlo por el de la clase, habrá que borrar la sobreescritura del script, buscando el método o métodos que la alteren.

2. Battlers individuales en Grupos Enemigos



Ésto está pensado para asignar cierta AI al enemigo, o en general cierto engine que ocurra cuando éste está en la tropa.
La idea es crear una ranura con un enemigo en la que se le define cierto engine de batalla.
Luego las tropas enemigas que usan ese enemigo a parte de usar su engine de batalla como siempre, también consideran el engine creado para ese enemigo individualmente.
Eso da más opciones al sistema de engines de batalla que las que hay por defecto.

Luego se pone el script que pongo a continuación encima de main. La única línea que hay que cambiar es la que define TROOP_ENEMIES justo al principio de la clase Scene_Battle. En ella se define para cada ID de enemigo qué ID de tropa hemos asignado. De nuevo no hay que crear una ranura para cada enemigo sino solo para aquellos que requieran de un engine individualizado.

Código:
#==============================================================================
# ** [XP] Battlers individuales en Grupos Enemigos
#==============================================================================

class Game_System
  attr_reader :actor_interpreters
  attr_reader :enemy_interpreters
  alias battle_interpreter_ini initialize unless $@
  def initialize
    battle_interpreter_ini
    @actor_interpreters = []
    @enemy_interpreters = []
  end
end

class Game_Troop
  def setup(troop_id)
    @enemies = []
    troop = $data_troops[troop_id]
    $game_system.actor_interpreters.clear
    $game_system.enemy_interpreters.clear
    for i in 0...$game_party.actors.size
      actor = $data_actors[$game_party.actors[i].id]
      if actor != nil
        interpreter = Interpreter.new(0, false)
        interpreter.setup(nil, i)
        $game_system.actor_interpreters << interpreter
      end
    end
    for i in 0...troop.members.size
      enemy = $data_enemies[troop.members[i].enemy_id]
      if enemy != nil
        @enemies.push(Game_Enemy.new(troop_id, i))
        interpreter = Interpreter.new(0, false)
        interpreter.setup(nil, i)
        $game_system.enemy_interpreters << interpreter
      end
    end
  end
end

class Scene_Battle
  #--------------------------------------------------------------------------
  TROOP_ACTORS  = {}
  #--------------------------------------------------------------------------
  TROOP_ENEMIES = {1=>33, 2=>34}
  #--------------------------------------------------------------------------
  alias battle_interpreter_setup_event setup_battle_event unless $@
  def setup_battle_event
    battle_interpreter_setup_event
    if @phase == 1
      setup_battle_event_actors
      setup_battle_event_enemies
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_event_actors
    for member_index in 0...$game_party.actors.size
      actor = $game_party.actors[member_index]
      next unless actor.exist?
      actor_id = actor.id
      next if !TROOP_ACTORS.keys.include?(actor_id)
      troop = $data_troops[TROOP_ACTORS[actor_id]]
      interpreter = $game_system.actor_interpreters[member_index]
      next if interpreter.running?
      for index in 0...troop.pages.size
        page = troop.pages[index]
        next if page.span > 0
        c = page.condition
        unless c.turn_valid or c.enemy_valid or c.actor_valid or c.switch_valid
          next
        end
        if c.turn_valid
          n = $game_temp.battle_turn
          a = c.turn_a
          b = c.turn_b
          if (b == 0 and n != a) or
           (b > 0 and (n < 1 or n < a or n % b != a % b))
            next
          end
        end
        if c.enemy_valid
          enemy = $game_troop.enemies[c.enemy_index]
          if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
            next
          end
        end
        if c.actor_valid
          actor = $game_actors[c.actor_id]
          if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
            next
          end
        end
        if c.switch_valid
          if $game_switches[c.switch_id] == false
            next
          end
        end
        $game_system.actor_interpreters[member_index].setup(page.list, actor_id)
      end
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_event_enemies
    for member_index in 0...$game_troop.enemies.size
      enemy = $game_troop.enemies[member_index]
      next unless enemy.exist?
      enemy_id = enemy.id
      next if !TROOP_ENEMIES.keys.include?(enemy_id)
      troop = $data_troops[TROOP_ENEMIES[enemy_id]]
      interpreter = $game_system.enemy_interpreters[member_index]
      next if interpreter.running?
      for index in 0...troop.pages.size
        page = troop.pages[index]
        next if page.span > 0
        c = page.condition
        unless c.turn_valid or c.enemy_valid or c.actor_valid or c.switch_valid
          next
        end
        if c.turn_valid
          n = $game_temp.battle_turn
          a = c.turn_a
          b = c.turn_b
          if (b == 0 and n != a) or
           (b > 0 and (n < 1 or n < a or n % b != a % b))
            next
          end
        end
        if c.enemy_valid
          enemy = $game_troop.enemies[c.enemy_index]
          if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
            next
          end
        end
        if c.actor_valid
          actor = $game_actors[c.actor_id]
          if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
            next
          end
        end
        if c.switch_valid
          if $game_switches[c.switch_id] == false
            next
          end
        end
        $game_system.enemy_interpreters[member_index].setup(page.list, enemy_id)
      end
    end
  end
  #--------------------------------------------------------------------------
  alias enemy_interpreter_update41 update_phase4_step1 unless $@
  def update_phase4_step1
    enemy_interpreter_update41
    if !@active_battler.nil?
      case @active_battler
      when Game_Actor
        setup_actor_auto_event
      when Game_Enemy
        setup_enemy_auto_event
      end
    end
  end
  #--------------------------------------------------------------------------
  def setup_actor_auto_event
    actor_id = @active_battler.id
    return if !TROOP_ACTORS.keys.include?(actor_id)
    troop = $data_troops[TROOP_ACTORS[actor_id]]
    for i in 0...$game_party.actors.size
      if $game_party.actors[i].id == actor_id
        member_index = i
        break
      end
    end
    interpreter = $game_system.actor_interpreters[member_index]
    return if interpreter.running?
    for index in 0...troop.pages.size
      page = troop.pages[index]
      next if page.span == 0
      c = page.condition
      unless c.turn_valid or c.enemy_valid or c.actor_valid or c.switch_valid
        next
      end
      if c.turn_valid
        n = $game_temp.battle_turn
        a = c.turn_a
        b = c.turn_b
        if (b == 0 and n != a) or
         (b > 0 and (n < 1 or n < a or n % b != a % b))
          next
        end
      end
      if c.enemy_valid
        enemy = $game_troop.enemies[c.enemy_index]
        if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
          next
        end
      end
      if c.actor_valid
        actor = $game_actors[c.actor_id]
        if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
          next
        end
      end
      if c.switch_valid
        if $game_switches[c.switch_id] == false
          next
        end
      end
      $game_system.actor_interpreters[member_index].setup(page.list, actor_id)
    end
  end
  #--------------------------------------------------------------------------
  def setup_enemy_auto_event
    enemy_id = @active_battler.id
    return if !TROOP_ENEMIES.keys.include?(enemy_id)
    troop = $data_troops[TROOP_ENEMIES[enemy_id]]
    member_index = @active_battler.instance_eval("@member_index") - 1
    interpreter = $game_system.enemy_interpreters[member_index]
    return if interpreter.running?
    for index in 0...troop.pages.size
      page = troop.pages[index]
      next if page.span == 0
      c = page.condition
      unless c.turn_valid or c.enemy_valid or c.actor_valid or c.switch_valid
        next
      end
      if c.turn_valid
        n = $game_temp.battle_turn
        a = c.turn_a
        b = c.turn_b
        if (b == 0 and n != a) or
         (b > 0 and (n < 1 or n < a or n % b != a % b))
          next
        end
      end
      if c.enemy_valid
        enemy = $game_troop.enemies[c.enemy_index]
        if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
          next
        end
      end
      if c.actor_valid
        actor = $game_actors[c.actor_id]
        if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
          next
        end
      end
      if c.switch_valid
        if $game_switches[c.switch_id] == false
          next
        end
      end
      $game_system.enemy_interpreters[member_index].setup(page.list, enemy_id)
    end
  end
  #--------------------------------------------------------------------------
  def update
    for i in 0...$game_system.actor_interpreters.size
      interpreter = $game_system.actor_interpreters[i]
      interpreter.update if interpreter.running?
    end
    for i in 0...$game_system.enemy_interpreters.size
      interpreter = $game_system.enemy_interpreters[i]
      interpreter.update if interpreter.running?
    end
    if $game_system.battle_interpreter.running?
      $game_system.battle_interpreter.update
      if $game_temp.forcing_battler == nil
        unless $game_system.battle_interpreter.running?
          unless judge
            setup_battle_event
          end
        end
        if @phase != 5
          @status_window.refresh
        end
      end
    end
    $game_system.update
    $game_screen.update
    if $game_system.timer_working and $game_system.timer == 0
      $game_temp.battle_abort = true
    end
    @help_window.update
    @party_command_window.update
    @actor_command_window.update
    @status_window.update
    @message_window.update
    @spriteset.update
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      if $game_temp.transition_name == ""
        Graphics.transition(20)
      else
        Graphics.transition(40, "Graphics/Transitions/" +
          $game_temp.transition_name)
      end
    end
    if $game_temp.message_window_showing
      return
    end
    if @spriteset.effect?
      return
    end
    if $game_temp.gameover
      $scene = Scene_Gameover.new
      return
    end
    if $game_temp.to_title
      $scene = Scene_Title.new
      return
    end
    if $game_temp.battle_abort
      $game_system.bgm_play($game_temp.map_bgm)
      battle_end(1)
      return
    end
    if @wait_count > 0
      @wait_count -= 1
      return
    end
    for i in 0...$game_system.actor_interpreters.size
      interpreter = $game_system.actor_interpreters[i]
      if $game_temp.forcing_battler == nil and interpreter.running?
        return
      end
    end
    for i in 0...$game_system.enemy_interpreters.size
      interpreter = $game_system.enemy_interpreters[i]
      if $game_temp.forcing_battler == nil and interpreter.running?
        return
      end
    end
    if $game_temp.forcing_battler == nil and
       $game_system.battle_interpreter.running?
      return
    end
    case @phase
    when 1  # pre-battle phase
      update_phase1
    when 2  # party command phase
      update_phase2
    when 3  # actor command phase
      update_phase3
    when 4  # main phase
      update_phase4
    when 5  # after battle phase
      update_phase5
    end
  end  
end

Sé que en éste caso es más complejo pero es cuestión de probarlo a ver si os sirve.

De momento lo dejo aquí pero más adelante subiré algun otro truco del mismo estilo.
avatar
Wecoc
Administrador
Administrador



Créditos 9265

Gracias : 502

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Wecoc el 2017-07-29, 22:14

Vaya, qué poco interés levantó este tema. Creía que os haría más gracia...
Traigo dos más, que pareceran algo contradictorios pero ya veréis que en realidad no. A ver si os parecen más interesantes.
Ya habéis visto como va la cosa así que me ahorro imágenes y tal.
Me reservo dos más en la manga, los subiré más adelante, para rematar.

3. Items en la ranura de Habilidades (con función de habilidad)

La idea es crear un item (poción, semilla de vida, lo que sea) que en realidad sea una habilidad, aunque no lo parezca.
Eso implica que usa todos los parámetros de la habilidad, usando skill_effect en vez de item_effect.
Nuevamente a los que hemos ido viendo hay que crear ámbas versiones, el 'atajo' dentro de Objetos y el 'real' dentro de Habilidades.

A quien se pregunte para qué puede servir eso, las habilidades tienen algunas características que los objetos no tienen.
Una de ellas es la distinción entre habilidad física y habilidad mágica.
Aunque no lo parezca porque es muy sutil, esa distinción en XP existe; se considera habilidad mágica aquella con el parámetro Ataque mayor que 0.
Entonces, con éste método se pueden hacer items de daño físico o daño mágico. Además, la habilidad da más opciones para el cálculo de daño y más posibles efectos en los parámetros del target.

La habilidad es totalmente válida como habilidad y algún actor puede tenerla y todo, la única diferencia es que ahora también hay un atajo como objeto, con el cual al usarlo no se gasta SP, pero se puede gastar el objeto (o no).
Algo interesante a tener en cuenta es que en Menú cuando usas un objeto no se define quien lo usa, en cambio una habilidad sí.
Pues bien, lo he puesto de modo que se sobre-entienda que cada uno está usando el objeto en sí mismo. Eso significa que habilidades de resucitar no sirven para ese atajo con items... o al menos eso creo xD

Se necesita éste script encima de main:

Código:
#==============================================================================
# ** [XP] Items en la ranura de Habilidades
#==============================================================================

module DatabaseEX
  
  # ID item => ID skill     [ Skill Function ]
  SKILL_ITEMS = {33 => 81, 34 => 82}
  
  # ID skill => ID item     [ Item Function ]
  ACTION_ITEMS = {}
  
end

class Game_Enemy < Game_Battler
  def make_action
    self.current_action.clear
    unless self.movable?
      return
    end
    available_actions = []
    rating_max = 0
    for action in self.actions
      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
    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
            if action.skill_id > 0
              if DatabaseEX::ACTION_ITEMS.keys.include?(action.skill_id)
                self.current_action.skill_id = 0
                item_id = DatabaseEX::ACTION_ITEMS[action.skill_id]
                self.current_action.item_id = item_id
              else
                self.current_action.skill_id = action.skill_id
                self.current_action.item_id = 0
              end
            else
              self.current_action.skill_id = action.skill_id
              self.current_action.item_id = 0
            end
            self.current_action.decide_random_target_for_enemy
            return
          else
            value -= action.rating - (rating_max - 3)
          end
        end
      end
    end
  end
end

class Interpreter
  def command_339
    unless $game_temp.in_battle
      return true
    end
    if $game_temp.battle_turn == 0
      return true
    end
    iterate_battler(@parameters[0], @parameters[1]) do |battler|
      if battler.exist?
        battler.current_action.kind = @parameters[2]
        if battler.current_action.kind == 0
          battler.current_action.basic = @parameters[3]
        else
          skill_id = @parameters[3]
          if DatabaseEX::ACTION_ITEMS.keys.include?(action.skill_id)
            battler.current_action.skill_id = 0
            battler.current_action.item_id = DatabaseEX::ACTION_ITEMS[skill_id]
          else
            battler.current_action.skill_id = skill_id
            battler.current_action.item_id = 0
          end
        end
        if @parameters[4] == -2
          if battler.is_a?(Game_Enemy)
            battler.current_action.decide_last_target_for_enemy
          else
            battler.current_action.decide_last_target_for_actor
          end
        elsif @parameters[4] == -1
          if battler.is_a?(Game_Enemy)
            battler.current_action.decide_random_target_for_enemy
          else
            battler.current_action.decide_random_target_for_actor
          end
        elsif @parameters[4] >= 0
          battler.current_action.target_index = @parameters[4]
        end
        battler.current_action.forcing = true
        if battler.current_action.valid? and @parameters[5] == 1
          $game_temp.forcing_battler = battler
          @index += 1
          return false
        end
      end
    end
    return true
  end
end

class Scene_Item
  def update_target
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      unless $game_party.item_can_use?(@item.id)
        @item_window.refresh
      end
      @item_window.active = true
      @target_window.visible = false
      @target_window.active = false
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.item_number(@item.id) == 0
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      if @target_window.index == -1
        used = false
        for i in $game_party.actors
          if DatabaseEX::SKILL_ITEMS.keys.include?(@item.id)
            skill = $data_skills[DatabaseEX::SKILL_ITEMS]
            user = $game_party.actors[i]
            used |= i.skill_effect(user, skill)
          else
            used |= i.item_effect(@item)
          end
        end
      end
      if @target_window.index >= 0
        target = $game_party.actors[@target_window.index]
        if DatabaseEX::SKILL_ITEMS.keys.include?(@item.id)
          skill = $data_skills[DatabaseEX::SKILL_ITEMS]
          user = $game_party.actors[@target_window.index]
          used |= target.skill_effect(user, skill)
        else
          used = target.item_effect(@item)
        end
      end
      if used
        $game_system.se_play(@item.menu_se)
        if @item.consumable
          $game_party.lose_item(@item.id, 1)
          @item_window.draw_item(@item_window.index)
        end
        @target_window.refresh
        if $game_party.all_dead?
          $scene = Scene_Gameover.new
          return
        end
        if @item.common_event_id > 0
          $game_temp.common_event_id = @item.common_event_id
          $scene = Scene_Map.new
          return
        end
      end
      unless used
        $game_system.se_play($data_system.buzzer_se)
      end
      return
    end
  end
end

class Scene_Battle
  def make_item_action_result
    @item = $data_items[@active_battler.current_action.item_id]
    unless @active_battler.current_action.forcing
      unless $game_party.item_can_use?(@item.id)
        @phase4_step = 1
        return
      end
      if @item.consumable && @active_battler.is_a?(Game_Actor)
        $game_party.lose_item(@item.id, 1)
      end
    end
    @help_window.set_text(@item.name, 1)
    if DatabaseEX::SKILL_ITEMS.keys.include?(@item.id)
      skill = $data_skills[DatabaseEX::SKILL_ITEMS]
      @animation1_id = skill.animation1_id
      @animation2_id = skill.animation2_id
      @common_event_id = skill.common_event_id
      index = @active_battler.current_action.target_index
      target = $game_party.smooth_target_actor(index)
      set_target_battlers(skill.scope)
      for target in @target_battlers
        target.skill_effect(@active_battler, skill)
      end
    else
      @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
end

Los "puentes" entre item y skill se definen en la global SKILL_ITEMS al principio del script.

4. Items en la ranura de Habilidades (con función de item)

La base es la misma, pero en éste caso lo que se sigue usando son todos los efectos de item, es decir la ranura de habilidad solo hace de atajo, totalmente al revés de antes.

Vaya por Dios, ¿no decías que era interesante asignar como Habilidades a Items porque tienen más parámetros? ¿De qué puede servir hacerlo al revés?

No os preocupéis pequeños saltamontes, porque en éste caso el propósito es distinto, y aunque en el caso anterior puede llegar a soslayarlo, en algunos casos puede interesar más conservar la función de item.
En éste caso el atajo sirve básicamente para que los enemigos puedan usar objetos.
Cuando defines acciones a un enemigo, te da la opción de acciones fundamentales y habilidades, pero no objetos.
Usando éste atajo podemos definir nuestra "falsa habilidad" como acción y que el enemigo use el item.

No solo eso; tanto para personajes como enemigos el parámetro "Forzar acción" no da la opción de usar item, pero de éste modo sí que se puede, usando eso.
Al forzar item no se gasta el objeto, ni siquiera hay que poseerlo. Pero eso es solo una propiedad secundaria, la principal es la de enemigos que usan objetos.

Tenéis que usar éste script:

Ah sí, es el mismo que el del punto 3, qué descuido por mi parte... Solo que otra global, en éste caso ACTION_ITEMS ;)

Como dije, pronto más.
avatar
Wecoc
Administrador
Administrador



Créditos 9265

Gracias : 502

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Calayax el 2017-07-30, 04:21


¡Dios! todo eso resulta bastante útil en muchos sentidos. La verdad es que no me había tomado el tiempo de leerlo todo a detalle y además nunca (hasta ahora) había tenido que trabajar con las habilidades, items, si usaba para algo el actors era para poner nombres a cosas determinadas por medio del usuario y listo. Gracias por los scripts, probablemente utilice más de alguno cuando me meta a fondo en la base de datos.
avatar
Calayax
Soñador
Soñador

0/3

Créditos 677

Gracias : 42

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por erpks77 el 2017-08-06, 21:06

Guau, menudo trabajazo, Wecoc. Muchas gracias, es información muy interesante. Espero poder sacar un poco de tiempo para leerla detenidamente y poder aplicarla a mi proyecto.
avatar
erpks77
Iniciado
Iniciado

0/3

Créditos 35

Gracias : 6

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Wecoc el 2017-08-08, 18:50

Gracias por comentar.

En muchos casos no es necesario hacer doble ranura, por ejemplo si es para definir a actores solo un parámetro extra, como la descripción que tienen los items y otros, no recomiendo crear una doble ranura para eso y obtener la descripción de allí, en cambio recomiendo definir la descripción vía script directamente y ya está.

Otro caso que no vale la pena, aunque me lo llegué a plantear, es el de definir equipo en la ranura de objetos (o en la de habilidades) para aplicar cierto efecto al equipar (y quizá des-aplicarlo al des-equipar xD). Rara vez se querrá llamar a un evento común o algo así cuando se equipe algo, más teniendo en cuenta que te quitaría del menú al hacerlo si no haces trampas extrañas. Las otras características que pueda ofrecer la doble ranura no valen de mucho. El "efecto sonoro en menú" que ofrecen los items puede ser interesante al equipar, por ejemplo estaría que al equipar un arma de fuego suene ruido de fuego; no obstante eso se puede definir por script sin tener que usar doble ranura.

En otros casos en cambio puede ser más interesante, si el parámetro implica cierto sistema detrás; por ejemplo Yanfly hace poco subió un plugin que permite nombrar ciertos objetos como el jugador quiera, como si nombrara actores. Una buena opción para eso es hacer doble ranura objeto/actor, nombrar el actor y luego al mostrar por script el nombre de ese item, obtener el del actor en cambio. Es algo como lo que dijo Calayax, lo único algo más crítico es esa última parte.

Otros ejemplos serían el ERON module que si no recuerdo mal usaba doble ranura enemigo/actor para hacer enemigos con armas y niveles, y cosas de ese estilo (no es el único caso aunque no es muy habitual). Ejemplos más típicos son el de interruptor/item para hacer una tienda de interruptores o skill/item para una tienda de habilidades o misión/item para hacer un sistema de misiones. Todo eso son ejemplos clásicos de uso de doble ranura de la Base de Datos, así que en realidad no me estoy inventando nada ni mucho menos xD

Otro ejemplo, aunque no es exactamente "doble ranura" sinó uso de ranura para algo que hasta ahora era interno, es crear ranuras para los movimientos básicos de actor dentro de Skills, tal como se hace a partir de VX. Me refiero a crear skills "Ataque", "Defensa", "Esperar", "Huir", y quizá también "Crítico" o cosas nuevas como "Ataque Doble"... y luego vía script trasladar las acciones básicas por esas skills. La utilidad de eso es que luego puedes personalizar las acciones básicas mucho más, especialmente porque las skills pueden llamar a eventos comunes.

El de nombrar objetos y el de ataques básicos como skill son los dos "ases en la manga" que mencioné que explicaría pero son más completos que lo que he ido subiendo aquí; requieren más reescrituras de la base e incluso engines o scripts suplementarios, así que no lo cubriré. Igualmente la información aquí queda para quien la quiera usar, subrayé cada "idea" que ha salido.

Eso es todo.
avatar
Wecoc
Administrador
Administrador



Créditos 9265

Gracias : 502

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Lance Amano el 2017-08-11, 02:42

El tercer script me llamó la atención pero asumo que habría problemas de incompatibilidad con otros scripts que modifiquen el uso de habilidades y objetos, ¿correcto?
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 212

Gracias : 22

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Wecoc el 2017-08-11, 08:43

No modifica nada de las habilidades, al menos directamente. De los items sí, así que puede haber alguna incompatibilidad, aunque hay que probarlo. En muchos casos en la batalla del maker es inviable aplicar alias, lo que la convierte en una parte poco compatible, pero la mayoría de sus incompatibilidades son arreglables juntando en uno los métodos conflictivos de ámbos scripts.
avatar
Wecoc
Administrador
Administrador



Créditos 9265

Gracias : 502

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

Mensaje por Lance Amano el 2017-08-11, 14:04

Ya veo. Supongo que habría que probarlo como tú lo dijiste.

Lo más probable es que halla problemas con 2 script que uso: el de Farenheith que crea abilidades que consumen items y el de modern algebra que crea items que enseñan abilidades.
avatar
Lance Amano
Soñador
Soñador

0/3

Créditos 212

Gracias : 22

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Trucos de asignaciones en la Base de Datos

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.