Пример #1
0
/**
 * Remove fog in the radius around the given tile.
 *
 * @param tile The tile to remove fog around.
 * @param radius The radius to remove fog around.
 */
void Tile_RemoveFogInRadius(tile32 tile, uint16 radius)
{
    uint16 packed;
    uint16 x, y;
    int16 i, j;

    packed = Tile_PackTile(tile);

    if (!Map_IsValidPosition(packed)) return;

    x = Tile_GetPackedX(packed);
    y = Tile_GetPackedY(packed);
    tile = Tile_MakeXY(x, y);

    for (i = -radius; i <= radius; i++) {
        for (j = -radius; j <= radius; j++) {
            tile32 t;

            if ((x + i) < 0 || (x + i) >= 64) continue;
            if ((y + j) < 0 || (y + j) >= 64) continue;

            packed = Tile_PackXY(x + i, y + j);
            t = Tile_MakeXY(x + i, y + j);

            if (Tile_GetDistanceRoundedUp(tile, t) > radius) continue;

            Map_UnveilTile(packed, g_playerHouseID);
        }
    }
}
Пример #2
0
/**
 * Gets the average distance between current team members, and set the
 *  position of the team to the average position.
 *
 * Stack: *none*.
 *
 * @param script The script engine to operate on.
 * @return The average distance.
 */
uint16 Script_Team_GetAverageDistance(ScriptEngine *script)
{
	uint16 averageX = 0;
	uint16 averageY = 0;
	uint16 count = 0;
	uint16 distance = 0;
	Team *t;
	PoolFindStruct find;

	VARIABLE_NOT_USED(script);

	t = g_scriptCurrentTeam;

	find.houseID = t->houseID;
	find.index   = 0xFFFF;
	find.type    = 0xFFFF;

	while (true) {
		Unit *u;

		u = Unit_Find(&find);
		if (u == NULL) break;
		if (t->index != u->team - 1) continue;
		count++;
		averageX += (u->o.position.x >> 8) & 0x3f;
		averageY += (u->o.position.y >> 8) & 0x3f;
	}

	if (count == 0) return 0;
	averageX /= count;
	averageY /= count;

	t->position = Tile_MakeXY(averageX, averageY);

	find.houseID = t->houseID;
	find.index   = 0xFFFF;
	find.type    = 0xFFFF;

	while (true) {
		Unit *u;

		u = Unit_Find(&find);
		if (u == NULL) break;
		if (t->index != u->team - 1) continue;
		distance += Tile_GetDistanceRoundedUp(u->o.position, t->position);
	}

	distance /= count;

	if (t->target == 0 || t->targetTile == 0) return distance;

	if (Tile_GetDistancePacked(Tile_PackXY(averageX, averageY), Tools_Index_GetPackedTile(t->target)) <= 10) t->targetTile = 2;

	return distance;
}