Actor *GameData::GetCreature(const char* ResRef, unsigned int PartySlot) { DataStream* ds = GetResource( ResRef, IE_CRE_CLASS_ID ); if (!ds) return 0; PluginHolder<ActorMgr> actormgr(IE_CRE_CLASS_ID); if (!actormgr->Open(ds)) { return 0; } Actor* actor = actormgr->GetActor(PartySlot); return actor; }
int GameData::LoadCreature(const char* ResRef, unsigned int PartySlot, bool character, int VersionOverride) { DataStream *stream; Actor* actor; if (character) { char nPath[_MAX_PATH], fName[16]; snprintf( fName, sizeof(fName), "%s.chr", ResRef); PathJoin( nPath, core->GamePath, "characters", fName, NULL ); FileStream *fs = new FileStream(); fs -> Open( nPath, true ); stream = (DataStream *) fs; PluginHolder<ActorMgr> actormgr(IE_CRE_CLASS_ID); if (!actormgr->Open( stream, true )) { return -1; } actor = actormgr->GetActor(PartySlot); } else { actor = GetCreature(ResRef, PartySlot); } if ( !actor ) { return -1; } if (VersionOverride != -1) { actor->version = VersionOverride; } //both fields are of length 9, make this sure! memcpy(actor->Area, core->GetGame()->CurrentArea, sizeof(actor->Area) ); if (actor->BaseStats[IE_STATE_ID] & STATE_DEAD) { actor->SetStance( IE_ANI_TWITCH ); } else { actor->SetStance( IE_ANI_AWAKE ); } actor->SetOrientation( 0, false ); if ( PartySlot != 0 ) { return core->GetGame()->JoinParty( actor, JP_JOIN|JP_INITPOS ); } else { return core->GetGame()->AddNPC( actor ); } }