/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef GLK_ACODE #define GLK_ACODE #include "common/scummsys.h" #include "common/serializer.h" namespace Glk { namespace Alan3 { #define ACODEEXTENSION ".a3c" typedef uint32 Aptr; /* Type for an ACODE memory address used in the structures */ /* TODO: Here's the major 32->64bit problem: Aptrs are 32 bit to fit into the 32-bit structure of the Amachine, but sometimes this is used to store a *real* pointer value, which on 64-bit machines are 64bits. */ typedef uint32 Aword; /* Type for an ACODE word */ typedef uint32 Aaddr; /* Type for an ACODE address */ typedef uint32 Aid; /* Type for an ACODE Instance Id value */ typedef int32 Abool; /* Type for an ACODE Boolean value */ typedef int32 Aint; /* Type for an ACODE Integer value */ typedef int32 Aset; /* Type for an ACODE Set value */ typedef int CodeValue; /* Definition for the packing process */ #ifndef TRUE #define TRUE (0==0) #endif #ifndef FALSE #define FALSE (!TRUE) #endif /* Constants for the Acode file, words/block & bytes/block */ #define BLOCKLEN 256L #define BLOCKSIZE (BLOCKLEN*sizeof(Aword)) /* Definitions for the packing process */ #define VALUEBITS 16 #define EOFChar 256 #define TOPVALUE (((CodeValue)1<-1 from set */ I_CONTSIZE, /* Push number of members in a container */ I_CONTMEMB, /* Push the member with index -1 from container */ I_USE, I_STOP, I_AT, I_IN, I_INSET, I_HERE, I_NEARBY, I_NEAR, I_WHERE, /* Current position of an instance */ I_LOCATION, /* The *location* an instance is at */ I_DESCRIBE, I_SAY, I_SAYINT, I_SAYSTR, I_IF, I_ELSE, I_ENDIF, I_AND, I_OR, I_NE, I_EQ, I_STREQ, /* String compare */ I_STREXACT, /* Exact match */ I_LE, I_GE, I_LT, I_GT, I_PLUS, I_MINUS, I_MULT, I_DIV, I_NOT, I_UMINUS, I_RND, I_RETURN, I_SYSTEM, I_RESTART, I_BTW, I_CONTAINS, I_DUP, I_DEPEND, I_DEPCASE, I_DEPEXEC, I_DEPELSE, I_ENDDEP, I_ISA, I_FRAME, I_SETLOCAL, I_GETLOCAL, I_ENDFRAME, I_LOOP, I_LOOPNEXT, I_LOOPEND, I_SUM, /* Aggregates: */ I_MAX, I_MIN, I_COUNT, /* COUNT aggregate & limit meta-attribute */ I_SHOW, I_PLAY, I_CONCAT, I_STRIP, I_POP, I_TRANSCRIPT, I_DUPSTR /* Duplicate the string on the top of the stack */ }; enum SayForm { SAY_SIMPLE, SAY_DEFINITE, SAY_INDEFINITE, SAY_NEGATIVE, SAY_PRONOUN }; enum VarClass { V_PARAM, V_CURLOC, V_CURACT, V_CURVRB, V_SCORE, V_CURRENT_INSTANCE, V_MAX_INSTANCE }; /* For transitivity in HERE, IN etc. */ enum ATrans { TRANSITIVE = 0, DIRECT = 1, INDIRECT = 2 }; /* Predefined attributes, one is for containers and the other for locations and since instances cannot be both, the attributes can have the same number */ #define OPAQUEATTRIBUTE 1 #define VISITSATTRIBUTE 1 #define PREDEFINEDATTRIBUTES OPAQUEATTRIBUTE #define I_CLASS(x) ((x)>>28) #define I_OP(x) ((x&0x08000000)?(x)|0xf0000000:(x)&0x0fffffff) /* AMACHINE Table entry types */ #define AwordSizeOf(x) (sizeof(x)/sizeof(Aword)) #include "common/pack-start.h" // START STRUCT PACKING struct ArticleEntry { Aaddr address; /* Address of article code */ Abool isForm; /* Is the article a complete form? */ } PACKED_STRUCT; struct ClassEntry { /* CLASS TABLE */ Aword code; /* Own code */ Aaddr id; /* Address to identifier string */ Aint parent; /* Code for the parent class, 0 if none */ Aaddr name; /* Address to name printing code */ Aint pronoun; /* Code for the pronoun word */ Aaddr initialize; /* Address to initialization statements */ Aaddr descriptionChecks; /* Address of description checks */ Aaddr description; /* Address of description code */ ArticleEntry definite; /* Definite article entry */ ArticleEntry indefinite; /* Indefinite article entry */ ArticleEntry negative; /* Negative article entry */ Aaddr mentioned; /* Address of code for Mentioned clause */ Aaddr verbs; /* Address of verb table */ Aaddr entered; /* Address of code for Entered clause */ } PACKED_STRUCT; struct InstanceEntry { /* INSTANCE TABLE */ Aint code; /* Own code */ Aaddr id; /* Address to identifier string */ Aint parent; /* Code for the parent class, 0 if none */ Aaddr name; /* Address to name printing code */ Aint pronoun; /* Word code for the pronoun */ Aint initialLocation; /* Code for current location */ Aaddr initialize; /* Address to initialization statements */ Aint container; /* Code for a possible container property */ Aaddr initialAttributes; /* Address of attribute list */ Aaddr checks; /* Address of description checks */ Aaddr description; /* Address of description code */ ArticleEntry definite; /* Definite article entry */ ArticleEntry indefinite; /* Indefinite article entry */ ArticleEntry negative; /* Negative article entry */ Aaddr mentioned; /* Address to short description code */ Aaddr verbs; /* Address of local verb list */ Aaddr entered; /* Address of entered code (location only) */ Aaddr exits; /* Address of exit list */ } PACKED_STRUCT; struct AttributeEntry { /* ATTRIBUTE LIST */ Aint code; /* Its code */ Aptr value; /* Its value, a string has a dynamic string pointer, a set has a pointer to a dynamically allocated set */ Aaddr id; /* Address to the name */ /** * Save/resotre data from save file */ void synchronize(Common::Serializer &s); } PACKED_STRUCT; struct AttributeHeaderEntry { /* ATTRIBUTE LIST in header */ Aint code; /* Its code */ Aword value; /* Its value, a string has a dynamic string pointer, a set has a pointer to a dynamically allocated set */ Aaddr id; /* Address to the name */ } PACKED_STRUCT; struct ExitEntry { /* EXIT TABLE structure */ Aword code; /* Direction code */ Aaddr checks; /* Address of check table */ Aaddr action; /* Address of action code */ Aword target; /* Id for the target location */ } PACKED_STRUCT; struct RuleEntry { /* RULE TABLE */ Abool alreadyRun; Aaddr exp; /* Address to expression code */ Aaddr stms; /* Address to run */ } PACKED_STRUCT; #define RESTRICTIONCLASS_CONTAINER (-2) #define RESTRICTIONCLASS_INTEGER (-3) #define RESTRICTIONCLASS_STRING (-4) struct RestrictionEntry { /* PARAMETER RESTRICTION TABLE */ Aint parameterNumber; /* Parameter number */ Aint _class; /* Parameter class code */ Aaddr stms; /* Exception statements */ } PACKED_STRUCT; struct ContainerEntry { /* CONTAINER TABLE */ Aword owner; /* Owner instance index */ Aint _class; /* Class to allow in container */ Aaddr limits; /* Address to limit check code */ Aaddr header; /* Address to header code */ Aaddr empty; /* Address to code for header when empty */ Aaddr extractChecks; /* Address to check before extracting */ Aaddr extractStatements; /* Address to execute when extracting */ } PACKED_STRUCT; struct ElementEntry { /* SYNTAX ELEMENT TABLES */ Aint code; /* Code for this element, 0 -> parameter */ Aword flags; /* Flags for multiple/omni (if parameter), syntax number/verb of EOS */ Aaddr next; /* Address to next element table ... */ /* ... or restrictions if code == EOS */ } PACKED_STRUCT; struct SyntaxEntryPreBeta2 { /* SYNTAX TABLE */ Aint code; /* Code for verb word */ Aaddr elms; /* Address to element tables */ } PACKED_STRUCT; struct SyntaxEntry { /* SYNTAX TABLE */ Aint code; /* Code for verb word, or 0 if starting with parameter */ Aaddr elms; /* Address to element tables */ Aaddr parameterNameTable; /* Address to a table of id-addresses giving the names of the parameters */ } PACKED_STRUCT; struct ParameterMapEntry { /* PARAMETER MAPPING TABLE */ Aint syntaxNumber; Aaddr parameterMapping; Aint verbCode; } PACKED_STRUCT; struct EventEntry { /* EVENT TABLE */ Aaddr id; /* Address to name string */ Aaddr code; } PACKED_STRUCT; struct ScriptEntry { /* SCRIPT TABLE */ Aaddr id; /* Address to name string */ Aint code; /* Script number */ Aaddr description; /* Optional description statements */ Aaddr steps; /* Address to steps */ } PACKED_STRUCT; struct StepEntry { /* STEP TABLE */ Aaddr after; /* Expression to say after how many ticks? */ Aaddr exp; /* Expression to condition saying when */ Aaddr stms; /* Address to the actual code */ } PACKED_STRUCT; struct AltEntry { /* VERB ALTERNATIVE TABLE */ Aword qual; /* Verb execution qualifier */ Aint param; /* Parameter number */ Aaddr checks; /* Address of the check table */ Aaddr action; /* Address of the action code */ } PACKED_STRUCT; struct SourceFileEntry { /* SOURCE FILE NAME TABLE */ Aint fpos; Aint len; } PACKED_STRUCT; struct SourceLineEntry { /* SOURCE LINE TABLE */ Aint file; Aint line; } PACKED_STRUCT; struct StringInitEntry { /* STRING INITIALISATION TABLE */ Aword fpos; /* File position */ Aword len; /* Length */ Aint instanceCode; /* Where to store it */ Aint attributeCode; } PACKED_STRUCT; struct SetInitEntry { /* SET INITIALISATION TABLE */ Aint size; /* Size of the initial set */ Aword setAddress; /* Address to the initial set */ Aint instanceCode; /* Where to store it */ Aint attributeCode; } PACKED_STRUCT; struct DictionaryEntry { /* Dictionary */ Aaddr string; /* ACODE address to string */ Aword classBits; /* Word class */ Aword code; Aaddr adjectiveRefs; /* Address to reference list */ Aaddr nounRefs; /* Address to reference list */ Aaddr pronounRefs; /* Address to reference list */ } PACKED_STRUCT; /* AMACHINE Header */ struct ACodeHeader { /* Important info */ char tag[4]; /* "ALAN" */ byte version[4]; /* Version of compiler */ Aword uid; /* Unique id of the compiled game */ Aword size; /* Size of ACD-file in Awords */ /* Options */ Abool pack; /* Is the text packed and encoded ? */ Aword stringOffset; /* Offset to string data in game file */ Aword pageLength; /* Length of a displayed page */ Aword pageWidth; /* and width */ Aword debug; /* Option: debug */ /* Data structures */ Aaddr classTableAddress; Aword classMax; Aword entityClassId; Aword thingClassId; Aword objectClassId; Aword locationClassId; Aword actorClassId; Aword literalClassId; Aword integerClassId; Aword stringClassId; Aaddr instanceTableAddress; /* Instance table */ Aword instanceMax; /* Highest number of an instance */ Aword theHero; /* The hero instance code (id) */ Aaddr containerTableAddress; Aword containerMax; Aaddr scriptTableAddress; Aword scriptMax; Aaddr eventTableAddress; Aword eventMax; Aaddr syntaxTableAddress; Aaddr parameterMapAddress; Aword syntaxMax; Aaddr dictionary; Aaddr verbTableAddress; Aaddr ruleTableAddress; Aaddr messageTableAddress; /* Miscellaneous */ Aint attributesAreaSize; /* Size of attribute data area in Awords */ Aint maxParameters; /* Maximum number of parameters in any syntax */ Aaddr stringInitTable; /* String init table address */ Aaddr setInitTable; /* Set init table address */ Aaddr start; /* Address to Start code */ Aword maximumScore; /* Maximum score */ Aaddr scores; /* Score table */ Aint scoreCount; /* Max index into scores table */ Aaddr sourceFileTable; /* Table of fpos/len for source filenames */ Aaddr sourceLineTable; /* Table of available source lines to break on */ Aaddr freq; /* Address to Char freq's for coding */ Aword acdcrc; /* Checksum for acd code (excl. hdr) */ Aword txtcrc; /* Checksum for text data file */ Aaddr ifids; /* Address to IFIDS */ Aaddr prompt; } PACKED_STRUCT; struct Pre3_0beta2Header { /* Important info */ char tag[4]; /* "ALAN" */ byte version[4]; /* Version of compiler */ Aword uid; /* Unique id of the compiled game */ Aword size; /* Size of ACD-file in Awords */ /* Options */ Abool pack; /* Is the text packed ? */ Aword stringOffset; /* Offset to string data in game file */ Aword pageLength; /* Length of a page */ Aword pageWidth; /* and width */ Aword debug; /* Option: debug */ /* Data structures */ Aaddr classTableAddress; /* Class table */ Aword classMax; /* Number of classes */ Aword entityClassId; Aword thingClassId; Aword objectClassId; Aword locationClassId; Aword actorClassId; Aword literalClassId; Aword integerClassId; Aword stringClassId; Aaddr instanceTableAddress; /* Instance table */ Aword instanceMax; /* Highest number of an instance */ Aword theHero; /* The hero instance code (id) */ Aaddr containerTableAddress; Aword containerMax; Aaddr scriptTableAddress; Aword scriptMax; Aaddr eventTableAddress; Aword eventMax; Aaddr syntaxTableAddress; Aaddr parameterMapAddress; Aword syntaxMax; Aaddr dictionary; Aaddr verbTableAddress; Aaddr ruleTableAddress; Aaddr messageTableAddress; /* Miscellaneous */ Aint attributesAreaSize; /* Size of attribute data area in Awords */ Aint maxParameters; /* Maximum number of parameters in any syntax */ Aaddr stringInitTable; /* String init table address */ Aaddr setInitTable; /* Set init table address */ Aaddr start; /* Address to Start code */ Aword maximumScore; /* Maximum score */ Aaddr scores; /* Score table */ Aint scoreCount; /* Max index into scores table */ Aaddr sourceFileTable; /* Table of fpos/len for source filenames */ Aaddr sourceLineTable; /* Table of available source lines to break on */ Aaddr freq; /* Address to Char freq's for coding */ Aword acdcrc; /* Checksum for acd code (excl. hdr) */ Aword txtcrc; /* Checksum for text data file */ Aaddr ifids; /* Address to IFIDS */ } PACKED_STRUCT; struct Pre3_0alpha5Header { /* Important info */ char tag[4]; /* "ALAN" */ byte version[4]; /* Version of compiler */ Aword uid; /* Unique id of the compiled game */ Aword size; /* Size of ACD-file in Awords */ /* Options */ Abool pack; /* Is the text packed ? */ Aword stringOffset; /* Offset to string data in game file */ Aword pageLength; /* Length of a page */ Aword pageWidth; /* and width */ Aword debug; /* Option: debug */ /* Data structures */ Aaddr classTableAddress; /* Class table */ Aword classMax; /* Number of classes */ Aword entityClassId; Aword thingClassId; Aword objectClassId; Aword locationClassId; Aword actorClassId; Aword literalClassId; Aword integerClassId; Aword stringClassId; Aaddr instanceTableAddress; /* Instance table */ Aword instanceMax; /* Highest number of an instance */ Aword theHero; /* The hero instance code (id) */ Aaddr containerTableAddress; Aword containerMax; Aaddr scriptTableAddress; Aword scriptMax; Aaddr eventTableAddress; Aword eventMax; Aaddr syntaxTableAddress; Aaddr parameterMapAddress; Aword syntaxMax; Aaddr dictionary; Aaddr verbTableAddress; Aaddr ruleTableAddress; Aaddr messageTableAddress; /* Miscellaneous */ Aint attributesAreaSize; /* Size of attribute data area in Awords */ Aint maxParameters; /* Maximum number of parameters in any syntax */ Aaddr stringInitTable; /* String init table address */ Aaddr setInitTable; /* Set init table address */ Aaddr start; /* Address to Start code */ Aword maximumScore; /* Maximum score */ Aaddr scores; /* Score table */ Aint scoreCount; /* Max index into scores table */ Aaddr sourceFileTable; /* Table of fpos/len for source filenames */ Aaddr sourceLineTable; /* Table of available source lines to break on */ Aaddr freq; /* Address to Char freq's for coding */ Aword acdcrc; /* Checksum for acd code (excl. hdr) */ Aword txtcrc; /* Checksum for text data file */ } PACKED_STRUCT; #include "common/pack-end.h" // END STRUCT PACKING /* Error message numbers */ enum MsgKind { M_UNKNOWN_WORD, M_WHAT, M_WHAT_WORD, M_MULTIPLE, M_NOUN, M_AFTER_BUT, M_BUT_ALL, M_NOT_MUCH, M_WHICH_ONE_START, M_WHICH_ONE_COMMA, M_WHICH_ONE_OR, M_NO_SUCH, M_NO_WAY, M_CANT0, M_SEE_START, M_SEE_COMMA, M_SEE_AND, M_SEE_END, M_CONTAINS, M_CARRIES, M_CONTAINS_COMMA, M_CONTAINS_AND, M_CONTAINS_END, M_EMPTY, M_EMPTYHANDED, M_CANNOTCONTAIN, M_SCORE, M_MORE, M_AGAIN, M_SAVEWHERE, M_SAVEOVERWRITE, M_SAVEFAILED, M_RESTOREFROM, M_SAVEMISSING, M_NOTASAVEFILE, M_SAVEVERS, M_SAVENAME, M_REALLY, M_QUITACTION, M_UNDONE, M_NO_UNDO, M_WHICH_PRONOUN_START, M_WHICH_PRONOUN_FIRST, M_IMPOSSIBLE_WITH, M_CONTAINMENT_LOOP, M_CONTAINMENT_LOOP2, MSGMAX }; #define NO_MSG MSGMAX } // End of namespace Alan3 } // End of namespace Glk #endif