static void testMoveEntities (void) { pos3_t pos; vec3_t vec; pathing_t* path = Mem_AllocType(pathing_t); forbiddenList_t forbiddenList; const byte crouchingState = 0; const int maxTUs = MAX_ROUTE_TUS; forbiddenList.reset(); SV_Map(true, mapName, nullptr); /* starting point */ VectorSet(vec, 240, -144, 32); VecToPos(vec, pos); G_CompleteRecalcRouting(); { Edict* ent = nullptr; while ((ent = G_EdictsGetNextInUse(ent))) { /* Dead 2x2 unit will stop walking, too. */ if (ent->type == ET_SOLID) { int j; for (j = 0; j < ent->forbiddenListSize; j++) { forbiddenList.add(ent->forbiddenListPos[j], (byte*) &ent->fieldSize); } } } } { int lengthStored; pos3_t to; Grid_CalcPathing(sv->mapData.routing, ACTOR_SIZE_NORMAL, path, pos, maxTUs, &forbiddenList); Grid_MoveStore(path); /* walk onto the func_breakable */ { VectorSet(vec, 112, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 4 * TU_MOVE_STRAIGHT); } /* walk over the func_breakable */ { VectorSet(vec, 80, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 5 * TU_MOVE_STRAIGHT); } /* walk over the func_breakable */ { VectorSet(vec, 16, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 7 * TU_MOVE_STRAIGHT); } } /* starting point */ VectorSet(vec, 144, 144, 32); VecToPos(vec, pos); { int lengthStored; pos3_t to; Grid_CalcPathing(sv->mapData.routing, ACTOR_SIZE_NORMAL, path, pos, maxTUs, &forbiddenList); Grid_MoveStore(path); /* walk through the opened door */ { VectorSet(vec, 112, 144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, TU_MOVE_STRAIGHT); } /* walk around the opened door */ { VectorSet(vec, 144, 208, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, true); CU_ASSERT_EQUAL(lengthStored, 2 * TU_MOVE_STRAIGHT + TU_MOVE_DIAGONAL); } } SV_ShutdownGameProgs(); }
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 void testMoveEntities (void) { routing_t *routing; pos3_t pos; vec3_t vec; pathing_t *path = Mem_AllocType(pathing_t); pos_t *forbiddenList[MAX_FORBIDDENLIST]; int forbiddenListLength = 0; const byte crouchingState = 0; const int distance = MAX_ROUTE; SV_Map(qtrue, mapName, NULL); /* starting point */ VectorSet(vec, 240, -144, 32); VecToPos(vec, pos); routing = &sv->mapData.map[ACTOR_SIZE_NORMAL - 1]; G_CompleteRecalcRouting(); { edict_t *ent = NULL; while ((ent = G_EdictsGetNextInUse(ent))) { /* Dead 2x2 unit will stop walking, too. */ if (ent->type == ET_SOLID) { int j; for (j = 0; j < ent->forbiddenListSize; j++) { forbiddenList[forbiddenListLength++] = ent->forbiddenListPos[j]; forbiddenList[forbiddenListLength++] = (byte*) &ent->fieldSize; } } } } { int lengthStored; pos3_t to; Grid_MoveCalc(routing, ACTOR_SIZE_NORMAL, path, pos, crouchingState, distance, forbiddenList, forbiddenListLength); Grid_MoveStore(path); /* walk onto the func_breakable */ { VectorSet(vec, 112, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, qtrue); CU_ASSERT_EQUAL(lengthStored, 4 * TU_MOVE_STRAIGHT); } /* walk over the func_breakable */ { VectorSet(vec, 80, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, qtrue); CU_ASSERT_EQUAL(lengthStored, 5 * TU_MOVE_STRAIGHT); } /* walk over the func_breakable */ { VectorSet(vec, 16, -144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, qtrue); CU_ASSERT_EQUAL(lengthStored, 7 * TU_MOVE_STRAIGHT); } } /* starting point */ VectorSet(vec, 144, 144, 32); VecToPos(vec, pos); { int lengthStored; pos3_t to; Grid_MoveCalc(routing, ACTOR_SIZE_NORMAL, path, pos, crouchingState, distance, forbiddenList, forbiddenListLength); Grid_MoveStore(path); /* walk through the opened door */ { VectorSet(vec, 112, 144, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, qtrue); CU_ASSERT_EQUAL(lengthStored, TU_MOVE_STRAIGHT); } /* walk around the opened door */ { VectorSet(vec, 144, 208, 32); VecToPos(vec, to); lengthStored = Grid_MoveLength(path, to, crouchingState, qtrue); CU_ASSERT_EQUAL(lengthStored, 2 * TU_MOVE_STRAIGHT + TU_MOVE_DIAGONAL); } } SV_ShutdownGameProgs(); }