unit AGIcommands;

// This is the command unit from AGI Studio. It is written in Delphi. It
// will probably compile under other versions of Pascal. It is based on
// AGICODES.H.

interface

const
      atNum = 0;
      atVar = 1;
      atFlag = 2;
      atMsg = 3;
      atSObj = 4;
      atIObj = 5;
      atStr = 6;
      atWord = 7;
      atCtrl = 8;

      ArgTypePrefix : array[0..8] of string[2] = ('','v','f','m','o','i','s','w','c');
      ArgTypeName : array[0..8] of string = ('number','var','flag','message','object',
                                             'inventory item','string','word','controller');

type CommandStruct = record
                       Name : string;
                       numArgs : byte;
                       argTypes : array[1..7] of byte;
                      end;

const NumTestCommands : byte = 18;
      NumAGICommands  : byte = 181;  // not counting return()

const TestCommand : array[1..18] of CommandStruct =
  ((Name:'equaln'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
   (Name:'equalv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
   (Name:'lessn'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
   (Name:'lessv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
   (Name:'greatern'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
   (Name:'greaterv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
   (Name:'isset'; numArgs: 1; argTypes:(atFlag,0,0,0,0,0,0)),
   (Name:'issetv'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
   (Name:'has'; numArgs: 1; argTypes:(atIObj,0,0,0,0,0,0)),
   (Name:'obj.in.room'; numArgs: 2; argTypes:(atIObj,atVar,0,0,0,0,0)),
   (Name:'posn'; numArgs: 5; argTypes:(atSObj,atNum,atNum,atNum,atNum,0,0)),
   (Name:'controller'; numArgs: 1; argTypes:(atCtrl,0,0,0,0,0,0)),
   (Name:'have.key'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
   (Name:'said'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),  // special command so we don't need to set the right argument types for it
   (Name:'compare.strings'; numArgs: 2; argTypes:(atStr,atStr,0,0,0,0,0)),
   (Name:'obj.in.box'; numArgs: 5; argTypes:(atSObj,atNum,atNum,atNum,atNum,0,0)),
   (Name:'center.posn'; numArgs: 5; argTypes:(atSObj,atNum,atNum,atNum,atNum,0,0)),
   (Name:'right.posn'; numArgs: 5; argTypes:(atSObj,atNum,atNum,atNum,atNum,0,0)));

const AGICommand : array[0..181] of CommandStruct =
((Name:'return'; numArgs: 0),
 (Name:'increment'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'decrement'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'assignn'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'assignv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'addn'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'addv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'subn'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'subv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'lindirectv'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'rindirect'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'lindirectn'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'set'; numArgs: 1; argTypes:(atFlag,0,0,0,0,0,0)),
 (Name:'reset'; numArgs: 1; argTypes:(atFlag,0,0,0,0,0,0)),
 (Name:'toggle'; numArgs: 1; argTypes:(atFlag,0,0,0,0,0,0)),
 (Name:'set.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'reset.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'toggle.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'new.room'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'new.room.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'load.logics'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'load.logics.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'call'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'call.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'load.pic'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'draw.pic'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'show.pic'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'discard.pic'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'overlay.pic'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'show.pri.screen'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'load.view'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'load.view.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'discard.view'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'animate.obj'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'unanimate.all'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'draw'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'erase'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'position'; numArgs: 3; argTypes:(atSObj,atNum,atNum,0,0,0,0)),
 (Name:'position.v'; numArgs: 3; argTypes:(atSObj,atVar,atVar,0,0,0,0)),
 (Name:'get.posn'; numArgs: 3; argTypes:(atSObj,atVar,atVar,0,0,0,0)),
 (Name:'reposition'; numArgs: 3; argTypes:(atSObj,atVar,atVar,0,0,0,0)),
 (Name:'set.view'; numArgs: 2; argTypes:(atSObj,atNum,0,0,0,0,0)),
 (Name:'set.view.v'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'set.loop'; numArgs: 2; argTypes:(atSObj,atNum,0,0,0,0,0)),
 (Name:'set.loop.v'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'fix.loop'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'release.loop'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'set.cel'; numArgs: 2; argTypes:(atSObj,atNum,0,0,0,0,0)),
 (Name:'set.cel.v'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'last.cel'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'current.cel'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'current.loop'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'current.view'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'number.of.loops'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'set.priority'; numArgs: 2; argTypes:(atSObj,atNum,0,0,0,0,0)),
 (Name:'set.priority.v'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'release.priority'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'get.priority'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'stop.update'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'start.update'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'force.update'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'ignore.horizon'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'observe.horizon'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'set.horizon'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'object.on.water'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'object.on.land'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'object.on.anything'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'ignore.objs'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'observe.objs'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'distance'; numArgs: 3; argTypes:(atSObj,atSObj,atVar,0,0,0,0)),
 (Name:'stop.cycling'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'start.cycling'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'normal.cycle'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'end.of.loop'; numArgs: 2; argTypes:(atSObj,atFlag,0,0,0,0,0)),
 (Name:'reverse.cycle'; numArgs:1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'reverse.loop'; numArgs: 2; argTypes:(atSObj,atFlag,0,0,0,0,0)),
 (Name:'cycle.time'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'stop.motion'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'start.motion'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'step.size'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'step.time'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'move.obj'; numArgs: 5; argTypes:(atSObj,atNum,atNum,atNum,atFlag,0,0)),
 (Name:'move.obj.v'; numArgs: 5; argTypes:(atSObj,atVar,atVar,atNum,atFlag,0,0)),
 (Name:'follow.ego'; numArgs: 3; argTypes:(atSObj,atNum,atFlag,0,0,0,0)),
 (Name:'wander'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'normal.motion'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'set.dir'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'get.dir'; numArgs: 2; argTypes:(atSObj,atVar,0,0,0,0,0)),
 (Name:'ignore.blocks'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'observe.blocks'; numArgs: 1; argTypes:(atSObj,0,0,0,0,0,0)),
 (Name:'block'; numArgs: 4; argTypes:(atNum,atNum,atNum,atNum,0,0,0)),
 (Name:'unblock'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'get'; numArgs: 1; argTypes:(atIObj,0,0,0,0,0,0)),
 (Name:'get.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'drop'; numArgs: 1; argTypes:(atIObj,0,0,0,0,0,0)),
 (Name:'put'; numArgs: 2; argTypes:(atIObj,atVar,0,0,0,0,0)),
 (Name:'put.v'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'get.room.v'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'load.sound'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'sound'; numArgs: 2; argTypes:(atNum,atFlag,0,0,0,0,0)),
 (Name:'stop.sound'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'print'; numArgs: 1; argTypes:(atMsg,0,0,0,0,0,0)),
 (Name:'print.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'display'; numArgs: 3; argTypes:(atNum,atNum,atMsg,0,0,0,0)),
 (Name:'display.v'; numArgs: 3; argTypes:(atVar,atVar,atVar,0,0,0,0)),
 (Name:'clear.lines'; numArgs: 3; argTypes:(atNum,atNum,atNum,0,0,0,0)),
 (Name:'text.screen'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'graphics'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'set.cursor.char'; numArgs: 1; argTypes:(atMsg,0,0,0,0,0,0)),
 (Name:'set.text.attribute'; numArgs: 2; argTypes:(atNum,atNum,0,0,0,0,0)),
 (Name:'shake.screen'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'configure.screen'; numArgs: 3; argTypes:(atNum,atNum,atNum,0,0,0,0)),
 (Name:'status.line.on'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'status.line.off'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'set.string'; numArgs: 2; argTypes:(atStr,atMsg,0,0,0,0,0)),
 (Name:'get.string'; numArgs: 5; argTypes:(atStr,atMsg,atNum,atNum,atNum,0,0)),
 (Name:'word.to.string'; numArgs: 2; argTypes:(atWord,atStr,0,0,0,0,0)),
 (Name:'parse'; numArgs: 1; argTypes:(atStr,0,0,0,0,0,0)),
 (Name:'get.num'; numArgs: 2; argTypes:(atMsg,atVar,0,0,0,0,0)),
 (Name:'prevent.input'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'accept.input'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'set.key'; numArgs: 3; argTypes:(atNum,atNum,atCtrl,0,0,0,0)),
 (Name:'add.to.pic'; numArgs: 7; argTypes:(atNum,atNum,atNum,atNum,atNum,atNum,atNum)),
 (Name:'add.to.pic.v'; numArgs: 7; argTypes:(atVar,atVar,atVar,atVar,atVar,atVar,atVar)),
 (Name:'status'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'save.game'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'restore.game'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'init.disk'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'restart.game'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'show.obj'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'random'; numArgs: 3; argTypes:(atNum,atNum,atVar,0,0,0,0)),
 (Name:'program.control'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'player.control'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'obj.status.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'quit'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),  // 0 args for 2.089
 (Name:'show.mem'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'pause'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'echo.line'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'cancel.line'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'init.joy'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'toggle.monitor'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'version'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'script.size'; numArgs: 1; argTypes:(atNum,0,0,0,0,0,0)),
 (Name:'set.game.id'; numArgs: 1; argTypes:(atMsg,0,0,0,0,0,0)),
 (Name:'log'; numArgs: 1; argTypes:(atMsg,0,0,0,0,0,0)),
 (Name:'set.scan.start'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'reset.scan.start'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'reposition.to'; numArgs: 3; argTypes:(atSObj,atNum,atNum,0,0,0,0)),
 (Name:'reposition.to.v'; numArgs: 3; argTypes:(atSObj,atVar,atVar,0,0,0,0)),
 (Name:'trace.on'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'trace.info'; numArgs: 3; argTypes:(atNum,atNum,atNum,0,0,0,0)),
 (Name:'print.at'; numArgs: 4; argTypes:(atMsg,atNum,atNum,atNum,0,0,0)),    // 3 args before 2.440
 (Name:'print.at.v'; numArgs: 4; argTypes:(atMsg,atVar,atVar,atVar,0,0,0)),  // 3 args before 2.440
 (Name:'discard.view.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'clear.text.rect'; numArgs: 5; argTypes:(atNum,atNum,atNum,atNum,atNum,0,0)),
 (Name:'set.upper.left'; numArgs: 2; argTypes:(0,0,0,0,0,0,0)),    // ?????
 (Name:'set.menu'; numArgs: 1; argTypes:(atMsg,0,0,0,0,0,0)),
 (Name:'set.menu.item'; numArgs: 2; argTypes:(atMsg,atCtrl,0,0,0,0,0)),
 (Name:'submit.menu'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'enable.item'; numArgs: 1; argTypes:(atCtrl,0,0,0,0,0,0)),
 (Name:'disable.item'; numArgs: 1; argTypes:(atCtrl,0,0,0,0,0,0)),
 (Name:'menu.input'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'show.obj.v'; numArgs: 1; argTypes:(atVar,0,0,0,0,0,0)),
 (Name:'open.dialogue'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'close.dialogue'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'mul.n'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'mul.v'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'div.n'; numArgs: 2; argTypes:(atVar,atNum,0,0,0,0,0)),
 (Name:'div.v'; numArgs: 2; argTypes:(atVar,atVar,0,0,0,0,0)),
 (Name:'close.window'; numArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown170'; NumArgs: 1; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown171'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown172'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown173'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown174'; NumArgs: 1; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown175'; NumArgs: 1; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown176'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)),   // 1 arg for 3.002.086
 (Name:'unknown177'; NumArgs: 1; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown178'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown179'; NumArgs: 4; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown180'; NumArgs: 2; argTypes:(0,0,0,0,0,0,0)),
 (Name:'unknown181'; NumArgs: 0; argTypes:(0,0,0,0,0,0,0)));

procedure CorrectCommands(VerNum:double);

implementation

procedure CorrectCommands(VerNum:double);
// This procedure adjusts the above data for a given int. version
begin
  if VerNum <= 2.089 then
    AGICommand[134].NumArgs := 0;  // quit
  if VerNum <= 2.400 then
  begin
    AGICommand[151].NumArgs := 3;  // print.at
    AGICommand[152].NumArgs := 3;  // print.at.v
  end;
  if VerNum <= 3.002086 then
    AGICommand[176].NumArgs := 1;
  if VerNum <= 2.089 then NumAGICommands := 155
  else if VerNum <= 2.272 then NumAGICommands := 161
  else if VerNum <= 2.440 then NumAGICommands := 169
  else if VerNum <= 2.917 then NumAGICommands := 173
  else if VerNum <= 2.936 then NumAGICommands := 175
  else if VerNum <= 3.002086 then NumAGICommands := 177
  else NumAGICommands := 181
end;

end.