Tutorial: Defining script calls that can reference by party index
An issue that I’ve come across often when writing event-related scripts is “how can I let the user check whether the leader satisfies some condition?”
For example, I want to check whether the leader is holding a shield. Well that’s easy I can just say
$game_party.leader.armors.any? {|armor| armor.etype_id == 1}
Assuming etype 1 is the “shield” equip type. But this is not user-friendly: it means you need to know how to script. And what if you wanted to reference the second person in the party?
There should be a better way to be able to do this, and the reason why I provide script call methods in the first place is so users don’t need to worry about arrays or objects or zero-indexing or other things.
Suppose I were to write a convenience method in the game interpreter that checks whether a particular actor has a shield on
def shield_equipped?(actor_id) $game_actors[actor_id].armors.any?{|armor| armor.etype_id == 1} end
Pretty simple. But what about reference by party index? Let’s take advantage of the fact that when you are referencing database ID’s, they are all positive numbers. Why not use a negative number as a party index?
def shield_equipped?(party_index) index = party_index.abs - 1 actor = $game_party.all_members[index] return unless actor actor.armors.any?{|armor| armor.etype_id == 1} end
This method assumes that the party index is negative. If you pass in -1, then it will retrieve the first actor in the party (index 0, since Ruby arrays are zero-indexed). Shouldn’t be too difficult for users to remember after awhile: just stick a negative sign in front of the ID.
Now we can combine it together: you can search by actor ID, or party index:
def shield_equipped?(index) # check party index if < 0 if index < 0 index = party_index.abs - 1 actor = $game_party.all_members[index] return false unless actor actor.armors.any?{|armor| armor.etype_id == 1} else $game_actors[index].armors.any?{|armor| armor.etype_id == 1 } end end
Since you’ll probably be doing this often, it would be better to write it as its own method
def get_actor(index) if index < 0 index = index.abs - 1 return $game_party.all_members[index] else return $game_actors[index] end end
And now it is easy to write script calls for managing actors by ID and by party index
def shield_equipped?(index) actor = get_actor(index) return false unless actor return actor.armors.any? {|armor| armor.etype_id == 1} end
Simply instruct your users to use a positive ID if they want to reference a specific actor, or use a negative ID if they want to reference by party index.