KLotto VX + ACE - kyonides - 09-15-2024
KLotto VX + ACE
by Kyonides
Introduction
Do you recall my script Gem Roulette? Yes, the one with the spinning wheel made out of gems! Well, here's an interesting variant of it, this time is about the lotto!
This script can be customize up to a certain point, still, it can be used as a plug & play script as well, if you don't edit anything.
Yes, the spheres do fly!
Screenshot
NOTES
You'll need a picture that includes all the different colored spheres distributed in a single horizontal strip.
The width and the height of each individual frame cell should be identical, making it an actual square.
VX Script
Code: # * KLotto VX
# Scripter : Kyonides Arkanthes
# v1.0.6 - 2019-11-19
# This scriptlet will let you partake in raffles. Once the raffles are over, the
# scene will change back to the current map.
# * Script Calls *
# $scene = KLottoShop.new
# Opens the shop with default values.
# $scene = KLottoShop.new(SOME_HASH)
# The following options you can use to replace SOME_HASH are optional.
# :id => 1 - Changes the shop ID.
# :name => 'Claudia's Lotto' - Changes the shop's name.
# :cost => 25 - Changes the ticket cost.
# :prizes => [25000, 5000] - Changes the amount of the prize.
# :max => 5 - Changes the number of columns aka digits.
# $game_system.winner_tickets
# Array of Strings - List of previous winner tickets.
# $game_party.winner_tickets
# Array of Strings - List of winner tickets the party has ever purchased.
# $game_party.purchase_lotto_tickets
# $game_party.purchase_lotto_tickets(Total)
# Yes, via a script call you can let the player buy some tickets.
# The Total number can be omitted, its default value is 1.
# $game_party.has_lotto_ticket?(String)
# String should be a Number converted to a String by calling Number.to_s
# $game_party.discard_lotto_tickets
# Forces the player to dispose of every single lotto ticket.
module KLotto
TICKET_ITEM_ID = 31
PREVIOUS_TICKETS_MAX = 10
TICKET_PRICE = 10
DEFAULT_GOLD = [10000, 5000, 2000]
SPHERES_MIN = 3
SPHERE_WIDTH = 32 # In Pixels
FIRST_SPHERE_X = 280
DISCARD_AFTER_ONE_RAFFLE = true # Discard Tickets after a raffle?
FILENAME = 'spheres32'
SE_STARTUP = '056-Right02'
GENERIC_NAME = 'Generic Lotto'
PRIZES = 'Current Prizes'
PARTY_GOLD = 'Your Money'
WINNING_TICKET_LABEL = 'Winning Ticket'
PAST_WINNING_TICKETS_LABEL = 'Past Winning Tickets'
NAME_FONT_SIZE = 32
WINNING_LABEL_FONT_SIZE = 24
WINNING_NUMBER_FONT_SIZE = 32
PREVIOUS_TICKETS_FONT_SIZE = 24
PRIZE_LABEL_FONT_SIZE = 24
PRIZE_FONT_SIZES = [32, 28, 24]
end
module LottoSpriteMod
attr_accessor :number
end
class KLottoTicket
def initialize(number=nil)
@number = number || rand(10).to_s + rand(10).to_s + rand(10).to_s
end
attr_reader :number
end
class Game_System
alias :kyon_lotto_gm_sys_init :initialize
def initialize
kyon_lotto_gm_sys_init
@winner_tickets = []
end
def tickets_maintenance
length = @winner_tickets.size - KLotto::PREVIOUS_TICKETS_MAX
length.times{ @winner_tickets.shift }
end
attr_reader :winner_tickets
end
class Game_Party
alias :kyon_lotto_gm_party_init :initialize
def initialize
kyon_lotto_gm_party_init
@lotto_tickets = []
@winner_tickets = []
end
def purchase_lotto_tickets(total=1)
return 0 if total < 1
gain_item($data_items[KLotto::TICKET_ITEM_ID], total)
total.times{ @lotto_tickets << KLottoTicket.new }
end
def discard_lotto_tickets
gain_item(KLotto::TICKET_ITEM_ID, -@lotto_tickets.size)
@lotto_tickets.clear
end
def has_lotto_ticket?(number) @lotto_tickets.include?(number) end
attr_reader :lotto_tickets, :winner_tickets
end
class KLottoShop
include KLotto
def initialize(hsh={})
@id = hsh.delete(:id) || 0
@name = hsh.delete(:name) || GENERIC_NAME
@cost = hsh.delete(:cost) || TICKET_PRICE
@prizes = hsh.delete(:prizes) || DEFAULT_GOLD
@spheres_max = hsh.delete(:total) || SPHERES_MIN
@raffles_max = @prizes.size
@raffles = 0
@spheres = {}
@indexes = Array.new(@spheres_max, 0)
@radius_x = 24
@radius_y = 64
@d = 2.0 * Math::PI / @spheres_max
@moving_frames = 15
@cy = 208
@x_offset = []
@sprites = []
@gold_label = $data_system.terms.gold
@stage = :main
end
def main
@width = $HIDDENCHEST ? Graphics.width : 640
h = 36
@bg = Spriteset_Map.new
@sprites << @shop_label = Sprite.new
@shop_label.x = 120
@shop_label.y = 4
b = Bitmap.new(@width - 240, NAME_FONT_SIZE + 4)
b.font.size = NAME_FONT_SIZE
b.draw_text(b.rect, @name, 1)
@shop_label.bitmap = b
h = PRIZE_LABEL_FONT_SIZE + 4
@sprites << @prize_label = Sprite.new
@prize_label.x = @plx = @width - 208
@prize_label.y = @ply = 32
@prize_label.bitmap = b = Bitmap.new(200, h)
b.font.size = PRIZE_LABEL_FONT_SIZE
b.draw_text(b.rect, PRIZES, 1)
make_prize_labels
sprite = @sprites[-1]
@sprites << @party_gold_label = Sprite.new
@party_gold_label.x = sprite.x
@party_gold_label.y = sprite.y + h + 8
@party_gold_label.bitmap = b = Bitmap.new(200, h)
b.font.size = PRIZE_LABEL_FONT_SIZE
b.draw_text(b.rect, PARTY_GOLD, 1)
@sprites << @gold_sprite = Sprite.new
@gold_sprite.x = @party_gold_label.x
@gold_sprite.y = @party_gold_label.y + h
@gold_bitmap = Bitmap.new(200, h)
refresh_party_gold
@gold_sprite.bitmap = @gold_bitmap
@sprites << @winner_label = Sprite.new
@winner_label.x = 4
@winner_label.y = 32
@winner_label.bitmap = b = Bitmap.new(208, WINNING_LABEL_FONT_SIZE + 4)
b.font.size = WINNING_LABEL_FONT_SIZE
b.draw_text(b.rect, WINNING_TICKET_LABEL, 1)
@sprites << @winner_ticket = Sprite.new
@winner_ticket.x = 8
@winner_ticket.y = 58
@winner_bitmap = Bitmap.new(200, WINNING_NUMBER_FONT_SIZE + 4)
@winner_bitmap.font.size = WINNING_NUMBER_FONT_SIZE
@winner_ticket.bitmap = @winner_bitmap
make_past_tickets
refresh_past_tickets_list
make_spheres
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
terminate
end
def terminate
@spheres_max.times do |n|
@spheres[n].each{|s| s.dispose }
end
@spheres.clear
@sprites.each{|s| s.dispose }
@sprites.clear
@bg.dispose
$game_party.discard_lotto_tickets
end
def make_prize_labels
@raffles_max.times do |n|
h = PRIZE_FONT_SIZES[n]
@sprites << sprite = Sprite.new
sprite.x = @plx
sprite.y = @ply - 4 + h + n * 4 + 24 * n
sprite.bitmap = bit = Bitmap.new(200, h)
bit.font.size = h
bit.draw_text(bit.rect, DEFAULT_GOLD[n].to_s, 1)
end
end
def make_spheres
spheres = Cache.picture(FILENAME)
sh = spheres.height
@spheres_max.times do |m|
@spheres[m] = slot = []
w = SPHERE_WIDTH * m
@x_offset << offset = m * 36
10.times do |n|
sprite = Sprite.new
sprite.extend(LottoSpriteMod)
sprite.number = n.to_s
rand(4) % 2 == 0 ? slot.push(sprite) : slot.unshift(sprite)
sprite.x = FIRST_SPHERE_X + offset - 8
sprite.y = @cy
sprite.z = 1000
sprite.bitmap = spheres.dup
sprite.bitmap.draw_text(w, 0, SPHERE_WIDTH, 24, sprite.number, 1)
sprite.src_rect.set(w, 0, SPHERE_WIDTH, sh)
end
@indexes[m] = slot[-1].number.to_i
end
spheres.dispose
end
def make_past_tickets
@sprites << @past_tickets_label = Sprite.new
@past_tickets_label.x = 8
@past_tickets_label.y = @winner_ticket.y + PREVIOUS_TICKETS_FONT_SIZE + 16
h = PREVIOUS_TICKETS_FONT_SIZE + 4
@past_tickets_label.bitmap = b = Bitmap.new(200, h)
b.draw_text(b.rect, PAST_WINNING_TICKETS_LABEL, 1)
@sprites << @past_tickets = Sprite.new
@past_tickets.x = 8
@past_tickets.y = @past_tickets_label.y + 28
@past_bitmap = Bitmap.new(200, PREVIOUS_TICKETS_MAX * 24 + 4)
@past_tickets.bitmap = @past_bitmap
end
def refresh_past_tickets_list
@past_bitmap.clear
tickets = $game_system.winner_tickets
max = tickets.size
w = @past_bitmap.width
max.times{|n| @past_bitmap.draw_text(0, n * 24, w, 24, tickets[n], 1) }
end
def refresh_party_gold
@gold_bitmap.clear
@gold_bitmap.font.size = PRIZE_LABEL_FONT_SIZE
@gold_bitmap.draw_text(@gold_bitmap.rect, $game_party.gold.to_s, 1)
end
def update
if @stage == :main
update_start
elsif @stage == :spin
update_spheres
elsif @stage == :fall
update_fall
elsif @stage == :standby
update_stand_by
else
update_exit
end
end
def update_start
if Input.trigger?(Input::B)
update_exit
return
elsif Input.trigger?(Input::C)
Sound.play_decision
@raffles += 1
@digits = ''
@steps = 60 + rand(40)
@stage = :spin
end
end
def update_spheres
d1 = -@d / @moving_frames * 2
@spheres_max.times do |m|
col = @spheres[m]
10.times do |n|
o = n - @indexes[m]
d = @d * o + d1 * @steps
sx = FIRST_SPHERE_X + @x_offset[m] - 20
sphere = col[n]
sphere.x = sx - (@radius_x * Math.sin(d)).round
sphere.y = @cy - 60 + (@radius_y * Math.cos(d)).round
end
end
@steps -= 1
@stage = :fall if @steps == 0
end
def update_fall
Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
@spheres_max.times do |m|
offset = @x_offset[m]
col = @spheres[m]
z_pos = []
10.times do |n|
z_order = rand(100)
random = rand(50) % 3
sprite = col[n]
sprite.x = FIRST_SPHERE_X + offset - 8
sprite.y = @cy
sprite.z = 1000 + (rand(160) % 3 == 0 ? z_order : -z_order)
z_pos = sprite.z
end
sprite = col.sort{|a,b| b.z <=> a.z }[0]
@digits += sprite.number
end
@winner_bitmap.font.size = WINNING_NUMBER_FONT_SIZE
@winner_bitmap.draw_text(@winner_bitmap.rect, @digits, 1)
@stage = :standby
end
def update_stand_by
return unless Input.trigger?(Input::B) or Input.trigger?(Input::C)
Sound.play_decision
$game_system.winner_tickets << @digits
$game_system.tickets_maintenance
refresh_past_tickets_list
@winner_bitmap.clear
if $game_party.has_lotto_ticket?(@digits)
$game_party.winning_tickets << KLottoTicket.new(@digits)
$game_party.gain_gold(@prizes[@raffles - 1])
refresh_party_gold
if DISCARD_AFTER_ONE_RAFFLE
$game_party.discard_lotto_tickets
return @stage = nil
end
end
@stage = @raffles_max > @raffles ? :main : nil
end
def update_exit
Sound.play_cancel
$scene = Scene_Map.new
end
end
VX ACE Script
Code: # * KLotto ACE
# Scripter : Kyonides Arkanthes
# v1.0.6 - 2019-11-19
# This scriptlet will let you partake in raffles. Once the raffles are over, the
# scene will change back to the current map.
# * Script Calls *
# KLotto.set(OptionsHash)
# Optional - It lets you customize the KLottoShop
# The following options you can use to replace OptionsHash are optional.
# id: 1 - Changes the shop ID.
# name: 'Claudia's Lotto' - Changes the shop's name.
# cost: 25 - Changes the ticket cost.
# prizes: [25000, 5000] - Changes the amount of the prize.
# max: 5 - Changes the number of columns aka digits.
# SceneManager.goto(KLottoShop)
# Opens the shop no matter if you have called KLotto.set before or not.
# $game_system.winner_tickets
# Array of Strings - List of previous winner tickets.
# $game_party.winner_tickets
# Array of Strings - List of winner tickets the party has ever purchased.
# $game_party.purchase_lotto_tickets
# $game_party.purchase_lotto_tickets(Total)
# Yes, via a script call you can let the player buy some tickets.
# The Total number can be omitted, its default value is 1.
# $game_party.has_lotto_ticket?(String)
# String should be a Number converted to a String by calling Number.to_s
# $game_party.discard_lotto_tickets
# Forces the player to dispose of every single lotto ticket.
module KLotto
TICKET_ITEM_ID = 31
PREVIOUS_TICKETS_MAX = 10
TICKET_PRICE = 10
DEFAULT_GOLD = [10000, 5000, 2000]
SPHERES_MIN = 3
SPHERE_WIDTH = 32 # In Pixels
FIRST_SPHERE_X = 280
FILENAME = 'spheres32'
SE_STARTUP = '056-Right02'
GENERIC_NAME = 'Generic Lotto'
PRIZES = 'Current Prizes'
PARTY_GOLD = 'Your Money'
WINNING_TICKET_LABEL = 'Winning Ticket'
PAST_WINNING_TICKETS_LABEL = 'Past Winning Tickets'
NAME_FONT_SIZE = 32
WINNING_LABEL_FONT_SIZE = 24
WINNING_NUMBER_FONT_SIZE = 32
PREVIOUS_TICKETS_FONT_SIZE = 24
PRIZE_LABEL_FONT_SIZE = 24
PRIZE_FONT_SIZES = [32, 28, 24]
@options = {} # Do Not Touch This!
def self.options() @options end
def self.set(hash={}) @options = hash end
end
module LottoSpriteMod
attr_accessor :number
end
class KLottoTicket
def initialize(number=nil)
@number = number || rand(10).to_s + rand(10).to_s + rand(10).to_s
end
attr_reader :number
end
class Game_System
alias :kyon_lotto_gm_sys_init :initialize
def initialize
kyon_lotto_gm_sys_init
@winner_tickets = []
end
def tickets_maintenance
length = @winner_tickets.size - KLotto::PREVIOUS_TICKETS_MAX
length.times{ @winner_tickets.shift }
end
attr_reader :winner_tickets
end
class Game_Party
alias :kyon_lotto_gm_party_init :initialize
def initialize
kyon_lotto_gm_party_init
@lotto_tickets = []
@winner_tickets = []
end
def purchase_lotto_tickets(total=1)
return 0 if total < 1
gain_item($data_items[KLotto::TICKET_ITEM_ID], total)
total.times{ @lotto_tickets << KLottoTicket.new }
end
def discard_lotto_tickets
gain_item(KLotto::TICKET_ITEM_ID, -@lotto_tickets.size)
@lotto_tickets.clear
end
def has_lotto_ticket?(number) @lotto_tickets.include?(number) end
attr_reader :lotto_tickets, :winner_tickets
end
class KLottoShop
include KLotto
def initialize
options = KLotto.options
@id = options.delete(:id) || 0
@name = options.delete(:name) || GENERIC_NAME
@cost = options.delete(:cost) || TICKET_PRICE
@prizes = options.delete(:prizes) || DEFAULT_GOLD
@spheres_max = options.delete(:total) || SPHERES_MIN
@raffles_max = @prizes.size
@raffles = 0
@spheres = {}
@indexes = Array.new(@spheres_max, 0)
@radius_x = 24
@radius_y = 64
@d = 2.0 * Math::PI / @spheres_max
@moving_frames = 15
@cy = 208
@x_offset = []
@sprites = []
@gold_label = $data_system.currency_unit
@stage = :main
end
def main
@width = $HIDDENCHEST ? Graphics.width : 640
h = 36
@bg = Sprite.new
@bg.bitmap = SceneManager.background_bitmap
@bg.color.set(16, 16, 16, 128)
@sprites << @shop_label = Sprite.new
@shop_label.x = 120
@shop_label.y = 4
b = Bitmap.new(@width - 240, NAME_FONT_SIZE + 4)
b.font.size = NAME_FONT_SIZE
b.draw_text(b.rect, @name, 1)
@shop_label.bitmap = b
h = PRIZE_LABEL_FONT_SIZE + 4
@sprites << @prize_label = Sprite.new
@prize_label.x = @plx = @width - 208
@prize_label.y = @ply = 32
@prize_label.bitmap = b = Bitmap.new(200, h)
b.font.size = PRIZE_LABEL_FONT_SIZE
b.draw_text(b.rect, PRIZES, 1)
make_prize_labels
sprite = @sprites[-1]
@sprites << @party_gold_label = Sprite.new
@party_gold_label.x = sprite.x
@party_gold_label.y = sprite.y + h + 8
@party_gold_label.bitmap = b = Bitmap.new(200, h)
b.font.size = PRIZE_LABEL_FONT_SIZE
b.draw_text(b.rect, PARTY_GOLD, 1)
@sprites << @gold_sprite = Sprite.new
@gold_sprite.x = @party_gold_label.x
@gold_sprite.y = @party_gold_label.y + h
@gold_bitmap = Bitmap.new(200, h)
refresh_party_gold
@gold_sprite.bitmap = @gold_bitmap
@sprites << @winner_label = Sprite.new
@winner_label.x = 4
@winner_label.y = 32
@winner_label.bitmap = b = Bitmap.new(208, WINNING_LABEL_FONT_SIZE + 4)
b.font.size = WINNING_LABEL_FONT_SIZE
b.draw_text(b.rect, WINNING_TICKET_LABEL, 1)
@sprites << @winner_ticket = Sprite.new
@winner_ticket.x = 8
@winner_ticket.y = 58
@winner_bitmap = Bitmap.new(200, WINNING_NUMBER_FONT_SIZE + 4)
@winner_bitmap.font.size = WINNING_NUMBER_FONT_SIZE
@winner_ticket.bitmap = @winner_bitmap
make_past_tickets
refresh_past_tickets_list
make_spheres
Graphics.transition
main_loop while @stage
terminate
end
def terminate
Graphics.freeze
@spheres_max.times do |n|
@spheres[n].each{|s| s.dispose }
end
@spheres.clear
@sprites.each{|s| s.dispose }
@sprites.clear
@bg.dispose
$game_party.discard_lotto_tickets
end
def make_prize_labels
@raffles_max.times do |n|
h = PRIZE_FONT_SIZES[n]
@sprites << sprite = Sprite.new
sprite.x = @plx
sprite.y = @ply - 4 + h + n * 4 + 24 * n
sprite.bitmap = bit = Bitmap.new(200, h)
bit.font.size = h
bit.draw_text(bit.rect, DEFAULT_GOLD[n].to_s, 1)
end
end
def make_spheres
spheres = Cache.picture(FILENAME)
sh = spheres.height
@spheres_max.times do |m|
@spheres[m] = slot = []
w = SPHERE_WIDTH * m
@x_offset << offset = m * 36
10.times do |n|
sprite = Sprite.new
sprite.extend(LottoSpriteMod)
sprite.number = n.to_s
rand(4) % 2 == 0 ? slot.push(sprite) : slot.unshift(sprite)
sprite.x = FIRST_SPHERE_X + offset - 8
sprite.y = @cy
sprite.z = 1000
sprite.bitmap = spheres.dup
sprite.bitmap.draw_text(w, 0, SPHERE_WIDTH, 24, sprite.number, 1)
sprite.src_rect.set(w, 0, SPHERE_WIDTH, sh)
end
@indexes[m] = slot[-1].number.to_i
end
spheres.dispose
end
def make_past_tickets
@sprites << @past_tickets_label = Sprite.new
@past_tickets_label.x = 8
@past_tickets_label.y = @winner_ticket.y + PREVIOUS_TICKETS_FONT_SIZE + 16
h = PREVIOUS_TICKETS_FONT_SIZE + 4
@past_tickets_label.bitmap = b = Bitmap.new(200, h)
b.draw_text(b.rect, PAST_WINNING_TICKETS_LABEL, 1)
@sprites << @past_tickets = Sprite.new
@past_tickets.x = 8
@past_tickets.y = @past_tickets_label.y + 28
@past_bitmap = Bitmap.new(200, PREVIOUS_TICKETS_MAX * 24 + 4)
@past_tickets.bitmap = @past_bitmap
end
def refresh_past_tickets_list
@past_bitmap.clear
tickets = $game_system.winner_tickets
max = tickets.size
w = @past_bitmap.width
max.times{|n| @past_bitmap.draw_text(0, n * 24, w, 24, tickets[n], 1) }
end
def refresh_party_gold
@gold_bitmap.clear
@gold_bitmap.font.size = PRIZE_LABEL_FONT_SIZE
@gold_bitmap.draw_text(@gold_bitmap.rect, $game_party.gold.to_s, 1)
end
def main_loop
Graphics.update
Input.update
update
end
def update
if @stage == :main
update_start
elsif @stage == :spin
update_spheres
elsif @stage == :fall
update_fall
elsif @stage == :standby
update_stand_by
elsif @stage == :exit
update_exit
end
end
def update_start
if Input.trigger?(Input::B)
update_exit
return
elsif Input.trigger?(Input::C)
Sound.play_ok
@raffles += 1
@digits = ''
@steps = 60 + rand(40)
@stage = :spin
end
end
def update_spheres
d1 = -@d / @moving_frames * 2
@spheres_max.times do |m|
col = @spheres[m]
10.times do |n|
o = n - @indexes[m]
d = @d * o + d1 * @steps
sx = FIRST_SPHERE_X + @x_offset[m] - 20
sphere = col[n]
sphere.x = sx - (@radius_x * Math.sin(d)).round
sphere.y = @cy - 60 + (@radius_y * Math.cos(d)).round
end
end
@steps -= 1
@stage = :fall if @steps == 0
end
def update_fall
Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)
@spheres_max.times do |m|
offset = @x_offset[m]
col = @spheres[m]
z_pos = []
10.times do |n|
z_order = rand(100)
random = rand(50) % 3
sprite = col[n]
sprite.x = FIRST_SPHERE_X + offset - 8
sprite.y = @cy
sprite.z = 1000 + (rand(160) % 3 == 0 ? z_order : -z_order)
z_pos = sprite.z
end
sprite = col.sort{|a,b| b.z <=> a.z }[0]
@digits += sprite.number
end
@winner_bitmap.font.size = WINNING_NUMBER_FONT_SIZE
@winner_bitmap.draw_text(@winner_bitmap.rect, @digits, 1)
@stage = :standby
end
def update_stand_by
return unless Input.trigger?(Input::B) or Input.trigger?(Input::C)
Sound.play_ok
$game_system.winner_tickets << @digits
$game_system.tickets_maintenance
refresh_past_tickets_list
@winner_bitmap.clear
if $game_party.has_lotto_ticket?(@digits)
$game_party.winning_tickets << KLottoTicket.new(@digits)
$game_party.gain_gold(@prizes[@raffles - 1])
refresh_party_gold
end
@stage = @raffles_max > @raffles ? :main : :exit
end
def update_exit
Sound.play_cancel
$game_party.discard_lotto_tickets
SceneManager.goto(Scene_Map)
@stage = nil
end
end
Download Section
Terms & Conditions
You must include my nickname and the current website's URL in your game credits.
Free for non commercial games.
Give me a free copy of your completed game if you include at least 2 of my scripts!
|