Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

[XP] Multiple Game_Party IDs

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Multiple Game_Party IDs

Mensaje por Wecoc el 2016-11-30, 07:24

Hice una modificación del script base Game_Party para que soporte diferentes Party IDs. Eso significa que puedes separar la party en varias, cada una con sus actores, sus objetos, su dinero, etc. y cambiar de un grupo a otro mediante un comando.

Pese a ser una modificación bastante rudimentaria su uso puede llegar a ser bastante complicado para según qué casos, así que recomiendo usarlo solo si tenéis una base de RGSS. Además que quede claro que solo es una modificación de Game_Party, controles extra como qué hacer si todos los miembros de un grupo están muertos pero hay otros grupos disponibles y esas cosas (eso ya no solo afecta a Game_Party) se tendrán que hacer a parte, por defecto solo va a Game Over si todos los miembros de todos los grupos están muertos.

Además posiblemente haya que combinarlo con engines para lograr un efecto convincente de cambio de grupo.

Script: (ponedlo encima de main y de cualquier otro script personalizado)

Código:
#==============================================================================
# ** [XP] Multiple Game_Party IDs v1.1
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  MAX_ACTORS = 4
  MAX_ITEMS  = 99
  MAX_GOLD  = 9999999
  #--------------------------------------------------------------------------
  attr_reader :party_id
  #--------------------------------------------------------------------------
  def initialize
    @actors = {}
    @gold  = {}
    @steps  = {}
    @gold.default  = 0
    @steps.default = 0
    @items  = {}
    @weapons = {}
    @armors  = {}
    @items.default  = {}
    @weapons.default = {}
    @armors.default  = {}
    @party_id = 0
  end
  #--------------------------------------------------------------------------
  def set(party_id)
    @party_id = party_id
    refresh
  end
  #--------------------------------------------------------------------------
  def actors(party_id=@party_id)
    return [] if @actors[party_id].nil?
    return @actors[party_id]
  end
  #--------------------------------------------------------------------------
  def items(party_id=@party_id)
    return {} if @items[party_id].nil?
    return @items[party_id]
  end
  #--------------------------------------------------------------------------
  def weapons(party_id=@party_id)
    return {} if @weapons[party_id].nil?
    return @weapons[party_id]
  end
  #--------------------------------------------------------------------------
  def armors(party_id=@party_id)
    return {} if @armors[party_id].nil?
    return @armors[party_id]
  end
  #--------------------------------------------------------------------------
  def gold(party_id=@party_id)
    return @gold[party_id]
  end
  #--------------------------------------------------------------------------
  def steps(party_id=@party_id)
    return @steps[party_id]
  end
  #--------------------------------------------------------------------------
  def setup_starting_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for i in $data_system.party_members
      @actors[@party_id].push($game_actors[i])
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_test_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for battler in $data_system.test_battlers
      actor = $game_actors[battler.actor_id]
      actor.level = battler.level
      gain_weapon(battler.weapon_id, 1)
      gain_armor(battler.armor1_id, 1)
      gain_armor(battler.armor2_id, 1)
      gain_armor(battler.armor3_id, 1)
      gain_armor(battler.armor4_id, 1)
      actor.equip(0, battler.weapon_id)
      actor.equip(1, battler.armor1_id)
      actor.equip(2, battler.armor2_id)
      actor.equip(3, battler.armor3_id)
      actor.equip(4, battler.armor4_id)
      actor.recover_all
      @actors[@party_id].push(actor)
    end
    @items[@party_id] = {}
    for i in 1...$data_items.size
      if $data_items[i].name != ""
        occasion = $data_items[i].occasion
        if occasion == 0 or occasion == 1
          @items[@party_id][i] = MAX_ITEMS
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def refresh
    new_actors = []
    for i in 0...self.actors.size
      if $data_actors[self.actors[i].id] != nil
        new_actors.push($game_actors[self.actors[i].id])
      end
    end
    @actors[@party_id] = new_actors
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def max_level
    return 0 if self.actors.size == 0
    level = 0
    for actor in self.actors
      if level < actor.level
        level = actor.level
      end
    end
    return level
  end
  #--------------------------------------------------------------------------
  def add_actor(actor_id, party_id=@party_id)
    actor = $game_actors[actor_id]
    if @actors[party_id].size < MAX_ACTORS
      if !@actors[party_id].include?(actor)
        @actors[party_id].push(actor)
        $game_player.refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  def remove_actor(actor_id, party_id=@party_id)
    @actors[party_id].delete($game_actors[actor_id])
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def move_actor(actor_id, current_party_id, new_party_id)
    actor = $game_actors[actor_id]
    return if !@actors[current_party_id].include?(actor)
    return if @actors[new_party_id].size == MAX_ACTORS
    add_actor(actor_id, new_party_id)
    remove_actor(actor_id, current_party_id)
  end
  #--------------------------------------------------------------------------
  def get_actor_party_id(actor)
    for i in @actors.keys
      if @actors[i].any? { |a| a.id == actor.id }
        return i
      end
    end
  end
  #--------------------------------------------------------------------------
  def gain_gold(n, party_id=@party_id)
    @gold[party_id] = [[@gold[party_id] + n, 0].max, MAX_GOLD].min
  end
  #--------------------------------------------------------------------------
  def lose_gold(n, party_id=@party_id)
    gain_gold(-n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_gold(n, current_party_id, new_party_id)
    return if n == 0
    return move_gold(-n, new_party_id, current_party_id) if n < 0
    cn = [n, @gold[current_party_id]].min
    n = [cn, MAX_GOLD - @gold[new_party_id]].min
    gain_gold(n, new_party_id)
    lose_gold(n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def increase_steps(party_id=@party_id)
    @steps[party_id] += 1
  end
  #--------------------------------------------------------------------------
  def set_steps(n, party_id=@party_id)
    @steps[party_id] = [n, 0].max
  end
  #--------------------------------------------------------------------------
  def item_number(item_id, party_id=@party_id)
    return 0 if !@items[party_id].include?(item_id)
    return @items[party_id][item_id]
  end
  #--------------------------------------------------------------------------
  def weapon_number(weapon_id, party_id=@party_id)
    return 0 if !@weapons[party_id].include?(weapon_id)
    return @weapons[party_id][weapon_id]
  end
  #--------------------------------------------------------------------------
  def armor_number(armor_id, party_id=@party_id)
    return 0 if !@armors[party_id].include?(armor_id)
    return @armors[party_id][armor_id]
  end
  #--------------------------------------------------------------------------
  def gain_item(item_id, n, party_id=@party_id)
    return if item_id <= 0
    number = item_number(item_id, party_id)
    @items[party_id][item_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_item(item_id, n, party_id=@party_id)
    gain_item(item_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_item(item_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_item(item_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, item_number(item_id, current_party_id)].min
    n = [cn, MAX_ITEMS - item_number(item_id, new_party_id)].min
    gain_item(item_id, n, new_party_id)
    lose_item(item_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n, party_id=@party_id)
    return if weapon_id <= 0
    number = weapon_number(weapon_id, party_id)
    @weapons[party_id][weapon_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_weapon(weapon_id, n, party_id=@party_id)
    gain_weapon(weapon_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_weapon(weapon_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_weapon(weapon_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, weapon_number(weapon_id, current_party_id)].min
    n = [cn, MAX_ITEMS - weapon_number(weapon_id, new_party_id)].min
    gain_weapon(weapon_id, n, new_party_id)
    lose_weapon(weapon_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n, party_id=@party_id)
    return if armor_id <= 0
    number = armor_number(armor_id, party_id)
    @armors[party_id][armor_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_armor(armor_id, n, party_id=@party_id)
    gain_armor(armor_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_armor(armor_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_armor(armor_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, armor_number(armor_id, current_party_id)].min
    n = [cn, MAX_ITEMS - armor_number(armor_id, new_party_id)].min
    gain_armor(armor_id, n, new_party_id)
    lose_armor(armor_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def item_can_use?(item_id, party_id=@party_id)
    return false if item_number(item_id, party_id) == 0
    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
  #--------------------------------------------------------------------------
  def clear_actions
    for actor in self.actors
      actor.current_action.clear
    end
  end
  #--------------------------------------------------------------------------
  def inputable?
    for actor in self.actors
      return true if actor.inputable?
    end
    return false
  end
  #--------------------------------------------------------------------------
  def all_dead?(party_id=nil)
    return all_dead_all_parties? if party_id == nil
    return true if @actors[party_id].size == 0
    for actor in @actors[party_id]
      return false if actor.hp > 0
    end
    return true
  end
  #--------------------------------------------------------------------------
  def all_dead_all_parties?
  if $game_party.actors.size == 0
    return false
  end
  for actor in self.actors
    if actor.hp > 0
      return false
    end
  end
  return true
 end
 #--------------------------------------------------------------------------
 # ● check_map_slip_damage
 #--------------------------------------------------------------------------
 def check_map_slip_damage
  for actor in self.actors
    if actor.hp > 0 and actor.slip_damage?
      actor.hp -= [actor.maxhp / 100, 1].max
      if actor.hp == 0
        $game_system.se_play($data_system.actor_collapse_se)
      end
      $game_screen.start_flash(Color.new(255,0,0,128), 4)
      $game_temp.gameover = $game_party.all_dead?
    end
  end
 end
  #--------------------------------------------------------------------------
  def random_target_actor(hp0 = false)
    roulette = []
    for actor in self.actors
      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
        position = $data_classes[actor.class_id].position
        n = 4 - position
        n.times { roulette.push(actor) }
      end
    end
    return nil if roulette.size == 0
    return roulette[rand(roulette.size)]
  end
  #--------------------------------------------------------------------------
  def random_target_actor_hp0
    return random_target_actor(true)
  end
  #--------------------------------------------------------------------------
  def smooth_target_actor(actor_index)
    actor = self.actors[actor_index]
    return actor if actor != nil and actor.exist?
    for actor in self.actors
      return actor if actor.exist?
    end
  end
end

Versión anterior:
Código:
#==============================================================================
# ** [XP] Multiple Game_Party IDs v1.0
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  MAX_ACTORS = 4
  MAX_ITEMS  = 99
  MAX_GOLD   = 9999999
  #--------------------------------------------------------------------------
  attr_reader :party_id
  #--------------------------------------------------------------------------
  def initialize
    @actors = {}
    @gold   = {}
    @steps  = {}
    @gold.default  = 0
    @steps.default = 0
    @items   = {}
    @weapons = {}
    @armors  = {}
    @items.default   = {}
    @weapons.default = {}
    @armors.default  = {}
    @party_id = 0
  end
  #--------------------------------------------------------------------------
  def set(party_id)
    @party_id = party_id
    refresh
  end
  #--------------------------------------------------------------------------
  def actors(party_id=@party_id)
    return [] if @actors[party_id].nil?
    return @actors[party_id]
  end
  #--------------------------------------------------------------------------
  def items(party_id=@party_id)
    return {} if @items[party_id].nil?
    return @items[party_id]
  end
  #--------------------------------------------------------------------------
  def weapons(party_id=@party_id)
    return {} if @weapons[party_id].nil?
    return @weapons[party_id]
  end
  #--------------------------------------------------------------------------
  def armors(party_id=@party_id)
    return {} if @armors[party_id].nil?
    return @armors[party_id]
  end
  #--------------------------------------------------------------------------
  def gold(party_id=@party_id)
    return @gold[party_id]
  end
  #--------------------------------------------------------------------------
  def steps(party_id=@party_id)
    return @steps[party_id]
  end
  #--------------------------------------------------------------------------
  def setup_starting_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for i in $data_system.party_members
      @actors[@party_id].push($game_actors[i])
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_test_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for battler in $data_system.test_battlers
      actor = $game_actors[battler.actor_id]
      actor.level = battler.level
      gain_weapon(battler.weapon_id, 1)
      gain_armor(battler.armor1_id, 1)
      gain_armor(battler.armor2_id, 1)
      gain_armor(battler.armor3_id, 1)
      gain_armor(battler.armor4_id, 1)
      actor.equip(0, battler.weapon_id)
      actor.equip(1, battler.armor1_id)
      actor.equip(2, battler.armor2_id)
      actor.equip(3, battler.armor3_id)
      actor.equip(4, battler.armor4_id)
      actor.recover_all
      @actors[@party_id].push(actor)
    end
    @items[@party_id] = {}
    for i in 1...$data_items.size
      if $data_items[i].name != ""
        occasion = $data_items[i].occasion
        if occasion == 0 or occasion == 1
          @items[@party_id][i] = MAX_ITEMS
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def refresh
    new_actors = []
    for i in 0...self.actors.size
      if $data_actors[self.actors[i].id] != nil
        new_actors.push($game_actors[self.actors[i].id])
      end
    end
    @actors[@party_id] = new_actors
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def max_level
    return 0 if self.actors.size == 0
    level = 0
    for actor in self.actors
      if level < actor.level
        level = actor.level
      end
    end
    return level
  end
  #--------------------------------------------------------------------------
  def add_actor(actor_id, party_id=@party_id)
    actor = $game_actors[actor_id]
    if @actors[party_id].size < MAX_ACTORS
      if !@actors[party_id].include?(actor)
        @actors[party_id].push(actor)
        $game_player.refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  def remove_actor(actor_id, party_id=@party_id)
    @actors[party_id].delete($game_actors[actor_id])
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def move_actor(actor_id, current_party_id, new_party_id)
    actor = $game_actors[actor_id]
    return if !@actors[current_party_id].include?(actor)
    return if @actors[new_party_id].size == MAX_ACTORS
    add_actor(actor_id, new_party_id)
    remove_actor(actor_id, current_party_id)
  end
  #--------------------------------------------------------------------------
  def get_actor_party_id(actor)
    for i in @actors.keys
      if @actors[i].any? { |a| a.id == actor.id }
        return i
      end
    end
  end
  #--------------------------------------------------------------------------
  def gain_gold(n, party_id=@party_id)
    @gold[party_id] = [[@gold[party_id] + n, 0].max, MAX_GOLD].min
  end
  #--------------------------------------------------------------------------
  def lose_gold(n, party_id=@party_id)
    gain_gold(-n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_gold(n, current_party_id, new_party_id)
    return if n == 0
    return move_gold(-n, new_party_id, current_party_id) if n < 0
    cn = [n, @gold[current_party_id]].min
    n = [cn, MAX_GOLD - @gold[new_party_id]].min
    gain_gold(n, new_party_id)
    lose_gold(n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def increase_steps(party_id=@party_id)
    @steps[party_id] += 1
  end
  #--------------------------------------------------------------------------
  def set_steps(n, party_id=@party_id)
    @steps[party_id] = [n, 0].max
  end
  #--------------------------------------------------------------------------
  def item_number(item_id, party_id=@party_id)
    return 0 if !@items[party_id].include?(item_id)
    return @items[party_id][item_id]
  end
  #--------------------------------------------------------------------------
  def weapon_number(weapon_id, party_id=@party_id)
    return 0 if !@weapons[party_id].include?(weapon_id)
    return @weapons[party_id][weapon_id]
  end
  #--------------------------------------------------------------------------
  def armor_number(armor_id, party_id=@party_id)
    return 0 if !@armors[party_id].include?(armor_id)
    return @armors[party_id][armor_id]
  end
  #--------------------------------------------------------------------------
  def gain_item(item_id, n, party_id=@party_id)
    return if item_id <= 0
    number = item_number(item_id, party_id)
    @items[party_id][item_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_item(item_id, n, party_id=@party_id)
    gain_item(item_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_item(item_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_item(item_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, item_number(item_id, current_party_id)].min
    n = [cn, MAX_ITEMS - item_number(item_id, new_party_id)].min
    gain_item(item_id, n, new_party_id)
    lose_item(item_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n, party_id=@party_id)
    return if weapon_id <= 0
    number = weapon_number(weapon_id, party_id)
    @weapons[party_id][weapon_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_weapon(weapon_id, n, party_id=@party_id)
    gain_weapon(weapon_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_weapon(weapon_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_weapon(weapon_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, weapon_number(weapon_id, current_party_id)].min
    n = [cn, MAX_ITEMS - weapon_number(weapon_id, new_party_id)].min
    gain_weapon(weapon_id, n, new_party_id)
    lose_weapon(weapon_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n, party_id=@party_id)
    return if armor_id <= 0
    number = armor_number(armor_id, party_id)
    @armors[party_id][armor_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_armor(armor_id, n, party_id=@party_id)
    gain_armor(armor_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_armor(armor_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_armor(armor_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, armor_number(armor_id, current_party_id)].min
    n = [cn, MAX_ITEMS - armor_number(armor_id, new_party_id)].min
    gain_armor(armor_id, n, new_party_id)
    lose_armor(armor_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def item_can_use?(item_id, party_id=@party_id)
    return false if item_number(item_id, party_id) == 0
    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
  #--------------------------------------------------------------------------
  def clear_actions
    for actor in self.actors
      actor.current_action.clear
    end
  end
  #--------------------------------------------------------------------------
  def inputable?
    for actor in self.actors
      return true if actor.inputable?
    end
    return false
  end
  #--------------------------------------------------------------------------
  def all_dead?(party_id=nil)
    return all_dead_all_parties? if party_id == nil
    return true if @actors[party_id].size == 0
    for actor in @actors[party_id]
      return false if actor.hp > 0
    end
    return true
  end
  #--------------------------------------------------------------------------
  def all_dead_all_parties?
    for i in @actors.keys
      return false if i.nil?
      return false if all_dead?(i) == false
    end
    return true
  end
  #--------------------------------------------------------------------------
  def check_map_slip_damage
    for actor in self.actors
      if actor.hp > 0 and actor.slip_damage?
        actor.hp -= [actor.maxhp / 100, 1].max
        if actor.hp == 0
          $game_system.se_play($data_system.actor_collapse_se)
        end
        $game_screen.start_flash(Color.new(255,0,0,128), 4)
        $game_temp.gameover = $game_party.all_dead?
      end
    end
  end
  #--------------------------------------------------------------------------
  def random_target_actor(hp0 = false)
    roulette = []
    for actor in self.actors
      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
        position = $data_classes[actor.class_id].position
        n = 4 - position
        n.times { roulette.push(actor) }
      end
    end
    return nil if roulette.size == 0
    return roulette[rand(roulette.size)]
  end
  #--------------------------------------------------------------------------
  def random_target_actor_hp0
    return random_target_actor(true)
  end
  #--------------------------------------------------------------------------
  def smooth_target_actor(actor_index)
    actor = self.actors[actor_index]
    return actor if actor != nil and actor.exist?
    for actor in self.actors
      return actor if actor.exist?
    end
  end
end

Cada party tiene un máximo de actores, dinero y objetos que se puede cambiar al principio del script.

Métodos:

En verde los que van como siempre, en blanco los nuevos y en naranja los avanzados.

Argumentos:

PARTY ID - Numérico. Índice de la party. Por defecto vale 0.
ACTOR ID - Numérico. Índice del actor en la Base de Datos.
ACTOR - Game_Actor. Se obtiene usando $game_actors[ACTOR ID]
GOLD - Numérico. Dinero.
STEPS - Numérico. Pasos.
ITEM/WEAPON/ARMOR ID - Numérico. Índice del objeto/arma/protector en la Base de Datos.
NUMBER - Numérico. Valor (número de objetos, armas, protectores con el que se interactúa)

Obtener datos almacenados:
MÉTODODESCRIPCIÓN
$game_party.actorsDevuelve los actores de la party actual
$game_party.actors(PARTY ID)Devuelve los actores de una party
$game_party.itemsDevuelve los objetos de la party actual
$game_party.items(PARTY ID)Devuelve los objetos de una party
$game_party.weaponsDevuelve las armas (no usadas) de la party actual
$game_party.weapons(PARTY ID)Devuelve las armas (no usadas) de una party
$game_party.armorsDevuelve los protectores (no usados) de la party actual
$game_party.armors(PARTY ID)Devuelve los protectores (no usados) de una party
$game_party.goldDevuelve el dinero de la party actual
$game_party.gold(PARTY ID)Devuelve el dinero de una party
$game_party.stepsDevuelve los pasos de la party actual
$game_party.steps(PARTY ID)Devuelve los pasos de una party
$game_party.max_levelDevuelve el nivel más alto de los actores de la party actual
Interacciones:
MÉTODODESCRIPCIÓN
$game_party.set(PARTY ID)Cambia de ID la party
$game_party.add_actor(ACTOR ID)Añade un actor a la party actual
$game_party.add_actor(ACTOR ID, PARTY ID)Añade un actor a una party
$game_party.remove_actor(ACTOR ID)Quita un actor a la party actual
$game_party.remove_actor(ACTOR ID, PARTY ID)Quita un actor a una party
$game_party.move_actor(ACTOR ID, CURRENT PARTY ID, NEW PARTY ID)Mueve un actor de una party a otra
$game_party.get_actor_party_id(ACTOR)Obtiene la ID de party en la que se encuentra un actor
$game_party.gain_gold(GOLD)Incrementa el dinero de la party actual
$game_party.gain_gold(GOLD, PARTY ID)Incrementa el dinero de una party
$game_party.lose_gold(GOLD)Disminuye el dinero de la party actual
$game_party.lose_gold(GOLD, PARTY ID)Disminuye el dinero de una party
$game_party.move_gold(GOLD, CURRENT PARTY ID, NEW PARTY ID)Mueve dinero de una party a otra
$game_party.increase_stepsIncrementa un paso
$game_party.increase_steps(PARTY ID)Incrementa un paso en una party
$game_party.set_steps(STEPS)Define el número de pasos en la party actual
$game_party.set_steps(STEPS, PARTY ID)Define el número de pasos en una party
$game_party.item_number(ITEM ID)Obtiene el número que contiene la party actual de un determinado objeto
$game_party.item_number(ITEM ID, PARTY ID)Obtiene el número que contiene una party de un determinado objeto
$game_party.weapon_number(WEAPON ID)Obtiene el número que contiene la party actual de una determinada arma
$game_party.weapon_number(WEAPON ID, PARTY ID)Obtiene el número que contiene una party de una determinada arma
$game_party.armor_number(ARMOR ID)Obtiene el número que contiene la party actual de un determinado protector
$game_party.armor_number(ARMOR ID, PARTY ID)Obtiene el número que contiene una party de un determinado protector
$game_party.gain_item(ITEM ID, NUMBER)Añadir un objeto a la party
$game_party.gain_item(ITEM ID, NUMBER, PARTY ID)Añadir un objeto a la party
$game_party.lose_item(ITEM ID, NUMBER)Quitar un objeto de la party
$game_party.lose_item(ITEM ID, NUMBER, PARTY ID)Quitar un objeto de la party
$game_party.move_item(ITEM ID, NUMBER, CURRENT PARTY ID, NEW PARTY ID)Mover un objeto de una party a otra
$game_party.gain_weapon(WEAPON ID, NUMBER)Añadir un arma a la party
$game_party.gain_weapon(WEAPON ID, NUMBER, PARTY ID)Añadir un arma a la party
$game_party.lose_weapon(WEAPON ID, NUMBER)Quitar un arma de la party
$game_party.lose_weapon(WEAPON ID, NUMBER, PARTY ID)Quitar un arma de la party
$game_party.move_weapon(WEAPON ID, NUMBER, CURRENT PARTY ID, NEW PARTY ID)Mover un arma de una party a otra
$game_party.gain_armor(ARMOR ID, NUMBER)Añadir un protector a la party
$game_party.gain_armor(ARMOR ID, NUMBER, PARTY ID)Añadir un protector a la party
$game_party.lose_armor(ARMOR ID, NUMBER)Quitar un protector de la party
$game_party.lose_armor(ARMOR ID, NUMBER, PARTY ID)Quitar un protector de la party
$game_party.move_armor(ARMOR ID, NUMBER, CURRENT PARTY ID, NEW PARTY ID)Mover un protector de una party a otra
$game_party.item_can_use?(ITEM ID)Comprobar si la party actual puede usar un item
$game_party.all_dead?Comprobar si todos los miembros de todas las parties están muertos
$game_party.all_dead?(PARTY ID)Comprobar si todos los miembros de una party están muertos


Última edición por Wecoc el 2018-07-20, 21:50, editado 3 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12315

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por Ledai el 2016-11-30, 13:16

O.O Un aporte muy interesante. Sin duda resultará práctico a más de uno. 
Aunque actualmente no lo voy a usar, pienso archivarlo para poder usarlo en algún otro proyecto lejano, pues siempre he considerado algo raro si el grupo se parte o se divide que se comparta base de datos e inventario, que incluso sucede en juegos comerciales y de consolas.
avatar
Ledai
Aventurero
Aventurero

0/3

Créditos 5217

Gracias : 217

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por AsFzKakarotto el 2018-07-19, 15:59

Bueno, primero que todo me disculpo si esto párese un horrible necropost, pero es que el script tiene 2 errores:

El primero, cuando añado un actor a una party nueva aparece esto:



Y el segundo es que cuando entro a cualquier batalla aparece esto:



El primero se puede solucionar llamando anticipadamente el script:
$game_party.set(PARTY ID)
por la party nueva que se va a crear y después:
$game_party.set(0)
y desde allí, añadir el actor.

Pero el segundo error hace imposible iniciar una batalla.
La linea "return @actors.all?{|party| party.all_dead?}" la he inhabilitado si bien es posible luchar, la muerte total de aliados
hace una lucha interminable, hay alguna manera de llevar a Game Over sin importar que grupo haya muerto totalmente.
Es un script estupendo, de hecho es una solución a mi petición de tiempo atras y al complejo script de Kyonided KUnits.
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 325

Gracias : 70

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por Wecoc el 2018-07-19, 18:33

El primero no es un error del script, lo probé en un proyecto vacío y no se da ese fallo.
Piensa que el script modifica una de las estructuras importantes del maker (Game_Party), así que si guardaste la partida y luego añadiste el script e intentaste volver a cargarla, no funcionará bien. Supongo que el fallo es ese, tu arreglo del problema también me lo indica.

Para el segundo sí que arreglé un poco el método all_dead_all_parties? y creo que ya no debería salir error en ningún caso.
avatar
Wecoc
Administrador
Administrador



Créditos 12315

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por AsFzKakarotto el 2018-07-19, 20:12

Sobre el error 1, pues si amigo. no se por que demonios uso $game_party.add_actor(ACTOR ID, PARTY ID)  y me sigue dando error, también estoy con proyecto nuevo, sin partidas guardadas ni nada. Sobre el segundo error me sigue apareciendo. 
He probado el script nuevo y esta vez entra en batalla, pero a la hora del Game over a veces me aparece un mensaje de 
error o a veces se queda luchando eternamente, con todos los aliados muertos. 



¿Puede ser la versión de el maker?


Nota:
Bueno... puede ser algo dificil quisas dividir los items para cada party.
Si eso el lo complica el script, ¿puedes dejarlo simplemente con la opción de  cambiar el grupo y la cantidad de integrantes? en lo personal eso es lo que me importa, si bien queda mucho mejor con la idea original me conformo con que tenga dicho mecanismo.
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 325

Gracias : 70

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por AsFzKakarotto el 2018-07-20, 20:40

Mi estimado amigo Wecoc, acabo de solucionar el segundo error con ayuda de el script
que puse en petición, asimile que ambos hacían la misma función a si que copie la parte de:  

def all_dead? y def check_map_slip_damage

y la puse en el tuyo, y desde ahora aparece el game over para cualquier party como tiene que ser.
Pero sigo insistiendo que el error 1 es muy raro, ya que no he cargado ninguna partida, pero en lo
personal, este error no es tan preocupante ya que se soluciona fácil.

Aquí dejo el script que me funciona.
Código:
#==============================================================================
# ** [XP] Multiple Game_Party IDs v1.0
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  MAX_ACTORS  = 4
  MAX_ITEMS    = 99
  MAX_GOLD    = 9999999
  #--------------------------------------------------------------------------
  attr_reader :party_id
  #--------------------------------------------------------------------------
  def initialize
    @actors = {}
    @gold  = {}
    @steps  = {}
    @gold.default  = 0
    @steps.default = 0
    @items  = {}
    @weapons = {}
    @armors  = {}
    @items.default  = {}
    @weapons.default = {}
    @armors.default  = {}
    @party_id = 0
  end
  #--------------------------------------------------------------------------
  def set(party_id)
    @party_id = party_id
    refresh
  end
  #--------------------------------------------------------------------------
  def actors(party_id=@party_id)
    return [] if @actors[party_id].nil?
    return @actors[party_id]
  end
  #--------------------------------------------------------------------------
  def items(party_id=@party_id)
    return {} if @items[party_id].nil?
    return @items[party_id]
  end
  #--------------------------------------------------------------------------
  def weapons(party_id=@party_id)
    return {} if @weapons[party_id].nil?
    return @weapons[party_id]
  end
  #--------------------------------------------------------------------------
  def armors(party_id=@party_id)
    return {} if @armors[party_id].nil?
    return @armors[party_id]
  end
  #--------------------------------------------------------------------------
  def gold(party_id=@party_id)
    return @gold[party_id]
  end
  #--------------------------------------------------------------------------
  def steps(party_id=@party_id)
    return @steps[party_id]
  end
  #--------------------------------------------------------------------------
  def setup_starting_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for i in $data_system.party_members
      @actors[@party_id].push($game_actors[i])
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_test_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for battler in $data_system.test_battlers
      actor = $game_actors[battler.actor_id]
      actor.level = battler.level
      gain_weapon(battler.weapon_id, 1)
      gain_armor(battler.armor1_id, 1)
      gain_armor(battler.armor2_id, 1)
      gain_armor(battler.armor3_id, 1)
      gain_armor(battler.armor4_id, 1)
      actor.equip(0, battler.weapon_id)
      actor.equip(1, battler.armor1_id)
      actor.equip(2, battler.armor2_id)
      actor.equip(3, battler.armor3_id)
      actor.equip(4, battler.armor4_id)
      actor.recover_all
      @actors[@party_id].push(actor)
    end
    @items[@party_id] = {}
    for i in 1...$data_items.size
      if $data_items[i].name != ""
        occasion = $data_items[i].occasion
        if occasion == 0 or occasion == 1
          @items[@party_id][i] = MAX_ITEMS
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def refresh
    new_actors = []
    for i in 0...self.actors.size
      if $data_actors[self.actors[i].id] != nil
        new_actors.push($game_actors[self.actors[i].id])
      end
    end
    @actors[@party_id] = new_actors
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def max_level
    return 0 if self.actors.size == 0
    level = 0
    for actor in self.actors
      if level < actor.level
        level = actor.level
      end
    end
    return level
  end
  #--------------------------------------------------------------------------
  def add_actor(actor_id, party_id=@party_id)
    actor = $game_actors[actor_id]
    if @actors[party_id].size < MAX_ACTORS
      if !@actors[party_id].include?(actor)
        @actors[party_id].push(actor)
        $game_player.refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  def remove_actor(actor_id, party_id=@party_id)
    @actors[party_id].delete($game_actors[actor_id])
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def move_actor(actor_id, current_party_id, new_party_id)
    actor = $game_actors[actor_id]
    return if !@actors[current_party_id].include?(actor)
    return if @actors[new_party_id].size == MAX_ACTORS
    add_actor(actor_id, new_party_id)
    remove_actor(actor_id, current_party_id)
  end
  #--------------------------------------------------------------------------
  def get_actor_party_id(actor)
    for i in @actors.keys
      if @actors[i].any? { |a| a.id == actor }  #{ |a| a.id == actor.id }
        return i
      end
    end
  end
  #--------------------------------------------------------------------------
  def gain_gold(n, party_id=@party_id)
    @gold[party_id] = [[@gold[party_id] + n, 0].max, MAX_GOLD].min
  end
  #--------------------------------------------------------------------------
  def lose_gold(n, party_id=@party_id)
    gain_gold(-n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_gold(n, current_party_id, new_party_id)
    return if n == 0
    return move_gold(-n, new_party_id, current_party_id) if n < 0
    cn = [n, @gold[current_party_id]].min
    n = [cn, MAX_GOLD - @gold[new_party_id]].min
    gain_gold(n, new_party_id)
    lose_gold(n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def increase_steps(party_id=@party_id)
    @steps[party_id] += 1
  end
  #--------------------------------------------------------------------------
  def set_steps(n, party_id=@party_id)
    @steps[party_id] = [n, 0].max
  end
  #--------------------------------------------------------------------------
  def item_number(item_id, party_id=@party_id)
    return 0 if !@items[party_id].include?(item_id)
    return @items[party_id][item_id]
  end
  #--------------------------------------------------------------------------
  def weapon_number(weapon_id, party_id=@party_id)
    return 0 if !@weapons[party_id].include?(weapon_id)
    return @weapons[party_id][weapon_id]
  end
  #--------------------------------------------------------------------------
  def armor_number(armor_id, party_id=@party_id)
    return 0 if !@armors[party_id].include?(armor_id)
    return @armors[party_id][armor_id]
  end
  #--------------------------------------------------------------------------
  def gain_item(item_id, n, party_id=@party_id)
    return if item_id <= 0
    number = item_number(item_id, party_id)
    @items[party_id][item_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_item(item_id, n, party_id=@party_id)
    gain_item(item_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_item(item_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_item(item_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, item_number(item_id, current_party_id)].min
    n = [cn, MAX_ITEMS - item_number(item_id, new_party_id)].min
    gain_item(item_id, n, new_party_id)
    lose_item(item_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n, party_id=@party_id)
    return if weapon_id <= 0
    number = weapon_number(weapon_id, party_id)
    @weapons[party_id][weapon_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_weapon(weapon_id, n, party_id=@party_id)
    gain_weapon(weapon_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_weapon(weapon_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_weapon(weapon_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, weapon_number(weapon_id, current_party_id)].min
    n = [cn, MAX_ITEMS - weapon_number(weapon_id, new_party_id)].min
    gain_weapon(weapon_id, n, new_party_id)
    lose_weapon(weapon_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n, party_id=@party_id)
    return if armor_id <= 0
    number = armor_number(armor_id, party_id)
    @armors[party_id][armor_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_armor(armor_id, n, party_id=@party_id)
    gain_armor(armor_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_armor(armor_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_armor(armor_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, armor_number(armor_id, current_party_id)].min
    n = [cn, MAX_ITEMS - armor_number(armor_id, new_party_id)].min
    gain_armor(armor_id, n, new_party_id)
    lose_armor(armor_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def item_can_use?(item_id, party_id=@party_id)
    return false if item_number(item_id, party_id) == 0
    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
  #--------------------------------------------------------------------------
  def clear_actions
    for actor in self.actors
      actor.current_action.clear
    end
  end
  #--------------------------------------------------------------------------
  def inputable?
    for actor in self.actors
      return true if actor.inputable?
    end
    return false
  end
  #--------------------------------------------------------------------------
  def all_dead?(party_id=nil)
    return all_dead_all_parties? if party_id == nil
    return true if @actors[party_id].size == 0
    for actor in @actors[party_id]
      return false if actor.hp > 0
    end
    return true
  end
  #--------------------------------------------------------------------------
  def all_dead_all_parties?
  if $game_party.actors.size == 0
    return false
  end
  for actor in self.actors
    if actor.hp > 0
      return false
    end
  end
  return true
 end
 #--------------------------------------------------------------------------
 # ● check_map_slip_damage
 #--------------------------------------------------------------------------
 def check_map_slip_damage
  for actor in self.actors
    if actor.hp > 0 and actor.slip_damage?
      actor.hp -= [actor.maxhp / 100, 1].max
      if actor.hp == 0
        $game_system.se_play($data_system.actor_collapse_se)
      end
      $game_screen.start_flash(Color.new(255,0,0,128), 4)
      $game_temp.gameover = $game_party.all_dead?
    end
  end
 end
  #--------------------------------------------------------------------------
  def random_target_actor(hp0 = false)
    roulette = []
    for actor in self.actors
      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
        position = $data_classes[actor.class_id].position
        n = 4 - position
        n.times { roulette.push(actor) }
      end
    end
    return nil if roulette.size == 0
    return roulette[rand(roulette.size)]
  end
  #--------------------------------------------------------------------------
  def random_target_actor_hp0
    return random_target_actor(true)
  end
  #--------------------------------------------------------------------------
  def smooth_target_actor(actor_index)
    actor = self.actors[actor_index]
    return actor if actor != nil and actor.exist?
    for actor in self.actors
      return actor if actor.exist?
    end
  end
end

PD: Muchas Gracias por hacer este sistema.

EDIT: Por cierto el dinero se divide pero los artículos y Armas no, pero eso a mi me da igual  ;)
En el caso de las armaduras descubrí un error al añadir una: Wrong number of argument (2 for 1) Linea 234


Última edición por AsFzKakarotto el 2018-10-22, 07:20, editado 1 vez
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 325

Gracias : 70

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por Wecoc el 2018-07-20, 21:43

@Wecoc escribió:Pese a ser una modificación bastante rudimentaria su uso puede llegar a ser bastante complicado para según qué casos

Ya se veía que era un script que podía llevar complicaciones e igual requeriría cambios. Sobre que ahora el segundo bug ya está arreglado me fío, parece que todo seguía siendo problema del all_dead_all_parties? al fin y al cabo.

Lo de dividir items y armas se podría hacer pero ya para un script a parte porque requiere muchas más modificaciones a nivel de escena, por eso no lo puse en el script.

Ya arreglé lo del último fallo tanto en mi script como en el tuyo, solo faltaba un argumento en armor_number.
He cambiado el script del primer post para que contenga tu edit, lo pasé a versión 1.1
avatar
Wecoc
Administrador
Administrador



Créditos 12315

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por AsFzKakarotto el 2018-10-22, 07:18

Hola... Tres cosillas nuevas muy necesaria, nada del otro mundo pero útiles para esta función.

MÉTODODESCRIPCIÓN
$game_party.actors(PARTY ID).sizeObtiene el número que contiene una party de Integrantes
$game_party.gold(PARTY ID)Obtiene el número que contiene una party de Dinero
$game_party.party_idObtiene el número ID de la party actual en control

Puede que exista otras interacciones más, pero no es que yo sepa mucho de script así que las desconozco y si descubro más, las alistare :).

Y Bien... a este ultimo para el que desea detectar la ID constantemente le he hecho una pequeña edición de 2 lineas para que se guarde en una variable la ID de la party actual de la cual se está controlando a modo de que les pueda servir como condición.

Eh aqui el script:

Código:
#==============================================================================
# ** [XP] Multiple Game_Party IDs v1.0
#------------------------------------------------------------------------------
#  Autor: Wecoc - No requiere créditos
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  MAX_ACTORS   = 4
  MAX_ITEMS    = 99
  MAX_GOLD     = 9999999
  VARID_PARTY  = 2                           #Añadido variable detector (1/2)
  #--------------------------------------------------------------------------
  attr_reader :party_id
  #--------------------------------------------------------------------------
  def initialize
    @actors = {}
    @gold   = {}
    @steps  = {}
    @gold.default  = 0
    @steps.default = 0
    @items   = {}
    @weapons = {}
    @armors  = {}
    @items.default   = {}
    @weapons.default = {}
    @armors.default  = {}
    @party_id = 0
  end
  #--------------------------------------------------------------------------
  def set(party_id)
    @party_id = party_id
    $game_variables[VARID_PARTY] = party_id  #Añadido variable detector (2/2)
    refresh
  end
  #--------------------------------------------------------------------------
  def actors(party_id=@party_id)
    return [] if @actors[party_id].nil?
    return @actors[party_id]
  end
  #--------------------------------------------------------------------------
  def items(party_id=@party_id)
    return {} if @items[party_id].nil?
    return @items[party_id]
  end
  #--------------------------------------------------------------------------
  def weapons(party_id=@party_id)
    return {} if @weapons[party_id].nil?
    return @weapons[party_id]
  end
  #--------------------------------------------------------------------------
  def armors(party_id=@party_id)
    return {} if @armors[party_id].nil?
    return @armors[party_id]
  end
  #--------------------------------------------------------------------------
  def gold(party_id=@party_id)
    return @gold[party_id]
  end
  #--------------------------------------------------------------------------
  def steps(party_id=@party_id)
    return @steps[party_id]
  end
  #--------------------------------------------------------------------------
  def setup_starting_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for i in $data_system.party_members
      @actors[@party_id].push($game_actors[i])
    end
  end
  #--------------------------------------------------------------------------
  def setup_battle_test_members
    @party_id = 0 if @party_id.nil?
    @actors[@party_id] = []
    for battler in $data_system.test_battlers
      actor = $game_actors[battler.actor_id]
      actor.level = battler.level
      gain_weapon(battler.weapon_id, 1)
      gain_armor(battler.armor1_id, 1)
      gain_armor(battler.armor2_id, 1)
      gain_armor(battler.armor3_id, 1)
      gain_armor(battler.armor4_id, 1)
      actor.equip(0, battler.weapon_id)
      actor.equip(1, battler.armor1_id)
      actor.equip(2, battler.armor2_id)
      actor.equip(3, battler.armor3_id)
      actor.equip(4, battler.armor4_id)
      actor.recover_all
      @actors[@party_id].push(actor)
    end
    @items[@party_id] = {}
    for i in 1...$data_items.size
      if $data_items[i].name != ""
        occasion = $data_items[i].occasion
        if occasion == 0 or occasion == 1
          @items[@party_id][i] = MAX_ITEMS
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  def refresh
    new_actors = []
    for i in 0...self.actors.size
      if $data_actors[self.actors[i].id] != nil
        new_actors.push($game_actors[self.actors[i].id])
      end
    end
    @actors[@party_id] = new_actors
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def max_level
    return 0 if self.actors.size == 0
    level = 0
    for actor in self.actors
      if level < actor.level
        level = actor.level
      end
    end
    return level
  end
  #--------------------------------------------------------------------------
  def add_actor(actor_id, party_id=@party_id)
    actor = $game_actors[actor_id]
    if @actors[party_id].size < MAX_ACTORS
      if !@actors[party_id].include?(actor)
        @actors[party_id].push(actor)
        $game_player.refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  def remove_actor(actor_id, party_id=@party_id)
    @actors[party_id].delete($game_actors[actor_id])
    $game_player.refresh
  end
  #--------------------------------------------------------------------------
  def move_actor(actor_id, current_party_id, new_party_id)
    actor = $game_actors[actor_id]
    return if !@actors[current_party_id].include?(actor)
    return if @actors[new_party_id].size == MAX_ACTORS
    add_actor(actor_id, new_party_id)
    remove_actor(actor_id, current_party_id)
  end
  #--------------------------------------------------------------------------
  def get_actor_party_id(actor)
    for i in @actors.keys
      if @actors[i].any? { |a| a.id == actor }  #{ |a| a.id == actor.id }
        return i
      end
    end
  end
  #--------------------------------------------------------------------------
  def gain_gold(n, party_id=@party_id)
    @gold[party_id] = [[@gold[party_id] + n, 0].max, MAX_GOLD].min
  end
  #--------------------------------------------------------------------------
  def lose_gold(n, party_id=@party_id)
    gain_gold(-n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_gold(n, current_party_id, new_party_id)
    return if n == 0
    return move_gold(-n, new_party_id, current_party_id) if n < 0
    cn = [n, @gold[current_party_id]].min
    n = [cn, MAX_GOLD - @gold[new_party_id]].min
    gain_gold(n, new_party_id)
    lose_gold(n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def increase_steps(party_id=@party_id)
    @steps[party_id] += 1
  end
  #--------------------------------------------------------------------------
  def set_steps(n, party_id=@party_id)
    @steps[party_id] = [n, 0].max
  end
  #--------------------------------------------------------------------------
  def item_number(item_id, party_id=@party_id)
    return 0 if !@items[party_id].include?(item_id)
    return @items[party_id][item_id]
  end
  #--------------------------------------------------------------------------
  def weapon_number(weapon_id, party_id=@party_id)
    return 0 if !@weapons[party_id].include?(weapon_id)
    return @weapons[party_id][weapon_id]
  end
  #--------------------------------------------------------------------------
  def armor_number(armor_id, party_id=@party_id)
    return 0 if !@armors[party_id].include?(armor_id)
    return @armors[party_id][armor_id]
  end
  #--------------------------------------------------------------------------
  def gain_item(item_id, n, party_id=@party_id)
    return if item_id <= 0
    number = item_number(item_id, party_id)
    @items[party_id][item_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_item(item_id, n, party_id=@party_id)
    gain_item(item_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_item(item_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_item(item_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, item_number(item_id, current_party_id)].min
    n = [cn, MAX_ITEMS - item_number(item_id, new_party_id)].min
    gain_item(item_id, n, new_party_id)
    lose_item(item_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_weapon(weapon_id, n, party_id=@party_id)
    return if weapon_id <= 0
    number = weapon_number(weapon_id, party_id)
    @weapons[party_id][weapon_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_weapon(weapon_id, n, party_id=@party_id)
    gain_weapon(weapon_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_weapon(weapon_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_weapon(weapon_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, weapon_number(weapon_id, current_party_id)].min
    n = [cn, MAX_ITEMS - weapon_number(weapon_id, new_party_id)].min
    gain_weapon(weapon_id, n, new_party_id)
    lose_weapon(weapon_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def gain_armor(armor_id, n, party_id=@party_id)
    return if armor_id <= 0
    number = armor_number(armor_id, party_id)
    @armors[party_id][armor_id] = [[number + n, 0].max, MAX_ITEMS].min
  end
  #--------------------------------------------------------------------------
  def lose_armor(armor_id, n, party_id=@party_id)
    gain_armor(armor_id, -n, party_id)
  end
  #--------------------------------------------------------------------------
  def move_armor(armor_id, n, current_party_id, new_party_id)
    return if n == 0
    return move_armor(armor_id, -n, new_party_id, current_party_id) if n < 0
    cn = [n, armor_number(armor_id, current_party_id)].min
    n = [cn, MAX_ITEMS - armor_number(armor_id, new_party_id)].min
    gain_armor(armor_id, n, new_party_id)
    lose_armor(armor_id, n, current_party_id)
  end
  #--------------------------------------------------------------------------
  def item_can_use?(item_id, party_id=@party_id)
    return false if item_number(item_id, party_id) == 0
    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
  #--------------------------------------------------------------------------
  def clear_actions
    for actor in self.actors
      actor.current_action.clear
    end
  end
  #--------------------------------------------------------------------------
  def inputable?
    for actor in self.actors
      return true if actor.inputable?
    end
    return false
  end
  #--------------------------------------------------------------------------
  def all_dead?(party_id=nil)
    return all_dead_all_parties? if party_id == nil
    return true if @actors[party_id].size == 0
    for actor in @actors[party_id]
      return false if actor.hp > 0
    end
    return true
  end
  #--------------------------------------------------------------------------
  def all_dead_all_parties?
   if $game_party.actors.size == 0
     return false
   end
   for actor in self.actors
     if actor.hp > 0
       return false
     end
   end
   return true
 end
 #--------------------------------------------------------------------------
 # ● check_map_slip_damage
 #--------------------------------------------------------------------------
 def check_map_slip_damage
   for actor in self.actors
     if actor.hp > 0 and actor.slip_damage?
       actor.hp -= [actor.maxhp / 100, 1].max
       if actor.hp == 0
         $game_system.se_play($data_system.actor_collapse_se)
       end
       $game_screen.start_flash(Color.new(255,0,0,128), 4)
       $game_temp.gameover = $game_party.all_dead?
     end
   end
 end
  #--------------------------------------------------------------------------
  def random_target_actor(hp0 = false)
    roulette = []
    for actor in self.actors
      if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
        position = $data_classes[actor.class_id].position
        n = 4 - position
        n.times { roulette.push(actor) }
      end
    end
    return nil if roulette.size == 0
    return roulette[rand(roulette.size)]
  end
  #--------------------------------------------------------------------------
  def random_target_actor_hp0
    return random_target_actor(true)
  end
  #--------------------------------------------------------------------------
  def smooth_target_actor(actor_index)
    actor = self.actors[actor_index]
    return actor if actor != nil and actor.exist?
    for actor in self.actors
      return actor if actor.exist?
    end
  end
end

*NOTA
Este Script solo lo dejo para el que se le apetezca detectar CONSTANTEMENTE la ID de el GRUPO que se está controlando, esto se puede
comprobar fácilmente con las condiciones y efectos, pero este script lo dejo para el que lo desee Constantemente, eso es todo.

Estos llamados avanzados se pueden usar con el comando de condiciones y efectos y usarlo para comprobar ciertos valores... Ejemplo:

$game_party.party_id == 2

este script en el comando de condiciones y efectos, nos permite ver si el jugador está controlando la Party número 2 en su actualidad y si no lo esta controlando se puede marcar la opción de excepción para que ocurran otros sucesos.

Otro Ejemplo:

$game_party.get_actor_party_id(1) == 4

este script en el comando de condiciones y efectos, nos permite ver si el actor de ID 1 en la base de datos (Maker default Aluxes) se encuentra
actualmente en la party número 4 y si no lo esta puedan ocurrir otros sucesos siempre y cuando en condiciones y efectos se tenga activada la opción de excepción.


Última edición por AsFzKakarotto el 2018-12-03, 21:05, editado 1 vez
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 325

Gracias : 70

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por Wecoc el 2018-11-02, 17:55

Siento decirlo pero tu arreglo está mal.

Estabas usando get_actor_party_id con ACTOR ID en vez de ACTOR, por eso no te funcionaba.

@Wecoc escribió:$game_party.get_actor_party_id(ACTOR)
Obtiene la ID de party en la que se encuentra un actor

Sería por ejemplo así:
[line]actor = $game_actors[1] # ID de actor 1 (Alexis)
$game_party.get_actor_party_id(actor)[/line]

Eso tiene la ventaja que puedes obtener el actor por índice dentro de la party.
[line]actor = $game_party.actors[0] # Índice 0 en la party (Alexis)
$game_party.get_actor_party_id(actor)[/line]

Óbviamente como estamos hablando de obtener la party en la que se encuentra el actor esa segunda opción no tiene demasiado sentido, pero en cualquier caso usar el actor como argumento da cierto más control que usar solo su ID. Puedes obtener la ID de party donde se encuentra el actor con mayor nivel, o cosas así.

En cuanto a la variable, es una complicación innecesaria. Ahí estás forzando a usar una variable del juego, cuando no hay ninguna necesidad.
Mirando el caso de usar condiciones y efectos, hay dos opciones.

La primera es efectivamente usar variable del juego.
En una llamada de script haces: [line]$game_variables[ID] = $game_party.party_id[/line]
Solo tienes que cambiar ID por la id de la variable, y luego puedes usarla en Condiciones y Efectos como cualquier otra variable.

Pero hay una opción mejor, que es usar la ranura de script de Condiciones y Efectos directamente
Así te ahorras usar la variable: [line]$game_party.party_id == 2[/line]
Ese ejemplo comprueba si la Party ID vale 2.

Espero que ahora se entienda mejor su uso
avatar
Wecoc
Administrador
Administrador



Créditos 12315

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por kyonides-arkanthos el 2018-11-06, 06:21

Eso es lo mismo que usar $game_party.actors.index(actor) pero wecocio-adaptado a su versión de varios equipos. Sin embargo, siempre se pudo usar por defecto actor.index y eso lo hallo mucho más práctico que su método. XD Le recomiendo modificar ese método de actor para hacerlo más sencillo para los usuarios.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 587

Gracias : 86

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por Wecoc el 2018-11-06, 13:32

No, lo que dices es obtener el índice de un actor dentro de una party, mi ejemplo es dado un actor encontrar en qué party se encuentra. Es distinto xD

Para lo que dices puedes hacerlo como siempre

Encontrar el índice de actor dentro de una party
[line]actor = $game_actors[1] # ID de actor 1 (Alexis)
$game_party.actors.index(actor)[/line]
Eso lo mira en la party actual.

Si quieres buscarlo en una party de ID concreta también puedes
[line]actor = $game_actors[1]
$game_party.actors(3).index(actor) # ID de party 3[/line]

E incluso si no sabes donde puñetas está pero solo quieres saber si es el primero de su party, combinas ambos
[line]actor = $game_actors[1]
party_id = $game_party.get_actor_party_id(actor)
index = $game_party.actors(party_id).index(actor)
# Si index es 0 es que es el primero de su party[/line]

No es TAN distinto a como funciona por defecto.
avatar
Wecoc
Administrador
Administrador



Créditos 12315

Gracias : 655

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por kyonides-arkanthos el 2018-11-07, 04:09

Igual mi punto se sostiene en que podrías ofrecerle un método que haga lo mismo que actor.index pero que se llame, no sé, actor.party_index y así ellos se ahorran líneas de código que no van a entender. :P
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 587

Gracias : 86

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

Mensaje por AsFzKakarotto el 2018-12-03, 20:46

Tienes toda la razón, me acaba de funcionar con esos códigos combinados ya puedo entender un poco más el llamado que se le puede hacer, además mencionas que es mejor usar actor en vez de actor_id y te encuentro toda la rozan sin duda usar tu método es el que se debe hacer. Pero encuentro que con actor_id se puede hacer la siguiente condición de una manera más fácil... que estar llamando más de un código.. solo
es una opinión personal.

$game_party.get_actor_party_id(1) == 2

Con ello estaríamos comprobando si Aluxes se encuentra en grupo 2 en condiciones y efectos...
Busque la forma de poder hacerlo con tu método pero resulta que el llamado de script no acepta más de 2 lineas como para usar algo así:

actor = $game_actors[1]
$game_party.get_actor_party_id(actor) == 2


¿Como se debe hacer?... de todas formas me disculpo por mi errónea solución.
avatar
AsFzKakarotto
Soñador
Soñador

0/3

Créditos 325

Gracias : 70

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Multiple Game_Party IDs

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.