Files
2026-02-02 04:50:13 +01:00

220 lines
6.4 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef TITANIC_TT_PARSER_H
#define TITANIC_TT_PARSER_H
#include "titanic/true_talk/tt_node.h"
#include "titanic/true_talk/tt_pronoun.h"
#include "titanic/true_talk/tt_sentence.h"
#include "titanic/true_talk/tt_string.h"
namespace Titanic {
enum NumberFlag { NF_1 = 1, NF_2 = 2, NF_4 = 4, NF_8 = 8, NF_10 = 0x10 };
enum ParserAction {
NO_ACTION = 0, CHECK_COMMAND_FORM, EXPECT_THING, OBJECT_IS_TO,
SEEK_ACTOR, SEEK_OBJECT, SEEK_OBJECT_OVERRIDE, SEEK_TO,
SEEK_FROM, SEEK_TO_OVERRIDE, SEEK_FROM_OVERRIDE, SEEK_LOCATION,
SEEK_OWNERSHIP, SEEK_STATE, SEEK_MODIFIERS, SEEK_NEW_FRAME,
SEEK_STATE_OBJECT, SET_ACTION, SET_COLOR, ACTOR_IS_TO,
ACTOR_IS_FROM, ACTOR_IS_OBJECT, STATE_IDENTITY,
WORD_TYPE_IS_SENTENCE_TYPE, COMPLEX_VERB
};
class CScriptHandler;
class TTconcept;
struct NumberEntry {
CString _text;
int _value;
int _flags;
NumberEntry() : _value(0), _flags(0) {}
NumberEntry(const CString &text, int value, int flags) :
_text(text), _value(value), _flags(flags) {}
};
typedef Common::Array<NumberEntry> NumberArray;
class TTparserNode : public TTnode {
public:
uint _tag;
public:
TTparserNode() : TTnode(), _tag(0) {}
TTparserNode(uint tag) : TTnode(), _tag(tag) {}
};
class TTparser {
private:
StringArray _replacements1;
StringArray _replacements2;
StringArray _replacements3;
StringArray _replacements4;
StringArray _phrases;
NumberArray _numbers;
TTparserNode *_nodesP;
TTconcept *_conceptP;
TTconcept *_currentConceptP;
private:
/**
* Clear the parser
*/
void clear();
/**
* Load the data for a given array resource
*/
void loadArray(StringArray &arr, const CString &name);
/**
* Loads the various replacement string data arrays
*/
void loadArrays();
/**
* Normalizes a passed input, taking care of things like removing extra
* spaces and lowercasing everything
*/
int normalize(TTsentence *sentence);
/**
* Submethod called by normalize to handle expanding contacted word pairs
* like can't, should've, and so on.
*/
bool normalizeContraction(const TTstring &srcLine, int &srcIndex, TTstring &destLine);
/**
* Checks for what is likely special developer cheat codes
*/
static int isEmoticon(const TTstring &str, int &index);
/**
* Checks if any word within a passed line has an entry in the list of replacements,
* and if found, replaces it with it's equivalent replacement string
* @param line Line to check
* @param strings List of strings to check for. Strings come in pairs, with the
* first being the string to match, and the second the replacement
*/
static void searchAndReplace(TTstring &line, const StringArray &strings);
/**
* Checks the string starting at a given index for any word in the passed string array,
* and if found, replaces it in the line with it's replacement
* @param line Line to check
* @param startIndex Starting index in the start to check
* @param strings List of strings to check for. Strings come in pairs, with the
* first being the string to match, and the second the replacement
* @returns Index of the start of the following word
*/
static int searchAndReplace(TTstring &line, int startIndex, const StringArray &strings);
/**
* Checks the string starting at a given index for a number representation
* such as roman numericals, spelled out numbers, etc. and replaces it with
* a plain decimal representation.
* @param line Line to check
* @param startIndex Starting index in the start to check
* @returns Index of the start of the following word, or -1 if at end of line
*/
int replaceNumbers(TTstring &line, int startIndex);
/**
* Checks the string starting at a given index for a number representation
* such as roman numericals, spelled out numbers, etc. and replaces it with
* a plain decimal representation.
* @param line Line to check
* @param startIndex Starting index in the start to check
* @returns Pointer to matching number entry, if match occurred
*/
const NumberEntry *replaceNumbers2(TTstring &line, int *startIndex);
int loadRequests(TTword *word);
int considerRequests(TTword *word);
int processRequests(TTword *word);
int addToConceptList(TTword *word);
int checkReferent(TTpronoun *pronoun);
/**
* Creates a new parser node, and adds it to the parser's list
*/
void addNode(uint tag);
/**
* Add a concept node
*/
int addConcept(TTconcept *c);
/**
* Detaches a concept from the main concept list if prseent, then deletes it
*/
void removeConcept(TTconcept *c);
/**
* Detaches a node from the main node list
*/
void removeNode(TTparserNode *node);
/**
* Handles any preprocessing for the German version
* @param line Line to check and update
*/
void preprocessGerman(TTstring &line);
int processModifiers(int modifier, TTword *word);
int checkForAction();
int fn2(TTword *word);
bool checkConcept2(TTconcept *conceptP, int conceptMode);
int filterConcepts(int conceptMode, int conceptIndex);
bool resetConcept(TTconcept **conceptPP, int conceptIndex);
public:
CScriptHandler *_owner;
TTsentenceConcept *_sentenceConcept;
TTsentence *_sentence;
int _fieldC;
int _field10;
int _field14;
TTword *_currentWordP;
StringArray _pronouns;
public:
TTparser(CScriptHandler *owner);
~TTparser();
/**
* Preprocesses the passed input text, to handle things like lowercasing
* all the words, and replcaing common slang with their full equivalents
*/
int preprocess(TTsentence *sentence);
int findFrames(TTsentence *sentence);
/**
* Called when a concept is copied from one to another
*/
void conceptChanged(TTconcept *newConcept, TTconcept *oldConcept);
};
} // End of namespace Titanic
#endif /* TITANIC_TT_PARSER_H */