- 159
- Posts
- 12
- Years
- Hope Peak's Academy
- Seen May 20, 2025
Edit: I was able to figure it out somehow. For some reason I could only edit on one of the premade Secret Bases.
I was able to convert Klein's Secret Base script to work on 17.2 just by tweaking the script a bit. (I can post a tutorial on how later.)
My problem is that I want to use this script for the Player's house, but the titleset just kind of goes wonky if I use any other tile for the walls or floor. I'd rather directly ask Klein himself but everywhere I can find him on the internet he doesn't seem to be active, so I'm hoping that I can find help here. (He hasn't touched Pokemon Community for two years.)
Here's the titleset I'm trying to use
This is basically the same titleset but with added stuff. I'm trying to use the blueish wall and the wooden floors for the house. The terrain tag for them matches the terrain tag I need to use for the Secret Base items but whenever I go into the game this happens.
I have absolutely no idea why this happens. This only happens when the map name matches the "Secret Map Name." (In the image it may look like I'm at "\PN's House" but the map I'm in is called "My House")
Here's the code I tweaked... It's really big but I'm hoping that somebody could just kind of know what the problem is? Or better yet, know how to contact Klein so I can ask him for help.
I'm... I'm sorry.
I was able to convert Klein's Secret Base script to work on 17.2 just by tweaking the script a bit. (I can post a tutorial on how later.)
My problem is that I want to use this script for the Player's house, but the titleset just kind of goes wonky if I use any other tile for the walls or floor. I'd rather directly ask Klein himself but everywhere I can find him on the internet he doesn't seem to be active, so I'm hoping that I can find help here. (He hasn't touched Pokemon Community for two years.)
Here's the titleset I'm trying to use
Spoiler:
![[PokeCommunity.com] Secret Base mapping help[Solved] [PokeCommunity.com] Secret Base mapping help[Solved]](https://i.ibb.co/59YD0nG/bases.png)
This is basically the same titleset but with added stuff. I'm trying to use the blueish wall and the wooden floors for the house. The terrain tag for them matches the terrain tag I need to use for the Secret Base items but whenever I go into the game this happens.
Spoiler:
![[PokeCommunity.com] Secret Base mapping help[Solved] [PokeCommunity.com] Secret Base mapping help[Solved]](https://i.ibb.co/hgcgxZj/9c1b6fd543f9de7c0ceb205685fbe8cb.jpg)
I have absolutely no idea why this happens. This only happens when the map name matches the "Secret Map Name." (In the image it may look like I'm at "\PN's House" but the map I'm in is called "My House")
Here's the code I tweaked... It's really big but I'm hoping that somebody could just kind of know what the problem is? Or better yet, know how to contact Klein so I can ask him for help.
Spoiler:
Code:
#===============================================================================
# ■ Klein's Secret Bases script for Essentials
# Version 1 (4/5/15)
# - https://kleinstudio.deviantart.com
# Be sure to give credits if you're using this.
# - How to use
# * Creating the secret base map
# - Map needs to be named how you've configured it in SECRETBASEMAPNAME
# by defaul you've to named them "Secret Base" **IMPORTANT**
# - Event for PC needs to be called BASEPC. **IMPORTANT**
# * For info about BASEPC event check the events in the demo.
# - If you make holes, they need to be in layer 2.
#
# * Creating the entrance for a secret base
# - Event for entrance needs to be called SECRETBASE+Secret base map ID.
# * For example, if this entrance goes to secret base with map id 32,
# the event needs to be called SECRETBASE32
# * For info about SECRETBASE event, check the events in the demo.
#
#===============================================================================
# ■ General settings
#===============================================================================
# Map id where items events are allocated
ITEMSMAP=33
# Secret Bases tileset name
SECRETBASETILESET="bases"
# Name for secret bases maps
SECRETBASEMAPNAME="My House"
# Allow to place dolls and pushions everywhere
DOLLSEVERYWHERE=true
# Terrain tag for ground decorations that already are in
# base, for example rocks or bushes in layer 1
# if your ground decoration is in layer 2 or 3, don't worry
# about this.
GROUNDDECORATION=22
# Terrain tag for walls
# You can post posters in every tile with this terrain tag
WALLTERRAINTAG=1
# Terrain tag for special items that can be used
# for place dolls.
ITEMFORDOLL=2
# Move needed for make secret bases
BASEMOVENEEDED=:SECRETPOWER
#===============================================================================
# ■ Secret Base Bag pockets
# [Pocket name, max items]
#===============================================================================
BASEBAGPOCKETS=[
["Desk",10],
["Chair",10],
["Plant",10],
["Ornament",30],
["Mat",30],
["Poster",10],
["Doll",40],
["Cushion",10],
]
#===============================================================================
# Type of items
#===============================================================================
module ItemType
DESK=0
CHAIR=1
PLANT=2
ORNAMENT=3
MAT=4
POSTER=5
DOLL=6
CUSHION=7
end
#===============================================================================
# ■ Items are stored here
# To add a new item place this in the last position (* New Items)
# ["name", tileid, width, height, prize, event, type, board, "description"],
#
# -Explanation
# * Name - Item name
# * Tileid - Item tile id **************READ*****************
# Imagine this is a tileset, tiles id are like this
# [00][01][02][03][04][05][06][07]
# [08][09][10][11][12][13][14][15]
# [16][17][18][19][20][21][22][23]...
#
# The tile id placed here has to be the top-left tile id of the item-
# **********FAST USER FUNCTION**********
# You can use pbMakeNumericTileset(TILESETNAME) for create a new .png
# in the game's folder with a tileset and a numeric patron.
#
# * Witdh
# - Width in tiles (1, 2...)
# *If the item is an event item, leave this in 1
# * Height
# - Height in tiles (1, 2...)
# *If the item is an event item, leave this in 1
# * Prize - Prize when shopping
# * Event - Event id
# If you don't want you item to be an event just place 'nil' here
# * Creating interactable items **************READ*****************
# If you want your item to be interactable create a new event in the
# ITEMSMAP and write here the event id. Interactable items are not tiles
# so you need to select a graphic in the event if you don't want it to be
# invisible.
#
# * Type - Type of item (ItemType::POSTER, ItemType::DESK...)
# Some types has specials features:
# *POSTER - This item only can be placed in a WALLTERRAINTAG tile.
# Also *CUSHION and *DOLL can only be placed in items marked as table if
# you don't enable DOLLSEVERYWHERE. Dolls and cushions ALWAYS needs to be
# events items.
#
# * Board
# - This kind of item can be placed upside holes
# if you don't want it, just place 'false'
#
# * Description - Item description (A small chair...)
#
#===============================================================================
# ■ Items
#===============================================================================
SECRETBASEITEMS=[
[-1],
#* Desks
["Brick Desk",336,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of bricks. Holds lot of decorations."],
["Camp Desk",360,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of logs. Holds lot of decorations."],
["Comfort Desk",355,3,2,2000,nil,ItemType::DESK,false,"A large desk made of leaves. Put some decorations on it."],
["Hard Desk",384,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of rock. Holds lot of decorations."],
["Heavy Desk",371,3,2,2000,nil,ItemType::DESK,false,"A large desk made of steel. Put some decorations on it."],
["Pokémon Desk",339,1,1,1000,nil,ItemType::DESK,false,"A small desk built in the shape of a Poké Ball."],
["Pretty Desk",408,3,3,2000,nil,ItemType::DESK,false,"A huge desk made of glass. Holds lot of decorations."],
["Ragged Desk",387,3,2,2000,nil,ItemType::DESK,false,"A large desk made of wood. Put some decorations on it."],
["Small Desk",340,1,1,1000,nil,ItemType::DESK,false,"A small desk made for one."],
#* Chairs
["Brick Chair",314,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of brick."],
["Camp Chair",315,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of logs."],
["Comfort Chair",316,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of leaves."],
["Hard Chair",322,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of rock."],
["Heavy Chair",323,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of steel."],
["Pokémon Chair",324,1,1,1000,nil,ItemType::CHAIR,false,"A small chair built in the shape of a Poké Ball."],
["Pretty Chair",330,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of glass."],
["Ragged Chair",331,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made of wood."],
["Small Chair",332,1,1,1000,nil,ItemType::CHAIR,false,"A small chair made for one."],
#* Plants
["Big Plant",309,2,2,2000,nil,ItemType::PLANT,false,"A large, umbrella-shaped plant in a big pot."],
["Colorful Flowers",325,2,2,2000,nil,ItemType::PLANT,false,"A large pot with many colorful flowers."],
["Gorgeous Plant",341,2,2,2000,nil,ItemType::PLANT,false,"A large impressive plant in a big pot."],
["Red Plant",311,1,2,1000,nil,ItemType::PLANT,false,"A vivid red potted plant."],
["Tropical Plant",327,1,2,1000,nil,ItemType::PLANT,false,"A flowering tropical plant in a pot."],
["Pretty Flower",343,1,2,1000,nil,ItemType::PLANT,false,"A pot of cute flowes."],
#* Ornaments
["Red Balloon",136,1,1,500,4,ItemType::ORNAMENT,false,"A red balloon filled with water. Bursts if stepped on."],
["Red Tent",129,3,3,5000,nil,ItemType::ORNAMENT,false,"A red tent to hide in."],
["Blue Tent",132,3,3,5000,nil,ItemType::ORNAMENT,false,"A blue tent to hide in."],
["Sand Ornament",160,1,1,1200,7,ItemType::ORNAMENT,false,"A sand sculpture that crumbles when touched."],
["Slide",304,2,4,5000,nil,ItemType::ORNAMENT,false,"A blue slide."],
["Long Board",6,1,2,1000,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
["Wide Board",30,2,1,1000,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
["Big Board",54,2,2,1500,nil,ItemType::ORNAMENT,true,"A board used to cover holes."],
#* Mats
["Surf Mat",218,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Surf image. Put items on top."],
["Fire Blast Mat",242,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Fire Blast image. Put items on top."],
["Attract Mat",266,3,3,900,nil,ItemType::MAT,false,"A mat designed with an Attract image. Put items on top."],
["Spikes Mat",290,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Spikes image. Put items on top."],
["Thunder Mat",237,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Thunder image. Put items on top."],
["Powder Snow Mat",261,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Powder Snow image. Put items on top."],
["Fissure Mat",285,3,3,900,nil,ItemType::MAT,false,"A mat designed with a Fissure image. Put items on top."],
["Jump mat",128,1,1,500,ItemType::MAT,false,"A trick mat that jumps when it is stepped on."],
#* Posters
["Ball Poster",358,1,1,1000,nil,ItemType::POSTER,false,"A small poster printed with a Poké Ball."],
["Green Poster",359,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Treecko print."],
["Red Poster",366,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Torchic print."],
["Blue Poster",367,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Mudkip print."],
["Cute Poster",374,1,1,1000,nil,ItemType::POSTER,false,"A small poster with a Azurill print."],
["Pika Poster",382,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Pikachu and Pichu print."],
["Elesa 2 Poster",390,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Seviper print."],
["Eevee Poster",398,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Relicanth print."],
["Roxy Poster",406,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Wingull print."],
["Elesa Poster",414,2,1,1500,nil,ItemType::POSTER,false,"A large poster with a Smoochum print."],
#* Dolls
#Larges
["Lapras Doll",200,1,1,5000,2,ItemType::DOLL,false,"A Lapras doll. Place it on a mat or a desk."],
["Regirock Doll",208,1,1,5000,22,ItemType::DOLL,false,"A Regirock doll. Place it on a mat or a desk."],
["Regice Doll",216,1,1,5000,23,ItemType::DOLL,false,"A Regice doll. Place it on a mat or a desk."],
["Registeel Doll",224,1,1,5000,24,ItemType::DOLL,false,"A Registeel doll. Place it on a mat or a desk."],
["Wailmer Doll",233,1,1,5000,25,ItemType::DOLL,false,"A Wailmer doll. Place it on a mat or a desk."],
#Smalls
["Torchic Doll",201,1,1,1000,3,ItemType::DOLL,false,"A Torchic doll. Place it on a mat or a desk."],
["Treecko Doll",209,1,1,1000,5,ItemType::DOLL,false,"A Treecko doll. Place it on a mat or a desk."],
["Mudkip Doll",217,1,1,1000,6,ItemType::DOLL,false,"A Mudkip doll. Place it on a mat or a desk."],
["Smoochum Doll",225,1,1,1000,18,ItemType::DOLL,false,"A Smoochum doll. Place it on a mat or a desk."],
["Cyndaquil Doll",233,1,1,1000,19,ItemType::DOLL,false,"A Cyndaquil doll. Place it on a mat or a desk."],
["Chikorita Doll",241,1,1,1000,20,ItemType::DOLL,false,"A Chikorita doll. Place it on a mat or a desk."],
["Totodile Doll",249,1,1,1000,21,ItemType::DOLL,false,"A Totodile doll. Place it on a mat or a desk."],
#* Cushion
["Ball Cushion",419,1,1,500,8,ItemType::CUSHION,false,"A cushion shaped like a PokéBall."],
["Diamon Cushion",420,1,1,500,9,ItemType::CUSHION,false,"A cushion based on Sableye."],
["Fire Cushion",421,1,1,500,10,ItemType::CUSHION,false,"A cushion with a fire emblem imprint."],
["Gamecube",422,1,1,500,11,ItemType::CUSHION,false,"A cushion with a grass emblem imprint."],
["Kiss Cushion",427,1,1,500,12,ItemType::CUSHION,false,"A cushion based on Smoochum."],
["Pika Cushion",428,1,1,500,13,ItemType::CUSHION,false,"A cushion based on Pikachu."],
["Round Cushion",429,1,1,500,14,ItemType::CUSHION,false,"A cushion based on Marill."],
["Spin Cushion",430,1,1,500,15,ItemType::CUSHION,false,"A cushion based on Spinda."],
["Water Cushion",435,1,1,500,16,ItemType::CUSHION,false,"A cushion with a water emblem imprint."],
["Zigzag Cushion",436,1,1,500,17,ItemType::CUSHION,false,"A cushion based on Zigzagoon."],
#* New Items
]
#===============================================================================
# ■ Holes
# There are made like items.
# [tile id, width in tiles, height in tiles]
# Holes needs to be in Layer 2.
#===============================================================================
BASEHOLES=[
[-1],
[7,1,2],
[22,2,1],
[38,2,2],
]
#===============================================================================
# ■ Script start here
# - Do not touch anything if you don't know what you're doing.
#===============================================================================
def pbGetBaseItem(item)
$PokemonGlobal.baseItemBag[baseItemPocket(item)].push([item,false])
end
def getAllDesks
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::DESK
end
return items
end
def getAllChairs
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::CHAIR
end
return items
end
def getAllPosters
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::POSTER
end
return items
end
def getAllPlants
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::PLANT
end
return items
end
def getAllMats
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::MAT
end
return items
end
def getAllOrnaments
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::ORNAMENT
end
return items
end
def getAllDolls
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::DOLL
end
return items
end
def getAllCushions
items=[]
for i in 1...SECRETBASEITEMS.length
items.push(i) if baseItemPocket(i)==ItemType::CUSHION
end
return items
end
def isItemForDoll?(pos)
#return $game_map.data[pos[0],pos[1],1]==ITEMFORDOLL
end
class PokemonGlobalMetadata
attr_accessor :baseinfo
attr_accessor :baseItemBag
attr_accessor :placedItems
attr_accessor :mybaseid
attr_accessor :mybaselocation
attr_accessor :installed
attr_accessor :outdoordata
def baseInstalled?
return !@installed ? false : @installed
end
def getBaseOutdoor
return !@outdoordata ? false : @outdoordata
end
def getBaseId
return !@mybaseid ? -1 : @mybaseid
end
def getBaseLocation
return !@mybaselocation ? -1 : @mybaselocation
end
def getPlacedItems(id)
@placedItems={} if !@placedItems
@placedItems[id]=[] if !@placedItems[id]
return @placedItems[id]
end
def setPlacedInfo(id,x,y,item)
@placedItems={} if !@placedItems
@placedItems[id]=[] if !@placedItems[id]
@placedItems[id].push([x,y,item])
end
def baseBag
if !@baseItemBag
@baseItemBag={}
for i in 0...BASEBAGPOCKETS.length
@baseItemBag[i]=[] if !@baseItemBag[i]
end
end
end
def getBasePocket(pocket)
baseBag
return @baseItemBag[pocket]
end
def basePocketLength(pocket)
baseBag
return @baseItemBag[pocket].length
end
def notBaseData?(id)
return false if !@baseinfo || !@baseinfo[id]
return true
end
def setBaseInfo(id,eventlist,tiledata)
@baseinfo={} if !@baseinfo
@baseinfo[id].clear if @baseinfo[id]
@baseinfo[id]=[eventlist,tiledata]
end
end
def getMaxSecretBagPocket(pocket)
return BASEBAGPOCKETS[pocket][1]
end
class TileDrawingHelper
def bltTileWithSize(bitmap,cxTile,cyTile,id)
return if !@tileset || id<384 || @tileset.disposed?
rect=Rect.new((id - 384) % 8 * 32, (id - 384) / 8 * 32,32*cxTile,32*cyTile)
bitmap.stretch_blt(Rect.new(0,0,32*cxTile,32*cyTile),@tileset,rect)
end
end
def getBaseItemByName(itemname)
for i in 0...SECRETBASEITEMS.length
return i if baseItemName(i)==itemname
end
end
def baseItemDesc(id)
return SECRETBASEITEMS[id][8]
end
def baseItemEvent(id)
return SECRETBASEITEMS[id][5]
end
def baseItemPocket(id)
return SECRETBASEITEMS[id][6]
end
def isABoard?(id)
return SECRETBASEITEMS[id][7]
end
def isAPoster?(id)
return SECRETBASEITEMS[id][6]==ItemType::POSTER
end
def isADoll?(id)
return SECRETBASEITEMS[id][6]==ItemType::DOLL
end
def isACushion?(id)
return SECRETBASEITEMS[id][6]==ItemType::CUSHION
end
def isAMat?(id)
return SECRETBASEITEMS[id][6]==ItemType::MAT
end
def isADesk?(id)
return SECRETBASEITEMS[id][6]==ItemType::DESK
end
def baseItemName(id)
return SECRETBASEITEMS[id][0]
end
def baseItemCost(id)
return SECRETBASEITEMS[id][4]
end
def baseItemWidth(id)
return SECRETBASEITEMS[id][2]*32
end
def baseItemHeight(id)
return SECRETBASEITEMS[id][3]*32
end
def baseItemTileid(id)
return SECRETBASEITEMS[id][1]+384
end
def getBaseItemBitmap(id)
if baseItemEvent(id)!=nil # Load the event bitmap
map=load_data(sprintf("Data/Map%03d.%s", ITEMSMAP,$RPGVX ? "rvdata" : "rxdata"))
map.events.each do |i, event|
if event.id==baseItemEvent(id)
dollEvent=Game_BaseEvent.new(nil, event)
dollBitmap=AnimatedBitmap.new("Graphics/Characters/"+dollEvent.character_name,
dollEvent.character_hue)
width = dollBitmap.width / 4
height = dollBitmap.height / 4
sx = dollEvent.pattern * width
sy = (dollEvent.direction - 2) / 2 * height
iconItem=Bitmap.new(width,height)
iconItem.blt(0,0,dollBitmap.bitmap,Rect.new(sx,sy,width,height))
return iconItem
end
end
else # Load bitmap from tileset
bitmap=pbGetTileset(SECRETBASETILESET)
itemWidth=baseItemWidth(id)
itemHeight=baseItemHeight(id)
iconItem=Bitmap.new(itemWidth,itemHeight)
tileId=baseItemTileid(id)
tilehelper=TileDrawingHelper.new(bitmap,nil)
tilehelper.bltTileWithSize(iconItem,itemWidth/32,itemHeight/32,tileId)
return iconItem
end
end
class Game_Map
alias old_setup_bases setup
def setup(map_id)
old_setup_bases(map_id)
if pbGetMapNameFromId(@map_id)==SECRETBASEMAPNAME#"Secret Base"
loadSecretBaseEvents
end
searchForMyBase
end
def isItemEvent?(event)
return true if event!=nil && event.is_a?(Game_BaseEvent) && event.item==true
return false
end
def backToOriginal
@map=load_data(sprintf("Data/Map%03d.%s", @map_id,$RPGVX ? "rvdata" : "rxdata"))
@events = {}
for i in @map.events.keys
@events[i] = Game_Event.new(@map_id, @map.events[i],self)
end
$PokemonGlobal.baseinfo[@map_id].clear
$PokemonGlobal.baseinfo[@map_id]=nil
end
def reloadBaseEvents
@map=load_data(sprintf("Data/Map%03d.%s", @map_id,$RPGVX ? "rvdata" : "rxdata"))
@events = {}
for i in @map.events.keys
@events[i] = Game_Event.new(@map_id, @map.events[i],self)
end
loadSecretBaseEvents(true)
end
def terrain_tag_id(tileid)
return @terrain_tags[tileid]
end
def loadSecretBaseEvents(savedPositions=false)
return if !$PokemonGlobal.notBaseData?(@map_id)
@[email protected]
@map.data=$PokemonGlobal.baseinfo[@map_id][1]
for i in 0...$PokemonGlobal.baseinfo[@map_id][0].length+1
savedEvent=$PokemonGlobal.baseinfo[@map_id][0][i]
next if savedEvent==nil
nEvent=savedEvent.rEvent
newId=getNewId
itemEvent=Game_BaseEvent.new(@map_id, nEvent)
itemEvent.id=newId
itemEvent.moveto(savedEvent.x,savedEvent.y)
itemEvent.item=true
itemEvent.direction=savedEvent.direction if savedPositions
itemEvent.itemtileid=savedEvent.itemtileid
itemEvent.rEvent=nEvent
@events[newId] = itemEvent
end
end
def getNewId
newId = 1
while $game_map.events[newId] != nil do
newId += 1
end
return newId
end
def copy_event(mapid, eventid, x, y,tileid)
map = load_data(sprintf("Data/Map%03d.rxdata", mapid))
map.events.each do |i, event|
if event.id == eventid
newId=getNewId
nEvent=event.clone # Clone the event
# Create the new event in new map
eMap=Game_BaseEvent.new(@map_id, nEvent)
eMap.id=newId
eMap.moveto(x,y)
eMap.itemtileid=tileid
eMap.item=true
eMap.rEvent=nEvent
@events[newId] = eMap
end
end
end
end
# Functions for events
def movingRightToThis(event=nil)
return $game_player.x==event.x && $game_player.y==event.y &&
$game_player.direction==6 && $game_player.moving? &&
(Input.press?(Input::RIGHT) || Input.trigger?(Input::RIGHT) ||
Input.release?(Input::RIGHT))
end
def movingLeftToThis(event=nil)
return $game_player.x==event.x && $game_player.y==event.y &&
$game_player.direction==4 && $game_player.moving? &&
(Input.press?(Input::LEFT) || Input.trigger?(Input::LEFT) || Input.release?(Input::LEFT))
end
def movingUpToThis(event)
return $game_player.x==event.x && $game_player.y==event.y &&
$game_player.direction==8 && $game_player.moving? &&
(Input.press?(Input::UP) || Input.trigger?(Input::UP) || Input.release?(Input::UP))
end
def movingDownToThis(event=nil)
return $game_player.x==event.x && $game_player.y==event.y &&
$game_player.direction==2 && $game_player.moving? &&
(Input.press?(Input::DOWN) || Input.trigger?(Input::DOWN) || Input.release?(Input::DOWN))
end
class Game_Event
attr_accessor :rEvent
def rEvent
return !@rEvent ? false : @rEvent
end
def direction=(value)
@direction=value
end
end
class Game_BaseEvent < Game_Event
attr_accessor :item
attr_accessor :itemtileid
end
class Spriteset_Map
attr_accessor :character_sprites
attr_accessor :player
alias old_initialize_base initialize
def initialize(map=nil)
old_initialize_base(map)
@player=@playersprite
end
end
def copyMapData
baseEvents=[]
for i in 0...$game_map.events.length+1
event=$game_map.events[i]
baseEvents.push(event) if event.is_a?(Game_BaseEvent)
end
$PokemonGlobal.setBaseInfo($game_map.map_id,baseEvents,$game_map.data)
end
def placeItemInBase(item,pos)
x=pos[0]
y=pos[1]
width=baseItemWidth(item)/32
height=baseItemHeight(item)/32
map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
tilesets=load_data("Data/Tilesets.rxdata")
tileset=tilesets[map.tileset_id]
priorities=tileset.priorities
passages=tileset.passages
# Check if it's an event item
if baseItemEvent(item)
tileid=baseItemTileid(item)
$game_map.copy_event(ITEMSMAP,baseItemEvent(item),x,y,tileid)
else # Draw a tile
for i in 0...width
for e in 0...height
tileid=baseItemTileid(item)+i+(e*8)
layer=priorities[tileid]==0 ? 1 : 2
#layer=2 if passages[tileid] & 0x80 == 0x80 # Counter
$game_map.data[x+i,y+e,layer]=tileid
end
end
end
copyMapData
end
#===============================================================================
# PC System
#===============================================================================
class Game_Character
def screen_x_scroll(scroll)
return (@real_x - scroll + 3) / 4 + (Game_Map::TILEWIDTH/2)
end
def screen_y_scroll(scroll)
y = (@real_y - scroll + 3) / 4 + (Game_Map::TILEHEIGHT)
if jumping?
if @jump_count >= @jump_peak
n = @jump_count - @jump_peak
else
n = @jump_peak - @jump_count
end
return y - (@jump_peak * @jump_peak - n * n) / 2
else
return y
end
end
end
class DecorationMap
attr_accessor :scroll
def initialize(viewport)
$scene.disposeSpritesets
@map=load_data(sprintf("Data/Map%03d.rxdata",$game_map.map_id))
@viewport=Viewport.new(viewport.rect.x,viewport.rect.y,viewport.rect.width,
viewport.rect.height)
@viewport.z=99999
@totalscroll=[0,0]
pbLoad
end
def pbLoad
@scroll=[0,0]
@bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
tilesets=load_data("Data/Tilesets.rxdata")
@tileset=tilesets[@map.tileset_id]
helper=TileDrawingHelper.fromTileset(@tileset)
for y in [email protected]
for x in [email protected]
for z in 0..2
id=$game_map.data[x,y,z]
id=0 if !id
helper.bltTile(@bitmap,x*32,y*32,id)
end
end
end
@rsprite=Sprite_Character.new(nil, $game_player)
[email protected]
[email protected]
@rsprite.dispose
@scroll[0]+=x-$game_player.x*32
@scroll[1]+=y-$game_player.y*32
@mapSprite=Sprite.new(@viewport)
@mapSprite.bitmap=@bitmap
@mapSprite.x+=@scroll[0]
@mapSprite.y+=@scroll[1]
@character_sprites = []
for i in $game_map.events.keys.sort
sprite=Sprite_Character.new(@viewport, $game_map.events[i])
sprite.x=$game_map.events[i].screen_x_scroll(0)
sprite.y=$game_map.events[i].screen_y_scroll(0)
sprite.x+=@scroll[0]
sprite.y+=@scroll[1]
@character_sprites.push(sprite)
end
@scroll=[0,0]
end
def pbReloadTiles
@bitmap=BitmapWrapper.new(@map.width*32,@map.height*32)
helper=TileDrawingHelper.fromTileset(@tileset)
for y in [email protected]
for x in [email protected]
for z in 0..2
id=$game_map.data[x,y,z]
id=0 if !id
helper.bltTile(@bitmap,x*32,y*32,id)
end
end
end
@mapSprite.bitmap=@bitmap
end
def pbReloadEvents
for sprite in @character_sprites
sprite.dispose
end
@rsprite=Sprite_Character.new(nil, $game_player)
[email protected]
[email protected]
@rsprite.dispose
@character_sprites.clear
for i in $game_map.events.keys.sort
sprite=Sprite_Character.new(@viewport, $game_map.events[i])
sprite.x=$game_map.events[i].screen_x_scroll(0)
sprite.y=$game_map.events[i].screen_y_scroll(0)
sprite.x+=x-$game_player.x*32+@totalscroll[0]
sprite.y+=y-$game_player.y*32+@totalscroll[1]
@character_sprites.push(sprite)
end
end
def reload
pbReloadTiles
pbReloadEvents
end
def disposed?
@mapSprite.disposed?
end
def color
return @mapSprite.color
end
def color=(value)
@mapSprite.color=value
for sprite in @character_sprites
sprite.color=value
end
end
def visible
return @mapSprite.visible
end
def visible=(value)
@mapSprite.visible=value
for sprite in @character_sprites
sprite.visible=value
end
end
def dispose
@mapSprite.dispose
for sprite in @character_sprites
sprite.dispose
end
$scene.createSpritesets
end
def updateScrollPos
@mapSprite.x+=@scroll[0]
@mapSprite.y+=@scroll[1]
for sprite in @character_sprites
sprite.x+=@scroll[0]
sprite.y+=@scroll[1]
end
@totalscroll[0]+=@scroll[0]
@totalscroll[1]+=@scroll[1]
@scroll=[0,0]
end
end
def Kernel.pbShowCommandsBase(msgwindow,commands=nil,cmdIfCancel=0,defaultCmd=0)
ret=0
if commands
cmdwindow=Window_CommandPokemonEx.new(commands)
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.resizeToFit(cmdwindow.commands)
pbPositionNearMsgWindow(cmdwindow,msgwindow,:right)
cmdwindow.index=defaultCmd
command=0
loop do
Graphics.update
Input.update
cmdwindow.update
msgwindow.update if msgwindow
yield if block_given?
if Input.trigger?(Input::B)
if cmdIfCancel>0
command=cmdIfCancel-1
break
elsif cmdIfCancel<0
command=cmdIfCancel
break
end
end
if Input.trigger?(Input::C)
command=cmdwindow.index
break
end
end
ret=command
cmdwindow.dispose
Input.update
end
return ret
end
def Kernel.pbMessageBase(message,commands=nil,cmdIfCancel=0,skin=nil,defaultCmd=0,&block)
ret=0
msgwindow=Kernel.pbCreateMessageWindow(nil,skin)
if commands
ret=Kernel.pbMessageDisplayBase(msgwindow,message,true,
proc {|msgwindow|
next Kernel.pbShowCommandsBase(msgwindow,commands,cmdIfCancel,defaultCmd,&block)
},&block)
else
Kernel.pbMessageDisplayBase(msgwindow,message,&block)
end
Kernel.pbDisposeMessageWindow(msgwindow)
Input.update
return ret
end
def Kernel.pbMessageDisplayBase(msgwindow,message,letterbyletter=true,commandProc=nil)
return if !msgwindow
oldletterbyletter=msgwindow.letterbyletter
msgwindow.letterbyletter=(letterbyletter ? true : false)
ret=nil
count=0
commands=nil
facewindow=nil
goldwindow=nil
coinwindow=nil
cmdvariable=0
cmdIfCancel=0
msgwindow.waitcount=0
autoresume=false
text=message.clone
msgback=nil
linecount=(DEFAULTSCREENHEIGHT>400) ? 3 : 2
### Text replacement
text.gsub!(/\\\\/,"\5")
if $game_actors
text.gsub!(/\\[Nn]\[([1-8])\]/){
m=$1.to_i
next $game_actors[m].name
}
end
text.gsub!(/\\[Ss][Ii][Gg][Nn]\[([^\]]*)\]/){
next "\\op\\cl\\ts[]\\w["+$1+"]"
}
text.gsub!(/\\[Pp][Nn]/,$Trainer.name) if $Trainer
text.gsub!(/\\[Pp][Mm]/,_INTL("${1}",$Trainer.money)) if $Trainer
text.gsub!(/\\[Nn]/,"\n")
text.gsub!(/\\\[([0-9A-Fa-f]{8,8})\]/){ "<c2="+$1+">" }
text.gsub!(/\\[Pp][Gg]/,"")
text.gsub!(/\\[Pp][Oo][Gg]/,"")
text.gsub!(/\\[Bb]/,"<c2=6546675A>")
text.gsub!(/\\[Rr]/,"<c2=043C675A>")
text.gsub!(/\\1/,"\1")
colortag=""
isDarkSkin=isDarkWindowskin(msgwindow.windowskin)
if ($game_message && $game_message.background>0) ||
($game_system && $game_system.respond_to?("message_frame") &&
$game_system.message_frame != 0)
colortag=getSkinColor(msgwindow.windowskin,0,true)
else
colortag=getSkinColor(msgwindow.windowskin,0,isDarkSkin)
end
text.gsub!(/\\[Cc]\[([0-9]+)\]/){
m=$1.to_i
next getSkinColor(msgwindow.windowskin,m,isDarkSkin)
}
begin
last_text = text.clone
text.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
end until text == last_text
begin
last_text = text.clone
text.gsub!(/\\[Ll]\[([0-9]+)\]/) {
linecount=[1,$1.to_i].max;
next ""
}
end until text == last_text
text=colortag+text
### Controls
textchunks=[]
controls=[]
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]
textchunks.push($~.pre_match)
if $~[1]
controls.push([$~[1].downcase,$~[2],-1])
else
controls.push([$~[3].downcase,"",-1])
end
text=$~.post_match
end
textchunks.push(text)
for chunk in textchunks
chunk.gsub!(/\005/,"\\")
end
textlen=0
for i in 0...controls.length
control=controls[i][0]
if control=="wt" || control=="wtnp" || control=="." || control=="|"
textchunks[i]+="\2"
elsif control=="!"
textchunks[i]+="\1"
end
textlen+=toUnformattedText(textchunks[i]).scan(/./m).length
controls[i][2]=textlen
end
text=textchunks.join("")
unformattedText=toUnformattedText(text)
signWaitCount=0
haveSpecialClose=false
specialCloseSE=""
for i in 0...controls.length
control=controls[i][0]
param=controls[i][1]
if control=="f"
facewindow.dispose if facewindow
facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
elsif control=="op"
signWaitCount=21
elsif control=="cl"
text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
haveSpecialClose=true
specialCloseSE=param
elsif control=="se" && controls[i][2]==0
startSE=param
controls[i]=nil
elsif control=="ff"
facewindow.dispose if facewindow
facewindow=FaceWindowVX.new(param)
elsif control=="ch"
cmds=param.clone
cmdvariable=pbCsvPosInt!(cmds)
cmdIfCancel=pbCsvField!(cmds).to_i
commands=[]
while cmds.length>0
commands.push(pbCsvField!(cmds))
end
elsif control=="wtnp" || control=="^"
text=text.sub(/\001\z/,"") # fix: '$' can match end of line as well
end
end
if startSE!=nil
pbSEPlay(pbStringToAudioFile(startSE))
elsif signWaitCount==0 && letterbyletter
pbPlayDecisionSE()
end
########## Position message window ##############
pbRepositionMessageWindow(msgwindow,linecount)
if $game_message && $game_message.background==1
msgback=IconSprite.new(0,msgwindow.y,msgwindow.viewport)
msgback.z=msgwindow.z-1
msgback.setBitmap("Graphics/System/MessageBack")
end
if facewindow
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
facewindow.viewport=msgwindow.viewport
facewindow.z=msgwindow.z
end
atTop=(msgwindow.y==0)
########## Show text #############################
msgwindow.text=text
Graphics.frame_reset if Graphics.frame_rate>40
begin
if signWaitCount>0
signWaitCount-=1
if atTop
msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
else
msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
end
end
for i in 0...controls.length
if controls[i] && controls[i][2]<=msgwindow.position && msgwindow.waitcount==0
control=controls[i][0]
param=controls[i][1]
if control=="f"
facewindow.dispose if facewindow
facewindow=PictureWindow.new("Graphics/Pictures/#{param}")
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
facewindow.viewport=msgwindow.viewport
facewindow.z=msgwindow.z
elsif control=="ts"
if param==""
msgwindow.textspeed=-999
else
msgwindow.textspeed=param.to_i
end
elsif control=="ff"
facewindow.dispose if facewindow
facewindow=FaceWindowVX.new(param)
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
facewindow.viewport=msgwindow.viewport
facewindow.z=msgwindow.z
elsif control=="g" # Display gold window
goldwindow.dispose if goldwindow
goldwindow=pbDisplayGoldWindow(msgwindow)
elsif control=="cn" # Display coins window
coinwindow.dispose if coinwindow
coinwindow=pbDisplayCoinsWindow(msgwindow,goldwindow)
elsif control=="wu"
msgwindow.y=0
atTop=true
msgback.y=msgwindow.y if msgback
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
msgwindow.y=-(msgwindow.height*(signWaitCount)/20)
elsif control=="wm"
atTop=false
msgwindow.y=(DEFAULTSCREENHEIGHT/2)-(msgwindow.height/2)
msgback.y=msgwindow.y if msgback
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
elsif control=="wd"
atTop=false
msgwindow.y=(DEFAULTSCREENHEIGHT)-(msgwindow.height)
msgback.y=msgwindow.y if msgback
pbPositionNearMsgWindow(facewindow,msgwindow,:left)
msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-signWaitCount)/20)
elsif control=="."
msgwindow.waitcount+=Graphics.frame_rate/4
elsif control=="|"
msgwindow.waitcount+=Graphics.frame_rate
elsif control=="wt" # Wait
param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
msgwindow.waitcount+=param.to_i*2
elsif control=="w" # Windowskin
if param==""
msgwindow.windowskin=nil
else
msgwindow.setSkin("Graphics/Windowskins/#{param}")
end
msgwindow.width=msgwindow.width # Necessary evil
elsif control=="^" # Wait, no pause
autoresume=true
elsif control=="wtnp" # Wait, no pause
param=param.sub(/\A\s+/,"").sub(/\s+\z/,"")
msgwindow.waitcount=param.to_i*2
autoresume=true
elsif control=="se" # Play SE
pbSEPlay(pbStringToAudioFile(param))
elsif control=="me" # Play ME
pbMEPlay(pbStringToAudioFile(param))
end
controls[i]=nil
end
end
break if !letterbyletter
Graphics.update
Input.update
facewindow.update if facewindow
if $DEBUG && Input.trigger?(Input::F6)
pbRecord(unformattedText)
end
if autoresume && msgwindow.waitcount==0
msgwindow.resume if msgwindow.busy?
break if !msgwindow.busy?
end
if (Input.trigger?(Input::C) || Input.trigger?(Input::B))
if msgwindow.busy?
pbPlayDecisionSE() if msgwindow.pausing?
msgwindow.resume
else
break if signWaitCount==0
end
end
msgwindow.update
yield if block_given?
end until (!letterbyletter || commandProc || commands) && !msgwindow.busy?
Input.update # Must call Input.update again to avoid extra triggers
msgwindow.letterbyletter=oldletterbyletter
if commands
$game_variables[cmdvariable]=Kernel.pbShowCommands(
msgwindow,commands,cmdIfCancel)
$game_map.need_refresh = true if $game_map
end
if commandProc
ret=commandProc.call(msgwindow)
end
msgback.dispose if msgback
goldwindow.dispose if goldwindow
coinwindow.dispose if coinwindow
facewindow.dispose if facewindow
if haveSpecialClose
pbSEPlay(pbStringToAudioFile(specialCloseSE))
atTop=(msgwindow.y==0)
for i in 0..20
if atTop
msgwindow.y=-(msgwindow.height*(i)/20)
else
msgwindow.y=DEFAULTSCREENHEIGHT-(msgwindow.height*(20-i)/20)
end
Graphics.update
Input.update
msgwindow.update
end
end
return ret
end
def Kernel.pbConfirmMessageBase(message,&block)
return (Kernel.pbMessageBase(message,[_INTL("Yes"),_INTL("No")],2,&block)==0)
end
class PokemonDecoration
def initialize; end
def pbStartScene
@viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
@viewport.z=999999
@sprites={}
end
def getSecretArrow
bitmapname=_INTL("Graphics/Pictures/secretBaseArrow{1}",$Trainer.metaID)
return BitmapCache.load_bitmap(bitmapname)
end
def getMapPassable(x,y)
for event in $game_map.events.values
return false if event.x==x && event.y==y
end
if $game_map.data[x,y,0]
return false if isPosterWall($game_map.data[x,y,0])
end
return $game_map.passable?(x,y,0)
end
def isPosterWall(tileid)
#map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
#tilesets=load_data("Data/Tilesets.rxdata")
#tileset=tilesets[map.tileset_id]
#priorities=tileset.priorities
#passages=tileset.passages
#pass=[]
#pass[0]=passages[tileid] & 0x01 == 0x01 # Down arrow
#pass[1]=passages[tileid] & 0x02 == 0x02 # Left arrow
#pass[2]=passages[tileid] & 0x04 == 0x04 # Up arrow
#pass[3]=passages[tileid] & 0x08 == 0x08 # Up arrow
#if pass[0]==true && pass[1]==false &&
# pass[2]==false && pass[3]==false
# return true
#end
if $game_map.terrain_tag_id(tileid)==WALLTERRAINTAG
return true
end
return false
end
def canPlaceItem?(item,pos)
map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
tilesets=load_data("Data/Tilesets.rxdata")
tileset=tilesets[map.tileset_id]
priorities=tileset.priorities
passages=tileset.passages
width=baseItemWidth(item)/32
height=baseItemHeight(item)/32
# Do not put anything above player!
for w in 0...width
for h in 0...height
tileid=baseItemTileid(item)+w+(h*8)
notblocked=passages[tileid] & 0x0f == 0x0f
if notblocked && pos[0]+w==$game_player.x && pos[1]+h==$game_player.y
return false
end
end
end
# Avoids to put items above others
if !DOLLSEVERYWHERE && !(isADoll?(item) || isACushion?(item))
for e in 0...height
tileid=baseItemTileid(item)+(e*8)
prio=priorities[tileid]
#prio=1 if passages[tileid] & 0x80 == 0x80
next if prio>0
for i in 0...width
tileid=baseItemTileid(item)+i+(e*8)
prio=priorities[tileid]
#prio=1 if passages[tileid] & 0x80 == 0x80
pass=passages[tileid] & 0x0f == 0x0f
if $game_map.data[pos[0]+i,pos[1]+e,1]!=0 && prio==0
# Check for holes
isahole=thereIsAHole?([pos[0]+i,pos[1]+e])
if isahole && isABoard?(item)
holewidth=isahole[0]
holeheight=isahole[1]
positions=getTopLeftWithATileHole([pos[0]+i,pos[1]+e])
if positions[0]==pos[0] && positions[1]==pos[1] &&
holewidth==width && holeheight==height
return true
end
end
return false
elsif $game_map.data[pos[0]+i,pos[1]+e,2]!=0 && prio==0
topleft=getTopLeftWithATile(pos)
if !topleft.is_a?(Range)
if pos[1]+e!=topleft[1]
return false
end
end
end
end
end
end
# Check if it's a poster
if isAPoster?(item)
putInWall=true
for i in 0...width
for e in 0...height
tileid=baseItemTileid(item)+i+(e*8)
for w in 0...width
for h in 0...height
alreadyp=$game_map.data[pos[0]+w,pos[1]+h,1]
newp=isPosterWall($game_map.data[pos[0]+w,pos[1]+h,0])
if !newp || alreadyp>0
putInWall=false
end
end
end
return true if putInWall
return false
end
end
# Placing dolls only in mats and counter tiles
elsif isADoll?(item) || isACushion?(item)
placed=getItemIn(pos)
# If it's a mat or a counter tile and it's not an interactive one
if isAMat?(placed) && baseItemEvent(placed)==nil
return true
elsif isADesk?(placed) && baseItemEvent(placed)==nil
tileid=$game_map.data[pos[0],pos[1],1]
counter=passages[tileid] & 0x80 == 0x80
return true if counter
elsif DOLLSEVERYWHERE
newp=getMapPassable(pos[0],pos[1])
if $game_map.terrain_tag(pos[0],pos[1])==GROUNDDECORATION
return false # Avoid to put tiles in layer 0 decorations
end
return true if newp
end
return false
else
for i in 0...width
for e in 0...height
tileid=baseItemTileid(item)+i+(e*8)
prio=priorities[tileid]
pass=passages[tileid] & 0x0f == 0x0f
mappass=getMapPassable(pos[0]+i,pos[1]+e)
upasable=true
#counter=passages[tileid] & 0x80 == 0x80
# Is first line passable?
(0...width).each do |w|
np=getMapPassable(pos[0]+w,pos[1])
upasable=false if !np
end
# Make counter tiles priorities
if counter
upasable=false
prio=1
end
if !upasable && prio>0
(0...height).each do |h|
(0...width).each do |w|
# Tile to place data
tileplace=baseItemTileid(item)+w+(h*8)
tileprio=priorities[tileplace]
placep=passages[tileplace] & 0x0f == 0x0f
counter=passages[tileplace] & 0x80 == 0x80
#tileprio=1 if counter
# Tile in map data
if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
return false # Avoid to put tiles in layer 0 decorations
end
newp=getMapPassable(pos[0]+w,pos[1]+h)
return false if h==0 && !newp && tileprio==0
return false if h>0 && !newp
end
end
return true
elsif mappass
for w in 0...width
for h in 0...height
tileplace=baseItemTileid(item)+w+(h*8)
newp=getMapPassable(pos[0]+w,pos[1]+h)
tileprio=priorities[tileplace]
if tileprio==0 && $game_map.terrain_tag(pos[0]+w,pos[1]+h)==GROUNDDECORATION
return false # Avoid to put tiles in layer 0 decorations
end
#tileprio=1 if passages[tileplace] & 0x80 == 0x80
return false if !newp
end
end
return true
end
end
end
end
return false
end
# Get a placed item
def getItemIn(pos)
x=@pos[0]
y=@pos[1]
for i in 1...SECRETBASEITEMS.length
thisId=baseItemTileid(i)
width=baseItemWidth(i)/32
height=baseItemHeight(i)/32
(0...height).each do |h|
(0...width).each do |w|
actualTile=baseItemTileid(i)+w+(h*8)
for l in 0...3
if actualTile==$game_map.data[x,y,l]
return i
end
end
end
end
end
end
def getTopLeftWithATileHole(pos)
x=pos[0]
y=pos[1]
for i in 1...BASEHOLES.length
thisId=BASEHOLES[i][0]+384
width=BASEHOLES[i][1]
height=BASEHOLES[i][2]
(0...height).each do |h|
(0...width).each do |w|
actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
for l in 0...3
# Get top item
if actualTile==$game_map.data[x,y,l]
return getTopLeftHole(i,actualTile,x,y)
end
end
end
end
end
return false
end
def getTopLeftHole(item,actualTile,x,y)
width=BASEHOLES[item][1]
height=BASEHOLES[item][2]
(0...height).each do |h|
(0...width).each do |w|
if (BASEHOLES[item][0]+384)+w+(h*8)==actualTile
x-=w
y-=h
end
end
end
return [x,y]
end
def thereIsAHole?(pos)
x=pos[0]
y=pos[1]
for i in 1...BASEHOLES.length
thisId=BASEHOLES[i][0]+384
width=BASEHOLES[i][1]
height=BASEHOLES[i][2]
(0...height).each do |h|
(0...width).each do |w|
actualTile=(BASEHOLES[i][0]+384)+w+(h*8)
for l in 0...3
# Get top item
if actualTile==$game_map.data[x,y,l]
return [width,height]
end
end
end
end
end
return false
end
# Get top left position of a tiled item
def getTopLeftWithATile(pos)
x=@pos[0]
y=@pos[1]
for i in 1...SECRETBASEITEMS.length
thisId=baseItemTileid(i)
width=baseItemWidth(i)/32
height=baseItemHeight(i)/32
(0...height).each do |h|
(0...width).each do |w|
actualTile=baseItemTileid(i)+w+(h*8)
for l in 0...3
# Get top item
if actualTile==$game_map.data[x,y,l]
return getTopLeft(i,actualTile,x,y)
end
end
end
end
end
end
# Delete items
def deleteItemIn(pos,delete=true)
x=pos[0]
y=pos[1]
isEvent=false
for i in 1...SECRETBASEITEMS.length
thisId=baseItemTileid(i)
width=baseItemWidth(i)/32
height=baseItemHeight(i)/32
# Check if there's an event
for event in $game_map.events.values
if !isEvent && event.is_a?(Game_BaseEvent) && event.x==x && event.y==y
isEvent=true
itemEvent=event
end
end
if isEvent
return true if !delete
deleteEvent(@pos)
return
else
(0...height).each do |h|
(0...width).each do |w|
actualTile=baseItemTileid(i)+w+(h*8)
# Get top item
tileMiddle=$game_map.data[x,y,1]
tileTop=$game_map.data[x,y,2]
# Delete top tile
if tileTop>0 && actualTile==tileTop
return true if !delete
# Delete item
topleft=getTopLeft(i,actualTile,x,y)
deleteTiledItem(i,topleft)
return
# Delete middle tile
elsif actualTile==tileMiddle && tileTop==0
return true if !delete
topleft=getTopLeft(i,actualTile,x,y)
# Delete item
if isABoard?(i) &&
$game_player.x>=topleft[0] && $game_player.x<topleft[0]+width &&
$game_player.y>=topleft[1] && $game_player.y<topleft[1]+height
Kernel.pbMessageBase("You can't delete this right now.")
else
deleteTiledItem(i,topleft)
end
return
end
end
end
end
end
return false if !delete
end
# Delete event
def deleteEvent(pos)
x=pos[0]
y=pos[1]
for event in $game_map.events.values
if event.x==x && event.y==y
thisEvent=event
end
end
return if thisEvent==nil
# Back item to PC
placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
for i in 0...placedInfo.length
actualItem=placedInfo[i]
if actualItem[0]==x && actualItem[1]==y &&
baseItemTileid(actualItem[2][0])==thisEvent.itemtileid
actualItem[2][1]=false
end
end
savedEvent=$PokemonGlobal.baseinfo[$game_map.map_id][0]
for i in 0...savedEvent.length+1
next if savedEvent[i]==nil
if savedEvent[i]==thisEvent
savedEvent[i]=nil
savedEvent.compact!
$game_map.reloadBaseEvents
copyMapData
return
end
end
end
# Delete a tiled item
def deleteTiledItem(item,pos)
x=pos[0]
y=pos[1]
width=baseItemWidth(item)/32
height=baseItemHeight(item)/32
map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
tilesets=load_data("Data/Tilesets.rxdata")
tileset=tilesets[map.tileset_id]
priorities=tileset.priorities
passages=tileset.passages
# Back item to PC
placedInfo=$PokemonGlobal.getPlacedItems($game_map.map_id)
for i in 0...placedInfo.length
actualItem=placedInfo[i]
if actualItem[0]==x && actualItem[1]==y &&
baseItemTileid(actualItem[2][0])==baseItemTileid(item)
actualItem[2][1]=false
end
end
(0...height).each do |h|
(0...width).each do |w|
tileid=baseItemTileid(item)+w+(h*8)
layer=priorities[tileid]==0 ? 1 : 2
#layer=2 if passages[tileid] & 0x80 == 0x80
# Delete also decorations over a mat or a desk
if (isAMat?(item) || isADesk?(item)) && baseItemEvent(item)==nil
deleteEvent([x+w,y+h])
end
$game_map.data[x+w,y+h,layer]=map.data[x+w,y+h,layer]
end
end
end
# Get top left for deleting
def getTopLeft(item,actualTile,x,y)
width=baseItemWidth(item)/32
height=baseItemHeight(item)/32
(0...height).each do |h|
(0...width).each do |w|
if baseItemTileid(item)+w+(h*8)==actualTile
x-=w
y-=h
end
end
end
return [x,y]
end
def pbCreatePutAway
@sprites["map"]=DecorationMap.new(@viewport)
@sprites["item"]=ItemBaseSprite.new(@viewport)
@sprites["item"].bitmap=RPG::Cache.picture("secretBaseDeleter")
@rsprite=Sprite_Character.new(nil, $game_player)
[email protected]
[email protected]
@rsprite.dispose
@sprites["item"].x=x
@sprites["item"].y=y
@pos=[$game_player.x,$game_player.y]
@sprites["arrow"]=Sprite.new(@viewport)
@sprites["arrow"].bitmap=getSecretArrow
@sprites["arrow"].oy=@sprites["arrow"].bitmap.height
@sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
@sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
@sprites["item"].update
end
def pbPutAway
loop do
Graphics.update
Input.update
@sprites["item"].update
if Input.trigger?(Input::UP)
@sprites["map"].scroll[1]+=32
@sprites["map"].updateScrollPos
@pos[1]-=1
elsif Input.trigger?(Input::DOWN)
@sprites["map"].scroll[1]-=32
@sprites["map"].updateScrollPos
@pos[1]+=1
elsif Input.trigger?(Input::RIGHT)
@sprites["map"].scroll[0]-=32
@sprites["map"].updateScrollPos
@pos[0]+=1
elsif Input.trigger?(Input::LEFT)
@sprites["map"].scroll[0]+=32
@sprites["map"].updateScrollPos
@pos[0]-=1
elsif Input.trigger?(Input::C)
@sprites["item"].makeVisible
if !deleteItemIn(@pos,false)
Kernel.pbMessageBase("There is no decoration item here.")
else
if Kernel.pbConfirmMessageBase("Return this decoration to the PC?")
deleteItemIn(@pos)
@sprites["map"].reload
end
end
elsif Input.trigger?(Input::B)
break
end
end
@sprites["item"].dispose
@sprites["arrow"].dispose
@sprites["map"].dispose
end
def pbCreatePlaceItem(item)
@placed=false
@sprites["map"]=DecorationMap.new(@viewport)
@sprites["item"]=ItemBaseSprite.new(@viewport)
@sprites["item"].bitmap=getBaseItemBitmap(item[0])
@rsprite=Sprite_Character.new(nil, $game_player)
[email protected]
[email protected]
@rsprite.dispose
@sprites["item"].x=x
@sprites["item"].y=y
if baseItemEvent(item[0])!=nil
@sprites["item"].ox=@sprites["item"].bitmap.width/2-16
@sprites["item"].oy=@sprites["item"].bitmap.height-32
end
@pos=[$game_player.x,$game_player.y]
@sprites["arrow"]=Sprite.new(@viewport)
@sprites["arrow"].bitmap=getSecretArrow
@sprites["arrow"].oy=@sprites["arrow"].bitmap.height
@sprites["arrow"].x=@sprites["item"].x+@sprites["item"].bitmap.width
@sprites["arrow"].y=@sprites["item"].y+@sprites["item"].bitmap.height
@sprites["arrow"].x-=@sprites["item"].ox
@sprites["arrow"].y-=@sprites["item"].oy
@sprites["item"].update
end
def pbPlaceItem(item)
loop do
Graphics.update
Input.update
@sprites["item"].update
if Input.trigger?(Input::UP)
@sprites["map"].scroll[1]+=32
@sprites["map"].updateScrollPos
@pos[1]-=1
elsif Input.trigger?(Input::DOWN)
@sprites["map"].scroll[1]-=32
@sprites["map"].updateScrollPos
@pos[1]+=1
elsif Input.trigger?(Input::RIGHT)
@sprites["map"].scroll[0]-=32
@sprites["map"].updateScrollPos
@pos[0]+=1
elsif Input.trigger?(Input::LEFT)
@sprites["map"].scroll[0]+=32
@sprites["map"].updateScrollPos
@pos[0]-=1
elsif Input.trigger?(Input::C)
@sprites["item"].makeVisible
if canPlaceItem?(item[0],@pos)
placeItemInBase(item[0],@pos)
$PokemonGlobal.setPlacedInfo($game_map.map_id,@pos[0],@pos[1],item)
@placed=true
break
else
Kernel.pbMessageBase("It can't be placed here.")
$scene.disposeSpritesets
end
elsif Input.trigger?(Input::B)
@placed=false
break
end
end
@sprites["item"].dispose
@sprites["arrow"].dispose
@sprites["map"].dispose
return @placed
end
end
####### Bitmap save
class Bitmap
RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ppi', 'i')
def last_row_address
return 0 if disposed?
RtlMoveMemory.call(buf=[0].pack('L'), __id__*2+16, 4)
RtlMoveMemory.call(buf, buf.unpack('L')[0]+8 , 4)
RtlMoveMemory.call(buf, buf.unpack('L')[0]+16, 4)
buf.unpack('L')[0]
end
def bytesize
width * height * 4
end
def get_data
data = [].pack('x') * bytesize
RtlMoveMemory.call(data, last_row_address, data.bytesize)
data
end
def set_data(data)
RtlMoveMemory.call(last_row_address, data, data.bytesize)
end
def get_data_ptr
data = String.new
RtlMoveMemory.call(data.__id__*2, [0x2007].pack('L'), 4)
RtlMoveMemory.call(data.__id__*2+8, [bytesize,last_row_address].pack('L2'), 8)
def data.free() RtlMoveMemory.call(__id__*2, String.new, 16) end
return data unless block_given?
yield data ensure data.free
end
def _dump(level)
get_data_ptr do |data|
dump = Marshal.dump([width, height, Zlib::Deflate.deflate(data, 9)])
dump
end
end
def self._load(dump)
width, height, data = *Marshal.load(dump)
data.replace(Zlib::Inflate.inflate(data))
bitmap = new(width, height)
bitmap.set_data(data)
bitmap
end
def export(filename)
export_png("#{filename}.png")
end
def export_png(filename)
data, i = get_data, 0
(0).step(data.bytesize-4, 4) do |i|
data[i,3] = data[i,3].reverse!
end
deflate = Zlib::Deflate.new(9)
null_char, w4 = [].pack('x'), width*4
(data.bytesize-w4).step(0, -w4) {|i| deflate << null_char << data[i,w4]}
data.replace(deflate.finish)
deflate.close
File.open(filename, 'wb') do |file|
def file.write_chunk(chunk)
write([chunk.bytesize-4].pack('N'))
write(chunk)
write([Zlib.crc32(chunk)].pack('N'))
end
file.write("\211PNG\r\n\32\n")
file.write_chunk(['IHDR',width,height,8,6,0,0,0].pack('a4N2C5'))
file.write_chunk(data.insert(0, 'IDAT'))
file.write_chunk('IEND')
end
end
end
class String
alias getbyte []
alias setbyte []=
alias bytesize size
end
class Font
def marshal_dump() end
def marshal_load(dump) end
end
module Graphics
FindWindow = Win32API.new('user32', 'FindWindow' , 'pp' , 'i')
GetDC = Win32API.new('user32', 'GetDC' , 'i' , 'i')
ReleaseDC = Win32API.new('user32', 'ReleaseDC' , 'ii' , 'i')
BitBlt = Win32API.new('gdi32' , 'BitBlt' , 'iiiiiiiii', 'i')
CreateCompatibleBitmap = Win32API.new('gdi32' , 'CreateCompatibleBitmap', 'iii' , 'i')
CreateCompatibleDC = Win32API.new('gdi32' , 'CreateCompatibleDC' , 'i' , 'i')
DeleteDC = Win32API.new('gdi32' , 'DeleteDC' , 'i' , 'i')
DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i')
GetDIBits = Win32API.new('gdi32' , 'GetDIBits' , 'iiiiipi' , 'i')
SelectObject = Win32API.new('gdi32' , 'SelectObject' , 'ii' , 'i')
def self.snap_to_bitmap
bitmap = Bitmap.new(width, height)
info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
hDC = GetDC.call(hwnd)
bmp_hDC = CreateCompatibleDC.call(hDC)
bmp_hBM = CreateCompatibleBitmap.call(hDC, width, height)
bmp_obj = SelectObject.call(bmp_hDC, bmp_hBM)
BitBlt.call(bmp_hDC, 0, 0, width, height, hDC, 0, 0, 0xCC0020)
GetDIBits.call(bmp_hDC, bmp_hBM, 0, height, bitmap.last_row_address, info, 0)
SelectObject.call(bmp_hDC, bmp_obj)
DeleteObject.call(bmp_hBM)
DeleteDC.call(bmp_hDC)
ReleaseDC.call(hwnd, hDC)
bitmap
end
class << self
def hwnd() @hwnd ||= FindWindow.call('RGSS Player', nil) end
def width() 640 end unless method_defined?(:width)
def height() 480 end unless method_defined?(:height)
def export(filename=Time.now.strftime("snapshot %Y-%m-%d %Hh%Mm%Ss #{frame_count}"))
bitmap = snap_to_bitmap
bitmap.export(filename)
bitmap.dispose
end
alias save export
alias snapshot export
end
end
####################
class ItemBaseSprite < RPG::Sprite
def initialize(*args)
super
@frameEffect=0
end
def makeVisible
self.visible=true
@frameEffect=0
end
def update
super
@frameEffect+=1
if @frameEffect==12
self.visible=false
elsif @frameEffect==24
self.visible=true
@frameEffect=0
end
end
end
class Window_PocketsList < Window_DrawableCommand
attr_accessor :stock
def initialize(stock,x,y,width,height,viewport=nil)
@stock=stock
super(x,y,width,height,viewport)
@baseColor=Color.new(88,88,80)
@shadowColor=Color.new(168,184,184)
@commands=@stock
end
def itemsInPocket
return @stock[self.index][1]>0
end
def itemCount
return @stock.length
end
def drawItem(index,count,rect)
pbSetSystemFont(self.contents) if @starting
rect=drawCursor(index,rect)
if [email protected]
maxitems=@stock[index][2]
items=@stock[index][1]
pbDrawTextPositions(self.contents,[
[_INTL("{1}/{2}",items,maxitems),rect.width,rect.y,1,self.baseColor,self.shadowColor]
])
end
pbDrawShadowText(self.contents,rect.x,rect.y,rect.width,rect.height,
@stock[index][0],self.baseColor,self.shadowColor)
end
end
class Window_ItemListBase < Window_DrawableCommand
def initialize(stock,x,y,width,height,viewport=nil)
@stock=stock
@itemUsing=AnimatedBitmap.new("Graphics/Pictures/secretBaseUsing")
super(x,y,width,height,viewport)
@baseColor=Color.new(88,88,80)
@shadowColor=Color.new(168,184,184)
end
def itemCount
return @stock.length
end
def item
return self.index==itemCount-1 ? 0 : @stock[self.index][0]
end
def drawItem(index,count,rect)
textpos=[]
rect=drawCursor(index,rect)
ypos=rect.y
if index==itemCount-1
itemname=@stock[index]
else
itemname=baseItemName(@stock[index][0])
if @stock[index][1]
pbCopyBitmap(self.contents,@itemUsing.bitmap,rect.width-16,ypos+6)
end
end
textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
pbDrawTextPositions(self.contents,textpos)
end
end
class DecorateItem
def initialize
commands=[]
ret=-1
for i in 0...BASEBAGPOCKETS.length
pocket=BASEBAGPOCKETS[i]
items=$PokemonGlobal.basePocketLength(i)
commands.push([pocket[0],items,pocket[1]])
end
commands.push(["Cancel",-1,-1])
cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.index=0
loop do
Graphics.update
Input.update
cmdwindow.update
if Input.trigger?(Input::C)
break if cmdwindow.index==cmdwindow.stock.length-1
if !cmdwindow.itemsInPocket
cmdwindow.visible=false
Kernel.pbMessage("There are no decorations.")
cmdwindow.visible=true
else
ret=cmdwindow.index
break
end
elsif Input.trigger?(Input::B)
ret=-1
break
end
end
cmdwindow.dispose
itemList(ret) if ret!=-1
end
def pbPrepareWindow(window)
window.visible=true
window.letterbyletter=false
end
def itemList(pocket)
ret=-1
pocket=$PokemonGlobal.getBasePocket(pocket)
items=[]
for i in 0...pocket.length
items.push(pocket[i])
end
items.push("Cancel")
cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
cmdwindow.index=0
cmdwindow.refresh
oldindex=cmdwindow.index
desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
"Go back to the previous menu."
descwindow=Window_AdvancedTextPokemon.new(desc)
pbPrepareWindow(descwindow)
descwindow.visible=true
descwindow.x=Graphics.width/2
descwindow.y=DEFAULTSCREENHEIGHT-128
descwindow.width=Graphics.width/2
descwindow.height=128
descwindow.baseColor=Color.new(88,88,80)
descwindow.shadowColor=Color.new(168,184,184)
loop do
Graphics.update
Input.update
cmdwindow.update
if oldindex!=cmdwindow.index
desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
"Go back to the previous menu."
descwindow.text=desc
oldindex=cmdwindow.index
end
if Input.trigger?(Input::C)
if cmdwindow.index==cmdwindow.itemCount-1
ret=-1
break
else
if pocket[cmdwindow.index][1]
descwindow.visible=false
cmdwindow.visible=false
Kernel.pbMessage("This is in use already.")
descwindow.visible=true
cmdwindow.visible=true
else
ret=cmdwindow.index
break
end
end
elsif Input.trigger?(Input::B)
ret=-1
break
end
end
cmdwindow.dispose
descwindow.dispose
if ret!=-1
startDecoration(pocket[ret],ret)
else
initialize
end
end
def startDecoration(item,itemnum)
scene=PokemonDecoration.new
scene.pbStartScene
scene.pbCreatePlaceItem(item)
placed=scene.pbPlaceItem(item)
if placed
item[1]=true
end
initialize
end
end
class TossItem
def initialize
commands=[]
ret=-1
for i in 0...BASEBAGPOCKETS.length
pocket=BASEBAGPOCKETS[i]
items=$PokemonGlobal.basePocketLength(i)
commands.push([pocket[0],items,pocket[1]])
end
commands.push(["Cancel",-1,-1])
cmdwindow=Window_PocketsList.new(commands,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
cmdwindow.z=99999
cmdwindow.visible=true
cmdwindow.index=0
loop do
Graphics.update
Input.update
cmdwindow.update
if Input.trigger?(Input::C)
break if cmdwindow.index==cmdwindow.stock.length-1
if !cmdwindow.itemsInPocket
cmdwindow.visible=false
Kernel.pbMessage("There are no decorations.")
cmdwindow.visible=true
else
ret=cmdwindow.index
break
end
elsif Input.trigger?(Input::B)
ret=-1
break
end
end
cmdwindow.dispose
itemList(ret) if ret!=-1
end
def pbPrepareWindow(window)
window.visible=true
window.letterbyletter=false
end
def itemList(pocketr)
ret=-1
pocket=$PokemonGlobal.getBasePocket(pocketr)
items=[]
for i in 0...pocket.length
items.push(pocket[i])
end
items.push("Cancel")
cmdwindow=Window_ItemListBase.new(items,0,0,Graphics.width/2,DEFAULTSCREENHEIGHT)
cmdwindow.index=0
cmdwindow.refresh
oldindex=cmdwindow.index
desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
"Go back to the previous menu."
descwindow=Window_AdvancedTextPokemon.new(desc)
pbPrepareWindow(descwindow)
descwindow.visible=true
descwindow.x=Graphics.width/2
descwindow.y=DEFAULTSCREENHEIGHT-128
descwindow.width=Graphics.width/2
descwindow.height=128
descwindow.baseColor=Color.new(88,88,80)
descwindow.shadowColor=Color.new(168,184,184)
loop do
Graphics.update
Input.update
cmdwindow.update
if oldindex!=cmdwindow.index
desc=cmdwindow.item>0 ? baseItemDesc(cmdwindow.item) :
"Go back to the previous menu."
descwindow.text=desc
oldindex=cmdwindow.index
end
if Input.trigger?(Input::C)
if cmdwindow.index==cmdwindow.itemCount-1
ret=-1
break
else
if pocket[cmdwindow.index][1]
descwindow.visible=false
cmdwindow.visible=false
Kernel.pbMessage("This decoration is in use.\nIt can't be thrown away.")
descwindow.visible=true
cmdwindow.visible=true
else
ret=cmdwindow.index
break
end
end
elsif Input.trigger?(Input::B)
ret=-1
break
end
end
cmdwindow.dispose
descwindow.dispose
if ret!=-1 # Item selected
n=$PokemonGlobal.getBasePocket(pocketr)
itemname=baseItemName(n[ret][0])
if Kernel.pbConfirmMessage(_INTL("This {1} will be discarded\nIs that okay?",itemname))
n.delete_at(ret)
Kernel.pbMessage("The decoration item was thrown away.")
itemList(pocketr)
else
initialize # Back
end
else # Back
initialize
end
end
end
class DecorationPC
def shouldShow?
return true
end
def access
loop do
command=Kernel.pbShowCommandsWithHelp(nil,
[_INTL("Decorate"),
_INTL("Put away"),
_INTL("Toss"),
_INTL("Cancel")],
[_INTL("Put out the selected decoration item."),
_INTL("Store the chosen decoration in the PC."),
_INTL("Throw away unwanted decorations."),
_INTL("Go back to the previous menu.")],-1
)
if command==0
scene=DecorateItem.new
elsif command==1
scene=PokemonDecoration.new
scene.pbStartScene
scene.pbCreatePutAway
scene.pbPutAway
elsif command==2
scebe=TossItem.new
else
break
end
end
end
end
class PackUpPC
def shouldShow?
return true
end
def packup(eventid)
#$scene.disposeSpritesets
# Reload the original map data
$game_map.backToOriginal
# Back all items to pc
for p in 0...BASEBAGPOCKETS.length
pocket=$PokemonGlobal.getBasePocket(p)
for i in 0...pocket.length
pocket[i][1]=false
end
end
#$scene.createSpritesets
$PokemonGlobal.installed=false
$PokemonGlobal.mybaseid=-1
$PokemonGlobal.mybaselocation=-1
$game_self_switches[[$game_map.map_id,eventid,"B"]]=true
$game_map.need_refresh=true
end
def access
Kernel.pbMessage(_INTL("All decorations and furniture in your Secret Base will be returned to your PC.\1"))
if !Kernel.pbConfirmMessage(
_INTL("Is that okay?"))
return false
end
return true
end
end
def pbSecretBasePC
copyMapData
Kernel.pbMessage(_INTL("\\se[accesspc]{1} booted up the PC.",$Trainer.name))
loop do
commands=["Decoration","Pack up","Exit"]
command=Kernel.pbMessage(_INTL("What would you like to do?"),
commands,commands.length)
if command==0
scene=DecorationPC.new
scene.access
elsif command==1
scene=PackUpPC.new
if scene.access
scene.packup(get_character(0).id)
break
end
else
pbSEPlay("computerclose")
break
end
end
copyMapData
end
#===============================================================================
# Mart system
#===============================================================================
class Window_BaseMart < Window_DrawableCommand
def initialize(stock,x,y,width,height,viewport=nil)
@stock=stock
super(x,y,width,height,viewport)
@baseColor=Color.new(88,88,80)
@shadowColor=Color.new(168,184,184)
self.windowskin=nil
end
def itemCount
return @stock.length+1
end
def item
return self.index>[email protected] ? 0 : @stock[self.index]
end
def getDisplayPrice(id)
price=baseItemCost(id)
return _ISPRINTF("${1:d}",price)
end
def drawItem(index,count,rect)
textpos=[]
rect=drawCursor(index,rect)
ypos=rect.y
if index==count-1
textpos.push([_INTL("CANCEL"),rect.x,ypos+2,false,
self.baseColor,self.shadowColor])
else
item=@stock[index]
itemname=baseItemName(item)
qty=getDisplayPrice(item)
sizeQty=self.contents.text_size(qty).width
xQty=rect.x+rect.width-sizeQty-2-16
textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
textpos.push([qty,xQty,ypos+2,false,self.baseColor,self.shadowColor])
end
pbDrawTextPositions(self.contents,textpos)
end
end
def pbBottomLeftLinesScreen(window,lines,width=nil)
window.x=0
window.width=width ? width : Graphics.width
window.height=(window.borderY rescue 32)+lines*32
window.y=DEFAULTSCREENHEIGHT-window.height
end
class SecretBaseMartScene
def update
pbUpdateSpriteHash(@sprites)
end
def pbPrepareWindow(window)
window.visible=true
window.letterbyletter=false
end
def initialize(stock)
pbScrollMap(6,3,5)
@adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
@viewport=Viewport.new(0,0,Graphics.width,DEFAULTSCREENHEIGHT)
@viewport.z=99999
@sprites={}
@sprites["background"]=IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap("Graphics/Pictures/secretMartScreen")
@sprites["itemwindow"]=Window_BaseMart.new(stock,
Graphics.width-266,12,278,DEFAULTSCREENHEIGHT-32)
@sprites["itemwindow"].viewport=@viewport
@sprites["itemwindow"].index=0
@sprites["itemwindow"].refresh
@sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
pbPrepareWindow(@sprites["itemtextwindow"])
@sprites["itemtextwindow"].y=DEFAULTSCREENHEIGHT-112
@sprites["itemtextwindow"].width=Graphics.width/2
@sprites["itemtextwindow"].height=128
@sprites["itemtextwindow"].baseColor=Color.new(248,248,248)
@sprites["itemtextwindow"].shadowColor=Color.new(0,0,0)
@sprites["itemtextwindow"].visible=true
@sprites["itemtextwindow"].viewport=@viewport
@sprites["itemtextwindow"].windowskin=nil
@sprites["helpwindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["helpwindow"])
@sprites["helpwindow"].visible=false
@sprites["helpwindow"].viewport=@viewport
pbBottomLeftLinesScreen(@sprites["helpwindow"],1)
@sprites["moneywindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["moneywindow"])
@sprites["moneywindow"].setSkin("Graphics/Windowskins/goldskin")
@sprites["moneywindow"].visible=true
@sprites["moneywindow"].viewport=@viewport
@sprites["moneywindow"].x=0
@sprites["moneywindow"].y=0
@sprites["moneywindow"].width=190
@sprites["moneywindow"].height=96
@sprites["moneywindow"].baseColor=Color.new(88,88,80)
@sprites["moneywindow"].shadowColor=Color.new(168,184,184)
pbDeactivateWindows(@sprites)
pbUpdate
end
def pbUpdate
@sprites["itemicon"].dispose if @sprites["itemicon"]
iconbitmap=(@sprites["itemwindow"].item==0) ? BitmapCache.load_bitmap("Graphics/Icons/itemBack") :
getBaseItemBitmap(@sprites["itemwindow"].item)
@sprites["itemicon"]=PictureWindow.new(iconbitmap)
@sprites["itemicon"].viewport=@viewport
@sprites["itemicon"].x=4
@sprites["itemicon"].y=278-@sprites["itemicon"].height
@sprites["moneywindow"].text=_INTL("Money:\n<r>${1}",@adapter.getMoney())
@sprites["itemtextwindow"].text=(@sprites["itemwindow"].item==0) ? _INTL("Quit shopping.") :
baseItemDesc(@sprites["itemwindow"].item)
end
def pbEndScene
pbDisposeSpriteHash(@sprites)
pbScrollMap(4,3,5)
pbWait(1)
end
def pbDisplayPaused(msg)
cw=@sprites["helpwindow"]
cw.letterbyletter=true
cw.text=msg
pbBottomLeftLinesScreen(cw,2)
cw.visible=true
i=0
pbPlayDecisionSE()
loop do
Graphics.update
Input.update
wasbusy=cw.busy?
self.update
if !cw.busy? && wasbusy
pbUpdate
end
if Input.trigger?(Input::C) && cw.resume && !cw.busy?
@sprites["helpwindow"].visible=false
return
end
end
end
def pbChooseBuyItem
oldindex=@sprites["itemwindow"].index
pbActivateWindow(@sprites,"itemwindow"){
loop do
if oldindex!=@sprites["itemwindow"].index
pbUpdate
oldindex=@sprites["itemwindow"].index
end
Graphics.update
Input.update
self.update
if Input.trigger?(Input::C)
return @sprites["itemwindow"].item
elsif Input.trigger?(Input::B)
return 0
end
end
}
end
end
class SecretBaseMartScreen
def initialize(scene)
@scene=scene
@adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
end
def pbDisplayPaused(msg)
return @scene.pbDisplayPaused(msg)
end
def pbBuyScreen
loop do
@[email protected]
if @item>0
itemname=baseItemName(@item)
price=baseItemCost(@item)
if @adapter.getMoney()<price
pbDisplayPaused(_INTL("You don't have enough money."))
next
else
itempocket=baseItemPocket(@item)
if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
@adapter.setMoney(@adapter.getMoney()-price)
pbDisplayPaused(_INTL("Here you are!\r\nThank you!"))
pbGetBaseItem(@item)
next
else
pbDisplayPaused(_INTL("The space for {1} is full.",itemname))
next
end
end
else
break
end
end
@scene.pbEndScene
end
end
def pbSecretBaseMart(stock,speech=nil)
for i in 0...stock.length
if stock[i].is_a?(String)
stock[i]=getBaseItemByName(stock[i])
end
end
stock.compact!
commands=[]
cmdBuy=-1
cmdSell=-1
cmdQuit=-1
commands[cmdBuy=commands.length]=_INTL("Buy")
commands[cmdQuit=commands.length]=_INTL("Cancel")
cmd=Kernel.pbMessage(
speech ? speech : _INTL("Welcome!\r\nHow may I serve you?"),
commands,cmdQuit+1)
loop do
if cmdBuy>=0 && cmd==cmdBuy
sscene=SecretBaseMartScene.new(stock)
sscreen=SecretBaseMartScreen.new(sscene)
sscreen.pbBuyScreen
else
Kernel.pbMessage(_INTL("Please come again!"))
break
end
cmd=Kernel.pbMessage(
_INTL("Is there anything else I can help you with?"),commands,cmdQuit+1)
end
end
#===============================================================================
# Creating secret bases
#===============================================================================
def pbTeletransport(id,x,y)
Kernel.pbCancelVehicles
$game_temp.player_new_map_id=id
$game_temp.player_new_x=x
$game_temp.player_new_y=y
$game_temp.player_new_direction=8
$scene.transfer_player
$game_map.autoplay
$game_map.refresh
end
def pbPackup(id)
for p in 0...BASEBAGPOCKETS.length
pocket=$PokemonGlobal.getBasePocket(p)
for i in 0...pocket.length
pocket[i][1]=false
end
end
$PokemonGlobal.installed=false
$PokemonGlobal.mybaseid=-1
$PokemonGlobal.mybaselocation=-1
if $PokemonGlobal.baseinfo && $PokemonGlobal.baseinfo[id]
$PokemonGlobal.baseinfo[id].clear
$PokemonGlobal.baseinfo[id]=nil
end
end
def pbNewSecretBase
newBaseId=get_character(0).name.gsub("SECRETBASE", "").to_i
movefinder=Kernel.pbCheckMove(BASEMOVENEEDED)
if movefinder && $PokemonGlobal.getBaseId>=0
Kernel.pbMessage("You may only make one secret base.\1")
mapname=pbGetMapNameFromId($PokemonGlobal.getBaseLocation)
movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
if Kernel.pbConfirmMessage(_INTL("Would you like to move from the secret base near {1}?",mapname))
Kernel.pbMessage(_INTL("All decorations and furniture in your secret base will be returned to your PC.\1"))
if Kernel.pbConfirmMessage(_INTL("Is that okay?"))
pbPackup($PokemonGlobal.getBaseId)
$PokemonGlobal.mybaseid=-1
$PokemonGlobal.mybaselocation=-1
$game_map.reloadEventsForBase
pbFlash(Color.new(0,0,0),16)
pbWait(18)
Kernel.pbMessage(_INTL("Moving complete.\1"))
if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
speciesname=!movefinder ? $Trainer.name : movefinder.name
Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
pbHiddenMoveAnimation(movefinder)
$PokemonGlobal.mybaseid=newBaseId
$PokemonGlobal.mybaselocation=$game_map.map_id
$PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
$game_map.reloadEventsForBase
return true
end
end
end
elsif movefinder
movename=PBMoves.getName(getID(PBMoves,BASEMOVENEEDED))
if Kernel.pbConfirmMessage(_INTL("Would you like to use {1}?",movename))
speciesname=!movefinder ? $Trainer.name : movefinder.name
Kernel.pbMessage(_INTL("{1} used {2}!",speciesname,movename))
pbHiddenMoveAnimation(movefinder)
$PokemonGlobal.mybaseid=newBaseId
$PokemonGlobal.mybaselocation=$game_map.map_id
$PokemonGlobal.outdoordata=[$game_map.map_id,$game_player.x,$game_player.y]
$game_map.reloadEventsForBase
return true
end
end
return false
end
def getDoorPos(map)
map=load_data(sprintf("Data/Map%03d.%s", map,$RPGVX ? "rvdata" : "rxdata"))
map.events.each do |i, event|
return [event.x, event.y] if event.name=="DOOR"
end
return [0,0]
end
def pbInstallingBase
if Kernel.pbConfirmMessage("Want to make your secret base here?")
$PokemonGlobal.installed=true
return true
else
$PokemonGlobal.installed=false
$PokemonGlobal.mybaseid=-1
$PokemonGlobal.mybaselocation=-1
return false
end
end
class Game_Map
def reloadEventsForBase
for i in @events.keys
if @events[i] && @events[i].rEvent && @events[i].rEvent.name.include?("SECRETBASE")
mapid=@events[i].rEvent.name.gsub("SECRETBASE", "").to_i
$game_self_switches[[@map_id,@events[i].id,"A"]]=false
if mapid==$PokemonGlobal.getBaseId
$game_self_switches[[@map_id,@events[i].id,"A"]]=true
end
@need_refresh=true
end
end
end
def searchForMyBase
for i in @map.events.keys
if @map.events[i].name.include?("SECRETBASE")
[email protected][i].name.gsub("SECRETBASE", "").to_i
@events[i][email protected][i].clone
$game_self_switches[[@map_id,@events[i].id,"A"]]=false
if mapid==$PokemonGlobal.getBaseId
$game_self_switches[[@map_id,@events[i].id,"A"]]=true
end
elsif @map.events[i].name.include?("BASEPC")
# Disable self switches
$game_self_switches[[@map_id,@events[i].id,"B"]]=false
$game_self_switches[[@map_id,@events[i].id,"A"]]=false
# Make available pcs if it's your base
if $game_map.map_id==$PokemonGlobal.getBaseId && $PokemonGlobal.installed
$game_self_switches[[@map_id,@events[i].id,"A"]]=true
end
end
end
@need_refresh=true
end
end
#===============================================================================
# ■ Functions for users
#===============================================================================
# - pbMakeNumericTileset(TILESETNAME)
# This will save in your project's folder the tileset you've selected
# with a numeric patron.
#===============================================================================
def pbGetBaseItem(itemid)
item=itemid
if itemid.is_a?(String)
item=getBaseItemByName(itemid)
end
itempocket=baseItemPocket(item)
if $PokemonGlobal.basePocketLength(itempocket)<getMaxSecretBagPocket(itempocket)
$PokemonGlobal.baseItemBag[itempocket].push([item,false])
return true
end
return false
end
def pbMakeNumericTileset(name)
file=sprintf("Graphics/Tilesets/"+name)
return if !FileTest.image_exist?(file)
tileset=BitmapCache.load_bitmap(file)
numericSet=tileset.clone
pbSetSystemFont(numericSet)
numericSet.font.size=21
for width in 0...numericSet.width/32
for height in 0...numericSet.height/32
number=(width+(height*8)).to_s
nsize=numericSet.text_size(number)
text=[[
number,(width+1)*32-16,height*32,2,Color.new(255,0,0),Color.new(0,0,0)
]]
pbDrawTextPositions(numericSet,text)
end
end
numericSet.export(sprintf(name+"_numeric"))
Kernel.pbMessage(_INTL("Saved in game's folder: {1}_numeric",name))
end
I'm... I'm sorry.
Last edited: