def pbAddScriptTexts(items,script)
script.scan(/(?:_I)\s*\(\s*"((?:[^\\"]*\\"?)*[^"]*)"/){|s|
string=s[0]
string.gsub!(/\\"/,""")
string.gsub!(/\\\\/,"\")
items.push(string)
}
end
def pbSetTextMessages
Graphics.update
begin
mapinfos = load_data("Data/MapInfos.rxdata")
t = Time.now.to_i
messages=[]
texts=[]
for script in $RGSS_SCRIPTS
if Time.now.to_i - t >= 5
t = Time.now.to_i
Graphics.update
end
scr=Zlib::Inflate.inflate(script[2])
scr.scan(/(?:_INTL|_ISPRINTF)\s*\(\s*"((?:[^\\"]*\\"?)*[^"]*)"/){|s|
string=s[0]
string.gsub!(/\\r/,"\r")
string.gsub!(/\\n/,"\n")
string.gsub!(/\\"/,""")
string.gsub!(/\\\\/,"\")
texts.push(string)
}
end
mapnames=[]
for id in mapinfos.keys
mapnames[id]=mapinfos[id].name
end
MessageTypes.setMessages(MessageTypes::MapNames,mapnames)
MessageTypes.setMapMessagesAsHash(0,texts)
for id in mapinfos.keys
if Time.now.to_i - t >= 5
t = Time.now.to_i
Graphics.update
end
filename=sprintf("Data/Map%03d.rxdata",id)
next if !FileTest.exist?(filename)
map = load_data(filename)
items=[]
choices=[]
for event in map.events.values
if Time.now.to_i - t >= 5
t = Time.now.to_i
Graphics.update
end
begin
for i in 0...event.pages.size
neednewline=false
lastitem=""
for j in 0...event.pages[i].list.size
list = event.pages[i].list[j]
if neednewline && list.code!=401
if lastitem!=""
lastitem.gsub!(/([^\.\!\?])\s\s+/){|m| $1+" "}
items.push(lastitem)
lastitem=""
end
neednewline=false
end
if list.code == 101
lastitem+="#{list.parameters[0]}"
neednewline=true
elsif list.code == 102
for k in 0...list.parameters[0].length
choices.push(list.parameters[0][k])
end
neednewline=false
elsif list.code == 401
lastitem+=" #{list.parameters[0]}"
neednewline=true
elsif list.code == 355 || list.code==655
pbAddScriptTexts(items,list.parameters[0])
elsif list.code == 111 && list.parameters[0]==12
pbAddScriptTexts(items,list.parameters[1])
elsif list.code==209
route=list.parameters[1]
for k in 0...route.list.size
if route.list[k].code==45
pbAddScriptTexts(items,route.list[k].parameters[0])
end
end
end
end
if neednewline
if lastitem!=""
items.push(lastitem)
lastitem=""
end
end
end
end
end
if Time.now.to_i - t >= 5
t = Time.now.to_i
Graphics.update
end
items|=[]
choices|=[]
items.concat(choices)
MessageTypes.setMapMessagesAsHash(id,items)
if Time.now.to_i - t >= 5
t = Time.now.to_i
Graphics.update
end
end
rescue Hangup
end
Graphics.update
end
def pbEachIntlSection(file)
lineno=1
re=/^\s*\[\s*([^\]]+)\s*\]\s*$/
havesection=false
sectionname=nil
lastsection=[]
file.each_line {|line|
if lineno==1&&line[0]==0xEF&&line[1]==0xBB&&line[2]==0xBF
line=line[3,line.length-3]
end
if !line[/^\#/] && !line[/^\s*$/]
if line[re]
if havesection
yield lastsection,sectionname
end
lastsection.clear
sectionname=$~[1]
havesection=true
else
if sectionname==nil
raise _INTL("Expected a section at the beginning of the file (line {1})",lineno)
end
lastsection.push(line.gsub(/\s+$/,""))
end
end
lineno+=1
if lineno%500==0
Graphics.update
end
}
if havesection
yield lastsection,sectionname
end
end
def pbGetText(infile)
begin
file=File.open(infile,"rb")
rescue
raise _INTL("Can't find {1}",infile)
end
intldat=[]
begin
pbEachIntlSection(file){|section,name|
index=name
if section.length==0
next
end
if !name[/^([Mm][Aa][Pp])?(\d+)$/]
raise _INTL("Invalid section name {1}",name)
end
ismap=$~[1] && $~[1]!=""
id=$~[2].to_i
itemlength=0
if section[0][/^\d+$/]
intlhash=[]
itemlength=3
if ismap
raise _INTL("Section {1} can't be an ordered list (section was recognized as an ordered list because its first line is a number)",name)
end
if section.length%3!=0
raise _INTL("Section {1}'s line count is not divisible by 3 (section was recognized as an ordered list because its first line is a number)",name)
end
else
intlhash=OrderedHash.new
itemlength=2
if section.length%2!=0
raise _INTL("Section {1} has an odd number of entries (section was recognized as a hash because its first line is not a number)",name)
end
end
i=0;loop do break unless i<section.length
if itemlength==3
if !section[i][/^\d+$/]
raise _INTL("Expected a number in section {1}, got {2} instead",name,section[i])
end
key=section[i].to_i
i+=1
else
key=section[i] # key is already normalized
end
intlhash[key]=MessageTypes.denormalizeValue(section[i+1])
i+=2
end
if ismap
intldat[0]=[] if !intldat[0]
intldat[0][id]=intlhash
else
intldat[id]=intlhash
end
}
ensure
file.close
end
return intldat
end
def pbCompileText
outfile=File.open("intl.dat","wb")
begin
intldat=pbGetText("intl.txt")
Marshal.dump(intldat,outfile)
rescue
raise
ensure
outfile.close
end
end
class OrderedHash < Hash
def initialize
@keys=[]
super
end
def keys
return @keys.clone
end
def inspect
str="{"
for i in 0...@keys.length
str+=", " if i>0
str+=@keys[i].inspect+"=>"+self[@keys[i]].inspect
end
str+="}"
return str
end
alias :to_s :inspect
def []=(key,value)
oldvalue=self[key]
if !oldvalue && value
@keys.push(key)
elsif !value
@keys|=[]
@keys-=[key]
end
return super(key,value)
end
def self._load(string)
ret=self.new
keysvalues=Marshal.load(string)
keys=keysvalues[0]
values=keysvalues[1]
for i in 0...keys.length
ret[keys[i]]=values[i]
end
return ret
end
def _dump(depth=100)
values=[]
for key in @keys
values.push(self[key])
end
return Marshal.dump([@keys,values])
end
end
module MessageTypes
Species=1
Items=2
Entries=3
Kinds=4
Moves=5
StorageCreator=6
TrainerTypes=7
TrainerNames=8
RegionNames=9
PlaceNames=10
ItemDescriptions=11
MoveDescriptions=12
Abilities=13
AbilityDescs=14
PhoneMessages=15
MapNames=16
@@messages=nil
def self.stringToKey(str)
if str[/[\r\n\t]|^\s+|\s+$|\s{2,}/]
key=str.clone
key.gsub!(/^\s+/,"")
key.gsub!(/\s+$/,"")
key.gsub!(/\r/,"<r>")
key.gsub!(/\n/,"<n>")
key.gsub!(/\t/,"<t>")
key.gsub!(/\s{2,}/," ")
return key
end
return str
end
def self.normalizeValue(value)
if value[/[\r\n\t]/]
ret=value.clone
ret.gsub!(/\r/,"<r>")
ret.gsub!(/\n/,"<n>")
ret.gsub!(/\t/,"<t>")
return ret
end
return value
end
def self.denormalizeValue(value)
if value[/<[rnt]>/]
ret=value.clone
ret.gsub!(/<r>/,"\r")
ret.gsub!(/<n>/,"\n")
ret.gsub!(/<t>/,"\t")
return ret
end
return value
end
def self.writeObject(f,msgs,secname)
return if !msgs
if msgs.is_a?(Array)
f.write("[#{secname}]\r\n")
for j in 0...msgs.length
next if msgs[j]==nil || msgs[j]==""
value=self.normalizeValue(msgs[j])
f.write("#{j}\r\n")
f.write(value+"\r\n")
f.write(value+"\r\n")
end
elsif msgs.is_a?(OrderedHash)
f.write("[#{secname}]\r\n")
keys=msgs.keys
for key in keys
next if msgs[key]==nil || msgs[key]==""
value=self.normalizeValue(msgs[key])
# key is already serialized
f.write(key+"\r\n")
f.write(value+"\r\n")
end
end
end
def self.extract(outfile)
return if !@@messages
File.open(outfile,"wb"){|f|
f.write(0xef.chr)
f.write(0xbb.chr)
f.write(0xbf.chr)
f.write("# To localize this text for a particular language, please\r\n")
f.write("# translate every second line of this file.\r\n")
if @@messages[0]
for i in 0...@@messages[0].length
msgs=@@messages[0][i]
self.writeObject(f,msgs,"Map#{i}")
end
end
for i in 1...@@messages.length
msgs=@@messages[i]
self.writeObject(f,msgs,"#{i}")
end
}
end
def self.setMessages(type,array)
arr=[]
@@messages=[] if !@@messages
for i in 0...array.length
arr[i]=(array[i]) ? array[i] : ""
end
@@messages[type]=arr
end
def self.createHash(type,array)
arr=OrderedHash.new
for i in 0...array.length
if array[i]
key=self.stringToKey(array[i])
arr[key]=array[i]
end
end
return arr
end
def self.setMapMessagesAsHash(type,array)
@@messages=[] if !@@messages
@@messages[0]=[] if !@@messages[0]
@@messages[0][type]=self.createHash(type,array)
end
def self.setMessagesAsHash(type,array)
@@messages=[] if !@@messages
@@messages[type]=self.createHash(type,array)
end
def self.saveMessages
File.open("Data/messages.dat","wb"){|f|
Marshal.dump(@@messages,f)
}
end
def self.loadMessageFile(filename)
begin
pbRgssOpen(filename,"rb"){|f|
@@messages=Marshal.load(f)
}
return @@messages
rescue
@@messages=nil
return nil
end
end
def self.loadMessages
if !@@messages
begin
pbRgssOpen("Data/messages.dat","rb"){|f|
@@messages=Marshal.load(f)
}
rescue Errno::ENOENT
return nil
end
end
return @@messages
end
def self.get(type,id)
self.loadMessages
return "" if !@@messages
return "" if !@@messages[type]
return "" if !@@messages[type][id]
return @@messages[type][id]
end
def self.getFromHash(type,key)
self.loadMessages
id=self.stringToKey(key)
return key if !@@messages
return key if !@@messages[type]
return key if !@@messages[type][id]
return @@messages[type][id]
end
def self.getFromMapHash(type,key)
self.loadMessages
id=self.stringToKey(key)
return key if !@@messages
return key if !@@messages[0]
return key if !@@messages[0][type]
return key if !@@messages[0][type][id]
return @@messages[0][type][id]
end
end
def pbLoadMessages(file)
return MessageTypes.loadMessageFile(file)
end
def pbGetMessage(type,id)
return MessageTypes.get(type,id)
end
def pbGetMessageFromHash(type,id)
return MessageTypes.getFromHash(type,id)
end
def _INTL(*arg)
string=MessageTypes.getFromMapHash(0,arg[0])
string=string.clone
for i in 1...arg.length
string.gsub!(/\{#{i}\}/,"#{arg[i]}")
end
return string
end
def _ISPRINTF(*arg)
string=MessageTypes.getFromMapHash(0,arg[0])
string=string.clone
for i in 1...arg.length
string.gsub!(/\{#{i}\:([^\}]+?)\}/){|m|
next sprintf("%"+$1,arg[i])
}
end
return string
end
def _I(str)
return _MAPINTL($game_map.map_id,str)
end
def _MAPINTL(mapid,*arg)
string=MessageTypes.getFromMapHash(mapid,arg[0])
string=string.clone
for i in 1...arg.length
string.gsub!(/\{#{i}\}/,"#{arg[i]}")
end
return string
end
def _MAPISPRINTF(mapid,*arg)
string=MessageTypes.getFromMapHash(mapid,arg[0])
string=string.clone
for i in 1...arg.length
string.gsub!(/\{#{i}\:([^\}]+?)\}/){|m|
next sprintf("%"+$1,arg[i])
}
end
return string
end
def pbGetStringFile(filename)
ret=[]
File.open(filename,"rb"){|f|
length=f.fgetdw>>3
for i in 0...length
ret.push(f.readName(i))
end
}
return ret
end