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

Nuestros miembros han publicado un total de 85870 mensajes en 12230 argumentos.

[XP] DFS Item & Skill Restrictions

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] DFS Item & Skill Restrictions

Mensaje por Wecoc el 2017-10-23, 01:42

DFS Item Restrictions

Éste script permite añadir restricciones a la hora de usar un item.
Cuando por defecto usas un item desde el menú no se especifica qué actor lo está usando.
Éste script opcionalmente cambia esa configuración para que se especifique el usuario del objeto, de modo que luego se le pueden añadir muchas restricciones a ese usuario.
Ese parámetro se define al inicio del script.

Anotación:
Esas restricciones no pueden depender del target, ya que eso es otro apartado distinto llamado Scope; solo pueden depender del usuario para saber si puede
usar el item o no, o bien en casos puntuales de otros parámetros a parte. Para que dependa del target usad el script Advanced Scope

Las restricciones se definen al iniciar partida y se pueden editar a medio juego tanto como se quiera, y un mismo objeto puede tener múltiples restricciones.
Para que eso sea posible el script requiere el Data File Save.

Script

Código:
#==============================================================================
# ** [XP] DFS Item Restrictions v1.0
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# ATENCIÓN! Requiere el script Data File Save
#==============================================================================

module DFS
  #--------------------------------------------------------------------------
  # Seleccionar actor para usar item en menú
  #--------------------------------------------------------------------------
      MENU_SELECT_ACTOR_ITEM = true
  #--------------------------------------------------------------------------
end

#--------------------------------------------------------------------------
# * Crear variable de restricciones de objeto
#--------------------------------------------------------------------------
class RPG::Item
  define_method(:item_restrictions) { @item_restrictions = [] }
end
#--------------------------------------------------------------------------
# * Definir nueva restricción a un objeto
#--------------------------------------------------------------------------
def set_item_restriction(item, restriction)
  item = $data_items[item] if item.is_a?(Integer)
  item.item_restrictions.push(restriction)
end
#--------------------------------------------------------------------------
# * Vaciar todas las restricciones de un objeto
#--------------------------------------------------------------------------
def clear_item_restrictions(item)
  item = $data_items[item] if item.is_a?(Integer)
  item.item_restrictions.clear
end

#==============================================================================
# ** Scene_Title
#==============================================================================

class Scene_Title
  alias define_item_rest_start command_new_game unless $@
  def command_new_game
    define_item_rest_start
    #------------------------------------------------------------------------
    # Definir aquí las restricciones por defecto de los objetos
    # Ejemplo: set_item_restriction(1, "self.level >= 10")
    
    
    #------------------------------------------------------------------------
  end
end

if DFS::MENU_SELECT_ACTOR_ITEM
#==============================================================================
# ** Window_Item
#==============================================================================

class Window_Item < Window_Selectable
  alias initialize_item_rest_select initialize unless $@
  def initialize(actor = nil)
    @actor = actor
    initialize_item_rest_select
    unless $game_temp.in_battle
      self.y = 128
      self.height = 352
    end
  end
end

#==============================================================================
# ** Scene_Menu
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # * Update Command
  #--------------------------------------------------------------------------
  alias update_command_item_rest_select update_command unless $@
  def update_command
    if Input.trigger?(Input::C)
      if @command_window.index == 0 && $game_party.actors.size > 0
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
        return
      end
    end
    update_command_item_rest_select
  end
  #--------------------------------------------------------------------------
  # * Update Status
  #--------------------------------------------------------------------------
  alias update_status_item_rest_select update_status unless $@
  def update_status
    if Input.trigger?(Input::C)
      if @command_window.index == 0
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item.new(@status_window.index)
        return
      end
    end
    update_status_item_rest_select
  end
end

#==============================================================================
# ** Scene_Item
#==============================================================================

class Scene_Item
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0)
    @actor_index = actor_index
  end
  #--------------------------------------------------------------------------
  # * Main
  #--------------------------------------------------------------------------
  def main
    @actor = $game_party.actors[@actor_index]
    @help_window = Window_Help.new
    @status_window = Window_SkillStatus.new(@actor)
    @item_window = Window_Item.new(@actor)
    @item_window.help_window = @help_window
    @target_window = Window_Target.new
    @target_window.visible = false
    @target_window.active = false
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @status_window.dispose
    @item_window.dispose
    @target_window.dispose
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  def update
    @help_window.update
    @status_window.update
    @item_window.update
    @target_window.update
    if @item_window.active
      update_item
      return
    end
    if @target_window.active
      update_target
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Update Item
  #--------------------------------------------------------------------------
  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(0)
      return
    end
    if Input.trigger?(Input::C)
      @item = @item_window.item
      unless @item.is_a?(RPG::Item)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      unless $game_party.item_can_use?(@item.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      if @item.scope >= 3
        @item_window.active = false
        @target_window.x = (@item_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        elsif @item.scope == 7
          @target_window.index = @actor_index - 10
        else
          @target_window.index = 0
        end
      else
        if @item.common_event_id > 0
          $game_temp.common_event_id = @item.common_event_id
          $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
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    if Input.trigger?(Input::R)
      $game_system.se_play($data_system.cursor_se)
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      $scene = Scene_Item.new(@actor_index)
      return
    end
    if Input.trigger?(Input::L)
      $game_system.se_play($data_system.cursor_se)
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      $scene = Scene_Item.new(@actor_index)
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when target window is active)
  #--------------------------------------------------------------------------
  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
          used |= i.item_effect(@item)
        end
      end
      if @target_window.index <= -2
        target = $game_party.actors[@target_window.index + 10]
        used = target.item_effect(@item)
      end
      if @target_window.index >= 0
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      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
        @status_window.refresh
        @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

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  def start_item_select
    @item_window = Window_Item.new(@active_battler)
    @item_window.help_window = @help_window
    @actor_command_window.active = false
    @actor_command_window.visible = false
  end
end
#==============================================================================
end

#==============================================================================
# ** Window_Item
#==============================================================================

class Window_Item < Window_Selectable
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = $game_party.item_number(item.id)
    when RPG::Weapon
      number = $game_party.weapon_number(item.id)
    when RPG::Armor
      number = $game_party.armor_number(item.id)
    end
    if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id)
      self.contents.font.color = normal_color
      disabled = false
      if item.item_restrictions.size > 0
        for r in item.item_restrictions
          if DFS::MENU_SELECT_ACTOR_ITEM
            disabled |= (@actor.instance_eval(r) == false)
          else
            disabled |= (eval(r) == false)
          end
        end
      end
      if disabled == false
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(item.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 212, 32, item.name, 0)
    self.contents.draw_text(x + 240, y, 16, 32, ":", 1)
    self.contents.draw_text(x + 256, y, 24, 32, number.to_s, 2)
  end
end

#==============================================================================
# ** Scene_Item
#==============================================================================

class Scene_Item
  alias update_item_item_rest update_item unless $@
  def update_item
    if Input.trigger?(Input::C)
      @item = @item_window.item
      if @item.is_a?(RPG::Item) && $game_party.item_can_use?(@item.id)
        disabled = false
        if @item.item_restrictions.size > 0
          for r in @item.item_restrictions
            if DFS::MENU_SELECT_ACTOR_ITEM
              disabled |= (@actor.instance_eval(r) == false)
            else
              disabled |= (eval(r) == false)
            end
          end
        end
        if disabled == true
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
    end
    update_item_item_rest
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  alias update_phase3_item_rest update_phase3_item_select
  def update_phase3_item_select
    @item_window.update
    if Input.trigger?(Input::C)
      @item = @item_window.item
      if $game_party.item_can_use?(@item.id)
        disabled = false
        if @item.item_restrictions.size > 0
          for r in @item.item_restrictions
            disabled |= (@active_battler.instance_eval(r) == false)
          end
        end
        if disabled == true
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
    end
    update_phase3_item_rest
  end
end

Ponedlo encima de main. No requiere créditos.

Instrucciones

Para definir una restricción hay que usar un método concreto.
Se puede usar en el espacio del script de la línea 49 para que esa restricción sea la que tiene por defecto el objeto (aquí se definen todas las restricciones por defecto que se quieran). El mismo método también se puede llamar del mismo modo desde Llamar script.

set_item_restriction(item, restriction)
Ejemplo: set_item_restriction($data_items[1], "self.level >= 10")
Eso significa que el objeto de ID 1 solo puede usarse si el que quiere usarlo tiene nivel 10 o superior.

Para limpiar todas las restricciones de un determinado objeto debes usar:
clear_item_restrictions(item)

Para quitar una restricción concreta puedes usar algo así:
$data_items[ID].item_restrictions.delete(restriction)

Posibles restricciones

En las restricciones puedes poner cualquier cosa.
Van exactamente igual que en el script DFS Item Restrictions así que podéis usar los ejemplos que puse allí.

Si tenéis alguna duda sobre la aplicación de este script ponedla en este topic.

DFS Skill Restrictions

De modo similar al anterior, este script permite añadir restricciones a las skills.
Van exactamente igual, solo es más corto y con menos configuración porque en la ventana de skills por defecto ya se define qué actor la está usando así que no hay que cambiar nada.
Además son compatibles entre ellos.

Script

Código:
#==============================================================================
# ** [XP] DFS Skill Restrictions v1.0
#------------------------------------------------------------------------------
# Autor: Wecoc (no requiere créditos)
# ATENCIÓN! Requiere el script Data File Save
#==============================================================================

#--------------------------------------------------------------------------
# * Crear variable de restricciones de habilidad
#--------------------------------------------------------------------------
class RPG::Skill
  define_method(:skill_restrictions) { @skill_restrictions = [] }
end
#--------------------------------------------------------------------------
# * Definir nueva restricción a una habilidad
#--------------------------------------------------------------------------
def set_skill_restriction(skill, restriction)
  skill = $data_skills[skill] if skill.is_a?(Integer)
  skill.skill_restrictions.push(restriction)
end
#--------------------------------------------------------------------------
# * Vaciar todas las restricciones de una habilidad
#--------------------------------------------------------------------------
def clear_skill_restrictions(skill)
  skill = $data_skills[skill] if skill.is_a?(Integer)
  skill.skill_restrictions.clear
end

#==============================================================================
# ** Scene_Title
#==============================================================================

class Scene_Title
  alias define_skill_rest_start command_new_game unless $@
  def command_new_game
    define_skill_rest_start
    #------------------------------------------------------------------------
    # Definir aquí las restricciones por defecto de las habilidades
    # Ejemplo: set_skill_restriction(1, "self.level >= 10")
    
    
    #------------------------------------------------------------------------
  end
end

#==============================================================================
# ** Window_Skill
#==============================================================================

class Window_Skill < Window_Selectable
  #--------------------------------------------------------------------------
  # * Draw Item
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
      disabled = false
      if skill.skill_restrictions.size > 0
        for r in skill.skill_restrictions
          disabled |= (@actor.instance_eval(r) == false)
        end
      end
      if disabled == false
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end      
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 204, 32, skill.name, 0)
    self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  end
end

#==============================================================================
# ** Scene_Skill
#==============================================================================

class Scene_Skill
  alias update_skill_skill_rest update_skill unless $@
  def update_skill
    if Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @actor.skill_can_use?(@skill.id)
        disabled = false
        if @skill.skill_restrictions.size > 0
          for r in @skill.skill_restrictions
            disabled |= (@actor.instance_eval(r) == false)
          end
        end
        if disabled == true
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
    end
    update_skill_skill_rest
  end
end

#==============================================================================
# ** Scene_Battle
#==============================================================================

class Scene_Battle
  alias update_phase3_skill_rest update_phase3_skill_select
  def update_phase3_skill_select
    @skill_window.update
    if Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @active_battler.skill_can_use?(@skill.id)
        disabled = false
        if @skill.skill_restrictions.size > 0
          for r in @skill.skill_restrictions
            disabled |= (@active_battler.instance_eval(r) == false)
          end
        end
        if disabled == true
          $game_system.se_play($data_system.buzzer_se)
          return
        end
      end
    end
    update_phase3_skill_rest    
  end
end

Instrucciones

Todo va como antes pero adaptado a skills en vez de items.
Se puede usar en el espacio del script de la línea 40 para que esa restricción sea la que tiene por defecto la habilidad.

set_skill_restriction(skill, restriction)
Ejemplo: set_skill_restriction($data_skills[1], "self.level >= 10")
Eso significa que la habilidad de ID 1 solo puede usarse si el que quiere usarlo tiene nivel 10 o superior, lo cual puede usarse como sustituto de las habilidades a aprender por clase por defecto o en algún otro caso especial.

Para limpiar todas las restricciones de una determinada habilidad debes usar:
clear_skill_restrictions(skill)

Para quitar una restricción concreta puedes usar algo así:
$data_skills[ID].skill_restrictions.delete(restriction)

Eso es todo, ojalá os sea de utilidad :)
avatar
Wecoc
Administrador
Administrador



Créditos 12087

Gracias : 519

Volver arriba Ir abajo

RPG Maker XP Re: [XP] DFS Item & Skill Restrictions

Mensaje por xXIsrael0499Xx el 2017-10-23, 09:49

Oh excelente, me gusta me gusta, muy útil ademas es cierto lo que dices, cuando se usa un item desde el menú no se especifica qué actor lo está usando, ahora con este script se puede hacer cosas bastante entretenidas, así que gracias no solo por el primer script de item que viene muy bien sino también por el de skills que también esta genial.
avatar
xXIsrael0499Xx
Principiante
Principiante

0/3

Créditos 1112

Gracias : 56

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.