mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-13 16:04:58 +00:00
update 6.7
This commit is contained in:
332
Data/Scripts/053_PIF_Hoenn/SecretBases/SecretBasesController.rb
Normal file
332
Data/Scripts/053_PIF_Hoenn/SecretBases/SecretBasesController.rb
Normal file
@@ -0,0 +1,332 @@
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user