The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX => VX Scripts Database => Topic started by: jet10985 on April 14, 2010, 04:15:31 AM

Title: Jet's Alignment System
Post by: jet10985 on April 14, 2010, 04:15:31 AM
Introduction

This script adds a simple and easy-to-use alignment system to your game. This will allow the character to be good, evil, or anything in-between. You can even change it up from alignment to other stuff like Rank or Vampirism.

Features

- Adds Alignment
- Easy to add/subtract points
- Easy to make new alignment names
- Adds alignment name in status menu
- You can add tags to equipment/skills to require a certain alignment condition

Screenshots

Spoiler for:
(https://rmrk.net/proxy.php?request=http%3A%2F%2Fimg85.imageshack.us%2Fimg85%2F6899%2Falignment.png&hash=b2060f1ccb91f5334b04afb715145b340e905036)

How To Use

Spoiler for:
The alignment name and value match to the corresponding one in the other array.

EX: In the default, "Very Evil" is the first name, and -100 is the first condition

This means, if -100 or lower is the value of $game_system.alignment, the
character will be "Very Evil".
--------------------------------------------------------------------------------
How to change alignment: We have 2 command to change alignment points.

sub_alignment(points) and add_alignment(points)

In both commands, replace "points" with the amount of change you want in the
character's alignment points.

sub_alignment will subtract the amount of points.
add_alignment will add the amount of points

Script

Spoiler for:
Code: [Select]
#===============================================================================
# Alignment System V.2
# By Jet10985
# Help by: Crimsonseas, Piejamas, Originalwij, Yanfly, Mithran
# Inspired by: Synthesis
#===============================================================================
# This script is not open for distribution to other sites without permission
# from me, Jet10985. Please credit me if you use this script.
#===============================================================================
# This script will allow you to add a nice alignment system to your game, which
# can be used for more then alignment. EX: Ranks, Vampirism, etc.
# This script has: 5 customization options.
#===============================================================================

=begin
The alignment name and value match to the corresponding one in the other array.

EX: In the default, "Very Evil" is the first name, and -100 is the first condition

This means, if -100 or lower is the value of $game_system.alignment, the
character will be "Very Evil".
--------------------------------------------------------------------------------
How to change alignment: We have 2 command to change alignment points.

sub_alignment(points) and add_alignment(points)

In both commands, replace "points" with the amount of change you want in the
character's alignment points.

sub_alignment will subtract the amount of points.
add_alignment will add the amount of points
--------------------------------------------------------------------------------
Tagging equipment and skills:

To tag these in the database to require a certain amount of alignment points,
add the tag

<alignment ##>

where ## is the number of points required. make sure you keep
the <> because that's actually required.
=end

module AlignmentOptions
 
  ALIGNMENT_NAME = ["Very Evil", "Evil", "Neutral", "Good", "Very Good"]
 
  ALIGNMENT_CONDITION = [-100, -50, 0, 50, 100] # What the value of $game_system.alignment
                                                # needs to be to correspond to the alignment name
                                               
  NAME_OF_ALIGNMENT = "Alignment" # This is what alignment will be called altogether
 
  USE_VARIABLE = false
 
  VARIABLE_ID = 5

end # ending module
#===============================================================================
class Game_System
 
  include AlignmentOptions
   
  alias jet5830_initialize initialize
  def initialize
    jet5830_initialize
    @alignment = 0
  end
 
  def alignment
    USE_VARIABLE ? $game_variables[VARIABLE_ID] : @alignment
  end
 
  def alignment=(new_value)
    USE_VARIABLE ? $game_variables[VARIABLE_ID] = new_value : @alignment = new_value
  end
end # ending Game_System addition

class Game_Interpreter
 
  def add_alignment(points) # adding easy-to-us command to add alignment points
    $game_system.alignment += points # adding the arguement value from the variable
  end # ending definition
 
  def sub_alignment(points) # adding easy-to-us command to subtract alignment points
    $game_system.alignment -= points # subtracting the arguement value from the variable
  end # ending definition
end # ending addition to Game_Interpreter

class Window_Status
 
  include AlignmentOptions # including the options defined in the module AlignmentOptions
 
  alias jet5839_refresh refresh unless $@ # aliasing my new command to avoid compatibility issues
  def refresh
    jet5839_refresh # calls the old method
    self.contents.font.color = system_color # redefines the self contained font color
    self.contents.draw_text(290, 110, 500, 500, NAME_OF_ALIGNMENT + ":") # draws the name of alignment
    self.contents.font.color = normal_color # redefines the self contained font color
    self.contents.draw_text(400, 110, 500, 500, draw_alignment) # draws the alignment name in the window
  end # ending definition alias
end

class Window_Base
 
  include AlignmentOptions
 
  def draw_alignment # Definition of Draw_alignment
    if $game_system.alignment <= ALIGNMENT_CONDITION.min
      return ALIGNMENT_NAME[0]
    elsif $game_system.alignment >= ALIGNMENT_CONDITION.max
      return ALIGNMENT_NAME[ALIGNMENT_NAME.size - 1]
    elsif
      for i in 0...ALIGNMENT_CONDITION.size
        if $game_system.alignment < ALIGNMENT_CONDITION[i]
          return ALIGNMENT_NAME[i-1]
        end
      end
    end
  end
end

module Jet
    def self.get_note(obj, tag)
    notebox = obj.note.dup
    taglist = notebox.scan(/<.+>/)
    for t in taglist
      text = t.split(/[ <>]/)
      text.delete("")
      for item in text
        return text[text.index(item) + 1] if item == tag
      end
    end
    return nil
  end
end

module RPG
  class BaseItem
    def alignment
      if @alignment_req.nil?
        txt = Jet.get_note(self, "alignment")
        @alignment_req = txt.nil? ? :unaligned : txt.to_i
      end
      return @alignment_req
    end
  end
end

class Game_Actor
 
  include AlignmentOptions
 
  alias jet3849_skill_can_use? skill_can_use?
  def skill_can_use?(skill)
    if skill.alignment != :unaligned
      q = (ALIGNMENT_CONDITION.size / 2)
      if (skill.alignment < 0 or skill.alignment > 0) && ($game_system.alignment == 0)
        return false unless ((ALIGNMENT_CONDITION[q - 1] / 2)..(ALIGNMENT_CONDITION[q + 1] / 2)) === skill.alignment
      elsif skill.alignment > 0
        return false unless $game_system.alignment >= skill.alignment
      elsif skill.alignment < 0
        return false unless $game_system.alignment <= skill.alignment
      elsif skill.alignment == 0
        return false unless (ALIGNMENT_CONDITION[q - 1]..ALIGNMENT_CONDITION[q + 1]) === skill.alignment
      end
    end
    jet3849_skill_can_use?(skill)
  end
end

class Scene_Base
 
  def equip_check
    check_equipment = @item_window.item.alignment
    if check_equipment != :unaligned
      if check_equipment < 0
        return 1
      elsif check_equipment > 0
        return 0
      elsif check_equipment == 0
        return 2
      end
    else
      return 3
    end
  end
end

class Scene_Equip
 
  include AlignmentOptions
 
  alias jet5839_start start
  def start
    jet5839_start
    @des_window = Window_Base.new(0, 185, 544, 56)
    @des_window.visible = false
  end
 
  alias jet1047_terminate terminate
  def terminate
    jet1047_terminate
    @des_window.dispose
  end
 
  alias jet2094_update update
  def update
    jet2094_update
    @des_window.update
  end

  def update_item_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @equip_window.active = true
      @item_window.active = false
      @item_window.index = -1
    elsif Input.trigger?(Input::C)
      if @item_window.item != nil
        q = (ALIGNMENT_CONDITION.size / 2)
        final_check = equip_check
        if final_check == 0 && $game_system.alignment >= @item_window.item.alignment
          full_equip_process
        elsif final_check == 1 && $game_system.alignment <= @item_window.item.alignment
          full_equip_process
        elsif final_check == 3
          full_equip_process
        elsif final_check == 2 && (ALIGNMENT_CONDITION[q - 1])..(ALIGNMENT_CONDITION[q + 1]) === @item_window.item.alignment
          full_equip_process
        elsif (final_check == 0 or final_check == 1) && ($game_system.alignment == 0 && ((ALIGNMENT_CONDITION[q - 1] / 2)..(ALIGNMENT_CONDITION[q + 1] / 2)) === @item_window.item.alignment)
          full_equip_process
        end
      else
        full_equip_process
      end
    end
  end
 
  def full_equip_process
    Sound.play_equip
    @actor.change_equip(@equip_window.index, @item_window.item)
    @equip_window.active = true
    @item_window.active = false
    @item_window.index = -1
    @equip_window.refresh
    for item_window in @item_windows
      item_window.refresh
    end
  end
end

unless $engine_scripts.nil?
  JetEngine.active("Alignment System")
end


Patches

Spoiler for:
Place all patches below my alignment script AND the script being patched.

YERD Status ReDux:
Spoiler for:
Code: [Select]
class Window_Status
 
  alias jet5999_refresh refresh unless $@
  def refresh
    jet5999_refresh
    self.contents.font.color = system_color # redefines the self contained font color
    self.contents.draw_text(279, 96, 106, WLH, NAME_OF_ALIGNMENT + ":") # draws the name of alignment
    self.contents.font.color = normal_color # redefines the self contained font color
    self.contents.draw_text(382, 96, 90, WLH, draw_alignment) # draws the alignment name in the window
  end
end

Show Alignment on Map:
Spoiler for:
Code: [Select]
module AlignmentOptions
 
  OPACITY = 0 # How transperant is the window? 0 is transperant, 255 is solid.
 
  SHOW_ALIGNMENT_NAME = true # Show "Alignment:"?
 
  WINDOW_X = 0 # X location of window
 
  WINDOW_Y = 358 # Y location of window

end

class Scene_Map
 
  include AlignmentOptions
 
  alias jet5390_start start unless $@
  def start
    @alignment_window = Window_MiniAlignment.new(WINDOW_X, WINDOW_Y)
    jet5390_start
  end
 
  alias jet0145_terminate terminate unless $@
  def terminate
    @alignment_window.dispose
    jet0145_terminate
  end
 
  alias jet1902_update update unless $@
  def update
    @alignment_window.update
    jet1902_update
  end
end

class Window_MiniAlignment < Window_Base
 
  include AlignmentOptions
 
  def initialize(x, y)
    super(x, y, 240, 58)
    @v = $game_system.alignment
    self.opacity = OPACITY
    refresh
  end
 
  def refresh
    self.contents.clear
    @alignment_x = 0
    if SHOW_ALIGNMENT_NAME
      @alignment_x = 120
      self.contents.font.color = system_color
      self.contents.draw_text(0, 0, 140, WLH, NAME_OF_ALIGNMENT + ":")
    end
    self.contents.font.color = normal_color
    self.contents.draw_text(@alignment_x, 0, 140, WLH, draw_alignment)
  end
 
  def update
    refresh if @v != $game_system.alignment
    @v = $game_system.alignment
  end
end

Future Features

- Weapons/armor/skills dependent on alignment DONE
- Choose bewteen an in-game variable and add_alignment(points) DONE
- Suggested Features

FAQ

Q: How do I add or subtract points?
A: Read the Instructions!

Q: How do I add more alignment names?
A: Add the name, in quotes, where you want to. Then add the points requirement in the same place, but in the other array.
EX:

Code: [Select]
ALIGNMENT_NAMES = ["Very Evil", "Kinda Evil", "evil", "neutral", "good", "very good"]
I added "Kinda Evil" between "very evil" and "evil". Now I must add the requirement.

Code: [Select]
ALIGNMENT_CONDITION = [-100, -75, -50, 0, 50, 100]
See how i added -75 between the requirement for "very evil" and "evil" just like i put "kinda evil"? Thats how.

Credit and Thanks
- Jet10985
- CrimsonSeas (rpgmakervx.net)
- Piejamas (rpgmakervx.net)
- Mithran (rpgmakervx.net)
- Yanfly
- OriginalWij (rpgmakervx.net)
- Synthesis
Title: Re: Jet's Alignment System
Post by: modern algebra on April 15, 2010, 11:28:28 PM
Looks pretty neat :)

EDIT: Sorry, just realized you did do my suggestion :), so I erased it and hope you didn't see.

Anyway, great idea and I love that you took the time to integrate a visual component in the Status Scene. I'm always so lazy when it comes to graphical stuff @_@
Title: Re: Jet's Alignment System
Post by: jet10985 on April 15, 2010, 11:30:02 PM
There is an option to use a variable in the config.
Thanks also. =)
Title: Re: Jet's Alignment System
Post by: modern algebra on April 15, 2010, 11:31:10 PM
Aww, my edit was 41 seconds too late :P
Title: Re: Jet's Alignment System
Post by: jdillon88 on August 06, 2010, 02:53:58 AM
is there a way to make it show up on the menu screen like next to the gold instead of the status screen?
Title: Re: Jet's Alignment System
Post by: Cascading Dragon on August 06, 2010, 02:57:47 AM
He hasn't updated the version on here in a while
Go to rpgmaker.net and find the newest version
Title: Re: Jet's Alignment System
Post by: Wiimeiser on November 21, 2010, 02:42:47 AM
Any way I could get this to work with Scene Status Melody, rather than Redux? I know for a fact that a patch designed for Redux won't work with Melody. Do I just change parts of the patch or is a new one needed?
Title: Re: Jet's Alignment System
Post by: Wiimeiser on November 24, 2010, 08:19:55 AM
Seriously? No one ever makes compatibility patches for YEM? Only Redux?
Title: Re: Jet's Alignment System
Post by: hiromu656 on January 03, 2011, 03:50:32 AM
This is very useful since I plan on having more than one ending to my game, but is there a way for me to not show their Alignment in the menu. Because if it's there, players would tend to do specific things to go a certain way on the good or evil bar rather than playing the game how they would if there wasn't an alignment system.
Title: Re: Jet's Alignment System
Post by: Wiimeiser on November 06, 2011, 09:52:47 AM
Anyone interested in making another, more up-to-date compatibility patch, for the melody engine? I've asked this before...
Title: Re: Jet's Alignment System
Post by: fankem on November 06, 2011, 11:35:58 AM
How do we make a skill or an equipment dependent on a negative alignment, it doesn't work when I try but with positive alignment points it works
Title: Re: Jet's Alignment System
Post by: nemrog on December 04, 2011, 09:59:05 AM
I'll bump this cause the game I'm planning on making is heavily Alignment Orientated, and I'm curious to fankem's question as well.