So I have a puzzle that requires putting in a code to unlock a safe. I can get it so that it only accepts the number, but I'm not sure how to go about printing something else for any other input. Is there a way to do this?
We use the three functions here:
is_int will return true if its input is a string representation of an integer number. (Assuming English language) original_verb() will return the first word the player typed. original_noun1() will return the first noun in a 3 or more word sentence, or ALWAYS the 2nd word in a 2 word sentence.
The sample shown below may be more than you need, as it supports DIAL XXXX, and XXXX as accepted combination formats.
: done will stop executing, therefore we simply put the bad combination processing code underneath the conditional good combination processing code. Check out the code snippet.
I have documented this here:
https://adventuron.io/docs/tut/#_entering_a_numeric_combination
start_at = office
locations {
office : location "You are in an office." ;
}
objects {
safe : scenery "a safe" start_at = "office" examine_message="The safe has a keypad.\nType DIAL XXXX (where XXXX is a number to try to open the safe).";
}
on_command {
: if (is_present "safe") {
: if (is_int (original_verb())) {
: match "1234 _" {
: print "You enter the correct safe combination" ;
: done ; // Stops it from matching anything else
}
: print "Wrong Combo" ;
}
: match "dial _" {
: if (is_int(original_noun1())) {
: match "dial 1234" {
: print "You enter the correct safe combination" ;
: done ; // Stops it from matching anything else
}
: print "Wrong Combo" ;
}
: else {
: print "Please type DIAL XXXX (where XXXX is a number)." ;
}
}
}
}
Use a boolean to store that the safe has been examined, then only allow dialling a number if you have seen the keypad (has_seen_keypad == true).
start_at = office
locations {
office : location "You are in an office." ;
}
objects {
safe : scenery "a safe" start_at = "office";
}
booleans {
has_seen_keypad : boolean "false" ;
}
on_command {
: if_examine "safe" {
: print "The safe has a <KEYPAD<12>>.\nIt looks like you need to <DIAL<13>> a 4 digit combination (e.g. <DIAL 0000<14>>)." ;
: set_true "has_seen_keypad" ;
: done ;
}
: match "dial _" {
: if (is_present "safe" && has_seen_keypad == true) {
: if (is_int(original_noun1())) {
: match "dial 1234" {
: print "You enter the correct safe combination" ;
: done ; // Stops it from matching anything else
}
: print "Wrong Combo" ;
}
: else {
: print "Please type DIAL XXXX (where XXXX is a number)." ;
}
}
: else {
: print "Dial what?" ;
}
}
}
If I understand you correctly, try something like this:
: match "enter 1234" {
: if (is_safe_locked) {
: set_false "is_safe_locked";
: print "Click.";
: done;
}
: else {
: print "It's already unlocked.";
: done;
}
}
: match "enter _" {
: print "Nothing happens.";
}
}
Make sure the specific match comes before the general match. Obviously, you've got to do any other tests necessary such as making sure you're in the correct room.