Help - Search - Members - Calendar
Full Version: Alignment System
RPG RPG Revolution Forums > Scripting > Script Submissions > RGSS2-Submissions
jet10985
Introduction


This script adds a simple and easy-to-use alignment system to your game. This will allow the charcter 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


[Show/Hide] Screenshot


How To Use


[Show/Hide] Instructions
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


[Show/Hide] The Script
CODE
#===============================================================================
# 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.min
    elsif $game_system.alignment >= ALIGNMENT_CONDITION.max
      return ALIGNMENT_NAME.max
    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


Patches


[Show/Hide] Patches
Place all patches below my alignment script AND the script being patched.


[Show/Hide] YERD Status ReDux Patch
CODE
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/Hide] Show Alignment on Map
CODE
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
    @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
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
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
Shanghai
As neat as this is, are there any mechanical aspects that you'll incorporate into this system? Otherwise, if it's all for just show, there really isn't much reason to use it other than letting the player know how evil or good a character is. I suggest that you add in some effects as such:

1. Characters gain access to Very Evil skills after reaching a certain point. Likewise for Very Good. And even some for staying in between.

2. Characters can equip certain weapons and armors when they reach a certain alignment.

3. Characters that reach certain alignment will turn on/off special switches that allow the script's user to access certain sidequests, and whatnot.

Otherwise, this is good for a beginner scripter. There's only the visual aspects made so far, but try to go for the mechanical aspects, too. Don't stop at one thing when both you and I know what's more important for the game.
draken29
Are you made this by yourself ?
I'm not said that you copied it but there's another one of this script right here
Don't be mad ok i'm just asking cool.gif
jet10985
@shanghai: If you looked at the topic more as well as the script you would have seen my "Future Features" part wink.gif

so... 1.) Can be evented, and when i add the tags for the skills, it will truly limit the use of them.

2.) Also on the Future Feature part already.

3.) Can be evented as well by the creator using a common event.

Thanks for suggestion all this though anyways.

@draken: Yes, i wrote this code. If you look at the scripts themselves, you will see how mine is shorter and more efficient then Synthesis's. As well as simpler. That Good VS. Evil script inspired me to make this so that the user would have a much easier time using it.
jet10985
Update to v.2

You can now add notetags to equipment and skills. This will allow you to set an alignment require before players can use/equip these tagged items.
Xeyla
this is a neat script. i may use it in a later game i want to make. Thank you for sharing this smile.gif
jet10985
Fixed some slight script-breaking errors on v.2. Please obtain the newest version.
drew776
Hey, this is a really cool script!

I just wanted to ask if you could further explain how to tag skills and items. Where do we type <alignment ##> for example? Do we write this as the name of the item or skill in the database?
jet10985
You will see in the bottom-right corner in the database tabs of "items" and "skill", there is a notebox. Insert <alignment ##> there.

## is equal to the base alignment the player must have to use it.
EX: I tag potion with <alignment 50> Now only if the character has an alignment of 50 or above can the use the potion.
EX2: I tag Evil-potion with <alignment -50> Now only if the character has -50 or below alignment can they use evil-potion.
Xzygon
That would be really weird if an item/skill name was <alignment 85>. It's just unethical.
jet10985
You don't put it in the name. Bottom-right is a good place called "Notebox" put it there.

Also, Patch released: Show alignment on Map.

Script also updated. Obtain newest version
j_dawg
so if i use this i just give cred?
scorpiovaeden
Hi there, I'm trying to use your great script. sadly I keep getting a syntax error when trying to use it, a syntax error at line 257...
all it says on that line is:
[Show/Hide] Patches

So I am unsure of what to change... any help would be appreciated.
nevious
question for ya jet, would there be a simple way for ya to color an item depending on the alignment of the character? like say if he is good and has an evil sword in his invy it appears red in the equip menu and he cant equip it?
Kiniest
Will this work if I try to check the alignment to determine what will happen?

Like, would it work as a multiple ending's system?
Kread-EX
Yes it's easy to do. Use a conditional branch, and in the option, use Script. Then write this inside the box:
CODE
$game_system.alignement == xxx
(Replace xxx with the desired value).

You can also check if the alignement value is greater or less than by replacing == with > or <.
daevinn
Jet,
First, I would like to say that your script has unlocked some promising possibilities for my project.

I did some tinkering with your script so that there are actually two separate values - "Morality" and "Ethicality."
All I did was copy the alignment script and rename everything listed as "alignment" as "Ethicality", changed the
associated var, and renamed the aliases.* Both scripts have been tested and work well with each other.
My problem is when I try to use you map display path to display both values on the map. They
both appear to on the same coordinates, regardless of the x,y values I enter into their respective modules.
If you could give me some tips so that I could rewrite (or even slightly modify) the map patch, I would be
most grateful.

Cheers,
Daevinn

*I still give you cred for both scripts, however.
daevinn
Jet,

Never mind... I figured it out on my own. o_O

Cheers,
Daevinn

Click to view attachment
Pharonix
Quick Question
will this work if I do the following

Snippet
CODE
class Game_System
  
  include AlignmentOptions
    
  alias jet5830_initialize initialize
  def initialize
    jet5830_initialize
    @alignment = $game_variables[29]                      #0 commented out in case of failure
  end


Where Variable 29 is being used as my Light/Dark Status (I have 3 variables, a light var, a dark val and the Total) The total is determined after each Choice event. So if I DO NOT use the script to add Light/Dark, things will still work if I for example want Dark Heal (absorbs HP from an ally) to be -80 allignment?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2013 Invision Power Services, Inc.