じ☆ve冰风 发表于 4 天前

Gem Roulette VX

Gem Roulette VX
v 1.0.8


by Kyonides-Arkanthes​


Introduction

This is my own version of a roulette mini game. The gems you can see on the screenshot below will rotate as expected after you hit the OK button. Later on it will show you your prize. After you collect it, it will show up on the window on the right hand side of the screen as an icon. You may collect more prizes the more attempts you get.

Just remember I didn't provide the gems you see below. Use your own icons if possible, you just need 10 of them.

You may find ports to XP and VX Ace as well.

Screenshots





Instructions

There is a TXT file you need to edit so you can configure the prizes the player might earn after spinning the wheel. Later on you may check the instructions included in my script. You also need to place all required (gem) graphics in Graphics/Icons directory, you may need to create it first.

All 3 Scripts

DOWNLOAD DEMOS HERE


VX Script
                Code:       
# * Gem Roulette VX#   Scripter : Kyonides-Arkanthos#   v 1.0.8 - 2021-10-09#   Script Calls#   To open Gem Roulette :         $scene = Gem_Roulette.new#   To increase Spinning Attempts :$game_party.roulette_attempts += Number#   This script will let you spin some gems as if they were part of a Wheel of#   Fortune. Later on you will collect your prize. Previous prizes will be#   displayed on the window on the right hand side.#   Prizes are picked up randomly but you can configure what prizes they might#   get if you edit the file named as shown on the PRIZE_FILENAME Constant below#   There is the possibility of not letting the player get a prize depending on#   then gem or slot selected by the script.#   Don't forget to include the sprites needed for the 10 Gem-Slots.module GemRouletteSetup# Gem Icon Sprite Name Prefix - will be used as SlotsICON_NAME_PREFIX = 'gem'# SE for Startup and Prize is ready to be collectedSE_STARTUP = "Chest"# Prizes TXT FilenamePRIZE_FILENAME = 'prizes.txt'# Label for Position or SlotPOSITION_LABEL = 'Slot'# Label for No Prize for youNO_PRIZE = 'Nothing'# Label for Item as PrizeITEM_PRIZE   = 'Item'# Label for Weapon as PrizeWEAPON_PRIZE = 'Weapon'# Label for Armor as PrizeARMOR_PRIZE= 'Armor'# Label for Skill as PrizeSKILL_PRIZE= 'Skill'# Label for HP as Prize or PunishmentHP_LOSS = 'HP'# Label for MP as Prize or PunishmentMP_LOSS = 'MP'# Icon filename for Losing HP or MPSTATS_LOSS_ICON = ''# Points Earned LabelSTATS_LOSS_LABEL = ' Earned: '# Attempts Left LabelATTEMPTS_LEFT = 'Attempts Left: '# Spin the Wheel StringSPIN_WHEEL = 'Spin Wheel'# Collect Prize StringCOLLECT = 'Collect'# No More Spins Left StringRUNOUT = 'No More Spins'# Better Luck Next Time StringNEXT_TIME = 'Better Luck Next Time!'# Points LabelPOINTS = 'Points'# DO NOT EDIT ANYTHING BELOW THIS LINEPRIZE_RVDATA = 'Data/GemRoulette.rvdata'PRIZES = {}@prizes = []@prize_points = []extend selfattr_reader :prizes, :prize_pointsdef get_prize_data    if $TEST and File.exist?(PRIZE_FILENAME)      lines = File.readlines(PRIZE_FILENAME)      10.times do |n|      pts = lines.scan(/\d+ #{POINTS}/).sub!(/ #{POINTS}/,'')      @prize_points << pts.to_i      lines.shift      PRIZES = []      regex = /+/      kinds = lines.scan(regex).map {|ln| self.prize_kind(ln) }      indexes = lines.scan(/+/).map {|ln| self.prize_kind(ln) }      kinds.size.times {|m| PRIZES << , indexes] }      lines.shift      end      File.open(PRIZE_RVDATA, 'wb') do |file|      Marshal.dump(@prize_points, file)      Marshal.dump(PRIZES, file)      end      return    end    File.open(PRIZE_RVDATA, 'rb') do |file|      @prize_points = Marshal.load(file)      PRIZES.merge!(Marshal.load(file))    endenddef prize_kind(kind)    regexp = /\d+/    case kind    when ITEM_PRIZE then :item    when WEAPON_PRIZE then :weapon    when ARMOR_PRIZE then :armor    when SKILL_PRIZE then :skill    when HP_LOSS then :hp    when MP_LOSS then :mp    when regexp then kind.to_i    endendget_prize_dataendclass StatsItemattr_reader :name, :points, :icon_namedef initialize(new_name, new_points)    @name = new_name.to_s.upcase + ' ' + GemRouletteSetup::STATS_LOSS_LABEL    @name += new_points.to_s    @points = new_points    @icon_name = GemRouletteSetup::STATS_LOSS_ICONendendmodule Cachedef self.old_icon(filename) load_bitmap("Graphics/Icons/", filename) endendclass Spritedef draw_icon(icon_index, x=0, y=0, enabled = true)    self.bitmap = Bitmap.new(24, 24)    bitmap = Cache.system("Iconset")    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)    self.bitmap.blt(x, y, bitmap, rect, enabled ? 255 : 128)endendclass Game_Partyattr_accessor :roulette_attempts, :roulette_pointsalias kyon_gem_roulette_gm_party_init initializedef initialize    @roulette_attempts = 0    @roulette_points = 0    @skills = {}    kyon_gem_roulette_gm_party_initenddef gain_skill(sid, n)    return unless sid > 0    @skills = [.max, 99].minenddef lose_skill(sid, n) gain_skill(sid, -n) enddef skill_number(sid) @skills.include?(sid)? @skills : 0 endendclass Sprite_Blink < Spritedef update    super    if @_blink      @_blink_count = (@_blink_count + 1) % 32      alpha = 6 * (@_blink_count < 16 ? 16 - @_blink_count : @_blink_count - 16)      self.color.set(255, 255, 255, alpha)    end    @@_animations.clear rescue nilenddef blink_on    return if @_blink    @_blink = true    @_blink_count = 0enddef blink_off    return unless @_blink    @_blink = false    self.color.set(0, 0, 0, 0)endendclass Window_Roulette_Prizes < Window_Basedef initialize    super(456, 56, 88, 320)    @column_max = 2    refreshenddef refresh    if self.contents != nil      self.contents.dispose      self.contents = nil    end    @data = GemRouletteSetup.prizes    @item_max = @data.size    return if @item_max == 0    self.contents = Bitmap.new(width - 32, @item_max * 32)    @item_max.times {|n| draw_item(n) }enddef draw_item(index)    x = index % 2 * 32    y = index / 2 * 32    icon_index = @data    bitmap = Cache.system("Iconset")    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)    self.contents.blt(x, y, bitmap, rect, 255)endendclass Window_Commanddef replace_command(index, command)    @commands = command    refreshendendclass Window_GRPLabel < Window_Basedef initialize(w)    super(0, 0, w, 56)    self.contents = Bitmap.new(width - 32, height - 32)    refreshenddef refresh    c = contents    c.clear    c.font.color = system_color    points = GemRouletteSetup::POINTS    c.draw_text(0, 0, self.width - 32, 24, points)    c.font.color = normal_color    points = $game_party.roulette_points.to_s    c.draw_text(0, 0, self.width - 32, 24, points, 2)endendclass Gem_Rouletteinclude GemRouletteSetupdef initialize    path = 'Graphics/Icons/'    items = Dir.sort    @items = items.map{|item| item.sub!(path, '') }    @moving_frames = 15    @steps = 60    Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)    @item_sprites = []    @cx = 320    @cy = 240    if @items.size < 10      @items += items.dup    elsif @items.size > 10      @items = @items    end    @item_max = @items.size    @radius = 120    @d = 2.0 * Math::PI / @item_max    @item_max.times do |n|      @item_sprites << Sprite_Blink.new      @item_sprites.x = @cx - 70 - (@radius * Math.sin(@d * n)).round      @item_sprites.y = @cy - 92 + (@radius * Math.cos(@d * n)).round      @item_sprites.bitmap = Cache.old_icon(items)    end    @blink_index = 0    @item_sprites[@blink_index].blink_on    @xy = [@item_sprites.x, @item_sprites.y]    @prize_sprites = []    3.times do      @prize_sprites << Sprite.new(@viewport3)      @prize_sprites[-1].z = 5000    end    @prize_sprites.x = @cx - 64    @prize_sprites.y = @cy - 48    @prize_sprites.x = @prize_sprites.x - 76    @prize_sprites.y = @prize_sprites.y + 26    @prize_sprites.x = 162    @prize_sprites.y = 316    @prize_sprites.bitmap = Bitmap.new(220, 32)    make_attempts_left_labelenddef make_attempts_left_label    b = @prize_sprites.bitmap    b.clear    color = Color.new(25, 25, 25, 180)    b.fill_rect(0, 0, 220, 32, color)    attempts = ATTEMPTS_LEFT + $game_party.roulette_attempts.to_s    b.draw_text(0, 0, 220, 32, attempts, 1)enddef main    @spriteset = Spriteset_Map.new    @option_window = Window_Command.new(160, )    @option_window.x = 192    @option_window.y = @prize_sprites.y + 36    @points_window = Window_GRPLabel.new(172)    @points_window.x = Graphics.width - @points_window.width    3.times {|n| @prize_sprites.z = 5000 }    @item_max.times {|n| @item_sprites.z = 5000 }    @prizes_window = Window_Roulette_Prizes.new    Graphics.transition    loop do      Graphics.update      Input.update      update      break if $scene != self    end    Graphics.freeze    @prizes_window.dispose    @option_window.dispose    @xy.clear    @prize_sprites.each {|sprite| sprite.dispose }    @prize_sprites.clear    @item_sprites.each {|sprite| sprite.dispose }    @item_sprites.clear    @prize_sprites = @item_sprites = @xy = nil    @points_window.dispose    @spriteset.disposeenddef update    @option_window.update    @prizes_window.update    @item_sprites.each{|sprite| sprite.update }    if @move      refresh_sprites      return    end    if Input.trigger?(Input::B)      exit_scene      return    elsif Input.trigger?(Input::C)      if $game_party.roulette_attempts == 0      if @result          retrieve_new_prize          exit_scene      else          Sound.play_buzzer      end      return      end      Sound.play_decision      retrieve_new_prize    endenddef exit_scene    Sound.play_buzzer    GemRouletteSetup.prizes.clear    $scene = Scene_Map.newenddef retrieve_new_prize    if !@move and !@result      @item_sprites[@blink_index].blink_off      @option_window.index = -1      $game_party.roulette_attempts -= 1      make_attempts_left_label      @index = rand(@item_max)      @move = true      return    end    return unless @result    GemRouletteSetup.prizes << @new_prize.icon_index if @new_prize    @prizes_window.refresh    @option_window.index = 0    case @kind    when :item, :weapon, :armor      $game_party.gain_item(@new_prize, @new_prize.id, 1)    when :skill then $game_party.gain_skill(@new_prize.id, 1)    when :hp then $game_party.actors.hp += @new_prize.points    when :mp then $game_party.actors.mp += @new_prize.points    end    @prize_sprites.bitmap.clear rescue nil    @prize_sprites.bitmap.clear rescue nil    @result = nil    comm = $game_party.roulette_attempts > 0 ? SPIN_WHEEL : RUNOUT    @option_window.replace_command(0, comm)enddef refresh_sprites    d1 = -@d / @moving_frames * 2    @item_max.times do |n|      m = n - @index      d = @d * m + d1 * @steps      @item_sprites.x = @cx - 70 - (@radius * Math.sin(d)).round      @item_sprites.y = @cy - 92 + (@radius * Math.cos(d)).round    end    @steps -= 1    if @steps == -1      if rand(5) == 0      @steps += 5      return      end      Audio.se_play("Audio/SE/" + SE_STARTUP, 80, 100)      @move = nil      @steps = 1 + @moving_frames * (3 + rand(5))      results = @item_sprites.map{|sprite| @xy == }      @blink_index = @result = results.index(true)      @item_sprites[@blink_index].blink_on      check_prize    endenddef get_prize_kind(kind, index)    @kind = kind    case kind    when :item then $data_items    when :weapon then $data_weapons    when :armor then $data_armors    when :skill then $data_skills    when :hp, :mp then StatsItem.new(kind, index)    endenddef find_prize    case @prizes.size    when 1      @prizes ? get_prize_kind(@prizes, @prizes) : nil    else      index = @prizes.size > 2 ? rand(@prizes.size) : rand(4) % 2      get_prize_kind(@prizes, @prizes)    endenddef no_prize    @kind = nil    @prize_sprites.bitmap = bitmap = Bitmap.new(200, 24)    label = NEXT_TIME    bitmap.font.bold = true    bitmap.font.size = 19    bitmap.draw_text(0, 0, 200, 24, label, 1)end   def check_prize    $game_party.roulette_points += GemRouletteSetup.prize_points[@blink_index]    @points_window.refresh    @prizes = PRIZES[@result]    return no_prize if @prizes.nil? or @prizes.nil?    @new_prize = find_prize    return no_prize unless @new_prize    @prizes.clear    @prize_sprites.draw_icon(@new_prize.icon_index)    @prize_sprites.bitmap = bitmap = Bitmap.new(180, 24)    bitmap.font.bold = true    bitmap.font.size = 19    bitmap.draw_text(0, 0, 180, 24, @new_prize.name, 1)    @option_window.replace_command(0, COLLECT)endend



TXT Config File
Valid for All Versions
                Code:       
Slot 1 Weapon 1, Item 1, Armor 1, Skill 1Slot 2 Weapon 2, Item 2, Skill 2Slot 3 Weapon 5, Item 3, Armor 4, Skill 3Slot 4 Weapon 1, Item 1, Armor 1, Skill 1Slot 5 Weapon 1, Item 5, Item 8, Skill 1Slot 6 Weapon 1, Item 1, Armor 8, Skill 1Slot 7 Weapon 1, Item 1, Armor 1, Skill 1Slot 8 NothingSlot 9 Weapon 1, Item 1, Armor 1, Skill 5Slot 10 Weapon 4, Item 1, Armor 4, Skill 20


FAQ

Nothing to say, yet.


Compatibility

Designed for RPG Maker XP & VX & VX ACE.


Terms and Conditions

Free for use in non commercial projects, but you may contact me in case you want to go commercial. Due credit is a must.

By the way, I will only support the latest version available because it usually includes bug fixes and improvements.

You are not allowed to repost my scripts on any other boards.


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