22 #ifndef DIRECTOR_LINGO_LINGO_H 23 #define DIRECTOR_LINGO_LINGO_H 29 class SeekableReadStreamEndian;
34 struct ChunkReference;
36 struct PictureReference;
38 struct TheEntityField;
40 struct LingoV4Bytecode;
41 struct LingoV4TheEntity;
51 typedef void (*inst)(void);
53 #define ENTITY_INDEX(t,id) ((t) * 100000 + (id)) 54 #define printWithArgList g_lingo->printSTUBWithArglist 56 int calcStringAlignment(
const char *s);
57 int calcCodeAlignment(
int l);
114 PArray() : _sorted(
false) {}
116 PArray(
int size) : _sorted(
false), arr(size) {}
123 FArray() : _sorted(
false) {}
125 FArray(
int size) : _sorted(
false), arr(size) {}
166 double asFloat()
const;
169 CastMemberID asMemberID(CastType castType = kCastTypeAny)
const;
173 bool isVarRef()
const;
174 bool isCastRef()
const;
175 bool isArray()
const;
176 bool isNumeric()
const;
178 const char *type2str(
bool ilk =
false)
const;
180 int equalTo(
Datum &d,
bool ignoreCase =
false)
const;
181 uint32 compareTo(
Datum &d)
const;
183 bool operator==(
Datum &d)
const;
184 bool operator>(
Datum &d)
const;
185 bool operator<(
Datum &d)
const;
186 bool operator>=(
Datum &d)
const;
187 bool operator<=(
Datum &d)
const;
199 : source(src), type(t), startChunk(sc), endChunk(ec), start(s), end(e) {}
228 Builtin(
void (*func1)(
void),
int nargs1) : func(func1), nargs(nargs1) {}
238 typedef void (*XLibOpenerFunc)(ObjectType,
const Common::Path &);
239 typedef void (*XLibCloserFunc)(ObjectType);
251 ScriptData *retScript;
253 DatumHash *retLocalVars;
255 uint stackSizeBefore;
264 ScriptType scriptType;
274 passByDefault = pass;
285 ScriptContextHash lctxContexts;
286 ScriptContextHash scriptContexts[kMaxScriptType + 1];
287 FactoryContextHash factoryContexts;
290 SymbolHash functionHandlers;
297 void addCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
298 void patchCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
299 void removeCode(ScriptType type, uint16
id);
300 void replaceCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr);
305 void patchScriptHandler(ScriptType type,
CastMemberID id);
316 ScriptData *script =
nullptr;
318 DatumHash *localVars =
nullptr;
335 int getMenuItemsNum(
Datum &d);
337 int getCastlibsNum();
343 void printStack(
const char *s, uint pc);
345 void printCallStack(uint pc);
348 Common::String decodeInstruction(ScriptData *sd, uint pc, uint *newPC = NULL);
353 void reloadBuiltIns();
356 void cleanupBuiltIns();
362 void cleanupMethods();
369 void closeOpenXLibs();
370 void reloadOpenXLibs();
376 void initEventHandlerTypes();
377 void processEvent(LEvent event, ScriptType st,
CastMemberID scriptId,
int channelId = -1);
380 ScriptType event2script(LEvent ev);
387 void switchStateFromWindow();
389 void pushContext(
const Symbol funcSym,
bool allowRetVal,
Datum defaultRetVal,
int paramCount);
390 void popContext(
bool aborting =
false);
391 void cleanLocalVars();
392 void varAssign(
const Datum &var,
const Datum &value);
393 Datum varFetch(
const Datum &var,
bool silent =
false);
395 Datum findVarV4(
int varType,
const Datum &
id);
397 void exposeXObject(
const char *name,
Datum obj);
399 int getAlignedType(
const Datum &d1,
const Datum &d2,
bool equality);
404 inst readInst() {
return getInst(_state->pc++); }
405 inst getInst(uint pc) {
return (*_state->script)[pc]; }
406 int readInt() {
return getInt(_state->pc++); }
408 double readFloat() {
double d = getFloat(_state->pc); _state->pc += calcCodeAlignment(
sizeof(
double));
return d; }
409 double getFloat(uint pc) {
return *(
double *)(&((*_state->script)[_state->pc])); }
410 char *readString() {
char *s = getString(_state->pc); _state->pc += calcStringAlignment(s);
return s; }
411 char *getString(uint pc) {
return (
char *)(&((*_state->script)[_state->pc])); }
416 void printSTUBWithArglist(
const char *funcname,
int nargs,
const char *prefix =
"STUB:");
417 void convertVOIDtoString(
int arg,
int nargs);
418 void dropStack(
int nargs);
421 void lingoError(
const char *s, ...);
425 void func_beep(
int repeats);
426 void func_goto(
Datum &frame,
Datum &movie,
bool commandgo =
false );
427 void func_gotoloop();
428 void func_gotonext();
429 void func_gotoprevious();
431 void func_playdone();
432 void func_cursor(
Datum cursorDatum);
433 int func_marker(
int m);
434 uint16 func_label(
Datum &label);
438 void initTheEntities();
439 void cleanUpTheEntities();
440 const char *entity2str(
int id);
441 const char *field2str(
int id);
447 bool _preLoadEventAbort;
451 bool _updateMovieEnabled;
454 Datum getTheEntity(
int entity,
Datum &
id,
int field);
455 void setTheEntity(
int entity,
Datum &
id,
int field,
Datum &d);
457 void setTheSprite(
Datum &
id,
int field,
Datum &d);
459 void setTheCast(
Datum &
id,
int field,
Datum &d);
461 void setTheField(
Datum &id1,
int field,
Datum &d);
463 void setTheChunk(
Datum &chunk,
int field,
Datum &d);
466 Datum getTheDate(
int field);
467 Datum getTheTime(
int field);
468 Datum getTheDeskTopRectList();
478 int _currentChannelId;
485 TheEntityHash _theEntities;
486 TheEntityFieldHash _theEntityFields;
490 SymbolHash _builtinCmds;
491 SymbolHash _builtinFuncs;
492 SymbolHash _builtinConsts;
493 SymbolHash _builtinListHandlers;
495 XLibOpenerFuncHash _xlibOpeners;
496 XLibCloserFuncHash _xlibClosers;
498 OpenXLibsHash _openXLibs;
499 OpenXLibsStateHash _openXLibsState;
506 Datum peek(uint offset);
513 DatumHash _globalvars;
537 void executeImmediateScripts(
Frame *frame);
538 void executePerFrameHook(
int frame,
int subframe);
543 void initCharNormalizations();
549 extern Lingo *g_lingo;
Definition: algorithm.h:29
Definition: lingo-codegen.h:30
char32_t u32char_type_t
Definition: ustr.h:41
Definition: director.h:147
Definition: lingo-object.h:37
Definition: lobject.h:332
Definition: lingo-object.h:200