11-06-2025, 08:05 AM
(This post was last modified: 11-12-2025, 10:44 AM by kyonides.
Edit Reason: Update #1
)
Ekuipment Points VX
by Kyonides
Introduction
Limit the type of weapons or armor pieces your heroes will be able to equip!
If your heroes want to replace their equipment, they better earn enough EP first!
Another way to explain it would be to call it an equipment weight script.
The script lets you set the default and custom EP the actor will start with. The same is valid for weapons and pieces of armor.
Actors can also gain more EP by leveling up.
Inside the EkuipPoints module you can find the WEAPON_POINTS, ARMOR_POINTS, ACTOR_POINTS & the ACTOR_LEVEL_POINTS constants that will let you customize the EP earned by actors and the EP costs of their equipment.
You can also change the X & Y coordinates of windows or EP labels at will.
NOTES
Actors have no note boxes. This is why you need to depend on the ACTOR_POINTS & ACTOR_LEVEL_POINTS constants to set their EP accordingly.
To open the equipment window in battle, during the actor's command phase, press the RM's X button. Normally, it's linked to your A key on the keyboard.
Screenshots
The Script
Code:
# * Ekuipment Points VX - No Shield Edition * #
# Scripter : Kyonides
# v1.2.6 - 2025-11-12
# Limit the type of weapons or armor pieces your heroes will be able to equip!
# If heroes want to replace their equipment, they better earn enough EP first!
# Note Tag: <ep n> where n is a positive number.
# * Optional Script Calls * #
# Block a given actor's change equipment feature, especially useful in battle:
# boolean stands for true OR false only.
# $game_actors[ActorID].block_equip_change = boolean
# $game_party.members[Index].block_equip_change = boolean
# Block the party's change equipment feature at once:
# $game_party.block_equip_change = boolean
# Increase a given actor's equipment points:
# $game_actors[ActorID].ep_plus += Number
# $game_party.members[Index].ep_plus += Number
module EkuipPoints
LABEL = "EP"
LABEL_LENGTH = { :status => 1, :ep_stats => 1 }
LABEL_LENGTH.default = 2
EP_LABEL_COLOR = [40, 242, 254] # [R,G,B]
GAUGE_COLOR1 = [255, 180, 60] # [R,G,B]
GAUGE_COLOR2 = [180, 255, 60] # [R,G,B]
EP_COST_X = 170
EP_STATUS_XY_WH = [192, 122, 128, 6]
ACTOR_EP_WIN_XY_WH = [0, 280, 144, 56]
BATTLE_EQUIP_WIN_XY = [80, 288]
ACTOR_STATS_WIN_OPA = 255
BATTLE_EQUIP_WIN_OPA = 255
ACTOR_STATS_WIN_BACK_OPA = 255
BATTLE_EQUIP_WIN_BACK_OPA = 255
EQUIP_BASE_POINTS = 1
# Alternate Armor Types Settings - Leave Empty If Not Needed
# 1 - Shield
# 2 - Helmet
# 3 - Body Armor
# 4 - Accessory
ARMOR_TYPES = [3, 4, 4, 4]
ACTOR_POINTS = {}
ACTOR_POINTS.default = 4
# [ActorID] = BasePoints
ACTOR_POINTS[1] = 6
ACTOR_POINTS[2] = 7
ACTOR_LEVEL_POINTS = {}
ACTOR_LEVEL_POINTS.default = { :levels => 10, :ep => 1 }
# [ActorID] = { :levels => LevelsNeeded, :ep => ExtraPoints }
ACTOR_LEVEL_POINTS[1] = { :levels => 8, :ep => 2 }
end
module RPG
class BaseItem
BASE_EP = EkuipPoints::EQUIP_BASE_POINTS
def note_ep
@note[/<ep (\d+)/i]
$1 ? $1.to_i : BASE_EP
end
def ep_cost
@ep_cost ||= note_ep
end
end
class Equipment
def ep_cost
0
end
end
end
module EkuipPoints
module ItemList
def draw_item_name(item, rx, ry, enabled=true)
return unless item
super
rect = item_rect(index)
rect.x = rx
rect.y = ry
rect.width -= rx
f = contents.font
f.color = ep_color
f.color.alpha = 160 unless enabled
number = sprintf("%2d", item.ep_cost)
contents.draw_text(rect, number, 2)
end
end
end
class Game_Actor
alias :kyon_ekuip_points_gm_act_stp :setup
alias :kyon_ekuip_points_gm_act_lvl_up :level_up
alias :kyon_ekuip_points_gm_act_lvl_dn :level_down
def setup(actor_id)
kyon_ekuip_points_gm_act_stp(actor_id)
@armor1_id = actor.armor3_id
@armor3_id = 0
@maxep_base = EkuipPoints::ACTOR_POINTS[actor_id]
hash = EkuipPoints::ACTOR_LEVEL_POINTS[actor_id]
@base_ep_levels = hash[:levels]
@base_level_ep = hash[:ep]
@ep_plus = 0
calc_level_ep
end
def calc_level_ep
@level_ep = @level / @base_ep_levels * @base_level_ep
end
def level_up
kyon_ekuip_points_gm_act_lvl_up
calc_level_ep
end
def level_down
kyon_ekuip_points_gm_act_lvl_dn
calc_level_ep
end
def maxep
@maxep_base + @level_ep + @ep_plus
end
def ep_used
list = equips.compact
list.inject(0) {|total, item| total + item.ep_cost }
end
def ep_left
self.maxep - self.ep_used
end
def enough_ep?(equip_type, item)
return true unless item
equipment = equips[equip_type] || RPG::Equipment.new
used = self.ep_used - equipment.ep_cost
return true if used == 0
used += item.ep_cost
self.maxep >= used
end
attr_accessor :ep_plus, :block_equip_change
end
class Game_Party
def block_equip_change=(state)
members.each {|actor| actor.block_equip_change = state }
end
end
class Window_Base
def ep_color
@ep_color ||= Color.new(*EkuipPoints::EP_LABEL_COLOR)
end
def ep_gauge_color1
@ep_gauge_color1 ||= Color.new(*EkuipPoints::GAUGE_COLOR1)
end
def ep_gauge_color2
@ep_gauge_color2 ||= Color.new(*EkuipPoints::GAUGE_COLOR2)
end
def draw_ep_left(actor, lx, ly, lw, lh=4, large=nil)
left = actor.ep_left
gw = lw * left / actor.maxep
gc1 = ep_gauge_color1
gc2 = ep_gauge_color2
c = self.contents
c.fill_rect(lx, ly + WLH - lh - 2, lw, lh, gauge_back_color)
c.gradient_fill_rect(lx, ly + WLH - lh - 2, gw, lh, gc1, gc2)
c.font.color = system_color
label = EkuipPoints::LABEL
length = EkuipPoints::LABEL_LENGTH[class_type]
label = label[0, length]
c.draw_text(lx, ly, lw, WLH, label)
c.font.color = normal_color
if large
c.draw_text(lx, ly, lw / 2 + 4, WLH, left.to_s, 2)
c.draw_text(lx, ly, lw / 2 + 16, WLH, "/", 2)
c.draw_text(lx, ly, lw, WLH, actor.maxep.to_s, 2)
else
c.draw_text(lx, ly, lw, WLH, left.to_s, 2)
end
end
end
class Window_MenuStatus
def refresh
self.contents.clear
@item_max = $game_party.members.size
$game_party.members.each {|actor| draw_actor_data(actor) }
end
def draw_actor_data(actor)
draw_actor_face(actor, 2, actor.index * 96 + 2, 92)
dx = 104
dy = actor.index * 96 + WLH / 2
draw_actor_name(actor, dx, dy)
draw_actor_class(actor, dx + 120, dy)
draw_actor_level(actor, dx, dy + WLH * 1)
draw_ep_left(actor, dx + 60, dy + WLH * 1, 50)
draw_actor_state(actor, dx, dy + WLH * 2)
draw_actor_hp(actor, dx + 120, dy + WLH * 1)
draw_actor_mp(actor, dx + 120, dy + WLH * 2)
end
def class_type
:menu_status
end
end
class Window_Equip
include EkuipPoints::ItemList
def update
last_index = @index
super
if @index != last_index
@item_window.equip_type = @index
end
end
def refresh
self.contents.clear
@data = []
for item in @actor.equips do @data.push(item) end
@item_max = @data.size
self.contents.font.color = system_color
if @actor.two_swords_style
self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab.weapon1)
self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab.weapon2)
else
self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab.weapon)
self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab.armor3)
end
self.contents.draw_text(4, WLH * 2, 92, WLH, Vocab.armor4)
self.contents.draw_text(4, WLH * 3, 92, WLH, Vocab.armor4)
self.contents.draw_text(4, WLH * 4, 92, WLH, Vocab.armor4)
draw_item_name(@data[0], 92, WLH * 0)
draw_item_name(@data[1], 92, WLH * 1)
draw_item_name(@data[2], 92, WLH * 2)
draw_item_name(@data[3], 92, WLH * 3)
draw_item_name(@data[4], 92, WLH * 4)
end
attr_writer :item_window
end
class Window_EquipMod < Window_Selectable
include EkuipPoints::ItemList
def initialize(wx, wy, actor)
super(wx, wy, 336, WLH * 4 + 32)
self.z = 1000
self.opacity = EkuipPoints::BATTLE_EQUIP_WIN_OPA
self.back_opacity = EkuipPoints::BATTLE_EQUIP_WIN_BACK_OPA
@actor = actor
refresh
self.index = 0
end
def row_max
5
end
def item
@data[@index]
end
def refresh
self.contents.clear
@data = []
@actor.equips.each {|item| @data << item }
@item_max = @data.size
self.contents.font.color = system_color
if @actor.two_swords_style
self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab.weapon1)
self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab.weapon2)
else
self.contents.draw_text(4, WLH * 0, 92, WLH, Vocab.weapon)
self.contents.draw_text(4, WLH * 1, 92, WLH, Vocab.armor3)
end
self.contents.draw_text(4, WLH * 2, 92, WLH, Vocab.armor4)
self.contents.draw_text(4, WLH * 3, 92, WLH, Vocab.armor4)
self.contents.draw_text(4, WLH * 4, 92, WLH, Vocab.armor4)
draw_item_name(@data[0], 92, WLH * 0)
draw_item_name(@data[1], 92, WLH * 1)
draw_item_name(@data[2], 92, WLH * 2)
draw_item_name(@data[3], 92, WLH * 3)
draw_item_name(@data[4], 92, WLH * 4)
end
def update_help
@help_window.set_text(item ? item.description : "")
end
end
class Window_EquipItem
EQUIP_TYPES = [0] + EkuipPoints::ARMOR_TYPES
alias :kyon_ekuip_points_win_eqpitm_init :initialize
alias :kyon_ekuip_points_win_eqpitm_refr :refresh
def initialize(wx, wy, width, height, actor, equip_type)
@row_index = equip_type
kyon_ekuip_points_win_eqpitm_init(wx, wy, width, height, actor, equip_type)
self.index = -1
end
def refresh
@has_armor_types ||= EQUIP_TYPES.size > 1
kyon_ekuip_points_win_eqpitm_refr
end
def reset_index
self.index = 0 if @index < 0
end
def enable?(item)
@actor.enough_ep?(@row_index, item)
end
def equip_type=(type)
@row_index = type
type = 0 if @actor.two_swords_style && type == 1
type = EQUIP_TYPES[type] if type > 0 and EQUIP_TYPES.size > 1
@equip_type = type
refresh
end
def draw_item(index)
rect = item_rect(index)
c = self.contents
c.clear_rect(rect)
item = @data[index]
return unless item
number = $game_party.item_number(item)
enabled = enable?(item)
rect.width -= 4
draw_item_name(item, rect.x, rect.y, enabled)
c.draw_text(rect, sprintf(":%2d", number), 2)
f = c.font
f.color = ep_color
f.color.alpha = 160 unless enabled
rect.x += EkuipPoints::EP_COST_X
rect.width = 40
number = item.ep_cost
c.draw_text(rect, sprintf("%2d", number), 2)
end
end
class Window_EquipStatus
alias :kyon_ekuip_points_win_eqpstts_ref :refresh
def refresh
kyon_ekuip_points_win_eqpstts_ref
draw_ep_left(@actor, 122, 0, 50)
end
def class_type
:equip_status
end
end
class Window_Status
alias :kyon_ekuip_points_win_stts_drw_bsc_info :draw_basic_info
def draw_basic_info(dx, dy)
kyon_ekuip_points_win_stts_drw_bsc_info(dx, dy)
ex, ey, ew, eh = EkuipPoints::EP_STATUS_XY_WH
draw_ep_left(@actor, dx + ex, dy + ey, ew, eh, true)
end
def class_type
:status
end
end
module EkuipPoints
class ActorStatsWindow < Window_Base
def initialize(actor)
super(*ACTOR_EP_WIN_XY_WH)
self.opacity = ACTOR_STATS_WIN_OPA
self.back_opacity = ACTOR_STATS_WIN_BACK_OPA
self.z = 2000
@actor = actor
@hw = self.contents.width / 2
refresh
end
def refresh
self.contents.clear
draw_actor_name(@actor, 0, 0)
draw_ep_left(@actor, @hw, 0, @hw, 4)
end
def class_type
:ep_stats
end
end
end
class Scene_Equip
alias :kyon_ekuip_points_scn_eqp_stt :start
alias :kyon_ekuip_points_scn_eqp_up_eqp_sel :update_equip_selection
def start
kyon_ekuip_points_scn_eqp_stt
@equip_window.item_window = @item_window
end
def create_item_windows
types = Window_EquipItem::EQUIP_TYPES
@item_window = Window_EquipItem.new(0, 208, 544, 208, @actor, 0)
@item_window.help_window = @help_window
@item_window.active = false
@item_window.index = -1
@item_windows = [@item_window]
end
def update
super
update_menu_background
@help_window.update
update_status_window
if @equip_window.active
update_equip_selection
elsif @item_window.active
update_item_selection
end
end
def update_equip_selection
@equip_window.update
kyon_ekuip_points_scn_eqp_up_eqp_sel
end
def update_item_selection
@item_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
@equip_window.active = true
@item_window.active = false
@item_window.index = -1
return
elsif Input.trigger?(Input::C)
item = @item_window.item
pos = @equip_window.index
if item and !@actor.enough_ep?(pos, item)
Sound.play_buzzer
return
end
Sound.play_equip
@actor.change_equip(pos, item)
@equip_window.active = true
@item_window.active = false
@item_window.index = -1
@item_window.refresh
@equip_window.refresh
end
end
end
class Scene_Battle
alias :kyon_ekuip_points_scn_btl_up :update
alias :kyon_ekuip_points_scn_btl_up_act_cmdsel :update_actor_command_selection
def create_equipment_windows
actor = @active_battler
if actor.block_equip_change
Sound.play_buzzer
return
end
Sound.play_decision
wx, wy = EkuipPoints::BATTLE_EQUIP_WIN_XY
ww = Graphics.width
wh = Graphics.height - @actor_command_window.height
@ep_window = EkuipPoints::ActorStatsWindow.new(actor)
@equip_window = Window_EquipMod.new(wx, wy, actor)
@equip_item_window = Window_EquipItem.new(0, 0, ww, wh, actor, 0)
@equip_windows = [@ep_window, @equip_window, @equip_item_window]
@actor_command_window.active = false
@equip_index = 0
@equip_item = true
end
def dispose_equipment_windows
Sound.play_cancel
@equip_windows.each {|window| window.dispose }
@actor_command_window.active = true
@equip_item = false
end
def update
if @equip_item
update_equipment
else
kyon_ekuip_points_scn_btl_up
end
end
def update_equipment
update_basic(true)
update_info_viewport
case @equip_index
when 0
update_equip_type
when 1
update_equip_list
end
end
def refresh_equip_type
type = @equip_window.index
@equip_item_window.equip_type = type
@equip_item_window.index = -1
end
def update_equip_type
@equip_window.update
if Input.trigger?(Input::B)
dispose_equipment_windows
return
elsif Input.trigger?(Input::C)
Sound.play_decision
@equip_item_window.active = true
@equip_window.active = false
@equip_item_window.reset_index
return @equip_index = 1
elsif Input.trigger?(Input::DOWN)
refresh_equip_type
return
elsif Input.trigger?(Input::UP)
refresh_equip_type
end
end
def back_to_main_equip
@equip_item_window.index = -1
@equip_item_window.active = false
@equip_window.active = true
@equip_index = 0
end
def update_equip_list
@equip_item_window.update
if Input.trigger?(Input::B)
Sound.play_cancel
back_to_main_equip
return
elsif Input.trigger?(Input::C)
pos = @equip_window.index
item = @equip_item_window.item
if item and !@active_battler.enough_ep?(pos, item)
Sound.play_buzzer
return
end
Sound.play_equip
@active_battler.change_equip(pos, item)
@equip_item_window.refresh
@equip_window.refresh
@ep_window.refresh
back_to_main_equip
end
end
def update_actor_command_selection
if Input.trigger?(Input::X)
create_equipment_windows
return
end
kyon_ekuip_points_scn_btl_up_act_cmdsel
end
endTerms & Conditions
Free as in
beer for non-commercial use.Include me in your game credits!

That's it!
"For God has not destined us for wrath, but for obtaining salvation through our Lord Jesus Christ," 1 Thessalonians 5:9
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
![[Image: SP1-Scripter.png]](https://www.save-point.org/images/userbars/SP1-Scripter.png)
![[Image: SP1-Writer.png]](https://www.save-point.org/images/userbars/SP1-Writer.png)
![[Image: SP1-Poet.png]](https://www.save-point.org/images/userbars/SP1-Poet.png)
![[Image: SP1-PixelArtist.png]](https://www.save-point.org/images/userbars/SP1-PixelArtist.png)
![[Image: SP1-Reporter.png]](https://i.postimg.cc/GmxWbHyL/SP1-Reporter.png)
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!
Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE
Maranatha!
The Internet might be either your friend or enemy. It just depends on whether or not she has a bad hair day.
![[Image: SP1-Scripter.png]](https://www.save-point.org/images/userbars/SP1-Scripter.png)
![[Image: SP1-Writer.png]](https://www.save-point.org/images/userbars/SP1-Writer.png)
![[Image: SP1-Poet.png]](https://www.save-point.org/images/userbars/SP1-Poet.png)
![[Image: SP1-Reporter.png]](https://i.postimg.cc/GmxWbHyL/SP1-Reporter.png)
My Original Stories (available in English and Spanish)
List of Compiled Binary Executables I have published...
HiddenChest & Roole
Give me a free copy of your completed game if you include at least 3 of my scripts!

Just some scripts I've already published on the board...
KyoGemBoost XP VX & ACE, RandomEnkounters XP, KSkillShop XP, Kolloseum States XP, KEvents XP, KScenario XP & Gosu, KyoPrizeShop XP Mangostan, Kuests XP, KyoDiscounts XP VX, ACE & MV, KChest XP VX & ACE 2016, KTelePort XP, KSkillMax XP & VX & ACE, Gem Roulette XP VX & VX Ace, KRespawnPoint XP, VX & VX Ace, GiveAway XP VX & ACE, Klearance XP VX & ACE, KUnits XP VX, ACE & Gosu 2017, KLevel XP, KRumors XP & ACE, KMonsterPals XP VX & ACE, KStatsRefill XP VX & ACE, KLotto XP VX & ACE, KItemDesc XP & VX, KPocket XP & VX, OpenChest XP VX & ACE


![[Image: ekuipment-points-vx001.jpg]](https://i.postimg.cc/tR16yB5f/ekuipment-points-vx001.jpg)
![[Image: ekuipment-points-vx002.jpg]](https://i.postimg.cc/dQ7Cv5Bf/ekuipment-points-vx002.jpg)
![[Image: ekuipment-points-vx003.jpg]](https://i.postimg.cc/L4qPRxTw/ekuipment-points-vx003.jpg)
![[Image: ekuipment-points-vx004.jpg]](https://i.postimg.cc/QNbT8KmY/ekuipment-points-vx004.jpg)