Adventuron's solution prints the get and drop response, but it doesn't seem to refresh the screen - at least not in my game. If you want something a bit more polished, try this:
booleans { is_refresh : boolean "false"; } on_command { : match "get -" { : print {(camel(original_verb()) + " what?")} : done; } : match "get *" { : if (is_beside (s1())) { : get quiet = "true"; : set_string var = "message" text = "Taken."; : gosub "refresh"; } } : match "drop -" { : print {(camel(original_verb()) + " what?")} : done; } : match "drop *" { : if (is_carried (s1()) && !is_worn (s1())) { : drop quiet = "true"; : set_string var = "message" text = "Dropped."; : gosub "refresh"; } } } on_describe { : if (is_refresh) { : set_false "is_refresh"; : print {(message)}; } } subroutines { refresh : subroutine { : set_true "is_refresh"; : redescribe; } }
The idea is that rather than printing a message, you put the message in a string and call a subroutine. The subroutine sets a flag and does a redescribe. You can't do anything after redescribe, so you test the flag in on_describe. If the flag is set, you clear it (for next time around) and print the string. Works like a charm.