示例#1
0
    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]);
    }
示例#2
0
    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);
        }
    }
示例#3
0
    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();
    }
示例#4
0
    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);
    }
示例#5
0
    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());
    }
示例#6
0
 void World::addPlayer(uint32_t id, Player *player)
 {
     mPlayers[id] = player;
     mActors.push_back(player);
     actorMapInsert(player);
 }
示例#7
0
 void GameLevel::addActor(Actor* actor)
 {
     mActors.push_back(actor);
     actorMapInsert(actor);
 }
示例#8
0
 void GameLevel::actorMapRefresh()
 {
     actorMapClear();
     for (size_t i = 0; i < mActors.size(); i++)
         actorMapInsert(mActors[i]);
 }