public

Rpg Maker Developers Group

Simple enough for a child, powerful enough for a developer

2 Followers
Preserved forum archive. This topic stores the original first post and locally mirrored RPG Maker Web attachments when available. It is posted by the BMMPlay archive account, not by the original creator.

Original Source

  • Original title: KursedVictory VX
  • Original author: kyonides
  • Original date: September 10, 2025
  • Source thread: https://forums.rpgmakerweb.com/threads/kursedvictory-vx.180024/
  • Source forum path: Game Development Engines > Ruby Game System (RGSS) Scripts > RGSS2 Scripts (RMVX)

Summary

# 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...

Archived First Post

KursedVictory VX

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

Warning:
If you refuse to comply, you might have to fight another troop...

kursedvictory-vx01.jpg

kursedvictory-vx02.jpg

kursedvictory-vx003.jpg

kursedvictory-vx004.jpg

The Script

Ruby:
# * 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

DOWNLOAD DEMO NOW!

Terms & Conditions

Free as in beer for non commercial games.
Include my nickname in your game credits.
That's it!

Downloads / Referenced Files

Log in to download

Log in, then follow the RPG Maker Developers Group to see these download links.

Log in to download

License / Terms Note

Free as in beer for non commercial games. Include my nickname in your game credits. That's it!

Referenced Images / Attachments

kursedvictory-vx01.jpg
kursedvictory-vx01.jpg
kursedvictory-vx02.jpg
kursedvictory-vx02.jpg
kursedvictory-vx003.jpg
kursedvictory-vx003.jpg
kursedvictory-vx004.jpg
kursedvictory-vx004.jpg
Creator Claims / Removal

If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.

#039#rgss2#script-archive

Replies (0)

No replies yet.

0 replies 1 view

Log in to reply.

User Avatar