Advertisement
mej71

PokemonEditor

Apr 27th, 2015
2,014
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 116.33 KB | None | 0 0
  1. def pbIsOldSpecialType?(type)
  2. return isConst?(type,PBTypes,:FIRE) ||
  3. isConst?(type,PBTypes,:WATER) ||
  4. isConst?(type,PBTypes,:ICE) ||
  5. isConst?(type,PBTypes,:GRASS) ||
  6. isConst?(type,PBTypes,:ELECTRIC) ||
  7. isConst?(type,PBTypes,:PSYCHIC) ||
  8. isConst?(type,PBTypes,:DRAGON) ||
  9. isConst?(type,PBTypes,:DARK)
  10. end
  11.  
  12.  
  13.  
  14. ################################################################################
  15. # Make up internal names for things based on their actual names.
  16. ################################################################################
  17. module MakeshiftConsts
  18. @@consts=[]
  19.  
  20. def self.get(c,i,modname=nil)
  21. if !@@consts[c]
  22. @@consts[c]=[]
  23. end
  24. if @@consts[c][i]
  25. return @@consts[c][i]
  26. end
  27. if modname
  28. v=getConstantName(modname,i) rescue nil
  29. if v
  30. @@consts[c][i]=v
  31. return v
  32. end
  33. end
  34. trname=pbGetMessage(c,i)
  35. trconst=trname.gsub(/é/,"e")
  36. trconst=trconst.upcase
  37. trconst=trconst.gsub(/♀/,"fE")
  38. trconst=trconst.gsub(/♂/,"mA")
  39. trconst=trconst.gsub(/[^A-Za-z0-9_]/,"")
  40. if trconst.length==0
  41. return nil if trname.length==0
  42. trconst=sprintf("T_%03d",i)
  43. elsif !trconst[0,1][/[A-Z]/]
  44. trconst="T_"+trconst
  45. end
  46. while @@consts[c].include?(trconst)
  47. trconst=sprintf("%s_%03d",trconst,i)
  48. end
  49. @@consts[c][i]=trconst
  50. return trconst
  51. end
  52. end
  53.  
  54.  
  55.  
  56. def pbGetTypeConst(i)
  57. ret=MakeshiftConsts.get(MessageTypes::Types,i,PBTypes)
  58. if !ret
  59. ret=["NORMAL","FIGHTING","FLYING","POISON","GROUND",
  60. "ROCK","BUG","GHOST","STEEL","QMARKS",
  61. "FIRE","WATER","GRASS","ELECTRIC",
  62. "PSYCHIC","ICE","DRAGON","DARK"][i]
  63. end
  64. return ret
  65. end
  66.  
  67. def pbGetEvolutionConst(i)
  68. ret=["Unknown",
  69. "Happiness","HappinessDay","HappinessNight","Level","Trade",
  70. "TradeItem","Item","AttackGreater","AtkDefEqual","DefenseGreater",
  71. "Silcoon","Cascoon","Ninjask","Shedinja","Beauty",
  72. "ItemMale","ItemFemale","DayHoldItem","NightHoldItem","HasMove",
  73. "HasInParty","LevelMale","LevelFemale","Location","TradeSpecies",
  74. "Custom1","Custom2","Custom3","Custom4","Custom5","Custom6","Custom7"
  75. ]
  76. i=0 if i>=ret.length || i<0
  77. return ret[i]
  78. end
  79.  
  80. def pbGetAbilityConst(i)
  81. return MakeshiftConsts.get(MessageTypes::Abilities,i,PBAbilities)
  82. end
  83.  
  84. def pbGetMoveConst(i)
  85. return MakeshiftConsts.get(MessageTypes::Moves,i,PBMoves)
  86. end
  87.  
  88. def pbGetItemConst(i)
  89. return MakeshiftConsts.get(MessageTypes::Items,i,PBItems)
  90. end
  91.  
  92. def pbGetSpeciesConst(i)
  93. return MakeshiftConsts.get(MessageTypes::Species,i,PBSpecies)
  94. end
  95.  
  96. def pbGetTrainerConst(i)
  97. name=MakeshiftConsts.get(MessageTypes::TrainerTypes,i,PBTrainers)
  98. end
  99.  
  100.  
  101.  
  102. ################################################################################
  103. # Save data to PBS files
  104. ################################################################################
  105. def pbSavePokemonData
  106. dexdata=File.open("Data/dexdata.dat","rb") rescue nil
  107. messages=Messages.new("Data/messages.dat") rescue nil
  108. return if !dexdata || !messages
  109. metrics=load_data("Data/metrics.dat") rescue nil
  110. atkdata=File.open("Data/attacksRS.dat","rb")
  111. eggEmerald=File.open("Data/eggEmerald.dat","rb")
  112. regionaldata=File.open("Data/regionals.dat","rb")
  113. numRegions=regionaldata.fgetw
  114. numDexDatas=regionaldata.fgetw
  115. pokedata=File.open("PBS/pokemon.txt","wb") rescue nil
  116. pokedata.write(0xEF.chr)
  117. pokedata.write(0xBB.chr)
  118. pokedata.write(0xBF.chr)
  119. for i in 1..(PBSpecies.maxValue rescue PBSpecies.getCount-1 rescue messages.getCount(MessageTypes::Species)-1)
  120. cname=getConstantName(PBSpecies,i) rescue next
  121. speciesname=messages.get(MessageTypes::Species,i)
  122. kind=messages.get(MessageTypes::Kinds,i)
  123. entry=messages.get(MessageTypes::Entries,i)
  124. formnames=messages.get(MessageTypes::FormNames,i)
  125. pbDexDataOffset(dexdata,i,6)
  126. color=dexdata.fgetb
  127. habitat=dexdata.fgetb
  128. type1=dexdata.fgetb
  129. type2=dexdata.fgetb
  130. basestats=[]
  131. for j in 0...6
  132. basestats.push(dexdata.fgetb)
  133. end
  134. rareness=dexdata.fgetb
  135. pbDexDataOffset(dexdata,i,18)
  136. gender=dexdata.fgetb
  137. happiness=dexdata.fgetb
  138. growthrate=dexdata.fgetb
  139. stepstohatch=dexdata.fgetw
  140. effort=[]
  141. for j in 0...6
  142. effort.push(dexdata.fgetb)
  143. end
  144. ability1=dexdata.fgetb
  145. ability2=dexdata.fgetb
  146. compat1=dexdata.fgetb
  147. compat2=dexdata.fgetb
  148. height=dexdata.fgetw
  149. weight=dexdata.fgetw
  150. pbDexDataOffset(dexdata,i,38)
  151. baseexp=dexdata.fgetw
  152. hiddenability1=dexdata.fgetb
  153. hiddenability2=dexdata.fgetb
  154. hiddenability3=dexdata.fgetb
  155. hiddenability4=dexdata.fgetb
  156. pbDexDataOffset(dexdata,i,48)
  157. item1=dexdata.fgetw
  158. item2=dexdata.fgetw
  159. item3=dexdata.fgetw
  160. pokedata.write("[#{i}]\r\nName=#{speciesname}\r\n")
  161. pokedata.write("InternalName=#{cname}\r\n")
  162. ctype1=getConstantName(PBTypes,type1) rescue pbGetTypeConst(type1) || pbGetTypeConst(0) || "NORMAL"
  163. pokedata.write("Type1=#{ctype1}\r\n")
  164. if type1!=type2
  165. ctype2=getConstantName(PBTypes,type2) rescue pbGetTypeConst(type2) || pbGetTypeConst(0) || "NORMAL"
  166. pokedata.write("Type2=#{ctype2}\r\n")
  167. end
  168. pokedata.write("BaseStats=#{basestats[0]},#{basestats[1]},#{basestats[2]},#{basestats[3]},#{basestats[4]},#{basestats[5]}\r\n")
  169. pokedata.write("GenderRate=AlwaysMale\r\n") if gender==0
  170. pokedata.write("GenderRate=FemaleOneEighth\r\n") if gender==31
  171. pokedata.write("GenderRate=Female25Percent\r\n") if gender==63
  172. pokedata.write("GenderRate=Female50Percent\r\n") if gender==127
  173. pokedata.write("GenderRate=Female75Percent\r\n") if gender==191
  174. pokedata.write("GenderRate=FemaleSevenEighths\r\n") if gender==223
  175. pokedata.write("GenderRate=AlwaysFemale\r\n") if gender==254
  176. pokedata.write("GenderRate=Genderless\r\n") if gender==255
  177. pokedata.write("GrowthRate=" + ["Medium","Erratic","Fluctuating","Parabolic","Fast","Slow"][growthrate]+"\r\n")
  178. pokedata.write("BaseEXP=#{baseexp}\r\n")
  179. pokedata.write("EffortPoints=#{effort[0]},#{effort[1]},#{effort[2]},#{effort[3]},#{effort[4]},#{effort[5]}\r\n")
  180. pokedata.write("Rareness=#{rareness}\r\n")
  181. pokedata.write("Happiness=#{happiness}\r\n")
  182. pokedata.write("Abilities=")
  183. if ability1!=0
  184. cability1=getConstantName(PBAbilities,ability1) rescue pbGetAbilityConst(ability1)
  185. pokedata.write("#{cability1}")
  186. pokedata.write(",") if ability2!=0
  187. end
  188. if ability2!=0
  189. cability2=getConstantName(PBAbilities,ability2) rescue pbGetAbilityConst(ability2)
  190. pokedata.write("#{cability2}")
  191. end
  192. pokedata.write("\r\n")
  193. if hiddenability1>0 || hiddenability2>0 || hiddenability3>0 || hiddenability4>0
  194. pokedata.write("HiddenAbility=")
  195. needcomma=false
  196. if hiddenability1>0
  197. cabilityh=getConstantName(PBAbilities,hiddenability1) rescue pbGetAbilityConst(hiddenability1)
  198. pokedata.write("#{cabilityh}"); needcomma=true
  199. end
  200. if hiddenability2>0
  201. pokedata.write(",") if needcomma
  202. cabilityh=getConstantName(PBAbilities,hiddenability2) rescue pbGetAbilityConst(hiddenability2)
  203. pokedata.write("#{cabilityh}"); needcomma=true
  204. end
  205. if hiddenability3>0
  206. pokedata.write(",") if needcomma
  207. cabilityh=getConstantName(PBAbilities,hiddenability3) rescue pbGetAbilityConst(hiddenability3)
  208. pokedata.write("#{cabilityh}"); needcomma=true
  209. end
  210. if hiddenability4>0
  211. pokedata.write(",") if needcomma
  212. cabilityh=getConstantName(PBAbilities,hiddenability4) rescue pbGetAbilityConst(hiddenability4)
  213. pokedata.write("#{cabilityh}")
  214. end
  215. pokedata.write("\r\n")
  216. end
  217. pokedata.write("Moves=")
  218. offset=atkdata.getOffset(i-1)
  219. length=atkdata.getLength(i-1)>>1
  220. atkdata.pos=offset
  221. movelist=[]
  222. for j in 0...length
  223. alevel=atkdata.fgetw
  224. move=atkdata.fgetw
  225. movelist.push([j,alevel,move])
  226. end
  227. movelist.sort!{|a,b| a[1]==b[1] ? a[0]<=>b[0] : a[1]<=>b[1] }
  228. for j in 0...movelist.length
  229. alevel=movelist[j][1]
  230. move=movelist[j][2]
  231. pokedata.write(",") if j>0
  232. cmove=getConstantName(PBMoves,move) rescue pbGetMoveConst(move)
  233. pokedata.write(sprintf("%d,%s",alevel,cmove))
  234. end
  235. pokedata.write("\r\n")
  236. eggEmerald.pos=(i-1)*8
  237. offset=eggEmerald.fgetdw
  238. length=eggEmerald.fgetdw
  239. if length>0
  240. pokedata.write("EggMoves=")
  241. eggEmerald.pos=offset
  242. first=true
  243. j=0; loop do break unless j<length
  244. atk=eggEmerald.fgetw
  245. pokedata.write(",") if !first
  246. break if atk==0
  247. if atk>0
  248. cmove=getConstantName(PBMoves,atk) rescue pbGetMoveConst(atk)
  249. pokedata.write("#{cmove}")
  250. first=false
  251. end
  252. j+=1
  253. end
  254. pokedata.write("\r\n")
  255. end
  256. compatarray=["","Monster","Water1","Bug","Flying","Field","Fairy","Grass","Humanlike",
  257. "Water3","Mineral","Amorphous","Water2","Ditto","Dragon","Undiscovered"]
  258. comp1=compatarray[compat1]
  259. comp2=compatarray[compat2]
  260. if compat1==compat2
  261. pokedata.write("Compatibility=#{comp1}\r\n")
  262. else
  263. pokedata.write("Compatibility=#{comp1},#{comp2}\r\n")
  264. end
  265. pokedata.write("StepsToHatch=#{stepstohatch}\r\n")
  266. pokedata.write("Height=")
  267. pokedata.write(sprintf("%.1f",height/10.0)) if height
  268. pokedata.write("\r\n")
  269. pokedata.write("Weight=")
  270. pokedata.write(sprintf("%.1f",weight/10.0)) if weight
  271. pokedata.write("\r\n")
  272. pokedata.write("Color="+["Red","Blue","Yellow","Green","Black","Brown","Purple","Gray","White","Pink"][color]+"\r\n")
  273. pokedata.write("Habitat="+["","Grassland","Forest","WatersEdge","Sea","Cave","Mountain","RoughTerrain","Urban","Rare"][habitat]+"\r\n") if habitat>0
  274. regionallist=[]
  275. for region in 0...numRegions
  276. regionaldata.pos=4+region*numDexDatas*2+(i*2)
  277. regionallist.push(regionaldata.fgetw)
  278. end
  279. numb = regionallist.size-1
  280. while (numb>=0) # remove every 0 at end of array
  281. (regionallist[numb] == 0) ? regionallist.pop : break
  282. numb-=1
  283. end
  284. if !regionallist.empty?
  285. pokedata.write("RegionalNumbers="+regionallist[0].to_s)
  286. for numb in 1...regionallist.size
  287. pokedata.write(","+regionallist[numb].to_s)
  288. end
  289. pokedata.write("\r\n")
  290. end
  291. pokedata.write("Kind=#{kind}\r\n")
  292. pokedata.write("Pokedex=#{entry}\r\n")
  293. if formnames && formnames!=""
  294. pokedata.write("FormNames=#{formnames}\r\n")
  295. end
  296. if item1>0
  297. citem1=getConstantName(PBItems,item1) rescue pbGetItemConst(item1)
  298. pokedata.write("WildItemCommon=#{citem1}\r\n")
  299. end
  300. if item2>0
  301. citem2=getConstantName(PBItems,item2) rescue pbGetItemConst(item2)
  302. pokedata.write("WildItemUncommon=#{citem2}\r\n")
  303. end
  304. if item3>0
  305. citem3=getConstantName(PBItems,item3) rescue pbGetItemConst(item3)
  306. pokedata.write("WildItemRare=#{citem3}\r\n")
  307. end
  308. if metrics
  309. pokedata.write("BattlerPlayerY=#{metrics[0][i] || 0}\r\n")
  310. pokedata.write("BattlerEnemyY=#{metrics[1][i] || 0}\r\n")
  311. pokedata.write("BattlerAltitude=#{metrics[2][i] || 0}\r\n")
  312. end
  313. pokedata.write("Evolutions=")
  314. count=0
  315. for form in pbGetEvolvedFormData(i)
  316. evonib=form[0]
  317. level=form[1]
  318. poke=form[2]
  319. next if poke==0 || evonib==PBEvolution::Unknown
  320. cpoke=getConstantName(PBSpecies,poke) rescue pbGetSpeciesConst(poke)
  321. evoname=getConstantName(PBEvolution,evonib) rescue pbGetEvolutionConst(evonib)
  322. next if !cpoke || cpoke==""
  323. pokedata.write(",") if count>0
  324. pokedata.write(sprintf("%s,%s,",cpoke,evoname))
  325. case PBEvolution::EVOPARAM[evonib]
  326. when 1
  327. pokedata.write(_ISPRINTF("{1:d}",level))
  328. when 2
  329. clevel=getConstantName(PBItems,level) rescue pbGetItemConst(level)
  330. pokedata.write("#{clevel}")
  331. when 3
  332. clevel=getConstantName(PBMoves,level) rescue pbGetMoveConst(level)
  333. pokedata.write("#{clevel}")
  334. when 4
  335. clevel=getConstantName(PBSpecies,level) rescue pbGetSpeciesConst(level)
  336. pokedata.write("#{clevel}")
  337. when 5
  338. clevel=getConstantName(PBTypes,level) rescue pbGetTypeConst(level)
  339. pokedata.write("#{clevel}")
  340. end
  341. count+=1
  342. end
  343. pokedata.write("\r\n")
  344. if i%20==0
  345. Graphics.update
  346. Win32API.SetWindowText(_INTL("Processing species {1}...",i))
  347. end
  348. end
  349. dexdata.close
  350. atkdata.close
  351. eggEmerald.close
  352. regionaldata.close
  353. pokedata.close
  354. Graphics.update
  355. end
  356.  
  357. def pbSaveTypes
  358. return if (PBTypes.maxValue rescue 0)==0
  359. File.open("PBS/types.txt","wb"){|f|
  360. f.write(0xEF.chr)
  361. f.write(0xBB.chr)
  362. f.write(0xBF.chr)
  363. for i in 0..(PBTypes.maxValue rescue 25)
  364. name=PBTypes.getName(i) rescue nil
  365. next if !name || name==""
  366. constname=getConstantName(PBTypes,i) rescue pbGetTypeConst(i)
  367. f.write(sprintf("[%d]\r\n",i))
  368. f.write(sprintf("Name=%s\r\n",name))
  369. f.write(sprintf("InternalName=%s\r\n",constname))
  370. if (PBTypes.isPseudoType?(i) rescue isConst?(i,PBTypes,QMARKS))
  371. f.write("IsPseudoType=true\r\n")
  372. end
  373. if (PBTypes.isSpecialType?(i) rescue pbIsOldSpecialType?(i))
  374. f.write("IsSpecialType=true\r\n")
  375. end
  376. weak=[]
  377. resist=[]
  378. immune=[]
  379. for j in 0..(PBTypes.maxValue rescue 25)
  380. cname=getConstantName(PBTypes,j) rescue pbGetTypeConst(j)
  381. next if !cname || cname==""
  382. eff=PBTypes.getEffectiveness(j,i)
  383. weak.push(cname) if eff==4
  384. resist.push(cname) if eff==1
  385. immune.push(cname) if eff==0
  386. end
  387. f.write("Weaknesses="+weak.join(",")+"\r\n") if weak.length>0
  388. f.write("Resistances="+resist.join(",")+"\r\n") if resist.length>0
  389. f.write("Immunities="+immune.join(",")+"\r\n") if immune.length>0
  390. f.write("\r\n")
  391. end
  392. }
  393. end
  394.  
  395. def pbSaveAbilities()
  396. File.open("PBS/abilities.txt","wb"){|f|
  397. f.write(0xEF.chr)
  398. f.write(0xBB.chr)
  399. f.write(0xBF.chr)
  400. for i in 1..(PBAbilities.maxValue rescue PBAbilities.getCount-1 rescue pbGetMessageCount(MessageTypes::Abilities)-1)
  401. abilname=getConstantName(PBAbilities,i) rescue pbGetAbilityConst(i)
  402. next if !abilname || abilname==""
  403. name=pbGetMessage(MessageTypes::Abilities,i)
  404. next if !name || name==""
  405. f.write(sprintf("%d,%s,%s,%s\r\n",i,
  406. csvquote(abilname),
  407. csvquote(name),
  408. csvquote(pbGetMessage(MessageTypes::AbilityDescs,i))
  409. ))
  410. end
  411. }
  412. end
  413.  
  414. def pbSaveItems
  415. itemData=readItemList("Data/items.dat") rescue nil
  416. return if !itemData || itemData.length==0
  417. File.open("PBS/items.txt","wb"){|f|
  418. f.write(0xEF.chr)
  419. f.write(0xBB.chr)
  420. f.write(0xBF.chr)
  421. for i in 0...itemData.length
  422. next if !itemData[i]
  423. data=itemData[i]
  424. cname=getConstantName(PBItems,i) rescue sprintf("ITEM%03d",i)
  425. next if !cname || cname=="" || data[0]==0
  426. machine=""
  427. if data[ITEMMACHINE]>0
  428. machine=getConstantName(PBMoves,data[ITEMMACHINE]) rescue pbGetMoveConst(data[ITEMMACHINE]) rescue ""
  429. end
  430. f.write(sprintf("%d,%s,%s,%d,%d,%s,%d,%d,%d,%s\r\n",
  431. data[ITEMID],csvquote(cname),csvquote(data[ITEMNAME]),
  432. data[ITEMPOCKET],data[ITEMPRICE],csvquote(data[ITEMDESC]),
  433. data[ITEMUSE],data[ITEMBATTLEUSE],data[ITEMTYPE],
  434. csvquote(machine)
  435. ))
  436. end
  437. }
  438. end
  439.  
  440. def pbSaveMoveData()
  441. return if !pbRgssExists?("Data/moves.dat")
  442. File.open("PBS/moves.txt","wb"){|f|
  443. f.write(0xEF.chr)
  444. f.write(0xBB.chr)
  445. f.write(0xBF.chr)
  446. for i in 1..(PBMoves.maxValue rescue PBMoves.getCount-1 rescue pbGetMessageCount(MessageTypes::Moves)-1)
  447. moveconst=getConstantName(PBMoves,i) rescue pbGetMoveConst(i) rescue nil
  448. next if !moveconst || moveconst==""
  449. movename=pbGetMessage(MessageTypes::Moves,i)
  450. movedata=PBMoveData.new(i)
  451. flags=""
  452. flags+="a" if (movedata.flags&0x00001)!=0
  453. flags+="b" if (movedata.flags&0x00002)!=0
  454. flags+="c" if (movedata.flags&0x00004)!=0
  455. flags+="d" if (movedata.flags&0x00008)!=0
  456. flags+="e" if (movedata.flags&0x00010)!=0
  457. flags+="f" if (movedata.flags&0x00020)!=0
  458. flags+="g" if (movedata.flags&0x00040)!=0
  459. flags+="h" if (movedata.flags&0x00080)!=0
  460. flags+="i" if (movedata.flags&0x00100)!=0
  461. flags+="j" if (movedata.flags&0x00200)!=0
  462. flags+="k" if (movedata.flags&0x00400)!=0
  463. flags+="l" if (movedata.flags&0x00800)!=0
  464. flags+="m" if (movedata.flags&0x01000)!=0
  465. flags+="n" if (movedata.flags&0x02000)!=0
  466. flags+="o" if (movedata.flags&0x04000)!=0
  467. flags+="p" if (movedata.flags&0x08000)!=0
  468. f.write(sprintf("%d,%s,%s,%03X,%d,%s,%s,%d,%d,%d,%02X,%d,%s,%s\r\n",
  469. i,csvquote(moveconst),csvquote(movename),
  470. movedata.function,
  471. movedata.basedamage,
  472. csvquote((getConstantName(PBTypes,movedata.type) rescue pbGetTypeConst(movedata.type) rescue "")),
  473. csvquote(["Physical","Special","Status"][movedata.category]),
  474. movedata.accuracy,
  475. movedata.totalpp,
  476. movedata.addlEffect,
  477. movedata.target,
  478. movedata.priority,
  479. flags,
  480. csvquote(pbGetMessage(MessageTypes::MoveDescriptions,i))
  481. ))
  482. end
  483. }
  484. end
  485.  
  486. def pbSaveMachines
  487. machines=load_data("Data/tm.dat") rescue nil
  488. return if !machines
  489. File.open("PBS/tm.txt","wb"){|f|
  490. for i in 1...machines.length
  491. Graphics.update if i%50==0
  492. next if !machines[i]
  493. movename=getConstantName(PBMoves,i) rescue pbGetMoveConst(i) rescue nil
  494. next if !movename || movename==""
  495. f.write("\#-------------------\r\n")
  496. f.write(sprintf("[%s]\r\n",movename))
  497. x=[]
  498. for j in 0...machines[i].length
  499. speciesname=getConstantName(PBSpecies,machines[i][j]) rescue pbGetSpeciesConst(machines[i][j]) rescue nil
  500. next if !speciesname || speciesname==""
  501. x.push(speciesname)
  502. end
  503. f.write(x.join(",")+"\r\n")
  504. end
  505. }
  506. end
  507.  
  508. def pbSaveShadowMoves
  509. moves=load_data("Data/shadowmoves.dat") rescue []
  510. File.open("PBS/shadowmoves.txt","wb"){|f|
  511. for i in 0...moves.length
  512. move=moves[i]
  513. if move && moves.length>0
  514. constname=(getConstantName(PBSpecies,i) rescue pbGetSpeciesConst(i) rescue nil)
  515. next if !constname
  516. f.write(sprintf("%s=",constname))
  517. movenames=[]
  518. for m in move
  519. movenames.push((getConstantName(PBMoves,m) rescue pbGetMoveConst(m) rescue nil))
  520. end
  521. f.write(sprintf("%s\r\n",movenames.compact.join(",")))
  522. end
  523. end
  524. }
  525. end
  526.  
  527. def pbSaveTrainerTypes()
  528. data=load_data("Data/trainertypes.dat") rescue nil
  529. return if !data
  530. File.open("PBS/trainertypes.txt","wb"){|f|
  531. f.write(0xEF.chr)
  532. f.write(0xBB.chr)
  533. f.write(0xBF.chr)
  534. f.write("\# "+_INTL("See the documentation on the wiki to learn how to edit this file."))
  535. f.write("\r\n")
  536. for i in 0...data.length
  537. record=data[i]
  538. if record
  539. dataline=sprintf("%d,%s,%s,%d,%s,%s,%s,%s,%s\r\n",
  540. i,record[1],record[2],
  541. record[3],
  542. record[4] ? record[4] : "",
  543. record[5] ? record[5] : "",
  544. record[6] ? record[6] : "",
  545. record[7] ? ["Male","Female","Mixed"][record[7]] : "Mixed",
  546. record[8]!=record[3] ? record[8] : ""
  547. )
  548. f.write(dataline)
  549. end
  550. end
  551. }
  552. end
  553.  
  554. def pbSaveTrainerBattles()
  555. data=load_data("Data/trainers.dat") rescue nil
  556. return if !data
  557. File.open("PBS/trainers.txt","wb"){|f|
  558. f.write(0xEF.chr)
  559. f.write(0xBB.chr)
  560. f.write(0xBF.chr)
  561. f.write("\# "+_INTL("See the documentation on the wiki to learn how to edit this file."))
  562. f.write("\r\n")
  563. for trainer in data
  564. trname=getConstantName(PBTrainers,trainer[0]) rescue pbGetTrainerConst(trainer[0]) rescue nil
  565. next if !trname
  566. f.write("\#-------------------\r\n")
  567. f.write(sprintf("%s\r\n",trname))
  568. trainername=trainer[1] ? trainer[1].gsub(/,/,";") : "???"
  569. if trainer[4]==0
  570. f.write(sprintf("%s\r\n",trainername))
  571. else
  572. f.write(sprintf("%s,%d\r\n",trainername,trainer[4]))
  573. end
  574. f.write(sprintf("%d",trainer[3].length))
  575. for i in 0...8
  576. itemname=getConstantName(PBItems,trainer[2][i]) rescue pbGetItemConst(trainer[2][i]) rescue nil
  577. f.write(sprintf(",%s",itemname)) if trainer[2][i]
  578. end
  579. f.write("\r\n")
  580. for poke in trainer[3]
  581. maxindex=0
  582. towrite=[]
  583. thistemp=getConstantName(PBSpecies,poke[TPSPECIES]) rescue pbGetSpeciesConst(poke[TPSPECIES]) rescue ""
  584. towrite[TPSPECIES]=thistemp
  585. towrite[TPLEVEL]=poke[TPLEVEL].to_s
  586. thistemp=getConstantName(PBItems,poke[TPITEM]) rescue pbGetItemConst(poke[TPITEM]) rescue ""
  587. towrite[TPITEM]=thistemp
  588. thistemp=getConstantName(PBMoves,poke[TPMOVE1]) rescue pbGetMoveConst(poke[TPMOVE1]) rescue ""
  589. towrite[TPMOVE1]=thistemp
  590. thistemp=getConstantName(PBMoves,poke[TPMOVE2]) rescue pbGetMoveConst(poke[TPMOVE2]) rescue ""
  591. towrite[TPMOVE2]=thistemp
  592. thistemp=getConstantName(PBMoves,poke[TPMOVE3]) rescue pbGetMoveConst(poke[TPMOVE3]) rescue ""
  593. towrite[TPMOVE3]=thistemp
  594. thistemp=getConstantName(PBMoves,poke[TPMOVE4]) rescue pbGetMoveConst(poke[TPMOVE4]) rescue ""
  595. towrite[TPMOVE4]=thistemp
  596. towrite[TPABILITY]=(poke[TPABILITY] ? poke[TPABILITY].to_s : "")
  597. towrite[TPGENDER]=(poke[TPGENDER] ? ["M","F"][poke[TPGENDER]] : "")
  598. towrite[TPFORM]=(poke[TPFORM] && poke[TPFORM]!=TPDEFAULTS[TPFORM] ? poke[TPFORM].to_s : "")
  599. towrite[TPSHINY]=(poke[TPSHINY] ? "shiny" : "")
  600. towrite[TPNATURE]=(poke[TPNATURE] ? getConstantName(PBNatures,poke[TPNATURE]) : "")
  601. towrite[TPIV]=(poke[TPIV] && poke[TPIV]!=TPDEFAULTS[TPIV] ? poke[TPIV].to_s : "")
  602. towrite[TPHAPPINESS]=(poke[TPHAPPINESS] && poke[TPHAPPINESS]!=TPDEFAULTS[TPHAPPINESS] ? poke[TPHAPPINESS].to_s : "")
  603. towrite[TPNAME]=(poke[TPNAME] ? poke[TPNAME] : "")
  604. towrite[TPSHADOW]=(poke[TPSHADOW] ? "true" : "")
  605. towrite[TPBALL]=(poke[TPBALL] && poke[TPBALL]!=TPDEFAULTS[TPBALL] ? poke[TPBALL].to_s : "")
  606. for i in 0...towrite.length
  607. towrite[i]="" if !towrite[i]
  608. maxindex=i if towrite[i] && towrite[i]!=""
  609. end
  610. for i in 0..maxindex
  611. f.write(",") if i>0
  612. f.write(towrite[i])
  613. end
  614. f.write("\r\n")
  615. end
  616. end
  617. }
  618. end
  619.  
  620. def normalizeConnectionPoint(conn)
  621. ret=conn.clone
  622. if conn[1]<0 && conn[4]<0
  623. elsif conn[1]<0 || conn[4]<0
  624. ret[4]=-conn[1]
  625. ret[1]=-conn[4]
  626. end
  627. if conn[2]<0 && conn[5]<0
  628. elsif conn[2]<0 || conn[5]<0
  629. ret[5]=-conn[2]
  630. ret[2]=-conn[5]
  631. end
  632. return ret
  633. end
  634.  
  635. def writeConnectionPoint(map1,x1,y1,map2,x2,y2)
  636. dims1=MapFactoryHelper.getMapDims(map1)
  637. dims2=MapFactoryHelper.getMapDims(map2)
  638. if x1==0 && x2==dims2[0]
  639. return sprintf("%d,West,%d,%d,East,%d\r\n",map1,y1,map2,y2)
  640. elsif y1==0 && y2==dims2[1]
  641. return sprintf("%d,North,%d,%d,South,%d\r\n",map1,x1,map2,x2)
  642. elsif x1==dims1[0] && x2==0
  643. return sprintf("%d,East,%d,%d,West,%d\r\n",map1,y1,map2,y2)
  644. elsif y1==dims1[1] && y2==0
  645. return sprintf("%d,South,%d,%d,North,%d\r\n",map1,x1,map2,x2)
  646. else
  647. return sprintf("%d,%d,%d,%d,%d,%d\r\n",map1,x1,y1,map2,x2,y2)
  648. end
  649. end
  650.  
  651. def pbSaveConnectionData
  652. data=load_data("Data/connections.dat") rescue nil
  653. return if !data
  654. pbSerializeConnectionData(data,pbLoadRxData("Data/MapInfos"))
  655. end
  656.  
  657. def pbSerializeConnectionData(conndata,mapinfos)
  658. File.open("PBS/connections.txt","wb"){|f|
  659. for conn in conndata
  660. if mapinfos
  661. # Skip if map no longer exists
  662. next if !mapinfos[conn[0]] || !mapinfos[conn[3]]
  663. f.write(sprintf("# %s (%d) - %s (%d)\r\n",
  664. mapinfos[conn[0]] ? mapinfos[conn[0]].name : "???",conn[0],
  665. mapinfos[conn[3]] ? mapinfos[conn[3]].name : "???",conn[3]))
  666. end
  667. if conn[1].is_a?(String) || conn[4].is_a?(String)
  668. f.write(sprintf("%d,%s,%d,%d,%s,%d\r\n",conn[0],conn[1],
  669. conn[2],conn[3],conn[4],conn[5]))
  670. else
  671. ret=normalizeConnectionPoint(conn)
  672. f.write(writeConnectionPoint(
  673. ret[0],
  674. ret[1],
  675. ret[2],
  676. ret[3],
  677. ret[4],
  678. ret[5]
  679. ))
  680. end
  681. end
  682. }
  683. save_data(conndata,"Data/connections.dat")
  684. end
  685.  
  686. def pbSaveMetadata
  687. data=load_data("Data/metadata.dat") rescue nil
  688. return if !data
  689. pbSerializeMetadata(data,pbLoadRxData("Data/MapInfos"))
  690. end
  691.  
  692. def pbSerializeMetadata(metadata,mapinfos)
  693. save_data(metadata,"Data/metadata.dat")
  694. File.open("PBS/metadata.txt","wb"){|f|
  695. f.write(0xEF.chr)
  696. f.write(0xBB.chr)
  697. f.write(0xBF.chr)
  698. for i in 0...metadata.length
  699. next if !metadata[i]
  700. f.write(sprintf("[%03d]\r\n",i))
  701. if i==0
  702. types=PokemonMetadata::GlobalTypes
  703. else
  704. if mapinfos && mapinfos[i]
  705. f.write(sprintf("# %s\r\n",mapinfos[i].name))
  706. end
  707. types=PokemonMetadata::NonGlobalTypes
  708. end
  709. for key in types.keys
  710. schema=types[key]
  711. record=metadata[i][schema[0]]
  712. next if record==nil
  713. f.write(sprintf("%s=",key))
  714. pbWriteCsvRecord(record,f,schema)
  715. f.write(sprintf("\r\n"))
  716. end
  717. end
  718. }
  719. end
  720.  
  721. def pbSaveEncounterData()
  722. encdata=load_data("Data/encounters.dat") rescue nil
  723. return if !encdata
  724. mapinfos=pbLoadRxData("Data/MapInfos")
  725. File.open("PBS/encounters.txt","wb"){|f|
  726. sortedkeys=encdata.keys.sort{|a,b| a<=>b}
  727. for i in sortedkeys
  728. if encdata[i]
  729. e=encdata[i]
  730. mapname=""
  731. if mapinfos[i]
  732. map=mapinfos[i].name
  733. mapname=" # #{map}"
  734. end
  735. f.write(sprintf("#########################\r\n"))
  736. f.write(sprintf("%03d%s\r\n",i,mapname))
  737. f.write(sprintf("%d,%d,%d\r\n",e[0][EncounterTypes::Land],
  738. e[0][EncounterTypes::Cave],e[0][EncounterTypes::Water]))
  739. for j in 0...e[1].length
  740. enc=e[1][j]
  741. next if !enc
  742. f.write(sprintf("%s\r\n",EncounterTypes::Names[j]))
  743. for k in 0...EncounterTypes::EnctypeChances[j].length
  744. encentry=(enc[k]) ? enc[k] : [1,5,5]
  745. species=getConstantName(PBSpecies,encentry[0]) rescue pbGetSpeciesConst(encentry[0])
  746. if encentry[1]==encentry[2]
  747. f.write(sprintf("%s,%d\r\n",species,encentry[1]))
  748. else
  749. f.write(sprintf("%s,%d,%d\r\n",species,encentry[1],encentry[2]))
  750. end
  751. end
  752. end
  753. end
  754. end
  755. }
  756. end
  757.  
  758. def pbSaveTownMap()
  759. mapdata=load_data("Data/townmap.dat") rescue nil
  760. return if !mapdata
  761. File.open("PBS/townmap.txt","wb"){|f|
  762. f.write(0xEF.chr)
  763. f.write(0xBB.chr)
  764. f.write(0xBF.chr)
  765. for i in 0...mapdata.length
  766. map=mapdata[i]
  767. return if !map
  768. f.write(sprintf("[%d]\r\n",i))
  769. f.write(sprintf("Name=%s\r\nFilename=%s\r\n",
  770. csvquote(map[0].is_a?(Array) ? map[0][0] : map[0]),
  771. csvquote(map[1].is_a?(Array) ? map[1][0] : map[1])))
  772. for loc in map[2]
  773. f.write("Point=")
  774. pbWriteCsvRecord(loc,f,[nil,"uussUUUU"])
  775. f.write("\r\n")
  776. end
  777. end
  778. }
  779. end
  780.  
  781. def pbSavePhoneData
  782. data=load_data("Data/phone.dat") rescue nil
  783. return if !data
  784. File.open("PBS/phone.txt","wb"){|f|
  785. f.write(0xEF.chr)
  786. f.write(0xBB.chr)
  787. f.write(0xBF.chr)
  788. f.write("[<Generics>]\r\n")
  789. f.write(data.generics.join("\r\n")+"\r\n")
  790. f.write("[<BattleRequests>]\r\n")
  791. f.write(data.battleRequests.join("\r\n")+"\r\n")
  792. f.write("[<GreetingsMorning>]\r\n")
  793. f.write(data.greetingsMorning.join("\r\n")+"\r\n")
  794. f.write("[<GreetingsEvening>]\r\n")
  795. f.write(data.greetingsEvening.join("\r\n")+"\r\n")
  796. f.write("[<Greetings>]\r\n")
  797. f.write(data.greetings.join("\r\n")+"\r\n")
  798. f.write("[<Bodies1>]\r\n")
  799. f.write(data.bodies1.join("\r\n")+"\r\n")
  800. f.write("[<Bodies2>]\r\n")
  801. f.write(data.bodies2.join("\r\n")+"\r\n")
  802. }
  803. end
  804.  
  805. def pbSaveTrainerLists()
  806. trainerlists=load_data("Data/trainerlists.dat") rescue nil
  807. return if !trainerlists
  808. File.open("PBS/trainerlists.txt","wb"){|f|
  809. f.write(0xEF.chr)
  810. f.write(0xBB.chr)
  811. f.write(0xBF.chr)
  812. for tr in trainerlists
  813. f.write((tr[5] ? "[DefaultTrainerList]" : "[TrainerList]")+"\r\n")
  814. f.write("Trainers="+tr[3]+"\r\n")
  815. f.write("Pokemon="+tr[4]+"\r\n")
  816. if !tr[5]
  817. f.write("Challenges="+tr[2].join(",")+"\r\n")
  818. end
  819. pbSaveBTTrainers(tr[0],"PBS/"+tr[3])
  820. pbSaveBattlePokemon(tr[1],"PBS/"+tr[4])
  821. end
  822. }
  823. end
  824.  
  825. def pbSaveBTTrainers(bttrainers,filename)
  826. return if !bttrainers || !filename
  827. btTrainersRequiredTypes={
  828. "Type"=>[0,"e",nil],# Specifies a trainer
  829. "Name"=>[1,"s"],
  830. "BeginSpeech"=>[2,"s"],
  831. "EndSpeechWin"=>[3,"s"],
  832. "EndSpeechLose"=>[4,"s"],
  833. "PokemonNos"=>[5,"*u"]
  834. }
  835. File.open(filename,"wb"){|f|
  836. f.write(0xEF.chr)
  837. f.write(0xBB.chr)
  838. f.write(0xBF.chr)
  839. for i in 0...bttrainers.length
  840. next if !bttrainers[i]
  841. f.write(sprintf("[%03d]\r\n",i))
  842. for key in btTrainersRequiredTypes.keys
  843. schema=btTrainersRequiredTypes[key]
  844. record=bttrainers[i][schema[0]]
  845. next if record==nil
  846. f.write(sprintf("%s=",key))
  847. if key=="Type"
  848. f.write((getConstantName(PBTrainers,record) rescue pbGetTrainerConst(record)))
  849. elsif key=="PokemonNos"
  850. f.write(record.join(",")) # pbWriteCsvRecord somehow won't work here
  851. else
  852. pbWriteCsvRecord(record,f,schema)
  853. end
  854. f.write(sprintf("\r\n"))
  855. end
  856. end
  857. }
  858. end
  859.  
  860. def pbSaveBattlePokemon(btpokemon,filename)
  861. return if !btpokemon || !filename
  862. species={0=>""}
  863. moves={0=>""}
  864. items={0=>""}
  865. natures={}
  866. File.open(filename,"wb"){|f|
  867. for i in 0...btpokemon.length
  868. Graphics.update if i%500==0
  869. pkmn=btpokemon[i]
  870. f.write(pbFastInspect(pkmn,moves,species,items,natures))
  871. f.write("\r\n")
  872. end
  873. }
  874. end
  875.  
  876. def pbFastInspect(pkmn,moves,species,items,natures)
  877. c1=species[pkmn.species] ? species[pkmn.species] :
  878. (species[pkmn.species]=(getConstantName(PBSpecies,pkmn.species) rescue pbGetSpeciesConst(pkmn.species)))
  879. c2=items[pkmn.item] ? items[pkmn.item] :
  880. (items[pkmn.item]=(getConstantName(PBItems,pkmn.item) rescue pbGetItemConst(pkmn.item)))
  881. c3=natures[pkmn.nature] ? natures[pkmn.nature] :
  882. (natures[pkmn.nature]=getConstantName(PBNatures,pkmn.nature))
  883. evlist=""
  884. ev=pkmn.ev
  885. evs=["HP","ATK","DEF","SPD","SA","SD"]
  886. for i in 0...ev
  887. if ((ev&(1<<i))!=0)
  888. evlist+="," if evlist.length>0
  889. evlist+=evs[i]
  890. end
  891. end
  892. c4=moves[pkmn.move1] ? moves[pkmn.move1] :
  893. (moves[pkmn.move1]=(getConstantName(PBMoves,pkmn.move1) rescue pbGetMoveConst(pkmn.move1)))
  894. c5=moves[pkmn.move2] ? moves[pkmn.move2] :
  895. (moves[pkmn.move2]=(getConstantName(PBMoves,pkmn.move2) rescue pbGetMoveConst(pkmn.move2)))
  896. c6=moves[pkmn.move3] ? moves[pkmn.move3] :
  897. (moves[pkmn.move3]=(getConstantName(PBMoves,pkmn.move3) rescue pbGetMoveConst(pkmn.move3)))
  898. c7=moves[pkmn.move4] ? moves[pkmn.move4] :
  899. (moves[pkmn.move4]=(getConstantName(PBMoves,pkmn.move4) rescue pbGetMoveConst(pkmn.move4)))
  900. return "#{c1};#{c2};#{c3};#{evlist};#{c4},#{c5},#{c6},#{c7}"
  901. end
  902.  
  903. def pbSaveAllData
  904. pbSaveTypes; Graphics.update
  905. pbSaveAbilities; Graphics.update
  906. pbSaveMoveData; Graphics.update
  907. pbSaveConnectionData; Graphics.update
  908. pbSaveMetadata; Graphics.update
  909. pbSaveItems; Graphics.update
  910. pbSaveTrainerLists; Graphics.update
  911. pbSaveMachines; Graphics.update
  912. pbSaveEncounterData; Graphics.update
  913. pbSaveTrainerTypes; Graphics.update
  914. pbSaveTrainerBattles; Graphics.update
  915. pbSaveTownMap; Graphics.update
  916. pbSavePhoneData; Graphics.update
  917. pbSavePokemonData; Graphics.update
  918. pbSaveShadowMoves; Graphics.update
  919. end
  920.  
  921.  
  922.  
  923. ################################################################################
  924. # Lists
  925. ################################################################################
  926. def pbListWindow(cmds,width=256)
  927. list=Window_CommandPokemon.newWithSize(cmds,0,0,width,Graphics.height)
  928. list.index=0
  929. list.rowHeight=24
  930. pbSetSmallFont(list.contents)
  931. list.refresh
  932. return list
  933. end
  934.  
  935. def pbChooseSpecies(default)
  936. cmdwin=pbListWindow([],200)
  937. commands=[]
  938. for i in 1..PBSpecies.maxValue
  939. cname=getConstantName(PBSpecies,i) rescue nil
  940. commands.push(_ISPRINTF("{1:03d} {2:s}",i,PBSpecies.getName(i))) if cname
  941. end
  942. ret=pbCommands2(cmdwin,commands,-1,default-1,true)
  943. cmdwin.dispose
  944. return ret>=0 ? ret+1 : 0
  945. end
  946.  
  947. def pbChooseSpeciesOrdered(default)
  948. cmdwin=pbListWindow([],200)
  949. commands=[]
  950. for i in 1..PBSpecies.maxValue
  951. cname=getConstantName(PBSpecies,i) rescue nil
  952. commands.push([i,PBSpecies.getName(i)]) if cname
  953. end
  954. commands.sort! {|a,b| a[1]<=>b[1]}
  955. realcommands=[]
  956. for command in commands
  957. realcommands.push(_ISPRINTF("{1:03d} {2:s}",command[0],command[1]))
  958. end
  959. ret=pbCommands2(cmdwin,realcommands,-1,default-1,true)
  960. cmdwin.dispose
  961. return ret>=0 ? commands[ret][0] : 0
  962. end
  963.  
  964. # Displays a sorted list of Pokémon species, and returns the ID of the species
  965. # selected or 0 if the selection was canceled. defaultItemID, if specified,
  966. # indicates the ID of the species initially shown on the list.
  967. def pbChooseSpeciesList(defaultItemID=0)
  968. cmdwin=pbListWindow([],200)
  969. commands=[]
  970. itemDefault=0
  971. for c in PBSpecies.constants
  972. i=PBSpecies.const_get(c)
  973. if i.is_a?(Integer)
  974. commands.push([i,PBSpecies.getName(i)])
  975. end
  976. end
  977. commands.sort! {|a,b| a[1]<=>b[1]}
  978. if defaultItemID>0
  979. commands.each_with_index {|item,index|
  980. itemDefault=index if item[0]==defaultItemID
  981. }
  982. end
  983. realcommands=[]
  984. for command in commands
  985. realcommands.push(_ISPRINTF("{1:s}",command[1]))
  986. end
  987. ret=pbCommands2(cmdwin,realcommands,-1,itemDefault,true)
  988. cmdwin.dispose
  989. return ret>=0 ? commands[ret][0] : 0
  990. end
  991.  
  992. # Displays a sorted list of moves, and returns the ID of the move selected or
  993. # 0 if the selection was canceled. defaultMoveID, if specified, indicates the
  994. # ID of the move initially shown on the list.
  995. def pbChooseMoveList(defaultMoveID=0)
  996. cmdwin=pbListWindow([],200)
  997. commands=[]
  998. moveDefault=0
  999. for i in 1..PBMoves.maxValue
  1000. name=PBMoves.getName(i)
  1001. commands.push([i,name]) if name!=nil && name!=""
  1002. end
  1003. commands.sort! {|a,b| a[1]<=>b[1]}
  1004. if defaultMoveID>0
  1005. commands.each_with_index {|item,index|
  1006. moveDefault=index if item[0]==defaultMoveID
  1007. }
  1008. end
  1009. realcommands=[]
  1010. for command in commands
  1011. realcommands.push(_ISPRINTF("{1:s}",command[1]))
  1012. end
  1013. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  1014. cmdwin.dispose
  1015. return ret>=0 ? commands[ret][0] : 0
  1016. end
  1017.  
  1018. def pbChooseTypeList(defaultMoveID=0,movetype=false)
  1019. cmdwin=pbListWindow([],200)
  1020. commands=[]
  1021. moveDefault=0
  1022. for i in 0..PBTypes.maxValue
  1023. if !PBTypes.isPseudoType?(i)
  1024. commands.push([i,PBTypes.getName(i)])
  1025. end
  1026. end
  1027. commands.sort! {|a,b| a[1]<=>b[1]}
  1028. if defaultMoveID>0
  1029. commands.each_with_index {|item,index|
  1030. moveDefault=index if item[0]==defaultMoveID
  1031. }
  1032. end
  1033. realcommands=[]
  1034. for command in commands
  1035. realcommands.push(_ISPRINTF("{1:s}",command[1]))
  1036. end
  1037. loop do
  1038. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  1039. retval=ret>=0 ? commands[ret][0] : 0
  1040. cmdwin.dispose
  1041. return retval
  1042. end
  1043. end
  1044.  
  1045. # Displays a sorted list of items, and returns the ID of the item selected or
  1046. # 0 if the selection was canceled. defaultItemID, if specified, indicates the
  1047. # ID of the item initially shown on the list.
  1048. def pbChooseItemList(defaultItemID=0)
  1049. cmdwin=pbListWindow([],200)
  1050. commands=[]
  1051. moveDefault=0
  1052. for c in PBItems.constants
  1053. i=PBItems.const_get(c)
  1054. if i.is_a?(Integer)
  1055. commands.push([i,PBItems.getName(i)])
  1056. end
  1057. end
  1058. commands.sort! {|a,b| a[1]<=>b[1]}
  1059. if defaultItemID>0
  1060. commands.each_with_index {|item,index|
  1061. moveDefault=index if item[0]==defaultItemID
  1062. }
  1063. end
  1064. realcommands=[]
  1065. for command in commands
  1066. realcommands.push(_ISPRINTF("{1:s}",command[1]))
  1067. end
  1068. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  1069. cmdwin.dispose
  1070. return ret>=0 ? commands[ret][0] : 0
  1071. end
  1072.  
  1073. # Displays a sorted list of abilities, and returns the ID of the ability selected
  1074. # or 0 if the selection was canceled. defaultItemID, if specified, indicates the
  1075. # ID of the ability initially shown on the list.
  1076. def pbChooseAbilityList(defaultAbilityID=0)
  1077. cmdwin=pbListWindow([],200)
  1078. commands=[]
  1079. abilityDefault=0
  1080. for c in PBAbilities.constants
  1081. i=PBAbilities.const_get(c)
  1082. if i.is_a?(Integer)
  1083. commands.push([i,PBAbilities.getName(i)])
  1084. end
  1085. end
  1086. commands.sort! {|a,b| a[1]<=>b[1]}
  1087. if defaultAbilityID>0
  1088. commands.each_with_index {|item,index|
  1089. abilityDefault=index if item[0]==defaultAbilityID
  1090. }
  1091. end
  1092. realcommands=[]
  1093. for command in commands
  1094. realcommands.push(sprintf("#{command[1]}"))
  1095. end
  1096. ret=pbCommands2(cmdwin,realcommands,-1,abilityDefault,true)
  1097. cmdwin.dispose
  1098. return ret>=0 ? commands[ret][0] : 0
  1099. end
  1100.  
  1101. def pbCommands2(cmdwindow,commands,cmdIfCancel,defaultindex=-1,noresize=false)
  1102. cmdwindow.z=99999
  1103. cmdwindow.visible=true
  1104. cmdwindow.commands=commands
  1105. if !noresize
  1106. cmdwindow.width=256
  1107. else
  1108. cmdwindow.height=Graphics.height
  1109. end
  1110. cmdwindow.height=Graphics.height if cmdwindow.height>Graphics.height
  1111. cmdwindow.x=0
  1112. cmdwindow.y=0
  1113. cmdwindow.active=true
  1114. cmdwindow.index=defaultindex if defaultindex>=0
  1115. ret=0
  1116. command=0
  1117. loop do
  1118. Graphics.update
  1119. Input.update
  1120. cmdwindow.update
  1121. if Input.trigger?(Input::B)
  1122. if cmdIfCancel>0
  1123. command=cmdIfCancel-1
  1124. break
  1125. elsif cmdIfCancel<0
  1126. command=cmdIfCancel
  1127. break
  1128. end
  1129. end
  1130. if Input.trigger?(Input::C) || (cmdwindow.doubleclick? rescue false)
  1131. command=cmdwindow.index
  1132. break
  1133. end
  1134. end
  1135. ret=command
  1136. cmdwindow.active=false
  1137. return ret
  1138. end
  1139.  
  1140. def pbCommands3(cmdwindow,commands,cmdIfCancel,defaultindex=-1,noresize=false)
  1141. cmdwindow.z=99999
  1142. cmdwindow.visible=true
  1143. cmdwindow.commands=commands
  1144. if !noresize
  1145. cmdwindow.width=256
  1146. else
  1147. cmdwindow.height=Graphics.height
  1148. end
  1149. cmdwindow.height=Graphics.height if cmdwindow.height>Graphics.height
  1150. cmdwindow.x=0
  1151. cmdwindow.y=0
  1152. cmdwindow.active=true
  1153. cmdwindow.index=defaultindex if defaultindex>=0
  1154. ret=[]
  1155. command=0
  1156. loop do
  1157. Graphics.update
  1158. Input.update
  1159. cmdwindow.update
  1160. if Input.trigger?(Input::X)
  1161. command=[5,cmdwindow.index]
  1162. break
  1163. end
  1164. if Input.press?(Input::A)
  1165. if Input.repeat?(Input::UP)
  1166. command=[1,cmdwindow.index]
  1167. break
  1168. elsif Input.repeat?(Input::DOWN)
  1169. command=[2,cmdwindow.index]
  1170. break
  1171. elsif Input.press?(Input::LEFT)
  1172. command=[3,cmdwindow.index]
  1173. break
  1174. elsif Input.press?(Input::RIGHT)
  1175. command=[4,cmdwindow.index]
  1176. break
  1177. end
  1178. end
  1179. if Input.trigger?(Input::B)
  1180. if cmdIfCancel>0
  1181. command=[0,cmdIfCancel-1]
  1182. break
  1183. elsif cmdIfCancel<0
  1184. command=[0,cmdIfCancel]
  1185. break
  1186. end
  1187. end
  1188. if Input.trigger?(Input::C) || (cmdwindow.doubleclick? rescue false)
  1189. command=[0,cmdwindow.index]
  1190. break
  1191. end
  1192. end
  1193. ret=command
  1194. cmdwindow.active=false
  1195. return ret
  1196. end
  1197.  
  1198.  
  1199.  
  1200. ################################################################################
  1201. # Core lister script
  1202. ################################################################################
  1203. def pbListScreen(title,lister)
  1204. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1205. viewport.z=99999
  1206. list=pbListWindow([],256)
  1207. list.viewport=viewport
  1208. list.z=2
  1209. title=Window_UnformattedTextPokemon.new(title)
  1210. title.x=256
  1211. title.y=0
  1212. title.width=Graphics.width-256
  1213. title.height=64
  1214. title.viewport=viewport
  1215. title.z=2
  1216. lister.setViewport(viewport)
  1217. selectedmap=-1
  1218. commands=lister.commands
  1219. selindex=lister.startIndex
  1220. if commands.length==0
  1221. value=lister.value(-1)
  1222. lister.dispose
  1223. return value
  1224. end
  1225. list.commands=commands
  1226. list.index=selindex
  1227. loop do
  1228. Graphics.update
  1229. Input.update
  1230. list.update
  1231. if list.index!=selectedmap
  1232. lister.refresh(list.index)
  1233. selectedmap=list.index
  1234. end
  1235. if Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  1236. break
  1237. elsif Input.trigger?(Input::B)
  1238. selectedmap=-1
  1239. break
  1240. end
  1241. end
  1242. value=lister.value(selectedmap)
  1243. lister.dispose
  1244. title.dispose
  1245. list.dispose
  1246. Input.update
  1247. return value
  1248. end
  1249.  
  1250. def pbListScreenBlock(title,lister)
  1251. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  1252. viewport.z=99999
  1253. list=pbListWindow([],256)
  1254. list.viewport=viewport
  1255. list.z=2
  1256. title=Window_UnformattedTextPokemon.new(title)
  1257. title.x=256
  1258. title.y=0
  1259. title.width=Graphics.width-256
  1260. title.height=64
  1261. title.viewport=viewport
  1262. title.z=2
  1263. lister.setViewport(viewport)
  1264. selectedmap=-1
  1265. commands=lister.commands
  1266. selindex=lister.startIndex
  1267. if commands.length==0
  1268. value=lister.value(-1)
  1269. lister.dispose
  1270. return value
  1271. end
  1272. list.commands=commands
  1273. list.index=selindex
  1274. loop do
  1275. Graphics.update
  1276. Input.update
  1277. list.update
  1278. if list.index!=selectedmap
  1279. lister.refresh(list.index)
  1280. selectedmap=list.index
  1281. end
  1282. if Input.trigger?(Input::A)
  1283. yield(Input::A, lister.value(selectedmap))
  1284. list.commands=lister.commands
  1285. if list.index==list.commands.length
  1286. list.index=list.commands.length
  1287. end
  1288. lister.refresh(list.index)
  1289. elsif Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  1290. yield(Input::C, lister.value(selectedmap))
  1291. list.commands=lister.commands
  1292. if list.index==list.commands.length
  1293. list.index=list.commands.length
  1294. end
  1295. lister.refresh(list.index)
  1296. elsif Input.trigger?(Input::B)
  1297. break
  1298. end
  1299. end
  1300. lister.dispose
  1301. title.dispose
  1302. list.dispose
  1303. Input.update
  1304. end
  1305.  
  1306.  
  1307.  
  1308. ################################################################################
  1309. # General listers
  1310. ################################################################################
  1311. class GraphicsLister
  1312. def initialize(folder,selection)
  1313. @sprite=IconSprite.new(0,0)
  1314. @sprite.bitmap=nil
  1315. @sprite.z=2
  1316. @folder=folder
  1317. @selection=selection
  1318. @commands=[]
  1319. @index=0
  1320. end
  1321.  
  1322. def setViewport(viewport)
  1323. @sprite.viewport=viewport
  1324. end
  1325.  
  1326. def startIndex
  1327. return @index
  1328. end
  1329.  
  1330. def commands
  1331. @commands.clear
  1332. Dir.chdir(@folder){
  1333. Dir.glob("*.png"){|f| @commands.push(f) }
  1334. Dir.glob("*.PNG"){|f| @commands.push(f) }
  1335. Dir.glob("*.gif"){|f| @commands.push(f) }
  1336. Dir.glob("*.GIF"){|f| @commands.push(f) }
  1337. Dir.glob("*.bmp"){|f| @commands.push(f) }
  1338. Dir.glob("*.BMP"){|f| @commands.push(f) }
  1339. Dir.glob("*.jpg"){|f| @commands.push(f) }
  1340. Dir.glob("*.JPG"){|f| @commands.push(f) }
  1341. Dir.glob("*.jpeg"){|f| @commands.push(f) }
  1342. Dir.glob("*.JPEG"){|f| @commands.push(f) }
  1343. }
  1344. @commands.sort!
  1345. @commands.length.times do |i|
  1346. @index=i if @commands[i]==@selection
  1347. end
  1348. if @commands.length==0
  1349. Kernel.pbMessage(_INTL("There are no files."))
  1350. end
  1351. return @commands
  1352. end
  1353.  
  1354. def value(index)
  1355. return (index<0) ? "" : @commands[index]
  1356. end
  1357.  
  1358. def dispose
  1359. @sprite.bitmap.dispose if @sprite.bitmap
  1360. @sprite.dispose
  1361. end
  1362.  
  1363. def refresh(index)
  1364. return if index<0
  1365. @sprite.setBitmap(@folder+@commands[index])
  1366. ww=@sprite.bitmap.width
  1367. wh=@sprite.bitmap.height
  1368. sx=(Graphics.width-256).to_f()/ww
  1369. sy=(Graphics.height-64).to_f()/wh
  1370. if sx<1.0 || sy<1.0
  1371. if sx>sy
  1372. ww=sy*ww
  1373. wh=(Graphics.height-64).to_f()
  1374. else
  1375. wh=sx*wh
  1376. ww=(Graphics.width-256).to_f()
  1377. end
  1378. end
  1379. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1380. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1381. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1382. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1383. end
  1384. end
  1385.  
  1386.  
  1387.  
  1388. class MusicFileLister
  1389. def getPlayingBGM
  1390. $game_system ? $game_system.getPlayingBGM : nil
  1391. end
  1392.  
  1393. def pbPlayBGM(bgm)
  1394. if bgm
  1395. pbBGMPlay(bgm)
  1396. else
  1397. pbBGMStop()
  1398. end
  1399. end
  1400.  
  1401. def initialize(bgm,setting)
  1402. @oldbgm=getPlayingBGM
  1403. @commands=[]
  1404. @bgm=bgm
  1405. @setting=setting
  1406. @index=0
  1407. end
  1408.  
  1409. def startIndex
  1410. return @index
  1411. end
  1412.  
  1413. def setViewport(viewport)
  1414. end
  1415.  
  1416. def commands
  1417. folder=(@bgm) ? "Audio/BGM/" : "Audio/ME/"
  1418. @commands.clear
  1419. Dir.chdir(folder){
  1420. Dir.glob("*.mp3"){|f| @commands.push(f) }
  1421. Dir.glob("*.MP3"){|f| @commands.push(f) }
  1422. Dir.glob("*.mid"){|f| @commands.push(f) }
  1423. Dir.glob("*.MID"){|f| @commands.push(f) }
  1424. }
  1425. @commands.sort!
  1426. @commands.length.times do |i|
  1427. @index=i if @commands[i]==@setting
  1428. end
  1429. if @commands.length==0
  1430. Kernel.pbMessage(_INTL("There are no files."))
  1431. end
  1432. return @commands
  1433. end
  1434.  
  1435. def value(index)
  1436. return (index<0) ? "" : @commands[index]
  1437. end
  1438.  
  1439. def dispose
  1440. pbPlayBGM(@oldbgm)
  1441. end
  1442.  
  1443. def refresh(index)
  1444. return if index<0
  1445. if @bgm
  1446. pbPlayBGM(@commands[index])
  1447. else
  1448. pbPlayBGM("../../Audio/ME/"+@commands[index])
  1449. end
  1450. end
  1451. end
  1452.  
  1453.  
  1454.  
  1455. class MapLister
  1456. def initialize(selmap,addGlobal=false)
  1457. @sprite=SpriteWrapper.new
  1458. @sprite.bitmap=nil
  1459. @sprite.z=2
  1460. @commands=[]
  1461. @maps=pbMapTree
  1462. @addGlobalOffset=(addGlobal) ? 1 : 0
  1463. @index=0
  1464. for i in 0...@maps.length
  1465. @index=i+@addGlobalOffset if @maps[i][0]==selmap
  1466. end
  1467. end
  1468.  
  1469. def setViewport(viewport)
  1470. @sprite.viewport=viewport
  1471. end
  1472.  
  1473. def startIndex
  1474. return @index
  1475. end
  1476.  
  1477. def commands
  1478. @commands.clear
  1479. if @addGlobalOffset==1
  1480. @commands.push(_INTL("[GLOBAL]"))
  1481. end
  1482. for i in 0...@maps.length
  1483. @commands.push(sprintf("%s%03d %s",(" "*@maps[i][2]),@maps[i][0],@maps[i][1]))
  1484. end
  1485. return @commands
  1486. end
  1487.  
  1488. def value(index)
  1489. if @addGlobalOffset==1
  1490. return 0 if index==0
  1491. end
  1492. return (index<0) ? -1 : @maps[index-@addGlobalOffset][0]
  1493. end
  1494.  
  1495. def dispose
  1496. @sprite.bitmap.dispose if @sprite.bitmap
  1497. @sprite.dispose
  1498. end
  1499.  
  1500. def refresh(index)
  1501. @sprite.bitmap.dispose if @sprite.bitmap
  1502. return if index<0
  1503. return if index==0 && @addGlobalOffset==1
  1504. @sprite.bitmap=createMinimap(@maps[index-@addGlobalOffset][0])
  1505. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(@sprite.bitmap.width/2)
  1506. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(@sprite.bitmap.height/2)
  1507. end
  1508. end
  1509.  
  1510.  
  1511.  
  1512. class ItemLister
  1513. def initialize(selection,includeNew=false)
  1514. @sprite=IconSprite.new(0,0)
  1515. @sprite.bitmap=nil
  1516. @sprite.z=2
  1517. @selection=selection
  1518. @commands=[]
  1519. @ids=[]
  1520. @includeNew=includeNew
  1521. @trainers=nil
  1522. @index=0
  1523. end
  1524.  
  1525. def setViewport(viewport)
  1526. @sprite.viewport=viewport
  1527. end
  1528.  
  1529. def startIndex
  1530. return @index
  1531. end
  1532.  
  1533. def commands # Sorted alphabetically
  1534. @commands.clear
  1535. @ids.clear
  1536. @itemdata=readItemList("Data/items.dat")
  1537. cmds=[]
  1538. for i in 1..PBItems.maxValue
  1539. name=@itemdata[i][ITEMNAME]
  1540. if name && name!="" && @itemdata[i][ITEMPOCKET]!=0
  1541. cmds.push([i,name])
  1542. end
  1543. end
  1544. cmds.sort! {|a,b| a[1]<=>b[1]}
  1545. if @includeNew
  1546. @commands.push(_ISPRINTF("[NEW ITEM]"))
  1547. @ids.push(-1)
  1548. end
  1549. for i in cmds
  1550. @commands.push(_ISPRINTF("{1:03d}: {2:s}",i[0],i[1]))
  1551. @ids.push(i[0])
  1552. end
  1553. @index=@selection
  1554. @index=@commands.length-1 if @index>=@commands.length
  1555. @index=0 if @index<0
  1556. return @commands
  1557. end
  1558.  
  1559. =begin
  1560. def commands # Sorted by item index number
  1561. @commands.clear
  1562. @ids.clear
  1563. @itemdata=readItemList("Data/items.dat")
  1564. if @includeNew
  1565. @commands.push(_ISPRINTF("[NEW ITEM]"))
  1566. @ids.push(-1)
  1567. end
  1568. for i in 1..PBItems.maxValue
  1569. # Number: Item name
  1570. name=@itemdata[i][1]
  1571. if name && name!="" && @itemdata[i][2]!=0
  1572. @commands.push(_ISPRINTF("{1:3d}: {2:s}",i,name))
  1573. @ids.push(i)
  1574. end
  1575. end
  1576. @index=@selection
  1577. @index=@commands.length-1 if @index>=@commands.length
  1578. @index=0 if @index<0
  1579. return @commands
  1580. end
  1581. =end
  1582.  
  1583. def value(index)
  1584. return nil if (index<0)
  1585. return -1 if index==0 && @includeNew
  1586. realIndex=index
  1587. return @ids[realIndex]
  1588. end
  1589.  
  1590. def dispose
  1591. @sprite.bitmap.dispose if @sprite.bitmap
  1592. @sprite.dispose
  1593. end
  1594.  
  1595. def refresh(index)
  1596. @sprite.bitmap.dispose if @sprite.bitmap
  1597. return if index<0
  1598. begin
  1599. filename=pbItemIconFile(@ids[index])
  1600. @sprite.setBitmap(filename,0)
  1601. rescue
  1602. @sprite.setBitmap(nil)
  1603. end
  1604. ww=@sprite.bitmap.width
  1605. wh=@sprite.bitmap.height
  1606. sx=(Graphics.width-256).to_f()/ww
  1607. sy=(Graphics.height-64).to_f()/wh
  1608. if sx<1.0 || sy<1.0
  1609. if sx>sy
  1610. ww=sy*ww
  1611. wh=(Graphics.height-64).to_f()
  1612. else
  1613. wh=sx*wh
  1614. ww=(Graphics.width-256).to_f()
  1615. end
  1616. end
  1617. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1618. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1619. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1620. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1621. end
  1622. end
  1623.  
  1624.  
  1625.  
  1626. class TrainerTypeLister
  1627. def initialize(selection,includeNew)
  1628. @sprite=IconSprite.new(0,0)
  1629. @sprite.bitmap=nil
  1630. @sprite.z=2
  1631. @selection=selection
  1632. @commands=[]
  1633. @ids=[]
  1634. @includeNew=includeNew
  1635. @trainers=nil
  1636. @index=0
  1637. end
  1638.  
  1639. def setViewport(viewport)
  1640. @sprite.viewport=viewport
  1641. end
  1642.  
  1643. def startIndex
  1644. return @index
  1645. end
  1646.  
  1647. def commands
  1648. @commands.clear
  1649. @ids.clear
  1650. @trainers=load_data("Data/trainertypes.dat")
  1651. if @includeNew
  1652. @commands.push(_ISPRINTF("[NEW TRAINER TYPE]"))
  1653. @ids.push(-1)
  1654. end
  1655. @trainers.length.times do |i|
  1656. next if !@trainers[i]
  1657. @commands.push(_ISPRINTF("{1:3d}: {2:s}",i,@trainers[i][2]))
  1658. @ids.push(@trainers[i][0])
  1659. end
  1660. @commands.length.times do |i|
  1661. @index=i if @ids[i]==@selection
  1662. end
  1663. return @commands
  1664. end
  1665.  
  1666. def value(index)
  1667. return nil if (index<0)
  1668. return [-1] if @ids[index]==-1
  1669. return @trainers[@ids[index]]
  1670. end
  1671.  
  1672. def dispose
  1673. @sprite.bitmap.dispose if @sprite.bitmap
  1674. @sprite.dispose
  1675. end
  1676.  
  1677. def refresh(index)
  1678. @sprite.bitmap.dispose if @sprite.bitmap
  1679. return if index<0
  1680. begin
  1681. @sprite.setBitmap(pbTrainerSpriteFile(@ids[index]),0)
  1682. rescue
  1683. @sprite.setBitmap(nil)
  1684. end
  1685. ww=@sprite.bitmap.width
  1686. wh=@sprite.bitmap.height
  1687. sx=(Graphics.width-256).to_f()/ww
  1688. sy=(Graphics.height-64).to_f()/wh
  1689. if sx<1.0 || sy<1.0
  1690. if sx>sy
  1691. ww=sy*ww
  1692. wh=(Graphics.height-64).to_f()
  1693. else
  1694. wh=sx*wh
  1695. ww=(Graphics.width-256).to_f()
  1696. end
  1697. end
  1698. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1699. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1700. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1701. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1702. end
  1703. end
  1704.  
  1705.  
  1706.  
  1707. ################################################################################
  1708. # General properties
  1709. ################################################################################
  1710. class UIntProperty
  1711. def initialize(maxdigits)
  1712. @maxdigits=maxdigits
  1713. end
  1714.  
  1715. def set(settingname,oldsetting)
  1716. params=ChooseNumberParams.new
  1717. params.setMaxDigits(@maxdigits)
  1718. params.setDefaultValue(oldsetting||0)
  1719. return Kernel.pbMessageChooseNumber(
  1720. _INTL("Set the value for {1}.",settingname),params)
  1721. end
  1722.  
  1723. def format(value)
  1724. return value.inspect
  1725. end
  1726.  
  1727. def defaultValue
  1728. return 0
  1729. end
  1730. end
  1731.  
  1732.  
  1733.  
  1734. class LimitProperty
  1735. def initialize(maxvalue)
  1736. @maxvalue=maxvalue
  1737. end
  1738.  
  1739. def set(settingname,oldsetting)
  1740. oldsetting=1 if !oldsetting
  1741. params=ChooseNumberParams.new
  1742. params.setRange(0,@maxvalue)
  1743. params.setDefaultValue(oldsetting)
  1744. ret=Kernel.pbMessageChooseNumber(
  1745. _INTL("Set the value for {1}.",settingname),params)
  1746. return ret
  1747. end
  1748.  
  1749. def format(value)
  1750. return value.inspect
  1751. end
  1752.  
  1753. def defaultValue
  1754. return 0
  1755. end
  1756. end
  1757.  
  1758.  
  1759.  
  1760. class NonzeroLimitProperty
  1761. def initialize(maxvalue)
  1762. @maxvalue=maxvalue
  1763. end
  1764.  
  1765. def set(settingname,oldsetting)
  1766. oldsetting=1 if !oldsetting
  1767. params=ChooseNumberParams.new
  1768. params.setRange(1,@maxvalue)
  1769. params.setDefaultValue(oldsetting)
  1770. ret=Kernel.pbMessageChooseNumber(
  1771. _INTL("Set the value for {1}.",settingname),params)
  1772. return ret
  1773. end
  1774.  
  1775. def format(value)
  1776. return value.inspect
  1777. end
  1778.  
  1779. def defaultValue
  1780. return 0
  1781. end
  1782. end
  1783.  
  1784.  
  1785.  
  1786. class ReadOnlyProperty
  1787. def self.set(settingname,oldsetting)
  1788. Kernel.pbMessage(_INTL("This property cannot be edited."))
  1789. return oldsetting
  1790. end
  1791.  
  1792. def self.format(value)
  1793. return value.inspect
  1794. end
  1795. end
  1796.  
  1797.  
  1798.  
  1799. module UndefinedProperty
  1800. def self.set(settingname,oldsetting)
  1801. Kernel.pbMessage(_INTL("This property can't be edited here at this time."))
  1802. return oldsetting
  1803. end
  1804.  
  1805. def self.format(value)
  1806. return value.inspect
  1807. end
  1808. end
  1809.  
  1810.  
  1811.  
  1812. class EnumProperty
  1813. def initialize(values)
  1814. @values=values
  1815. end
  1816.  
  1817. def set(settingname,oldsetting)
  1818. commands=[]
  1819. for value in @values
  1820. commands.push(value)
  1821. end
  1822. cmd=Kernel.pbMessage(_INTL("Choose a value for {1}.",settingname),commands,-1)
  1823. return oldsetting if cmd<0
  1824. return cmd
  1825. end
  1826.  
  1827. def defaultValue
  1828. return 0
  1829. end
  1830.  
  1831. def format(value)
  1832. return value ? @values[value] : value.inspect
  1833. end
  1834. end
  1835.  
  1836.  
  1837.  
  1838. module BooleanProperty
  1839. def self.set(settingname,oldsetting)
  1840. return Kernel.pbConfirmMessage(_INTL("Enable the setting {1}?",settingname)) ? true : false
  1841. end
  1842.  
  1843. def self.format(value)
  1844. return value.inspect
  1845. end
  1846. end
  1847.  
  1848.  
  1849.  
  1850. module StringProperty
  1851. def self.set(settingname,oldsetting)
  1852. message=Kernel.pbMessageFreeText(_INTL("Set the value for {1}.",settingname),
  1853. oldsetting ? oldsetting : "",false,256,Graphics.width)
  1854. end
  1855.  
  1856. def self.format(value)
  1857. return value
  1858. end
  1859. end
  1860.  
  1861.  
  1862.  
  1863. class LimitStringProperty
  1864. def initialize(limit)
  1865. @limit=limit
  1866. end
  1867.  
  1868. def set(settingname,oldsetting)
  1869. message=Kernel.pbMessageFreeText(_INTL("Set the value for {1}.",settingname),
  1870. oldsetting ? oldsetting : "",false,@limit)
  1871. end
  1872.  
  1873. def format(value)
  1874. return value
  1875. end
  1876. end
  1877.  
  1878.  
  1879.  
  1880. module BGMProperty
  1881. def self.set(settingname,oldsetting)
  1882. chosenmap=pbListScreen(settingname,MusicFileLister.new(true,oldsetting))
  1883. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1884. end
  1885.  
  1886. def self.format(value)
  1887. return value
  1888. end
  1889. end
  1890.  
  1891.  
  1892.  
  1893. module MEProperty
  1894. def self.set(settingname,oldsetting)
  1895. chosenmap=pbListScreen(settingname,MusicFileLister.new(false,oldsetting))
  1896. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1897. end
  1898.  
  1899. def self.format(value)
  1900. return value
  1901. end
  1902. end
  1903.  
  1904.  
  1905.  
  1906. module WindowskinProperty
  1907. def self.set(settingname,oldsetting)
  1908. chosenmap=pbListScreen(settingname,
  1909. GraphicsLister.new("Graphics/Windowskins/",oldsetting))
  1910. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1911. end
  1912.  
  1913. def self.format(value)
  1914. return value
  1915. end
  1916. end
  1917.  
  1918.  
  1919.  
  1920. module TrainerTypeProperty
  1921. def self.set(settingname,oldsetting)
  1922. chosenmap=pbListScreen(settingname,
  1923. TrainerTypeLister.new(oldsetting,false))
  1924. return chosenmap ? chosenmap[0] : oldsetting
  1925. end
  1926.  
  1927. def self.format(value)
  1928. return !value ? value.inspect : PBTrainers.getName(value)
  1929. end
  1930. end
  1931.  
  1932.  
  1933.  
  1934. module SpeciesProperty
  1935. def self.set(settingname,oldsetting)
  1936. ret=pbChooseSpeciesList(oldsetting ? oldsetting : 1)
  1937. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1938. end
  1939.  
  1940. def self.format(value)
  1941. return value ? PBSpecies.getName(value) : "-"
  1942. end
  1943.  
  1944. def self.defaultValue
  1945. return 0
  1946. end
  1947. end
  1948.  
  1949.  
  1950.  
  1951. module TypeProperty
  1952. def self.set(settingname,oldsetting)
  1953. ret=pbChooseTypeList(oldsetting ? oldsetting : 0)
  1954. return (ret<0) ? (oldsetting ? oldsetting : 0) : ret
  1955. end
  1956.  
  1957. def self.format(value)
  1958. return value ? PBTypes.getName(value) : "-"
  1959. end
  1960.  
  1961. def self.defaultValue
  1962. return 0
  1963. end
  1964. end
  1965.  
  1966.  
  1967.  
  1968. module MoveProperty
  1969. def self.set(settingname,oldsetting)
  1970. ret=pbChooseMoveList(oldsetting ? oldsetting : 1)
  1971. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1972. end
  1973.  
  1974. def self.format(value)
  1975. return value ? PBMoves.getName(value) : "-"
  1976. end
  1977.  
  1978. def self.defaultValue
  1979. return 0
  1980. end
  1981. end
  1982.  
  1983.  
  1984.  
  1985. module ItemProperty
  1986. def self.set(settingname,oldsetting)
  1987. ret=pbChooseItemList(oldsetting ? oldsetting : 1)
  1988. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1989. end
  1990.  
  1991. def self.format(value)
  1992. return value ? PBItems.getName(value) : "-"
  1993. end
  1994.  
  1995. def self.defaultValue
  1996. return 0
  1997. end
  1998. end
  1999.  
  2000.  
  2001.  
  2002. module NatureProperty
  2003. def self.set(settingname,oldsetting)
  2004. commands=[]
  2005. (PBNatures.getCount).times do |i|
  2006. commands.push(PBNatures.getName(i))
  2007. end
  2008. ret=Kernel.pbShowCommands(nil,commands,-1)
  2009. return ret
  2010. end
  2011.  
  2012. def self.format(value)
  2013. return "" if !value
  2014. return (value>=0) ? getConstantName(PBNatures,value) : ""
  2015. end
  2016.  
  2017. def self.defaultValue
  2018. return 0
  2019. end
  2020. end
  2021.  
  2022.  
  2023.  
  2024. ################################################################################
  2025. # Core property editor script
  2026. ################################################################################
  2027. def pbPropertyList(title,data,properties,saveprompt=false)
  2028. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  2029. viewport.z=99999
  2030. list=pbListWindow([],Graphics.width*5/10)
  2031. list.viewport=viewport
  2032. list.z=2
  2033. title=Window_UnformattedTextPokemon.new(title)
  2034. title.x=list.width
  2035. title.y=0
  2036. title.width=Graphics.width*5/10
  2037. title.height=64
  2038. title.viewport=viewport
  2039. title.z=2
  2040. desc=Window_UnformattedTextPokemon.new("")
  2041. desc.x=list.width
  2042. desc.y=title.height
  2043. desc.width=Graphics.width*5/10
  2044. desc.height=Graphics.height-title.height
  2045. desc.viewport=viewport
  2046. desc.z=2
  2047. selectedmap=-1
  2048. index=0
  2049. retval=nil
  2050. commands=[]
  2051. for i in 0...properties.length
  2052. propobj=properties[i][1]
  2053. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2054. end
  2055. list.commands=commands
  2056. list.index=0
  2057. begin
  2058. loop do
  2059. Graphics.update
  2060. Input.update
  2061. list.update
  2062. desc.update
  2063. if list.index!=selectedmap
  2064. desc.text=properties[list.index][2]
  2065. selectedmap=list.index
  2066. end
  2067. if Input.trigger?(Input::A)
  2068. propobj=properties[selectedmap][1]
  2069. if propobj!=ReadOnlyProperty && !propobj.is_a?(ReadOnlyProperty) &&
  2070. Kernel.pbConfirmMessage(_INTL("Reset the setting {1}?",properties[selectedmap][0]))
  2071. if propobj.respond_to?("defaultValue")
  2072. data[selectedmap]=propobj.defaultValue
  2073. else
  2074. data[selectedmap]=nil
  2075. end
  2076. end
  2077. commands.clear
  2078. for i in 0...properties.length
  2079. propobj=properties[i][1]
  2080. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2081. end
  2082. list.commands=commands
  2083. elsif Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  2084. propobj=properties[selectedmap][1]
  2085. oldsetting=data[selectedmap]
  2086. newsetting=propobj.set(properties[selectedmap][0],oldsetting)
  2087. data[selectedmap]=newsetting
  2088. commands.clear
  2089. for i in 0...properties.length
  2090. propobj=properties[i][1]
  2091. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2092. end
  2093. list.commands=commands
  2094. break
  2095. elsif Input.trigger?(Input::B)
  2096. selectedmap=-1
  2097. break
  2098. end
  2099. end
  2100. if selectedmap==-1 && saveprompt
  2101. cmd=Kernel.pbMessage(_INTL("Save changes?"),
  2102. [_INTL("Yes"),_INTL("No"),_INTL("Cancel")],3)
  2103. if cmd==2
  2104. selectedmap=list.index
  2105. else
  2106. retval=(cmd==0)
  2107. end
  2108. end
  2109. end while selectedmap!=-1
  2110. title.dispose
  2111. list.dispose
  2112. desc.dispose
  2113. Input.update
  2114. return retval
  2115. end
  2116.  
  2117.  
  2118.  
  2119. ################################################################################
  2120. # Encounters editor
  2121. ################################################################################
  2122. def pbEncounterEditorTypes(enc,enccmd)
  2123. commands=[]
  2124. indexes=[]
  2125. haveblank=false
  2126. if enc
  2127. commands.push(_INTL("Density: {1},{2},{3}",
  2128. enc[0][EncounterTypes::Land],
  2129. enc[0][EncounterTypes::Cave],
  2130. enc[0][EncounterTypes::Water]))
  2131. indexes.push(-2)
  2132. for i in 0...EncounterTypes::EnctypeChances.length
  2133. if enc[1][i]
  2134. commands.push(EncounterTypes::Names[i])
  2135. indexes.push(i)
  2136. else
  2137. haveblank=true
  2138. end
  2139. end
  2140. else
  2141. commands.push(_INTL("Density: Not Defined Yet"))
  2142. indexes.push(-2)
  2143. haveblank=true
  2144. end
  2145. if haveblank
  2146. commands.push(_INTL("[New Encounter Type]"))
  2147. indexes.push(-3)
  2148. end
  2149. enccmd.z=99999
  2150. enccmd.visible=true
  2151. enccmd.commands=commands
  2152. enccmd.height=Graphics.height if enccmd.height>Graphics.height
  2153. enccmd.x=0
  2154. enccmd.y=0
  2155. enccmd.active=true
  2156. enccmd.index=0
  2157. ret=0
  2158. command=0
  2159. loop do
  2160. Graphics.update
  2161. Input.update
  2162. enccmd.update
  2163. if Input.trigger?(Input::A) && indexes[enccmd.index]>=0
  2164. if Kernel.pbConfirmMessage(_INTL("Delete the encounter type {1}?",commands[enccmd.index]))
  2165. enc[1][indexes[enccmd.index]]=nil
  2166. commands.delete_at(enccmd.index)
  2167. indexes.delete_at(enccmd.index)
  2168. enccmd.commands=commands
  2169. if enccmd.index>=enccmd.commands.length
  2170. enccmd.index=enccmd.commands.length
  2171. end
  2172. end
  2173. end
  2174. if Input.trigger?(Input::B)
  2175. command=-1
  2176. break
  2177. end
  2178. if Input.trigger?(Input::C) || (enccmd.doubleclick? rescue false)
  2179. command=enccmd.index
  2180. break
  2181. end
  2182. end
  2183. ret=command
  2184. enccmd.active=false
  2185. return ret<0 ? -1 : indexes[ret]
  2186. end
  2187.  
  2188. def pbNewEncounterType(enc)
  2189. cmdwin=pbListWindow([])
  2190. commands=[]
  2191. indexes=[]
  2192. for i in 0...EncounterTypes::EnctypeChances.length
  2193. dogen=false
  2194. if !enc[1][i]
  2195. if i==0
  2196. dogen=true unless enc[1][EncounterTypes::Cave]
  2197. elsif i==1
  2198. dogen=true unless enc[1][EncounterTypes::Land] ||
  2199. enc[1][EncounterTypes::LandMorning] ||
  2200. enc[1][EncounterTypes::LandDay] ||
  2201. enc[1][EncounterTypes::LandNight] ||
  2202. enc[1][EncounterTypes::BugContest]
  2203. else
  2204. dogen=true
  2205. end
  2206. end
  2207. if dogen
  2208. commands.push(EncounterTypes::Names[i])
  2209. indexes.push(i)
  2210. end
  2211. end
  2212. ret=pbCommands2(cmdwin,commands,-1)
  2213. ret=(ret<0) ? -1 : indexes[ret]
  2214. if ret>=0
  2215. chances=EncounterTypes::EnctypeChances[ret]
  2216. enc[1][ret]=[]
  2217. for i in 0...chances.length
  2218. enc[1][ret].push([1,5,5])
  2219. end
  2220. end
  2221. cmdwin.dispose
  2222. return ret
  2223. end
  2224.  
  2225. def pbEditEncounterType(enc,etype)
  2226. commands=[]
  2227. cmdwin=pbListWindow([])
  2228. chances=EncounterTypes::EnctypeChances[etype]
  2229. chancetotal=0
  2230. chances.each {|a| chancetotal+=a}
  2231. enctype=enc[1][etype]
  2232. for i in 0...chances.length
  2233. enctype[i]=[1,5,5] if !enctype[i]
  2234. end
  2235. ret=0
  2236. loop do
  2237. commands.clear
  2238. for i in 0...enctype.length
  2239. ch=chances[i]
  2240. ch=sprintf("%.1f",100.0*chances[i]/chancetotal) if chancetotal!=100
  2241. if enctype[i][1]==enctype[i][2]
  2242. commands.push(_INTL("{1}% {2} (Lv.{3})",
  2243. ch,PBSpecies.getName(enctype[i][0]),
  2244. enctype[i][1]
  2245. ))
  2246. else
  2247. commands.push(_INTL("{1}% {2} (Lv.{3}-Lv.{4})",
  2248. ch,PBSpecies.getName(enctype[i][0]),
  2249. enctype[i][1],
  2250. enctype[i][2]
  2251. ))
  2252. end
  2253. end
  2254. ret=pbCommands2(cmdwin,commands,-1,ret)
  2255. break if ret<0
  2256. species=pbChooseSpecies(enctype[ret][0])
  2257. next if species<=0
  2258. enctype[ret][0]=species if species>0
  2259. minlevel=0
  2260. maxlevel=0
  2261. params=ChooseNumberParams.new
  2262. params.setRange(1,PBExperience::MAXLEVEL)
  2263. params.setDefaultValue(enctype[ret][1])
  2264. minlevel=Kernel.pbMessageChooseNumber(_INTL("Set the minimum level."),params)
  2265. params=ChooseNumberParams.new
  2266. params.setRange(minlevel,PBExperience::MAXLEVEL)
  2267. params.setDefaultValue(minlevel)
  2268. maxlevel=Kernel.pbMessageChooseNumber(_INTL("Set the maximum level."),params)
  2269. enctype[ret][1]=minlevel
  2270. enctype[ret][2]=maxlevel
  2271. end
  2272. cmdwin.dispose
  2273. end
  2274.  
  2275. def pbEncounterEditorDensity(enc)
  2276. params=ChooseNumberParams.new
  2277. params.setRange(0,100)
  2278. params.setDefaultValue(enc[0][EncounterTypes::Land])
  2279. enc[0][EncounterTypes::Land]=Kernel.pbMessageChooseNumber(
  2280. _INTL("Set the density of Pokémon on land (default {1}).",
  2281. EncounterTypes::EnctypeDensities[EncounterTypes::Land]),params)
  2282. params=ChooseNumberParams.new
  2283. params.setRange(0,100)
  2284. params.setDefaultValue(enc[0][EncounterTypes::Cave])
  2285. enc[0][EncounterTypes::Cave]=Kernel.pbMessageChooseNumber(
  2286. _INTL("Set the density of Pokémon in caves (default {1}).",
  2287. EncounterTypes::EnctypeDensities[EncounterTypes::Cave]),params)
  2288. params=ChooseNumberParams.new
  2289. params.setRange(0,100)
  2290. params.setDefaultValue(enc[0][EncounterTypes::Water])
  2291. enc[0][EncounterTypes::Water]=Kernel.pbMessageChooseNumber(
  2292. _INTL("Set the density of Pokémon on water (default {1}).",
  2293. EncounterTypes::EnctypeDensities[EncounterTypes::Water]),params)
  2294. for i in 0...EncounterTypes::EnctypeCompileDens.length
  2295. t=EncounterTypes::EnctypeCompileDens[i]
  2296. next if !t || t==0
  2297. enc[0][i]=enc[0][EncounterTypes::Land] if t==1
  2298. enc[0][i]=enc[0][EncounterTypes::Cave] if t==2
  2299. enc[0][i]=enc[0][EncounterTypes::Water] if t==3
  2300. end
  2301. end
  2302.  
  2303. def pbEncounterEditorMap(encdata,map)
  2304. enccmd=pbListWindow([])
  2305. # This window displays the help text
  2306. enchelp=Window_UnformattedTextPokemon.new("")
  2307. enchelp.z=99999
  2308. enchelp.x=256
  2309. enchelp.y=0
  2310. enchelp.width=224
  2311. enchelp.height=96
  2312. mapinfos=load_data("Data/MapInfos.rxdata")
  2313. mapname=mapinfos[map].name
  2314. lastchoice=0
  2315. loop do
  2316. enc=encdata[map]
  2317. enchelp.text=_INTL("{1}",mapname)
  2318. choice=pbEncounterEditorTypes(enc,enccmd)
  2319. if !enc
  2320. enc=[EncounterTypes::EnctypeDensities.clone,[]]
  2321. encdata[map]=enc
  2322. end
  2323. if choice==-2
  2324. pbEncounterEditorDensity(enc)
  2325. elsif choice==-1
  2326. break
  2327. elsif choice==-3
  2328. ret=pbNewEncounterType(enc)
  2329. if ret>=0
  2330. enchelp.text=_INTL("{1}\r\n{2}",mapname,EncounterTypes::Names[ret])
  2331. pbEditEncounterType(enc,ret)
  2332. end
  2333. else
  2334. enchelp.text=_INTL("{1}\r\n{2}",mapname,EncounterTypes::Names[choice])
  2335. pbEditEncounterType(enc,choice)
  2336. end
  2337. end
  2338. if encdata[map][1].length==0
  2339. encdata[map]=nil
  2340. end
  2341. enccmd.dispose
  2342. enchelp.dispose
  2343. Input.update
  2344. end
  2345.  
  2346.  
  2347.  
  2348. ################################################################################
  2349. # Trainer type editor
  2350. ################################################################################
  2351. def pbTrainerTypeEditorNew(trconst)
  2352. data=load_data("Data/trainertypes.dat")
  2353. # Get the first unused ID after all existing t-types for the new t-type to use.
  2354. maxid=-1
  2355. for rec in data
  2356. next if !rec
  2357. maxid=[maxid,rec[0]].max
  2358. end
  2359. trainertype=maxid+1
  2360. trname=Kernel.pbMessageFreeText(_INTL("Please enter the trainer type's name."),
  2361. trconst ? trconst.gsub(/_+/," ") : "",false,256)
  2362. if trname=="" && !trconst
  2363. return -1
  2364. else
  2365. # Create a default name if there is none.
  2366. if !trconst
  2367. trconst=trname.gsub(/[^A-Za-z0-9_]/,"")
  2368. trconst=trconst.sub(/^([a-z])/){ $1.upcase }
  2369. if trconst.length==0
  2370. trconst=sprintf("T_%03d",trainertype)
  2371. elsif !trconst[0,1][/[A-Z]/]
  2372. trconst="T_"+trconst
  2373. end
  2374. end
  2375. trname=trconst if trname==""
  2376. # Create an internal name based on the trainer type's name.
  2377. cname=trname.gsub(/é/,"e")
  2378. cname=cname.gsub(/[^A-Za-z0-9_]/,"")
  2379. cname=cname.upcase
  2380. if hasConst?(PBTrainers,cname)
  2381. suffix=1
  2382. 100.times do
  2383. tname=sprintf("%s_%d",cname,suffix)
  2384. if !hasConst?(PBTrainers,tname)
  2385. cname=tname
  2386. break
  2387. end
  2388. suffix+=1
  2389. end
  2390. end
  2391. if hasConst?(PBTrainers,cname)
  2392. Kernel.pbMessage(_INTL("Failed to create the trainer type. Choose a different name."))
  2393. return -1
  2394. end
  2395. record=[]
  2396. record[0]=trainertype
  2397. record[1]=cname
  2398. record[2]=trname
  2399. record[7]=Kernel.pbMessage(_INTL("Is the Trainer male, female, or mixed gender?"),[
  2400. _INTL("Male"),_INTL("Female"),_INTL("Mixed")],0)
  2401. params=ChooseNumberParams.new
  2402. params.setRange(0,255)
  2403. params.setDefaultValue(30)
  2404. record[3]=Kernel.pbMessageChooseNumber(
  2405. _INTL("Set the money per level won for defeating the Trainer."),params)
  2406. record[8]=record[3]
  2407. PBTrainers.const_set(cname,record[0])
  2408. data[record[0]]=record
  2409. save_data(data,"Data/trainertypes.dat")
  2410. pbConvertTrainerData
  2411. Kernel.pbMessage(_INTL("The Trainer type was created (ID: {1}).",record[0]))
  2412. Kernel.pbMessage(
  2413. _ISPRINTF("Put the Trainer's graphic (trainer{1:03d}.png or trainer{2:s}.png) in Graphics/Characters, or it will be blank.",
  2414. record[0],getConstantName(PBTrainers,record[0])))
  2415. return record[0]
  2416. end
  2417. end
  2418.  
  2419. def pbTrainerTypeEditorSave(trainertype,ttdata)
  2420. record=[]
  2421. record[0]=trainertype
  2422. for i in 0..ttdata.length
  2423. record.push(ttdata[i])
  2424. end
  2425. setConstantName(PBTrainers,trainertype,ttdata[0])
  2426. data=load_data("Data/trainertypes.dat")
  2427. data[record[0]]=record
  2428. data=save_data(data,"Data/trainertypes.dat")
  2429. pbConvertTrainerData
  2430. end
  2431.  
  2432. def pbTrainerTypeEditor
  2433. selection=0
  2434. trainerTypes=[
  2435. [_INTL("Internal Name"),ReadOnlyProperty,
  2436. _INTL("Internal name that appears in constructs like PBTrainers::XXX.")],
  2437. [_INTL("Trainer Name"),StringProperty,
  2438. _INTL("Name of the trainer type as displayed by the game.")],
  2439. [_INTL("Money Per Level"),LimitProperty.new(255),
  2440. _INTL("Player earns this amount times the highest level among the trainer's Pokémon.")],
  2441. [_INTL("Battle BGM"),BGMProperty,
  2442. _INTL("BGM played in battles against trainers of this type.")],
  2443. [_INTL("Battle End ME"),MEProperty,
  2444. _INTL("ME played when player wins battles against trainers of this type.")],
  2445. [_INTL("Battle Intro ME"),MEProperty,
  2446. _INTL("ME played before battles against trainers of this type.")],
  2447. [_INTL("Gender"),EnumProperty.new([_INTL("Male"),_INTL("Female"),_INTL("Mixed gender")]),
  2448. _INTL("Gender of this Trainer type.")],
  2449. [_INTL("Skill"),LimitProperty.new(255),
  2450. _INTL("Skill level of this Trainer type.")],
  2451. ]
  2452. pbListScreenBlock(_INTL("Trainer Types"),TrainerTypeLister.new(selection,true)){|button,trtype|
  2453. if trtype
  2454. if button==Input::A
  2455. if trtype[0]>=0
  2456. if Kernel.pbConfirmMessageSerious("Delete this trainer type?")
  2457. data=load_data("Data/trainertypes.dat")
  2458. removeConstantValue(PBTrainers,trtype[0])
  2459. data[trtype[0]]=nil
  2460. save_data(data,"Data/trainertypes.dat")
  2461. pbConvertTrainerData
  2462. Kernel.pbMessage(_INTL("The Trainer type was deleted."))
  2463. end
  2464. end
  2465. elsif button==Input::C
  2466. selection=trtype[0]
  2467. if selection<0
  2468. newid=pbTrainerTypeEditorNew(nil)
  2469. if newid>=0
  2470. selection=newid
  2471. end
  2472. else
  2473. data=[]
  2474. for i in 1..trtype.length
  2475. data.push(trtype[i])
  2476. end
  2477. # trtype[2] contains trainer's name to display as title
  2478. save=pbPropertyList(trtype[2],data,trainerTypes,true)
  2479. if save
  2480. pbTrainerTypeEditorSave(selection,data)
  2481. end
  2482. end
  2483. end
  2484. end
  2485. }
  2486. end
  2487.  
  2488.  
  2489.  
  2490. ################################################################################
  2491. # Trainer editor
  2492. ################################################################################
  2493. class TrainerBattleLister
  2494. def initialize(selection,includeNew)
  2495. @sprite=IconSprite.new
  2496. @sprite.bitmap=nil
  2497. @sprite.z=2
  2498. @selection=selection
  2499. @commands=[]
  2500. @ids=[]
  2501. @includeNew=includeNew
  2502. @trainers=nil
  2503. @index=0
  2504. end
  2505.  
  2506. def setViewport(viewport)
  2507. @sprite.viewport=viewport
  2508. end
  2509.  
  2510. def startIndex
  2511. return @index
  2512. end
  2513.  
  2514. def commands
  2515. @commands.clear
  2516. @ids.clear
  2517. @trainers=load_data("Data/trainers.dat")
  2518. if @includeNew
  2519. @commands.push(_ISPRINTF("[NEW TRAINER BATTLE]"))
  2520. @ids.push(-1)
  2521. end
  2522. @trainers.length.times do |i|
  2523. next if !@trainers[i]
  2524. # Index: TrainerType TrainerName (version)
  2525. @commands.push(_ISPRINTF("{1:3d}: {2:s} {3:s} ({4:s})",i,
  2526. PBTrainers.getName(@trainers[i][0]),@trainers[i][1],@trainers[i][4])) # Trainer's name must not be localized
  2527. # Trainer type ID
  2528. @ids.push(@trainers[i][0])
  2529. end
  2530. @index=@selection
  2531. @index=@commands.length-1 if @index>=@commands.length
  2532. @index=0 if @index<0
  2533. return @commands
  2534. end
  2535.  
  2536. def value(index)
  2537. return nil if (index<0)
  2538. return [-1,nil] if index==0 && @includeNew
  2539. realIndex=(@includeNew) ? index-1 : index
  2540. return [realIndex,@trainers[realIndex]]
  2541. end
  2542.  
  2543. def dispose
  2544. @sprite.bitmap.dispose if @sprite.bitmap
  2545. @sprite.dispose
  2546. end
  2547.  
  2548. def refresh(index)
  2549. @sprite.bitmap.dispose if @sprite.bitmap
  2550. return if index<0
  2551. begin
  2552. @sprite.bitmap=AnimatedBitmapWrapper.new(pbTrainerSpriteFile(@ids[index]),0,2).bitmap
  2553. rescue
  2554. @sprite.setBitmap(nil)
  2555. end
  2556. ww=@sprite.src_rect.width
  2557. wh=@sprite.src_rect.height
  2558. sx=(Graphics.width-256).to_f()/ww
  2559. sy=(Graphics.height-64).to_f()/wh
  2560. if sx<1.0 || sy<1.0
  2561. if sx>sy
  2562. ww=sy*ww
  2563. wh=(Graphics.height-64).to_f()
  2564. else
  2565. wh=sx*wh
  2566. ww=(Graphics.width-256).to_f()
  2567. end
  2568. end
  2569. @sprite.zoom_x=ww*1.0/@sprite.src_rect.width
  2570. @sprite.zoom_y=wh*1.0/@sprite.src_rect.height
  2571. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  2572. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  2573. end
  2574. end
  2575.  
  2576.  
  2577.  
  2578. module TrainerBattleProperty
  2579. def self.set(settingname,oldsetting)
  2580. return oldsetting if !oldsetting
  2581. properties=[
  2582. [_INTL("Trainer Type"),TrainerTypeProperty,
  2583. _INTL("Name of the trainer type for this Trainer.")],
  2584. [_INTL("Trainer Name"),StringProperty,
  2585. _INTL("Name of the Trainer.")],
  2586. [_INTL("Battle ID"),LimitProperty.new(255),
  2587. _INTL("ID used to distinguish Trainers with the same name and trainer type.")],
  2588. [_INTL("Pokémon 1"),TrainerPokemonProperty,
  2589. _INTL("First Pokémon.")],
  2590. [_INTL("Pokémon 2"),TrainerPokemonProperty,
  2591. _INTL("Second Pokémon.")],
  2592. [_INTL("Pokémon 3"),TrainerPokemonProperty,
  2593. _INTL("Third Pokémon.")],
  2594. [_INTL("Pokémon 4"),TrainerPokemonProperty,
  2595. _INTL("Fourth Pokémon.")],
  2596. [_INTL("Pokémon 5"),TrainerPokemonProperty,
  2597. _INTL("Fifth Pokémon.")],
  2598. [_INTL("Pokémon 6"),TrainerPokemonProperty,
  2599. _INTL("Sixth Pokémon.")],
  2600. [_INTL("Item 1"),ItemProperty,
  2601. _INTL("Item used by the trainer during battle.")],
  2602. [_INTL("Item 2"),ItemProperty,
  2603. _INTL("Item used by the trainer during battle.")],
  2604. [_INTL("Item 3"),ItemProperty,
  2605. _INTL("Item used by the trainer during battle.")],
  2606. [_INTL("Item 4"),ItemProperty,
  2607. _INTL("Item used by the trainer during battle.")],
  2608. [_INTL("Item 5"),ItemProperty,
  2609. _INTL("Item used by the trainer during battle.")],
  2610. [_INTL("Item 6"),ItemProperty,
  2611. _INTL("Item used by the trainer during battle.")],
  2612. [_INTL("Item 7"),ItemProperty,
  2613. _INTL("Item used by the trainer during battle.")],
  2614. [_INTL("Item 8"),ItemProperty,
  2615. _INTL("Item used by the trainer during battle.")]
  2616. ]
  2617. if !pbPropertyList(settingname,oldsetting,properties,true)
  2618. oldsetting=nil
  2619. else
  2620. oldsetting=nil if !oldsetting[0] || oldsetting[0]==0
  2621. end
  2622. return oldsetting
  2623. end
  2624.  
  2625. def self.format(value)
  2626. return value.inspect
  2627. end
  2628. end
  2629.  
  2630.  
  2631.  
  2632. def pbTrainerBattleEditor
  2633. selection=0
  2634. trainers=load_data("Data/trainers.dat")
  2635. trainertypes=load_data("Data/trainertypes.dat")
  2636. modified=false
  2637. for trainer in trainers
  2638. trtype=trainer[0]
  2639. if !trainertypes || !trainertypes[trtype]
  2640. trainer[0]=0
  2641. modified=true
  2642. end
  2643. end
  2644. if modified
  2645. save_data(trainers,"Data/trainers.dat")
  2646. pbConvertTrainerData
  2647. end
  2648. pbListScreenBlock(_INTL("Trainer Battles"),TrainerBattleLister.new(selection,true)){|button,trtype|
  2649. if trtype
  2650. index=trtype[0]
  2651. trainerdata=trtype[1]
  2652. if button==Input::A
  2653. if index>=0
  2654. if Kernel.pbConfirmMessageSerious("Delete this trainer battle?")
  2655. data=load_data("Data/trainers.dat")
  2656. data.delete_at(index)
  2657. save_data(data,"Data/trainers.dat")
  2658. pbConvertTrainerData
  2659. Kernel.pbMessage(_INTL("The Trainer battle was deleted."))
  2660. end
  2661. end
  2662. elsif button==Input::C
  2663. selection=index
  2664. if selection<0
  2665. ret=Kernel.pbMessage(_INTL("First, define the type of trainer."),[
  2666. _INTL("Use existing type"),_INTL("Use new type"),_INTL("Cancel")
  2667. ],3)
  2668. trainertype=-1
  2669. trainername=""
  2670. if ret==0
  2671. trainertype=pbListScreen(_INTL("Trainer Type"),TrainerTypeLister.new(0,false))
  2672. next if !trainertype
  2673. trainertype=trainertype[0]
  2674. next if trainertype<0
  2675. elsif ret==1
  2676. trainertype=pbTrainerTypeEditorNew(nil)
  2677. next if trainertype<0
  2678. else
  2679. next
  2680. end
  2681. trainername=Kernel.pbMessageFreeText(_INTL("Now enter the trainer's name."),"",false,32)
  2682. next if trainername==""
  2683. trainerparty=pbGetFreeTrainerParty(trainertype,trainername)
  2684. if trainerparty<0
  2685. Kernel.pbMessage(_INTL("There is no room to create a trainer of that type and name."))
  2686. next
  2687. end
  2688. ###############
  2689. pbNewTrainer(trainertype,trainername,trainerparty)
  2690. else
  2691. data=[
  2692. trainerdata[0], # Trainer type
  2693. trainerdata[1], # Trainer name
  2694. trainerdata[4], # ID
  2695. trainerdata[3][0], # Pokémon 1
  2696. trainerdata[3][1], # Pokémon 2
  2697. trainerdata[3][2], # Pokémon 3
  2698. trainerdata[3][3], # Pokémon 4
  2699. trainerdata[3][4], # Pokémon 5
  2700. trainerdata[3][5], # Pokémon 6
  2701. trainerdata[2][0], # Item 1
  2702. trainerdata[2][1], # Item 2
  2703. trainerdata[2][2], # Item 3
  2704. trainerdata[2][3], # Item 4
  2705. trainerdata[2][4], # Item 5
  2706. trainerdata[2][5], # Item 6
  2707. trainerdata[2][6], # Item 7
  2708. trainerdata[2][7] # Item 8
  2709. ]
  2710. save=false
  2711. while true
  2712. data=TrainerBattleProperty.set(trainerdata[1],data)
  2713. if data
  2714. trainerdata=[
  2715. data[0],
  2716. data[1],
  2717. [data[9],data[10],data[11],data[12],data[13],data[14],data[15],data[16]].find_all {|i| i && i!=0 }, # Item list
  2718. [data[3],data[4],data[5],data[6],data[7],data[8]].find_all {|i| i && i[TPSPECIES]!=0 }, # Pokémon list
  2719. data[2]
  2720. ]
  2721. if trainerdata[3].length==0
  2722. Kernel.pbMessage(_INTL("Can't save. The Pokémon list is empty."))
  2723. elsif !trainerdata[1] || trainerdata[1].length==0
  2724. Kernel.pbMessage(_INTL("Can't save. No name was entered."))
  2725. else
  2726. save=true
  2727. break
  2728. end
  2729. else
  2730. break
  2731. end
  2732. end
  2733. if save
  2734. data=load_data("Data/trainers.dat")
  2735. data[index]=trainerdata
  2736. save_data(data,"Data/trainers.dat")
  2737. pbConvertTrainerData
  2738. end
  2739. end
  2740. end
  2741. end
  2742. }
  2743. end
  2744.  
  2745.  
  2746.  
  2747. ################################################################################
  2748. # Trainer Pokémon editor
  2749. ################################################################################
  2750. module TrainerPokemonProperty
  2751. def self.set(settingname,oldsetting)
  2752. oldsetting=TPDEFAULTS.clone if !oldsetting
  2753. properties=[
  2754. [_INTL("Species"),SpeciesProperty,
  2755. _INTL("Species of the Pokémon.")],
  2756. [_INTL("Level"),NonzeroLimitProperty.new(PBExperience::MAXLEVEL),
  2757. _INTL("Level of the Pokémon.")],
  2758. [_INTL("Held item"),ItemProperty,
  2759. _INTL("Item held by the Pokémon.")],
  2760. [_INTL("Move 1"),MoveProperty2.new(oldsetting),
  2761. _INTL("First move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2762. [_INTL("Move 2"),MoveProperty2.new(oldsetting),
  2763. _INTL("Second move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2764. [_INTL("Move 3"),MoveProperty2.new(oldsetting),
  2765. _INTL("Third move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2766. [_INTL("Move 4"),MoveProperty2.new(oldsetting),
  2767. _INTL("Fourth move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2768. [_INTL("Ability"),LimitProperty.new(5),
  2769. _INTL("Ability flag. 0=first ability, 1=second ability, 2-5=hidden ability.")],
  2770. [_INTL("Gender"),LimitProperty.new(1),
  2771. _INTL("Gender flag. 0=male, 1=female.")],
  2772. [_INTL("Form"),LimitProperty.new(100),
  2773. _INTL("Form of the Pokémon.")],
  2774. [_INTL("Shiny"),BooleanProperty,
  2775. _INTL("If set to true, the Pokémon is a different-colored Pokémon.")],
  2776. [_INTL("Nature"),NatureProperty,
  2777. _INTL("Nature of the Pokémon.")],
  2778. [_INTL("IVs"),LimitProperty.new(31),
  2779. _INTL("Individual values of each of the Pokémon's stats.")],
  2780. [_INTL("Happiness"),LimitProperty.new(255),
  2781. _INTL("Happiness of the Pokémon.")],
  2782. [_INTL("Nickname"),StringProperty,
  2783. _INTL("Name of the Pokémon.")],
  2784. [_INTL("Shadow"),BooleanProperty,
  2785. _INTL("If set to true, the Pokémon is a Shadow Pokémon.")],
  2786. [_INTL("Ball"),BallProperty.new(oldsetting),
  2787. _INTL("Number of the Poké Ball the Pokémon is kept in.")]
  2788. ]
  2789. pbPropertyList(settingname,oldsetting,properties,false)
  2790. for i in 0...TPDEFAULTS.length
  2791. oldsetting[i]=TPDEFAULTS[i] if !oldsetting[i]
  2792. end
  2793. moves=[]
  2794. for i in [TPMOVE1,TPMOVE2,TPMOVE3,TPMOVE4]
  2795. moves.push(oldsetting[i]) if oldsetting[i]!=0
  2796. end
  2797. oldsetting[TPMOVE1]=moves[0] ? moves[0] : TPDEFAULTS[TPMOVE1]
  2798. oldsetting[TPMOVE2]=moves[1] ? moves[1] : TPDEFAULTS[TPMOVE2]
  2799. oldsetting[TPMOVE3]=moves[2] ? moves[2] : TPDEFAULTS[TPMOVE3]
  2800. oldsetting[TPMOVE4]=moves[3] ? moves[3] : TPDEFAULTS[TPMOVE4]
  2801. oldsetting=nil if !oldsetting[TPSPECIES] || oldsetting[TPSPECIES]==0
  2802. return oldsetting
  2803. end
  2804.  
  2805. def self.format(value)
  2806. return (!value || !value[TPSPECIES] || value[TPSPECIES]==0) ? "-" : PBSpecies.getName(value[TPSPECIES])
  2807. end
  2808. end
  2809.  
  2810.  
  2811.  
  2812. class BallProperty
  2813. def initialize(pokemondata)
  2814. @pokemondata=pokemondata
  2815. end
  2816.  
  2817. def set(settingname,oldsetting)
  2818. ret=pbChooseBallList(oldsetting ? oldsetting : -1)
  2819. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  2820. end
  2821.  
  2822. def format(value)
  2823. return value ? PBItems.getName(pbBallTypeToBall(value)) : "-"
  2824. end
  2825.  
  2826. def defaultValue
  2827. return 0
  2828. end
  2829. end
  2830.  
  2831.  
  2832.  
  2833. def pbChooseBallList(defaultMoveID=-1)
  2834. cmdwin=pbListWindow([],200)
  2835. commands=[]
  2836. moveDefault=0
  2837. for key in $BallTypes.keys
  2838. item=getID(PBItems,$BallTypes[key])
  2839. commands.push([key,item,PBItems.getName(item)]) if item && item>0
  2840. end
  2841. commands.sort! {|a,b| a[2]<=>b[2]}
  2842. if defaultMoveID>=0
  2843. for i in 0...commands.length
  2844. moveDefault=i if defaultMoveID==commands[i][0]
  2845. end
  2846. end
  2847. realcommands=[]
  2848. for i in commands
  2849. realcommands.push(i[2])
  2850. end
  2851. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  2852. cmdwin.dispose
  2853. return ret>=0 ? commands[ret][0] : defaultMoveID
  2854. end
  2855.  
  2856.  
  2857.  
  2858. class MoveProperty2
  2859. def initialize(pokemondata)
  2860. @pokemondata=pokemondata
  2861. end
  2862.  
  2863. def set(settingname,oldsetting)
  2864. ret=pbChooseMoveListForSpecies(@pokemondata[0],oldsetting ? oldsetting : 1)
  2865. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  2866. end
  2867.  
  2868. def format(value)
  2869. return value ? PBMoves.getName(value) : "-"
  2870. end
  2871.  
  2872. def defaultValue
  2873. return 0
  2874. end
  2875. end
  2876.  
  2877.  
  2878.  
  2879. def pbGetLegalMoves(species)
  2880. moves=[]
  2881. return moves if !species || species<=0
  2882. pbRgssOpen("Data/attacksRS.dat","rb") {|atkdata|
  2883. offset=atkdata.getOffset(species-1)
  2884. length=atkdata.getLength(species-1)>>1
  2885. atkdata.pos=offset
  2886. for k in 0..length-1
  2887. level=atkdata.fgetw
  2888. move=atkdata.fgetw
  2889. moves.push(move)
  2890. end
  2891. }
  2892. itemData=readItemList("Data/items.dat")
  2893. tmdat=load_data("Data/tm.dat")
  2894. for i in 0...itemData.length
  2895. next if !itemData[i]
  2896. atk=itemData[i][8]
  2897. next if !atk || atk==0
  2898. next if !tmdat[atk]
  2899. if tmdat[atk].any? {|item| item==species }
  2900. moves.push(atk)
  2901. end
  2902. end
  2903. babyspecies=pbGetBabySpecies(species)
  2904. pbRgssOpen("Data/eggEmerald.dat","rb"){|f|
  2905. f.pos=(babyspecies-1)*8
  2906. offset=f.fgetdw
  2907. length=f.fgetdw
  2908. if length>0
  2909. f.pos=offset
  2910. i=0; loop do break unless i<length
  2911. atk=f.fgetw
  2912. moves.push(atk)
  2913. i+=1
  2914. end
  2915. end
  2916. }
  2917. moves|=[]
  2918. return moves
  2919. end
  2920.  
  2921. def pbChooseMoveListForSpecies(species,defaultMoveID=0)
  2922. cmdwin=pbListWindow([],200)
  2923. commands=[]
  2924. moveDefault=0
  2925. legalMoves=pbGetLegalMoves(species)
  2926. for move in legalMoves
  2927. commands.push([move,PBMoves.getName(move)])
  2928. end
  2929. commands.sort! {|a,b| a[1]<=>b[1]}
  2930. if defaultMoveID>0
  2931. commands.each_with_index {|item,index|
  2932. if moveDefault==0
  2933. moveDefault=index if index[0]==defaultMoveID
  2934. end
  2935. }
  2936. end
  2937. commands2=[]
  2938. for i in 1..PBMoves.maxValue
  2939. if PBMoves.getName(i)!=nil && PBMoves.getName(i)!=""
  2940. commands2.push([i,PBMoves.getName(i)])
  2941. end
  2942. end
  2943. commands2.sort! {|a,b| a[1]<=>b[1]}
  2944. if defaultMoveID>0
  2945. commands2.each_with_index {|item,index|
  2946. if moveDefault==0
  2947. moveDefault=index if index[0]==defaultMoveID
  2948. end
  2949. }
  2950. end
  2951. commands.concat(commands2)
  2952. realcommands=[]
  2953. for command in commands
  2954. realcommands.push(_ISPRINTF("{2:s}",command[0],command[1]))
  2955. end
  2956. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  2957. cmdwin.dispose
  2958. return ret>=0 ? commands[ret][0] : 0
  2959. end
  2960.  
  2961.  
  2962.  
  2963. ################################################################################
  2964. # Metadata editor
  2965. ################################################################################
  2966. module CharacterProperty
  2967. def self.set(settingname,oldsetting)
  2968. chosenmap=pbListScreen(settingname,
  2969. GraphicsLister.new("Graphics/Characters/",oldsetting))
  2970. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  2971. end
  2972.  
  2973. def self.format(value)
  2974. return value
  2975. end
  2976. end
  2977.  
  2978.  
  2979.  
  2980. module PlayerProperty
  2981. def self.set(settingname,oldsetting)
  2982. oldsetting=[0,"xxx","xxx","xxx","xxx","xxx","xxx","xxx"] if !oldsetting
  2983. properties=[
  2984. [_INTL("Trainer Type"),TrainerTypeProperty,
  2985. _INTL("Trainer type of this player.")],
  2986. [_INTL("Sprite"),CharacterProperty,
  2987. _INTL("Walking character sprite.")],
  2988. [_INTL("Bike"),CharacterProperty,
  2989. _INTL("Cycling character sprite.")],
  2990. [_INTL("Surfing"),CharacterProperty,
  2991. _INTL("Surfing character sprite.")],
  2992. [_INTL("Running"),CharacterProperty,
  2993. _INTL("Running character sprite.")],
  2994. [_INTL("Diving"),CharacterProperty,
  2995. _INTL("Diving character sprite.")],
  2996. [_INTL("Fishing"),CharacterProperty,
  2997. _INTL("Fishing character sprite.")],
  2998. [_INTL("Surf-Fishing"),CharacterProperty,
  2999. _INTL("Fishing while surfing character sprite.")]
  3000. ]
  3001. pbPropertyList(settingname,oldsetting,properties,false)
  3002. return oldsetting
  3003. end
  3004.  
  3005. def self.format(value)
  3006. return value.inspect
  3007. end
  3008. end
  3009.  
  3010.  
  3011.  
  3012. module MapSizeProperty
  3013. def self.set(settingname,oldsetting)
  3014. oldsetting=[0,""] if !oldsetting
  3015. properties=[
  3016. [_INTL("Width"),NonzeroLimitProperty.new(30),
  3017. _INTL("The width of this map in Region Map squares.")],
  3018. [_INTL("Valid Squares"),StringProperty,
  3019. _INTL("A series of 1s and 0s marking which squares are part of this map (1=part, 0=not part).")],
  3020. ]
  3021. pbPropertyList(settingname,oldsetting,properties,false)
  3022. return oldsetting
  3023. end
  3024.  
  3025. def self.format(value)
  3026. return value.inspect
  3027. end
  3028. end
  3029.  
  3030.  
  3031.  
  3032. module MapCoordsProperty
  3033. def self.set(settingname,oldsetting)
  3034. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting[0] : 0))
  3035. if chosenmap>=0
  3036. mappoint=chooseMapPoint(chosenmap)
  3037. if mappoint
  3038. return [chosenmap,mappoint[0],mappoint[1]]
  3039. else
  3040. return oldsetting
  3041. end
  3042. else
  3043. return oldsetting
  3044. end
  3045. end
  3046.  
  3047. def self.format(value)
  3048. return value.inspect
  3049. end
  3050. end
  3051.  
  3052.  
  3053.  
  3054. module MapCoordsFacingProperty
  3055. def self.set(settingname,oldsetting)
  3056. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting[0] : 0))
  3057. if chosenmap>=0
  3058. mappoint=chooseMapPoint(chosenmap)
  3059. if mappoint
  3060. facing=Kernel.pbMessage(_INTL("Choose the direction to face in."),
  3061. [_INTL("Down"),_INTL("Left"),_INTL("Right"),_INTL("Up")],-1)
  3062. if facing<0
  3063. return oldsetting
  3064. else
  3065. return [chosenmap,mappoint[0],mappoint[1],[2,4,6,8][facing]]
  3066. end
  3067. else
  3068. return oldsetting
  3069. end
  3070. else
  3071. return oldsetting
  3072. end
  3073. end
  3074.  
  3075. def self.format(value)
  3076. return value.inspect
  3077. end
  3078. end
  3079.  
  3080.  
  3081.  
  3082. module RegionMapCoordsProperty
  3083. def self.set(settingname,oldsetting)
  3084. regions=getMapNameList
  3085. selregion=-1
  3086. if regions.length==0
  3087. Kernel.pbMessage(_INTL("No region maps are defined."))
  3088. return oldsetting
  3089. elsif regions.length==1
  3090. selregion=regions[0][0]
  3091. else
  3092. cmds=[]
  3093. for region in regions
  3094. cmds.push(region[1])
  3095. end
  3096. selcmd=Kernel.pbMessage(_INTL("Choose a region map."),cmds,-1)
  3097. if selcmd>=0
  3098. selregion=regions[selcmd][0]
  3099. else
  3100. return oldsetting
  3101. end
  3102. end
  3103. mappoint=chooseMapPoint(selregion,true)
  3104. if mappoint
  3105. return [selregion,mappoint[0],mappoint[1]]
  3106. else
  3107. return oldsetting
  3108. end
  3109. end
  3110.  
  3111. def self.format(value)
  3112. return value.inspect
  3113. end
  3114. end
  3115.  
  3116.  
  3117.  
  3118. module WeatherEffectProperty
  3119. def self.set(settingname,oldsetting)
  3120. cmd=Kernel.pbMessage(_INTL("Choose a weather effect."),[
  3121. _INTL("No weather"),
  3122. _INTL("Rain"),
  3123. _INTL("Storm"),
  3124. _INTL("Snow"),
  3125. _INTL("Sandstorm"),
  3126. _INTL("Sunny"),
  3127. _INTL("HeavyRain"),
  3128. _INTL("Blizzard")
  3129. ],1)
  3130. if cmd==0
  3131. return nil
  3132. else
  3133. params=ChooseNumberParams.new
  3134. params.setRange(0,100)
  3135. params.setDefaultValue(oldsetting ? oldsetting[1] : 100)
  3136. number=Kernel.pbMessageChooseNumber(_INTL("Set the probability of the weather."),params)
  3137. return [cmd,number]
  3138. end
  3139. end
  3140.  
  3141. def self.format(value)
  3142. return value.inspect
  3143. end
  3144. end
  3145.  
  3146.  
  3147.  
  3148. module MapProperty
  3149. def self.set(settingname,oldsetting)
  3150. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting : 0))
  3151. return chosenmap>0 ? chosenmap : oldsetting
  3152. end
  3153.  
  3154. def self.format(value)
  3155. return value.inspect
  3156. end
  3157.  
  3158. def self.defaultValue
  3159. return 0
  3160. end
  3161. end
  3162.  
  3163.  
  3164.  
  3165. def pbMetadataScreen(defaultMapId=nil)
  3166. metadata=nil
  3167. mapinfos=pbLoadRxData("Data/MapInfos")
  3168. metadata=load_data("Data/metadata.dat")
  3169. map=defaultMapId ? defaultMapId : 0
  3170. loop do
  3171. map=pbListScreen(_INTL("SET METADATA"),MapLister.new(map,true))
  3172. break if map<0
  3173. mapname=(map==0) ? _INTL("Global Metadata") : mapinfos[map].name
  3174. data=[]
  3175. properties=(map==0) ? MapScreenScene::GLOBALMETADATA :
  3176. MapScreenScene::LOCALMAPS
  3177. for i in 0...properties.length
  3178. data.push(metadata[map] ? metadata[map][i+1] : nil)
  3179. end
  3180. pbPropertyList(mapname,data,properties)
  3181. for i in 0...properties.length
  3182. if !metadata[map]
  3183. metadata[map]=[]
  3184. end
  3185. metadata[map][i+1]=data[i]
  3186. end
  3187. end
  3188. pbSerializeMetadata(metadata,mapinfos) if metadata
  3189. end
  3190.  
  3191.  
  3192.  
  3193. ################################################################################
  3194. # Map drawing
  3195. ################################################################################
  3196. class MapSprite
  3197. def initialize(map,viewport=nil)
  3198. @sprite=Sprite.new(viewport)
  3199. @sprite.bitmap=createMinimap(map)
  3200. @sprite.x=(Graphics.width/2)-(@sprite.bitmap.width/2)
  3201. @sprite.y=(Graphics.height/2)-(@sprite.bitmap.height/2)
  3202. end
  3203.  
  3204. def dispose
  3205. @sprite.bitmap.dispose
  3206. @sprite.dispose
  3207. end
  3208.  
  3209. def z=(value)
  3210. @sprite.z=value
  3211. end
  3212.  
  3213. def getXY
  3214. return nil if !Input.triggerex?(0x01)
  3215. mouse=Mouse::getMousePos(true)
  3216. if mouse[0]<@sprite.x||mouse[0]>=@sprite.x+@sprite.bitmap.width
  3217. return nil
  3218. end
  3219. if mouse[1]<@sprite.y||mouse[1]>=@sprite.y+@sprite.bitmap.height
  3220. return nil
  3221. end
  3222. x=mouse[0]-@sprite.x
  3223. y=mouse[1]-@sprite.y
  3224. return [x/4,y/4]
  3225. end
  3226. end
  3227.  
  3228.  
  3229.  
  3230. class SelectionSprite < Sprite
  3231. def initialize(viewport=nil)
  3232. @sprite=Sprite.new(viewport)
  3233. @sprite.bitmap=nil
  3234. @sprite.z=2
  3235. @othersprite=nil
  3236. end
  3237.  
  3238. def disposed?
  3239. return @sprite.disposed?
  3240. end
  3241.  
  3242. def dispose
  3243. @sprite.bitmap.dispose if @sprite.bitmap
  3244. @othersprite=nil
  3245. @sprite.dispose
  3246. end
  3247.  
  3248. def othersprite=(value)
  3249. @othersprite=value
  3250. if @othersprite && !@othersprite.disposed? &&
  3251. @othersprite.bitmap && !@othersprite.bitmap.disposed?
  3252. @sprite.bitmap=pbDoEnsureBitmap(
  3253. @sprite.bitmap,@othersprite.bitmap.width,@othersprite.bitmap.height)
  3254. red=Color.new(255,0,0)
  3255. @sprite.bitmap.clear
  3256. @sprite.bitmap.fill_rect(0,0,@othersprite.bitmap.width,2,red)
  3257. @sprite.bitmap.fill_rect(0,@othersprite.bitmap.height-2,
  3258. @othersprite.bitmap.width,2,red)
  3259. @sprite.bitmap.fill_rect(0,0,2,@othersprite.bitmap.height,red)
  3260. @sprite.bitmap.fill_rect(@othersprite.bitmap.width-2,0,2,
  3261. @othersprite.bitmap.height,red)
  3262. end
  3263. end
  3264.  
  3265. def update
  3266. if @othersprite && !@othersprite.disposed?
  3267. @sprite.visible=@othersprite.visible
  3268. @sprite.x=@othersprite.x
  3269. @sprite.y=@othersprite.y
  3270. else
  3271. @sprite.visible=false
  3272. end
  3273. end
  3274. end
  3275.  
  3276.  
  3277.  
  3278. class RegionMapSprite
  3279. def initialize(map,viewport=nil)
  3280. @sprite=Sprite.new(viewport)
  3281. @sprite.bitmap=createRegionMap(map)
  3282. @sprite.x=(Graphics.width/2)-(@sprite.bitmap.width/2)
  3283. @sprite.y=(Graphics.height/2)-(@sprite.bitmap.height/2)
  3284. end
  3285.  
  3286. def dispose
  3287. @sprite.bitmap.dispose
  3288. @sprite.dispose
  3289. end
  3290.  
  3291. def z=(value)
  3292. @sprite.z=value
  3293. end
  3294.  
  3295. def getXY
  3296. return nil if !Input.triggerex?(0x01)
  3297. mouse=Mouse::getMousePos(true)
  3298. if mouse[0]<@sprite.x||mouse[0]>=@sprite.x+@sprite.bitmap.width
  3299. return nil
  3300. end
  3301. if mouse[1]<@sprite.y||mouse[1]>=@sprite.y+@sprite.bitmap.height
  3302. return nil
  3303. end
  3304. x=mouse[0]-@sprite.x
  3305. y=mouse[1]-@sprite.y
  3306. return [x/8,y/8]
  3307. end
  3308. end
  3309.  
  3310.  
  3311.  
  3312. def createRegionMap(map)
  3313. pbRgssOpen("Data/townmap.dat","rb"){|f|
  3314. @mapdata=Marshal.load(f)
  3315. }
  3316. @map=@mapdata[map]
  3317. bitmap=AnimatedBitmap.new("Graphics/Pictures/#{@map[1]}").deanimate
  3318. retbitmap=BitmapWrapper.new(bitmap.width/2,bitmap.height/2)
  3319. retbitmap.stretch_blt(
  3320. Rect.new(0,0,bitmap.width/2,bitmap.height/2),
  3321. bitmap,
  3322. Rect.new(0,0,bitmap.width,bitmap.height)
  3323. )
  3324. bitmap.dispose
  3325. return retbitmap
  3326. end
  3327.  
  3328. def getMapNameList
  3329. pbRgssOpen("Data/townmap.dat","rb"){|f|
  3330. @mapdata=Marshal.load(f)
  3331. }
  3332. ret=[]
  3333. for i in 0...@mapdata.length
  3334. next if !@mapdata[i]
  3335. ret.push(
  3336. [i,pbGetMessage(MessageTypes::RegionNames,i)]
  3337. )
  3338. end
  3339. return ret
  3340. end
  3341.  
  3342. def createMinimap2(mapid)
  3343. map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil
  3344. return BitmapWrapper.new(32,32) if !map
  3345. bitmap=BitmapWrapper.new(map.width*4,map.height*4)
  3346. black=Color.new(0,0,0)
  3347. bigmap=(map.width>40 && map.height>40)
  3348. tilesets=load_data("Data/Tilesets.rxdata")
  3349. tileset=tilesets[map.tileset_id]
  3350. return bitmap if !tileset
  3351. helper=TileDrawingHelper.fromTileset(tileset)
  3352. for y in 0...map.height
  3353. for x in 0...map.width
  3354. if bigmap
  3355. next if (x>8 && x<=map.width-8 && y>8 && y<=map.height-8)
  3356. end
  3357. for z in 0..2
  3358. id=map.data[x,y,z]
  3359. next if id==0 || !id
  3360. helper.bltSmallTile(bitmap,x*4,y*4,4,4,id)
  3361. end
  3362. end
  3363. end
  3364. bitmap.fill_rect(0,0,bitmap.width,1,black)
  3365. bitmap.fill_rect(0,bitmap.height-1,bitmap.width,1,black)
  3366. bitmap.fill_rect(0,0,1,bitmap.height,black)
  3367. bitmap.fill_rect(bitmap.width-1,0,1,bitmap.height,black)
  3368. return bitmap
  3369. end
  3370.  
  3371. def createMinimap(mapid)
  3372. map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil
  3373. return BitmapWrapper.new(32,32) if !map
  3374. bitmap=BitmapWrapper.new(map.width*4,map.height*4)
  3375. black=Color.new(0,0,0)
  3376. tilesets=load_data("Data/Tilesets.rxdata")
  3377. tileset=tilesets[map.tileset_id]
  3378. return bitmap if !tileset
  3379. helper=TileDrawingHelper.fromTileset(tileset)
  3380. for y in 0...map.height
  3381. for x in 0...map.width
  3382. for z in 0..2
  3383. id=map.data[x,y,z]
  3384. id=0 if !id
  3385. helper.bltSmallTile(bitmap,x*4,y*4,4,4,id)
  3386. end
  3387. end
  3388. end
  3389. bitmap.fill_rect(0,0,bitmap.width,1,black)
  3390. bitmap.fill_rect(0,bitmap.height-1,bitmap.width,1,black)
  3391. bitmap.fill_rect(0,0,1,bitmap.height,black)
  3392. bitmap.fill_rect(bitmap.width-1,0,1,bitmap.height,black)
  3393. return bitmap
  3394. end
  3395.  
  3396. def chooseMapPoint(map,rgnmap=false)
  3397. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  3398. viewport.z=99999
  3399. title=Window_UnformattedTextPokemon.new(_INTL("Click a point on the map."))
  3400. title.x=0
  3401. title.y=Graphics.height-64
  3402. title.width=Graphics.width
  3403. title.height=64
  3404. title.viewport=viewport
  3405. title.z=2
  3406. if rgnmap
  3407. sprite=RegionMapSprite.new(map,viewport)
  3408. else
  3409. sprite=MapSprite.new(map,viewport)
  3410. end
  3411. sprite.z=2
  3412. ret=nil
  3413. loop do
  3414. Graphics.update
  3415. Input.update
  3416. xy=sprite.getXY
  3417. if xy
  3418. ret=xy
  3419. break
  3420. end
  3421. if Input.trigger?(Input::B)
  3422. ret=nil
  3423. break
  3424. end
  3425. end
  3426. sprite.dispose
  3427. title.dispose
  3428. return ret
  3429. end
  3430.  
  3431.  
  3432.  
  3433. ################################################################################
  3434. # Visual Editor (map connections)
  3435. ################################################################################
  3436. class MapScreenScene
  3437. LOCALMAPS=[
  3438. ["Outdoor",BooleanProperty,
  3439. _INTL("If true, this map is an outdoor map and will be tinted according to time of day.")],
  3440. ["ShowArea",BooleanProperty,
  3441. _INTL("If true, the game will display the map's name upon entry.")],
  3442. ["Bicycle",BooleanProperty,
  3443. _INTL("If true, the bicycle can be used on this map.")],
  3444. ["BicycleAlways",BooleanProperty,
  3445. _INTL("If true, the bicycle will be mounted automatically on this map and cannot be dismounted.")],
  3446. ["HealingSpot",MapCoordsProperty,
  3447. _INTL("Map ID of this Pokemon Center's town, and X and Y coordinates of its entrance within that town.")],
  3448. ["Weather",WeatherEffectProperty,
  3449. _INTL("Weather conditions in effect for this map.")],
  3450. ["MapPosition",RegionMapCoordsProperty,
  3451. _INTL("Identifies the point on the regional map for this map.")],
  3452. ["DiveMap",MapProperty,
  3453. _INTL("Specifies the underwater layer of this map. Use only if this map has deep water.")],
  3454. ["DarkMap",BooleanProperty,
  3455. _INTL("If true, this map is dark and a circle of light appears around the player. Flash can be used to expand the circle.")],
  3456. ["SafariMap",BooleanProperty,
  3457. _INTL("If true, this map is part of the Safari Zone (both indoor and outdoor). Not to be used in the reception desk.")],
  3458. ["SnapEdges",BooleanProperty,
  3459. _INTL("If true, when the player goes near this map's edge, the game doesn't center the player as usual.")],
  3460. ["Dungeon",BooleanProperty,
  3461. _INTL("If true, this map has a randomly generated layout. See the wiki for more information.")],
  3462. ["BattleBack",StringProperty,
  3463. _INTL("PNG files named 'battlebgXXX', 'enemybaseXXX', 'playerbaseXXX' in Battlebacks folder, where XXX is this property's value.")],
  3464. ["WildBattleBGM",BGMProperty,
  3465. _INTL("Default BGM for wild Pokémon battles on this map.")],
  3466. ["TrainerBattleBGM",BGMProperty,
  3467. _INTL("Default BGM for trainer battles on this map.")],
  3468. ["WildVictoryME",MEProperty,
  3469. _INTL("Default ME played after winning a wild Pokémon battle on this map.")],
  3470. ["TrainerVictoryME",MEProperty,
  3471. _INTL("Default ME played after winning a Trainer battle on this map.")],
  3472. ["MapSize",MapSizeProperty,
  3473. _INTL("The width of the map in Town Map squares, and a string indicating which squares are part of this map.")],
  3474. ]
  3475. GLOBALMETADATA=[
  3476. ["Home",MapCoordsFacingProperty,
  3477. _INTL("Map ID and X and Y coordinates of where the player goes if no Pokémon Center was entered after a loss.")],
  3478. ["WildBattleBGM",BGMProperty,
  3479. _INTL("Default BGM for wild Pokémon battles.")],
  3480. ["TrainerBattleBGM",BGMProperty,
  3481. _INTL("Default BGM for Trainer battles.")],
  3482. ["WildVictoryME",MEProperty,
  3483. _INTL("Default ME played after winning a wild Pokémon battle.")],
  3484. ["TrainerVictoryME",MEProperty,
  3485. _INTL("Default ME played after winning a Trainer battle.")],
  3486. ["SurfBGM",BGMProperty,
  3487. _INTL("BGM played while surfing.")],
  3488. ["BicycleBGM",BGMProperty,
  3489. _INTL("BGM played while on a bicycle.")],
  3490. ["PlayerA",PlayerProperty,
  3491. _INTL("Specifies player A.")],
  3492. ["PlayerB",PlayerProperty,
  3493. _INTL("Specifies player B.")],
  3494. ["PlayerC",PlayerProperty,
  3495. _INTL("Specifies player C.")],
  3496. ["PlayerD",PlayerProperty,
  3497. _INTL("Specifies player D.")],
  3498. ["PlayerE",PlayerProperty,
  3499. _INTL("Specifies player E.")],
  3500. ["PlayerF",PlayerProperty,
  3501. _INTL("Specifies player F.")],
  3502. ["PlayerG",PlayerProperty,
  3503. _INTL("Specifies player G.")],
  3504. ["PlayerH",PlayerProperty,
  3505. _INTL("Specifies player H.")]
  3506. ]
  3507.  
  3508. def getMapSprite(id)
  3509. if !@mapsprites[id]
  3510. @mapsprites[id]=Sprite.new(@viewport)
  3511. @mapsprites[id].z=0
  3512. @mapsprites[id].bitmap=nil
  3513. end
  3514. if !@mapsprites[id].bitmap || @mapsprites[id].bitmap.disposed?
  3515. @mapsprites[id].bitmap=createMinimap(id)
  3516. end
  3517. return @mapsprites[id]
  3518. end
  3519.  
  3520. def close
  3521. pbDisposeSpriteHash(@sprites)
  3522. pbDisposeSpriteHash(@mapsprites)
  3523. @viewport.dispose
  3524. end
  3525.  
  3526. def setMapSpritePos(id,x,y)
  3527. sprite=getMapSprite(id)
  3528. sprite.x=x
  3529. sprite.y=y
  3530. sprite.visible=true
  3531. end
  3532.  
  3533. def putNeighbors(id,sprites)
  3534. conns=@mapconns
  3535. mapsprite=getMapSprite(id)
  3536. dispx=mapsprite.x
  3537. dispy=mapsprite.y
  3538. for conn in conns
  3539. if conn[0]==id
  3540. b=sprites.any? {|i| i==conn[3] }
  3541. if !b
  3542. x=(conn[1]-conn[4])*4+dispx
  3543. y=(conn[2]-conn[5])*4+dispy
  3544. setMapSpritePos(conn[3],x,y)
  3545. sprites.push(conn[3])
  3546. putNeighbors(conn[3],sprites)
  3547. end
  3548. elsif conn[3]==id
  3549. b=sprites.any? {|i| i==conn[0] }
  3550. if !b
  3551. x=(conn[4]-conn[1])*4+dispx
  3552. y=(conn[5]-conn[2])*4+dispy
  3553. setMapSpritePos(conn[0],x,y)
  3554. sprites.push(conn[3])
  3555. putNeighbors(conn[0],sprites)
  3556. end
  3557. end
  3558. end
  3559. end
  3560.  
  3561. def hasConnections?(conns,id)
  3562. for conn in conns
  3563. return true if conn[0]==id || conn[3]==id
  3564. end
  3565. return false
  3566. end
  3567.  
  3568. def connectionsSymmetric?(conn1,conn2)
  3569. if conn1[0]==conn2[0]
  3570. # Equality
  3571. return false if conn1[1]!=conn2[1]
  3572. return false if conn1[2]!=conn2[2]
  3573. return false if conn1[3]!=conn2[3]
  3574. return false if conn1[4]!=conn2[4]
  3575. return false if conn1[5]!=conn2[5]
  3576. return true
  3577. elsif conn1[0]==conn2[3]
  3578. # Symmetry
  3579. return false if conn1[1]!=-conn2[1]
  3580. return false if conn1[2]!=-conn2[2]
  3581. return false if conn1[3]!=conn2[0]
  3582. return false if conn1[4]!=-conn2[4]
  3583. return false if conn1[5]!=-conn2[5]
  3584. return true
  3585. end
  3586. return false
  3587. end
  3588.  
  3589. def removeOldConnections(ret,mapid)
  3590. for i in 0...ret.length
  3591. ret[i]=nil if ret[i][0]==mapid || ret[i][3]==mapid
  3592. end
  3593. ret.compact!
  3594. end
  3595.  
  3596. # Returns the maps within _keys_ that are directly connected to this map, _map_.
  3597. def getDirectConnections(keys,map)
  3598. thissprite=getMapSprite(map)
  3599. thisdims=MapFactoryHelper.getMapDims(map)
  3600. ret=[]
  3601. for i in keys
  3602. next if i==map
  3603. othersprite=getMapSprite(i)
  3604. otherdims=MapFactoryHelper.getMapDims(i)
  3605. x1=(thissprite.x-othersprite.x)/4
  3606. y1=(thissprite.y-othersprite.y)/4
  3607. if (x1==otherdims[0] || x1==-thisdims[0] ||
  3608. y1==otherdims[1] || y1==-thisdims[1])
  3609. ret.push(i)
  3610. end
  3611. end
  3612. # If no direct connections, add an indirect connection
  3613. if ret.length==0
  3614. key=(map==keys[0]) ? keys[1] : keys[0]
  3615. ret.push(key)
  3616. end
  3617. return ret
  3618. end
  3619.  
  3620. def generateConnectionData
  3621. ret=[]
  3622. # Create a clone of current map connection
  3623. for conn in @mapconns
  3624. ret.push(conn.clone)
  3625. end
  3626. keys=@mapsprites.keys
  3627. return ret if keys.length<2
  3628. # Remove all connections containing any sprites on the canvas from the array
  3629. for i in keys
  3630. removeOldConnections(ret,i)
  3631. end
  3632. # Rebuild connections
  3633. for i in keys
  3634. refs=getDirectConnections(keys,i)
  3635. for refmap in refs
  3636. othersprite=getMapSprite(i)
  3637. refsprite=getMapSprite(refmap)
  3638. c1=(refsprite.x-othersprite.x)/4
  3639. c2=(refsprite.y-othersprite.y)/4
  3640. conn=[refmap,0,0,i,c1,c2]
  3641. j=0;while j<ret.length && !connectionsSymmetric?(ret[j],conn)
  3642. j+=1
  3643. end
  3644. if j==ret.length
  3645. ret.push(conn)
  3646. end
  3647. end
  3648. end
  3649. return ret
  3650. end
  3651.  
  3652. def serializeConnectionData
  3653. conndata=generateConnectionData()
  3654. pbSerializeConnectionData(conndata,@mapinfos)
  3655. @mapconns=conndata
  3656. end
  3657.  
  3658. def putSprite(id)
  3659. addSprite(id)
  3660. putNeighbors(id,[])
  3661. end
  3662.  
  3663. def addSprite(id)
  3664. mapsprite=getMapSprite(id)
  3665. x=(Graphics.width-mapsprite.bitmap.width)/2
  3666. y=(Graphics.height-mapsprite.bitmap.height)/2
  3667. mapsprite.x=x.to_i&~3
  3668. mapsprite.y=y.to_i&~3
  3669. end
  3670.  
  3671. def saveMapSpritePos
  3672. @mapspritepos.clear
  3673. for i in @mapsprites.keys
  3674. s=@mapsprites[i]
  3675. @mapspritepos[i]=[s.x,s.y] if s && !s.disposed?
  3676. end
  3677. end
  3678.  
  3679. def mapScreen
  3680. @sprites={}
  3681. @mapsprites={}
  3682. @mapspritepos={}
  3683. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  3684. @viewport.z=99999
  3685. @lasthitmap=-1
  3686. @lastclick=-1
  3687. @oldmousex=nil
  3688. @oldmousey=nil
  3689. @dragging=false
  3690. @dragmapid=-1
  3691. @dragOffsetX=0
  3692. @dragOffsetY=0
  3693. @selmapid=-1
  3694. addBackgroundPlane(@sprites,"background","trainercardbg",@viewport)
  3695. @sprites["selsprite"]=SelectionSprite.new(@viewport)
  3696. @sprites["title"]=Window_UnformattedTextPokemon.new(_INTL("F5: Help"))
  3697. @sprites["title"].x=0
  3698. @sprites["title"].y=Graphics.height-64
  3699. @sprites["title"].width=Graphics.width
  3700. @sprites["title"].height=64
  3701. @sprites["title"].viewport=@viewport
  3702. @sprites["title"].z=2
  3703. @mapinfos=load_data("Data/MapInfos.rxdata")
  3704. @encdata=load_data("Data/encounters.dat")
  3705. conns=MapFactoryHelper.getMapConnections
  3706. @mapconns=[]
  3707. for c in conns
  3708. @mapconns.push(c.clone)
  3709. end
  3710. @metadata=load_data("Data/metadata.dat")
  3711. if $game_map
  3712. @currentmap=$game_map.map_id
  3713. else
  3714. system=load_data("Data/System.rxdata")
  3715. @currentmap=system.edit_map_id
  3716. end
  3717. putSprite(@currentmap)
  3718. end
  3719.  
  3720. def setTopSprite(id)
  3721. for i in @mapsprites.keys
  3722. if i==id
  3723. @mapsprites[i].z=1
  3724. else
  3725. @mapsprites[i].z=0
  3726. end
  3727. end
  3728. end
  3729.  
  3730. def getMetadata(mapid,metadataType)
  3731. return @metadata[mapid][metadataType] if @metadata[mapid]
  3732. end
  3733.  
  3734. def setMetadata(mapid,metadataType,data)
  3735. @metadata[mapid]=[] if !@metadata[mapid]
  3736. @metadata[mapid][metadataType]=data
  3737. end
  3738.  
  3739. def serializeMetadata
  3740. pbSerializeMetadata(@metadata,@mapinfos)
  3741. end
  3742.  
  3743. def helpWindow
  3744. helptext=_INTL("A: Add map to canvas\r\n")
  3745. helptext+=_INTL("DEL: Delete map from canvas\r\n")
  3746. helptext+=_INTL("S: Go to another map\r\n")
  3747. helptext+=_INTL("Click to select a map\r\n")
  3748. helptext+=_INTL("Double-click: Edit map's metadata\r\n")
  3749. helptext+=_INTL("E: Edit map's encounters\r\n")
  3750. helptext+=_INTL("Drag map to move it\r\n")
  3751. helptext+=_INTL("Arrow keys/drag canvas: Move around canvas")
  3752. title=Window_UnformattedTextPokemon.new(helptext)
  3753. title.x=0
  3754. title.y=0
  3755. title.width=Graphics.width*8/10
  3756. title.height=Graphics.height
  3757. title.viewport=@viewport
  3758. title.z=2
  3759. loop do
  3760. Graphics.update
  3761. Input.update
  3762. break if Input.trigger?(Input::C)
  3763. break if Input.trigger?(Input::B)
  3764. end
  3765. Input.update
  3766. title.dispose
  3767. end
  3768.  
  3769. def propertyList(map,properties)
  3770. infos=load_data("Data/MapInfos.rxdata")
  3771. mapname=(map==0) ? _INTL("Global Metadata") : infos[map].name
  3772. data=[]
  3773. for i in 0...properties.length
  3774. data.push(getMetadata(map,i+1))
  3775. end
  3776. pbPropertyList(mapname,data,properties)
  3777. for i in 0...properties.length
  3778. setMetadata(map,i+1,data[i])
  3779. end
  3780. end
  3781.  
  3782. def getMapRect(mapid)
  3783. sprite=getMapSprite(mapid)
  3784. if sprite
  3785. return [
  3786. sprite.x,
  3787. sprite.y,
  3788. sprite.x+sprite.bitmap.width,
  3789. sprite.y+sprite.bitmap.height
  3790. ]
  3791. else
  3792. return nil
  3793. end
  3794. end
  3795.  
  3796. def onDoubleClick(mapid)
  3797. if mapid>=0
  3798. propertyList(mapid,LOCALMAPS)
  3799. else
  3800. propertyList(0,GLOBALMETADATA)
  3801. end
  3802. end
  3803.  
  3804. def onClick(mapid,x,y)
  3805. if @lastclick>0 && Graphics.frame_count-@lastclick<15
  3806. onDoubleClick(mapid)
  3807. @lastclick=-1
  3808. else
  3809. @lastclick=Graphics.frame_count
  3810. if mapid>=0
  3811. @dragging=true
  3812. @dragmapid=mapid
  3813. sprite=getMapSprite(mapid)
  3814. @sprites["selsprite"].othersprite=sprite
  3815. @selmapid=mapid
  3816. @dragOffsetX=sprite.x-x
  3817. @dragOffsetY=sprite.y-y
  3818. setTopSprite(mapid)
  3819. else
  3820. @sprites["selsprite"].othersprite=nil
  3821. @dragging=true
  3822. @dragmapid=mapid
  3823. @selmapid=-1
  3824. @dragOffsetX=x
  3825. @dragOffsetY=y
  3826. saveMapSpritePos
  3827. end
  3828. end
  3829. end
  3830.  
  3831. def onRightClick(mapid,x,y)
  3832. # echo("rightclick (#{mapid})\r\n")
  3833. end
  3834.  
  3835. def onMouseUp(mapid)
  3836. # echo("mouseup (#{mapid})\r\n")
  3837. @dragging=false if @dragging
  3838. end
  3839.  
  3840. def onRightMouseUp(mapid)
  3841. # echo("rightmouseup (#{mapid})\r\n")
  3842. end
  3843.  
  3844. def onMouseOver(mapid,x,y)
  3845. # echo("mouseover (#{mapid},#{x},#{y})\r\n")
  3846. end
  3847.  
  3848. def onMouseMove(mapid,x,y)
  3849. # echo("mousemove (#{mapid},#{x},#{y})\r\n")
  3850. if @dragging
  3851. if @dragmapid>=0
  3852. sprite=getMapSprite(@dragmapid)
  3853. x=x+@dragOffsetX
  3854. y=y+@dragOffsetY
  3855. sprite.x=x&~3
  3856. sprite.y=y&~3
  3857. @sprites["title"].text=_ISPRINTF("F5: Help [{1:03d} {2:s}]",mapid,@mapinfos[@dragmapid].name)
  3858. else
  3859. xpos=x-@dragOffsetX
  3860. ypos=y-@dragOffsetY
  3861. for i in @mapspritepos.keys
  3862. sprite=getMapSprite(i)
  3863. sprite.x=(@mapspritepos[i][0]+xpos)&~3
  3864. sprite.y=(@mapspritepos[i][1]+ypos)&~3
  3865. end
  3866. @sprites["title"].text=_INTL("F5: Help")
  3867. end
  3868. else
  3869. if mapid>=0
  3870. @sprites["title"].text=_ISPRINTF("F5: Help [{1:03d} {2:s}]",mapid,@mapinfos[mapid].name)
  3871. else
  3872. @sprites["title"].text=_INTL("F5: Help")
  3873. end
  3874. end
  3875. end
  3876.  
  3877. def hittest(x,y)
  3878. for i in @mapsprites.keys
  3879. sx=@mapsprites[i].x
  3880. sy=@mapsprites[i].y
  3881. sr=sx+@mapsprites[i].bitmap.width
  3882. sb=sy+@mapsprites[i].bitmap.height
  3883. return i if x>=sx && x<sr && y>=sy && y<sb
  3884. end
  3885. return -1
  3886. end
  3887.  
  3888. def chooseMapScreen(title,currentmap)
  3889. return pbListScreen(title,MapLister.new(currentmap))
  3890. end
  3891.  
  3892. def update
  3893. mousepos=Mouse::getMousePos
  3894. if mousepos
  3895. hitmap=hittest(mousepos[0],mousepos[1])
  3896. if Input.triggerex?(0x01)
  3897. onClick(hitmap,mousepos[0],mousepos[1])
  3898. elsif Input.triggerex?(0x02)
  3899. onRightClick(hitmap,mousepos[0],mousepos[1])
  3900. elsif Input.releaseex?(0x01)
  3901. onMouseUp(hitmap)
  3902. elsif Input.releaseex?(0x02)
  3903. onRightMouseUp(hitmap)
  3904. else
  3905. if @lasthitmap!=hitmap
  3906. onMouseOver(hitmap,mousepos[0],mousepos[1])
  3907. @lasthitmap=hitmap
  3908. end
  3909. if @oldmousex!=mousepos[0]||@oldmousey!=mousepos[1]
  3910. onMouseMove(hitmap,mousepos[0],mousepos[1])
  3911. @oldmousex=mousepos[0]
  3912. @oldmousey=mousepos[1]
  3913. end
  3914. end
  3915. end
  3916. if Input.press?(Input::UP)
  3917. for i in @mapsprites
  3918. next if !i
  3919. i[1].y+=4
  3920. end
  3921. end
  3922. if Input.press?(Input::DOWN)
  3923. for i in @mapsprites
  3924. next if !i
  3925. i[1].y-=4
  3926. end
  3927. end
  3928. if Input.press?(Input::LEFT)
  3929. for i in @mapsprites
  3930. next if !i
  3931. i[1].x+=4
  3932. end
  3933. end
  3934. if Input.press?(Input::RIGHT)
  3935. for i in @mapsprites
  3936. next if !i
  3937. i[1].x-=4
  3938. end
  3939. end
  3940. if Input.triggerex?("A"[0])
  3941. id=chooseMapScreen(_INTL("Add Map"),@currentmap)
  3942. if id>0
  3943. addSprite(id)
  3944. setTopSprite(id)
  3945. @mapconns=generateConnectionData
  3946. end
  3947. elsif Input.triggerex?("S"[0])
  3948. id=chooseMapScreen(_INTL("Go to Map"),@currentmap)
  3949. if id>0
  3950. @mapconns=generateConnectionData
  3951. pbDisposeSpriteHash(@mapsprites)
  3952. @mapsprites.clear
  3953. @sprites["selsprite"].othersprite=nil
  3954. @selmapid=-1
  3955. putSprite(id)
  3956. @currentmap=id
  3957. end
  3958. elsif Input.triggerex?(0x2E) # Delete
  3959. if @mapsprites.keys.length>1 && @selmapid>=0
  3960. @mapsprites[@selmapid].bitmap.dispose
  3961. @mapsprites[@selmapid].dispose
  3962. @mapsprites.delete(@selmapid)
  3963. @sprites["selsprite"].othersprite=nil
  3964. @selmapid=-1
  3965. end
  3966. elsif Input.triggerex?("E"[0])
  3967. pbEncounterEditorMap(@encdata,@selmapid) if @selmapid>=0
  3968. elsif Input.trigger?(Input::F5)
  3969. helpWindow
  3970. end
  3971. pbUpdateSpriteHash(@sprites)
  3972. end
  3973.  
  3974. def pbMapScreenLoop
  3975. loop do
  3976. Graphics.update
  3977. Input.update
  3978. update
  3979. if Input.trigger?(Input::B)
  3980. if Kernel.pbConfirmMessage(_INTL("Save changes?"))
  3981. serializeConnectionData
  3982. serializeMetadata
  3983. save_data(@encdata,"Data/encounters.dat")
  3984. pbSaveEncounterData()
  3985. pbClearData
  3986. end
  3987. break if Kernel.pbConfirmMessage(_INTL("Exit from the editor?"))
  3988. end
  3989. end
  3990. end
  3991. end
  3992.  
  3993.  
  3994.  
  3995. def pbEditorScreen
  3996. pbCriticalCode {
  3997. mapscreen=MapScreenScene.new
  3998. mapscreen.mapScreen
  3999. mapscreen.pbMapScreenLoop
  4000. mapscreen.close
  4001. }
  4002. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement