void World::update(bool noclip) { mTicksSinceLastAnimUpdate++; mTicksPassed++; bool advanceAnims; for(size_t i = 0; i < mActors.size(); i++) { Actor * actor = mActors[i]; size_t animDivisor =actor->mAnimTimeMap[actor->getAnimState()]; if(animDivisor == 0) { animDivisor=12; } advanceAnims = !(mTicksPassed % (ticksPerSecond/animDivisor)); actorMapRemove(mActors[i]); actor->update(noclip); if(advanceAnims) { if(!actor->mAnimPlaying && !actor->isDead()) { actor->mFrame = fmod((actor->mFrame + 1), (double)(actor->getCurrentAnim().animLength)); } else if(actor->mAnimPlaying && actor->mFrame <= actor->getCurrentAnim().animLength-1) { actor->mFrame++; } else if(actor->mAnimPlaying && actor->mFrame == actor->getCurrentAnim().animLength) { actor->mAnimPlaying = false; } else if(!actor->mAnimPlaying && actor->mFrame < actor->getCurrentAnim().animLength-1) { actor->mFrame++; } } actorMapInsert(actor); } actorMapClear(); for(size_t i = 0; i < mActors.size(); i++) actorMapInsert(mActors[i]); }
void World::addNpcs() { const std::vector<const DiabloExe::Npc*> npcs = mDiabloExe.getNpcs(); for(size_t i = 0; i < npcs.size(); i++) { Actor* actor = new Actor(npcs[i]->celPath, npcs[i]->celPath, Position(npcs[i]->x, npcs[i]->y, npcs[i]->rotation)); actorMapInsert(actor); mActors.push_back(actor); } }
void GameLevel::update(bool noclip) { for (size_t i = 0; i < mActors.size(); i++) { Actor* actor = mActors[i]; actorMapRemove(actor); actor->update(noclip); actorMapInsert(actor); } actorMapRefresh(); for (auto& p : mItemMap->mItems) p.second.update(); }
void GameLevel::insertActor(Actor* actor) { if (actor->isDead()) return; bool found = false; for (const auto actorInLevel : mActors) { if (actor == actorInLevel) found = true; } if (!found) mActors.push_back(actor); actorMapInsert(actor); }
void World::setLevel(int32_t levelNum) { if(levelNum != 0) mCurrentPlayer->mInDungeon=true; else mCurrentPlayer->mInDungeon=false; if(levelNum >= (int32_t)mLevels.size() || levelNum < 0) return; clear(); mCurrentLevel = &mLevels[levelNum]; mCurrentLevelIndex = levelNum; const std::vector<Level::Monster>& monsters = mCurrentLevel->getMonsters(); for(size_t i = 0; i < monsters.size(); i++) { DiabloExe::Monster monster = mDiabloExe.getMonster(monsters[i].name); ActorStats * stats = new ActorStats(monster); Monster * monsterObj = new Monster(monster, Position(monsters[i].xPos, monsters[i].yPos), stats); //stats->setActor(monsterObj); mActors.push_back(monsterObj); } actorMapClear(); // insert actors into 2d map for(size_t i = 0; i < mActors.size(); i++) actorMapInsert(mActors[i]); if(levelNum == 0) addNpcs(); FAAudio::AudioManager::playLevelMusic(levelNum, *Engine::ThreadManager::get()); }
void World::addPlayer(uint32_t id, Player *player) { mPlayers[id] = player; mActors.push_back(player); actorMapInsert(player); }
void GameLevel::addActor(Actor* actor) { mActors.push_back(actor); actorMapInsert(actor); }
void GameLevel::actorMapRefresh() { actorMapClear(); for (size_t i = 0; i < mActors.size(); i++) actorMapInsert(mActors[i]); }