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) {}
168 double asFloat()
const;
171 CastMemberID asMemberID(CastType castType = kCastTypeAny,
int castLib = 0)
const;
176 bool isVarRef()
const;
177 bool isCastRef()
const;
178 bool isArray()
const;
179 bool isNumeric()
const;
180 bool isVoid()
const {
return type == VOID; }
182 const char *type2str(
bool ilk =
false)
const;
184 int equalTo(
const Datum &d,
bool ignoreCase =
false)
const;
185 uint32 compareTo(
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;
190 bool operator>=(
const Datum &d)
const;
191 bool operator<=(
const Datum &d)
const;
203 : source(src), type(t), startChunk(sc), endChunk(ec), start(s), end(e) {}
232 Builtin(
void (*func1)(
void),
int nargs1) : func(func1), nargs(nargs1) {}
242 typedef void (*XLibOpenerFunc)(ObjectType,
const Common::Path &);
243 typedef void (*XLibCloserFunc)(ObjectType);
255 ScriptData *retScript;
257 DatumHash *retLocalVars;
259 uint stackSizeBefore;
269 EventHandlerSourceType eventHandlerSourceType;
270 ScriptType scriptType;
281 eventHandlerSourceType = kNoneHandler;
283 passByDefault = pass;
288 scriptInstance =
nullptr;
294 eventHandlerSourceType = ehst;
295 scriptType = kNoneScript;
296 passByDefault = pass;
301 scriptInstance =
nullptr;
311 ScriptContextHash lctxContexts;
312 ScriptContextHash scriptContexts[kMaxScriptType + 1];
313 FactoryContextHash factoryContexts;
316 SymbolHash functionHandlers;
323 void addCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
324 void patchCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
325 void removeCode(ScriptType type, uint16
id);
326 void replaceCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr);
331 void patchScriptHandler(ScriptType type,
CastMemberID id);
342 ScriptData *script =
nullptr;
344 DatumHash *localVars =
nullptr;
351 enum LingoExecState {
367 int getMenuItemsNum(
Datum &d);
369 int getCastLibsNum();
370 int getMembersNum(uint16 castLibID);
375 void printStack(
const char *s, uint pc);
377 void printCallStack(uint pc);
380 Common::String decodeInstruction(ScriptData *sd, uint pc, uint *newPC = NULL);
385 void reloadBuiltIns();
388 void cleanupBuiltIns();
394 void cleanupMethods();
401 void closeOpenXLibs();
402 void reloadOpenXLibs();
408 void initEventHandlerTypes();
412 ScriptType event2script(LEvent ev);
418 bool execute(
int targetFrame = -1);
419 void switchStateFromWindow();
421 void freezePlayState();
422 void pushContext(
const Symbol funcSym,
bool allowRetVal,
Datum defaultRetVal,
int paramCount,
int nargs);
423 void popContext(
bool aborting =
false);
424 void cleanLocalVars();
425 void varAssign(
const Datum &var,
const Datum &value);
426 Datum varFetch(
const Datum &var,
bool silent =
false);
428 Datum findVarV4(
int varType,
const Datum &
id);
431 void exposeXObject(
const char *name,
Datum obj);
433 int getAlignedType(
const Datum &d1,
const Datum &d2,
bool equality);
438 inst readInst() {
return getInst(_state->pc++); }
439 inst getInst(uint pc) {
return (*_state->script)[pc]; }
440 int readInt() {
return getInt(_state->pc++); }
442 double readFloat() {
double d = getFloat(_state->pc); _state->pc += calcCodeAlignment(
sizeof(
double));
return d; }
443 double getFloat(uint pc) {
return *(
double *)(&((*_state->script)[_state->pc])); }
444 char *readString() {
char *s = getString(_state->pc); _state->pc += calcStringAlignment(s);
return s; }
445 char *getString(uint pc) {
return (
char *)(&((*_state->script)[_state->pc])); }
450 void printArgs(
const char *funcname,
int nargs,
const char *prefix =
nullptr);
451 inline void printSTUBWithArglist(
const char *funcname,
int nargs) { printArgs(funcname, nargs,
"STUB: "); }
452 void convertVOIDtoString(
int arg,
int nargs);
453 void dropStack(
int nargs);
456 void lingoError(
const char *s, ...);
460 void func_beep(
int repeats);
461 void func_goto(
Datum &frame,
Datum &movie,
bool commandgo =
false );
462 void func_gotoloop();
463 void func_gotonext();
464 void func_gotoprevious();
466 void func_playdone();
467 void func_cursor(
Datum cursorDatum);
468 int func_marker(
int m);
469 uint16 func_label(
Datum &label);
473 void initTheEntities();
474 void cleanUpTheEntities();
475 const char *entity2str(
int id);
476 const char *field2str(
int id);
482 bool _preLoadEventAbort;
486 bool _updateMovieEnabled;
489 Datum getTheEntity(
int entity,
Datum &
id,
int field);
490 void setTheEntity(
int entity,
Datum &
id,
int field,
Datum &d);
492 void setTheSprite(
Datum &
id,
int field,
Datum &d);
494 void setTheCast(
Datum &
id,
int field,
Datum &d);
496 void setTheCastLib(
Datum &
id,
int field,
Datum &d);
498 void setTheField(
Datum &id1,
int field,
Datum &d);
500 void setTheChunk(
Datum &chunk,
int field,
Datum &d);
503 Datum getTheDate(
int field);
504 Datum getTheTime(
int field);
505 Datum getTheDeskTopRectList();
515 int _currentChannelId;
524 TheEntityHash _theEntities;
525 TheEntityFieldHash _theEntityFields;
529 SymbolHash _builtinCmds;
530 SymbolHash _builtinFuncs;
531 SymbolHash _builtinConsts;
532 SymbolHash _builtinListHandlers;
534 XLibOpenerFuncHash _xlibOpeners;
535 XLibCloserFuncHash _xlibClosers;
537 OpenXLibsHash _openXLibs;
538 OpenXLibsStateHash _openXLibsState;
541 OpenXLibsStateHash _openXtrasState;
548 Datum peek(uint offset);
555 DatumHash _globalvars;
575 Symbol _currentInputEvent;
578 LingoExecState _state = kRunning;
579 bool (*_shouldPause)() =
nullptr;
583 void executeImmediateScripts(
Frame *frame);
584 void executePerFrameHook(
int frame,
int subframe,
bool stepFrame =
true);
589 void initCharNormalizations();
596 bool delBreakpoint(
int id);
607 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:157
Definition: lingo-object.h:42
Definition: lobject.h:332
Definition: castmember.h:48
Definition: lingo-object.h:213