Advertisement
Guest User

Untitled

a guest
Oct 9th, 2017
668
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. @realdata=@map.data
  593. @map.data=$PokemonGlobal.baseinfo[@map_id][1]
  594.  
  595. for i in 0...$PokemonGlobal.baseinfo[@map_id][0].length+1
  596. savedEvent=$PokemonGlobal.baseinfo[@map_id][0][i]
  597. next if savedEvent==nil
  598. nEvent=savedEvent.rEvent
  599. newId=getNewId
  600. itemEvent=Game_BaseEvent.new(@map_id, nEvent)
  601. itemEvent.id=newId
  602. itemEvent.moveto(savedEvent.x,savedEvent.y)
  603. itemEvent.item=true
  604. itemEvent.direction=savedEvent.direction if savedPositions
  605. itemEvent.itemtileid=savedEvent.itemtileid
  606. itemEvent.rEvent=nEvent
  607. @events[newId] = itemEvent
  608. end
  609. end
  610.  
  611. def getNewId
  612. newId = 1
  613. while $game_map.events[newId] != nil do
  614. newId += 1
  615. end
  616. return newId
  617. end
  618.  
  619. def copy_event(mapid, eventid, x, y,tileid)
  620. map = load_data(sprintf("Data/Map%03d.rxdata", mapid))
  621. map.events.each do |i, event|
  622. if event.id == eventid
  623. newId=getNewId
  624. nEvent=event.clone # Clone the event
  625. # Create the new event in new map
  626. eMap=Game_BaseEvent.new(@map_id, nEvent)
  627. eMap.id=newId
  628. eMap.moveto(x,y)
  629. eMap.itemtileid=tileid
  630. eMap.item=true
  631. eMap.rEvent=nEvent
  632. @events[newId] = eMap
  633. end
  634. end
  635. end
  636. end
  637.  
  638. # Functions for events
  639. def movingRightToThis(event=nil)
  640. return $game_player.x==event.x && $game_player.y==event.y &&
  641. $game_player.direction==6 && $game_player.moving? &&
  642. (Input.press?(Input::RIGHT) || Input.trigger?(Input::RIGHT) ||
  643. Input.release?(Input::RIGHT))
  644. end
  645.  
  646. def movingLeftToThis(event=nil)
  647. return $game_player.x==event.x && $game_player.y==event.y &&
  648. $game_player.direction==4 && $game_player.moving? &&
  649. (Input.press?(Input::LEFT) || Input.trigger?(Input::LEFT) || Input.release?(Input::LEFT))
  650. end
  651.  
  652. def movingUpToThis(event)
  653. return $game_player.x==event.x && $game_player.y==event.y &&
  654. $game_player.direction==8 && $game_player.moving? &&
  655. (Input.press?(Input::UP) || Input.trigger?(Input::UP) || Input.release?(Input::UP))
  656. end
  657.  
  658. def movingDownToThis(event=nil)
  659. return $game_player.x==event.x && $game_player.y==event.y &&
  660. $game_player.direction==2 && $game_player.moving? &&
  661. (Input.press?(Input::DOWN) || Input.trigger?(Input::DOWN) || Input.release?(Input::DOWN))
  662. end
  663.  
  664. class Game_Event
  665. attr_accessor :rEvent
  666.  
  667. def rEvent
  668. return !@rEvent ? false : @rEvent
  669. end
  670.  
  671. def direction=(value)
  672. @direction=value
  673. end
  674. end
  675.  
  676. class Game_BaseEvent < Game_Event
  677. attr_accessor :item
  678. attr_accessor :itemtileid
  679.  
  680. end
  681.  
  682. class Spriteset_Map
  683. attr_accessor :character_sprites
  684. attr_accessor :player
  685.  
  686. alias old_initialize_base initialize
  687. def initialize(map=nil)
  688. old_initialize_base(map)
  689. @player=@playersprite
  690. end
  691. end
  692.  
  693. def copyMapData
  694. baseEvents=[]
  695. for i in 0...$game_map.events.length+1
  696. event=$game_map.events[i]
  697. baseEvents.push(event) if event.is_a?(Game_BaseEvent)
  698. end
  699.  
  700. $PokemonGlobal.setBaseInfo($game_map.map_id,baseEvents,$game_map.data)
  701. end
  702.  
  703. def placeItemInBase(item,pos)
  704. x=pos[0]
  705. y=pos[1]
  706. width=baseItemWidth(item)/32
  707. height=baseItemHeight(item)/32
  708.  
  709. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  710. tilesets=load_data("Data/Tilesets.rxdata")
  711. tileset=tilesets[map.tileset_id]
  712. priorities=tileset.priorities
  713. passages=tileset.passages
  714.  
  715.  
  716. # Check if it's an event item
  717. if baseItemEvent(item)
  718. tileid=baseItemTileid(item)
  719. $game_map.copy_event(ITEMSMAP,baseItemEvent(item),x,y,tileid)
  720. else # Draw a tile
  721. for i in 0...width
  722. for e in 0...height
  723. tileid=baseItemTileid(item)+i+(e*8)
  724. layer=priorities[tileid]==0 ? 1 : 2
  725. #layer=2 if passages[tileid] & 0x80 == 0x80 # Counter
  726. $game_map.data[x+i,y+e,layer]=tileid
  727. end
  728. end
  729. end
  730. copyMapData
  731. end
  732.  
  733. #===============================================================================
  734. # PC System
  735. #===============================================================================
  736.  
  737. class Game_Character
  738. def screen_x_scroll(scroll)
  739. return (@real_x - scroll + 3) / 4 + (Game_Map::TILEWIDTH/2)
  740. end
  741.  
  742. def screen_y_scroll(scroll)
  743. y = (@real_y - scroll + 3) / 4 + (Game_Map::TILEHEIGHT)
  744. if jumping?
  745. if @jump_count >= @jump_peak
  746. n = @jump_count - @jump_peak
  747. else
  748. n = @jump_peak - @jump_count
  749. end
  750. return y - (@jump_peak * @jump_peak - n * n) / 2
  751. else
  752. return y
  753. end
  754. end
  755. end
  756.  
  757. class DecorationMap
  758. attr_accessor :scroll
  759. def initialize(viewport)
  760. $scene.disposeSpritesets
  761. @map=load_data(sprintf("Data/Map%03d.rxdata",$game_map.map_id))
  762. @viewport=Viewport.new(viewport.rect.x,viewport.rect.y,viewport.rect.width,
  763. viewport.rect.height)
  764. @viewport.z=99999
  765. @totalscroll=[0,0]
  766. pbLoad
  767. end
  768.  
  769. def pbLoad
  770. @scroll=[0,0]
  771.  
  772. @bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
  773. tilesets=load_data("Data/Tilesets.rxdata")
  774. @tileset=tilesets[@map.tileset_id]
  775. helper=TileDrawingHelper.fromTileset(@tileset)
  776. for y in 0...@map.height
  777. for x in 0...@map.width
  778. for z in 0..2
  779. id=$game_map.data[x,y,z]
  780. id=0 if !id
  781. helper.bltTile(@bitmap,x*32,y*32,id)
  782. end
  783. end
  784. end
  785.  
  786. @rsprite=Sprite_Character.new(nil, $game_player)
  787. x=@rsprite.x-16
  788. y=@rsprite.y-32
  789. @rsprite.dispose
  790.  
  791. @scroll[0]+=x-$game_player.x*32
  792. @scroll[1]+=y-$game_player.y*32
  793.  
  794. @mapSprite=Sprite.new(@viewport)
  795. @mapSprite.bitmap=@bitmap
  796. @mapSprite.x+=@scroll[0]
  797. @mapSprite.y+=@scroll[1]
  798. @character_sprites = []
  799.  
  800. for i in $game_map.events.keys.sort
  801. sprite=Sprite_Character.new(@viewport, $game_map.events[i])
  802. sprite.x=$game_map.events[i].screen_x_scroll(0)
  803. sprite.y=$game_map.events[i].screen_y_scroll(0)
  804. sprite.x+=@scroll[0]
  805. sprite.y+=@scroll[1]
  806. @character_sprites.push(sprite)
  807. end
  808. @scroll=[0,0]
  809. end
  810.  
  811. def pbReloadTiles
  812. @bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
  813. helper=TileDrawingHelper.fromTileset(@tileset)
  814. for y in 0...@map.height
  815. for x in 0...@map.width
  816. for z in 0..2
  817. id=$game_map.data[x,y,z]
  818. id=0 if !id
  819. helper.bltTile(@bitmap,x*32,y*32,id)
  820. end
  821. end
  822. end
  823. @mapSprite.bitmap=@bitmap
  824. end
  825.  
  826. def pbReloadEvents
  827. for sprite in @character_sprites
  828. sprite.dispose
  829. end
  830.  
  831. @rsprite=Sprite_Character.new(nil, $game_player)
  832. x=@rsprite.x-16
  833. y=@rsprite.y-32
  834. @rsprite.dispose
  835.  
  836. @character_sprites.clear
  837. for i in $game_map.events.keys.sort
  838. sprite=Sprite_Character.new(@viewport, $game_map.events[i])
  839. sprite.x=$game_map.events[i].screen_x_scroll(0)
  840. sprite.y=$game_map.events[i].screen_y_scroll(0)
  841. sprite.x+=x-$game_player.x*32+@totalscroll[0]
  842. sprite.y+=y-$game_player.y*32+@totalscroll[1]
  843. @character_sprites.push(sprite)
  844. end
  845. end
  846.  
  847. def reload
  848. pbReloadTiles
  849. pbReloadEvents
  850. end
  851.  
  852. def disposed?
  853. @mapSprite.disposed?
  854. end
  855.  
  856. def color
  857. return @mapSprite.color
  858. end
  859.  
  860. def color=(value)
  861. @mapSprite.color=value
  862. for sprite in @character_sprites
  863. sprite.color=value
  864. end
  865. end
  866.  
  867. def visible
  868. return @mapSprite.visible
  869. end
  870.  
  871. def visible=(value)
  872. @mapSprite.visible=value
  873. for sprite in @character_sprites
  874. sprite.visible=value
  875. end
  876. end
  877.  
  878. def dispose
  879. @mapSprite.dispose
  880. for sprite in @character_sprites
  881. sprite.dispose
  882. end
  883. $scene.createSpritesets
  884. end
  885.  
  886. def updateScrollPos
  887. @mapSprite.x+=@scroll[0]
  888. @mapSprite.y+=@scroll[1]
  889. for sprite in @character_sprites
  890. sprite.x+=@scroll[0]
  891. sprite.y+=@scroll[1]
  892. end
  893. @totalscroll[0]+=@scroll[0]
  894. @totalscroll[1]+=@scroll[1]
  895. @scroll=[0,0]
  896. end
  897.  
  898. end
  899.  
  900. def Kernel.pbShowCommandsBase(msgwindow,commands=nil,cmdIfCancel=0,defaultCmd=0)
  901. ret=0
  902. if commands
  903. cmdwindow=Window_CommandPokemonEx.new(commands)
  904. cmdwindow.z=99999
  905. cmdwindow.visible=true
  906. cmdwindow.resizeToFit(cmdwindow.commands)
  907. pbPositionNearMsgWindow(cmdwindow,msgwindow,:right)
  908. cmdwindow.index=defaultCmd
  909. command=0
  910. loop do
  911. Graphics.update
  912. Input.update
  913. cmdwindow.update
  914. msgwindow.update if msgwindow
  915. yield if block_given?
  916. if Input.trigger?(Input::B)
  917. if cmdIfCancel>0
  918. command=cmdIfCancel-1
  919. break
  920. elsif cmdIfCancel<0
  921. command=cmdIfCancel
  922. break
  923. end
  924. end
  925. if Input.trigger?(Input::C)
  926. command=cmdwindow.index
  927. break
  928. end
  929. end
  930. ret=command
  931. cmdwindow.dispose
  932. Input.update
  933. end
  934. return ret
  935. end
  936.  
  937. def Kernel.pbMessageBase(message,commands=nil,cmdIfCancel=0,skin=nil,defaultCmd=0,&block)
  938. ret=0
  939. msgwindow=Kernel.pbCreateMessageWindow(nil,skin)
  940. if commands
  941. ret=Kernel.pbMessageDisplayBase(msgwindow,message,true,
  942. proc {|msgwindow|
  943. next Kernel.pbShowCommandsBase(msgwindow,commands,cmdIfCancel,defaultCmd,&block)
  944. },&block)
  945. else
  946. Kernel.pbMessageDisplayBase(msgwindow,message,&block)
  947. end
  948. Kernel.pbDisposeMessageWindow(msgwindow)
  949. Input.update
  950. return ret
  951. end
  952.  
  953. def Kernel.pbMessageDisplayBase(msgwindow,message,letterbyletter=true,commandProc=nil)
  954. return if !msgwindow
  955. oldletterbyletter=msgwindow.letterbyletter
  956. msgwindow.letterbyletter=(letterbyletter ? true : false)
  957. ret=nil
  958. count=0
  959. commands=nil
  960. facewindow=nil
  961. goldwindow=nil
  962. coinwindow=nil
  963. cmdvariable=0
  964. cmdIfCancel=0
  965. msgwindow.waitcount=0
  966. autoresume=false
  967. text=message.clone
  968. msgback=nil
  969. linecount=(DEFAULTSCREENHEIGHT>400) ? 3 : 2
  970. ### Text replacement
  971. text.gsub!(/\\\\/,"\5")
  972. if $game_actors
  973. text.gsub!(/\\[Nn]\[([1-8])\]/){
  974. m=$1.to_i
  975. next $game_actors[m].name
  976. }
  977. end
  978. text.gsub!(/\\[Ss][Ii][Gg][Nn]\[([^\]]*)\]/){
  979. next "\\op\\cl\\ts[]\\w["+$1+"]"
  980. }
  981. text.gsub!(/\\[Pp][Nn]/,$Trainer.name) if $Trainer
  982. text.gsub!(/\\[Pp][Mm]/,_INTL("${1}",$Trainer.money)) if $Trainer
  983. text.gsub!(/\\[Nn]/,"\n")
  984. text.gsub!(/\\\[([0-9A-Fa-f]{8,8})\]/){ "<c2="+$1+">" }
  985. text.gsub!(/\\[Pp][Gg]/,"")
  986. text.gsub!(/\\[Pp][Oo][Gg]/,"")
  987. text.gsub!(/\\[Bb]/,"<c2=6546675A>")
  988. text.gsub!(/\\[Rr]/,"<c2=043C675A>")
  989. text.gsub!(/\\1/,"\1")
  990. colortag=""
  991. isDarkSkin=isDarkWindowskin(msgwindow.windowskin)
  992. if ($game_message && $game_message.background>0) ||
  993. ($game_system && $game_system.respond_to?("message_frame") &&
  994. $game_system.message_frame != 0)
  995. colortag=getSkinColor(msgwindow.windowskin,0,true)
  996. else
  997. colortag=getSkinColor(msgwindow.windowskin,0,isDarkSkin)
  998. end
  999. text.gsub!(/\\[Cc]\[([0-9]+)\]/){
  1000. m=$1.to_i
  1001. next getSkinColor(msgwindow.windowskin,m,isDarkSkin)
  1002. }
  1003. begin
  1004. last_text = text.clone
  1005. text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
  1006. end until text == last_text
  1007. begin
  1008. last_text = text.clone
  1009. text.gsub!(/\\[Ll]\[([0-9]+)\]/) {
  1010. linecount=[1,$1.to_i].max;
  1011. next ""
  1012. }
  1013. end until text == last_text
  1014. text=colortag+text
  1015. ### Controls
  1016. textchunks=[]
  1017. controls=[]
  1018. 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]
  1019. textchunks.push($~.pre_match)
  1020. if $~[1]
  1021. controls.push([$~[1].downcase,$~[2],-1])
  1022. else
  1023. controls.push([$~[3].downcase,"",-1])
  1024. end
  1025. text=$~.post_match
  1026. end
  1027. textchunks.push(text)
  1028. for chunk in textchunks
  1029. chunk.gsub!(/\005/,"\\")
  1030. end
  1031. textlen=0
  1032. for i in 0...controls.length
  1033. control=controls[i][0]
  1034. if control=="wt" || control=="wtnp" || control=="." || control=="|"
  1035. textchunks[i]+="\2"
  1036. elsif control=="!"
  1037. textchunks[i]+="\1"
  1038. end
  1039. textlen+=toUnformattedText(textchunks[i]).scan(/./m).length
  1040. controls[i][2]=textlen
  1041. end
  1042. text=textchunks.join("")
  1043. unformattedText=toUnformattedText(text)
  1044. signWaitCount=0
  1045. haveSpecialClose=false
  1046. specialCloseSE=""
  1047. for i in 0...controls.length
  1048. control=controls[i][0]
  1049. param=controls[i][1]
  1050. if control=="f"
  1051. facewindow.dispose if facewindow
  1052. facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
  1053. elsif control=="op"
  1054. signWaitCount=21
  1055. elsif control=="cl"
  1056. text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
  1057. haveSpecialClose=true
  1058. specialCloseSE=param
  1059. elsif control=="se" && controls[i][2]==0
  1060. startSE=param
  1061. controls[i]=nil
  1062. elsif control=="ff"
  1063. facewindow.dispose if facewindow
  1064. facewindow=FaceWindowVX.new(param)
  1065. elsif control=="ch"
  1066. cmds=param.clone
  1067. cmdvariable=pbCsvPosInt!(cmds)
  1068. cmdIfCancel=pbCsvField!(cmds).to_i
  1069. commands=[]
  1070. while cmds.length>0
  1071. commands.push(pbCsvField!(cmds))
  1072. end
  1073. elsif control=="wtnp" || control=="^"
  1074. text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
  1075. end
  1076. end
  1077. if startSE!=nil
  1078. pbSEPlay(pbStringToAudioFile(startSE))
  1079. elsif signWaitCount==0 && letterbyletter
  1080. pbPlayDecisionSE()
  1081. end
  1082. ########## Position message window ##############
  1083. pbRepositionMessageWindow(msgwindow,linecount)
  1084. if $game_message && $game_message.background==1
  1085. msgback=IconSprite.new(0,msgwindow.y,msgwindow.viewport)
  1086. msgback.z=msgwindow.z-1
  1087. msgback.setBitmap("Graphics/System/MessageBack")
  1088. end
  1089. if facewindow
  1090. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1091. facewindow.viewport=msgwindow.viewport
  1092. facewindow.z=msgwindow.z
  1093. end
  1094. atTop=(msgwindow.y==0)
  1095. ########## Show text #############################
  1096. msgwindow.text=text
  1097. Graphics.frame_reset if Graphics.frame_rate>40
  1098. begin
  1099. if signWaitCount>0
  1100. signWaitCount-=1
  1101. if atTop
  1102. msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
  1103. else
  1104. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
  1105. end
  1106. end
  1107. for i in 0...controls.length
  1108. if controls[i] && controls[i][2]<=msgwindow.position && msgwindow.waitcount==0
  1109. control=controls[i][0]
  1110. param=controls[i][1]
  1111. if control=="f"
  1112. facewindow.dispose if facewindow
  1113. facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
  1114. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1115. facewindow.viewport=msgwindow.viewport
  1116. facewindow.z=msgwindow.z
  1117. elsif control=="ts"
  1118. if param==""
  1119. msgwindow.textspeed=-999
  1120. else
  1121. msgwindow.textspeed=param.to_i
  1122. end
  1123. elsif control=="ff"
  1124. facewindow.dispose if facewindow
  1125. facewindow=FaceWindowVX.new(param)
  1126. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1127. facewindow.viewport=msgwindow.viewport
  1128. facewindow.z=msgwindow.z
  1129. elsif control=="g" # Display gold window
  1130. goldwindow.dispose if goldwindow
  1131. goldwindow=pbDisplayGoldWindow(msgwindow)
  1132. elsif control=="cn" # Display coins window
  1133. coinwindow.dispose if coinwindow
  1134. coinwindow=pbDisplayCoinsWindow(msgwindow,goldwindow)
  1135. elsif control=="wu"
  1136. msgwindow.y=0
  1137. atTop=true
  1138. msgback.y=msgwindow.y if msgback
  1139. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1140. msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
  1141. elsif control=="wm"
  1142. atTop=false
  1143. msgwindow.y=(DEFAULTSCREENHEIGHT/2)-(msgwindow.height/2)
  1144. msgback.y=msgwindow.y if msgback
  1145. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1146. elsif control=="wd"
  1147. atTop=false
  1148. msgwindow.y=(DEFAULTSCREENHEIGHT)-(msgwindow.height)
  1149. msgback.y=msgwindow.y if msgback
  1150. pbPositionNearMsgWindow(facewindow,msgwindow,:left)
  1151. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
  1152. elsif control=="."
  1153. msgwindow.waitcount+=Graphics.frame_rate/4
  1154. elsif control=="|"
  1155. msgwindow.waitcount+=Graphics.frame_rate
  1156. elsif control=="wt" # Wait
  1157. param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
  1158. msgwindow.waitcount+=param.to_i*2
  1159. elsif control=="w" # Windowskin
  1160. if param==""
  1161. msgwindow.windowskin=nil
  1162. else
  1163. msgwindow.setSkin("Graphics/Windowskins/#{param}")
  1164. end
  1165. msgwindow.width=msgwindow.width # Necessary evil
  1166. elsif control=="^" # Wait, no pause
  1167. autoresume=true
  1168. elsif control=="wtnp" # Wait, no pause
  1169. param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
  1170. msgwindow.waitcount=param.to_i*2
  1171. autoresume=true
  1172. elsif control=="se" # Play SE
  1173. pbSEPlay(pbStringToAudioFile(param))
  1174. elsif control=="me" # Play ME
  1175. pbMEPlay(pbStringToAudioFile(param))
  1176. end
  1177. controls[i]=nil
  1178. end
  1179. end
  1180. break if !letterbyletter
  1181. Graphics.update
  1182. Input.update
  1183. facewindow.update if facewindow
  1184. if $DEBUG && Input.trigger?(Input::F6)
  1185. pbRecord(unformattedText)
  1186. end
  1187. if autoresume && msgwindow.waitcount==0
  1188. msgwindow.resume if msgwindow.busy?
  1189. break if !msgwindow.busy?
  1190. end
  1191. if (Input.trigger?(Input::C) || Input.trigger?(Input::B))
  1192. if msgwindow.busy?
  1193. pbPlayDecisionSE() if msgwindow.pausing?
  1194. msgwindow.resume
  1195. else
  1196. break if signWaitCount==0
  1197. end
  1198. end
  1199. msgwindow.update
  1200. yield if block_given?
  1201. end until (!letterbyletter || commandProc || commands) && !msgwindow.busy?
  1202. Input.update # Must call Input.update again to avoid extra triggers
  1203. msgwindow.letterbyletter=oldletterbyletter
  1204. if commands
  1205. $game_variables[cmdvariable]=Kernel.pbShowCommands(
  1206. msgwindow,commands,cmdIfCancel)
  1207. $game_map.need_refresh = true if $game_map
  1208. end
  1209. if commandProc
  1210. ret=commandProc.call(msgwindow)
  1211. end
  1212. msgback.dispose if msgback
  1213. goldwindow.dispose if goldwindow
  1214. coinwindow.dispose if coinwindow
  1215. facewindow.dispose if facewindow
  1216. if haveSpecialClose
  1217. pbSEPlay(pbStringToAudioFile(specialCloseSE))
  1218. atTop=(msgwindow.y==0)
  1219. for i in 0..20
  1220. if atTop
  1221. msgwindow.y=-(msgwindow.height*(i)/20)
  1222. else
  1223. msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-i)/20)
  1224. end
  1225. Graphics.update
  1226. Input.update
  1227. msgwindow.update
  1228. end
  1229. end
  1230. return ret
  1231. end
  1232.  
  1233. def Kernel.pbConfirmMessageBase(message,&block)
  1234. return (Kernel.pbMessageBase(message,[_INTL("Yes"),_INTL("No")],2,&block)==0)
  1235. end
  1236.  
  1237. class PokemonDecoration
  1238. def initialize; end
  1239.  
  1240. def pbStartScene
  1241. @viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
  1242. @viewport.z=999999
  1243. @sprites={}
  1244. end
  1245.  
  1246. def getSecretArrow
  1247. if $Trainer.gender==1
  1248. bitmapname=_INTL("Graphics/Pictures/secretBaseArrow_Green{1}",$Trainer.metaID)
  1249. return BitmapCache.load_bitmap(bitmapname)
  1250. else
  1251. bitmapname=_INTL("Graphics/Pictures/secretBaseArrow_Red{1}",$Trainer.metaID)
  1252. return BitmapCache.load_bitmap(bitmapname)
  1253. end
  1254. end
  1255.  
  1256. def getMapPassable(x,y)
  1257. for event in $game_map.events.values
  1258. return false if event.x==x && event.y==y
  1259. end
  1260. if $game_map.data[x,y,0]
  1261. return false if isPosterWall($game_map.data[x,y,0])
  1262. end
  1263. return $game_map.passable?(x,y,0)
  1264. end
  1265.  
  1266. def isPosterWall(tileid)
  1267. #map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1268. #tilesets=load_data("Data/Tilesets.rxdata")
  1269. #tileset=tilesets[map.tileset_id]
  1270. #priorities=tileset.priorities
  1271. #passages=tileset.passages
  1272. #pass=[]
  1273. #pass[0]=passages[tileid] & 0x01 == 0x01 # Down arrow
  1274. #pass[1]=passages[tileid] & 0x02 == 0x02 # Left arrow
  1275. #pass[2]=passages[tileid] & 0x04 == 0x04 # Up arrow
  1276. #pass[3]=passages[tileid] & 0x08 == 0x08 # Up arrow
  1277. #if pass[0]==true && pass[1]==false &&
  1278. # pass[2]==false && pass[3]==false
  1279. # return true
  1280. #end
  1281. if $game_map.terrain_tag_id(tileid)==WALLTERRAINTAG
  1282. return true
  1283. end
  1284. return false
  1285. end
  1286.  
  1287. def canPlaceItem?(item,pos)
  1288. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1289. tilesets=load_data("Data/Tilesets.rxdata")
  1290. tileset=tilesets[map.tileset_id]
  1291. priorities=tileset.priorities
  1292. passages=tileset.passages
  1293. width=baseItemWidth(item)/32
  1294. height=baseItemHeight(item)/32
  1295.  
  1296. # Do not put anything above player!
  1297. for w in 0...width
  1298. for h in 0...height
  1299. tileid=baseItemTileid(item)+w+(h*8)
  1300. notblocked=passages[tileid] & 0x0f == 0x0f
  1301. if notblocked && pos[0]+w==$game_player.x && pos[1]+h==$game_player.y
  1302. return false
  1303. end
  1304. end
  1305. end
  1306. # Avoids to put items above others
  1307. if !DOLLSEVERYWHERE && !(isADoll?(item) || isACushion?(item))
  1308. for e in 0...height
  1309. tileid=baseItemTileid(item)+(e*8)
  1310. prio=priorities[tileid]
  1311. #prio=1 if passages[tileid] & 0x80 == 0x80
  1312. next if prio>0
  1313. for i in 0...width
  1314. tileid=baseItemTileid(item)+i+(e*8)
  1315. prio=priorities[tileid]
  1316. #prio=1 if passages[tileid] & 0x80 == 0x80
  1317. pass=passages[tileid] & 0x0f == 0x0f
  1318. if $game_map.data[pos[0]+i,pos[1]+e,1]!=0 && prio==0
  1319. # Check for holes
  1320. isahole=thereIsAHole?([pos[0]+i,pos[1]+e])
  1321. if isahole && isABoard?(item)
  1322. holewidth=isahole[0]
  1323. holeheight=isahole[1]
  1324. positions=getTopLeftWithATileHole([pos[0]+i,pos[1]+e])
  1325. if positions[0]==pos[0] && positions[1]==pos[1] &&
  1326. holewidth==width && holeheight==height
  1327. return true
  1328. end
  1329. end
  1330. return false
  1331. elsif $game_map.data[pos[0]+i,pos[1]+e,2]!=0 && prio==0
  1332. topleft=getTopLeftWithATile(pos)
  1333. if !topleft.is_a?(Range)
  1334. if pos[1]+e!=topleft[1]
  1335. return false
  1336. end
  1337. end
  1338. end
  1339. end
  1340. end
  1341. end
  1342. # Check if it's a poster
  1343. if isAPoster?(item)
  1344. putInWall=true
  1345. for i in 0...width
  1346. for e in 0...height
  1347. tileid=baseItemTileid(item)+i+(e*8)
  1348. for w in 0...width
  1349. for h in 0...height
  1350. alreadyp=$game_map.data[pos[0]+w,pos[1]+h,1]
  1351. newp=isPosterWall($game_map.data[pos[0]+w,pos[1]+h,0])
  1352. if !newp || alreadyp>0
  1353. putInWall=false
  1354. end
  1355. end
  1356. end
  1357. return true if putInWall
  1358. return false
  1359. end
  1360. end
  1361. # Placing dolls only in mats and counter tiles
  1362. elsif isADoll?(item) || isACushion?(item)
  1363. placed=getItemIn(pos)
  1364. # If it's a mat or a counter tile and it's not an interactive one
  1365. if isAMat?(placed) && baseItemEvent(placed)==nil
  1366. return true
  1367. elsif isADesk?(placed) && baseItemEvent(placed)==nil
  1368. tileid=$game_map.data[pos[0],pos[1],1]
  1369. counter=passages[tileid] & 0x80 == 0x80
  1370. return true if counter
  1371. elsif DOLLSEVERYWHERE
  1372. newp=getMapPassable(pos[0],pos[1])
  1373. if $game_map.terrain_tag(pos[0],pos[1])==GROUNDDECORATION
  1374. return false # Avoid to put tiles in layer 0 decorations
  1375. end
  1376. return true if newp
  1377. end
  1378. return false
  1379. else
  1380. for i in 0...width
  1381. for e in 0...height
  1382. tileid=baseItemTileid(item)+i+(e*8)
  1383. prio=priorities[tileid]
  1384. pass=passages[tileid] & 0x0f == 0x0f
  1385. mappass=getMapPassable(pos[0]+i,pos[1]+e)
  1386. upasable=true
  1387. #counter=passages[tileid] & 0x80 == 0x80
  1388.  
  1389. # Is first line passable?
  1390. (0...width).each do |w|
  1391. np=getMapPassable(pos[0]+w,pos[1])
  1392. upasable=false if !np
  1393. end
  1394.  
  1395. # Make counter tiles priorities
  1396. if counter
  1397. upasable=false
  1398. prio=1
  1399. end
  1400.  
  1401. if !upasable && prio>0
  1402. (0...height).each do |h|
  1403. (0...width).each do |w|
  1404. # Tile to place data
  1405. tileplace=baseItemTileid(item)+w+(h*8)
  1406. tileprio=priorities[tileplace]
  1407. placep=passages[tileplace] & 0x0f == 0x0f
  1408. counter=passages[tileplace] & 0x80 == 0x80
  1409. #tileprio=1 if counter
  1410. # Tile in map data
  1411. if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
  1412. return false # Avoid to put tiles in layer 0 decorations
  1413. end
  1414. newp=getMapPassable(pos[0]+w,pos[1]+h)
  1415. return false if h==0 && !newp && tileprio==0
  1416. return false if h>0 && !newp
  1417. end
  1418. end
  1419. return true
  1420. elsif mappass
  1421. for w in 0...width
  1422. for h in 0...height
  1423. tileplace=baseItemTileid(item)+w+(h*8)
  1424. newp=getMapPassable(pos[0]+w,pos[1]+h)
  1425. tileprio=priorities[tileplace]
  1426. if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
  1427. return false # Avoid to put tiles in layer 0 decorations
  1428. end
  1429. #tileprio=1 if passages[tileplace] & 0x80 == 0x80
  1430. return false if !newp
  1431. end
  1432. end
  1433. return true
  1434. end
  1435. end
  1436. end
  1437. end
  1438. return false
  1439. end
  1440.  
  1441. # Get a placed item
  1442. def getItemIn(pos)
  1443. x=@pos[0]
  1444. y=@pos[1]
  1445. for i in 1...SECRETBASEITEMS.length
  1446. thisId=baseItemTileid(i)
  1447. width=baseItemWidth(i)/32
  1448. height=baseItemHeight(i)/32
  1449. (0...height).each do |h|
  1450. (0...width).each do |w|
  1451. actualTile=baseItemTileid(i)+w+(h*8)
  1452. for l in 0...3
  1453. if actualTile==$game_map.data[x,y,l]
  1454. return i
  1455. end
  1456. end
  1457. end
  1458. end
  1459. end
  1460. end
  1461.  
  1462. def getTopLeftWithATileHole(pos)
  1463. x=pos[0]
  1464. y=pos[1]
  1465. for i in 1...BASEHOLES.length
  1466. thisId=BASEHOLES[i][0]+384
  1467. width=BASEHOLES[i][1]
  1468. height=BASEHOLES[i][2]
  1469. (0...height).each do |h|
  1470. (0...width).each do |w|
  1471. actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
  1472. for l in 0...3
  1473. # Get top item
  1474. if actualTile==$game_map.data[x,y,l]
  1475. return getTopLeftHole(i,actualTile,x,y)
  1476. end
  1477. end
  1478. end
  1479. end
  1480. end
  1481. return false
  1482. end
  1483.  
  1484. def getTopLeftHole(item,actualTile,x,y)
  1485. width=BASEHOLES[item][1]
  1486. height=BASEHOLES[item][2]
  1487. (0...height).each do |h|
  1488. (0...width).each do |w|
  1489. if (BASEHOLES[item][0]+384)+w+(h*8)==actualTile
  1490. x-=w
  1491. y-=h
  1492. end
  1493. end
  1494. end
  1495. return [x,y]
  1496. end
  1497.  
  1498. def thereIsAHole?(pos)
  1499. x=pos[0]
  1500. y=pos[1]
  1501. for i in 1...BASEHOLES.length
  1502. thisId=BASEHOLES[i][0]+384
  1503. width=BASEHOLES[i][1]
  1504. height=BASEHOLES[i][2]
  1505. (0...height).each do |h|
  1506. (0...width).each do |w|
  1507. actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
  1508. for l in 0...3
  1509. # Get top item
  1510. if actualTile==$game_map.data[x,y,l]
  1511. return [width,height]
  1512. end
  1513. end
  1514. end
  1515. end
  1516. end
  1517. return false
  1518. end
  1519.  
  1520. # Get top left position of a tiled item
  1521. def getTopLeftWithATile(pos)
  1522. x=@pos[0]
  1523. y=@pos[1]
  1524. for i in 1...SECRETBASEITEMS.length
  1525. thisId=baseItemTileid(i)
  1526. width=baseItemWidth(i)/32
  1527. height=baseItemHeight(i)/32
  1528.  
  1529. (0...height).each do |h|
  1530. (0...width).each do |w|
  1531. actualTile=baseItemTileid(i)+w+(h*8)
  1532. for l in 0...3
  1533. # Get top item
  1534. if actualTile==$game_map.data[x,y,l]
  1535. return getTopLeft(i,actualTile,x,y)
  1536. end
  1537. end
  1538. end
  1539. end
  1540. end
  1541. end
  1542.  
  1543. # Delete items
  1544. def deleteItemIn(pos,delete=true)
  1545. x=pos[0]
  1546. y=pos[1]
  1547. isEvent=false
  1548.  
  1549. for i in 1...SECRETBASEITEMS.length
  1550. thisId=baseItemTileid(i)
  1551. width=baseItemWidth(i)/32
  1552. height=baseItemHeight(i)/32
  1553. # Check if there's an event
  1554. for event in $game_map.events.values
  1555. if !isEvent && event.is_a?(Game_BaseEvent) && event.x==x && event.y==y
  1556. isEvent=true
  1557. itemEvent=event
  1558. end
  1559. end
  1560. if isEvent
  1561. return true if !delete
  1562. deleteEvent(@pos)
  1563. return
  1564. else
  1565. (0...height).each do |h|
  1566. (0...width).each do |w|
  1567. actualTile=baseItemTileid(i)+w+(h*8)
  1568. # Get top item
  1569. tileMiddle=$game_map.data[x,y,1]
  1570. tileTop=$game_map.data[x,y,2]
  1571. # Delete top tile
  1572. if tileTop>0 && actualTile==tileTop
  1573. return true if !delete
  1574. # Delete item
  1575. topleft=getTopLeft(i,actualTile,x,y)
  1576. deleteTiledItem(i,topleft)
  1577. return
  1578. # Delete middle tile
  1579. elsif actualTile==tileMiddle && tileTop==0
  1580. return true if !delete
  1581. topleft=getTopLeft(i,actualTile,x,y)
  1582. # Delete item
  1583. if isABoard?(i) &&
  1584. $game_player.x>=topleft[0] && $game_player.x<topleft[0]+width &&
  1585. $game_player.y>=topleft[1] && $game_player.y<topleft[1]+height
  1586. Kernel.pbMessageBase("You can't delete this right now.")
  1587. else
  1588. deleteTiledItem(i,topleft)
  1589. end
  1590. return
  1591. end
  1592. end
  1593. end
  1594. end
  1595. end
  1596. return false if !delete
  1597. end
  1598.  
  1599. # Delete event
  1600. def deleteEvent(pos)
  1601. x=pos[0]
  1602. y=pos[1]
  1603. for event in $game_map.events.values
  1604. if event.x==x && event.y==y
  1605. thisEvent=event
  1606. end
  1607. end
  1608.  
  1609. return if thisEvent==nil
  1610.  
  1611. # Back item to PC
  1612. placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
  1613. for i in 0...placedInfo.length
  1614. actualItem=placedInfo[i]
  1615. if actualItem[0]==x && actualItem[1]==y &&
  1616. baseItemTileid(actualItem[2][0])==thisEvent.itemtileid
  1617. actualItem[2][1]=false
  1618. end
  1619. end
  1620.  
  1621. savedEvent=$PokemonGlobal.baseinfo[$game_map.map_id][0]
  1622. for i in 0...savedEvent.length+1
  1623. next if savedEvent[i]==nil
  1624. if savedEvent[i]==thisEvent
  1625. savedEvent[i]=nil
  1626. savedEvent.compact!
  1627.  
  1628. $game_map.reloadBaseEvents
  1629. copyMapData
  1630. return
  1631. end
  1632. end
  1633. end
  1634.  
  1635. # Delete a tiled item
  1636. def deleteTiledItem(item,pos)
  1637. x=pos[0]
  1638. y=pos[1]
  1639. width=baseItemWidth(item)/32
  1640. height=baseItemHeight(item)/32
  1641. map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
  1642. tilesets=load_data("Data/Tilesets.rxdata")
  1643. tileset=tilesets[map.tileset_id]
  1644. priorities=tileset.priorities
  1645. passages=tileset.passages
  1646.  
  1647. # Back item to PC
  1648. placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
  1649. for i in 0...placedInfo.length
  1650. actualItem=placedInfo[i]
  1651. if actualItem[0]==x && actualItem[1]==y &&
  1652. baseItemTileid(actualItem[2][0])==baseItemTileid(item)
  1653. actualItem[2][1]=false
  1654. end
  1655. end
  1656.  
  1657. (0...height).each do |h|
  1658. (0...width).each do |w|
  1659. tileid=baseItemTileid(item)+w+(h*8)
  1660. layer=priorities[tileid]==0 ? 1 : 2
  1661. #layer=2 if passages[tileid] & 0x80 == 0x80
  1662. # Delete also decorations over a mat or a desk
  1663. if (isAMat?(item) || isADesk?(item)) && baseItemEvent(item)==nil
  1664. deleteEvent([x+w,y+h])
  1665. end
  1666. $game_map.data[x+w,y+h,layer]=map.data[x+w,y+h,layer]
  1667. end
  1668. end
  1669. end
  1670.  
  1671. # Get top left for deleting
  1672. def getTopLeft(item,actualTile,x,y)
  1673. width=baseItemWidth(item)/32
  1674. height=baseItemHeight(item)/32
  1675. (0...height).each do |h|
  1676. (0...width).each do |w|
  1677. if baseItemTileid(item)+w+(h*8)==actualTile
  1678. x-=w
  1679. y-=h
  1680. end
  1681. end
  1682. end
  1683. return [x,y]
  1684. end
  1685.  
  1686. def pbCreatePutAway
  1687. @sprites["map"]=DecorationMap.new(@viewport)
  1688. @sprites["item"]=ItemBaseSprite.new(@viewport)
  1689. @sprites["item"].bitmap=RPG::Cache.picture("secretBaseDeleter")
  1690.  
  1691. @rsprite=Sprite_Character.new(nil, $game_player)
  1692. x=@rsprite.x-16
  1693. y=@rsprite.y-32
  1694. @rsprite.dispose
  1695.  
  1696. @sprites["item"].x=x
  1697. @sprites["item"].y=y
  1698.  
  1699. @pos=[$game_player.x,$game_player.y]
  1700. @sprites["arrow"]=Sprite.new(@viewport)
  1701. @sprites["arrow"].bitmap=getSecretArrow
  1702. @sprites["arrow"].oy=@sprites["arrow"].bitmap.height
  1703. @sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
  1704. @sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
  1705.  
  1706. @sprites["item"].update
  1707. end
  1708.  
  1709. def pbPutAway
  1710. loop do
  1711. Graphics.update
  1712. Input.update
  1713. @sprites["item"].update
  1714. if Input.trigger?(Input::UP)
  1715. @sprites["map"].scroll[1]+=32
  1716. @sprites["map"].updateScrollPos
  1717. @pos[1]-=1
  1718. elsif Input.trigger?(Input::DOWN)
  1719. @sprites["map"].scroll[1]-=32
  1720. @sprites["map"].updateScrollPos
  1721. @pos[1]+=1
  1722. elsif Input.trigger?(Input::RIGHT)
  1723. @sprites["map"].scroll[0]-=32
  1724. @sprites["map"].updateScrollPos
  1725. @pos[0]+=1
  1726. elsif Input.trigger?(Input::LEFT)
  1727. @sprites["map"].scroll[0]+=32
  1728. @sprites["map"].updateScrollPos
  1729. @pos[0]-=1
  1730. elsif Input.trigger?(Input::C)
  1731. @sprites["item"].makeVisible
  1732. if !deleteItemIn(@pos,false)
  1733. Kernel.pbMessageBase("There is no decoration item here.")
  1734. else
  1735. if Kernel.pbConfirmMessageBase("Return this decoration to the PC?")
  1736. deleteItemIn(@pos)
  1737. @sprites["map"].reload
  1738. end
  1739. end
  1740. elsif Input.trigger?(Input::B)
  1741. break
  1742. end
  1743. end
  1744. @sprites["item"].dispose
  1745. @sprites["arrow"].dispose
  1746. @sprites["map"].dispose
  1747. end
  1748.  
  1749. def pbCreatePlaceItem(item)
  1750. @placed=false
  1751.  
  1752. @sprites["map"]=DecorationMap.new(@viewport)
  1753. @sprites["item"]=ItemBaseSprite.new(@viewport)
  1754. @sprites["item"].bitmap=getBaseItemBitmap(item[0])
  1755.  
  1756. @rsprite=Sprite_Character.new(nil, $game_player)
  1757. x=@rsprite.x-16
  1758. y=@rsprite.y-32
  1759. @rsprite.dispose
  1760.  
  1761. @sprites["item"].x=x
  1762. @sprites["item"].y=y
  1763.  
  1764. if baseItemEvent(item[0])!=nil
  1765. @sprites["item"].ox=@sprites["item"].bitmap.width/2-16
  1766. @sprites["item"].oy=@sprites["item"].bitmap.height-32
  1767. end
  1768.  
  1769. @pos=[$game_player.x,$game_player.y]
  1770. @sprites["arrow"]=Sprite.new(@viewport)
  1771. @sprites["arrow"].bitmap=getSecretArrow
  1772. @sprites["arrow"].oy=@sprites["arrow"].bitmap.height
  1773. @sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
  1774. @sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
  1775.  
  1776. @sprites["arrow"].x-=@sprites["item"].ox
  1777. @sprites["arrow"].y-=@sprites["item"].oy
  1778. @sprites["item"].update
  1779. end
  1780.  
  1781. def pbPlaceItem(item)
  1782. loop do
  1783. Graphics.update
  1784. Input.update
  1785. @sprites["item"].update
  1786. if Input.trigger?(Input::UP)
  1787. @sprites["map"].scroll[1]+=32
  1788. @sprites["map"].updateScrollPos
  1789. @pos[1]-=1
  1790. elsif Input.trigger?(Input::DOWN)
  1791. @sprites["map"].scroll[1]-=32
  1792. @sprites["map"].updateScrollPos
  1793. @pos[1]+=1
  1794. elsif Input.trigger?(Input::RIGHT)
  1795. @sprites["map"].scroll[0]-=32
  1796. @sprites["map"].updateScrollPos
  1797. @pos[0]+=1
  1798. elsif Input.trigger?(Input::LEFT)
  1799. @sprites["map"].scroll[0]+=32
  1800. @sprites["map"].updateScrollPos
  1801. @pos[0]-=1
  1802. elsif Input.trigger?(Input::C)
  1803. @sprites["item"].makeVisible
  1804. if canPlaceItem?(item[0],@pos)
  1805. placeItemInBase(item[0],@pos)
  1806. $PokemonGlobal.setPlacedInfo($game_map.map_id,@pos[0],@pos[1],item)
  1807. @placed=true
  1808. break
  1809. else
  1810. Kernel.pbMessageBase("It can't be placed here.")
  1811. $scene.disposeSpritesets
  1812. end
  1813. elsif Input.trigger?(Input::B)
  1814. @placed=false
  1815. break
  1816. end
  1817. end
  1818. @sprites["item"].dispose
  1819. @sprites["arrow"].dispose
  1820. @sprites["map"].dispose
  1821.  
  1822. return @placed
  1823. end
  1824.  
  1825. end
  1826.  
  1827. ####### Bitmap save
  1828. class Bitmap
  1829. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ppi', 'i')
  1830. def last_row_address
  1831. return 0 if disposed?
  1832. RtlMoveMemory.call(buf=[0].pack('L'), __id__*2+16, 4)
  1833. RtlMoveMemory.call(buf, buf.unpack('L')[0]+8 , 4)
  1834. RtlMoveMemory.call(buf, buf.unpack('L')[0]+16, 4)
  1835. buf.unpack('L')[0]
  1836. end
  1837. def bytesize
  1838. width * height * 4
  1839. end
  1840. def get_data
  1841. data = [].pack('x') * bytesize
  1842. RtlMoveMemory.call(data, last_row_address, data.bytesize)
  1843. data
  1844. end
  1845. def set_data(data)
  1846. RtlMoveMemory.call(last_row_address, data, data.bytesize)
  1847. end
  1848. def get_data_ptr
  1849. data = String.new
  1850. RtlMoveMemory.call(data.__id__*2, [0x2007].pack('L'), 4)
  1851. RtlMoveMemory.call(data.__id__*2+8, [bytesize,last_row_address].pack('L2'), 8)
  1852. def data.free() RtlMoveMemory.call(__id__*2, String.new, 16) end
  1853. return data unless block_given?
  1854. yield data ensure data.free
  1855. end
  1856. def _dump(level)
  1857. get_data_ptr do |data|
  1858. dump = Marshal.dump([width, height, Zlib::Deflate.deflate(data, 9)])
  1859. dump
  1860. end
  1861. end
  1862. def self._load(dump)
  1863. width, height, data = *Marshal.load(dump)
  1864. data.replace(Zlib::Inflate.inflate(data))
  1865. bitmap = new(width, height)
  1866. bitmap.set_data(data)
  1867. bitmap
  1868. end
  1869. def export(filename)
  1870. export_png("#{filename}.png")
  1871. end
  1872. def export_png(filename)
  1873. data, i = get_data, 0
  1874. (0).step(data.bytesize-4, 4) do |i|
  1875. data[i,3] = data[i,3].reverse!
  1876. end
  1877. deflate = Zlib::Deflate.new(9)
  1878. null_char, w4 = [].pack('x'), width*4
  1879. (data.bytesize-w4).step(0, -w4) {|i| deflate << null_char << data[i,w4]}
  1880. data.replace(deflate.finish)
  1881. deflate.close
  1882. File.open(filename, 'wb') do |file|
  1883. def file.write_chunk(chunk)
  1884. write([chunk.bytesize-4].pack('N'))
  1885. write(chunk)
  1886. write([Zlib.crc32(chunk)].pack('N'))
  1887. end
  1888. file.write("\211PNG\r\n\32\n")
  1889. file.write_chunk(['IHDR',width,height,8,6,0,0,0].pack('a4N2C5'))
  1890. file.write_chunk(data.insert(0, 'IDAT'))
  1891. file.write_chunk('IEND')
  1892. end
  1893. end
  1894. end
  1895.  
  1896. class String
  1897. alias getbyte []
  1898. alias setbyte []=
  1899. alias bytesize size
  1900. end
  1901.  
  1902. class Font
  1903. def marshal_dump() end
  1904. def marshal_load(dump) end
  1905. end
  1906.  
  1907. module Graphics
  1908. FindWindow = Win32API.new('user32', 'FindWindow' , 'pp' , 'i')
  1909. GetDC = Win32API.new('user32', 'GetDC' , 'i' , 'i')
  1910. ReleaseDC = Win32API.new('user32', 'ReleaseDC' , 'ii' , 'i')
  1911. BitBlt = Win32API.new('gdi32' , 'BitBlt' , 'iiiiiiiii', 'i')
  1912. CreateCompatibleBitmap = Win32API.new('gdi32' , 'CreateCompatibleBitmap', 'iii' , 'i')
  1913. CreateCompatibleDC = Win32API.new('gdi32' , 'CreateCompatibleDC' , 'i' , 'i')
  1914. DeleteDC = Win32API.new('gdi32' , 'DeleteDC' , 'i' , 'i')
  1915. DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i')
  1916. GetDIBits = Win32API.new('gdi32' , 'GetDIBits' , 'iiiiipi' , 'i')
  1917. SelectObject = Win32API.new('gdi32' , 'SelectObject' , 'ii' , 'i')
  1918. def self.snap_to_bitmap
  1919. bitmap = Bitmap.new(width, height)
  1920. info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
  1921. hDC = GetDC.call(hwnd)
  1922. bmp_hDC = CreateCompatibleDC.call(hDC)
  1923. bmp_hBM = CreateCompatibleBitmap.call(hDC, width, height)
  1924. bmp_obj = SelectObject.call(bmp_hDC, bmp_hBM)
  1925. BitBlt.call(bmp_hDC, 0, 0, width, height, hDC, 0, 0, 0xCC0020)
  1926. GetDIBits.call(bmp_hDC, bmp_hBM, 0, height, bitmap.last_row_address, info, 0)
  1927. SelectObject.call(bmp_hDC, bmp_obj)
  1928. DeleteObject.call(bmp_hBM)
  1929. DeleteDC.call(bmp_hDC)
  1930. ReleaseDC.call(hwnd, hDC)
  1931. bitmap
  1932. end
  1933.  
  1934. class << self
  1935. def hwnd() @hwnd ||= FindWindow.call('RGSS Player', nil) end
  1936. def width() 640 end unless method_defined?(:width)
  1937. def height() 480 end unless method_defined?(:height)
  1938. def export(filename=Time.now.strftime("snapshot %Y-%m-%d %Hh%Mm%Ss #{frame_count}"))
  1939. bitmap = snap_to_bitmap
  1940. bitmap.export(filename)
  1941. bitmap.dispose
  1942. end
  1943. alias save export
  1944. alias snapshot export
  1945. end
  1946. end
  1947. ####################
  1948.  
  1949. class ItemBaseSprite < RPG::Sprite
  1950. def initialize(*args)
  1951. super
  1952. @frameEffect=0
  1953. end
  1954.  
  1955. def makeVisible
  1956. self.visible=true
  1957. @frameEffect=0
  1958. end
  1959.  
  1960. def update
  1961. super
  1962. @frameEffect+=1
  1963. if @frameEffect==12
  1964. self.visible=false
  1965. elsif @frameEffect==24
  1966. self.visible=true
  1967. @frameEffect=0
  1968. end
  1969. end
  1970. end
  1971. class Window_PocketsList < Window_DrawableCommand
  1972. attr_accessor :stock
  1973.  
  1974. def initialize(stock,x,y,width,height,viewport=nil)
  1975. @stock=stock
  1976. super(x,y,width,height,viewport)
  1977. @baseColor=Color.new(88,88,80)
  1978. @shadowColor=Color.new(168,184,184)
  1979. @commands=@stock
  1980. end
  1981.  
  1982. def itemsInPocket
  1983. return @stock[self.index][1]>0
  1984. end
  1985.  
  1986. def itemCount
  1987. return @stock.length
  1988. end
  1989.  
  1990. def drawItem(index,count,rect)
  1991. pbSetSystemFont(self.contents) if @starting
  1992. rect=drawCursor(index,rect)
  1993. if index!=@stock.length-1
  1994. maxitems=@stock[index][2]
  1995. items=@stock[index][1]
  1996. pbDrawTextPositions(self.contents,[
  1997. [_INTL("{1}/{2}",items,maxitems),rect.width,rect.y,1,self.baseColor,self.shadowColor]
  1998. ])
  1999. end
  2000. pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,
  2001. @stock[index][0],self.baseColor,self.shadowColor)
  2002. end
  2003. end
  2004.  
  2005. class Window_ItemListBase < Window_DrawableCommand
  2006. def initialize(stock,x,y,width,height,viewport=nil)
  2007. @stock=stock
  2008. @itemUsing=AnimatedBitmap.new("Graphics/Pictures/secretBaseUsing")
  2009. super(x,y,width,height,viewport)
  2010. @baseColor=Color.new(88,88,80)
  2011. @shadowColor=Color.new(168,184,184)
  2012. end
  2013.  
  2014. def itemCount
  2015. return @stock.length
  2016. end
  2017.  
  2018. def item
  2019. return self.index==itemCount-1 ? 0 : @stock[self.index][0]
  2020. end
  2021.  
  2022. def drawItem(index,count,rect)
  2023. textpos=[]
  2024. rect=drawCursor(index,rect)
  2025. ypos=rect.y
  2026. if index==itemCount-1
  2027. itemname=@stock[index]
  2028. else
  2029. itemname=baseItemName(@stock[index][0])
  2030. if @stock[index][1]
  2031. pbCopyBitmap(self.contents,@itemUsing.bitmap,rect.width-16,ypos+6)
  2032. end
  2033. end
  2034. textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
  2035. pbDrawTextPositions(self.contents,textpos)
  2036. end
  2037. end
  2038.  
  2039. class DecorateItem
  2040. def initialize
  2041. commands=[]
  2042. ret=-1
  2043. for i in 0...BASEBAGPOCKETS.length
  2044. pocket=BASEBAGPOCKETS[i]
  2045. items=$PokemonGlobal.basePocketLength(i)
  2046. commands.push([pocket[0],items,pocket[1]])
  2047. end
  2048. commands.push(["Cancel",-1,-1])
  2049. cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2050. cmdwindow.z=99999
  2051. cmdwindow.visible=true
  2052. cmdwindow.index=0
  2053. loop do
  2054. Graphics.update
  2055. Input.update
  2056. cmdwindow.update
  2057. if Input.trigger?(Input::C)
  2058. break if cmdwindow.index==cmdwindow.stock.length-1
  2059. if !cmdwindow.itemsInPocket
  2060. cmdwindow.visible=false
  2061. Kernel.pbMessage("There are no decorations.")
  2062. cmdwindow.visible=true
  2063. else
  2064. ret=cmdwindow.index
  2065. break
  2066. end
  2067. elsif Input.trigger?(Input::B)
  2068. ret=-1
  2069. break
  2070. end
  2071. end
  2072. cmdwindow.dispose
  2073. itemList(ret) if ret!=-1
  2074. end
  2075.  
  2076. def pbPrepareWindow(window)
  2077. window.visible=true
  2078. window.letterbyletter=false
  2079. end
  2080.  
  2081. def itemList(pocket)
  2082. ret=-1
  2083. pocket=$PokemonGlobal.getBasePocket(pocket)
  2084. items=[]
  2085. for i in 0...pocket.length
  2086. items.push(pocket[i])
  2087. end
  2088. items.push("Cancel")
  2089. cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2090. cmdwindow.index=0
  2091. cmdwindow.refresh
  2092. oldindex=cmdwindow.index
  2093. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2094. "Go back to the previous menu."
  2095. descwindow=Window_AdvancedTextPokemon.new(desc)
  2096. pbPrepareWindow(descwindow)
  2097. descwindow.visible=true
  2098. descwindow.x=Graphics.width/2
  2099. descwindow.y=DEFAULTSCREENHEIGHT-128
  2100. descwindow.width=Graphics.width/2
  2101. descwindow.height=128
  2102. descwindow.baseColor=Color.new(88,88,80)
  2103. descwindow.shadowColor=Color.new(168,184,184)
  2104.  
  2105. loop do
  2106. Graphics.update
  2107. Input.update
  2108. cmdwindow.update
  2109. if oldindex!=cmdwindow.index
  2110. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2111. "Go back to the previous menu."
  2112. descwindow.text=desc
  2113. oldindex=cmdwindow.index
  2114. end
  2115.  
  2116. if Input.trigger?(Input::C)
  2117. if cmdwindow.index==cmdwindow.itemCount-1
  2118. ret=-1
  2119. break
  2120. else
  2121. if pocket[cmdwindow.index][1]
  2122. descwindow.visible=false
  2123. cmdwindow.visible=false
  2124. Kernel.pbMessage("This is in use already.")
  2125. descwindow.visible=true
  2126. cmdwindow.visible=true
  2127. else
  2128. ret=cmdwindow.index
  2129. break
  2130. end
  2131. end
  2132. elsif Input.trigger?(Input::B)
  2133. ret=-1
  2134. break
  2135. end
  2136. end
  2137. cmdwindow.dispose
  2138. descwindow.dispose
  2139. if ret!=-1
  2140. startDecoration(pocket[ret],ret)
  2141. else
  2142. initialize
  2143. end
  2144. end
  2145.  
  2146. def startDecoration(item,itemnum)
  2147. scene=PokemonDecoration.new
  2148. scene.pbStartScene
  2149. scene.pbCreatePlaceItem(item)
  2150. placed=scene.pbPlaceItem(item)
  2151.  
  2152. if placed
  2153. item[1]=true
  2154. end
  2155. initialize
  2156. end
  2157. end
  2158.  
  2159. class TossItem
  2160. def initialize
  2161. commands=[]
  2162. ret=-1
  2163. for i in 0...BASEBAGPOCKETS.length
  2164. pocket=BASEBAGPOCKETS[i]
  2165. items=$PokemonGlobal.basePocketLength(i)
  2166. commands.push([pocket[0],items,pocket[1]])
  2167. end
  2168. commands.push(["Cancel",-1,-1])
  2169. cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2170. cmdwindow.z=99999
  2171. cmdwindow.visible=true
  2172. cmdwindow.index=0
  2173. loop do
  2174. Graphics.update
  2175. Input.update
  2176. cmdwindow.update
  2177. if Input.trigger?(Input::C)
  2178. break if cmdwindow.index==cmdwindow.stock.length-1
  2179. if !cmdwindow.itemsInPocket
  2180. cmdwindow.visible=false
  2181. Kernel.pbMessage("There are no decorations.")
  2182. cmdwindow.visible=true
  2183. else
  2184. ret=cmdwindow.index
  2185. break
  2186. end
  2187. elsif Input.trigger?(Input::B)
  2188. ret=-1
  2189. break
  2190. end
  2191. end
  2192. cmdwindow.dispose
  2193. itemList(ret) if ret!=-1
  2194. end
  2195.  
  2196. def pbPrepareWindow(window)
  2197. window.visible=true
  2198. window.letterbyletter=false
  2199. end
  2200.  
  2201. def itemList(pocketr)
  2202. ret=-1
  2203. pocket=$PokemonGlobal.getBasePocket(pocketr)
  2204. items=[]
  2205. for i in 0...pocket.length
  2206. items.push(pocket[i])
  2207. end
  2208. items.push("Cancel")
  2209. cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
  2210. cmdwindow.index=0
  2211. cmdwindow.refresh
  2212. oldindex=cmdwindow.index
  2213. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2214. "Go back to the previous menu."
  2215. descwindow=Window_AdvancedTextPokemon.new(desc)
  2216. pbPrepareWindow(descwindow)
  2217. descwindow.visible=true
  2218. descwindow.x=Graphics.width/2
  2219. descwindow.y=DEFAULTSCREENHEIGHT-128
  2220. descwindow.width=Graphics.width/2
  2221. descwindow.height=128
  2222. descwindow.baseColor=Color.new(88,88,80)
  2223. descwindow.shadowColor=Color.new(168,184,184)
  2224.  
  2225. loop do
  2226. Graphics.update
  2227. Input.update
  2228. cmdwindow.update
  2229. if oldindex!=cmdwindow.index
  2230. desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
  2231. "Go back to the previous menu."
  2232. descwindow.text=desc
  2233. oldindex=cmdwindow.index
  2234. end
  2235.  
  2236. if Input.trigger?(Input::C)
  2237. if cmdwindow.index==cmdwindow.itemCount-1
  2238. ret=-1
  2239. break
  2240. else
  2241. if pocket[cmdwindow.index][1]
  2242. descwindow.visible=false
  2243. cmdwindow.visible=false
  2244. Kernel.pbMessage("This decoration is in use.\nIt can't be thrown away.")
  2245. descwindow.visible=true
  2246. cmdwindow.visible=true
  2247. else
  2248. ret=cmdwindow.index
  2249. break
  2250. end
  2251. end
  2252. elsif Input.trigger?(Input::B)
  2253. ret=-1
  2254. break
  2255. end
  2256. end
  2257.  
  2258. cmdwindow.dispose
  2259. descwindow.dispose
  2260.  
  2261. if ret!=-1 # Item selected
  2262. n=$PokemonGlobal.getBasePocket(pocketr)
  2263. itemname=baseItemName(n[ret][0])
  2264. if Kernel.pbConfirmMessage(_INTL("This {1} will be discarded\nIs that okay?",itemname))
  2265. n.delete_at(ret)
  2266. Kernel.pbMessage("The decoration item was thrown away.")
  2267. itemList(pocketr)
  2268. else
  2269. initialize # Back
  2270. end
  2271. else # Back
  2272. initialize
  2273. end
  2274.  
  2275. end
  2276.  
  2277. end
  2278.  
  2279. class DecorationPC
  2280. def shouldShow?
  2281. return true
  2282. end
  2283.  
  2284. def access
  2285. loop do
  2286. command=Kernel.pbShowCommandsWithHelp(nil,
  2287. [_INTL("Decorate"),
  2288. _INTL("Put away"),
  2289. _INTL("Toss"),
  2290. _INTL("Cancel")],
  2291. [_INTL("Put out the selected decoration item."),
  2292. _INTL("Store the chosen decoration in the PC."),
  2293. _INTL("Throw away unwanted decorations."),
  2294. _INTL("Go back to the previous menu.")],-1
  2295. )
  2296. if command==0
  2297. scene=DecorateItem.new
  2298. elsif command==1
  2299. scene=PokemonDecoration.new
  2300. scene.pbStartScene
  2301. scene.pbCreatePutAway
  2302. scene.pbPutAway
  2303. elsif command==2
  2304. scebe=TossItem.new
  2305. else
  2306. break
  2307. end
  2308. end
  2309. end
  2310. end
  2311.  
  2312. class PackUpPC
  2313. def shouldShow?
  2314. return true
  2315. end
  2316.  
  2317. def packup(eventid)
  2318. #$scene.disposeSpritesets
  2319. # Reload the original map data
  2320. $game_map.backToOriginal
  2321.  
  2322. # Back all items to pc
  2323. for p in 0...BASEBAGPOCKETS.length
  2324. pocket=$PokemonGlobal.getBasePocket(p)
  2325. for i in 0...pocket.length
  2326. pocket[i][1]=false
  2327. end
  2328. end
  2329. #$scene.createSpritesets
  2330.  
  2331. $PokemonGlobal.installed=false
  2332. $PokemonGlobal.mybaseid=-1
  2333. $PokemonGlobal.mybaselocation=-1
  2334.  
  2335. $game_self_switches[[$game_map.map_id,eventid,"B"]]=true
  2336. $game_map.need_refresh=true
  2337. end
  2338.  
  2339. def access
  2340. Kernel.pbMessage(_INTL("All decorations and furniture in your Secret Base will be returned to your PC.\1"))
  2341. if !Kernel.pbConfirmMessage(
  2342. _INTL("Is that okay?"))
  2343. return false
  2344. end
  2345. return true
  2346. end
  2347. end
  2348.  
  2349. def pbSecretBasePC
  2350. copyMapData
  2351. Kernel.pbMessage(_INTL("\\se[accesspc]{1} booted up the PC.",$Trainer.name))
  2352. loop do
  2353. commands=["Decoration","Pack up","Exit"]
  2354. command=Kernel.pbMessage(_INTL("What would you like to do?"),
  2355. commands,commands.length)
  2356. if command==0
  2357. scene=DecorationPC.new
  2358. scene.access
  2359. elsif command==1
  2360. scene=PackUpPC.new
  2361. if scene.access
  2362. scene.packup(get_character(0).id)
  2363. break
  2364. end
  2365. else
  2366. pbSEPlay("computerclose")
  2367. break
  2368. end
  2369. end
  2370. copyMapData
  2371. end
  2372.  
  2373. #===============================================================================
  2374. # Mart system
  2375. #===============================================================================
  2376.  
  2377. class Window_BaseMart < Window_DrawableCommand
  2378. def initialize(stock,x,y,width,height,viewport=nil)
  2379. @stock=stock
  2380. super(x,y,width,height,viewport)
  2381. @baseColor=Color.new(88,88,80)
  2382. @shadowColor=Color.new(168,184,184)
  2383. self.windowskin=nil
  2384. end
  2385.  
  2386. def itemCount
  2387. return @stock.length+1
  2388. end
  2389.  
  2390. def item
  2391. return self.index>=@stock.length ? 0 : @stock[self.index]
  2392. end
  2393.  
  2394. def getDisplayPrice(id)
  2395. price=baseItemCost(id)
  2396. return _ISPRINTF("${1:d}",price)
  2397. end
  2398.  
  2399. def drawItem(index,count,rect)
  2400. textpos=[]
  2401. rect=drawCursor(index,rect)
  2402. ypos=rect.y
  2403. if index==count-1
  2404. textpos.push([_INTL("CANCEL"),rect.x,ypos+2,false,
  2405. self.baseColor,self.shadowColor])
  2406. else
  2407. item=@stock[index]
  2408. itemname=baseItemName(item)
  2409. qty=getDisplayPrice(item)
  2410. sizeQty=self.contents.text_size(qty).width
  2411. xQty=rect.x+rect.width-sizeQty-2-16
  2412. textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
  2413. textpos.push([qty,xQty,ypos+2,false,self.baseColor,self.shadowColor])
  2414. end
  2415. pbDrawTextPositions(self.contents,textpos)
  2416. end
  2417. end
  2418.  
  2419. def pbBottomLeftLinesScreen(window,lines,width=nil)
  2420. window.x=0
  2421. window.width=width ? width : Graphics.width
  2422. window.height=(window.borderY rescue 32)+lines*32
  2423. window.y=DEFAULTSCREENHEIGHT-window.height
  2424. end
  2425.  
  2426.  
  2427. class SecretBaseMartScene
  2428.  
  2429. def update
  2430. pbUpdateSpriteHash(@sprites)
  2431. end
  2432.  
  2433. def pbPrepareWindow(window)
  2434. window.visible=true
  2435. window.letterbyletter=false
  2436. end
  2437.  
  2438. def initialize(stock)
  2439. pbScrollMap(6,3,5)
  2440. @adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
  2441. @viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
  2442. @viewport.z=99999
  2443. @sprites={}
  2444. @sprites["background"]=IconSprite.new(0,0,@viewport)
  2445. @sprites["background"].setBitmap("Graphics/Pictures/secretMartScreen")
  2446. @sprites["itemwindow"]=Window_BaseMart.new(stock,
  2447. Graphics.width-266,12,278,DEFAULTSCREENHEIGHT-32)
  2448. @sprites["itemwindow"].viewport=@viewport
  2449. @sprites["itemwindow"].index=0
  2450. @sprites["itemwindow"].refresh
  2451.  
  2452. @sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
  2453. pbPrepareWindow(@sprites["itemtextwindow"])
  2454. @sprites["itemtextwindow"].y=DEFAULTSCREENHEIGHT-112
  2455. @sprites["itemtextwindow"].width=Graphics.width/2
  2456. @sprites["itemtextwindow"].height=128
  2457. @sprites["itemtextwindow"].baseColor=Color.new(248,248,248)
  2458. @sprites["itemtextwindow"].shadowColor=Color.new(0,0,0)
  2459. @sprites["itemtextwindow"].visible=true
  2460. @sprites["itemtextwindow"].viewport=@viewport
  2461. @sprites["itemtextwindow"].windowskin=nil
  2462.  
  2463. @sprites["helpwindow"]=Window_AdvancedTextPokemon.new("")
  2464. pbPrepareWindow(@sprites["helpwindow"])
  2465. @sprites["helpwindow"].visible=false
  2466. @sprites["helpwindow"].viewport=@viewport
  2467. pbBottomLeftLinesScreen(@sprites["helpwindow"],1)
  2468.  
  2469. @sprites["moneywindow"]=Window_AdvancedTextPokemon.new("")
  2470. pbPrepareWindow(@sprites["moneywindow"])
  2471. @sprites["moneywindow"].setSkin("Graphics/Windowskins/goldskin")
  2472. @sprites["moneywindow"].visible=true
  2473. @sprites["moneywindow"].viewport=@viewport
  2474. @sprites["moneywindow"].x=0
  2475. @sprites["moneywindow"].y=0
  2476. @sprites["moneywindow"].width=190
  2477. @sprites["moneywindow"].height=96
  2478. @sprites["moneywindow"].baseColor=Color.new(88,88,80)
  2479. @sprites["moneywindow"].shadowColor=Color.new(168,184,184)
  2480. pbDeactivateWindows(@sprites)
  2481. pbUpdate
  2482. end
  2483.  
  2484. def pbUpdate
  2485. @sprites["itemicon"].dispose if @sprites["itemicon"]
  2486. iconbitmap=(@sprites["itemwindow"].item==0) ? BitmapCache.load_bitmap("Graphics/Icons/itemBack") :
  2487. getBaseItemBitmap(@sprites["itemwindow"].item)
  2488. @sprites["itemicon"]=PictureWindow.new(iconbitmap)
  2489. @sprites["itemicon"].viewport=@viewport
  2490. @sprites["itemicon"].x=4
  2491. @sprites["itemicon"].y=278-@sprites["itemicon"].height
  2492. @sprites["moneywindow"].text=_INTL("Money:\n<r>${1}",@adapter.getMoney())
  2493.  
  2494. @sprites["itemtextwindow"].text=(@sprites["itemwindow"].item==0) ? _INTL("Quit shopping.") :
  2495. baseItemDesc(@sprites["itemwindow"].item)
  2496. end
  2497.  
  2498. def pbEndScene
  2499. pbDisposeSpriteHash(@sprites)
  2500. pbScrollMap(4,3,5)
  2501. pbWait(1)
  2502. end
  2503.  
  2504. def pbDisplayPaused(msg)
  2505. cw=@sprites["helpwindow"]
  2506. cw.letterbyletter=true
  2507. cw.text=msg
  2508. pbBottomLeftLinesScreen(cw,2)
  2509. cw.visible=true
  2510. i=0
  2511. pbPlayDecisionSE()
  2512. loop do
  2513. Graphics.update
  2514. Input.update
  2515. wasbusy=cw.busy?
  2516. self.update
  2517. if !cw.busy? && wasbusy
  2518. pbUpdate
  2519. end
  2520. if Input.trigger?(Input::C) && cw.resume && !cw.busy?
  2521. @sprites["helpwindow"].visible=false
  2522. return
  2523. end
  2524. end
  2525. end
  2526.  
  2527. def pbChooseBuyItem
  2528. oldindex=@sprites["itemwindow"].index
  2529. pbActivateWindow(@sprites,"itemwindow"){
  2530. loop do
  2531. if oldindex!=@sprites["itemwindow"].index
  2532. pbUpdate
  2533. oldindex=@sprites["itemwindow"].index
  2534. end
  2535. Graphics.update
  2536. Input.update
  2537. self.update
  2538. if Input.trigger?(Input::C)
  2539. return @sprites["itemwindow"].item
  2540. elsif Input.trigger?(Input::B)
  2541. return 0
  2542. end
  2543. end
  2544. }
  2545. end
  2546.  
  2547. end
  2548.  
  2549. class SecretBaseMartScreen
  2550. def initialize(scene)
  2551. @scene=scene
  2552. @adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
  2553. end
  2554.  
  2555. def pbDisplayPaused(msg)
  2556. return @scene.pbDisplayPaused(msg)
  2557. end
  2558.  
  2559. def pbBuyScreen
  2560. loop do
  2561. @item=@scene.pbChooseBuyItem
  2562. if @item>0
  2563. itemname=baseItemName(@item)
  2564. price=baseItemCost(@item)
  2565. if @adapter.getMoney()<price
  2566. pbDisplayPaused(_INTL("You don't have enough money."))
  2567. next
  2568. else
  2569. itempocket=baseItemPocket(@item)
  2570. if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
  2571. @adapter.setMoney(@adapter.getMoney()-price)
  2572. pbDisplayPaused(_INTL("Here you are!\r\nThank you!"))
  2573. pbGetBaseItem(@item)
  2574. next
  2575. else
  2576. pbDisplayPaused(_INTL("The space for {1} is full.",itemname))
  2577. next
  2578. end
  2579. end
  2580. else
  2581. break
  2582. end
  2583. end
  2584. @scene.pbEndScene
  2585. end
  2586. end
  2587.  
  2588. def pbSecretBaseMart(stock,speech=nil)
  2589. for i in 0...stock.length
  2590. if stock[i].is_a?(String)
  2591. stock[i]=getBaseItemByName(stock[i])
  2592. end
  2593. end
  2594. stock.compact!
  2595. commands=[]
  2596. cmdBuy=-1
  2597. cmdSell=-1
  2598. cmdQuit=-1
  2599. commands[cmdBuy=commands.length]=_INTL("BUY")
  2600. commands[cmdQuit=commands.length]=_INTL("QUIT")
  2601. cmd=Kernel.pbMessage(
  2602. speech ? speech : _INTL("Welcome!\r\nHow may I serve you?"),
  2603. commands,cmdQuit+1)
  2604. loop do
  2605. if cmdBuy>=0 && cmd==cmdBuy
  2606. sscene=SecretBaseMartScene.new(stock)
  2607. sscreen=SecretBaseMartScreen.new(sscene)
  2608. sscreen.pbBuyScreen
  2609. else
  2610. Kernel.pbMessage(_INTL("Please come again!"))
  2611. break
  2612. end
  2613. cmd=Kernel.pbMessage(
  2614. _INTL("Is there anything else I can help you with?"),commands,cmdQuit+1)
  2615. end
  2616. end
  2617.  
  2618. #===============================================================================
  2619. # Creating secret bases
  2620. #===============================================================================
  2621.  
  2622. def pbTeletransport(id,x,y)
  2623. Kernel.pbCancelVehicles
  2624. $game_temp.player_new_map_id=id
  2625. $game_temp.player_new_x=x
  2626. $game_temp.player_new_y=y
  2627. $game_temp.player_new_direction=8
  2628. $scene.transfer_player
  2629. $game_map.autoplay
  2630. $game_map.refresh
  2631. end
  2632.  
  2633. def pbPackup(id)
  2634. for p in 0...BASEBAGPOCKETS.length
  2635. pocket=$PokemonGlobal.getBasePocket(p)
  2636. for i in 0...pocket.length
  2637. pocket[i][1]=false
  2638. end
  2639. end
  2640. $PokemonGlobal.installed=false
  2641. $PokemonGlobal.mybaseid=-1
  2642. $PokemonGlobal.mybaselocation=-1
  2643.  
  2644. if $PokemonGlobal.baseinfo && $PokemonGlobal.baseinfo[id]
  2645. $PokemonGlobal.baseinfo[id].clear
  2646. $PokemonGlobal.baseinfo[id]=nil
  2647. end
  2648. end
  2649.  
  2650. def pbNewSecretBase
  2651. newBaseId=get_character(0).name.gsub("SECRETBASE", "").to_i
  2652. movefinder=Kernel.pbCheckMove(BASEMOVENEEDED)
  2653. if movefinder && $PokemonGlobal.getBaseId>=0
  2654. Kernel.pbMessage("You may only make one secret base.\1")
  2655. mapname=pbGetMapNameFromId($PokemonGlobal.getBaseLocation)
  2656. movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
  2657. if Kernel.pbConfirmMessage(_INTL("Would you like to move from the secret base near {1}?",mapname))
  2658. Kernel.pbMessage(_INTL("All decorations and furniture in your secret base will be returned to your PC.\1"))
  2659. if Kernel.pbConfirmMessage(_INTL("Is that okay?"))
  2660. pbPackup($PokemonGlobal.getBaseId)
  2661. $PokemonGlobal.mybaseid=-1
  2662. $PokemonGlobal.mybaselocation=-1
  2663. $game_map.reloadEventsForBase
  2664. pbFlash(Color.new(0,0,0),16)
  2665. pbWait(18)
  2666. Kernel.pbMessage(_INTL("Moving complete.\1"))
  2667. if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
  2668. speciesname=!movefinder ? $Trainer.name : movefinder.name
  2669. Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
  2670. pbHiddenMoveAnimation(movefinder)
  2671. $PokemonGlobal.mybaseid=newBaseId
  2672. $PokemonGlobal.mybaselocation=$game_map.map_id
  2673. $PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
  2674. $game_map.reloadEventsForBase
  2675. return true
  2676. end
  2677. end
  2678. end
  2679. elsif movefinder
  2680. movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
  2681. if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
  2682. speciesname=!movefinder ? $Trainer.name : movefinder.name
  2683. Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
  2684. pbHiddenMoveAnimation(movefinder)
  2685. $PokemonGlobal.mybaseid=newBaseId
  2686. $PokemonGlobal.mybaselocation=$game_map.map_id
  2687. $PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
  2688. $game_map.reloadEventsForBase
  2689. return true
  2690. end
  2691. end
  2692. return false
  2693. end
  2694.  
  2695. def getDoorPos(map)
  2696. map=load_data(sprintf("Data/Map%03d.%s", map,$RPGVX ? "rvdata" : "rxdata"))
  2697. map.events.each do |i, event|
  2698. return [event.x, event.y] if event.name=="DOOR"
  2699. end
  2700. return [0,0]
  2701. end
  2702.  
  2703. def pbInstallingBase
  2704. if Kernel.pbConfirmMessage("Want to make your secret base here?")
  2705. $PokemonGlobal.installed=true
  2706. return true
  2707. else
  2708. $PokemonGlobal.installed=false
  2709. $PokemonGlobal.mybaseid=-1
  2710. $PokemonGlobal.mybaselocation=-1
  2711. return false
  2712. end
  2713. end
  2714.  
  2715. class Game_Map
  2716.  
  2717. def reloadEventsForBase
  2718. for i in @events.keys
  2719. if @events[i] && @events[i].rEvent && @events[i].rEvent.name.include?("SECRETBASE")
  2720. mapid=@events[i].rEvent.name.gsub("SECRETBASE", "").to_i
  2721. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2722. if mapid==$PokemonGlobal.getBaseId
  2723. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2724. end
  2725. @need_refresh=true
  2726. end
  2727. end
  2728. end
  2729.  
  2730. def searchForMyBase
  2731. for i in @map.events.keys
  2732. if @map.events[i].name.include?("SECRETBASE")
  2733. mapid=@map.events[i].name.gsub("SECRETBASE", "").to_i
  2734. @events[i].rEvent=@map.events[i].clone
  2735. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2736. if mapid==$PokemonGlobal.getBaseId
  2737. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2738. end
  2739. elsif @map.events[i].name.include?("BASEPC")
  2740. # Disable self switches
  2741. $game_self_switches[[@map_id,@events[i].id,"B"]]=false
  2742. $game_self_switches[[@map_id,@events[i].id,"A"]]=false
  2743. # Make available pcs if it's your base
  2744. if $game_map.map_id==$PokemonGlobal.getBaseId && $PokemonGlobal.installed
  2745. $game_self_switches[[@map_id,@events[i].id,"A"]]=true
  2746. end
  2747. end
  2748. end
  2749. @need_refresh=true
  2750. end
  2751. end
  2752.  
  2753. #===============================================================================
  2754. # ■ Functions for users
  2755. #===============================================================================
  2756. # - pbMakeNumericTileset(TILESETNAME)
  2757. # This will save in your project's folder the tileset you've selected
  2758. # with a numeric patron.
  2759. #===============================================================================
  2760.  
  2761. def pbGetBaseItem(itemid)
  2762. item=itemid
  2763. if itemid.is_a?(String)
  2764. item=getBaseItemByName(itemid)
  2765. end
  2766. itempocket=baseItemPocket(item)
  2767. if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
  2768. $PokemonGlobal.baseItemBag[itempocket].push([item,false])
  2769. return true
  2770. end
  2771. return false
  2772. end
  2773.  
  2774. def pbMakeNumericTileset(name)
  2775. file=sprintf("Graphics/Tilesets/"+name)
  2776. return if !FileTest.image_exist?(file)
  2777. tileset=BitmapCache.load_bitmap(file)
  2778. numericSet=tileset.clone
  2779. pbSetSystemFont(numericSet)
  2780. numericSet.font.size=21
  2781. for width in 0...numericSet.width/32
  2782. for height in 0...numericSet.height/32
  2783. number=(width+(height*8)).to_s
  2784. nsize=numericSet.text_size(number)
  2785. text=[[
  2786. number,(width+1)*32-16,height*32,2,Color.new(255,0,0),Color.new(0,0,0)
  2787. ]]
  2788. pbDrawTextPositions(numericSet,text)
  2789. end
  2790. end
  2791. numericSet.export(sprintf(name+"_numeric"))
  2792. Kernel.pbMessage(_INTL("Saved in game's folder: {1}_numeric",name))
  2793. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement