Inform - Support - Source

Back to List

Inventory
Complete

Backward
Forward

Plain
Coloured
Gaudy

This code
in plain text

Browsing parserm.h

ActionPrimitive (lines 3629-3933)

3629  !  End of the parser proper: the remaining routines are its front end.
3630  ! ----------------------------------------------------------------------------
3631   
3632  Object InformLibrary "(Inform Library)"
3633    with play
3634         [ i j k l;
3635         standard_interpreter = $32-->0;
3636         transcript_mode = ((0-->8) & 1);
3637         ChangeDefault(cant_go, CANTGO__TX);
3638   
3639         buffer->0 = 120;
3640         buffer2->0 = 120;
3641         buffer3->0 = 120;
3642         parse->0 = 64;
3643         parse2->0 = 64;
3644         
3645         real_location = thedark;
3646         player = selfobj; actor = player;
3647      
3648         top_object = #largest_object-255;
3649         selfobj.capacity = MAX_CARRIED;
3650         #ifdef LanguageInitialise;
3651         LanguageInitialise();
3652         #endif;
3653         new_line;
3654         j=Initialise();
3655         last_score = score;
3656         move player to location;
3657         while (parent(location)~=0) location=parent(location);
3658         real_location = location;
3659         objectloop (i in player) give i moved ~concealed;
3660      
3661         if (j~=2) Banner();
3662   
3663         MoveFloatingObjects();
3664         lightflag=OffersLight(parent(player));
3665         if (lightflag==0) { real_location=location; location=thedark; }
3666         <Look>;
3667      
3668         for (i=1:i<=100:i++) j=random(i);
3669   
3670         #ifdef EnglishNaturalLanguage;
3671         old_itobj = itobj; old_himobj = himobj; old_herobj = herobj;
3672         #endif;
3673      
3674         while (~~deadflag)
3675         {   
3676             #ifdef EnglishNaturalLanguage;
3677                 PronounOldEnglish();
3678                 old_itobj = PronounValue('it');
3679                 old_himobj = PronounValue('him');
3680                 old_herobj = PronounValue('her');
3681             #endif;
3682   
3683             .very__late__error;
3684   
3685             if (score ~= last_score)
3686             {   if (notify_mode==1) NotifyTheScore(); last_score=score; }
3687   
3688             .late__error;
3689   
3690             inputobjs-->0 = 0; inputobjs-->1 = 0;
3691             inputobjs-->2 = 0; inputobjs-->3 = 0; meta=false;
3692      
3693             !  The Parser writes its results into inputobjs and meta,
3694             !  a flag indicating a "meta-verb".  This can only be set for
3695             !  commands by the player, not for orders to others.
3696      
3697             InformParser.parse_input(inputobjs);
3698      
3699             action=inputobjs-->0;
3700   
3701             !  --------------------------------------------------------------
3702   
3703             !  Reverse "give fred biscuit" into "give biscuit to fred"
3704      
3705             if (action==##GiveR or ##ShowR)
3706             {   i=inputobjs-->2; inputobjs-->2=inputobjs-->3; inputobjs-->3=i;
3707                 if (action==##GiveR) action=##Give; else action=##Show;
3708             }
3709      
3710             !  Convert "P, tell me about X" to "ask P about X"
3711      
3712             if (action==##Tell && inputobjs-->2==player && actor~=player)
3713             {   inputobjs-->2=actor; actor=player; action=##Ask;
3714             }
3715      
3716             !  Convert "ask P for X" to "P, give X to me"
3717      
3718             if (action==##AskFor && inputobjs-->2~=player && actor==player)
3719             {   actor=inputobjs-->2; inputobjs-->2=inputobjs-->3;
3720                 inputobjs-->3=player; action=##Give;
3721             }
3722      
3723             !  For old, obsolete code: special_word contains the topic word
3724             !  in conversation
3725      
3726             if (action==##Ask or ##Tell or ##Answer)
3727                 special_word = special_number1;
3728   
3729             !  --------------------------------------------------------------
3730      
3731             multiflag=false; onotheld_mode=notheld_mode; notheld_mode=false;
3732             !  For implicit taking and multiple object detection
3733      
3734            .begin__action;
3735             inp1 = 0; inp2 = 0; i=inputobjs-->1;
3736             if (i>=1) inp1=inputobjs-->2;
3737             if (i>=2) inp2=inputobjs-->3;
3738      
3739             !  inp1 and inp2 hold: object numbers, or 0 for "multiple object",
3740             !  or 1 for "a number or dictionary address"
3741      
3742             if (inp1 == 1) noun = special_number1; else noun = inp1;
3743             if (inp2 == 1)
3744             {   if (inp1 == 1) second = special_number2;
3745                 else second = special_number1;
3746             } else second = inp2;
3747   
3748             !  --------------------------------------------------------------
3749      
3750             if (actor~=player)
3751             {   
3752             !  The player's "orders" property can refuse to allow conversation
3753             !  here, by returning true.  If not, the order is sent to the
3754             !  other person's "orders" property.  If that also returns false,
3755             !  then: if it was a misunderstood command anyway, it is converted
3756             !  to an Answer action (thus "floyd, grrr" ends up as
3757             !  "say grrr to floyd").  If it was a good command, it is finally
3758             !  offered to the Order: part of the other person's "life"
3759             !  property, the old-fashioned way of dealing with conversation.
3760      
3761                 j=RunRoutines(player,orders);
3762                 if (j==0)
3763                 {   j=RunRoutines(actor,orders);
3764                     if (j==0)
3765                     {   if (action==##NotUnderstood)
3766                         {   inputobjs-->3=actor; actor=player; action=##Answer;
3767                             jump begin__action;
3768                         }
3769                         if (RunLife(actor,##Order)==0) L__M(##Order,1,actor);
3770                     }
3771                 }
3772                 jump turn__end;
3773             }
3774   
3775             !  --------------------------------------------------------------
3776             !  Generate the action...
3777   
3778             if ((i==0)
3779                 || (i==1 && inp1 ~= 0)
3780                 || (i==2 && inp1 ~= 0 && inp2 ~= 0))
3781             {   self.begin_action(action, noun, second, 0);
3782                 jump turn__end;
3783             }
3784   
3785             !  ...unless a multiple object must be substituted.  First:
3786             !  (a) check the multiple list isn't empty;
3787             !  (b) warn the player if it has been cut short because too long;
3788             !  (c) generate a sequence of actions from the list
3789             !      (stopping in the event of death or movement away).
3790   
3791             multiflag = true;
3792             j=multiple_object-->0;
3793             if (j==0) { L__M(##Miscellany,2); jump late__error; }
3794             if (toomany_flag)
3795             {   toomany_flag = false; L__M(##Miscellany,1); }
3796             i=location;
3797             for (k=1:k<=j:k++)
3798             {   if (deadflag) break;
3799                 if (location ~= i)
3800                 {   L__M(##Miscellany, 51);
3801                     break;
3802                 }
3803                 l = multiple_object-->k;
3804                 PronounNotice(l);
3805                 print (name) l, ": ";
3806                 if (inp1 == 0)
3807                 {   inp1 = l; self.begin_action(action, l, second, 0); inp1 = 0;
3808                 }
3809                 else
3810                 {   inp2 = l; self.begin_action(action, noun, l, 0); inp2 = 0;
3811                 }
3812             }
3813   
3814             !  --------------------------------------------------------------
3815      
3816             .turn__end;
3817      
3818             !  No time passes if either (i) the verb was meta, or
3819             !  (ii) we've only had the implicit take before the "real"
3820             !  action to follow.
3821      
3822             if (notheld_mode==1) { NoteObjectAcquisitions(); continue; }
3823             if (meta) continue;
3824             if (~~deadflag) self.end_turn_sequence();
3825         }
3826   
3827             if (deadflag~=2) AfterLife();
3828             if (deadflag==0) jump very__late__error;
3829      
3830             print "^^    ";
3831             #IFV5; style bold; #ENDIF;
3832             print "***";
3833             if (deadflag==1) L__M(##Miscellany,3);
3834             if (deadflag==2) L__M(##Miscellany,4);
3835             if (deadflag>2)  { print " "; DeathMessage(); print " "; }
3836             print "***";
3837             #IFV5; style roman; #ENDIF;
3838             print "^^^";
3839             ScoreSub();
3840             DisplayStatus();
3841             AfterGameOver();
3842         ],
3843   
3844         end_turn_sequence
3845         [ i j;
3846   
3847             turns++;
3848             if (the_time~=NULL)
3849             {   if (time_rate>=0) the_time=the_time+time_rate;
3850                 else
3851                 {   time_step--;
3852                     if (time_step==0)
3853                     {   the_time++;
3854                         time_step = -time_rate;
3855                     }
3856                 }
3857                 the_time=the_time % 1440;
3858             }
3859   
3860             #IFDEF DEBUG;
3861             if (debug_flag & 4 ~= 0)
3862             {   for (i=0: i<active_timers: i++)
3863                 {   j=the_timers-->i;
3864                     if (j~=0)
3865                     {   print (name) (j&$7fff), ": ";
3866                         if (j & $8000) print "daemon";
3867                         else
3868                         {   print "timer with ",
3869                                   j.time_left, " turns to go"; }
3870                         new_line;
3871                     }
3872                 }
3873             }
3874             #ENDIF;
3875   
3876             for (i=0: i<active_timers: i++)
3877             {   if (deadflag) return;
3878                 j=the_timers-->i;
3879                 if (j~=0)
3880                 {   if (j & $8000) RunRoutines(j&$7fff,daemon);
3881                     else
3882                     {   if (j.time_left==0)
3883                         {   StopTimer(j);
3884                             RunRoutines(j,time_out);
3885                         }
3886                         else
3887                             j.time_left=j.time_left-1;
3888                     }
3889                 }
3890             }
3891             if (deadflag) return;
3892   
3893             scope_reason=EACH_TURN_REASON; verb_word=0;
3894             DoScopeAction(location);
3895             SearchScope(ScopeCeiling(player), player, 0);
3896             scope_reason=PARSING_REASON;
3897   
3898             if (deadflag) return;
3899   
3900             TimePasses();
3901   
3902             if (deadflag) return;
3903   
3904             AdjustLight();
3905   
3906             if (deadflag) return;
3907   
3908             NoteObjectAcquisitions();
3909         ],
3910   
3911         begin_action
3912         [ a n s source   sa sn ss;
3913             sa = action; sn = noun; ss = second;
3914             action = a; noun = n; second = s;
3915             #IFDEF DEBUG;
3916             if (debug_flag & 2 ~= 0) TraceAction(source);
3917             #IFNOT;
3918             source = 0;
3919             #ENDIF;
3920             #IFTRUE Grammar__Version == 1;
3921             if ((meta || BeforeRoutines()==false) && action<256)
3922                 ActionPrimitive();
3923             #IFNOT;
3924             if ((meta || BeforeRoutines()==false) && action<4096)
3925                 ActionPrimitive();
3926             #ENDIF;
3927             action = sa; noun = sn; second = ss;
3928         ],
3929    has  proper;
3930   
3931  [ ActionPrimitive;
3932    indirect(#actions_table-->action);
3933  ];


Last updated 27 February 2004. This web site has not been fully supported since April 2008. Information may be out of date. This page was originally managed by Graham Nelson (graham@gnelson.demon.co.uk) assisted by C Knight.