00001
00002
00003
00004 #include <Windows.h>
00005 #include <Assert.h>
00006 #include <Math.h>
00007 #include <Time.h>
00008
00009 #include "Genesis.h"
00010 #include "Ram.h"
00011
00012 #include "GMain.h"
00013
00014 #include "_Bot.h"
00015 #include "Track.h"
00016
00017 int32 randomseed=17;
00018
00019 void StackInit(Stack *s)
00020 {
00021 s->TOS = -1;
00022 s->Data = GE_RAM_ALLOCATE_ARRAY(int32, MAX_TRACKS);
00023 assert(s->Data);
00024 s->Size = MAX_TRACKS;
00025 }
00026
00027 void StackReset(Stack *s)
00028 {
00029 s->TOS = -1;
00030 }
00031
00032 void StackPush(Stack *s, int32 data)
00033 {
00034 s->TOS++;
00035 assert(s->TOS < s->Size);
00036 s->Data[s->TOS] = data;
00037 }
00038
00039 int32 StackPop(Stack *s)
00040 {
00041 int32 value;
00042
00043 if (s->TOS <= -1)
00044 return (s->TOS = -1);
00045
00046 value = s->Data[s->TOS];
00047 s->TOS--;
00048
00049 return (value);
00050 }
00051
00052 int32 StackTop(Stack *s)
00053 {
00054 if (s->TOS <= -1)
00055 return (-1);
00056
00057 return (s->Data[s->TOS]);
00058 }
00059
00060 geBoolean StackIsEmpty(Stack *s)
00061 {
00062 return (s->TOS <= -1);
00063 }
00064
00065 int32 krand()
00066 {
00067 randomseed = ((randomseed * 21 + 1) & 65535);
00068 return (randomseed);
00069 }
00070
00071 void ksrand(int32 seed)
00072 {
00073
00074 randomseed = (unsigned)time( NULL );
00075 }
00076
00077 int32 RandomRange(int32 range)
00078 {
00079 int32 rand_num;
00080 int32 value;
00081
00082 if (range <= 0)
00083 return(0);
00084
00085 rand_num = krand();
00086
00087 if (rand_num == 65535U)
00088 rand_num--;
00089
00090
00091 value = (rand_num << 14) / ((65535UL << 14) / range);
00092
00093 if (value >= range)
00094 value = range - 1;
00095
00096 return(value);
00097 }
00098
00099 float DistWeightedY(const geVec3d *Pos1, const geVec3d *Pos2, const float Scale)
00100 {
00101 geVec3d LPos1, LPos2;
00102
00103 LPos1 = *Pos1;
00104 LPos2 = *Pos2;
00105
00106 LPos1.Y *= Scale;
00107 LPos2.Y *= Scale;
00108
00109 return(geVec3d_DistanceBetween(&LPos1, &LPos2));
00110 }
00111
00112 void Ang2Vec(float ang, geVec3d *vec)
00113 {
00114 vec->X = (float)cos(ang);
00115 vec->Z = (float)sin(ang);
00116 vec->Y = 0.0f;
00117 SqueezeVector(vec, 0.0001f);
00118
00119 geVec3d_Normalize(vec);
00120 }
00121
00122 void VectorRotateY(geVec3d *vec, float delta_ang, geVec3d *result)
00123 {
00124 geXForm3d XForm;
00125
00126 geXForm3d_SetIdentity(&XForm);
00127 geXForm3d_RotateY(&XForm, delta_ang);
00128 geXForm3d_Rotate(&XForm, vec, result);
00129 }
00130
00131 #if 0 // never ended up needing these
00132 float NormAng(float ang)
00133 {
00134 if (ang > (PI_2))
00135 ang = (ang - PI_2);
00136
00137 if (ang < 0.0f)
00138 ang = PI_2 + ang;
00139
00140 return(ang);
00141 }
00142
00143 float Vec2Ang(geVec3d *vec)
00144 {
00145 float ang;
00146
00147 if (geVec3d_Length(vec) == 0.0f)
00148 return(0.0f);
00149
00150 ang = (float)atan2(vec->Z,vec->X);
00151 if (ang < 0)
00152 ang += M_PI2;
00153
00154 return ang;
00155 }
00156
00157
00158 #endif