KursedVictory XP
#1
KursedVictory XP

by Kyonides

Introduction

You will either love this scriptlet or just hate it. Laughing
Sometimes the heroes cannot simply obtain a flawless victory. That would be inconceivable! Incredible 
Thus, they need some final punishment to make sure they learn their lesson! Serious 

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

Screenshots

The Script

Code:
# * KursedVictory XP * #
#   Scripter : Kyonides
#   v1.1.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_index = 0
    @cursed_options = true
    while @cursed_options
      Graphics.update
      Input.update
      update_cursed_victory_options
    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]
      text = KursedVictory::OUTCOME[@curse_index]
      text = sprintf(text, name)
      @cursed_spriteset.dispose
      @cursed_options = nil
      return if @curse_index == 0
      Audio.bgs_stop
      @cursed_message.dispose
      @curse_lifted = true
    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 beer for non commercial games. Gamer
Include my nickname in your game credits.
That's it! Tongue sticking out
"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]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: 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! Laughing + Tongue sticking out

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
Reply
#2
The Script Has Been Improved!

Version 1.1.0 now offers you the possibility of complying or refusing to obey the Dark Elf evil lord's commands after obtaining a flawless victory. Shocked
Happy with a sweat I guess you already know what that means: a second battle Orson will ensure if you're stubborn enough to pick the second option! Confused

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 Dracula dark lord!
"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]
[Image: SP1-Writer.png]
[Image: SP1-Poet.png]
[Image: SP1-PixelArtist.png]
[Image: 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! Laughing + Tongue sticking out

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
Reply




Users browsing this thread: kyonides, 2 Guest(s)