void inputText(std::string& str, unsigned* charselected);
 void flash(float amount = 1, int delay = 1);
 }
+float roughDirection(XYZ vec);
+float roughDirectionTo(XYZ start, XYZ end);
+float pitchTo(XYZ start, XYZ end);
+float sq(float n);
 
 #ifndef __forceinline
 #  ifdef __GNUC__
 
 // utility functions
 
 // TODO: this is slightly incorrect
-inline float roughDirection(XYZ vec)
+float roughDirection(XYZ vec)
 {
     Normalise(&vec);
     float angle = -asin(-vec.x) * 180 / M_PI;
         angle = 180 - angle;
     return angle;
 }
-inline float roughDirectionTo(XYZ start, XYZ end)
+float roughDirectionTo(XYZ start, XYZ end)
 {
     return roughDirection(end - start);
 }
     Normalise(&vec);
     return -asin(vec.y) * 180 / M_PI;
 }
-inline float pitchTo(XYZ start, XYZ end)
+float pitchTo(XYZ start, XYZ end)
 {
     return pitchOf(end - start);
 }
-inline float sq(float n)
+float sq(float n)
 {
     return n * n;
 }
 
     }
 }
 
-extern float sq(float n);
-extern float roughDirectionTo(XYZ start, XYZ end);
-extern float pitchTo(XYZ start, XYZ end);
-
 void Person::doAI()
 {
     if (aitype != playercontrolled && !Dialog::inDialog()) {