Advertisement
Guest User

Untitled

a guest
Oct 9th, 2017
684
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 89.58 KB | None | 0 0
  1. #===============================================================================
  2. # ■ Klein's Secret Bases script for Essentials
  3. # Version 1 (4/5/15)
  4. # - http://kleinstudio.deviantart.com
  5. # Be sure to give credits if you're using this.
  6. # - How to use
  7. # * Creating the secret base map
  8. # - Map needs to be named how you've configured it in SECRETBASEMAPNAME
  9. # **IMPORTANT** By defaut you need to name them "Secret Base".
  10. # - Event for PC needs to be called BASEPC. **IMPORTANT**
  11. # * For info about the BASEPC eventn check the events in the demo.
  12. # - If you make holes, they need to be in layer 2.
  13. #
  14. # * Creating the entrance for a secret base
  15. # - Event for entrance needs to be called SECRETBASE+Secret base map ID.
  16. # * For example, if this entrance goes to secret base with map id 32,
  17. # the event needs to be called SECRETBASE32
  18. # * For info about SECRETBASE event, check the events in the demo.
  19. #
  20. # ■ Edited and expanded by Ulithium_Dragon.
  21. #
  22. #===============================================================================
  23. # ■ General settings
  24. #===============================================================================
  25. # Map id where items events are allocated
  26. ITEMSMAP=108
  27.  
  28. # Secret Bases tileset name
  29. SECRETBASETILESET="bases"
  30.  
  31. # Name for secret bases maps
  32. SECRETBASEMAPNAME="Secret Base"
  33.  
  34. # Allow to place dolls and cushions everywhere
  35. DOLLSEVERYWHERE=true
  36.  
  37. # Terrain tag for ground decorations that already are in
  38. # the base, for example rocks or bushes in layer 1
  39. # If your ground decoration is in layer 2 or 3, then don't worry
  40. # about this
  41. GROUNDDECORATION=20
  42.  
  43. # Terrain tag for walls
  44. # You can post posters on every tile with this terrain tag
  45. WALLTERRAINTAG=21
  46.  
  47. # Terrain tag for special items that can be used
  48. # for placing dolls.
  49. ITEMFORDOLL=22
  50.  
  51. # Move needed for make secret bases
  52. BASEMOVENEEDED=:SECRETPOWER
  53.  
  54. #===============================================================================
  55. # ■ Secret Base Bag pockets
  56. # [Pocket name, max items]
  57. #===============================================================================
  58. BASEBAGPOCKETS=[
  59. ["Desk",100],
  60. ["Chair",100],
  61. ["Plant",100],
  62. ["Ornament",300],
  63. ["Mat",300],
  64. ["Poster",100],
  65. ["Doll",400],
  66. ["Cushion",100],
  67. ]
  68.  
  69. #===============================================================================
  70. # Type of items
  71. #===============================================================================
  72. module ItemType
  73. DESK=0
  74. CHAIR=1
  75. PLANT=2
  76. ORNAMENT=3
  77. MAT=4
  78. POSTER=5
  79. DOLL=6
  80. CUSHION=7
  81. end
  82.  
  83. #===============================================================================
  84. # ■ Items are stored here
  85. # To add a new item place this in the last position (* New Items)
  86. # ["name", tileid, width, height, prize, event, type, board, "description"],
  87. #
  88. # -Explanation
  89. # * Name - Item name
  90. # * Tileid - Item Tile ID **************READ*****************
  91. # Imagine this is a tileset, Tile ID's are like this
  92. # [00][01][02][03][04][05][06][07]
  93. # [08][09][10][11][12][13][14][15]
  94. # [16][17][18][19][20][21][22][23]...
  95. #
  96. # The Tile ID placed here has to be the top-left Tile ID of the item-
  97. # **********FAST USER FUNCTION**********
  98. # You can use pbMakeNumericTileset(TILESETNAME) to create a new .png
  99. # in the game's folder with a tileset and a numeric patron.
  100. #
  101. # * Witdh
  102. # - Width in tiles (1, 2...)
  103. # *If the item is an event item, leave this at 1
  104. # * Height
  105. # - Height in tiles (1, 2...)
  106. # *If the item is an event item, leave this at 1
  107. # * Price - Price when shopping
  108. # * Event - Event ID
  109. # If you don't want your item to be an event, just place 'nil' here
  110. # * Creating Interactable Items **************READ*****************
  111. # If you want your item to be interactable, create a new event in the
  112. # ITEMSMAP and write the Event Id here. Interactable items are not tiles
  113. # so you need to select a graphic in the event if you don't want it to be
  114. # invisible.
  115. #
  116. # * Type - Type of item (ItemType::POSTER, ItemType::DESK...)
  117. # Some types has specials features:
  118. # *POSTER - This item only can be placed on a WALLTERRAINTAG tile.
  119. # Also *CUSHION and *DOLL can only be placed on items marked as table if
  120. # you don't enable DOLLSEVERYWHERE. Dolls and cushions ALWAYS needs to be
  121. # Events items.
  122. #
  123. # * Board
  124. # - This kind of item can be placed on top of holes
  125. # *If you don't want the tile to be used like this, just place 'false'
  126. #
  127. # * Description - Item description (A small chair...)
  128. #
  129. #===============================================================================
  130. # ■ Items
  131. #===============================================================================
  132. SECRETBASEITEMS=[
  133. [-1],
  134. #* Desks
  135. ["Brick Desk",336,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of bricks. Holds lot of decorations."],
  136. ["Camp Desk",360,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of logs. Holds lot of decorations."],
  137. ["Comfort Desk",355,3,2,2000,nil,ItemType::DESK,false,"A large desk made of leaves. Put some decorations on it."],
  138. ["Hard Desk",384,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of rock. Holds lot of decorations."],
  139. ["Heavy Desk",371,3,2,2000,nil,ItemType::DESK,false,"A large desk made of steel. Put some decorations on it."],
  140. ["Pokémon Desk",339,1,1,1000,nil,ItemType::DESK,false,"A small desk built in the shape of a Poké Ball."],
  141. ["Pretty Desk",408,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of glass. Holds lot of decorations."],
  142. ["Ragged Desk",387,3,2,2000,nil,ItemType::DESK,false,"A large desk made of wood. Put some decorations on it."],
  143. ["Small Desk",340,1,1,1000,nil,ItemType::DESK,false,"A small desk made for one."],
  144.  
  145. #* Chairs
  146. ["Brick Chair",314,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of brick."],
  147. ["Camp Chair",315,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of logs."],
  148. ["Comfort Chair",316,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of leaves."],
  149. ["Hard Chair",322,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of rock."],
  150. ["Heavy Chair",323,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of steel."],
  151. ["Pokémon Chair",324,1,1,1000,nil,ItemType::CHAIR,false,"A small chair built in the shape of a Poké Ball."],
  152. ["Pretty Chair",330,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of glass."],
  153. ["Ragged Chair",331,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of wood."],
  154. ["Small Chair",332,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made for one."],
  155.  
  156. #* Plants
  157. ["Big Plant",309,2,2,2000,nil,ItemType::PLANT,false,"A large, umbrella-shaped plant in a big pot."],
  158. ["Colorful Flowers",325,2,2,2000,nil,ItemType::PLANT,false,"A large pot with many colorful flowers."],
  159. ["Gorgeous Plant",341,2,2,2000,nil,ItemType::PLANT,false,"A large impressive plant in a big pot."],
  160. ["Red Plant",311,1,2,1000,nil,ItemType::PLANT,false,"A vivid red potted plant."],
  161. ["Tropical Plant",327,1,2,1000,nil,ItemType::PLANT,false,"A flowering tropical plant in a pot."],
  162. ["Pretty Flower",343,1,2,1000,nil,ItemType::PLANT,false,"A pot of cute flowes."],
  163.  
  164. #* Ornaments
  165. ["Red Balloon",136,1,1,500,4,ItemType::ORNAMENT,false,"A red balloon filled with water. Bursts if stepped on."],
  166. ["Red Tent",129,3,3,5000,nil,ItemType::ORNAMENT,false,"A red tent to hide in."],
  167. ["Blue Tent",132,3,3,5000,nil,ItemType::ORNAMENT,false,"A blue tent to hide in."],
  168. ["Sand Ornament",160,1,1,1200,7,ItemType::ORNAMENT,false,"A sand sculpture that crumbles when touched."],
  169. ["Slide",304,2,4,5000,nil,ItemType::ORNAMENT,false,"A blue slide."],
  170. ["Long Board",6,1,2,1000,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
  171. ["Wide Board",30,2,1,1000,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
  172. ["Big Board",54,2,2,1500,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
  173.  
  174. #* Mats
  175. ["Surf Mat",218,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Surf image. Put items on top."],
  176. ["Fire Blast Mat",242,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Fire Blast image. Put items on top."],
  177. ["Attract Mat",266,3,3,900,nil,ItemType::MAT,false,"A mat designed with an Attract image. Put items on top."],
  178. ["Spikes Mat",290,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Spikes image. Put items on top."],
  179. ["Thunder Mat",237,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Thunder image. Put items on top."],
  180. ["Powder Snow Mat",261,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Powder Snow image. Put items on top."],
  181. ["Fissure Mat",285,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Fissure image. Put items on top."],
  182. ["Jump mat",128,1,1,500,ItemType::MAT,false,"A trick mat that jumps when it is stepped on."],
  183.  
  184. #* Posters
  185. ["Ball Poster",358,1,1,1000,nil,ItemType::POSTER,false,"A small poster printed with a Poké Ball."],
  186. ["Green Poster",359,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Treecko print."],
  187. ["Red Poster",366,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Torchic print."],
  188. ["Blue Poster",367,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Mudkip print."],
  189. ["Cute Poster",374,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Azurill print."],
  190. ["Pika Poster",382,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Pikachu and Pichu print."],
  191. ["Long Poster",390,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Seviper print."],
  192. ["Sea Poster",398,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Relicanth print."],
  193. ["Sky Poster",406,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Wingull print."],
  194. ["Kiss Poster",414,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Smoochum print."],
  195.  
  196. #* Dolls
  197. #Large
  198. ["Lapras Doll",200,1,1,5000,2,ItemType::DOLL,false,"A Lapras doll. Place it on a mat or a desk."],
  199. ["Regirock Doll",208,1,1,5000,22,ItemType::DOLL,false,"A Regirock doll. Place it on a mat or a desk."],
  200. ["Regice Doll",216,1,1,5000,23,ItemType::DOLL,false,"A Regice doll. Place it on a mat or a desk."],
  201. ["Registeel Doll",224,1,1,5000,24,ItemType::DOLL,false,"A Registeel doll. Place it on a mat or a desk."],
  202. ["Wailmer Doll",233,1,1,5000,25,ItemType::DOLL,false,"A Wailmer doll. Place it on a mat or a desk."],
  203.  
  204. #Small
  205. ["Torchic Doll",201,1,1,1000,3,ItemType::DOLL,false,"A Torchic doll. Place it on a mat or a desk."],
  206. ["Treecko Doll",209,1,1,1000,5,ItemType::DOLL,false,"A Treecko doll. Place it on a mat or a desk."],
  207. ["Mudkip Doll",217,1,1,1000,6,ItemType::DOLL,false,"A Mudkip doll. Place it on a mat or a desk."],
  208. ["Smoochum Doll",225,1,1,1000,18,ItemType::DOLL,false,"A Smoochum doll. Place it on a mat or a desk."],
  209. ["Cyndaquil Doll",233,1,1,1000,19,ItemType::DOLL,false,"A Cyndaquil doll. Place it on a mat or a desk."],
  210. ["Chikorita Doll",241,1,1,1000,20,ItemType::DOLL,false,"A Chikorita doll. Place it on a mat or a desk."],
  211. ["Totodile Doll",249,1,1,1000,21,ItemType::DOLL,false,"A Totodile doll. Place it on a mat or a desk."],
  212.  
  213. #* Cushion
  214. ["Ball Cushion",419,1,1,500,8,ItemType::CUSHION,false,"A cushion shaped like a PokéBall."],
  215. ["Diamon Cushion",420,1,1,500,9,ItemType::CUSHION,false,"A cushion based on Sableye."],
  216. ["Fire Cushion",421,1,1,500,10,ItemType::CUSHION,false,"A cushion with a fire emblem imprint."],
  217. ["Grass Cushion",422,1,1,500,11,ItemType::CUSHION,false,"A cushion with a grass emblem imprint."],
  218. ["Kiss Cushion",427,1,1,500,12,ItemType::CUSHION,false,"A cushion based on Smoochum."],
  219. ["Pika Cushion",428,1,1,500,13,ItemType::CUSHION,false,"A cushion based on Pikachu."],
  220. ["Round Cushion",429,1,1,500,14,ItemType::CUSHION,false,"A cushion based on Marill."],
  221. ["Spin Cushion",430,1,1,500,15,ItemType::CUSHION,false,"A cushion based on Spinda."],
  222. ["Water Cushion",435,1,1,500,16,ItemType::CUSHION,false,"A cushion with a water emblem imprint."],
  223. ["Zigzag Cushion",436,1,1,500,17,ItemType::CUSHION,false,"A cushion based on Zigzagoon."],
  224.  
  225. #* New Items
  226.  
  227. #* Dolls
  228. #Small
  229. ["Bulbasaur Doll",240,1,1,1000,26,ItemType::DOLL,false,"A Bulbasaur doll. Place it on a mat or a desk."],
  230. ["Squirtle Doll",248,1,1,1000,27,ItemType::DOLL,false,"A Squirtle doll. Place it on a mat or a desk."],
  231. ["Charmander Doll",264,1,1,1000,28,ItemType::DOLL,false,"A Charmander doll. Place it on a mat or a desk."],
  232. ["Turtwig Doll",192,1,1,1000,29,ItemType::DOLL,false,"A Turtwig doll. Place it on a mat or a desk."],
  233. ["Piplup Doll",199,1,1,1000,30,ItemType::DOLL,false,"A Piplup doll. Place it on a mat or a desk."],
  234. ["Chimchar Doll",184,1,1,1000,31,ItemType::DOLL,false,"A Chimchar doll. Place it on a mat or a desk."],
  235.  
  236. #Large
  237. ["Venusaur Doll",164,1,1,5000,32,ItemType::DOLL,false,"A Venusaur doll. Place it on a mat or a desk."],
  238. ["Blastoise Doll",265,1,1,5000,33,ItemType::DOLL,false,"A Blastoise doll. Place it on a mat or a desk."],
  239. ["Charizard Doll",272,1,1,5000,34,ItemType::DOLL,false,"A Charizard doll. Place it on a mat or a desk."],
  240. ["Snorlax(A) Doll",273,1,1,5000,35,ItemType::DOLL,false,"A Snorlax doll. Place it on a mat or a desk."],
  241. ["Rhydon Doll",280,1,1,5000,36,ItemType::DOLL,false,"A Rhydon doll. Place it on a mat or a desk."],
  242. ["Magnezone Doll",281,1,1,5000,37,ItemType::DOLL,false,"A Magnezone doll. Place it on a mat or a desk."],
  243. ["Wailord Doll",288,1,1,5000,38,ItemType::DOLL,false,"A Wailord doll. Place it on a mat or a desk."],
  244. ["Snorlax(B) Doll",289,1,1,5000,39,ItemType::DOLL,false,"A Snorlax doll. Place it on a mat or a desk."],
  245.  
  246. #Small
  247. ["Riolu Doll",432,1,1,1000,40,ItemType::DOLL,false,"A Riolu doll. Place it on a mat or a desk."],
  248. ["Seedot Doll",433,1,1,1000,41,ItemType::DOLL,false,"A Seedot doll. Place it on a mat or a desk."],
  249. ["Lotad Doll",434,1,1,1000,42,ItemType::DOLL,false,"A Lotad doll. Place it on a mat or a desk."],
  250. ["Gulpin Doll",440,1,1,1000,43,ItemType::DOLL,false,"A Gulpin doll. Place it on a mat or a desk."],
  251. ["Swablu Doll",441,1,1,1000,44,ItemType::DOLL,false,"A Swablu doll. Place it on a mat or a desk."],
  252. ["Skitty Doll",442,1,1,1000,45,ItemType::DOLL,false,"A Skitty doll. Place it on a mat or a desk."],
  253. ["Azurill Doll",448,1,1,1000,46,ItemType::DOLL,false,"A Azurill doll. Place it on a mat or a desk."],
  254. ["Kecleon Doll",449,1,1,1000,47,ItemType::DOLL,false,"A Kecleon doll. Place it on a mat or a desk."],
  255. ["Baltoy Doll",450,1,1,1000,48,ItemType::DOLL,false,"A Baltoy doll. Place it on a mat or a desk."],
  256. ["Wynaut Doll",456,1,1,1000,49,ItemType::DOLL,false,"A Wynaut doll. Place it on a mat or a desk."],
  257. ["Pichu Doll",457,1,1,1000,50,ItemType::DOLL,false,"A Pichu doll. Place it on a mat or a desk."],
  258. ["Pikachu Doll",458,1,1,1000,51,ItemType::DOLL,false,"A Pikachu doll. Place it on a mat or a desk."],
  259. ["Marill Doll",464,1,1,1000,52,ItemType::DOLL,false,"A Marill doll. Place it on a mat or a desk."],
  260. ["Togepi Doll",465,1,1,1000,53,ItemType::DOLL,false,"A Togepi doll. Place it on a mat or a desk."],
  261. ["Jigglypuff Doll",466,1,1,1000,54,ItemType::DOLL,false,"A Jigglypuff doll. Place it on a mat or a desk."],
  262. ["Meowth Doll",443,1,1,1000,55,ItemType::DOLL,false,"A Meowth doll. Place it on a mat or a desk."],
  263. ["Clefairy Doll",444,1,1,1000,56,ItemType::DOLL,false,"A Clefairy doll. Place it on a mat or a desk."],
  264. ["Ditto Doll",445,1,1,1000,57,ItemType::DOLL,false,"A Ditto doll. Place it on a mat or a desk."],
  265. ["Duskull Doll",446,1,1,1000,58,ItemType::DOLL,false,"A Duskull doll. Place it on a mat or a desk."],
  266. ["Plusle Doll",447,1,1,1000,59,ItemType::DOLL,false,"A Plusle doll. Place it on a mat or a desk."],
  267. ["Minun Doll",451,1,1,1000,60,ItemType::DOLL,false,"A Minun doll. Place it on a mat or a desk."],
  268. ["Weavile Doll",452,1,1,1000,61,ItemType::DOLL,false,"A Weavile doll. Place it on a mat or a desk."],
  269. ["Glameow Doll",453,1,1,1000,62,ItemType::DOLL,false,"A Glameow doll. Place it on a mat or a desk."],
  270. ["Munchlax Doll",454,1,1,1000,63,ItemType::DOLL,false,"A Munchlax doll. Place it on a mat or a desk."],
  271. ["Bonsly Doll",455,1,1,1000,64,ItemType::DOLL,false,"A Bonsly doll. Place it on a mat or a desk."],
  272. ["Mime Jr. Doll",459,1,1,1000,65,ItemType::DOLL,false,"A Mime Jr. doll. Place it on a mat or a desk."],
  273. ["Wobbuffet Doll",460,1,1,1000,66,ItemType::DOLL,false,"A Wobbuffet doll. Place it on a mat or a desk."],
  274. ["Buneary Doll",461,1,1,1000,67,ItemType::DOLL,false,"A Buneary doll. Place it on a mat or a desk."],
  275. ["Buizel Doll",462,1,1,1000,68,ItemType::DOLL,false,"A Buizel doll. Place it on a mat or a desk."],
  276. ["Mantyke Doll",463,1,1,1000,69,ItemType::DOLL,false,"A Mantyke doll. Place it on a mat or a desk."],
  277. ["Chatot Doll",467,1,1,1000,70,ItemType::DOLL,false,"A Chatot doll. Place it on a mat or a desk."],
  278. ["Manaphy Doll",468,1,1,1000,71,ItemType::DOLL,false,"A Manaphy Doll doll. Place it on a mat or a desk."],
  279. ["Happiny Doll",469,1,1,1000,72,ItemType::DOLL,false,"A Happiny doll. Place it on a mat or a desk."],
  280. ["Pachirisu Doll",470,1,1,1000,73,ItemType::DOLL,false,"A Pachirisu doll. Place it on a mat or a desk."],
  281. ["Drifloon Doll",471,1,1,1000,74,ItemType::DOLL,false,"A Drifloon doll. Place it on a mat or a desk."],
  282.  
  283. #Medium
  284. #ANIMATED
  285. ["Drifballoon",472,1,1,3000,75,ItemType::ORNAMENT,false,"A Drifloon balloon. Don't let it fly away!"],
  286.  
  287.  
  288. #* Ornaments
  289. ["Yellow Tent",488,3,3,5000,nil,ItemType::ORNAMENT,false,"A yellow tent to hide in."],
  290.  
  291. ]
  292.  
  293. #===============================================================================
  294. # ■ Holes
  295. # They are made like items.
  296. # [tile id, width in tiles, height in tiles]
  297. # Holes needs to be in Layer 2.
  298. #===============================================================================
  299.  
  300. BASEHOLES=[
  301. [-1],
  302. [7,1,2],
  303. [22,2,1],
  304. [38,2,2],
  305. ]
  306.  
  307. #===============================================================================
  308. # ■ Script start here
  309. # - Do not touch anything in here if you don't know what you're doing.
  310. #===============================================================================
  311. def pbGetBaseItem(item)
  312. $PokemonGlobal.baseItemBag[baseItemPocket(item)].push([item,false])
  313. end
  314.  
  315. def getAllDesks
  316. items=[]
  317. for i in 1...SECRETBASEITEMS.length
  318. items.push(i) if baseItemPocket(i)==ItemType::DESK
  319. end
  320. return items
  321. end
  322.  
  323. def getAllChairs
  324. items=[]
  325. for i in 1...SECRETBASEITEMS.length
  326. items.push(i) if baseItemPocket(i)==ItemType::CHAIR
  327. end
  328. return items
  329. end
  330.  
  331. def getAllPosters
  332. items=[]
  333. for i in 1...SECRETBASEITEMS.length
  334. items.push(i) if baseItemPocket(i)==ItemType::POSTER
  335. end
  336. return items
  337. end
  338.  
  339. def getAllPlants
  340. items=[]
  341. for i in 1...SECRETBASEITEMS.length
  342. items.push(i) if baseItemPocket(i)==ItemType::PLANT
  343. end
  344. return items
  345. end
  346.  
  347. def getAllMats
  348. items=[]
  349. for i in 1...SECRETBASEITEMS.length
  350. items.push(i) if baseItemPocket(i)==ItemType::MAT
  351. end
  352. return items
  353. end
  354.  
  355. def getAllOrnaments
  356. items=[]
  357. for i in 1...SECRETBASEITEMS.length
  358. items.push(i) if baseItemPocket(i)==ItemType::ORNAMENT
  359. end
  360. return items
  361. end
  362.  
  363. def getAllDolls
  364. items=[]
  365. for i in 1...SECRETBASEITEMS.length
  366. items.push(i) if baseItemPocket(i)==ItemType::DOLL
  367. end
  368. return items
  369. end
  370.  
  371. def getAllCushions
  372. items=[]
  373. for i in 1...SECRETBASEITEMS.length
  374. items.push(i) if baseItemPocket(i)==ItemType::CUSHION
  375. end
  376. return items
  377. end
  378.  
  379. def isItemForDoll?(pos)
  380. #return $game_map.data[pos[0],pos[1],1]==ITEMFORDOLL
  381. end
  382. class PokemonGlobalMetadata
  383. attr_accessor :baseinfo
  384. attr_accessor :baseItemBag
  385. attr_accessor :placedItems
  386. attr_accessor :mybaseid
  387. attr_accessor :mybaselocation
  388. attr_accessor :installed
  389. attr_accessor :outdoordata
  390.  
  391. def baseInstalled?
  392. return !@installed ? false : @installed
  393. end
  394.  
  395. def getBaseOutdoor
  396. return !@outdoordata ? false : @outdoordata
  397. end
  398. def getBaseId
  399. return !@mybaseid ? -1 : @mybaseid
  400. end
  401.  
  402. def getBaseLocation
  403. return !@mybaselocation ? -1 : @mybaselocation
  404. end
  405.  
  406. def getPlacedItems(id)
  407. @placedItems={} if !@placedItems
  408. @placedItems[id]=[] if !@placedItems[id]
  409. return @placedItems[id]
  410. end
  411.  
  412. def setPlacedInfo(id,x,y,item)
  413. @placedItems={} if !@placedItems
  414. @placedItems[id]=[] if !@placedItems[id]
  415. @placedItems[id].push([x,y,item])
  416. end
  417.  
  418. def baseBag
  419. if !@baseItemBag
  420. @baseItemBag={}
  421. for i in 0...BASEBAGPOCKETS.length
  422. @baseItemBag[i]=[] if !@baseItemBag[i]
  423. end
  424. end
  425. end
  426.  
  427. def getBasePocket(pocket)
  428. baseBag
  429. return @baseItemBag[pocket]
  430. end
  431.  
  432. def basePocketLength(pocket)
  433. baseBag
  434. return @baseItemBag[pocket].length
  435. end
  436.  
  437. def notBaseData?(id)
  438. return false if !@baseinfo || !@baseinfo[id]
  439. return true
  440. end
  441.  
  442. def setBaseInfo(id,eventlist,tiledata)
  443. @baseinfo={} if !@baseinfo
  444. @baseinfo[id].clear if @baseinfo[id]
  445. @baseinfo[id]=[eventlist,tiledata]
  446. end
  447. end
  448.  
  449. def getMaxSecretBagPocket(pocket)
  450. return BASEBAGPOCKETS[pocket][1]
  451. end
  452.  
  453. class TileDrawingHelper
  454. def bltTileWithSize(bitmap,cxTile,cyTile,id)
  455. return if !@tileset || id<384 || @tileset.disposed?
  456. rect=Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32,32*cxTile,32*cyTile)
  457. bitmap.stretch_blt(Rect.new(0,0,32*cxTile,32*cyTile),@tileset,rect)
  458. end
  459. end
  460.  
  461. def getBaseItemByName(itemname)
  462. for i in 0...SECRETBASEITEMS.length
  463. return i if baseItemName(i)==itemname
  464. end
  465. end
  466.  
  467. def baseItemDesc(id)
  468. return SECRETBASEITEMS[id][8]
  469. end
  470.  
  471. def baseItemEvent(id)
  472. return SECRETBASEITEMS[id][5]
  473. end
  474.  
  475. def baseItemPocket(id)
  476. return SECRETBASEITEMS[id][6]
  477. end
  478.  
  479. def isABoard?(id)
  480. return SECRETBASEITEMS[id][7]
  481. end
  482.  
  483. def isAPoster?(id)
  484. return SECRETBASEITEMS[id][6]==ItemType::POSTER
  485. end
  486.  
  487. def isADoll?(id)
  488. return SECRETBASEITEMS[id][6]==ItemType::DOLL
  489. end
  490.  
  491. def isACushion?(id)
  492. return SECRETBASEITEMS[id][6]==ItemType::CUSHION
  493. end
  494.  
  495. def isAMat?(id)
  496. return SECRETBASEITEMS[id][6]==ItemType::MAT
  497. end
  498.  
  499. def isADesk?(id)
  500. return SECRETBASEITEMS[id][6]==ItemType::DESK
  501. end
  502.  
  503. def baseItemName(id)
  504. return SECRETBASEITEMS[id][0]
  505. end
  506.  
  507. def baseItemCost(id)
  508. return SECRETBASEITEMS[id][4]
  509. end
  510.  
  511. def baseItemWidth(id)
  512. return SECRETBASEITEMS[id][2]*32
  513. end
  514.  
  515. def baseItemHeight(id)
  516. return SECRETBASEITEMS[id][3]*32
  517. end
  518.  
  519. def baseItemTileid(id)
  520. return SECRETBASEITEMS[id][1]+384
  521. end
  522.  
  523. def getBaseItemBitmap(id)
  524. if baseItemEvent(id)!=nil # Load the event bitmap
  525. map=load_data(sprintf("Data/Map%03d.%s", ITEMSMAP,$RPGVX ? "rvdata" : "rxdata"))
  526. map.events.each do |i, event|
  527. if event.id==baseItemEvent(id)
  528. dollEvent=Game_BaseEvent.new(nil, event)
  529. dollBitmap=AnimatedBitmap.new("Graphics/Characters/"+dollEvent.character_name,
  530. dollEvent.character_hue)
  531. width = dollBitmap.width / 4
  532. height = dollBitmap.height / 4
  533. sx = dollEvent.pattern * width
  534. sy = (dollEvent.direction - 2) / 2 * height
  535. iconItem=Bitmap.new(width,height)
  536. iconItem.blt(0,0,dollBitmap.bitmap,Rect.new(sx,sy,width,height))
  537. return iconItem
  538. end
  539. end
  540. else # Load bitmap from tileset
  541. bitmap=pbGetTileset(SECRETBASETILESET)
  542. itemWidth=baseItemWidth(id)
  543. itemHeight=baseItemHeight(id)
  544. iconItem=Bitmap.new(itemWidth,itemHeight)
  545. tileId=baseItemTileid(id)
  546. tilehelper=TileDrawingHelper.new(bitmap,nil)
  547. tilehelper.bltTileWithSize(iconItem,itemWidth/32,itemHeight/32,tileId)
  548. return iconItem
  549. end
  550. end
  551.  
  552. class Game_Map
  553. alias old_setup_bases setup
  554. def setup(map_id)
  555. old_setup_bases(map_id)
  556. if pbGetMapNameFromId(@map_id)==SECRETBASEMAPNAME#"Secret Base"
  557. loadSecretBaseEvents
  558. end
  559. searchForMyBase
  560. end
  561.  
  562. def isItemEvent?(event)
  563. return true if event!=nil && event.is_a?(Game_BaseEvent) && event.item==true
  564. return false
  565. end
  566.  
  567. def backToOriginal
  568. @map=load_data(sprintf("Data/Map%03d.%s", @map_id,$RPGVX ? "rvdata" : "rxdata"))
  569. @events = {}
  570. for i in @map.events.keys
  571. @events[i] = Game_Event.new(@map_id, @map.events[i],self)
  572. end
  573. $PokemonGlobal.baseinfo[@map_id].clear
  574. $PokemonGlobal.baseinfo[@map_id]=nil
  575. end
  576.  
  577. def reloadBaseEvents
  578. @map=load_data(sprintf("Data/Map%03d.%s", @map_id,$RPGVX ? "rvdata" : "rxdata"))
  579. @events = {}
  580. for i in @map.events.keys
  581. @events[i] = Game_Event.new(@map_id, @map.events[i],self)
  582. end
  583. loadSecretBaseEvents(true)
  584. end
  585.  
  586. def terrain_tag_id(tileid)
  587. return @terrain_tags[tileid]
  588. end
  589.  
  590. def loadSecretBaseEvents(savedPositions=false)
  591. return if !$PokemonGlobal.notBaseData?(@map_id)
  592. @map.data=$PokemonGlobal.baseinfo[@map_id][1]
  593.  
  594. for i in 0...$PokemonGlobal.baseinfo[@map_id][0].length+1
  595. savedEvent=$PokemonGlobal.baseinfo[@map_id][0][i]
  596. next if savedEvent==nil
  597. nEvent=savedEvent.rEvent
  598. newId=getNewId
  599. itemEvent=Game_BaseEvent.new(@map_id, nEvent)
  600. itemEvent.id=newId
  601. itemEvent.moveto(savedEvent.x,savedEvent.y)
  602. itemEvent.item=true
  603. itemEvent.direction=savedEvent.direction if savedPositions
  604. itemEvent.itemtileid=savedEvent.itemtileid
  605. itemEvent.rEvent=nEvent
  606. @events[newId] = itemEvent
  607. end
  608. end
  609.  
  610. def getNewId
  611. newId = 1
  612. while $game_map.events[newId] != nil do
  613. newId += 1
  614. end
  615. return newId
  616. end
  617.  
  618. def copy_event(mapid, eventid, x, y,tileid)
  619. map = load_data(sprintf("Data/Map%03d.rxdata", mapid))
  620. map.events.each do |i, event|
  621. if event.id == eventid
  622. newId=getNewId
  623. nEvent=event.clone # Clone the event
  624. # Create the new event in new map
  625. eMap=Game_BaseEvent.new(@map_id, nEvent)
  626. eMap.id=newId
  627. eMap.moveto(x,y)
  628. eMap.itemtileid=tileid
  629. eMap.item=true
  630. eMap.rEvent=nEvent
  631. @events[newId] = eMap
  632. end
  633. end
  634. end
  635. end
  636.  
  637. # Functions for events
  638. def movingRightToThis(event=nil)
  639. return $game_player.x==event.x && $game_player.y==event.y &&
  640. $game_player.direction==6 && $game_player.moving? &&
  641. (Input.press?(Input::RIGHT) || Input.trigger?(Input::RIGHT) ||
  642. Input.release?(Input::RIGHT))
  643. end
  644.  
  645. def movingLeftToThis(event=nil)
  646. return $game_player.x==event.x && $game_player.y==event.y &&
  647. $game_player.direction==4 && $game_player.moving? &&
  648. (Input.press?(Input::LEFT) || Input.trigger?(Input::LEFT) || Input.release?(Input::LEFT))
  649. end
  650.  
  651. def movingUpToThis(event)
  652. return $game_player.x==event.x && $game_player.y==event.y &&
  653. $game_player.direction==8 && $game_player.moving? &&
  654. (Input.press?(Input::UP) || Input.trigger?(Input::UP) || Input.release?(Input::UP))
  655. end
  656.  
  657. def movingDownToThis(event=nil)
  658. return $game_player.x==event.x && $game_player.y==event.y &&
  659. $game_player.direction==2 && $game_player.moving? &&
  660. (Input.press?(Input::DOWN) || Input.trigger?(Input::DOWN) || Input.release?(Input::DOWN))
  661. end
  662.  
  663. class Game_Event
  664. attr_accessor :rEvent
  665.  
  666. def rEvent
  667. return !@rEvent ? false : @rEvent
  668. end
  669.  
  670. def direction=(value)
  671. @direction=value
  672. end
  673. end
  674.  
  675. class Game_BaseEvent < Game_Event
  676. attr_accessor :item
  677. attr_accessor :itemtileid
  678.  
  679. end
  680.  
  681. class Spriteset_Map
  682. attr_accessor :character_sprites
  683. attr_accessor :player
  684.  
  685. alias old_initialize_base initialize
  686. def initialize(map=nil)
  687. old_initialize_base(map)
  688. @player=@playersprite
  689. end
  690. end
  691.  
  692. def copyMapData
  693. baseEvents=[]
  694. for i in 0...$game_map.events.length+1
  695. event=$game_map.events[i]
  696. baseEvents.push(event) if event.is_a?(Game_BaseEvent)
  697. end
  698.  
  699. $PokemonGlobal.setBaseInfo($game_map.map_id,baseEvents,$game_map.data)
  700. end
  701.  
  702. def placeItemInBase(item,pos)
  703. x=pos[0]
  704. y=pos[1]
  705. width=baseItemWidth(item)/32
  706. height=baseItemHeight(item)/32
  707.  
  708. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  709. tilesets=load_data("Data/Tilesets.rxdata")
  710. tileset=tilesets[map.tileset_id]
  711. priorities=tileset.priorities
  712. passages=tileset.passages
  713.  
  714.  
  715. # Check if it's an event item
  716. if baseItemEvent(item)
  717. tileid=baseItemTileid(item)
  718. $game_map.copy_event(ITEMSMAP,baseItemEvent(item),x,y,tileid)
  719. else # Draw a tile
  720. for i in 0...width
  721. for e in 0...height
  722. tileid=baseItemTileid(item)+i+(e*8)
  723. layer=priorities[tileid]==0 ? 1 : 2
  724. #layer=2 if passages[tileid] & 0x80 == 0x80 # Counter
  725. $game_map.data[x+i,y+e,layer]=tileid
  726. end
  727. end
  728. end
  729. copyMapData
  730. end
  731.  
  732. #===============================================================================
  733. # PC System
  734. #===============================================================================
  735.  
  736. class Game_Character
  737. def screen_x_scroll(scroll)
  738. return (@real_x - scroll + 3) / 4 + (Game_Map::TILEWIDTH/2)
  739. end
  740.  
  741. def screen_y_scroll(scroll)
  742. y = (@real_y - scroll + 3) / 4 + (Game_Map::TILEHEIGHT)
  743. if jumping?
  744. if @jump_count >= @jump_peak
  745. n = @jump_count - @jump_peak
  746. else
  747. n = @jump_peak - @jump_count
  748. end
  749. return y - (@jump_peak * @jump_peak - n * n) / 2
  750. else
  751. return y
  752. end
  753. end
  754. end
  755.  
  756. class DecorationMap
  757. attr_accessor :scroll
  758. def initialize(viewport)
  759. $scene.disposeSpritesets
  760. @map=load_data(sprintf("Data/Map%03d.rxdata",$game_map.map_id))
  761. @viewport=Viewport.new(viewport.rect.x,viewport.rect.y,viewport.rect.width,
  762. viewport.rect.height)
  763. @viewport.z=99999
  764. @totalscroll=[0,0]
  765. pbLoad
  766. end
  767.  
  768. def pbLoad
  769. @scroll=[0,0]
  770.  
  771. @bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
  772. tilesets=load_data("Data/Tilesets.rxdata")
  773. @tileset=tilesets[@map.tileset_id]
  774. helper=TileDrawingHelper.fromTileset(@tileset)
  775. for z in 0..2
  776. id=$game_map.data[x,y,z]
  777. id=0 if !id
  778. helper.bltTile(@bitmap,x*32,y*32,id)
  779. end
  780. end
  781. end
  782.  
  783. @rsprite=Sprite_Character.new(nil, $game_player)
  784. @rsprite.dispose
  785.  
  786. @scroll[0]+=x-$game_player.x*32
  787. @scroll[1]+=y-$game_player.y*32
  788.  
  789. @mapSprite=Sprite.new(@viewport)
  790. @mapSprite.bitmap=@bitmap
  791. @mapSprite.x+=@scroll[0]
  792. @mapSprite.y+=@scroll[1]
  793. @character_sprites = []
  794.  
  795. for i in $game_map.events.keys.sort
  796. sprite=Sprite_Character.new(@viewport, $game_map.events[i])
  797. sprite.x=$game_map.events[i].screen_x_scroll(0)
  798. sprite.y=$game_map.events[i].screen_y_scroll(0)
  799. sprite.x+=@scroll[0]
  800. sprite.y+=@scroll[1]
  801. @character_sprites.push(sprite)
  802. end
  803. @scroll=[0,0]
  804. end
  805.  
  806. def pbReloadTiles
  807. @bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
  808. helper=TileDrawingHelper.fromTileset(@tileset)
  809. for z in 0..2
  810. id=$game_map.data[x,y,z]
  811. id=0 if !id
  812. helper.bltTile(@bitmap,x*32,y*32,id)
  813. end
  814. end
  815. end
  816. @mapSprite.bitmap=@bitmap
  817. end
  818.  
  819. def pbReloadEvents
  820. for sprite in @character_sprites
  821. sprite.dispose
  822. end
  823.  
  824. @rsprite=Sprite_Character.new(nil, $game_player)
  825. @rsprite.dispose
  826.  
  827. @character_sprites.clear
  828. for i in $game_map.events.keys.sort
  829. sprite=Sprite_Character.new(@viewport, $game_map.events[i])
  830. sprite.x=$game_map.events[i].screen_x_scroll(0)
  831. sprite.y=$game_map.events[i].screen_y_scroll(0)
  832. sprite.x+=x-$game_player.x*32+@totalscroll[0]
  833. sprite.y+=y-$game_player.y*32+@totalscroll[1]
  834. @character_sprites.push(sprite)
  835. end
  836. end
  837.  
  838. def reload
  839. pbReloadTiles
  840. pbReloadEvents
  841. end
  842.  
  843. def disposed?
  844. @mapSprite.disposed?
  845. end
  846.  
  847. def color
  848. return @mapSprite.color
  849. end
  850.  
  851. def color=(value)
  852. @mapSprite.color=value
  853. for sprite in @character_sprites
  854. sprite.color=value
  855. end
  856. end
  857.  
  858. def visible
  859. return @mapSprite.visible
  860. end
  861.  
  862. def visible=(value)
  863. @mapSprite.visible=value
  864. for sprite in @character_sprites
  865. sprite.visible=value
  866. end
  867. end
  868.  
  869. def dispose
  870. @mapSprite.dispose
  871. for sprite in @character_sprites
  872. sprite.dispose
  873. end
  874. $scene.createSpritesets
  875. end
  876.  
  877. def updateScrollPos
  878. @mapSprite.x+=@scroll[0]
  879. @mapSprite.y+=@scroll[1]
  880. for sprite in @character_sprites
  881. sprite.x+=@scroll[0]
  882. sprite.y+=@scroll[1]
  883. end
  884. @totalscroll[0]+=@scroll[0]
  885. @totalscroll[1]+=@scroll[1]
  886. @scroll=[0,0]
  887. end
  888.  
  889. end
  890.  
  891. def Kernel.pbShowCommandsBase(msgwindow,commands=nil,cmdIfCancel=0,defaultCmd=0)
  892. ret=0
  893. if commands
  894. cmdwindow=Window_CommandPokemonEx.new(commands)
  895. cmdwindow.z=99999
  896. cmdwindow.visible=true
  897. cmdwindow.resizeToFit(cmdwindow.commands)
  898. pbPositionNearMsgWindow(cmdwindow,msgwindow,:right)
  899. cmdwindow.index=defaultCmd
  900. command=0
  901. loop do
  902. Graphics.update
  903. Input.update
  904. cmdwindow.update
  905. msgwindow.update if msgwindow
  906. yield if block_given?
  907. if Input.trigger?(Input::B)
  908. if cmdIfCancel>0
  909. command=cmdIfCancel-1
  910. break
  911. elsif cmdIfCancel<0
  912. command=cmdIfCancel
  913. break
  914. end
  915. end
  916. if Input.trigger?(Input::C)
  917. command=cmdwindow.index
  918. break
  919. end
  920. end
  921. ret=command
  922. cmdwindow.dispose
  923. Input.update
  924. end
  925. return ret
  926. end
  927.  
  928. def Kernel.pbMessageBase(message,commands=nil,cmdIfCancel=0,skin=nil,defaultCmd=0,&block)
  929. ret=0
  930. msgwindow=Kernel.pbCreateMessageWindow(nil,skin)
  931. if commands
  932. ret=Kernel.pbMessageDisplayBase(msgwindow,message,true,
  933. proc {|msgwindow|
  934. next Kernel.pbShowCommandsBase(msgwindow,commands,cmdIfCancel,defaultCmd,&block)
  935. },&block)
  936. else
  937. Kernel.pbMessageDisplayBase(msgwindow,message,&block)
  938. end
  939. Kernel.pbDisposeMessageWindow(msgwindow)
  940. Input.update
  941. return ret
  942. end
  943.  
  944. def Kernel.pbMessageDisplayBase(msgwindow,message,letterbyletter=true,commandProc=nil)
  945. return if !msgwindow
  946. oldletterbyletter=msgwindow.letterbyletter
  947. msgwindow.letterbyletter=(letterbyletter ? true : false)
  948. ret=nil
  949. count=0
  950. commands=nil
  951. facewindow=nil
  952. goldwindow=nil
  953. coinwindow=nil
  954. cmdvariable=0
  955. cmdIfCancel=0
  956. msgwindow.waitcount=0
  957. autoresume=false
  958. text=message.clone
  959. msgback=nil
  960. linecount=(DEFAULTSCREENHEIGHT>400) ? 3 : 2
  961. ### Text replacement
  962. text.gsub!(/\\\\/,"\5")
  963. if $game_actors
  964. text.gsub!(/\\[Nn]\[([1-8])\]/){
  965. m=$1.to_i
  966. next $game_actors[m].name
  967. }
  968. end
  969. text.gsub!(/\\[Ss][Ii][Gg][Nn]\[([^\]]*)\]/){
  970. next "\\op\\cl\\ts[]\\w["+$1+"]"
  971. }
  972. text.gsub!(/\\[Pp][Nn]/,$Trainer.name) if $Trainer
  973. text.gsub!(/\\[Pp][Mm]/,_INTL("${1}",$Trainer.money)) if $Trainer
  974. text.gsub!(/\\[Nn]/,"\n")
  975. text.gsub!(/\\\[([0-9A-Fa-f]{8,8})\]/){ "<c2="+$1+">" }
  976. text.gsub!(/\\[Pp][Gg]/,"")
  977. text.gsub!(/\\[Pp][Oo][Gg]/,"")
  978. text.gsub!(/\\[Bb]/,"<c2=6546675A>")
  979. text.gsub!(/\\[Rr]/,"<c2=043C675A>")
  980. text.gsub!(/\\1/,"\1")
  981. colortag=""
  982. isDarkSkin=isDarkWindowskin(msgwindow.windowskin)
  983. if ($game_message && $game_message.background>0) ||
  984. ($game_system && $game_system.respond_to?("message_frame") &&
  985. $game_system.message_frame != 0)
  986. colortag=getSkinColor(msgwindow.windowskin,0,true)
  987. else
  988. colortag=getSkinColor(msgwindow.windowskin,0,isDarkSkin)
  989. end
  990. text.gsub!(/\\[Cc]\[([0-9]+)\]/){
  991. m=$1.to_i
  992. next getSkinColor(msgwindow.windowskin,m,isDarkSkin)
  993. }
  994. begin
  995. last_text = text.clone
  996. text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  997. end until text == last_text
  998. begin
  999. last_text = text.clone
  1000. text.gsub!(/\\[Ll]\[([0-9]+)\]/) {
  1001. linecount=[1,$1.to_i].max;
  1002. next ""
  1003. }
  1004. end until text == last_text
  1005. text=colortag+text
  1006. ### Controls
  1007. textchunks=[]
  1008. controls=[]
  1009. while text[/(?:\\([WwFf]|[Ff][Ff]|[Tt][Ss]|[Cc][Ll]|[Mm][Ee]|[Ss][Ee]|[Ww][Tt]|[Ww][Tt][Nn][Pp]|[Cc][Hh])\[([^\]]*)\]|\\([Gg]|[Cc][Nn]|[Ww][Dd]|[Ww][Mm]|[Oo][Pp]|[Cc][Ll]|[Ww][Uu]|[\.]|[\|]|[\!]|[\x5E])())/i]
  1010. textchunks.push($~.pre_match)
  1011. if $~[1]
  1012. controls.push([$~[1].downcase,$~[2],-1])
  1013. else
  1014. controls.push([$~[3].downcase,"",-1])
  1015. end
  1016. text=$~.post_match
  1017. end
  1018. textchunks.push(text)
  1019. for chunk in textchunks
  1020. chunk.gsub!(/\005/,"\\")
  1021. end
  1022. textlen=0
  1023. for i in 0...controls.length
  1024. control=controls[i][0]
  1025. if control=="wt" || control=="wtnp" || control=="." || control=="|"
  1026. textchunks[i]+="\2"
  1027. elsif control=="!"
  1028. textchunks[i]+="\1"
  1029. end
  1030. textlen+=toUnformattedText(textchunks[i]).scan(/./m).length
  1031. controls[i][2]=textlen
  1032. end
  1033. text=textchunks.join("")
  1034. unformattedText=toUnformattedText(text)
  1035. signWaitCount=0
  1036. haveSpecialClose=false
  1037. specialCloseSE=""
  1038. for i in 0...controls.length
  1039. control=controls[i][0]
  1040. param=controls[i][1]
  1041. if control=="f"
  1042. facewindow.dispose if facewindow
  1043. facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
  1044. elsif control=="op"
  1045. signWaitCount=21
  1046. elsif control=="cl"
  1047. text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
  1048. haveSpecialClose=true
  1049. specialCloseSE=param
  1050. elsif control=="se" && controls[i][2]==0
  1051. startSE=param
  1052. controls[i]=nil
  1053. elsif control=="ff"
  1054. facewindow.dispose if facewindow
  1055. facewindow=FaceWindowVX.new(param)
  1056. elsif control=="ch"
  1057. cmds=param.clone
  1058. cmdvariable=pbCsvPosInt!(cmds)
  1059. cmdIfCancel=pbCsvField!(cmds).to_i
  1060. commands=[]
  1061. while cmds.length>0
  1062. commands.push(pbCsvField!(cmds))
  1063. end
  1064. elsif control=="wtnp" || control=="^"
  1065. text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
  1066. end
  1067. end
  1068. if startSE!=nil
  1069. pbSEPlay(pbStringToAudioFile(startSE))
  1070. elsif signWaitCount==0 && letterbyletter
  1071. pbPlayDecisionSE()
  1072. end
  1073. ########## Position message window ##############
  1074. pbRepositionMessageWindow(msgwindow,linecount)
  1075. if $game_message && $game_message.background==1
  1076. msgback=IconSprite.new(0,msgwindow.y,msgwindow.viewport)
  1077. msgback.z=msgwindow.z-1
  1078. msgback.setBitmap("Graphics/System/MessageBack")
  1079. end
  1080. if facewindow
  1081. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1082. facewindow.viewport=msgwindow.viewport
  1083. facewindow.z=msgwindow.z
  1084. end
  1085. atTop=(msgwindow.y==0)
  1086. ########## Show text #############################
  1087. msgwindow.text=text
  1088. Graphics.frame_reset if Graphics.frame_rate>40
  1089. begin
  1090. if signWaitCount>0
  1091. signWaitCount-=1
  1092. if atTop
  1093. msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
  1094. else
  1095. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
  1096. end
  1097. end
  1098. for i in 0...controls.length
  1099. if controls[i] && controls[i][2]<=msgwindow.position && msgwindow.waitcount==0
  1100. control=controls[i][0]
  1101. param=controls[i][1]
  1102. if control=="f"
  1103. facewindow.dispose if facewindow
  1104. facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
  1105. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1106. facewindow.viewport=msgwindow.viewport
  1107. facewindow.z=msgwindow.z
  1108. elsif control=="ts"
  1109. if param==""
  1110. msgwindow.textspeed=-999
  1111. else
  1112. msgwindow.textspeed=param.to_i
  1113. end
  1114. elsif control=="ff"
  1115. facewindow.dispose if facewindow
  1116. facewindow=FaceWindowVX.new(param)
  1117. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1118. facewindow.viewport=msgwindow.viewport
  1119. facewindow.z=msgwindow.z
  1120. elsif control=="g" # Display gold window
  1121. goldwindow.dispose if goldwindow
  1122. goldwindow=pbDisplayGoldWindow(msgwindow)
  1123. elsif control=="cn" # Display coins window
  1124. coinwindow.dispose if coinwindow
  1125. coinwindow=pbDisplayCoinsWindow(msgwindow,goldwindow)
  1126. elsif control=="wu"
  1127. msgwindow.y=0
  1128. atTop=true
  1129. msgback.y=msgwindow.y if msgback
  1130. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1131. msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
  1132. elsif control=="wm"
  1133. atTop=false
  1134. msgwindow.y=(DEFAULTSCREENHEIGHT/2)-(msgwindow.height/2)
  1135. msgback.y=msgwindow.y if msgback
  1136. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1137. elsif control=="wd"
  1138. atTop=false
  1139. msgwindow.y=(DEFAULTSCREENHEIGHT)-(msgwindow.height)
  1140. msgback.y=msgwindow.y if msgback
  1141. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1142. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
  1143. elsif control=="."
  1144. msgwindow.waitcount+=Graphics.frame_rate/4
  1145. elsif control=="|"
  1146. msgwindow.waitcount+=Graphics.frame_rate
  1147. elsif control=="wt" # Wait
  1148. param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
  1149. msgwindow.waitcount+=param.to_i*2
  1150. elsif control=="w" # Windowskin
  1151. if param==""
  1152. msgwindow.windowskin=nil
  1153. else
  1154. msgwindow.setSkin("Graphics/Windowskins/#{param}")
  1155. end
  1156. msgwindow.width=msgwindow.width # Necessary evil
  1157. elsif control=="^" # Wait, no pause
  1158. autoresume=true
  1159. elsif control=="wtnp" # Wait, no pause
  1160. param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
  1161. msgwindow.waitcount=param.to_i*2
  1162. autoresume=true
  1163. elsif control=="se" # Play SE
  1164. pbSEPlay(pbStringToAudioFile(param))
  1165. elsif control=="me" # Play ME
  1166. pbMEPlay(pbStringToAudioFile(param))
  1167. end
  1168. controls[i]=nil
  1169. end
  1170. end
  1171. break if !letterbyletter
  1172. Graphics.update
  1173. Input.update
  1174. facewindow.update if facewindow
  1175. if $DEBUG && Input.trigger?(Input::F6)
  1176. pbRecord(unformattedText)
  1177. end
  1178. if autoresume && msgwindow.waitcount==0
  1179. msgwindow.resume if msgwindow.busy?
  1180. break if !msgwindow.busy?
  1181. end
  1182. if (Input.trigger?(Input::C) || Input.trigger?(Input::B))
  1183. if msgwindow.busy?
  1184. pbPlayDecisionSE() if msgwindow.pausing?
  1185. msgwindow.resume
  1186. else
  1187. break if signWaitCount==0
  1188. end
  1189. end
  1190. msgwindow.update
  1191. yield if block_given?
  1192. end until (!letterbyletter || commandProc || commands) && !msgwindow.busy?
  1193. Input.update # Must call Input.update again to avoid extra triggers
  1194. msgwindow.letterbyletter=oldletterbyletter
  1195. if commands
  1196. $game_variables[cmdvariable]=Kernel.pbShowCommands(
  1197. msgwindow,commands,cmdIfCancel)
  1198. $game_map.need_refresh = true if $game_map
  1199. end
  1200. if commandProc
  1201. ret=commandProc.call(msgwindow)
  1202. end
  1203. msgback.dispose if msgback
  1204. goldwindow.dispose if goldwindow
  1205. coinwindow.dispose if coinwindow
  1206. facewindow.dispose if facewindow
  1207. if haveSpecialClose
  1208. pbSEPlay(pbStringToAudioFile(specialCloseSE))
  1209. atTop=(msgwindow.y==0)
  1210. for i in 0..20
  1211. if atTop
  1212. msgwindow.y=-(msgwindow.height*(i)/20)
  1213. else
  1214. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-i)/20)
  1215. end
  1216. Graphics.update
  1217. Input.update
  1218. msgwindow.update
  1219. end
  1220. end
  1221. return ret
  1222. end
  1223.  
  1224. def Kernel.pbConfirmMessageBase(message,&block)
  1225. return (Kernel.pbMessageBase(message,[_INTL("Yes"),_INTL("No")],2,&block)==0)
  1226. end
  1227.  
  1228. class PokemonDecoration
  1229. def initialize; end
  1230.  
  1231. def pbStartScene
  1232. @viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
  1233. @viewport.z=999999
  1234. @sprites={}
  1235. end
  1236.  
  1237. def getSecretArrow
  1238. if $Trainer.gender==1
  1239. bitmapname=_INTL("Graphics/Pictures/secretBaseArrow_Green{1}",$Trainer.metaID)
  1240. return BitmapCache.load_bitmap(bitmapname)
  1241. else
  1242. bitmapname=_INTL("Graphics/Pictures/secretBaseArrow_Red{1}",$Trainer.metaID)
  1243. return BitmapCache.load_bitmap(bitmapname)
  1244. end
  1245. end
  1246.  
  1247. def getMapPassable(x,y)
  1248. for event in $game_map.events.values
  1249. return false if event.x==x && event.y==y
  1250. end
  1251. if $game_map.data[x,y,0]
  1252. return false if isPosterWall($game_map.data[x,y,0])
  1253. end
  1254. return $game_map.passable?(x,y,0)
  1255. end
  1256.  
  1257. def isPosterWall(tileid)
  1258. #map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1259. #tilesets=load_data("Data/Tilesets.rxdata")
  1260. #tileset=tilesets[map.tileset_id]
  1261. #priorities=tileset.priorities
  1262. #passages=tileset.passages
  1263. #pass=[]
  1264. #pass[0]=passages[tileid] & 0x01 == 0x01 # Down arrow
  1265. #pass[1]=passages[tileid] & 0x02 == 0x02 # Left arrow
  1266. #pass[2]=passages[tileid] & 0x04 == 0x04 # Up arrow
  1267. #pass[3]=passages[tileid] & 0x08 == 0x08 # Up arrow
  1268. #if pass[0]==true && pass[1]==false &&
  1269. # pass[2]==false && pass[3]==false
  1270. # return true
  1271. #end
  1272. if $game_map.terrain_tag_id(tileid)==WALLTERRAINTAG
  1273. return true
  1274. end
  1275. return false
  1276. end
  1277.  
  1278. def canPlaceItem?(item,pos)
  1279. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1280. tilesets=load_data("Data/Tilesets.rxdata")
  1281. tileset=tilesets[map.tileset_id]
  1282. priorities=tileset.priorities
  1283. passages=tileset.passages
  1284. width=baseItemWidth(item)/32
  1285. height=baseItemHeight(item)/32
  1286.  
  1287. # Do not put anything above player!
  1288. for w in 0...width
  1289. for h in 0...height
  1290. tileid=baseItemTileid(item)+w+(h*8)
  1291. notblocked=passages[tileid] & 0x0f == 0x0f
  1292. if notblocked && pos[0]+w==$game_player.x && pos[1]+h==$game_player.y
  1293. return false
  1294. end
  1295. end
  1296. end
  1297. # Avoids to put items above others
  1298. if !DOLLSEVERYWHERE && !(isADoll?(item) || isACushion?(item))
  1299. for e in 0...height
  1300. tileid=baseItemTileid(item)+(e*8)
  1301. prio=priorities[tileid]
  1302. #prio=1 if passages[tileid] & 0x80 == 0x80
  1303. next if prio>0
  1304. for i in 0...width
  1305. tileid=baseItemTileid(item)+i+(e*8)
  1306. prio=priorities[tileid]
  1307. #prio=1 if passages[tileid] & 0x80 == 0x80
  1308. pass=passages[tileid] & 0x0f == 0x0f
  1309. if $game_map.data[pos[0]+i,pos[1]+e,1]!=0 && prio==0
  1310. # Check for holes
  1311. isahole=thereIsAHole?([pos[0]+i,pos[1]+e])
  1312. if isahole && isABoard?(item)
  1313. holewidth=isahole[0]
  1314. holeheight=isahole[1]
  1315. positions=getTopLeftWithATileHole([pos[0]+i,pos[1]+e])
  1316. if positions[0]==pos[0] && positions[1]==pos[1] &&
  1317. holewidth==width && holeheight==height
  1318. return true
  1319. end
  1320. end
  1321. return false
  1322. elsif $game_map.data[pos[0]+i,pos[1]+e,2]!=0 && prio==0
  1323. topleft=getTopLeftWithATile(pos)
  1324. if !topleft.is_a?(Range)
  1325. if pos[1]+e!=topleft[1]
  1326. return false
  1327. end
  1328. end
  1329. end
  1330. end
  1331. end
  1332. end
  1333. # Check if it's a poster
  1334. if isAPoster?(item)
  1335. putInWall=true
  1336. for i in 0...width
  1337. for e in 0...height
  1338. tileid=baseItemTileid(item)+i+(e*8)
  1339. for w in 0...width
  1340. for h in 0...height
  1341. alreadyp=$game_map.data[pos[0]+w,pos[1]+h,1]
  1342. newp=isPosterWall($game_map.data[pos[0]+w,pos[1]+h,0])
  1343. if !newp || alreadyp>0
  1344. putInWall=false
  1345. end
  1346. end
  1347. end
  1348. return true if putInWall
  1349. return false
  1350. end
  1351. end
  1352. # Placing dolls only in mats and counter tiles
  1353. elsif isADoll?(item) || isACushion?(item)
  1354. placed=getItemIn(pos)
  1355. # If it's a mat or a counter tile and it's not an interactive one
  1356. if isAMat?(placed) && baseItemEvent(placed)==nil
  1357. return true
  1358. elsif isADesk?(placed) && baseItemEvent(placed)==nil
  1359. tileid=$game_map.data[pos[0],pos[1],1]
  1360. counter=passages[tileid] & 0x80 == 0x80
  1361. return true if counter
  1362. elsif DOLLSEVERYWHERE
  1363. newp=getMapPassable(pos[0],pos[1])
  1364. if $game_map.terrain_tag(pos[0],pos[1])==GROUNDDECORATION
  1365. return false # Avoid to put tiles in layer 0 decorations
  1366. end
  1367. return true if newp
  1368. end
  1369. return false
  1370. else
  1371. for i in 0...width
  1372. for e in 0...height
  1373. tileid=baseItemTileid(item)+i+(e*8)
  1374. prio=priorities[tileid]
  1375. pass=passages[tileid] & 0x0f == 0x0f
  1376. mappass=getMapPassable(pos[0]+i,pos[1]+e)
  1377. upasable=true
  1378. #counter=passages[tileid] & 0x80 == 0x80
  1379.  
  1380. # Is first line passable?
  1381. (0...width).each do |w|
  1382. np=getMapPassable(pos[0]+w,pos[1])
  1383. upasable=false if !np
  1384. end
  1385.  
  1386. # Make counter tiles priorities
  1387. if counter
  1388. upasable=false
  1389. prio=1
  1390. end
  1391.  
  1392. if !upasable && prio>0
  1393. (0...height).each do |h|
  1394. (0...width).each do |w|
  1395. # Tile to place data
  1396. tileplace=baseItemTileid(item)+w+(h*8)
  1397. tileprio=priorities[tileplace]
  1398. placep=passages[tileplace] & 0x0f == 0x0f
  1399. counter=passages[tileplace] & 0x80 == 0x80
  1400. #tileprio=1 if counter
  1401. # Tile in map data
  1402. if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
  1403. return false # Avoid to put tiles in layer 0 decorations
  1404. end
  1405. newp=getMapPassable(pos[0]+w,pos[1]+h)
  1406. return false if h==0 && !newp && tileprio==0
  1407. return false if h>0 && !newp
  1408. end
  1409. end
  1410. return true
  1411. elsif mappass
  1412. for w in 0...width
  1413. for h in 0...height
  1414. tileplace=baseItemTileid(item)+w+(h*8)
  1415. newp=getMapPassable(pos[0]+w,pos[1]+h)
  1416. tileprio=priorities[tileplace]
  1417. if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
  1418. return false # Avoid to put tiles in layer 0 decorations
  1419. end
  1420. #tileprio=1 if passages[tileplace] & 0x80 == 0x80
  1421. return false if !newp
  1422. end
  1423. end
  1424. return true
  1425. end
  1426. end
  1427. end
  1428. end
  1429. return false
  1430. end
  1431.  
  1432. # Get a placed item
  1433. def getItemIn(pos)
  1434. x=@pos[0]
  1435. y=@pos[1]
  1436. for i in 1...SECRETBASEITEMS.length
  1437. thisId=baseItemTileid(i)
  1438. width=baseItemWidth(i)/32
  1439. height=baseItemHeight(i)/32
  1440. (0...height).each do |h|
  1441. (0...width).each do |w|
  1442. actualTile=baseItemTileid(i)+w+(h*8)
  1443. for l in 0...3
  1444. if actualTile==$game_map.data[x,y,l]
  1445. return i
  1446. end
  1447. end
  1448. end
  1449. end
  1450. end
  1451. end
  1452.  
  1453. def getTopLeftWithATileHole(pos)
  1454. x=pos[0]
  1455. y=pos[1]
  1456. for i in 1...BASEHOLES.length
  1457. thisId=BASEHOLES[i][0]+384
  1458. width=BASEHOLES[i][1]
  1459. height=BASEHOLES[i][2]
  1460. (0...height).each do |h|
  1461. (0...width).each do |w|
  1462. actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
  1463. for l in 0...3
  1464. # Get top item
  1465. if actualTile==$game_map.data[x,y,l]
  1466. return getTopLeftHole(i,actualTile,x,y)
  1467. end
  1468. end
  1469. end
  1470. end
  1471. end
  1472. return false
  1473. end
  1474.  
  1475. def getTopLeftHole(item,actualTile,x,y)
  1476. width=BASEHOLES[item][1]
  1477. height=BASEHOLES[item][2]
  1478. (0...height).each do |h|
  1479. (0...width).each do |w|
  1480. if (BASEHOLES[item][0]+384)+w+(h*8)==actualTile
  1481. x-=w
  1482. y-=h
  1483. end
  1484. end
  1485. end
  1486. return [x,y]
  1487. end
  1488.  
  1489. def thereIsAHole?(pos)
  1490. x=pos[0]
  1491. y=pos[1]
  1492. for i in 1...BASEHOLES.length
  1493. thisId=BASEHOLES[i][0]+384
  1494. width=BASEHOLES[i][1]
  1495. height=BASEHOLES[i][2]
  1496. (0...height).each do |h|
  1497. (0...width).each do |w|
  1498. actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
  1499. for l in 0...3
  1500. # Get top item
  1501. if actualTile==$game_map.data[x,y,l]
  1502. return [width,height]
  1503. end
  1504. end
  1505. end
  1506. end
  1507. end
  1508. return false
  1509. end
  1510.  
  1511. # Get top left position of a tiled item
  1512. def getTopLeftWithATile(pos)
  1513. x=@pos[0]
  1514. y=@pos[1]
  1515. for i in 1...SECRETBASEITEMS.length
  1516. thisId=baseItemTileid(i)
  1517. width=baseItemWidth(i)/32
  1518. height=baseItemHeight(i)/32
  1519.  
  1520. (0...height).each do |h|
  1521. (0...width).each do |w|
  1522. actualTile=baseItemTileid(i)+w+(h*8)
  1523. for l in 0...3
  1524. # Get top item
  1525. if actualTile==$game_map.data[x,y,l]
  1526. return getTopLeft(i,actualTile,x,y)
  1527. end
  1528. end
  1529. end
  1530. end
  1531. end
  1532. end
  1533.  
  1534. # Delete items
  1535. def deleteItemIn(pos,delete=true)
  1536. x=pos[0]
  1537. y=pos[1]
  1538. isEvent=false
  1539.  
  1540. for i in 1...SECRETBASEITEMS.length
  1541. thisId=baseItemTileid(i)
  1542. width=baseItemWidth(i)/32
  1543. height=baseItemHeight(i)/32
  1544. # Check if there's an event
  1545. for event in $game_map.events.values
  1546. if !isEvent && event.is_a?(Game_BaseEvent) && event.x==x && event.y==y
  1547. isEvent=true
  1548. itemEvent=event
  1549. end
  1550. end
  1551. if isEvent
  1552. return true if !delete
  1553. deleteEvent(@pos)
  1554. return
  1555. else
  1556. (0...height).each do |h|
  1557. (0...width).each do |w|
  1558. actualTile=baseItemTileid(i)+w+(h*8)
  1559. # Get top item
  1560. tileMiddle=$game_map.data[x,y,1]
  1561. tileTop=$game_map.data[x,y,2]
  1562. # Delete top tile
  1563. if tileTop>0 && actualTile==tileTop
  1564. return true if !delete
  1565. # Delete item
  1566. topleft=getTopLeft(i,actualTile,x,y)
  1567. deleteTiledItem(i,topleft)
  1568. return
  1569. # Delete middle tile
  1570. elsif actualTile==tileMiddle && tileTop==0
  1571. return true if !delete
  1572. topleft=getTopLeft(i,actualTile,x,y)
  1573. # Delete item
  1574. if isABoard?(i) &&
  1575. $game_player.x>=topleft[0] && $game_player.x<topleft[0]+width &&
  1576. $game_player.y>=topleft[1] && $game_player.y<topleft[1]+height
  1577. Kernel.pbMessageBase("You can't delete this right now.")
  1578. else
  1579. deleteTiledItem(i,topleft)
  1580. end
  1581. return
  1582. end
  1583. end
  1584. end
  1585. end
  1586. end
  1587. return false if !delete
  1588. end
  1589.  
  1590. # Delete event
  1591. def deleteEvent(pos)
  1592. x=pos[0]
  1593. y=pos[1]
  1594. for event in $game_map.events.values
  1595. if event.x==x && event.y==y
  1596. thisEvent=event
  1597. end
  1598. end
  1599.  
  1600. return if thisEvent==nil
  1601.  
  1602. # Back item to PC
  1603. placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
  1604. for i in 0...placedInfo.length
  1605. actualItem=placedInfo[i]
  1606. if actualItem[0]==x && actualItem[1]==y &&
  1607. baseItemTileid(actualItem[2][0])==thisEvent.itemtileid
  1608. actualItem[2][1]=false
  1609. end
  1610. end
  1611.  
  1612. savedEvent=$PokemonGlobal.baseinfo[$game_map.map_id][0]
  1613. for i in 0...savedEvent.length+1
  1614. next if savedEvent[i]==nil
  1615. if savedEvent[i]==thisEvent
  1616. savedEvent[i]=nil
  1617. savedEvent.compact!
  1618.  
  1619. $game_map.reloadBaseEvents
  1620. copyMapData
  1621. return
  1622. end
  1623. end
  1624. end
  1625.  
  1626. # Delete a tiled item
  1627. def deleteTiledItem(item,pos)
  1628. x=pos[0]
  1629. y=pos[1]
  1630. width=baseItemWidth(item)/32
  1631. height=baseItemHeight(item)/32
  1632. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1633. tilesets=load_data("Data/Tilesets.rxdata")
  1634. tileset=tilesets[map.tileset_id]
  1635. priorities=tileset.priorities
  1636. passages=tileset.passages
  1637.  
  1638. # Back item to PC
  1639. placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
  1640. for i in 0...placedInfo.length
  1641. actualItem=placedInfo[i]
  1642. if actualItem[0]==x && actualItem[1]==y &&
  1643. baseItemTileid(actualItem[2][0])==baseItemTileid(item)
  1644. actualItem[2][1]=false
  1645. end
  1646. end
  1647.  
  1648. (0...height).each do |h|
  1649. (0...width).each do |w|
  1650. tileid=baseItemTileid(item)+w+(h*8)
  1651. layer=priorities[tileid]==0 ? 1 : 2
  1652. #layer=2 if passages[tileid] & 0x80 == 0x80
  1653. # Delete also decorations over a mat or a desk
  1654. if (isAMat?(item) || isADesk?(item)) && baseItemEvent(item)==nil
  1655. deleteEvent([x+w,y+h])
  1656. end
  1657. $game_map.data[x+w,y+h,layer]=map.data[x+w,y+h,layer]
  1658. end
  1659. end
  1660. end
  1661.  
  1662. # Get top left for deleting
  1663. def getTopLeft(item,actualTile,x,y)
  1664. width=baseItemWidth(item)/32
  1665. height=baseItemHeight(item)/32
  1666. (0...height).each do |h|
  1667. (0...width).each do |w|
  1668. if baseItemTileid(item)+w+(h*8)==actualTile
  1669. x-=w
  1670. y-=h
  1671. end
  1672. end
  1673. end
  1674. return [x,y]
  1675. end
  1676.  
  1677. def pbCreatePutAway
  1678. @sprites["map"]=DecorationMap.new(@viewport)
  1679. @sprites["item"]=ItemBaseSprite.new(@viewport)
  1680. @sprites["item"].bitmap=RPG::Cache.picture("secretBaseDeleter")
  1681.  
  1682. @rsprite=Sprite_Character.new(nil, $game_player)
  1683. @rsprite.dispose
  1684.  
  1685. @sprites["item"].x=x
  1686. @sprites["item"].y=y
  1687.  
  1688. @pos=[$game_player.x,$game_player.y]
  1689. @sprites["arrow"]=Sprite.new(@viewport)
  1690. @sprites["arrow"].bitmap=getSecretArrow
  1691. @sprites["arrow"].oy=@sprites["arrow"].bitmap.height
  1692. @sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
  1693. @sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
  1694.  
  1695. @sprites["item"].update
  1696. end
  1697.  
  1698. def pbPutAway
  1699. loop do
  1700. Graphics.update
  1701. Input.update
  1702. @sprites["item"].update
  1703. if Input.trigger?(Input::UP)
  1704. @sprites["map"].scroll[1]+=32
  1705. @sprites["map"].updateScrollPos
  1706. @pos[1]-=1
  1707. elsif Input.trigger?(Input::DOWN)
  1708. @sprites["map"].scroll[1]-=32
  1709. @sprites["map"].updateScrollPos
  1710. @pos[1]+=1
  1711. elsif Input.trigger?(Input::RIGHT)
  1712. @sprites["map"].scroll[0]-=32
  1713. @sprites["map"].updateScrollPos
  1714. @pos[0]+=1
  1715. elsif Input.trigger?(Input::LEFT)
  1716. @sprites["map"].scroll[0]+=32
  1717. @sprites["map"].updateScrollPos
  1718. @pos[0]-=1
  1719. elsif Input.trigger?(Input::C)
  1720. @sprites["item"].makeVisible
  1721. if !deleteItemIn(@pos,false)
  1722. Kernel.pbMessageBase("There is no decoration item here.")
  1723. else
  1724. if Kernel.pbConfirmMessageBase("Return this decoration to the PC?")
  1725. deleteItemIn(@pos)
  1726. @sprites["map"].reload
  1727. end
  1728. end
  1729. elsif Input.trigger?(Input::B)
  1730. break
  1731. end
  1732. end
  1733. @sprites["item"].dispose
  1734. @sprites["arrow"].dispose
  1735. @sprites["map"].dispose
  1736. end
  1737.  
  1738. def pbCreatePlaceItem(item)
  1739. @placed=false
  1740.  
  1741. @sprites["map"]=DecorationMap.new(@viewport)
  1742. @sprites["item"]=ItemBaseSprite.new(@viewport)
  1743. @sprites["item"].bitmap=getBaseItemBitmap(item[0])
  1744.  
  1745. @rsprite=Sprite_Character.new(nil, $game_player)
  1746. @rsprite.dispose
  1747.  
  1748. @sprites["item"].x=x
  1749. @sprites["item"].y=y
  1750.  
  1751. if baseItemEvent(item[0])!=nil
  1752. @sprites["item"].ox=@sprites["item"].bitmap.width/2-16
  1753. @sprites["item"].oy=@sprites["item"].bitmap.height-32
  1754. end
  1755.  
  1756. @pos=[$game_player.x,$game_player.y]
  1757. @sprites["arrow"]=Sprite.new(@viewport)
  1758. @sprites["arrow"].bitmap=getSecretArrow
  1759. @sprites["arrow"].oy=@sprites["arrow"].bitmap.height
  1760. @sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
  1761. @sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
  1762.  
  1763. @sprites["arrow"].x-=@sprites["item"].ox
  1764. @sprites["arrow"].y-=@sprites["item"].oy
  1765. @sprites["item"].update
  1766. end
  1767.  
  1768. def pbPlaceItem(item)
  1769. loop do
  1770. Graphics.update
  1771. Input.update
  1772. @sprites["item"].update
  1773. if Input.trigger?(Input::UP)
  1774. @sprites["map"].scroll[1]+=32
  1775. @sprites["map"].updateScrollPos
  1776. @pos[1]-=1
  1777. elsif Input.trigger?(Input::DOWN)
  1778. @sprites["map"].scroll[1]-=32
  1779. @sprites["map"].updateScrollPos
  1780. @pos[1]+=1
  1781. elsif Input.trigger?(Input::RIGHT)
  1782. @sprites["map"].scroll[0]-=32
  1783. @sprites["map"].updateScrollPos
  1784. @pos[0]+=1
  1785. elsif Input.trigger?(Input::LEFT)
  1786. @sprites["map"].scroll[0]+=32
  1787. @sprites["map"].updateScrollPos
  1788. @pos[0]-=1
  1789. elsif Input.trigger?(Input::C)
  1790. @sprites["item"].makeVisible
  1791. if canPlaceItem?(item[0],@pos)
  1792. placeItemInBase(item[0],@pos)
  1793. $PokemonGlobal.setPlacedInfo($game_map.map_id,@pos[0],@pos[1],item)
  1794. @placed=true
  1795. break
  1796. else
  1797. Kernel.pbMessageBase("It can't be placed here.")
  1798. $scene.disposeSpritesets
  1799. end
  1800. elsif Input.trigger?(Input::B)
  1801. @placed=false
  1802. break
  1803. end
  1804. end
  1805. @sprites["item"].dispose
  1806. @sprites["arrow"].dispose
  1807. @sprites["map"].dispose
  1808.  
  1809. return @placed
  1810. end
  1811.  
  1812. end
  1813.  
  1814. ####### Bitmap save
  1815. class Bitmap
  1816. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ppi', 'i')
  1817. def last_row_address
  1818. return 0 if disposed?
  1819. RtlMoveMemory.call(buf=[0].pack('L'), __id__*2+16, 4)
  1820. RtlMoveMemory.call(buf, buf.unpack('L')[0]+8 , 4)
  1821. RtlMoveMemory.call(buf, buf.unpack('L')[0]+16, 4)
  1822. buf.unpack('L')[0]
  1823. end
  1824. def bytesize
  1825. width * height * 4
  1826. end
  1827. def get_data
  1828. data = [].pack('x') * bytesize
  1829. RtlMoveMemory.call(data, last_row_address, data.bytesize)
  1830. data
  1831. end
  1832. def set_data(data)
  1833. RtlMoveMemory.call(last_row_address, data, data.bytesize)
  1834. end
  1835. def get_data_ptr
  1836. data = String.new
  1837. RtlMoveMemory.call(data.__id__*2, [0x2007].pack('L'), 4)
  1838. RtlMoveMemory.call(data.__id__*2+8, [bytesize,last_row_address].pack('L2'), 8)
  1839. def data.free() RtlMoveMemory.call(__id__*2, String.new, 16) end
  1840. return data unless block_given?
  1841. yield data ensure data.free
  1842. end
  1843. def _dump(level)
  1844. get_data_ptr do |data|
  1845. dump = Marshal.dump([width, height, Zlib::Deflate.deflate(data, 9)])
  1846. dump
  1847. end
  1848. end
  1849. def self._load(dump)
  1850. width, height, data = *Marshal.load(dump)
  1851. data.replace(Zlib::Inflate.inflate(data))
  1852. bitmap = new(width, height)
  1853. bitmap.set_data(data)
  1854. bitmap
  1855. end
  1856. def export(filename)
  1857. export_png("#{filename}.png")
  1858. end
  1859. def export_png(filename)
  1860. data, i = get_data, 0
  1861. (0).step(data.bytesize-4, 4) do |i|
  1862. data[i,3] = data[i,3].reverse!
  1863. end
  1864. deflate = Zlib::Deflate.new(9)
  1865. null_char, w4 = [].pack('x'), width*4
  1866. (data.bytesize-w4).step(0, -w4) {|i| deflate << null_char << data[i,w4]}
  1867. data.replace(deflate.finish)
  1868. deflate.close
  1869. File.open(filename, 'wb') do |file|
  1870. def file.write_chunk(chunk)
  1871. write([chunk.bytesize-4].pack('N'))
  1872. write(chunk)
  1873. write([Zlib.crc32(chunk)].pack('N'))
  1874. end
  1875. file.write("\211PNG\r\n\32\n")
  1876. file.write_chunk(['IHDR',width,height,8,6,0,0,0].pack('a4N2C5'))
  1877. file.write_chunk(data.insert(0, 'IDAT'))
  1878. file.write_chunk('IEND')
  1879. end
  1880. end
  1881. end
  1882.  
  1883. class String
  1884. alias getbyte []
  1885. alias setbyte []=
  1886. alias bytesize size
  1887. end
  1888.  
  1889. class Font
  1890. def marshal_dump() end
  1891. def marshal_load(dump) end
  1892. end
  1893.  
  1894. module Graphics
  1895. FindWindow = Win32API.new('user32', 'FindWindow' , 'pp' , 'i')
  1896. GetDC = Win32API.new('user32', 'GetDC' , 'i' , 'i')
  1897. ReleaseDC = Win32API.new('user32', 'ReleaseDC' , 'ii' , 'i')
  1898. BitBlt = Win32API.new('gdi32' , 'BitBlt' , 'iiiiiiiii', 'i')
  1899. CreateCompatibleBitmap = Win32API.new('gdi32' , 'CreateCompatibleBitmap', 'iii' , 'i')
  1900. CreateCompatibleDC = Win32API.new('gdi32' , 'CreateCompatibleDC' , 'i' , 'i')
  1901. DeleteDC = Win32API.new('gdi32' , 'DeleteDC' , 'i' , 'i')
  1902. DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i')
  1903. GetDIBits = Win32API.new('gdi32' , 'GetDIBits' , 'iiiiipi' , 'i')
  1904. SelectObject = Win32API.new('gdi32' , 'SelectObject' , 'ii' , 'i')
  1905. def self.snap_to_bitmap
  1906. bitmap = Bitmap.new(width, height)
  1907. info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
  1908. hDC = GetDC.call(hwnd)
  1909. bmp_hDC = CreateCompatibleDC.call(hDC)
  1910. bmp_hBM = CreateCompatibleBitmap.call(hDC, width, height)
  1911. bmp_obj = SelectObject.call(bmp_hDC, bmp_hBM)
  1912. BitBlt.call(bmp_hDC, 0, 0, width, height, hDC, 0, 0, 0xCC0020)
  1913. GetDIBits.call(bmp_hDC, bmp_hBM, 0, height, bitmap.last_row_address, info, 0)
  1914. SelectObject.call(bmp_hDC, bmp_obj)
  1915. DeleteObject.call(bmp_hBM)
  1916. DeleteDC.call(bmp_hDC)
  1917. ReleaseDC.call(hwnd, hDC)
  1918. bitmap
  1919. end
  1920.  
  1921. class << self
  1922. def hwnd() @hwnd ||= FindWindow.call('RGSS Player', nil) end
  1923. def width() 640 end unless method_defined?(:width)
  1924. def height() 480 end unless method_defined?(:height)
  1925. def export(filename=Time.now.strftime("snapshot %Y-%m-%d %Hh%Mm%Ss #{frame_count}"))
  1926. bitmap = snap_to_bitmap
  1927. bitmap.export(filename)
  1928. bitmap.dispose
  1929. end
  1930. alias save export
  1931. alias snapshot export
  1932. end
  1933. end
  1934. ####################
  1935.  
  1936. class ItemBaseSprite < RPG::Sprite
  1937. def initialize(*args)
  1938. super
  1939. @frameEffect=0
  1940. end
  1941.  
  1942. def makeVisible
  1943. self.visible=true
  1944. @frameEffect=0
  1945. end
  1946.  
  1947. def update
  1948. super
  1949. @frameEffect+=1
  1950. if @frameEffect==12
  1951. self.visible=false
  1952. elsif @frameEffect==24
  1953. self.visible=true
  1954. @frameEffect=0
  1955. end
  1956. end
  1957. end
  1958. class Window_PocketsList < Window_DrawableCommand
  1959. attr_accessor :stock
  1960.  
  1961. def initialize(stock,x,y,width,height,viewport=nil)
  1962. @stock=stock
  1963. super(x,y,width,height,viewport)
  1964. @baseColor=Color.new(88,88,80)
  1965. @shadowColor=Color.new(168,184,184)
  1966. @commands=@stock
  1967. end
  1968.  
  1969. def itemsInPocket
  1970. return @stock[self.index][1]>0
  1971. end
  1972.  
  1973. def itemCount
  1974. return @stock.length
  1975. end
  1976.  
  1977. def drawItem(index,count,rect)
  1978. pbSetSystemFont(self.contents) if @starting
  1979. rect=drawCursor(index,rect)
  1980. maxitems=@stock[index][2]
  1981. items=@stock[index][1]
  1982. pbDrawTextPositions(self.contents,[
  1983. [_INTL("{1}/{2}",items,maxitems),rect.width,rect.y,1,self.baseColor,self.shadowColor]
  1984. ])
  1985. end
  1986. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,
  1987. @stock[index][0],self.baseColor,self.shadowColor)
  1988. end
  1989. end
  1990.  
  1991. class Window_ItemListBase < Window_DrawableCommand
  1992. def initialize(stock,x,y,width,height,viewport=nil)
  1993. @stock=stock
  1994. @itemUsing=AnimatedBitmap.new("Graphics/Pictures/secretBaseUsing")
  1995. super(x,y,width,height,viewport)
  1996. @baseColor=Color.new(88,88,80)
  1997. @shadowColor=Color.new(168,184,184)
  1998. end
  1999.  
  2000. def itemCount
  2001. return @stock.length
  2002. end
  2003.  
  2004. def item
  2005. return self.index==itemCount-1 ? 0 : @stock[self.index][0]
  2006. end
  2007.  
  2008. def drawItem(index,count,rect)
  2009. textpos=[]
  2010. rect=drawCursor(index,rect)
  2011. ypos=rect.y
  2012. if index==itemCount-1
  2013. itemname=@stock[index]
  2014. else
  2015. itemname=baseItemName(@stock[index][0])
  2016. if @stock[index][1]
  2017. pbCopyBitmap(self.contents,@itemUsing.bitmap,rect.width-16,ypos+6)
  2018. end
  2019. end
  2020. textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
  2021. pbDrawTextPositions(self.contents,textpos)
  2022. end
  2023. end
  2024.  
  2025. class DecorateItem
  2026. def initialize
  2027. commands=[]
  2028. ret=-1
  2029. for i in 0...BASEBAGPOCKETS.length
  2030. pocket=BASEBAGPOCKETS[i]
  2031. items=$PokemonGlobal.basePocketLength(i)
  2032. commands.push([pocket[0],items,pocket[1]])
  2033. end
  2034. commands.push(["Cancel",-1,-1])
  2035. cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2036. cmdwindow.z=99999
  2037. cmdwindow.visible=true
  2038. cmdwindow.index=0
  2039. loop do
  2040. Graphics.update
  2041. Input.update
  2042. cmdwindow.update
  2043. if Input.trigger?(Input::C)
  2044. break if cmdwindow.index==cmdwindow.stock.length-1
  2045. if !cmdwindow.itemsInPocket
  2046. cmdwindow.visible=false
  2047. Kernel.pbMessage("There are no decorations.")
  2048. cmdwindow.visible=true
  2049. else
  2050. ret=cmdwindow.index
  2051. break
  2052. end
  2053. elsif Input.trigger?(Input::B)
  2054. ret=-1
  2055. break
  2056. end
  2057. end
  2058. cmdwindow.dispose
  2059. itemList(ret) if ret!=-1
  2060. end
  2061.  
  2062. def pbPrepareWindow(window)
  2063. window.visible=true
  2064. window.letterbyletter=false
  2065. end
  2066.  
  2067. def itemList(pocket)
  2068. ret=-1
  2069. pocket=$PokemonGlobal.getBasePocket(pocket)
  2070. items=[]
  2071. for i in 0...pocket.length
  2072. items.push(pocket[i])
  2073. end
  2074. items.push("Cancel")
  2075. cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2076. cmdwindow.index=0
  2077. cmdwindow.refresh
  2078. oldindex=cmdwindow.index
  2079. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2080. "Go back to the previous menu."
  2081. descwindow=Window_AdvancedTextPokemon.new(desc)
  2082. pbPrepareWindow(descwindow)
  2083. descwindow.visible=true
  2084. descwindow.x=Graphics.width/2
  2085. descwindow.y=DEFAULTSCREENHEIGHT-128
  2086. descwindow.width=Graphics.width/2
  2087. descwindow.height=128
  2088. descwindow.baseColor=Color.new(88,88,80)
  2089. descwindow.shadowColor=Color.new(168,184,184)
  2090.  
  2091. loop do
  2092. Graphics.update
  2093. Input.update
  2094. cmdwindow.update
  2095. if oldindex!=cmdwindow.index
  2096. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2097. "Go back to the previous menu."
  2098. descwindow.text=desc
  2099. oldindex=cmdwindow.index
  2100. end
  2101.  
  2102. if Input.trigger?(Input::C)
  2103. if cmdwindow.index==cmdwindow.itemCount-1
  2104. ret=-1
  2105. break
  2106. else
  2107. if pocket[cmdwindow.index][1]
  2108. descwindow.visible=false
  2109. cmdwindow.visible=false
  2110. Kernel.pbMessage("This is in use already.")
  2111. descwindow.visible=true
  2112. cmdwindow.visible=true
  2113. else
  2114. ret=cmdwindow.index
  2115. break
  2116. end
  2117. end
  2118. elsif Input.trigger?(Input::B)
  2119. ret=-1
  2120. break
  2121. end
  2122. end
  2123. cmdwindow.dispose
  2124. descwindow.dispose
  2125. if ret!=-1
  2126. startDecoration(pocket[ret],ret)
  2127. else
  2128. initialize
  2129. end
  2130. end
  2131.  
  2132. def startDecoration(item,itemnum)
  2133. scene=PokemonDecoration.new
  2134. scene.pbStartScene
  2135. scene.pbCreatePlaceItem(item)
  2136. placed=scene.pbPlaceItem(item)
  2137.  
  2138. if placed
  2139. item[1]=true
  2140. end
  2141. initialize
  2142. end
  2143. end
  2144.  
  2145. class TossItem
  2146. def initialize
  2147. commands=[]
  2148. ret=-1
  2149. for i in 0...BASEBAGPOCKETS.length
  2150. pocket=BASEBAGPOCKETS[i]
  2151. items=$PokemonGlobal.basePocketLength(i)
  2152. commands.push([pocket[0],items,pocket[1]])
  2153. end
  2154. commands.push(["Cancel",-1,-1])
  2155. cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2156. cmdwindow.z=99999
  2157. cmdwindow.visible=true
  2158. cmdwindow.index=0
  2159. loop do
  2160. Graphics.update
  2161. Input.update
  2162. cmdwindow.update
  2163. if Input.trigger?(Input::C)
  2164. break if cmdwindow.index==cmdwindow.stock.length-1
  2165. if !cmdwindow.itemsInPocket
  2166. cmdwindow.visible=false
  2167. Kernel.pbMessage("There are no decorations.")
  2168. cmdwindow.visible=true
  2169. else
  2170. ret=cmdwindow.index
  2171. break
  2172. end
  2173. elsif Input.trigger?(Input::B)
  2174. ret=-1
  2175. break
  2176. end
  2177. end
  2178. cmdwindow.dispose
  2179. itemList(ret) if ret!=-1
  2180. end
  2181.  
  2182. def pbPrepareWindow(window)
  2183. window.visible=true
  2184. window.letterbyletter=false
  2185. end
  2186.  
  2187. def itemList(pocketr)
  2188. ret=-1
  2189. pocket=$PokemonGlobal.getBasePocket(pocketr)
  2190. items=[]
  2191. for i in 0...pocket.length
  2192. items.push(pocket[i])
  2193. end
  2194. items.push("Cancel")
  2195. cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2196. cmdwindow.index=0
  2197. cmdwindow.refresh
  2198. oldindex=cmdwindow.index
  2199. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2200. "Go back to the previous menu."
  2201. descwindow=Window_AdvancedTextPokemon.new(desc)
  2202. pbPrepareWindow(descwindow)
  2203. descwindow.visible=true
  2204. descwindow.x=Graphics.width/2
  2205. descwindow.y=DEFAULTSCREENHEIGHT-128
  2206. descwindow.width=Graphics.width/2
  2207. descwindow.height=128
  2208. descwindow.baseColor=Color.new(88,88,80)
  2209. descwindow.shadowColor=Color.new(168,184,184)
  2210.  
  2211. loop do
  2212. Graphics.update
  2213. Input.update
  2214. cmdwindow.update
  2215. if oldindex!=cmdwindow.index
  2216. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2217. "Go back to the previous menu."
  2218. descwindow.text=desc
  2219. oldindex=cmdwindow.index
  2220. end
  2221.  
  2222. if Input.trigger?(Input::C)
  2223. if cmdwindow.index==cmdwindow.itemCount-1
  2224. ret=-1
  2225. break
  2226. else
  2227. if pocket[cmdwindow.index][1]
  2228. descwindow.visible=false
  2229. cmdwindow.visible=false
  2230. Kernel.pbMessage("This decoration is in use.\nIt can't be thrown away.")
  2231. descwindow.visible=true
  2232. cmdwindow.visible=true
  2233. else
  2234. ret=cmdwindow.index
  2235. break
  2236. end
  2237. end
  2238. elsif Input.trigger?(Input::B)
  2239. ret=-1
  2240. break
  2241. end
  2242. end
  2243.  
  2244. cmdwindow.dispose
  2245. descwindow.dispose
  2246.  
  2247. if ret!=-1 # Item selected
  2248. n=$PokemonGlobal.getBasePocket(pocketr)
  2249. itemname=baseItemName(n[ret][0])
  2250. if Kernel.pbConfirmMessage(_INTL("This {1} will be discarded\nIs that okay?",itemname))
  2251. n.delete_at(ret)
  2252. Kernel.pbMessage("The decoration item was thrown away.")
  2253. itemList(pocketr)
  2254. else
  2255. initialize # Back
  2256. end
  2257. else # Back
  2258. initialize
  2259. end
  2260.  
  2261. end
  2262.  
  2263. end
  2264.  
  2265. class DecorationPC
  2266. def shouldShow?
  2267. return true
  2268. end
  2269.  
  2270. def access
  2271. loop do
  2272. command=Kernel.pbShowCommandsWithHelp(nil,
  2273. [_INTL("Decorate"),
  2274. _INTL("Put away"),
  2275. _INTL("Toss"),
  2276. _INTL("Cancel")],
  2277. [_INTL("Put out the selected decoration item."),
  2278. _INTL("Store the chosen decoration in the PC."),
  2279. _INTL("Throw away unwanted decorations."),
  2280. _INTL("Go back to the previous menu.")],-1
  2281. )
  2282. if command==0
  2283. scene=DecorateItem.new
  2284. elsif command==1
  2285. scene=PokemonDecoration.new
  2286. scene.pbStartScene
  2287. scene.pbCreatePutAway
  2288. scene.pbPutAway
  2289. elsif command==2
  2290. scebe=TossItem.new
  2291. else
  2292. break
  2293. end
  2294. end
  2295. end
  2296. end
  2297.  
  2298. class PackUpPC
  2299. def shouldShow?
  2300. return true
  2301. end
  2302.  
  2303. def packup(eventid)
  2304. #$scene.disposeSpritesets
  2305. # Reload the original map data
  2306. $game_map.backToOriginal
  2307.  
  2308. # Back all items to pc
  2309. for p in 0...BASEBAGPOCKETS.length
  2310. pocket=$PokemonGlobal.getBasePocket(p)
  2311. for i in 0...pocket.length
  2312. pocket[i][1]=false
  2313. end
  2314. end
  2315. #$scene.createSpritesets
  2316.  
  2317. $PokemonGlobal.installed=false
  2318. $PokemonGlobal.mybaseid=-1
  2319. $PokemonGlobal.mybaselocation=-1
  2320.  
  2321. $game_self_switches[[$game_map.map_id,eventid,"B"]]=true
  2322. $game_map.need_refresh=true
  2323. end
  2324.  
  2325. def access
  2326. Kernel.pbMessage(_INTL("All decorations and furniture in your Secret Base will be returned to your PC.\1"))
  2327. if !Kernel.pbConfirmMessage(
  2328. _INTL("Is that okay?"))
  2329. return false
  2330. end
  2331. return true
  2332. end
  2333. end
  2334.  
  2335. def pbSecretBasePC
  2336. copyMapData
  2337. Kernel.pbMessage(_INTL("\\se[accesspc]{1} booted up the PC.",$Trainer.name))
  2338. loop do
  2339. commands=["Decoration","Pack up","Exit"]
  2340. command=Kernel.pbMessage(_INTL("What would you like to do?"),
  2341. commands,commands.length)
  2342. if command==0
  2343. scene=DecorationPC.new
  2344. scene.access
  2345. elsif command==1
  2346. scene=PackUpPC.new
  2347. if scene.access
  2348. scene.packup(get_character(0).id)
  2349. break
  2350. end
  2351. else
  2352. pbSEPlay("computerclose")
  2353. break
  2354. end
  2355. end
  2356. copyMapData
  2357. end
  2358.  
  2359. #===============================================================================
  2360. # Mart system
  2361. #===============================================================================
  2362.  
  2363. class Window_BaseMart < Window_DrawableCommand
  2364. def initialize(stock,x,y,width,height,viewport=nil)
  2365. @stock=stock
  2366. super(x,y,width,height,viewport)
  2367. @baseColor=Color.new(88,88,80)
  2368. @shadowColor=Color.new(168,184,184)
  2369. self.windowskin=nil
  2370. end
  2371.  
  2372. def itemCount
  2373. return @stock.length+1
  2374. end
  2375.  
  2376. def item
  2377. return self.index>[email protected] ? 0 : @stock[self.index]
  2378. end
  2379.  
  2380. def getDisplayPrice(id)
  2381. price=baseItemCost(id)
  2382. return _ISPRINTF("${1:d}",price)
  2383. end
  2384.  
  2385. def drawItem(index,count,rect)
  2386. textpos=[]
  2387. rect=drawCursor(index,rect)
  2388. ypos=rect.y
  2389. if index==count-1
  2390. textpos.push([_INTL("CANCEL"),rect.x,ypos+2,false,
  2391. self.baseColor,self.shadowColor])
  2392. else
  2393. item=@stock[index]
  2394. itemname=baseItemName(item)
  2395. qty=getDisplayPrice(item)
  2396. sizeQty=self.contents.text_size(qty).width
  2397. xQty=rect.x+rect.width-sizeQty-2-16
  2398. textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
  2399. textpos.push([qty,xQty,ypos+2,false,self.baseColor,self.shadowColor])
  2400. end
  2401. pbDrawTextPositions(self.contents,textpos)
  2402. end
  2403. end
  2404.  
  2405. def pbBottomLeftLinesScreen(window,lines,width=nil)
  2406. window.x=0
  2407. window.width=width ? width : Graphics.width
  2408. window.height=(window.borderY rescue 32)+lines*32
  2409. window.y=DEFAULTSCREENHEIGHT-window.height
  2410. end
  2411.  
  2412.  
  2413. class SecretBaseMartScene
  2414.  
  2415. def update
  2416. pbUpdateSpriteHash(@sprites)
  2417. end
  2418.  
  2419. def pbPrepareWindow(window)
  2420. window.visible=true
  2421. window.letterbyletter=false
  2422. end
  2423.  
  2424. def initialize(stock)
  2425. pbScrollMap(6,3,5)
  2426. @adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
  2427. @viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
  2428. @viewport.z=99999
  2429. @sprites={}
  2430. @sprites["background"]=IconSprite.new(0,0,@viewport)
  2431. @sprites["background"].setBitmap("Graphics/Pictures/secretMartScreen")
  2432. @sprites["itemwindow"]=Window_BaseMart.new(stock,
  2433. Graphics.width-266,12,278,DEFAULTSCREENHEIGHT-32)
  2434. @sprites["itemwindow"].viewport=@viewport
  2435. @sprites["itemwindow"].index=0
  2436. @sprites["itemwindow"].refresh
  2437.  
  2438. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
  2439. pbPrepareWindow(@sprites["itemtextwindow"])
  2440. @sprites["itemtextwindow"].y=DEFAULTSCREENHEIGHT-112
  2441. @sprites["itemtextwindow"].width=Graphics.width/2
  2442. @sprites["itemtextwindow"].height=128
  2443. @sprites["itemtextwindow"].baseColor=Color.new(248,248,248)
  2444. @sprites["itemtextwindow"].shadowColor=Color.new(0,0,0)
  2445. @sprites["itemtextwindow"].visible=true
  2446. @sprites["itemtextwindow"].viewport=@viewport
  2447. @sprites["itemtextwindow"].windowskin=nil
  2448.  
  2449. @sprites["helpwindow"]=Window_AdvancedTextPokemon.new("")
  2450. pbPrepareWindow(@sprites["helpwindow"])
  2451. @sprites["helpwindow"].visible=false
  2452. @sprites["helpwindow"].viewport=@viewport
  2453. pbBottomLeftLinesScreen(@sprites["helpwindow"],1)
  2454.  
  2455. @sprites["moneywindow"]=Window_AdvancedTextPokemon.new("")
  2456. pbPrepareWindow(@sprites["moneywindow"])
  2457. @sprites["moneywindow"].setSkin("Graphics/Windowskins/goldskin")
  2458. @sprites["moneywindow"].visible=true
  2459. @sprites["moneywindow"].viewport=@viewport
  2460. @sprites["moneywindow"].x=0
  2461. @sprites["moneywindow"].y=0
  2462. @sprites["moneywindow"].width=190
  2463. @sprites["moneywindow"].height=96
  2464. @sprites["moneywindow"].baseColor=Color.new(88,88,80)
  2465. @sprites["moneywindow"].shadowColor=Color.new(168,184,184)
  2466. pbDeactivateWindows(@sprites)
  2467. pbUpdate
  2468. end
  2469.  
  2470. def pbUpdate
  2471. @sprites["itemicon"].dispose if @sprites["itemicon"]
  2472. iconbitmap=(@sprites["itemwindow"].item==0) ? BitmapCache.load_bitmap("Graphics/Icons/itemBack") :
  2473. getBaseItemBitmap(@sprites["itemwindow"].item)
  2474. @sprites["itemicon"]=PictureWindow.new(iconbitmap)
  2475. @sprites["itemicon"].viewport=@viewport
  2476. @sprites["itemicon"].x=4
  2477. @sprites["itemicon"].y=278-@sprites["itemicon"].height
  2478. @sprites["moneywindow"].text=_INTL("Money:\n<r>${1}",@adapter.getMoney())
  2479.  
  2480. @sprites["itemtextwindow"].text=(@sprites["itemwindow"].item==0) ? _INTL("Quit shopping.") :
  2481. baseItemDesc(@sprites["itemwindow"].item)
  2482. end
  2483.  
  2484. def pbEndScene
  2485. pbDisposeSpriteHash(@sprites)
  2486. pbScrollMap(4,3,5)
  2487. pbWait(1)
  2488. end
  2489.  
  2490. def pbDisplayPaused(msg)
  2491. cw=@sprites["helpwindow"]
  2492. cw.letterbyletter=true
  2493. cw.text=msg
  2494. pbBottomLeftLinesScreen(cw,2)
  2495. cw.visible=true
  2496. i=0
  2497. pbPlayDecisionSE()
  2498. loop do
  2499. Graphics.update
  2500. Input.update
  2501. wasbusy=cw.busy?
  2502. self.update
  2503. if !cw.busy? && wasbusy
  2504. pbUpdate
  2505. end
  2506. if Input.trigger?(Input::C) && cw.resume && !cw.busy?
  2507. @sprites["helpwindow"].visible=false
  2508. return
  2509. end
  2510. end
  2511. end
  2512.  
  2513. def pbChooseBuyItem
  2514. oldindex=@sprites["itemwindow"].index
  2515. pbActivateWindow(@sprites,"itemwindow"){
  2516. loop do
  2517. if oldindex!=@sprites["itemwindow"].index
  2518. pbUpdate
  2519. oldindex=@sprites["itemwindow"].index
  2520. end
  2521. Graphics.update
  2522. Input.update
  2523. self.update
  2524. if Input.trigger?(Input::C)
  2525. return @sprites["itemwindow"].item
  2526. elsif Input.trigger?(Input::B)
  2527. return 0
  2528. end
  2529. end
  2530. }
  2531. end
  2532.  
  2533. end
  2534.  
  2535. class SecretBaseMartScreen
  2536. def initialize(scene)
  2537. @scene=scene
  2538. @adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
  2539. end
  2540.  
  2541. def pbDisplayPaused(msg)
  2542. return @scene.pbDisplayPaused(msg)
  2543. end
  2544.  
  2545. def pbBuyScreen
  2546. loop do
  2547. if @item>0
  2548. itemname=baseItemName(@item)
  2549. price=baseItemCost(@item)
  2550. if @adapter.getMoney()<price
  2551. pbDisplayPaused(_INTL("You don't have enough money."))
  2552. next
  2553. else
  2554. itempocket=baseItemPocket(@item)
  2555. if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
  2556. @adapter.setMoney(@adapter.getMoney()-price)
  2557. pbDisplayPaused(_INTL("Here you are!\r\nThank you!"))
  2558. pbGetBaseItem(@item)
  2559. next
  2560. else
  2561. pbDisplayPaused(_INTL("The space for {1} is full.",itemname))
  2562. next
  2563. end
  2564. end
  2565. else
  2566. break
  2567. end
  2568. end
  2569. @scene.pbEndScene
  2570. end
  2571. end
  2572.  
  2573. def pbSecretBaseMart(stock,speech=nil)
  2574. for i in 0...stock.length
  2575. if stock[i].is_a?(String)
  2576. stock[i]=getBaseItemByName(stock[i])
  2577. end
  2578. end
  2579. stock.compact!
  2580. commands=[]
  2581. cmdBuy=-1
  2582. cmdSell=-1
  2583. cmdQuit=-1
  2584. commands[cmdBuy=commands.length]=_INTL("BUY")
  2585. commands[cmdQuit=commands.length]=_INTL("QUIT")
  2586. cmd=Kernel.pbMessage(
  2587. speech ? speech : _INTL("Welcome!\r\nHow may I serve you?"),
  2588. commands,cmdQuit+1)
  2589. loop do
  2590. if cmdBuy>=0 && cmd==cmdBuy
  2591. sscene=SecretBaseMartScene.new(stock)
  2592. sscreen=SecretBaseMartScreen.new(sscene)
  2593. sscreen.pbBuyScreen
  2594. else
  2595. Kernel.pbMessage(_INTL("Please come again!"))
  2596. break
  2597. end
  2598. cmd=Kernel.pbMessage(
  2599. _INTL("Is there anything else I can help you with?"),commands,cmdQuit+1)
  2600. end
  2601. end
  2602.  
  2603. #===============================================================================
  2604. # Creating secret bases
  2605. #===============================================================================
  2606.  
  2607. def pbTeletransport(id,x,y)
  2608. Kernel.pbCancelVehicles
  2609. $game_temp.player_new_map_id=id
  2610. $game_temp.player_new_x=x
  2611. $game_temp.player_new_y=y
  2612. $game_temp.player_new_direction=8
  2613. $scene.transfer_player
  2614. $game_map.autoplay
  2615. $game_map.refresh
  2616. end
  2617.  
  2618. def pbPackup(id)
  2619. for p in 0...BASEBAGPOCKETS.length
  2620. pocket=$PokemonGlobal.getBasePocket(p)
  2621. for i in 0...pocket.length
  2622. pocket[i][1]=false
  2623. end
  2624. end
  2625. $PokemonGlobal.installed=false
  2626. $PokemonGlobal.mybaseid=-1
  2627. $PokemonGlobal.mybaselocation=-1
  2628.  
  2629. if $PokemonGlobal.baseinfo && $PokemonGlobal.baseinfo[id]
  2630. $PokemonGlobal.baseinfo[id].clear
  2631. $PokemonGlobal.baseinfo[id]=nil
  2632. end
  2633. end
  2634.  
  2635. def pbNewSecretBase
  2636. newBaseId=get_character(0).name.gsub("SECRETBASE", "").to_i
  2637. movefinder=Kernel.pbCheckMove(BASEMOVENEEDED)
  2638. if movefinder && $PokemonGlobal.getBaseId>=0
  2639. Kernel.pbMessage("You may only make one secret base.\1")
  2640. mapname=pbGetMapNameFromId($PokemonGlobal.getBaseLocation)
  2641. movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
  2642. if Kernel.pbConfirmMessage(_INTL("Would you like to move from the secret base near {1}?",mapname))
  2643. Kernel.pbMessage(_INTL("All decorations and furniture in your secret base will be returned to your PC.\1"))
  2644. if Kernel.pbConfirmMessage(_INTL("Is that okay?"))
  2645. pbPackup($PokemonGlobal.getBaseId)
  2646. $PokemonGlobal.mybaseid=-1
  2647. $PokemonGlobal.mybaselocation=-1
  2648. $game_map.reloadEventsForBase
  2649. pbFlash(Color.new(0,0,0),16)
  2650. pbWait(18)
  2651. Kernel.pbMessage(_INTL("Moving complete.\1"))
  2652. if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
  2653. speciesname=!movefinder ? $Trainer.name : movefinder.name
  2654. Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
  2655. pbHiddenMoveAnimation(movefinder)
  2656. $PokemonGlobal.mybaseid=newBaseId
  2657. $PokemonGlobal.mybaselocation=$game_map.map_id
  2658. $PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
  2659. $game_map.reloadEventsForBase
  2660. return true
  2661. end
  2662. end
  2663. end
  2664. elsif movefinder
  2665. movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
  2666. if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
  2667. speciesname=!movefinder ? $Trainer.name : movefinder.name
  2668. Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
  2669. pbHiddenMoveAnimation(movefinder)
  2670. $PokemonGlobal.mybaseid=newBaseId
  2671. $PokemonGlobal.mybaselocation=$game_map.map_id
  2672. $PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
  2673. $game_map.reloadEventsForBase
  2674. return true
  2675. end
  2676. end
  2677. return false
  2678. end
  2679.  
  2680. def getDoorPos(map)
  2681. map=load_data(sprintf("Data/Map%03d.%s", map,$RPGVX ? "rvdata" : "rxdata"))
  2682. map.events.each do |i, event|
  2683. return [event.x, event.y] if event.name=="DOOR"
  2684. end
  2685. return [0,0]
  2686. end
  2687.  
  2688. def pbInstallingBase
  2689. if Kernel.pbConfirmMessage("Want to make your secret base here?")
  2690. $PokemonGlobal.installed=true
  2691. return true
  2692. else
  2693. $PokemonGlobal.installed=false
  2694. $PokemonGlobal.mybaseid=-1
  2695. $PokemonGlobal.mybaselocation=-1
  2696. return false
  2697. end
  2698. end
  2699.  
  2700. class Game_Map
  2701.  
  2702. def reloadEventsForBase
  2703. for i in @events.keys
  2704. if @events[i] && @events[i].rEvent && @events[i].rEvent.name.include?("SECRETBASE")
  2705. mapid=@events[i].rEvent.name.gsub("SECRETBASE", "").to_i
  2706. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2707. if mapid==$PokemonGlobal.getBaseId
  2708. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2709. end
  2710. @need_refresh=true
  2711. end
  2712. end
  2713. end
  2714.  
  2715. def searchForMyBase
  2716. for i in @map.events.keys
  2717. if @map.events[i].name.include?("SECRETBASE")
  2718. [email protected][i].name.gsub("SECRETBASE", "").to_i
  2719. @events[i][email protected][i].clone
  2720. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2721. if mapid==$PokemonGlobal.getBaseId
  2722. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2723. end
  2724. elsif @map.events[i].name.include?("BASEPC")
  2725. # Disable self switches
  2726. $game_self_switches[[@map_id,@events[i].id,"B"]]=false
  2727. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2728. # Make available pcs if it's your base
  2729. if $game_map.map_id==$PokemonGlobal.getBaseId && $PokemonGlobal.installed
  2730. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2731. end
  2732. end
  2733. end
  2734. @need_refresh=true
  2735. end
  2736. end
  2737.  
  2738. #===============================================================================
  2739. # ■ Functions for users
  2740. #===============================================================================
  2741. # - pbMakeNumericTileset(TILESETNAME)
  2742. # This will save in your project's folder the tileset you've selected
  2743. # with a numeric patron.
  2744. #===============================================================================
  2745.  
  2746. def pbGetBaseItem(itemid)
  2747. item=itemid
  2748. if itemid.is_a?(String)
  2749. item=getBaseItemByName(itemid)
  2750. end
  2751. itempocket=baseItemPocket(item)
  2752. if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
  2753. $PokemonGlobal.baseItemBag[itempocket].push([item,false])
  2754. return true
  2755. end
  2756. return false
  2757. end
  2758.  
  2759. def pbMakeNumericTileset(name)
  2760. file=sprintf("Graphics/Tilesets/"+name)
  2761. return if !FileTest.image_exist?(file)
  2762. tileset=BitmapCache.load_bitmap(file)
  2763. numericSet=tileset.clone
  2764. pbSetSystemFont(numericSet)
  2765. numericSet.font.size=21
  2766. for width in 0...numericSet.width/32
  2767. for height in 0...numericSet.height/32
  2768. number=(width+(height*8)).to_s
  2769. nsize=numericSet.text_size(number)
  2770. text=[[
  2771. number,(width+1)*32-16,height*32,2,Color.new(255,0,0),Color.new(0,0,0)
  2772. ]]
  2773. pbDrawTextPositions(numericSet,text)
  2774. end
  2775. end
  2776. numericSet.export(sprintf(name+"_numeric"))
  2777. Kernel.pbMessage(_INTL("Saved in game's folder: {1}_numeric",name))
  2778. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement