void Lua_V2::SetActorTurnChores() { lua_Object actorObj = lua_getparam(1); lua_Object leftChoreObj = lua_getparam(2); lua_Object rightChoreObj = lua_getparam(3); lua_Object costumeObj = lua_getparam(4); Costume *costume; if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R')) { return; } else if (!lua_isnil(leftChoreObj) && !lua_isstring(leftChoreObj)) { return; } else if (!lua_isnil(rightChoreObj) && !lua_isstring(rightChoreObj)) { return; } Actor *actor = getactor(actorObj); if (!findCostume(costumeObj, actor, &costume)) return; if (!costume) { costume = actor->getCurrentCostume(); } int leftChore = costume->getChoreId(lua_getstring(leftChoreObj)); int rightChore = costume->getChoreId(lua_getstring(rightChoreObj)); actor->setTurnChores(leftChore, rightChore, costume); }
void Lua_V2::SetActorMumblechore() { lua_Object actorObj = lua_getparam(1); lua_Object choreObj = lua_getparam(2); lua_Object costumeObj = lua_getparam(3); Costume *costume; int chore; if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R') || (!lua_isstring(choreObj) && !lua_isnil(choreObj))) { return; } Actor *actor = getactor(actorObj); if (!findCostume(costumeObj, actor, &costume)) return; if (lua_isnil(choreObj)) { chore = -1; } else { const char * choreStr = lua_getstring(choreObj); chore = costume->getChoreId(choreStr); } actor->setMumbleChore(chore, costume); }
void Lua_V2::SetActorTalkChore() { lua_Object actorObj = lua_getparam(1); lua_Object indexObj = lua_getparam(2); lua_Object choreObj = lua_getparam(3); lua_Object costumeObj = lua_getparam(4); Costume *costume; int chore; if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R') || !lua_isnumber(indexObj) || (!lua_isstring(choreObj) && !lua_isnil(choreObj))) { return; } int index = (int)lua_getnumber(indexObj); if (index < 1 || index > 16) return; Actor *actor = getactor(actorObj); if (!findCostume(costumeObj, actor, &costume)) return; if (lua_isnil(choreObj)) { chore = -1; } else { const char * choreStr = lua_getstring(choreObj); chore = costume->getChoreId(choreStr); } actor->setTalkChore(index, chore, costume); }
// TODO: Implement, verify, and rename unknown 5th parameter void Lua_V2::PlayActorChore() { lua_Object actorObj = lua_getparam(1); lua_Object choreObj = lua_getparam(2); lua_Object costumeObj = lua_getparam(3); lua_Object modeObj = lua_getparam(4); /* lua_Object paramObj = */ lua_getparam(5); if (!lua_isuserdata(actorObj) || lua_tag(actorObj) != MKTAG('A','C','T','R')) return; Actor *actor = getactor(actorObj); if (!lua_isstring(choreObj) || !lua_isstring(costumeObj)) lua_pushnil(); bool mode = false; // float param = 0.0; if (!lua_isnil(modeObj)) { if (lua_getnumber(modeObj) != 0.0) mode = true; //if (!lua_isnil(paramObj)) // if (lua_isnumber(paramObj)) // param = lua_getnumber(paramObj); } const char *choreName = lua_getstring(choreObj); const char *costumeName = lua_getstring(costumeObj); Costume *costume; // If a new wear chore is set and it uses a different costume than the // current one and neither of them is the shadow costume stop all active // chores and remove the old costume before setting the new one. // // This is necessary, because always the last costume on the stack, even // if it is not active, is returned by getCurrentCostume(). This would // cause an issue if the costumes would have different joints and the lua // code would consider a different costume active than the C code. if (0 == strncmp("wear_", choreName, 5)) { if (0 != strncmp("fx/dumbshadow.cos", costumeName, 17)) { if (actor->getCurrentCostume() != NULL && actor->getCurrentCostume()->getFilename() != "fx/dumbshadow.cos" && actor->getCurrentCostume()->getFilename().compareToIgnoreCase(costumeName) != 0) { actor->stopAllChores(); actor->setRestChore(-1, NULL); actor->setWalkChore(-1, NULL); actor->setTurnChores(-1, -1, NULL); actor->setMumbleChore(-1, NULL); actor->popCostume(); } } } if (!findCostume(costumeObj, actor, &costume)) return; EMIChore *chore = (EMIChore *)costume->getChore(choreName); if (0 == strncmp("wear_", choreName, 5)) { actor->setLastWearChore(costume->getChoreId(choreName), costume); } if (mode) { costume->playChoreLooping(choreName); } else { costume->playChore(choreName); } if (chore) { lua_pushusertag(chore->getId(), MKTAG('C','H','O','R')); } else { lua_pushnil(); } }