-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathResources.ts
226 lines (211 loc) · 7.63 KB
/
Resources.ts
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
import IMG = require('./proto/IMG');
import Util = require('./Util');
import Statistics = require('./Statistics');
import Log = require('./proto/Log');
/** @constant instance d'Util */
const util = Util.getInstance();
/**
* @author Kolly Florian
* @version 1.0 - initial
* @classdesc Classe gérant les images et les traductions venant de la base de données
*/
class Resources {
/** le dictionnaire des images */
private static IMAGES = {
'default_sprite_error_framework': new IMG('iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABKSURBVDhP3Y+xEcBADIM8XcbOap+GU4HeC4SjE41m4zzvVeZGXWRu1EXmRl1kbtRF5kZdZG7UReZGXfz3uQ11kblRF5kbdZFZzHyGpgGQGV5drAAAAABJRU5ErkJggg==', 16, 16, 1)
};
/** le texte par défaut */
private static DEFAULT_TEXT = '404 - Text Not Found';
/** le dictionnaire des textes */
private static TEXTS = {};
/** le tableau des inputs */
private static INPUTS = [];
/** la langue actuelle */
private static language: string;
/** le degré actuel */
private static degre: string;
/** le texte du tutoriel actuel */
private static currentTutorialText: string;
/**
* Ajoute une image à l'application pour sa future utilisation
* Automatiquement appelé
* @method addImage
* @param name le nom de l'image
* @param base64 le string base64 représentant l'image
* @param width la largeur de l'image
* @param height la hauteur de l'image
* @param frames le nombre de frames de l'image
*/
public static addImage(name: string, base64: string, width: number, height: number, frames: number): void {
Resources.IMAGES[name] = new IMG(base64, width, height, frames);
}
/**
* Ajoute un texte à l'application pour sa future utilisation
* Automatiquement appelé
* @method addText
* @param name la langue du texte
* @param text le json du texte
*/
public static addText(name: string, text: any): void {
Resources.TEXTS[name] = text;
}
/**
* Ajoute un input qui devra être traduit
* Automatiquement appelé
* @method addInput
* @param id l'ID de l'input
*/
public static addInput(id: string): void {
Resources.INPUTS.push(id);
}
/**
* Retourne l'image demandée via son nom
* @method getImage
* @param name le nom de l'image demandée
* @return l'objet IMG souhaité
*/
public static getImage(name: string): IMG {
if(Resources.IMAGES[name]) {
return Resources.IMAGES[name];
} else {
new Log('error', `Image introuvable -> ${name}`).show();
return Resources.IMAGES['default_sprite_error_framework'];
}
}
/**
* Retourne un texte utilisé pour tous sauf le tutoriel
* @method getOtherText
* @param name le nom du texte
* @param options les données à indiquer si le texte est un template string
* @return le texte, modifié avec les valeurs si c'est un template string ou le texte par défaut si la clé n'existe pas
*/
public static getOtherText(name: string, options?: any): string {
let text = Resources.DEFAULT_TEXT;
if(Resources.language) {
if(Resources.TEXTS[Resources.language][name]) {
text = Resources.TEXTS[Resources.language][name];
if(options) {
let templateString = generateTemplateString(text);
text = templateString(options);
}
} else {
new Log('error', `Texte introuvable -> ${name}`).show();
}
} else {
new Log('error', `Langue non définie (Resources.changeLanguage pour la définir)`).show();
}
return text;
}
/**
* Retourne un texte utilisé uniquement pour le tutoriel
* @method getOtherText
* @param name le nom du texte
* @param options les données à indiquer si le texte est un template string
* @return le texte, modifié avec les valeurs si c'est un template string ou le texte par défaut si la clé n'existe pas
*/
public static getTutorialText(name: string, options?: any): any {
let text = Resources.DEFAULT_TEXT;
if(Resources.language) {
if(Resources.TEXTS[Resources.language]['tutorial'][name]) {
Resources.currentTutorialText = name;
text = Resources.TEXTS[Resources.language]['tutorial'][name];
if(options) {
let templateString = generateTemplateString(text);
text = templateString(options);
}
} else {
new Log('error', `Texte introuvable -> ${name}`).show();
}
} else {
new Log('error', `Langue non définie (Resources.changeLanguage pour la définir)`).show();
}
return text;
}
/**
* Méthode appelée quand l'élève change la langue du jeu
* @method changeLanguage
* @param e l'event
* @param lang la langue si on souhaite la mettre manuellement
*/
public static changeLanguage(e, lang?: string): any {
if(lang && Resources.TEXTS[lang]) {
Resources.language = lang;
} else if(Resources.TEXTS[lang]) {
Resources.language = e.target.id
} else {
new Log('error', `Langue introuvable -> ${lang ? lang : e.target.id}`).show();
}
$('#languageCode').text(Resources.language);
if(Resources.currentTutorialText) util.setTutorialText(Resources.getTutorialText(Resources.currentTutorialText));
Resources.INPUTS.forEach(b => $(`#${b}`).val(Resources.getOtherText(b)));
}
/**
* Méthode appelée quand l'élève change le degré du jeu
* @method changeDegre
* @param e l'event
* @param deg le degré si on souhaite la mettre manuellement
*/
public static changeDegre(e, deg?: string): any {
if(deg) Resources.degre = deg;
else Resources.degre = e.target.id;
Statistics.setDegre(Resources.degre);
util.onGameDataChanged();
}
public static getDegre(): string {
return Resources.degre;
}
/**
* Requête (a)jax pour recevoir un exercice (pas asynchrone)
* @method getExercice
* @return le JSON de l'exercice
*/
public static getExercice() {
let retour: string;
$.ajax({
type: 'POST',
async: false,
dataType: 'json',
url: '/getExercice',
data: {
degre: Resources.degre
},
success: function(result) {
retour = result;
}
});
return retour;
}
}
/**
* Produces a function which uses template strings to do simple interpolation from objects.
* https://stackoverflow.com/questions/29182244/convert-a-string-to-a-template-string
*
* Usage:
* var makeMeKing = generateTemplateString('${name} is now the king of ${country}!');
*
* console.log(makeMeKing({ name: 'Bryan', country: 'Scotland'}));
* // Logs 'Bryan is now the king of Scotland!'
*/
const generateTemplateString = (function(){
const cache = {};
function generateTemplate(template){
let fn = cache[template];
if (!fn){
// Replace ${expressions} (etc) with ${map.expressions}.
const sanitized = template
.replace(/\$\{([\s]*[^;\s\{]+[\s]*)\}/g, function(_, match){
return `\$\{map.${match.trim()}\}`;
})
// Afterwards, replace anything that's not ${map.expressions}' (etc) with a blank string.
.replace(/(\$\{(?!map\.)[^}]+\})/g, '');
fn = Function('map', `return \`${sanitized}\``);
}
return fn;
}
return generateTemplate;
})();
// change la langue lorsque l'utilisateur clique sur une langue
$('.onclick_language').on('click', Resources.changeLanguage);
// change le degre lorsque l'utilisateur clique sur un degre
$('.onclick_degre').on('click', Resources.changeDegre);
export = Resources;