The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX => VX Scripts Database => Topic started by: IXFURU on August 23, 2012, 09:19:59 AM

Title: ShapeShifting System
Post by: IXFURU on August 23, 2012, 09:19:59 AM
SHAPE SHIFT SYSTEM 1.0
By: Ixfuru


INTRODUCTION
This script uses switches, states and variables to alter the actor's graphics.  This includes a way to change actor's opacity, creating an invisibility effect; Actor-specific switches, which (when ON) changes different actor's into different forms.  Global switches, which change the entire party into a specified form.  State induced alteration of graphics.  And a method for use of changing actor graphic dependent upon a variable's value.   This can be used for an aging system, wherein, as the variable rises, the actor begins to look older or a power-up (almost like Altered Beast), when the variable rises, the actor's develop a more deadly appearance.

FEATURES
graphic changes based on switches
graphic changes based on actor-specific switches
graphic changes based on variable
graphic changes based on state
opacity of actor based on switch and constant

SCREENSHOTS
Spoiler for "Images":
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi16.photobucket.com%2Falbums%2Fb38%2FDwiguitar%2FBaseGraphic.png&hash=c2df586b3a1ca8aae4489db393acdb124363db19)
Above, the normal graphics of actors

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi16.photobucket.com%2Falbums%2Fb38%2FDwiguitar%2FDead.png&hash=a10b64e4124853fb7ca510437bc4535311629aa4)
The actor in "DEAD" state

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi16.photobucket.com%2Falbums%2Fb38%2FDwiguitar%2FGraphicViaSwitch.png&hash=88718de342e64f44920d733d49794da25cf594c9)
Altered by global switch

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi16.photobucket.com%2Falbums%2Fb38%2FDwiguitar%2FInvisible.png&hash=e1784024fdbf2c2b621a1ed21eb496c93d13b9d5)
'Invisible'

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi16.photobucket.com%2Falbums%2Fb38%2FDwiguitar%2FOld.png&hash=524a1ffa9d7c49ccaa53ec3f551d09faaa7098d8)
The actors getting old.


HOW TO USE
This script can be plug and play.  However, you'll want to read through the instructions to set up the script to better suit the project you're creating.
Just put the script in the script editor, above main and below materials.  Then read through the instructions to better understand them.  Please note that
specific graphics alterations have priority over others.  The invisibility has priority over all other changes.  States have priority over actor-specific switches.  Actor-specific switches have priority over global switches.  global switches hold priority over variable alteration.  If you follow directions, the script shouldn't give you much trouble, but again, you'll need to set it up so it best fits your needs.

DEMO
http://www.mediafire.com/?1h08fglobhefzmy (http://www.mediafire.com/?1h08fglobhefzmy)

SCRIPT
Spoiler for "ShapeShiftSystem":
Code: [Select]
################################################################################
#   SYSTEM SHAPESHIFT
# By: IXFURU
#   8/20/12
#
################################################################################
# This script allows you to  exchange actor graphic in
# the event of states or game switches.   In other words, if an actor is under
# a specific state, his/her graphic changes.  Likewise if a switch is on.
# This will be good if you want an image to display say when the actor is dead,
# or when they use some sort of shapeshift.
#  The script has also been adapted to use an aging system, wherein, a game
# variable of your choice can be used to manipulate the base form of actors.
# Though this is recognized by this script as the "AGE_VARIABLE", it DOES NOT
# keep time, nor is it restrained in that capacity.  It may be of use, however,
# in a time system, where a variable displays and tracks years.
################################################################################
# :INSTRUCTIONS:
# This script is not noob friendly at all.  Though, I suppose it could be
# plug n play, for better results, you'll need to read through the scripts comments
# carefully and adjust the constants in the module in order to fit your needs.
# Place the script above main and below materials in the script editor.  Only
# one method is aliased in this script, so it should be compatible with other
# scripts.  At the least, you must set up an ACTOR BASE for every actor to be
# effected.
################################################################################
# A note on the system:
#  To understand the way the script works, it's imperative to know the heiarchy
# of the system.  In that certain factors take precendence over others.  The
# following should help explain.
#
#   The invisibility switch takes priority over all and effects all, regardless of id.
#   States take precedence over switches,
#   Switches take precendence over the age variable.
################################################################################
################################################################################
# SPECIAL THANKS:
# HungrySnake and ???noBody???
#   for their insight into $game_actor iteration and
# changing character's opacity.
################################################################################
# ::::CREDITS::::
#  Feel free to use this in your non-commercial project.  You have the right to
# modify it as you see fit, but don't claim you've produced and or written the
# contents herein.  Please don't post the script in other forum Script Submission
# sections, without first contacting me via RPGMakerVX.net at The Finish Line
# forum, or by way of PM either there or on RMRK.net.  If you wish to use the
# script commercially, please contact me and we'll discuss it.  I will need at
# least a copy of the project.
#    ENJOY!
################################################################################
module ISSS
 
  #This first value refers to how many actors in the database should be used in
  # the system.  Make sure you set the actors effected at the top of the database
  # actors list.  This allows you to create actors who are not effected by the
  # Shapeshift.  If you set this value to 6, then the first 6 actors from the
  # database will be effected by the system.  Those later in the list will
  # be ignored.
  ACTORS_TO_EFFECT = 4
 
  #Switch Range is used to evaluate switches and makes it possible to iterate
  # a given number of switches, rather than ALL the switches in the game.  Here,
  # you will decide the low and high of that range.  Any switches with ids
  # including and in between the the range low and high will be used in the
  # iteration.  For incomplete prjoects, it's recommended that you give yourself
  # ample room for future switch applications.  Be sure to set the switches
  # in the other parts of th script to switches with ids between these two
  # constants.
  SWITCH_RANGE_LO = 1
  SWITCH_RANGE_HI = 10
 
  # The next constant allows you to set a switch which will be defined as the
  # invisibility switch.  When this switch is on, the character will become
  # 'invisible'.  Just how invisible the character will become will be modified
  # in the following constant, which is for opacity.  You must set it between
  # 0 and 255.
  INVISIBLE_SWITCH = 1
  INVISIBLE_OPACITY = 125
 
  # The next part is a boolean, a variable and then a hash. If you set the boolean
  #"USE_AGING",  The character will turn back into a different form depending on
  # the value of the variable.  This way, you can have the variable track years, 
  # and then change them back into graphics dependent upon the value of the
  # said variable.
  USE_AGING = true
  AGE_VARIABLE = 1
 
  # Here, the double hash is set up like this:
  # actor_id => age_variable= [graphic, index, face, index]
  #  In this hash, replace actor_id with the id of the actor in the database. 
  # Replace age_value with the value of the AGE_VARIABLE used to determine when
  # the change is necessary.  Replace graphic and face with character and face
  # graphics you wish to use, and index with the corresponding sheet index for the
  # graphics chosen.  Keep in mind, for one actor, you can have several different
  # variations. 
  AGING_BASES = { #<<<<Don't delete this!!

  1 => { 100 => ['Actor3', 0, 'Actor3', 0],
150 => ['People2', 2, 'People2', 2],
200 => ['People1', 6, 'People1', 6]},

  2 => {100 => ['Actor2', 3, 'Actor2', 3],
150 => ['People2', 5, 'People2', 5],
200 => ['People1', 7, 'People1', 7]}
 
  }#<<<<Don't delete this!!!
 
  #################PLEASE READ IF YOU ARE USING THE AGING SYSTEM################
  # If you are using the aging system, it is important to know the comparitive
  # manner in which the system operates. The variable AGING_VARIABLE is used in
  # all comparisons against the the key values of the inner hash. 
  # Step one, checks to see if the variable is below the first value.  If so, it
  # uses the ACTOR_BASE constant to change the character and face of the actor.
  # if this is not the case, it takes the variable and compares the first key
  # value with the second. If the variable is greater than the first value, but
  # less than the second, it will change the character in correspondence to the
  # first value.  If it's greater than or equal to the second, it advances to the
  # third and compares the 2nd and 3rd values.  In this way, it proceeds, until
  # it decides where the value lies.  The only place where this is not true is the
  # final key value in the hash.  In the final key, it only compares to see if the
  # variable is greater than the value given.   
  # Take the following example:
  # 6 => {11 => ['People1', 3, 'People1', 3]
  #    16 => ['People1', 6, 'People1', 6]
  #    40 => ['People3', 2, 'People3', 2]}
  #  In the above example, actor number 6 in the database would change into 'People1',
  # 3 when only when the variable is greater than or equal to 11.  It would only
  # use 'People1, 6, if the variable was greater than or equal to 16, but less than
  # 40.  In this equation, once the variable reached 40, it would change to 'People3,
  # 2, when the variable was above 40.
  ################################################################################

  # Next, set up the original character and face for
  # the actors.  So they can be turned back from there graphics into their
  # original form when the state or switch no longer has effect. If you are
  # using aging, the graphics found here will only be used if the aging variable
  # has not yet reached the first key value of the AGING_BASES inner hash.
  #   Use:
  #   actor_id = [graphic, index, face, index]
  # Wherein, the actor_id is replaced with the id from the database of the given
  # actor.  Graphic is set to the graphic file you wish to use, and index for the
  # character index in the given sheet.  If you are using individual character
  # sheets, just use 0 for the index.

  ACTOR_BASE = { #<<<Don't delete this!!!

  1 => ['Actor1', 0, 'Actor1', 0],
  2 => ['Actor1', 1, 'Actor1', 1],

  } #<<<<<Don't delete this!!!

  # To set up the hash below, use:
  # state_id => [graphic, index, face, index]
  # Replace state_id with the database id of the state.  Replace graphic with the
  # graphic file you want to use, and index to the character index of the file.
  # Do the same with the face. Again, if you're using individual character sheets,
  # use 0 as the index.  This is universal for ALL actors.  The higher id of State
  # holds precedence over lower database id states.  Therefor, if you want the
  # incapacitated (dead) default state to hold precedence, you should copy and
  # paste it below all other states in the database.
  STATE_GRAPHICS = { #<<<<Don't touch this!!!

  1 => ['Monster', 1, 'Monster', 1]

  } #<<<< Don't delete this!!

  #Another hash, sets up switches to control the appearance of the actors.  When
  # the switches set here are on, the actors are turned into the graphics and faces
  # in the array, (set up like above).  This is universal for ALL actors.  Setup is
  # as follows:
  # switch_id => [graphic, index, face, index]
  SWITCH_GRAPHICS = {#<<<<Don't delete this!!!
  2 => ['Evil', 2, 'Evil', 2],
  3 => ['Evil', 3, 'Evil', 3],
  }#<<<< Don't delete this

  # The last double hash, sets up actor-specific switches.  When switch is on, it has a
  # different effect on individual actors.  Set up is as follows:
  #   switch_id => {actor_id => [graphic, index, face, index]}
  ACTOR_SWITCHES = { #<<<< Don't delete this!!!
  4 => {1 => ['People4', 0, 'People4', 0],
2 => ['People4', 1, 'People4', 1]},
 
  5 => {1 => ['Evil', 7, 'Evil', 7],
2 => ['Spiritual', 6, 'Spiritual', 6]}
  } #<<<<<Don't delete this!!!
################################################################################
# !!!IF YOU EDIT BELOW HERE, YOU RISK SCREWING THINGS UP!!!!
################################################################################
end

#===============================================================================
#    GAME CHARACTER
#===============================================================================
class Game_Character
  attr_writer :opacity # make opacity accessible
end

#===============================================================================
#    GAME ACTOR
#===============================================================================
class Game_Actor < Game_Battler
  include ISSS
 
  alias isss_ga_setup setup unless $@  #alias the setup method
  def setup(actor_id)
isss_ga_setup(actor_id) #call the original method
@actor_base = []    #create array
@change_switches = []
@change_states = []
get_actor_base   #call new method
get_change_switches    
get_change_states
  end
 
  #-----------------------------------------------------------------------------
  # GET ACTOR BASE
  #-----------------------------------------------------------------------------
  def get_actor_base
if @actor_id <= ACTORS_TO_EFFECT  #if actor is among those effected
  if ACTOR_BASE.has_key?(@actor_id)   #is actor's id a key in the hash
@actor_base = ACTOR_BASE[@actor_id] # set actor's base graphic
  end
end
  end
 
  #-----------------------------------------------------------------------------
  #    GET CHANGE SWITCHES
  #-----------------------------------------------------------------------------
  def get_change_switches
if @actor_id <= ACTORS_TO_EFFECT #if actor is among those effected
  for switch in SWITCH_RANGE_LO..SWITCH_RANGE_HI   # once for every switch in range
if SWITCH_GRAPHICS.has_key?(switch) # if switch id is a hash key
  @change_switches.push(switch)  #place switch in array
end
if ACTOR_SWITCHES.has_key?(switch) #is switch's id a key in the hash
  if ACTOR_SWITCHES[switch].has_key?(@actor_id)  #is actor's id a key in the inner hash
@change_switches.push(switch) #place switch in array
  end
end
  end
end
  end
 
  #-----------------------------------------------------------------------------
  # GET CHANGE STATES
  #-----------------------------------------------------------------------------
  def get_change_states
if @actor_id <= ACTORS_TO_EFFECT  #is actor among those effected
  for state in STATE_GRAPHICS.keys  #for every key in hash
@change_states.push(state)  #place state in array
  end
end
  end
 
  #-----------------------------------------------------------------------------
  #    UPDATE GRAPHIC CHANGES
  #-----------------------------------------------------------------------------
  def update_graphic_changes
@shifted = false
if @actor_id <= ACTORS_TO_EFFECT  #is actor among those effected
  if $game_party.members.include?($game_actors[@actor_id])  #is actor in the party
invisible = INVISIBLE_SWITCH   #set local variable to constant
invisible_opacity = INVISIBLE_OPACITY #set local variable to constant
if $game_switches[invisible] == true   #is invisible switch on
  $game_party.members.include?($game_actors[@actor_id]) # is actor in the party
  $game_player.opacity = invisible_opacity #change opacity to variable
else
  $game_party.members.include?($game_actors[@actor_id])
  $game_player.opacity = 255
end
if USE_AGING == true
  age_var = $game_variables[AGE_VARIABLE] #set local variable to constant
  if AGING_BASES.has_key?(@actor_id) #is actor's id found in hash keys
year = AGING_BASES[@actor_id].keys
for i in year
  if age_var >= i  # is age variable greater than the array element
age = AGING_BASES[@actor_id]  #create local array
set_graphic(age[i][0], age[i][1], age[i][2], age[i][3])  #set graphic to array elements
@shifted = true
  end
end
  end
end
unless @change_switches.empty?
  for switch in @change_switches  #once for every switch in the array
if $game_switches[switch] == true # is the array switch is on
  if SWITCH_GRAPHICS.has_key?(switch) # is the switch id found in hash keys
grafx = SWITCH_GRAPHICS[switch] # set local variable to hash and key
set_graphic(grafx[0], grafx[1], grafx[2], grafx[3]) # set graphic to hash key
@shifted = true
  else
grafx = ACTOR_SWITCHES[switch] # set local variable to hash and key
#set graphic to hash key
set_graphic(grafx[@actor_id][0], grafx[@actor_id][1], grafx[@actor_id][2], grafx[@actor_id][3])
@shifted = true
  end
end
  end
end
unless @change_states.empty?
  for state in @change_states  #once for every state in the array
if @states.include?(state) # does actor have state
  gfx = STATE_GRAPHICS[state]  # set local variable to hash and key
  set_graphic(gfx[0], gfx[1], gfx[2], gfx[3]) # set graphic to hash key
  @shifted = true
end
  end
end
check_actor_base(@shifted)
  end
end
  end
 
  #-----------------------------------------------------------------------------
  #   CHECK ACTOR BASE
  #-----------------------------------------------------------------------------
  def check_actor_base(shifted)
if shifted == false
  base = ACTOR_BASE[@actor_id]
  set_graphic(base[0], base[1], base[2], base[3])
end
  end
end

#===============================================================================
# SCENE_MAP
#===============================================================================
class Scene_Map < Scene_Base
  include ISSS
 
  alias isss_sm_update update
  def update
isss_sm_update
update_sss

  end
 
  #-----------------------------------------------------------------------------
  # UPDATE SSS
  #-----------------------------------------------------------------------------
  def update_sss
for actor in $game_party.members
  actor.update_graphic_changes
  $game_player.refresh
end
  end
 
end

#===============================================================================
#   SCENE_MENU
#===============================================================================
class Scene_Menu < Scene_Base
 
  alias isss_smenu_update update unless $@
  def update
isss_smenu_update
for actor in $game_party.members
  actor.update_graphic_changes
  $game_player.refresh
end
  end

end


#===============================================================================
#   WINDOW_MENU_STATUS
#===============================================================================
class Window_MenuStatus < Window_Selectable
 
  alias isss_wms_refresh refresh unless $@
  def refresh
isss_wms_refresh
for actor in $game_party.members
  actor.update_graphic_changes
  $game_player.refresh
end
  end
 
end

PATCHES
Though the script works well with Trickster's Caterpillar Script, I noticed that the 'invisibility' portion of the script did not.  So I took the liberty of making a patch for it.  You'll find it below:
Spoiler for "Trickster Caterpillar Patch":
Code: [Select]
################################################################################
# IXFURUS SYSTEM SHAPESHIFT
# Patch for:
#   Trickster's Caterpillar Script
################################################################################

#===============================================================================
# GAME PARTY
#===============================================================================
class Game_Party
  include ISSS
 
  alias isss_gp_update_followers update_followers unless $@
  def update_followers
isss_gp_update_followers
if $game_player.opacity < 255
  @followers.each do |x|
x.opacity = $game_player.opacity
  end
end
  end
end

FAQ
Q For some reason, I'm not getting a change in graphic, even though I've set up the actor's graphics in the module...How to fix it?
A Make sure you set the 'ACTORS_TO_EFFECT' constant in the module to a value which will include the actor you're trying to change.  I made this constant so that you could make actors who wouldn't be
effected by the script, as long their ids were out of range.

Q The switch is on, but no change was made to my actor's graphic.  What gives?
A Much like the actor ids, I set the switches up so that all switches ids used in the script would be found in a specific range.  Check the constants 'SWITCH_RANGE_LO' and 'SWITCH_RANGE_HI', and make sure the switch you are trying to use has an id which falls somewhere between the two.

CREDIT AND THANKS
Credit me if you use this script.  Also, you may use it in non-commerical projects as long as you want, just the credit is good enough.  For commercial project, let me know.  I'm sure I won't have a problem with it, as long as credit is given, and you give me a copy of the finished project.

EXTRA SPECIAL THANKS
I must take a moment to thank both ???noBody??? and HungrySnake.  They've been crucial to my finishing this script.

AUTHORS NOTES
If you have any problem with this script, please post in the topic.  If no response, post in THE FINISH LINE FORUM (http://"http://www.rpgmakervx.net/index.php?showforum=94").  If no response, PM me.  If still no response, I may have died or said to hell with it.  But I'm probably just sleeping.