#==============================================================================
#==============================================================================
#Berans' "Interactive drumkit" script v1.11
#Last edited: 24 August 2008
#
#------------------------------------------------------------------------------
#What's new in v1.11
# - Script now features support for "input codes"
# - Added instructions to customize controls
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#
#This script creates an "interactive drumkit" allowing you to play some nice
#beats within your game. It's easy to adapt to your own liking to create
#many different sounds
#
#Credits: Berans - Making the script
# Sniper308 - Providing the graphics and idea for the script
#
#------------------------------------------------------------------------------
#Features
#------------------------------------------------------------------------------
# -Easy set-up
# -Can change drum sounds to anything you like
# -comes with nice graphics
# -Fully lagfree
# -NEW: You can now use the drums to input codes
#------------------------------------------------------------------------------
#Compatibility
#------------------------------------------------------------------------------
#This script does not rewrite any standard methods and does not use any global
#variables. Should be compatible with anything, including the SDK
#
#==============================================================================
#Instructions
#==============================================================================
#
#------------------------------------------------------------------------------
#Setup
#------------------------------------------------------------------------------
# -Download the demo if the script was obtained separately
# -Copy the Audio files in Audio/SE to your own project, and make sure the names
# stay the same. You can provide your own Audio files, but they must be called
# "Tom-1","Tom-2","Tom-3","Hi-Hat" and "Bassdrum" respectively
# -Copy the picture files in Graphics/Pictures to your own project, making sure
# the names stay the same. You can easily change the color of the "lighting"
# effect by changing the color of the objects in "DrumsLights"
# -Import the picture files into your game, making white transparant in both
# files, clearing the semi-transparant color for "Rock Band Drums" and making
# the color of the main objects in "DrumsLights" semi-transparant
#
#------------------------------------------------------------------------------
#Optional
#------------------------------------------------------------------------------
#To change the drum's controls find the lines in the script below with the
#comment "Control" above them and change what's after "Input::"
#The lines correspond to the drums from left to right, followed by the bass drum
#With the standard engine's input module, possibilities to follow Input:: are:
#A,B,C,X,Y,Z,L,R,CTRL,ALT,SHIFT,F5,F6,F7,F8,DOWN,LEFT,UP and RIGHT
#Check the helpfile for what each of these corresponds to on your keyboard.
#This will also help the script functioning with a custom Input module as you
#can customize the controls to take the module into account.
#
#------------------------------------------------------------------------------
#Using the script
#------------------------------------------------------------------------------
# - To call the script, use the "script" command within any event.
# In the script write "$scene = Scene_Drums.new", without the quotes
# - You can change the script call as follows to create a "Ryhtm code" that
# turns on a game switch when entered correctly
# $scene = Scene_Drums.new(switch,code,mode)
# - To use this feature, replace switch with a switch number in the game that
# you want to affect
# Replace code with an "input code" in the following format:
# '14232B23B1' (include the single quotes)
# Where 1-4 correspond to each of the drums from left to right, and B
# corresponds to the pedal
# Finally, you can replace mode by either 0, 1 or 2 to have a different style
# of inputting the code
# mode 0 means that, if you get the code wrong, nothing happens
# mode 1 means that, if you get the code wrong, a sound plays notifying you
# of the wrong input, and the input starts over
# mode 2 means that, if you get the code wrong, a sound plays and the scene
# is quit to map
# leaving mode out automatically uses mode 0
#==============================================================================
#==============================================================================
#==============================================================================
#**Scene_Drums
#------------------------------------------------------------------------------
#This class handles processing for the drums screen
#==============================================================================
class Scene_Drums
#----------------------------------------------------------------------------
#*Object initialization
#----------------------------------------------------------------------------
def initialize(switch = nil,string = nil,mode = 0)
@switch = switch
@string = ''
unless string == nil
@required = string.gsub("\n"){nil}
end
@mode = mode
end
#----------------------------------------------------------------------------
#*Main processing
#----------------------------------------------------------------------------
def main
#Memorize Map/Menu BGM
$game_system.bgm_memorize
#Fade out BGM
$game_system.bgm_fade(2)
#Memorize Map/Menu BGS
$game_system.bgs_memorize
#Fade out BGS
$game_system.bgs_fade(2)
#This keeps track of the animation frames for the drum's lighting effects
@animation = []
#create a value for @animation for each drum
for i in 0...5
@animation.push(-1)
end
#Create spritesets
@spriteset = Spriteset_Map.new
@drums = Spriteset_Drums.new
#Create windows
@help_window = Window_Drumshelp.new
@drumdummy = Drum_Dummy.new
Graphics.transition
loop do
Graphics.update
Input.update
update
if $scene != self
break
end
end
Graphics.freeze
@help_window.dispose
@spriteset.dispose
@drums.dispose
@drumdummy.dispose
#Restore Map/Menu BGM
$game_system.bgm_restore
#Restore Map/Menu BGS
$game_system.bgs_restore
#Ensure that events are updated if switch has changed
$game_map.refresh
end
#----------------------------------------------------------------------------
#*Frame update
#----------------------------------------------------------------------------
def update
if Input.trigger?(Input::B)
$scene = Scene_Map.new
end
if Input.trigger?(Input::F5)
Audio.se_play("Audio/SE/Tom-1",100,100)
@string += '1'
@animation[0] = 0
@drumdummy.refresh(0)
end
if Input.trigger?(Input::F6)
Audio.se_play("Audio/SE/Tom-2",100,100)
@string += '2'
@animation[1] = 0
@drumdummy.refresh(1)
end
if Input.trigger?(Input::F7)
Audio.se_play("Audio/SE/Tom-3",100,100)
@string += '3'
@animation[2] = 0
@drumdummy.refresh(2)
end
if Input.trigger?(Input::F8)
Audio.se_play("Audio/SE/Hi-Hat",100,100)
@string += '4'
@animation[3] = 0
@drumdummy.refresh(3)
end
if Input.trigger?(Input::C)
Audio.se_play("Audio/SE/Bassdrum",100,100)
@string += 'B'
@animation[4] = 0
@drumdummy.refresh(4)
end
#update lighting effects
animation
#Check for code input
if @required != nil
#If mode is free input
if @mode == 0
#If correct code was input
if @string == @required
Audio.se_play('Audio/SE/055-Right01',100,100)
$game_switches[@switch] = true
$scene = Scene_Map.new
end
#If mode is specific input length
elsif @mode == 1
#When string length is correct
if @string.length == @required.length
if @string == @required
Audio.se_play('Audio/SE/055-Right01',100,100)
$game_switches[@switch] = true
$scene = Scene_Map.new
else
Audio.se_play('Audio/SE/057-Wrong01',100,100)
$game_switches[@switch] = false
@string = ''
end
end
#If mode is quit after input length
elsif @mode == 2
#When string length is correct
if @string.length == @required.length
if @string == @required
Audio.se_play('Audio/SE/055-Right01',100,100)
$game_switches[@switch] = true
$scene = Scene_Map.new
else
Audio.se_play('Audio/SE/057-Wrong01',100,100)
$game_switches[@switch] = false
$scene = Scene_Map.new
end
end
end
end
end
#----------------------------------------------------------------------------
#*animation
#----------------------------------------------------------------------------
#Takes care of animating the drum's lighting effects
#----------------------------------------------------------------------------
def animation
for i in 0...@animation.size
if @animation[i] == 0
#Create lighting effect for the drum
@drumdummy.refresh(i)
end
unless @animation[i] == -1
#Progress a frame
@animation[i] += 1
if @animation[i] == 10
#Remove lighting effect
@drumdummy.clear(i)
@animation[i] = -1
end
end
end
end
end
#==============================================================================
#**Window_Drumshelp
#------------------------------------------------------------------------------
#Help window displaying the different input possibilities
#==============================================================================
class Window_Drumshelp < Window_Base
#----------------------------------------------------------------------------
#*Object initialization
#----------------------------------------------------------------------------
def initialize
super(0,0,640,64)
self.contents = Bitmap.new(width - 32, height - 32)
text = ["F5: Drum 1", "F6: Drum 2", "F7: Drum 3", "F8: Hi-Hat", "Enter: Bass"]
w = self.contents.width/text.size
for i in 0...text.size
self.contents.draw_text(i * w,0,w,32,text[i],1)
end
end
end
#==============================================================================
#**Spriteset_Drums
#------------------------------------------------------------------------------
#This class takes care of drawing the drum's graphics onscreen
#==============================================================================
class Spriteset_Drums
#----------------------------------------------------------------------------
#*Object initialization
#----------------------------------------------------------------------------
def initialize
@viewport = Viewport.new(35,95,640,480)
@viewport.z = 5000
@sprite = Sprite.new(@viewport)
@drums = RPG::Cache.picture('Rock Band Drums.png')
@sprite.bitmap = @drums
end
#----------------------------------------------------------------------------
#*Dispose
#----------------------------------------------------------------------------
def dispose
@viewport.dispose
@sprite.dispose
end
end
#==============================================================================
#**Drum_Dummy
#------------------------------------------------------------------------------
#This class draws the drum's lighting effects
#==============================================================================
class Drum_Dummy
#----------------------------------------------------------------------------
#*Object initialization
#----------------------------------------------------------------------------
def initialize
@sprite = []
@lights = RPG::Cache.picture('DrumsLights')
#Create a rect for the drums and pedal
@rect = Rect.new(1,1,130,130)
@rect2 = Rect.new(1,134,130,130)
#create a new bitmap for each drum's lighting effect
for i in 0...5
@sprite[i] = Sprite.new
@sprite[i].bitmap = Bitmap.new(640,480)
@sprite[i].z = 9999
@sprite[i].visible = false
end
end
#----------------------------------------------------------------------------
#*Refresh
#----------------------------------------------------------------------------
def refresh(drum)
#Clear lighting effect to avoid overlap
@sprite[drum].bitmap.clear
case drum
#Get coordinates based on drum
when 0
x = 43
y = 198
when 1
x = 170
y = 99
when 2
x = 335
y = 99
when 3
x = 462
y = 198
when 4
x = 255
y = 371
end
#Create correct effect in the given bitmap
if drum == 4 ? @sprite[drum].bitmap.blt(x,y,@lights,@rect2) :
@sprite[drum].bitmap.blt(x,y,@lights,@rect)
end
#Make lighting effect visible
@sprite[drum].visible = true
end
#----------------------------------------------------------------------------
#*Dispose
#----------------------------------------------------------------------------
def dispose
for i in 0...@sprite.size
@sprite[i].dispose
end
end
#----------------------------------------------------------------------------
#*clear
#----------------------------------------------------------------------------
#Removes the specified drum's lighting effect when called
#----------------------------------------------------------------------------
def clear(drum)
@sprite[drum].bitmap.clear
end
end