expendable_inventory

Started by T0gy3R, 2021-02-25, 20:23:33

Sziasztok.!



Game fordítást követően ezt a hibaüzenetet kapom:

https://prnt.sc/106xjht

Exchange.cpp erre vonatkozó sorai:



#ifdef ENABLE_EXTEND_INVEN_SYSTEM

bool CExchange::CheckSpace()

{

    std::array<std::unique_ptr<CGrid>, static_cast<const int>(INVENTORY_PAGE_COUNT)> s_grid;

    static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);

    LPITEM item;

    bool bDSInitialized = false;

    int new_size, invenpoint = GetCompany()->GetOwner()->Inven_Point();



    for (size_t i = 0; i < s_grid.size(); i++) {

        if (i < INVENTORY_OPEN_PAGE_COUNT) {

            s_grid[i] = std::make_unique<CGrid>(INVENTORY_WIDTH,INVENTORY_HEIGHT);

            continue;

        }

        if (invenpoint > 0 && invenpoint <= INVENTORY_HEIGHT)

            new_size = invenpoint;

        else if (invenpoint >= INVENTORY_HEIGHT)

            new_size = INVENTORY_HEIGHT;

        else

            new_size = 0;

        s_grid[i] = std::make_unique<CGrid>(INVENTORY_WIDTH,new_size);

        invenpoint -= INVENTORY_HEIGHT;

    }

    for (size_t j = 0; j < s_grid.size(); j++) {

        s_grid[j]->Clear();

        for (auto i = INVENTORY_PAGE_SIZE * j; i < INVENTORY_PAGE_SIZE * (j+1); ++i) {

            if (!(item = GetCompany()->GetOwner()->GetInventoryItem(i)))

                continue;

            s_grid[j]->Put(i - INVENTORY_PAGE_SIZE * j, 1, item->GetSize());

        }

    }

    for (auto i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i) {

        if (!(item = m_apItems[i])) continue;

        if (item->IsDragonSoul()) {

            if (!GetCompany()->GetOwner()->DragonSoul_IsQualified()) return false;

            if (!bDSInitialized) {

                bDSInitialized = true;

                GetCompany()->GetOwner()->CopyDragonSoulItemGrid(s_vDSGrid);

            }

            bool bExistEmptySpace = false;

            WORD wBasePos = DSManager::instance().GetBasePosition(item);   

            if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM) return false;

            for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++) {

                WORD wPos = wBasePos + i;

                if (0 == s_vDSGrid[wBasePos]) {

                    bool bEmpty = true;

                    for (int j = 1; j < item->GetSize(); j++)    {

                        if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM]) {

                            bEmpty = false;

                            break;

                    }} if (bEmpty)    {

                        for (int j = 0; j < item->GetSize(); j++)

                            s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] =  wPos + 1;

                        bExistEmptySpace = true;

                        break;

                    }} if (bExistEmptySpace) break;

            } if (!bExistEmptySpace) return false;

        }

        else {

            bool existspace = false;

            for (size_t i = 0; i < s_grid.size(); i++) {

                int iPos = s_grid[i]->FindBlank(1, item->GetSize());

                if (iPos >= 0) {

                    s_grid[i]->Put(iPos, 1, item->GetSize());

                    existspace = true;

                    break;

                }

                else

                    if (i == s_grid.size() -1)

                        return false;

            }

            if (existspace)

                continue;

        }}

    return true;

}

#else

bool CExchange::CheckSpace()

{

    static CGrid s_grid1(5, INVENTORY_MAX_NUM/5 / 2); // inven page 1

    static CGrid s_grid2(5, INVENTORY_MAX_NUM/5 / 2); // inven page 2



    s_grid1.Clear();

    s_grid2.Clear();



    LPCHARACTER    victim = GetCompany()->GetOwner();

    LPITEM item;



    int i;



    for (i = 0; i < INVENTORY_MAX_NUM / 2; ++i)

    {

        if (!(item = victim->GetInventoryItem(i)))

            continue;



        s_grid1.Put(i, 1, item->GetSize());

    }

    for (i = INVENTORY_MAX_NUM / 2; i < INVENTORY_MAX_NUM; ++i)

    {

        if (!(item = victim->GetInventoryItem(i)))

            continue;



        s_grid2.Put(i - INVENTORY_MAX_NUM / 2, 1, item->GetSize());

    }



    // 아... 뭔가 개병신 같지만... 용혼석 인벤을 노멀 인벤 보고 따라 만든 내 잘못이다 ㅠㅠ

    static std::vector <WORD> s_vDSGrid(DRAGON_SOUL_INVENTORY_MAX_NUM);



    // 일단 용혼석을 교환하지 않을 가능성이 크므로, 용혼석 인벤 복사는 용혼석이 있을 때 하도록 한다.

    bool bDSInitialized = false;



    for (i = 0; i < EXCHANGE_ITEM_MAX_NUM; ++i)

    {

        if (!(item = m_apItems[i]))

            continue;



        if (item->IsDragonSoul())

        {

            if (!victim->DragonSoul_IsQualified())

            {

                return false;

            }



            if (!bDSInitialized)

            {

                bDSInitialized = true;

                victim->CopyDragonSoulItemGrid(s_vDSGrid);

            }



            bool bExistEmptySpace = false;

            WORD wBasePos = DSManager::instance().GetBasePosition(item);

            if (wBasePos >= DRAGON_SOUL_INVENTORY_MAX_NUM)

                return false;

       

            for (int i = 0; i < DRAGON_SOUL_BOX_SIZE; i++)

            {

                WORD wPos = wBasePos + i;

                if (0 == s_vDSGrid[wBasePos])

                {

                    bool bEmpty = true;

                    for (int j = 1; j < item->GetSize(); j++)

                    {

                        if (s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM])

                        {

                            bEmpty = false;

                            break;

                        }

                    }

                    if (bEmpty)

                    {

                        for (int j = 0; j < item->GetSize(); j++)

                        {

                            s_vDSGrid[wPos + j * DRAGON_SOUL_BOX_COLUMN_NUM] =  wPos + 1;

                        }

                        bExistEmptySpace = true;

                        break;

                    }

                }

                if (bExistEmptySpace)

                    break;

            }

            if (!bExistEmptySpace)

                return false;

        }

        else

        {

            int iPos = s_grid1.FindBlank(1, item->GetSize());



            if (iPos >= 0)

            {

                s_grid1.Put(iPos, 1, item->GetSize());

            }

            else

            {

                iPos = s_grid2.FindBlank(1, item->GetSize());



                if (iPos >= 0)

                {

                    s_grid2.Put(iPos, 1, item->GetSize());

                }

                else

                {

                    return false;

                }

            }

        }

    }



    return true;

}

#endif


https://prnt.sc/106xi4a

Gondolom, hogy a s_grid deklarálása nem jó, mert mindenhol azzal van gond.

Illetve for ciklusban nem értem miért van "auto i.." (nem kéne deklarálni azt az i változót?)

Ezzel kapcsolatban tudna nekem valaki valami segítséget nyújtani?



EDIT:

Némi google használat után rájöttem, hogy a 9.2-es forrásos BSD-n nem a megfelelő c++ compiler van.

Ahhoz, hogy ilyen tömböket használjak minimum c++11 kéne. (Ha jól értelmezem ezt)



Most keresem azt, hogyan lehet frissíteni, a .vdi-n. Addig ha valaki tud segíteni ne tartsa magában :D

Ha lenne utánpótlás, akinek lenne ideje és energiája átelemezni a témát,
akkor bizonyosabb több programozóval diskurálhatnál, de a jelenlegi állás az,
hogy maximum azok érthetneek a dologhoz, akik kényszerből vagy hobbiból
értenek ehhez a témakörhöz. Laikus c++ fejlesztő még a 11-es vboxhoz se
nagyon nyúlt még, nem hogy az újonc p-szerós metinfejlesztők.

Kell csinálni egy vboxban lévő freebsd 11-es rendszert, és arra feltenni a gcc 8-as verziót, valamint a többiből is az újabb dolgokat, aztán oda átrakni a forrás fájljaidat, és ott forditani.