-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.c
332 lines (280 loc) · 6.64 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/* CODE SOURCE DU "JEU" PROTOTYPE
Auteur : Bananachu
Pour plus d'informatios sur le projet, veuillez
consulter le repo GitHub :
https://www.github.com/Bananachu/prototype
Remerciements spéciaux à Alex Allain du site
https://www.cprogramming.com
pour ses cours de C et de C++, ainsi qu'à
la chaîne YouTube freeCodeCamp.org pour les
même raisons
Ce code n'est publié sous aucune licence et est
totalement libre, vous pouvez l'utiliser comme
bon vous semble, même si des crédits seraient
appréciés.
Ce code a été écrit sur SublimeText et compilé
avec GCC, merci aux dévloppeurs de ces deux
applications !*/
#include <stdio.h>
#include <string.h>
// Variables cachées
char input[12]; // Pour stocker l'input de l'utilisateur.
int zone; // Pour stocker le numéro de zone.
int sequel; // Pour stocker la progression des dialogues.
/*Fonctions "motrices"
Ces fonctions sont appelées à de nombreuses reprises et
servent au fonctionnement même du logiciel, elle ne représentent
pas forcément quelque chose de concret pour l'utilisateur.*/
// Supprime le \n à la fin de l'input
void purify(char *str, int size) {
int i;
for (i = 0; i < size; i++) {
if (str[i] == '\n') {
str[i] = '\0';
return;
}
}
}
// Fonction affichant l'ASCII-art.
// Elle prend en paramètre le numéro de ligne du début
// et de la fin dudit ASCII-art dans ./ressources/art.
void art(int begin, int end) {
FILE *pepe = fopen ("./ressources/arts", "r");
char line[255];
for (int l = 0; l < end; l++) {
fgets(line, sizeof(line), pepe);
if (l >= begin && l < end) {
printf("%s", line);
}
}
fclose(pepe);
}
// Idem pour les dialogues.
void text(int intro, int outro) {
FILE *sans = fopen ("./ressources/verbose", "r");
char vers[255];
for (int m = 0; m < outro; m++) {
fgets(vers, sizeof(vers), sans);
if (m >= intro && m < outro) {
printf("%s", vers);
}
}
fclose(sans);
}
// Affiche le dialogue en fonction de la zone.
void dialogue() {
switch (sequel) {
case 42:
text(64, 69);
break;
case 100:
text(18, 40);
break;
case 142:
text(70, 75);
break;
case 200:
text(41, 63);
break;
case 242:
text(76, 81);
sequel = -58;
break;
default:
text(12, 17);
break;
}
}
// Idem pour l'ASCII-art.
int tableau() {
switch (sequel) {
case 42:
art(18, 35);
break;
case 100:
break;
case 142:
art(18, 35);
break;
case 200:
break;
case 242:
art(18, 35);
break;
default:
art(36, 53);
break;
}
}
// Incrémente sequel de 100 en 100 pour permettre à dialogue()
// d'afficher la suite des paragraphes quand il le faut.
int suite() {
if (strcmp(input, "suite") == 0) {
sequel = sequel + 100;
tableau();
dialogue();
}
}
// Réinitialise sequel et affiche le début du dialogue.
void back() {
if (strcmp(input, "retour") == 0) {
sequel = zone;
tableau();
dialogue();
}
}
// Appelée en cas d'évênement imprévu (message d'erreur).
void wrong() {
sequel = zone;
tableau();
text(12, 17);
}
/*FIN DES FONCTIONS "MOTRICES"*/
// Cette fonction est un cas à part : elle est appelée au lancement
// du logiciel et affiche l'écran titre. Elle n'est plus appelée par
// la suite.
int start() {
printf("\e[1;1H\e[2J");
art(0, 17);
text(0, 5);
printf("[Zone:%d | Sequel:%d]> ", zone, sequel);
int j = 0;
for (j = 0; j < 2; j++) {
fgets( input, 12, stdin );
purify( input, 12 );
printf("\a");
if (strcmp(input, "start") == 0) {
printf( "\e[1;1H\e[2J" );
zone = 42;
sequel = zone;
tableau();
dialogue();
printf("[Zone:%d | Sequel:%d]> ", zone, sequel);
return j = 3;
} else {
art(0, 17);
text(6, 11);
}
}
}
/*Commandes
Ces fonctions correspondent à des commandes effectuables
par l'utilisateur.*/
// Affiche l'ASCII-art et la description de la zone actuelle.
void inspect() {
if (strcmp(input, "inspecter") == 0) {
sequel = zone;
tableau();
dialogue();
}
}
// Affiche l'aide.
void help() {
if (strcmp(input, "aide") == 0) {
sequel = 100;
dialogue();
}
}
/*Pour afficher l'aide OBSOLÈTE, À MIGRER VERS CAS -1 DE DISPLAY
void help() {
if (strcmp(input, "aide") == 0) {
sequel = zone;
text(12, 34);
printf("> ");
fgets(input, 12, stdin);
purify(input, 12);
if (strcmp(input, "plus") == 0) {
printf("\a \x1b[0m \e[1;1H\e[2J");
text(35, 57);
} else if (strcmp(input, "retour") == 0) {
printf("\a \x1b[0m \e[1;1H\e[2J");
display(zone);
} else {
printf("Vous ne pouvez pas faire ça ici.");
}
}
}*/
// Cette fonction change la valeur de la variable "zone" de manière à
// simuler un déplacement vers le nord du point de vue du joueur.
// Limité à 0 pour ne pas "sortir" de la carte.
void north() {
if (strcmp(input, "nord") == 0) {
if ((zone - 10) >= 0) {
zone = zone - 10;
sequel = zone;
tableau();
dialogue();
} else {
printf("Vous ne pouvez pas aller plus loin.");
}
}
}
//Idem pour le sud
void south() {
if (strcmp(input, "sud") == 0) {
if ((zone + 10) <= 99) {
zone = zone + 10;
sequel = zone;
tableau();
dialogue();
} else {
printf("Vous ne pouvez pas aller plus loin.");
}
}
}
//Idem pour l'est
void east() {
if (strcmp(input, "est") == 0) {
//La ligne suivante ne me plaît pas mais j'ai pas encore trouvé mieux :/
if (zone == 9 || zone == 19 || zone == 29 || zone == 39 || zone == 49 || zone == 59 || zone == 69 || zone == 79 || zone == 89 || zone == 99) {
printf("Vous ne pouvez pas aller plus loin.");
} else {
zone = zone + 1;
sequel = zone;
tableau();
dialogue();
}
}
}
//Idem pour l'ouest
void west() {
if (strcmp(input, "ouest") == 0) {
//Idem que pour l'est
if (zone == 0 || zone == 10 || zone == 20 || zone == 30 || zone == 40 || zone == 50 || zone == 60 || zone == 70 || zone == 80 || zone == 90) {
printf("Vous ne pouvez pas aller plus loin.");
} else {
zone = zone - 1;
sequel = zone;
tableau();
dialogue();
}
}
}
/*FIN DES COMMANDES*/
// Liste des commandes faisable par l'utilisateur
// (pour éviter d'avoir un énorme if/else).
void actions() {
help();
inspect();
north();
south();
east();
west();
suite();
back();
}
//Fonction principale, "moteur" du jeu
int main() {
start(); //Écran titre
int k = 0;
while (k < 1) { //Cette boucle est ensuite répétée infiniment :
fgets(input, 12, stdin); // on récupère l'input
purify(input, 12); // on enlève le \n
printf("\a \e[1;1H\e[2J");// on fait un bip et on nettoie le terminal
actions(); // et enfin on effectue la commande.
if (strcmp(input, "quitter") == 0) {
return k = 1; // Cette condition brise la boucle et fait quitter le jeu.
}
printf("[Zone:%d | Sequel:%d]> ", zone, sequel); // Affiche le ">".
}
}