Save-Point

Full Version: Save-Point
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Board Message
Sorry, you do not have permission to access this resource.
Save-Point - "BGM continues after Battle"

Save-Point

Full Version: "BGM continues after Battle"
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2
In the default of RMXP, after a battle, the Map BGM will be re-played :( that's bad!
And this is an useful Script to make BGM can continue playing after battle of RMXP
But it needs a file called "Audio.dll", but I can't find out it
So someone know that file, please help me :(
Here is the Script :

Code:
#==============================================================================
# Não reinciar Música do mapa após uma batalha
# por Atoa
# Novo modulo de Audio por Poccil
#==============================================================================

class Win32API
@@RGSSWINDOW=nil
@@GetCurrentThreadId=Win32API.new('kernel32','GetCurrentThreadId', '%w()','l')
@@GetWindowThreadProcessId=Win32API.new('user32','GetWindowThreadProcessId', '%w(l p)','l')
@@FindWindowEx=Win32API.new('user32','FindWindowEx', '%w(l l p p)','l')
def Win32API.GetPrivateProfileString(section, key)
   val = "\0"*256
   gps = Win32API.new('kernel32', 'GetPrivateProfileString',%w(p p p p l p), 'l')
   gps.call(section, key, "", val, 256, ".\\Game.ini")
   val.delete!("\0")
   return val
end
end

class Thread
  def Thread.exclusive
    _old = Thread.critical
    begin
      Thread.critical = true
      return yield
    ensure
      Thread.critical = _old
    end
  end
end

class AudioContext
  attr_reader :context
  def initialize
    init = Win32API.new("audio.dll", "AudioContextInitialize", '', 'l')
    @context=init.call()
  end
  def dispose
    if @context!=0
       init = Win32API.new("audio.dll", "AudioContextFree", 'l', '')
       init.call(context)
       @context=0
    end
  end
end

$AtExitProcs=[] if !$AtExitProcs
def exit(code=0)
  for p in $AtExitProcs
    p.call
  end
  raise SystemExit.new(code)
end

def at_exit(&block)
  $AtExitProcs.push(Proc.new(&block))
end

module AudioState
  w32_LL = Win32API.new("kernel32.dll", "LoadLibrary", 'p', 'l')
  w32_FL = Win32API.new("kernel32.dll", "FreeLibrary", 'p', 'l')
  @handle = w32_LL.call("audio.dll")
  at_exit { w32_FL.call(@handle) }
  AudioContextIsActive=Win32API.new("audio.dll","AudioContextIsActive","l","l")
  AudioContextPlay=Win32API.new("audio.dll","AudioContextPlay","lpllll","")
  AudioContextStop=Win32API.new("audio.dll","AudioContextStop","l","")
  AudioContextFadeOut=Win32API.new("audio.dll","AudioContextFadeOut","ll","")
  AudioContextGetPosition=Win32API.new("audio.dll","AudioContextGetPosition","l","l")
  AudioContextFadeIn=Win32API.new("audio.dll","AudioContextFadeIn","ll","")
  AudioContextSetVolume=Win32API.new("audio.dll","AudioContextSetVolume","ll","")
  AudioContextSEPlay=Win32API.new("audio.dll","AudioContextSEPlay","lplll","")
  if !@MEContext
    @MEContext=AudioContext.new
    at_exit { @MEContext.dispose }
  end
  if !@BGMContext
    @BGMContext=AudioContext.new
    at_exit { @BGMContext.dispose }
  end
  if !@SEContext
    @SEContext=AudioContext.new
    at_exit { @SEContext.dispose }
  end
  @channel=nil
  @bgm=nil
  @name=""
  @pitch=100
  @bgmVolume=100.0
  @meVolume=100.0
  @seVolume=100.0
  def self.setWaitingBGM(bgm,volume,pitch,position)
    @waitingBGM=[bgm,volume,pitch,position]
  end
  def self.bgmActive?
    return (AudioContextIsActive.call(@BGMContext.context)!=0)
  end
  def self.meActive?
    return (AudioContextIsActive.call(@MEContext.context)!=0)
  end
  def self.waitingBGM
    @waitingBGM
  end
  def self.context
    @BGMContext.context
  end
  def self.system
    @system
  end
  def self.bgm
    @bgm
  end
  def self.name
    @name
  end
  def self.pitch
    @pitch
  end
  def self.volume
    @volume
  end
  def self.waitingBGM=(value)
    Thread.exclusive{@waitingBGM=value}
  end
  def self.volume=(value)
    @volume=value
  end
  def self.bgm=(value)
    @bgm=value
  end
  def self.name=(value)
    @name=value
  end
  def self.pitch=(value)
    @pitch=value
  end
end

def Audio_bgm_playing?
  AudioState.channel!=nil
end
def Audio_bgm_name
  AudioState.name
end
def Audio_bgm_pitch
  AudioState.pitch
end
def Audio_bgm_play(name, volume, pitch, position = 0)
  begin
    filename = canonicalize(rtpGetPath(name,[".mid",".mp3",".wma",".ogg",".wav",""]))
    if AudioState.meActive?
      AudioState.setWaitingBGM(filename,volume,pitch,position)
      return
    end
    AudioState::AudioContextPlay.call(AudioState.context,filename,volume,pitch,position,1)
    AudioState.name=filename
    AudioState.volume=volume
    AudioState.pitch=pitch
  rescue Hangup
  rescue
    p $!.message,$!.backtrace
  end
end
def Audio_bgm_stop()
  begin
    AudioState::AudioContextStop.call(AudioState.context)
    AudioState.waitingBGM=nil
    AudioState.name = ""
  rescue
    p $!.message,$!.backtrace
  end
end
def Audio_bgm_get_position
  return AudioState::AudioContextGetPosition.call(AudioState.context)
end
def Audio_bgm_fade(ms)
  AudioState::AudioContextFadeOut.call(AudioState.context,ms.to_i)
end
def Audio_bgm_fadein(ms)
  AudioState::AudioContextFadeIn.call(AudioState.context,ms.to_i)
end
def Audio_bgm_get_volume
  return 0 if !AudioState.bgmActive?
  return AudioState.volume
end
def Audio_bgm_set_volume(volume)
  return if !AudioState.bgmActive?
  AudioState.volume = volume * 1.0
  AudioState::AudioContextSetVolume.call(AudioState.context,volume.to_i)
end

module Graphics
  if !defined?(audiomodule_update)
    class << self
      alias audiomodule_update update
    end
  end
  def self.update
    Audio.update
    audiomodule_update
  end
end

module Audio
  @@musicstate=nil
  @@soundstate=nil
  def self.update
    return if Graphics.frame_count%10!=0
    if AudioState.waitingBGM && !AudioState.meActive?
      waitbgm=AudioState.waitingBGM
      AudioState.waitingBGM=nil
      bgm_play(waitbgm[0],waitbgm[1],waitbgm[2],waitbgm[3])
    end
  end
  def self.bgm_play(name,volume=80,pitch=100,position=nil)
    begin
      if position==nil || position==0
        Kernel.Audio_bgm_play(name,volume,pitch,0)
      else
        Kernel.Audio_bgm_play(name,volume,pitch,position)
        Kernel.Audio_bgm_fadein(500)
      end
    rescue Hangup
      bgm_play(name,volume,pitch,position)
    end
  end
  def self.bgm_fade(ms)
    Kernel.Audio_bgm_fade(ms)
  end
  def self.bgm_stop
    Kernel.Audio_bgm_stop()
  end
  def self.bgm_position
    ret=Kernel.Audio_bgm_get_position
    return ret
  end
end

module Win32
  class Registry
    module Constants
      HKEY_CLASSES_ROOT = 0x80000000
      HKEY_CURRENT_USER = 0x80000001
      HKEY_LOCAL_MACHINE = 0x80000002
      HKEY_USERS = 0x80000003
      HKEY_PERFORMANCE_DATA = 0x80000004
      HKEY_PERFORMANCE_TEXT = 0x80000050
      HKEY_PERFORMANCE_NLSTEXT = 0x80000060
      HKEY_CURRENT_CONFIG = 0x80000005
      HKEY_DYN_DATA = 0x80000006
      REG_NONE = 0
      REG_SZ = 1
      REG_EXPAND_SZ = 2
      REG_BINARY = 3
      REG_DWORD = 4
      REG_DWORD_LITTLE_ENDIAN = 4
      REG_DWORD_BIG_ENDIAN = 5
      REG_LINK = 6
      REG_MULTI_SZ = 7
      REG_RESOURCE_LIST = 8
      REG_FULL_RESOURCE_DESCRIPTOR = 9
      REG_RESOURCE_REQUIREMENTS_LIST = 10
      REG_QWORD = 11
      REG_QWORD_LITTLE_ENDIAN = 11
      STANDARD_RIGHTS_READ = 0x00020000
      STANDARD_RIGHTS_WRITE = 0x00020000
      KEY_QUERY_VALUE = 0x0001
      KEY_SET_VALUE = 0x0002
      KEY_CREATE_SUB_KEY = 0x0004
      KEY_ENUMERATE_SUB_KEYS = 0x0008
      KEY_NOTIFY = 0x0010
      KEY_CREATE_LINK = 0x0020
      KEY_READ = STANDARD_RIGHTS_READ |
        KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
      KEY_WRITE = STANDARD_RIGHTS_WRITE |
        KEY_SET_VALUE | KEY_CREATE_SUB_KEY
      KEY_EXECUTE = KEY_READ
      KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK
      REG_OPTION_RESERVED = 0x0000
      REG_OPTION_NON_VOLATILE = 0x0000
      REG_OPTION_VOLATILE = 0x0001
      REG_OPTION_CREATE_LINK = 0x0002
      REG_OPTION_BACKUP_RESTORE = 0x0004
      REG_OPTION_OPEN_LINK = 0x0008
      REG_LEGAL_OPTION = REG_OPTION_RESERVED |
        REG_OPTION_NON_VOLATILE | REG_OPTION_CREATE_LINK |
        REG_OPTION_BACKUP_RESTORE | REG_OPTION_OPEN_LINK
      REG_CREATED_NEW_KEY = 1
      REG_OPENED_EXISTING_KEY = 2
      REG_WHOLE_HIVE_VOLATILE = 0x0001
      REG_REFRESH_HIVE = 0x0002
      REG_NO_LAZY_FLUSH = 0x0004
      REG_FORCE_RESTORE = 0x0008
      MAX_KEY_LENGTH = 514
      MAX_VALUE_LENGTH = 32768
    end
    include Constants
    include Enumerable
    class Error < ::StandardError
      FormatMessageA=Win32API.new('kernel32.dll','FormatMessageA','LPLLPLP','L')
      def initialize(code)
        @code = code
        msg = "\0" * 1024
        len = FormatMessageA.call(0x1200, 0, code, 0, msg, 1024, 0)
        super msg[0, len].tr("\r", '').chomp
      end
      attr_reader :code
    end
    class PredefinedKey < Registry
      def initialize(hkey, keyname)
        @hkey = hkey
        @parent = nil
        @keyname = keyname
        @disposition = REG_OPENED_EXISTING_KEY
      end
      def close
        raise Error.new(5)
      end
      def class
        Registry
      end
      Constants.constants.grep(/^HKEY_/) do |c|
        Registry.const_set c, new(Constants.const_get(c), c)
      end
    end
    module API
      [
        %w/RegOpenKeyExA    LPLLP        L/,
        %w/RegCreateKeyExA  LPLLLLPPP    L/,
        %w/RegEnumValueA    LLPPPPPP     L/,
        %w/RegEnumKeyExA    LLPPLLLP     L/,
        %w/RegQueryValueExA LPLPPP       L/,
        %w/RegSetValueExA   LPLLPL       L/,
        %w/RegFlushKey      L            L/,
        %w/RegCloseKey      L            L/,
        %w/RegQueryInfoKey  LPPPPPPPPPPP L/,
      ].each do |fn|
        const_set fn[0].intern, Win32API.new('advapi32.dll', *fn)
      end
      module_function
      def check(result)
        raise Error, result, caller(2) if result != 0
      end
      def packdw(dw)
        [dw].pack('V')
      end
      def unpackdw(dw)
        dw += [0].pack('V')
        dw.unpack('V')[0]
      end
      def packqw(qw)
        [ qw & 0xFFFFFFFF, qw >> 32 ].pack('VV')
      end
      def unpackqw(qw)
        qw = qw.unpack('VV')
        (qw[1] << 32) | qw[0]
      end
      def OpenKey(hkey, name, opt, desired)
        result = packdw(0)
        check RegOpenKeyExA.call(hkey, name, opt, desired, result)
        unpackdw(result)
      end
      def CreateKey(hkey, name, opt, desired)
        result = packdw(0)
        disp = packdw(0)
        check RegCreateKeyExA.call(hkey, name, 0, 0, opt, desired,
                                   0, result, disp)
        [ unpackdw(result), unpackdw(disp) ]
      end
      def EnumValue(hkey, index)
        name = ' ' * Constants::MAX_KEY_LENGTH
        size = packdw(Constants::MAX_KEY_LENGTH)
        check RegEnumValueA.call(hkey, index, name, size, 0, 0, 0, 0)
        name[0, unpackdw(size)]
      end
      def EnumKey(hkey, index)
        name = ' ' * Constants::MAX_KEY_LENGTH
        size = packdw(Constants::MAX_KEY_LENGTH)
        wtime = ' ' * 8
        check RegEnumKeyExA.call(hkey, index, name, size, 0, 0, 0, wtime)
        [ name[0, unpackdw(size)], unpackqw(wtime) ]
      end
      def QueryValue(hkey, name)
        type = packdw(0)
        size = packdw(0)
        check RegQueryValueExA.call(hkey, name, 0, type, 0, size)
        data = ' ' * unpackdw(size)
        check RegQueryValueExA.call(hkey, name, 0, type, data, size)
        [ unpackdw(type), data[0, unpackdw(size)] ]
      end
      def SetValue(hkey, name, type, data, size)
        check RegSetValueExA.call(hkey, name, 0, type, data, size)
      end
      def FlushKey(hkey)
        check RegFlushKey.call(hkey)
      end
      def CloseKey(hkey)
        check RegCloseKey.call(hkey)
      end
      def QueryInfoKey(hkey)
        subkeys = packdw(0)
        maxsubkeylen = packdw(0)
        values = packdw(0)
        maxvaluenamelen = packdw(0)
        maxvaluelen = packdw(0)
        secdescs = packdw(0)
        wtime = ' ' * 8
        check RegQueryInfoKey.call(hkey, 0, 0, 0, subkeys, maxsubkeylen, 0,
          values, maxvaluenamelen, maxvaluelen, secdescs, wtime)
        [ unpackdw(subkeys), unpackdw(maxsubkeylen), unpackdw(values),
          unpackdw(maxvaluenamelen), unpackdw(maxvaluelen),
          unpackdw(secdescs), unpackqw(wtime) ]
      end
    end
    def self.expand_environ(str)
      str.gsub(/%([^%]+)%/) { ENV[$1] || $& }
    end
    @@type2name = { }
    %w[
      REG_NONE REG_SZ REG_EXPAND_SZ REG_BINARY REG_DWORD
      REG_DWORD_BIG_ENDIAN REG_LINK REG_MULTI_SZ
      REG_RESOURCE_LIST REG_FULL_RESOURCE_DESCRIPTOR
      REG_RESOURCE_REQUIREMENTS_LIST REG_QWORD
    ].each do |type|
      @@type2name[Constants.const_get(type)] = type
    end
    def self.type2name(type)
      @@type2name[type] || type.to_s
    end
    def self.wtime2time(wtime)
      Time.at((wtime - 116444736000000000) / 10000000)
    end
    def self.time2wtime(time)
      time.to_i * 10000000 + 116444736000000000
    end
    private_class_method :new
    def self.open(hkey, subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED)
      subkey = subkey.chomp('\\')
      begin
        newkey = API.OpenKey(hkey.hkey, subkey, opt, desired)
      rescue Error
        return nil
      end
      obj = new(newkey, hkey, subkey, REG_OPENED_EXISTING_KEY)
      if block_given?
        begin
          yield obj
        ensure
          obj.close
        end
      else
        obj
      end
    end
    def self.create(hkey, subkey, desired = KEY_ALL_ACCESS, opt = 0x0000)
      newkey, disp = API.CreateKey(hkey.hkey, subkey, opt, desired)
      obj = new(newkey, hkey, subkey, disp)
      if block_given?
        begin
          yield obj
        ensure
          obj.close
        end
      else
        obj
      end
    end
    @@final = proc { |hkey| proc { API.CloseKey(hkey[0]) if hkey[0] } }
    def initialize(hkey, parent, keyname, disposition)
      @hkey = hkey
      @parent = parent
      @keyname = keyname
      @disposition = disposition
      @hkeyfinal = [ hkey ]
      ObjectSpace.define_finalizer self, @@final.call(@hkeyfinal)
    end
    attr_reader :hkey, :parent, :keyname, :disposition
    def created?
      @disposition == REG_CREATED_NEW_KEY
    end
    def open?
      !@hkey.nil?
    end
    def name
      parent = self
      name = @keyname
      while parent = parent.parent
        name = parent.keyname + '\\' + name
      end
      name
    end
    def inspect
      "\#<Win32::Registry key=#{name.inspect}>"
    end
    def _dump(depth)
      raise TypeError, "can't dump Win32::Registry"
    end
    def open(subkey, desired = KEY_READ, opt = REG_OPTION_RESERVED, &blk)
      self.class.open(self, subkey, desired, opt, &blk)
    end
    def create(subkey, desired = KEY_ALL_ACCESS, opt = REG_OPTION_RESERVED, &blk)
      self.class.create(self, subkey, desired, opt, &blk)
    end
    def close
      API.CloseKey(@hkey)
      @hkey = @parent = @keyname = nil
      @hkeyfinal[0] = nil
    end
    def each_value
      index = 0
      while true
        begin
          subkey = API.EnumValue(@hkey, index)
        rescue Error
          break
        end
        begin
          type, data = read(subkey)
        rescue Error
          next
        end
        yield subkey, type, data
        index += 1
      end
      index
    end
    alias each each_value
    def each_key
      index = 0
      while true
        begin
          subkey, wtime = API.EnumKey(@hkey, index)
        rescue Error
          break
        end
        yield subkey, wtime
        index += 1
      end
      index
    end
    def keys
      keys_ary = []
      each_key { |key,| keys_ary << key }
      keys_ary
    end
    def read(name, *rtype)
      type, data = API.QueryValue(@hkey, name)
      unless rtype.empty? or rtype.include?(type)
        string = "Type mismatch (expect #{rtype.inspect} but #{type} present)"
        raise TypeError, string
      end
      case type
      when REG_SZ, REG_EXPAND_SZ
        [ type, data.chop ]
      when REG_MULTI_SZ
        [ type, data.split(/\0/) ]
      when REG_BINARY
        [ type, data ]
      when REG_DWORD
        [ type, API.unpackdw(data) ]
      when REG_DWORD_BIG_ENDIAN
        [ type, data.unpack('N')[0] ]
      when REG_QWORD
        [ type, API.unpackqw(data) ]
      else
        raise TypeError, "Type #{type} is not supported."
      end
    end
    def [](name, *rtype)
      type, data = read(name, *rtype)
      case type
      when REG_SZ, REG_DWORD, REG_QWORD, REG_MULTI_SZ
        data
      when REG_EXPAND_SZ
        Registry.expand_environ(data)
      else
        raise TypeError, "Type #{type} is not supported."
      end
    end
    def read_s(name)
      read(name, REG_SZ)[1]
    end
    def read_s_expand(name)
      type, data = read(name, REG_SZ, REG_EXPAND_SZ)
      if type == REG_EXPAND_SZ
        Registry.expand_environ(data)
      else
        data
      end
    end
    def read_i(name)
      read(name, REG_DWORD, REG_DWORD_BIG_ENDIAN, REG_QWORD)[1]
    end
    def read_bin(name)
      read(name, REG_BINARY)[1]
    end
    def write(name, type, data)
      case type
      when REG_SZ, REG_EXPAND_SZ
        data = data.to_s + "\0"
      when REG_MULTI_SZ
        data = data.to_a.join("\0") + "\0\0"
      when REG_BINARY
        data = data.to_s
      when REG_DWORD
        data = API.packdw(data.to_i)
      when REG_DWORD_BIG_ENDIAN
        data = [data.to_i].pack('N')
      when REG_QWORD
        data = API.packqw(data.to_i)
      else
        raise TypeError, "Unsupported type #{type}"
      end
      API.SetValue(@hkey, name, type, data, data.length)
    end
    def []=(name, rtype, value = nil)
      if value
        write name, rtype, value
      else
        case value = rtype
        when Integer
          write name, REG_DWORD, value
        when String
          write name, REG_SZ, value
        when Array
          write name, REG_MULTI_SZ, value
        else
          raise TypeError, "Unexpected type #{value.class}"
        end
      end
      value
    end
    def write_s(name, value)
      write name, REG_SZ, value.to_s
    end
    def write_i(name, value)
      write name, REG_DWORD, value.to_i
    end
    def write_bin(name, value)
      write name, REG_BINARY, value.to_s
    end
    def flush
      API.FlushKey @hkey
    end
    def info
      API.QueryInfoKey(@hkey)
    end
    %w[
      num_keys max_key_length
      num_values max_value_name_length max_value_length
      descriptor_length wtime
    ].each_with_index do |s, i|
      eval <<-__END__
        def #{s}
          info[#{i}]
        end
      __END__
    end
  end
end

def getExistingPath(file,extensions=[])
  return file if FileTest.exist?(file)
  if extensions
    for ext in extensions
      fullfile=file+ext
      return fullfile if FileTest.exist?(fullfile)
    end
  end
  return nil
end

def rtpGetDirectory(key,rtpname)
  rtp=Win32API.GetPrivateProfileString("Game",rtpname)
  return nil if !rtp || rtp==""
  begin
    path=key.read_s(rtp)
    if path && path!=""
      return path
    end
    return nil
  rescue
    return nil
  end
end

def rtpGetPathHelper(key,rtpname,file,extensions)
  path=rtpGetDirectory(key,rtpname)
  return path ? getExistingPath(path+"\\"+file,extensions) : nil
end

def chdirRTP(rtpname)
  Win32::Registry.open(
  Win32::Registry::HKEY_LOCAL_MACHINE,"SOFTWARE\\Enterbrain\\RGSS\\RTP"){|key|
  path=rtpGetDirectory(key,rtpname)
  if path && path!=""
    if block_given?
      Dir.chdir(path){ yield }
    else
      Dir.chdir(path)
    end
  end
  }
end

def rtpGetPath(file,extensions=[])
  path=getExistingPath(file,extensions)
  if !path
    Win32::Registry.open(
    Win32::Registry::HKEY_LOCAL_MACHINE,"SOFTWARE\\Enterbrain\\RGSS\\RTP"){|key|
    path=rtpGetPathHelper(key,"RTP1",file,extensions)
    path=rtpGetPathHelper(key,"RTP2",file,extensions) if !path
    path=rtpGetPathHelper(key,"RTP3",file,extensions) if !path  }
  end
  return path
end


def getPlayMusic
  begin
    ret=true
    Win32::Registry.open(
    Win32::Registry::HKEY_CURRENT_USER,"SOFTWARE\\Enterbrain\\RGSS"){|key|
    ret=(key["PlayMusic"] == 1)}
    return ret
  rescue
    return true
  end
end

def getPlaySound
  begin
    ret=true
    Win32::Registry.open(
    Win32::Registry::HKEY_CURRENT_USER,"SOFTWARE\\Enterbrain\\RGSS"){|key|
    ret=(key["PlaySound"] == 1)}
    return ret
  rescue
    p $!.message,$!.class.name
    return true
  end
end

module FileTest
  Image_ext = ['.bmp', '.png', '.jpg', '.jpeg']
  Audio_ext = ['.mp3', '.mid', '.midi', '.ogg', '.wav', '.wma']
  def self.audio_exist?(filename)
    return !rtpGetPath(filename,Audio_ext).nil?
  end
  def self.image_exist?(filename)
    return !rtpGetPath(filename,Image_ext).nil?
  end
end

class Hangup < Exception
end

def strsplit(str,re)
  ret=[]
  tstr=str
  while re=~tstr
    ret[ret.length]=$~.pre_match
    tstr=$~.post_match
  end
  ret[ret.length]=tstr if ret.length
  return ret
end

def canonicalize(c)
  csplit=strsplit(c,/[\/\\]/)
  pos=-1
  ret=[]
  retstr=""
  for x in csplit
    if x=="."
    elsif x==".."
      if pos>=0
        ret.delete_at(pos)
        pos-=1
      end
    else
      ret.push(x)
      pos+=1
    end
  end
  for i in 0...ret.length
    retstr+="/" if i>0
    retstr+=ret[i]
  end
  return retstr
end

class Game_System
  attr_accessor :bgm_position
  def audioBgmPlay(str,vol,pitch,position)
    Audio.bgm_play(str,vol,pitch,position)
  end
  def audioBgmFade(time)
    Audio.bgm_fade(time)    
  end
  def audioBgmStop
    Audio.bgm_stop
  end
  def bgm_play_ex(bgm,volume,pitch,setplaying,position=0)
    if bgm.is_a?(String)
      bgm=RPG::AudioFile.new(bgm,volume,pitch)
    end
    if setplaying
      @playing_bgm = bgm==nil ? nil : bgm.clone
    end
    if bgm != nil and bgm.name != ""
      audioBgmPlay("Audio/BGM/" + bgm.name, bgm.volume, bgm.pitch,position) if !@defaultBGM
    else
      audioBgmStop if !@defaultBGM
    end
    if @defaultBGM
      audioBgmPlay("Audio/BGM/"+@defaultBGM.name, @defaultBGM.volume,@defaultBGM.pitch,position)
    end
    Graphics.frame_reset
  end
  def bgm_play(bgm,volume=100,pitch=100,position=0)
    bgm_play_ex(bgm,volume,pitch,true,position)
  end
  def bgm_stop
    @bgm_position=0
    @playing_bgm = nil
    audioBgmStop if !@defaultBGM
  end
  def bgm_fade(time)
    @playing_bgm = nil
    audioBgmFade((time * 1000).floor) if !@defaultBGM
  end
  def getPlayingBGM
    return @playing_bgm ? @playing_bgm.clone : nil
  end
  def bgm_memorize
    @memorized_bgm = @playing_bgm
  end
  def bgm_restore
    bgm_play(@memorized_bgm)
  end
  def setDefaultBGM(bgm,volume=100,pitch=100)
    if bgm.is_a?(String)
      bgm=RPG::AudioFile.new(bgm,volume,pitch)
    end
    if bgm != nil and bgm.name != ""
      @defaultBGM=bgm==nil ? nil : bgm.clone
      Audio.bgm_play("Audio/BGM/"+bgm.name)
    else
      @defaultBGM=nil
      self.bgm_play(@playing_bgm)
    end
  end
  def bgm_pause(fadetime=0.0)
    pos=Audio.bgm_position
    if fadetime>0.0
      bgm_fade(fadetime)
    end
    @bgm_position=pos
  end
  def bgm_unpause
    @bgm_position=0
  end
  def bgm_resume(bgm,volume=100,pitch=100);
    bgm_play(bgm,volume,pitch,@bgm_position)
    @bgm_position=0
  end  
end

#==============================================================================
# Scene_Map
#==============================================================================
class Scene_Map
def call_battle
    $game_temp.battle_calling = false
    $game_temp.menu_calling = false
    $game_temp.menu_beep = false
    $game_player.make_encounter_count
    $playingBGM=$game_system.playing_bgm
    $game_system.bgm_pause
    $game_system.se_play($data_system.battle_start_se)
    $game_system.bgm_play($game_system.battle_bgm)
    $game_player.straighten
    $scene = Scene_Battle.new
  end
end

#==============================================================================
# Scene_Battle
#==============================================================================
class Scene_Battle
  #--------------------------------------------------------------------------
  alias battle_end_alias battle_end
  def battle_end(result)
    battle_end_alias(result)
    Audio.me_stop
    $game_system.bgm_resume($playingBGM)
  end
end

!
That Win32API call is referencing an audio dll command, but it's part of the Windows system. I make calls like this for Mousie and others, so it should be in the Windows environment.

Meanwhile, you may be interested in Mimi's Battle Music, as it lets you change the battle music in your game based on backgrounds, lead actors... and has a 'Map Music for Battle Music'. This means your field music plays straight through your battle and you don't use a battlemusic theme... if that's your intent.
There is the file, just put it in the game folder. I use the same script for my project, so it should work.

http://www24.zippyshare.com/v/21490035/file.html
This looks like a script I'd also find useful... but even with the Audio.dll it doesn't work. I get the error: undefined local variable or method 'position' for Kernal:Module... followed by loads of section references...? Then the game continues to run but no music.
(07-08-2012, 09:12 PM)Ace Wrote: [ -> ]There is the file, just put it in the game folder. I use the same script for my project, so it should work.

http://www24.zippyshare.com/v/21490035/file.html
Thanks very much, but your file doesn't work :( it made bugs
Please check my attachments

@ DerVvulfman : thanks, but Mimi's Demo doesn't have the system I need "BGM of Maps continue playing after Battles" :(

!
Yep, the same error as far as I can see. :V
Ok... Let me get this straight. You want a BGM to save where it is and then continue after a battle from that point.
Would you settle for something in between, say, that the BGM isn't restarted, but doesn't follow on exactly where it stopped?
What I mean is that the BGM would continue on in the background silently while the battle music was playing, and then be turned up again after the battle.

It isn't exactly what you wanted but it does avoid that awkward "have to restart the music every time!!! GAH!" problem.

If so, you should check out DerVVulfman's awesome multi-channel audio script which would allow you to achieve that quite easily. ;)
(07-09-2012, 03:56 PM)MetalRenard Wrote: [ -> ]Ok... Let me get this straight. You want a BGM to save where it is and then continue after a battle from that point.
Would you settle for something in between, say, that the BGM isn't restarted, but doesn't follow on exactly where it stopped?
What I mean is that the BGM would continue on in the background silently while the battle music was playing, and then be turned up again after the battle.

It isn't exactly what you wanted but it does avoid that awkward "have to restart the music every time!!! GAH!" problem.

If so, you should check out DerVVulfman's awesome multi-channel audio script which would allow you to achieve that quite easily. ;)
Oh yeah, so please send me that demo ?

?
http://save-point.org/thread-3981.html
This is it.

What you need to do is leave the map's BGM running in channel 1 and at the start of battle, turn it down to 0 and play the battle music in channel 2. After the battle just stop channel 2 and turn channel 1's audio back up to normal.
I got this script to work!

http://www.santuariorpgmaker.com/forum/i...topic=5174
Grab the original script and DLL from here. If you have a different battle setup, make sure to consider this when recording and retrieving "$playingBGM".
Pages: 1 2