summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid <reidyaro@gmail.com>2016-12-03 22:56:42 +0100
committergumi <mekolat@users.noreply.github.com>2016-12-21 13:57:39 -0500
commite07d2768399dc4eef5d8eaea54dc356abd18ec44 (patch)
tree9c6ab5e46f9ff35ead8dbc6addaa5571db96d6c5
parentb387e53583285ac86f2c19377144fb5ec3b1b8ad (diff)
downloadserverdata-e07d2768399dc4eef5d8eaea54dc356abd18ec44.tar.gz
serverdata-e07d2768399dc4eef5d8eaea54dc356abd18ec44.tar.bz2
serverdata-e07d2768399dc4eef5d8eaea54dc356abd18ec44.tar.xz
serverdata-e07d2768399dc4eef5d8eaea54dc356abd18ec44.zip
Improve the riddle script, fix the fact that the riddle didn't work with a translated answer.
-rw-r--r--npc/001-1/qpid.txt49
-rw-r--r--npc/functions/riddle.txt75
-rw-r--r--npc/scripts.conf1
3 files changed, 78 insertions, 47 deletions
diff --git a/npc/001-1/qpid.txt b/npc/001-1/qpid.txt
index c6a4eb0a..2fd12c80 100644
--- a/npc/001-1/qpid.txt
+++ b/npc/001-1/qpid.txt
@@ -6,50 +6,6 @@
001-1,65,116,0 script Q'Pid#001-1 NPC_QPID,{
- function verify_riddle_answer {
- .@answer$ = getarg (0);
- .@good$ = getarg (1);
- .@good_translated$ = l(getarg(1));
-
- .@size_answer = getstrlen (.@answer$);
- .@size_good = getstrlen (.@good$);
- .@size_good_translated = getstrlen (.@good_translated$);
-
- if (.@size_answer > .@size_good)
- {
- .@max = (.@size_answer > .@size_good_translated)
- ? .@size_answer
- : .@size_good_translated;
- }
- else
- {
- .@max = (.@size_good > .@size_good_translated)
- ? .@size_good
- : .@size_good_translated;
- }
-
- for (.@j = 0; .@j < .@max; .@j++)
- {
- if (strtolower (charat (.@answer$, .@j)) == charat (.@good$, .@j))
- {
- .@k++;
- }
- if (strtolower (charat (.@answer$, .@j)) == charat (.@good_translated$, .@j))
- {
- .@k_translated++;
- }
- }
- .@k *= 10;
- .@k_translated *= 10;
- .@size_good *= 7;
- .@size_good_translated *= 7;
- if (.@k >= .@size_good || .@k_translated >= .@size_good_translated)
- {
- return 1;
- }
- return 0;
- }
-
function riddle_enigma {
speech 5,
l("Ok fine, you have up to 3 tries, here is the riddle:"),
@@ -64,7 +20,7 @@
input .@answer$;
.@i++;
- if (verify_riddle_answer (.@answer$, "life"))
+ if (riddlevalidation (.@answer$, "life", l("life")))
{
speech 5,
l("Oh..."),
@@ -104,7 +60,7 @@
break;
}
- } while (1);
+ } while (true);
return;
}
@@ -212,4 +168,3 @@ OnInit:
.distance = 3;
end;
}
-
diff --git a/npc/functions/riddle.txt b/npc/functions/riddle.txt
new file mode 100644
index 00000000..688a56db
--- /dev/null
+++ b/npc/functions/riddle.txt
@@ -0,0 +1,75 @@
+// Evol functions.
+// Authors:
+// Reid
+//
+// Description:
+// Riddle enigma validator
+//
+// Arguments
+// 0 PC answer
+// 1 English correct answer
+// 2 Translated correct answer
+
+// TODO: levenshtein(), similar_text(), and maybe even soundex()
+
+function script riddlevalidation {
+ .@answer$ = strtolower (getarg (0));
+ .@good$ = strtolower (getarg (1));
+ .@good_translated$ = strtolower (getarg (2));
+
+ .@size_answer = getstrlen (.@answer$);
+ .@size_good = getstrlen (.@good$);
+ .@size_good_translated = getstrlen (.@good_translated$);
+
+ .@max = max (.@size_answer, .@size_good_translated, .@size_good);
+
+ // Input is too long.
+ if (.@max > 20)
+ {
+ return false;
+ }
+
+ .@size_good *= 70;
+ .@size_good_translated *= 70;
+
+ for (.@i = 0; .@i < .@max; .@i++)
+ {
+ .@correct = 0;
+ .@correct_translated = 0;
+
+ for (.@k = .@k_translated = .@j = .@i; .@j < .@max; .@j++)
+ {
+ if (charat (.@answer$, .@j) == charat (.@good$, .@k))
+ {
+ .@correct++;
+ .@k++;
+ }
+ else
+ {
+ .@correct--;
+ }
+
+ if (charat (.@answer$, .@j) ==
+ charat (.@good_translated$, .@k_translated))
+ {
+ .@correct_translated++;
+ .@k_translated++;
+ }
+ else
+ {
+ .@correct_translated--;
+ }
+ }
+ // if 70% of the word is correct
+ .@correct *= 100;
+ .@correct_translated *= 100;
+
+ if (.@correct >= .@size_good ||
+ .@correct_translated >= .@size_good_translated)
+ {
+ return true;
+ }
+ }
+
+ return false;
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index f1c91046..05e563e5 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -35,6 +35,7 @@
"npc/functions/time.txt",
"npc/functions/asklanguage.txt",
"npc/functions/game-rules.txt",
+"npc/functions/riddle.txt",
// quest debug
"npc/functions/quest-debug/functions.txt",