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;
52 typedef void (*inst)(void);
54 #define ENTITY_INDEX(t,id) ((t) * 100000 + (id)) 56 int calcStringAlignment(
const char *s);
57 int calcCodeAlignment(
int l);
106 bool operator==(
Symbol &s)
const;
115 PArray() : _sorted(
false) {}
117 PArray(
int size) : _sorted(
false), arr(size) {}
124 FArray() : _sorted(
false) {}
126 FArray(
int size) : _sorted(
false), arr(size) {}
167 double asFloat()
const;
170 CastMemberID asMemberID(CastType castType = kCastTypeAny,
int castLib = 0)
const;
175 bool isVarRef()
const;
176 bool isCastRef()
const;
177 bool isArray()
const;
178 bool isNumeric()
const;
180 const char *type2str(
bool ilk =
false)
const;
182 int equalTo(
const Datum &d,
bool ignoreCase =
false)
const;
183 uint32 compareTo(
const Datum &d)
const;
185 bool operator==(
const Datum &d)
const;
186 bool operator>(
const Datum &d)
const;
187 bool operator<(
const Datum &d)
const;
188 bool operator>=(
const Datum &d)
const;
189 bool operator<=(
const Datum &d)
const;
201 : source(src), type(t), startChunk(sc), endChunk(ec), start(s), end(e) {}
230 Builtin(
void (*func1)(
void),
int nargs1) : func(func1), nargs(nargs1) {}
240 typedef void (*XLibOpenerFunc)(ObjectType,
const Common::Path &);
241 typedef void (*XLibCloserFunc)(ObjectType);
253 ScriptData *retScript;
255 DatumHash *retLocalVars;
257 uint stackSizeBefore;
267 EventHandlerSourceType eventHandlerSourceType;
268 ScriptType scriptType;
277 eventHandlerSourceType = kNoneHandler;
279 passByDefault = pass;
288 eventHandlerSourceType = ehst;
289 scriptType = kNoneScript;
290 passByDefault = pass;
303 ScriptContextHash lctxContexts;
304 ScriptContextHash scriptContexts[kMaxScriptType + 1];
305 FactoryContextHash factoryContexts;
308 SymbolHash functionHandlers;
315 void addCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
316 void patchCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
317 void removeCode(ScriptType type, uint16
id);
318 void replaceCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr);
323 void patchScriptHandler(ScriptType type,
CastMemberID id);
334 ScriptData *script =
nullptr;
336 DatumHash *localVars =
nullptr;
343 enum LingoExecState {
359 int getMenuItemsNum(
Datum &d);
361 int getCastLibsNum();
362 int getMembersNum(uint16 castLibID);
367 void printStack(
const char *s, uint pc);
369 void printCallStack(uint pc);
372 Common::String decodeInstruction(ScriptData *sd, uint pc, uint *newPC = NULL);
377 void reloadBuiltIns();
380 void cleanupBuiltIns();
386 void cleanupMethods();
393 void closeOpenXLibs();
394 void reloadOpenXLibs();
400 void initEventHandlerTypes();
401 bool processEvent(LEvent event, ScriptType st,
CastMemberID scriptId,
int channelId = -1);
404 ScriptType event2script(LEvent ev);
410 bool execute(
int targetFrame = -1);
411 void switchStateFromWindow();
413 void freezePlayState();
414 void pushContext(
const Symbol funcSym,
bool allowRetVal,
Datum defaultRetVal,
int paramCount,
int nargs);
415 void popContext(
bool aborting =
false);
416 void cleanLocalVars();
417 void varAssign(
const Datum &var,
const Datum &value);
418 Datum varFetch(
const Datum &var,
bool silent =
false);
420 Datum findVarV4(
int varType,
const Datum &
id);
423 void exposeXObject(
const char *name,
Datum obj);
425 int getAlignedType(
const Datum &d1,
const Datum &d2,
bool equality);
430 inst readInst() {
return getInst(_state->pc++); }
431 inst getInst(uint pc) {
return (*_state->script)[pc]; }
432 int readInt() {
return getInt(_state->pc++); }
434 double readFloat() {
double d = getFloat(_state->pc); _state->pc += calcCodeAlignment(
sizeof(
double));
return d; }
435 double getFloat(uint pc) {
return *(
double *)(&((*_state->script)[_state->pc])); }
436 char *readString() {
char *s = getString(_state->pc); _state->pc += calcStringAlignment(s);
return s; }
437 char *getString(uint pc) {
return (
char *)(&((*_state->script)[_state->pc])); }
442 void printArgs(
const char *funcname,
int nargs,
const char *prefix =
nullptr);
443 inline void printSTUBWithArglist(
const char *funcname,
int nargs) { printArgs(funcname, nargs,
"STUB: "); }
444 void convertVOIDtoString(
int arg,
int nargs);
445 void dropStack(
int nargs);
448 void lingoError(
const char *s, ...);
452 void func_beep(
int repeats);
453 void func_goto(
Datum &frame,
Datum &movie,
bool commandgo =
false );
454 void func_gotoloop();
455 void func_gotonext();
456 void func_gotoprevious();
458 void func_playdone();
459 void func_cursor(
Datum cursorDatum);
460 int func_marker(
int m);
461 uint16 func_label(
Datum &label);
465 void initTheEntities();
466 void cleanUpTheEntities();
467 const char *entity2str(
int id);
468 const char *field2str(
int id);
474 bool _preLoadEventAbort;
478 bool _updateMovieEnabled;
481 Datum getTheEntity(
int entity,
Datum &
id,
int field);
482 void setTheEntity(
int entity,
Datum &
id,
int field,
Datum &d);
484 void setTheSprite(
Datum &
id,
int field,
Datum &d);
486 void setTheCast(
Datum &
id,
int field,
Datum &d);
488 void setTheCastLib(
Datum &
id,
int field,
Datum &d);
490 void setTheField(
Datum &id1,
int field,
Datum &d);
492 void setTheChunk(
Datum &chunk,
int field,
Datum &d);
495 Datum getTheDate(
int field);
496 Datum getTheTime(
int field);
497 Datum getTheDeskTopRectList();
507 int _currentChannelId;
516 TheEntityHash _theEntities;
517 TheEntityFieldHash _theEntityFields;
521 SymbolHash _builtinCmds;
522 SymbolHash _builtinFuncs;
523 SymbolHash _builtinConsts;
524 SymbolHash _builtinListHandlers;
526 XLibOpenerFuncHash _xlibOpeners;
527 XLibCloserFuncHash _xlibClosers;
529 OpenXLibsHash _openXLibs;
530 OpenXLibsStateHash _openXLibsState;
538 Datum peek(uint offset);
545 DatumHash _globalvars;
565 Symbol _currentInputEvent;
568 LingoExecState _state = kRunning;
569 bool (*_shouldPause)() =
nullptr;
573 void executeImmediateScripts(
Frame *frame);
574 void executePerFrameHook(
int frame,
int subframe);
579 void initCharNormalizations();
586 bool delBreakpoint(
int id);
597 extern Lingo *g_lingo;
Definition: algorithm.h:29
Definition: lingo-codegen.h:30
char32_t u32char_type_t
Definition: ustr.h:41
Definition: debugger.h:45
Definition: director.h:156
Definition: lingo-object.h:42
Definition: lobject.h:332
Definition: lingo-object.h:213