Targets* GetAllObjects(Map *map, Scriptable* Sender, Object* oC, int ga_flags) { if (!oC) { return NULL; } Targets* tgts = EvaluateObject(map, Sender, oC, ga_flags); //if we couldn't find an endpoint by name or object qualifiers //it is not an Actor, but could still be a Door or Container (scriptable) if (!tgts && oC->objectName[0]) { return NULL; } //now lets do the object filter stuff, we create Targets because //it is possible to start from blank sheets using endpoint filters //like (Myself, Protagonist etc) if (!tgts) { tgts = new Targets(); } tgts = DoObjectFiltering(Sender, tgts, oC, ga_flags); return tgts; }
bool MatchActor(Scriptable *Sender, ieDword actorID, Object* oC) { if (!Sender) { return false; } Actor *ac = Sender->GetCurrentArea()->GetActorByGlobalID(actorID); if (!ac) { return false; } // [0]/[ANYONE] can match all actors if (!oC) { return true; } bool filtered = false; // name matching if (oC->objectName[0]) { if (strnicmp(ac->GetScriptName(), oC->objectName, 32) != 0) { return false; } filtered = true; } // IDS targeting // (if we already matched by name, we don't do this) // TODO: check distance? area? visibility? if (!filtered && !DoObjectIDSCheck(oC, ac, &filtered)) return false; // globalID hack should never get here assert(oC->objectFilters[0] != -1); // object filters if (oC->objectFilters[0]) { // object filters insist on having a stupid targets list, // so we waste a lot of time here Targets *tgts = new Targets(); int ga_flags = 0; // TODO: correct? // handle already-filtered vs not-yet-filtered cases // e.g. LastTalkedToBy(Myself) vs LastTalkedToBy if (filtered) tgts->AddTarget(ac, 0, ga_flags); tgts = DoObjectFiltering(Sender, tgts, oC, ga_flags); if (!tgts) return false; // and sometimes object filters are lazy and not only don't filter // what we give them, they clear it and return a list :( // so we have to search the whole list.. bool ret = false; targetlist::iterator m; const targettype *tt = tgts->GetFirstTarget(m, ST_ACTOR); while (tt) { Actor *actor = (Actor *) tt->actor; if (actor->GetGlobalID() == actorID) { ret = true; break; } tt = tgts->GetNextTarget(m, ST_ACTOR); } delete tgts; if (!ret) return false; } return true; }