#=============================================================================== # #=============================================================================== class PokemonSystem attr_accessor :textspeed attr_accessor :battlescene attr_accessor :battlestyle attr_accessor :frame attr_accessor :textskin attr_accessor :screensize attr_accessor :language attr_accessor :runstyle attr_accessor :bgmvolume attr_accessor :sevolume attr_accessor :textinput def initialize @textspeed = 1 # Text speed (0=slow, 1=normal, 2=fast) @battlescene = 0 # Battle effects (animations) (0=on, 1=off) @battlestyle = 0 # Battle style (0=switch, 1=set) @frame = 0 # Default window frame (see also Settings::MENU_WINDOWSKINS) @textskin = 0 # Speech frame @screensize = (Settings::SCREEN_SCALE * 2).floor - 1 # 0=half size, 1=full size, 2=full-and-a-half size, 3=double size @language = 0 # Language (see also Settings::LANGUAGES in script PokemonSystem) @runstyle = 0 # Default movement speed (0=walk, 1=run) @bgmvolume = 100 # Volume of background music and ME @sevolume = 100 # Volume of sound effects @textinput = 0 # Text input mode (0=cursor, 1=keyboard) end end #=============================================================================== # #=============================================================================== module PropertyMixin def get (@getProc) ? @getProc.call : nil end def set(value) @setProc.call(value) if @setProc end end #=============================================================================== # #=============================================================================== class EnumOption include PropertyMixin attr_reader :values attr_reader :name def initialize(name,options,getProc,setProc) @name = name @values = options @getProc = getProc @setProc = setProc end def next(current) index = current+1 index = @values.length-1 if index>@values.length-1 return index end def prev(current) index = current-1 index = 0 if index<0 return index end end #=============================================================================== # #=============================================================================== class EnumOption2 include PropertyMixin attr_reader :values attr_reader :name def initialize(name,options,getProc,setProc) @name = name @values = options @getProc = getProc @setProc = setProc end def next(current) index = current+1 index = @values.length-1 if index>@values.length-1 return index end def prev(current) index = current-1 index = 0 if index<0 return index end end #=============================================================================== # #=============================================================================== class NumberOption include PropertyMixin attr_reader :name attr_reader :optstart attr_reader :optend def initialize(name,optstart,optend,getProc,setProc) @name = name @optstart = optstart @optend = optend @getProc = getProc @setProc = setProc end def next(current) index = current+@optstart index += 1 index = @optstart if index>@optend return index-@optstart end def prev(current) index = current+@optstart index -= 1 index = @optend if index<@optstart return index-@optstart end end #=============================================================================== # #=============================================================================== class SliderOption include PropertyMixin attr_reader :name attr_reader :optstart attr_reader :optend def initialize(name,optstart,optend,optinterval,getProc,setProc) @name = name @optstart = optstart @optend = optend @optinterval = optinterval @getProc = getProc @setProc = setProc end def next(current) index = current+@optstart index += @optinterval index = @optend if index>@optend return index-@optstart end def prev(current) index = current+@optstart index -= @optinterval index = @optstart if index<@optstart return index-@optstart end end #=============================================================================== # Main options list #=============================================================================== class Window_PokemonOption < Window_DrawableCommand attr_reader :mustUpdateOptions def initialize(options,x,y,width,height) @options = options @nameBaseColor = Color.new(24*8,15*8,0) @nameShadowColor = Color.new(31*8,22*8,10*8) @selBaseColor = Color.new(31*8,6*8,3*8) @selShadowColor = Color.new(31*8,17*8,16*8) @optvalues = [] @mustUpdateOptions = false for i in 0...@options.length @optvalues[i] = 0 end super(x,y,width,height) end def [](i) return @optvalues[i] end def []=(i,value) @optvalues[i] = value refresh end def setValueNoRefresh(i,value) @optvalues[i] = value end def itemCount return @options.length+1 end def drawItem(index,_count,rect) rect = drawCursor(index,rect) optionname = (index==@options.length) ? _INTL("Cancel") : @options[index].name optionwidth = rect.width*9/20 pbDrawShadowText(self.contents,rect.x,rect.y,optionwidth,rect.height,optionname, @nameBaseColor,@nameShadowColor) return if index==@options.length if @options[index].is_a?(EnumOption) if @options[index].values.length>1 totalwidth = 0 for value in @options[index].values totalwidth += self.contents.text_size(value).width end spacing = (optionwidth-totalwidth)/(@options[index].values.length-1) spacing = 0 if spacing<0 xpos = optionwidth+rect.x ivalue = 0 for value in @options[index].values pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value, (ivalue==self[index]) ? @selBaseColor : self.baseColor, (ivalue==self[index]) ? @selShadowColor : self.shadowColor ) xpos += self.contents.text_size(value).width xpos += spacing ivalue += 1 end else pbDrawShadowText(self.contents,rect.x+optionwidth,rect.y,optionwidth,rect.height, optionname,self.baseColor,self.shadowColor) end elsif @options[index].is_a?(NumberOption) value = _INTL("Type {1}/{2}",@options[index].optstart+self[index], @options[index].optend-@options[index].optstart+1) xpos = optionwidth+rect.x pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value, @selBaseColor,@selShadowColor) elsif @options[index].is_a?(SliderOption) value = sprintf(" %d",@options[index].optend) sliderlength = optionwidth-self.contents.text_size(value).width xpos = optionwidth+rect.x self.contents.fill_rect(xpos,rect.y-2+rect.height/2, optionwidth-self.contents.text_size(value).width,4,self.baseColor) self.contents.fill_rect( xpos+(sliderlength-8)*(@options[index].optstart+self[index])/@options[index].optend, rect.y-8+rect.height/2, 8,16,@selBaseColor) value = sprintf("%d",@options[index].optstart+self[index]) xpos += optionwidth-self.contents.text_size(value).width pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value, @selBaseColor,@selShadowColor) else value = @options[index].values[self[index]] xpos = optionwidth+rect.x pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value, @selBaseColor,@selShadowColor) end end def update oldindex = self.index @mustUpdateOptions = false super dorefresh = (self.index!=oldindex) if self.active && self.index<@options.length if Input.repeat?(Input::LEFT) self[self.index] = @options[self.index].prev(self[self.index]) dorefresh = true @mustUpdateOptions = true elsif Input.repeat?(Input::RIGHT) self[self.index] = @options[self.index].next(self[self.index]) dorefresh = true @mustUpdateOptions = true end end refresh if dorefresh end end #=============================================================================== # Options main screen #=============================================================================== class PokemonOption_Scene def pbUpdate pbUpdateSpriteHash(@sprites) end def pbStartScene(inloadscreen=false) @sprites = {} @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprites["title"] = Window_UnformattedTextPokemon.newWithSize( _INTL("Options"),0,0,Graphics.width,64,@viewport) @sprites["textbox"] = pbCreateMessageWindow @sprites["textbox"].text = _INTL("Speech frame {1}.",1+$PokemonSystem.textskin) @sprites["textbox"].letterbyletter = false pbSetSystemFont(@sprites["textbox"].contents) # These are the different options in the game. To add an option, define a # setter and a getter for that option. To delete an option, comment it out # or delete it. The game's options may be placed in any order. @PokemonOptions = [ SliderOption.new(_INTL("Music Volume"),0,100,5, proc { $PokemonSystem.bgmvolume }, proc { |value| if $PokemonSystem.bgmvolume!=value $PokemonSystem.bgmvolume = value if $game_system.playing_bgm!=nil && !inloadscreen playingBGM = $game_system.getPlayingBGM $game_system.bgm_pause $game_system.bgm_resume(playingBGM) end end } ), SliderOption.new(_INTL("SE Volume"),0,100,5, proc { $PokemonSystem.sevolume }, proc { |value| if $PokemonSystem.sevolume!=value $PokemonSystem.sevolume = value if $game_system.playing_bgs!=nil $game_system.playing_bgs.volume = value playingBGS = $game_system.getPlayingBGS $game_system.bgs_pause $game_system.bgs_resume(playingBGS) end pbPlayCursorSE end } ), EnumOption.new(_INTL("Text Speed"),[_INTL("Slow"),_INTL("Normal"),_INTL("Fast")], proc { $PokemonSystem.textspeed }, proc { |value| $PokemonSystem.textspeed = value MessageConfig.pbSetTextSpeed(MessageConfig.pbSettingToTextSpeed(value)) } ), EnumOption.new(_INTL("Battle Effects"),[_INTL("On"),_INTL("Off")], proc { $PokemonSystem.battlescene }, proc { |value| $PokemonSystem.battlescene = value } ), EnumOption.new(_INTL("Battle Style"),[_INTL("Switch"),_INTL("Set")], proc { $PokemonSystem.battlestyle }, proc { |value| $PokemonSystem.battlestyle = value } ), EnumOption.new(_INTL("Default Movement"),[_INTL("Walking"),_INTL("Running")], proc { $PokemonSystem.runstyle }, proc { |value| $PokemonSystem.runstyle = value } ), NumberOption.new(_INTL("Speech Frame"),1,Settings::SPEECH_WINDOWSKINS.length, proc { $PokemonSystem.textskin }, proc { |value| $PokemonSystem.textskin = value MessageConfig.pbSetSpeechFrame("Graphics/Windowskins/" + Settings::SPEECH_WINDOWSKINS[value]) } ), NumberOption.new(_INTL("Menu Frame"),1,Settings::MENU_WINDOWSKINS.length, proc { $PokemonSystem.frame }, proc { |value| $PokemonSystem.frame = value MessageConfig.pbSetSystemFrame("Graphics/Windowskins/" + Settings::MENU_WINDOWSKINS[value]) } ), EnumOption.new(_INTL("Text Entry"),[_INTL("Cursor"),_INTL("Keyboard")], proc { $PokemonSystem.textinput }, proc { |value| $PokemonSystem.textinput = value } ), EnumOption.new(_INTL("Screen Size"),[_INTL("S"),_INTL("M"),_INTL("L"),_INTL("XL"),_INTL("Full")], proc { [$PokemonSystem.screensize, 4].min }, proc { |value| if $PokemonSystem.screensize != value $PokemonSystem.screensize = value pbSetResizeFactor($PokemonSystem.screensize) end } ) ] @PokemonOptions = pbAddOnOptions(@PokemonOptions) @sprites["option"] = Window_PokemonOption.new(@PokemonOptions,0, @sprites["title"].height,Graphics.width, Graphics.height-@sprites["title"].height-@sprites["textbox"].height) @sprites["option"].viewport = @viewport @sprites["option"].visible = true # Get the values of each option for i in 0...@PokemonOptions.length @sprites["option"].setValueNoRefresh(i,(@PokemonOptions[i].get || 0)) end @sprites["option"].refresh pbDeactivateWindows(@sprites) pbFadeInAndShow(@sprites) { pbUpdate } end def pbAddOnOptions(options) return options end def pbOptions oldSystemSkin = $PokemonSystem.frame # Menu oldTextSkin = $PokemonSystem.textskin # Speech pbActivateWindow(@sprites,"option") { loop do Graphics.update Input.update pbUpdate if @sprites["option"].mustUpdateOptions # Set the values of each option for i in 0...@PokemonOptions.length @PokemonOptions[i].set(@sprites["option"][i]) end if $PokemonSystem.textskin!=oldTextSkin @sprites["textbox"].setSkin(MessageConfig.pbGetSpeechFrame()) @sprites["textbox"].text = _INTL("Speech frame {1}.",1+$PokemonSystem.textskin) oldTextSkin = $PokemonSystem.textskin end if $PokemonSystem.frame!=oldSystemSkin @sprites["title"].setSkin(MessageConfig.pbGetSystemFrame()) @sprites["option"].setSkin(MessageConfig.pbGetSystemFrame()) oldSystemSkin = $PokemonSystem.frame end end if Input.trigger?(Input::BACK) break elsif Input.trigger?(Input::USE) break if @sprites["option"].index==@PokemonOptions.length end end } end def pbEndScene pbPlayCloseMenuSE pbFadeOutAndHide(@sprites) { pbUpdate } # Set the values of each option for i in 0...@PokemonOptions.length @PokemonOptions[i].set(@sprites["option"][i]) end pbDisposeMessageWindow(@sprites["textbox"]) pbDisposeSpriteHash(@sprites) pbRefreshSceneMap @viewport.dispose end end #=============================================================================== # #=============================================================================== class PokemonOptionScreen def initialize(scene) @scene = scene end def pbStartScreen(inloadscreen=false) @scene.pbStartScene(inloadscreen) @scene.pbOptions @scene.pbEndScene end end