You need to change the scale argument to Rectangle(). If it's set to 0, the rectangle is resized to 0x0, meaning it's invisible. Set the scale to -1 and it will be ignored.
Also, this might be a problem:
if (Link->X == this->X && Link->Y == this->Y+16)
It's not
wrong, but it's too precise to trigger easily. Link has to be standing in exactly the right spot for that to be true; if he's off by a single pixel, it won't work. There are a couple of different ways to make it more forgiving. One would be to use four comparisons setting upper and lower bounds:
if (Link->X >= this->X-6 && // Link can be six pixels to the left of the FFC
Link->X <= this->X+6 && // or six pixels to the right.
Link->Y >= this->Y+8 && // Half a tile down
Link->Y <= this->Y+16) // to a full tile down.
I'm pretty sure that this was bugged, and IDR if I had ever fixed it: Rectangle() has different behaviour for this arg, than other drawing functions, such as DrawTile().
if(sdci[7] != 10000)
{
int w=x2-x1+1;
int h=y2-y1+1;
int w2=(w*sdci[7])/10000;
int h2=(h*sdci[7])/10000;
x1=x1-((w2-w)/2);
x2=x2+((w2-w)/2);
y1=y1-((h2-h)/2);
y2=y2+((h2-h)/2);
}
That's from 2.50.2. If scale == 1, then it is ignored, there. Setting it to -1 would just cause the allegro utine to flip it around at 1% scale. This isn't fixed in the 2.53 source, either, so, that's something for me to do.
Circle() and some other functions are likewise inconsistent with the intended behavior for passing -1 to scale. I'll fix it, but it'll use up the last free bit for 2.50.x. Too many users have figured out that 1 == 100% and 100 == 100% and have intermittently used either of these values. (A raw fix would instantly brreak any script where someone passed 1 as the scale arg, for 100%.)
It didn't help that the ZScript docs never detailed the scale arg for these functions in any detail.