mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 12:10:41 +00:00
4479 lines
107 KiB
C++
4479 lines
107 KiB
C++
//-------------------------------------------------------------------------
|
|
/*
|
|
Copyright (C) 2016 EDuke32 developers and contributors
|
|
Copyright (C) 2020 Nuke.YKT
|
|
|
|
This file is part of EDuke32.
|
|
|
|
EDuke32 is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License version 2
|
|
as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
//-------------------------------------------------------------------------
|
|
|
|
#include "ns.h"
|
|
|
|
|
|
#include "compat.h"
|
|
#include "baselayer.h"
|
|
#include "duke3d.h"
|
|
#include "sounds.h"
|
|
#include "i_time.h"
|
|
#include "files.h"
|
|
#include "i_specialpaths.h"
|
|
|
|
// Shut up the compiler.
|
|
#ifdef _MSC_VER
|
|
#pragma warning(disable:4101)
|
|
#endif
|
|
BEGIN_RR_NS
|
|
|
|
inline bool KB_KeyPressed(int code)
|
|
{
|
|
return inputState.GetKeyStatus(code);
|
|
}
|
|
|
|
inline void KB_ClearKeyDown(int key)
|
|
{
|
|
inputState.ClearKeyStatus(key);
|
|
}
|
|
|
|
int rrdh_randseed = 1;
|
|
|
|
int rrdh_random(void)
|
|
{
|
|
static int seedinit = 0;
|
|
if (!seedinit)
|
|
{
|
|
rrdh_randseed = (int)I_nsTime();
|
|
seedinit = 1;
|
|
}
|
|
rrdh_randseed = (rrdh_randseed*1103515245)+12345;
|
|
return (rrdh_randseed>>16)&0x7fff;
|
|
}
|
|
|
|
|
|
int sub_5151C(short a1)
|
|
{
|
|
switch (a1)
|
|
{
|
|
case 26:
|
|
case 27:
|
|
case 29:
|
|
case 30:
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
case 34:
|
|
case 35:
|
|
case 73:
|
|
case 74:
|
|
case 92:
|
|
case 93:
|
|
case 96:
|
|
case 97:
|
|
case 98:
|
|
case 103:
|
|
case 141:
|
|
case 142:
|
|
case 143:
|
|
case 144:
|
|
case 145:
|
|
case 146:
|
|
case 147:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 154:
|
|
case 155:
|
|
case 156:
|
|
case 157:
|
|
case 158:
|
|
case 159:
|
|
case 160:
|
|
case 161:
|
|
case 162:
|
|
case 163:
|
|
case 164:
|
|
case 165:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int rrgh_isatree(short s)
|
|
{
|
|
switch (sprite[s].picnum)
|
|
{
|
|
case 984:
|
|
case 985:
|
|
case 986:
|
|
case 988:
|
|
case 989:
|
|
case 990:
|
|
case 991:
|
|
case 1028:
|
|
case 1029:
|
|
case 1030:
|
|
case 1040:
|
|
case 1041:
|
|
case 1050:
|
|
case 1051:
|
|
case 1052:
|
|
case 1053:
|
|
case 1054:
|
|
case 1055:
|
|
case 1056:
|
|
case 1057:
|
|
case 1058:
|
|
case 1059:
|
|
case 1093:
|
|
case 1094:
|
|
case 1095:
|
|
case 1096:
|
|
case 1097:
|
|
case 1098:
|
|
case 1099:
|
|
case 1100:
|
|
case 1113:
|
|
case 1114:
|
|
case 1115:
|
|
case 1116:
|
|
case 1117:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sub_51678(int a1, int a2, int a3, int a4, int a5, int a6)
|
|
{
|
|
}
|
|
|
|
int ghcons_isanimalescapewall(short w)
|
|
{
|
|
walltype *wl = &wall[w];
|
|
switch (wall[w].picnum)
|
|
{
|
|
case 1182:
|
|
case 1183:
|
|
case 1184:
|
|
case 1185:
|
|
case 2347:
|
|
case 3802:
|
|
case 3803:
|
|
case 7870:
|
|
case 7871:
|
|
case 7872:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int ghcons_isanimalescapesect(short s)
|
|
{
|
|
sectortype *sc = §or[s];
|
|
return sector[s].hitag == 2001;
|
|
}
|
|
|
|
int sub_517AC(int *a1, int *a2, short *a3)
|
|
{
|
|
int i, x, y;
|
|
short j;
|
|
if (numsectors < 0 || numsectors >= MAXSECTORS)
|
|
return 0;
|
|
for (i = 0; i < 32; i++)
|
|
{
|
|
x = (((rrdh_random() & 2047) + 1) - 1024) * 100;
|
|
y = (((rrdh_random() & 2047) + 1) - 1024) * 100;
|
|
|
|
for (j = 0; j < numsectors; j++)
|
|
{
|
|
if (inside(x, y, j))
|
|
{
|
|
*a1 = x;
|
|
*a2 = y;
|
|
*a3 = j;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int ghcons_findnewspot(short a1)
|
|
{
|
|
int v20 = 0, v24 = 0;
|
|
short v18 = 0;
|
|
spritetype *spr;
|
|
sectortype *sec;
|
|
spr = &sprite[a1];
|
|
if (sub_517AC(&v20, &v24, &v18))
|
|
{
|
|
sec = §or[v18];
|
|
switch (DYNAMICTILEMAP(spr->picnum))
|
|
{
|
|
case PIG__STATICRR:
|
|
case VIXEN__STATICRR:
|
|
case CHEER__STATICRR:
|
|
if (sec->hitag)
|
|
return 0;
|
|
break;
|
|
case DOGRUN__STATICRR:
|
|
if (sec->hitag)
|
|
return 0;
|
|
break;
|
|
}
|
|
vec3_t pos = { v20, v24, v18 };
|
|
setsprite(a1, &pos);
|
|
changespritesect(a1, v18);
|
|
if (spr->picnum == DOGRUN)
|
|
spr->z = -307200;
|
|
else
|
|
spr->z = sec->floorz;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sub_519E8(int a1)
|
|
{
|
|
int vbx;
|
|
if ((rrdh_random() & 63) == 32)
|
|
{
|
|
if (sub_57A60(20))
|
|
{
|
|
vbx = rrdh_random() % 5;
|
|
switch (a1)
|
|
{
|
|
case 0:
|
|
case 4:
|
|
vbx += 60;
|
|
break;
|
|
case 1:
|
|
case 5:
|
|
vbx += 65;
|
|
break;
|
|
case 2:
|
|
vbx += 70;
|
|
break;
|
|
case 3:
|
|
vbx += 75;
|
|
break;
|
|
}
|
|
S_PlaySound(vbx);
|
|
}
|
|
}
|
|
}
|
|
|
|
int dword_AA25C;
|
|
|
|
void ghsound_ambientlooppoll(void)
|
|
{
|
|
if (dword_AA25C)
|
|
{
|
|
if (dword_AA25C < 0 || dword_AA25C >= MAXSOUNDS)
|
|
{
|
|
initprintf("ghsound_ambientlooppoll bad index\n");
|
|
return;
|
|
}
|
|
if (!A_CheckSoundPlaying(-1, dword_AA25C))
|
|
{
|
|
A_PlaySound(dword_AA25C, g_player[screenpeek].ps->i);
|
|
}
|
|
}
|
|
}
|
|
|
|
void ghsound_ambientloop(int a1)
|
|
{
|
|
switch (a1)
|
|
{
|
|
case 0:
|
|
A_PlaySound(83, g_player[screenpeek].ps->i);
|
|
dword_AA25C = 83;
|
|
break;
|
|
case 1:
|
|
S_PlaySound(84);
|
|
dword_AA25C = 84;
|
|
break;
|
|
case 2:
|
|
S_PlaySound(85);
|
|
dword_AA25C = 85;
|
|
break;
|
|
default:
|
|
dword_AA25C = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
int dword_AA260;
|
|
|
|
int sub_51B68(void)
|
|
{
|
|
int r;
|
|
if ((int)totalclock - dword_AA260 < 200)
|
|
return 0;
|
|
if ((rrdh_random() & 127) != 64)
|
|
return 0;
|
|
|
|
dword_AA260 = (int)totalclock;
|
|
|
|
r = 60 + (rrdh_random() % 15);
|
|
S_PlaySound(r);
|
|
return r;
|
|
}
|
|
|
|
int ghsound_pmadecall(spritetype *a1, short a2)
|
|
{
|
|
switch (DYNAMICTILEMAP(a1->picnum))
|
|
{
|
|
case DOGRUN__STATICRR:
|
|
if (A_CheckSoundPlaying(-1, 41))
|
|
return 1;
|
|
case VIXEN__STATICRR:
|
|
if (A_CheckSoundPlaying(-1, 40))
|
|
return 1;
|
|
case PIG__STATICRR:
|
|
if (A_CheckSoundPlaying(-1, 42))
|
|
return 1;
|
|
case CHEER__STATICRR:
|
|
if (A_CheckSoundPlaying(-1, 43))
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int ghsound_pmadesound(spritetype *a1, short a2)
|
|
{
|
|
int d = klabs(g_player[a2].ps->pos.x - a1->x) + klabs(g_player[a2].ps->pos.y - a1->y);
|
|
if (A_CheckSoundPlaying(-1, 1) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 2))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 3) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 4))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 5) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 6))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 7) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 8) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 56) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 57) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 58) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 59) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 25) && d < 21504)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 11) && d < 10752)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 9) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 10) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 12) && d < 19968)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 15) && d < 10752)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 13) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 14) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 16) && d < 19968)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 19) && d < 10752)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 17) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 18) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 20) && d < 19968)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 23) && d < 10752)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 21) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 22) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 24) && d < 19968)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 81) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 80) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 41) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 40) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 42) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 43) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 88) && d < 10752)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 89) && d < 15360)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 90) && d < 23040)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 27) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 36) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 30) && d < 30720)
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 33) && d < 30720)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
int ghsound_pfiredgunnear(spritetype *a1, short a2)
|
|
{
|
|
if (A_CheckSoundPlaying(-1, 2))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 4))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 6))
|
|
return 1;
|
|
if (A_CheckSoundPlaying(-1, 8) && klabs(g_player[a2].ps->pos.x - a1->x) + klabs(g_player[a2].ps->pos.y - a1->y) < 23040)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
|
|
int sub_5228C(short a1)
|
|
{
|
|
switch (a1)
|
|
{
|
|
case 998:
|
|
case 999:
|
|
case 1007:
|
|
case 1008:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int sub_522B8(short a1)
|
|
{
|
|
switch (a1)
|
|
{
|
|
case 981:
|
|
case 982:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int dword_AA264;
|
|
|
|
void ghsound_footstepsound(short a1, int a2)
|
|
{
|
|
DukePlayer_t *p;
|
|
int i, nexti, d;
|
|
spritetype *s;
|
|
if (sub_535EC())
|
|
return;
|
|
|
|
p = g_player[a1].ps;
|
|
if (sector[p->cursectnum].hitag == 2003)
|
|
{
|
|
if (a2 == 0)
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
A_PlaySound(81, p->i);
|
|
}
|
|
else if (a2 == 1)
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
A_PlaySound(80, p->i);
|
|
}
|
|
else
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
A_PlaySound(82, p->i);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (a2 == 0)
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
{
|
|
switch (ud.level_number)
|
|
{
|
|
case 0:
|
|
A_PlaySound(9, p->i);
|
|
break;
|
|
case 1:
|
|
A_PlaySound(13, p->i);
|
|
break;
|
|
case 2:
|
|
A_PlaySound(17, p->i);
|
|
break;
|
|
case 3:
|
|
A_PlaySound(21, p->i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if (a2 == 1)
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
{
|
|
switch (ud.level_number)
|
|
{
|
|
case 0:
|
|
A_PlaySound(10, p->i);
|
|
break;
|
|
case 1:
|
|
A_PlaySound(14, p->i);
|
|
break;
|
|
case 2:
|
|
A_PlaySound(18, p->i);
|
|
break;
|
|
case 3:
|
|
A_PlaySound(22, p->i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (sub_57A40(5) == 1)
|
|
{
|
|
switch (ud.level_number)
|
|
{
|
|
case 0:
|
|
A_PlaySound(11, p->i);
|
|
break;
|
|
case 1:
|
|
A_PlaySound(15, p->i);
|
|
break;
|
|
case 2:
|
|
A_PlaySound(19, p->i);
|
|
break;
|
|
case 3:
|
|
A_PlaySound(23, p->i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
i = headspritesect[p->cursectnum];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritesect[i];
|
|
s = &sprite[i];
|
|
if (sub_5228C(s->picnum) && klabs(p->pos.x - s->x) + klabs(p->pos.y - s->y) < s->clipdist)
|
|
{
|
|
if (i != dword_AA264)
|
|
{
|
|
A_PlaySound(25, p->i);
|
|
sub_5A250(4096);
|
|
dword_AA264 = i;
|
|
}
|
|
return;
|
|
}
|
|
else if (sub_522B8(s->picnum) && klabs(p->pos.x - s->x) + klabs(p->pos.y - s->y) < 124)
|
|
{
|
|
sub_5A250(2048);
|
|
}
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
void ghsound_plrtouchedsprite(short a1, short a2)
|
|
{
|
|
DukePlayer_t *p;
|
|
spritetype *s;
|
|
p = g_player[a2].ps;
|
|
|
|
s = &sprite[a1];
|
|
if (rrgh_isatree(a1))
|
|
{
|
|
switch (ud.level_number)
|
|
{
|
|
case 0:
|
|
if (!A_CheckSoundPlaying(-1, 12))
|
|
A_PlaySound(12, p->i);
|
|
break;
|
|
case 1:
|
|
if (!A_CheckSoundPlaying(-1, 16))
|
|
A_PlaySound(16, p->i);
|
|
break;
|
|
case 2:
|
|
if (!A_CheckSoundPlaying(-1, 20))
|
|
A_PlaySound(20, p->i);
|
|
break;
|
|
case 3:
|
|
if (!A_CheckSoundPlaying(-1, 24))
|
|
A_PlaySound(24, p->i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned short word_AA268[] = {
|
|
9, 10, 11, 12, 25, 35, 36, 37, 41, 60, 61, 62, 63, 64, 80, 81, 82
|
|
};
|
|
|
|
unsigned short word_AA28A[] = {
|
|
13, 14, 15, 16, 25, 26, 27, 28, 32, 33, 34, 40, 43, 65, 66, 67, 68, 69
|
|
};
|
|
|
|
unsigned short word_AA2AE[] = {
|
|
17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 31, 40, 42, 70, 71, 72, 73, 74
|
|
};
|
|
|
|
unsigned short word_AA2D2[] = {
|
|
21, 22, 23, 24, 25, 26, 27, 28, 40, 75, 76, 77, 78, 79
|
|
};
|
|
|
|
void ghsound_preload(int a1)
|
|
{
|
|
#if 0
|
|
unsigned short *vsi = NULL, snd;
|
|
int i, c;
|
|
switch (a1)
|
|
{
|
|
case 0:
|
|
vsi = word_AA268;
|
|
c = 17;
|
|
break;
|
|
case 1:
|
|
vsi = word_AA28A;
|
|
c = 18;
|
|
break;
|
|
case 2:
|
|
vsi = word_AA2AE;
|
|
c = 18;
|
|
break;
|
|
case 3:
|
|
vsi = word_AA2D2;
|
|
c = 14;
|
|
break;
|
|
}
|
|
if (vsi)
|
|
{
|
|
for (i = 0; i < c; i++)
|
|
{
|
|
snd = vsi[i];
|
|
if (snd >= MAXSOUNDS)
|
|
{
|
|
initprintf("ERROR: ghsound_preload: sndnum out of range\n");
|
|
continue;
|
|
}
|
|
if (snd > 0 && g_sounds[snd].ptr == NULL)
|
|
{
|
|
S_LoadSound(snd);
|
|
}
|
|
}
|
|
}
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
if (g_sounds[1].ptr == NULL)
|
|
{
|
|
S_LoadSound(1);
|
|
}
|
|
if (g_sounds[2].ptr == NULL)
|
|
{
|
|
S_LoadSound(2);
|
|
}
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
if (g_sounds[5].ptr == NULL)
|
|
{
|
|
S_LoadSound(5);
|
|
}
|
|
if (g_sounds[6].ptr == NULL)
|
|
{
|
|
S_LoadSound(6);
|
|
}
|
|
break;
|
|
case 3:
|
|
if (g_sounds[3].ptr == NULL)
|
|
{
|
|
S_LoadSound(3);
|
|
}
|
|
if (g_sounds[4].ptr == NULL)
|
|
{
|
|
S_LoadSound(4);
|
|
}
|
|
break;
|
|
case 4:
|
|
if (g_sounds[7].ptr == NULL)
|
|
{
|
|
S_LoadSound(7);
|
|
}
|
|
if (g_sounds[8].ptr == NULL)
|
|
{
|
|
S_LoadSound(8);
|
|
}
|
|
break;
|
|
}
|
|
if (g_sounds[98].ptr == NULL)
|
|
{
|
|
S_LoadSound(98);
|
|
}
|
|
if (g_sounds[99].ptr == NULL)
|
|
{
|
|
S_LoadSound(99);
|
|
}
|
|
if (g_sounds[100].ptr == NULL)
|
|
{
|
|
S_LoadSound(100);
|
|
}
|
|
if (g_sounds[101].ptr == NULL)
|
|
{
|
|
S_LoadSound(101);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void ghprelvl_randkeep(short a1, unsigned int a2)
|
|
{
|
|
short vbx;
|
|
int v18 = 0;
|
|
unsigned int i, vcx;
|
|
while (1)
|
|
{
|
|
vcx = 0;
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
if (sprite[i].picnum == a1)
|
|
vcx++;
|
|
}
|
|
if (vcx <= a2)
|
|
return;
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
if (!v18)
|
|
vbx = MAXSPRITES - 1 - i;
|
|
else
|
|
vbx = i;
|
|
|
|
if (a1 == sprite[vbx].picnum)
|
|
{
|
|
if ((rrdh_random() % 256) < 32)
|
|
{
|
|
sprite[vbx].picnum = 0;
|
|
deletesprite(vbx);
|
|
vcx--;
|
|
if (vcx <= a2)
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (!v18)
|
|
v18 = 1;
|
|
else
|
|
v18 = 0;
|
|
}
|
|
}
|
|
|
|
char sub_52AB8(int a1, int a2)
|
|
{
|
|
int vbx = (a1 * a2) / 100;
|
|
return (rrdh_random() % vbx) % 256;
|
|
}
|
|
|
|
int sub_52AF0(short a1)
|
|
{
|
|
if (a1 < 0 || a1 >= MAXSPRITES)
|
|
return 0;
|
|
switch (DYNAMICTILEMAP(sprite[a1].picnum))
|
|
{
|
|
case PIG__STATICRR:
|
|
case DOGRUN__STATICRR:
|
|
case VIXEN__STATICRR:
|
|
case CHEER__STATICRR:
|
|
case RRTILE1076__STATICRR:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int sub_52B58(short a1)
|
|
{
|
|
if (a1 < 0 || a1 >= MAXSPRITES)
|
|
return 0;
|
|
switch (sprite[a1].picnum)
|
|
{
|
|
case 976:
|
|
case 977:
|
|
case 2603:
|
|
case 2990:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sub_52BA8(void)
|
|
{
|
|
int v1c, tl, tc;
|
|
int i;
|
|
short sect;
|
|
v1c = 0;
|
|
sub_59C20();
|
|
sub_54A2C();
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
sprite[i].cstat = 0;
|
|
sprite[i].pal = 0;
|
|
changespritestat(i, 0);
|
|
sect = sprite[i].sectnum;
|
|
if (sub_52AF0(i))
|
|
{
|
|
if (sect >= 0 && sect < numsectors)
|
|
{
|
|
if (sector[sect].ceilingheinum == 0 && sector[sect].floorheinum == 0)
|
|
{
|
|
if (klabs(sprite[i].z - sector[sect].floorz) > 1024 && sprite[i].z < sector[sect].floorz)
|
|
{
|
|
initprintf("NOTICE: deleting floating sprite %i: x=%i, y=%i, z=%i, sect=%i\n", i, sprite[i].x, sprite[i].y, sprite[i].z, sect);
|
|
deletesprite(i);
|
|
sprite[i].picnum = 0;
|
|
sprite[i].cstat = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (sub_52B58(i))
|
|
{
|
|
sprite[i].cstat = 1;
|
|
sprite[i].clipdist = 8;
|
|
}
|
|
if (rrgh_isatree(i))
|
|
{
|
|
sprite[i].cstat = 1;
|
|
sprite[i].xoffset = 0;
|
|
sprite[i].yoffset = 0;
|
|
sprite[i].clipdist = 8;
|
|
}
|
|
if (sprite[i].picnum == 998 || sprite[i].picnum == 999 || sprite[i].picnum == 1007 || sprite[i].picnum == 1008)
|
|
{
|
|
sprite[i].cstat = 32;
|
|
sprite[i].clipdist = 127;
|
|
}
|
|
if (sprite[i].picnum)
|
|
{
|
|
v1c++;
|
|
}
|
|
}
|
|
ghprelvl_randkeep(PIG, 4);
|
|
ghprelvl_randkeep(VIXEN, 4);
|
|
ghprelvl_randkeep(DOGRUN, 4);
|
|
ghprelvl_randkeep(CHEER, 4);
|
|
ghprelvl_randkeep(7065, 64);
|
|
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
if (sprite[i].picnum == PIG)
|
|
{
|
|
sprite[i].cstat = 257;
|
|
changespritestat(i, 1);
|
|
sprite[i].xrepeat = 10 + sub_52AB8(5, 125);
|
|
sprite[i].yrepeat = 10 + sub_52AB8(5, 125);
|
|
sprite[i].clipdist = mulscale7(sprite[i].xrepeat, tilesiz[sprite[i].picnum].x);
|
|
}
|
|
if (sprite[i].picnum == VIXEN)
|
|
{
|
|
sprite[i].cstat = 257;
|
|
changespritestat(i, 1);
|
|
sprite[i].xrepeat = 14 + sub_52AB8(7, 100);
|
|
sprite[i].yrepeat = 14 + sub_52AB8(7, 100);
|
|
sprite[i].clipdist = mulscale7(sprite[i].xrepeat, tilesiz[sprite[i].picnum].x);
|
|
}
|
|
if (sprite[i].picnum == DOGRUN)
|
|
{
|
|
sprite[i].cstat = 257;
|
|
changespritestat(i, 1);
|
|
sprite[i].xrepeat = 8 + sub_52AB8(4, 100);
|
|
sprite[i].yrepeat = 8 + sub_52AB8(4, 100);
|
|
sprite[i].clipdist = mulscale7(sprite[i].xrepeat, tilesiz[sprite[i].picnum].x);
|
|
}
|
|
if (sprite[i].picnum == CHEER)
|
|
{
|
|
sprite[i].cstat = 257;
|
|
changespritestat(i, 1);
|
|
sprite[i].xrepeat = 8 + sub_52AB8(4, 100);
|
|
sprite[i].yrepeat = 8 + sub_52AB8(4, 100);
|
|
sprite[i].clipdist = mulscale7(sprite[i].xrepeat, tilesiz[sprite[i].picnum].x);
|
|
}
|
|
if (sprite[i].picnum == 7065)
|
|
{
|
|
sprite[i].cstat = 0;
|
|
sprite[i].z -= rrdh_random() << 3;
|
|
changespritestat(i, 801);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < numwalls; i++)
|
|
{
|
|
if (wall[i].nextsector != -1)
|
|
{
|
|
wall[i].cstat &= ~64;
|
|
}
|
|
}
|
|
sub_55F8C();
|
|
sub_566F0();
|
|
sub_558F4();
|
|
sub_56AB8();
|
|
sub_573C0();
|
|
sub_59314();
|
|
ghsound_preload(ud.level_number);
|
|
sub_55184();
|
|
sub_57B24();
|
|
sub_58388();
|
|
sub_59B50();
|
|
sub_59F80(ud.level_number);
|
|
sub_299C0();
|
|
}
|
|
|
|
void sub_53154(int a1)
|
|
{
|
|
ghsound_ambientloop(a1);
|
|
}
|
|
|
|
int dword_AA2F0, dword_AA2F4, dword_AA2F8, dword_AA2FC;
|
|
|
|
void sub_53160(int a1)
|
|
{
|
|
dword_AA2FC = a1;
|
|
dword_AA2F8 = 1;
|
|
}
|
|
|
|
void sub_53194(void)
|
|
{
|
|
switch (dword_AA2F0)
|
|
{
|
|
case 0:
|
|
if (KB_KeyPressed(sc_S))
|
|
{
|
|
KB_ClearKeyDown(sc_S);
|
|
dword_AA2F0++;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (KB_KeyPressed(sc_P))
|
|
{
|
|
KB_ClearKeyDown(sc_P);
|
|
dword_AA2F0++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if (KB_KeyPressed(sc_O))
|
|
{
|
|
KB_ClearKeyDown(sc_O);
|
|
dword_AA2F0++;
|
|
}
|
|
break;
|
|
case 3:
|
|
if (KB_KeyPressed(sc_R))
|
|
{
|
|
KB_ClearKeyDown(sc_R);
|
|
dword_AA2F0++;
|
|
}
|
|
break;
|
|
case 4:
|
|
if (KB_KeyPressed(sc_K))
|
|
{
|
|
KB_ClearKeyDown(sc_K);
|
|
dword_AA2F0++;
|
|
}
|
|
break;
|
|
case 5:
|
|
if (KB_KeyPressed(sc_1))
|
|
{
|
|
KB_ClearKeyDown(sc_1);
|
|
dword_AA2F0 = 0;
|
|
sub_535DC();
|
|
}
|
|
if (KB_KeyPressed(sc_2))
|
|
{
|
|
KB_ClearKeyDown(sc_2);
|
|
dword_AA2F0 = 0;
|
|
sub_57AC0();
|
|
}
|
|
if (KB_KeyPressed(sc_3))
|
|
{
|
|
KB_ClearKeyDown(sc_3);
|
|
dword_AA2F0 = 0;
|
|
//sub_15224();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_53304(void)
|
|
{
|
|
//ControlInfo info;
|
|
//CONTROL_GetInput(&info);
|
|
|
|
if (KB_KeyPressed(sc_RightAlt) || KB_KeyPressed(sc_LeftAlt) || KB_KeyPressed(sc_RightShift) || KB_KeyPressed(sc_LeftShift))
|
|
return;
|
|
|
|
sub_53194();
|
|
if (KB_KeyPressed(sc_F1))
|
|
{
|
|
KB_ClearKeyDown(sc_F1);
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
sub_566E8();
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sub_55F68();
|
|
break;
|
|
case 3:
|
|
sub_558D0();
|
|
break;
|
|
case 4:
|
|
sub_56AB0();
|
|
break;
|
|
}
|
|
}
|
|
if (KB_KeyPressed(sc_F2))
|
|
{
|
|
KB_ClearKeyDown(sc_F2);
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
sub_56780();
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sub_56020();
|
|
break;
|
|
case 3:
|
|
sub_55988();
|
|
break;
|
|
case 4:
|
|
sub_56B3C();
|
|
break;
|
|
}
|
|
}
|
|
if (KB_KeyPressed(sc_F3))
|
|
{
|
|
KB_ClearKeyDown(sc_F3);
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
sub_56724();
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
sub_55FCC();
|
|
break;
|
|
case 3:
|
|
sub_55934();
|
|
break;
|
|
case 4:
|
|
sub_56AE4();
|
|
break;
|
|
}
|
|
}
|
|
if (KB_KeyPressed(sc_F4))
|
|
{
|
|
KB_ClearKeyDown(sc_F4);
|
|
ghdeploy_drop(myconnectindex, ud.level_number);
|
|
}
|
|
if (KB_KeyPressed(sc_F5))
|
|
{
|
|
KB_ClearKeyDown(sc_F5);
|
|
A_PlaySound(40, g_player[myconnectindex].ps->i);
|
|
}
|
|
if (KB_KeyPressed(sc_F6))
|
|
{
|
|
KB_ClearKeyDown(sc_F6);
|
|
A_PlaySound(42, g_player[myconnectindex].ps->i);
|
|
}
|
|
if (KB_KeyPressed(sc_F7))
|
|
{
|
|
KB_ClearKeyDown(sc_F7);
|
|
A_PlaySound(41, g_player[myconnectindex].ps->i);
|
|
}
|
|
if (KB_KeyPressed(sc_F8))
|
|
{
|
|
KB_ClearKeyDown(sc_F8);
|
|
A_PlaySound(43, g_player[myconnectindex].ps->i);
|
|
}
|
|
//if (KB_KeyPressed(sc_S))
|
|
//{
|
|
// KB_ClearKeyDown(sc_S);
|
|
//}
|
|
}
|
|
|
|
void sub_535DC(void)
|
|
{
|
|
dword_AA2F4 ^= 1;
|
|
}
|
|
|
|
int sub_535EC(void)
|
|
{
|
|
return dword_AA2F4;
|
|
}
|
|
|
|
int dword_AA300;
|
|
int dword_AA304 = 1731;
|
|
int dword_AA308, dword_AA30C;
|
|
|
|
struct struct2B80E0 {
|
|
short f_0;
|
|
short f_2;
|
|
int f_4;
|
|
int f_8;
|
|
int f_c;
|
|
int f_10;
|
|
};
|
|
|
|
struct2B80E0 f2B80E0[20];
|
|
|
|
#pragma pack(push, 1)
|
|
typedef struct _scoretype2 {
|
|
int f_0;
|
|
char f_4;
|
|
char f_5;
|
|
char f_6;
|
|
int f_7;
|
|
int f_b;
|
|
} scoretype2;
|
|
|
|
typedef struct _scoretype {
|
|
int f_0;
|
|
int f_4;
|
|
int f_8;
|
|
int f_c;
|
|
scoretype2 f_10[5];
|
|
} scoretype;
|
|
#pragma pack(pop)
|
|
|
|
|
|
scoretype bestscore = {
|
|
0, 0, 0, 0,
|
|
0, 65, 65, 65, 0, 0,
|
|
0, 65, 65, 65, 0, 0,
|
|
0, 65, 65, 65, 0, 0,
|
|
0, 65, 65, 65, 0, 0,
|
|
0, 65, 65, 65, 0, 0,
|
|
};
|
|
|
|
unsigned int dword_AA36C, dword_AA370, dword_AA374, dword_AA378, dword_AA37C, dword_AA380;
|
|
int dword_AA384;
|
|
char byte_AA388 = 65, byte_AA389 = 65, byte_AA38A = 65;
|
|
unsigned int dword_AA38C;
|
|
|
|
char dword_AA390[43] = " ";
|
|
|
|
void ghtrophy_savebestscores(void)
|
|
{
|
|
FileWriter *handle;
|
|
|
|
FString filename = M_GetDocumentsPath() + "scores";
|
|
|
|
handle = FileWriter::Open(filename);
|
|
if (!handle)
|
|
{
|
|
Printf("ghtrophy_savebestscores: cannot open scores\n"); // this is not an error!
|
|
return;
|
|
}
|
|
if (dword_AA36C > bestscore.f_0)
|
|
bestscore.f_0 = dword_AA36C;
|
|
if (dword_AA370 > bestscore.f_4)
|
|
bestscore.f_4 = dword_AA370;
|
|
if (dword_AA374 > bestscore.f_8)
|
|
bestscore.f_8 = dword_AA374;
|
|
if (dword_AA378 > bestscore.f_c)
|
|
bestscore.f_c = dword_AA378;
|
|
|
|
if (handle->Write(&bestscore, sizeof(bestscore)) != sizeof(bestscore))
|
|
{
|
|
initprintf("ghtrophy_savebestscores: error writing scores\n");
|
|
delete handle;
|
|
return;
|
|
}
|
|
delete handle;
|
|
dword_AA380 = 0;
|
|
}
|
|
|
|
void ghtrophy_loadbestscores(void)
|
|
{
|
|
FileReader handle;
|
|
FString filename = M_GetDocumentsPath() + "scores";
|
|
if (!handle.OpenFile(filename))
|
|
{
|
|
// This is not an error.
|
|
return;
|
|
}
|
|
if (handle.Read(&bestscore, sizeof(bestscore)) != sizeof(bestscore))
|
|
{
|
|
initprintf("ghtrophy_loadbestscores err read scores\n");
|
|
memset(&bestscore, 0, sizeof(bestscore));
|
|
}
|
|
}
|
|
|
|
int ghtrophy_isakill(short a1)
|
|
{
|
|
spritetype *spr = &sprite[a1];
|
|
for (int i = 0; i < dword_AA300; i++)
|
|
{
|
|
if (f2B80E0[i].f_0 == a1)
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int sub_537A8(short a1, int a2)
|
|
{
|
|
char va = rrdh_random() & 255;
|
|
switch (DYNAMICTILEMAP(a1))
|
|
{
|
|
case PIG__STATICRR:
|
|
if (a2 == 0 && va > 64)
|
|
break;
|
|
if (a2 == 6 && va > 80)
|
|
break;
|
|
if (a2 == 2 && va > 128)
|
|
break;
|
|
return 1;
|
|
case VIXEN__STATICRR:
|
|
if (a2 == 6 && va > 128)
|
|
break;
|
|
return 1;
|
|
case CHEER__STATICRR:
|
|
return 1;
|
|
case DOGRUN__STATICRR:
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int sub_5381C(int a1, int a2)
|
|
{
|
|
int vbx = (a1 * a2) / 100;
|
|
return rrdh_random() % vbx;
|
|
}
|
|
|
|
void sub_53848(int a1)
|
|
{
|
|
dword_AA37C = a1;
|
|
}
|
|
|
|
void ghtrophy_addkill(int a1)
|
|
{
|
|
int v18 = 0, vdi = 0;
|
|
spritetype *spr = &sprite[a1];
|
|
|
|
if (ud.level_number > 3)
|
|
return;
|
|
|
|
if (sprite[a1].cstat & 32768)
|
|
return;
|
|
|
|
switch (DYNAMICTILEMAP(sprite[a1].picnum))
|
|
{
|
|
default:
|
|
sub_5A250(4);
|
|
break;
|
|
case PIG__STATICRR:
|
|
case DOGRUN__STATICRR:
|
|
case VIXEN__STATICRR:
|
|
case CHEER__STATICRR:
|
|
if (!ghtrophy_isakill(a1) && sub_537A8(sprite[a1].picnum, v18))
|
|
{
|
|
if (dword_AA300 < 20)
|
|
{
|
|
f2B80E0[dword_AA300].f_0 = a1;
|
|
f2B80E0[dword_AA300].f_2 = sprite[a1].picnum;
|
|
switch (DYNAMICTILEMAP(sprite[a1].picnum))
|
|
{
|
|
case VIXEN__STATICRR:
|
|
f2B80E0[dword_AA300].f_4 = (sprite[a1].xrepeat * sprite[a1].yrepeat) / 40;
|
|
f2B80E0[dword_AA300].f_4 -= 2;
|
|
if (f2B80E0[dword_AA300].f_4 < 2)
|
|
f2B80E0[dword_AA300].f_4 = 2;
|
|
f2B80E0[dword_AA300].f_4 += 2;
|
|
if (f2B80E0[dword_AA300].f_4 > dword_AA36C)
|
|
dword_AA36C = f2B80E0[dword_AA300].f_4;
|
|
dword_AA308++;
|
|
vdi = dword_AA308;
|
|
break;
|
|
case PIG__STATICRR:
|
|
f2B80E0[dword_AA300].f_4 = sprite[a1].xrepeat * sprite[a1].yrepeat;
|
|
f2B80E0[dword_AA300].f_4 += sub_5381C(30, 125);
|
|
f2B80E0[dword_AA300].f_4 += sub_5381C(10, 100);
|
|
if (f2B80E0[dword_AA300].f_4 > 350)
|
|
f2B80E0[dword_AA300].f_4 = 350;
|
|
if (f2B80E0[dword_AA300].f_4 > dword_AA370)
|
|
dword_AA370 = f2B80E0[dword_AA300].f_4;
|
|
dword_AA30C++;
|
|
vdi = dword_AA30C;
|
|
break;
|
|
case DOGRUN__STATICRR:
|
|
f2B80E0[dword_AA300].f_4 = (sprite[a1].xrepeat * sprite[a1].yrepeat) / 40;
|
|
f2B80E0[dword_AA300].f_4 += sub_5381C(4, 125);
|
|
f2B80E0[dword_AA300].f_4 -= 3;
|
|
if (f2B80E0[dword_AA300].f_4 < 2)
|
|
f2B80E0[dword_AA300].f_4 = 2;
|
|
dword_AA378++;
|
|
vdi = dword_AA378;
|
|
break;
|
|
case CHEER__STATICRR:
|
|
f2B80E0[dword_AA300].f_4 = (sprite[a1].xrepeat * sprite[a1].yrepeat) / 16;
|
|
f2B80E0[dword_AA300].f_4 += sub_5381C(10, 125);
|
|
if (f2B80E0[dword_AA300].f_4 < 8)
|
|
f2B80E0[dword_AA300].f_4 = 8;
|
|
dword_AA374++;
|
|
vdi = dword_AA374;
|
|
break;
|
|
}
|
|
ghstatbr_registerkillinfo(f2B80E0[dword_AA300].f_2, f2B80E0[dword_AA300].f_4, vdi);
|
|
dword_AA300++;
|
|
}
|
|
sub_5A250(8);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ghtrophy_rscopysrcdest(scoretype2 *a1, scoretype2 *a2)
|
|
{
|
|
if (!a1 || !a2)
|
|
{
|
|
initprintf("ghtrophy_rscopysrcdest null ptr\n");
|
|
return;
|
|
}
|
|
a2->f_0 = a1->f_0;
|
|
a2->f_4 = a1->f_4;
|
|
a2->f_5 = a1->f_5;
|
|
a2->f_6 = a1->f_6;
|
|
}
|
|
|
|
void sub_53C04(void)
|
|
{
|
|
scoretype2 v60, v50, v40, v30, v20;
|
|
dword_AA380 = 0;
|
|
dword_AA384 = 0;
|
|
dword_AA38C = (int)totalclock;
|
|
if (dword_AA37C > bestscore.f_10[0].f_0)
|
|
{
|
|
v20.f_0 = dword_AA37C;
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[0], &v50);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[1], &v30);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[2], &v40);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[3], &v60);
|
|
dword_AA380 = 1;
|
|
}
|
|
else if (dword_AA37C > bestscore.f_10[1].f_0)
|
|
{
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[0], &v20);
|
|
v50.f_0 = dword_AA37C;
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[1], &v30);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[2], &v40);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[3], &v60);
|
|
dword_AA380 = 2;
|
|
}
|
|
else if (dword_AA37C > bestscore.f_10[2].f_0)
|
|
{
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[0], &v20);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[1], &v50);
|
|
v30.f_0 = dword_AA37C;
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[2], &v40);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[3], &v60);
|
|
dword_AA380 = 3;
|
|
}
|
|
else if (dword_AA37C > bestscore.f_10[3].f_0)
|
|
{
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[0], &v20);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[1], &v50);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[2], &v30);
|
|
v40.f_0 = dword_AA37C;
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[3], &v60);
|
|
dword_AA380 = 4;
|
|
}
|
|
else if (dword_AA37C > bestscore.f_10[4].f_0)
|
|
{
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[0], &v20);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[1], &v50);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[2], &v30);
|
|
ghtrophy_rscopysrcdest(&bestscore.f_10[3], &v40);
|
|
v60.f_0 = dword_AA37C;
|
|
dword_AA380 = 5;
|
|
}
|
|
if (dword_AA380)
|
|
{
|
|
ghtrophy_rscopysrcdest(&v20, &bestscore.f_10[0]);
|
|
ghtrophy_rscopysrcdest(&v50, &bestscore.f_10[1]);
|
|
ghtrophy_rscopysrcdest(&v30, &bestscore.f_10[2]);
|
|
ghtrophy_rscopysrcdest(&v40, &bestscore.f_10[3]);
|
|
ghtrophy_rscopysrcdest(&v60, &bestscore.f_10[4]);
|
|
}
|
|
}
|
|
|
|
void sub_53E18(void)
|
|
{
|
|
sub_53C04();
|
|
if (dword_AA380)
|
|
{
|
|
sub_53160(300);
|
|
}
|
|
}
|
|
|
|
void sub_53E4C(vec2_t const origin)
|
|
{
|
|
int v20 = 0, v1c, v18, vsi, vdi;
|
|
char val;
|
|
val = sub_54B80();
|
|
if (val & 32)
|
|
{
|
|
v20 = 1;
|
|
switch (dword_AA384)
|
|
{
|
|
case 0:
|
|
byte_AA388 = val;
|
|
break;
|
|
case 1:
|
|
byte_AA389 = val;
|
|
break;
|
|
case 2:
|
|
byte_AA38A = val;
|
|
break;
|
|
}
|
|
}
|
|
|
|
v1c = 0;
|
|
if ((int)totalclock - dword_AA38C > 30)
|
|
{
|
|
v1c = 1;
|
|
dword_AA38C = (int)totalclock;
|
|
}
|
|
|
|
v18 = 18;
|
|
vsi = 100;
|
|
vdi = 44;
|
|
|
|
menutext_(origin.x+(160<<16), origin.y+(22<<16), 0, "TOP FIVE", 10|16, TEXT_XCENTER);
|
|
|
|
if (dword_AA380)
|
|
{
|
|
if (!v1c || dword_AA384 != 0)
|
|
{
|
|
sprintf(dword_AA390, "%c", byte_AA388);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+((vdi+v18*(dword_AA380-1))<<16), dword_AA390);
|
|
}
|
|
if (!v1c || dword_AA384 != 1)
|
|
{
|
|
sprintf(dword_AA390, "%c", byte_AA389);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+((vdi+v18*(dword_AA380-1))<<16), dword_AA390);
|
|
}
|
|
if (!v1c || dword_AA384 != 2)
|
|
{
|
|
sprintf(dword_AA390, "%c", byte_AA38A);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+((vdi+v18*(dword_AA380-1))<<16), dword_AA390);
|
|
}
|
|
switch (dword_AA380)
|
|
{
|
|
case 1:
|
|
bestscore.f_10[0].f_4 = byte_AA388;
|
|
bestscore.f_10[0].f_5 = byte_AA389;
|
|
bestscore.f_10[0].f_6 = byte_AA38A;
|
|
break;
|
|
case 2:
|
|
bestscore.f_10[1].f_4 = byte_AA388;
|
|
bestscore.f_10[1].f_5 = byte_AA389;
|
|
bestscore.f_10[1].f_6 = byte_AA38A;
|
|
break;
|
|
case 3:
|
|
bestscore.f_10[2].f_4 = byte_AA388;
|
|
bestscore.f_10[2].f_5 = byte_AA389;
|
|
bestscore.f_10[2].f_6 = byte_AA38A;
|
|
break;
|
|
case 4:
|
|
bestscore.f_10[3].f_4 = byte_AA388;
|
|
bestscore.f_10[3].f_5 = byte_AA389;
|
|
bestscore.f_10[3].f_6 = byte_AA38A;
|
|
break;
|
|
case 5:
|
|
bestscore.f_10[4].f_4 = byte_AA388;
|
|
bestscore.f_10[4].f_5 = byte_AA389;
|
|
bestscore.f_10[4].f_6 = byte_AA38A;
|
|
break;
|
|
}
|
|
}
|
|
if (dword_AA380 != 1)
|
|
{
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[0].f_4);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+(vdi<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[0].f_5);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+(vdi<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[0].f_6);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+(vdi<<16), dword_AA390);
|
|
}
|
|
sprintf(dword_AA390, "%5d", bestscore.f_10[0].f_0);
|
|
gametext_simple(origin.x+((vsi+74)<<16), origin.y+(vdi<<16), dword_AA390);
|
|
if (dword_AA380 != 2)
|
|
{
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[1].f_4);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+((vdi+v18)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[1].f_5);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+((vdi+v18)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[1].f_6);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+((vdi+v18)<<16), dword_AA390);
|
|
}
|
|
sprintf(dword_AA390, "%5d", bestscore.f_10[1].f_0);
|
|
gametext_simple(origin.x+((vsi+74)<<16), origin.y+((vdi+v18)<<16), dword_AA390);
|
|
if (dword_AA380 != 3)
|
|
{
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[2].f_4);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+((vdi+v18*2)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[2].f_5);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+((vdi+v18*2)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[2].f_6);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+((vdi+v18*2)<<16), dword_AA390);
|
|
}
|
|
sprintf(dword_AA390, "%5d", bestscore.f_10[2].f_0);
|
|
gametext_simple(origin.x+((vsi+74)<<16), origin.y+((vdi+v18*2)<<16), dword_AA390);
|
|
if (dword_AA380 != 4)
|
|
{
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[3].f_4);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+((vdi+v18*3)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[3].f_5);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+((vdi+v18*3)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[3].f_6);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+((vdi+v18*3)<<16), dword_AA390);
|
|
}
|
|
sprintf(dword_AA390, "%5d", bestscore.f_10[3].f_0);
|
|
gametext_simple(origin.x+((vsi+74)<<16), origin.y+((vdi+v18*3)<<16), dword_AA390);
|
|
if (dword_AA380 != 5)
|
|
{
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[4].f_4);
|
|
gametext_simple(origin.x+(vsi<<16), origin.y+((vdi+v18*4)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[4].f_5);
|
|
gametext_simple(origin.x+((vsi+14)<<16), origin.y+((vdi+v18*4)<<16), dword_AA390);
|
|
sprintf(dword_AA390, "%c", bestscore.f_10[4].f_6);
|
|
gametext_simple(origin.x+((vsi+28)<<16), origin.y+((vdi+v18*4)<<16), dword_AA390);
|
|
}
|
|
sprintf(dword_AA390, "%5d", bestscore.f_10[4].f_0);
|
|
gametext_simple(origin.x+((vsi+74)<<16), origin.y+((vdi+v18*4)<<16), dword_AA390);
|
|
|
|
if (KB_KeyPressed(sc_LeftArrow) || KB_KeyPressed(sc_kpad_4))
|
|
{
|
|
KB_ClearKeyDown(sc_LeftArrow);
|
|
KB_ClearKeyDown(sc_kpad_4);
|
|
dword_AA384--;
|
|
}
|
|
else if (v20 || KB_KeyPressed(sc_RightArrow) || KB_KeyPressed(sc_kpad_6))
|
|
{
|
|
KB_ClearKeyDown(sc_RightArrow);
|
|
KB_ClearKeyDown(sc_kpad_6);
|
|
dword_AA384++;
|
|
}
|
|
if (dword_AA384 < 0)
|
|
dword_AA384 = 0;
|
|
if (dword_AA384 > 2)
|
|
dword_AA384 = 0;
|
|
if (dword_AA380)
|
|
{
|
|
gametext_simple(origin.x+(86<<16), origin.y+(146<<16), "PRESS ESC WHEN DONE");
|
|
}
|
|
}
|
|
|
|
void sub_5469C(vec2_t const origin, int a1)
|
|
{
|
|
unsigned int v20, v1c, v18, v24, vdi, t;
|
|
if (a1 == 2)
|
|
{
|
|
sub_53E4C(origin);
|
|
return;
|
|
}
|
|
rotatesprite_fs(origin.x+(160<<16), origin.y, 65536, 0, dword_AA304, 0, 0, 64+16+10);
|
|
if (a1 == 1)
|
|
{
|
|
v20 = bestscore.f_0;
|
|
v1c = bestscore.f_4;
|
|
v18 = bestscore.f_c;
|
|
v24 = bestscore.f_10[0].f_0;
|
|
vdi = bestscore.f_8;
|
|
}
|
|
else
|
|
{
|
|
v20 = dword_AA36C;
|
|
v1c = dword_AA370;
|
|
v18 = dword_AA378;
|
|
v24 = dword_AA37C;
|
|
vdi = dword_AA374;
|
|
}
|
|
if (v20 > 0)
|
|
{
|
|
rotatesprite_fs(origin.x+(4<<16), origin.y, 36864, 0, 1741, 0, 0, 16+10);
|
|
}
|
|
if (v1c > 0)
|
|
{
|
|
rotatesprite_fs(origin.x+(98<<16), origin.y+(6<<16), 36864, 0, 1740, 0, 0, 16+10);
|
|
}
|
|
if (vdi > 0)
|
|
{
|
|
rotatesprite_fs(origin.x+(172<<16), origin.y+(128<<16), 28576, 0, 1743, 0, 0, 16+10);
|
|
}
|
|
if (v18 > 0)
|
|
{
|
|
rotatesprite_fs(origin.x+(232<<16), origin.y+(128<<16), 28576, 0, 1742, 0, 0, 16+10);
|
|
}
|
|
if (a1 == 0)
|
|
gametext_simple(origin.x+(4<<16), origin.y+(104<<16), "SO FAR IN THIS HUNTIN' TRIP...");
|
|
else
|
|
gametext_simple(origin.x+(4<<16), origin.y+(104<<16), "YOUR BEST TOTALS TO DATE...");
|
|
|
|
sprintf(dword_AA390, "BEST DEER: %2d PTS", v20);
|
|
gametext_simple(origin.x+(8<<16), origin.y+(122<<16), dword_AA390);
|
|
sprintf(dword_AA390, "BEST BOAR: %3d LB", v1c);
|
|
gametext_simple(origin.x+(8<<16), origin.y+(136<<16), dword_AA390);
|
|
sprintf(dword_AA390, "MOST TURKEYS: %2d ", vdi);
|
|
gametext_simple(origin.x+(8<<16), origin.y+(150<<16), dword_AA390);
|
|
sprintf(dword_AA390, "MOST DUCKS: %2d ", v18);
|
|
gametext_simple(origin.x+(8<<16), origin.y+(164<<16), dword_AA390);
|
|
if (a1 == 0)
|
|
{
|
|
t = dword_AA308 + dword_AA30C + v18;
|
|
if (t > 6)
|
|
gametext_simple(origin.x+(8<<16), origin.y+(182<<16), "YEAH BABY !");
|
|
else if (t > 4)
|
|
gametext_simple(origin.x+(8<<16), origin.y+(182<<16), "NICE WORK !");
|
|
else if (t > 1)
|
|
gametext_simple(origin.x+(8<<16), origin.y+(182<<16), "GOOD JOB !");
|
|
else
|
|
gametext_simple(origin.x+(8<<16), origin.y+(182<<16), "KEEP TRYIN' !");
|
|
}
|
|
else
|
|
{
|
|
sprintf(dword_AA390, "BEST RANGE SCORE: %5d", v24);
|
|
gametext_simple(origin.x+(8<<16), origin.y+(182<<16), dword_AA390);
|
|
}
|
|
}
|
|
|
|
void sub_54A2C(void)
|
|
{
|
|
int i;
|
|
dword_AA300 = 0;
|
|
dword_AA304 = 1731+(rrdh_random()%6);
|
|
dword_AA308 = 0;
|
|
dword_AA30C = 0;
|
|
for (i = 0; i < 20; i++)
|
|
{
|
|
f2B80E0[i].f_0 = -1;
|
|
f2B80E0[i].f_2 = 0;
|
|
f2B80E0[i].f_4 = 0;
|
|
f2B80E0[i].f_8 = 0;
|
|
f2B80E0[i].f_c = 0;
|
|
f2B80E0[i].f_10 = 0;
|
|
}
|
|
dword_AA36C = 0;
|
|
dword_AA370 = 0;
|
|
dword_AA374 = 0;
|
|
dword_AA378 = 0;
|
|
dword_AA37C = 0;
|
|
dword_AA380 = 0;
|
|
dword_AA384 = 0;
|
|
byte_AA388 = 65;
|
|
byte_AA389 = 65;
|
|
byte_AA38A = 65;
|
|
dword_AA38C = 0;
|
|
ghtrophy_loadbestscores();
|
|
}
|
|
|
|
char sub_54B80(void)
|
|
{
|
|
#if 0
|
|
switch (KB_GetLastScanCode())
|
|
{
|
|
case sc_A:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'A';
|
|
case sc_B:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'B';
|
|
case sc_C:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'C';
|
|
case sc_D:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'D';
|
|
case sc_E:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'E';
|
|
case sc_F:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'F';
|
|
case sc_G:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'G';
|
|
case sc_H:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'H';
|
|
case sc_I:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'I';
|
|
case sc_J:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'J';
|
|
case sc_K:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'K';
|
|
case sc_L:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'L';
|
|
case sc_M:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'M';
|
|
case sc_N:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'N';
|
|
case sc_O:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'O';
|
|
case sc_P:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'P';
|
|
case sc_Q:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'Q';
|
|
case sc_R:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'R';
|
|
case sc_S:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'S';
|
|
case sc_T:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'T';
|
|
case sc_U:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'U';
|
|
case sc_V:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'V';
|
|
case sc_W:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'W';
|
|
case sc_X:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'X';
|
|
case sc_Y:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'Y';
|
|
case sc_Z:
|
|
KB_SetLastScanCode(sc_None);
|
|
return 'Z';
|
|
default:
|
|
KB_SetLastScanCode(sc_None);
|
|
return ' ';
|
|
}
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
char byte_AA394[6] = { 0, 1, 2, 3, 2, 1 };
|
|
|
|
int dword_AA39C, dword_AA3A0, dword_AA3A4, dword_AA3A8, dword_AA3AC, dword_AA3B0, dword_AA3B4, dword_AA3B8, dword_AA3BC, dword_AA3C0, dword_AA3C4;
|
|
|
|
void sub_54D90(void)
|
|
{
|
|
rotatesprite(160<<16, 100<<16, 32768, 0, 7063, -24, 0, 32+2+1, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
|
|
}
|
|
|
|
void sub_54DE0(void)
|
|
{
|
|
dword_AA3A8 = tilesiz[7050].x;
|
|
dword_AA3AC = tilesiz[7050].y;
|
|
#if 0
|
|
tileCreate(7050, dword_AA3A8, dword_AA3AC);
|
|
#endif
|
|
}
|
|
|
|
void ghrender_preparescope(void)
|
|
{
|
|
#if 0
|
|
int delta, i, j;
|
|
char *ptr;
|
|
dword_AA3A4 = 0;
|
|
if (!waloff[7050])
|
|
return;
|
|
dword_AA3B4 = windowxy2.x - windowxy1.x + 1;
|
|
dword_AA3B8 = windowxy2.y - windowxy1.y + 1;
|
|
if (dword_AA3B4 <= dword_AA3A8 || dword_AA3B8 <= dword_AA3AC)
|
|
return;
|
|
delta = bytesperline - dword_AA3B4;
|
|
if (delta < 0)
|
|
G_GameExit("ghrender_preparescope: delta < 0");
|
|
delta /= 2;
|
|
|
|
dword_AA3B0 = (dword_AA3B8 * bytesperline) / 2;
|
|
dword_AA3B0 -= (bytesperline >> 1);
|
|
dword_AA3B0 -= delta;
|
|
dword_AA3B0 -= (dword_AA3AC >> 1) * bytesperline;
|
|
dword_AA3B0 -= (dword_AA3A8 >> 1);
|
|
tileCopySection(7051, 0, 0, tilesiz[7051].x, tilesiz[7051].y, 7050, 0, 0);
|
|
ptr = (char*)waloff[7050];
|
|
if (ptr)
|
|
{
|
|
for (i = 0; i < dword_AA3A8; i++)
|
|
{
|
|
for (j = 0; j < dword_AA3AC; j++)
|
|
{
|
|
if (*ptr == 0)
|
|
*ptr = 255;
|
|
ptr++;
|
|
}
|
|
}
|
|
dword_AA3A4 = 1;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void sub_54FA4(int a1, int a2)
|
|
{
|
|
int i, j;
|
|
char *ptr1, *ptr2;
|
|
if (videoGetRenderMode() >= REND_POLYMOST)
|
|
return;
|
|
#if 0
|
|
if (!dword_AA3A4)
|
|
ghrender_preparescope();
|
|
ptr1 = (char*)waloff[7050];
|
|
if (!ptr1)
|
|
return;
|
|
videoBeginDrawing();
|
|
ptr2 = (char*)frameplace;
|
|
if (!ptr2)
|
|
return;
|
|
for (i = 0; i < dword_AA3A8; i++)
|
|
{
|
|
for (j = 0; j < dword_AA3AC; j++)
|
|
{
|
|
if (*ptr1 != 255)
|
|
{
|
|
*ptr1 = ptr2[i*bytesperline+dword_AA3B0+j];
|
|
}
|
|
ptr1++;
|
|
}
|
|
}
|
|
videoEndDrawing();
|
|
rotatesprite(a1<<16, a2<<16, 57344, 512, 7050, 0, 0, 4+2, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
|
|
rotatesprite(a1<<16, a2<<16, 57344, 512, 7050, -8, 0, 4+2+1, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
|
|
rotatesprite(a1<<16, a2<<16, 32768, 0, 7063, -24, 0, 32+2+1, windowxy1.x, windowxy1.y, windowxy2.x, windowxy2.y);
|
|
#endif
|
|
}
|
|
|
|
typedef struct _struct2B8280 {
|
|
short f_0;
|
|
char f_2;
|
|
} struct2B8280;
|
|
|
|
struct2B8280 f2B8280[MAXSPRITES];
|
|
|
|
void sub_550F0(void)
|
|
{
|
|
int i, sect;
|
|
dword_AA3A0 = 0;
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
f2B8280[i].f_0 = -1;
|
|
sect = sprite[i].sectnum;
|
|
if (sect >= 0 && sect < numsectors)
|
|
{
|
|
if (sprite[i].cstat & 2)
|
|
{
|
|
if (sector[sect].floorstat & 1)
|
|
{
|
|
f2B8280[dword_AA3A0].f_2 = sprite[i].xrepeat;
|
|
f2B8280[dword_AA3A0].f_0 = i;
|
|
dword_AA3A0++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
dword_AA39C = 0;
|
|
}
|
|
|
|
void ghrender_movewatersprites(void)
|
|
{
|
|
int i, spr;
|
|
if (!sub_57AA0(2))
|
|
return;
|
|
for (i = 0; i < dword_AA3A0; i++)
|
|
{
|
|
spr = f2B8280[i].f_0;
|
|
if (spr < 0 || spr >= MAXSPRITES)
|
|
{
|
|
initprintf("ghrender_movewatersprites: bad watersprite sprnum\n");
|
|
continue;
|
|
}
|
|
if (dword_AA39C < 0 || dword_AA39C >= 6)
|
|
{
|
|
initprintf("ghrender_movewatersprites: currepeat out of range\n");
|
|
continue;
|
|
}
|
|
sprite[spr].xrepeat = f2B8280[i].f_2 + byte_AA394[dword_AA39C];
|
|
}
|
|
dword_AA39C++;
|
|
if (dword_AA39C >= 6)
|
|
dword_AA39C = 0;
|
|
}
|
|
|
|
typedef struct _structAA3D0 {
|
|
unsigned int f_0;
|
|
int f_4;
|
|
int f_8;
|
|
int f_c;
|
|
int f_10;
|
|
} structAA3D0;
|
|
|
|
void sub_55244(void)
|
|
{
|
|
}
|
|
|
|
void sub_5524C(void)
|
|
{
|
|
}
|
|
|
|
void sub_55184(void)
|
|
{
|
|
sub_550F0();
|
|
}
|
|
|
|
structAA3D0 fAA3D0[15] = {
|
|
1, 2860, 136, 152, 0,
|
|
10, 2861, 136, 142, 2,
|
|
10, 2862, 136, 142, 5,
|
|
10, 2862, 136, 142, 4,
|
|
10, 2861, 136, 142, 0,
|
|
4, 2863, 144, 162, 5,
|
|
16, 2864, 204, 160, 5,
|
|
22, 2865, 136, 142, 8,
|
|
22, 2869, 136, 142, 9,
|
|
22, 2868, 136, 142, 10,
|
|
18, 2865, 136, 142, 5,
|
|
22, 2865, 136, 142, 12,
|
|
22, 2866, 136, 142, 13,
|
|
22, 2867, 136, 142, 14,
|
|
18, 2865, 136, 142, 5
|
|
};
|
|
|
|
int ghshtgn_setmode(int a1)
|
|
{
|
|
if (a1 < 0 || a1 >= 15)
|
|
return -1;
|
|
if (dword_AA3BC != a1)
|
|
{
|
|
if ((int)totalclock - dword_AA3C4 > fAA3D0[dword_AA3BC].f_0)
|
|
{
|
|
switch (dword_AA3BC)
|
|
{
|
|
case 7:
|
|
case 11:
|
|
A_PlaySound(3, g_player[myconnectindex].ps->i);
|
|
break;
|
|
case 10:
|
|
case 14:
|
|
dword_AA3C0 = 1;
|
|
break;
|
|
case 6:
|
|
dword_AA3C0 = 0;
|
|
break;
|
|
}
|
|
dword_AA3C4 = (int)totalclock;
|
|
dword_AA3BC = a1;
|
|
}
|
|
}
|
|
return dword_AA3BC;
|
|
}
|
|
|
|
int dword_2BB290[MAXSECTORS];
|
|
|
|
int dword_AA3C8, dword_AA3CC;
|
|
|
|
int hitscan_old(int xs, int ys, int zs, int16_t sectnum, int xv, int yv, int zv, int16_t *hitsect, int16_t *hitwall, int16_t *hitsprite,
|
|
int *xh, int *yh, int *zh, int cm)
|
|
{
|
|
vec3_t s = { xs, ys, zs };
|
|
hitdata_t h = { *xh, *yh, *zh, *hitsprite, *hitwall, *hitsect };
|
|
int ret = hitscan(&s, sectnum, xv, yv, zv, &h, cm);
|
|
*xh = h.pos.x;
|
|
*yh = h.pos.y;
|
|
*zh = h.pos.z;
|
|
*hitsprite = h.sprite;
|
|
*hitwall = h.wall;
|
|
*hitsect = h.sect;
|
|
return ret;
|
|
}
|
|
|
|
void ghshtgn_fire(short snum)
|
|
{
|
|
DukePlayer_t *p;
|
|
short v20 = 0;
|
|
short v1c = 0;
|
|
short v18 = 0;
|
|
int v44 = 0;
|
|
int v48 = 0;
|
|
int v4c = 0;
|
|
int v34, v28, v40, v2c, v24, v38, vdx, vax, vbx, vdi, v3c, v30, i;
|
|
short sect;
|
|
if (!dword_AA3C0 && dword_AA3BC == 5)
|
|
sub_5A250(0x10);
|
|
|
|
if (dword_AA3BC == 5 && dword_AA3C0 && ghshtgn_setmode(6) == 6)
|
|
{
|
|
p = g_player[snum].ps;
|
|
A_PlaySound(4, p->i);
|
|
v34 = 9;
|
|
while (v34 > 0)
|
|
{
|
|
v28 = p->pos.x;
|
|
v40 = p->pos.y;
|
|
v2c = p->pos.z + p->pyoff;
|
|
if (dword_AA3C8 == 7)
|
|
{
|
|
vax = 2;
|
|
vbx = 4;
|
|
v24 = 8;
|
|
vdx = 2048;
|
|
v38 = 4096;
|
|
}
|
|
else
|
|
{
|
|
vax = 2;
|
|
vbx = 2;
|
|
v24 = 4;
|
|
vdx = 512;
|
|
v38 = 1024;
|
|
}
|
|
vdi = (100 - fix16_to_int(p->q16horiz)) * 2048;
|
|
switch (v34)
|
|
{
|
|
default:
|
|
return;
|
|
case 9:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax - vbx + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax - vbx) & 2047];
|
|
vdi += vdx;
|
|
break;
|
|
case 8:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + vbx + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax + vbx) & 2047];
|
|
vdi += vdx;
|
|
break;
|
|
case 7:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax - vbx + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax - vbx) & 2047];
|
|
vdi -= vdx;
|
|
break;
|
|
case 6:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + vbx + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax + vbx) & 2047];
|
|
vdi -= vdx;
|
|
break;
|
|
case 5:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax) & 2047];
|
|
vdi -= v38;
|
|
break;
|
|
case 4:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax) & 2047];
|
|
vdi += v38;
|
|
break;
|
|
case 3:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax - v24 + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax - v24) & 2047];
|
|
break;
|
|
case 2:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + v24 + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax + v24) & 2047];
|
|
break;
|
|
case 1:
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + vax + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang) + vax) & 2047];
|
|
break;
|
|
}
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
dword_2BB290[i] = sector[i].ceilingz;
|
|
sector[i].ceilingz = -0x64000;
|
|
}
|
|
hitscan_old(v28, v40, v2c, p->cursectnum, v3c, v30, vdi, &v20, &v18, &v1c, &v44, &v48, &v4c, CLIPMASK1);
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
sector[i].ceilingz = dword_2BB290[i];
|
|
}
|
|
v34--;
|
|
if (v20 < 0)
|
|
{
|
|
initprintf("WARNING: ghshtgn_fire hitsect < 0\n");
|
|
return;
|
|
}
|
|
sub_51678(v18, v1c, v20, v44, v48, v4c);
|
|
if (v1c >= 0)
|
|
{
|
|
if (sprite[v1c].cstat == (short)32768)
|
|
{
|
|
initprintf("ERROR: hit spr with cstat 32768\n");
|
|
return;
|
|
}
|
|
sect = sprite[v1c].sectnum;
|
|
if (sector[sect].hitag == 2000)
|
|
{
|
|
initprintf("ERROR: hit spr in REST_AREA sector\n");
|
|
return;
|
|
}
|
|
ghtrophy_addkill(v1c);
|
|
ghtarget_hit(v1c, dword_AA3C8);
|
|
}
|
|
else
|
|
sub_5A250(4);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_558D0(void)
|
|
{
|
|
if (!dword_AA3BC)
|
|
ghshtgn_setmode(1);
|
|
else
|
|
ghshtgn_setmode(3);
|
|
}
|
|
|
|
void sub_558F4(void)
|
|
{
|
|
dword_AA3CC = 1;
|
|
ghshtgn_setmode(0);
|
|
dword_AA3C8 = 6;
|
|
dword_AA3C0 = 0;
|
|
}
|
|
|
|
int sub_55928(void)
|
|
{
|
|
return dword_AA3C8;
|
|
}
|
|
|
|
void sub_55934(void)
|
|
{
|
|
if (dword_AA3BC == 0 || dword_AA3BC == 5)
|
|
{
|
|
sub_5A250(0x4000);
|
|
dword_AA3C0 = 0;
|
|
sub_55988();
|
|
dword_AA3C8 = 6 + (dword_AA3C8 == 6);
|
|
}
|
|
}
|
|
|
|
void sub_55988(void)
|
|
{
|
|
int pframe;
|
|
if (dword_AA3BC == 0 || dword_AA3BC == 5)
|
|
{
|
|
pframe = dword_AA3BC;
|
|
if (dword_AA3CC)
|
|
{
|
|
if (ghshtgn_setmode(7) == 7)
|
|
fAA3D0[10].f_10 = pframe;
|
|
dword_AA3CC = 0;
|
|
}
|
|
else
|
|
{
|
|
if (ghshtgn_setmode(11) == 11)
|
|
fAA3D0[14].f_10 = pframe;
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned int dword_AA53C;
|
|
int dword_AA540;
|
|
|
|
int dword_AA4FC[] = {
|
|
0, -1, -2, -3, -4, -3, -2, -1
|
|
};
|
|
|
|
int dword_AA51C[] = {
|
|
0, -1, -2, -2, -1, -2, -2, -1
|
|
};
|
|
|
|
void ghshtgn_render(short snum)
|
|
{
|
|
int vdx;
|
|
if (dword_AA3BC < 0 || dword_AA3BC >= 15)
|
|
{
|
|
initprintf("ERROR: ghshtgn_draw bad index\n");
|
|
return;
|
|
}
|
|
if (snum < 0 || snum >= numplayers)
|
|
{
|
|
initprintf("ERROR: ghshtgn_render bad index\n");
|
|
return;
|
|
}
|
|
DukePlayer_t* p = g_player[snum].ps;
|
|
if (p->dhat613 || p->dhat617)
|
|
{
|
|
vdx = 10;
|
|
if (p->dhat617)
|
|
vdx = 5;
|
|
if ((int)totalclock - dword_AA53C > vdx)
|
|
{
|
|
dword_AA540++;
|
|
if (dword_AA540 >= 8)
|
|
dword_AA540 = 0;
|
|
dword_AA53C = (int)totalclock;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dword_AA540)
|
|
dword_AA540++;
|
|
if (dword_AA540 >= 8)
|
|
dword_AA540 = 0;
|
|
}
|
|
if (dword_AA540 >= 8)
|
|
{
|
|
initprintf("ERROR: ghshtgn_render bobcnt out of bounds\n");
|
|
return;
|
|
}
|
|
sub_54D90();
|
|
rotatesprite_win((fAA3D0[dword_AA3BC].f_8+dword_AA4FC[dword_AA540])<<16,
|
|
(fAA3D0[dword_AA3BC].f_c+dword_AA51C[dword_AA540]+17)<<16, 40960,
|
|
0, fAA3D0[dword_AA3BC].f_4, 0, 0, 2);
|
|
if (dword_AA3BC == 5 && p->dhat617)
|
|
ghshtgn_setmode(3);
|
|
else
|
|
ghshtgn_setmode(fAA3D0[dword_AA3BC].f_10);
|
|
}
|
|
|
|
int dword_AA544, dword_AA548;
|
|
unsigned int dword_AA54C;
|
|
|
|
structAA3D0 fAA558[17] = {
|
|
1, 2816, 135, 152, 0,
|
|
10, 2822, 135, 132, 2,
|
|
10, 2817, 135, 132, 5,
|
|
10, 2817, 135, 132, 4,
|
|
10, 2822, 135, 132, 0,
|
|
4, 2818, 144, 130, 5,
|
|
16, 2819, 144, 130, 5,
|
|
28, 2817, 135, 132, 8,
|
|
28, 2823, 135, 132, 9,
|
|
28, 2824, 135, 132, 10,
|
|
28, 2823, 135, 132, 11,
|
|
28, 2817, 135, 132, 5,
|
|
28, 2817, 135, 132, 13,
|
|
28, 2820, 135, 132, 14,
|
|
28, 2821, 135, 132, 15,
|
|
28, 2823, 135, 132, 16,
|
|
28, 2817, 135, 132, 5
|
|
};
|
|
|
|
structAA3D0 fAA6AC[17] = {
|
|
1, 2830, 135, 152, 0,
|
|
10, 2831, 135, 132, 2,
|
|
10, 2832, 135, 132, 5,
|
|
10, 2832, 135, 132, 4,
|
|
10, 2831, 135, 132, 0,
|
|
4, 2833, 146, 136, 5,
|
|
16, 2834, 146, 136, 5,
|
|
28, 2832, 135, 132, 8,
|
|
28, 2837, 135, 132, 9,
|
|
28, 2838, 135, 132, 10,
|
|
28, 2837, 135, 132, 11,
|
|
28, 2832, 135, 132, 5,
|
|
28, 2832, 135, 132, 13,
|
|
28, 2836, 135, 132, 14,
|
|
28, 2835, 135, 132, 15,
|
|
28, 2837, 135, 132, 16,
|
|
28, 2832, 135, 132, 5
|
|
};
|
|
|
|
int ghrifle_setmode(int a1)
|
|
{
|
|
if (a1 < 0 || a1 >= 17)
|
|
return -1;
|
|
if (dword_AA544 != a1)
|
|
{
|
|
if ((int)totalclock - dword_AA54C > fAA558[dword_AA544].f_0)
|
|
{
|
|
switch (dword_AA544)
|
|
{
|
|
case 7:
|
|
case 12:
|
|
A_PlaySound(5, g_player[myconnectindex].ps->i);
|
|
break;
|
|
case 11:
|
|
case 16:
|
|
dword_AA548 = 1;
|
|
break;
|
|
case 6:
|
|
dword_AA548 = 0;
|
|
break;
|
|
}
|
|
dword_AA54C = (int)totalclock;
|
|
dword_AA544 = a1;
|
|
}
|
|
}
|
|
return dword_AA544;
|
|
}
|
|
|
|
int dword_2BC2A0[MAXSECTORS];
|
|
int dword_AA550, dword_AA554;
|
|
|
|
void ghrifle_fire(short snum)
|
|
{
|
|
DukePlayer_t *p;
|
|
short v20 = 0;
|
|
short v1c = 0;
|
|
short v18 = 0;
|
|
int v44 = 0;
|
|
int v48 = 0;
|
|
int v4c = 0;
|
|
int v28, v40, v2c, vdi, v3c, v30, i;
|
|
short sect;
|
|
if (!dword_AA548 && dword_AA544 == 5)
|
|
sub_5A250(0x10);
|
|
|
|
if (dword_AA548 && dword_AA544 == 5 && ghrifle_setmode(6) == 6)
|
|
{
|
|
p = g_player[snum].ps;
|
|
A_PlaySound(6, p->i);
|
|
v28 = p->pos.x;
|
|
v40 = p->pos.y;
|
|
v2c = p->pos.z + p->pyoff;
|
|
v3c = sintable[(fix16_to_int(p->q16ang) + 512) & 2047];
|
|
v30 = sintable[(fix16_to_int(p->q16ang)) & 2047];
|
|
vdi = (100 - fix16_to_int(p->q16horiz)) * 2048;
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
dword_2BC2A0[i] = sector[i].ceilingz;
|
|
sector[i].ceilingz = -0x64000;
|
|
}
|
|
hitscan_old(v28, v40, v2c, p->cursectnum, v3c, v30, vdi, &v20, &v18, &v1c, &v44, &v48, &v4c, CLIPMASK1);
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
sector[i].ceilingz = dword_2BC2A0[i];
|
|
}
|
|
if (v20 < 0)
|
|
{
|
|
initprintf("WARNING: ghrifle_fire hitsect < 0\n");
|
|
return;
|
|
}
|
|
sub_51678(v18, v1c, v20, v44, v48, v4c);
|
|
if (v1c >= 0)
|
|
{
|
|
if (sprite[v1c].cstat == (short)32768)
|
|
{
|
|
initprintf("ERROR: hit spr with cstat 32768\n");
|
|
return;
|
|
}
|
|
sect = sprite[v1c].sectnum;
|
|
if (sector[sect].hitag == 2000)
|
|
{
|
|
initprintf("ERROR: hit spr in REST_AREA sector\n");
|
|
return;
|
|
}
|
|
ghtrophy_addkill(v1c);
|
|
ghtarget_hit(v1c, dword_AA550);
|
|
}
|
|
else
|
|
sub_5A250(4);
|
|
}
|
|
}
|
|
|
|
void sub_55F68(void)
|
|
{
|
|
if (dword_AA544 == 0)
|
|
ghrifle_setmode(1);
|
|
else
|
|
ghrifle_setmode(3);
|
|
}
|
|
|
|
void sub_55F8C(void)
|
|
{
|
|
dword_AA554 = 1;
|
|
ghrifle_setmode(0);
|
|
dword_AA550 = 4;
|
|
dword_AA548 = 0;
|
|
}
|
|
|
|
int sub_55FC0(void)
|
|
{
|
|
return dword_AA550;
|
|
}
|
|
|
|
void sub_55FCC(void)
|
|
{
|
|
if (dword_AA544 == 0 || dword_AA544 == 5)
|
|
{
|
|
sub_5A250(0x4000);
|
|
dword_AA548 = 0;
|
|
sub_56020();
|
|
dword_AA550 = 4 + (dword_AA550 == 4);
|
|
}
|
|
}
|
|
|
|
void sub_56020(void)
|
|
{
|
|
int pframe;
|
|
if (dword_AA544 == 0 || dword_AA544 == 5)
|
|
{
|
|
pframe = dword_AA544;
|
|
if (dword_AA554)
|
|
{
|
|
if (ghrifle_setmode(7) == 7)
|
|
fAA558[11].f_10 = pframe;
|
|
dword_AA554 = 0;
|
|
}
|
|
else
|
|
{
|
|
if (ghrifle_setmode(12) == 12)
|
|
fAA558[16].f_10 = pframe;
|
|
}
|
|
}
|
|
}
|
|
|
|
unsigned int dword_AA840;
|
|
int dword_AA844;
|
|
|
|
int dword_AA800[] = {
|
|
0, -1, -2, -3, -4, -3, -2, -1
|
|
};
|
|
|
|
int dword_AA820[] = {
|
|
0, -1, -2, -2, -1, -2, -2, -1
|
|
};
|
|
|
|
void ghrifle_render(short snum, int a2)
|
|
{
|
|
int vdx, tile, x, y;
|
|
if (dword_AA544 < 0 || dword_AA544 >= 17)
|
|
{
|
|
initprintf("ERROR: ghrifle_draw bad index\n");
|
|
return;
|
|
}
|
|
if (snum < 0 || snum >= numplayers)
|
|
{
|
|
initprintf("ERROR: ghrifle_render bad index\n");
|
|
return;
|
|
}
|
|
DukePlayer_t* p = g_player[snum].ps;
|
|
if (p->dhat613 || p->dhat617)
|
|
{
|
|
vdx = 10;
|
|
if (p->dhat617)
|
|
vdx = 5;
|
|
if ((int)totalclock - dword_AA840 > vdx)
|
|
{
|
|
dword_AA844++;
|
|
if (dword_AA844 >= 8)
|
|
dword_AA844 = 0;
|
|
dword_AA840 = (int)totalclock;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dword_AA844)
|
|
dword_AA844++;
|
|
if (dword_AA844 >= 8)
|
|
dword_AA844 = 0;
|
|
}
|
|
if (dword_AA844 >= 8)
|
|
{
|
|
initprintf("ERROR: ghrifle_render bobcnt out of bounds\n");
|
|
return;
|
|
}
|
|
|
|
if (a2 == 1)
|
|
{
|
|
x = fAA558[dword_AA544].f_8 + dword_AA800[dword_AA844];
|
|
y = fAA558[dword_AA544].f_c + dword_AA820[dword_AA844] + 17;
|
|
tile = fAA558[dword_AA544].f_4;
|
|
}
|
|
else
|
|
{
|
|
x = fAA6AC[dword_AA544].f_8 + dword_AA800[dword_AA844];
|
|
y = fAA6AC[dword_AA544].f_c + dword_AA820[dword_AA844] + 17;
|
|
tile = fAA6AC[dword_AA544].f_4;
|
|
}
|
|
|
|
if (dword_AA544 == 5 && a2 == 1)
|
|
sub_54FA4(160+dword_AA800[dword_AA844], 100+dword_AA820[dword_AA844]);
|
|
else
|
|
sub_54D90();
|
|
|
|
rotatesprite_win(x<<16, y<<16, 32768, 0, tile, 0, 0, 2);
|
|
|
|
if (a2 == 1 && dword_AA544 == 5 && (p->dhat613 || p->dhat617))
|
|
{
|
|
ghrifle_setmode(3);
|
|
}
|
|
else
|
|
{
|
|
if (dword_AA544 == 5 && p->dhat617)
|
|
ghrifle_setmode(3);
|
|
else
|
|
ghrifle_setmode(fAA558[dword_AA544].f_10);
|
|
}
|
|
}
|
|
|
|
int dword_AA848;
|
|
int dword_AA84C;
|
|
unsigned int dword_AA850;
|
|
int dword_AA854;
|
|
|
|
structAA3D0 fAA858[15] = {
|
|
1, 3328, 198, 152, 0,
|
|
4, 3329, 198, 132, 2,
|
|
4, 3330, 198, 132, 3,
|
|
4, 3331, 198, 136, 4,
|
|
4, 3332, 198, 136, 5,
|
|
4, 3333, 198, 132, 6,
|
|
4, 3334, 198, 132, 7,
|
|
4, 3333, 198, 132, 8,
|
|
4, 3332, 198, 132, 9,
|
|
4, 3331, 198, 132, 0,
|
|
12, 3336, 198, 132, 11,
|
|
12, 3337, 198, 132, 12,
|
|
12, 3338, 198, 132, 13,
|
|
12, 3337, 198, 132, 14,
|
|
12, 3336, 198, 132, 0
|
|
};
|
|
|
|
int dword_AA984[] = {
|
|
0, -1, -2, -3, -4, -3, -2, -1
|
|
};
|
|
int dword_AA9A4[] = {
|
|
0, -1, -2, -2, -1, -2, -2, -1
|
|
};
|
|
|
|
int ghpistol_setmode(int a1)
|
|
{
|
|
if (a1 < 0 || a1 >= 15)
|
|
return 0;
|
|
if (a1 != dword_AA848)
|
|
{
|
|
if ((int)totalclock - dword_AA850 > fAA858[dword_AA848].f_0)
|
|
{
|
|
switch (dword_AA848)
|
|
{
|
|
case 10:
|
|
A_PlaySound(1, g_player[myconnectindex].ps->i);
|
|
break;
|
|
case 14:
|
|
dword_AA84C = 6;
|
|
break;
|
|
case 2:
|
|
if (!dword_AA84C)
|
|
{
|
|
initprintf("ghpistol_setmode: pistolloaded at 0\n");
|
|
}
|
|
else
|
|
dword_AA84C--;
|
|
break;
|
|
}
|
|
dword_AA850 = (int)totalclock;
|
|
dword_AA848 = a1;
|
|
}
|
|
|
|
}
|
|
return dword_AA848;
|
|
}
|
|
|
|
int dword_2BD2B0[MAXSECTORS];
|
|
|
|
void ghpistol_fire(short snum)
|
|
{
|
|
DukePlayer_t *p;
|
|
short v18 = 0;
|
|
short v1c = 0;
|
|
short v20 = 0;
|
|
int v38 = 0;
|
|
int v3c = 0;
|
|
int v40 = 0;
|
|
int v30, v34, v2c, vdx, vbx, v28, v24, vsi, i;
|
|
if (dword_AA84C == 0 && dword_AA848 == 0)
|
|
sub_5A250(16);
|
|
if (dword_AA84C && dword_AA848 == 0 && ghpistol_setmode(1) == 1)
|
|
{
|
|
p = g_player[snum].ps;
|
|
A_PlaySound(2, p->i);
|
|
v30 = p->pos.x;
|
|
v34 = p->pos.y;
|
|
v2c = p->pos.z + p->pyoff;
|
|
if (dword_AA854 == 3)
|
|
{
|
|
vdx = 4 - (rrdh_random() & 7);
|
|
vbx = 2047 - (rrdh_random() & 2047);
|
|
}
|
|
else
|
|
{
|
|
vdx = 8 - (rrdh_random() & 15);
|
|
vbx = 2048 - (rrdh_random() & 2048);
|
|
}
|
|
vdx += 2;
|
|
v24 = sintable[(fix16_to_int(p->q16ang) + vdx + 512) & 2047];
|
|
v28 = sintable[(fix16_to_int(p->q16ang) + vdx) & 2047];
|
|
vsi = ((100 - fix16_to_int(p->q16horiz)) << 11) + vbx;
|
|
|
|
for (i = 0; i < MAXSECTORS; i++)
|
|
{
|
|
dword_2BD2B0[i] = sector[i].ceilingz;
|
|
sector[i].ceilingz = -0x64000;
|
|
}
|
|
hitscan_old(v30, v34, v2c, p->cursectnum, v24, v28, vsi, &v18, &v20, &v1c, &v38, &v3c, &v40, CLIPMASK1);
|
|
for (i = 0; i < MAXSECTORS; i++)
|
|
{
|
|
sector[i].ceilingz = dword_2BD2B0[i];
|
|
}
|
|
if (v18 < 0)
|
|
{
|
|
initprintf("WARNING: ghpistol_fire hitsect < 0\n");
|
|
return;
|
|
}
|
|
sub_51678(v28, v1c, v18, v38, v3c, v40);
|
|
if (v1c >= 0)
|
|
{
|
|
if (sprite[v1c].cstat == (short)32768)
|
|
{
|
|
initprintf("ERROR: hit spr with cstat 32768\n");
|
|
return;
|
|
}
|
|
if (sector[sprite[v1c].sectnum].hitag == 2000)
|
|
{
|
|
initprintf("ERROR: hit spr in REST_AREA sector\n");
|
|
return;
|
|
}
|
|
ghtrophy_addkill(v1c);
|
|
ghtarget_hit(v1c, dword_AA854);
|
|
}
|
|
else
|
|
sub_5A250(4);
|
|
}
|
|
|
|
}
|
|
|
|
void sub_566E8(void)
|
|
{
|
|
}
|
|
|
|
void sub_566F0(void)
|
|
{
|
|
ghpistol_setmode(0);
|
|
dword_AA854 = 2;
|
|
dword_AA84C = 0;
|
|
}
|
|
|
|
int sub_56718(void)
|
|
{
|
|
return dword_AA854;
|
|
}
|
|
|
|
void sub_56724(void)
|
|
{
|
|
if (dword_AA848 == 0)
|
|
{
|
|
sub_5A250(0x4000);
|
|
dword_AA84C = 0;
|
|
if (dword_AA848 == 0)
|
|
ghpistol_setmode(10);
|
|
dword_AA854 = 2 + (dword_AA854 == 2);
|
|
}
|
|
}
|
|
|
|
void sub_56780(void)
|
|
{
|
|
if (dword_AA848 == 0 && dword_AA84C != 6)
|
|
ghpistol_setmode(10);
|
|
}
|
|
|
|
unsigned int dword_AA9C4;
|
|
|
|
int dword_AA9C8;
|
|
|
|
void ghpistol_render(short snum)
|
|
{
|
|
int vdx;
|
|
if (dword_AA848 < 0 || dword_AA848 >= 15)
|
|
{
|
|
initprintf("ERROR: ghpistol_draw bad index\n");
|
|
return;
|
|
}
|
|
if (snum < 0 || snum >= numplayers)
|
|
{
|
|
initprintf("ERROR: ghpistol_render bad index\n");
|
|
return;
|
|
}
|
|
DukePlayer_t *p = g_player[snum].ps;
|
|
if (p->dhat613 || p->dhat617)
|
|
{
|
|
vdx = 10;
|
|
if (p->dhat617)
|
|
vdx = 5;
|
|
|
|
if ((int)totalclock - dword_AA9C4 > vdx)
|
|
{
|
|
dword_AA9C8++;
|
|
if (dword_AA9C8 >= 8)
|
|
dword_AA9C8 = 0;
|
|
dword_AA9C4 = (int)totalclock;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dword_AA9C8)
|
|
dword_AA9C8++;
|
|
if (dword_AA9C8 >= 8)
|
|
dword_AA9C8 = 0;
|
|
}
|
|
if (dword_AA9C8 >= 8)
|
|
{
|
|
initprintf("ERROR: ghpistol_render bobcnt out of bounds\n");
|
|
return;
|
|
}
|
|
sub_54D90();
|
|
rotatesprite_win((fAA858[dword_AA848].f_8+dword_AA984[dword_AA9C8])<<16,
|
|
(fAA858[dword_AA848].f_c+dword_AA9A4[dword_AA9C8]+17)<<16, 40960,
|
|
0, fAA858[dword_AA848].f_4, 0, 0, 2);
|
|
ghpistol_setmode(fAA858[dword_AA848].f_10);
|
|
}
|
|
|
|
int dword_AA9CC;
|
|
unsigned int dword_AA9D4;
|
|
|
|
structAA3D0 fAA9DC[7] = {
|
|
1, 3454, 216, 158, 0,
|
|
4, 3452, 216, 162, 1,
|
|
4, 3453, 216, 158, 3,
|
|
12, 3455, 216, 158, 0,
|
|
12, 3456, 216, 132, 5,
|
|
12, 3457, 216, 132, 6,
|
|
12, 3458, 216, 132, 1
|
|
};
|
|
|
|
int dword_AAA68[] = {
|
|
0, -1, -2, -3, -4, -3, -2, -1
|
|
};
|
|
|
|
int dword_AAA88[] = {
|
|
0, -1, -2, -2, -1, -2, -2, -1
|
|
};
|
|
|
|
int dword_AA9D0;
|
|
|
|
int ghbow_setmode(int a1)
|
|
{
|
|
if (a1 < 0 || a1 >= 7)
|
|
{
|
|
initprintf("ERROR: ghbow_setmode %i\n", a1);
|
|
return 0;
|
|
}
|
|
if (dword_AA9CC != a1)
|
|
{
|
|
if ((int)totalclock - dword_AA9D4 > fAA9DC[dword_AA9CC].f_0)
|
|
{
|
|
switch (dword_AA9CC)
|
|
{
|
|
case 4:
|
|
A_PlaySound(7, g_player[myconnectindex].ps->i);
|
|
break;
|
|
case 6:
|
|
dword_AA9D0 = 1;
|
|
break;
|
|
case 2:
|
|
dword_AA9D0 = 0;
|
|
break;
|
|
}
|
|
dword_AA9D4 = (int)totalclock;
|
|
dword_AA9CC = a1;
|
|
}
|
|
}
|
|
return dword_AA9CC;
|
|
}
|
|
|
|
void ghbow_fire(short snum)
|
|
{
|
|
struct player_struct *p;
|
|
if (!dword_AA9D0)
|
|
{
|
|
if (dword_AA9CC == 1 || dword_AA9CC == 0)
|
|
sub_5A250(0x10);
|
|
}
|
|
if (dword_AA9D0 && dword_AA9CC == 1 && ghbow_setmode(2) == 2)
|
|
{
|
|
A_PlaySound(8, g_player[myconnectindex].ps->i);
|
|
gharrow_spawnarrow(snum);
|
|
}
|
|
}
|
|
|
|
void sub_56AB0(void)
|
|
{
|
|
}
|
|
|
|
int dword_AA9D8;
|
|
|
|
void sub_56AB8(void)
|
|
{
|
|
ghbow_setmode(0);
|
|
dword_AA9D8 = 0;
|
|
dword_AA9D0 = 0;
|
|
}
|
|
|
|
int sub_56AD8(void)
|
|
{
|
|
return dword_AA9D8;
|
|
}
|
|
|
|
void sub_56AE4(void)
|
|
{
|
|
if (dword_AA9CC == 0)
|
|
{
|
|
sub_5A250(0x4000);
|
|
dword_AA9D0 = 0;
|
|
if (dword_AA9CC == 0)
|
|
ghbow_setmode(4);
|
|
dword_AA9D8 = (dword_AA9D8 == 0);
|
|
}
|
|
}
|
|
|
|
void sub_56B3C(void)
|
|
{
|
|
if (dword_AA9CC == 0 && dword_AA9D0 != 1)
|
|
ghbow_setmode(4);
|
|
}
|
|
|
|
unsigned int dword_AAAA8;
|
|
int dword_AAAAC;
|
|
|
|
void ghbow_render(short snum)
|
|
{
|
|
int vdx;
|
|
if (dword_AA9CC < 0 || dword_AA9CC >= 7)
|
|
{
|
|
initprintf("ERROR: ghbow_draw bad index\n");
|
|
return;
|
|
}
|
|
if (snum < 0 || snum >= numplayers)
|
|
{
|
|
initprintf("ERROR: ghbow_render bad index\n");
|
|
return;
|
|
}
|
|
DukePlayer_t *p = g_player[snum].ps;
|
|
if (p->dhat613 || p->dhat617)
|
|
{
|
|
vdx = 10;
|
|
if (p->dhat617)
|
|
vdx = 5;
|
|
|
|
if ((int)totalclock - dword_AAAA8 > vdx)
|
|
{
|
|
dword_AAAAC++;
|
|
if (dword_AAAAC >= 8)
|
|
dword_AAAAC = 0;
|
|
dword_AAAA8 = (int)totalclock;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (dword_AAAAC)
|
|
dword_AAAAC++;
|
|
if (dword_AAAAC >= 8)
|
|
dword_AAAAC = 0;
|
|
}
|
|
if (dword_AAAAC >= 8)
|
|
{
|
|
initprintf("ERROR: ghbow_render bobcnt out of bounds\n");
|
|
return;
|
|
}
|
|
sub_54D90();
|
|
rotatesprite_win((fAA9DC[dword_AA9CC].f_8+dword_AAA68[dword_AAAAC])<<16,
|
|
(fAA9DC[dword_AA9CC].f_c+dword_AAA88[dword_AAAAC]+17)<<16, 40960,
|
|
0, fAA9DC[dword_AA9CC].f_4, 0, 0, 2);
|
|
ghbow_setmode(fAA9DC[dword_AA9CC].f_10);
|
|
}
|
|
|
|
int sub_56CF0(int a1)
|
|
{
|
|
if (a1 < 0 || a1 >= numsectors)
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
void ghprecip_snowfall(void)
|
|
{
|
|
DukePlayer_t *p;
|
|
int i, nexti, j;
|
|
spritetype *s;
|
|
short sect, v18;
|
|
int vdi, vsi, v28;
|
|
p = g_player[screenpeek].ps;
|
|
|
|
i = headspritestat[801];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
s = &sprite[i];
|
|
s->z += 0x300;
|
|
sect = s->sectnum;
|
|
if (sect < 0 || sect >= numsectors)
|
|
{
|
|
initprintf("ghprecip_snowfall: bad sectnum\n");
|
|
goto BOLT;
|
|
}
|
|
if (s->z > sector[sect].floorz)
|
|
{
|
|
vdi = p->pos.x + (rrdh_random() & 0x3fff) - 0x2000;
|
|
vsi = p->pos.y + (rrdh_random() & 0x3fff) - 0x2000;
|
|
v28 = -0x19000;
|
|
v18 = -1;
|
|
for (j = 0; j < numsectors; j++)
|
|
{
|
|
if (inside(vdi, vsi, j))
|
|
{
|
|
if (sub_56CF0(j))
|
|
{
|
|
v18 = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (v18 >= 0 && v18 < numsectors)
|
|
{
|
|
s->x = vdi;
|
|
s->y = vsi;
|
|
s->z = v28;
|
|
changespritestat(i, v18);
|
|
if (v18 != s->sectnum)
|
|
{
|
|
initprintf("changespritesect failed\n");
|
|
}
|
|
}
|
|
}
|
|
BOLT:
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
void sub_56EA8(void)
|
|
{
|
|
ghprecip_snowfall();
|
|
}
|
|
|
|
|
|
void sub_56EC0(void)
|
|
{
|
|
short i;
|
|
i = headspritestat[802];
|
|
while (i >= 0)
|
|
{
|
|
sprite[i].extra++;
|
|
i = nextspritestat[i];
|
|
}
|
|
}
|
|
|
|
int dword_AAAB8 = 0x180;
|
|
int dword_AAAB0;
|
|
|
|
short ghtrax_getoldestdeertrax(void)
|
|
{
|
|
short i, nexti, vcx, vsi;
|
|
vcx = -1;
|
|
vsi = 0;
|
|
i = headspritestat[802];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
if (vcx < sprite[i].extra)
|
|
{
|
|
vcx = sprite[i].extra;
|
|
vsi = i;
|
|
}
|
|
if (sprite[i].extra > dword_AAAB8)
|
|
{
|
|
initprintf("ghtrax_getoldestdeertrax: oldest trax at %i\n", sprite[i].extra);
|
|
}
|
|
i = nexti;
|
|
}
|
|
return vsi;
|
|
}
|
|
|
|
void ghtrax_deertrax(short a1)
|
|
{
|
|
spritetype *s, *s2;
|
|
int v24 = 0;
|
|
int v28 = 0;
|
|
int v2c = 0;
|
|
int v30 = 0;
|
|
short v18, i, nexti;
|
|
s = &sprite[a1];
|
|
if (dword_AAAB8 > dword_AAAB0)
|
|
{
|
|
v18 = insertsprite(s->sectnum, 0);
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_deertrax: insertsprite failed\n");
|
|
dword_AAAB8 = dword_AAAB0;
|
|
initprintf(" set maxtraxdeer to %i\n", dword_AAAB8);
|
|
}
|
|
else
|
|
dword_AAAB0++;
|
|
}
|
|
else
|
|
{
|
|
v18 = ghtrax_getoldestdeertrax();
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_deertrax: invalid oldest trax sprite\n");
|
|
return;
|
|
}
|
|
}
|
|
sub_56EC0();
|
|
s2 = &sprite[v18];
|
|
getzrange_old(s->x, s->y, s->z, s->sectnum, &v24, &v28, &v2c, &v30, 128, CLIPMASK0);
|
|
if (v2c < sector[s->sectnum].floorz)
|
|
v2c = sector[s->sectnum].floorz - 8;
|
|
vec3_t pos = { s->x, s->y, v2c };
|
|
setsprite(a1, &pos);
|
|
changespritestat(a1, 802);
|
|
s2->cstat = 0x20;
|
|
s2->extra = 0;
|
|
s2->ang = s->ang;
|
|
s2->owner = a1;
|
|
s2->pal = 0;
|
|
s2->xoffset = 0;
|
|
s2->yoffset = 0;
|
|
s2->xvel = 0;
|
|
s2->yvel = 0;
|
|
s2->zvel = 0;
|
|
s2->shade = -28;
|
|
s2->xrepeat = 14;
|
|
s2->yrepeat = 18;
|
|
s2->clipdist = 32;
|
|
s2->picnum = 7080 + (ud.level_number != 3);
|
|
}
|
|
|
|
void sub_57140(void)
|
|
{
|
|
short i, nexti;
|
|
i = headspritestat[804];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
sprite[i].extra++;
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
int dword_AAAC4 = 0x100;
|
|
|
|
short ghtrax_getoldestboartrax(void)
|
|
{
|
|
short i, nexti, vcx, vsi;
|
|
vcx = -1;
|
|
vsi = 0;
|
|
i = headspritestat[804];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
if (vcx < sprite[i].extra)
|
|
{
|
|
vcx = sprite[i].extra;
|
|
vsi = i;
|
|
}
|
|
if (sprite[i].extra > dword_AAAC4)
|
|
{
|
|
initprintf("ghtrax_getoldestdeertrax: oldest trax at %i\n", sprite[i].extra);
|
|
}
|
|
i = nexti;
|
|
}
|
|
return vsi;
|
|
}
|
|
|
|
int dword_AAABC;
|
|
|
|
void ghtrax_boartrax(short a1)
|
|
{
|
|
spritetype* s, * s2;
|
|
int v24 = 0;
|
|
int v28 = 0;
|
|
int v2c = 0;
|
|
int v30 = 0;
|
|
short v18, i, nexti;
|
|
s = &sprite[a1];
|
|
if (dword_AAAC4 > dword_AAABC)
|
|
{
|
|
v18 = insertsprite(s->sectnum, 0);
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_boartrax: insertsprite failed\n");
|
|
dword_AAAC4 = dword_AAABC;
|
|
initprintf(" set maxtraxboar to\n", dword_AAAC4);
|
|
}
|
|
else
|
|
dword_AAABC++;
|
|
}
|
|
else
|
|
{
|
|
v18 = ghtrax_getoldestboartrax();
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_boartrax: invalid oldest trax sprite\n");
|
|
return;
|
|
}
|
|
}
|
|
sub_57140();
|
|
s2 = &sprite[v18];
|
|
getzrange_old(s->x, s->y, s->z, s->sectnum, &v24, &v28, &v2c, &v30, 128, CLIPMASK0);
|
|
if (v2c < sector[s->sectnum].floorz)
|
|
v2c = sector[s->sectnum].floorz - 8;
|
|
vec3_t pos = { s->x, s->y, v2c };
|
|
setsprite(a1, &pos);
|
|
changespritestat(a1, 804);
|
|
s2->cstat = 0x20;
|
|
s2->extra = 0;
|
|
s2->ang = s->ang;
|
|
s2->owner = a1;
|
|
s2->pal = 0;
|
|
s2->xoffset = 0;
|
|
s2->yoffset = 0;
|
|
s2->xvel = 0;
|
|
s2->yvel = 0;
|
|
s2->zvel = 0;
|
|
s2->shade = -28;
|
|
s2->xrepeat = 14;
|
|
s2->yrepeat = 18;
|
|
s2->clipdist = 32;
|
|
s2->picnum = 7084 + (ud.level_number != 3);
|
|
}
|
|
|
|
int dword_AAAB4, dword_AAAC0;
|
|
|
|
short word_AAAC8;
|
|
|
|
void sub_573C0(void)
|
|
{
|
|
int vdx = 0;
|
|
int i;
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
if (sprite[i].picnum)
|
|
vdx++;
|
|
|
|
vdx = MAXSPRITES - vdx;
|
|
if (vdx <= 640)
|
|
initprintf("not enuff sprites left for deer and boar trax\n");
|
|
dword_AAAB0 = 0;
|
|
dword_AAAB4 = 0;
|
|
dword_AAAB8 = 0x180;
|
|
dword_AAABC = 0;
|
|
dword_AAAC0 = 0;
|
|
dword_AAAC4 = 0x100;
|
|
word_AAAC8 = (rrdh_random() & 2047);
|
|
}
|
|
|
|
short sub_5743C(void)
|
|
{
|
|
return word_AAAC8;
|
|
}
|
|
|
|
int ghtrax_isplrupwind(short a1, short a2)
|
|
{
|
|
spritetype *s;
|
|
DukePlayer_t *p;
|
|
s = &sprite[a1];
|
|
p = g_player[a2].ps;
|
|
|
|
return klabs(word_AAAC8 - (getangle(s->x -p->pos.x, s->y - p->pos.y) & 2047)) < 256;
|
|
}
|
|
|
|
void ghtrax_leavetrax(short a1)
|
|
{
|
|
spritetype *s;
|
|
sectortype *sc;
|
|
short sect;
|
|
s = &sprite[a1];
|
|
sect = s->sectnum;
|
|
sc = §or[sect];
|
|
|
|
if (klabs(sector[sect].ceilingheinum - sector[sect].floorheinum) <= 576)
|
|
{
|
|
switch (DYNAMICTILEMAP(sprite[a1].picnum))
|
|
{
|
|
case VIXEN__STATICRR:
|
|
if (sector[sect].hitag == 0)
|
|
ghtrax_deertrax(a1);
|
|
break;
|
|
case PIG__STATICRR:
|
|
if (sector[sect].hitag == 0)
|
|
ghtrax_boartrax(a1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void ghtrax_deerdroppings(short a1)
|
|
{
|
|
spritetype* s, * s2;
|
|
int v24 = 0;
|
|
int v28 = 0;
|
|
int v2c = 0;
|
|
int v30 = 0;
|
|
short v18, i, nexti;
|
|
s = &sprite[a1];
|
|
if (dword_AAAB4 >= 24)
|
|
return;
|
|
v18 = insertsprite(s->sectnum, 0);
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_deerdroppings: insertsprite failed\n");
|
|
return;
|
|
}
|
|
s2 = &sprite[v18];
|
|
getzrange_old(s->x, s->y, s->z, s->sectnum, &v24, &v28, &v2c, &v30, 128, CLIPMASK0);
|
|
if (v2c < sector[s->sectnum].floorz)
|
|
v2c = sector[s->sectnum].floorz - 8;
|
|
vec3_t pos = { s->x, s->y, v2c };
|
|
setsprite(a1, &pos);
|
|
changespritestat(a1, 803);
|
|
s2->cstat = 0;
|
|
s2->ang = s->ang;
|
|
s2->owner = a1;
|
|
s2->pal = 0;
|
|
s2->xoffset = 0;
|
|
s2->yoffset = 0;
|
|
s2->xvel = 0;
|
|
s2->yvel = 0;
|
|
s2->zvel = 0;
|
|
s2->shade = 8;
|
|
s2->xrepeat = 8;
|
|
s2->yrepeat = 5;
|
|
s2->clipdist = 32;
|
|
s2->extra = 0;
|
|
s2->picnum = 981 + (ud.level_number != 3);
|
|
dword_AAAB4++;
|
|
}
|
|
|
|
void ghtrax_boardroppings(short a1)
|
|
{
|
|
spritetype* s, * s2;
|
|
int v24 = 0;
|
|
int v28 = 0;
|
|
int v2c = 0;
|
|
int v30 = 0;
|
|
short v18, i, nexti;
|
|
s = &sprite[a1];
|
|
if (dword_AAAC0 >= 24)
|
|
return;
|
|
v18 = insertsprite(s->sectnum, 0);
|
|
if (v18 < 0 || v18 >= MAXSPRITES)
|
|
{
|
|
initprintf("ghtrax_boardroppings: insertsprite failed\n");
|
|
return;
|
|
}
|
|
s2 = &sprite[v18];
|
|
getzrange_old(s->x, s->y, s->z, s->sectnum, &v24, &v28, &v2c, &v30, 128, CLIPMASK0);
|
|
if (v2c < sector[s->sectnum].floorz)
|
|
v2c = sector[s->sectnum].floorz - 8;
|
|
vec3_t pos = { s->x, s->y, v2c };
|
|
setsprite(a1, &pos);
|
|
changespritestat(a1, 805);
|
|
s2->cstat = 0;
|
|
s2->ang = s->ang;
|
|
s2->owner = a1;
|
|
s2->picnum = 983;
|
|
s2->pal = 0;
|
|
s2->xoffset = 0;
|
|
s2->yoffset = 0;
|
|
s2->xvel = 0;
|
|
s2->yvel = 0;
|
|
s2->zvel = 0;
|
|
s2->shade = 8;
|
|
s2->xrepeat = 8;
|
|
s2->yrepeat = 5;
|
|
s2->clipdist = 32;
|
|
s2->extra = 0;
|
|
dword_AAAC0++;
|
|
}
|
|
|
|
void ghtrax_leavedroppings(short a1)
|
|
{
|
|
spritetype *s;
|
|
sectortype *sc;
|
|
short sect;
|
|
s = &sprite[a1];
|
|
sect = s->sectnum;
|
|
sc = §or[sect];
|
|
|
|
if (klabs(sector[sect].ceilingheinum - sector[sect].floorheinum) <= 576)
|
|
{
|
|
switch (DYNAMICTILEMAP(sprite[a1].picnum))
|
|
{
|
|
case VIXEN__STATICRR:
|
|
if (sector[sect].hitag == 0)
|
|
ghtrax_deerdroppings(a1);
|
|
break;
|
|
case PIG__STATICRR:
|
|
if (sector[sect].hitag == 0)
|
|
ghtrax_boardroppings(a1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
int dword_AAAD0, dword_AAAD4, dword_AAAD8, dword_AAACC;
|
|
unsigned int dword_AAADC, dword_AAAE0, dword_AAAE4, dword_AAAE8;
|
|
|
|
void sub_579A0(void)
|
|
{
|
|
dword_AAAD0++;
|
|
dword_AAACC++;
|
|
if (dword_AAAD0 == 4)
|
|
{
|
|
if (dword_AAADC > 0)
|
|
dword_AAADC--;
|
|
if (dword_AAAE0 > 0)
|
|
dword_AAAE0--;
|
|
if (dword_AAAE4 > 0)
|
|
dword_AAAE4--;
|
|
if (dword_AAAE8 > 0)
|
|
dword_AAAE8--;
|
|
dword_AAAD0 = 0;
|
|
dword_AAAD4++;
|
|
if (dword_AAAD4 == 10)
|
|
{
|
|
dword_AAAD8++;
|
|
dword_AAAD4 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
int sub_57A40(int a1)
|
|
{
|
|
if (dword_AAADC)
|
|
return 0;
|
|
dword_AAADC = a1;
|
|
return 1;
|
|
}
|
|
|
|
int sub_57A60(int a2)
|
|
{
|
|
if (dword_AAAE0)
|
|
return 0;
|
|
dword_AAAE0 = a2;
|
|
return 1;
|
|
}
|
|
|
|
int sub_57A80(int a2)
|
|
{
|
|
if (dword_AAAE4)
|
|
return 0;
|
|
dword_AAAE4 = a2;
|
|
return 1;
|
|
}
|
|
|
|
int sub_57AA0(int a2)
|
|
{
|
|
if (dword_AAAE8)
|
|
return 0;
|
|
dword_AAAE8 = a2;
|
|
return 1;
|
|
}
|
|
|
|
int dword_AAAEC;
|
|
|
|
void sub_57AC0(void)
|
|
{
|
|
int i;
|
|
for (i = 0; i < MAXSECTORS; i++)
|
|
show2dsector[i>>3] |= 1<<(i&7);
|
|
for (i = 0; i < MAXWALLS; i++)
|
|
show2dwall[i>>3] |= 1<<(i&7);
|
|
dword_AAAEC ^= 1;
|
|
}
|
|
|
|
void sub_57B24(void)
|
|
{
|
|
dword_AAAEC = 0;
|
|
}
|
|
|
|
void sub_57B38(long cposx, long cposy, long czoom, short cang)
|
|
{
|
|
long i, j, k, l, x1, y1, x2, y2, x3, y3, x4, y4, ox, oy, xoff, yoff;
|
|
long dax, day, cosang, sinang, xspan, yspan, sprx, spry;
|
|
long xrepeat, yrepeat, z1, z2, startwall, endwall, tilenum, daang;
|
|
long xvect, yvect, xvect2, yvect2, xc, yc, xc2, yc2;
|
|
short p;
|
|
char col;
|
|
walltype *wal, *wal2;
|
|
spritetype *spr;
|
|
|
|
if (!dword_AAAEC)
|
|
return;
|
|
|
|
xvect = sintable[(-cang)&2047] * czoom;
|
|
yvect = sintable[(1536-cang)&2047] * czoom;
|
|
xvect2 = mulscale16(xvect,yxaspect);
|
|
yvect2 = mulscale16(yvect,yxaspect);
|
|
xc = windowxy2.x - windowxy1.x;
|
|
yc = windowxy2.y - windowxy1.y;
|
|
xc2 = 0;
|
|
yc2 = 0;
|
|
|
|
//Draw white lines
|
|
for(i=0;i<numsectors;i++)
|
|
{
|
|
if (!(show2dsector[i>>3]&(1<<(i&7)))) continue;
|
|
|
|
startwall = sector[i].wallptr;
|
|
endwall = sector[i].wallptr + sector[i].wallnum;
|
|
|
|
k = -1;
|
|
for(j=startwall,wal=&wall[startwall];j<endwall;j++,wal++)
|
|
{
|
|
if (wal->nextwall >= 0) continue;
|
|
|
|
if ((show2dwall[j>>3]&(1<<(j&7))) == 0) continue;
|
|
|
|
if (tilesiz[wal->picnum].x == 0) continue;
|
|
if (tilesiz[wal->picnum].y == 0) continue;
|
|
|
|
if (j == k)
|
|
{ x1 = x2; y1 = y2; }
|
|
else
|
|
{
|
|
ox = wal->x; oy = wal->y;
|
|
x1 = dmulscale16(ox,xvect,-oy,yvect)+(xc<<11);
|
|
y1 = dmulscale16(oy,xvect2,ox,yvect2)+(yc<<11);
|
|
}
|
|
|
|
k = wal->point2; wal2 = &wall[k];
|
|
ox = wal2->x; oy = wal2->y;
|
|
x2 = dmulscale16(ox,xvect,-oy,yvect)+(xc<<11);
|
|
y2 = dmulscale16(oy,xvect2,ox,yvect2)+(yc<<11);
|
|
|
|
renderDrawLine(x1,y1,x2,y2,74);
|
|
}
|
|
}
|
|
|
|
for(k=0;k<MAXSPRITES;k++)
|
|
{
|
|
i = 0;
|
|
switch (DYNAMICTILEMAP(sprite[k].picnum))
|
|
{
|
|
case VIXEN__STATICRR:
|
|
i = 5665;
|
|
break;
|
|
case PIG__STATICRR:
|
|
i = 4966;
|
|
break;
|
|
case DOGRUN__STATICRR:
|
|
i = 4311;
|
|
break;
|
|
case CHEER__STATICRR:
|
|
i = 6777;
|
|
break;
|
|
}
|
|
if (i == 0) continue;
|
|
|
|
ox = sprite[k].x-xc2; oy = sprite[k].y-yc2;
|
|
x1 = dmulscale16(ox,xvect,-oy,yvect);
|
|
y1 = dmulscale16(oy,xvect2,ox,yvect2);
|
|
|
|
rotatesprite_win((x1<<4)+(xc<<15), (y1<<4)+(yc<<15), 8192, 0, i, 0, 0, 0);
|
|
}
|
|
|
|
ox = cposx-xc2; oy = cposy-yc2;
|
|
x1 = dmulscale16(ox,xvect,-oy,yvect);
|
|
y1 = dmulscale16(oy,xvect2,ox,yvect2);
|
|
|
|
rotatesprite_win((x1<<4)+(xc<<15), (y1<<4)+(yc<<15), 65536, (fix16_to_int(g_player[screenpeek].ps->q16ang)+512)&2047, 7060, 0, 0, 0);
|
|
}
|
|
|
|
int sub_57FB0(void)
|
|
{
|
|
return 64 + (rrdh_random() % 224);
|
|
}
|
|
|
|
unsigned int dword_AAAF0;
|
|
unsigned int dword_AAAF4, dword_AAAF8;
|
|
int dword_AAAFC, dword_AAB00, dword_AAB04;
|
|
|
|
void ghtarget_runningclock(void)
|
|
{
|
|
if (dword_AAAFC != 2)
|
|
{
|
|
if (dword_AAAFC == 1)
|
|
{
|
|
if ((int)totalclock - dword_AAB04 >= 240)
|
|
{
|
|
sub_53E18();
|
|
dword_AAAFC = 2;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((int)totalclock - dword_AAAF8 >= 120)
|
|
{
|
|
if (dword_AAAF4 > 0)
|
|
dword_AAAF4--;
|
|
else if (dword_AAAF0 > 0)
|
|
{
|
|
dword_AAAF4 = 50;
|
|
dword_AAAF0--;
|
|
}
|
|
else
|
|
{
|
|
dword_AAAFC = 1;
|
|
dword_AAB04 = (int)totalclock;
|
|
P_DoQuote(145, g_player[myconnectindex].ps);
|
|
}
|
|
dword_AAAF8 = (int)totalclock;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_580C8(void)
|
|
{
|
|
int vsi = dword_AAAF0 % 10;
|
|
int vd = dword_AAAF0 / 10;
|
|
rotatesprite(292<<16, 184<<16, 17408, 0, DIGITALNUM+vd, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(296<<16, 184<<16, 17408, 0, DIGITALNUM+vsi, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
vsi = dword_AAAF4 % 10;
|
|
vd = dword_AAAF4 / 10;
|
|
rotatesprite(302<<16, 184<<16, 17408, 0, DIGITALNUM+vd, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(306<<16, 184<<16, 17408, 0, DIGITALNUM+vsi, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
|
|
void ghtarget_move(void)
|
|
{
|
|
int v2c = 0;
|
|
int v28 = 0;
|
|
int v24 = 0;
|
|
short v18 = 0;
|
|
int i, nexti;
|
|
short mv;
|
|
spritetype *s;
|
|
i = headspritestat[808];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
s = &sprite[i];
|
|
if (dword_AAAFC)
|
|
mv = 0;
|
|
else
|
|
{
|
|
v2c = s->x;
|
|
v28 = s->y;
|
|
v24 = s->z;
|
|
v18 = s->sectnum;
|
|
vec3_t vect = { (sintable[1536]*s->xvel)>>14, 0, 0 };
|
|
mv = A_MoveSprite(i, &vect, CLIPMASK1);
|
|
}
|
|
if (mv || v18 != s->sectnum)
|
|
{
|
|
s->x = v2c;
|
|
s->y = v28;
|
|
s->z = v24;
|
|
changespritesect(i, v18);
|
|
s->yvel = -s->yvel;
|
|
s->xvel = sub_57FB0();
|
|
if (s->yvel == -1)
|
|
s->xvel = -s->xvel;
|
|
s->cstat ^= 4;
|
|
ghtarget_setanimal(i);
|
|
if (s->extra)
|
|
{
|
|
s->cstat |= 256;
|
|
s->cstat &= ~32768;
|
|
s->extra = 0;
|
|
s->xvel = sub_57FB0();
|
|
if (s->yvel == -1)
|
|
s->xvel = -s->xvel;
|
|
}
|
|
}
|
|
i = nexti;
|
|
}
|
|
if (ud.level_number > 3)
|
|
ghtarget_runningclock();
|
|
}
|
|
|
|
void sub_58364(int a1)
|
|
{
|
|
dword_AAAF0 = a1;
|
|
dword_AAAF8 = 0;
|
|
dword_AAAF4 = 0;
|
|
dword_AAAFC = 0;
|
|
}
|
|
|
|
void sub_58388(void)
|
|
{
|
|
int i, vdx;
|
|
sub_58364(0);
|
|
dword_AAB00 = 0;
|
|
if (ud.level_number < 4)
|
|
return;
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
{
|
|
vdx = 0;
|
|
switch (sprite[i].picnum)
|
|
{
|
|
case 7110:
|
|
sprite[i].xrepeat = 18;
|
|
sprite[i].yrepeat = 24;
|
|
vdx = 1;
|
|
break;
|
|
case 7111:
|
|
sprite[i].xrepeat = 13;
|
|
sprite[i].yrepeat = 14;
|
|
vdx = 1;
|
|
break;
|
|
case 7112:
|
|
sprite[i].xrepeat = 22;
|
|
sprite[i].yrepeat = 16;
|
|
vdx = 1;
|
|
break;
|
|
case 1076:
|
|
sprite[i].cstat = 257;
|
|
break;
|
|
}
|
|
if (vdx)
|
|
{
|
|
changespritestat(i, 808);
|
|
sprite[i].cstat = 273;
|
|
sprite[i].xvel = sub_57FB0();
|
|
sprite[i].yvel = 1;
|
|
sprite[i].extra = 0;
|
|
}
|
|
}
|
|
sub_58364(3);
|
|
}
|
|
|
|
void ghtarget_setanimal(short a1)
|
|
{
|
|
int vdx;
|
|
vdx = rrdh_random() % 5;
|
|
switch (vdx)
|
|
{
|
|
case 0:
|
|
sprite[a1].picnum = 7110;
|
|
sprite[a1].xrepeat = 18;
|
|
sprite[a1].yrepeat = 24;
|
|
break;
|
|
case 1:
|
|
sprite[a1].picnum = 7111;
|
|
sprite[a1].xrepeat = 13;
|
|
sprite[a1].yrepeat = 14;
|
|
break;
|
|
case 2:
|
|
sprite[a1].picnum = 7112;
|
|
sprite[a1].xrepeat = 22;
|
|
sprite[a1].yrepeat = 16;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ghtarget_hit(short a1, int a2)
|
|
{
|
|
unsigned short vc;
|
|
if (dword_AAAFC)
|
|
return;
|
|
if (sprite[a1].picnum == 1076)
|
|
{
|
|
dword_AAB00++;
|
|
sub_58A30(1);
|
|
sub_53848(dword_AAB00);
|
|
}
|
|
else if (sprite[a1].statnum == 808)
|
|
{
|
|
vc = sprite[a1].picnum;
|
|
switch (sprite[a1].picnum)
|
|
{
|
|
case 7110:
|
|
case 7111:
|
|
vc = 1;
|
|
break;
|
|
case 7112:
|
|
vc = 4;
|
|
break;
|
|
}
|
|
ghstatbr_registerkillinfo(sprite[a1].picnum, 0, 0);
|
|
vc += klabs(sprite[a1].xvel) / 32;
|
|
switch (sector[sprite[a1].sectnum].hitag)
|
|
{
|
|
case 2004:
|
|
vc++;
|
|
break;
|
|
case 2005:
|
|
vc += 2;
|
|
break;
|
|
case 2006:
|
|
vc += 4;
|
|
break;
|
|
case 2007:
|
|
vc += 8;
|
|
break;
|
|
case 2008:
|
|
vc += 16;
|
|
break;
|
|
default:
|
|
initprintf("WARNING: ghtarget_hit: spr not in track\n");
|
|
break;
|
|
}
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
vc++;
|
|
break;
|
|
case 1:
|
|
vc += 2;
|
|
break;
|
|
case 3:
|
|
vc += 2;
|
|
break;
|
|
case 4:
|
|
vc += 3;
|
|
break;
|
|
}
|
|
sprite[a1].cstat |= 32768;
|
|
sprite[a1].cstat &= ~256;
|
|
A_PlaySound(87, g_player[myconnectindex].ps->i);
|
|
ghtarget_setanimal(a1);
|
|
sprite[a1].extra = 1;
|
|
if (vc > 18)
|
|
sub_5A250(0x200);
|
|
dword_AAB00 += vc;
|
|
sub_58A30(vc);
|
|
sub_53848(dword_AAB00);
|
|
}
|
|
}
|
|
|
|
void gharrow_move(void)
|
|
{
|
|
int i, nexti;
|
|
short mv;
|
|
int v24, v28, v20, vdx;
|
|
short v18;
|
|
spritetype *s;
|
|
i = headspritestat[809];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
s = &sprite[i];
|
|
if (s->sectnum < 0 || s->sectnum >= numsectors)
|
|
{
|
|
deletesprite(i);
|
|
}
|
|
else
|
|
{
|
|
A_GetZLimits(i);
|
|
v24 = s->x;
|
|
v28 = s->y;
|
|
v20 = s->y;
|
|
v18 = s->sectnum;
|
|
vec3_t vec = { s->xvel, s->yvel, s->zvel };
|
|
mv = A_MoveSprite(i, &vec, CLIPMASK1);
|
|
if (mv)
|
|
{
|
|
s->x = v24;
|
|
s->y = v28;
|
|
s->z = v20;
|
|
changespritesect(i, v18);
|
|
if ((mv & 49152) == 49152)
|
|
{
|
|
mv &= MAXSPRITES - 1;
|
|
A_PlaySound(59, mv);
|
|
vdx = sub_56AD8();
|
|
ghtrophy_addkill(mv);
|
|
ghtarget_hit(mv, vdx);
|
|
}
|
|
else
|
|
{
|
|
if ((mv & 49152) == 32768 && ud.level_number > 3)
|
|
A_PlaySound(59, i);
|
|
sub_5A250(4);
|
|
}
|
|
deletesprite(i);
|
|
}
|
|
}
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
void gharrow_spawnarrow(short snum)
|
|
{
|
|
short s;
|
|
spritetype *spr;
|
|
DukePlayer_t *p;
|
|
p = g_player[snum].ps;
|
|
s = insertsprite(p->cursectnum, 809);
|
|
if (s < 0 || s >= MAXSPRITES)
|
|
{
|
|
initprintf("gharrow_spawnarrow: insertsprite failed\n");
|
|
return;
|
|
}
|
|
spr = &sprite[s];
|
|
if (!spr)
|
|
{
|
|
initprintf("gharrow_spawnarrow: null sprptr\n");
|
|
return;
|
|
}
|
|
spr->x = p->pos.x;
|
|
spr->y = p->pos.y;
|
|
spr->z = p->pos.z;
|
|
spr->ang = (fix16_to_int(p->q16ang) + 3) & 2047;
|
|
spr->xvel = sintable[(spr->ang + 512) & 2047];
|
|
spr->yvel = sintable[(spr->ang) & 2047];
|
|
spr->picnum = 3450;
|
|
spr->cstat = 1;
|
|
spr->owner = 0;
|
|
spr->xrepeat = 14;
|
|
spr->yrepeat = 14;
|
|
spr->pal = 0;
|
|
spr->xoffset = 0;
|
|
spr->yoffset = 0;
|
|
spr->lotag = 0;
|
|
spr->hitag = 0;
|
|
spr->extra = 0;
|
|
spr->shade = 0;
|
|
spr->zvel = (100 - fix16_to_int(p->q16horiz) + 1) << 9;
|
|
spr->cstat |= 0x8001;
|
|
}
|
|
|
|
int dword_AAB08 = 1;
|
|
unsigned int dword_AAB0C;
|
|
|
|
void sub_58A30(int a1)
|
|
{
|
|
dword_AAB0C += a1;
|
|
if (dword_AAB0C > 99999)
|
|
dword_AAB0C = 0;
|
|
dword_AAB08 = 128;
|
|
}
|
|
|
|
void sub_58A5C(unsigned int a1)
|
|
{
|
|
int t1 = a1 % 10;
|
|
int t2 = (a1 % 100) / 10;
|
|
int t3 = (a1 % 1000) / 100;
|
|
int t4 = (a1 % 10000) / 1000;
|
|
int t5 = (a1 % 100000) / 10000;
|
|
rotatesprite(243<<16, 185<<16, 22528, 0, DIGITALNUM+t1, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(235<<16, 185<<16, 22528, 0, DIGITALNUM+t2, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(227<<16, 185<<16, 22528, 0, DIGITALNUM+t3, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(219<<16, 185<<16, 22528, 0, DIGITALNUM+t4, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
rotatesprite(211<<16, 185<<16, 22528, 0, DIGITALNUM+t5, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
|
|
short word_AAB10;
|
|
int dword_AAB14, dword_AAB18;
|
|
|
|
void ghstatbr_registerkillinfo(short a1, int a2, int a3)
|
|
{
|
|
if (a1 < 0 || a1 >= MAXTILES)
|
|
{
|
|
initprintf("ERROR: ghstatbr_registerkillinfo bad pic range\n");
|
|
return;
|
|
}
|
|
if (a2 < 0)
|
|
{
|
|
initprintf("ERROR: ghstatbr_registerkillinfo neg points\n");
|
|
return;
|
|
}
|
|
switch (DYNAMICTILEMAP(a1))
|
|
{
|
|
case VIXEN__STATICRR:
|
|
word_AAB10 = 1720;
|
|
break;
|
|
case RRTILE7110__STATICRR:
|
|
word_AAB10 = 7114;
|
|
break;
|
|
case PIG__STATICRR:
|
|
word_AAB10 = 1719;
|
|
break;
|
|
case RRTILE7111__STATICRR:
|
|
word_AAB10 = 7115;
|
|
break;
|
|
case DOGRUN__STATICRR:
|
|
word_AAB10 = 1721;
|
|
break;
|
|
case RRTILE7113__STATICRR:
|
|
word_AAB10 = 7116;
|
|
break;
|
|
case CHEER__STATICRR:
|
|
word_AAB10 = 1722;
|
|
break;
|
|
case RRTILE7112__STATICRR:
|
|
word_AAB10 = 7117;
|
|
break;
|
|
default:
|
|
word_AAB10 = 0;
|
|
dword_AAB14 = 0;
|
|
return;
|
|
}
|
|
dword_AAB14 = a2;
|
|
dword_AAB18 = a3;
|
|
dword_AAB08 |= 8;
|
|
}
|
|
|
|
void sub_58D14(void)
|
|
{
|
|
if (word_AAB10 > 0 && dword_AAB14 >= 0 && dword_AAB18 >= 0)
|
|
{
|
|
rotatesprite(39<<16, 185<<16, 32768, 0, word_AAB10, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
if (ud.level_number < 4)
|
|
{
|
|
unsigned int t1 = dword_AAB14 % 10;
|
|
unsigned int t2 = (dword_AAB14 % 100) / 10;
|
|
unsigned int t3 = (dword_AAB14 % 1000) / 100;
|
|
rotatesprite(64<<16, 180<<16, 18432, 0, DIGITALNUM+t1, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
if (t3 || t2 > 0)
|
|
{
|
|
rotatesprite(58<<16, 180<<16, 18432, 0, DIGITALNUM+t2, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
if (t3 > 0)
|
|
{
|
|
rotatesprite(52<<16, 180<<16, 18432, 0, DIGITALNUM+t3, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
t1 = dword_AAB18 % 10;
|
|
t2 = (dword_AAB18 % 100) / 10;
|
|
rotatesprite(64<<16, 190<<16, 18432, 0, DIGITALNUM+t1, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
if (t2 > 0)
|
|
{
|
|
rotatesprite(58<<16, 190<<16, 18432, 0, DIGITALNUM+t2, 0, 0, 128+64+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void sub_58F40(int a1)
|
|
{
|
|
int v18 = sub_59B44();
|
|
int v1c, v20, i;
|
|
switch (a1)
|
|
{
|
|
case 0:
|
|
v20 = 1723;
|
|
v1c = 24576;
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
v20 = 1724;
|
|
v1c = 24576;
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
for (i = 0; i < v18; i++)
|
|
{
|
|
rotatesprite((216+13*i)<<16, 184<<16, v1c, 0, v20, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
}
|
|
|
|
void ghstatbr_drawammotype(void)
|
|
{
|
|
int vbx = 0;
|
|
switch (g_player[myconnectindex].ps->dhat61f)
|
|
{
|
|
case 0:
|
|
vbx = sub_56718();
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
vbx = sub_55FC0();
|
|
break;
|
|
case 3:
|
|
vbx = sub_55928();
|
|
break;
|
|
case 4:
|
|
vbx = sub_56AD8();
|
|
break;
|
|
}
|
|
rotatesprite(97<<16, 187<<16, 32768, 0, 1711+vbx, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
|
|
int dword_AAB1C;
|
|
|
|
void ghstatbr_render(void)
|
|
{
|
|
int r;
|
|
short v18;
|
|
|
|
if (klabs(fix16_to_int(g_player[myconnectindex].ps->q16ang) - fix16_to_int(g_player[myconnectindex].ps->oq16ang)) > 16)
|
|
dword_AAB08 = 2;
|
|
|
|
v18 = sub_5743C();
|
|
r = rrdh_random() & 1023;
|
|
if (r < 64)
|
|
{
|
|
v18 += r - 32;
|
|
dword_AAB08 = 4;
|
|
v18 &= 2047;
|
|
}
|
|
if (dword_AAB08)
|
|
{
|
|
//sub_51028(3, dword_AAB1C++);
|
|
if (ud.level_number < 4)
|
|
{
|
|
rotatesprite(0<<16, 166<<16, 32768, 0, 1647, 4, 0, 128+64+16+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
else
|
|
{
|
|
rotatesprite(0<<16, 166<<16, 32768, 0, 1710, 4, 0, 128+64+16+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
sub_58D14();
|
|
if (ud.level_number > 0 && ud.level_number < 4)
|
|
{
|
|
rotatesprite(216<<16, 166<<16, 32768, 0, 1725, 4, 0, 128+64+16+10, 0, 0, xdim-1, ydim-1);
|
|
}
|
|
ghstatbr_drawammotype();
|
|
rotatesprite(155<<16, 185<<16, 32768, v18, 1637, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
if (ud.level_number < 4)
|
|
rotatesprite(301<<16, 183<<16, 32768, fix16_to_int(g_player[screenpeek].ps->q16ang), 1638, 0, 0, 128+10, 0, 0, xdim-1, ydim-1);
|
|
if (ud.level_number > 3)
|
|
sub_580C8();
|
|
sub_58F40(ud.level_number);
|
|
if (ud.level_number > 3)
|
|
sub_58A5C(dword_AAB0C);
|
|
dword_AAB08 = 0;
|
|
}
|
|
}
|
|
|
|
//void sub_592F0(void)
|
|
//{
|
|
// dword_AAB08 = 1;
|
|
//}
|
|
//
|
|
//void sub_59304(int a1)
|
|
//{
|
|
// dword_AAB08 |= a1;
|
|
//}
|
|
|
|
void sub_59314(void)
|
|
{
|
|
dword_AAB0C = 0;
|
|
dword_AAB14 = 0;
|
|
dword_AAB08 = 1;
|
|
word_AAB10 = 0;
|
|
}
|
|
|
|
int ghdeploy_isdownwind(short a1, short a2)
|
|
{
|
|
short ang;
|
|
ang = getangle(sprite[a1].x - sprite[a2].x, sprite[a1].y - sprite[a2].y) & 2047;
|
|
return klabs(sub_5743C() - ang) < 512;
|
|
}
|
|
|
|
void ghdeploy_bias(short a1)
|
|
{
|
|
spritetype *s;
|
|
int i, nexti, vcx, d;
|
|
short v1c;
|
|
s = &sprite[a1];
|
|
vcx = 76800;
|
|
v1c = -1;
|
|
i = headspritestat[811];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
if (sprite[i].extra > 0)
|
|
{
|
|
if (sprite[i].picnum == 7073 && ghdeploy_isdownwind(a1, i))
|
|
{
|
|
d = klabs(sprite[a1].x-sprite[i].x) + klabs(sprite[a1].y-sprite[i].y);
|
|
if (d < vcx)
|
|
{
|
|
vcx = d;
|
|
v1c = i;
|
|
}
|
|
}
|
|
else if (sprite[i].picnum == 7072)
|
|
{
|
|
if ((rrdh_random() & 255) > 32)
|
|
{
|
|
d = klabs(sprite[a1].x-sprite[i].x) + klabs(sprite[a1].y-sprite[i].y);
|
|
if (d < vcx)
|
|
{
|
|
vcx = d;
|
|
v1c = i;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
d = klabs(sprite[a1].x-sprite[i].x) + klabs(sprite[a1].y-sprite[i].y);
|
|
if (d < vcx)
|
|
{
|
|
vcx = d;
|
|
v1c = i;
|
|
}
|
|
}
|
|
}
|
|
i = nexti;
|
|
}
|
|
if (vcx < 76800 && v1c != -1)
|
|
{
|
|
sprite[a1].ang = getangle(sprite[v1c].x-sprite[a1].x,sprite[v1c].y-sprite[a1].y) & 2047;
|
|
}
|
|
else
|
|
{
|
|
sprite[a1].ang = rrdh_random() & 2047;
|
|
}
|
|
}
|
|
|
|
int dword_AAB24[] = {
|
|
0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176,
|
|
192, 208, 224, 240, 256, 240, 224, 208, 192, 176, 160,
|
|
144, 128, 112, 96, 80, 64, 48, 32, 16
|
|
};
|
|
|
|
void ghdeploy_move(void)
|
|
{
|
|
int v1c = 0;
|
|
int v20 = 0;
|
|
int v24 = 0;
|
|
int v28 = 0;
|
|
int i, nexti;
|
|
spritetype *s;
|
|
|
|
i = headspritestat[811];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
s = &sprite[i];
|
|
if (s->sectnum < 0 || s->sectnum >= numsectors)
|
|
{
|
|
initprintf("ghdeploy_move DEPLOYED bad sect %i\n", s->sectnum);
|
|
deletesprite(i);
|
|
}
|
|
else if (sector[s->sectnum].hitag == 2003)
|
|
{
|
|
if (s->zvel < 0 || s->zvel >= 32)
|
|
s->zvel = 0;
|
|
else
|
|
{
|
|
s->z = sector[s->sectnum].floorz + 256 + dword_AAB24[s->zvel];
|
|
s->zvel++;
|
|
}
|
|
}
|
|
if (s->picnum == 7073 && s->extra > 0)
|
|
{
|
|
s->extra--;
|
|
}
|
|
i = nexti;
|
|
}
|
|
i = headspritestat[810];
|
|
while (i >= 0)
|
|
{
|
|
nexti = nextspritestat[i];
|
|
s = &sprite[i];
|
|
if (s->sectnum < 0 || s->sectnum >= numsectors)
|
|
{
|
|
initprintf("ghdeploy_move TOSS bad sect %i\n", s->sectnum);
|
|
deletesprite(i);
|
|
}
|
|
vec3_t vec = { s->xvel, s->yvel, 0 };
|
|
A_MoveSprite(i, &vec, CLIPMASK1);
|
|
getzrange_old(s->x, s->y, s->z, s->sectnum, &v1c, &v20, &v24, &v28, 32, CLIPMASK0);
|
|
if (v24 - 2048 < sprite[i].z)
|
|
{
|
|
changespritestat(i, 811);
|
|
s->extra = 9600;
|
|
s->z = v24;
|
|
s->zvel = 0;
|
|
if (s->picnum == 7072)
|
|
{
|
|
s->cstat = 1;
|
|
if (sector[s->sectnum].hitag == 2003)
|
|
A_PlaySound(90, g_player[myconnectindex].ps->i);
|
|
if (sector[s->sectnum].hitag == 2003)
|
|
A_PlaySound(89, g_player[myconnectindex].ps->i);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sprite[i].z += sprite[i].zvel;
|
|
sprite[i].zvel += 0x200;
|
|
}
|
|
i = nexti;
|
|
}
|
|
}
|
|
|
|
unsigned int dword_AAB20;
|
|
int dword_AABA4 = 4;
|
|
|
|
void ghdeploy_drop(int a1, int a2)
|
|
{
|
|
DukePlayer_t *p;
|
|
short va;
|
|
spritetype *s;
|
|
if ((int)totalclock - dword_AAB20 < 120)
|
|
return;
|
|
if (!dword_AABA4)
|
|
{
|
|
P_DoQuote(149, g_player[a1].ps);
|
|
return;
|
|
}
|
|
if (a2 > 3)
|
|
return;
|
|
p = g_player[a1].ps;
|
|
if (p->cursectnum < 0 || p->cursectnum >= numsectors)
|
|
{
|
|
initprintf("ERROR: ghdeploy_drop bad plrsectr %i\n", p->cursectnum);
|
|
return;
|
|
}
|
|
va = insertsprite(p->cursectnum, 810);
|
|
if (va < 0 || va >= MAXSPRITES)
|
|
{
|
|
initprintf("ghdeploy_drop: insertsprite failed\n");
|
|
return;
|
|
}
|
|
s = &sprite[va];
|
|
if (!s)
|
|
{
|
|
initprintf("ghdeploy_drop: null sprptr\n");
|
|
return;
|
|
}
|
|
s->x = p->pos.x + (sintable[(fix16_to_int(p->q16ang) + 512) & 2047] >> 7);
|
|
s->y = p->pos.y + (sintable[(fix16_to_int(p->q16ang)) & 2047] >> 7);
|
|
s->z = p->pos.z + 0x1000;
|
|
s->ang = fix16_to_int(fix16_to_int(p->q16ang)) & 2047;
|
|
s->xvel = (sintable[(fix16_to_int(p->q16ang) + 512) & 2047] * 5) >> 8;
|
|
s->yvel = (sintable[(fix16_to_int(p->q16ang)) & 2047] * 5) >> 8;
|
|
s->zvel = (80 - fix16_to_int(p->q16horiz)) << 6;
|
|
if (a2 == 0)
|
|
{
|
|
s->picnum = 7072;
|
|
s->cstat = 0;
|
|
P_DoQuote(146, p);
|
|
}
|
|
else
|
|
{
|
|
s->cstat = 0;
|
|
s->cstat |= 32768;
|
|
s->picnum = 7073;
|
|
P_DoQuote(148, p);
|
|
A_PlaySound(88, p->i);
|
|
}
|
|
s->owner = 0;
|
|
s->clipdist = 4;
|
|
s->xrepeat = 10;
|
|
s->yrepeat = 10;
|
|
s->pal = 0;
|
|
s->xoffset = 0;
|
|
s->yoffset = 0;
|
|
s->lotag = 0;
|
|
s->hitag = 0;
|
|
s->extra = 0;
|
|
s->shade = 0;
|
|
dword_AABA4--;
|
|
//sub_592F0();
|
|
dword_AAB20 = (int)totalclock;
|
|
}
|
|
|
|
int sub_59B44(void)
|
|
{
|
|
return dword_AABA4;
|
|
}
|
|
|
|
void sub_59B50(void)
|
|
{
|
|
dword_AABA4 = 4;
|
|
dword_AAB20 = 0;
|
|
}
|
|
|
|
void ghdeploy_plrtouchedsprite(short a1, short a2)
|
|
{
|
|
DukePlayer_t *p;
|
|
spritetype *s;
|
|
p = g_player[a2].ps;
|
|
s = &sprite[a1];
|
|
|
|
if (sprite[a1].statnum == 811 && sprite[a1].picnum != 7073)
|
|
{
|
|
deletesprite(a1);
|
|
dword_AABA4++;
|
|
P_DoQuote(147, p);
|
|
}
|
|
}
|
|
|
|
short word_2BE990[68];
|
|
short word_2BEA18;
|
|
char byte_2BE350[256];
|
|
|
|
void sub_59C20(void)
|
|
{
|
|
int i;
|
|
word_2BEA18 = 0;
|
|
tileDelete(7059);
|
|
for (i = 0; i < numsectors; i++)
|
|
{
|
|
sector[i].extra = 256;
|
|
if (sector[i].floorpicnum == 7059)
|
|
word_2BE990[word_2BEA18++] = i;
|
|
}
|
|
for (i = 0; i < 256; i++)
|
|
byte_2BE350[i] = i;
|
|
paletteMakeLookupTable(2, byte_2BE350, 10*4, 10*4, 24*4, 0);
|
|
}
|
|
|
|
int dword_2BEA20, dword_2BEA24;
|
|
int dword_AABA8, dword_AABAC, dword_AABB0;
|
|
|
|
void sub_59F80(int a1)
|
|
{
|
|
dword_2BEA20 = 0;
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
dword_2BEA24 = a1;
|
|
dword_AABB0 = 0;
|
|
}
|
|
|
|
void ghmumble_randomsayit(int a1, int a2)
|
|
{
|
|
if (a1 < 0 || a1 >= MAXSOUNDS)
|
|
{
|
|
initprintf("ghmumble_randomsayit bad sndnum\n");
|
|
return;
|
|
}
|
|
if (g_player[myconnectindex].ps->gm == MODE_GAME)
|
|
{
|
|
if ((rrdh_random() & 255) <= a2)
|
|
{
|
|
S_PlaySound(a1);
|
|
dword_AABB0 = (int)totalclock;
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_5A02C(void)
|
|
{
|
|
int t;
|
|
if (dword_2BEA24 > 3)
|
|
{
|
|
if (dword_2BEA20 == 512)
|
|
{
|
|
ghmumble_randomsayit(105+(rrdh_random()%2), 164);
|
|
}
|
|
dword_2BEA20 = 0;
|
|
return;
|
|
}
|
|
if ((int)totalclock - dword_AABB0 < 480)
|
|
{
|
|
dword_2BEA20 = 0;
|
|
return;
|
|
}
|
|
if (dword_2BEA20 == 0)
|
|
{
|
|
if ((int)totalclock - dword_AABA8 > 2400)
|
|
{
|
|
ghmumble_randomsayit(91 + (rrdh_random() % 4), 200);
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
}
|
|
}
|
|
else if (dword_2BEA20 & 8)
|
|
{
|
|
ghmumble_randomsayit(100 + (rrdh_random() % 2), 200);
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 4)
|
|
{
|
|
if (dword_2BEA20 & 32)
|
|
ghmumble_randomsayit(98 + (rrdh_random() % 2), 216);
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 16)
|
|
{
|
|
if (dword_2BEA20 & 32)
|
|
ghmumble_randomsayit(102, 216);
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 2048)
|
|
{
|
|
ghmumble_randomsayit(108, 250);
|
|
dword_AABA8 = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 4096)
|
|
{
|
|
ghmumble_randomsayit(109, 80);
|
|
dword_AABA8 = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 16384)
|
|
{
|
|
ghmumble_randomsayit(107, 255);
|
|
dword_AABA8 = (int)totalclock;
|
|
}
|
|
else if (dword_2BEA20 & 256)
|
|
{
|
|
if ((dword_2BEA20 & 64) == 0)
|
|
{
|
|
if ((int)totalclock - dword_AABAC > 7200)
|
|
{
|
|
initprintf("nosightings mumble\n");
|
|
t = rrdh_random() % 3;
|
|
if (t == 2 && dword_2BEA24 != 3)
|
|
t = 1;
|
|
ghmumble_randomsayit(95+t, 200);
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
}
|
|
}
|
|
}
|
|
dword_2BEA20 = 0;
|
|
}
|
|
|
|
void sub_5A250(int a1)
|
|
{
|
|
if (a1 >= 0x10000)
|
|
return;
|
|
switch (a1)
|
|
{
|
|
case 1:
|
|
dword_2BEA20 = 0;
|
|
return;
|
|
case 2:
|
|
dword_AABA8 = (int)totalclock;
|
|
dword_AABAC = (int)totalclock;
|
|
dword_2BEA20 = 0;
|
|
return;
|
|
case 0x100:
|
|
dword_AABA8 = (int)totalclock;
|
|
break;
|
|
case 0x10:
|
|
break;
|
|
case 0x20:
|
|
case 0x40:
|
|
dword_AABAC = (int)totalclock;
|
|
break;
|
|
}
|
|
dword_2BEA20 |= a1;
|
|
}
|
|
END_RR_NS
|