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;
53 typedef void (*inst)(void);
55 #define ENTITY_INDEX(t,id) ((t) * 100000 + (id)) 57 int calcStringAlignment(
const char *s);
58 int calcCodeAlignment(
int l);
107 bool operator==(
Symbol &s)
const;
116 PArray() : _sorted(
false) {}
118 PArray(
int size) : _sorted(
false), arr(size) {}
125 FArray() : _sorted(
false) {}
127 FArray(
int size) : _sorted(
false), arr(size) {}
169 double asFloat()
const;
172 CastMemberID asMemberID(CastType castType = kCastTypeAny,
int castLib = 0)
const;
177 bool isVarRef()
const;
178 bool isCastRef()
const;
179 bool isArray()
const;
180 bool isNumeric()
const;
181 bool isVoid()
const {
return type == VOID; }
183 const char *type2str(
bool ilk =
false)
const;
185 int equalTo(
const Datum &d,
bool ignoreCase =
false)
const;
186 uint32 compareTo(
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;
192 bool operator<=(
const Datum &d)
const;
204 : source(src), type(t), startChunk(sc), endChunk(ec), start(s), end(e) {}
233 Builtin(
void (*func1)(
void),
int nargs1) : func(func1), nargs(nargs1) {}
243 typedef void (*XLibOpenerFunc)(ObjectType,
const Common::Path &);
244 typedef void (*XLibCloserFunc)(ObjectType);
257 ScriptData *retScript;
259 DatumHash *retLocalVars;
261 uint stackSizeBefore;
266 Window *retWindow =
nullptr;
272 EventHandlerSourceType eventHandlerSourceType;
273 ScriptType scriptType;
284 eventHandlerSourceType = kNoneHandler;
286 passByDefault = pass;
291 scriptInstance =
nullptr;
293 debugC(7, kDebugEvents,
"LingoEvent: event=%s, eventId=%d, scriptType=%d, passByDefault=%d, scriptId=(%d,%d), mousePos=(%d,%d), behaviorIndex=%d",
294 leventType2str(event), eventId, scriptType, passByDefault, scriptId.member, scriptId.castLib, mousePos.
x, mousePos.
y, behaviorIndex);
300 eventHandlerSourceType = ehst;
301 scriptType = kNoneScript;
302 passByDefault = pass;
307 scriptInstance =
nullptr;
309 debugC(7, kDebugEvents,
"LingoEvent: event=%s, eventId=%d, eventHandlerSourceType=%s, passByDefault=%d, channelId=%d, mousePos=(%d,%d), behaviorIndex=%d",
310 leventType2str(event), eventId, eventHandlerSourceType2str(eventHandlerSourceType), passByDefault, channelId, mousePos.
x, mousePos.
y, behaviorIndex);
320 ScriptContextHash lctxContexts;
321 ScriptContextHash scriptContexts[kMaxScriptType + 1];
322 FactoryContextHash factoryContexts;
325 SymbolHash functionHandlers;
332 void addCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
333 void patchCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr, uint32 preprocFlags = kLPPNone);
334 void removeCode(ScriptType type, uint16
id);
335 void replaceCode(
const Common::U32String &code, ScriptType type, uint16
id,
const char *scriptName =
nullptr);
340 void patchScriptHandler(ScriptType type,
CastMemberID id);
351 ScriptData *script =
nullptr;
353 DatumHash *localVars =
nullptr;
356 int currentChannelId = 0;
361 enum LingoExecState {
377 int getMenuItemsNum(
Datum &d);
379 int getCastLibsNum();
380 int getMembersNum(uint16 castLibID);
385 void printStack(
const char *s, uint pc);
387 void printCallStack(uint pc);
390 Common::String decodeInstruction(ScriptData *sd, uint pc, uint *newPC = NULL);
395 void reloadBuiltIns();
398 void cleanupBuiltIns();
404 void cleanupMethods();
411 void closeOpenXLibs();
412 void reloadOpenXLibs();
418 void initEventHandlerTypes();
422 ScriptType event2script(LEvent ev);
428 bool execute(
int targetFrame = -1);
429 void switchStateFromWindow();
431 void freezePlayState();
432 void requeuePlayState();
433 void pushContext(
const Symbol funcSym,
bool allowRetVal,
Datum defaultRetVal,
int paramCount,
int nargs);
434 void popContext(
bool aborting =
false);
435 void cleanLocalVars();
436 void varAssign(
const Datum &var,
const Datum &value);
437 Datum varFetch(
const Datum &var,
bool silent =
false);
439 Datum findVarV4(
int varType,
const Datum &
id);
442 void exposeXObject(
const char *name,
Datum obj);
444 int getAlignedType(
const Datum &d1,
const Datum &d2,
bool equality);
449 inst readInst() {
return getInst(_state->pc++); }
450 inst getInst(uint pc) {
return (*_state->script)[pc]; }
451 int readInt() {
return getInt(_state->pc++); }
453 double readFloat() {
double d = getFloat(_state->pc); _state->pc += calcCodeAlignment(
sizeof(
double));
return d; }
454 double getFloat(uint pc) {
return *(
double *)(&((*_state->script)[_state->pc])); }
455 char *readString() {
char *s = getString(_state->pc); _state->pc += calcStringAlignment(s);
return s; }
456 char *getString(uint pc) {
return (
char *)(&((*_state->script)[_state->pc])); }
461 void printArgs(
const char *funcname,
int nargs,
const char *prefix =
nullptr);
462 inline void printSTUBWithArglist(
const char *funcname,
int nargs) { printArgs(funcname, nargs,
"STUB: "); }
463 void convertVOIDtoString(
int arg,
int nargs);
464 void dropStack(
int nargs);
467 void lingoError(
const char *s, ...);
471 void func_beep(
int repeats);
472 void func_goto(
Datum &frame,
Datum &movie,
bool commandgo =
false );
473 void func_gotoloop();
474 void func_gotonext();
475 void func_gotoprevious();
477 void func_playdone();
478 void func_cursor(
Datum cursorDatum);
479 int func_marker(
int m);
480 uint16 func_label(
Datum &label);
484 void initTheEntities();
485 void cleanUpTheEntities();
486 const char *entity2str(
int id);
487 const char *field2str(
int id);
493 bool _preLoadEventAbort;
497 bool _updateMovieEnabled;
501 Datum getTheEntity(
int entity,
Datum &
id,
int field);
502 void setTheEntity(
int entity,
Datum &
id,
int field,
Datum &d);
504 void setTheSprite(
Datum &
id,
int field,
Datum &d);
506 void setTheCast(
Datum &
id,
int field,
Datum &d);
508 void setTheCastLib(
Datum &
id,
int field,
Datum &d);
510 void setTheField(
Datum &id1,
int field,
Datum &d);
512 void setTheChunk(
Datum &chunk,
int field,
Datum &d);
515 Datum getTheDate(
int field);
516 Datum getTheTime(
int field);
517 Datum getTheDeskTopRectList();
534 TheEntityHash _theEntities;
535 TheEntityFieldHash _theEntityFields;
539 SymbolHash _builtinCmds;
540 SymbolHash _builtinFuncs;
541 SymbolHash _builtinConsts;
542 SymbolHash _builtinListHandlers;
544 XLibOpenerFuncHash _xlibOpeners;
545 XLibCloserFuncHash _xlibClosers;
546 XLibTypeHash _xlibTypes;
548 OpenXLibsHash _openXLibs;
549 OpenXLibsStateHash _openXLibsState;
552 OpenXLibsStateHash _openXtrasState;
559 Datum peek(uint offset);
566 DatumHash _globalvars;
586 Symbol _currentInputEvent;
589 LingoExecState _state = kRunning;
590 bool (*_shouldPause)() =
nullptr;
594 void executeImmediateScripts(
Frame *frame);
595 void executePerFrameHook(
int frame,
int subframe,
bool stepFrame =
true);
600 void initCharNormalizations();
607 bool delBreakpoint(
int id);
618 extern Lingo *g_lingo;
void void void void void debugC(int level, uint32 debugChannel, MSVC_PRINTF const char *s,...) GCC_PRINTF(3
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