Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Wecoc's Equip System

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Wecoc's Equip System

Mensaje por Wecoc el 2014-12-31, 02:55

Bueno, pues aquí me tenéis trabajando en el script de slots personalizado entre otras cosas (hay que reconocer que me mantengo activo xD)

De momento hice el script Base, que no trae prácticamente ninguna novedad respecto el código original, por lo que os parecerá el aporte más tonto del mundo. No permite nuevos tipos de armadura, ni armas de doble mano, ni nada. ¡Pero al menos no tiene bugs (que yo haya notado) ni tampoco da más lag que el sistema default así que, qué más queréis! xD

Ahora en serio, será necesario para el script o scripts que pondré más adelante en el topic, que seran los verdaderos Add-Ons.

ATENCIÓN, ya no funciona lo de fijar un slot a un personaje concreto, eso que se hacía en Base de Datos - Personajes, quizá uno de los Add-Ons permita recuperarlo, no sé.

Pegad encima de main:

Código:
#==============================================================================
# * Wecoc's Equip System Base v1.0
#------------------------------------------------------------------------------
# by: Wecoc
#==============================================================================

#==============================================================================
# PART 1. Module
#==============================================================================

#------------------------------------------------------------------------------
# ** Equip_slot
#------------------------------------------------------------------------------

class Equip_slot
 
  attr_reader :name
  attr_reader :weapon_ids
  attr_reader :armor_ids
  attr_reader :item
 
  def initialize(name, type, kind=[], ids1=[], ids2=[])
    @name = name
    if type.is_a?(Array)
      weapon = type.include?("Weapon")
      armor = type.include?("Armor")
    else
      weapon = (type == "Weapon")
      armor = (type == "Armor")
    end
   
    if weapon
      @weapon_ids = ids1
      @armor_ids = ids2
    else
      @weapon_ids = []
      @armor_ids = ids1
    end
   
    if weapon and @weapon_ids == []
      for i in 1...$data_weapons.size
        @weapon_ids.push(i)
      end
    end
   
    if armor and @armor_ids == []
      if kind == []
        for i in 1...$data_armors.size
          @armor_ids.push(i)
        end
      else
        for i in 1...$data_armors.size
          if kind.is_a?(Array)
            if kind.include?($data_armors[i].kind)
              @armor_ids.push(i)
            end
          else
            if $data_armors[i].kind == kind
              @armor_ids.push(i)
            end
          end
        end
      end
    end
    @item = nil
  end
 
  def equippable?(item)
    case item
    when RPG::Item
      return false
    when RPG::Weapon
      return @weapon_ids.include?(item.id)
    when RPG::Armor
      return @armor_ids.include?(item.id)
    end
  end
 
  def equip(item)
    @item = item
  end
 
  def empty?
    return @item == nil
  end
end

#==============================================================================
# PART 2. Actor
#==============================================================================

#------------------------------------------------------------------------------
# ** Game_Actor
#------------------------------------------------------------------------------

class Game_Actor < Game_Battler
 
  attr_reader :slots
 
  def initialize(actor_id)
    super()
    @slots = []
   
    @slots.push(Equip_slot.new("Arma",      "Weapon"))
    @slots.push(Equip_slot.new("Escudo",    "Armor", 0))
    @slots.push(Equip_slot.new("Casco",    "Armor", 1))
    @slots.push(Equip_slot.new("Cuerpo",    "Armor", 2))
    @slots.push(Equip_slot.new("Accesorio", "Armor", 3))
   
    setup(actor_id)
  end
 
  def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
    @class_id = actor.class_id
   
    if actor.weapon_id != 0
      equip($data_weapons[actor.weapon_id])
    end
    if actor.armor1_id != 0
      equip($data_armors[actor.armor1_id])
    end
    if actor.armor2_id != 0
      equip($data_armors[actor.armor2_id])
    end
    if actor.armor3_id != 0
      equip($data_armors[actor.armor3_id])
    end
    if actor.armor4_id != 0
      equip($data_armors[actor.armor4_id])
    end
   
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    @hp = maxhp
    @sp = maxsp
    @states = []
    @states_turn = {}
    @maxhp_plus = 0
    @maxsp_plus = 0
    @str_plus = 0
    @dex_plus = 0
    @agi_plus = 0
    @int_plus = 0
    for i in 1..@level
      for j in $data_classes[@class_id].learnings
        if j.level == i
          learn_skill(j.skill_id)
        end
      end
    end
  end
 
  def weapon_ids
    result = []
    for i in 0...@slots.size
      slot = @slots[i]
      if slot.item.is_a?(RPG::Weapon)
        result.push(slot.item.id)
      end
    end
    return result
  end
 
  def armor_ids(kind=nil)
    result = []
    for i in 0...@slots.size
      slot = @slots[i]
      if slot.item.is_a?(RPG::Armor)
        if kind == nil or slot.item.kind == kind
          result.push(slot.item.id)
        end
      end
    end
    return result
  end
 
  def equip(item)
    slot = get_best_slot(item)
    unless slot == nil
      equip_slot(slot, item)
    end
  end
 
  def equip_slot(index, item)
    slot = @slots[index]
    if not slot.empty?
      case slot.item
      when RPG::Weapon
        $game_party.gain_weapon(slot.item.id, 1)
      when RPG::Armor
        update_auto_state(slot.item, nil)
        $game_party.gain_armor(slot.item.id, 1)
      end
    end
    slot.equip(item)
    return if item == nil
    case item
    when RPG::Weapon
      $game_party.lose_weapon(item.id, 1)
    when RPG::Armor
      update_auto_state(nil, item)
      $game_party.lose_armor(item.id, 1)
    end
  end
 
  def get_best_slot(item)
    e_slots = []
    for i in 0...@slots.size
      if @slots[i].equippable?(item)
        e_slots.push(i)
      end
    end
    return if e_slots.size == 0
    empty = []
    for i in 0...e_slots.size
      if @slots[e_slots[i]].empty?
        empty.push(e_slots[i])
      end
    end
    result_slot = case empty.size
      when 0 then e_slots[rand(e_slots.size)]
      when 1 then empty[0]
      else ; empty[rand(empty.size)]
    end
    return result_slot
  end
 
  def element_rate(element_id)
    table = [0,200,150,100,50,0,-100]
    result = table[$data_classes[@class_id].element_ranks[element_id]]
    for i in 0...@slots.size
      if @slots[i].item.is_a?(RPG::Armor)
        armor = @slots[i].item
        if armor.guard_element_set.include?(element_id)
          result /= 2
        end
      end
    end
    for i in @states
      if $data_states[i].guard_element_set.include?(element_id)
        result /= 2
      end
    end
    return result
  end

  def state_guard?(state_id)
    for i in 0...@slots.size
      if @slots[i].item.is_a?(RPG::Armor)
        armor = @slots[i].item
        if armor.guard_state_set.include?(state_id)
          return true
        end
      end
    end
    return false
  end

  def element_set
    element_set = []
    for i in 0...@slots.size
      if @slots[i].item.is_a?(RPG::Weapon)
        element_set.push(@slots[i].item.element_set)
      end
    end
    return element_set.flatten.uniq
  end

  def plus_state_set
    plus_state_set = []
    for i in 0...@slots.size
      if @slots[i].item.is_a?(RPG::Weapon)
        element_set.push(@slots[i].item.plus_state_set)
      end
    end
    return plus_state_set.flatten.uniq
  end

  def minus_state_set
    minus_state_set = []
    for i in 0...@slots.size
      if @slots[i].item.is_a?(RPG::Weapon)
        element_set.push(@slots[i].item.minus_state_set)
      end
    end
    return minus_state_set.flatten.uniq
  end

  def base_str
    n = $data_actors[@actor_id].parameters[2, @level]
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.str_plus
      end
    end
    return [[n, 1].max, 999].min
  end

  def base_dex
    n = $data_actors[@actor_id].parameters[3, @level]
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.dex_plus
      end
    end
    return [[n, 1].max, 999].min
  end

  def base_agi
    n = $data_actors[@actor_id].parameters[4, @level]
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.agi_plus
      end
    end
    return [[n, 1].max, 999].min
  end

  def base_int
    n = $data_actors[@actor_id].parameters[5, @level]
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.int_plus
      end
    end
    return [[n, 1].max, 999].min
  end
 
  def base_atk
    n = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon
        n += @slots[i].item.atk
      end
    end
    return [[n, 0].max, 999].min
  end

  def base_pdef
    n = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.pdef
      end
    end
    return [[n, 0].max, 999].min
  end

  def base_mdef
    n = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon, RPG::Armor
        n += @slots[i].item.mdef
      end
    end
    return [[n, 0].max, 999].min
  end
 
  def base_eva
    n = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Armor
        n += @slots[i].item.eva
      end
    end
    return [[n, 0].max, 999].min
  end
 
  def animation1_id
    animation1_id = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon
        animation1_id = @slots[i].item.animation1_id
      end
    end
    return animation1_id
  end

  def animation2_id
    animation2_id = 0
    for i in 0...@slots.size
      case @slots[i].item
      when RPG::Weapon
        animation2_id = @slots[i].item.animation2_id
      end
    end
    return animation2_id
  end

  def class_id=(class_id)
    if $data_classes[class_id] != nil
      @class_id = class_id
      for i in 0...@slots.size
        item = @slots[i].item
        next if item == nil
        unless equippable?(item)
          equip_slot(i, nil)
        end
      end
    end
  end
end

#==============================================================================
# PART 3. Windows
#==============================================================================

#------------------------------------------------------------------------------
# ** Scene_Equip
#------------------------------------------------------------------------------

class Window_EquipRight < Window_Selectable
  def initialize(actor)
    super(272, 64, 368, 192)
    self.contents = Bitmap.new(width - 32, actor.slots.size * 32)
    @actor = actor
    refresh
    self.index = 0
  end

  def refresh
    self.contents.clear
    @data = []
    for i in 0...@actor.slots.size
      slot = @actor.slots[i]
      @data.push(slot.item)
      self.contents.font.color = system_color
      self.contents.draw_text(4, 32 * i, 92, 32, slot.name)
      unless slot.item == nil
        draw_item_name(slot.item, 92, 32 * i)
      end
    end
    @item_max = @data.size
  end
end

class Window_EquipItem < Window_Selectable
 
  attr_accessor :equip_index
 
  def initialize(actor)
    super(0, 256, 640, 224)
    @equip_index = 0
    @actor = actor
    @column_max = 2
    refresh
    self.active = false
    self.index = -1
  end

  def item
    return @data[self.index]
  end

  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    equip_slot = @actor.slots[@equip_index]
    for i in 0...equip_slot.weapon_ids.size
      weapon_id = equip_slot.weapon_ids[i]
      if $game_party.weapon_number(weapon_id) > 0
        if @actor.equippable?($data_weapons[weapon_id])
          @data.push($data_weapons[weapon_id])
        end
      end
    end
    for i in 0...equip_slot.armor_ids.size
      armor_id = equip_slot.armor_ids[i]
      if $game_party.armor_number(armor_id) > 0
        if @actor.equippable?($data_armors[armor_id])
          @data.push($data_armors[armor_id])
        end
      end
    end
    @data.push(nil)
    @item_max = @data.size
    self.contents = Bitmap.new(width - 32, row_max * 32)
    for i in 0...@item_max-1
      draw_item(i)
    end
  end
end

class Scene_Equip
  def main
    @actor = $game_party.actors[@actor_index]
    @help_window = Window_Help.new
    @left_window = Window_EquipLeft.new(@actor)
    @right_window = Window_EquipRight.new(@actor)
    @item_window = Window_EquipItem.new(@actor)
    @right_window.help_window = @help_window
    @item_window.help_window = @help_window
    @right_window.index = @equip_index
    refresh
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @left_window.dispose
    @right_window.dispose
    @item_window.dispose
  end

  def refresh
    item1 = @right_window.item
    if @right_window.active
      @left_window.set_new_parameters(nil, nil, nil)
    end
    if @item_window.active
      item2 = @item_window.item
      last_hp = @actor.hp
      last_sp = @actor.sp
      @actor.equip_slot(@right_window.index, item2)
      new_atk = @actor.atk
      new_pdef = @actor.pdef
      new_mdef = @actor.mdef
      @actor.equip_slot(@right_window.index, item1)
      @actor.hp = last_hp
      @actor.sp = last_sp
      @left_window.set_new_parameters(new_atk, new_pdef, new_mdef)
    end
  end

  def update
    @left_window.update
    @right_window.update
    @item_window.update
    refresh
    if @right_window.active
      update_right
      return
    end
    if @item_window.active
      update_item
      return
    end
  end

  def update_right
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(2)
      return
    end
    if Input.trigger?(Input::C)
      # equip_fix?
      $game_system.se_play($data_system.decision_se)
      @right_window.active = false
      @item_window.active = true
      @item_window.index = 0
      return
    end
    if Input.trigger?(Input::DOWN)
      @item_window.equip_index = @right_window.index
      @item_window.refresh
    end
    if Input.trigger?(Input::UP)
      @item_window.equip_index = @right_window.index
      @item_window.refresh
    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_Equip.new(@actor_index, @right_window.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_Equip.new(@actor_index, @right_window.index)
      return
    end
  end

  def update_item
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.equip_se)
      item = @item_window.item
      @actor.equip_slot(@right_window.index, item)
      @right_window.active = true
      @item_window.active = false
      @item_window.index = -1
      @right_window.refresh
      @item_window.refresh
      return
    end
  end
end

#------------------------------------------------------------------------------
# ** Window_Status
#------------------------------------------------------------------------------

class Window_Status < Window_Base
  def refresh
    self.contents.clear
    draw_actor_graphic(@actor, 40, 112)
    draw_actor_name(@actor, 4, 0)
    draw_actor_class(@actor, 4 + 144, 0)
    draw_actor_level(@actor, 96, 32)
    draw_actor_state(@actor, 96, 64)
    draw_actor_hp(@actor, 96, 112, 172)
    draw_actor_sp(@actor, 96, 144, 172)
    draw_actor_parameter(@actor, 96, 192, 0)
    draw_actor_parameter(@actor, 96, 224, 1)
    draw_actor_parameter(@actor, 96, 256, 2)
    draw_actor_parameter(@actor, 96, 304, 3)
    draw_actor_parameter(@actor, 96, 336, 4)
    draw_actor_parameter(@actor, 96, 368, 5)
    draw_actor_parameter(@actor, 96, 400, 6)
    self.contents.font.color = system_color
    self.contents.draw_text(320, 48, 80, 32, "Exp")
    self.contents.draw_text(320, 80, 80, 32, "Sig. Nivel")
    self.contents.font.color = normal_color
    self.contents.draw_text(320 + 80, 48, 84, 32, @actor.exp_s, 2)
    self.contents.draw_text(320 + 80, 80, 84, 32, @actor.next_rest_exp_s, 2)
    self.contents.font.color = system_color
    self.contents.draw_text(320, 160, 96, 32, "Equipo")
    for i in 0...@actor.slots.size
      draw_item_name(@actor.slots[i].item, 320 + 16, i * 32 + 208)
    end
  end
end

#------------------------------------------------------------------------------
# ** Window_ShopStatus
#------------------------------------------------------------------------------

class Window_ShopStatus < Window_Base
  def refresh
    self.contents.clear
    if @item == nil
      return
    end
    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
    self.contents.font.color = system_color
    self.contents.draw_text(4, 0, 200, 32, "Num. en posesión")
    self.contents.font.color = normal_color
    self.contents.draw_text(204, 0, 32, 32, number.to_s, 2)
    if @item.is_a?(RPG::Item)
      return
    end
    for i in 0...$game_party.actors.size
      actor = $game_party.actors[i]
      if actor.equippable?(@item)
        self.contents.font.color = normal_color
      else
        self.contents.font.color = disabled_color
      end
      if @item.is_a?(RPG::Weapon)
        actor_weapons = actor.weapon_ids
        if actor_weapons.size == 0
          item1 = nil
        else
          item_id = actor_weapons.min do |b, a|
            $data_weapons[b].atk - $data_weapons[a].atk
          end
          item1 = $data_weapons[item_id]
        end
      end
      if @item.is_a?(RPG::Armor)
        actor_armors = actor.armor_ids(@item.kind)
        if actor_armors.size == 0
          item1 = nil
        else
          item_id = actor_armors.min do |b, a|
            def2 = ($data_weapons[b].pdef + $data_weapons[b].mdef)
            def1 = ($data_weapons[a].pdef + $data_weapons[a].mdef)
            def2 - def1
          end
          item1 = $data_armors[item_id]
        end
      end
      if actor.equippable?(@item)
        if @item.is_a?(RPG::Weapon)
          atk1 = item1 != nil ? item1.atk : 0
          atk2 = @item != nil ? @item.atk : 0
          change = atk2 - atk1
        end
        if @item.is_a?(RPG::Armor)
          pdef1 = item1 != nil ? item1.pdef : 0
          mdef1 = item1 != nil ? item1.mdef : 0
          pdef2 = @item != nil ? @item.pdef : 0
          mdef2 = @item != nil ? @item.mdef : 0
          change = (pdef2 + mdef2) - (pdef1 + mdef1)
        end
        self.contents.draw_text(124, 64 + 64 * i, 112, 32,
          sprintf("%+d", change), 2)
      end
      if item1 != nil
        x = 4
        y = 64 + 64 * i + 32
        bitmap = RPG::Cache.icon(item1.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, item1.name)
      end
    end
  end
end

#------------------------------------------------------------------------------
# ** Interpreter
#------------------------------------------------------------------------------

class Interpreter
  def command_319
    actor = $game_actors[@parameters[0]]
    if actor != nil
      case @parameters[1]
      when 0
        item = $data_weapons[@parameters[2]]
      else
        item = $data_armors[@parameters[2]]
      end
      actor.equip(item)
    end
    return true
  end
end


En principio si no hay bugs, el script Base está en su versión definitiva.

Configuración del script

La parte principal de configuración está dentro del def initialize de la class Game_Actor, y son éstas líneas:

Código:
    @slots.push(Equip_slot.new("Arma",      "Weapon"))
    @slots.push(Equip_slot.new("Escudo",    "Armor", 0))
    @slots.push(Equip_slot.new("Casco",    "Armor", 1))
    @slots.push(Equip_slot.new("Cuerpo",    "Armor", 2))
    @slots.push(Equip_slot.new("Accesorio", "Armor", 3))


Podéis poner tantas como queráis, cada una es un slot. Luego el primer nombre es el nombre del slot, el segundo si es un arma "Weapon" o protector "Armor" y el número indica qué tipo de protector es.

Las array están permitidas, de modo que puede haber slots con más de una cosa a la vez. Por ejemplo si quisiérais que en un mismo slot hubiera cascos y armaduras haríais:

Código:
    @slots.push(Equip_slot.new("Nombre", "Armor", [1, 2]))


Otro ejemplo con más sentido, el de poner que las ranuras sean la mano derecha e izquierda, sería cambiar Arma y Escudo por:

Código:
    @slots.push(Equip_slot.new("Derecha", ["Weapon", "Armor"], 0))
    @slots.push(Equip_slot.new("Izquierda", ["Weapon", "Armor"], 0))


Particularidades del script Base
(muchas seran modificables mediante Add-Ons, así que no deben asustaros demasiado)

- Ya no funciona equip_fix? (lo dije arriba) por cuestiones técnicas
- Todos los actores tienen los mismos slots, aunque ahora sería más fácil cambiar eso
- Los parámetros del actor, por ejemplo el ataque si tienes dos armas, se suman.
- Se ataca como si se tuviera solo una de las armas, solo que con más fuerza, debido al punto anterior.
- La animación de ataque en caso de tener más de un arma, es la de una de las armas (la de ID más alta, creo)
- En la tienda, cuando compara el equipo a comprar con el equipo actual, solo lo hace con el arma equipada más floja.
- El nombre del slot no se usa para nada, solo para mostrarlo en Scene_Equip, así que puedes poner nombres repetidos.
- El cambiar equipo desde el comando del intérprete lo que hace es buscar la mejor ranura donde poner el equipamento que le digas.

Ideas para los Add-Ons

- Sistema de mano derecha / izquierda con personajes diestros, zurdos y ambiguos ambidiestros (ver topic de ideas)
- Armas de doble mano
- Más ranuras (seguramente lo más cómodo será definirlo por ids, por ejemplo dentro de Accesorios, los ids 10, 11, 12 en la ranura "Guantes"...)
- Edit de Scene_Shop para que se vea si el arma/protector a comprar es mejor o no que cualquiera de las equipadas por cada actor
- Features para la batalla a dos manos (elegir con qué arma atacar y ataques dobles)
- Integrar el script Disable Attack & Guard (muy fácil de hacer en principio)
- Actores con ranuras fijables (para compensar lo de equip_fix?)

Os dejo para que opinéis sobre lo que hay hecho y déis ideas para Add-Ons si queréis. Si encontráis algún bug hacédmelo saber, yo lo he probado bastante y no dí con ninguno, pero quien sabe.

Como estoy increíblemente atareado tanto dentro como fuera del maker (especialmente fuera) tardaré mucho en terminarlo todo, así que si alguien se anima en hacer algun Add-On por su cuenta y subirlo le estaré muy agradecido.


Última edición por Wecoc el 2015-01-02, 02:27, editado 3 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

Mensaje por Faye Valentine el 2014-12-31, 03:10

Un buen comienzo, aunque no pienso usarlo de momento, aún es un proyecto muy joven.

Pero ey, para que este comentario no sea inútil, dejo aquí una idea de add-on

... Bueno, obviamente no saldrá en el mensaje, pero quiero decir que aquí estaba escribiendo una wall of text de una idea para add-on, para luego fijarme que ya lo habías listado xDDD (el de sistema de mano derecha / izquierda). Bueno, eh... entonces no tengo muchas ideas de momento.

¿Quizá que si un item (no necesariamente un arma) está en un slot u otro obtendrá penalización o bonificación a un stat? algo similar a lo de mano derecha / izquierda pero más en general.

Como ya dije, buen comienzo. A ver como avanza.

Faye Valentine
Soñador
Soñador

0/3

Créditos 281

Gracias : 34

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

Mensaje por orochii el 2014-12-31, 14:03

Lo de fijar los slots, sería agregarlo posteriormente, y hacer un simple condicional. Aparte con eso se podría hacer que no sea fijo de principio a fin del juego, sino que se pueda desactivar en media res (?). Guardarlo en un array al iniciar el juego, y listo.

El problema y supongo que la razón por la que no lo implementaste, es que como posiblemente van a diferir los slots disponibles, pues, qué hacer con eso xd, dos slots de armas, quiza ningun sombrero, y vas y fijas el sombrero en la base de datos xd.

Por lo que tengo dos ideas para eso:
- Quiza podría hacerse que al fijar equipo en la base de datos, las casillas funcionen como slot 1~5, indiferentemente de qué sean, y que ya para slots >5 sea por script.
- O que al fijar, por decir algo, el sombrero, se fijen todos los slots de tipo sombrero (tómese en cuenta que puede ser que se use el "sombrero" como, no sé, ¿medallas? digo, es sólo nombre xD).
Igual, si haces tipos de equipo nuevos, necesitarías hacerlo por script.

Y asdf. A ver qué sale de este script xd.
avatar
orochii
Reportero

0/3

Créditos 7722

Gracias : 436

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

Mensaje por Wecoc el 2014-12-31, 16:20

InVariableZ escribió:¿Quizá que si un item (no necesariamente un arma) está en un slot u otro obtendrá penalización o bonificación a un stat? algo similar a lo de mano derecha / izquierda pero más en general.


Mhm... Creo que habría que hacer un script especialmente para eso. La base lo permite pero hay muchas cosas a tener en cuenta, puesto que los slots son modificables y eso. Por ahora no lo haré, lo siento.

@Orochii escribió:El problema y supongo que la razón por la que no lo implementaste, es que como posiblemente van a diferir los slots disponibles, pues, qué hacer con eso xd, dos slots de armas, quiza ningun sombrero, y vas y fijas el sombrero en la base de datos xd.


Lo que haré es permitir bloquearlos por "ID de slot", eso sí tengo pensado hacerlo y es relativamente fácil. Pero ya que en la base hay un equip_slot (con ID de slot) y un equip que elige el slot según el tipo de item, haré algo similar con el fix. No me convence mucho pero bueno xD

------

Añadí un detalle en la base, ahora sí que la doy por definitiva. Implementé la opción de poner los ids disponibles en cada slot, que viene a ser un símil de ranuras extra.

Todo lo demás va como antes, por ejemplo se puede hacer un slot para todos los accesorios:

Código:
@slots.push(Equip_slot.new("Accesorio", "Armor", 3))


O bien uno para cada tipo de accesorio:

Código:
@slots.push(Equip_slot.new("Anillo",  "Armor", 3, [25, 26, 27, 28]))
@slots.push(Equip_slot.new("Amuleto", "Armor", 3, [29, 30, 31, 32]))
@slots.push(Equip_slot.new("Botas",  "Armor", 3, [33, 34, 35]))
@slots.push(Equip_slot.new("Guantes", "Armor", 3, [36, 37, 38]))


Serviría también con armas aunque es un poco más absurdo.
Creo que es la mejor forma porque no hay que definir nuevos tipos de protector ni retocar el módulo RPG para nada, solo poner las ID aquí. En mi juego, Birdsite, uso un método muy similar.
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

Mensaje por Jristz el 2015-01-02, 00:39

Topic de ideas? hay uno?
Bueno, yo ya tengo mis equipamiento listo, así que no lo usaré.
Si de idea se trata, porque no una de armas, estas usan municiones...
Hacer que un slot cambie de nombre si se usa sierta arma (Arco/Flecha, Revolver/municion, Espada/Escudo, Gran espada[es a dos manos])
avatar
Jristz
Novato
Novato

0/3

Créditos 37

Gracias : 3

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

Mensaje por Wecoc el 2015-01-02, 03:57

Jristz: Nuevamente, es buena idea así que me la apunto, pero al ser slots dinámicos tampoco sé muy bien como hacer eso. A no ser que afecte solo entre una mano y la otra, claro, en ese caso es mucho más fácil de plantear. Por cierto, aquí tienes el Topic de aportación de ideas.

-----

Como pasaré un tiempo sin poder continuar el script, subo lo que hay hecho. Ya está hecha la parte de Actor de las dos manos y lo de fijar y desfijar por ID de slot. Faltará su aplicación en la batalla y las demás ideas puestas.

Código:
#==============================================================================
# * Wecoc's Equip System Add-Ons v0.1
#------------------------------------------------------------------------------
# by: Wecoc
# Éste script va debajo del Wecoc's Equip System Base
#==============================================================================

#==============================================================================
# PART 1. Module
#==============================================================================

module Wecoc_Equip
 
  HAND_SYSTEM = true
  MULTI_ACCESSORIES = true
 
  TWO_HANDED_WEAPONS = [3, 4]
  DISABLE_MULTI_SHIELD = true
 
end

class Equip_slot
  attr_accessor :name
  attr_accessor :weapon_ids
  attr_accessor :armor_ids
end

#==============================================================================
# PART 2. Actor
#==============================================================================

#------------------------------------------------------------------------------
# ** Game_Actor
#------------------------------------------------------------------------------

class Game_Actor < Game_Battler
 
  attr_accessor :slots
  attr_accessor :right_handed
  attr_accessor :left_handed
  attr_accessor :hand_penalty
  attr_accessor :right_slot
  attr_accessor :left_slot
  attr_reader :fixed_slots
 
  def initialize(actor_id)
    super()
    @slots = []
   
    if Wecoc_Equip::HAND_SYSTEM
      @slots.push(Equip_slot.new("Derecha", ["Weapon", "Armor"], 0))
      @slots.push(Equip_slot.new("Izquierda", ["Weapon", "Armor"], 0))
    else
      @slots.push(Equip_slot.new("Arma",  "Weapon"))
      @slots.push(Equip_slot.new("Escudo", "Armor", 0))
    end
   
    @slots.push(Equip_slot.new("Casco",  "Armor", 1))
    @slots.push(Equip_slot.new("Cuerpo", "Armor", 2))
   
    if Wecoc_Equip::MULTI_ACCESSORIES
      ring_array =  [25, 26, 27, 28]
      amulet_array = [29, 30, 31, 32]
      boots_array = []
      gloves_array = []
      @slots.push(Equip_slot.new("Anillo",  "Armor", 3, ring_array))
      @slots.push(Equip_slot.new("Amuleto", "Armor", 3, amulet_array))
      @slots.push(Equip_slot.new("Botas",  "Armor", 3, boots_array))
      @slots.push(Equip_slot.new("Guantes", "Armor", 3, gloves_array))
    else
      @slots.push(Equip_slot.new("Accesorio", "Armor", 3))
    end
   
    @right_slot = 0
    @left_slot  = 1
   
    @fixed_slots = []
   
    setup(actor_id)
  end
 
  def hand_armor_ids
    result = []
    if Wecoc_Equip::HAND_SYSTEM
      right_item = @slots[@right_slot].item
      if right_item.is_a?(RPG::Armor) and right_item.kind == 0
        result.push(right_item.id)
      end
      left_item = @slots[@left_slot].item
      if left_item.is_a?(RPG::Armor) and left_item.kind == 0
        result.push(left_item.id)
      end
      return result
    else
      return armor_ids(0)
    end
  end
 
  def hand_string
    if HAND_SYSTEM == true
      case [@right_handed, @left_handed]
        when [true, false] then "Diestro"
        when [false, true] then "Zurdo"
        when [true, true]  then "Ambidiestro"
      end
    end
  end
 
  alias hand_system_setup setup unless $@
  def setup(actor_id)
    hand_system_setup(actor_id)
    @right_handed = false
    @left_handed = false
    @hand_penalty = 0.75
  end
 
  def left_atk
    unless @slots[@left_slot].item.is_a?(Weapon)
      return 0
    end
    atk = @slots[@left_slot].item.atk
    if @left_handed == false
      atk *= @hand_penalty
    end
    return atk.to_i
  end
 
  def right_atk
    unless @slots[@right_slot].item.is_a?(Weapon)
      return 0
    end
    atk = @slots[@right_slot].item.atk
    if @right_handed == false
      atk *= @hand_penalty
    end
    return atk.to_i
  end
 
  def left_pdef
    pdef = @slots[@left_slot].item.pdef
    if @left_handed == false
      pdef *= @hand_penalty
    end
    return pdef.to_i
  end
 
  def right_pdef
    pdef = @slots[@right_slot].item.pdef
    if @right_handed == false
      pdef *= @hand_penalty
    end
    return pdef.to_i
  end
 
  def left_mdef
    mdef = @slots[@left_slot].item.mdef
    if @left_handed == false
      mdef *= @hand_penalty
    end
    return mdef.to_i
  end
 
  def right_pdef
    mdef = @slots[@right_slot].item.mdef
    if @right_handed == false
      mdef *= @hand_penalty
    end
    return mdef.to_i
  end
 
  def animation1_left
    item = @slots[@left_slot].item
    return item.is_a?(RPG::Weapon) ? item.animation1_id : 0
  end
     
  def animation1_right
    item = @slots[@right_slot].item
    return item.is_a?(RPG::Weapon) ? item.animation1_id : 0
  end
 
  def animation2_left
    item = @slots[@left_slot].item
    return item.is_a?(RPG::Weapon) ? item.animation2_id : 0
  end
     
  def animation2_right
    item = @slots[@right_slot].item
    return item.is_a?(RPG::Weapon) ? item.animation2_id : 0
  end
 
  def fix_slot(slot)
    @fixed_slots.push(slot)
    @fixed_slots.uniq!
  end
 
  def unfix_slot(slot)
    @fixed_slots.delete(slot)
  end
 
  alias two_handed_equip_slot equip_slot unless $@
  def equip_slot(slot, item)
    return if @fixed_slots.include?(slot)
    if Wecoc_Equip::HAND_SYSTEM
      case slot
      when @right_slot
        old_item = @slots[@right_slot].item
        if old_item.is_a?(RPG::Weapon)
          if Wecoc_Equip::TWO_HANDED_WEAPONS.include?(old_item.id)
            unfix_slot(@left_slot)
          end
        end
        if item.is_a?(RPG::Weapon)
          if Wecoc_Equip::TWO_HANDED_WEAPONS.include?(item.id)
            two_handed_equip_slot(@right_slot, nil)
            two_handed_equip_slot(@left_slot, nil)
            best_slot = @right_handed ? @right_slot : @left_slot
            worst_slot = (best_slot == @right_slot) ? @left_slot : @right_slot
            two_handed_equip_slot(best_slot, item)
            fix_slot(worst_slot)
            return
          end
        end
      when @left_slot
        old_item = @slots[@left_slot].item
        if old_item.is_a?(RPG::Weapon)
          if Wecoc_Equip::TWO_HANDED_WEAPONS.include?(old_item.id)
            unfix_slot(@right_slot)
          end
        end
        if item.is_a?(RPG::Weapon)
          if Wecoc_Equip::TWO_HANDED_WEAPONS.include?(item.id)
            two_handed_equip_slot(@right_slot, nil)
            two_handed_equip_slot(@left_slot, nil)
            best_slot = @right_handed ? @right_slot : @left_slot
            worst_slot = (best_slot == @right_slot) ? @left_slot : @right_slot
            two_handed_equip_slot(best_slot, item)
            fix_slot(worst_slot)
            return
          end
        end
      end
    end
    two_handed_equip_slot(slot, item)
  end
 
  alias disable_mshield_equip_slot equip_slot unless $@
  def equip_slot(slot, item)
    if Wecoc_Equip::DISABLE_MULTI_SHIELD
      if item.is_a?(RPG::Armor)
        case slot
        when @right_slot
          if @slots[@left_slot].item.is_a?(RPG::Armor)
            return
          end
        when @left_slot
          if @slots[@right_slot].item.is_a?(RPG::Armor)
            return
          end
        end
      end
    end
    disable_mshield_equip_slot(slot, item)
  end
end

#==============================================================================
# PART 3. Windows
#==============================================================================

#------------------------------------------------------------------------------
# ** Scene_Equip
#------------------------------------------------------------------------------

class Window_EquipRight < Window_Selectable
  def refresh
    self.contents.clear
    @data = []
    for i in 0...@actor.slots.size
      slot = @actor.slots[i]
      @data.push(slot.item)
      if !@actor.fixed_slots.include?(i)
        self.contents.font.color = system_color
      else
        self.contents.font.color = disabled_color
      end
      self.contents.draw_text(4, 32 * i, 92, 32, slot.name)
      unless slot.item == nil
        draw_item_name(slot.item, 92, 32 * i)
      end
    end
    @item_max = @data.size
  end
end


Globales:

HAND_SYSTEM --> Activa el sistema de manos derecha / izquierda.
MULTI_ACCESSORIES --> Los protectores se dividen en distintos tipos de accesorio según sus IDs.
TWO_HANDED_WEAPONS --> Armas de dos manos
DISABLE_MULTI_SHIELD --> Impedir equipar dos escudos a la vez

Llamadas:

Para asignar si el actor es diestro, siniestro o ambidiestro:

Código:
$game_party.actors[0].right_handed = true
$game_party.actors[0].left_handed = true


Solo right_handed --> Diestro
Solo left_handed --> Siniestro
right_handed + left_handed --> Ambidiestro

Para asignar la penalización que supone usar la mano floja:

Código:
$game_party.actors[0].hand_penalty = 0.75


Por defecto vale 0.75
Si valiera 1.0 no habría penalización.

Para fijar y desfijar slots según su ID:

Código:
$game_party.actors[0].fix_slot(0)
$game_party.actors[0].unfix_slot(0)


De momento eso es todo, no es mucho pero bueno, poco a poco xD

PD. Por cierto no viene a cuento pero el nombre del script es provisional xDD
avatar
Wecoc
Administrador
Administrador



Créditos 12208

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Wecoc's Equip System

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.