static void testMove (void) { vec3_t vec; pos3_t pos; pos_t gridPos; if (FS_CheckFile("maps/%s.bsp", mapName) != -1) { char entityString[MAX_TOKEN_CHARS]; CM_LoadMap(mapName, true, "", entityString, &mapData, &mapTiles); CM_LoadMap(mapName, true, "", entityString, &mapData, &mapTiles); } else { UFO_CU_FAIL_MSG_FATAL(va("Map resource '%s.bsp' for test is missing.", mapName)); } VectorSet(vec, 16, 16, 48); VecToPos(vec, pos); CU_ASSERT_EQUAL(pos[0], 128); CU_ASSERT_EQUAL(pos[1], 128); CU_ASSERT_EQUAL(pos[2], 0); VectorSet(vec, 80, 16, 80); VecToPos(vec, pos); CU_ASSERT_EQUAL(pos[0], 130); CU_ASSERT_EQUAL(pos[1], 128); CU_ASSERT_EQUAL(pos[2], 1); gridPos = Grid_Fall(mapData.routing, ACTOR_SIZE_NORMAL, pos); CU_ASSERT_EQUAL(gridPos, 1); { const byte crouchingState = 0; const int maxTUs = MAX_ROUTE_TUS; int lengthStored; pos3_t to; pathing_t* path = Mem_AllocType(pathing_t); VectorSet(vec, 80, 80, 32); VecToPos(vec, pos); Grid_CalcPathing(mapData.routing, ACTOR_SIZE_NORMAL, path, pos, maxTUs, nullptr); Grid_MoveStore(path); /* move downwards */ { int lengthUnstored; VectorSet(vec, 80, 48, 32); VecToPos(vec, to); lengthUnstored = Grid_MoveLength(path, to, crouchingState, false); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthUnstored, lengthStored); CU_ASSERT_EQUAL(lengthStored, TU_MOVE_STRAIGHT); } /* try to move three steps upwards - there is a brush*/ { VectorSet(vec, 80, 176, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, ROUTING_NOT_REACHABLE); } /* try move into the nodraw */ { VectorSet(vec, 48, 16, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, ROUTING_NOT_REACHABLE); } /* move into the lightclip */ { VectorSet(vec, 48, 48, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, TU_MOVE_DIAGONAL); } /* move into the passable */ { VectorSet(vec, 144, 48, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, TU_MOVE_DIAGONAL + TU_MOVE_STRAIGHT); } /* go to the other side - diagonal, followed by six straight moves */ { VectorSet(vec, -16, 48, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 6 * TU_MOVE_STRAIGHT + TU_MOVE_DIAGONAL); } /* try to walk out of the map */ { VectorSet(vec, 48, 272, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, ROUTING_NOT_REACHABLE); } /* walk to the map border */ { VectorSet(vec, 48, 240, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 4 * TU_MOVE_STRAIGHT + TU_MOVE_DIAGONAL); } /* walk a level upwards */ { VectorSet(vec, 240, 80, 96); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 5 * TU_MOVE_STRAIGHT); } /* move to the door (not a func_door) */ { VectorSet(vec, 176, -80, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 4 * TU_MOVE_STRAIGHT + 2 * TU_MOVE_DIAGONAL); } /* move into the trigger_touch */ { VectorSet(vec, -48, -80, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 5 * TU_MOVE_STRAIGHT + 3 * TU_MOVE_DIAGONAL); } /* try to walk into the actorclip */ { VectorSet(vec, -48, -48, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, ROUTING_NOT_REACHABLE); } } }
static pos_t SV_GridFall (const int actorSize, const pos3_t pos) { return Grid_Fall(sv->mapData.routes, actorSize, pos); }