Advertisement
mej71

PokemonEditor

Apr 27th, 2015
2,138
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. sx=(Graphics.width-256).to_f()/ww
  1367. sy=(Graphics.height-64).to_f()/wh
  1368. if sx<1.0 || sy<1.0
  1369. if sx>sy
  1370. ww=sy*ww
  1371. wh=(Graphics.height-64).to_f()
  1372. else
  1373. wh=sx*wh
  1374. ww=(Graphics.width-256).to_f()
  1375. end
  1376. end
  1377. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1378. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1379. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1380. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1381. end
  1382. end
  1383.  
  1384.  
  1385.  
  1386. class MusicFileLister
  1387. def getPlayingBGM
  1388. $game_system ? $game_system.getPlayingBGM : nil
  1389. end
  1390.  
  1391. def pbPlayBGM(bgm)
  1392. if bgm
  1393. pbBGMPlay(bgm)
  1394. else
  1395. pbBGMStop()
  1396. end
  1397. end
  1398.  
  1399. def initialize(bgm,setting)
  1400. @oldbgm=getPlayingBGM
  1401. @commands=[]
  1402. @bgm=bgm
  1403. @setting=setting
  1404. @index=0
  1405. end
  1406.  
  1407. def startIndex
  1408. return @index
  1409. end
  1410.  
  1411. def setViewport(viewport)
  1412. end
  1413.  
  1414. def commands
  1415. folder=(@bgm) ? "Audio/BGM/" : "Audio/ME/"
  1416. @commands.clear
  1417. Dir.chdir(folder){
  1418. Dir.glob("*.mp3"){|f| @commands.push(f) }
  1419. Dir.glob("*.MP3"){|f| @commands.push(f) }
  1420. Dir.glob("*.mid"){|f| @commands.push(f) }
  1421. Dir.glob("*.MID"){|f| @commands.push(f) }
  1422. }
  1423. @commands.sort!
  1424. @commands.length.times do |i|
  1425. @index=i if @commands[i]==@setting
  1426. end
  1427. if @commands.length==0
  1428. Kernel.pbMessage(_INTL("There are no files."))
  1429. end
  1430. return @commands
  1431. end
  1432.  
  1433. def value(index)
  1434. return (index<0) ? "" : @commands[index]
  1435. end
  1436.  
  1437. def dispose
  1438. pbPlayBGM(@oldbgm)
  1439. end
  1440.  
  1441. def refresh(index)
  1442. return if index<0
  1443. if @bgm
  1444. pbPlayBGM(@commands[index])
  1445. else
  1446. pbPlayBGM("../../Audio/ME/"+@commands[index])
  1447. end
  1448. end
  1449. end
  1450.  
  1451.  
  1452.  
  1453. class MapLister
  1454. def initialize(selmap,addGlobal=false)
  1455. @sprite=SpriteWrapper.new
  1456. @sprite.bitmap=nil
  1457. @sprite.z=2
  1458. @commands=[]
  1459. @maps=pbMapTree
  1460. @addGlobalOffset=(addGlobal) ? 1 : 0
  1461. @index=0
  1462. @index=i+@addGlobalOffset if @maps[i][0]==selmap
  1463. end
  1464. end
  1465.  
  1466. def setViewport(viewport)
  1467. @sprite.viewport=viewport
  1468. end
  1469.  
  1470. def startIndex
  1471. return @index
  1472. end
  1473.  
  1474. def commands
  1475. @commands.clear
  1476. if @addGlobalOffset==1
  1477. @commands.push(_INTL("[GLOBAL]"))
  1478. end
  1479. @commands.push(sprintf("%s%03d %s",(" "*@maps[i][2]),@maps[i][0],@maps[i][1]))
  1480. end
  1481. return @commands
  1482. end
  1483.  
  1484. def value(index)
  1485. if @addGlobalOffset==1
  1486. return 0 if index==0
  1487. end
  1488. return (index<0) ? -1 : @maps[index-@addGlobalOffset][0]
  1489. end
  1490.  
  1491. def dispose
  1492. @sprite.bitmap.dispose if @sprite.bitmap
  1493. @sprite.dispose
  1494. end
  1495.  
  1496. def refresh(index)
  1497. @sprite.bitmap.dispose if @sprite.bitmap
  1498. return if index<0
  1499. return if index==0 && @addGlobalOffset==1
  1500. @sprite.bitmap=createMinimap(@maps[index-@addGlobalOffset][0])
  1501. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(@sprite.bitmap.width/2)
  1502. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(@sprite.bitmap.height/2)
  1503. end
  1504. end
  1505.  
  1506.  
  1507.  
  1508. class ItemLister
  1509. def initialize(selection,includeNew=false)
  1510. @sprite=IconSprite.new(0,0)
  1511. @sprite.bitmap=nil
  1512. @sprite.z=2
  1513. @selection=selection
  1514. @commands=[]
  1515. @ids=[]
  1516. @includeNew=includeNew
  1517. @trainers=nil
  1518. @index=0
  1519. end
  1520.  
  1521. def setViewport(viewport)
  1522. @sprite.viewport=viewport
  1523. end
  1524.  
  1525. def startIndex
  1526. return @index
  1527. end
  1528.  
  1529. def commands # Sorted alphabetically
  1530. @commands.clear
  1531. @ids.clear
  1532. @itemdata=readItemList("Data/items.dat")
  1533. cmds=[]
  1534. for i in 1..PBItems.maxValue
  1535. name=@itemdata[i][ITEMNAME]
  1536. if name && name!="" && @itemdata[i][ITEMPOCKET]!=0
  1537. cmds.push([i,name])
  1538. end
  1539. end
  1540. cmds.sort! {|a,b| a[1]<=>b[1]}
  1541. if @includeNew
  1542. @commands.push(_ISPRINTF("[NEW ITEM]"))
  1543. @ids.push(-1)
  1544. end
  1545. for i in cmds
  1546. @commands.push(_ISPRINTF("{1:03d}: {2:s}",i[0],i[1]))
  1547. @ids.push(i[0])
  1548. end
  1549. @index=@selection
  1550. @index=0 if @index<0
  1551. return @commands
  1552. end
  1553.  
  1554. =begin
  1555. def commands # Sorted by item index number
  1556. @commands.clear
  1557. @ids.clear
  1558. @itemdata=readItemList("Data/items.dat")
  1559. if @includeNew
  1560. @commands.push(_ISPRINTF("[NEW ITEM]"))
  1561. @ids.push(-1)
  1562. end
  1563. for i in 1..PBItems.maxValue
  1564. # Number: Item name
  1565. name=@itemdata[i][1]
  1566. if name && name!="" && @itemdata[i][2]!=0
  1567. @commands.push(_ISPRINTF("{1:3d}: {2:s}",i,name))
  1568. @ids.push(i)
  1569. end
  1570. end
  1571. @index=@selection
  1572. @index=0 if @index<0
  1573. return @commands
  1574. end
  1575. =end
  1576.  
  1577. def value(index)
  1578. return nil if (index<0)
  1579. return -1 if index==0 && @includeNew
  1580. realIndex=index
  1581. return @ids[realIndex]
  1582. end
  1583.  
  1584. def dispose
  1585. @sprite.bitmap.dispose if @sprite.bitmap
  1586. @sprite.dispose
  1587. end
  1588.  
  1589. def refresh(index)
  1590. @sprite.bitmap.dispose if @sprite.bitmap
  1591. return if index<0
  1592. begin
  1593. filename=pbItemIconFile(@ids[index])
  1594. @sprite.setBitmap(filename,0)
  1595. rescue
  1596. @sprite.setBitmap(nil)
  1597. end
  1598. sx=(Graphics.width-256).to_f()/ww
  1599. sy=(Graphics.height-64).to_f()/wh
  1600. if sx<1.0 || sy<1.0
  1601. if sx>sy
  1602. ww=sy*ww
  1603. wh=(Graphics.height-64).to_f()
  1604. else
  1605. wh=sx*wh
  1606. ww=(Graphics.width-256).to_f()
  1607. end
  1608. end
  1609. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1610. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1611. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1612. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1613. end
  1614. end
  1615.  
  1616.  
  1617.  
  1618. class TrainerTypeLister
  1619. def initialize(selection,includeNew)
  1620. @sprite=IconSprite.new(0,0)
  1621. @sprite.bitmap=nil
  1622. @sprite.z=2
  1623. @selection=selection
  1624. @commands=[]
  1625. @ids=[]
  1626. @includeNew=includeNew
  1627. @trainers=nil
  1628. @index=0
  1629. end
  1630.  
  1631. def setViewport(viewport)
  1632. @sprite.viewport=viewport
  1633. end
  1634.  
  1635. def startIndex
  1636. return @index
  1637. end
  1638.  
  1639. def commands
  1640. @commands.clear
  1641. @ids.clear
  1642. @trainers=load_data("Data/trainertypes.dat")
  1643. if @includeNew
  1644. @commands.push(_ISPRINTF("[NEW TRAINER TYPE]"))
  1645. @ids.push(-1)
  1646. end
  1647. @trainers.length.times do |i|
  1648. next if !@trainers[i]
  1649. @commands.push(_ISPRINTF("{1:3d}: {2:s}",i,@trainers[i][2]))
  1650. @ids.push(@trainers[i][0])
  1651. end
  1652. @commands.length.times do |i|
  1653. @index=i if @ids[i]==@selection
  1654. end
  1655. return @commands
  1656. end
  1657.  
  1658. def value(index)
  1659. return nil if (index<0)
  1660. return [-1] if @ids[index]==-1
  1661. return @trainers[@ids[index]]
  1662. end
  1663.  
  1664. def dispose
  1665. @sprite.bitmap.dispose if @sprite.bitmap
  1666. @sprite.dispose
  1667. end
  1668.  
  1669. def refresh(index)
  1670. @sprite.bitmap.dispose if @sprite.bitmap
  1671. return if index<0
  1672. begin
  1673. @sprite.setBitmap(pbTrainerSpriteFile(@ids[index]),0)
  1674. rescue
  1675. @sprite.setBitmap(nil)
  1676. end
  1677. sx=(Graphics.width-256).to_f()/ww
  1678. sy=(Graphics.height-64).to_f()/wh
  1679. if sx<1.0 || sy<1.0
  1680. if sx>sy
  1681. ww=sy*ww
  1682. wh=(Graphics.height-64).to_f()
  1683. else
  1684. wh=sx*wh
  1685. ww=(Graphics.width-256).to_f()
  1686. end
  1687. end
  1688. @sprite.zoom_x=ww*1.0/@sprite.bitmap.width
  1689. @sprite.zoom_y=wh*1.0/@sprite.bitmap.height
  1690. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  1691. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  1692. end
  1693. end
  1694.  
  1695.  
  1696.  
  1697. ################################################################################
  1698. # General properties
  1699. ################################################################################
  1700. class UIntProperty
  1701. def initialize(maxdigits)
  1702. @maxdigits=maxdigits
  1703. end
  1704.  
  1705. def set(settingname,oldsetting)
  1706. params=ChooseNumberParams.new
  1707. params.setMaxDigits(@maxdigits)
  1708. params.setDefaultValue(oldsetting||0)
  1709. return Kernel.pbMessageChooseNumber(
  1710. _INTL("Set the value for {1}.",settingname),params)
  1711. end
  1712.  
  1713. def format(value)
  1714. return value.inspect
  1715. end
  1716.  
  1717. def defaultValue
  1718. return 0
  1719. end
  1720. end
  1721.  
  1722.  
  1723.  
  1724. class LimitProperty
  1725. def initialize(maxvalue)
  1726. @maxvalue=maxvalue
  1727. end
  1728.  
  1729. def set(settingname,oldsetting)
  1730. oldsetting=1 if !oldsetting
  1731. params=ChooseNumberParams.new
  1732. params.setRange(0,@maxvalue)
  1733. params.setDefaultValue(oldsetting)
  1734. ret=Kernel.pbMessageChooseNumber(
  1735. _INTL("Set the value for {1}.",settingname),params)
  1736. return ret
  1737. end
  1738.  
  1739. def format(value)
  1740. return value.inspect
  1741. end
  1742.  
  1743. def defaultValue
  1744. return 0
  1745. end
  1746. end
  1747.  
  1748.  
  1749.  
  1750. class NonzeroLimitProperty
  1751. def initialize(maxvalue)
  1752. @maxvalue=maxvalue
  1753. end
  1754.  
  1755. def set(settingname,oldsetting)
  1756. oldsetting=1 if !oldsetting
  1757. params=ChooseNumberParams.new
  1758. params.setRange(1,@maxvalue)
  1759. params.setDefaultValue(oldsetting)
  1760. ret=Kernel.pbMessageChooseNumber(
  1761. _INTL("Set the value for {1}.",settingname),params)
  1762. return ret
  1763. end
  1764.  
  1765. def format(value)
  1766. return value.inspect
  1767. end
  1768.  
  1769. def defaultValue
  1770. return 0
  1771. end
  1772. end
  1773.  
  1774.  
  1775.  
  1776. class ReadOnlyProperty
  1777. def self.set(settingname,oldsetting)
  1778. Kernel.pbMessage(_INTL("This property cannot be edited."))
  1779. return oldsetting
  1780. end
  1781.  
  1782. def self.format(value)
  1783. return value.inspect
  1784. end
  1785. end
  1786.  
  1787.  
  1788.  
  1789. module UndefinedProperty
  1790. def self.set(settingname,oldsetting)
  1791. Kernel.pbMessage(_INTL("This property can't be edited here at this time."))
  1792. return oldsetting
  1793. end
  1794.  
  1795. def self.format(value)
  1796. return value.inspect
  1797. end
  1798. end
  1799.  
  1800.  
  1801.  
  1802. class EnumProperty
  1803. def initialize(values)
  1804. @values=values
  1805. end
  1806.  
  1807. def set(settingname,oldsetting)
  1808. commands=[]
  1809. for value in @values
  1810. commands.push(value)
  1811. end
  1812. cmd=Kernel.pbMessage(_INTL("Choose a value for {1}.",settingname),commands,-1)
  1813. return oldsetting if cmd<0
  1814. return cmd
  1815. end
  1816.  
  1817. def defaultValue
  1818. return 0
  1819. end
  1820.  
  1821. def format(value)
  1822. return value ? @values[value] : value.inspect
  1823. end
  1824. end
  1825.  
  1826.  
  1827.  
  1828. module BooleanProperty
  1829. def self.set(settingname,oldsetting)
  1830. return Kernel.pbConfirmMessage(_INTL("Enable the setting {1}?",settingname)) ? true : false
  1831. end
  1832.  
  1833. def self.format(value)
  1834. return value.inspect
  1835. end
  1836. end
  1837.  
  1838.  
  1839.  
  1840. module StringProperty
  1841. def self.set(settingname,oldsetting)
  1842. message=Kernel.pbMessageFreeText(_INTL("Set the value for {1}.",settingname),
  1843. oldsetting ? oldsetting : "",false,256,Graphics.width)
  1844. end
  1845.  
  1846. def self.format(value)
  1847. return value
  1848. end
  1849. end
  1850.  
  1851.  
  1852.  
  1853. class LimitStringProperty
  1854. def initialize(limit)
  1855. @limit=limit
  1856. end
  1857.  
  1858. def set(settingname,oldsetting)
  1859. message=Kernel.pbMessageFreeText(_INTL("Set the value for {1}.",settingname),
  1860. oldsetting ? oldsetting : "",false,@limit)
  1861. end
  1862.  
  1863. def format(value)
  1864. return value
  1865. end
  1866. end
  1867.  
  1868.  
  1869.  
  1870. module BGMProperty
  1871. def self.set(settingname,oldsetting)
  1872. chosenmap=pbListScreen(settingname,MusicFileLister.new(true,oldsetting))
  1873. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1874. end
  1875.  
  1876. def self.format(value)
  1877. return value
  1878. end
  1879. end
  1880.  
  1881.  
  1882.  
  1883. module MEProperty
  1884. def self.set(settingname,oldsetting)
  1885. chosenmap=pbListScreen(settingname,MusicFileLister.new(false,oldsetting))
  1886. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1887. end
  1888.  
  1889. def self.format(value)
  1890. return value
  1891. end
  1892. end
  1893.  
  1894.  
  1895.  
  1896. module WindowskinProperty
  1897. def self.set(settingname,oldsetting)
  1898. chosenmap=pbListScreen(settingname,
  1899. GraphicsLister.new("Graphics/Windowskins/",oldsetting))
  1900. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  1901. end
  1902.  
  1903. def self.format(value)
  1904. return value
  1905. end
  1906. end
  1907.  
  1908.  
  1909.  
  1910. module TrainerTypeProperty
  1911. def self.set(settingname,oldsetting)
  1912. chosenmap=pbListScreen(settingname,
  1913. TrainerTypeLister.new(oldsetting,false))
  1914. return chosenmap ? chosenmap[0] : oldsetting
  1915. end
  1916.  
  1917. def self.format(value)
  1918. return !value ? value.inspect : PBTrainers.getName(value)
  1919. end
  1920. end
  1921.  
  1922.  
  1923.  
  1924. module SpeciesProperty
  1925. def self.set(settingname,oldsetting)
  1926. ret=pbChooseSpeciesList(oldsetting ? oldsetting : 1)
  1927. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1928. end
  1929.  
  1930. def self.format(value)
  1931. return value ? PBSpecies.getName(value) : "-"
  1932. end
  1933.  
  1934. def self.defaultValue
  1935. return 0
  1936. end
  1937. end
  1938.  
  1939.  
  1940.  
  1941. module TypeProperty
  1942. def self.set(settingname,oldsetting)
  1943. ret=pbChooseTypeList(oldsetting ? oldsetting : 0)
  1944. return (ret<0) ? (oldsetting ? oldsetting : 0) : ret
  1945. end
  1946.  
  1947. def self.format(value)
  1948. return value ? PBTypes.getName(value) : "-"
  1949. end
  1950.  
  1951. def self.defaultValue
  1952. return 0
  1953. end
  1954. end
  1955.  
  1956.  
  1957.  
  1958. module MoveProperty
  1959. def self.set(settingname,oldsetting)
  1960. ret=pbChooseMoveList(oldsetting ? oldsetting : 1)
  1961. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1962. end
  1963.  
  1964. def self.format(value)
  1965. return value ? PBMoves.getName(value) : "-"
  1966. end
  1967.  
  1968. def self.defaultValue
  1969. return 0
  1970. end
  1971. end
  1972.  
  1973.  
  1974.  
  1975. module ItemProperty
  1976. def self.set(settingname,oldsetting)
  1977. ret=pbChooseItemList(oldsetting ? oldsetting : 1)
  1978. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  1979. end
  1980.  
  1981. def self.format(value)
  1982. return value ? PBItems.getName(value) : "-"
  1983. end
  1984.  
  1985. def self.defaultValue
  1986. return 0
  1987. end
  1988. end
  1989.  
  1990.  
  1991.  
  1992. module NatureProperty
  1993. def self.set(settingname,oldsetting)
  1994. commands=[]
  1995. (PBNatures.getCount).times do |i|
  1996. commands.push(PBNatures.getName(i))
  1997. end
  1998. ret=Kernel.pbShowCommands(nil,commands,-1)
  1999. return ret
  2000. end
  2001.  
  2002. def self.format(value)
  2003. return "" if !value
  2004. return (value>=0) ? getConstantName(PBNatures,value) : ""
  2005. end
  2006.  
  2007. def self.defaultValue
  2008. return 0
  2009. end
  2010. end
  2011.  
  2012.  
  2013.  
  2014. ################################################################################
  2015. # Core property editor script
  2016. ################################################################################
  2017. def pbPropertyList(title,data,properties,saveprompt=false)
  2018. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  2019. viewport.z=99999
  2020. list=pbListWindow([],Graphics.width*5/10)
  2021. list.viewport=viewport
  2022. list.z=2
  2023. title=Window_UnformattedTextPokemon.new(title)
  2024. title.x=list.width
  2025. title.y=0
  2026. title.width=Graphics.width*5/10
  2027. title.height=64
  2028. title.viewport=viewport
  2029. title.z=2
  2030. desc=Window_UnformattedTextPokemon.new("")
  2031. desc.x=list.width
  2032. desc.y=title.height
  2033. desc.width=Graphics.width*5/10
  2034. desc.height=Graphics.height-title.height
  2035. desc.viewport=viewport
  2036. desc.z=2
  2037. selectedmap=-1
  2038. index=0
  2039. retval=nil
  2040. commands=[]
  2041. for i in 0...properties.length
  2042. propobj=properties[i][1]
  2043. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2044. end
  2045. list.commands=commands
  2046. list.index=0
  2047. begin
  2048. loop do
  2049. Graphics.update
  2050. Input.update
  2051. list.update
  2052. desc.update
  2053. if list.index!=selectedmap
  2054. desc.text=properties[list.index][2]
  2055. selectedmap=list.index
  2056. end
  2057. if Input.trigger?(Input::A)
  2058. propobj=properties[selectedmap][1]
  2059. if propobj!=ReadOnlyProperty && !propobj.is_a?(ReadOnlyProperty) &&
  2060. Kernel.pbConfirmMessage(_INTL("Reset the setting {1}?",properties[selectedmap][0]))
  2061. if propobj.respond_to?("defaultValue")
  2062. data[selectedmap]=propobj.defaultValue
  2063. else
  2064. data[selectedmap]=nil
  2065. end
  2066. end
  2067. commands.clear
  2068. for i in 0...properties.length
  2069. propobj=properties[i][1]
  2070. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2071. end
  2072. list.commands=commands
  2073. elsif Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  2074. propobj=properties[selectedmap][1]
  2075. oldsetting=data[selectedmap]
  2076. newsetting=propobj.set(properties[selectedmap][0],oldsetting)
  2077. data[selectedmap]=newsetting
  2078. commands.clear
  2079. for i in 0...properties.length
  2080. propobj=properties[i][1]
  2081. commands.push(sprintf("%s=%s",properties[i][0],propobj.format(data[i])))
  2082. end
  2083. list.commands=commands
  2084. break
  2085. elsif Input.trigger?(Input::B)
  2086. selectedmap=-1
  2087. break
  2088. end
  2089. end
  2090. if selectedmap==-1 && saveprompt
  2091. cmd=Kernel.pbMessage(_INTL("Save changes?"),
  2092. [_INTL("Yes"),_INTL("No"),_INTL("Cancel")],3)
  2093. if cmd==2
  2094. selectedmap=list.index
  2095. else
  2096. retval=(cmd==0)
  2097. end
  2098. end
  2099. end while selectedmap!=-1
  2100. title.dispose
  2101. list.dispose
  2102. desc.dispose
  2103. Input.update
  2104. return retval
  2105. end
  2106.  
  2107.  
  2108.  
  2109. ################################################################################
  2110. # Encounters editor
  2111. ################################################################################
  2112. def pbEncounterEditorTypes(enc,enccmd)
  2113. commands=[]
  2114. indexes=[]
  2115. haveblank=false
  2116. if enc
  2117. commands.push(_INTL("Density: {1},{2},{3}",
  2118. enc[0][EncounterTypes::Land],
  2119. enc[0][EncounterTypes::Cave],
  2120. enc[0][EncounterTypes::Water]))
  2121. indexes.push(-2)
  2122. for i in 0...EncounterTypes::EnctypeChances.length
  2123. if enc[1][i]
  2124. commands.push(EncounterTypes::Names[i])
  2125. indexes.push(i)
  2126. else
  2127. haveblank=true
  2128. end
  2129. end
  2130. else
  2131. commands.push(_INTL("Density: Not Defined Yet"))
  2132. indexes.push(-2)
  2133. haveblank=true
  2134. end
  2135. if haveblank
  2136. commands.push(_INTL("[New Encounter Type]"))
  2137. indexes.push(-3)
  2138. end
  2139. enccmd.z=99999
  2140. enccmd.visible=true
  2141. enccmd.commands=commands
  2142. enccmd.height=Graphics.height if enccmd.height>Graphics.height
  2143. enccmd.x=0
  2144. enccmd.y=0
  2145. enccmd.active=true
  2146. enccmd.index=0
  2147. ret=0
  2148. command=0
  2149. loop do
  2150. Graphics.update
  2151. Input.update
  2152. enccmd.update
  2153. if Input.trigger?(Input::A) && indexes[enccmd.index]>=0
  2154. if Kernel.pbConfirmMessage(_INTL("Delete the encounter type {1}?",commands[enccmd.index]))
  2155. enc[1][indexes[enccmd.index]]=nil
  2156. commands.delete_at(enccmd.index)
  2157. indexes.delete_at(enccmd.index)
  2158. enccmd.commands=commands
  2159. if enccmd.index>=enccmd.commands.length
  2160. enccmd.index=enccmd.commands.length
  2161. end
  2162. end
  2163. end
  2164. if Input.trigger?(Input::B)
  2165. command=-1
  2166. break
  2167. end
  2168. if Input.trigger?(Input::C) || (enccmd.doubleclick? rescue false)
  2169. command=enccmd.index
  2170. break
  2171. end
  2172. end
  2173. ret=command
  2174. enccmd.active=false
  2175. return ret<0 ? -1 : indexes[ret]
  2176. end
  2177.  
  2178. def pbNewEncounterType(enc)
  2179. cmdwin=pbListWindow([])
  2180. commands=[]
  2181. indexes=[]
  2182. for i in 0...EncounterTypes::EnctypeChances.length
  2183. dogen=false
  2184. if !enc[1][i]
  2185. if i==0
  2186. dogen=true unless enc[1][EncounterTypes::Cave]
  2187. elsif i==1
  2188. dogen=true unless enc[1][EncounterTypes::Land] ||
  2189. enc[1][EncounterTypes::LandMorning] ||
  2190. enc[1][EncounterTypes::LandDay] ||
  2191. enc[1][EncounterTypes::LandNight] ||
  2192. enc[1][EncounterTypes::BugContest]
  2193. else
  2194. dogen=true
  2195. end
  2196. end
  2197. if dogen
  2198. commands.push(EncounterTypes::Names[i])
  2199. indexes.push(i)
  2200. end
  2201. end
  2202. ret=pbCommands2(cmdwin,commands,-1)
  2203. ret=(ret<0) ? -1 : indexes[ret]
  2204. if ret>=0
  2205. chances=EncounterTypes::EnctypeChances[ret]
  2206. enc[1][ret]=[]
  2207. for i in 0...chances.length
  2208. enc[1][ret].push([1,5,5])
  2209. end
  2210. end
  2211. cmdwin.dispose
  2212. return ret
  2213. end
  2214.  
  2215. def pbEditEncounterType(enc,etype)
  2216. commands=[]
  2217. cmdwin=pbListWindow([])
  2218. chances=EncounterTypes::EnctypeChances[etype]
  2219. chancetotal=0
  2220. chances.each {|a| chancetotal+=a}
  2221. enctype=enc[1][etype]
  2222. for i in 0...chances.length
  2223. enctype[i]=[1,5,5] if !enctype[i]
  2224. end
  2225. ret=0
  2226. loop do
  2227. commands.clear
  2228. for i in 0...enctype.length
  2229. ch=chances[i]
  2230. ch=sprintf("%.1f",100.0*chances[i]/chancetotal) if chancetotal!=100
  2231. if enctype[i][1]==enctype[i][2]
  2232. commands.push(_INTL("{1}% {2} (Lv.{3})",
  2233. ch,PBSpecies.getName(enctype[i][0]),
  2234. enctype[i][1]
  2235. ))
  2236. else
  2237. commands.push(_INTL("{1}% {2} (Lv.{3}-Lv.{4})",
  2238. ch,PBSpecies.getName(enctype[i][0]),
  2239. enctype[i][1],
  2240. enctype[i][2]
  2241. ))
  2242. end
  2243. end
  2244. ret=pbCommands2(cmdwin,commands,-1,ret)
  2245. break if ret<0
  2246. species=pbChooseSpecies(enctype[ret][0])
  2247. next if species<=0
  2248. enctype[ret][0]=species if species>0
  2249. minlevel=0
  2250. maxlevel=0
  2251. params=ChooseNumberParams.new
  2252. params.setRange(1,PBExperience::MAXLEVEL)
  2253. params.setDefaultValue(enctype[ret][1])
  2254. minlevel=Kernel.pbMessageChooseNumber(_INTL("Set the minimum level."),params)
  2255. params=ChooseNumberParams.new
  2256. params.setRange(minlevel,PBExperience::MAXLEVEL)
  2257. params.setDefaultValue(minlevel)
  2258. maxlevel=Kernel.pbMessageChooseNumber(_INTL("Set the maximum level."),params)
  2259. enctype[ret][1]=minlevel
  2260. enctype[ret][2]=maxlevel
  2261. end
  2262. cmdwin.dispose
  2263. end
  2264.  
  2265. def pbEncounterEditorDensity(enc)
  2266. params=ChooseNumberParams.new
  2267. params.setRange(0,100)
  2268. params.setDefaultValue(enc[0][EncounterTypes::Land])
  2269. enc[0][EncounterTypes::Land]=Kernel.pbMessageChooseNumber(
  2270. _INTL("Set the density of Pokémon on land (default {1}).",
  2271. EncounterTypes::EnctypeDensities[EncounterTypes::Land]),params)
  2272. params=ChooseNumberParams.new
  2273. params.setRange(0,100)
  2274. params.setDefaultValue(enc[0][EncounterTypes::Cave])
  2275. enc[0][EncounterTypes::Cave]=Kernel.pbMessageChooseNumber(
  2276. _INTL("Set the density of Pokémon in caves (default {1}).",
  2277. EncounterTypes::EnctypeDensities[EncounterTypes::Cave]),params)
  2278. params=ChooseNumberParams.new
  2279. params.setRange(0,100)
  2280. params.setDefaultValue(enc[0][EncounterTypes::Water])
  2281. enc[0][EncounterTypes::Water]=Kernel.pbMessageChooseNumber(
  2282. _INTL("Set the density of Pokémon on water (default {1}).",
  2283. EncounterTypes::EnctypeDensities[EncounterTypes::Water]),params)
  2284. for i in 0...EncounterTypes::EnctypeCompileDens.length
  2285. t=EncounterTypes::EnctypeCompileDens[i]
  2286. next if !t || t==0
  2287. enc[0][i]=enc[0][EncounterTypes::Land] if t==1
  2288. enc[0][i]=enc[0][EncounterTypes::Cave] if t==2
  2289. enc[0][i]=enc[0][EncounterTypes::Water] if t==3
  2290. end
  2291. end
  2292.  
  2293. def pbEncounterEditorMap(encdata,map)
  2294. enccmd=pbListWindow([])
  2295. # This window displays the help text
  2296. enchelp=Window_UnformattedTextPokemon.new("")
  2297. enchelp.z=99999
  2298. enchelp.x=256
  2299. enchelp.y=0
  2300. enchelp.width=224
  2301. enchelp.height=96
  2302. mapinfos=load_data("Data/MapInfos.rxdata")
  2303. mapname=mapinfos[map].name
  2304. lastchoice=0
  2305. loop do
  2306. enc=encdata[map]
  2307. enchelp.text=_INTL("{1}",mapname)
  2308. choice=pbEncounterEditorTypes(enc,enccmd)
  2309. if !enc
  2310. enc=[EncounterTypes::EnctypeDensities.clone,[]]
  2311. encdata[map]=enc
  2312. end
  2313. if choice==-2
  2314. pbEncounterEditorDensity(enc)
  2315. elsif choice==-1
  2316. break
  2317. elsif choice==-3
  2318. ret=pbNewEncounterType(enc)
  2319. if ret>=0
  2320. enchelp.text=_INTL("{1}\r\n{2}",mapname,EncounterTypes::Names[ret])
  2321. pbEditEncounterType(enc,ret)
  2322. end
  2323. else
  2324. enchelp.text=_INTL("{1}\r\n{2}",mapname,EncounterTypes::Names[choice])
  2325. pbEditEncounterType(enc,choice)
  2326. end
  2327. end
  2328. if encdata[map][1].length==0
  2329. encdata[map]=nil
  2330. end
  2331. enccmd.dispose
  2332. enchelp.dispose
  2333. Input.update
  2334. end
  2335.  
  2336.  
  2337.  
  2338. ################################################################################
  2339. # Trainer type editor
  2340. ################################################################################
  2341. def pbTrainerTypeEditorNew(trconst)
  2342. data=load_data("Data/trainertypes.dat")
  2343. # Get the first unused ID after all existing t-types for the new t-type to use.
  2344. maxid=-1
  2345. for rec in data
  2346. next if !rec
  2347. maxid=[maxid,rec[0]].max
  2348. end
  2349. trainertype=maxid+1
  2350. trname=Kernel.pbMessageFreeText(_INTL("Please enter the trainer type's name."),
  2351. trconst ? trconst.gsub(/_+/," ") : "",false,256)
  2352. if trname=="" && !trconst
  2353. return -1
  2354. else
  2355. # Create a default name if there is none.
  2356. if !trconst
  2357. trconst=trname.gsub(/[^A-Za-z0-9_]/,"")
  2358. trconst=trconst.sub(/^([a-z])/){ $1.upcase }
  2359. if trconst.length==0
  2360. trconst=sprintf("T_%03d",trainertype)
  2361. elsif !trconst[0,1][/[A-Z]/]
  2362. trconst="T_"+trconst
  2363. end
  2364. end
  2365. trname=trconst if trname==""
  2366. # Create an internal name based on the trainer type's name.
  2367. cname=trname.gsub(/é/,"e")
  2368. cname=cname.gsub(/[^A-Za-z0-9_]/,"")
  2369. cname=cname.upcase
  2370. if hasConst?(PBTrainers,cname)
  2371. suffix=1
  2372. 100.times do
  2373. tname=sprintf("%s_%d",cname,suffix)
  2374. if !hasConst?(PBTrainers,tname)
  2375. cname=tname
  2376. break
  2377. end
  2378. suffix+=1
  2379. end
  2380. end
  2381. if hasConst?(PBTrainers,cname)
  2382. Kernel.pbMessage(_INTL("Failed to create the trainer type. Choose a different name."))
  2383. return -1
  2384. end
  2385. record=[]
  2386. record[0]=trainertype
  2387. record[1]=cname
  2388. record[2]=trname
  2389. record[7]=Kernel.pbMessage(_INTL("Is the Trainer male, female, or mixed gender?"),[
  2390. _INTL("Male"),_INTL("Female"),_INTL("Mixed")],0)
  2391. params=ChooseNumberParams.new
  2392. params.setRange(0,255)
  2393. params.setDefaultValue(30)
  2394. record[3]=Kernel.pbMessageChooseNumber(
  2395. _INTL("Set the money per level won for defeating the Trainer."),params)
  2396. record[8]=record[3]
  2397. PBTrainers.const_set(cname,record[0])
  2398. data[record[0]]=record
  2399. save_data(data,"Data/trainertypes.dat")
  2400. pbConvertTrainerData
  2401. Kernel.pbMessage(_INTL("The Trainer type was created (ID: {1}).",record[0]))
  2402. Kernel.pbMessage(
  2403. _ISPRINTF("Put the Trainer's graphic (trainer{1:03d}.png or trainer{2:s}.png) in Graphics/Characters, or it will be blank.",
  2404. record[0],getConstantName(PBTrainers,record[0])))
  2405. return record[0]
  2406. end
  2407. end
  2408.  
  2409. def pbTrainerTypeEditorSave(trainertype,ttdata)
  2410. record=[]
  2411. record[0]=trainertype
  2412. for i in 0..ttdata.length
  2413. record.push(ttdata[i])
  2414. end
  2415. setConstantName(PBTrainers,trainertype,ttdata[0])
  2416. data=load_data("Data/trainertypes.dat")
  2417. data[record[0]]=record
  2418. data=save_data(data,"Data/trainertypes.dat")
  2419. pbConvertTrainerData
  2420. end
  2421.  
  2422. def pbTrainerTypeEditor
  2423. selection=0
  2424. trainerTypes=[
  2425. [_INTL("Internal Name"),ReadOnlyProperty,
  2426. _INTL("Internal name that appears in constructs like PBTrainers::XXX.")],
  2427. [_INTL("Trainer Name"),StringProperty,
  2428. _INTL("Name of the trainer type as displayed by the game.")],
  2429. [_INTL("Money Per Level"),LimitProperty.new(255),
  2430. _INTL("Player earns this amount times the highest level among the trainer's Pokémon.")],
  2431. [_INTL("Battle BGM"),BGMProperty,
  2432. _INTL("BGM played in battles against trainers of this type.")],
  2433. [_INTL("Battle End ME"),MEProperty,
  2434. _INTL("ME played when player wins battles against trainers of this type.")],
  2435. [_INTL("Battle Intro ME"),MEProperty,
  2436. _INTL("ME played before battles against trainers of this type.")],
  2437. [_INTL("Gender"),EnumProperty.new([_INTL("Male"),_INTL("Female"),_INTL("Mixed gender")]),
  2438. _INTL("Gender of this Trainer type.")],
  2439. [_INTL("Skill"),LimitProperty.new(255),
  2440. _INTL("Skill level of this Trainer type.")],
  2441. ]
  2442. pbListScreenBlock(_INTL("Trainer Types"),TrainerTypeLister.new(selection,true)){|button,trtype|
  2443. if trtype
  2444. if button==Input::A
  2445. if trtype[0]>=0
  2446. if Kernel.pbConfirmMessageSerious("Delete this trainer type?")
  2447. data=load_data("Data/trainertypes.dat")
  2448. removeConstantValue(PBTrainers,trtype[0])
  2449. data[trtype[0]]=nil
  2450. save_data(data,"Data/trainertypes.dat")
  2451. pbConvertTrainerData
  2452. Kernel.pbMessage(_INTL("The Trainer type was deleted."))
  2453. end
  2454. end
  2455. elsif button==Input::C
  2456. selection=trtype[0]
  2457. if selection<0
  2458. newid=pbTrainerTypeEditorNew(nil)
  2459. if newid>=0
  2460. selection=newid
  2461. end
  2462. else
  2463. data=[]
  2464. for i in 1..trtype.length
  2465. data.push(trtype[i])
  2466. end
  2467. # trtype[2] contains trainer's name to display as title
  2468. save=pbPropertyList(trtype[2],data,trainerTypes,true)
  2469. if save
  2470. pbTrainerTypeEditorSave(selection,data)
  2471. end
  2472. end
  2473. end
  2474. end
  2475. }
  2476. end
  2477.  
  2478.  
  2479.  
  2480. ################################################################################
  2481. # Trainer editor
  2482. ################################################################################
  2483. class TrainerBattleLister
  2484. def initialize(selection,includeNew)
  2485. @sprite=IconSprite.new
  2486. @sprite.bitmap=nil
  2487. @sprite.z=2
  2488. @selection=selection
  2489. @commands=[]
  2490. @ids=[]
  2491. @includeNew=includeNew
  2492. @trainers=nil
  2493. @index=0
  2494. end
  2495.  
  2496. def setViewport(viewport)
  2497. @sprite.viewport=viewport
  2498. end
  2499.  
  2500. def startIndex
  2501. return @index
  2502. end
  2503.  
  2504. def commands
  2505. @commands.clear
  2506. @ids.clear
  2507. @trainers=load_data("Data/trainers.dat")
  2508. if @includeNew
  2509. @commands.push(_ISPRINTF("[NEW TRAINER BATTLE]"))
  2510. @ids.push(-1)
  2511. end
  2512. @trainers.length.times do |i|
  2513. next if !@trainers[i]
  2514. # Index: TrainerType TrainerName (version)
  2515. @commands.push(_ISPRINTF("{1:3d}: {2:s} {3:s} ({4:s})",i,
  2516. PBTrainers.getName(@trainers[i][0]),@trainers[i][1],@trainers[i][4])) # Trainer's name must not be localized
  2517. # Trainer type ID
  2518. @ids.push(@trainers[i][0])
  2519. end
  2520. @index=@selection
  2521. @index=0 if @index<0
  2522. return @commands
  2523. end
  2524.  
  2525. def value(index)
  2526. return nil if (index<0)
  2527. return [-1,nil] if index==0 && @includeNew
  2528. realIndex=(@includeNew) ? index-1 : index
  2529. return [realIndex,@trainers[realIndex]]
  2530. end
  2531.  
  2532. def dispose
  2533. @sprite.bitmap.dispose if @sprite.bitmap
  2534. @sprite.dispose
  2535. end
  2536.  
  2537. def refresh(index)
  2538. @sprite.bitmap.dispose if @sprite.bitmap
  2539. return if index<0
  2540. begin
  2541. @sprite.bitmap=AnimatedBitmapWrapper.new(pbTrainerSpriteFile(@ids[index]),0,2).bitmap
  2542. rescue
  2543. @sprite.setBitmap(nil)
  2544. end
  2545. [email protected]_rect.width
  2546. [email protected]_rect.height
  2547. sx=(Graphics.width-256).to_f()/ww
  2548. sy=(Graphics.height-64).to_f()/wh
  2549. if sx<1.0 || sy<1.0
  2550. if sx>sy
  2551. ww=sy*ww
  2552. wh=(Graphics.height-64).to_f()
  2553. else
  2554. wh=sx*wh
  2555. ww=(Graphics.width-256).to_f()
  2556. end
  2557. end
  2558. @sprite.zoom_x=ww*1.0/@sprite.src_rect.width
  2559. @sprite.zoom_y=wh*1.0/@sprite.src_rect.height
  2560. @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(ww/2)
  2561. @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(wh/2)
  2562. end
  2563. end
  2564.  
  2565.  
  2566.  
  2567. module TrainerBattleProperty
  2568. def self.set(settingname,oldsetting)
  2569. return oldsetting if !oldsetting
  2570. properties=[
  2571. [_INTL("Trainer Type"),TrainerTypeProperty,
  2572. _INTL("Name of the trainer type for this Trainer.")],
  2573. [_INTL("Trainer Name"),StringProperty,
  2574. _INTL("Name of the Trainer.")],
  2575. [_INTL("Battle ID"),LimitProperty.new(255),
  2576. _INTL("ID used to distinguish Trainers with the same name and trainer type.")],
  2577. [_INTL("Pokémon 1"),TrainerPokemonProperty,
  2578. _INTL("First Pokémon.")],
  2579. [_INTL("Pokémon 2"),TrainerPokemonProperty,
  2580. _INTL("Second Pokémon.")],
  2581. [_INTL("Pokémon 3"),TrainerPokemonProperty,
  2582. _INTL("Third Pokémon.")],
  2583. [_INTL("Pokémon 4"),TrainerPokemonProperty,
  2584. _INTL("Fourth Pokémon.")],
  2585. [_INTL("Pokémon 5"),TrainerPokemonProperty,
  2586. _INTL("Fifth Pokémon.")],
  2587. [_INTL("Pokémon 6"),TrainerPokemonProperty,
  2588. _INTL("Sixth Pokémon.")],
  2589. [_INTL("Item 1"),ItemProperty,
  2590. _INTL("Item used by the trainer during battle.")],
  2591. [_INTL("Item 2"),ItemProperty,
  2592. _INTL("Item used by the trainer during battle.")],
  2593. [_INTL("Item 3"),ItemProperty,
  2594. _INTL("Item used by the trainer during battle.")],
  2595. [_INTL("Item 4"),ItemProperty,
  2596. _INTL("Item used by the trainer during battle.")],
  2597. [_INTL("Item 5"),ItemProperty,
  2598. _INTL("Item used by the trainer during battle.")],
  2599. [_INTL("Item 6"),ItemProperty,
  2600. _INTL("Item used by the trainer during battle.")],
  2601. [_INTL("Item 7"),ItemProperty,
  2602. _INTL("Item used by the trainer during battle.")],
  2603. [_INTL("Item 8"),ItemProperty,
  2604. _INTL("Item used by the trainer during battle.")]
  2605. ]
  2606. if !pbPropertyList(settingname,oldsetting,properties,true)
  2607. oldsetting=nil
  2608. else
  2609. oldsetting=nil if !oldsetting[0] || oldsetting[0]==0
  2610. end
  2611. return oldsetting
  2612. end
  2613.  
  2614. def self.format(value)
  2615. return value.inspect
  2616. end
  2617. end
  2618.  
  2619.  
  2620.  
  2621. def pbTrainerBattleEditor
  2622. selection=0
  2623. trainers=load_data("Data/trainers.dat")
  2624. trainertypes=load_data("Data/trainertypes.dat")
  2625. modified=false
  2626. for trainer in trainers
  2627. trtype=trainer[0]
  2628. if !trainertypes || !trainertypes[trtype]
  2629. trainer[0]=0
  2630. modified=true
  2631. end
  2632. end
  2633. if modified
  2634. save_data(trainers,"Data/trainers.dat")
  2635. pbConvertTrainerData
  2636. end
  2637. pbListScreenBlock(_INTL("Trainer Battles"),TrainerBattleLister.new(selection,true)){|button,trtype|
  2638. if trtype
  2639. index=trtype[0]
  2640. trainerdata=trtype[1]
  2641. if button==Input::A
  2642. if index>=0
  2643. if Kernel.pbConfirmMessageSerious("Delete this trainer battle?")
  2644. data=load_data("Data/trainers.dat")
  2645. data.delete_at(index)
  2646. save_data(data,"Data/trainers.dat")
  2647. pbConvertTrainerData
  2648. Kernel.pbMessage(_INTL("The Trainer battle was deleted."))
  2649. end
  2650. end
  2651. elsif button==Input::C
  2652. selection=index
  2653. if selection<0
  2654. ret=Kernel.pbMessage(_INTL("First, define the type of trainer."),[
  2655. _INTL("Use existing type"),_INTL("Use new type"),_INTL("Cancel")
  2656. ],3)
  2657. trainertype=-1
  2658. trainername=""
  2659. if ret==0
  2660. trainertype=pbListScreen(_INTL("Trainer Type"),TrainerTypeLister.new(0,false))
  2661. next if !trainertype
  2662. trainertype=trainertype[0]
  2663. next if trainertype<0
  2664. elsif ret==1
  2665. trainertype=pbTrainerTypeEditorNew(nil)
  2666. next if trainertype<0
  2667. else
  2668. next
  2669. end
  2670. trainername=Kernel.pbMessageFreeText(_INTL("Now enter the trainer's name."),"",false,32)
  2671. next if trainername==""
  2672. trainerparty=pbGetFreeTrainerParty(trainertype,trainername)
  2673. if trainerparty<0
  2674. Kernel.pbMessage(_INTL("There is no room to create a trainer of that type and name."))
  2675. next
  2676. end
  2677. ###############
  2678. pbNewTrainer(trainertype,trainername,trainerparty)
  2679. else
  2680. data=[
  2681. trainerdata[0], # Trainer type
  2682. trainerdata[1], # Trainer name
  2683. trainerdata[4], # ID
  2684. trainerdata[3][0], # Pokémon 1
  2685. trainerdata[3][1], # Pokémon 2
  2686. trainerdata[3][2], # Pokémon 3
  2687. trainerdata[3][3], # Pokémon 4
  2688. trainerdata[3][4], # Pokémon 5
  2689. trainerdata[3][5], # Pokémon 6
  2690. trainerdata[2][0], # Item 1
  2691. trainerdata[2][1], # Item 2
  2692. trainerdata[2][2], # Item 3
  2693. trainerdata[2][3], # Item 4
  2694. trainerdata[2][4], # Item 5
  2695. trainerdata[2][5], # Item 6
  2696. trainerdata[2][6], # Item 7
  2697. trainerdata[2][7] # Item 8
  2698. ]
  2699. save=false
  2700. while true
  2701. data=TrainerBattleProperty.set(trainerdata[1],data)
  2702. if data
  2703. trainerdata=[
  2704. data[0],
  2705. data[1],
  2706. [data[9],data[10],data[11],data[12],data[13],data[14],data[15],data[16]].find_all {|i| i && i!=0 }, # Item list
  2707. [data[3],data[4],data[5],data[6],data[7],data[8]].find_all {|i| i && i[TPSPECIES]!=0 }, # Pokémon list
  2708. data[2]
  2709. ]
  2710. if trainerdata[3].length==0
  2711. Kernel.pbMessage(_INTL("Can't save. The Pokémon list is empty."))
  2712. elsif !trainerdata[1] || trainerdata[1].length==0
  2713. Kernel.pbMessage(_INTL("Can't save. No name was entered."))
  2714. else
  2715. save=true
  2716. break
  2717. end
  2718. else
  2719. break
  2720. end
  2721. end
  2722. if save
  2723. data=load_data("Data/trainers.dat")
  2724. data[index]=trainerdata
  2725. save_data(data,"Data/trainers.dat")
  2726. pbConvertTrainerData
  2727. end
  2728. end
  2729. end
  2730. end
  2731. }
  2732. end
  2733.  
  2734.  
  2735.  
  2736. ################################################################################
  2737. # Trainer Pokémon editor
  2738. ################################################################################
  2739. module TrainerPokemonProperty
  2740. def self.set(settingname,oldsetting)
  2741. oldsetting=TPDEFAULTS.clone if !oldsetting
  2742. properties=[
  2743. [_INTL("Species"),SpeciesProperty,
  2744. _INTL("Species of the Pokémon.")],
  2745. [_INTL("Level"),NonzeroLimitProperty.new(PBExperience::MAXLEVEL),
  2746. _INTL("Level of the Pokémon.")],
  2747. [_INTL("Held item"),ItemProperty,
  2748. _INTL("Item held by the Pokémon.")],
  2749. [_INTL("Move 1"),MoveProperty2.new(oldsetting),
  2750. _INTL("First move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2751. [_INTL("Move 2"),MoveProperty2.new(oldsetting),
  2752. _INTL("Second move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2753. [_INTL("Move 3"),MoveProperty2.new(oldsetting),
  2754. _INTL("Third move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2755. [_INTL("Move 4"),MoveProperty2.new(oldsetting),
  2756. _INTL("Fourth move. Leave all moves blank (use Z key) to give it a wild move set.")],
  2757. [_INTL("Ability"),LimitProperty.new(5),
  2758. _INTL("Ability flag. 0=first ability, 1=second ability, 2-5=hidden ability.")],
  2759. [_INTL("Gender"),LimitProperty.new(1),
  2760. _INTL("Gender flag. 0=male, 1=female.")],
  2761. [_INTL("Form"),LimitProperty.new(100),
  2762. _INTL("Form of the Pokémon.")],
  2763. [_INTL("Shiny"),BooleanProperty,
  2764. _INTL("If set to true, the Pokémon is a different-colored Pokémon.")],
  2765. [_INTL("Nature"),NatureProperty,
  2766. _INTL("Nature of the Pokémon.")],
  2767. [_INTL("IVs"),LimitProperty.new(31),
  2768. _INTL("Individual values of each of the Pokémon's stats.")],
  2769. [_INTL("Happiness"),LimitProperty.new(255),
  2770. _INTL("Happiness of the Pokémon.")],
  2771. [_INTL("Nickname"),StringProperty,
  2772. _INTL("Name of the Pokémon.")],
  2773. [_INTL("Shadow"),BooleanProperty,
  2774. _INTL("If set to true, the Pokémon is a Shadow Pokémon.")],
  2775. [_INTL("Ball"),BallProperty.new(oldsetting),
  2776. _INTL("Number of the Poké Ball the Pokémon is kept in.")]
  2777. ]
  2778. pbPropertyList(settingname,oldsetting,properties,false)
  2779. for i in 0...TPDEFAULTS.length
  2780. oldsetting[i]=TPDEFAULTS[i] if !oldsetting[i]
  2781. end
  2782. moves=[]
  2783. for i in [TPMOVE1,TPMOVE2,TPMOVE3,TPMOVE4]
  2784. moves.push(oldsetting[i]) if oldsetting[i]!=0
  2785. end
  2786. oldsetting[TPMOVE1]=moves[0] ? moves[0] : TPDEFAULTS[TPMOVE1]
  2787. oldsetting[TPMOVE2]=moves[1] ? moves[1] : TPDEFAULTS[TPMOVE2]
  2788. oldsetting[TPMOVE3]=moves[2] ? moves[2] : TPDEFAULTS[TPMOVE3]
  2789. oldsetting[TPMOVE4]=moves[3] ? moves[3] : TPDEFAULTS[TPMOVE4]
  2790. oldsetting=nil if !oldsetting[TPSPECIES] || oldsetting[TPSPECIES]==0
  2791. return oldsetting
  2792. end
  2793.  
  2794. def self.format(value)
  2795. return (!value || !value[TPSPECIES] || value[TPSPECIES]==0) ? "-" : PBSpecies.getName(value[TPSPECIES])
  2796. end
  2797. end
  2798.  
  2799.  
  2800.  
  2801. class BallProperty
  2802. def initialize(pokemondata)
  2803. @pokemondata=pokemondata
  2804. end
  2805.  
  2806. def set(settingname,oldsetting)
  2807. ret=pbChooseBallList(oldsetting ? oldsetting : -1)
  2808. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  2809. end
  2810.  
  2811. def format(value)
  2812. return value ? PBItems.getName(pbBallTypeToBall(value)) : "-"
  2813. end
  2814.  
  2815. def defaultValue
  2816. return 0
  2817. end
  2818. end
  2819.  
  2820.  
  2821.  
  2822. def pbChooseBallList(defaultMoveID=-1)
  2823. cmdwin=pbListWindow([],200)
  2824. commands=[]
  2825. moveDefault=0
  2826. for key in $BallTypes.keys
  2827. item=getID(PBItems,$BallTypes[key])
  2828. commands.push([key,item,PBItems.getName(item)]) if item && item>0
  2829. end
  2830. commands.sort! {|a,b| a[2]<=>b[2]}
  2831. if defaultMoveID>=0
  2832. for i in 0...commands.length
  2833. moveDefault=i if defaultMoveID==commands[i][0]
  2834. end
  2835. end
  2836. realcommands=[]
  2837. for i in commands
  2838. realcommands.push(i[2])
  2839. end
  2840. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  2841. cmdwin.dispose
  2842. return ret>=0 ? commands[ret][0] : defaultMoveID
  2843. end
  2844.  
  2845.  
  2846.  
  2847. class MoveProperty2
  2848. def initialize(pokemondata)
  2849. @pokemondata=pokemondata
  2850. end
  2851.  
  2852. def set(settingname,oldsetting)
  2853. ret=pbChooseMoveListForSpecies(@pokemondata[0],oldsetting ? oldsetting : 1)
  2854. return (ret<=0) ? (oldsetting ? oldsetting : 0) : ret
  2855. end
  2856.  
  2857. def format(value)
  2858. return value ? PBMoves.getName(value) : "-"
  2859. end
  2860.  
  2861. def defaultValue
  2862. return 0
  2863. end
  2864. end
  2865.  
  2866.  
  2867.  
  2868. def pbGetLegalMoves(species)
  2869. moves=[]
  2870. return moves if !species || species<=0
  2871. pbRgssOpen("Data/attacksRS.dat","rb") {|atkdata|
  2872. offset=atkdata.getOffset(species-1)
  2873. length=atkdata.getLength(species-1)>>1
  2874. atkdata.pos=offset
  2875. for k in 0..length-1
  2876. level=atkdata.fgetw
  2877. move=atkdata.fgetw
  2878. moves.push(move)
  2879. end
  2880. }
  2881. itemData=readItemList("Data/items.dat")
  2882. tmdat=load_data("Data/tm.dat")
  2883. for i in 0...itemData.length
  2884. next if !itemData[i]
  2885. atk=itemData[i][8]
  2886. next if !atk || atk==0
  2887. next if !tmdat[atk]
  2888. if tmdat[atk].any? {|item| item==species }
  2889. moves.push(atk)
  2890. end
  2891. end
  2892. babyspecies=pbGetBabySpecies(species)
  2893. pbRgssOpen("Data/eggEmerald.dat","rb"){|f|
  2894. f.pos=(babyspecies-1)*8
  2895. offset=f.fgetdw
  2896. length=f.fgetdw
  2897. if length>0
  2898. f.pos=offset
  2899. i=0; loop do break unless i<length
  2900. atk=f.fgetw
  2901. moves.push(atk)
  2902. i+=1
  2903. end
  2904. end
  2905. }
  2906. moves|=[]
  2907. return moves
  2908. end
  2909.  
  2910. def pbChooseMoveListForSpecies(species,defaultMoveID=0)
  2911. cmdwin=pbListWindow([],200)
  2912. commands=[]
  2913. moveDefault=0
  2914. legalMoves=pbGetLegalMoves(species)
  2915. for move in legalMoves
  2916. commands.push([move,PBMoves.getName(move)])
  2917. end
  2918. commands.sort! {|a,b| a[1]<=>b[1]}
  2919. if defaultMoveID>0
  2920. commands.each_with_index {|item,index|
  2921. if moveDefault==0
  2922. moveDefault=index if index[0]==defaultMoveID
  2923. end
  2924. }
  2925. end
  2926. commands2=[]
  2927. for i in 1..PBMoves.maxValue
  2928. if PBMoves.getName(i)!=nil && PBMoves.getName(i)!=""
  2929. commands2.push([i,PBMoves.getName(i)])
  2930. end
  2931. end
  2932. commands2.sort! {|a,b| a[1]<=>b[1]}
  2933. if defaultMoveID>0
  2934. commands2.each_with_index {|item,index|
  2935. if moveDefault==0
  2936. moveDefault=index if index[0]==defaultMoveID
  2937. end
  2938. }
  2939. end
  2940. commands.concat(commands2)
  2941. realcommands=[]
  2942. for command in commands
  2943. realcommands.push(_ISPRINTF("{2:s}",command[0],command[1]))
  2944. end
  2945. ret=pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
  2946. cmdwin.dispose
  2947. return ret>=0 ? commands[ret][0] : 0
  2948. end
  2949.  
  2950.  
  2951.  
  2952. ################################################################################
  2953. # Metadata editor
  2954. ################################################################################
  2955. module CharacterProperty
  2956. def self.set(settingname,oldsetting)
  2957. chosenmap=pbListScreen(settingname,
  2958. GraphicsLister.new("Graphics/Characters/",oldsetting))
  2959. return chosenmap && chosenmap!="" ? chosenmap : oldsetting
  2960. end
  2961.  
  2962. def self.format(value)
  2963. return value
  2964. end
  2965. end
  2966.  
  2967.  
  2968.  
  2969. module PlayerProperty
  2970. def self.set(settingname,oldsetting)
  2971. oldsetting=[0,"xxx","xxx","xxx","xxx","xxx","xxx","xxx"] if !oldsetting
  2972. properties=[
  2973. [_INTL("Trainer Type"),TrainerTypeProperty,
  2974. _INTL("Trainer type of this player.")],
  2975. [_INTL("Sprite"),CharacterProperty,
  2976. _INTL("Walking character sprite.")],
  2977. [_INTL("Bike"),CharacterProperty,
  2978. _INTL("Cycling character sprite.")],
  2979. [_INTL("Surfing"),CharacterProperty,
  2980. _INTL("Surfing character sprite.")],
  2981. [_INTL("Running"),CharacterProperty,
  2982. _INTL("Running character sprite.")],
  2983. [_INTL("Diving"),CharacterProperty,
  2984. _INTL("Diving character sprite.")],
  2985. [_INTL("Fishing"),CharacterProperty,
  2986. _INTL("Fishing character sprite.")],
  2987. [_INTL("Surf-Fishing"),CharacterProperty,
  2988. _INTL("Fishing while surfing character sprite.")]
  2989. ]
  2990. pbPropertyList(settingname,oldsetting,properties,false)
  2991. return oldsetting
  2992. end
  2993.  
  2994. def self.format(value)
  2995. return value.inspect
  2996. end
  2997. end
  2998.  
  2999.  
  3000.  
  3001. module MapSizeProperty
  3002. def self.set(settingname,oldsetting)
  3003. oldsetting=[0,""] if !oldsetting
  3004. properties=[
  3005. [_INTL("Width"),NonzeroLimitProperty.new(30),
  3006. _INTL("The width of this map in Region Map squares.")],
  3007. [_INTL("Valid Squares"),StringProperty,
  3008. _INTL("A series of 1s and 0s marking which squares are part of this map (1=part, 0=not part).")],
  3009. ]
  3010. pbPropertyList(settingname,oldsetting,properties,false)
  3011. return oldsetting
  3012. end
  3013.  
  3014. def self.format(value)
  3015. return value.inspect
  3016. end
  3017. end
  3018.  
  3019.  
  3020.  
  3021. module MapCoordsProperty
  3022. def self.set(settingname,oldsetting)
  3023. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting[0] : 0))
  3024. if chosenmap>=0
  3025. mappoint=chooseMapPoint(chosenmap)
  3026. if mappoint
  3027. return [chosenmap,mappoint[0],mappoint[1]]
  3028. else
  3029. return oldsetting
  3030. end
  3031. else
  3032. return oldsetting
  3033. end
  3034. end
  3035.  
  3036. def self.format(value)
  3037. return value.inspect
  3038. end
  3039. end
  3040.  
  3041.  
  3042.  
  3043. module MapCoordsFacingProperty
  3044. def self.set(settingname,oldsetting)
  3045. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting[0] : 0))
  3046. if chosenmap>=0
  3047. mappoint=chooseMapPoint(chosenmap)
  3048. if mappoint
  3049. facing=Kernel.pbMessage(_INTL("Choose the direction to face in."),
  3050. [_INTL("Down"),_INTL("Left"),_INTL("Right"),_INTL("Up")],-1)
  3051. if facing<0
  3052. return oldsetting
  3053. else
  3054. return [chosenmap,mappoint[0],mappoint[1],[2,4,6,8][facing]]
  3055. end
  3056. else
  3057. return oldsetting
  3058. end
  3059. else
  3060. return oldsetting
  3061. end
  3062. end
  3063.  
  3064. def self.format(value)
  3065. return value.inspect
  3066. end
  3067. end
  3068.  
  3069.  
  3070.  
  3071. module RegionMapCoordsProperty
  3072. def self.set(settingname,oldsetting)
  3073. regions=getMapNameList
  3074. selregion=-1
  3075. if regions.length==0
  3076. Kernel.pbMessage(_INTL("No region maps are defined."))
  3077. return oldsetting
  3078. elsif regions.length==1
  3079. selregion=regions[0][0]
  3080. else
  3081. cmds=[]
  3082. for region in regions
  3083. cmds.push(region[1])
  3084. end
  3085. selcmd=Kernel.pbMessage(_INTL("Choose a region map."),cmds,-1)
  3086. if selcmd>=0
  3087. selregion=regions[selcmd][0]
  3088. else
  3089. return oldsetting
  3090. end
  3091. end
  3092. mappoint=chooseMapPoint(selregion,true)
  3093. if mappoint
  3094. return [selregion,mappoint[0],mappoint[1]]
  3095. else
  3096. return oldsetting
  3097. end
  3098. end
  3099.  
  3100. def self.format(value)
  3101. return value.inspect
  3102. end
  3103. end
  3104.  
  3105.  
  3106.  
  3107. module WeatherEffectProperty
  3108. def self.set(settingname,oldsetting)
  3109. cmd=Kernel.pbMessage(_INTL("Choose a weather effect."),[
  3110. _INTL("No weather"),
  3111. _INTL("Rain"),
  3112. _INTL("Storm"),
  3113. _INTL("Snow"),
  3114. _INTL("Sandstorm"),
  3115. _INTL("Sunny"),
  3116. _INTL("HeavyRain"),
  3117. _INTL("Blizzard")
  3118. ],1)
  3119. if cmd==0
  3120. return nil
  3121. else
  3122. params=ChooseNumberParams.new
  3123. params.setRange(0,100)
  3124. params.setDefaultValue(oldsetting ? oldsetting[1] : 100)
  3125. number=Kernel.pbMessageChooseNumber(_INTL("Set the probability of the weather."),params)
  3126. return [cmd,number]
  3127. end
  3128. end
  3129.  
  3130. def self.format(value)
  3131. return value.inspect
  3132. end
  3133. end
  3134.  
  3135.  
  3136.  
  3137. module MapProperty
  3138. def self.set(settingname,oldsetting)
  3139. chosenmap=pbListScreen(settingname,MapLister.new(oldsetting ? oldsetting : 0))
  3140. return chosenmap>0 ? chosenmap : oldsetting
  3141. end
  3142.  
  3143. def self.format(value)
  3144. return value.inspect
  3145. end
  3146.  
  3147. def self.defaultValue
  3148. return 0
  3149. end
  3150. end
  3151.  
  3152.  
  3153.  
  3154. def pbMetadataScreen(defaultMapId=nil)
  3155. metadata=nil
  3156. mapinfos=pbLoadRxData("Data/MapInfos")
  3157. metadata=load_data("Data/metadata.dat")
  3158. map=defaultMapId ? defaultMapId : 0
  3159. loop do
  3160. map=pbListScreen(_INTL("SET METADATA"),MapLister.new(map,true))
  3161. break if map<0
  3162. mapname=(map==0) ? _INTL("Global Metadata") : mapinfos[map].name
  3163. data=[]
  3164. properties=(map==0) ? MapScreenScene::GLOBALMETADATA :
  3165. MapScreenScene::LOCALMAPS
  3166. for i in 0...properties.length
  3167. data.push(metadata[map] ? metadata[map][i+1] : nil)
  3168. end
  3169. pbPropertyList(mapname,data,properties)
  3170. for i in 0...properties.length
  3171. if !metadata[map]
  3172. metadata[map]=[]
  3173. end
  3174. metadata[map][i+1]=data[i]
  3175. end
  3176. end
  3177. pbSerializeMetadata(metadata,mapinfos) if metadata
  3178. end
  3179.  
  3180.  
  3181.  
  3182. ################################################################################
  3183. # Map drawing
  3184. ################################################################################
  3185. class MapSprite
  3186. def initialize(map,viewport=nil)
  3187. @sprite=Sprite.new(viewport)
  3188. @sprite.bitmap=createMinimap(map)
  3189. @sprite.x=(Graphics.width/2)-(@sprite.bitmap.width/2)
  3190. @sprite.y=(Graphics.height/2)-(@sprite.bitmap.height/2)
  3191. end
  3192.  
  3193. def dispose
  3194. @sprite.bitmap.dispose
  3195. @sprite.dispose
  3196. end
  3197.  
  3198. def z=(value)
  3199. @sprite.z=value
  3200. end
  3201.  
  3202. def getXY
  3203. return nil if !Input.triggerex?(0x01)
  3204. mouse=Mouse::getMousePos(true)
  3205. if mouse[0]<@sprite.x||mouse[0]>[email protected][email protected]
  3206. return nil
  3207. end
  3208. if mouse[1]<@sprite.y||mouse[1]>[email protected][email protected]
  3209. return nil
  3210. end
  3211. x=mouse[0][email protected]
  3212. y=mouse[1][email protected]
  3213. return [x/4,y/4]
  3214. end
  3215. end
  3216.  
  3217.  
  3218.  
  3219. class SelectionSprite < Sprite
  3220. def initialize(viewport=nil)
  3221. @sprite=Sprite.new(viewport)
  3222. @sprite.bitmap=nil
  3223. @sprite.z=2
  3224. @othersprite=nil
  3225. end
  3226.  
  3227. def disposed?
  3228. return @sprite.disposed?
  3229. end
  3230.  
  3231. def dispose
  3232. @sprite.bitmap.dispose if @sprite.bitmap
  3233. @othersprite=nil
  3234. @sprite.dispose
  3235. end
  3236.  
  3237. def othersprite=(value)
  3238. @othersprite=value
  3239. if @othersprite && [email protected]? &&
  3240. @othersprite.bitmap && [email protected]?
  3241. @sprite.bitmap=pbDoEnsureBitmap(
  3242. @sprite.bitmap,@othersprite.bitmap.width,@othersprite.bitmap.height)
  3243. red=Color.new(255,0,0)
  3244. @sprite.bitmap.clear
  3245. @sprite.bitmap.fill_rect(0,0,@othersprite.bitmap.width,2,red)
  3246. @sprite.bitmap.fill_rect(0,@othersprite.bitmap.height-2,
  3247. @othersprite.bitmap.width,2,red)
  3248. @sprite.bitmap.fill_rect(0,0,2,@othersprite.bitmap.height,red)
  3249. @sprite.bitmap.fill_rect(@othersprite.bitmap.width-2,0,2,
  3250. @othersprite.bitmap.height,red)
  3251. end
  3252. end
  3253.  
  3254. def update
  3255. if @othersprite && [email protected]?
  3256. else
  3257. @sprite.visible=false
  3258. end
  3259. end
  3260. end
  3261.  
  3262.  
  3263.  
  3264. class RegionMapSprite
  3265. def initialize(map,viewport=nil)
  3266. @sprite=Sprite.new(viewport)
  3267. @sprite.bitmap=createRegionMap(map)
  3268. @sprite.x=(Graphics.width/2)-(@sprite.bitmap.width/2)
  3269. @sprite.y=(Graphics.height/2)-(@sprite.bitmap.height/2)
  3270. end
  3271.  
  3272. def dispose
  3273. @sprite.bitmap.dispose
  3274. @sprite.dispose
  3275. end
  3276.  
  3277. def z=(value)
  3278. @sprite.z=value
  3279. end
  3280.  
  3281. def getXY
  3282. return nil if !Input.triggerex?(0x01)
  3283. mouse=Mouse::getMousePos(true)
  3284. if mouse[0]<@sprite.x||mouse[0]>[email protected][email protected]
  3285. return nil
  3286. end
  3287. if mouse[1]<@sprite.y||mouse[1]>[email protected][email protected]
  3288. return nil
  3289. end
  3290. x=mouse[0][email protected]
  3291. y=mouse[1][email protected]
  3292. return [x/8,y/8]
  3293. end
  3294. end
  3295.  
  3296.  
  3297.  
  3298. def createRegionMap(map)
  3299. pbRgssOpen("Data/townmap.dat","rb"){|f|
  3300. @mapdata=Marshal.load(f)
  3301. }
  3302. @map=@mapdata[map]
  3303. bitmap=AnimatedBitmap.new("Graphics/Pictures/#{@map[1]}").deanimate
  3304. retbitmap=BitmapWrapper.new(bitmap.width/2,bitmap.height/2)
  3305. retbitmap.stretch_blt(
  3306. Rect.new(0,0,bitmap.width/2,bitmap.height/2),
  3307. bitmap,
  3308. Rect.new(0,0,bitmap.width,bitmap.height)
  3309. )
  3310. bitmap.dispose
  3311. return retbitmap
  3312. end
  3313.  
  3314. def getMapNameList
  3315. pbRgssOpen("Data/townmap.dat","rb"){|f|
  3316. @mapdata=Marshal.load(f)
  3317. }
  3318. ret=[]
  3319. next if !@mapdata[i]
  3320. ret.push(
  3321. [i,pbGetMessage(MessageTypes::RegionNames,i)]
  3322. )
  3323. end
  3324. return ret
  3325. end
  3326.  
  3327. def createMinimap2(mapid)
  3328. map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil
  3329. return BitmapWrapper.new(32,32) if !map
  3330. bitmap=BitmapWrapper.new(map.width*4,map.height*4)
  3331. black=Color.new(0,0,0)
  3332. bigmap=(map.width>40 && map.height>40)
  3333. tilesets=load_data("Data/Tilesets.rxdata")
  3334. tileset=tilesets[map.tileset_id]
  3335. return bitmap if !tileset
  3336. helper=TileDrawingHelper.fromTileset(tileset)
  3337. for y in 0...map.height
  3338. for x in 0...map.width
  3339. if bigmap
  3340. next if (x>8 && x<=map.width-8 && y>8 && y<=map.height-8)
  3341. end
  3342. for z in 0..2
  3343. id=map.data[x,y,z]
  3344. next if id==0 || !id
  3345. helper.bltSmallTile(bitmap,x*4,y*4,4,4,id)
  3346. end
  3347. end
  3348. end
  3349. bitmap.fill_rect(0,0,bitmap.width,1,black)
  3350. bitmap.fill_rect(0,bitmap.height-1,bitmap.width,1,black)
  3351. bitmap.fill_rect(0,0,1,bitmap.height,black)
  3352. bitmap.fill_rect(bitmap.width-1,0,1,bitmap.height,black)
  3353. return bitmap
  3354. end
  3355.  
  3356. def createMinimap(mapid)
  3357. map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil
  3358. return BitmapWrapper.new(32,32) if !map
  3359. bitmap=BitmapWrapper.new(map.width*4,map.height*4)
  3360. black=Color.new(0,0,0)
  3361. tilesets=load_data("Data/Tilesets.rxdata")
  3362. tileset=tilesets[map.tileset_id]
  3363. return bitmap if !tileset
  3364. helper=TileDrawingHelper.fromTileset(tileset)
  3365. for y in 0...map.height
  3366. for x in 0...map.width
  3367. for z in 0..2
  3368. id=map.data[x,y,z]
  3369. id=0 if !id
  3370. helper.bltSmallTile(bitmap,x*4,y*4,4,4,id)
  3371. end
  3372. end
  3373. end
  3374. bitmap.fill_rect(0,0,bitmap.width,1,black)
  3375. bitmap.fill_rect(0,bitmap.height-1,bitmap.width,1,black)
  3376. bitmap.fill_rect(0,0,1,bitmap.height,black)
  3377. bitmap.fill_rect(bitmap.width-1,0,1,bitmap.height,black)
  3378. return bitmap
  3379. end
  3380.  
  3381. def chooseMapPoint(map,rgnmap=false)
  3382. viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  3383. viewport.z=99999
  3384. title=Window_UnformattedTextPokemon.new(_INTL("Click a point on the map."))
  3385. title.x=0
  3386. title.y=Graphics.height-64
  3387. title.width=Graphics.width
  3388. title.height=64
  3389. title.viewport=viewport
  3390. title.z=2
  3391. if rgnmap
  3392. sprite=RegionMapSprite.new(map,viewport)
  3393. else
  3394. sprite=MapSprite.new(map,viewport)
  3395. end
  3396. sprite.z=2
  3397. ret=nil
  3398. loop do
  3399. Graphics.update
  3400. Input.update
  3401. xy=sprite.getXY
  3402. if xy
  3403. ret=xy
  3404. break
  3405. end
  3406. if Input.trigger?(Input::B)
  3407. ret=nil
  3408. break
  3409. end
  3410. end
  3411. sprite.dispose
  3412. title.dispose
  3413. return ret
  3414. end
  3415.  
  3416.  
  3417.  
  3418. ################################################################################
  3419. # Visual Editor (map connections)
  3420. ################################################################################
  3421. class MapScreenScene
  3422. LOCALMAPS=[
  3423. ["Outdoor",BooleanProperty,
  3424. _INTL("If true, this map is an outdoor map and will be tinted according to time of day.")],
  3425. ["ShowArea",BooleanProperty,
  3426. _INTL("If true, the game will display the map's name upon entry.")],
  3427. ["Bicycle",BooleanProperty,
  3428. _INTL("If true, the bicycle can be used on this map.")],
  3429. ["BicycleAlways",BooleanProperty,
  3430. _INTL("If true, the bicycle will be mounted automatically on this map and cannot be dismounted.")],
  3431. ["HealingSpot",MapCoordsProperty,
  3432. _INTL("Map ID of this Pokemon Center's town, and X and Y coordinates of its entrance within that town.")],
  3433. ["Weather",WeatherEffectProperty,
  3434. _INTL("Weather conditions in effect for this map.")],
  3435. ["MapPosition",RegionMapCoordsProperty,
  3436. _INTL("Identifies the point on the regional map for this map.")],
  3437. ["DiveMap",MapProperty,
  3438. _INTL("Specifies the underwater layer of this map. Use only if this map has deep water.")],
  3439. ["DarkMap",BooleanProperty,
  3440. _INTL("If true, this map is dark and a circle of light appears around the player. Flash can be used to expand the circle.")],
  3441. ["SafariMap",BooleanProperty,
  3442. _INTL("If true, this map is part of the Safari Zone (both indoor and outdoor). Not to be used in the reception desk.")],
  3443. ["SnapEdges",BooleanProperty,
  3444. _INTL("If true, when the player goes near this map's edge, the game doesn't center the player as usual.")],
  3445. ["Dungeon",BooleanProperty,
  3446. _INTL("If true, this map has a randomly generated layout. See the wiki for more information.")],
  3447. ["BattleBack",StringProperty,
  3448. _INTL("PNG files named 'battlebgXXX', 'enemybaseXXX', 'playerbaseXXX' in Battlebacks folder, where XXX is this property's value.")],
  3449. ["WildBattleBGM",BGMProperty,
  3450. _INTL("Default BGM for wild Pokémon battles on this map.")],
  3451. ["TrainerBattleBGM",BGMProperty,
  3452. _INTL("Default BGM for trainer battles on this map.")],
  3453. ["WildVictoryME",MEProperty,
  3454. _INTL("Default ME played after winning a wild Pokémon battle on this map.")],
  3455. ["TrainerVictoryME",MEProperty,
  3456. _INTL("Default ME played after winning a Trainer battle on this map.")],
  3457. ["MapSize",MapSizeProperty,
  3458. _INTL("The width of the map in Town Map squares, and a string indicating which squares are part of this map.")],
  3459. ]
  3460. GLOBALMETADATA=[
  3461. ["Home",MapCoordsFacingProperty,
  3462. _INTL("Map ID and X and Y coordinates of where the player goes if no Pokémon Center was entered after a loss.")],
  3463. ["WildBattleBGM",BGMProperty,
  3464. _INTL("Default BGM for wild Pokémon battles.")],
  3465. ["TrainerBattleBGM",BGMProperty,
  3466. _INTL("Default BGM for Trainer battles.")],
  3467. ["WildVictoryME",MEProperty,
  3468. _INTL("Default ME played after winning a wild Pokémon battle.")],
  3469. ["TrainerVictoryME",MEProperty,
  3470. _INTL("Default ME played after winning a Trainer battle.")],
  3471. ["SurfBGM",BGMProperty,
  3472. _INTL("BGM played while surfing.")],
  3473. ["BicycleBGM",BGMProperty,
  3474. _INTL("BGM played while on a bicycle.")],
  3475. ["PlayerA",PlayerProperty,
  3476. _INTL("Specifies player A.")],
  3477. ["PlayerB",PlayerProperty,
  3478. _INTL("Specifies player B.")],
  3479. ["PlayerC",PlayerProperty,
  3480. _INTL("Specifies player C.")],
  3481. ["PlayerD",PlayerProperty,
  3482. _INTL("Specifies player D.")],
  3483. ["PlayerE",PlayerProperty,
  3484. _INTL("Specifies player E.")],
  3485. ["PlayerF",PlayerProperty,
  3486. _INTL("Specifies player F.")],
  3487. ["PlayerG",PlayerProperty,
  3488. _INTL("Specifies player G.")],
  3489. ["PlayerH",PlayerProperty,
  3490. _INTL("Specifies player H.")]
  3491. ]
  3492.  
  3493. def getMapSprite(id)
  3494. if !@mapsprites[id]
  3495. @mapsprites[id]=Sprite.new(@viewport)
  3496. @mapsprites[id].z=0
  3497. @mapsprites[id].bitmap=nil
  3498. end
  3499. if !@mapsprites[id].bitmap || @mapsprites[id].bitmap.disposed?
  3500. @mapsprites[id].bitmap=createMinimap(id)
  3501. end
  3502. return @mapsprites[id]
  3503. end
  3504.  
  3505. def close
  3506. pbDisposeSpriteHash(@sprites)
  3507. pbDisposeSpriteHash(@mapsprites)
  3508. @viewport.dispose
  3509. end
  3510.  
  3511. def setMapSpritePos(id,x,y)
  3512. sprite=getMapSprite(id)
  3513. sprite.x=x
  3514. sprite.y=y
  3515. sprite.visible=true
  3516. end
  3517.  
  3518. def putNeighbors(id,sprites)
  3519. conns=@mapconns
  3520. mapsprite=getMapSprite(id)
  3521. dispx=mapsprite.x
  3522. dispy=mapsprite.y
  3523. for conn in conns
  3524. if conn[0]==id
  3525. b=sprites.any? {|i| i==conn[3] }
  3526. if !b
  3527. x=(conn[1]-conn[4])*4+dispx
  3528. y=(conn[2]-conn[5])*4+dispy
  3529. setMapSpritePos(conn[3],x,y)
  3530. sprites.push(conn[3])
  3531. putNeighbors(conn[3],sprites)
  3532. end
  3533. elsif conn[3]==id
  3534. b=sprites.any? {|i| i==conn[0] }
  3535. if !b
  3536. x=(conn[4]-conn[1])*4+dispx
  3537. y=(conn[5]-conn[2])*4+dispy
  3538. setMapSpritePos(conn[0],x,y)
  3539. sprites.push(conn[3])
  3540. putNeighbors(conn[0],sprites)
  3541. end
  3542. end
  3543. end
  3544. end
  3545.  
  3546. def hasConnections?(conns,id)
  3547. for conn in conns
  3548. return true if conn[0]==id || conn[3]==id
  3549. end
  3550. return false
  3551. end
  3552.  
  3553. def connectionsSymmetric?(conn1,conn2)
  3554. if conn1[0]==conn2[0]
  3555. # Equality
  3556. return false if conn1[1]!=conn2[1]
  3557. return false if conn1[2]!=conn2[2]
  3558. return false if conn1[3]!=conn2[3]
  3559. return false if conn1[4]!=conn2[4]
  3560. return false if conn1[5]!=conn2[5]
  3561. return true
  3562. elsif conn1[0]==conn2[3]
  3563. # Symmetry
  3564. return false if conn1[1]!=-conn2[1]
  3565. return false if conn1[2]!=-conn2[2]
  3566. return false if conn1[3]!=conn2[0]
  3567. return false if conn1[4]!=-conn2[4]
  3568. return false if conn1[5]!=-conn2[5]
  3569. return true
  3570. end
  3571. return false
  3572. end
  3573.  
  3574. def removeOldConnections(ret,mapid)
  3575. for i in 0...ret.length
  3576. ret[i]=nil if ret[i][0]==mapid || ret[i][3]==mapid
  3577. end
  3578. ret.compact!
  3579. end
  3580.  
  3581. # Returns the maps within _keys_ that are directly connected to this map, _map_.
  3582. def getDirectConnections(keys,map)
  3583. thissprite=getMapSprite(map)
  3584. thisdims=MapFactoryHelper.getMapDims(map)
  3585. ret=[]
  3586. for i in keys
  3587. next if i==map
  3588. othersprite=getMapSprite(i)
  3589. otherdims=MapFactoryHelper.getMapDims(i)
  3590. x1=(thissprite.x-othersprite.x)/4
  3591. y1=(thissprite.y-othersprite.y)/4
  3592. if (x1==otherdims[0] || x1==-thisdims[0] ||
  3593. y1==otherdims[1] || y1==-thisdims[1])
  3594. ret.push(i)
  3595. end
  3596. end
  3597. # If no direct connections, add an indirect connection
  3598. if ret.length==0
  3599. key=(map==keys[0]) ? keys[1] : keys[0]
  3600. ret.push(key)
  3601. end
  3602. return ret
  3603. end
  3604.  
  3605. def generateConnectionData
  3606. ret=[]
  3607. # Create a clone of current map connection
  3608. for conn in @mapconns
  3609. ret.push(conn.clone)
  3610. end
  3611. return ret if keys.length<2
  3612. # Remove all connections containing any sprites on the canvas from the array
  3613. for i in keys
  3614. removeOldConnections(ret,i)
  3615. end
  3616. # Rebuild connections
  3617. for i in keys
  3618. refs=getDirectConnections(keys,i)
  3619. for refmap in refs
  3620. othersprite=getMapSprite(i)
  3621. refsprite=getMapSprite(refmap)
  3622. c1=(refsprite.x-othersprite.x)/4
  3623. c2=(refsprite.y-othersprite.y)/4
  3624. conn=[refmap,0,0,i,c1,c2]
  3625. j=0;while j<ret.length && !connectionsSymmetric?(ret[j],conn)
  3626. j+=1
  3627. end
  3628. if j==ret.length
  3629. ret.push(conn)
  3630. end
  3631. end
  3632. end
  3633. return ret
  3634. end
  3635.  
  3636. def serializeConnectionData
  3637. conndata=generateConnectionData()
  3638. pbSerializeConnectionData(conndata,@mapinfos)
  3639. @mapconns=conndata
  3640. end
  3641.  
  3642. def putSprite(id)
  3643. addSprite(id)
  3644. putNeighbors(id,[])
  3645. end
  3646.  
  3647. def addSprite(id)
  3648. mapsprite=getMapSprite(id)
  3649. x=(Graphics.width-mapsprite.bitmap.width)/2
  3650. y=(Graphics.height-mapsprite.bitmap.height)/2
  3651. mapsprite.x=x.to_i&~3
  3652. mapsprite.y=y.to_i&~3
  3653. end
  3654.  
  3655. def saveMapSpritePos
  3656. @mapspritepos.clear
  3657. for i in @mapsprites.keys
  3658. s=@mapsprites[i]
  3659. @mapspritepos[i]=[s.x,s.y] if s && !s.disposed?
  3660. end
  3661. end
  3662.  
  3663. def mapScreen
  3664. @sprites={}
  3665. @mapsprites={}
  3666. @mapspritepos={}
  3667. @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  3668. @viewport.z=99999
  3669. @lasthitmap=-1
  3670. @lastclick=-1
  3671. @oldmousex=nil
  3672. @oldmousey=nil
  3673. @dragging=false
  3674. @dragmapid=-1
  3675. @dragOffsetX=0
  3676. @dragOffsetY=0
  3677. @selmapid=-1
  3678. addBackgroundPlane(@sprites,"background","trainercardbg",@viewport)
  3679. @sprites["selsprite"]=SelectionSprite.new(@viewport)
  3680. @sprites["title"]=Window_UnformattedTextPokemon.new(_INTL("F5: Help"))
  3681. @sprites["title"].x=0
  3682. @sprites["title"].y=Graphics.height-64
  3683. @sprites["title"].width=Graphics.width
  3684. @sprites["title"].height=64
  3685. @sprites["title"].viewport=@viewport
  3686. @sprites["title"].z=2
  3687. @mapinfos=load_data("Data/MapInfos.rxdata")
  3688. @encdata=load_data("Data/encounters.dat")
  3689. conns=MapFactoryHelper.getMapConnections
  3690. @mapconns=[]
  3691. for c in conns
  3692. @mapconns.push(c.clone)
  3693. end
  3694. @metadata=load_data("Data/metadata.dat")
  3695. if $game_map
  3696. @currentmap=$game_map.map_id
  3697. else
  3698. system=load_data("Data/System.rxdata")
  3699. @currentmap=system.edit_map_id
  3700. end
  3701. putSprite(@currentmap)
  3702. end
  3703.  
  3704. def setTopSprite(id)
  3705. for i in @mapsprites.keys
  3706. if i==id
  3707. @mapsprites[i].z=1
  3708. else
  3709. @mapsprites[i].z=0
  3710. end
  3711. end
  3712. end
  3713.  
  3714. def getMetadata(mapid,metadataType)
  3715. return @metadata[mapid][metadataType] if @metadata[mapid]
  3716. end
  3717.  
  3718. def setMetadata(mapid,metadataType,data)
  3719. @metadata[mapid]=[] if !@metadata[mapid]
  3720. @metadata[mapid][metadataType]=data
  3721. end
  3722.  
  3723. def serializeMetadata
  3724. pbSerializeMetadata(@metadata,@mapinfos)
  3725. end
  3726.  
  3727. def helpWindow
  3728. helptext=_INTL("A: Add map to canvas\r\n")
  3729. helptext+=_INTL("DEL: Delete map from canvas\r\n")
  3730. helptext+=_INTL("S: Go to another map\r\n")
  3731. helptext+=_INTL("Click to select a map\r\n")
  3732. helptext+=_INTL("Double-click: Edit map's metadata\r\n")
  3733. helptext+=_INTL("E: Edit map's encounters\r\n")
  3734. helptext+=_INTL("Drag map to move it\r\n")
  3735. helptext+=_INTL("Arrow keys/drag canvas: Move around canvas")
  3736. title=Window_UnformattedTextPokemon.new(helptext)
  3737. title.x=0
  3738. title.y=0
  3739. title.width=Graphics.width*8/10
  3740. title.height=Graphics.height
  3741. title.viewport=@viewport
  3742. title.z=2
  3743. loop do
  3744. Graphics.update
  3745. Input.update
  3746. break if Input.trigger?(Input::C)
  3747. break if Input.trigger?(Input::B)
  3748. end
  3749. Input.update
  3750. title.dispose
  3751. end
  3752.  
  3753. def propertyList(map,properties)
  3754. infos=load_data("Data/MapInfos.rxdata")
  3755. mapname=(map==0) ? _INTL("Global Metadata") : infos[map].name
  3756. data=[]
  3757. for i in 0...properties.length
  3758. data.push(getMetadata(map,i+1))
  3759. end
  3760. pbPropertyList(mapname,data,properties)
  3761. for i in 0...properties.length
  3762. setMetadata(map,i+1,data[i])
  3763. end
  3764. end
  3765.  
  3766. def getMapRect(mapid)
  3767. sprite=getMapSprite(mapid)
  3768. if sprite
  3769. return [
  3770. sprite.x,
  3771. sprite.y,
  3772. sprite.x+sprite.bitmap.width,
  3773. sprite.y+sprite.bitmap.height
  3774. ]
  3775. else
  3776. return nil
  3777. end
  3778. end
  3779.  
  3780. def onDoubleClick(mapid)
  3781. if mapid>=0
  3782. propertyList(mapid,LOCALMAPS)
  3783. else
  3784. propertyList(0,GLOBALMETADATA)
  3785. end
  3786. end
  3787.  
  3788. def onClick(mapid,x,y)
  3789. if @lastclick>0 && Graphics.frame_count-@lastclick<15
  3790. onDoubleClick(mapid)
  3791. @lastclick=-1
  3792. else
  3793. @lastclick=Graphics.frame_count
  3794. if mapid>=0
  3795. @dragging=true
  3796. @dragmapid=mapid
  3797. sprite=getMapSprite(mapid)
  3798. @sprites["selsprite"].othersprite=sprite
  3799. @selmapid=mapid
  3800. @dragOffsetX=sprite.x-x
  3801. @dragOffsetY=sprite.y-y
  3802. setTopSprite(mapid)
  3803. else
  3804. @sprites["selsprite"].othersprite=nil
  3805. @dragging=true
  3806. @dragmapid=mapid
  3807. @selmapid=-1
  3808. @dragOffsetX=x
  3809. @dragOffsetY=y
  3810. saveMapSpritePos
  3811. end
  3812. end
  3813. end
  3814.  
  3815. def onRightClick(mapid,x,y)
  3816. # echo("rightclick (#{mapid})\r\n")
  3817. end
  3818.  
  3819. def onMouseUp(mapid)
  3820. # echo("mouseup (#{mapid})\r\n")
  3821. @dragging=false if @dragging
  3822. end
  3823.  
  3824. def onRightMouseUp(mapid)
  3825. # echo("rightmouseup (#{mapid})\r\n")
  3826. end
  3827.  
  3828. def onMouseOver(mapid,x,y)
  3829. # echo("mouseover (#{mapid},#{x},#{y})\r\n")
  3830. end
  3831.  
  3832. def onMouseMove(mapid,x,y)
  3833. # echo("mousemove (#{mapid},#{x},#{y})\r\n")
  3834. if @dragging
  3835. if @dragmapid>=0
  3836. sprite=getMapSprite(@dragmapid)
  3837. x=x+@dragOffsetX
  3838. y=y+@dragOffsetY
  3839. sprite.x=x&~3
  3840. sprite.y=y&~3
  3841. @sprites["title"].text=_ISPRINTF("F5: Help [{1:03d} {2:s}]",mapid,@mapinfos[@dragmapid].name)
  3842. else
  3843. xpos=x-@dragOffsetX
  3844. ypos=y-@dragOffsetY
  3845. for i in @mapspritepos.keys
  3846. sprite=getMapSprite(i)
  3847. sprite.x=(@mapspritepos[i][0]+xpos)&~3
  3848. sprite.y=(@mapspritepos[i][1]+ypos)&~3
  3849. end
  3850. @sprites["title"].text=_INTL("F5: Help")
  3851. end
  3852. else
  3853. if mapid>=0
  3854. @sprites["title"].text=_ISPRINTF("F5: Help [{1:03d} {2:s}]",mapid,@mapinfos[mapid].name)
  3855. else
  3856. @sprites["title"].text=_INTL("F5: Help")
  3857. end
  3858. end
  3859. end
  3860.  
  3861. def hittest(x,y)
  3862. for i in @mapsprites.keys
  3863. sx=@mapsprites[i].x
  3864. sy=@mapsprites[i].y
  3865. sr=sx+@mapsprites[i].bitmap.width
  3866. sb=sy+@mapsprites[i].bitmap.height
  3867. return i if x>=sx && x<sr && y>=sy && y<sb
  3868. end
  3869. return -1
  3870. end
  3871.  
  3872. def chooseMapScreen(title,currentmap)
  3873. return pbListScreen(title,MapLister.new(currentmap))
  3874. end
  3875.  
  3876. def update
  3877. mousepos=Mouse::getMousePos
  3878. if mousepos
  3879. hitmap=hittest(mousepos[0],mousepos[1])
  3880. if Input.triggerex?(0x01)
  3881. onClick(hitmap,mousepos[0],mousepos[1])
  3882. elsif Input.triggerex?(0x02)
  3883. onRightClick(hitmap,mousepos[0],mousepos[1])
  3884. elsif Input.releaseex?(0x01)
  3885. onMouseUp(hitmap)
  3886. elsif Input.releaseex?(0x02)
  3887. onRightMouseUp(hitmap)
  3888. else
  3889. if @lasthitmap!=hitmap
  3890. onMouseOver(hitmap,mousepos[0],mousepos[1])
  3891. @lasthitmap=hitmap
  3892. end
  3893. if @oldmousex!=mousepos[0]||@oldmousey!=mousepos[1]
  3894. onMouseMove(hitmap,mousepos[0],mousepos[1])
  3895. @oldmousex=mousepos[0]
  3896. @oldmousey=mousepos[1]
  3897. end
  3898. end
  3899. end
  3900. if Input.press?(Input::UP)
  3901. for i in @mapsprites
  3902. next if !i
  3903. i[1].y+=4
  3904. end
  3905. end
  3906. if Input.press?(Input::DOWN)
  3907. for i in @mapsprites
  3908. next if !i
  3909. i[1].y-=4
  3910. end
  3911. end
  3912. if Input.press?(Input::LEFT)
  3913. for i in @mapsprites
  3914. next if !i
  3915. i[1].x+=4
  3916. end
  3917. end
  3918. if Input.press?(Input::RIGHT)
  3919. for i in @mapsprites
  3920. next if !i
  3921. i[1].x-=4
  3922. end
  3923. end
  3924. if Input.triggerex?("A"[0])
  3925. id=chooseMapScreen(_INTL("Add Map"),@currentmap)
  3926. if id>0
  3927. addSprite(id)
  3928. setTopSprite(id)
  3929. @mapconns=generateConnectionData
  3930. end
  3931. elsif Input.triggerex?("S"[0])
  3932. id=chooseMapScreen(_INTL("Go to Map"),@currentmap)
  3933. if id>0
  3934. @mapconns=generateConnectionData
  3935. pbDisposeSpriteHash(@mapsprites)
  3936. @mapsprites.clear
  3937. @sprites["selsprite"].othersprite=nil
  3938. @selmapid=-1
  3939. putSprite(id)
  3940. @currentmap=id
  3941. end
  3942. elsif Input.triggerex?(0x2E) # Delete
  3943. if @mapsprites.keys.length>1 && @selmapid>=0
  3944. @mapsprites[@selmapid].bitmap.dispose
  3945. @mapsprites[@selmapid].dispose
  3946. @mapsprites.delete(@selmapid)
  3947. @sprites["selsprite"].othersprite=nil
  3948. @selmapid=-1
  3949. end
  3950. elsif Input.triggerex?("E"[0])
  3951. pbEncounterEditorMap(@encdata,@selmapid) if @selmapid>=0
  3952. elsif Input.trigger?(Input::F5)
  3953. helpWindow
  3954. end
  3955. pbUpdateSpriteHash(@sprites)
  3956. end
  3957.  
  3958. def pbMapScreenLoop
  3959. loop do
  3960. Graphics.update
  3961. Input.update
  3962. update
  3963. if Input.trigger?(Input::B)
  3964. if Kernel.pbConfirmMessage(_INTL("Save changes?"))
  3965. serializeConnectionData
  3966. serializeMetadata
  3967. save_data(@encdata,"Data/encounters.dat")
  3968. pbSaveEncounterData()
  3969. pbClearData
  3970. end
  3971. break if Kernel.pbConfirmMessage(_INTL("Exit from the editor?"))
  3972. end
  3973. end
  3974. end
  3975. end
  3976.  
  3977.  
  3978.  
  3979. def pbEditorScreen
  3980. pbCriticalCode {
  3981. mapscreen=MapScreenScene.new
  3982. mapscreen.mapScreen
  3983. mapscreen.pbMapScreenLoop
  3984. mapscreen.close
  3985. }
  3986. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement