ID:154132
 
Three players are sitting in a cozy log-cabin tavern, with a fire burning and plenty of ale and beer flowing. It's a pretty rugged place outside of that, although the fluffy red rug underfoot adds a nice touch. The ceiling is low and the whole room just screams of cozyness.

The three players, two guys and a gal, are chatting, while the bartender humbly waits around delivering drinks to any who may desire them. The first guy, who's had way too much to drink, is taking a long look at the gal who gets prettier with every sip. Somehow he gets it into his head that he's going to give her a big fat smooch. So here's what happens.

The first guy types, "kiss gal".

The gal is alerted to this with the message, "The first guy would like to kiss you, accept or decline?"

She's not that drunk. Besides, the second guy is watching, and he's her roleplayed sweetheart. "Decline".

The result, she pushes him away as he advances, and nothing happens. However, in an alternative scenario, she's also quite drunk, and kissing this attractive fellow doesn't sound all that bad. "Accept", she types. Next thing you know they're tied up in each other's arms in a brief fit of passion, then they're done. The second guy looking on, trying to figure out how drunk they really are.

So now, since this little scenario is all done, I'd like some thoughts on what you think the best way to setup an accept/decline system would be? Keep in mind, it needs to consider things such as if she happens to leave the room instead of accepting or declining, or maybe he attempts to kiss then leaves the room before she can accept or decline.
...Thief. ;-P
In response to Spuzzum
Actually the idea is used in a lot of MUDs, not just yours :oP Yours just has the nifty clickable version.
I think the best way to go would be to make the accept/decline choices commands/verbs instead of using the general input command. Maybe something like this:

// Not really sure if any of this will work right into
// the compiler since I haven't tried it.
mob
proc
AcceptKiss(mob/m)
if(m in view())
view() << "[m] kisses [src]."
else
src << "[m] is no longer near you."
DeclineKiss(mob/m)
if(m in view())
view() << "[m] tries to kiss [src]."
else
src << "[m] is no longer near you."
verb
Kiss(mob/m in view())
src << "Waiting for [m] to respond."
m.Query("[src] wants to kiss you.","AcceptKiss","DeclineKiss",list(src))

// System
mob
var
qryAccept
qryDecline
qryCurrent
qryArgs
proc/Query(question,accept,decline,qryargs)
if(qryCurrent) return
src << "[question] (accept/decline)"
qryCurrent = 1
qryAccept = accept
qryDecline = decline
qryArgs = qryargs
verb/Accept()
if(qryCurrent)
qryCurrent = null
call(src,qryAccept)(qryargs)
else
usr << "Accept what?"
verb/Decline()
if(qryCurrent)
qryCurrent = null
call(src,qryDecline)(qryargs)
else
usr << "Decline what?"




A system like this allows for other commands to be typed while the question is asked, so it is possible to leave the room before the other can respond to the query, etc. This can be further improved to have time limits and handle arguements more efficiently. Anyway, im gonna go test that out now.


In response to Ebonshadow
// Updated version that works.
mob
proc
AcceptKiss(mob/m)
if(m in view())
view() << "[m] kisses [src]."
else
src << "[m] is no longer near you."
DeclineKiss(mob/m)
if(m in view())
view() << "[m] tries to kiss [src]."
else
src << "[m] is no longer near you."
verb
Kiss(mob/m in view())
src << "Waiting for [m] to respond."
m.Query("[src] wants to kiss you.","AcceptKiss","DeclineKiss",list(src))

// System
mob
var
qryAccept
qryDecline
qryCurrent
qryArgs
proc/Query(question,accept,decline,qryargs)
if(qryCurrent) return
src << "[question] (accept/decline)"
qryCurrent = 1
qryAccept = accept
qryDecline = decline
qryArgs = qryargs
if(!client) call(src,qryAccept)(arglist(qryArgs))
verbs += /mob/proc/Accept
verbs += /mob/proc/Decline
proc/Accept()
if(qryCurrent)
qryCurrent = null
call(src,qryAccept)(arglist(qryArgs))
else
usr << "Accept what?"
verbs -= /mob/proc/Accept
verbs -= /mob/proc/Decline
proc/Decline()
if(qryCurrent)
qryCurrent = null
call(src,qryDecline)(arglist(qryArgs))
else
usr << "Decline what?"
verbs -= /mob/proc/Accept
verbs -= /mob/proc/Decline
Bizzarely, I just coded accept/decline into Cerulea the other day, though it was for the "give" verb.

I used something I call "effects," which are datums (data) that have variables to hold info about the effect. Each mob has an effects list. The give verb basically creates an effect in the list of the giver and possible accepter, and the accept and decline verbs check for the existence of and variables of the particular effects, and also for whether people are in the room or not. These effects have a proc that causes them to expire after 30 seconds if they're still around.

Z
SI this from the chat we had in Flick's chatroom?
In response to JordanUl
SI this from the chat we had in Flick's chatroom?

The chat in there was from this, actually. =P
In response to Zilal
That's very similar to the way I did it in Tanks. Each player has a list of queries. Each query is either "gunner [mob name]" or "team [team color]". The accept verb is declared as

accept(A as anything in acceptlist)

The proc that starts the query also times it, gives reminders, and removes the query if the player does not accept in time. It would be a simple matter to make a matching decline verb and clickable links in the text box.
In response to Spuzzum
Oh last time I was there there was no accept/decline system for it.
In response to JordanUl
JordanUl wrote:
Oh last time I was there there was no accept/decline system for it.

He meant the scenario...I think.
In response to Shadowdarke
Shadowdarke wrote:
That's very similar to the way I did it in Tanks. Each player has a list of queries. Each query is either "gunner [mob name]" or "team [team color]". The accept verb is declared as

accept(A as anything in acceptlist)

Hey, that's cool.