diff --git a/game/gui.rpy b/game/gui.rpy new file mode 100644 index 0000000..c46b16e --- /dev/null +++ b/game/gui.rpy @@ -0,0 +1,496 @@ +################################################################################ +## Initialisation +################################################################################ + +## L'instruction init offset fait exécuter les instructions d'initialisation de +## ce fichier tavant les instructions init des autres fichiers. +init offset = -2 + +## Appelé gui.init réinitialise les styles à leurs valeurs par défaut et +## initialise la largeur et la hauteur du jeu. +init python: + gui.init(1920, 1080) + +## Active la vérification de propriétés invalides ou instables dans les screens +## et transforms +define config.check_conflicting_properties = True + + +################################################################################ +## Variables de Configuration du GUI +################################################################################ + + +## Couleurs #################################################################### +## +## Les couleurs du texte dans l’interface. + +## Une couleur utilisée dans l’interface pour mettre l’accent sur un texte +## (surbrillance). +define gui.accent_color = '#990000' + +## La couleur utilisée pour le texte d’un bouton quand il n’a jamais été +## sélectionné ou survolé. +define gui.idle_color = '#707070' + +## La petite couleur est utilisé pour les textes courts qui nécessitent d’être +## assombris ou éclairés pour obtenir le même effet. +define gui.idle_small_color = '#606060' + +## Cette couleur est utilisée pour les boutons et les barres qui sont survolées. +define gui.hover_color = '#990000' + +## Cette couleur est utilisé pour le texte d’un bouton sélectionné, mais qui n’a +## pas le focus. Un bouton est sélectionné s’il est sur l’écran actuel ou si +## c’est la valeur de préférence. +define gui.selected_color = '#555555' + +## La couleur utilisée pour le texte d’un bouton qui ne peut pas être +## sélectionné. +define gui.insensitive_color = '#7070707f' + +## Couleurs utilisées pour les portions de barres qui ne sont pas remplies. +## Elles ne sont pas utilisées directement, mais quand les fichiers d’images +## sont régénérés. +define gui.muted_color = '#c16666' +define gui.hover_muted_color = '#d69999' + +## Les couleurs utilisées pour les dialogues et les menus de choix. +define gui.text_color = '#404040' +define gui.interface_text_color = '#404040' + + +## Polices et tailles de police ################################################ + +## Les polices utilisées pour le texte du jeu. +define gui.text_font = "DejaVuSans.ttf" + +## Les polices utilisées pour le nom des personnages. +define gui.name_text_font = "DejaVuSans.ttf" + +## Les polices utilisées pour les textes « hors du jeu ». +define gui.interface_text_font = "DejaVuSans.ttf" + +## La taille normale pour les dialogues. +define gui.text_size = 33 + +## La taille pour le nom des personnages. +define gui.name_text_size = 45 + +## La taille du texte dans l’interface de jeu. +define gui.interface_text_size = 33 + +## La taille des libellés dans l’interface de jeu. +define gui.label_text_size = 36 + +## La taille du texte dans la zone de notification. +define gui.notify_text_size = 24 + +## La taille du titre du jeu. +define gui.title_text_size = 75 + + +## Menu du jeu et menu principal ############################################### + +## Les images utilisées pour le menu principal et le menu du jeu. +define gui.main_menu_background = "gui/main_menu.png" +define gui.game_menu_background = "gui/game_menu.png" + + +## Dialogue #################################################################### +## +## Ces variables contrôlent comment les dialogues sont affichés une ligne à la +## fois. + +## La hauteur de la fenêtre contenant les dialogues. +define gui.textbox_height = 278 + +## L’emplacement vertical de la zone de texte à l’écran. 0.0 pour le haut, 0.5 +## pour le centre et 1.0 pour le bas. +define gui.textbox_yalign = 1.0 + + +## L’emplacement relatif à la zone de texte du nom du personnage en train de +## parler. La valeur peut être un nombre entier de pixels depuis la gauche ou le +## haut ou 0.5 pour le centre. +define gui.name_xpos = 360 +define gui.name_ypos = 0 + +## L’alignement horizontal du nom du personnage. La valeur peut être 0.0 pour un +## alignement à gauche, 0.5 pour le centrer et 1.0 pour un alignement à droite. +define gui.name_xalign = 0.0 + +## La largeur, profondeur et les bords de la zone contenant le nom du personnage +## ou « None » pour le dimensionner automatiquement. +define gui.namebox_width = None +define gui.namebox_height = None + +## Les bordures de la zone contenant le nom du personnage dans l’ordre suivant +## gauche, haut, droite, bas. +define gui.namebox_borders = Borders(5, 5, 5, 5) + +## Si « True » (vrai), l’arrière plan de zone du nom sera en mosaïque, si +## « False »(faux), l’arrière plan de la zone du nom sera mis à l’échelle. +define gui.namebox_tile = False + + +## L’emplacement du dialogue relatif à la zone de texte. La valeur peut être un +## nombre entier de pixels depuis la gauche ou le haut ou 0.5 pour le centre. +define gui.dialogue_xpos = 402 +define gui.dialogue_ypos = 75 + +## La largeur maximale en pixels de la zone de dialogue. +define gui.dialogue_width = 1116 + +## L’alignement horizontal de la zone de dialogue. La valeur peut être 0.0 pour +## un alignement à gauche, 0.5 pour le centrer et 1.0 pour un alignement à +## droite. +define gui.dialogue_text_xalign = 0.0 + + +## Boutons ##################################################################### +## +## Ces variables, ainsi que les fichiers d’image dans gui/button, contrôlent la +## façon d’afficher les boutons et leur aspect. + +## La largeur et la hauteur d’un bouton en pixels. Si aucune valeur n’est +## renseignée (None), Ren’Py calcule la taille. +define gui.button_width = None +define gui.button_height = None + +## Les bordures de chaque côté du bouton dans l’ordre suivant gauche, haut, +## droit, bas. +define gui.button_borders = Borders(6, 6, 6, 6) + +## Si « True » (vrai), l’image d’arrière plan sera en mosaïque, si +## « False »(faux), elle sera mise à l’échelle. +define gui.button_tile = False + +## La police utilisée par le bouton. +define gui.button_text_font = gui.interface_text_font + +## La taille du texte utilisée pour le bouton. +define gui.button_text_size = gui.interface_text_size + +## La couleur du texte des boutons dans différents états. +define gui.button_text_idle_color = gui.idle_color +define gui.button_text_hover_color = gui.hover_color +define gui.button_text_selected_color = gui.selected_color +define gui.button_text_insensitive_color = gui.insensitive_color + +## L'alignement horizontal du texte des boutons. (0.0 est à gauche, 0.5 est au +## centre, 1.0 est à droite). +define gui.button_text_xalign = 0.0 + + +## Ces variables surchargent les paramètres par défaut pour différents types de +## boutons. Veuillez consulter la documentation de l’interface de jeu (GUI) pour +## les types de boutons disponibles et leurs usages. +## +## Ces personnalisations sont utilisées par l’interface par défaut : + +define gui.radio_button_borders = Borders(27, 6, 6, 6) + +define gui.check_button_borders = Borders(27, 6, 6, 6) + +define gui.confirm_button_text_xalign = 0.5 + +define gui.page_button_borders = Borders(15, 6, 15, 6) + +define gui.quick_button_borders = Borders(15, 6, 15, 0) +define gui.quick_button_text_size = 21 +define gui.quick_button_text_idle_color = gui.idle_small_color +define gui.quick_button_text_selected_color = gui.accent_color + +## Vous pouvez également ajouter vos propres personnalisations en ajoutant des +## variables correctement nommées. Par exemple, vous pouvez décommanter la ligne +## suivante pour personnaliser la largeur du bouton de navigation. + +# define gui.navigation_button_width = 250 + + +## Boutons pour les choix ###################################################### +## +## Les boutons pour les choix (Choice buttons) sont utilisés dans le jeu pour +## permettre au joueur de choisir telle ou telle action, tel ou tel dialogue. + +define gui.choice_button_width = 1185 +define gui.choice_button_height = None +define gui.choice_button_tile = False +define gui.choice_button_borders = Borders(150, 8, 150, 8) +define gui.choice_button_text_font = gui.text_font +define gui.choice_button_text_size = gui.text_size +define gui.choice_button_text_xalign = 0.5 +define gui.choice_button_text_idle_color = '#707070' +define gui.choice_button_text_hover_color = "#ffffff" +define gui.choice_button_text_insensitive_color = '#7070707f' + + +## Boutons des emplacements de fichiers. ####################################### +## +## Un bouton d’emplacement de fichier est un type spécial de bouton. Il contient +## une vignette et un texte décrivant le contenu de la sauvegarde présente dans +## l’emplacement. Un emplacement de sauvegarde utilise une image dans gui/ +## button, comme les autres types de bouton. + +## Le bouton d’emplacement de sauvegarde. +define gui.slot_button_width = 414 +define gui.slot_button_height = 309 +define gui.slot_button_borders = Borders(15, 15, 15, 15) +define gui.slot_button_text_size = 21 +define gui.slot_button_text_xalign = 0.5 +define gui.slot_button_text_idle_color = gui.idle_small_color +define gui.slot_button_text_selected_idle_color = gui.selected_color +define gui.slot_button_text_selected_hover_color = gui.hover_color + +## La largeur et la hauteur des vignettes de sauvegarde utilisée pour les +## emplacements de sauvegarde. +define config.thumbnail_width = 384 +define config.thumbnail_height = 216 + +## Le nombre de colonnes et de lignes pour la grille des emplacements de +## sauvegarde. +define gui.file_slot_cols = 3 +define gui.file_slot_rows = 2 + + +## Positionnement et espacement ################################################ +## +## Ces variables contrôlent l’espacement et le positionnement des différents +## éléments de l’interface utilisateur. + +## La position sur le côté gauche des boutons de navigation, relatif au côté +## gauche de l'écran. +define gui.navigation_xpos = 60 + +## La position vertical du l’indicateur de saut des dialogues. +define gui.skip_ypos = 15 + +## La position verticale de la zone de notification. +define gui.notify_ypos = 68 + +## L’espacement entre les différents choix du menu. +define gui.choice_spacing = 33 + +## Boutons dans la section de navigation du menu principal et du menu de jeu. +define gui.navigation_spacing = 6 + +## Contrôle l’espacement entre les préférences. +define gui.pref_spacing = 15 + +## Contrôle l’espacements entre les boutons de préférences. +define gui.pref_button_spacing = 0 + +## L’espacement entre les boutons de page. +define gui.page_spacing = 0 + +## L’espacement entre les emplacements de sauvegarde. +define gui.slot_spacing = 15 + +## La position du texte du menu principal. +define gui.main_menu_text_xalign = 1.0 + + +## Cadres ###################################################################### +## +## Ces variables contrôlent le look des cadres qui peuvent contenir les +## composants de l’interface utilisateur quand un overlay ou une fenêtre ne sont +## pas présents. + +## Frames génériques. +define gui.frame_borders = Borders(6, 6, 6, 6) + +## Le cadre qui est utilisé par les écrans de confirmation. +define gui.confirm_frame_borders = Borders(60, 60, 60, 60) + +## Le cadre qui est utilisé par l’écran de saut des dialogues. +define gui.skip_frame_borders = Borders(24, 8, 75, 8) + +## Le cadre qui est utilisé par la zone de notification. +define gui.notify_frame_borders = Borders(24, 8, 60, 8) + +## Est-ce que les arrière-plans des cadres doivent être en mosaïque ? +define gui.frame_tile = False + + +## Barres, ascenseurs et curseurs ############################################## +## +## Ceux-ci contrôlent le look et la taille des barres, des ascenseurs et des +## curseurs. +## +## Le GUI par défaut utilise uniquement des sliders et des barres de scrolling +## verticales. Toutes les autres barres ne sont utilisées que dans des screens +## écrits par l'utilisateur. + +## La hauteur des barres, des ascenseurs et des curseurs horizontaux. La largeur +## des barres, des ascenseurs et des curseurs verticaux. +define gui.bar_size = 38 +define gui.scrollbar_size = 18 +define gui.slider_size = 38 + +## « True » (Vrai) si les images de barres doivent être en mosaïques. +## « False »(Faux) si elles doivent être mise à l'échelle (étirement). +define gui.bar_tile = False +define gui.scrollbar_tile = False +define gui.slider_tile = False + +## Bordures horizontales. +define gui.bar_borders = Borders(6, 6, 6, 6) +define gui.scrollbar_borders = Borders(6, 6, 6, 6) +define gui.slider_borders = Borders(6, 6, 6, 6) + +## Bordures verticales. +define gui.vbar_borders = Borders(6, 6, 6, 6) +define gui.vscrollbar_borders = Borders(6, 6, 6, 6) +define gui.vslider_borders = Borders(6, 6, 6, 6) + +## Que faire avec les ascenseurs non utilisables dans le GUI ? « hide » les +## cache tandis que « None » les affiche. +define gui.unscrollable = "hide" + + +## Historique ################################################################## +## +## L’écran de l’historique affiche les dialogues que le joueur vient de lire. + +## Le nombre de blocs que l’historique de dialogue Ren’Py va conserver. +define config.history_length = 250 + +## La hauteur de l’écran historique ou « None » pour calculer la hauteur au prix +## d’une légère perte de performance. +define gui.history_height = 210 + +## La position, largeur et alignement du label donnant le nom du personnage en +## train de parler. +define gui.history_name_xpos = 233 +define gui.history_name_ypos = 0 +define gui.history_name_width = 233 +define gui.history_name_xalign = 1.0 + +## La position, largeur et alignement de la zone de dialogue. +define gui.history_text_xpos = 255 +define gui.history_text_ypos = 3 +define gui.history_text_width = 1110 +define gui.history_text_xalign = 0.0 + + +## Mode NVL #################################################################### +## +## L’écran du mode NVL affiche les dialogues prononcés par les personnages eux- +## mêmes en mode NVL. + +## Les bordures de l’arrière-plan de la fenêtre en mode NVL. +define gui.nvl_borders = Borders(0, 15, 0, 30) + +## Le nombre maximum d'entrées en mode NVL que Ren'Py affichera. Quand plus +## d'entrées sont affichées, les plus anciennes seront retirées. +define gui.nvl_list_length = 6 + +## La hauteur d’une entrée en mode NVL. Initialisez-la à « None » pour que la +## hauteur des entrées s’ajuste automatiquement. +define gui.nvl_height = 173 + +## L’espacement entre les entrées en mode NVL quand gui.nvl_height est à +## « None » et entre les entrées en mode NVL et le menu en mode NVL. +define gui.nvl_spacing = 15 + +## La position, largeur et alignement du label donnant le nom du personnage en +## train de parler. +define gui.nvl_name_xpos = 645 +define gui.nvl_name_ypos = 0 +define gui.nvl_name_width = 225 +define gui.nvl_name_xalign = 1.0 + +## La position, largeur et alignement de la zone de dialogue. +define gui.nvl_text_xpos = 675 +define gui.nvl_text_ypos = 12 +define gui.nvl_text_width = 885 +define gui.nvl_text_xalign = 0.0 + +## La position, profondeur et l’alignement du text nvl_tought (Le texte prononcé +## par le personnage nvl_narrator). +define gui.nvl_thought_xpos = 360 +define gui.nvl_thought_ypos = 0 +define gui.nvl_thought_width = 1170 +define gui.nvl_thought_xalign = 0.0 + +## La position de nvl menu_buttons. +define gui.nvl_button_xpos = 675 +define gui.nvl_button_xalign = 0.0 + + +## Localisation (traduction et adaptation aux langues et cultures) ############# + +## Ceci contrôle où un saut de ligne est autorisé. La valeur par défaut convient +## à la plupart des langues. Une liste des valeurs disponible peut être trouvée +## sur https://www.renpy.org/doc/html/style_properties.html#style-property- +## language + +define gui.language = "unicode" + + +################################################################################ +## Appareils mobiles +################################################################################ + +init python: + + ## Ceci augmente la taille des boutons d’accès rapide pour les rendre plus + ## accessibles sur les tablettes et les téléphones. + @gui.variant + def touch(): + + gui.quick_button_borders = Borders(60, 21, 60, 0) + + ## Ceci change la taille et l’espacement de différents élements de la GUI + ## pour s’assurer qu’ils soient visibles sur les téléphones. + @gui.variant + def small(): + + ## Tailles des polices. + gui.text_size = 45 + gui.name_text_size = 54 + gui.notify_text_size = 38 + gui.interface_text_size = 45 + gui.button_text_size = 45 + gui.label_text_size = 51 + + ## Ajuste la position de la zone de texte. + gui.textbox_height = 360 + gui.name_xpos = 120 + gui.dialogue_xpos = 135 + gui.dialogue_width = 1650 + + ## Changer la taille et l'espacement de diverses choses. + gui.slider_size = 54 + + gui.choice_button_width = 1860 + gui.choice_button_text_size = 45 + + gui.navigation_spacing = 30 + gui.pref_button_spacing = 15 + + gui.history_height = 285 + gui.history_text_width = 1035 + + gui.quick_button_text_size = 30 + + ## Remplit le canvas du bouton. + gui.file_slot_cols = 2 + gui.file_slot_rows = 2 + + ## Mode NVL. + gui.nvl_height = 255 + + gui.nvl_name_width = 458 + gui.nvl_name_xpos = 488 + + gui.nvl_text_width = 1373 + gui.nvl_text_xpos = 518 + gui.nvl_text_ypos = 8 + + gui.nvl_thought_width = 1860 + gui.nvl_thought_xpos = 30 + + gui.nvl_button_width = 1860 + gui.nvl_button_xpos = 30 diff --git a/game/options.rpy b/game/options.rpy new file mode 100644 index 0000000..bb76db3 --- /dev/null +++ b/game/options.rpy @@ -0,0 +1,226 @@ +## Ce fichier contient les options qui peuvent être modifiées pour personnaliser +## votre jeu. +## +## Les lignes qui commencent avec deux dièses '#' sont des commentaires et vous +## ne devriez pas les décommenter. Les lignes qui commencent avec un seul dièse +## sont du code commenté et vous pouvez les décommentez quand c’est approprié +## (pour votre projet). + + +## Bases ####################################################################### + +## Un nom de jeu intelligible. Il est utilisé pour personnaliser le titre de la +## fenêtre par défaut et s’affiche dans l’interface ainsi que dans les rapports +## d’erreur. +## +## La chaîne de caractère contenu dans _() est éligible à la traduction. + +define config.name = _("Patron, donne-moi une augmentation") + + +## Détermine si le titre renseigné plus haut est affiché sur l'écran du menu +## principal Configurez-le à False (Faux) pour cacher le titre. + +define gui.show_name = True + + +## La version du jeu. + +define config.version = "1.0" + + +## Texte placé sur l'écran "À propos" du jeu. Placez le texte entre triples +## guillemets, et laissez une ligne entre les paragraphes. + +define gui.about = _p(""" +Ce jeu a été créé par Électropositron + +Licence Creative Commons CC BY NC SA 3.0 International +""") + + +## Un nom court pour le jeu qui sera utilisé pour les répertoires et le nom de +## l’exécutable. Il ne doit contenir que des caractères ASCII et ne doit pas +## contenir d’espace, de virgules ou de points-virgules. + +define build.name = "Patronjeveuxuneaugmentation" + + +## Sons et musiques ############################################################ + +## Ces trois variables contrôlent, entre autres, quels mixeurs sont affichés +## au joueur par défaut. Configurer l’un de ceux-ci à False (Faux) cachera le +## mixeur concerné. + +define config.has_sound = True +define config.has_music = True +define config.has_voice = True + + +## Pour autoriser le joueur à réaliser un test de volume, décommenter la ligne +## ci-dessous et utilisez-la pour configurer un son d’exemple. + +# define config.sample_sound = "sample-sound.ogg" +# define config.sample_voice = "sample-voice.ogg" + + +## Décommentez la ligne suivante pour configurer un fichier audio qui sera +## diffusé quand le joueur sera sur le menu principal. Ce son se poursuivra dans +## le jeu, jusqu’à ce qu'il soit stoppé ou qu’un autre fichier soit joué. + +# define config.main_menu_music = "main-menu-theme.ogg" + + +## Transitions ################################################################# +## +## Ces variables configurent les transitions qui sont utilisées quand certains +## événements surviennent. Chaque variable peuvent être configurée pour une +## transition. La valeur None indique qu’aucune transition ne doit être +## utilisée. + +## À l’entrée ou à la sortie du menu du jeu. + +define config.enter_transition = dissolve +define config.exit_transition = dissolve + + +## Entre les écrans du menu du jeu. + +define config.intra_transition = dissolve + + +## La transition qui sera utilisée après le chargement d’une partie. + +define config.after_load_transition = None + + +## La transition qui sera utilisé après la fin du jeu. + +define config.end_game_transition = None + + +## Il n’y a pas de variable pour configurer la transition en début de partie. À +## la place, utilisez un état de transition juste après l’affichage de la toute +## première scène. + + +## Gestion des fenêtres ######################################################## +## +## Cela contrôle l’affichage de la fenêtre de dialogue. Si « show », elle est +## toujours affichée. Si « hide », elle ne s’affiche que lorsque du dialogue est +## présent. Si « auto », La fenêtre est cachée avant chaque changement de scène +## et réapparait une fois le dialogue affiché. +## +## Après le début de la partie, cela peut-être changé avec les instructions +## « window show », « window hide » et « window auto ». + +define config.window = "auto" + + +## Transitions utilisées pour afficher ou cacher la fenêtre de dialogue + +define config.window_show_transition = Dissolve(.2) +define config.window_hide_transition = Dissolve(.2) + + +## Préférences par défaut ###################################################### + +## Contrôle la vitesse du texte. La valeur par défaut, 0, est infinie. Toute +## autre valeur est le nombre de caractères tapés par seconde. + +default preferences.text_cps = 0 + + +## Le délai d’avancée automatique. Des nombres importants entraînent une longue +## attente. Des valeurs réputées correctes sont comprises dans une plage allant +## de 0 à 30. + +default preferences.afm_time = 15 + + +## Répertoire de sauvegarde #################################################### +## +## Ces valeurs, dépendant de la plateforme, déterminent l’emplacement où Ren’Py +## stockera les fichiers de sauvegarde. Les fichiers de sauvegardes seront +## stockés dans : +## +## Windows : %APPDATA\RenPy\ +## +## Macintosh : $HOME/Library/RenPy/ +## +## Linux : $HOME/.renpy/ +## +## Cela ne devrait généralement pas changer. Si vous le faîtes, choisissez +## toujours une chaîne de caractères littéraux, pas une expression. + +define config.save_directory = "Patronjeveuxuneaugmentation-1702537360" + + +## Icône ####################################################################### +## +## L'icone affichée dans la barre des tâches ou sur le dock. + +define config.window_icon = "gui/window_icon.png" + + +## Configuration de la compilation ############################################# +## +## Cette section paramètre la façon dont Ren’Py transforme votre projet en +## fichier à distribuer. + +init python: + + ## Les fonctions suivantes prennent en paramètres un format de fichier. Les + ## formats de fichiers ne sont pas sensibles à la casse et correspondent au + ## répertoire relatif au répertoire de base. Il n’y a pas de / à la fin. Si + ## plusieurs formats correspondent, le premier est utilisé. + ## + ## Dans le format : + ## + ## / est le séparateur de répertoire. + ## + ## * correspond à tous les caractères à l’exception du séparateur de + ## répertoire. + ## + ## ** correspond à tous les caractères, y compris le séparateur de + ## répertoire. + ## + ## Par exemple, "*.txt" correspond à tous les fichiers txt dans le + ## répertoire de base, "game/**.ogg" correspond à tous les fichiers ogg + ## dans le répertoire game, mais aussi à tous ses répertoires. "**.psd" + ## correspond à tous les fichiers psd quelque soit leur emplacement dans + ## l’arborescence du fichier. + + ## Choisissez la valeur « None » pour les exclure de la distribution. + + build.classify('**~', None) + build.classify('**.bak', None) + build.classify('**/.**', None) + build.classify('**/#**', None) + build.classify('**/thumbs.db', None) + + ## Pour archiver les fichiers, choisissez la valeur « archive ». + + # build.classify('game/**.png', 'archive') + # build.classify('game/**.jpg', 'archive') + + ## Les fichiers correspondant au format de documentation sont dupliqués pour + ## les compilation sur Mac, c'est pourquoi ils apparaissent deux fois dans + ## l’archive zip. + + build.documentation('*.html') + build.documentation('*.txt') + + +## Une clé de licence Google Play est requise pour permettre les achats depuis +## l'application. Vous pourrez la trouver dans la console de développement +## Google Play, sous "Monétiser" > "Configuration de la monétisation" > +## "Licences". + +# define build.google_play_key = "..." + + +## Le nom d’utilisateur et du projet associé au projet itch.io, séparé par un +## slash. + +# define build.itch_project = "renpytom/test-project" diff --git a/game/screens.rpy b/game/screens.rpy new file mode 100644 index 0000000..1096e59 --- /dev/null +++ b/game/screens.rpy @@ -0,0 +1,1622 @@ +################################################################################ +## Initialisation +################################################################################ + +init offset = -1 + + +################################################################################ +## Styles +################################################################################ + +style default: + properties gui.text_properties() + language gui.language + +style input: + properties gui.text_properties("input", accent=True) + adjust_spacing False + +style hyperlink_text: + properties gui.text_properties("hyperlink", accent=True) + hover_underline True + +style gui_text: + properties gui.text_properties("interface") + + +style button: + properties gui.button_properties("button") + +style button_text is gui_text: + properties gui.text_properties("button") + yalign 0.5 + + +style label_text is gui_text: + properties gui.text_properties("label", accent=True) + +style prompt_text is gui_text: + properties gui.text_properties("prompt") + + +style bar: + ysize gui.bar_size + left_bar Frame("gui/bar/left.png", gui.bar_borders, tile=gui.bar_tile) + right_bar Frame("gui/bar/right.png", gui.bar_borders, tile=gui.bar_tile) + +style vbar: + xsize gui.bar_size + top_bar Frame("gui/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) + bottom_bar Frame("gui/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) + +style scrollbar: + ysize gui.scrollbar_size + base_bar Frame("gui/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + +style vscrollbar: + xsize gui.scrollbar_size + base_bar Frame("gui/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + +style slider: + ysize gui.slider_size + base_bar Frame("gui/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) + thumb "gui/slider/horizontal_[prefix_]thumb.png" + +style vslider: + xsize gui.slider_size + base_bar Frame("gui/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) + thumb "gui/slider/vertical_[prefix_]thumb.png" + + +style frame: + padding gui.frame_borders.padding + background Frame("gui/frame.png", gui.frame_borders, tile=gui.frame_tile) + + + +################################################################################ +## Écrans de jeu +################################################################################ + + +## Écran des dialogues ######################################################### +## +## L’écran des dialogues est utilisé pour afficher les dialogues du joueur. Il +## prend deux paramètres, who(qui) et what(quoi) qui sont respectivement le +## nom du personnage en train de parler et le texte à afficher. (Le paramètre +## who(qui) peut être None si aucun nom n’est donné.) +## +## Cet écran affiche le texte correspondant à what. Il peut également créer un +## texte avec le paramètre who et l’identifiant « window » est utilisé pour +## déterminer les styles à appliquer. +## +## https://www.renpy.org/doc/html/screen_special.html#say + +screen say(who, what): + style_prefix "say" + + window: + id "window" + + if who is not None: + + window: + id "namebox" + style "namebox" + text who id "who" + + text what id "what" + + + ## Si il y a une side image, l'afficher au-dessus du texte. Ne pas + ## l'afficher sur la version téléphone - pas assez de place. + if not renpy.variant("small"): + add SideImage() xalign 0.0 yalign 1.0 + + +## Rendre la boîte du nom personnalisable à travers l'objet Character. +init python: + config.character_id_prefixes.append('namebox') + +style window is default +style say_label is default +style say_dialogue is default +style say_thought is say_dialogue + +style namebox is default +style namebox_label is say_label + + +style window: + xalign 0.5 + xfill True + yalign gui.textbox_yalign + ysize gui.textbox_height + + background Image("gui/textbox.png", xalign=0.5, yalign=1.0) + +style namebox: + xpos gui.name_xpos + xanchor gui.name_xalign + xsize gui.namebox_width + ypos gui.name_ypos + ysize gui.namebox_height + + background Frame("gui/namebox.png", gui.namebox_borders, tile=gui.namebox_tile, xalign=gui.name_xalign) + padding gui.namebox_borders.padding + +style say_label: + properties gui.text_properties("name", accent=True) + xalign gui.name_xalign + yalign 0.5 + +style say_dialogue: + properties gui.text_properties("dialogue") + + xpos gui.dialogue_xpos + xsize gui.dialogue_width + ypos gui.dialogue_ypos + + adjust_spacing False + +## Écran de saisie ############################################################# +## +## Cet écran est utilisé pour afficher renpy.input. Le paramètre prompt est +## utilisé pour passer le texte par défaut. +## +## Cet écran doit créer une entrée affichable avec l'id "input" pour accepter +## les différents paramètres. +## +## https://www.renpy.org/doc/html/screen_special.html#input + +screen input(prompt): + style_prefix "input" + + window: + + vbox: + xanchor gui.dialogue_text_xalign + xpos gui.dialogue_xpos + xsize gui.dialogue_width + ypos gui.dialogue_ypos + + text prompt style "input_prompt" + input id "input" + +style input_prompt is default + +style input_prompt: + xalign gui.dialogue_text_xalign + properties gui.text_properties("input_prompt") + +style input: + xalign gui.dialogue_text_xalign + xmaximum gui.dialogue_width + + +## Écran des choix ############################################################# +## +## Cet écran est utilisé pour afficher les choix qui seront fait par le joueur +## dans le jeu. Le premier paramètre, items, est une liste d'objets contenant +## chacun des champs de texte et d'action. +## +## https://www.renpy.org/doc/html/screen_special.html#choice + +screen choice(items): + style_prefix "choice" + + vbox: + for i in items: + textbutton i.caption action i.action + + +style choice_vbox is vbox +style choice_button is button +style choice_button_text is button_text + +style choice_vbox: + xalign 0.5 + ypos 405 + yanchor 0.5 + + spacing gui.choice_spacing + +style choice_button is default: + properties gui.button_properties("choice_button") + +style choice_button_text is default: + properties gui.button_text_properties("choice_button") + + +## Écran des menus rapides ##################################################### +## +## Les menus rapides sont affichés dans le jeu pour permettre un accès rapide à +## certaines fonctions. + +screen quick_menu(): + + ## Assure qu'il apparaît au-dessus des autres screens. + zorder 100 + + if quick_menu: + + hbox: + style_prefix "quick" + + xalign 0.5 + yalign 1.0 + + textbutton _("Retour") action Rollback() + textbutton _("Historique") action ShowMenu('history') + textbutton _("Avance rapide") action Skip() alternate Skip(fast=True, confirm=True) + textbutton _("Auto") action Preference("auto-forward", "toggle") + textbutton _("Sauvegarde") action ShowMenu('save') + textbutton _("Sauvegarde R.") action QuickSave() + textbutton _("Chargement R.") action QuickLoad() + textbutton _("Préf.") action ShowMenu('preferences') + + +## Ce code garantit que le menu d’accès rapide sera affiché dans le jeu, tant +## que le joueur n’aura pas explicitement demandé à cacher l’interface. +init python: + config.overlay_screens.append("quick_menu") + +default quick_menu = True + +style quick_button is default +style quick_button_text is button_text + +style quick_button: + properties gui.button_properties("quick_button") + +style quick_button_text: + properties gui.button_text_properties("quick_button") + + +################################################################################ +## Screens du menu principal et du menu de jeu +################################################################################ + +## Écran de navigation ######################################################### +## +## Cet écran est disponible dans le menu principal et dans le menu de jeu. Il +## fournit l’accès aux autres menus et permet le démarrage du jeu. + +screen navigation(): + + vbox: + style_prefix "navigation" + + xpos gui.navigation_xpos + yalign 0.5 + + spacing gui.navigation_spacing + + if main_menu: + + textbutton _("Nouvelle partie") action Start() + + else: + + textbutton _("Historique") action ShowMenu("history") + + textbutton _("Sauvegarde") action ShowMenu("save") + + textbutton _("Charger") action ShowMenu("load") + + textbutton _("Préférences") action ShowMenu("preferences") + + if _in_replay: + + textbutton _("Fin de la rediffusion") action EndReplay(confirm=True) + + elif not main_menu: + + textbutton _("Menu principal") action MainMenu() + + textbutton _("À propos") action ShowMenu("about") + + if renpy.variant("pc") or (renpy.variant("web") and not renpy.variant("mobile")): + + ## L'aide n’est ni nécessaire ni pertinente sur les appareils + ## mobiles. + textbutton _("Aide") action ShowMenu("help") + + if renpy.variant("pc"): + + ## Le bouton pour quitter est banni sur iOS et inutile sur Android + ## et sur le Web. + textbutton _("Quitter") action Quit(confirm=not main_menu) + + +style navigation_button is gui_button +style navigation_button_text is gui_button_text + +style navigation_button: + size_group "navigation" + properties gui.button_properties("navigation_button") + +style navigation_button_text: + properties gui.button_text_properties("navigation_button") + + +## Écran du menu principal ##################################################### +## +## Utilisé pour afficher le menu principal quand Ren'Py démarre. +## +## https://www.renpy.org/doc/html/screen_special.html#main-menu + +screen main_menu(): + + ## Ceci assure que tout autre screen de menu est remplacé. + tag menu + + add gui.main_menu_background + + ## Cette frame vide obscurcit le menu principal. + frame: + style "main_menu_frame" + + ## L'instruction use inclut un autre écran à l'intérieur de celui-ci. Le + ## vrai contenu du menu principal se trouve dans l'écran "navigation". + use navigation + + if gui.show_name: + + vbox: + style "main_menu_vbox" + + text "[config.name!t]": + style "main_menu_title" + + text "[config.version]": + style "main_menu_version" + + +style main_menu_frame is empty +style main_menu_vbox is vbox +style main_menu_text is gui_text +style main_menu_title is main_menu_text +style main_menu_version is main_menu_text + +style main_menu_frame: + xsize 420 + yfill True + + background "gui/overlay/main_menu.png" + +style main_menu_vbox: + xalign 1.0 + xoffset -30 + xmaximum 1200 + yalign 1.0 + yoffset -30 + +style main_menu_text: + properties gui.text_properties("main_menu", accent=True) + +style main_menu_title: + properties gui.text_properties("title") + +style main_menu_version: + properties gui.text_properties("version") + + +## Écran du menu de jeu ######################################################## +## +## Ceci présente la structure commune de base d'un écran du menu de jeu. Il est +## appelé en lui passant le titre de l'écran, et il affiche l'arrière-plan, le +## titre et la navigation. +## +## Le paramètre de défilement peut être None, ou "viewport" ou "vpgrid". Cet +## écran est destiné à être utilisé avec un ou plusieurs enfants, qui sont +## transclus (placés) à l'intérieur de l'écran. + +screen game_menu(title, scroll=None, yinitial=0.0): + + style_prefix "game_menu" + + if main_menu: + add gui.main_menu_background + else: + add gui.game_menu_background + + frame: + style "game_menu_outer_frame" + + hbox: + + ## Réserve de l'expace pour la section de navigation. + frame: + style "game_menu_navigation_frame" + + frame: + style "game_menu_content_frame" + + if scroll == "viewport": + + viewport: + yinitial yinitial + scrollbars "vertical" + mousewheel True + draggable True + pagekeys True + + side_yfill True + + vbox: + transclude + + elif scroll == "vpgrid": + + vpgrid: + cols 1 + yinitial yinitial + + scrollbars "vertical" + mousewheel True + draggable True + pagekeys True + + side_yfill True + + transclude + + else: + + transclude + + use navigation + + textbutton _("Retour"): + style "return_button" + + action Return() + + label title + + if main_menu: + key "game_menu" action ShowMenu("main_menu") + + +style game_menu_outer_frame is empty +style game_menu_navigation_frame is empty +style game_menu_content_frame is empty +style game_menu_viewport is gui_viewport +style game_menu_side is gui_side +style game_menu_scrollbar is gui_vscrollbar + +style game_menu_label is gui_label +style game_menu_label_text is gui_label_text + +style return_button is navigation_button +style return_button_text is navigation_button_text + +style game_menu_outer_frame: + bottom_padding 45 + top_padding 180 + + background "gui/overlay/game_menu.png" + +style game_menu_navigation_frame: + xsize 420 + yfill True + +style game_menu_content_frame: + left_margin 60 + right_margin 30 + top_margin 15 + +style game_menu_viewport: + xsize 1380 + +style game_menu_vscrollbar: + unscrollable gui.unscrollable + +style game_menu_side: + spacing 15 + +style game_menu_label: + xpos 75 + ysize 180 + +style game_menu_label_text: + size gui.title_text_size + color gui.accent_color + yalign 0.5 + +style return_button: + xpos gui.navigation_xpos + yalign 1.0 + yoffset -45 + + +## Écran « À propos... » ####################################################### +## +## Cet écran présente le générique, les crédits et les informations de copyright +## relatives au jeu et à Ren’Py. +## +## Il n’y a rien de spécial sur cet écran. Par conséquent, il sert aussi +## d’exemple pour créer un écran personnalisé. + +screen about(): + + tag menu + + ## Cette déclaration concerne l’écran game_menu. L’élément vbox est ensuite + ## inclus dans la fenêtre de l'écran game_menu. + use game_menu(_("À propos"), scroll="viewport"): + + style_prefix "about" + + vbox: + + label "[config.name!t]" + text _("Version [config.version!t]\n") + + ## gui.about est généralement initialisé dans le fichier + ## options.rpy. + if gui.about: + text "[gui.about!t]\n" + + text _("Conçu avec {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]") + + +style about_label is gui_label +style about_label_text is gui_label_text +style about_text is gui_text + +style about_label_text: + size gui.label_text_size + + +## Écran de chargement et de sauvegarde ######################################## +## +## Ces écrans permettent au joueur d’enregistrer le jeu et de le charger +## à nouveau. Comme ils partagent beaucoup d’éléments communs, ils sont +## tous les deux implémentés dans un troisième écran, appelé fichiers_slots +## (emplacement_de_fichier). +## +## https://www.renpy.org/doc/html/screen_special.html#save https:// +## www.renpy.org/doc/html/screen_special.html#load + +screen save(): + + tag menu + + use file_slots(_("Sauvegarde")) + + +screen load(): + + tag menu + + use file_slots(_("Charger")) + + +screen file_slots(title): + + default page_name_value = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Sauvegardes automatiques"), quick=_("Sauvegardes rapides")) + + use game_menu(title): + + fixed: + + ## Cette instruction s’assure que l’évènement enter aura lieu avant + ## que l’un des boutons ne fonctionne. + order_reverse True + + ## Le nom de la page, qui peut être modifié en cliquant sur un + ## bouton. + button: + style "page_label" + + key_events True + xalign 0.5 + action page_name_value.Toggle() + + input: + style "page_label_text" + value page_name_value + + ## La grille des emplacements de fichiers. + grid gui.file_slot_cols gui.file_slot_rows: + style_prefix "slot" + + xalign 0.5 + yalign 0.5 + + spacing gui.slot_spacing + + for i in range(gui.file_slot_cols * gui.file_slot_rows): + + $ slot = i + 1 + + button: + action FileAction(slot) + + has vbox + + add FileScreenshot(slot) xalign 0.5 + + text FileTime(slot, format=_("{#file_time}%A %d %B %Y, %H:%M"), empty=_("emplacement vide")): + style "slot_time_text" + + text FileSaveName(slot): + style "slot_name_text" + + key "save_delete" action FileDelete(slot) + + ## Boutons pour accéder aux autres pages. + vbox: + style_prefix "page" + + xalign 0.5 + yalign 1.0 + + hbox: + xalign 0.5 + + spacing gui.page_spacing + + textbutton _("<") action FilePagePrevious() + + if config.has_autosave: + textbutton _("{#auto_page}A") action FilePage("auto") + + if config.has_quicksave: + textbutton _("{#quick_page}Q") action FilePage("quick") + + ## range(1, 10) donne les nombres de 1 à 9. + for page in range(1, 10): + textbutton "[page]" action FilePage(page) + + textbutton _(">") action FilePageNext() + + if config.has_sync: + if CurrentScreenName() == "save": + textbutton _("Uploader Sync"): + action UploadSync() + xalign 0.5 + else: + textbutton _("Télécharger Sync"): + action DownloadSync() + xalign 0.5 + + +style page_label is gui_label +style page_label_text is gui_label_text +style page_button is gui_button +style page_button_text is gui_button_text + +style slot_button is gui_button +style slot_button_text is gui_button_text +style slot_time_text is slot_button_text +style slot_name_text is slot_button_text + +style page_label: + xpadding 75 + ypadding 5 + +style page_label_text: + textalign 0.5 + layout "subtitle" + hover_color gui.hover_color + +style page_button: + properties gui.button_properties("page_button") + +style page_button_text: + properties gui.button_text_properties("page_button") + +style slot_button: + properties gui.button_properties("slot_button") + +style slot_button_text: + properties gui.button_text_properties("slot_button") + + +## Écran des préférences ####################################################### +## +## L’écran de préférences permet au joueur de configurer le jeu pour mieux +## correspondre à ses attentes. +## +## https://www.renpy.org/doc/html/screen_special.html#preferences + +screen preferences(): + + tag menu + + use game_menu(_("Préférences"), scroll="viewport"): + + vbox: + + hbox: + box_wrap True + + if renpy.variant("pc") or renpy.variant("web"): + + vbox: + style_prefix "radio" + label _("Affichage") + textbutton _("Fenêtre") action Preference("display", "window") + textbutton _("Plein écran") action Preference("display", "fullscreen") + + vbox: + style_prefix "check" + label _("Avance rapide") + textbutton _("Texte non lu") action Preference("skip", "toggle") + textbutton _("Après les choix") action Preference("after choices", "toggle") + textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) + + ## Des boites vbox additionnelles de type "radio_pref" ou + ## "check_pref" peuvent être ajoutées ici pour ajouter des + ## préférences définies par le créateur du jeu. + + null height (4 * gui.pref_spacing) + + hbox: + style_prefix "slider" + box_wrap True + + vbox: + + label _("Vitesse du texte") + + bar value Preference("text speed") + + label _("Avance automatique") + + bar value Preference("auto-forward time") + + vbox: + + if config.has_music: + label _("Volume de la musique") + + hbox: + bar value Preference("music volume") + + if config.has_sound: + + label _("Volume des sons") + + hbox: + bar value Preference("sound volume") + + if config.sample_sound: + textbutton _("Test") action Play("sound", config.sample_sound) + + + if config.has_voice: + label _("Volume des voix") + + hbox: + bar value Preference("voice volume") + + if config.sample_voice: + textbutton _("Test") action Play("voice", config.sample_voice) + + if config.has_music or config.has_sound or config.has_voice: + null height gui.pref_spacing + + textbutton _("Couper tous les sons"): + action Preference("all mute", "toggle") + style "mute_all_button" + + +style pref_label is gui_label +style pref_label_text is gui_label_text +style pref_vbox is vbox + +style radio_label is pref_label +style radio_label_text is pref_label_text +style radio_button is gui_button +style radio_button_text is gui_button_text +style radio_vbox is pref_vbox + +style check_label is pref_label +style check_label_text is pref_label_text +style check_button is gui_button +style check_button_text is gui_button_text +style check_vbox is pref_vbox + +style slider_label is pref_label +style slider_label_text is pref_label_text +style slider_slider is gui_slider +style slider_button is gui_button +style slider_button_text is gui_button_text +style slider_pref_vbox is pref_vbox + +style mute_all_button is check_button +style mute_all_button_text is check_button_text + +style pref_label: + top_margin gui.pref_spacing + bottom_margin 3 + +style pref_label_text: + yalign 1.0 + +style pref_vbox: + xsize 338 + +style radio_vbox: + spacing gui.pref_button_spacing + +style radio_button: + properties gui.button_properties("radio_button") + foreground "gui/button/radio_[prefix_]foreground.png" + +style radio_button_text: + properties gui.button_text_properties("radio_button") + +style check_vbox: + spacing gui.pref_button_spacing + +style check_button: + properties gui.button_properties("check_button") + foreground "gui/button/check_[prefix_]foreground.png" + +style check_button_text: + properties gui.button_text_properties("check_button") + +style slider_slider: + xsize 525 + +style slider_button: + properties gui.button_properties("slider_button") + yalign 0.5 + left_margin 15 + +style slider_button_text: + properties gui.button_text_properties("slider_button") + +style slider_vbox: + xsize 675 + + +## Écran de l'historique ####################################################### +## +## Il s’agit d’un écran qui affiche l’historique des dialogues au joueur. Bien +## qu’il n'y ait rien de spécial sur cet écran, il doit accéder à l’historique +## de dialogue stocké dans _history_list. +## +## https://www.renpy.org/doc/html/history.html + +screen history(): + + tag menu + + ## Cette instruction permet d’éviter de prédire cet écran, car il peut être + ## très large + predict False + + use game_menu(_("Historique"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0): + + style_prefix "history" + + for h in _history_list: + + window: + + ## Cela positionne correctement l'écran si history_height est + ## initialisé à None. + has fixed: + yfit True + + if h.who: + + label h.who: + style "history_name" + substitute False + + ## Utilise pour la couleur du texte, la couleur par + ## défaut des dialogues du personnage si elle a été + ## initialisée. + if "color" in h.who_args: + text_color h.who_args["color"] + + $ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags) + text what: + substitute False + + if not _history_list: + label _("L'historique des dialogues est vide.") + + +## Ceci détermine quels tags peuvent être affichés sur le screen de +## l'historique. + +define gui.history_allow_tags = { "alt", "noalt", "rt", "rb", "art" } + + +style history_window is empty + +style history_name is gui_label +style history_name_text is gui_label_text +style history_text is gui_text + +style history_label is gui_label +style history_label_text is gui_label_text + +style history_window: + xfill True + ysize gui.history_height + +style history_name: + xpos gui.history_name_xpos + xanchor gui.history_name_xalign + ypos gui.history_name_ypos + xsize gui.history_name_width + +style history_name_text: + min_width gui.history_name_width + textalign gui.history_name_xalign + +style history_text: + xpos gui.history_text_xpos + ypos gui.history_text_ypos + xanchor gui.history_text_xalign + xsize gui.history_text_width + min_width gui.history_text_width + textalign gui.history_text_xalign + layout ("subtitle" if gui.history_text_xalign else "tex") + +style history_label: + xfill True + +style history_label_text: + xalign 0.5 + + +## Écran d'aide ################################################################ +## +## Cet écran fournit des informations sur les touches et les boutons de souris. +## En interne, il utilise d’autres écrans (keyboard_help, mouse_help et +## gamepad_help) pour afficher une aide dédiée. + +screen help(): + + tag menu + + default device = "keyboard" + + use game_menu(_("Aide"), scroll="viewport"): + + style_prefix "help" + + vbox: + spacing 23 + + hbox: + + textbutton _("Clavier") action SetScreenVariable("device", "keyboard") + textbutton _("Souris") action SetScreenVariable("device", "mouse") + + if GamepadExists(): + textbutton _("Manette") action SetScreenVariable("device", "gamepad") + + if device == "keyboard": + use keyboard_help + elif device == "mouse": + use mouse_help + elif device == "gamepad": + use gamepad_help + + +screen keyboard_help(): + + hbox: + label _("Entrée") + text _("Avance dans les dialogues et active l’interface (effectue un choix).") + + hbox: + label _("Espace") + text _("Avance dans les dialogues sans effectuer de choix.") + + hbox: + label _("Flèches directionnelles") + text _("Permet de se déplacer dans l’interface.") + + hbox: + label _("Echap.") + text _("Ouvre le menu du jeu.") + + hbox: + label _("Ctrl") + text _("Fait défiler les dialogues tant que la touche est pressée.") + + hbox: + label _("Tab") + text _("Active ou désactive les «sauts des dialogues».") + + hbox: + label _("Page Haut") + text _("Retourne au précédent dialogue.") + + hbox: + label _("Page Bas") + text _("Avance jusqu'au prochain dialogue.") + + hbox: + label "H" + text _("Cache l’interface utilisateur.") + + hbox: + label "S" + text _("Prend une capture d’écran.") + + hbox: + label "V" + text _("Active la {a=https://www.renpy.org/l/voicing}{size=24}vocalisation automatique{/size}{/a}.") + + hbox: + label "Shift+A" + text _("Ouvre le menu d'accessibilité.") + + +screen mouse_help(): + + hbox: + label _("Bouton gauche") + text _("Avance dans les dialogues et active l’interface (effectue un choix).") + + hbox: + label _("Bouton central") + text _("Cache l’interface utilisateur.") + + hbox: + label _("Bouton droit") + text _("Ouvre le menu du jeu.") + + hbox: + label _("Molette vers le haut\nClic sur le côté du Rollback") + text _("Retourne au précédent dialogue.") + + hbox: + label _("Molette vers le bas") + text _("Avance jusqu'au prochain dialogue.") + + +screen gamepad_help(): + + hbox: + label _("Bouton R1\nA/Bouton du bas") + text _("Avance dans les dialogues et active l’interface (effectue un choix).") + + hbox: + label _("Gâchettes gauche") + text _("Retourne au précédent dialogue.") + + hbox: + label _("Bouton R1") + text _("Avance jusqu'au prochain dialogue.") + + + hbox: + label _("Boutons directionnels, stick gauche") + text _("Permet de se déplacer dans l’interface.") + + hbox: + label _("Start, Guide") + text _("Ouvre le menu du jeu.") + + hbox: + label _("Y/Bouton du haut") + text _("Cache l’interface utilisateur.") + + textbutton _("Calibrage") action GamepadCalibrate() + + +style help_button is gui_button +style help_button_text is gui_button_text +style help_label is gui_label +style help_label_text is gui_label_text +style help_text is gui_text + +style help_button: + properties gui.button_properties("help_button") + xmargin 12 + +style help_button_text: + properties gui.button_text_properties("help_button") + +style help_label: + xsize 375 + right_padding 30 + +style help_label_text: + size gui.text_size + xalign 1.0 + textalign 1.0 + + + +################################################################################ +## Écrans additionnels +################################################################################ + + +## Écran de confirmation ####################################################### +## +## Cet écran est appelé quand Ren'Py souhaite poser une question au joueur dont +## la réponse est oui ou non. +## +## https://www.renpy.org/doc/html/screen_special.html#confirm + +screen confirm(message, yes_action, no_action): + + ## Cette instruction s’assure que les autres écrans resteront en arrière + ## plan tant que cet écran sera affiché. + modal True + + zorder 200 + + style_prefix "confirm" + + add "gui/overlay/confirm.png" + + frame: + + vbox: + xalign .5 + yalign .5 + spacing 45 + + label _(message): + style "confirm_prompt" + xalign 0.5 + + hbox: + xalign 0.5 + spacing 150 + + textbutton _("Oui") action yes_action + textbutton _("Non") action no_action + + ## Le clic bouton droit et la touche Echap. correspondent à la réponse + ## "non". + key "game_menu" action no_action + + +style confirm_frame is gui_frame +style confirm_prompt is gui_prompt +style confirm_prompt_text is gui_prompt_text +style confirm_button is gui_medium_button +style confirm_button_text is gui_medium_button_text + +style confirm_frame: + background Frame([ "gui/confirm_frame.png", "gui/frame.png"], gui.confirm_frame_borders, tile=gui.frame_tile) + padding gui.confirm_frame_borders.padding + xalign .5 + yalign .5 + +style confirm_prompt_text: + textalign 0.5 + layout "subtitle" + +style confirm_button: + properties gui.button_properties("confirm_button") + +style confirm_button_text: + properties gui.button_text_properties("confirm_button") + + +## Écran de l’indicateur d'avance rapide ####################################### +## +## L’écran skip_indicator est affiché pour indiquer qu’une avance rapide est en +## cours. +## +## https://www.renpy.org/doc/html/screen_special.html#skip-indicator + +screen skip_indicator(): + + zorder 100 + style_prefix "skip" + + frame: + + hbox: + spacing 9 + + text _("Avance rapide") + + text "▸" at delayed_blink(0.0, 1.0) style "skip_triangle" + text "▸" at delayed_blink(0.2, 1.0) style "skip_triangle" + text "▸" at delayed_blink(0.4, 1.0) style "skip_triangle" + + +## Cette transformation est utilisé pour faire clignoter les flèches l’une après +## l’autre. +transform delayed_blink(delay, cycle): + alpha .5 + + pause delay + + block: + linear .2 alpha 1.0 + pause .2 + linear .2 alpha 0.5 + pause (cycle - .4) + repeat + + +style skip_frame is empty +style skip_text is gui_text +style skip_triangle is skip_text + +style skip_frame: + ypos gui.skip_ypos + background Frame("gui/skip.png", gui.skip_frame_borders, tile=gui.frame_tile) + padding gui.skip_frame_borders.padding + +style skip_text: + size gui.notify_text_size + +style skip_triangle: + ## Nous devons utiliser une police qui a le glyphe BLACK RIGHT-POINTING + ## SMALL TRIANGLE. + font "DejaVuSans.ttf" + + +## Écran de notification ####################################################### +## +## Cet écran est utilisé pour affiché un message au joueur. (Par exemple, quand +## une sauvegarde rapide a eu lieu ou quand une capture d’écran vient d’être +## réalisée.) +## +## https://www.renpy.org/doc/html/screen_special.html#notify-screen + +screen notify(message): + + zorder 100 + style_prefix "notify" + + frame at notify_appear: + text "[message!tq]" + + timer 3.25 action Hide('notify') + + +transform notify_appear: + on show: + alpha 0 + linear .25 alpha 1.0 + on hide: + linear .5 alpha 0.0 + + +style notify_frame is empty +style notify_text is gui_text + +style notify_frame: + ypos gui.notify_ypos + + background Frame("gui/notify.png", gui.notify_frame_borders, tile=gui.frame_tile) + padding gui.notify_frame_borders.padding + +style notify_text: + properties gui.text_properties("notify") + + +## Écran NVL ################################################################### +## +## Cet écran est utilisé pour les dialogues et les menus en mode NVL. +## +## https://www.renpy.org/doc/html/screen_special.html#nvl + + +screen nvl(dialogue, items=None): + + window: + style "nvl_window" + + has vbox: + spacing gui.nvl_spacing + + ## Les dialogues sont affichés soit dans une vpgrid soit dans une vbox. + if gui.nvl_height: + + vpgrid: + cols 1 + yinitial 1.0 + + use nvl_dialogue(dialogue) + + else: + + use nvl_dialogue(dialogue) + + ## Si fourni, affiche le menu. Le menu peut s’afficher de manière + ## incorrecte si config.narrator_menu est initialisé à True. + for i in items: + + textbutton i.caption: + action i.action + style "nvl_button" + + add SideImage() xalign 0.0 yalign 1.0 + + +screen nvl_dialogue(dialogue): + + for d in dialogue: + + window: + id d.window_id + + fixed: + yfit gui.nvl_height is None + + if d.who is not None: + + text d.who: + id d.who_id + + text d.what: + id d.what_id + + +## Ce paramètre contrôle le maximum d’entrée dans le mode NVL qui peuvent être +## affichée simultanément. +define config.nvl_list_length = gui.nvl_list_length + +style nvl_window is default +style nvl_entry is default + +style nvl_label is say_label +style nvl_dialogue is say_dialogue + +style nvl_button is button +style nvl_button_text is button_text + +style nvl_window: + xfill True + yfill True + + background "gui/nvl.png" + padding gui.nvl_borders.padding + +style nvl_entry: + xfill True + ysize gui.nvl_height + +style nvl_label: + xpos gui.nvl_name_xpos + xanchor gui.nvl_name_xalign + ypos gui.nvl_name_ypos + yanchor 0.0 + xsize gui.nvl_name_width + min_width gui.nvl_name_width + textalign gui.nvl_name_xalign + +style nvl_dialogue: + xpos gui.nvl_text_xpos + xanchor gui.nvl_text_xalign + ypos gui.nvl_text_ypos + xsize gui.nvl_text_width + min_width gui.nvl_text_width + textalign gui.nvl_text_xalign + layout ("subtitle" if gui.nvl_text_xalign else "tex") + +style nvl_thought: + xpos gui.nvl_thought_xpos + xanchor gui.nvl_thought_xalign + ypos gui.nvl_thought_ypos + xsize gui.nvl_thought_width + min_width gui.nvl_thought_width + textalign gui.nvl_thought_xalign + layout ("subtitle" if gui.nvl_text_xalign else "tex") + +style nvl_button: + properties gui.button_properties("nvl_button") + xpos gui.nvl_button_xpos + xanchor gui.nvl_button_xalign + +style nvl_button_text: + properties gui.button_text_properties("nvl_button") + + +## Screen des bulles ########################################################### +## +## Le screen des bulles est utilisé pour afficher des dialogues en utilisant des +## bulles de dialogue. Ce screen prend les mêmes paramètres que le screen say, +## doit prévoir un displayable avec l'id "what", et peut créer des displayables +## avec les ids "namebox", "who", et "window". +## +## https://www.renpy.org/doc/html/bubble.html#bubble-screen + +screen bubble(who, what): + style_prefix "bubble" + + window: + id "window" + + if who is not None: + + window: + id "namebox" + style "bubble_namebox" + + text who: + id "who" + + text what: + id "what" + +style bubble_window is empty +style bubble_namebox is empty +style bubble_who is default +style bubble_what is default + +style bubble_window: + xpadding 30 + top_padding 5 + bottom_padding 5 + +style bubble_namebox: + xalign 0.5 + +style bubble_who: + xalign 0.5 + textalign 0.5 + color "#000" + +style bubble_what: + align (0.5, 0.5) + text_align 0.5 + layout "subtitle" + color "#000" + +define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95) +define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55) + +define bubble.properties = { + "bottom_left" : { + "window_background" : Transform(bubble.frame, xzoom=1, yzoom=1), + "window_bottom_padding" : 27, + }, + + "bottom_right" : { + "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1), + "window_bottom_padding" : 27, + }, + + "top_left" : { + "window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1), + "window_top_padding" : 27, + }, + + "top_right" : { + "window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1), + "window_top_padding" : 27, + }, + + "thought" : { + "window_background" : bubble.thoughtframe, + } +} + +define bubble.expand_area = { + "bottom_left" : (0, 0, 0, 22), + "bottom_right" : (0, 0, 0, 22), + "top_left" : (0, 22, 0, 0), + "top_right" : (0, 22, 0, 0), + "thought" : (0, 0, 0, 0), +} + + + +################################################################################ +## Variantes pour les mobiles +################################################################################ + +style pref_vbox: + variant "medium" + xsize 675 + +## Comme la souris peut ne pas être présente, nous remplaçons le menu rapide +## avec une version qui utilise des boutons plus gros et qui sont plus faciles à +## toucher du doigt. +screen quick_menu(): + variant "touch" + + zorder 100 + + if quick_menu: + + hbox: + style_prefix "quick" + + xalign 0.5 + yalign 1.0 + + textbutton _("Retour") action Rollback() + textbutton _("Avance rapide") action Skip() alternate Skip(fast=True, confirm=True) + textbutton _("Auto") action Preference("auto-forward", "toggle") + textbutton _("Menu") action ShowMenu() + + +style window: + variant "small" + background "gui/phone/textbox.png" + +style radio_button: + variant "small" + foreground "gui/phone/button/radio_[prefix_]foreground.png" + +style check_button: + variant "small" + foreground "gui/phone/button/check_[prefix_]foreground.png" + +style nvl_window: + variant "small" + background "gui/phone/nvl.png" + +style main_menu_frame: + variant "small" + background "gui/phone/overlay/main_menu.png" + +style game_menu_outer_frame: + variant "small" + background "gui/phone/overlay/game_menu.png" + +style game_menu_navigation_frame: + variant "small" + xsize 510 + +style game_menu_content_frame: + variant "small" + top_margin 0 + +style pref_vbox: + variant "small" + xsize 600 + +style bar: + variant "small" + ysize gui.bar_size + left_bar Frame("gui/phone/bar/left.png", gui.bar_borders, tile=gui.bar_tile) + right_bar Frame("gui/phone/bar/right.png", gui.bar_borders, tile=gui.bar_tile) + +style vbar: + variant "small" + xsize gui.bar_size + top_bar Frame("gui/phone/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) + bottom_bar Frame("gui/phone/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) + +style scrollbar: + variant "small" + ysize gui.scrollbar_size + base_bar Frame("gui/phone/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/phone/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + +style vscrollbar: + variant "small" + xsize gui.scrollbar_size + base_bar Frame("gui/phone/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/phone/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + +style slider: + variant "small" + ysize gui.slider_size + base_bar Frame("gui/phone/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) + thumb "gui/phone/slider/horizontal_[prefix_]thumb.png" + +style vslider: + variant "small" + xsize gui.slider_size + base_bar Frame("gui/phone/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) + thumb "gui/phone/slider/vertical_[prefix_]thumb.png" + +style slider_vbox: + variant "small" + xsize None + +style slider_slider: + variant "small" + xsize 900 diff --git a/game/script.rpy b/game/script.rpy new file mode 100644 index 0000000..c454c0c --- /dev/null +++ b/game/script.rpy @@ -0,0 +1,129 @@ + + +# Vous pouvez placer le script de votre jeu dans ce fichier. + +# Définition des éléments communs aux personnages +init python: + class Personnage: + + # Variables des classes des personnages + def __init__(self): + self.c = None + self.genre = None + self.age = None + self.conjoint = None + self.attirance = None + self.enfants = None + self.social = None + self.salaire = None + self.experience = None + self.anciennete = None + self.etudes = None + self.chomage = None + + # Méthode qui définit la fiche personnage complète + def etat_civil(self): + # genre + self.genre = renpy.random.choice(["homme", "femme"]) + # nom en fonction du genre + if self.genre == "femme": + idiome = renpy.random.choice(["Juliette", "Sylvie", "Rachel", "Lydie", "Anaëlle"]) + self.c = Character(idiome, color="#af0f0fff") + else: # si c'est un homme + #TODO Externaliser les listes de noms + idiome = renpy.random.choice(["Gérard", "Pierre", "Olivier", "Jules", "Maxime"]) + self.c = Character(idiome, color="#af0f0fff") + # âge (de 18 à 64 ans) + self.age = renpy.random.randint(18,64) + # conjoint (non = 0, oui = 1) + self.conjoint = renpy.random.randint(0,1) + # attirance (hétéro = 0, gay = 1) + self.attirance = renpy.random.randint(0,1) + # enfants (0 à 3) + #TODO Nuancer nb enfant par rapport situation familiale en s'appuyant sur des statistiques + self.enfants = renpy.random.randint(0,3) + # situation sociale + self.social = renpy.random.choice(["ouvrier", "employé", "cadre"]) + # nombre d'années d'études + # TODO pondérer par des statistiques + self.etudes = renpy.random.randint (0,8) + # nombre d'annés d'expérience sur toute la carrière + self.experience = renpy.random.randint(0, self.age - (18 + self.etudes)) + # nombre d'années d'ancienneté dans l'entreprise + self.anciennete = renpy.random.randint(0, self.experience) + # nombre d'années de chômage + self.chomage = self.age - 18 - self.etudes - self.experience + # salaire brut actuel + # TODO s'appuyer sur des statistiques + # salaire de base + if self.social == "ouvrier": + self.salaire = renpy.random.randint(1400, 1700) + if self.social == "employé": + self.salaire = renpy.random.randint(1700, 2000) + if self.social == "cadre": + self.salaire = renpy.random.randint(2000, 4000) + # majoration suivant l'experience (5% par année d'exp) + # TODO s'appuyer sur des statistiques + self.salaire = self.salaire + (self.salaire * self.experience * 0.05) + # minoration de 20% si genre = femme + if self.genre == "femme": + self.salaire = self.salaire - (self.salaire * 0.2) + + + + + +# Déclarez sous cette ligne les images, avec l'instruction 'image' +# ex: image eileen heureuse = "eileen_heureuse.png" + +# Ici sont créés les fiches personnages avec les méthodes de la classe Personnages +label fiches_personnages: + + # Liste des personnages + + # Protagoniste + $ m = Personnage() + $ m.etat_civil() + + # Conjoint : + python: + conjoint = Personnage() + conjoint.etat_civil() + # correction des éléments de l'état civil qui dépendent des traits + # du protagoniste + if m.conjoint == 1 and m.attirance == 1: + conjoint.genre = m.genre + elif m.conjoint == 1 and m.attirance == 0: + conjoint + + + + # Initialisation des personnages + + + #On revient à la suite du label start + return + + +# Le jeu commence ici +label start: + + # Initialisation des fiches personnages + call fiches_personnages + + # Structure de l'histoire + call morning_routine + call petit_dejeuner + call trajet + call matin + call midi + call apres_midi + call negociation_patron + + + m.c "Et voilà, c'est terminé !" + + + + +