じ☆ve冰风 发表于 2026-7-27 08:45:13

KLazyWayOut XP

KLazyWayOut XP

by Kyonides​

Introduction


Are your players tired of fighting some random mobs?

Fear not! There is a LAZY way out of such a messy situation!


A brand new message will show up on the map warning you about the upcoming battle. If the player wants to skip it, he or she can pay their way out of it!

Currently Available Payment Methods:

[*]Gold - Default
[*]Experience Points
Spoiler: The Old Script                Ruby:       
# * KLazyWayOut XP
#Scripter : Kyonides Arkanthes
#2022-06-14
# * A Non Plug & Play Script * #

# Are your players tired of fighting some random mobs?
# Fear not! There is a LAZY way out of such a messy situation!
# A brand new message will show up on the map warning you about the upcoming
# battle. If the player wants to skip it, he or she can pay their way out of it!

# :ox and :oy stands for the X & Y Offsets respectively.

module KLazy
SWITCH_ID = 1
ALERT_SOUND = { :name => "", :volume => 70, :pitch => 100 }
TRANSITION = { :name => "018-Brick02", :frames => 10 }
FONT = { :name => "Arial", :size => 22,:bold => false }
PICTURE = { :name => "app_logo", :ox => 4, :oy => 4 }
MESSAGE_SIZE = { :x => 100, :y => 4, :width => 480 }
MESSAGE = [] # Leave it alone!
MESSAGE << "You are out of luck!"
MESSAGE << "Some random monsters have appeared!"
MESSAGE << "Want to pay them %s%s?"
MESSAGE << ""
# Battle Skip Cost: { MAPID => cost, etc. }
SKIP_COST = { 1 => 10 }
SKIP_COST.default = 20
end

class Spriteset_Map
def make_battle_alert
    dimensions = KLazy::MESSAGE_SIZE
    mx = dimensions[:x]
    my = dimensions[:y]
    cost = KLazy::SKIP_COST[$game_map.map_id]
    pic = KLazy::PICTURE
    message = KLazy::MESSAGE
    font = KLazy::FONT
    ay = $game_player.y - $game_map.display_y
    @alert_sprite = Sprite.new(@viewport2)
    @alert_sprite.y = ay < 8 ? 344 : 12
    @alert_sprite.z += 1000
    @alert_sprite.bitmap = b = Bitmap.new(dimensions[:width], 132)
    bit = RPG::Cache.picture(pic[:name])
    b.blt(pic[:ox], pic[:oy], bit, bit.rect)
    bit.dispose
    mw = b.width - mx - 8
    b.font.name = font[:name]
    b.font.size = font[:size]
    b.font.bold = font[:bold]
    message.size.times do |n|
      text = sprintf(message, cost, $data_system.words.gold)
      b.draw_text(mx, my, mw, 28, text)
      my += 28
    end
    tr = KLazy::TRANSITION
    Graphics.transition(tr[:frames], "Graphics/Transitions/" + tr[:name])
end

def dispose_battle_alert
    @alert_sprite.bitmap.dispose
    @alert_sprite.dispose
end
end

class Scene_Map
alias :kyon_lf_scn_bttl_up :update
alias :kyon_lf_scn_bttl_call_bttl :call_battle
def dispose_alert
    @spriteset.dispose_battle_alert
    @battle_alert = nil
end

def update_alert
    $game_system.update
    $game_screen.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      kyon_lf_scn_bttl_call_bttl
      dispose_alert
    elsif Input.trigger?(Input::C)
      cost = KLazy::SKIP_COST[$game_map.map_id]
      if $game_party.gold < cost
      $game_system.se_play($data_system.buzzer_se)
      kyon_lf_scn_bttl_call_bttl
      dispose_alert
      return
      end
      $game_system.se_play($data_system.shop_se)
      $game_party.lose_gold(cost)
      $game_temp.battle_troop_id = nil
      dispose_alert
    end
end

def update
    if @battle_alert
      update_alert
      return
    end
    kyon_lf_scn_bttl_up
end

def battle_alert
    $game_temp.battle_calling = false
    $game_temp.menu_calling = false
    $game_temp.menu_beep = false
    $game_player.make_encounter_count
    $game_player.straighten
    sound = KLazy::ALERT_SOUND
    alert_se = RPG::AudioFile.new(sound[:name], sound[:volume], sound[:pitch])
    $game_system.se_play(alert_se)
    $game_player.straighten
    Graphics.freeze
    @spriteset.make_battle_alert
    @battle_alert = true
end

def call_battle
    $game_switches ? battle_alert : kyon_lf_scn_bttl_call_bttl
end
end


Spoiler: The New Script                Ruby:       
# * KLazyWayOut XP
#   Scripter : Kyonides
#   v1.1.0 - 2025-07-17
# * A Non Plug & Play Script * #

# Are your players tired of fighting some random mobs?
# Fear not! There is a LAZY way out of such a messy situation!
# A brand new message will show up on the map warning you about the upcoming
# battle. If the player wants to skip it, he or she can pay their way out of it!

# Available Payment Methods: Gold & Experience.

# :ox and :oy stands for the X & Y Offsets respectively.

# * Script Call * #
# Set Skip Cost Type - Default Type: :gold
#   $game_party.leader.skip_cost_type = :gold
#   $game_party.leader.skip_cost_type = :exp

module KLazy
SWITCH_ID = 1
BACKDROP_COLOR = Color.new(0, 0, 0, 128)
ALERT_SOUND = { :name => "", :volume => 70, :pitch => 100 }
TRANSITION = { :name => "018-Brick02", :frames => 10 }
FONT = { :name => "Arial", :size => 22,:bold => false }
PICTURE = { :name => "app_logo", :ox => 12, :oy => 12 }
MESSAGE_SIZE = { :x => 100, :y => 4, :width => 480 }
MESSAGE = [] # Leave it alone!
MESSAGE << "You are out of luck!"
MESSAGE << "Some random monsters have appeared!"
MESSAGE << "Want to pay them %s%s?"
MESSAGE << ""
EXP_LABEL = "EXP"
# Battle Skip Cost: { MAPID => cost, etc. }
GOLD_SKIP_COST = { 1 => 10 }
GOLD_SKIP_COST.default = 20
EXP_SKIP_COST = { 1 => 100 }
EXP_SKIP_COST.default = 200
end

class Game_Actor
alias :kyon_lw_gm_act_setup :setup
def setup(actor_id)
    kyon_lw_gm_act_setup(actor_id)
    @skip_cost_type = :gold
end
attr_accessor :skip_cost_type
end

class Game_Party
def leader
    @actors
end
end

class LazyAlertSprite < Sprite
def initialize(sy, view=nil)
    super(view)
    self.y = sy
    self.z += 1000
end

def make_bitmap(w, h)
    self.bitmap = Bitmap.new(w, h)
    @height = h
end

def draw_alert(message)
    dimensions = KLazy::MESSAGE_SIZE
    mx = dimensions[:x]
    my = dimensions[:y]
    mw = self.bitmap.width - mx - 8
    pic = KLazy::PICTURE
    lazy_font = KLazy::FONT
    font = self.bitmap.font
    font.name = lazy_font[:name]
    font.size = lazy_font[:size]
    font.bold = lazy_font[:bold]
    self.bitmap.fill_rect(self.bitmap.rect, KLazy::BACKDROP_COLOR)
    bit = RPG::Cache.picture(pic[:name])
    self.bitmap.blt(pic[:ox], pic[:oy], bit, bit.rect)
    bit.dispose
    leader = $game_party.leader
    pay_gold = leader.skip_cost_type == :gold
    term_gold = $data_system.words.gold
    if pay_gold
      cost = KLazy::GOLD_SKIP_COST[$game_map.map_id]
      label = term_gold
    elsif leader.skip_cost_type == :exp
      cost = KLazy::EXP_SKIP_COST[$game_map.map_id]
      KLazy::EXP_LABEL
    else
      cost = 0
      label = "None"
    end
    message.size.times do |n|
      text = sprintf(message, cost, label)
      self.bitmap.draw_text(mx, my + n * 28, mw, 28, text)
    end
    if pay_gold
      label = $game_party.gold.to_s + term_gold
    elsif leader.skip_cost_type == :exp
      label = leader.exp + label
    else
      label = ""
    end
    self.bitmap.draw_text(8, @height - 28, mx - 16, 28, label, 2)
end
end

class Spriteset_Map
def make_battle_alert
    message = KLazy::MESSAGE.reject{|ln| ln.empty? }
    msg_height = 16 + message.size * 24
    ay = $game_player.y - $game_map.display_y
    @alert_sprite = LazyAlertSprite.new(ay < 8 ? 344 : 12, @viewport2)
    @alert_sprite.make_bitmap(KLazy::MESSAGE_SIZE[:width], msg_height)
    @alert_sprite.draw_alert(message)
    tr = KLazy::TRANSITION
    Graphics.transition(tr[:frames], "Graphics/Transitions/" + tr[:name])
end

def dispose_battle_alert
    @alert_sprite.bitmap.dispose
    @alert_sprite.dispose
end
end

class Scene_Map
alias :kyon_lw_scn_bttl_up :update
alias :kyon_lw_scn_bttl_call_bttl :call_battle
def dispose_alert
    @spriteset.dispose_battle_alert
    @battle_alert = nil
end

def cancel_alert
    $game_system.se_play($data_system.buzzer_se)
    kyon_lf_scn_bttl_call_bttl
    dispose_alert
end

def update_alert
    $game_system.update
    $game_screen.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      kyon_lf_scn_bttl_call_bttl
      dispose_alert
      return
    elsif Input.trigger?(Input::C)
      leader = $game_party.leader
      if leader.skip_cost_type == :gold
      cost = KLazy::GOLD_SKIP_COST[$game_map.map_id]
      if $game_party.gold < cost
          cancel_alert
          return
      end
      $game_party.lose_gold(cost)
      elsif leader.skip_cost_type == :exp
      cost = KLazy::EXP_SKIP_COST[$game_map.map_id]
      if leader.exp < cost
          cancel_alert
          return
      end
      leader.exp -= cost
      end
      $game_system.se_play($data_system.shop_se)
      $game_temp.battle_troop_id = nil
      dispose_alert
    end
end

def update
    if @battle_alert
      update_alert
      return
    end
    kyon_lw_scn_bttl_up
end

def battle_alert
    $game_temp.battle_calling = false
    $game_temp.menu_calling = false
    $game_temp.menu_beep = false
    $game_player.make_encounter_count
    $game_player.straighten
    sound = KLazy::ALERT_SOUND
    alert_se = RPG::AudioFile.new(sound[:name], sound[:volume], sound[:pitch])
    $game_system.se_play(alert_se)
    $game_player.straighten
    Graphics.freeze
    @spriteset.make_battle_alert
    @battle_alert = true
end

def call_battle
    $game_switches ? battle_alert : kyon_lw_scn_bttl_call_bttl
end
end



Download DEMO​

Note: The demo includes some minor edits of the Scene_Title class to make it easy to earn some gold coins and automatically turns Switch #1 on.

Terms & Conditions

Free as in beer for non commercial games.
Contact me if you want to go commercial. (There will be an inexpensive charge for this script only.)


本贴来自国际rpgmaker官方论坛作者:kyonides处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/klazywayout-xp.148528/
页: [1]
查看完整版本: KLazyWayOut XP