! -------------------------------------------------------------------------
! torch.h
!
! Copyright 2004 David Griffith <[email protected]>
! Use this code freely, but don't claim you wrote it.  Give proper
! attributions.
!
! This code allows one to simulate torches (the flaming, wooden kind).
! One can have good ones (ready to be ignited), burning ones, and
! burned-out ones.
!
!
! Include this file sometime after VerbLib.
!
!
! Somewhere at the beginning of your code, you'll need to set the
! following constants:
!
! Constant TORCH_COUNT = 18;    ! how many torches in the game
! Constant TORCH_VARIANCE = 7;  ! some randomness
! Constant TORCH_LIFE = 50;     ! how many moves a torch will last
! Constant TORCH_DECLINE = 5;   ! torch starts sputtering
! Constant TORCH_DYING = 1;     ! torch is about to go out
!
! Here is a handy way to give the player a burning torch at the
! begining of the game.  Use it in the Initialize() function.
!
!       move players_torch to player;
!       players_torch.power = TORCH_LIFE;
!       StartDaemon(players_torch);
!
! Make sure that you've actually created players_torch somewhere outside
! of the functions.  Do it like this:
!
!       BurningTorch players_torch;
!
! Now, when you want to have some torches sitting around for the player
! to pick up, do this:
!
!       UnlitTorch ->;
!
! That will create one unlit torch.  When picked up, the game will
! respond with "You pull the unlit torch off the wall".  Similarly, you
! can use "BurningTorch ->;" to have a burning torch stuck on a wall.
! The same goes for a dead torch.  Count up all the times you do this
! and put that number as TORCH_COUNT (see above).
!
! You shouldn't need to modify anything below this point.  If you do,
! please let me know why and how you modified the code.


Class Torch
       with name "torch",
       power,
       parse_name [ i j w;
               if (parser_action == ##TheSame) {
                       if ((parser_one.&name)-->0 == (parser_two.&name)-->0) {
                               return -1;
                       }
                       return -2;
               }
               w = (self.&name)-->0;
               for (:: i++) {
                       j = NextWord();
                       if (j == 'torches') parser_action=##PluralFound;
                       else if (j~='torch' or w) return i;
               }
       ],
       daemon [ t newthing i;
               t = --(self.power);
               if (t == 0) {
                       give self ~on ~light;
                       newthing = DeadTorch.create();
                       give newthing moved;
                       move newthing to parent(self);
                       remove self;
               }
               if (self in player || self in location) {
                       objectloop (i in player) {
                               if (i ofclass BurningTorch) {
                                       if (i.power > TORCH_DECLINE)
                                               rtrue;
                               }
                       }
                       if (t == TORCH_DECLINE + 1)
                               "^Your torch is beginning to flicker.";
                       if (t <= TORCH_DECLINE && t > TORCH_DYING)
                               "^Your torch is flickering and sputtering.";
                       if (t <= TORCH_DYING && t > 0)
                               "^Your torch is going out.";
                       if (t == 0)
                               "^Your torch goes out with a fizzle.";
               }
       ],
       before [newthing;
       Smell:
               print "It smells like ";
               if (self ofclass UnlitTorch)
                       "oil and dirt.";
               if (self ofclass BurningTorch)
                       "burning oil and dirt.";
               if (self ofclass DeadTorch)
                       "oily soot.";
               "Error in Torch class (Smell)^";
       Examine:
               if (self ofclass UnlitTorch)
                       "It's a torch. An oil-soaked rag is wrapped around it.";
               if (self ofclass DeadTorch)
                       "It's a burned out and useless torch.";
               if (self ofclass BurningTorch) {
                       print "The torch throws ";
                       if (self.power < TORCH_DECLINE) {
                               print "feeble";
                       } else {
                               print "dancing";
                       }
                       print " shadows about the place.";
               }
               "Error in Torch class (Examine)^";
       Burn:
               if (second ~= nothing) {
                       if (second hasnt on)
                               "You can't burn ", (the) self, " with ", (the)
                               second, ".";
               }
               if (self has on) "But it's already lit!";
               <<SwitchOn self second>>;
       SwitchOff:
               if (verb_word == 'turn' or 'switch')
                       "Perhaps snuffing the torch would be more useful.";
               if (self ofclass UnlitTorch or DeadTorch)
                       "But it's not burning.";
               if (self ofclass BurningTorch) {
                       newthing = DeadTorch.create();
                       move newthing to parent(self);
                       give newthing moved;
                       remove self;
                       "You snuff out the torch.";
               }
               "Error in Torch class (SwitchOff)^";
       ],

       after [newthing;
       Take:
               if (self hasnt moved)
                       "You pull ", (the) noun, " off the wall.";

       SwitchOn:
               if (second == nothing) {
                       give self ~on;
                       "Perhaps lighting the torch with something
                       would be more useful.";
               }
               if (self ofclass UnlitTorch) {
                       newthing = BurningTorch.create();
                       if (newthing == nothing) {
                               "Programming error!
                               Can't light the torch.";
                       }
                       move newthing to parent(self);
                       newthing.power = TORCH_LIFE + random(TORCH_VARIANCE);
                       remove self;
                       StartDaemon(newthing);
                       "The torch burns brightly.";
               }
               if (self ofclass BurningTorch)
                       "But it's already burning.";
               if (self ofclass DeadTorch) {
                       give self ~on;
                       "The dead torch sputters a bit, but
                               refuses to light.";
               }
               "Error in Torch class (SwitchOn)^";
       ],
       has switchable float;


Class UnlitTorch (TORCH_COUNT)
       class Torch
       with name "unlit" "good" "torch",
       short_name "unlit torch",
       plural "unlit torches";

Class BurningTorch (TORCH_COUNT)
       class Torch
       with name "burning" "torch",
       short_name "burning torch",
       plural "burning torches",
       has on light;

Class DeadTorch (TORCH_COUNT)
       class Torch
       with name "dead" "bad" "torch",
       short_name "dead torch",
       plural "dead torches";