- Script pour

-
- Code: Tout sélectionner
#=============================================================================
# Switcheur de héros
#-----------------------------------------------------------------------------
# Créé par Sihn, à partir du menu tournant de MakirouAru
# Conçu pour RMVX
# Version 2.4
#=============================================================================
# Touche d'activation (Changez uniquement le Y)
SWITCHEUR_KEY = Input::Y
# Son lors de l'apparition du switcheur
SE_START = "Decision2"
# Animation à jouer sur le héros si changement de celui-ci
ID_ANIMATION = 41
# Durée en frame de l'apparition du switcheur
TRANS_FRAMES = 15
# Durée en frame de la rotation entre deux héros du switcheur
MOVING_FRAMES = 10
# Rayon en pixel
RAYON = 64
# true : En forme d'élipse / false : En forme de cercle
ELIPSE = true
# true : Appuyez sur le bouton / false : Maintenez le bouton
AUTO_KEY = true
#=============================================================================
# Game_Temp
#=============================================================================
class Game_Temp
attr_accessor :switcheur_result
alias initialize_switcheur_result initialize
def initialize
initialize_switcheur_result
@switcheur_result = false
end
end
#=============================================================================
# Game_Party
#=============================================================================
class Game_Party
attr_accessor :actors
end
#=============================================================================
# Window_Switcheur
#=============================================================================
class Window_Switcheur < Window_Base
attr_accessor :index
def initialize
super(-16, -16, 576, 448)
self.contents = Bitmap.new(width-32, height-32)
self.contents.font.name = "Arial"
self.opacity = 0
self.back_opacity = 0
@commands = []
@items = []
for actor in $game_party.members
@commands.push(actor.name)
@items.push(Cache.character(actor.character_name))
end
@item_max = @commands.size
@index = 0
@cx = $game_player.screen_x + 16
@cy = $game_player.screen_y - 8
setup_move_start
refresh
end
def update
super
if @mode < 5
if Input.trigger?(Input::UP) or Input.trigger?(Input::LEFT)
Sound.play_cursor
ELIPSE ? setup_move_move(3) : setup_move_move(4)
return
elsif Input.trigger?(Input::DOWN) or Input.trigger?(Input::RIGHT)
Sound.play_cursor
ELIPSE ? setup_move_move(4) : setup_move_move(3)
return
elsif Input.trigger?(Input::B) and AUTO_KEY
Sound.play_cancel
$game_temp.switcheur_result = false
setup_move_end
return
elsif AUTO_KEY
if Input.trigger?(Input::C) or Input.trigger?(SWITCHEUR_KEY)
Sound.play_decision
$game_temp.switcheur_result = true
setup_move_end
return
end
else
unless Input.press?(SWITCHEUR_KEY)
Sound.play_decision
$game_temp.switcheur_result = true
setup_move_end
return
end
end
end
refresh
end
def refresh
self.contents.clear
case @mode
when 1
refresh_start
when 2
refresh_wait
when 3
refresh_move(1)
when 4
refresh_move(0)
when 5
refresh_end
end
if @mode != 6
cy = ELIPSE ? 32 : 0
rect = Rect.new(@cx - 272, @cy + cy, self.contents.width - 32, 32)
self.contents.draw_text(rect, @commands[@index], 1)
else
dispose
end
end
def refresh_start
d1 = 2.0 * Math::PI / @item_max
d2 = 1.0 * Math::PI / TRANS_FRAMES
r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES
for i in 0...@item_max
j = i - @index
d = d1 * j + d2 * @steps
x = @cx + (r * Math.sin(d)).to_i
y = @cy - ((r * Math.cos(d)).to_i / elipse)
draw_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = 2
end
end
def refresh_wait
d = 2.0 * Math::PI / @item_max
for i in 0...@item_max
j = i - @index
x = @cx + (RAYON * Math.sin(d * j)).to_i
y = @cy - ((RAYON * Math.cos(d * j)).to_i / elipse)
draw_item(x, y, i)
end
end
def refresh_move(mode)
d1 = 2.0 * Math::PI / @item_max
d2 = d1 / MOVING_FRAMES
d2 *= -1 if mode != 0
for i in 0...@item_max
j = i - @index
d = d1 * j + d2 * @steps
x = @cx + (RAYON * Math.sin(d)).to_i
y = @cy - ((RAYON * Math.cos(d)).to_i / elipse)
draw_item(x, y, i)
end
@steps -= 1
if @steps < 1
@mode = 2
end
end
def refresh_end
d1 = 2.0 * Math::PI / @item_max
d2 = 1.0 * Math::PI / TRANS_FRAMES
r = RAYON - 1.0 * RAYON * @steps / TRANS_FRAMES
for i in 0...@item_max
j = i - @index
d = d1 * j + d2 * @steps
x = @cx + (r * Math.sin(d)).to_i
y = @cy - ((r * Math.cos(d)).to_i / elipse)
draw_item(x, y, i)
end
@steps += 1
if @steps > TRANS_FRAMES
@mode = 6
end
end
def draw_item(x, y, i)
item = @items[i]
if $game_party.members[i].character_name.include?("$")
rect = Rect.new(item.width / 3, 0, item.width / 3, item.height / 4)
opa = @index == i ? 255 : 128
self.contents.blt(x - item.width / 3, y - item.height / 4, item, rect, opa)
else
index = $game_party.members[i].character_index
rect = Rect.new((item.width / 4) * (index % 4) + (item.width / 12), (item.height / 2) * (index / 4 % 2), item.width / 12, item.height / 8)
opa = @index == i ? 255 : 128
self.contents.blt(x - item.width / 12, y - item.height / 8, item, rect, opa)
end
end
def setup_move_start
@mode = 1
@steps = TRANS_FRAMES
end
def setup_move_move(mode)
return if $game_party.actors.size < 2
if mode == 3
@index -= 1
@index = @items.size - 1 if @index < 0
elsif mode == 4
@index += 1
@index = 0 if @index >= @items.size
else
return
end
@mode = mode
@steps = MOVING_FRAMES
end
def setup_move_end
@mode = 5
@steps = 0
end
def elipse
return ELIPSE ? -2 : 1
end
end
#=============================================================================
# Scene_Map
#=============================================================================
class Scene_Map
alias ring_system_update update
def update
if @switcheur_window != nil
if @switcheur_window.disposed?
if $game_temp.switcheur_result and @switcheur_window.index != 0
target_actor = $game_party.actors[@switcheur_window.index]
while $game_party.actors[0] != target_actor
actor = $game_party.actors[0]
$game_party.actors.delete_at(0)
$game_party.actors.push(actor)
end
$game_player.animation_id = ID_ANIMATION
$game_player.refresh
end
$game_temp.switcheur_result = false
@switcheur_window = nil
else
@switcheur_window.update
end
return
end
if Input.press?(SWITCHEUR_KEY) and $game_party.actors.size > 0
if SE_START != nil and SE_START != ""
Audio.se_play("Audio/SE/" + SE_START, 80, 100)
end
@switcheur_window = Window_Switcheur.new
end
ring_system_update
end
end
- Installation -Comme d'hab, placez ce script au dessus de main, et au dessous des autres scripts de bases.
Nommez-le comme bon vous semble, le nom que vous lui donnerez n'ayant de toute façon aucune incidence sur son fonctionnement.
- Utilisation -Une fois le script installé, il est fonctionnel. Vous pouvez l'utiliser sans faire aucun paramétrage.^^
Appuyer sur la touche Y de RMVX (S sur votre clavier, par défaut), choisissez votre héros avec gauche et droite, ré-appuyer sur la touche Y (ou entrer) et voila! Votre leader à changer!
- Paramétrage avancé -Il est toutefois possible de personnaliser ce script...
Pour changer la touche qui appelle ce script, allez à la ligne 10, vous devriez avoir :
KEY = Input::Y
Changez le Y par une de ces lettres : A, B, C, X, Y, Z, L, R, CTRL, SHIFT, ALT.
(Cependant, je vous déconseille d'utiliser B et C, ces touches correspondant à annuler/valider vos choix.)
D'autres modifications sont également possibles :
- changer le son joué lors de l'appel du script;
- choisir l'animation à jouer lors du changement de héros;
- changer la durée de l'apparition/disparition du switcheur;
- changer la durée d'une rotation entre deux héros;
- changer le rayon du sélecteur;
- choisir entre une forme rond et ovale pour la disposition des héros;
- et choisir si il faut maintenir la touche Y enfoncé pour utiliser le switcheur.
Ces modifications sont à faire au début du script. Quelques commentaires sont là pour vous aider, mais n'hésitez pas à me poser des question si besoin est!
- Un petit plus non négligeable... -Pour XP :
- Code: Tout sélectionner
$game_variables[29] = $game_party.actors[0].id
Pour VX :
- Code: Tout sélectionner
$game_variables[29] = $game_party.members[0].id
Ce petit code, placé dans un "insérer un script", vous permet d'enregistrer l'identifiant du héros leader dans une variable de RMVX (la variable 29, dans ce code).
Et c'est là que le script prend vraiment tout son intérêt... Vous pouvez, via des conditions en event sur cette variable, adapter les dialogues en fonction du héros leader, lui faire des actions différentes sur la map (une condition qui change la vitesse de marche si votre héros est un chocobo, par exemple), et plein d'autre chose...
- Un exemple plus concret -Voici comment faire une porte qui ne s'ouvre que face à Mélody, 4ème héros de la base de données :
<>
insérer un script : $game_variables[29] = $game_party.actors[0].id<>
Condition : Si la variable 29 est différente de 4<>
Alors<><>
Afficher un message : Seul
[4], descendante des Sheikans, peut ouvrir cette porte.<>
Sinon<><>
Afficher un message : La porte s'ouvre lentement...<><>
Téléporter l'équipe : 6:6:6<>
Fin condition- Crédit -MakirouAru (bien que je l'ai adapté à ma sauce, j'ai conservé la structure globale de son menu tournant)
Sihn
Sur ce, bon making à tous!

Prévenez-moi en cas de bug, ou si vous voulez simplement plus d'information (sur les paramétrages possibles au début du script notamment).