GENWiki

Premier IT Outsourcing and Support Services within the UK

User Tools

Site Tools


archive:internet:muf.exa

This first program checks the contents in a room and assembles a string which is an english description of the contents. For example, for

Contents: a bell a book it would print: a bell, a book, and a candle. a candle

Contents: Huey it would print: Huey and Dewey Dewey

Contents: it would print: an apple an apple

If there is nothing in the room, it will print "nothing."

(english-list) (3 vars) ( list – s ) ( ) ( list is a list of dbrefs with an integer on ) ( top [a la 'contents']; s is an English ) ( string describing said contents. ) ( )

var manysofar var howmany var accumulate : itemprelist

      dup 0 = if pop exit then	   (check to see if we're done.     )
      swap                     
      manysofar @ 1 +    manysofar !     (count how many items we've seen.)
      name
      ", "                           
      manysofar @ howmany @ 1 - = if     (separate items with a comma,    )
              pop ", and " then          (unless there are only two or it )
      howmany @ 1 = if pop " " then      (is the last item in the list.   )
      howmany @ 2 = if pop " and " then
      manysofar @ howmany @ = if
              pop "." then               (end with a period.              )
      strcat accumulate @ swap strcat
        accumulate !                     (add the text to the new string. )
      1 - itemprelist                    (if not done, loop around.       )

; : itemlist

      dup howmany !     (howmany is the number of items in the list       ) 
      0 manysofar !     (manysofar is how many we've counted; initialize. )
      "" accumulate !
      itemprelist       (do the loop that concats the item names together.)
      accumulate @
        "" strcmp if    (return the value of accumulate, or "nothing' if  )
          accumulate @  (we didn't find anything in the room.             )
        then "nothing."

;

(The next part actually puts the above program to use.)

: show-contents-in-English

  me @
    "In this room, you see "
      loc @ contents     (get the list to pass to the function.            )
      itemlist pop           
    strcat
  notify

;

The next two are simple shortcuts to see if a player is male or female.

( male ) ( d – i ) ( d is the player's dbref, i is a boolean. ) ( ) : male

  "sex" getpropstr "male" strcmp
    if 0 exit then 1

;

( female ) ( d – i ) ( d is the player's dbref, i is a boolean. ) ( ) : female

  "sex" getpropstr "female" strcmp
    if 0 exit then 1

;

This next is a little search-and-replace hack.

( search-and-replace ) (3 vars) ( s1 s2 s3 – s ) ( ) ( Searches through s1 for all occurences of ) ( word s3 and replaces them with s2. Only ) ( occurences which stand alone [are bordered ) ( by spaces on both sides] are detected. ) ( Not case sensitive. ) ( Right now it's a bit tacky since it will ) ( miss words ending in punctuation; for this ) ( we need a strncmp primitive. ) ( ) var recurse var old_word var new_word : dostuff

  recurse @ 2 < if exit then     (       If we're done, exit.             )
  swap
  dup
    old_word @ stringcmp not     (If the word we're looking at now matches) 
      if pop new_word @ then     (the word we're looking for, pop it and  )
  " " swap strcat strcat         (replace with new_word.                  )
                                 (Concatenate whatever still happens to be)
                                 (there back onto the string we're re-    )
                                 (constructing.                           )
  recurse @ 1 - recurse !        (Update our recursion counter.           )
  dostuff                        (Loop back and continue.                 )

; : search-and-replace

  old_word !               (Set old_word and new_word to the parameters   )
  new_word !               (we were passed.                               )
  " " explode              (Explode the string we were passed [separate it)
  recurse !                ( into words] for the loop to use.             )
  dostuff                  (Do the loop.                                  )

;

                  (Written by Stinglai)

The next is an update [more readable, even] of the old one-armed bandit routine.

: abs ( i – i ) (absolute value)

 dup
   0 < if -1 * then

; : amt ( – i ) (random number between -100 and 100.)

  random 21 %
  10 -
  10 *

; : give ( d – )

  me @ swap addpennies          (give the player some pennies)

; : msg ( i s – d s )

  swap
  abs intostr " pennies!"       (make tail half of the message)
    strcat strcat
  me @ swap

; : winlose

  dup
    dup
      abs = dup             (is the number we got = to its absolute  )
    if pop "win" exit       (value?  i.e., is it positive?           )
    then not if "lose" then

; (send the right message accordingly. ) : tell

  dup
    winlose "You " swap     (print "You [win/lose] x pennies!"       )
      strcat " " strcat
      msg notify

; : announce

  dup
    loc @ swap me @ swap 
             notify         (Tell the player what happened.          )
    loc @ swap me @ swap
       notify_except        (Tell everyone else what happened.       )

; : pull

  amt tell announce give    (Main prog.)

;

                 (Written by WhiteRabbit)
/data/webs/external/dokuwiki/data/pages/archive/internet/muf.exa.txt · Last modified: 2000/11/18 16:51 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki