01-05-2010, 10:11 AM
Citizens Script v1.0
DescrizioneQuesto script permette di rendere le grosse città/villaggi ricche di personaggi creando solo pochi eventi e senza pesare sul gioco.
Basterà scrivere all'interno di un commento dell'evento "begin passante" e l'evento otterrà delle caratteristiche particolari:
• Movimento Casuale Personalizzato: si muove spesso in avanti e ogni tanto cambia direzione
• Frequenza e Velocità: sono entrambe decise via script, la velocità è casuale
• Grafica: la grafica dell'evento è gestita dallo script, che ne sceglie una a caso tra i characters di default "Civilian"
• Posizionamento: se i cittadini si allontaneranno troppo dal personaggio, verranno riposizionati casualmente nelle vicinanze dell'eroe (ovviamente fuori dallo schermo)
Capite che in questo modo creando una decina di eventi Cittadino il personaggio incontrerà sempre persone diverse, qualunque sia la dimensione della città!
Autore
Alato
Credits: questo script contiene l'XPML Script di Rataime e una versione modificata da alato dell'Anti Event Lag Script di Near Fantastica
Allegati
Lo script in versione txt è in fondo alla pagina
Istruzioni per l'uso
Create una pagina sopra il main, e incollate al suo interno lo script.
Fatto ciò vi basterà creare un commento "begin passante" all'interno degli eventi che volete rendere Cittadini. Consiglio di provarlo in una mappa ampia.
Codice:
#==============================================================================
# - Citizens Script ~ v1.0 # ( 13/12/06 )
#--------------------------#---------------------------------------------------
# by Alato ~ www.rpg2s.net #
#--------------------------#
# Contiene l'XPML Script di Rataime e una versione
# modificata da me dell'Anti Event Lag Script di
# Near Fantastica.
#------------------------------------------------------------------------------
# Incollato questo script in una pagina sopra il Main
# avrete a disposizione un nuovo comando per gli eventi.
# Scrivendo "begin passante" in un commento dell'evento
# questo verrà considerato come un passante, cioè sarà
# sempre presente vicino allo schermo.
# Grafica, velocità e frequenza sono gestiti dallo
# script in maniera casuale (per la grafica utilizza
# i character di default "Civilian").
#
# In caso di domande o problemi chiedete nel forum
# di www.rpg2s.net
#==============================================================================
############################################
######## Aggiunte a Game_Character #########
############################################
class Game_Character
#--------------------------------------------------------------------------
# - Aggiornamento
#--------------------------------------------------------------------------
def update
if passante?
@move_type = 77 # Movimento Passanti
@move_frequency = 6
end
if jumping?
update_jump
elsif moving?
update_move
else
update_stop
end
if @anime_count > 18 - @move_speed * 2
if not @step_anime and @stop_count > 0
@pattern = @original_pattern
else
@pattern = (@pattern + 1) % 4
end
@anime_count = 0
end
if @wait_count > 0
@wait_count -= 1
return
end
if @move_route_forcing
move_type_custom
return
end
if @starting or lock?
return
end
if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
case @move_type
when 1
move_type_random
when 2
move_type_toward_player
when 3
move_type_custom
when 77
move_type_passante
end
end
end
#--------------------------------------------------------------------------
# - Riposiziona
#--------------------------------------------------------------------------
def riposiziona
case rand(3)
when 0
r_x = $game_map.display_x + rand(21)*128 - 128*3
r_y = $game_map.display_y - 128*3
when 1
r_x = $game_map.display_x + rand(21)*128 - 128*3
r_y = $game_map.display_y + 2176 + 128*3
when 2
r_x = $game_map.display_x - 128*3
r_y = $game_map.display_y + rand(16)*128 - 128*3
when 3
r_x = $game_map.display_x + 2816 + 128*3
r_y = $game_map.display_y + rand(16)*128 - 128*3
end
x = r_x / 128
y = r_y / 128
if $game_map.passable?(x, y, 0)
@real_x = r_x
@real_y = r_y
@x = x
@y = y
else
riposiziona
end
r = rand(23) + 1
if r < 10
name = "10" + r.to_s + "-Civilian0" + r.to_s
else
name = "1" + r.to_s + "-Civilian" + r.to_s
end
@character_name = name
@move_speed = rand(2)+ 1
end
#--------------------------------------------------------------------------
# - Movimento Passante
#--------------------------------------------------------------------------
def move_type_passante
case rand(19)
when 0..16
move_forward
when 17
move_random
when 18
@stop_count = 0
end
end
end
############################################
######### Aggiunte a GAme_Event ############
############################################
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# - Controlla se è un passante
#--------------------------------------------------------------------------
def passante?
params = XPML_read("passante",@id,2)
return (params != nil)
end
end
############################################
######### Aggiunte a Game_Player ###########
############################################
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# - Il Player non è mai un passante
#--------------------------------------------------------------------------
def passante?
return false
end
end
###################
############ XPML Definition ###############
# by Rataime #
###################
def XPML_read(markup,event_id,max_param_number=0)
parameter_list = nil
event=$game_map.events[event_id]
return if event.list==nil
for i in 0...event.list.size
if event.list[i].code == 108 and event.list[i].parameters[0].downcase == "begin "+markup.downcase
parameter_list = [] if parameter_list == nil
for j in i+1...event.list.size
if event.list[j].code == 108
parts = event.list[j].parameters[0].split
if parts.size!=1 and parts[0].downcase!="begin"
if parts[1].to_i!=0 or parts[1]=="0"
parameter_list.push(parts[1].to_i)
else
parameter_list.push(parts[1])
end
else
return parameter_list
end
else
return parameter_list
end
return parameter_list if max_param_number!=0 and j==i+max_param_number
end
end
end
return parameter_list
end
############################
####### Anti Event Lag Script v3 ###############
# by Near Fantastica #
############################
# ~ mod by Alato #
############################
#====
# ¦ Game_Map
#====
class Game_Map
#------
def in_range?(object)
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 2816
screne_height = $game_map.display_y
screne_height += 2176
return false if object.real_x <= screne_x
return false if object.real_x >= screne_width
return false if object.real_y <= screne_y
return false if object.real_y >= screne_height
return true
end
#------
def in_big_range?(object)
screne_x = $game_map.display_x
screne_x -= 256*6
screne_y = $game_map.display_y
screne_y -= 256*6
screne_width = $game_map.display_x
screne_width += 2816 + 256*5
screne_height = $game_map.display_y
screne_height += 2176 + 256*5
return false if object.real_x <= screne_x
return false if object.real_x >= screne_width
return false if object.real_y <= screne_y
return false if object.real_y >= screne_height
return true
end
#------
def update
if $game_map.need_refresh
refresh
end
if @scroll_rest > 0
distance = 2 ** @scroll_speed
case @scroll_direction
when 2
scroll_down(distance)
when 4
scroll_left(distance)
when 6
scroll_right(distance)
when 8
scroll_up(distance)
end
@scroll_rest -= distance
end
for event in @events.values
if in_range?(event) or event.trigger == 3 or event.trigger == 4
event.update
elsif event.passante? # se è un passante riposizionalo
event.update
until in_big_range?(event)
event.riposiziona
end
end
end
for common_event in @common_events.values
common_event.update
end
@fog_ox -= @fog_sx / 8.0
@fog_oy -= @fog_sy / 8.0
if @fog_tone_duration >= 1
d = @fog_tone_duration
target = @fog_tone_target
@fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
@fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
@fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
@fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
@fog_tone_duration -= 1
end
if @fog_opacity_duration >= 1
d = @fog_opacity_duration
@fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
@fog_opacity_duration -= 1
end
end
end
#====
# ¦ Spriteset_Map
#====
class Spriteset_Map
#------
def in_range?(object)
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 2816
screne_height = $game_map.display_y
screne_height += 2176
return false if object.real_x <= screne_x
return false if object.real_x >= screne_width
return false if object.real_y <= screne_y
return false if object.real_y >= screne_height
return true
end
#------
def in_big_range?(object)
screne_x = $game_map.display_x
screne_x -= 256*6
screne_y = $game_map.display_y
screne_y -= 256*6
screne_width = $game_map.display_x
screne_width += 2816 + 256*5
screne_height = $game_map.display_y
screne_height += 2176 + 256*5
return false if object.real_x <= screne_x
return false if object.real_x >= screne_width
return false if object.real_y <= screne_y
return false if object.real_y >= screne_height
return true
end
#------
def update
if @panorama_name != $game_map.panorama_name or
@panorama_hue != $game_map.panorama_hue
@panorama_name = $game_map.panorama_name
@panorama_hue = $game_map.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
if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
@fog_name = $game_map.fog_name
@fog_hue = $game_map.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
@tilemap.ox = $game_map.display_x / 4
@tilemap.oy = $game_map.display_y / 4
@tilemap.update
@panorama.ox = $game_map.display_x / 8
@panorama.oy = $game_map.display_y / 8
@fog.zoom_x = $game_map.fog_zoom / 100.0
@fog.zoom_y = $game_map.fog_zoom / 100.0
@fog.opacity = $game_map.fog_opacity
@fog.blend_type = $game_map.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
i=0
for sprite in @character_sprites
if sprite.character.is_a?(Game_Event)
if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4 or (sprite.character.passante? and in_big_range?(sprite.character))
sprite.update
i+=1
end
else
sprite.update
i+=1
end
end
@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
for sprite in @picture_sprites
sprite.update
end
@timer_sprite.update
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
@viewport3.color = $game_screen.flash_color
@viewport1.update
@viewport3.update
end
end
Postate qui nel caso si riscontrino bug o problemi di sorta.