getRotatedPosition(int, int, DirectionTypes, int &, int &)
- Defined in
- CvGameCoreUtils.cpp, line 1318
- Hook name
CivHooks::getRotatedPosition
Hooks
static bool BeforegetRotatedPosition(int inHexspaceX, int inHexspaceY, DirectionTypes rotatedDirection, int& outRotatedX, int& outRotatedY);static void AftergetRotatedPosition(int inHexspaceX, int inHexspaceY, DirectionTypes rotatedDirection, int& outRotatedX, int& outRotatedY);static void ReplacegetRotatedPosition(void (*original)(int, int, DirectionTypes, int&, int&), int inHexspaceX, int inHexspaceY, DirectionTypes rotatedDirection, int& outRotatedX, int& outRotatedY);CivRegisterBefore<CivHooks::getRotatedPosition>(host, &BeforegetRotatedPosition);CivRegisterAfter<CivHooks::getRotatedPosition>(host, &AftergetRotatedPosition);CivRegisterReplace<CivHooks::getRotatedPosition>(host, &ReplacegetRotatedPosition);
Code
1318void getRotatedPosition(int inHexspaceX, int inHexspaceY, DirectionTypes rotatedDirection, int& outRotatedX, int& outRotatedY)1319{1320 outRotatedX = inHexspaceX;1321 outRotatedY = inHexspaceY;13221323 // early out if the facing is NE as that is the base rotation that the data is supposed to be stored in1324 // also early out if we are looking at the pivot1325 if(DIRECTION_NORTHEAST == rotatedDirection || (inHexspaceX == 0 && inHexspaceY == 0))1326 {1327 return;1328 };13291330 // find the ring that this is on1331 int ring = hexDistance(inHexspaceX, inHexspaceY);13321333 // find the nearest spike direction1334 DirectionTypes spikeDirection = hexspaceSpikeDirection(inHexspaceX, inHexspaceY);13351336 int spikeX = 0;1337 int spikeY = 0;1338 switch(spikeDirection)1339 {1340 case DIRECTION_NORTHEAST:1341 {1342 spikeY = ring;1343 }1344 break;1345 case DIRECTION_EAST:1346 {1347 spikeX = ring;1348 }1349 break;1350 case DIRECTION_SOUTHEAST:1351 {1352 spikeX = ring;1353 spikeY = -ring;1354 }1355 break;1356 case DIRECTION_SOUTHWEST:1357 {1358 spikeY = -ring;1359 }1360 break;1361 case DIRECTION_WEST:1362 {1363 spikeX = -ring;1364 }1365 break;1366 case DIRECTION_NORTHWEST:1367 {1368 spikeX = -ring;1369 spikeY = ring;1370 }1371 break;1372 }13731374 // find the offset of this point from the spike1375 int offsetOnThisRing = hexDistance(spikeX-inHexspaceX,spikeY-inHexspaceY);13761377 // find the rotated spike1378 int newSpikeX = 0;1379 int newSpikeY = 0;1380 DirectionTypes newSpikeDirection = (DirectionTypes)((spikeDirection + rotatedDirection) % (NUM_DIRECTION_TYPES));1381 switch(newSpikeDirection)1382 {1383 case DIRECTION_NORTHEAST:1384 {1385 newSpikeY = ring;1386 // add in the offset in the appropriate direction1387 outRotatedX = newSpikeX+offsetOnThisRing;1388 outRotatedY = newSpikeY-offsetOnThisRing;1389 }1390 break;1391 case DIRECTION_EAST:1392 {1393 newSpikeX = ring;1394 // add in the offset in the appropriate direction1395 outRotatedX = newSpikeX;1396 outRotatedY = newSpikeY-offsetOnThisRing;1397 }1398 break;1399 case DIRECTION_SOUTHEAST:1400 {1401 newSpikeX = ring;1402 newSpikeY = -ring;1403 // add in the offset in the appropriate direction1404 outRotatedX = newSpikeX-offsetOnThisRing;1405 outRotatedY = newSpikeY;1406 }1407 break;1408 case DIRECTION_SOUTHWEST:1409 {1410 newSpikeY = -ring;1411 // add in the offset in the appropriate direction1412 outRotatedX = newSpikeX-offsetOnThisRing;1413 outRotatedY = newSpikeY+offsetOnThisRing;1414 }1415 break;1416 case DIRECTION_WEST:1417 {1418 newSpikeX = -ring;1419 // add in the offset in the appropriate direction1420 outRotatedX = newSpikeX;1421 outRotatedY = newSpikeY+offsetOnThisRing;1422 }1423 break;1424 case DIRECTION_NORTHWEST:1425 {1426 newSpikeX = -ring;1427 newSpikeY = ring;1428 // add in the offset in the appropriate direction1429 outRotatedX = newSpikeX+offsetOnThisRing;1430 outRotatedY = newSpikeY;1431 }1432 break;1433 }1434}