Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Garry's suggestion is good.

I documented a different workaround here, which will let you dynamically include (or exclude) choices based on the state of the game. It's a bit wordy, but it should work fine in 8-bit compatibility mode.

start_at = hut
locations {
   hut : location "You are in a hut.";
   
   // The location is just for displaying choices.
   // As these are all dynamic, there is no location text.
   choice_dialog_1 : location "";
}
objects {
   // The breadcrumb is used as a marker for the location to return to (at the end of choices)
   breadcrumb : object "a breadcrumb" ;
   man        : scenery "a man" start_at = "hut" ;
}
integers {
   // Used to track how many choices are available.
   // Always add a failsafe choice to return to the breadcrumb
   num_choices_displayed : integer "0" ;
}
booleans {
   
   display_choice_rhino : boolean "true" ;
   display_choice_aardvark : boolean "true" ;
   display_choice_sorcerer : boolean "true" ;
   
}
on_describe {
   // To let the 'player' how to select choices.
   // You can trigger choices however you like in your
   // own game.
   
   : if (is_present "man") {
      : print "Type CHOICES says the man." ;
   }
   
   // If at the choice dummy location 'choice_dialog_1'
   // Then show the context of the question, and the choices
   // available.
   
   : if (is_at "choice_dialog_1") {
      : set_integer var = "num_choices_displayed" value = "0" ;
      
      : print "The man says ... make your choices ...";
      
      : if (display_choice_rhino) {
          : increment "num_choices_displayed";
          : print "Type 'rhino' to do something.";
      }
      : if (display_choice_aardvark) {
         : increment "num_choices_displayed";
         : print "Type 'aardvark' to do something.";
      }
      : if (display_choice_sorcerer) {
          : increment "num_choices_displayed";
          : print "Type 'sorcerer' to do something.";
      }
      
      // Always add a failsafe choice to return to the breadcrumb
      : if (num_choices_displayed == 0) {
         : print "No more choices remain. Type 'return' to leave the choice selection dialog.";
      }
   }
}
on_command {
   
   : match "choices _"  {
      // Creates the breadcrumb object in the current location.
      : create "breadcrumb" ;
      : goto "choice_dialog_1" ;
      : redescribe;
      
   }
   
   // NOTE: You can't put an 'if' directly underneath 'on_command'
   //       in 8-bit compatibility mode.
   
   // All choices need to be placed at top level of the on_command block
   // This isn't perfect, but it is all that is available for now.
   // I'll work on local on_command handlers at location level which should tidy this up a bit.
   
   : match "rhino _"  {
      // Always have to duplicate the logic
      // from the choice display section (on_describe)
      : if (is_at "choice_dialog_1" && display_choice_rhino) {
         : set_false "display_choice_rhino" ; // Removes the choice dynamically
         : print "You chose rhino (rhino will no longer be a choice)." ;
         : press_any_key ;
         : gosub "return_to_breadcrumb" ;
      }
   }
   
   : match "aardvark _"  {
      : if (is_at "choice_dialog_1" && display_choice_aardvark) {
         : set_false "display_choice_aardvark" ; // Removes the choice dynamically
         : print "You chose aardvark (aardvark will no longer be a choice).";
         : press_any_key ;
         : gosub "return_to_breadcrumb" ;
      }
   }
   : match "sorcerer _"  {
      : if (is_at "choice_dialog_1" && display_choice_sorcerer) {
         : set_false "display_choice_sorcerer" ; // Removes the choice dynamically
         : print "You chose sorcerer (sorcerer will no longer be a choice)." ;
         : press_any_key ;
         : gosub "return_to_breadcrumb" ;
      }
   }
   
   : match "return _"  {
      // Always add a failsafe choice to return to the breadcrumb
      : if (is_at "choice_dialog_1" && num_choices_displayed == 0) {
         : gosub "return_to_breadcrumb";
      }
   }
}
subroutines {
   return_to_breadcrumb : subroutine {
      : goto "breadcrumb" ;
      : destroy "breadcrumb" ;
      : redescribe;
   }
}