void Lua_V1::IrisDown() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object timeObj = lua_getparam(3); g_grim->playIrisAnimation(Iris::Close, (int)lua_getnumber(xObj), (int)lua_getnumber(yObj), (int)lua_getnumber(timeObj)); }
void Lua_V1::ImSetParam() { lua_Object nameObj = lua_getparam(1); lua_Object paramObj = lua_getparam(2); lua_Object valueObj = lua_getparam(3); if (lua_isnumber(nameObj)) error("ImSetParam: getting name from number is not supported"); if (!lua_isstring(nameObj)) { lua_pushnumber(-1.0); return; } const char *soundName = lua_getstring(nameObj); int param = (int)lua_getnumber(paramObj); int value = (int)lua_getnumber(valueObj); if (value < 0) value = 0; switch (param) { case IM_SOUND_VOL: g_imuse->setVolume(soundName, value); break; case IM_SOUND_PAN: g_imuse->setPan(soundName, value); break; default: error("ImSetParam() Unimplemented %d", param); } }
void Lua_V2::WorldToScreen() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); if (!lua_isnumber(xObj) || !lua_isnumber(yObj) || !lua_isnumber(zObj)) { lua_pushnumber(0.0); lua_pushnumber(0.0); return; } float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); Math::Vector3d pos = Math::Vector3d(x, y, z); const Set::Setup *setup = g_emi->getCurrSet()->getCurrSetup(); const Math::Vector3d interest = setup->_interest; const float roll = setup->_roll; const Math::Quaternion quat = Math::Quaternion(interest.x(), interest.y(), interest.z(), roll); Math::Matrix4 view = quat.toMatrix(); view.transpose(); pos -= setup->_pos; pos = view.getRotation() * pos; pos.z() = -pos.z(); Math::Matrix4 proj = GfxBase::makeProjMatrix(setup->_fov, setup->_nclip, setup->_fclip); proj.transpose(); Math::Vector4d screen = proj * Math::Vector4d(pos.x(), pos.y(), pos.z(), 1.0); screen /= screen.w(); lua_pushnumber((screen.x() + 1) * 320); lua_pushnumber((1 - screen.y()) * 240); }
/***************************************************************************\ * CGM CD_SCLMDE. * \***************************************************************************/ static int cgm_sclmdecb(cdCanvas *canvas, short scl_mde, short *draw_mode_i, double *factor_f) { lua_Object func, result, draw_mode, factor; int result_i; lua_beginblock(); func = lua_getref(cdluacgmcb[CD_CGMSCLMDECB].lock); cdlua_pushcanvas(canvas); lua_pushnumber( scl_mde); lua_callfunction(func); result = lua_getresult(1); if (!lua_isnumber(result)) lua_error("cdPlay: CD_CGMSCLMDECB: invalid return value!"); result_i = (int) lua_getnumber(result); if (result_i == 1) { lua_endblock(); return 1; } draw_mode = lua_getresult(2); if (!lua_isnumber(draw_mode)) lua_error("cdPlay: CD_CGMSCLMDECB: invalid draw_mode return value!"); *draw_mode_i = (short) lua_getnumber(draw_mode); factor = lua_getresult(3); if (!lua_isnumber(factor)) lua_error("cdPlay: CD_CGMSCLMDECB: invalid factor return value!"); *factor_f = (double) lua_getnumber(factor); lua_endblock(); return result_i; }
/* Find the sector (of any type) which contains * the requested coordinate (x,y,z). */ void L1_GetPointSector() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); lua_Object typeObj = lua_getparam(4); Sector::SectorType sectorType; if (!lua_isnumber(xObj) || !lua_isnumber(yObj) || !lua_isnumber(zObj)) { lua_pushnil(); return; } if (lua_isnil(typeObj)) sectorType = Sector::WalkType; else sectorType = (Sector::SectorType)(int)lua_getnumber(typeObj); float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); Graphics::Vector3d point(x, y, z); Sector *result = g_grim->getCurrScene()->findPointSector(point, sectorType); if (result) { lua_pushnumber(result->getSectorId()); lua_pushstring(const_cast<char *>(result->getName())); lua_pushnumber(result->getType()); } else { lua_pushnil(); } }
void Lua_V2::WalkActorToAvoiding() { lua_Object actorObj = lua_getparam(1); lua_Object actor2Obj = lua_getparam(2); lua_Object xObj = lua_getparam(3); lua_Object yObj = lua_getparam(4); lua_Object zObj = lua_getparam(5); if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R')) return; if (!lua_isuserdata(actor2Obj) || lua_tag(actor2Obj) != MKTAG('A','C','T','R')) return; Math::Vector3d destVec; Actor *actor = getactor(actorObj); if (!lua_isnumber(xObj)) { if (!lua_isuserdata(xObj) || lua_tag(xObj) != MKTAG('A','C','T','R')) return; Actor *destActor = getactor(xObj); destVec = destActor->getPos(); } else { float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); destVec.set(x, y, z); } // TODO: Make this actually avoid the second actor actor->walkTo(destVec); }
void L1_IsPointInSector() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); lua_Object nameObj = lua_getparam(4); if (!lua_isstring(nameObj)) { lua_pushnil(); return; } const char *name = lua_getstring(nameObj); float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); Graphics::Vector3d pos(x, y, z); int numSectors = g_grim->getCurrScene()->getSectorCount(); for (int i = 0; i < numSectors; i++) { Sector *sector = g_grim->getCurrScene()->getSectorBase(i); if (strstr(sector->getName(), name)) { if (sector->isPointInSector(pos)) { lua_pushnumber(sector->getSectorId()); lua_pushstring(sector->getName()); lua_pushnumber(sector->getType()); return; } } } lua_pushnil(); }
void Lua_V2::SetGroupVolume() { lua_Object groupObj = lua_getparam(1); lua_Object volumeObj = lua_getparam(2); if (!lua_isnumber(groupObj)) return; int group = (int)lua_getnumber(groupObj); int volume = Audio::Mixer::kMaxChannelVolume; if (lua_isnumber(volumeObj)) volume = convertEmiVolumeToMixer((int)lua_getnumber(volumeObj)); switch (group) { case 1: // SFX g_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume); g_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kPlainSoundType, volume); break; case 2: // Voice g_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, volume); break; case 3: // Music g_system->getMixer()->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, volume); break; default: error("Lua_V2::SetGroupVolume - unknown group %d", group); } // FIXME: func(group, volume); Debug::debug(Debug::Sound | Debug::Scripts, "Lua_V2::SetGroupVolume: group: %d, volume %d", group, volume); }
/* Given a position and a size this function calculates and pushes * the nearest point to that which will be valid if the boxes are * shrunk by the amount specified. */ void L1_GetShrinkPos() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); lua_Object rObj = lua_getparam(4); if (!lua_isnumber(xObj) || !lua_isnumber(yObj) || !lua_isnumber(zObj) || !lua_isnumber(rObj)) return; float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); float r = lua_getnumber(rObj); Graphics::Vector3d pos; pos.set(x, y, z); Sector* sector; g_grim->getCurrScene()->shrinkBoxes(r); g_grim->getCurrScene()->findClosestSector(pos, §or, &pos); g_grim->getCurrScene()->unshrinkBoxes(); if (sector) { lua_pushnumber(pos.x()); lua_pushnumber(pos.y()); lua_pushnumber(pos.z()); } else { lua_pushnil(); } }
void Lua_V1::ImFadeParam() { lua_Object nameObj = lua_getparam(1); lua_Object opcodeObj = lua_getparam(2); lua_Object valueObj = lua_getparam(3); lua_Object durationObj = lua_getparam(4); if (!lua_isstring(nameObj) && !lua_isnumber(nameObj)) { lua_pushnumber(0); return; } if (!lua_isnumber(opcodeObj) || !lua_isnumber(valueObj) || !lua_isnumber(durationObj)) return; if (lua_isnumber(nameObj)) { error("ImFadeParam: getting name from number is not supported"); } const char *soundName = lua_getstring(nameObj); int opcode = (int)lua_getnumber(opcodeObj); int value = (int)lua_getnumber(valueObj); if (value < 0) value = 0; int duration = (int)lua_getnumber(durationObj); switch (opcode) { case IM_SOUND_PAN: g_imuse->setFadePan(soundName, value, duration); break; default: error("ImFadeParam(%s, %x, %d, %d)", soundName, opcode, value, duration); break; } }
void L1_SetVideoDevices() { int devId; int modeId; devId = (int)lua_getnumber(lua_getparam(1)); modeId = (int)lua_getnumber(lua_getparam(2)); // ignore setting video devices }
void Lua_V1::DimRegion() { int x = (int)lua_getnumber(lua_getparam(1)); int y = (int)lua_getnumber(lua_getparam(2)); int w = (int)lua_getnumber(lua_getparam(3)); int h = (int)lua_getnumber(lua_getparam(4)); float level = lua_getnumber(lua_getparam(5)); g_driver->dimRegion(x, y, w, h, level); }
static void math_mod (void) { int d1, d2; lua_Object o1 = lua_getparam (1); lua_Object o2 = lua_getparam (2); if (!lua_isnumber(o1) || !lua_isnumber(o2)) { lua_error ("incorrect arguments to function `mod'"); return; } d1 = (int) lua_getnumber(o1); d2 = (int) lua_getnumber(o2); lua_pushnumber (d1%d2); }
static void math_pow (void) { double d1, d2; lua_Object o1 = lua_getparam (1); lua_Object o2 = lua_getparam (2); if (!lua_isnumber(o1) || !lua_isnumber(o2)) { lua_error ("incorrect arguments to function `pow'"); return; } d1 = lua_getnumber(o1); d2 = lua_getnumber(o2); lua_pushnumber (pow(d1,d2)); }
void LuaBase::setTextObjectParams(TextObjectCommon *textObject, lua_Object tableObj) { lua_Object keyObj; lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectX)); keyObj = lua_gettable(); if (keyObj) { if (lua_isnumber(keyObj)) { float num = lua_getnumber(keyObj); if (g_grim->getGameType() == GType_MONKEY4) textObject->setX((int)(num * 320)); else textObject->setX((int)num); } } lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectY)); keyObj = lua_gettable(); if (keyObj) { if (lua_isnumber(keyObj)) { float num = lua_getnumber(keyObj); if (g_grim->getGameType() == GType_MONKEY4) textObject->setY((int)(num * 240)); else textObject->setY((int)num); } } lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectFont)); keyObj = lua_gettable(); if (keyObj) { if (g_grim->getGameType() == GType_MONKEY4 && lua_isstring(keyObj)) { const char *str = lua_getstring(keyObj); Font *font = 0; foreach (Font *f, Font::getPool()) { if (f->getFilename() == str) { font = f; } } if (!font) { font = g_resourceloader->loadFont(str); } textObject->setFont(font); } else if (lua_isuserdata(keyObj) && lua_tag(keyObj) == MKTAG('F','O','N','T')) { textObject->setFont(getfont(keyObj)); } else if (g_grim->getGameType() == GType_MONKEY4 && !textObject->getFont() && g_grim->getGamePlatform() == Common::kPlatformPS2) { // HACK: warning("HACK: No default font set for PS2-version, just picking one for now"); textObject->setFont(*Font::getPool().begin()); } }
static void L2_AdvanceChore() { lua_Object choreObj = lua_getparam(1); lua_Object timeObj = lua_getparam(2); if (!lua_isnumber(choreObj) || !lua_isnumber(timeObj)) return; int chore = (int)lua_getnumber(choreObj); float time = lua_getnumber(timeObj); // FIXME: implement missong code warning("L2_AdvanceChore: stub, chore: %d time: %f", chore, time); }
/* ** Write a variable. On error put 0 on stack, otherwise put 1. ** LUA interface: ** status = write (variable [,format]) ** ** O formato pode ter um dos seguintes especificadores: ** ** s ou S -> para string ** f ou F, g ou G, e ou E -> para reais ** i ou I -> para inteiros ** ** Estes especificadores podem vir seguidos de: ** ** [?][m][.n] ** ** onde: ** ? -> indica justificacao ** < = esquerda ** | = centro ** > = direita (default) ** m -> numero maximo de campos (se exceder estoura) ** n -> indica precisao para ** reais -> numero de casas decimais ** inteiros -> numero minimo de digitos ** string -> nao se aplica */ static char *buildformat (char *e, lua_Object o) { static char buffer[512]; static char f[80]; char *string = &buffer[255]; char t, j='r'; int m=0, n=0, l; while (isspace(*e)) e++; t = *e++; if (*e == '<' || *e == '|' || *e == '>') j = *e++; while (isdigit(*e)) m = m*10 + (*e++ - '0'); e++; /* skip point */ while (isdigit(*e)) n = n*10 + (*e++ - '0'); sprintf(f,"%%"); if (j == '<' || j == '|') sprintf(strchr(f,0),"-"); if (m != 0) sprintf(strchr(f,0),"%d", m); if (n != 0) sprintf(strchr(f,0),".%d", n); sprintf(strchr(f,0), "%c", t); switch (tolower(t)) { case 'i': t = 'i'; sprintf (string, f, (long int)lua_getnumber(o)); break; case 'f': case 'g': case 'e': t = 'f'; sprintf (string, f, (float)lua_getnumber(o)); break; case 's': t = 's'; sprintf (string, f, lua_getstring(o)); break; default: return ""; } l = strlen(string); if (m!=0 && l>m) { int i; for (i=0; i<m; i++) string[i] = '*'; string[i] = 0; } else if (m!=0 && j=='|') { int i=l-1; while (isspace(string[i])) i--; string -= (m-i) / 2; i=0; while (string[i]==0) string[i++] = ' '; string[l] = 0; } return string; }
void Lua_V1::NewObjectState() { int setupID = (int)lua_getnumber(lua_getparam(1)); int val = (int)lua_getnumber(lua_getparam(2)); ObjectState::Position pos = (ObjectState::Position)val; const char *bitmap = lua_getstring(lua_getparam(3)); const char *zbitmap = NULL; if (!lua_isnil(lua_getparam(4))) zbitmap = lua_getstring(lua_getparam(4)); bool transparency = getbool(5); ObjectState *state = g_grim->getCurrSet()->addObjectState(setupID, pos, bitmap, zbitmap, transparency); lua_pushusertag(state->getId(), MKTAG('S','T','A','T')); }
void LuaBase::setTextObjectParams(TextObjectCommon *textObject, lua_Object tableObj) { lua_Object keyObj; lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectX)); keyObj = lua_gettable(); if (keyObj) { if (lua_isnumber(keyObj)) { float num = lua_getnumber(keyObj); if (g_grim->getGameType() == GType_MONKEY4) textObject->setX((int)(num * 640)); else textObject->setX((int)num); } } lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectY)); keyObj = lua_gettable(); if (keyObj) { if (lua_isnumber(keyObj)) { float num = lua_getnumber(keyObj); if (g_grim->getGameType() == GType_MONKEY4) textObject->setY((int)(num * 480)); else textObject->setY((int)num); } } lua_pushobject(tableObj); lua_pushobject(lua_getref(refTextObjectFont)); keyObj = lua_gettable(); if (keyObj) { if (g_grim->getGameType() == GType_MONKEY4 && lua_isstring(keyObj)) { const char *str = lua_getstring(keyObj); Font *font = 0; foreach (Font *f, Font::getPool()) { if (f->getFilename() == str) { font = f; } } if (!font) { font = g_resourceloader->loadFont(str); } textObject->setFont(font); } else if (lua_isuserdata(keyObj) && lua_tag(keyObj) == MKTAG('F','O','N','T')) { textObject->setFont(getfont(keyObj)); } }
void Lua_V1::ScreenShot() { int width = (int)lua_getnumber(lua_getparam(1)); int height = (int)lua_getnumber(lua_getparam(2)); GrimEngine::EngineMode mode = g_grim->getMode(); g_grim->setMode(GrimEngine::NormalMode); g_grim->updateDisplayScene(); g_driver->storeDisplay(); Bitmap *screenshot = g_driver->getScreenshot(width, height); g_grim->setMode(mode); if (screenshot) { lua_pushusertag(screenshot->getId(), MKTAG('V','B','U','F')); } else { lua_pushnil(); } }
void Lua_V2::SetGroupVolume() { lua_Object groupObj = lua_getparam(1); lua_Object volumeObj = lua_getparam(2); if (!lua_isnumber(groupObj)) return; int group = (int)lua_getnumber(groupObj); int volume = 100; if (lua_isnumber(volumeObj)) volume = (int)lua_getnumber(volumeObj); // FIXME: func(group, volume); warning("Lua_V2::SetGroupVolume: implement opcode, group: %d, volume %d", group, volume); }
static void CreateCbox(void) { int tag = (int)lua_getnumber(lua_getglobal("iuplua_tag")); Ihandle** params = iuplua_checkihandle_array(1); lua_pushusertag(IupCboxv(params),tag); free(params); }
void Lua_V2::SetActorLighting() { lua_Object actorObj = lua_getparam(1); lua_Object lightModeObj = lua_getparam(2); if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R')) return; Actor *actor = getactor(actorObj); if (!actor) return; if (lua_isnil(lightModeObj) || !lua_isnumber(lightModeObj)) return; int lightMode = (int)lua_getnumber(lightModeObj); if (lightMode != 0) { if (lightMode == 1) { //FIXME actor-> warning("Lua_V2::SetActorLighting: case param 1(LIGHT_FASTDYN), actor: %s", actor->getName().c_str()); } else if (lightMode == 2) { //FIXME actor-> warning("Lua_V2::SetActorLighting: case param 2(LIGHT_NORMDYN), actor: %s", actor->getName().c_str()); } else { actor->setGlobalAlpha(0.0f); actor->setAlphaMode(Grim::Actor::AlphaReplace); } } else { //FIXME actor-> warning("Lua_V2::SetActorLighting: case param 0(LIGHT_STATIC), actor: %s", actor->getName().c_str()); } }
void Lua_V2::SetActorCollisionMode() { lua_Object actorObj = lua_getparam(1); lua_Object modeObj = lua_getparam(2); if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R')) return; Actor *actor = getactor(actorObj); assert(actor); int mode = (int)lua_getnumber(modeObj); Actor::CollisionMode m; switch (mode) { case Actor::CollisionOff: m = Actor::CollisionOff; break; case Actor::CollisionBox: m = Actor::CollisionBox; break; case Actor::CollisionSphere: m = Actor::CollisionSphere; break; default: warning("Lua_V2::SetActorCollisionMode(): wrong collisionmode: %d, using default 0", mode); m = Actor::CollisionOff; } actor->setCollisionMode(m); }
void L1_MakeSectorActive() { lua_Object sectorObj = lua_getparam(1); if (!lua_isnumber(sectorObj) && !lua_isstring(sectorObj)) return; // FIXME: This happens on initial load. Are we initting something in the wrong order? if (!g_grim->getCurrScene()) { warning("!!!! Trying to call MakeSectorActive without a scene"); return; } bool visible = !lua_isnil(lua_getparam(2)); int numSectors = g_grim->getCurrScene()->getSectorCount(); if (lua_isstring(sectorObj)) { const char *name = lua_getstring(sectorObj); for (int i = 0; i < numSectors; i++) { Sector *sector = g_grim->getCurrScene()->getSectorBase(i); if (strmatch(sector->getName(), name)) { sector->setVisible(visible); return; } } } else if (lua_isnumber(sectorObj)) { int id = (int)lua_getnumber(sectorObj); for (int i = 0; i < numSectors; i++) { Sector *sector = g_grim->getCurrScene()->getSectorBase(i); if (sector->getSectorId() == id) { sector->setVisible(visible); return; } } } }
static void CreateImageRGBA(void) { int i, count, width, height; unsigned char *pixels; lua_Object n, obj = luaL_tablearg(3); width = luaL_check_int(1); height = luaL_check_int(2); count = width * height * 4; pixels = (unsigned char *) malloc(count); for (i = 0; i < count; i++) { lua_beginblock(); lua_pushobject(obj); lua_pushnumber(i+1); n = lua_gettable(); if (!lua_isnumber(n)) { lua_endblock(); lua_error("iupCreateImage: incorrect value in argument"); } pixels[i] = (unsigned char)lua_getnumber(n); lua_endblock(); } lua_pushusertag(IupImageRGBA(width, height, pixels), iuplua_tag); free(pixels); }
void Lua_V1::TextFileGetLine() { char textBuf[1000]; lua_Object nameObj = lua_getparam(1); lua_Object posObj = lua_getparam(2); Common::SeekableReadStream *file; if (lua_isnil(nameObj) || lua_isnil(posObj)) { lua_pushnil(); return; } const char *filename = lua_getstring(nameObj); Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); file = saveFileMan->openForLoading(filename); if (!file) { lua_pushnil(); return; } int pos = (int)lua_getnumber(posObj); file->seek(pos, SEEK_SET); memset(textBuf, 0, 1000); file->readLine(textBuf, 1000); delete file; lua_pushstring(textBuf); }
int iuplua_call(void) { lua_Object obj; if (lua_call("iupCallMethod")) { lua_endblock(); return IUP_DEFAULT; /* call failed */ } obj = lua_getresult(1); if (obj == LUA_NOOBJECT) { lua_endblock(); return IUP_DEFAULT; /* no return, provides IUP_DEFAULT return */ } else if (lua_isnumber(obj)) { int ret = (int) lua_getnumber(obj); lua_endblock(); return ret; } lua_endblock(); return IUP_DEFAULT; /* returned a non normal value. what to do? */ }
static int32 getnarg (lua_Object table) { lua_Object temp; /* temp = table.n */ lua_pushobject(table); lua_pushstring("n"); temp = lua_rawgettable(); return (lua_isnumber(temp) ? (int32)lua_getnumber(temp) : MAX_INT); }
void Lua_V1::ImSetState() { lua_Object stateObj = lua_getparam(1); if (!lua_isnumber(stateObj)) return; g_imuseState = (int)lua_getnumber(stateObj); }