Special Word Classes

From SCI Wiki
Jump to: navigation, search

By Gumby

Here are the words that utilize 'special' word classes (0x002, x004 & x008) in the vocab in the template game (I suppose we should check some of Sierra's games to make sure none have been missed). From the SCI specs, in the parser section, footnote 2:

The three special classes are apparently used for words with very specific semantics, such as "if", "not", "and" etc. It is unknown as of yet whether they receive special treatment by the parser.

Here are the ones known to us (note that class 0x002 is not referenced)

Word Word Class
and 004
but 004
if 004
nor 004
or 004
and 004
about 008
for 008
until 008
while 008
with 008
without 008

I believe that these words must be handled specially by the parser, otherwise why wouldn't they just have a 'compound' (or multiple) class like other words? Unless the 'special' moniker is just a subclass of a compound class - for example I was thinking that perhaps the 008 class could be a preposition/adjective class.

Examples:
take ball with stripes      // 'With' is an adjective (or noun)
dance with troll            // 'With' is a preposition

However, in my mind a word class of 050 would work just as well (010 (prep) + 040 (adj) = 050) - or if you like a class of 110 (010 (prep) + 100 (noun) = 110).

The 008 class (with, without, etc)

I ran across an oddity regarding the 008 class & articles. Note that in the below examples, an unmodified, 'stock' vocab was used from a template game, where 'with' was defined only with a 008 class (and 'the' is simply an article).

Code:
// works with any 008 word - 'cut boat with knife'
  (if(Said('cut/boat/knife'))
      Print("cut boat with knife OR cut boat without knife OR ...")		
  )	
 
// 'cut knife the boat' 
  (if(Said('cut/boat/knife'))
      Print("cut knife the boat")		
  )

Okay, I guess I'm good with that...

Code:
// works with 'with' only: 'cut boat with knife' - does not work with 'cut knife the boat'
  (if(Said('cut/boat/knife[<with]'))
      Print("cut boat with knife")		
  )
 
// works with 'cut knife the boat' - does not work with 'cut boat with knife'
  (if(Said('cut/boat/knife[<the]'))
      Print("cut knife the boat")		
  )

Interesting, we can limit that only 'the' or 'with' is to be used (optionally). Good!

Code:
// works with 'cut boat with knife'
  (if(Said('cut/boat/knife<with'))
      Print("cut boat with knife")		
  )
 
// 'cut knife the boat' - does NOT work!!
  (if(Said('cut/boat/knife<the'))
      Print("You should not see this output")		
  )

Whaaaat? I can't use 'the' in my said string explicitly? I suppose if you don't want 'with' to be used (or any other 008 classed word) & only 'the' to be used, you'll need to slap the optional brackets ('[' and ']') around it (see the 2nd code example).

The take-away from this (I suppose) is how to use 'with' correctly. It appears from my testing that it can only be used upon the 'suffix' part of the said string coupled with the semantic operator (<).