int HiRes5Engine::o_checkItemTimeLimits(ScriptEnv &e) { OP_DEBUG_1("\tCHECK_ITEM_TIME_LIMITS(VARS[%d])", e.arg(1)); bool lostAnItem = false; Common::List<Item>::iterator item; for (item = _state.items.begin(); item != _state.items.end(); ++item) { const byte room = item->room; const byte region = item->region; if (room == IDI_ANY || room == IDI_CUR_ROOM || (room == _state.room && region == _state.region)) { if (getVar(e.arg(1)) < _itemTimeLimits[item->id - 1]) { item->room = IDI_VOID_ROOM; lostAnItem = true; } } } if (lostAnItem) { printString(_gameStrings.itemTimeLimit); inputString(); } return 1; }
int AdlEngine_v2::o2_isRandomGT(ScriptEnv &e) { OP_DEBUG_1("\t&& RAND() > %d", e.arg(1)); byte rnd = _random->getRandomNumber(255); if (rnd > e.arg(1)) return 1; return -1; }
int AdlEngine_v2::o2_isNounNotInRoom(ScriptEnv &e) { OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str()); Common::List<Item>::const_iterator item; for (item = _state.items.begin(); item != _state.items.end(); ++item) if (item->noun == e.getNoun() && (item->room == roomArg(e.arg(1)))) return -1; return 1; }
int AdlEngine_v2::o2_placeItem(ScriptEnv &e) { OP_DEBUG_4("\tPLACE_ITEM(%s, %s, (%d, %d))", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str(), e.arg(3), e.arg(4)); Item &item = getItem(e.arg(1)); item.room = roomArg(e.arg(2)); item.position.x = e.arg(3); item.position.y = e.arg(4); item.state = IDI_ITEM_NOT_MOVED; return 4; }
int AdlEngine_v2::o2_moveItem(ScriptEnv &e) { OP_DEBUG_2("\tSET_ITEM_ROOM(%s, %s)", itemStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str()); byte room = roomArg(e.arg(2)); Item &item = getItem(e.arg(1)); if (item.room == _roomOnScreen) _picOnScreen = 0; // Set items that move from inventory to a room to state "dropped" if (item.room == IDI_ANY && room != IDI_VOID_ROOM) item.state = IDI_ITEM_DROPPED; item.room = room; return 2; }
int AdlEngine_v3::o3_isNounNotInRoom(ScriptEnv &e) { OP_DEBUG_1("\t&& NO_SUCH_ITEMS_IN_ROOM(%s)", itemRoomStr(e.arg(1)).c_str()); Common::List<Item>::const_iterator item; bool isAnItem = false; for (item = _state.items.begin(); item != _state.items.end(); ++item) { if (item->noun == e.getNoun()) { isAnItem = true; if (item->room == roomArg(e.arg(1))) return -1; } } return (isAnItem ? 1 : -1); }
void DomainMgr::addNamedScriptEnvs(AbcEnv* abcEnv, const GCList<ScriptEnv>& envs) { // If the MethodInfo for this ScriptEnv isn't in the Domain's or Pool's // map, then we must have filtered it out as unreachable: don't // bother adding the ScriptEnv, as we'll never need to look it up. // (Note that we don't need to bother checking the parent Domains // for this, since we want to check loaded, not cached.) We can't rely // on looking up by name, since scripts all tend to be named "global", // so instead we make a temporary map of all the entries in the relevant // Pool and Domain. PoolObject* pool = abcEnv->pool(); DomainEnv* domainEnv = abcEnv->domainEnv(); Domain* domain = domainEnv->domain(); // we have no generic "set" type, so let's use a hashtable for the same purpose // (a bit more mem, but short-lived and better average lookup time than using List<>) HeapHashtable* ht = HeapHashtable::create(core->GetGC()); for (StMNHTMethodInfoIterator iter(pool->m_loadedScripts); iter.next(); ) { if (!iter.key()) continue; Atom const a = AvmCore::genericObjectToAtom(iter.value()); ht->add(a, a); } for (StMNHTMethodInfoIterator iter(domain->m_loadedScripts); iter.next(); ) { if (!iter.key()) continue; Atom const a = AvmCore::genericObjectToAtom(iter.value()); ht->add(a, a); } for (uint32_t i = 0, n = envs.length(); i < n; ++i) { ScriptEnv* se = envs[i]; AvmAssert(se->abcEnv() == abcEnv); MethodInfo* mi = se->method; AvmAssert(domainEnv->m_scriptEnvMap->get(mi) == NULL); if (ht->get(AvmCore::genericObjectToAtom(mi)) == undefinedAtom) continue; domainEnv->m_scriptEnvMap->add(mi, se); } delete ht; }
ScriptObject* DomainObject::finddef(const Multiname& multiname, DomainEnv* domainEnv) { Toplevel* toplevel = this->toplevel(); ScriptEnv* script = (ScriptEnv*) domainEnv->getScriptInit(multiname); if (script == (ScriptEnv*)BIND_AMBIGUOUS) toplevel->throwReferenceError(kAmbiguousBindingError, multiname); if (script == (ScriptEnv*)BIND_NONE) toplevel->throwReferenceError(kUndefinedVarError, multiname); if (script->global == NULL) { script->initGlobal(); Atom argv[1] = { script->global->atom() }; script->coerceEnter(0, argv); } return script->global; }
int AdlEngine_v2::o2_moveAllItems(ScriptEnv &e) { OP_DEBUG_2("\tMOVE_ALL_ITEMS(%s, %s)", itemRoomStr(e.arg(1)).c_str(), itemRoomStr(e.arg(2)).c_str()); byte room1 = roomArg(e.arg(1)); if (room1 == _state.room) _picOnScreen = 0; byte room2 = roomArg(e.arg(2)); Common::List<Item>::iterator item; for (item = _state.items.begin(); item != _state.items.end(); ++item) if (item->room == room1) { item->room = room2; if (room1 == IDI_ANY) item->state = IDI_ITEM_DROPPED; } return 2; }
double SamplerScript::_getInvocationCount(ScriptObject* self, Atom a, QNameObject* qname, uint32_t type) { #ifdef DEBUGGER AvmCore* core = self->core(); Sampler* s = core->get_sampler(); if (!s || !trusted(self)) return -1; Multiname multiname; if(qname) qname->getMultiname(multiname); ScriptObject* object = self->toplevel()->global(); if(!AvmCore::isObject(a)) { // not sure if this will be true for standalone avmplus AvmAssert(core->codeContext() != NULL); DomainEnv *domainEnv = core->codeContext()->domainEnv(); ScriptEnv* script = (ScriptEnv*) core->domainMgr()->findScriptEnvInDomainEnvByMultiname(domainEnv, multiname); if (script != (ScriptEnv*)BIND_NONE) { if (script == (ScriptEnv*)BIND_AMBIGUOUS) self->toplevel()->throwReferenceError(kAmbiguousBindingError, &multiname); object = script->global; if (object == NULL) { object = script->initGlobal(); script->coerceEnter(script->global->atom()); } } } else { object = AvmCore::atomToScriptObject(a); if(AvmCore::istype(a, CLASS_TYPE) && !qname) { // return constructor count ClassClosure *cc = (ClassClosure*)object; if (cc->vtable->init) // Vector related crash here, Tommy says: I didn't think a type could ever not have a constructor but I guess there's no reason it has to. return (double)cc->vtable->init->invocationCount(); } } if(!object || !qname) return -1; VTable *v = object->vtable; again: MethodEnv *env = NULL; Binding b = self->toplevel()->getBinding(v->traits, &multiname); switch (AvmCore::bindingKind(b)) { case BKIND_VAR: case BKIND_CONST: { // only look at slots for first pass, otherwise we're applying instance traits to the Class if(v == object->vtable) { Atom method = object->getSlotAtom(AvmCore::bindingToSlotId(b)); if(AvmCore::isObject(method)) { env = AvmCore::atomToScriptObject(method)->getCallMethodEnv(); } } break; } case BKIND_METHOD: { int m = AvmCore::bindingToMethodId(b); env = v->methods[m]; break; } case BKIND_GET: case BKIND_GETSET: case BKIND_SET: { if(type == GET && AvmCore::hasGetterBinding(b)) env = v->methods[AvmCore::bindingToGetterId(b)]; else if(type == SET && AvmCore::hasSetterBinding(b)) env = v->methods[AvmCore::bindingToSetterId(b)]; break; } case BKIND_NONE: { Atom method = object->getStringProperty(multiname.getName()); if(AvmCore::isObject(method)) { env = AvmCore::atomToScriptObject(method)->getCallMethodEnv(); } else if(v->ivtable) { v = v->ivtable; goto again; } } default: break; } if(env) return (double)env->invocationCount(); #else (void)self; (void)type; (void)qname; (void)a; #endif return -1; }
int AdlEngine_v2::o2_setRoomFromVar(ScriptEnv &e) { OP_DEBUG_1("\tROOM = VAR[%d]", e.arg(1)); getCurRoom().curPicture = getCurRoom().picture; _state.room = getVar(e.arg(1)); return 1; }
int AdlEngine_v2::o2_setPic(ScriptEnv &e) { OP_DEBUG_1("\tSET_PIC(%d)", e.arg(1)); getCurRoom().picture = getCurRoom().curPicture = _state.curPicture = e.arg(1); return 1; }