Je tiens beaucoup à la notion du temps. Cette conversion de l'event vers le script est pour le moins difficile, elle sera en plusieurs parties gérant differentes notions. Cette première partie est le coeur du système de temps. Elle contient les fonctions de base que je surchargerai par la suite. La première partie est le "grand incrémenteur", la méthode qui incrémente tout. Sur mon ordi, il tourne bien à 60 FPS avec tout les autres scripts que j'ai posté récemment. Cependant, je ne connais pas encore l'impact de tout le système de temps avec les ajouts encore inachevés.
-Description
Ce script est le coeur de temps, mais n'a pas beaucoup de manifestation en soi. Ce sont les ajouts qui viendront qui lui donner corps. Pour le moment, il incrémente seulement les variables de base: minutes, heures, jours, semaines, mois, années. Les mois (donc les années) et les semaines sont customisables. Il peut afficher l'heure, si vous avez un accessoire particulier. Son rythme d'incrémentation maximal est de une heure par seconde, la vitesse courante d'une minute par seconde. Ralentissable au possible. Fontionne aussi en années négatives. Il a des raccourcis de message. Il peut vous permettre de faire sonner les horloges... et c'est déjà pas mal.
-Installation
Ce script n'échappe pas à la régle du "copiez en dessous de material". Il n'a pas de nécéssité particulière.
-Utilisation
Le temps est une notion assez particulière. La customiser peut être à double tranchant.
Configuration:
Regardons le module de configuration:
Code:
#Module de configuration
#=====================================DATAS===================================== ASTRAL_YEAR =365.2422 CALENDAR =[["Janvier",31],["Février",28,29],["Mars",31],["Avril",30],["Mai",31],["Juin",30],["Juillet",31],["Août",31],["Septembre",30],["Octobre",31],["Novembre",30],["Décembre",31]] WEEK =["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] INIT_MINUTE =23 INIT_HOUR =22 INIT_DAY =28 INIT_MONTH =2 INIT_YEAR =1604 #===================================ADRESSAGE=================================== #Id des variables principales MINUTES =1 HOURS =2 DAYS =3 MONTHS =4 YEARS =5
#Id des variables secondaires DAY_WEEK =6 #Le jour de la semaine
H_MODE_12 =10 #L'heure en mode 12h SONNERIE =11 #Le nbs de sonneries à jouer
#Id des Montres EQUIP_NV1 =[23] # Heure EQUIP_NV2 =[] # Heure + Js EQUIP_NV3 =[] # Heure + Js J Ms EQUIP_NV4 =[] # Heure + J Ms An EQUIP_NV5 =[24] # Heure + J/Ms/An[2] EQUIP_NV6 =[] # Heure + J/Ms/An[4] EQUIP_NV7 =[] # Heure + Js J Ms An EQUIP_NV8 =[25] # Heure + Js[3] J/Ms/An[2]
#Id des switches RUNNING = 1 #Si le temps s'écoule HIDE_TIME = 2 #Si la montre s'affiche
ASTRAL_YEAR correspond à la "vraie" durée d'une année: dans le calendrier Grégorien les années bissextiles sont un peu plus compliquée que dans le calendrier Julien. 365,25 est la valeur d'une année Julienne. Cette différence d'apparence insignifiante fera varier des paramètres comme les saisons très doucement sur 400 ans... (cela explique en parti pourquoi le premier jour des saisons, n'est pas toujours le même mais oscille entre 4 jours, même si le 21 est le plus récurent. Je me suis sans doute embeter pour rien, mais bon ça ne représente pas beaucoup de code en plus. nota: les saisons sont absentes de ce script mais sont prévues pour le suivant...
DECALAGE, c'est le décalage à l'origine de l'année calendaire avec l'année astronomique. Je considère que l'année astronomique commence le premier jour de la première saison (le Printemps)...
CALENDAR est bien la structure de l'année. Vous pouvez ajouter un mois ou en supprimer un, les rallonger ou les raccourcirs, les rendre sensibles aux années bissextiles, ou non. Pour faire la dernière action, il suffit de rajouter une seconde valeur de durée, comparez Février aux autres mois.
WEEK est la structure de la semaine, tout aussi customisable.
Les valeurs "INIT" sont les valeurs de départ de l'horloge.
Le reste du module correspond à de l'adressage, donc ce n'est pas difficile de comprendre.
Fonctionnalités:
- Mettre en route le temps: Il suffit d'activer l'interrupteur à l'adresse RUNNING par défaut 1. Pour le stopper, il suffit de le désactiver.
- Modifier le rythme: Dans un appel de script, écrivez: $game_time.time_speed( speed, limite) speed correspond au nombre de secondes incrémentées par frame. limite correspond au nombre de secondes pour incrémenter une minute. Ainsi quand speed = limite vous êtes à la vitesse maximale. nota: je n'ai pas remarqué de lag causé par le changement de vitesse, ou inputable à la vitesse, même maximale. Le lag que j'avais pu repéré était au niveau de l'affichage, mais il est normalement solutioné.
- Saut temporel: Pour faire un saut temporel, je vous conseil: - de stopper le temps - de modifier les variables correspondantes comme des variables normales - d'appeller un script: $game_time.verif (en réalité, il s'agit plus d'une update, qu'une vérif. Il vérifie bien vos valeurs, mais il met à jour certaines variables muettes) - de remettre en marche le temps
- Raccourci de message: Il y a plusieurs raccourcis. Pour l'heure, c'est \TH[mode], le mode correspond à 24 ou 12, par défaut c'est 24. Pour la date, c'est \TD[forme], il y a beaucoup de forme: 0: Lundi 1: Lundi 23 Septembre 2: 23 Septembre 1390 3: 23/09/90 4: 23/09/1390 5: Lundi 23 Septembre 1390 6: Lun 23/09/90 Pour le mois \TM[id] renvois le nom du mois, si non complété, il renvois le mois actuel.
- La montre:
Il suffit de compléter les tableaux pour rendre l'accessoire apte à donner l'heure. Selon dans quel tableau, il se trouve, l'affichage sera different (même ordre que le raccourci de date).
- La sonnerie:
La sonnerie est une variable qui possède le nombre de l'heure en mode 12h, tant que les minutes ne dépassent pas la valeur de l'heure en mode 12h, sinon la variable est toujours égale à 0. Un event avec comme trigger "la variable sonnerie est superieure à 1", s'activera à chaque début d'heure. Il vous suffit de lui donner le déplacement automatique de jouer un beep, puis d'attendre 59 frames en boucle. Il biiiippera le nombre d'heures.
Dernière édition par vincentmhd le Dim 7 Fév 2010 - 15:24, édité 3 fois
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Temps fictif Sam 5 Sep 2009 - 11:34
-Le script
Spoiler:
Code:
# TIME.v3.2 # Vincentmhd #http://vincentmhdmaker.canalblog.com/ #3/09/09 #25/09/09 édit en V3.2 l'incrémentation du temps se fait dans un thread séparé (+ rapide) module Custom_Time ASTRAL_YEAR =365.2422 DECALAGE =79.25 CALENDAR =[["Janvier",31],["Février",28,29],["Mars",31],["Avril",30],["Mai",31],["Juin",30],["Juillet",31],["Août",31],["Septembre",30],["Octobre",31],["Novembre",30],["Décembre",31]] WEEK =["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"] INIT_MINUTE =23 INIT_HOUR=22 INIT_DAY=28 INIT_MONTH=2 INIT_YEAR=1604 MINUTES=1 HOURS=2 DAYS=3 MONTHS=4 YEARS=5 DAY_WEEK=6 H_MODE_12=10 SONNERIE=11 EQUIP_NV1=[23] EQUIP_NV2=[] EQUIP_NV3=[] EQUIP_NV4=[] EQUIP_NV5=[24] EQUIP_NV6=[] EQUIP_NV7=[] EQUIP_NV8=[25] RUNNING=1 HIDE_TIME=5
class Mhd_Time attr_accessor :secondes, :speed, :incrementation, :total_day, :astral_day def initialize @secondes = 0 @speed = 1 @incrementation = 60 @total_day = 0 @astral_day = 0 init end def run if $game_switches[RUNNING] secondes_update if @secondes >= @incrementation @secondes-= @incrementation minutes_update if $game_variables[MINUTES]>=60 $game_variables[MINUTES]-=60 hours_update if $game_variables[HOURS]>= 24 $game_variables[HOURS]-=24 days_update month_limite = month_size?() if ($game_variables[DAYS] > month_limite) $game_variables[DAYS]-= month_limite months_update if $game_variables[MONTHS] > CALENDAR.size $game_variables[MONTHS]-=CALENDAR.size years_update end end week_update astral_update $time_window.day_refresh end end $time_window.minute_refresh $time_window.update end end end def init $game_variables[MINUTES] = INIT_MINUTE $game_variables[HOURS] = INIT_HOUR $game_variables[DAYS] = INIT_DAY $game_variables[MONTHS] = INIT_MONTH $game_variables[YEARS] = INIT_YEAR setup end def setup verif_pos verif_neg verif_zero @total_day = total_day?() astral_calculate week_update hours_12_update if $game_variables[MINUTES] < $game_variables[H_MODE_12] sonnerie_On end end def verif setup $time_window.minute_refresh $time_window.day_refresh $time_window.update end
def secondes_update @secondes += @speed end def minutes_update $game_variables[MINUTES] +=1 sonnerie_Off end def hours_update $game_variables[HOURS]+=1 hours_12_update sonnerie_On end def hours_12_update if $game_variables[HOURS]> 12 $game_variables[H_MODE_12] = $game_variables[HOURS] - 12 else $game_variables[H_MODE_12] = $game_variables[HOURS] end end def days_update $game_variables[DAYS]+= 1 @total_day +=1 end def astral_update @astral_day += 1 if @astral_day > ASTRAL_YEAR @astral_day -= ASTRAL_YEAR end end def week_update $game_variables[DAY_WEEK] = day_week?() end def months_update $game_variables[MONTHS]+= 1 end def years_update $game_variables[YEARS]+= 1 end def bissextile?(year) if year%4 ==0 if year%100 ==0 if year%400 ==0 return true else return false end else return true end else false end end def month_size?(month =$game_variables[MONTHS], year=$game_variables[YEARS]) if bissextile?(year)&&(CALENDAR[month-1].size == 3) return CALENDAR[month-1][2] else return CALENDAR[month-1][1] end end def total_day?(day=$game_variables[DAYS], month=$game_variables[MONTHS], year=$game_variables[YEARS]) if year> 0 result = (year-1)*ASTRAL_YEAR #the year 0 doesn't exist month -=1 while month > 0 result += month_size?(month, year) month -= 1 end result += day return result elsif year< 0 result = year*(-ASTRAL_YEAR) month -=1 while month > 0 result -= month_size?(month, year) month -= 1 end result -= day return result else print("TIME::ERROR year 0 met") month -=1 while month > 0 result += month_size?(month, year) month -= 1 end result += day return result end end def day_week?(day= @total_day, year=$game_variables[YEARS]) day%=WEEK.size if year<0 day-=(WEEK.size -1) day*=-1 end return (day).to_i end def astral_calculate if $game_variables[YEARS]>= 0 @astral_day = (@total_day - DECALAGE)% ASTRAL_YEAR else @astral_day = (@total_day + DECALAGE)% ASTRAL_YEAR @astral_day = ASTRAL_YEAR - @astral_day end if (@astral_day < 0) @astral_day = ASTRAL_YEAR + @astral_day end end def sonnerie_On $game_variables[SONNERIE] = $game_variables[H_MODE_12] $game_map.need_refresh = true end def sonnerie_Off if $game_variables[MINUTES] >= ($game_variables[SONNERIE]) if $game_variables[SONNERIE] != 0 $game_map.need_refresh = true end $game_variables[SONNERIE] = 0 end end def time_speed(speed, limit = 60) @speed = speed @incrementation = limit end def write_hour(mode = 24) hour = "" if(mode == 24) if $game_variables[HOURS] < 10 hour = " " end hour += $game_variables[HOURS].to_s else if $game_variables[H_MODE_12] < 10 hour = " " end hour += $game_variables[H_MODE_12].to_s end hour += "h" if ($game_variables[MINUTES]) < 10 hour += "0" end hour += ($game_variables[MINUTES]).to_s return hour end def write_date(forme = 3) date = "" case forme when 0 date += WEEK[$game_variables[DAY_WEEK]] when 1 date += WEEK[$game_variables[DAY_WEEK]] date += " " date += $game_variables[DAYS].to_s date += " " date += CALENDAR[$game_variables[MONTHS]-1][0] when 2 date += $game_variables[DAYS].to_s date += " " date += CALENDAR[$game_variables[MONTHS]-1][0] date += " " date += $game_variables[YEARS].to_s when 3 date += $game_variables[DAYS].to_s date += "/" if $game_variables[MONTHS]<10 date += "0" end date += $game_variables[MONTHS].to_s date += "/" if (($game_variables[YEARS].to_i)%100)<10 date += "0" end date += (($game_variables[YEARS].to_i)%100).to_s when 4 date += $game_variables[DAYS].to_s date += "/" date += $game_variables[MONTHS].to_s date += "/" if ($game_variables[YEARS])<10 date += "0" end date += $game_variables[YEARS].to_s when 5 date += WEEK[$game_variables[DAY_WEEK]] date += " " date += $game_variables[DAYS].to_s date += " " date += CALENDAR[$game_variables[MONTHS]-1][0] date += " " date += $game_variables[YEARS].to_s else date += WEEK[$game_variables[DAY_WEEK]][0,3] date += " " date += $game_variables[DAYS].to_s date += "/" if $game_variables[MONTHS]<10 date += "0" end date += $game_variables[MONTHS].to_s date += "/" if (($game_variables[YEARS].to_i)%100)<10 date += "0" end date += (($game_variables[YEARS].to_i)%100).to_s end return date end def write_month(id = $game_variables[MONTHS]) return CALENDAR[id][0] end def verif_zero if $game_variables[YEARS] ==0 $game_variables[YEARS] =1 end if $game_variables[MONTHS] == 0 $game_variables[MONTHS] = 1 end if $game_variables[DAYS] == 0 $game_variables[DAYS] = 1 end end def verif_pos if $game_variables[MINUTES]>= 60 $game_variables[HOURS]+= $game_variables[MINUTES]/60 $game_variables[HOURS] =$game_variables[HOURS] $game_variables[MINUTES]%=60 end if $game_variables[HOURS]>= 24 $game_variables[DAYS]+= $game_variables[HOURS]/24 $game_variables[DAYS] = $game_variables[DAYS] $game_variables[HOURS]%=24 end while $game_variables[DAYS] > month_size?() $game_variables[DAYS] -=month_size?() $game_variables[MONTHS]-=1 end if $game_variables[MONTHS] >CALENDAR.size $game_variables[YEARS] = $game_variables[MONTHS]/CALENDAR.size $game_variables[YEARS] = $game_variables[MONTHS] $game_variables[MONTHS]%=CALENDAR.size end end def verif_neg while $game_variables[MINUTES] < 0 $game_variables[MINUTES] +=60 $game_variables[HOURS] -=1 end while $game_variables[HOURS] < 0 $game_variables[HOURS] +=24 $game_variables[DAYS] -=1 end while $game_variables[MONTHS] <=0 $game_variables[YEARS]-=1 $game_variables[MONTHS] += CALENDAR.size end while $game_variables[DAYS] <=0 $game_variables[MONTHS]-=1 if $game_variables[MONTHS] ==0 $game_variables[YEARS]-=1 $game_variables[MONTHS] += CALENDAR.size end $game_variables[DAYS] += month_size?() end end end class Time_Window < Window_Base def initialize super(362, 0, 192, 120) @forme = 0 @heure = "" @date = "" forme? visible? refresh end def forme? @forme = 0 for i in 0...EQUIP_NV1.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV1[i]])) @forme = 1 end end end for i in 0...EQUIP_NV2.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV2[i]])) @forme = 2 end end end for i in 0...EQUIP_NV3.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV3[i]])) @forme = 3 end end end for i in 0...EQUIP_NV4.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV4[i]])) @forme = 4 end end end for i in 0...EQUIP_NV5.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV5[i]])) @forme = 5 end end end for i in 0...EQUIP_NV6.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV6[i]])) @forme = 6 end end end for i in 0...EQUIP_NV7.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV7[i]])) @forme = 7 end end end for i in 0...EQUIP_NV8.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[EQUIP_NV8[i]])) @forme = 8 end end end end def minute_refresh @heure = $game_time.write_hour() end def day_refresh if (@forme > 1) @date = $game_time.write_date(@forme -2) else @date = "" end end def window_refresh txt_size = 0 if (((@date.size) * 8) >= (((@heure.size) * 8)+ 24)) txt_size = 32 + (@date.size * 8) else txt_size = ((@heure.size) *8) +24 + 32 end self.x = 544 - txt_size self.y = 0 self.width = txt_size if(@date == "") self.height = 32 + WLH else self.height = 32 + WLH*2 end create_contents end def visible? if (!$game_switches[HIDE_TIME]== true)&&(@forme != 0) self.visible = true else self.visible = false end end def draw_window self.contents.clear x = 0 y = 0 if(@date != "") self.contents.draw_text( x, y, @date.size * 8, 18, @date, 1) x = ((self.width - 32) - (((@heure.size) *8) +24)) y = WLH end self.contents.draw_text(x , y, @heure.size * 8, 18, @heure , 1) x += @heure.size * 8 self.draw_icon(188, x + 2, y - 2) end def refresh minute_refresh day_refresh window_refresh draw_window end def update super draw_window end end end class Window_Message alias time_convert_special_characters convert_special_characters def convert_special_characters time_convert_special_characters @text.gsub!(/\\TH\[(\d+)\]/i) { $game_time.write_hour($1.to_i) } @text.gsub!(/\\TD\[(\d+)\]/i) { $game_time.write_date($1.to_i) } @text.gsub!(/\\TM\[(\d+)\]/i) { $game_time.write_month($1.to_i) } end end class Scene_Title alias vincentmhd_time_create_game_objects create_game_objects def create_game_objects vincentmhd_time_create_game_objects $game_time = Custom_Time::Mhd_Time.new end end class Scene_Equip alias time_scene_equip_terminate terminate def terminate time_scene_equip_terminate $time_window.forme? $time_window.minute_refresh $time_window.day_refresh end end class Scene_Map alias vincentmhd_time_update update def update $time_runner = Thread.new {$game_time.run} vincentmhd_time_update end alias time_window_start start def start time_window_start $time_window = Custom_Time::Time_Window.new $game_time.verif end def refrech alias time_window_map_refresh refresh $time_window.visible? end alias time_window_terminate terminate def terminate $time_window.dispose time_window_terminate end end
Dernière édition par vincentmhd le Ven 25 Sep 2009 - 17:48, édité 3 fois
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Temps fictif Sam 5 Sep 2009 - 11:36
Désolé pour la mise en page horrible du script j'ai dû tasser un petit peu, pour qu'il rentre sur le message en une fois... Dans la démo la mise en page sera beaucoup mieux.
-Démo
Elle ne met pas vraiment en valeur mais pour le moment, le temps n'est qu'un ensemble de variables... Lien vers la démo
-Crédits:Vincentmhd
Dernière édition par vincentmhd le Sam 5 Sep 2009 - 13:16, édité 3 fois
Blockade
Ex-Admin Cruelle
Age : 32 Inscrit le : 03/07/2008 Messages : 2441
Sujet: Re: [VX] Temps fictif Sam 5 Sep 2009 - 11:41
T'es en en forme pour les bon scripts originaux dit moi ! Et bah bien joué, c'est encore un bon script. Un seul truc qu'on peut te reprocher, et il faut que tu le fasse au moins pour tes prochains scripts, c'est de mettre en forme ton code. Aére le la tout est collé et surtout commente le. C'est pas compliqué à faire et ca fait gagner du temps à celui qui veut l'adapter pour son projet ou comprendre comment il marche. Moi personnellement avant chaque classe je met :
Code:
#============================================================================== # ** Nom de la scene #------------------------------------------------------------------------------ # Description de la scene #==============================================================================
Et devant chaque méthode :
Code:
#-------------------------------------------------------------------------- # * Description de la méthode (Pour les update et autre je met juste le nom de la méthode) #--------------------------------------------------------------------------
Donc voila c'est une façon de faire, tu peut trouver la tienne =) Je t'encourage vivement à commenter ton code ! Et aussi à coté de certaines lignes si t'a envie tu met à quoi elle servent ^^'
Encore une fois bravo, j'te rajoute les points =)
EDIT : j'avais pas vu ton dernier post ! J'attend de voir la démo alors =)
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Temps fictif Mer 9 Sep 2009 - 16:05
Weather
-Introduction
Tadammm!!!! Voici le premier complément au script de temps. Il gère les saisons et les météos. Dans les faits, les configurations météorologiques sont la manifestation des saisons. Ces deux éléments allaient de pairs dans ma conception du temps.
-Description
Ce script a besoin du script de temps ci-dessus. Le principe est qu'à chaque saison correspond une configuration météorologique. Cette configuration est effective au milieu de la saison. Les config évoluent progressivement vers la suivante et ainsi de suite. Une configuration météorologique correspond aux chances possibles qu'une météo se produise et la force maximale qu'elle pourrait atteindre. C'est un ensemble de proba, donc c'est à vous de bien gérer vos coéficients, sinon il peut y avoir des petits aleas météorologiques. Pas de ralentissement significatif en l'état, même à vitesse max et avec la window. Seulement quelques petits ralentissements à 56 FPS ponctuels correspondant à la minute où il y a changement de météo (en particulier activation de Tempest) donc pas gênant.
-Installation
Ce script n'échappe pas à la régle du "copiez en dessous de material". Nécéssite le script Time.
-Utilisation
Les saisons sont customisables. Les météos le sont aussi mais moins facilement. -La météo Tempest est un exemple de customisation de météo. -La météo Sun est vide car c'est logique d'en avoir une, cependant c'est assez personnel, étant donné que la gestion des lumières dépend pour beaucoup du jeu, donc elle est vide. -La Mto None est vide, elle doit le rester. C'est elle qui "éteint" les effets météos, c'est le retour à la normale.
Configuration:
Regardons le module de configuration:
Code:
#Module de configuration
#=====================================DATAS===================================== #Seasons = [ [name , weather_config[[probability, power], []...] ,id_icon], []...]], #sun rain thunder snow none SEASONS =[ ["le Printemps",[[30,5],[30,10],[10,5],[0,0],[30,5]],4*16 +11],["l'Eté",[[30,5],[10,5],[30,10],[0,0],[30,10]],6*16 +14],["l'Automne",[[30,5],[30,10],[30,5],[0,0],[30,5]],10*16 +5],["l'Hiver",[[25,5],[25,5],[10,4],[30,10],[10,5]], 6*16 +9] ] #nombre de minutes max et min d'une météo STABILITY_MAX = 180 STABILITY_MIN = 10 #Nom des sons associés à la foudre THUNDER = ["Thunder1","Thunder5","Thunder7","Thunder9"] #===================================ADRESSAGE=================================== #Id des variables principales SEASON_ID = 9
Bon, il est assez sympa comparé à celui de Time. Il est moins long mais moins digeste.
SEASONS[ XXXX ] correspond à l'ensemble des saisons sur une année astrale (pas calendaire). nota: L'année calendaire commence le 01/01, l'année astrale correspond par défaut au premier jour du Printemps (si ASTRAL_YEAR modifiée, je ne saurai le dire... la customisation du temps pourrait désynchroniser les deux années. Le but du calendrier est de s'approcher de l'année astrale, donc il se peut que le calendrier de votre monde ne soit pas au point. Pour l'exemple quand on est passé du calendrier Julien au calendrier Grégorien, on a sauté 15 j et des brouettes, car on était désynchronisé).
Regardons une saison de ce tableau: [ "le Printemps",[XXXX],4*16 +11], la notice est la suivante: [name , weather_config[...] ,id_icon]. Oui c'est hideux, cependant tout est dit: le nom de la saison, les probabilités, puis l'icône pour la fenêtre. nota: L'icône est un ajout à postériori , d'où son placement en fin.
Regardons la structure des configurations météorologiques: [30,5],[30,10],[10,5],[0,0],[30,5] c'est un tableau de tableau... bienvenu dans la 4ème dimension! Ces petits tableaux sont des paramètres de météos: la probabilité, et la force maximale. L'ordre compte énormément, c'est le même pour tous. Il respecte celui de la variable @tab de la classe Mhd_Weather. Je n'ai pas réussi à faire autrement, j'aurais aimé l'integrer en variable globale.
STABILITY_MAX = 180 STABILITY_MIN = 10 Les météos se succèdent au cours du temps. Ces deux variables définissent la durée maximale et minimale d'une météo en minutes. Par confort, il est inutile de changer les météos à la seconde (je parle en temps fictif).
THUNDER sont les sons associés à la météo Tempest, il est mieux d'avoir plusieurs sons de foudre mais par défaut, je n'ai pas mis que les meilleurs.
Le reste du module correspond à de l'adressage, donc ce n'est pas difficile de comprendre.
Fonctionnalités:
- Activer et désactiver la Météo: Je suppose que votre jeu ne se passe pas entièrement en extérieur. Le switch correspondant à ANTI_WEATHER sert à stopper le changement de météo (Stopper le temps fonctionne aussi). Une mise à jour se fait s'il y a téléportation: s'il y a téléportation et que ce dernier est actif alors la météo n'apparaitra plus sur la map "réceptrice" tant qu'il demeurera actif. Ceci est fait pour faciliter le passage interieur/exterieur, il vous suffira juste d'activer ou de désactiver l'interrupteur avant de rentrer ou de sortir.
- Changer la météo actuelle: Dans un appel de script, écrivez: change_mto(id_mto, power, duration) id_mto correspond à la place de la météo dans @tab. Quand aucun paramètre, tout est en aléatoire.
- Raccourci de message: Pour la saison, c'est \TS[d], si d = 1000, c'est le nom de la saison actuelle.
- La montre: L'accessoire dont l'id est dans EQUIP_NV9, affichera la montre en mode 8 mais avec l'icône de la saison en plus.
Customisation:
Pour les saisons, c'est assez simple: il suffit d'ajouter votre saison à la suite des autres saisons de SEASONS. Les saisons sont de durée égale, soit ASTRAL_YEAR/ SEASONS.size. Cependant en mettant deux saisons identiques à la suite, cela donnera l'impression d'une seule saison plus longue. Cette astuce a sa limite: la config mto restera identique entre les deux "morceaux" de saisons (la moyenne de deux choses identiques est identique...).
Pour les météos, c'est moins simple. Les météos sont des classes, filles d'un modèle commun "Mto". Elle a trois méthodes utilisées par Mhd_Weather: start, update et terminate. update s'appel à la seconde fictive. Attention aux modifications du rythme, utilisez $game_time.speed pour les secondes et $game_time.incrementation comme limite des secondes. Pour le reste des méthodes, Tempest avec thunder feront un bon exemple. update s'appelle à la seconde donc attention a ne pas trop l'allourdir.
Il vous faudra ensuite ajouter votre météo à @tab, et d'adapter SEASONS en conséquence. Personnellement, jouer avec les BGS, les images, les SE 3D (pour thunder, faire un orage qui "traverse la map" avec anim), les brouillards... tout cela me tente pour la conception de mes mto personnelles.
Dernière édition par vincentmhd le Ven 18 Sep 2009 - 16:25, édité 8 fois
vincentmhd
Maire Lv.9
Age : 37 Inscrit le : 04/02/2009 Messages : 326
Sujet: Re: [VX] Temps fictif Jeu 17 Sep 2009 - 23:50
-Le script
Spoiler:
Code:
#=============================================================================== # # # Weather.v0 # # #=============================================================================== # #By Vincentmhd #http://vincentmhdmaker.canalblog.com/ #17/09/09 # # # # # #=====================================NOTE====================================== # # #------------------------------------------------------------------------------- # #Ce script est fait pour fonctionner avec le script Time que j'ai réalisé #aussi. Il le complète par un gestionnaire de saisons et de météos. A chaque #saison correspond un ensemble de probabilités définissant une météo possible. #Cette configuration météorologique n'est atteinte qu'au milieu de la saison. #Le reste du temps, il s'agit d'une moyenne entre la saison actuelle et la #saison précédente ou la saison suivante. Cette moyenne est pondérée par le #temps donnant une progressivité à la chose. # #Les saisons sont de durées identiques. # # #Les configurations météorologiques sont un ensemble de probabilités, donc le #résultat est variable. D'autres paramètres interviennent dans les proba: # # # + La Stabilité: la météo varie régulièrement au court d'une journée. La # stabilité gouverne l'espace temps entre deux météos differentes entre deux # coup de dés. Je ne sais pas encore elle évoluera... # #Mécanique interne: #En réalité le générateur de météo se base sur les demies saisons. Ces demies #saisons sont appelées périodes. Le tableau de périodes intégre les données des #saisons. Il y a donc deux periodes par saisons. La configuration météo saisie #dans SEASONS correspond à la configuration au milieu de la saison. # #------------------------------------------------------------------------------- # #Utilisation: # # # #------------------------------------------------------------------------------- #La window_time a été upgradée pour afficher l'icon associé à la saison. #------------------------------------------------------------------------------- # #Les Saisons sont customisables en nombre et en configuration météo. # # #-------------------------------------------------------------------------------
module Custom_Weather
#Module de configuration
#=====================================DATAS===================================== #Seasons = [ [name , weather_config[[probability, power], []...] ], []...],id_icon], #sun rain thunder snow none SEASONS =[ ["le Printemps",[[30,5],[30,10],[10,5],[0,0],[30,5]],4*16 +11],["l'Eté",[[30,5],[10,5],[30,10],[0,0],[30,10]],6*16 +14],["l'Automne",[[30,5],[30,10],[30,5],[0,0],[30,5]],10*16 +5],["l'Hiver",[[25,5],[25,5],[10,4],[30,10],[10,5]], 6*16 +9] ] #nombre de minutes max et min d'une météo STABILITY_MAX = 180 STABILITY_MIN = 10 #Nom des sons associés à la foudre THUNDER = ["Thunder1","Thunder5","Thunder7","Thunder9"] #===================================ADRESSAGE=================================== #Id des variables principales SEASON_ID = 9
#Faire attention à l'ordre @tab = [None.new(), Rain.new(), Tempest.new(), Snow.new(), Sun.new()]
init (astral_day) end
#====================================# # Mto Update # #====================================# #à la minute change la mto def mto_update if @duration ==0 duration? @tab[chosen_mto].terminate @chosen_mto = alea_mto
#mise en fonction de la mto if $game_switches[ANTI_WEATHER] != true mto_interpreter(@chosen_mto, @chosen_power, @duration*($game_time.incrementation/10)) end else @duration -= 1 end end
#=========================================# # Mto Config Update # #=========================================# #a la journée, détermine les proba de la journée def mto_config_update(astral_day = $game_time.astral_day) periode_day? (astral_day) calendar_season? (astral_day) current_periode? (astral_day) @day_config =[] for i in 0...@periode[0].size if @current_periode + 1 >= @periode.size proba = moyenne_day(@periode[@current_periode][i][0],@periode[0][i][0]) power = moyenne_day(@periode[@current_periode][i][1],@periode[0][i][1]) else proba = moyenne_day(@periode[@current_periode][i][0],@periode[@current_periode + 1][i][0]) power = moyenne_day(@periode[@current_periode][i][1],@periode[@current_periode + 1][i][1]) end
#====================================# # choix de la météo # #====================================# def alea_mto proba=0 #fait la somme des probabilités for i in 0... @day_config.size proba += @day_config[i][0] end #choisi un nombre au hasard proba = rand(proba +1) #décrémente par les proba en sens inverse for i in 0...@day_config.size proba -= @day_config[(@day_config.size - 1) - i][0] #si c'est négatif ou 0 c'est que la mto est choisie if proba<= 0 && @day_config[(@day_config.size - 1) - i][0] != 0 return ((@day_config.size - 1) - i) end end #si apprès la boucle elle est toujours positive c'est que c'était la 1ère mto return 0 end
#====================================# # mto duration # #====================================# def duration? @duration = @stability_min + rand(@stability_max- @stability_min) end #====================================# # interpreteur mto # #====================================# def mto_interpreter(mto, power, fondu) @tab[mto].start(power, fondu) end
#=========================================# # A quel jour de la saison sommes-nous? # #=========================================# def season_day?( astral_day = $game_time.astral_day) @season_day = astral_day % ( Custom_Time::ASTRAL_YEAR / SEASONS.size) end
#=========================================# # Moyenne de config Meteo # #=========================================# def moyenne_mto_t(mto_A, mto_B, t_A =1, t_B =1, t =1) return ((mto_A)*(t_A + t_B - t) + t*mto_B)/(t_A+ t_B) end def moyenne_day(mto_A, mto_B) return moyenne_mto_t(mto_A, mto_B, 0, (Custom_Time::ASTRAL_YEAR / (2*SEASONS.size)),@periode_day) end
#=========================================# # Création des périodes # #=========================================# def periode_create @periode = [] for i in 0...SEASONS.size #dans une saison il y a 2 périodes donc 2 config météo mto_config_A = [] mto_config_B = []
#=========================================# # Ecriture # #=========================================# def write_season(id) if id <1000 return SEASONS[id][0] else return SEASONS[$game_variables[SEASON_ID]][0] end end
end #class Mhd_Weather end
#=========================================# # Météo # #=========================================# #les Météos sont toutes des filles de Mto, afin de simplifier #la création de nouvelles météo. class Mto #lancement de la mto def start(power, duration) end #mise à jour (à la seconde) def update end #arret de la mto def terminate end end #class Mto end
class Sun < Mto def start(power, duration) $game_map.screen.weather(0, power, duration) end end #class Mto end
class Rain < Mto def start(power, duration) $game_map.screen.weather(1, power, duration) end end #class Mto end
#La tempête est un bon exemple de mto plus complexe. #on peut imaginer l'utilisation de BGS, la spacialisation du son #son de l'orage... class Tempest < Mto attr_accessor :switch, :count
def initialize @thunder_switch = false @thunder_count = 0 end
def update if @thunder_switch == true if @thunder_count <= 0 @thunder_power = rand(10+1) thunder_flash thunder_sound @thunder_count = 30 + rand( ($game_time.mto.duration * $game_time.incrementation / ($game_time.mto.chosen_power + 1)) - 30) else @thunder_count -= $game_time.speed end end end
def terminate @thunder_switch = false end
def thunder_sound sound=RPG::SE.new(THUNDER[rand(THUNDER.size).to_i],@thunder_power*10,50 + rand(100)) sound.play end
def thunder_flash antibleu = 170 + rand(255 - 170) $game_map.screen.start_flash(Color.new(antibleu, antibleu, 255, @thunder_power*25), 60 + @thunder_power*10) end end #class Mto end
class Snow < Mto def start(power, duration) $game_map.screen.weather(3, power, duration) end end #class Mto end
class None < Mto def start(power, duration) $game_map.screen.weather(0, power, duration) end end
end #module Custom_Weather end
#===========================================# # Alias du module Time # #===========================================# module Custom_Time class Mhd_Time
attr_accessor :mto
alias init_weather_alias init def init @mto = Custom_Weather::Mhd_Weather.new(@astral_day) init_weather_alias end
alias secondes_weather_alias secondes_update def secondes_update secondes_weather_alias @mto.tab[@mto.chosen_mto].update end
alias minutes_weather_alias minutes_update def minutes_update minutes_weather_alias @mto.mto_update end
alias days_weather_alias days_update def days_update @mto.calendar_season? days_weather_alias @mto.mto_config_update(@astral_day)
end
alias setup_weather_alias setup def setup setup_weather_alias @mto.periode_day?(@astral_day) @mto.calendar_season?(@astral_day) @mto.current_periode?(@astral_day) end
#détermine quel affichage en fonction de l'équipement #Appelé à la fermeture de Scene_equip alias weather_alias_forme forme? def forme? weather_alias_forme for i in 0...Custom_Weather::EQUIP_NV9.size for actor_id in 0...$game_party.members.size actor = $game_party.members[actor_id] if(actor.armors.include?($data_armors[Custom_Weather::EQUIP_NV9[i]])) @forme = 9 end end end end
alias weather_alias_draw draw_window def draw_window weather_alias_draw if @forme = 9 self.draw_icon(Custom_Weather::SEASONS[$game_variables[Custom_Weather::SEASON_ID]][2], 0, WLH-2) end end
end #class end
end #module end
#==================================# # Alias externes # #==================================# class Game_Player alias transfer_weather_alias perform_transfer def perform_transfer transfer_weather_alias if $game_switches[Custom_Weather::ANTI_WEATHER] != true $game_time.mto.mto_interpreter($game_time.mto.chosen_mto, $game_time.mto.chosen_power, 5) else $game_time.mto.tab[$game_time.mto.chosen_mto].terminate $game_time.mto.tab[0].start(0,0) #Mto_none end end end
class Window_Message alias weather_convert_special_characters convert_special_characters def convert_special_characters weather_convert_special_characters @text.gsub!(/\\TS\[(\d+)\]/i) { $game_time.mto.write_season($1.to_i) } end end
class Game_Interpreter #====================================# # set mto # #====================================# def change_mto(mto = rand($game_time.mto.tab.size), power = rand(10+1), duration = nil) $game_time.mto.tab[$game_time.mto.chosen_mto].terminate if duration == nil $game_time.mto.duration? else $game_time.mto.duration = duration end $game_time.mto.chosen_mto = mto $game_time.mto.chosen_power = power if $game_switches[Custom_Weather::ANTI_WEATHER] != true $game_time.mto.mto_interpreter(mto, power, $game_time.mto.duration*($game_time.incrementation/10)) end end end
-Démo
>>Démo
-Crédits:Vincentmhd
Prochaine étape:: La nuit, le jour et les phases de la journée...
fabY
dYeu retraité prématurément
Age : 29 Inscrit le : 09/02/2008 Messages : 5357
Sujet: Re: [VX] Temps fictif Ven 18 Sep 2009 - 15:06
Wooow, bravo vraiment bon script (pas testé mais je sais qu'il fonctionne =)). Tu mérite tout plein de points o/ !