mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2026-07-22 07:37:00 +00:00
325 lines
9.6 KiB
Ruby
325 lines
9.6 KiB
Ruby
def showQuestMap
|
|
QuestMap.new
|
|
end
|
|
|
|
class QuestMap < BetterRegionMap
|
|
attr_reader :reopen_map
|
|
QUEST_SIDE_ICON_PATH = "Graphics/Pictures/map/quest_icon"
|
|
QUEST_MAIN_ICON_PATH = "Graphics/Pictures/map/quest_icon_main"
|
|
QUEST_AQUA_ICON_PATH = "Graphics/Pictures/map/quest_icon_aqua"
|
|
QUEST_MAGMA_ICON_PATH = "Graphics/Pictures/map/quest_icon_magma"
|
|
QUEST_ROCKET_ICON_PATH = "Graphics/Pictures/map/quest_icon_rocket"
|
|
QUEST_COMPLETED_ICON_PATH = "Graphics/Pictures/map/quest_icon_completed"
|
|
|
|
def initialize
|
|
@quests = {}
|
|
@spots = {}
|
|
@popup = nil
|
|
@snapping = false
|
|
@previous_position = [0, 0]
|
|
@show_completed=false
|
|
@show_in_progress =true
|
|
super(nil, false, false, false, nil, nil, false)
|
|
end
|
|
|
|
def after_init_graphics
|
|
@window["player"].visible = false
|
|
end
|
|
|
|
def init_cursor_position(x, y)
|
|
super(x, y)
|
|
on_hover(*getPlayerPosition)
|
|
end
|
|
|
|
def initialize_quests_locations(show_in_progress, show_completed)
|
|
$Trainer.quests.each do |quest|
|
|
next if quest.completed && !show_completed
|
|
next if !quest.completed && !show_in_progress
|
|
|
|
position = [0, 0] # default
|
|
if quest.location_map_id
|
|
position = getTownMapFlyCoordinates(quest.location_map_id)
|
|
else
|
|
if DEFAULT_QUEST_MAP_LOCATIONS.include?(quest.id)
|
|
position = getTownMapFlyCoordinates(DEFAULT_QUEST_MAP_LOCATIONS[quest.id])
|
|
end
|
|
end
|
|
quests_at_location = @quests[position]
|
|
quests_at_location = [] if quests_at_location.nil?
|
|
quests_at_location << quest
|
|
@quests[position] = quests_at_location
|
|
@spots[position] = quests_at_location # Unused, but the map checks positions in there to see if it should snap to a new location
|
|
end
|
|
end
|
|
|
|
def add_map_icons
|
|
initialize_quests_locations(true, false)
|
|
@quests.each_key do |position|
|
|
quests_list = @quests[position]
|
|
|
|
if quests_list.all?(&:completed)
|
|
add_map_icon_at_position(position, position, QUEST_COMPLETED_ICON_PATH)
|
|
next
|
|
end
|
|
|
|
icon_path = QUEST_SIDE_ICON_PATH
|
|
has_rocket = false
|
|
has_magma = false
|
|
has_aqua = false
|
|
|
|
quests_list.each do |quest|
|
|
case quest.type
|
|
when :MAIN_QUEST
|
|
icon_path = QUEST_MAIN_ICON_PATH
|
|
break
|
|
when :ROCKET_QUEST then has_rocket = true
|
|
when :MAGMA_QUEST then has_magma = true
|
|
when :AQUA_QUEST then has_aqua = true
|
|
end
|
|
end
|
|
|
|
unless icon_path == QUEST_MAIN_ICON_PATH
|
|
if has_rocket then icon_path = QUEST_ROCKET_ICON_PATH
|
|
elsif has_magma then icon_path = QUEST_MAGMA_ICON_PATH
|
|
elsif has_aqua then icon_path = QUEST_AQUA_ICON_PATH
|
|
end
|
|
end
|
|
|
|
add_map_icon_at_position(position, position, icon_path)
|
|
end
|
|
end
|
|
|
|
def on_hover(x, y)
|
|
quests_at_pos = @quests[[x, y]]
|
|
if quests_at_pos && !quests_at_pos.empty?
|
|
snap_to_position(x, y)
|
|
show_popup(quests_at_pos)
|
|
else
|
|
hide_popup
|
|
end
|
|
end
|
|
|
|
def on_start_moving
|
|
end
|
|
|
|
def on_stop_moving
|
|
return if @snapping
|
|
x = $PokemonGlobal.regionMapSel[0]
|
|
y = $PokemonGlobal.regionMapSel[1]
|
|
if @quests.has_key?([x, y])
|
|
on_hover(x, y)
|
|
return
|
|
end
|
|
|
|
nearby_quest = find_quest_near_coordinates(x, y, 2)
|
|
if nearby_quest
|
|
@snapping = true
|
|
new_x, new_y = nearby_quest
|
|
if [new_x, new_y] != @position_before_moving
|
|
snap_to_position(new_x, new_y)
|
|
on_hover(new_x, new_y)
|
|
end
|
|
@snapping = false
|
|
end
|
|
end
|
|
|
|
def find_quest_near_coordinates(current_x, current_y, radius)
|
|
closest = nil
|
|
min_distance = Float::INFINITY
|
|
for new_x in current_x - radius..current_x + radius
|
|
for new_y in current_y - radius..current_y + radius
|
|
if @quests.has_key?([new_x, new_y])
|
|
distance = Math.sqrt((new_x - current_x) ** 2 + (new_y - current_y) ** 2)
|
|
if distance < min_distance
|
|
min_distance = distance
|
|
closest = [new_x, new_y]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return closest
|
|
end
|
|
|
|
def on_click(x, y)
|
|
return unless @popup
|
|
quest = @popup.run
|
|
if quest
|
|
@popup = nil
|
|
@sprites.visible = false
|
|
@window.visible = false
|
|
Questlog.new(open_quest: quest, from_map: true)
|
|
@sprites.visible = true
|
|
@window.visible = true
|
|
@viewport.visible = true
|
|
@viewport2.visible = true
|
|
@mapvp.visible = true
|
|
@mapoverlayvp.visible = true
|
|
Graphics.update
|
|
x, y = $PokemonGlobal.regionMapSel[0], $PokemonGlobal.regionMapSel[1]
|
|
on_hover(x, y)
|
|
#@popup&.set_selected(true)
|
|
@popup&.refresh
|
|
end
|
|
end
|
|
|
|
def show_popup(quests)
|
|
return unless @sprites["cursor"]
|
|
return if @popup&.quests == quests #popup already active
|
|
return if @popup && @popup.panel_active
|
|
location_name = get_current_location_name
|
|
hide_popup
|
|
on_right_half = @sprites["cursor"].x > (Graphics.width / 2)
|
|
@popup = QuestMapPopup.new(quests, on_right_half, @viewport2, location_name)
|
|
pbWait(4)
|
|
end
|
|
|
|
def should_exit_confirm?
|
|
return false
|
|
end
|
|
|
|
def on_exit_main
|
|
@reopen_map = false
|
|
if @switch_to_questlog
|
|
@switch_to_questlog = false
|
|
@reopen_map = true
|
|
end
|
|
end
|
|
|
|
def should_exit_cancel?
|
|
return true if @switch_to_questlog
|
|
return false if @popup && @popup.panel_active
|
|
return Input.trigger?(Input::B)
|
|
end
|
|
|
|
def on_update
|
|
if Input.trigger?(Input::L) || Input.trigger?(Input::R)
|
|
pbSEPlay("GUI storage show party panel")
|
|
$Trainer.pokenav.last_opened_quest_mode = :LIST
|
|
@switch_to_questlog = true
|
|
end
|
|
end
|
|
|
|
|
|
def hide_popup
|
|
return unless @popup
|
|
@popup.animate_out
|
|
@popup.dispose
|
|
@popup = nil
|
|
end
|
|
|
|
def dispose
|
|
hide_popup
|
|
super
|
|
end
|
|
|
|
def update_text_at_location(location)
|
|
current_position = [$PokemonGlobal.regionMapSel[0], $PokemonGlobal.regionMapSel[1]]
|
|
quests_at_location = @quests[current_position]
|
|
nb_quests_at_position = 0
|
|
nb_quests_at_position = @quests[current_position].length if quests_at_location
|
|
text = ""
|
|
text = pbGetMessageFromHash(MessageTypes::PlaceNames, location[2]) if location
|
|
|
|
nb_quests_text = ""
|
|
if nb_quests_at_position > 1
|
|
nb_quests_text = _INTL("{1} quests in progress", nb_quests_at_position)
|
|
elsif nb_quests_at_position > 0
|
|
nb_quests_text = _INTL("{1} quest in progress", nb_quests_at_position)
|
|
end
|
|
@sprites["txt"].draw([
|
|
[_INTL("Quest Log"), 24, -8, 0, Color.new(255, 255, 255), Color.new(0, 0, 0)],
|
|
[_INTL("L/R : LIST"), 360, -8, 0, Color.new(255, 255, 255), Color.new(0, 0, 0)],
|
|
[text, 16, 344, 0, Color.new(255, 255, 255), Color.new(0, 0, 0)],
|
|
[nb_quests_text, 496, 344, 1, Color.new(255, 255, 255), Color.new(0, 0, 0)],
|
|
], true)
|
|
end
|
|
|
|
def open_quest_detail(quest)
|
|
dispose
|
|
Questlog.new(open_quest: quest)
|
|
end
|
|
end
|
|
|
|
|
|
#For quests recorded before QuestMap existed, so that they don't show up at [0,0]
|
|
DEFAULT_QUEST_MAP_LOCATIONS = {
|
|
|
|
# Main quests
|
|
"main_dad" => MAP_PETALBURG,
|
|
"main_wally" => MAP_PETALBURG,
|
|
|
|
"main_gym_1" => MAP_RUSTBORO,
|
|
"main_gym_2" => MAP_DEWFORD,
|
|
"main_gym_3" => MAP_MAUVILLE,
|
|
"main_gym_4" => MAP_LAVARIDGE,
|
|
"main_gym_5" => MAP_PETALBURG,
|
|
"main_gym_6" => MAP_FORTREE,
|
|
"main_gym_7" => MAP_MOSSDEEP,
|
|
"main_gym_8" => MAP_SOOTOPOLIS,
|
|
|
|
"main_league" => MAP_LEAGUE,
|
|
|
|
"main_stolen_parts" => MAP_RUSTBORO,
|
|
"main_steven_letter" => MAP_DEWFORD,
|
|
"main_devon_parts" => MAP_SLATEPORT,
|
|
|
|
"slateport_team_aqua" => MAP_AQUA_CAMP,
|
|
"slateport_team_magma"=> MAP_MAGMA_CAMP,
|
|
|
|
"evergrande_trumpet" => MAP_EVERGRANDE,
|
|
|
|
"route_102_rematch" => MAP_ROUTE_102,
|
|
"route104_rivalWeather" => MAP_ROUTE_104,
|
|
"route104_oricorio" => MAP_ROUTE_104,
|
|
"route104_oricorio_forms" => MAP_ROUTE_104,
|
|
"route104_allergic" => MAP_ROUTE_104,
|
|
"route109_tanning" => MAP_ROUTE_109,
|
|
"route109_seahouse" => MAP_ROUTE_109,
|
|
"route109_beachball" => MAP_ROUTE_109,
|
|
"route110_bike" => MAP_ROUTE_110,
|
|
"route111_winstrate" => MAP_ROUTE_111,
|
|
"route115_secretBase" => MAP_ROUTE_115,
|
|
"route116_glasses" => MAP_ROUTE_116,
|
|
|
|
# Town/City quests
|
|
"petalburg_berry" => MAP_PETALBURG,
|
|
"rustboro_whismur" => MAP_RUSTBORO,
|
|
"rustboro_shiny" => MAP_RUSTBORO,
|
|
"rustboro_trash" => MAP_RUSTBORO,
|
|
"rustboro_fusion" => MAP_RUSTBORO,
|
|
"dewford_fishing" => MAP_DEWFORD,
|
|
"mauville_quests_1" => MAP_MAUVILLE,
|
|
"mauville_quests_2" => MAP_MAUVILLE,
|
|
"mauville_quests_3" => MAP_MAUVILLE,
|
|
"mauville_quests_4" => MAP_MAUVILLE,
|
|
"mauville_quests_5" => MAP_MAUVILLE,
|
|
"mauville_quests_6" => MAP_MAUVILLE,
|
|
"mauville_quests_7" => MAP_MAUVILLE,
|
|
"verdanturf_shroomish" => MAP_VERDANTURF,
|
|
"verdanturf_nurse" => MAP_VERDANTURF,
|
|
|
|
# Dungeon/Area quests
|
|
"petalburgwoods_spores" => MAP_PETALBURG_WOODS,
|
|
"rusturf_trumpet" => MAP_RUSTURF_TUNNEL,
|
|
|
|
# Team Magma quests
|
|
"magma_camp_attack" => MAP_MAGMA_CAMP,
|
|
"magma_slugma_eggs" => MAP_MAGMA_CAMP,
|
|
"magma_help_grunts" => MAP_MAGMA_CAMP,
|
|
"magma_numel" => MAP_MAGMA_CAMP,
|
|
"magma_graffiti" => MAP_MAGMA_CAMP,
|
|
"magma_song" => MAP_MAGMA_CAMP,
|
|
|
|
# Team Aqua quests
|
|
"aqua_camp_attack" => MAP_AQUA_CAMP,
|
|
"aqua_wailmer_eggs" => MAP_AQUA_CAMP,
|
|
"aqua_help_grunts" => MAP_AQUA_CAMP,
|
|
"aqua_carvanha" => MAP_AQUA_CAMP,
|
|
"aqua_graffiti" => MAP_AQUA_CAMP,
|
|
"aqua_song" => MAP_AQUA_CAMP,
|
|
|
|
# Mauville team quests
|
|
"mauville_magma" => MAP_MAUVILLE,
|
|
"mauville_aqua" => MAP_MAUVILLE,
|
|
}
|