#==============================================================================
# Mappe Isometriche - Autore: DaD, www.dermfxp.altervista.org
#==============================================================================
# In questo script sono andato a modificare le seguenti classi:
# Game_Map; Game_Character; Game_Player; Scene_Title;
# Spriteset_Map; Interpreter;
# Quindi se alcuni dei vostri script dovessero andare a modificare queste stesse
# classi è probabile che lo script non funzioni piu' come dovrebbe, cercherò di
# impostarlo in modo tale da farlo essere compatibile con altri script in futuro.
#==============================================================================
# Indicazioni: $game_map crea la mappa che servirà per la mappa isometrica
# $game_map_iso crea la mappa isometrica
#==============================================================================
#==============================================================================
# - Game_Map
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# - Movimento in giu
# distance : Distanza
#--------------------------------------------------------------------------
def scroll_down(distance)
corr = (($game_map.height + $game_map.width)%2 == 0 ? 0 : 4*16)
@display_y = [@display_y + distance, 128*$game_map_iso.height - 4*480 - corr].min
end
#--------------------------------------------------------------------------
# - Movimento a destra
# distance : Distanza
#--------------------------------------------------------------------------
def scroll_right(distance)
@display_x = [@display_x + distance, 128*$game_map_iso.width - 4 * 640].min
end
end
#==============================================================================
# - Game_Character
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# - Coordinate X Schermo
#--------------------------------------------------------------------------
def screen_x
return (@real_x - @real_y)/4 + 32*$game_map.height - 0 - $game_map.display_x/4
end
#--------------------------------------------------------------------------
# - Coordinate Y Schermo
#--------------------------------------------------------------------------
def screen_y
y = (@real_y + @real_x) / 8 + 24 - $game_map.display_y/4
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
end
#--------------------------------------------------------------------------
# - Coordinate Z Schermo
# height : Altezza del personaggio
#--------------------------------------------------------------------------
def screen_z(height = 0)
if @always_on_top
return 999
end
z = screen_y
if @tile_id > 0
return z + $game_map_iso.priorities[@tile_id] * 32
else
return z + ((height > 32) ? 31 : 0)
end
end
end
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# In questa classe viene tattato il giocatore, gli spostamenti e il movimento
# della mappa. Naturalmente sono stati modificati per lo script
#--------------------------------------------------------------------------
def update
# Memorizza l'ultimo movimento se ci si sta muovendo
last_moving = moving?
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# qui vengono settati i movimenti e le direzioni che prenderà il pg
# alla pressione del tasto direzionale indicato.
case Input.dir8
when 1..2
move_down
when 3
move_right
when 4
move_left
when 7
move_left
when 6
move_right
when 8..9
move_up
end
end
# Le coordinate vengono memorizzate in variabili temporanee
last_real_x = @real_x
last_real_y = @real_y
super
disp_y = screen_y + $game_map.display_y/4
disp_x = screen_x + $game_map.display_x/4
if CENTER_Y - (4*disp_y - $game_map.display_y) < 0
$game_map.scroll_down(4*disp_y - $game_map.display_y - CENTER_Y)
end
if CENTER_X - (4*disp_x - $game_map.display_x) > 0
$game_map.scroll_left(CENTER_X - (4*disp_x - $game_map.display_x))
end
if CENTER_X - (4*disp_x - $game_map.display_x) < 0
$game_map.scroll_right(4*disp_x - $game_map.display_x - CENTER_X)
end
if CENTER_Y - (4*disp_y - $game_map.display_y) > 0
$game_map.scroll_up(CENTER_Y - (4*disp_y - $game_map.display_y))
end
# Quando non ci si sta muovendo
unless moving?
# Quando il movimento è appena finito
if last_moving
# Controllo eventi "Tocco con l'eroe" - "Collisione"
result = check_event_trigger_here([1,2])
# Se non ci sono eventi da eseguire
if result == false
# Se la modalità di debug è disattiva e non si sta premendo ctrl
unless $DEBUG and Input.press?(Input::CTRL)
# Conteggio incontri casuali
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
# Quando C è premuto
if Input.trigger?(Input::C)
# Controlla esecuzione eventi
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end
#==============================================================================
# - Scene_Title
#==============================================================================
class Scene_Title
alias main_orig main
#--------------------------------------------------------------------------
# Qui si va a trovare l'id della mappa affinchè si possa tovare la seconda
# mappa, appunto quella con il titles isometrico
#--------------------------------------------------------------------------
def main
# E' un aggiunta riguardante la seconda mappa, ovvero quella con il Titleset
# isometrico, e rinominata iso.
$data_map_infos = load_data("Data/MapInfos.rxdata")
main_orig
end
end
#==============================================================================
# - Spriteset_Map
#==============================================================================
class Spriteset_Map
#--------------------------------------------------------------------------
# - Inizializzazione Oggetto
#--------------------------------------------------------------------------
def initialize
# Creazione Livelli
@viewport1 = Viewport.new(0, 0, 640, 480)
@viewport2 = Viewport.new(0, 0, 640, 480)
@viewport3 = Viewport.new(0, 0, 640, 480)
@viewport2.z = 200
@viewport3.z = 5000
# Creazione Titlemap
@tilemap = Tilemap.new(@viewport1)
map_infos = $data_map_infos[$game_map.map_id]
# Creazione Titlemap iso
$game_map_iso = Game_Map.new
$game_map_iso.setup(map_infos.parent_id)
@tilemap.tileset = RPG::Cache.tileset($game_map_iso.tileset_name)
for i in 0..6
autotile_name = $game_map.autotile_names[i]
@tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
end
@tilemap.map_data = $game_map_iso.data
@tilemap.priorities = $game_map_iso.priorities
# Creazione Panorama
@panorama = Plane.new(@viewport1)
@panorama.z = -1000
# Creazione Nebbia
@fog = Plane.new(@viewport1)
@fog.z = 3000
# Creazione Chara
@character_sprites = []
for i in $game_map.events.keys.sort
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites.push(sprite)
end
# Creazione effetti meteorologici
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
@weather = RPG::Weather.new(@viewport1)
# Creazione Pictures
@picture_sprites = []
for i in 1..50
@picture_sprites.push(Sprite_Picture.new(@viewport2,
$game_screen.pictures[i]))
end
# Creazione Sprite del timer
@timer_sprite = Sprite_Timer.new
# Aggiornamento frame
update
end
#--------------------------------------------------------------------------
# Per trovare l'origine del panorama usato nella mappa isometrica bisogna
# modificare questi due parametri.
# @panorama.ox = $game_map.display_x / 4
# @panorama.oy = $game_map.display_y / 4
# in questo modo:
# @panorama.ox = $game_map.display_y / 8
# @panorama.oy = $game_map.display_y / 8
#--------------------------------------------------------------------------
def update
# Quando cambia il panorama
if @panorama_name != $game_map_iso.panorama_name or
@panorama_hue != $game_map_iso.panorama_hue
@panorama_name = $game_map_iso.panorama_name
@panorama_hue = $game_map_iso.panorama_hue
if @panorama.bitmap != nil
@panorama.bitmap.dispose
@panorama.bitmap = nil
end
if @panorama_name != ""
@panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
end
Graphics.frame_reset
end
# Quando cambia la nebbia
if @fog_name != $game_map_iso.fog_name or @fog_hue != $game_map_iso.fog_hue
@fog_name = $game_map_iso.fog_name
@fog_hue = $game_map_iso.fog_hue
if @fog.bitmap != nil
@fog.bitmap.dispose
@fog.bitmap = nil
end
if @fog_name != ""
@fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
end
Graphics.frame_reset
end
# Aggiornamento Tile
@tilemap.ox = $game_map.display_x / 4
@tilemap.oy = $game_map.display_y / 4
@tilemap.update
# Aggiornamento Panorama
@panorama.ox = $game_map.display_x / 4
@panorama.oy = $game_map.display_y / 4
# Aggiornamento Nebbia
@fog.zoom_x = $game_map_iso.fog_zoom / 100.0
@fog.zoom_y = $game_map_iso.fog_zoom / 100.0
@fog.opacity = $game_map_iso.fog_opacity
@fog.blend_type = $game_map_iso.fog_blend_type
@fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
@fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
@fog.tone = $game_map.fog_tone
# Aggiornamento Chara
for sprite in @character_sprites
sprite.update
end
# Aggiornamento effetti meteorologici
@weather.type = $game_screen.weather_type
@weather.max = $game_screen.weather_max
@weather.ox = $game_map.display_x / 4
@weather.oy = $game_map.display_y / 4
@weather.update
# Aggiornamento Picture
for sprite in @picture_sprites
sprite.update
end
# Aggiornamento sprite del timer
@timer_sprite.update
# Settaggio della tonalità e dell'effetto scuoti schermo
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
# Settaggio del colore dell'effetto flash
@viewport3.color = $game_screen.flash_color
# Aggiornamento Livelli
@viewport1.update
@viewport3.update
end
end
#==============================================================================
# - Interpreter
#------------------------------------------------------------------------------
# E' la classe che esegue i comandi degli eventi
# è usata in Game_System e in Game_Event
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# - Impostazioni Mappa
#--------------------------------------------------------------------------
def command_204
case @parameters[0]
when 0
$game_map_iso.panorama_name = @parameters[1]
$game_map_iso.panorama_hue = @parameters[2]
when 1
$game_map_iso.fog_name = @parameters[1]
$game_map_iso.fog_hue = @parameters[2]
$game_map_iso.fog_opacity = @parameters[3]
$game_map_iso.fog_blend_type = @parameters[4]
$game_map_iso.fog_zoom = @parameters[5]
$game_map_iso.fog_sx = @parameters[6]
$game_map_iso.fog_sy = @parameters[7]
when 2
$game_map_iso.battleback_name = @parameters[1]
$game_temp_iso.battleback_name = @parameters[1]
end
return true
end
#--------------------------------------------------------------------------
# - Cambia Tonalità Nebbia
#--------------------------------------------------------------------------
def command_205
$game_map_iso.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
return true
end
#--------------------------------------------------------------------------
# - Cambia Opacità Nebbia
#--------------------------------------------------------------------------
def command_206
$game_map_iso.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
return true
end
end
#==============================================================================
# Istruzioni per l'uso
#==============================================================================
# Lo sript è molto semplice da utilizzare, innanzitutto ogni qual volta che
# andrete a ricreare una mappa isometrica dovrete, creare due mappe, la prima
# sarà costituita dal titleset isometrico, che dovrete chiamare
# [Nome della mappa]Iso dopodiche potrete andare a ricreare la
# seconda mappa con gli eventi e tutto quello di cui avrete bisogno
# al suo interno, il nome della seconda mappa, dovrà essere uguale a quello
# della mappa a cui vorrete associare il titleset isometrico.
# Esempio:
# Mappa con Tileset isometrico ===> TestIso
# Mappa con Tileset Normale ===> Test
# Nota: Non avrete bisogno di settare il tileset isometrico, perchè basterà
# mettere degli eventi o parti di tileset non trapassabili per non far passare
# il chara, dove voi non vorrete che passi.
# Esempio:
# Mappa con Tileset isometrico ===> Albero che viene trappasato
# Mappa con Tileset Normale ===> Evento non trapassabile
# In questo modo anche se l'albero è trapassabile, non verrà attraversato dal
# chara perchè nella seconda mappa avrete inserito un evento per bloccare
# il passagio del vostro pg.
# Nota 2: In questo script vanno bene qualsiasi chara (non ho provato quelli a
# 9 frame però) quindi non dovrebbero esserci problemi di alcun tipo, anche se
# non escludo che in futuro possa creare dei chara appositi per questo script.
# Credo di aver detto tutto quindi se avrete problemi potete contattarmi su
# www.dermfxp.altervista.org oppure su www.rpgshrine.altervista.org.
#==============================================================================
# Fine
#==============================================================================