KursedVictory XP - kyonides - 09-06-2025
KursedVictory XP
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!
The Script
Code: # * KursedVictory XP * #
# 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!
# Just add enemy ID's to the ENEMY_IDS constant to make this happen!
# 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_IDS = [1]
ROUND2_ENEMY_IDS = {}
ROUND2_ENEMY_IDS[1] = { :name => "Basilisk", :troop_id => 3 }
end
class Game_Enemy
def curse_victory?
KursedVictory::ENEMY_IDS.include?(@enemy_id)
end
end
class Game_Party
def dead_members
@actors.select {|actor| actor.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, 80)
self.contents = Bitmap.new(width - 32, height - 32)
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 = RPG::Cache.picture(@filename)
@width = bitmap.width
@height = bitmap.height
@rect = bitmap.rect
@col_width = 640
@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.bitmap = RPG::Cache.icon(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_st_ph5 :start_phase5
alias :kyon_kurvic_scn_btl_up_ph5 :update_phase5
def start_phase5
process_cursed_victory
if @cursed_victory and $game_party.all_dead_now?
process_defeat
return
end
kyon_kurvic_scn_btl_st_ph5
end
def update_phase5
if @curse_lifted and Input.trigger?(Input::C)
start_anti_curse_battle
return
end
kyon_kurvic_scn_btl_up_ph5
end
def start_anti_curse_battle
Audio.bgm_stop
Audio.bgs_stop
$game_party.clear_actions
$game_troop.enemies.clear
$game_temp.battle_troop_id = @round2_data[:troop_id]
$game_system.se_play($data_system.battle_start_se)
$game_system.bgm_play($game_system.battle_bgm)
$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
Audio.bgm_stop
@bgs = RPG::AudioFile.new(KursedVictory::BGS)
$game_system.bgs_play(@bgs)
wx = (Graphics.width - 280) / 2
@cursed_message = CursedMessageWindow.new(wx, 32)
@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)
$game_system.se_play($data_system.cursor_se)
@curse_index = (@curse_index + 1) % 2
@cursed_spriteset.move_cursor(@curse_index)
return
elsif Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
name = @round2_data[:name]
if name
@curse_text = KursedVictory::OUTCOME[@curse_index]
@curse_text = sprintf(@curse_text, name)
end
@cursed_spriteset.dispose
if @curse_index == 1
Audio.bgs_stop
@cursed_message.dispose
@curse_lifted = true
end
if name
ow = 480
bitmap = Bitmap.new(ow - 32, 32)
bitmap.draw_text(0, 0, bitmap.width, 32, @curse_text, 1)
@outcome_window = Window_Base.new(80, 160, ow, 64)
@outcome_window.contents = bitmap
@outcome_window.pause = true
@curse_stage = 1
else
@cursed_options = @curse_stage = nil
end
end
end
def update_cursed_victory_decision
@outcome_window.update
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
@outcome_window.dispose
@cursed_options = @curse_stage = nil
end
end
def process_cursed_victory_execution
@cursed_cursor = Arrow_Actor.new(nil)
@cursed_cursor.index = 0
@cursed_victory = true
while @cursed_victory
Graphics.update
Input.update
update_cursed_victory_execution
end
KursedVictory::WAIT_FRAMES.times { Graphics.update }
@cursed_message.dispose
@cursed_cursor.bitmap.dispose
@cursed_cursor.dispose
Audio.bgs_stop
@cursed_victory = true
end
def update_cursed_victory_execution
@cursed_cursor.update
if Input.trigger?(Input::C)
$game_system.se_play($data_system.decision_se)
actor = $game_party.actors[@cursed_cursor.index]
actor.add_state(1)
@status_window.refresh
@cursed_victory = nil
end
end
def process_defeat
$game_system.bgm_play($game_temp.map_bgm)
battle_end(2)
end
end
Terms & Conditions
Free as in beer for non commercial games. 
Include my nickname in your game credits.
That's it!
RE: KursedVictory XP - kyonides - 09-09-2025
The Script Has Been Improved!
Version 1.1.0 now offers you the possibility of complying or refusing to obey the evil lord's commands after obtaining a flawless victory. 
I guess you already know what that means: a second battle will ensure if you're stubborn enough to pick the second option! 
Just create a Hash entry like the following:
Code: ROUND2_ENEMY_IDS[1] = { :troop_id => 3 }
The first number is the original troop ID while the second one belongs to the next troop ID.
Please make sure the next troop ID has NEVER been included in the ENEMY_IDS array.
And yes, the battle will take place soon enough if the party ever dare to defy the dark lord!
RE: KursedVictory XP - kyonides - 09-10-2025
Script Updated Once Again!
Now in version 1.2.0 there is a chance to show a brief reaction before the next battle begins.
To show it no matter which choice you pick, you can modify that entry this way:
Code: ROUND2_ENEMY_IDS[1] = { :name => "Basilisk", :troop_id => 2 }
Also add this Array to the script or modify the existing one:
Code: OUTCOME = ["You complied with the %s's demand.",
"You refused to listen to %s."]
|