Code: Select all
#define SENSITIVITY 6
#define DUMMIES 1100
//absolute value
function int abs(int x)
{
if(x < 0)
return -x;
return x;
}
//square root (from the ZDoom wiki)
function int sqrt(int x)
{
int r;
x = x + 1 >> 1;
while(x > r)
x -= r++;
return r;
}
//Inverse cosine. Though this is probably not a general use version as it was
//designed with getting the pitch between the player and the cross hair in mind.
function int invcos(int c)
{
int i = 0;
while(cos(fixeddiv(i<<16, 360.0)) > c)
{
i++;
}
return fixeddiv(i<<16, 360.0);
}
int aimx[8] = {64,64,64,64,64,64,64,64};
int aimy[8] = {41,41,41,41,41,41,41,41};
int oldpitch[8] = {0,0,0,0,0,0,0,0};
bool forward[8] = {true,true,true,true,true,true,true,true};
bool disableCross[8] = {false,false,false,false,false,false,false,false};
str xhaircolor[8] = {"AimBall_Green", "AimBall_Blue", "AimBall_Yellow", "AimBall_Red", "AimBall_Orange", "AimBall_Green", "AimBall_Blue", "AimBall_Yellow"};
//This script controls the xhair and makes the dummies face the right directions.
script 305 ENTER
{
setactorangle(0, 0.0);
spawn("VisibleDoomGuy", getactorx(0), getactory(0), getactorz(0), DUMMIES+playernumber());
oldpitch[playernumber()] = getactorpitch(0);
while(true)
{
//spawn xhair
spawn(xhaircolor[playernumber()], getactorx(0) + (aimx[playernumber()]<<16), getactory(0), getactorz(0) + (aimy[playernumber()]<<16));
//calculate xhair movement related stuff
setactorposition(DUMMIES+playernumber(), getactorx(0), getactory(0), getactorz(0), false);
if(!disableCross[playernumber()])
{
if(getactorangle(0) < 0.5)
{
aimx[playernumber()] -= getactorangle(0) >> SENSITIVITY;
}
else
{
aimx[playernumber()] += 1.0 - getactorangle(0) >> SENSITIVITY;
}
setactorangle(0, 0.0); //face forward(right)
aimy[playernumber()] += oldpitch[playernumber()] - getactorpitch(0) >> SENSITIVITY;
oldpitch[playernumber()] = 0;
setactorpitch(0, 0.0);
}
//make the dummies face the right direction.
if(aimx[playernumber()] < 0)
{
forward[playernumber()] = false;
setactorangle(DUMMIES+playernumber(), 0.5);
}
else
{
forward[playernumber()] = true;
setactorangle(DUMMIES+playernumber(), 0.0);
}
delay(1);
}
}
script 306 (void)
{
int adj = abs(aimx[playernumber()]);
int opp = abs(aimy[playernumber()]-41);
int hyp = sqrt(adj*adj + opp*opp);
int pitch = invcos(fixeddiv(adj<<16, hyp<<16));
if(aimy[playernumber()]-41 >= 0)
{
pitch *= -1;
}
while(true)
{
oldpitch[playernumber()] = pitch;
setactorpitch(0, pitch);
delay(1);
}
}
script 307 (int lock) //lets return control of cross hair
{
if(lock)
{
disableCross[playernumber()] = true;
acs_execute(306, 0, 0, 0, 0);
delay(1); //turn for a minimal period of time
if(forward[playernumber()])
setactorangle(0, 0.0);
else
setactorangle(0, 0.5);
}
else
{
acs_terminate(306, 0);
setactorangle(0, 0.0);
setactorpitch(0, 0.0);
oldpitch[playernumber()] = 0;
disableCross[playernumber()] = false;
}
}
str states[9] = {"Spawn", "See", "Missile", "Melee", "Pain", "Death", "XDeath", "AltSkinDeath", "AltSkinXDeath"};
script 314 (int state) //Sync the dummies
{
setactorstate(DUMMIES+playernumber(), states[state]);
}
script 315 (int player) DISCONNECT
{
thing_remove(DUMMIES+player);
}