Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

True Pokemon Starter Kit

Taylor

Sponsor

*dies from uncontrollable drooling*

Very impressive. The Mode 7 map style seems a little pointless though... I hope it can be disabled easily.
 
The bug I had before, about the hangup, it's fixed. You just need to replace PBIntl in the scripts database with:
Code:
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

After that, it shouldn't have any hangup errors upon startup.

hi122neo":16kqxxj5 said:
Oh yea, thanks for the help with Map linking Krobe, I owe you my life!

Your welcome! But I don't want your life... =P

Jirbytaylor":16kqxxj5 said:
*dies from uncontrollable drooling*

Very impressive. The Mode 7 map style seems a little pointless though... I hope it can be disabled easily.

It's not activated at all. Only if you choose so. It also give a different perspective, like when your in a Gym in Pokemon Diamond and Pearl. I'm not sure if you can activate/deactivate it using a call script, but I'll check into it.

-Krobe

[Edit]
A new version is available.

Changes:

Audio module was replaced with a custom one
More changes to adapt to "Graphics.width/
Graphics.height" convention
Various bug fixes in data compiler
Fixed bugs in animation generation routine
Added option "Use PC" to debug menu
Input module was replaced
[/Edit]
 

poccil

Sponsor

Krobelus:

You should always wrap code blocks in "code" and not just "spoiler", since the code may be interpreted incorrectly otherwise.
 
Oh hey Poccil! Didn't think you would mind me making a thread here about your starterkit for support for people here as long as I linked to your site yea?

And I'll put it in code aswell, (didn't think it mattered)

-Krobe
 
Hey I was just wondering if there's a way to make certain pokemon only catchable in a certain kind of ball and in battle(like using snag balls on shadow pokemon in colloseum and gale of darkness)??
It'd be great if someone could help me out
 
Hehehehe, i love this kit, I bet Mr. Mo would be glad to see this, him and I once worked on an update of Blizzys Starter kit, but it never got as far as poccils, im now proudly a poccil user too. And im only about a  week away from a 3 gym demo of my game.
 
How in god's name do you use the Town Map Editor?  I have just about every thing done in my game demo so far, and the Town Map is so damn confusing. . .
 
@thelongabcsong - Uhmmm, not too sure, I'm not all that good with scripts, pm Poccil and ask him.

@hi122neo - It's pretty easy.

Code:
When the editor is started, it loads the file at Graphics/Pictures/Map.png. You can replace that file with the map of your game's region, keeping in mind that the map should be drawn in terms of 16x16 tiles. The example map in the distribution is the map of Hoenn; and filling the map will give you a good idea on how the Town Map Editor works.

Start by clicking any point on the map; for instance a city. Once you have done so, fill in details about the point:

    * Name: Name described by this point.
    * Point of Interest: Name of a point of interest described by this point.
    * Healing Spot: This field specifies the map ID and the X and Y coordinates of the entrance of a healing spot, such as a Pokemon Center, separated by commas. This location is where the player will travel to when Fly is used and if the map indicated by the map ID was visited before. Generally set only if the location is a city or town.
    * Switch: Number of a switch (in RPG Maker XP). If this is set, the point will not be shown until the switch is on. This field is generally set for locations outside of the main storyline, where special Pokemon can be found.

After completing the fields, click Save. You will notice that the point is added to the text below the Save button. This text is meant to be pasted to townmap.txt after you are done with the editor. You can put the text in a new or existing section of the file. (Sections begin with a number within brackets, for example: [1])

That's pretty much it. If it's anymore complicated, then point out where.

-Krobe
 
Ah, thanks alot!

Also, how do you change the battle music/victory music PERMENTALY?!

I get rrrrrrrreeeeeeeaaaaaaaalllllllllyyyyyyyy tired of the RPT music. . .
 
@dptmrn852 - Uhhmm... I don't understand if you have a problem or not? o.o...

@MexicanRifleman - The moveset animations don't come with the starter kit because your supposed to edit them yourself with the animation editor. What moves are missing? If you mean Diamond and Pearl Moves, then they're not supposed be in there, because it'd be hard to implement them seeing as how some DP moves require a slight change to the battle system. And it'd be weird to include some, and not all the movesets from DP. But you never know what the future holds. =P

-Krobe
 
Ok I think I've finally(after reading over the notes 3 times) figured out EVERYTHING I can do with this without having to edit it, except one thing lol. Is there a way to set up an animation for fishing? I can't find it in metadata anywhere which is where all the other custom charsets are...Right now it just shows the player standing next to the water but I want it to change to the player casting a fishing rod, like in the real games...
 
@thelongabcsong - I know, I don't think you can do it using Metadata. But, this might work.

Have an event on every map where theres water that autoruns. Then make a conditional branch that if the Fishing function is called, (or if that don't work, make it if any Fishing Rod is used), have the main characters sprite change into the fishing sprite, and then the Fishing Function will run as so. Then make another conditional branch on the same page, that if the Fishing function is not used, (or if the rods aren't used), then your sprite turns back to normal.

It's a little confusing, but I'll see if I can test it. =P
-Krobe
 
I see, so I use the animation editor.... And one final thing, where can I find the back sprite for the main female trainer?(If you choose the Girl Option and you battle, you get the boy back sprite)

*Sorry for bad description.
 
I thought of that, but how would you set it to check for when you use a rod? It would normally be very simple using items and common events but the SK doesn't use the database for items so I can't figure anything out...
 
Oh yea... I didn't think of that. Totally forgot that everything is in scripts, >.>...

Well, give Poccil a shout, and ask if he has any idea, or, just to put an extra slot in metadata for the rod (and Watering Plants while hes at it).

-Krobe
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top