J'ai décompilé le code à l'aide de
cet utilitaire et je pense avoir trouvé l'explication. Voici la fonction qui traite l'appui sur une touche :
- Code:
onClipEvent (keyDown) {
if (Selection.getFocus() == '_level0.sendFriend') {
return undefined;
}
key = Key.getCode();
if (key == 32) {
if (_global.animating == true) {
return undefined;
}
init();
} else {
_root.clockstart._visible = false;
_root.hands.gotoAndStop((eval(_root.hands))._currentframe + 1);
if (key - 65 == pos) {
if (pos == 0) {
startTime = new Date();
}
macroCheck[pos] = (new Date()).getTime();
++pos;
if (pos == 26) {
if (_global.playSounds) {
comp.start();
}
_global.finalTime = new Date() - startTime.getTime();
_root.pressed = _global.finalTime / 1000;
_root.lettersC._visible = false;
_root.i_submit._visible = true;
_root.hands.gotoAndStop(1);
return undefined;
}
} else {
if (_global.playSounds) {
wrong.stop();
wrong.start(0, 1);
}
return undefined;
}
}
if (_global.playSounds) {
right.stop();
right.start(0, 1);
}
_root.lettersC[alpha.substring(pos, pos + 1)]._visible = true;
}
On voit que macroCheck[pos] mémorise l'instant où la touche est appuyée. Lorsqu'on la relâche, on passe ici :
- Code:
onClipEvent (keyUp) {
var keyPos = Key.getCode() - 65;
if (keyPos < 0 || keyPos > 25) {
return undefined;
}
if (!macroCheckFlags[keyPos]) {
macroCheck[keyPos] = (new Date()).getTime() - macroCheck[keyPos];
macroCheckFlags[keyPos] = true;
}
}
On constate que macroCheck[keyPos] contient maintenant l'intervalle de temps (en ms) entre l'appui et le relâchement.
La fonction de soumission du score est là :
- Code:
on (press) {
var i = 0;
while (i < macroCheck.length) {
if (macroCheck[i] == 0) {
_global.pagePos = 0;
loadHiScores();
return undefined;
}
++i;
}
var key = 'rocket';
myVars = new LoadVars();
ffdata = 'save|' + _root.i_name.text + '|' + _root.i_code.text + '|' + _global.finalTime + '|' + _global.gameId;
encrypted = '';
var i = 0;
var j = 0;
while (i < ffdata.length) {
if (j >= key.length) {
j = 0;
}
encrypted += String.fromCharCode((ffdata.charCodeAt(i) ^ key.charCodeAt(j)) + 1);
i++;
j++;
}
myVars.ffdata = encrypted;
myVars.sendAndLoad(_global.servletUrl, myVars, 'POST');
myVars.onLoad = showHiScoreSaveResult;
}
On remarque le test au début : si macroCheck[i] est nul, on sort. Autrement dit, si on a frappé une touche dans la même milliseconde, le score n'est pas enregistré. Les utilitaires qui simulent les appuis de touches envoient les événements KEYDOWN et KEYUP à la suite, sans temporisation.
Sinon, pour ceux qui maîtrisent trop l'alphabet à l'endroit, vous pouvez maintenant le travailler à l'envers :
http://www.offthewrist.com/frenzy2/FingerFrenzy2.swf