Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Sistema Momotaro

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Sistema Momotaro

Mensaje por Wecoc el 2014-06-21, 01:59

Eron me comentó hace un tiempo que quería hacer un sistema que añadiera algunas cosas al maker y al final hemos decidido hacerlo juntos porque estaba un poco liado para hacerlo solo. Resulta que prácticamente todo lo que quería lo hemos hecho en solo 2 scripts, y eso que pretendía ser una gran base xDD pero bueno, lo mismo da. Tampoco es mucha cosa si lo miras.

Imaginaos un grupo dónde no todos los personajes son humanos. No todos pueden usar objetos ni para ellos ni para otro, o no pueden tener equipo propio o usar skills nunca. Éste sistema está pensado para favorecer esos casos, aunque no exclusivamente claro. Como decía, hay dos scripts disponibles, compatibles e independientes entre ellos; Pasabilidad por terreno y Sistema de Items por Actor; para saber todas las mejoras que traen leed sus instrucciones.

Algo interesante y casi crucial a añadir a éste sistema sería un script + engine que permitiera separar y luego controlar los actores separadamente, y finalmente volver a juntarlos (un poco tipo Drekirökr, aunque no exactamente). Nosotros os hemos dado la base para hacer tal cosa, pero no haremos ésto. Como cada uno lo querría distinto espabilad.

Código:
#==============================================================================
# - MOMOTARO - Pasabilidad por terreno
#------------------------------------------------------------------------------
#  Autores: Eron & Wecoc
#==============================================================================
# == Sistema Momotaro ==
# Imaginaos un sistema dónde no todos los personajes son humanos.
# No todos pueden usar objetos ni para ellos ni para otro, o no pueden tener
# equipo propio o usar skills nunca. Éste sistema está pensado para favorecer
# esos casos, aunque no exclusivamente.
#------------------------------------------------------------------------------
# Éste script da la siguientes mejoras al sistema default.
#
# o NUEVAS OPCIONES
#
# - Hay tres tipos de pasabilidad; por tile (defecto), por evento (defecto) y
#  por terreno, la mejora es que se pueden controlar separadamente
#    Llamadas de ejemplo:
#      $game_actors[1].unpass_tiles = true
#      $game_actors[1].unpass_events = true
#      $game_actors[1].unpass_terrains = true
#
#      $game_map.events[1].unpass_tiles = true
#      $game_map.events[1].unpass_events = true
#      $game_map.events[1].unpass_terrains = true
#
# - Puedes definir los terrenos no pasables para cada actor o evento
#    Llamadas de ejemplo:
#      $game_actors[1].define_unpass(1, 2, 3)
#      $game_map.events[1].define_unpass(2)
#
# - Puedes cambiar de actor principal sin que ésto altere el órden del grupo
#    Llamadas de ejemplo: ATENCIÓN! va por ID de actor, no posición del grupo
#      $game_party.define_active_actor(2)
#
#    TRUCO! Cómo hacer que un evento haga algo según el actor activo:
#      Pon en condiciones por ejemplo:  $game_party.active_actor.id == 1
#
#==============================================================================

#------------------------------------------------------------------------------
# ** Game_Character
#------------------------------------------------------------------------------

class Game_Character
 
  attr_reader  :terrain_ids
  attr_accessor :unpass_terrains
  attr_accessor :unpass_tiles
  attr_accessor :unpass_events
 
  alias eron_terrain_ini initialize unless $@
  def initialize
    eron_terrain_ini
    @terrain_ids = []
    @unpass_tiles = true
    @unpass_events = true
    @unpass_terrains = true
  end
 
  def define_unpass(*args)
    @terrain_ids = []
    @terrain_ids.push *args
  end
 
  def passable?(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    unless $game_map.valid?(new_x, new_y)
      return false
    end
    if @through
      return true
    end
    if @unpass_tiles
      unless $game_map.passable?(x, y, d, self)
        return false
      end
      unless $game_map.passable?(new_x, new_y, 10 - d)
        return false
      end
    end
    if @unpass_events
      for event in $game_map.events.values
        if event.x == new_x and event.y == new_y
          unless event.through
            if self != $game_player
              return false
            end
            if event.character_name != ""
              return false
            end
          end
        end
      end
      if $game_player.x == new_x and $game_player.y == new_y
        unless $game_player.through
          if @character_name != ""
            return false
          end
        end
      end
    end
    if @unpass_terrains
      if @terrain_ids.include?($game_map.terrain_tag(new_x, new_y))
        return false
      end
    end
    return true
  end
end

#------------------------------------------------------------------------------
# ** Game_Party
#------------------------------------------------------------------------------

class Game_Party
 
  attr_reader :active_actor
 
  alias active_actor_ssm setup_starting_members unless $@
  def setup_starting_members
    active_actor_ssm
    @active_actor = @actors[0]
    $game_player.refresh
  end
 
  def define_active_actor(actor_id)
    actor = @actors.select{|act| act.id == actor_id}
    return if actor.size == 0
    @active_actor = actor[0]
    $game_player.refresh
  end
 
  alias active_actor_ref refresh unless $@
  def refresh
    active_actor_ref
    unless @actors.include?(@active_actor)
      @active_actor = @actors[0]
      $game_player.refresh
    end
  end
 
  def remove_actor(actor_id)
    @actors.delete($game_actors[actor_id])
    $game_player.refresh
    refresh
  end
end

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

class Game_Actor < Game_Battler
  attr_reader  :terrain_ids
  attr_accessor :unpass_tiles
  attr_accessor :unpass_events
  attr_accessor :unpass_terrains
 
  alias eron_terrain_ini initialize unless $@
  def initialize(actor_id)
    eron_terrain_ini(actor_id)
    @terrain_ids = []
    @unpass_tiles = true
    @unpass_events = true
    @unpass_terrains = true
  end

  def define_unpass(*args)
    @terrain_ids = []
    @terrain_ids.push *args
  end
end

#------------------------------------------------------------------------------
# ** Game_Player
#------------------------------------------------------------------------------

class Game_Player < Game_Character
  def refresh
    if $game_party.actors.size == 0
      @character_name = ""
      @character_hue = 0
      return
    end
    actor = $game_party.active_actor
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @opacity = 255
    @blend_type = 0
  end
 
  def define_unpass(*args)
    @active_actor.define_unpass(*args)
  end
 
  def unpass_terrains=(value)
    @active_actor.unpass_terrains = value
  end
 
  def unpass_events=(value)
    @active_actor.unpass_events = value
  end
 
  alias eron_terrain_upd update unless $@
  def update
    eron_terrain_upd
    if @active_actor != $game_party.active_actor
      @active_actor = $game_party.active_actor
    end
    @terrain_ids    = @active_actor.terrain_ids
    @unpass_terrains = @active_actor.unpass_terrains
    @unpass_tiles    = @active_actor.unpass_tiles
    @unpass_events  = @active_actor.unpass_events
  end
end


Código:
#==============================================================================
# - MOMOTARO - Sistema de Items por Actor
#------------------------------------------------------------------------------
#  Autores: Eron & Wecoc
#------------------------------------------------------------------------------
# == Sistema Momotaro ==
# Imaginaos un sistema dónde no todos los personajes son humanos.
# No todos pueden usar objetos ni para ellos ni para otro, o no pueden tener
# equipo propio o usar skills nunca. Éste sistema está pensado para favorecer
# esos casos, aunque no exclusivamente.
#------------------------------------------------------------------------------
# Éste script da la siguientes mejoras al sistema default.
#
# o MODIFICACIONES VISIBLES
#
# - En Scene_Item ahora va por actor de forma similar al Scene_Skill
#
# o NUEVAS OPCIONES
#
# - Actores que no pueden usar ciertos items ni con ellos ni con los demás
#    Llamadas de ejemplo:
#      $game_actors[1].disabled_items = [1, 2, 3 ...]
#      $game_party.actors[0].disabled_items = [31]
# - Actores que no pueden ir a items, skills o equip
#    Llamadas de ejemplo:
#      $game_actors[1].item_restriction = true
#      $game_actors[1].skill_restriction = true
#      $game_actors[1].equip_restriction = true
# - Estados que hacen que el actor no pueda ir a items o equip
#  (skills ya existe por defecto pero fue arreglado un bug interno)
#    Llamadas de ejemplo:
#      $data_states[1].item_restriction = true
#      $data_states[1].equip_restriction = true
#
#==============================================================================

#------------------------------------------------------------------------------
# ** RPG::State
#------------------------------------------------------------------------------

module RPG
  class State
    attr_writer :item_restriction
    attr_writer :equip_restriction
   
    def item_restriction
      if @item_restriction == nil
        @item_restriction = 0
      end
      return @item_restriction
    end   
   
    def item_restriction?
      if @item_restriction == nil
        @item_restriction = 0
      end
      return @item_restriction != 0
    end
   
    def skill_restriction?
      return @restriction == 1
    end
   
    def equip_restriction
      if @equip_restriction == nil
        @equip_restriction = 0
      end
      return @equip_restriction
    end   
   
    def equip_restriction?
      if @equip_restriction == nil
        @equip_restriction = 0
      end
      return @equip_restriction != 0
    end
  end
end

#------------------------------------------------------------------------------
# ** Game_Battler
#------------------------------------------------------------------------------

class Game_Battler
  def item_restriction?
    for i in @states
      if $data_states[i].item_restriction?
        return true
      end
    end
    return false
  end

  def skill_restriction?
    for i in @states
      if $data_states[i].skill_restriction?
        return true
      end
    end
    return false
  end

  def equip_restriction?
    for i in @states
      if $data_states[i].equip_restriction?
        return true
      end
    end
    return false
  end
end

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

class Game_Actor < Game_Battler
  attr_accessor :item_restriction
  attr_accessor :skill_restriction
  attr_accessor :equip_restriction
  attr_accessor :disabled_items
 
  alias item_edit_ini initialize unless $@
  def initialize(actor_id)
    item_edit_ini(actor_id)
    @item_restriction = false
    @skill_restriction = false
    @equip_restriction = false
    @disabled_items = []
  end
 
  def item_restriction?
    if @item_restriction
      return false
    end
    super
  end
 
  def skill_restriction?
    if @skill_restriction
      return false
    end
    super
  end

  def equip_restriction?
    if @equip_restriction
      return false
    end
    super
  end
end

#------------------------------------------------------------------------------
# ** Window_Item
#------------------------------------------------------------------------------

class Window_Item < Window_Selectable
  def initialize(actor)
    super(0, 128, 640, 352)
    @actor = actor
    @column_max = 2
    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
 
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if $game_party.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if $game_party.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if $game_party.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end

  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
    can_use = true
    unless item.is_a?(RPG::Item)
      can_use = false
    end
    unless $game_party.item_can_use?(item.id)
      can_use = false
    end
    if @actor.disabled_items.include?(item.id)
      can_use = false
    end
    if can_use
      self.contents.font.color = normal_color
    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_Menu
#------------------------------------------------------------------------------

class Scene_Menu
  def update_command
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.trigger?(Input::C)
      if $game_party.actors.size == 0 and @command_window.index < 4
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      case @command_window.index
      when 0  # item
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 1  # skill
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # equipment
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # status
        $game_system.se_play($data_system.decision_se)
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # save
        if $game_system.save_disabled
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Save.new
      when 5  # end game
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_End.new
      end
      return
    end
  end
 
  def update_status
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0 # item
        if $game_party.actors[@status_window.index].item_restriction?
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Item.new(@status_window.index)
      when 1 # skill
        if $game_party.actors[@status_window.index].skill_restriction?
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Skill.new(@status_window.index)
      when 2 # equipment
        if $game_party.actors[@status_window.index].equip_restriction?
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Equip.new(@status_window.index)
      when 3 # status
        $game_system.se_play($data_system.decision_se)
        $scene = Scene_Status.new(@status_window.index)
      end
      return
    end
  end
end

#------------------------------------------------------------------------------
# ** Scene_Item
#------------------------------------------------------------------------------

class Scene_Item
  def initialize(actor_index = 0)
    @actor_index = actor_index
  end
 
  def main
    @actor = $game_party.actors[@actor_index]
    @help_window = Window_Help.new
    @item_window = Window_Item.new(@actor)
    @item_window.help_window = @help_window
    @status_window = Window_SkillStatus.new(@actor)
    @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
    @item_window.dispose
    @target_window.dispose
    @status_window.dispose
  end
 
  def update
    @help_window.update
    @item_window.update
    @target_window.update
    @status_window.update
    if @item_window.active
      update_item
      return
    end
    if @target_window.active
      update_target
      return
    end
  end

  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
      if @actor.disabled_items.include?(@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
        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
          @status_window.refresh
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    if Input.trigger?(Input::R)
      actor_index = @actor_index
      loop do
        @actor_index += 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].item_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Item.new(@actor_index)
      return
    end
    if Input.trigger?(Input::L)
      actor_index = @actor_index
      loop do
        @actor_index -= 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].item_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Item.new(@actor_index)
      return
    end
  end
 
  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 >= 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_Skill
#------------------------------------------------------------------------------

class Scene_Skill
  def update_skill
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Menu.new(1)
      return
    end
    if Input.trigger?(Input::C)
      @skill = @skill_window.skill
      if @skill == nil or not @actor.skill_can_use?(@skill.id)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      if @skill.scope >= 3
        @skill_window.active = false
        @target_window.x = (@skill_window.index + 1) % 2 * 304
        @target_window.visible = true
        @target_window.active = true
        if @skill.scope == 4 || @skill.scope == 6
          @target_window.index = -1
        elsif @skill.scope == 7
          @target_window.index = @actor_index - 10
        else
          @target_window.index = 0
        end
      else
        if @skill.common_event_id > 0
          $game_temp.common_event_id = @skill.common_event_id
          $game_system.se_play(@skill.menu_se)
          @actor.sp -= @skill.sp_cost
          @status_window.refresh
          @skill_window.refresh
          @target_window.refresh
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    if Input.trigger?(Input::R)
      actor_index = @actor_index
      loop do
        @actor_index += 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].skill_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Skill.new(@actor_index)
      return
    end
    if Input.trigger?(Input::L)
      actor_index = @actor_index
      loop do
        @actor_index -= 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].skill_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Skill.new(@actor_index)
      return
    end
  end
end

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

class Scene_Equip
  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)
      if @actor.equip_fix?(@right_window.index)
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $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::R)
      actor_index = @actor_index
      loop do
        @actor_index += 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].skill_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
    if Input.trigger?(Input::L)
      actor_index = @actor_index
      loop do
        @actor_index -= 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].skill_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Equip.new(@actor_index, @right_window.index)
      return
    end
  end
end


Esperamos que ésto os sea de utilidad ;D
avatar
Wecoc
Administrador
Administrador



Créditos 12211

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Sistema Momotaro

Mensaje por carlos55 el 2014-06-21, 14:40

Excelente aporte Wecoc.
Se podria adaptar el script de items al RMVX?
avatar
carlos55
Moderador
Moderador

0/3

Créditos 1131

Gracias : 11

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Sistema Momotaro

Mensaje por BlazeCrimson el 2014-06-22, 06:10

Un gran aporte, puede ser muy útil en diversos juegos.
Sin mucho más que decir, gracias por ir aportando constantemente  gcool 

_________________
Image and video hosting by TinyPic
avatar
BlazeCrimson
Analista
Analista

0/3

Créditos 1127

Gracias : 111

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Sistema Momotaro

Mensaje por Wecoc el 2015-10-01, 15:12

He hecho un script que funciona con el Sistema de Items por Actor, y que hace que a parte de que cada actor pueda usar o no los items de la party, cada uno tenga los suyos en su propio inventario. Todos los métodos gain_item, gain_weapon, gain_armor y similares de Game_Party afectaran por defecto al actor principal de la party, pero luego puedes aplicar los mismos métodos por cada actor directamente.

Código:
#==============================================================================
# - MOMOTARO - Sistema de Items por Actor
#      Fixes for Actor Inventory!
#==============================================================================

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

class Game_Actor < Game_Battler
  alias wec_inventory_ini initialize unless $@
  def initialize(actor_id)
    wec_inventory_ini(actor_id)
    @items = {}
    @weapons = {}
    @armors = {}
  end
 
  def item_number(item_id)
    return @items.include?(item_id) ? @items[item_id] : 0
  end
 
  def weapon_number(weapon_id)
    return @weapons.include?(weapon_id) ? @weapons[weapon_id] : 0
  end
 
  def armor_number(armor_id)
    return @armors.include?(armor_id) ? @armors[armor_id] : 0
  end
 
  def gain_item(item_id, n)
    if item_id > 0
      @items[item_id] = [item_number(item_id) + n, 0].max
    end
  end
 
  def gain_weapon(weapon_id, n)
    if weapon_id > 0
      @weapons[weapon_id] = [weapon_number(weapon_id) + n, 0].max
    end
  end
 
  def gain_armor(armor_id, n)
    if armor_id > 0
      @armors[armor_id] = [armor_number(armor_id) + n, 0].max
    end
  end
 
  def lose_item(item_id, n)
    gain_item(item_id, -n)
  end

  def lose_weapon(weapon_id, n)
    gain_weapon(weapon_id, -n)
  end

  def lose_armor(armor_id, n)
    gain_armor(armor_id, -n)
  end

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

#------------------------------------------------------------------------------
# ** Game_Party
#------------------------------------------------------------------------------

class Game_Party
  def gain_gold(n)
    @gold = [@gold + n, 0].max
  end

  def lose_gold(n)
    gain_gold(-n)
  end

  def increase_steps
    @steps += 1
  end

  def item_number(item_id)
    n = 0
    for actor in @actors
      n += actor.item_number(item_id)
    end
    return n
  end

  def weapon_number(weapon_id)
    n = 0
    for actor in @actors
      n += actor.weapon_number(weapon_id)
    end
    return n
  end

  def armor_number(armor_id)
    n = 0
    for actor in @actors
      n += actor.armor_number(armor_id)
    end
    return n
  end

  def gain_item(item_id, n, actor_id = nil)
    if actor_id == nil
      actor = @actors[0]
    else
      for i in 0...@actors.size
        if @actors[i].actor_id == actor_id
          actor = @actors[i]
          break
        end
      end
    end
    return if actor.nil?
    actor.gain_item(item_id, n)
  end
 
  def gain_weapon(weapon_id, n, actor_id = nil)
    if actor_id == nil
      actor = @actors[0]
    else
      for i in 0...@actors.size
        if @actors[i].actor_id == actor_id
          actor = @actors[i]
          break
        end
      end
    end
    return if actor.nil?
    actor.gain_weapon(weapon_id, n)
  end

  def gain_armor(armor_id, n, actor_id = nil)
    if actor_id == nil
      actor = @actors[0]
    else
      for i in 0...@actors.size
        if @actors[i].actor_id == actor_id
          actor = @actors[i]
          break
        end
      end
    end
    return if actor.nil?
    actor.gain_armor(armor_id, n)
  end

  def lose_item(item_id, n, actor_id = nil)
    gain_item(item_id, -n, actor_id)
  end

  def lose_weapon(weapon_id, n, actor_id = nil)
    gain_weapon(weapon_id, -n, actor_id)
  end

  def lose_armor(armor_id, n, actor_id = nil)
    gain_armor(armor_id, -n, actor_id)
  end

  def item_can_use?(item_id)
    for actor in @actors
      if actor.item_can_use?(item_id)
        return true
      end
    end
    return false
  end
end

#------------------------------------------------------------------------------
# ** Game_Actor (equip)
#------------------------------------------------------------------------------

class Game_Actor
  def equip(equip_type, id)
    case equip_type
    when 0  # Weapon
      if id == 0 or weapon_number(id) > 0
        gain_weapon(@weapon_id, 1)
        @weapon_id = id
        lose_weapon(id, 1)
      end
    when 1  # Shield
      if id == 0 or armor_number(id) > 0
        update_auto_state($data_armors[@armor1_id], $data_armors[id])
        gain_armor(@armor1_id, 1)
        @armor1_id = id
        lose_armor(id, 1)
      end
    when 2  # Head
      if id == 0 or armor_number(id) > 0
        update_auto_state($data_armors[@armor2_id], $data_armors[id])
        gain_armor(@armor2_id, 1)
        @armor2_id = id
        lose_armor(id, 1)
      end
    when 3  # Body
      if id == 0 or armor_number(id) > 0
        update_auto_state($data_armors[@armor3_id], $data_armors[id])
        gain_armor(@armor3_id, 1)
        @armor3_id = id
        lose_armor(id, 1)
      end
    when 4  # Accessory
      if id == 0 or armor_number(id) > 0
        update_auto_state($data_armors[@armor4_id], $data_armors[id])
        gain_armor(@armor4_id, 1)
        @armor4_id = id
        lose_armor(id, 1)
      end
    end
  end
end

#------------------------------------------------------------------------------
# ** Window_Item
#------------------------------------------------------------------------------

class Window_Item < Window_Selectable
  def initialize(actor)
    super(0, 128, 640, 352)
    @actor = actor
    @column_max = 2
    refresh
    self.index = 0
    if $game_temp.in_battle
      self.y = 64
      self.height = 256
      self.back_opacity = 160
    end
  end
 
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in 1...$data_items.size
      if @actor.item_number(i) > 0
        @data.push($data_items[i])
      end
    end
    unless $game_temp.in_battle
      for i in 1...$data_weapons.size
        if @actor.weapon_number(i) > 0
          @data.push($data_weapons[i])
        end
      end
      for i in 1...$data_armors.size
        if @actor.armor_number(i) > 0
          @data.push($data_armors[i])
        end
      end
    end
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end

  def draw_item(index)
    item = @data[index]
    case item
    when RPG::Item
      number = @actor.item_number(item.id)
    when RPG::Weapon
      number = @actor.weapon_number(item.id)
    when RPG::Armor
      number = @actor.armor_number(item.id)
    end
    can_use = true
    unless item.is_a?(RPG::Item)
      can_use = false
    end
    unless $game_party.item_can_use?(item.id)
      can_use = false
    end
    if @actor.disabled_items.include?(item.id)
      can_use = false
    end
    if can_use
      self.contents.font.color = normal_color
    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
  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
      if @actor.disabled_items.include?(@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
        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
            @actor.lose_item(@item.id, 1)
            @item_window.draw_item(@item_window.index)
          end
          @status_window.refresh
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
    if Input.trigger?(Input::R)
      actor_index = @actor_index
      loop do
        @actor_index += 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].item_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Item.new(@actor_index)
      return
    end
    if Input.trigger?(Input::L)
      actor_index = @actor_index
      loop do
        @actor_index -= 1
        @actor_index %= $game_party.actors.size
        unless $game_party.actors[@actor_index].item_restriction?
          break
        end
        if @actor_index == actor_index
          break
        end
      end
      if @actor_index == actor_index
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.cursor_se)
      $scene = Scene_Item.new(@actor_index)
      return
    end
  end
 
  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 >= 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
          @actor.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

#------------------------------------------------------------------------------
# ** Window_EquipItem
#------------------------------------------------------------------------------

class Window_EquipItem < Window_Selectable
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    if @equip_type == 0
      weapon_set = $data_classes[@actor.class_id].weapon_set
      for i in 1...$data_weapons.size
        if @actor.weapon_number(i) > 0 and weapon_set.include?(i)
          @data.push($data_weapons[i])
        end
      end
    end
    if @equip_type != 0
      armor_set = $data_classes[@actor.class_id].armor_set
      for i in 1...$data_armors.size
        if @actor.armor_number(i) > 0 and armor_set.include?(i)
          if $data_armors[i].kind == @equip_type-1
            @data.push($data_armors[i])
          end
        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

  def draw_item(index)
    item = @data[index]
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    case item
    when RPG::Weapon
      number = @actor.weapon_number(item.id)
    when RPG::Armor
      number = @actor.armor_number(item.id)
    end
    bitmap = RPG::Cache.icon(item.icon_name)
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24))
    self.contents.font.color = normal_color
    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_Battle
#------------------------------------------------------------------------------

class Scene_Battle
  def make_item_action_result
    @item = $data_items[@active_battler.current_action.item_id]
    unless @active_battler.item_can_use?(@item.id)
      @phase4_step = 1
      return
    end
    if @item.consumable
      @active_battler.lose_item(@item.id, 1)
    end
    @help_window.set_text(@item.name, 1)
    @animation1_id = @item.animation1_id
    @animation2_id = @item.animation2_id
    @common_event_id = @item.common_event_id
    index = @active_battler.current_action.target_index
    target = $game_party.smooth_target_actor(index)
    set_target_battlers(@item.scope)
    for target in @target_battlers
      target.item_effect(@item)
    end
  end
end

El script no incluye ninguna modificación de la tienda para que vaya por actor, ni tampoco ninguna escena de intercambio de objetos entre distintos actores. Ámbas cosas son imprescindibles para el buen uso de éste por lo que tarde o temprano haré un tercer script para añadirlo.
avatar
Wecoc
Administrador
Administrador



Créditos 12211

Gracias : 632

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Sistema Momotaro

Mensaje por Ledai el 2015-10-01, 15:16

Ohh!!! Tiene pinta de ser un Script muy bueno... lástima que ya tengo el sistema de objetos de Ahura hecho, si no, lo habría usado sin duda.

¡Gracias por compartirlo!
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5491

Gracias : 211

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Sistema Momotaro

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.