09-06-2025, 06:19 AM
(This post was last modified: 37 minutes ago by kyonides.
Edit Reason: VX ACE Script
)
KursedVictory VX + ACE
by Kyonides
Introduction
You will either love this scriptlet or just hate it.

Sometimes the heroes cannot simply obtain a flawless victory. That would be inconceivable!

Thus, they need some final punishment to make sure they learn their lesson!

Just add enemy ID's to the ENEMY_IDS constant to make this happen!

Or leave this note tag in the enemy's notebox: curse_victory
Screenshots
VX Script
Code:
# * KursedVictory VX * #
# Scripter : Kyonides
# v1.2.0 - 2025-09-09
# Sometimes the heroes cannot simply obtain a flawless victory. Thus, they need
# some final punishment to make sure they learn their lesson!
# - Method #1
# Just add enemy ID's to the ENEMY_IDS constant to make this happen!
# - Method #2
# Leave a note tag in the enemy's notebox: curse_victory
# Warning: If you refuse to comply, you might have to fight another troop...
module KursedVictory
BGS = "Darkness"
CURSOR = "sword0132"
CURSOR_OY = 4
OPTION_BACKDROP = "box240"
MESSAGE = ["Flawless Victory!", "Now choose a curse victim!"]
OPTIONS = ["Comply", "Refuse"]
OUTCOME = ["You complied with the %s's demand.",
"You refused to listen to %s."]
CURSE_CHANCE = 100
WAIT_FRAMES = 40
ENEMY_NOTE_TAG = /curse_victory/i
ENEMY_IDS = []
ROUND2_ENEMY_IDS = {}
ROUND2_ENEMY_IDS[1] = { :name => "Basilisk", :troop_id => 2 }
end
class Game_Enemy
def cursed_victory_note
@cursed_victory ||= enemy.note[KursedVictory::ENEMY_NOTE_TAG]
end
def curse_victory?
return true if KursedVictory::ENEMY_IDS.include?(@enemy_id)
cursed_victory_note != nil
end
end
class Game_Party
def dead_members
members.select {|member| member.dead? }
end
def all_dead_now?
dead_members.size == @actors.size
end
end
class Game_Troop
def curse_flawless_victory?
enemy = @enemies.find {|enemy| enemy.curse_victory? }
enemy != nil
end
attr_reader :troop_id
end
class CursedMessageWindow < Window_Base
def initialize(wx, wy)
super(wx, wy, 280, 80)
refresh
end
def refresh
line1, line2 = KursedVictory::MESSAGE
font = self.contents.font
font.bold = true
font.color.set(220, 80, 0)
self.contents.draw_text(0, 0, width - 32, 24, line1, 1)
font.bold = false
font.color.set(255, 255, 255)
self.contents.draw_text(0, 24, width - 32, 24, line2, 1)
end
end
module KursedVictory
class TextBox
def initialize(pos, total, vp=nil)
@index = pos
@max = total
@row_max = 2
@col_max = 1
@viewport = vp
@backdrop = Sprite.new(vp)
@label = Sprite.new(vp)
@label.z = 50
end
def set_image(filename)
@filename = filename
set_bitmap
set_text_bitmap
reset_alignment
end
def set_bitmap
bitmap = Cache.picture(@filename)
@width = bitmap.width
@height = bitmap.height
@rect = bitmap.rect
@col_width = Graphics.width
@center_x = (@col_width - @width) / 2
@backdrop.bitmap = bitmap
end
def set_text_bitmap
@align_x = 1
@label.bitmap = Bitmap.new(@width, @height)
end
def set_align_xy
h = @height + 24
@backdrop.x = @center_x
@backdrop.y = 140 + @index * h
end
def reset_alignment
set_align_xy
@label.x = @backdrop.x
@label.y = @backdrop.y
end
def x
@backdrop.x
end
def y
@backdrop.y
end
def set_text(text)
@text = text
bit = @label.bitmap
bit.clear
bit.draw_text(@rect, text, @align_x)
end
def dispose
@label.bitmap.dispose
@label.dispose
@backdrop.bitmap.dispose
@backdrop.dispose
end
attr_reader :text
end
class Spriteset
def initialize
@curse_viewport = Viewport.new(0, 0, 640, 480)
@curse_viewport.z = 500
@curse_boxes = []
@curse_x = []
@curse_y = []
filename = KursedVictory::OPTION_BACKDROP
options = KursedVictory::OPTIONS
options.each_with_index do |choice, n|
box = KursedVictory::TextBox.new(n, options.size, @curse_viewport)
box.set_image(filename)
box.set_text(choice)
@curse_x << box.x
@curse_y << box.y + KursedVictory::CURSOR_OY
@curse_boxes << box
end
@cursed_cursor = Sprite.new(@curse_viewport)
@cursed_cursor.x = @curse_x[0]
@cursed_cursor.y = @curse_y[0]
@cursed_cursor.z = 100
@cursed_cursor.bitmap = Cache.picture(KursedVictory::CURSOR)
end
def move_cursor(index)
@cursed_cursor.y = @curse_y[index]
end
def dispose
@curse_boxes.each {|box| box.dispose }
@cursed_cursor.bitmap.dispose
@cursed_cursor.dispose
@curse_viewport.dispose
end
end
end
class Scene_Battle
alias :kyon_kurvic_scn_btl_proc_victor :process_victory
def process_victory
process_cursed_victory
if @cursed_victory and $game_party.all_dead_now?
process_defeat
return
end
kyon_kurvic_scn_btl_proc_victor
start_anti_curse_battle if @curse_lifted
end
def start_anti_curse_battle
RPG::BGM.stop
RPG::BGS.stop
$game_party.clear_actions
$game_troop.clear
$game_troop.setup(@round2_data[:troop_id])
Sound.play_battle_start
$game_system.battle_bgm.play
$scene = Scene_Battle.new
end
def process_cursed_victory
return if KursedVictory::CURSE_CHANCE < rand(100)
return unless $game_troop.curse_flawless_victory?
return if $game_party.dead_members.size > 0
RPG::BGM.stop
@bgs = RPG::BGS.new(KursedVictory::BGS)
@bgs.play
wx = (Graphics.width - 280) / 2
@cursed_message = CursedMessageWindow.new(wx, 40)
troop_id = $game_troop.troop_id
@round2_data = KursedVictory::ROUND2_ENEMY_IDS[troop_id]
if @round2_data
process_cursed_victory_options
return if @curse_lifted
end
process_cursed_victory_execution
end
def process_cursed_victory_options
@cursed_spriteset = KursedVictory::Spriteset.new
@curse_stage = 0
@curse_index = 0
@cursed_options = true
while @cursed_options
Graphics.update
Input.update
update_cursed_victory
end
end
def update_cursed_victory
case @curse_stage
when 0
update_cursed_victory_options
when 1
update_cursed_victory_decision
end
end
def update_cursed_victory_options
if Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
Sound.play_cursor
@curse_index = (@curse_index + 1) % 2
@cursed_spriteset.move_cursor(@curse_index)
return
elsif Input.trigger?(Input::C)
Sound.play_decision
name = @round2_data[:name]
if name
text = KursedVictory::OUTCOME[@curse_index]
text = sprintf(text, name)
end
@cursed_spriteset.dispose
if @curse_index == 1
RPG::BGS.stop
@cursed_message.dispose
@curse_lifted = true
end
if name
ow = 460
$game_message.texts << text
@curse_stage = 1
else
@cursed_options = @curse_stage = nil
end
end
end
def update_cursed_victory_decision
@message_window.update
if Input.trigger?(Input::C)
Sound.play_decision
@cursed_options = @curse_stage = nil
end
end
def process_cursed_victory_execution
@info_viewport.visible = true
@party_command_window.contents.clear
@party_command_window.index = -1
@message_window.visible = false
@status_window.index = 0
@status_window.active = true
@cursed_victory = true
while @cursed_victory
Graphics.update
Input.update
update_cursed_victory_execution
end
KursedVictory::WAIT_FRAMES.times { Graphics.update }
@cursed_message.dispose
@info_viewport.visible = false
@cursed_victory = true
end
def update_cursed_victory_execution
@status_window.update
if Input.trigger?(Input::C)
Sound.play_decision
n = @status_window.index
$game_party.members[n].add_state(1)
@status_window.refresh
@status_window.active = false
@cursed_victory = nil
end
end
end
VX ACE Script
Code:
# * KursedVictory ACE * #
# Scripter : Kyonides
# v1.0.0 - 2025-09-07
# Sometimes the heroes cannot simply obtain a flawless victory. Thus, they need
# some final punishment to make sure they learn their lesson!
# - Method #1
# Just add enemy ID's to the ENEMY_IDS constant to make this happen!
# - Method #2
# Leave a note tag in the enemy's notebox: curse_victory
module KursedVictory
BGS = "Darkness"
MESSAGE = ["Flawless Victory!", "Now choose a curse victim!"]
CURSE_CHANCE = 100
WAIT_FRAMES = 40
ENEMY_NOTE_TAG = /curse_victory/i
ENEMY_IDS = []
end
class Game_Enemy
def cursed_victory_note
@cursed_victory ||= enemy.note[KursedVictory::ENEMY_NOTE_TAG]
end
def curse_victory?
return true if KursedVictory::ENEMY_IDS.include?(@enemy_id)
cursed_victory_note != nil
end
end
class Game_Party
def dead_members
members.select {|member| member.dead? }
end
def all_dead_now?
dead_members.size == @actors.size
end
end
class Game_Troop
def curse_flawless_victory?
enemy = @enemies.find {|enemy| enemy.curse_victory? }
enemy != nil
end
end
class CursedMessageWindow < Window_Base
def initialize(wx, wy)
super(wx, wy, 280, 76)
refresh
end
def refresh
line1, line2 = KursedVictory::MESSAGE
font = self.contents.font
font.bold = true
font.color.set(220, 80, 0)
self.contents.draw_text(0, 0, width - 32, 24, line1, 1)
font.bold = false
font.color.set(255, 255, 255)
self.contents.draw_text(0, 26, width - 32, 24, line2, 1)
end
end
class << BattleManager
alias :kyon_kurvic_btlman_proc_victor :process_victory
def process_victory
process_cursed_victory
if @cursed_victory and $game_party.all_dead_now?
process_defeat
else
kyon_kurvic_btlman_proc_victor
end
true
end
def process_cursed_victory
return if KursedVictory::CURSE_CHANCE < rand(100)
return unless $game_troop.curse_flawless_victory?
return if $game_party.dead_members.size > 0
RPG::BGM.stop
@bgs = RPG::BGS.new(KursedVictory::BGS)
@bgs.play
@scene = SceneManager.scene
@scene.create_cursed_message
@cursed_victory = true
while @cursed_victory
Graphics.update
Input.update
@scene.update_cursed_victory
end
KursedVictory::WAIT_FRAMES.times { Graphics.update }
@scene.hide_cursed_message
@cursed_victory = true
end
attr_writer :cursed_victory
end
class Scene_Battle
def create_cursed_message
wx = (Graphics.width - 280) / 2
@cursed_message = CursedMessageWindow.new(wx, 40)
@info_viewport.visible = true
@party_command_window.contents.clear
@party_command_window.index = -1
@message_window.visible = false
@status_window.index = 0
@status_window.active = true
end
def update_cursed_victory
@status_window.update
if Input.trigger?(:C)
Sound.play_ok
n = @status_window.index
$game_party.members[n].add_state(1)
@status_window.refresh
@status_window.active = false
BattleManager.cursed_victory = nil
end
end
def hide_cursed_message
@cursed_message.visible = false
@message_window.visible = true
end
end
Terms & Conditions
Free as in


Include my nickname 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-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