Files
infinitefusion-e18/Data/Scripts/053_PIF_Hoenn/SecretBases/SecretBasesController.rb
2025-09-28 15:53:01 -04:00

333 lines
10 KiB
Ruby

SWITCH_SECRET_BASE_PLACED_FIRST_DECORATION = 2047
class Trainer
attr_accessor :secretBase
attr_accessor :owned_decorations
end
class PokemonTemp
attr_accessor :enteredSecretBaseController
end
class SecretBaseController
attr_accessor :secretBase
def initialize(secretBase)
@secretBase = secretBase
end
def callBehaviorPosition(item_position)
item = @secretBase.layout.get_item_at_position(item_position)
if item && item.itemTemplate.behavior && item.interactable?(item_position)
item.itemTemplate.behavior.call(item)
end
end
def furnitureInteract(item_position = [], menuStartIndex=0)
cmd_labels = {
use: _INTL("Use"),
move: _INTL("Move"),
rotate: _INTL("Rotate"),
delete: _INTL("Put away"),
cancel: _INTL("Cancel"),
decorate: _INTL("Decorate!"),
storage: _INTL("Pokémon Storage"),
item_storage: _INTL("Item Storage")
}
item = @secretBase.layout.get_item_at_position(item_position)
return unless item
options = []
if item.itemId == :PC
pbMessage(_INTL("\\se[PC open]{1} booted up the PC.", $Trainer.name))
options << :decorate unless @secretBase.is_visitor
options << :storage
options << :item_storage
else
options << :use if item.itemTemplate.behavior && item.interactable?(item_position)
end
options << :move unless @secretBase.is_visitor
options << :rotate unless @secretBase.is_visitor || item.itemId == :PC
options << :delete if item.itemTemplate.deletable && !@secretBase.is_visitor
options << :cancel
actionable = options - [:cancel]
if actionable.length == 1
return executeFurnitureCommand(item, actionable.first,-1)
end
choice = optionsMenu(options.map { |cmd| cmd_labels[cmd] },-1,menuStartIndex)
executeFurnitureCommand(item, options[choice],choice, item_position)
end
def executeFurnitureCommand(item, command, commandIndex, position = nil)
case command
when :use
item.itemTemplate.behavior.call(item)
when :move
moveSecretBaseItem(item.instanceId, item.position)
when :rotate
rotateSecretBaseItem(item.getMainEvent)
furnitureInteract(position,commandIndex)
when :delete
if pbConfirmMessage(_INTL("Put away the #{item.name}?"))
pbSEPlay("GUI storage put down", 80, 100)
resetFurniture(item.instanceId)
else
furnitureInteract(position,commandIndex)
end
when :decorate
decorateSecretBase
when :storage
pbFadeOutIn {
scene = PokemonStorageScene.new
screen = PokemonStorageScreen.new(scene, $PokemonStorage)
screen.pbStartScreen(0)
}
when :item_storage
pbPCItemStorage
when :cancel
return
end
end
def reloadItems()
$PokemonTemp.pbClearTempEvents
SecretBaseLoader.new.loadSecretBaseFurniture(@secretBase)
end
def isMovingFurniture?
return $game_temp.moving_furniture
end
def decorateSecretBase
cmd_addItem = _INTL("Add a decoration")
cmd_moveItem = _INTL("Move a decoration")
cmd_cancel = _INTL("Back")
commands = []
commands << cmd_addItem
commands << cmd_moveItem
commands << cmd_cancel
choice = optionsMenu(commands)
case commands[choice]
when cmd_addItem
item_id = selectAnySecretBaseItem
addSecretBaseItem(item_id)
when cmd_moveItem
item_instance = selectPlacedSecretBaseItemInstance
moveSecretBaseItem(item_instance.instanceId, item_instance.position)
when cmd_cancel
return
end
end
def addSecretBaseItem(item_id)
return if @secretBase.is_a?(VisitorSecretBase)
echoln "ADDING ITEM #{item_id}"
if item_id
new_item_instance = $Trainer.secretBase.layout.add_item(item_id, [$game_player.x, $game_player.y])
SecretBaseLoader.new.loadSecretBaseFurniture(@secretBase)
$game_temp.original_direction = $game_player.direction
$game_player.direction = DIRECTION_DOWN
moveSecretBaseItem(new_item_instance, nil)
end
end
def rotateSecretBaseItem(event)
pbSEPlay("GUI party switch", 80, 100)
direction_fix = event.direction_fix
event.direction_fix = false
event.turn_left_90
event.direction_fix = direction_fix
end
def moveSecretBaseItem(itemInstanceId, oldPosition = nil)
return if @secretBase.is_a?(VisitorSecretBase)
itemInstance = @secretBase.layout.get_item_by_id(itemInstanceId)
event = itemInstance.getMainEvent
$game_player.setPlayerGraphicsOverride("SecretBases/#{itemInstance.getGraphics}")
$game_player.direction_fix = true
$game_player.under_player = event.under_player
$game_player.through = event.through # todo: Make it impossible to go past the walls
$game_temp.moving_furniture = itemInstanceId
$game_temp.moving_furniture_oldPlayerPosition = [$game_player.x, $game_player.y]
$game_temp.moving_furniture_oldItemPosition = oldPosition
event.opacity = 50 if event
event.through = true if event
$game_player.x, $game_player.y = itemInstance.position
$game_system.menu_disabled = true
$game_map.refresh
end
def cancelMovingFurniture()
$game_system.menu_disabled = false
$game_player.removeGraphicsOverride()
$game_temp.moving_furniture = nil
end
def placeFurnitureMenu(menu_position = 0)
if !$Trainer.secretBase || !$game_temp.moving_furniture
cancelMovingFurniture()
end
cmd_place = _INTL("Place here")
cmd_rotate = _INTL("Rotate")
cmd_reset = _INTL("Reset")
cmd_cancel = _INTL("Cancel")
options = []
options << cmd_place
options << cmd_rotate
options << cmd_reset
options << cmd_cancel
choice = optionsMenu(options, -1, menu_position)
case options[choice]
when cmd_place
placeFurnitureAtCurrentPosition($game_temp.moving_furniture, $game_player.direction)
when cmd_rotate
rotateFurniture
placeFurnitureMenu(choice)
when cmd_reset
resetFurniture($game_temp.moving_furniture)
when cmd_cancel
end
end
def placeFurnitureAtCurrentPosition(furnitureInstanceId, direction)
$game_switches[SWITCH_SECRET_BASE_PLACED_FIRST_DECORATION] = true
itemInstance = @secretBase.layout.get_item_by_id(furnitureInstanceId)
currentPosition = [$game_player.x, $game_player.y]
itemInstance.position = currentPosition
itemInstance.direction = direction
if @secretBase.layout.check_position_available_for_item(itemInstance,currentPosition)
main_event = itemInstance.getMainEvent
main_event.direction = $game_player.direction
$PokemonTemp.pbClearTempEvents
SecretBaseLoader.new.loadSecretBaseFurniture(@secretBase)
# Roload after items update
itemInstance = $Trainer.secretBase.layout.get_item_by_id(furnitureInstanceId)
event = itemInstance.getMainEvent
event.direction = $game_player.direction
resetPlayerPosition
else
pbMessage(_INTL("There's no room here!"))
end
end
def resetFurniture(furnitureInstanceId)
adding_new_item = $game_temp.moving_furniture_oldItemPosition == nil
itemInstance = $Trainer.secretBase.layout.get_item_by_id(furnitureInstanceId)
$Trainer.secretBase.layout.remove_item_by_instance(itemInstance.instanceId) if adding_new_item
reloadItems
resetPlayerPosition
itemInstance.dispose if adding_new_item
end
def resetPlayerPosition
return unless $game_temp.moving_furniture
$game_player.removeGraphicsOverride
pbFadeOutIn {
$game_player.direction_fix = false
if $game_temp.original_direction
$game_player.direction = $game_temp.original_direction
end
$game_player.through = false
$game_player.under_player = false
$game_temp.player_new_map_id = $game_map.map_id
$game_temp.player_new_x = $game_temp.moving_furniture_oldPlayerPosition[0]
$game_temp.player_new_y = $game_temp.moving_furniture_oldPlayerPosition[1]
$scene.transfer_player(true)
$game_map.autoplay
$game_map.refresh
}
$game_temp.moving_furniture_oldPlayerPosition = nil
$game_temp.moving_furniture_oldItemPosition = nil
$game_temp.moving_furniture = nil
$game_system.menu_disabled = false
end
def rotateFurniture()
$game_player.direction_fix = false
$game_player.turn_right_90
$game_player.direction_fix = true
end
end
def getEnteredSecretBase
controller = $PokemonTemp.enteredSecretBaseController
return controller.secretBase if controller
end
def getSecretBaseController
return $PokemonTemp.enteredSecretBaseController
end
def secretBaseItem(event_id)
return if $game_temp.moving_furniture
begin
event = $game_map.events[event_id]
pos=[event.x,event.y]
controller=getSecretBaseController
controller.callBehaviorPosition(pos)
end
end
def secretBaseItemMenu
return unless Input.trigger?(Input::C)
event = $game_player.pbFacingEvent
return unless event
event_position = [event.x, event.y]
controller = getSecretBaseController
controller.furnitureInteract(event_position)
end
def selectPlacedSecretBaseItemInstance()
options = []
$Trainer.secretBase.layout.items.each do |item_instance|
item_id = item_instance.itemId
item_name = SecretBasesData::SECRET_BASE_ITEMS[item_id].real_name
options << item_name
end
options << _INTL("Cancel")
chosen = optionsMenu(options)
$Trainer.secretBase.layout.items.each do |item_instance|
item_id = item_instance.itemId
item_name = SecretBasesData::SECRET_BASE_ITEMS[item_id].real_name
return item_instance if item_name == options[chosen]
end
return nil
end
def selectAnySecretBaseItem()
options = []
$Trainer.owned_decorations = [] if $Trainer.owned_decorations.nil?
$Trainer.owned_decorations.each do |item_id|
item_name = SecretBasesData::SECRET_BASE_ITEMS[item_id].real_name
options << item_name
end
options << _INTL("Cancel")
chosen = optionsMenu(options)
$Trainer.owned_decorations.each do |item_id|
item_name = SecretBasesData::SECRET_BASE_ITEMS[item_id].real_name
return item_id if item_name == options[chosen]
end
return nil
end