scummvm/engines/director/lingo/lingodec/names.cpp
2024-11-26 00:32:00 +01:00

365 lines
8.7 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#include "common/str.h"
#include "common/stream.h"
#include "common/util.h"
#include "./enums.h"
#include "./names.h"
namespace LingoDec {
namespace StandardNames {
/* StandardNames */
const char *const opcodeNamesS[] = {
// single-byte
"unk00",
"ret", // kOpRet 0x01
"retfactory", // kOpRetFactory 0x02
"pushzero", // kOpPushZero 0x03
"mul", // kOpMul 0x04
"add", // kOpAdd 0x05
"sub", // kOpSub 0x06
"div", // kOpDiv 0x07
"mod", // kOpMod 0x08
"inv", // kOpInv 0x09
"joinstr", // kOpJoinStr 0x0a
"joinpadstr", // kOpJoinPadStr 0x0b
"lt", // kOpLt 0x0c
"lteq", // kOpLtEq 0x0d
"nteq", // kOpNtEq 0x0e
"eq", // kOpEq 0x0f
"gt", // kOpGt 0x10
"gteq", // kOpGtEq 0x11
"and", // kOpAnd 0x12
"or", // kOpOr 0x13
"not", // kOpNot 0x14
"containsstr", // kOpContainsStr 0x15
"contains0str", // kOpContains0Str 0x16
"getchunk", // kOpGetChunk 0x17
"hilitechunk", // kOpHiliteChunk 0x18
"ontospr", // kOpOntoSpr 0x19
"intospr", // kOpIntoSpr 0x1a
"getfield", // kOpGetField 0x1b
"starttell", // kOpStartTell 0x1c
"endtell", // kOpEndTell 0x1d
"pushlist", // kOpPushList 0x1e
"pushproplist", // kOpPushPropList 0x1f
"unk20",
"swap", // kOpSwap 0x21
};
const char *const opcodeNamesM[] = {
// multi-byte
"unk40",
"pushint8", // kOpPushInt8 0x41
"pusharglistnoret", // kOpPushArgListNoRet 0x42
"pusharglist", // kOpPushArgList 0x43
"pushcons", // kOpPushCons 0x44
"pushsymb", // kOpPushSymb 0x45
"pushvarref", // kOpPushVarRef 0x46
"unk47",
"getglobal2", // kOpGetGlobal2 0x48
"getglobal", // kOpGetGlobal 0x49
"getprop", // kOpGetProp 0x4a
"getparam", // kOpGetParam 0x4b
"getlocal", // kOpGetLocal 0x4c
"unk4d",
"setglobal2", // kOpSetGlobal2 0x4e
"setglobal", // kOpSetGlobal 0x4f
"setprop", // kOpSetProp 0x50
"setparam", // kOpSetParam 0x51
"setlocal", // kOpSetLocal 0x52
"jmp", // kOpJmp 0x53
"endrepeat", // kOpEndRepeat 0x54
"jmpifz", // kOpJmpIfZ 0x55
"localcall", // kOpLocalCall 0x56
"extcall", // kOpExtCall 0x57
"objcallv4", // kOpObjCallV4 0x58
"put", // kOpPut 0x59
"putchunk", // kOpPutChunk 0x5a
"deletechunk", // kOpDeleteChunk 0x5b
"get", // kOpGet 0x5c
"set", // kOpSet 0x5d
"unk5e",
"getmovieprop", // kOpGetMovieProp 0x5f
"setmovieprop", // kOpSetMovieProp 0x60
"getobjprop", // kOpGetObjProp 0x61
"setobjprop", // kOpSetObjProp 0x62
"tellcall", // kOpTellCall 0x63
"peek", // kOpPeek 0x64
"pop", // kOpPop 0x65
"thebuiltin", // kOpTheBuiltin 0x66
"objcall", // kOpObjCall 0x67
"unk68",
"unk69",
"unk6a",
"unk6b",
"unk6c",
"pushchunkvarref", // kOpPushChunkVarRef 0x6d
"pushint16", // kOpPushInt16 0x6e
"pushint32", // kOpPushInt32 0x6f
"getchainedprop", // kOpGetChainedProp 0x70
"pushfloat32", // kOpPushFloat32 0x71
"gettoplevelprop", // kOpGetTopLevelProp 0x72
"newobj", // kOpNewObj 0x73
};
const char *const binaryOpNames[] = {
"unk00",
"unk01",
"unk02",
"unk03",
"*", // kOpMul 0x04
"+", // kOpAdd 0x05
"-", // kOpSub 0x06
"/", // kOpDiv 0x07
"mod", // kOpMod 0x08
"unk09",
"&", // kOpJoinStr 0x0a
"&&", // kOpJoinPadStr 0x0b
"<", // kOpLt 0x0c
"<=", // kOpLtEq 0x0d
"<>", // kOpNtEq 0x0e
"=", // kOpEq 0x0f
">", // kOpGt 0x10
">=", // kOpGtEq 0x11
"and", // kOpAnd 0x12
"or", // kOpOr 0x13
"unk14",
"contains", // kOpContainsStr 0x15
"starts", // kOpContains0Str 0x16
};
const char *const chunkTypeNames[] = {
"unk00",
"char", // kChunkChar 0x01
"word", // kChunkWord 0x02
"item", // kChunkItem 0x03
"line", // kChunkLine 0x04
};
const char *const putTypeNames[] = {
"unk00",
"into", // kPutInto 0x01
"after", // kPutAfter 0x02
"before", // kPutBefore 0x03
};
const char *const moviePropertyNames[] = {
"floatPrecision", // 0x00
"mouseDownScript", // 0x01
"mouseUpScript", // 0x02
"keyDownScript", // 0x03
"keyUpScript", // 0x04
"timeoutScript", // 0x05
"short time", // 0x06
"abbr time", // 0x07
"long time", // 0x08
"short date", // 0x09
"abbr date", // 0x0a
"long date", // 0x0b
};
const char *const whenEventNames[] = {
"unk00",
"mouseDown",// 0x01
"mouseUp", // 0x02
"keyDown", // 0x03
"keyUp", // 0x04
"timeOut", // 0x05
};
const char *const menuPropertyNames[] = {
"unk00",
"name", // 0x01
"number of menuItems", // 0x02
};
const char *const menuItemPropertyNames[] = {
"unk00",
"name", // 0x01
"checkMark",// 0x02
"enabled", // 0x03
"script", // 0x04
};
const char *const soundPropertyNames[] = {
"unk00",
"volume", // 0x01
};
const char *const spritePropertyNames[] = {
"unk00",
"type", // 0x01
"backColor", // 0x02
"bottom", // 0x03
"castNum", // 0x04
"constraint", // 0x05
"cursor", // 0x06
"foreColor", // 0x07
"height", // 0x08
"immediate", // 0x09
"ink", // 0x0a
"left", // 0x0b
"lineSize", // 0x0c
"locH", // 0x0d
"locV", // 0x0e
"movieRate", // 0x0f
"movieTime", // 0x10
"pattern", // 0x11
"puppet", // 0x12
"right", // 0x13
"startTime", // 0x14
"stopTime", // 0x15
"stretch", // 0x16
"top", // 0x17
"trails", // 0x18
"visible", // 0x19
"volume", // 0x1a
"width", // 0x1b
"blend", // 0x1c
"scriptNum", // 0x1d
"moveableSprite", // 0x1e
"editableText", // 0x1f
"scoreColor", // 0x20
"loc", // 0x21
"rect", // 0x22
"memberNum", // 0x23
"castLibNum", // 0x24
"member", // 0x25
"scriptInstanceList", // 0x26
"currentTime", // 0x27
"mostRecentCuePoint", // 0x28
"tweened", // 0x29
"name", // 0x2a
};
const char *const animationPropertyNames[] = {
"unk00",
"beepOn", // 0x01
"buttonStyle", // 0x02
"centerStage", // 0x03
"checkBoxAccess", // 0x04
"checkboxType", // 0x05
"colorDepth", // 0x06
"colorQD", // 0x07
"exitLock", // 0x08
"fixStageSize", // 0x09
"fullColorPermit", // 0x0a
"imageDirect", // 0x0b
"doubleClick", // 0x0c
"key", // 0x0d
"lastClick", // 0x0e
"lastEvent", // 0x0f
"keyCode", // 0x10
"lastKey", // 0x11
"lastRoll", // 0x12
"timeoutLapsed", // 0x13
"multiSound", // 0x14
"pauseState", // 0x15
"quickTimePresent", // 0x16
"selEnd", // 0x17
"selStart", // 0x18
"soundEnabled", // 0x19
"soundLevel", // 0x1a
"stageColor", // 0x1b
// 0x1c indicates dontPassEvent was called.
// It doesn't seem to have a Lingo-accessible name.
"unk1c",
"switchColorDepth", // 0x1d
"timeoutKeyDown", // 0x1e
"timeoutLength", // 0x1f
"timeoutMouse", // 0x20
"timeoutPlay", // 0x21
"timer", // 0x22
"preLoadRAM", // 0x23
"videoForWindowsPresent", // 0x24
"netPresent", // 0x25
"safePlayer", // 0x26
"soundKeepDevice", // 0x27
"soundMixMedia", // 0x28
};
const char *const animation2PropertyNames[] = {
"unk00",
"perFrameHook", // 0x01
"number of castMembers",// 0x02
"number of menus", // 0x03
"number of castLibs", // 0x04
"number of xtras", // 0x05
};
const char *const memberPropertyNames[] = {
"unk00",
"name", // 0x01
"text", // 0x02
"textStyle", // 0x03
"textFont", // 0x04
"textHeight", // 0x05
"textAlign", // 0x06
"textSize", // 0x07
"picture", // 0x08
"hilite", // 0x09
"number", // 0x0a
"size", // 0x0b
"loop", // 0x0c
"duration", // 0x0d
"controller", // 0x0e
"directToStage",// 0x0f
"sound", // 0x10
"foreColor", // 0x11
"backColor", // 0x12
"type", // 0x13
};
Common::String getOpcodeName(byte id) {
if (id < 0x22)
return opcodeNamesS[id];
if (id < 0x40)
return Common::String::format("unk%02x" , id);
id = id % 0x40;
if (id < 0x34)
return opcodeNamesM[id];
return Common::String::format("unk%02x" , id);
}
} // namespace StandardNames
/* ScriptNames */
void ScriptNames::read(Common::SeekableReadStream &stream) {
// Lingo scripts are always big endian regardless of file endianness
unknown0 = stream.readSint32BE();
unknown1 = stream.readSint32BE();
len1 = stream.readUint32BE();
len2 = stream.readUint32BE();
namesOffset = stream.readUint16BE();
namesCount = stream.readUint16BE();
stream.seek(namesOffset);
names.resize(namesCount);
for (auto &name : names) {
name = stream.readPascalString();
}
}
bool ScriptNames::validName(int id) const {
return -1 < id && (unsigned)id < names.size();
}
Common::String ScriptNames::getName(int id) const {
if (validName(id))
return names[id];
return Common::String::format("UNKNOWN_NAME_%d", id);
}
}