//
// Generated by dtk
// Translation Unit: d_path.cpp
//

#include "d/dolzel.h" // IWYU pragma: keep
#include "d/d_path.h"
#include "d/d_com_inf_game.h"
#include "JSystem/JUtility/JUTAssert.h"

/* 80080018-8008010C       .text dPath_GetPnt__FP5dPathi */
dPnt* dPath_GetPnt(dPath* path, int pnt_index) {
    JUT_ASSERT(30, path != NULL);
    JUT_ASSERT(31, 0 <= pnt_index && pnt_index < path->m_num);

    if (path == NULL || path->m_points == NULL || 0 > pnt_index || pnt_index >= path->m_num)
        return NULL;
    else
        return &path->m_points[pnt_index];
}

/* 8008010C-80080218       .text dPath_GetRoomPath__Fii */
dPath* dPath_GetRoomPath(int path_index, int room_no) {
    dStage_dPath_c * pd;
    if (room_no == -1) {
        pd = dComIfGp_getStage().getPath2Inf();
    } else {
        JUT_ASSERT(0x3d, 0 <= room_no && room_no < 64);
        dStage_roomDt_c * pRoom = dComIfGp_roomControl_getStatusRoomDt(room_no);
        if (pRoom == NULL)
            return NULL;
        pd = pRoom->getPath2Inf();
    }

    if (pd == NULL || 0 > path_index || path_index >= pd->num)
        return NULL;
    else
        return &pd->m_path[path_index];
}

/* 80080218-80080340       .text dPath_GetNextRoomPath__FP5dPathi */
dPath* dPath_GetNextRoomPath(dPath* path, int room_no) {
    dStage_dPath_c * pd;
    if (room_no == -1) {
        pd = dComIfGp_getStage().getPath2Inf();
    } else {
        dStage_roomDt_c * pRoom = dComIfGp_roomControl_getStatusRoomDt(room_no);
        if (pRoom == NULL)
            return NULL;
        pd = pRoom->getPath2Inf();
    }

    s32 next_id = path->m_nextID;
    if (pd == NULL || (next_id & 0xFFFF) == 0xFFFF) {
        return NULL;
    } else {
        JUT_ASSERT(0x72, 0 <= next_id && next_id < pd->num);
        if (0 > next_id || next_id >= pd->num)
            return NULL;
        else
            return &pd->m_path[next_id];
    }
}

/* 80080340-800804A4       .text dPath_GetPolyRoomPathVec__FR13cBgS_PolyInfoP4cXyzPi */
bool dPath_GetPolyRoomPathVec(cBgS_PolyInfo& polyInfo, cXyz* pDstPos, int* pDstArg0) {
    int room_no = dComIfG_Bgsp()->GetRoomId(polyInfo);
    int path_index = dComIfG_Bgsp()->GetRoomPathId(polyInfo);

    pDstPos->x = 0.0f;
    pDstPos->y = 0.0f;
    pDstPos->z = 0.0f;
    *pDstArg0 = 0;

    if (room_no == -1)
        return FALSE;

    dPath * path = dPath_GetRoomPath(path_index, room_no);
    if (path == NULL)
        return FALSE;

    if (path->field4_0x6 != 0xFF && dComIfGs_isSwitch(path->field4_0x6, room_no))
        return FALSE;

    int pnt_no = dComIfG_Bgsp()->GetRoomPathPntNo(polyInfo);
    if (pnt_no == 0xFF || pnt_no < 0 || pnt_no >= path->m_num)
        return FALSE;

    dPnt *point = &path->m_points[pnt_no];
    dPnt *next_point;
    if (pnt_no == path->m_num - 1)
        next_point = &path->m_points[0];
    else
        next_point = &path->m_points[pnt_no + 1];
    pDstPos->x = next_point->m_position.x - point->m_position.x;
    pDstPos->y = next_point->m_position.y - point->m_position.y;
    pDstPos->z = next_point->m_position.z - point->m_position.z;
    *pDstArg0 = path->mArg0;
    return TRUE;
}
