REDRIVER2/src_rebuild/GAME/C/OVERMAP.C
Ilya Shurumov c40d40bd22 - added sources rebuilt with TDR and partially decompiled intro sequence
- moved necessary data to new sources
- running intro with TOMB5 HLE emulator
2020-03-28 03:25:35 +06:00

3223 lines
82 KiB
C

#include "THISDUST.H"
#include "OVERMAP.H"
OVERMAP overlaidmaps[4] =
{
{ 197, 318, 384, 672, '\xFC', '\x99', 2145 },
{ 229, 85, 544, 352, '\xBB', '\x88', 2048 },
{ 68, 457, 288, 672, '\xBD', '\xBB', 1911 },
{ 159, 207, 416, 576, '\xFC', 'D', 2048 }
};
SXYPAIR MapSegmentPos[16] =
{
{ 0, 0 },
{ 8, 0 },
{ 16, 0 },
{ 24, 0 },
{ 0, 32 },
{ 8, 32 },
{ 16, 32 },
{ 24, 32 },
{ 0, 64 },
{ 8, 64 },
{ 16, 64 },
{ 24, 64 },
{ 0, 96 },
{ 8, 96 },
{ 16, 96 },
{ 24, 96 }
};
XYPAIR NVertex[4] = { { -2, 3 }, { -2, -3 }, { 2, 3 }, { 2, -3 } };
XYPAIR north[4] = { { 0, 20 }, { 0, 20 }, { 0, 20 }, { 0, 20 } };
VECTOR player_position = { 0, 0, 0, 0 };
char* palettedir[] = {
"CHICAGO",
"HAVANA",
"VEGAS",
"RIO",
"CHICAGO",
"HAVANA",
"VEGAS",
"RIO",
};
// decompiled code
// original method signature:
// void /*$ra*/ DrawTargetBlip(struct VECTOR *pos /*$t0*/, unsigned char r /*$s2*/, unsigned char g /*$s3*/, unsigned char b /*$s4*/, unsigned long flags /*stack 16*/)
// line 685, offset 0x00016280
/* begin block 1 */
// Start line: 686
// Start offset: 0x00016280
// Variables:
// struct POLY_FT4 *poly; // $t0
// struct VECTOR vec; // stack offset -40
// int ysize; // $a2
/* end block 1 */
// End offset: 0x00016558
// End Line: 759
/* begin block 2 */
// Start line: 1370
/* end block 2 */
// End Line: 1371
/* WARNING: Could not reconcile some variable overlaps */
void DrawTargetBlip(VECTOR *pos,uchar r,uchar g,uchar b,ulong flags)
{
DB *pDVar1;
ushort uVar2;
short sVar3;
uint *puVar4;
long local_28;
long local_24;
int local_20;
long local_1c;
if ((flags & 0x20) == 0) {
if ((flags & 8) == 0) {
if ((flags & 1) == 0) {
WorldToFullscreenMap2(pos,(VECTOR *)&local_28);
}
else {
WorldToOverheadMapPositions(pos,(VECTOR *)&local_28,1,'\0',0);
if (0x5e < local_28 - 0xe9U) {
return;
}
if (local_20 < 0xae) {
return;
}
if (0xfa < local_20) {
return;
}
}
}
else {
local_28 = pos->vx;
local_24 = pos->vy;
local_20 = pos->vz;
local_1c = pos->pad;
}
if ((flags & 1) == 0) {
local_28 = local_28 + map_x_offset;
local_20 = local_20 + map_z_offset;
}
}
else {
WorldToMultiplayerMap(pos,(VECTOR *)&local_28);
local_28 = local_28 + 0xf0;
local_20 = local_20 + 0x60;
}
if ((flags & 0x10) == 0) {
sVar3 = 4;
if ((flags & 2) != 0) {
sVar3 = 3;
}
}
else {
sVar3 = (short)((int)(uint)(byte)OverlayFlashValue >> 1);
}
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\t';
*(char *)((int)puVar4 + 7) = '.';
*(short *)(puVar4 + 2) = (short)local_28 - sVar3;
*(short *)((int)puVar4 + 10) = (short)local_20 - sVar3;
*(short *)(puVar4 + 4) = (short)local_28 + sVar3;
*(short *)((int)puVar4 + 0x12) = (short)local_20 - sVar3;
*(short *)(puVar4 + 6) = (short)local_28 - sVar3;
*(short *)((int)puVar4 + 0x1a) = (short)local_20 + sVar3;
*(short *)(puVar4 + 8) = (short)local_28 + sVar3;
*(uchar *)(puVar4 + 1) = r;
*(uchar *)((int)puVar4 + 5) = g;
*(uchar *)((int)puVar4 + 6) = b;
*(short *)((int)puVar4 + 0x22) = (short)local_20 + sVar3;
*(uchar *)(puVar4 + 3) = light_texture.coords.u0;
*(uchar *)((int)puVar4 + 0xd) = light_texture.coords.v0;
*(uchar *)(puVar4 + 5) = light_texture.coords.u1;
*(uchar *)((int)puVar4 + 0x15) = light_texture.coords.v1;
*(uchar *)(puVar4 + 7) = light_texture.coords.u2;
*(uchar *)((int)puVar4 + 0x1d) = light_texture.coords.v2;
*(uchar *)(puVar4 + 9) = light_texture.coords.u3;
*(uchar *)((int)puVar4 + 0x25) = light_texture.coords.v3;
if ((flags & 2) == 0) {
uVar2 = light_texture.tpageid | 0x20;
}
else {
uVar2 = light_texture.tpageid | 0x40;
}
*(ushort *)((int)puVar4 + 0x16) = uVar2;
*(ushort *)((int)puVar4 + 0xe) = light_texture.clutid;
pDVar1 = current;
if ((flags & 4) == 0) {
*puVar4 = *puVar4 & 0xff000000 | *current->ot & 0xffffff;
*pDVar1->ot = *pDVar1->ot & 0xff000000 | (uint)puVar4 & 0xffffff;
pDVar1->primptr = pDVar1->primptr + 0x28;
}
else {
DrawPrim(puVar4);
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawTargetArrow(struct VECTOR *pos /*$a2*/, unsigned long flags /*$s3*/)
// line 815, offset 0x00016578
/* begin block 1 */
// Start line: 816
// Start offset: 0x00016578
// Variables:
// struct VECTOR vec; // stack offset -56
// struct VECTOR vec2; // stack offset -40
// struct POLY_FT3 *null; // $t1
// struct POLY_G3 *poly; // $s2
// int dx; // $s1
// int dy; // $s0
/* end block 1 */
// End offset: 0x00016814
// End Line: 875
/* begin block 2 */
// Start line: 1642
/* end block 2 */
// End Line: 1643
/* WARNING: Could not reconcile some variable overlaps */
void DrawTargetArrow(VECTOR *pos,ulong flags)
{
short sVar1;
short sVar2;
DB *pDVar3;
int iVar4;
int iVar5;
uint *puVar6;
int local_38;
long local_34;
int local_30;
long local_2c;
int local_28;
int local_20;
if ((flags & 8) == 0) {
if ((flags & 1) == 0) {
WorldToFullscreenMap2(pos,(VECTOR *)&local_38);
}
else {
WorldToOverheadMapPositions(pos,(VECTOR *)&local_38,1,'\0',0);
}
}
else {
local_38 = pos->vx;
local_34 = pos->vy;
local_30 = pos->vz;
local_2c = pos->pad;
}
if ((flags & 1) == 0) {
local_38 = local_38 + map_x_offset;
local_30 = local_30 + map_z_offset;
local_28 = map_x_offset + 0xa0;
local_20 = map_z_offset + 0x80;
}
else {
WorldToOverheadMapPositions((VECTOR *)&player,(VECTOR *)&local_28,1,'\0',0);
}
iVar5 = local_28 - local_38;
iVar4 = local_20 - local_30;
ratan2(iVar4,iVar5);
puVar6 = (uint *)current->primptr;
*(char *)((int)puVar6 + 3) = '\x06';
*(char *)((int)puVar6 + 7) = '2';
*(char *)(puVar6 + 1) = '\x18';
*(char *)((int)puVar6 + 5) = '\x18';
*(char *)((int)puVar6 + 6) = '\x18';
*(char *)(puVar6 + 3) = '\x18';
*(char *)((int)puVar6 + 0xd) = '\x18';
*(char *)((int)puVar6 + 0xe) = '\x18';
*(char *)(puVar6 + 5) = '@';
*(char *)((int)puVar6 + 0x15) = '@';
*(char *)((int)puVar6 + 0x16) = '@';
sVar1 = (short)(iVar4 >> 3);
*(short *)(puVar6 + 2) = (short)local_28 + sVar1;
sVar2 = (short)(iVar5 >> 3);
*(short *)((int)puVar6 + 10) = (short)local_20 - sVar2;
*(short *)(puVar6 + 4) = (short)local_28 - sVar1;
*(short *)((int)puVar6 + 0x12) = (short)local_20 + sVar2;
*(undefined2 *)(puVar6 + 6) = (undefined2)local_38;
*(undefined2 *)((int)puVar6 + 0x1a) = (undefined2)local_30;
*(char *)((int)puVar6 + 0x1f) = '\a';
*(char *)((int)puVar6 + 0x23) = '$';
*(undefined2 *)(puVar6 + 9) = 0xffff;
*(undefined2 *)((int)puVar6 + 0x26) = 0xffff;
*(undefined2 *)(puVar6 + 0xb) = 0xffff;
*(undefined2 *)((int)puVar6 + 0x2e) = 0xffff;
*(undefined2 *)(puVar6 + 0xd) = 0xffff;
*(undefined2 *)((int)puVar6 + 0x36) = 0xffff;
*(undefined2 *)((int)puVar6 + 0x32) = 0x40;
pDVar3 = current;
if ((flags & 4) == 0) {
*puVar6 = *puVar6 & 0xff000000 | *current->ot & 0xffffff;
*pDVar3->ot = *pDVar3->ot & 0xff000000 | (uint)puVar6 & 0xffffff;
puVar6[7] = puVar6[7] & 0xff000000 | *pDVar3->ot & 0xffffff;
*pDVar3->ot = *pDVar3->ot & 0xff000000 | (uint)(puVar6 + 7) & 0xffffff;
pDVar3->primptr = pDVar3->primptr + 0x3c;
}
else {
DrawPrim(puVar6 + 7);
DrawPrim(puVar6);
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawPlayerDot(struct VECTOR *pos /*$a1*/, short rot /*$s2*/, unsigned char r /*$s5*/, unsigned char g /*$s4*/, int b /*stack 16*/, unsigned long flags /*stack 20*/)
// line 883, offset 0x00016814
/* begin block 1 */
// Start line: 884
// Start offset: 0x00016814
// Variables:
// struct MATRIX matrix; // stack offset -168
// struct VECTOR direction; // stack offset -136
// struct SVECTOR apos[3]; // stack offset -120
// struct VECTOR opos[3]; // stack offset -96
// struct POLY_F3 *poly; // $t0
// struct VECTOR vec; // stack offset -48
/* end block 1 */
// End offset: 0x00016AC4
// End Line: 946
/* begin block 2 */
// Start line: 1812
/* end block 2 */
// End Line: 1813
/* begin block 3 */
// Start line: 1821
/* end block 3 */
// End Line: 1822
void DrawPlayerDot(VECTOR *pos,short rot,uchar r,uchar g,int b,ulong flags)
{
DB *pDVar1;
int iVar2;
int iVar3;
uint *puVar4;
short local_60;
short local_58;
short local_50;
short local_48;
short local_40;
short local_38;
VECTOR local_30;
if ((flags & 0x20) == 0) {
if ((flags & 8) == 0) {
if ((flags & 1) == 0) {
WorldToFullscreenMap2(pos,&local_30);
}
else {
WorldToOverheadMapPositions(pos,&local_30,1,'\0',0);
if (0x5e < local_30.vx - 0xe9U) {
return;
}
if (local_30.vz < 0xae) {
return;
}
if (0xfa < local_30.vz) {
return;
}
}
}
else {
local_30.vx = pos->vx;
local_30.vy = pos->vy;
local_30.vz = pos->vz;
local_30.pad = pos->pad;
}
if ((flags & 1) == 0) {
local_30.vx = local_30.vx + map_x_offset;
local_30.vz = local_30.vz + map_z_offset;
}
}
else {
WorldToMultiplayerMap(pos,&local_30);
local_30.vx = local_30.vx + 0xf0;
local_30.vz = local_30.vz + 0x60;
}
iVar2 = (int)rcossin_tbl[((int)rot & 0xfffU) * 2];
iVar3 = (int)rcossin_tbl[((int)rot & 0xfffU) * 2 + 1];
local_40 = (short)local_30.vx;
local_60 = local_40 + (short)(iVar2 * -3 + 0x800 >> 0xc);
local_38 = (short)local_30.vz;
local_58 = local_38 + (short)(iVar3 * -3 + 0x800 >> 0xc);
local_50 = local_40 + (short)(iVar2 * 3 + iVar3 * -2 + 0x800 >> 0xc);
local_48 = local_38 + (short)(iVar3 * 3 + iVar2 * 2 + 0x800 >> 0xc);
local_40 = local_40 + (short)(iVar3 * 2 + iVar2 * 3 + 0x800 >> 0xc);
local_38 = local_38 + (short)(iVar2 * -2 + iVar3 * 3 + 0x800 >> 0xc);
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\x04';
*(char *)((int)puVar4 + 7) = ' ';
*(uchar *)(puVar4 + 1) = r;
*(uchar *)((int)puVar4 + 5) = g;
*(char *)((int)puVar4 + 6) = (char)b;
*(short *)(puVar4 + 2) = local_60;
*(short *)((int)puVar4 + 10) = local_58;
*(short *)(puVar4 + 3) = local_50;
*(short *)((int)puVar4 + 0xe) = local_48;
*(short *)(puVar4 + 4) = local_40;
*(short *)((int)puVar4 + 0x12) = local_38;
pDVar1 = current;
if ((flags & 4) == 0) {
*puVar4 = *puVar4 & 0xff000000 | *current->ot & 0xffffff;
*pDVar1->ot = *pDVar1->ot & 0xff000000 | (uint)puVar4 & 0xffffff;
pDVar1->primptr = pDVar1->primptr + 0x14;
}
else {
DrawPrim(puVar4);
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ ProcessOverlayLump(char *lump_ptr /*$s1*/, int lump_size /*$s0*/)
// line 954, offset 0x00016ae8
/* begin block 1 */
// Start line: 955
// Start offset: 0x00016AE8
// Variables:
// struct TEXTURE_DETAILS info; // stack offset -32
// int i; // $a1
// int x; // $v0
// int y; // $a0
/* end block 1 */
// End offset: 0x00016C0C
// End Line: 986
/* begin block 2 */
// Start line: 1982
/* end block 2 */
// End Line: 1983
void ProcessOverlayLump(char *lump_ptr,int lump_size)
{
uint uVar1;
SXYPAIR *pSVar2;
TEXTURE_DETAILS local_20;
GetTextureDetails(s_OVERHEAD_000103f4,&local_20);
MapTPage = local_20.tpageid;
MapClut = GetClut((int)mapclutpos.x,(int)mapclutpos.y);
uVar1 = 0;
pSVar2 = &MapSegmentPos;
MapRect.w = 0x40;
MapRect.h = 0x100;
MapRect.x = (short)(((uint)MapTPage & 0xf) << 6);
MapRect.y = (short)(((uint)MapTPage & 0x10) << 4);
do {
pSVar2->x = (short)((int)((uVar1 & 3) * 0x20 + (uint)local_20.coords.u0) >> 2);
pSVar2->y = (ushort)local_20.coords.v0 + (short)((int)uVar1 >> 2) * 0x20;
uVar1 = uVar1 + 1;
pSVar2 = pSVar2 + 1;
} while ((int)uVar1 < 0x10);
MapBitMaps = mallocptr;
memcpy(mallocptr,lump_ptr,lump_size);
mallocptr = mallocptr + lump_size;
LoadImage(&mapclutpos,MapBitMaps + 0x200);
DrawSync(0);
return;
}
// decompiled code
// original method signature:
// unsigned long /*$ra*/ Long2DDistance(struct VECTOR *pPoint1 /*$a0*/, struct VECTOR *pPoint2 /*$a2*/)
// line 994, offset 0x00016c0c
/* begin block 1 */
// Start line: 995
// Start offset: 0x00016C0C
// Variables:
// struct VECTOR delta; // stack offset -24
// unsigned int result; // $v0
/* begin block 1.1 */
// Start line: 1001
// Start offset: 0x00016C50
// Variables:
// int Theta; // $v1
// int tempTheta; // $v0
/* begin block 1.1.1 */
// Start line: 1009
// Start offset: 0x00016C70
// Variables:
// int cos; // $v1
/* end block 1.1.1 */
// End offset: 0x00016C9C
// End Line: 1017
/* begin block 1.1.2 */
// Start line: 1022
// Start offset: 0x00016CA4
// Variables:
// int sin; // $v1
/* end block 1.1.2 */
// End offset: 0x00016D04
// End Line: 1032
/* end block 1.1 */
// End offset: 0x00016D04
// End Line: 1033
/* end block 1 */
// End offset: 0x00016D14
// End Line: 1036
/* begin block 2 */
// Start line: 2090
/* end block 2 */
// End Line: 2091
/* begin block 3 */
// Start line: 2099
/* end block 3 */
// End Line: 2100
ulong Long2DDistance(VECTOR *pPoint1,VECTOR *pPoint2)
{
short sVar1;
uint uVar2;
int iVar3;
int iVar4;
ulong uVar5;
iVar4 = pPoint1->vx - pPoint2->vx;
if (iVar4 < 0) {
iVar4 = pPoint2->vx - pPoint1->vx;
}
iVar3 = pPoint1->vz - pPoint2->vz;
if (iVar3 < 0) {
iVar3 = pPoint2->vz - pPoint1->vz;
}
uVar2 = ratan2();
if ((uVar2 & 0x7ff) - 0x200 < 0x401) {
sVar1 = rcossin_tbl[(uVar2 & 0xfff) * 2];
iVar4 = iVar3;
}
else {
sVar1 = rcossin_tbl[(uVar2 & 0xfff) * 2 + 1];
}
iVar3 = (int)sVar1;
if (iVar4 < 0x80000) {
uVar5 = (iVar4 << 0xc) / iVar3;
if (iVar3 == 0) {
trap(7);
}
}
else {
if (iVar3 == 0) {
trap(7);
}
uVar5 = (iVar4 << 9) / iVar3 << 3;
}
return uVar5;
}
// decompiled code
// original method signature:
// void /*$ra*/ InitOverheadMap()
// line 1043, offset 0x000197bc
/* begin block 1 */
// Start line: 1045
// Start offset: 0x000197BC
// Variables:
// int tpage; // $s3
// int c; // $s2
// int d; // $s1
/* end block 1 */
// End offset: 0x000198BC
// End Line: 1070
/* begin block 2 */
// Start line: 2086
/* end block 2 */
// End Line: 2087
/* begin block 3 */
// Start line: 5402
/* end block 3 */
// End Line: 5403
/* begin block 4 */
// Start line: 5405
/* end block 4 */
// End Line: 5406
/* WARNING: Unknown calling convention yet parameter storage is locked */
void InitOverheadMap(void)
{
char *pcVar1;
int iVar2;
int iVar3;
int iVar4;
int tpage;
int iVar5;
iVar4 = 0;
if (gMultiplayerLevels == 0) {
SetMapPos();
tilehnum = overlaidmaps[GameLevel].width;
if (tilehnum < 0) {
tilehnum = tilehnum + 0x1f;
}
tilehnum = tilehnum >> 5;
iVar3 = 0;
do {
iVar2 = 0;
iVar5 = iVar3 + 1;
pcVar1 = &maptile + iVar3;
tpage = iVar4;
do {
*pcVar1 = (char)tpage;
iVar4 = tpage + 1;
pcVar1 = pcVar1 + 4;
LoadMapTile(tpage,(x_map >> 5) + iVar2,(y_map >> 5) + iVar3);
iVar2 = iVar2 + 1;
tpage = iVar4;
} while (iVar2 < 4);
iVar3 = iVar5;
} while (iVar5 < 4);
old_x_mod = x_map & 0x1f;
old_y_mod = y_map & 0x1f;
}
else {
InitMultiplayerMap();
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawOverheadMap()
// line 1077, offset 0x00016d14
/* begin block 1 */
// Start line: 1079
// Start offset: 0x00016D14
// Variables:
// int width; // $t5
// int height; // $t4
// int count; // $s2
// int count1; // $s3
// int tpage; // $t1
// int x_mod; // $s5
// int y_mod; // $fp
// int MeshWidth; // $s6
// int MeshHeight; // $s7
// long flag; // stack offset -104
// struct SVECTOR MapMesh[5][5]; // stack offset -784
// struct VECTOR MapMeshO[5][5]; // stack offset -584
// struct MAPTEX MapTex[4]; // stack offset -184
// struct SVECTOR direction; // stack offset -152
// struct POLY_FT4 *spt; // $a3
// struct POLY_F4 *sptb; // $a0
// struct DR_AREA *draw_area; // $s2
// struct RECT clipped_size; // stack offset -144
// struct VECTOR translate; // stack offset -136
/* begin block 1.1 */
// Start line: 1112
// Start offset: 0x00016E24
// Variables:
// static int ptab[16]; // offset 0x118
/* end block 1.1 */
// End offset: 0x00016E24
// End Line: 1113
/* begin block 1.2 */
// Start line: 1125
// Start offset: 0x00016EF8
// Variables:
// static int ptab[12]; // offset 0x158
// int intens; // $a1
/* end block 1.2 */
// End offset: 0x00016FA8
// End Line: 1135
/* begin block 1.3 */
// Start line: 1139
// Start offset: 0x00016FA8
/* begin block 1.3.1 */
// Start line: 1139
// Start offset: 0x00016FA8
// Variables:
// struct VECTOR vec; // stack offset -120
// struct TILE_1 *tile1; // $a0
/* end block 1.3.1 */
// End offset: 0x000170F4
// End Line: 1142
/* end block 1.3 */
// End offset: 0x000170F4
// End Line: 1142
/* begin block 1.4 */
// Start line: 1146
// Start offset: 0x000170F4
// Variables:
// struct _CAR_DATA *cp; // $s0
/* end block 1.4 */
// End offset: 0x00017218
// End Line: 1161
/* begin block 1.5 */
// Start line: 1168
// Start offset: 0x00017240
/* end block 1.5 */
// End offset: 0x00017240
// End Line: 1170
/* begin block 1.6 */
// Start line: 1185
// Start offset: 0x000172C0
/* end block 1.6 */
// End offset: 0x000172C0
// End Line: 1187
/* begin block 1.7 */
// Start line: 1202
// Start offset: 0x0001734C
/* end block 1.7 */
// End offset: 0x0001734C
// End Line: 1204
/* begin block 1.8 */
// Start line: 1219
// Start offset: 0x000173E0
/* end block 1.8 */
// End offset: 0x000173E0
// End Line: 1221
/* end block 1 */
// End offset: 0x00017C00
// End Line: 1367
/* begin block 2 */
// Start line: 2231
/* end block 2 */
// End Line: 2232
/* begin block 3 */
// Start line: 2273
/* end block 3 */
// End Line: 2274
/* begin block 4 */
// Start line: 2274
/* end block 4 */
// End Line: 2275
/* begin block 5 */
// Start line: 2286
/* end block 5 */
// End Line: 2287
/* WARNING: Could not reconcile some variable overlaps */
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DrawOverheadMap(void)
{
byte bVar1;
undefined2 uVar2;
short sVar3;
short sVar4;
ushort uVar5;
ushort uVar6;
DB *pDVar7;
char cVar8;
short *psVar9;
byte *pbVar10;
short *psVar11;
int x;
short *psVar12;
int y;
short *psVar13;
int iVar14;
undefined2 *puVar15;
short *psVar16;
undefined2 *puVar17;
short *psVar18;
char cVar19;
short *psVar20;
char cVar21;
short *psVar22;
_CAR_DATA *p_Var23;
char *pcVar24;
byte *pbVar25;
char *pcVar26;
undefined *puVar27;
uint *puVar28;
int r;
int iVar29;
uint uVar30;
int iVar31;
uint uVar32;
short local_310 [2];
short local_30c [4];
short local_304 [4];
undefined auStack764 [8];
short local_2f4 [4];
short local_2ec [2];
short local_2e8 [20];
short asStack704 [20];
short local_298 [20];
short local_270 [20];
undefined local_248 [88];
undefined2 local_1f0 [156];
short local_b8;
short local_b6;
short local_b4 [5];
ushort local_aa;
undefined2 local_a8;
ushort local_a6;
undefined2 local_a4;
ushort local_a2;
undefined2 local_a0;
short local_9e;
undefined2 local_9c;
short local_9a;
SVECTOR local_98;
undefined2 local_90;
short local_8e;
undefined2 local_8c;
undefined2 local_8a;
undefined4 local_88;
undefined4 local_84;
undefined4 local_80;
undefined4 local_7c;
int local_78;
int local_70;
undefined auStack104 [4];
SVECTOR *local_64;
short *local_60;
undefined2 *local_5c;
undefined4 *local_58;
short *local_54;
short *local_50;
short *local_4c;
int local_48;
undefined *local_44;
short *local_40;
short *local_3c;
short *local_38;
short *local_34;
uint local_30;
short *local_2c;
local_88 = DAT_00010400;
local_84 = DAT_00010404;
local_80 = DAT_00010408;
local_7c = DAT_0001040c;
if (gMultiplayerLevels != 0) {
DrawMultiplayerMap();
return;
}
if (1 < NumPlayers) {
return;
}
SetMapPos();
uVar30 = x_map & 0x1f;
uVar32 = y_map & 0x1f;
draw_box();
if (0 < player_position_known) {
if ((int)player.playerCarId < 0) {
psVar9 = &pedestrianFelony;
}
else {
psVar9 = &car_data[(int)player.playerCarId].felonyRating;
}
if (0x292 < *psVar9) {
FlashOverheadMap(*(int *)(&DAT_0009baac + (CameraCnt & 0xfU) * 4),0,
*(int *)(&DAT_0009baac + (CameraCnt + 8U & 0xf) * 4));
goto LAB_00016fac;
}
}
if (player_position_known == -1) {
if (flashtimer == 0) {
if ((int)player.playerCarId < 0) {
psVar9 = &pedestrianFelony;
}
else {
psVar9 = &car_data[(int)player.playerCarId].felonyRating;
}
if (0x292 < *psVar9) {
flashtimer = 0x30;
}
goto LAB_00016ee8;
}
}
else {
LAB_00016ee8:
if (flashtimer == 0) goto LAB_00016fac;
}
flashtimer = flashtimer + -1;
r = -flashtimer;
x = r + 0x2f;
if (x < 0) {
x = r + 0x32;
}
y = r + 0x30;
if (y < 0) {
y = r + 0x33;
}
iVar14 = r + 0x31;
if (iVar14 < 0) {
iVar14 = r + 0x34;
}
iVar29 = r + 0x32;
if (iVar29 < 0) {
iVar29 = r + 0x35;
}
r = (&DAT_0009baec)[x >> 2] + (&DAT_0009baec)[y >> 2] + (&DAT_0009baec)[iVar14 >> 2] +
(&DAT_0009baec)[iVar29 >> 2];
if (r < 0) {
r = r + 3;
}
r = r >> 2;
FlashOverheadMap(r,r,r);
LAB_00016fac:
puVar28 = (uint *)current->primptr;
SetDrawArea(puVar28,&current->draw);
pDVar7 = current;
*puVar28 = *puVar28 & 0xff000000 | *current->ot & 0xffffff;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)puVar28 & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0xc;
WorldToOverheadMapPositions((VECTOR *)&player,(VECTOR *)&local_78,1,'\0',0);
if (((local_78 - 0xe9U < 0x5f) && (0xad < local_70)) && (local_70 < 0xfb)) {
puVar28 = (uint *)current->primptr;
*(char *)((int)puVar28 + 3) = '\x02';
*(char *)((int)puVar28 + 7) = 'h';
*(char *)(puVar28 + 1) = -1;
*(char *)((int)puVar28 + 5) = -1;
*(char *)((int)puVar28 + 6) = -1;
pDVar7 = current;
*(undefined2 *)(puVar28 + 2) = (undefined2)local_78;
*(undefined2 *)((int)puVar28 + 10) = (undefined2)local_70;
*puVar28 = *puVar28 & 0xff000000 | *pDVar7->ot & 0xffffff;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)puVar28 & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0xc;
}
DrawTargetBlip((VECTOR *)&player,'@','@','@',3);
DrawCompass();
DrawOverheadTargets();
p_Var23 = car_data;
local_30 = (uint)(uVar32 < 0x11);
local_54 = local_310;
local_38 = local_2e8;
sVar3 = -(short)uVar30;
local_34 = asStack704;
local_2c = local_298;
local_60 = local_270;
local_50 = local_30c;
local_4c = local_304;
local_48 = -uVar32;
local_44 = auStack764;
local_40 = local_2f4;
local_3c = local_2ec;
local_64 = &local_98;
local_58 = &local_88;
local_5c = &local_90;
do {
if (((p_Var23->controlType == '\x03') && (p_Var23->ai[0x13] == 0)) ||
((p_Var23->controlFlags & 1) != 0)) {
DrawSightCone(&copSightData,(VECTOR *)(p_Var23->hd).where.t,(p_Var23->hd).direction);
}
p_Var23 = p_Var23 + 1;
} while (p_Var23 < (_CAR_DATA *)0xd4698);
if ((uVar30 < 0x10) && (0x10 < old_x_mod)) {
r = 0;
pcVar24 = &maptile;
pbVar25 = &DAT_000aba60;
do {
bVar1 = *pcVar24;
x = x_map >> 5;
y = y_map >> 5;
*pcVar24 = pbVar25[-4];
y = y + r;
pbVar25[-4] = *pbVar25;
r = r + 1;
*pbVar25 = ((byte *)pcVar24)[0xc];
((byte *)pcVar24)[0xc] = bVar1;
LoadMapTile((uint)bVar1,x + 3,y);
pcVar24 = (char *)((byte *)pcVar24 + 1);
pbVar25 = pbVar25 + 1;
} while (r < 4);
}
if ((0x10 < uVar30) && (old_x_mod < 0x10)) {
r = 0;
pcVar24 = &maptile;
pbVar25 = &DAT_000aba64;
do {
pbVar10 = &DAT_000aba5c + r;
bVar1 = *pbVar25;
x = x_map >> 5;
y = (y_map >> 5) + r;
*pbVar25 = (&DAT_000aba60)[r];
pbVar25 = pbVar25 + 1;
(&DAT_000aba60)[r] = *pbVar10;
r = r + 1;
*pbVar10 = *pcVar24;
*pcVar24 = bVar1;
LoadMapTile((uint)bVar1,x,y);
pcVar24 = (char *)((byte *)pcVar24 + 1);
} while (r < 4);
}
if ((uVar32 < 0x10) && (0x10 < old_y_mod)) {
r = 0;
pcVar24 = &maptile;
pcVar26 = &CHAR____000aba59;
do {
iVar14 = r * 4;
bVar1 = *pcVar24;
x = (x_map >> 5) + r;
y = y_map >> 5;
*pcVar24 = *pcVar26;
r = r + 1;
*pcVar26 = (&CHAR____000aba5a)[iVar14];
pcVar26 = (char *)((byte *)pcVar26 + 4);
(&CHAR____000aba5a)[iVar14] = ((byte *)pcVar24)[3];
((byte *)pcVar24)[3] = bVar1;
LoadMapTile((uint)bVar1,x,y + 3);
pcVar24 = (char *)((byte *)pcVar24 + 4);
} while (r < 4);
}
if ((local_30 == 0) && (old_y_mod < 0x10)) {
r = 0;
pcVar24 = &maptile;
pcVar26 = &CHAR____000aba5b;
do {
iVar14 = r * 4;
bVar1 = *pcVar26;
x = (x_map >> 5) + r;
y = y_map >> 5;
*pcVar26 = (&CHAR____000aba5a)[iVar14];
pcVar26 = (char *)((byte *)pcVar26 + 4);
(&CHAR____000aba5a)[iVar14] = (&CHAR____000aba59)[iVar14];
r = r + 1;
(&CHAR____000aba59)[iVar14] = *pcVar24;
*pcVar24 = bVar1;
LoadMapTile((uint)bVar1,x,y);
pcVar24 = (char *)((byte *)pcVar24 + 4);
} while (r < 4);
}
r = 3;
if (uVar30 != 0) {
r = 4;
}
x = 3;
if (uVar32 != 0) {
x = 4;
}
iVar14 = 0;
y = 0;
sVar4 = (short)local_48;
psVar9 = local_34;
psVar16 = local_2c;
psVar18 = local_60;
psVar20 = local_54;
psVar22 = local_38;
old_x_mod = uVar30;
old_y_mod = uVar32;
do {
psVar12 = (short *)(local_44 + y);
psVar11 = (short *)((int)local_4c + y);
psVar13 = (short *)((int)local_40 + y);
iVar14 = iVar14 + 1;
*psVar20 = -0x23;
*psVar22 = sVar3 + -0x10;
psVar22 = psVar22 + 4;
psVar20 = psVar20 + 4;
*psVar9 = sVar3 + 0x10;
*psVar16 = sVar3 + 0x30;
*psVar18 = 0x23;
psVar18 = psVar18 + 4;
psVar16 = psVar16 + 4;
psVar9 = psVar9 + 4;
*(undefined2 *)((int)local_50 + y) = 0xffdd;
puVar15 = (undefined2 *)((int)local_3c + y);
y = y + 0x28;
*psVar11 = sVar4 + -0x10;
*psVar12 = sVar4 + 0x10;
*psVar13 = sVar4 + 0x30;
*puVar15 = 0x23;
} while (iVar14 < 5);
local_b8 = local_310[0] - local_2e8[0];
if ((int)local_310[0] - (int)local_2e8[0] < 0) {
local_b8 = local_2e8[0] - local_310[0];
}
local_b8 = 0x20 - local_b8;
local_b6 = local_310[0] - local_2e8[0];
if ((int)local_310[0] - (int)local_2e8[0] < 0) {
local_b6 = local_2e8[0] - local_310[0];
}
local_b4[3] = (ushort)(byte)tile_size;
local_b4[2] = 0;
local_a8 = 0;
local_a0 = 0;
local_a6 = (ushort)(byte)tile_size;
if ((int)local_298[0] - (int)local_270[0] < 0) {
local_9e = local_270[0] - local_298[0];
}
else {
local_9e = local_298[0] - local_270[0];
}
if ((int)local_30c[0] - (int)local_304[0] < 0) {
local_b4[0] = local_304[0] - local_30c[0];
}
else {
local_b4[0] = local_30c[0] - local_304[0];
}
local_b4[0] = 0x20 - local_b4[0];
local_b4[1] = local_30c[0] - local_304[0];
if ((int)local_30c[0] - (int)local_304[0] < 0) {
local_b4[1] = local_304[0] - local_30c[0];
}
local_aa = (ushort)(byte)tile_size;
local_b4[4] = 0;
local_a4 = 0;
local_9c = 0;
local_a2 = (ushort)(byte)tile_size;
if ((int)local_2f4[0] - (int)local_2ec[0] < 0) {
local_9a = local_2ec[0] - local_2f4[0];
}
else {
local_9a = local_2f4[0] - local_2ec[0];
}
local_98.vx = 0;
local_98.vz = 0;
local_98.vy = (ushort)player.dir & 0xfff;
RotMatrixXYZ(&map_matrix,local_64);
MulMatrix0(&aspect,&map_matrix,&map_matrix);
setCopControlWord(2,0,map_matrix.m[0]._0_4_);
setCopControlWord(2,0x800,map_matrix.m._4_4_);
setCopControlWord(2,0x1000,map_matrix.m[1]._2_4_);
setCopControlWord(2,0x1800,map_matrix.m[2]._0_4_);
setCopControlWord(2,0x2000,map_matrix._16_4_);
setCopControlWord(2,0x2800,*local_58);
setCopControlWord(2,0x3000,local_58[1]);
setCopControlWord(2,0x3800,local_58[2]);
y = 0;
do {
iVar29 = y + 1;
puVar27 = local_248 + y * 0x50;
iVar14 = x + 1;
psVar9 = local_54 + y * 0x14;
do {
RotTrans(psVar9,puVar27,auStack104);
puVar27 = puVar27 + 0x10;
iVar14 = iVar14 + -1;
psVar9 = psVar9 + 4;
} while (iVar14 != 0);
y = iVar29;
} while (iVar29 <= r);
y = 0;
if (x != 0) {
do {
iVar14 = 0;
iVar29 = y + 1;
if (r != 0) {
pbVar25 = (byte *)(&maptile + y);
iVar31 = 0;
puVar17 = local_1f0 + iVar29 * 8;
puVar15 = local_1f0 + y * 8;
psVar9 = &local_b6;
do {
if (((&MapSegmentPos)[*pbVar25].x & 0x18U) == 0x18) {
cVar21 = (char)*psVar9 + -1;
}
else {
cVar21 = (char)*psVar9;
}
if (((&MapSegmentPos)[*pbVar25].y & 0x60U) == 0x60) {
cVar19 = (char)local_b4[y * 4 + 1] + -1;
}
else {
cVar19 = (char)local_b4[y * 4 + 1];
}
puVar28 = (uint *)current->primptr;
*(char *)((int)puVar28 + 3) = '\t';
*(char *)((int)puVar28 + 7) = ',';
cVar8 = 'd';
if (gTimeOfDay == 3) {
cVar8 = '2';
}
*(char *)(puVar28 + 1) = cVar8;
*(char *)((int)puVar28 + 5) = cVar8;
*(char *)((int)puVar28 + 6) = cVar8;
*(byte *)((int)puVar28 + 7) = *(byte *)((int)puVar28 + 7) | 2;
uVar6 = MapClut;
*(undefined2 *)(puVar28 + 2) = puVar15[-0x2c];
*(undefined2 *)((int)puVar28 + 10) = puVar15[-0x28];
*(undefined2 *)(puVar28 + 4) = puVar15[-4];
*(undefined2 *)((int)puVar28 + 0x12) = *puVar15;
*(undefined2 *)(puVar28 + 6) = puVar17[-0x2c];
*(undefined2 *)((int)puVar28 + 0x1a) = puVar17[-0x28];
uVar5 = MapTPage;
pcVar24 = (char *)((int)&local_b8 + iVar31);
*(undefined2 *)(puVar28 + 8) = puVar17[-4];
uVar2 = *puVar17;
*(ushort *)((int)puVar28 + 0xe) = uVar6;
*(ushort *)((int)puVar28 + 0x16) = uVar5;
*(undefined2 *)((int)puVar28 + 0x22) = uVar2;
psVar16 = local_b4 + y * 4;
*(char *)(puVar28 + 3) = *pcVar24 + *(char *)&(&MapSegmentPos)[*pbVar25].x * '\x04';
*(char *)((int)puVar28 + 0xd) = *(char *)psVar16 + *(char *)&(&MapSegmentPos)[*pbVar25].y;
*(char *)(puVar28 + 5) =
*pcVar24 + *(char *)&(&MapSegmentPos)[*pbVar25].x * '\x04' + cVar21;
*(char *)((int)puVar28 + 0x15) = *(char *)psVar16 + *(char *)&(&MapSegmentPos)[*pbVar25].y
;
iVar31 = iVar31 + 8;
*(char *)(puVar28 + 7) = *pcVar24 + *(char *)&(&MapSegmentPos)[*pbVar25].x * '\x04';
psVar9 = psVar9 + 4;
*(char *)((int)puVar28 + 0x1d) =
*(char *)psVar16 + *(char *)&(&MapSegmentPos)[*pbVar25].y + cVar19;
iVar14 = iVar14 + 1;
*(char *)(puVar28 + 9) =
*pcVar24 + *(char *)&(&MapSegmentPos)[*pbVar25].x * '\x04' + cVar21;
puVar15 = puVar15 + 0x28;
*(char *)((int)puVar28 + 0x25) =
*(char *)psVar16 + *(char *)&(&MapSegmentPos)[*pbVar25].y + cVar19;
pDVar7 = current;
puVar17 = puVar17 + 0x28;
*puVar28 = *puVar28 & 0xff000000 | *current->ot & 0xffffff;
pbVar25 = pbVar25 + 4;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)puVar28 & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0x28;
} while (iVar14 < r);
}
y = iVar29;
} while (iVar29 < x);
}
puVar28 = (uint *)current->primptr;
*(char *)((int)puVar28 + 3) = '\x05';
*(char *)(puVar28 + 1) = '<';
*(char *)((int)puVar28 + 5) = '<';
*(char *)((int)puVar28 + 6) = '<';
*(char *)((int)puVar28 + 7) = '*';
pDVar7 = current;
*(undefined2 *)((int)puVar28 + 10) = 0xb6;
*(undefined2 *)((int)puVar28 + 0xe) = 0xb6;
*(undefined2 *)(puVar28 + 2) = 0xf5;
*(undefined2 *)(puVar28 + 3) = 0x13b;
*(undefined2 *)(puVar28 + 4) = 0xf5;
*(undefined2 *)((int)puVar28 + 0x12) = 0xf2;
*(undefined2 *)(puVar28 + 5) = 0x13b;
*(undefined2 *)((int)puVar28 + 0x16) = 0xf2;
*puVar28 = *puVar28 & 0xff000000 | *pDVar7->ot & 0xffffff;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)puVar28 & 0xffffff;
pcVar24 = pDVar7->primptr;
pDVar7->primptr = pcVar24 + 0x28;
pcVar24[0x2b] = '\a';
pcVar24[0x2f] = '$';
*(undefined2 *)(pcVar24 + 0x30) = 0xffff;
*(undefined2 *)(pcVar24 + 0x32) = 0xffff;
*(undefined2 *)(pcVar24 + 0x38) = 0xffff;
*(undefined2 *)(pcVar24 + 0x3a) = 0xffff;
*(undefined2 *)(pcVar24 + 0x40) = 0xffff;
*(undefined2 *)(pcVar24 + 0x42) = 0xffff;
*(undefined2 *)(pcVar24 + 0x3e) = 0;
pDVar7 = current;
*(uint *)(pcVar24 + 0x28) = *(uint *)(pcVar24 + 0x28) & 0xff000000 | *current->ot & 0xffffff;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)(pcVar24 + 0x28) & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0x20;
local_90 = 0xfa;
local_8c = 0x3c;
local_8a = 0x3c;
local_8e = (pDVar7->draw).clip.y + 0xb6;
puVar28 = (uint *)pDVar7->primptr;
SetDrawArea(puVar28,local_5c);
pDVar7 = current;
*puVar28 = *puVar28 & 0xff000000 | *current->ot & 0xffffff;
*pDVar7->ot = *pDVar7->ot & 0xff000000 | (uint)puVar28 & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0xc;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawFullscreenMap()
// line 1374, offset 0x00017c30
/* begin block 1 */
// Start line: 1376
// Start offset: 0x00017C30
// Variables:
// struct TILE *polys; // $v0
// struct POLY_FT4 *back; // $a1
// struct POLY_FT3 *null; // $a2
// struct SVECTOR Mesh[4]; // stack offset -192
// struct VECTOR MeshO[4]; // stack offset -160
// struct VECTOR target; // stack offset -96
// long flag; // stack offset -64
// long count; // $s4
// int width; // stack offset -60
// int height; // stack offset -56
// int x; // $s7
// int y; // $s3
// int min_x; // $a0
// int max_x; // $v0
// int min_y; // $v1
// int max_y; // $v1
/* begin block 1.1 */
// Start line: 1439
// Start offset: 0x00017E30
// Variables:
// int px; // $a2
// int pz; // $a1
/* end block 1.1 */
// End offset: 0x00017F88
// End Line: 1500
/* begin block 1.2 */
// Start line: 1554
// Start offset: 0x00017FF4
// Variables:
// int clipped; // $s5
/* end block 1.2 */
// End offset: 0x00018210
// End Line: 1606
/* begin block 1.3 */
// Start line: 1620
// Start offset: 0x000182B0
/* begin block 1.3.1 */
// Start line: 1620
// Start offset: 0x000182B0
// Variables:
// struct VECTOR vec; // stack offset -80
// struct TILE_1 *tile1; // $v1
/* end block 1.3.1 */
// End offset: 0x000182B0
// End Line: 1620
/* end block 1.3 */
// End offset: 0x000182B0
// End Line: 1620
/* end block 1 */
// End offset: 0x000183E8
// End Line: 1637
/* begin block 2 */
// Start line: 3464
/* end block 2 */
// End Line: 3465
/* begin block 3 */
// Start line: 3465
/* end block 3 */
// End Line: 3466
/* begin block 4 */
// Start line: 3475
/* end block 4 */
// End Line: 3476
/* WARNING: Could not reconcile some variable overlaps */
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DrawFullscreenMap(void)
{
ushort uVar1;
short sVar2;
char *pcVar3;
int iVar4;
int iVar5;
uint uVar6;
uint *puVar7;
uint *puVar8;
short *psVar9;
int y;
int iVar10;
int x;
short local_c0;
undefined2 local_be;
short local_bc;
short local_b8;
undefined2 local_b6;
short local_b4;
short local_b0;
undefined2 local_ae;
short local_ac;
short local_a8;
undefined2 local_a6;
short local_a4;
uint local_a0 [2];
uint local_98 [2];
undefined2 local_90;
undefined2 local_88;
undefined2 local_80;
undefined2 local_78;
undefined2 local_70;
undefined2 local_68;
VECTOR local_60;
int local_50;
long local_4c;
int local_48;
long local_44;
undefined auStack64 [4];
int local_3c;
int local_38;
int local_34;
VECTOR *local_30;
if ((Pads[0].dirnew & 0x20) != 0) {
map_x_offset = 0;
map_z_offset = 0;
map_x_shift = 0;
map_z_shift = 0;
gUseRotatedMap = gUseRotatedMap ^ 1;
}
SetFullscreenMapMatrix();
pcVar3 = current->primptr;
pcVar3[3] = '\x03';
pcVar3[7] = '`';
pcVar3[4] = '\0';
pcVar3[5] = '\0';
pcVar3[6] = '\0';
*(undefined2 *)(pcVar3 + 8) = 0;
*(undefined2 *)(pcVar3 + 10) = 0;
*(undefined2 *)(pcVar3 + 0xc) = 0x140;
*(undefined2 *)(pcVar3 + 0xe) = 0x100;
DrawPrim(pcVar3);
DrawSync(0);
local_3c = overlaidmaps[GameLevel].width;
local_38 = overlaidmaps[GameLevel].height;
WorldToFullscreenMap((VECTOR *)&player,&player_position);
if (gUseRotatedMap != 0) {
if ((Pads[0].direct & 0x8000) == 0) {
if ((Pads[0].direct & 0x2000) != 0) {
map_x_offset = map_x_offset + -8;
}
}
else {
map_x_offset = map_x_offset + 8;
}
if ((Pads[0].direct & 0x1000) == 0) {
if ((Pads[0].direct & 0x4000) != 0) {
map_z_offset = map_z_offset + -8;
}
}
else {
map_z_offset = map_z_offset + 8;
}
if (map_x_offset < -0x80) {
map_x_offset = -0x80;
}
if (0x80 < map_x_offset) {
map_x_offset = 0x80;
}
if (map_z_offset < -0x80) {
map_z_offset = -0x80;
}
if (0x80 < map_z_offset) {
map_z_offset = 0x80;
}
map_x_shift = 0;
map_z_shift = 0;
goto LAB_00017f8c;
}
map_x_offset = (player_position.vx + 0xa0) - local_3c;
if ((player_position.vx + 0xa0 <= local_3c) &&
(map_x_offset = player_position.vx + -0xa0, -1 < map_x_offset)) {
map_x_offset = 0;
}
map_z_offset = (player_position.vz + 0x80) - local_38;
if ((player_position.vz + 0x80 <= local_38) &&
(map_z_offset = player_position.vz + -0x80, -1 < map_z_offset)) {
map_z_offset = 0;
}
if ((Pads[0].direct & 0x8000) == 0) {
if (((Pads[0].direct & 0x2000) != 0) &&
(iVar5 = map_x_shift + -8,
((player_position.vx - map_x_offset) + 0xa0) - map_x_shift < local_3c)) goto LAB_00017f0c;
}
else {
iVar5 = map_x_shift + 8;
if (0 < ((player_position.vx - map_x_offset) + -0xa0) - map_x_shift) {
LAB_00017f0c:
map_x_shift = iVar5;
}
}
if ((Pads[0].direct & 0x1000) == 0) {
if (((Pads[0].direct & 0x4000) != 0) &&
(iVar5 = map_z_shift + -8,
((player_position.vz - map_z_offset) + 0x80) - map_z_shift < local_38)) goto LAB_00017f64;
}
else {
iVar5 = map_z_shift + 8;
if (0 < ((player_position.vz - map_z_offset) + -0x80) - map_z_shift) {
LAB_00017f64:
map_z_shift = iVar5;
}
}
map_x_offset = map_x_offset + map_x_shift;
map_z_offset = map_z_offset + map_z_shift;
LAB_00017f8c:
pcVar3 = current->primptr;
pcVar3[3] = '\a';
pcVar3[7] = '$';
uVar1 = MapTPage;
*(undefined2 *)(pcVar3 + 8) = 0xffff;
*(undefined2 *)(pcVar3 + 10) = 0xffff;
*(undefined2 *)(pcVar3 + 0x10) = 0xffff;
*(undefined2 *)(pcVar3 + 0x12) = 0xffff;
*(undefined2 *)(pcVar3 + 0x18) = 0xffff;
*(undefined2 *)(pcVar3 + 0x1a) = 0xffff;
*(ushort *)(pcVar3 + 0x16) = uVar1;
DrawPrim(pcVar3);
DrawSync(0);
local_30 = &local_60;
iVar5 = 0;
while( true ) {
x = iVar5;
iVar5 = local_3c;
if (local_3c < 0) {
iVar5 = local_3c + 0x1f;
}
if (iVar5 >> 5 <= x) break;
local_34 = x + 1;
iVar5 = 0;
while( true ) {
y = iVar5;
iVar4 = local_38;
if (local_38 < 0) {
iVar4 = local_38 + 0x1f;
}
iVar10 = 0;
iVar5 = local_34;
if (iVar4 >> 5 <= y) break;
puVar8 = (uint *)local_98;
puVar7 = (uint *)local_a0;
psVar9 = &local_c0;
iVar5 = 3;
local_be = 0;
local_b6 = 0;
local_ae = 0;
local_a6 = 0;
local_c0 = (short)x * 0x20 - (short)player_position.vx;
local_b8 = local_c0 + 0x20;
local_bc = (short)y * 0x20 - (short)player_position.vz;
local_ac = local_bc + 0x20;
local_b4 = local_bc;
local_b0 = local_c0;
local_a8 = local_b8;
local_a4 = local_ac;
do {
RotTrans(psVar9,puVar7,auStack64);
*puVar7 = *puVar7 + map_x_offset;
uVar6 = *puVar8;
*puVar8 = uVar6 + map_z_offset;
if ((0x140 < *puVar7) || (0x100 < uVar6 + map_z_offset)) {
iVar10 = iVar10 + 1;
}
puVar8 = puVar8 + 4;
puVar7 = puVar7 + 4;
iVar5 = iVar5 + -1;
psVar9 = psVar9 + 4;
} while (-1 < iVar5);
iVar5 = y + 1;
if (iVar10 != 4) {
LoadMapTile(0,x,y);
pcVar3 = current->primptr;
pcVar3[3] = '\t';
pcVar3[4] = 'X';
pcVar3[5] = 'X';
pcVar3[6] = 'X';
pcVar3[7] = ',';
*(undefined2 *)(pcVar3 + 8) = (undefined2)local_a0[0];
*(undefined2 *)(pcVar3 + 10) = (undefined2)local_98[0];
*(undefined2 *)(pcVar3 + 0x10) = local_90;
*(undefined2 *)(pcVar3 + 0x12) = local_88;
*(undefined2 *)(pcVar3 + 0x18) = local_80;
*(undefined2 *)(pcVar3 + 0x1a) = local_78;
*(undefined2 *)(pcVar3 + 0x20) = local_70;
*(undefined2 *)(pcVar3 + 0x22) = local_68;
pcVar3[0xc] = (char)MapSegmentPos.x << 2;
pcVar3[0xd] = (char)MapSegmentPos.y;
pcVar3[0x14] = (char)MapSegmentPos.x * '\x04' + '\x1f';
pcVar3[0x15] = (char)MapSegmentPos.y;
pcVar3[0x1c] = (char)MapSegmentPos.x << 2;
pcVar3[0x1d] = (char)MapSegmentPos.y + '\x1f';
pcVar3[0x24] = (char)MapSegmentPos.x * '\x04' + '\x1f';
pcVar3[0x25] = (char)MapSegmentPos.y + '\x1f';
*(ushort *)(pcVar3 + 0xe) = MapClut;
DrawPrim(pcVar3);
DrawSync(0);
}
}
}
local_60.vx = 0xa0;
local_60.vz = 0x80;
DrawFullscreenTargets();
if (gUseRotatedMap == 0) {
DrawBigCompass(local_30,0);
}
else {
DrawBigCompass(local_30,player.dir);
}
DrawTargetBlip(local_30,'@','@','@',0xe);
local_44 = local_60.pad;
local_50 = local_60.vx + map_x_offset;
local_4c = local_60.vy;
local_48 = local_60.vz + map_z_offset;
pcVar3 = current->primptr;
pcVar3[3] = '\x02';
pcVar3[7] = 'h';
pcVar3[4] = -1;
pcVar3[5] = -1;
pcVar3[6] = -1;
*(undefined2 *)(pcVar3 + 8) = (undefined2)local_50;
*(undefined2 *)(pcVar3 + 10) = (undefined2)local_48;
DrawPrim(pcVar3);
pcVar3 = current->primptr;
pcVar3[3] = '\a';
pcVar3[7] = '$';
sVar2 = fonttpage;
*(undefined2 *)(pcVar3 + 8) = 0xffff;
*(undefined2 *)(pcVar3 + 10) = 0xffff;
*(undefined2 *)(pcVar3 + 0x10) = 0xffff;
*(undefined2 *)(pcVar3 + 0x12) = 0xffff;
*(undefined2 *)(pcVar3 + 0x18) = 0xffff;
*(undefined2 *)(pcVar3 + 0x1a) = 0xffff;
*(short *)(pcVar3 + 0x16) = sVar2;
DrawPrim(pcVar3);
DrawSync(0);
SetTextColour(-0x80,-0x80,-0x80);
PrintStringCentred(&DAT_00010410,0xe2);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawCopIndicators()
// line 1645, offset 0x000183e8
/* begin block 1 */
// Start line: 1647
// Start offset: 0x000183E8
// Variables:
// static int ft[16]; // offset 0x188
// struct _CAR_DATA *cp; // $s0
// int fade; // $s1
// int cc; // $s3
// int cs; // $s2
/* begin block 1.1 */
// Start line: 1662
// Start offset: 0x00018480
// Variables:
// int dx; // $a3
// int dz; // $a1
// int p; // $a1
// int q; // $a0
// int ap; // $v1
/* begin block 1.1.1 */
// Start line: 1670
// Start offset: 0x00018510
/* end block 1.1.1 */
// End offset: 0x00018568
// End Line: 1673
/* end block 1.1 */
// End offset: 0x00018568
// End Line: 1674
/* end block 1 */
// End offset: 0x000185A0
// End Line: 1676
/* begin block 2 */
// Start line: 4171
/* end block 2 */
// End Line: 4172
/* begin block 3 */
// Start line: 4180
/* end block 3 */
// End Line: 4181
/* begin block 4 */
// Start line: 4181
/* end block 4 */
// End Line: 4182
/* begin block 5 */
// Start line: 4190
/* end block 5 */
// End Line: 4191
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DrawCopIndicators(void)
{
short sVar1;
short sVar2;
int iVar3;
int iVar4;
int iVar5;
int iVar6;
_CAR_DATA *p_Var7;
p_Var7 = car_data;
sVar1 = rcossin_tbl[(player.dir & 0xfffU) * 2 + 1];
sVar2 = rcossin_tbl[(player.dir & 0xfffU) * 2];
do {
if ((p_Var7->controlType == '\x03') && (p_Var7->ai[0x13] == 0)) {
iVar6 = (p_Var7->hd).where.t[0] - player.pos[0];
iVar4 = (p_Var7->hd).where.t[2] - player.pos[2];
iVar5 = ((iVar6 * sVar1 - iVar4 * sVar2) + 0x800 >> 0xc) * 3;
if (iVar5 < 0) {
iVar5 = iVar5 + 3;
}
iVar5 = iVar5 >> 2;
iVar3 = iVar6 * sVar2 + iVar4 * sVar1 + 0x800 >> 0xc;
iVar4 = -iVar3;
iVar6 = iVar5;
if (iVar5 < 0) {
iVar6 = -iVar5;
}
if (iVar6 < iVar4) {
iVar5 = (iVar5 * 0x10a) / iVar4;
if (iVar4 == 0) {
trap(7);
}
if (0 < iVar3) {
iVar4 = iVar4 + 7;
}
iVar4 = (iVar4 >> 3) + 600;
if (iVar4 == 0) {
trap(7);
}
CopIndicator(iVar5 + 0xa0,0x3fff0 / iVar4);
}
}
p_Var7 = p_Var7 + 1;
} while (p_Var7 < (_CAR_DATA *)0xd4698);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ InitMultiplayerMap()
// line 1678, offset 0x000198e0
/* begin block 1 */
// Start line: 1680
// Start offset: 0x000198E0
// Variables:
// struct RECT rect; // stack offset -48
// char filename[32]; // stack offset -40
/* end block 1 */
// End offset: 0x00019994
// End Line: 1695
/* begin block 2 */
// Start line: 6693
/* end block 2 */
// End Line: 6694
/* begin block 3 */
// Start line: 6694
/* end block 3 */
// End Line: 6695
/* begin block 4 */
// Start line: 6697
/* end block 4 */
// End Line: 6698
/* WARNING: Unknown calling convention yet parameter storage is locked */
void InitMultiplayerMap(void)
{
int iVar1;
short local_30;
short local_2e;
undefined2 local_2c;
undefined2 local_2a;
char acStack40 [32];
if (MissionHeader->region != 0) {
sprintf(acStack40,s_MAPS_REG_d__d_00010428,MissionHeader->region,GameLevel);
iVar1 = FileExists(acStack40);
if (iVar1 != 0) {
Loadfile(acStack40,MapBitMaps);
local_2c = 0x10;
local_2a = 0x40;
local_30 = MapRect.x + MapSegmentPos.x;
local_2e = MapRect.y + MapSegmentPos.y;
LoadImage(&local_30,MapBitMaps);
DrawSync(0);
}
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawMultiplayerMap()
// line 1697, offset 0x000185a0
/* begin block 1 */
// Start line: 1699
// Start offset: 0x000185A0
// Variables:
// struct POLY_FT4 *poly; // $a2
// struct LINE_F2 *line2; // $s1
// struct VECTOR target; // stack offset -64
// int i; // $s3
// int y; // $s7
/* end block 1 */
// End offset: 0x00018980
// End Line: 1776
/* begin block 2 */
// Start line: 4309
/* end block 2 */
// End Line: 4310
/* begin block 3 */
// Start line: 4331
/* end block 3 */
// End Line: 4332
/* begin block 4 */
// Start line: 4332
/* end block 4 */
// End Line: 4333
/* begin block 5 */
// Start line: 4339
/* end block 5 */
// End Line: 4340
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DrawMultiplayerMap(void)
{
ushort uVar1;
ushort uVar2;
DB *pDVar3;
char cVar4;
ulong *puVar5;
uint *puVar6;
char *pcVar7;
_PLAYER *p_Var8;
int iVar9;
char *pcVar10;
uchar g;
uchar r;
int iVar11;
undefined2 uVar12;
int iVar13;
VECTOR local_40;
int local_30;
int local_2c;
map_x_offset = 0;
map_z_offset = 0;
iVar13 = 0x60;
if (NumPlayers == 1) {
iVar13 = 0xac;
}
if (MissionHeader->region != 0) {
iVar9 = 0;
DrawMultiplayerTargets();
local_2c = iVar13 + 0x40;
local_30 = iVar13 + -1;
if (NumPlayers != 0) {
p_Var8 = &player;
iVar11 = 0;
r = -1;
g = '\0';
do {
local_40.vx = p_Var8->pos[0];
local_40.vz = *(int *)((int)player.pos + iVar11 + 8);
iVar9 = iVar9 + 1;
local_40.vy = 0;
WorldToMultiplayerMap(&local_40,&local_40);
local_40.vx = local_40.vx + 0xf0;
local_40.vz = local_40.vz + iVar13;
DrawPlayerDot(&local_40,-*(short *)&p_Var8->dir,r,g,0,8);
p_Var8 = p_Var8 + 1;
iVar11 = iVar11 + 0x74;
r = r + '\x01';
g = g + -1;
} while (iVar9 < (int)(uint)NumPlayers);
}
puVar6 = (uint *)current->primptr;
*(char *)((int)puVar6 + 3) = '\t';
*(char *)((int)puVar6 + 7) = ',';
*(undefined2 *)(puVar6 + 2) = 0xf0;
uVar12 = (undefined2)iVar13;
*(undefined2 *)((int)puVar6 + 10) = uVar12;
*(undefined2 *)(puVar6 + 4) = 0x130;
*(undefined2 *)((int)puVar6 + 0x12) = uVar12;
*(undefined2 *)(puVar6 + 6) = 0xf0;
*(undefined2 *)(puVar6 + 8) = 0x130;
*(undefined2 *)((int)puVar6 + 0x1a) = (short)local_2c;
*(undefined2 *)((int)puVar6 + 0x22) = (short)local_2c;
*(char *)(puVar6 + 3) = (char)MapSegmentPos.x << 2;
*(char *)((int)puVar6 + 0xd) = (char)MapSegmentPos.y;
*(char *)(puVar6 + 5) = (char)MapSegmentPos.x * '\x04' + '?';
*(char *)((int)puVar6 + 0x15) = (char)MapSegmentPos.y;
*(char *)(puVar6 + 7) = (char)MapSegmentPos.x << 2;
*(char *)((int)puVar6 + 0x1d) = (char)MapSegmentPos.y + '?';
*(char *)(puVar6 + 9) = (char)MapSegmentPos.x * '\x04' + '?';
*(char *)((int)puVar6 + 0x25) = (char)MapSegmentPos.y + '?';
uVar2 = MapClut;
uVar1 = MapTPage;
*(char *)((int)puVar6 + 7) = '.';
*(ushort *)((int)puVar6 + 0xe) = uVar2;
*(ushort *)((int)puVar6 + 0x16) = uVar1;
cVar4 = 'd';
if (gTimeOfDay == 3) {
cVar4 = '2';
}
*(char *)(puVar6 + 1) = cVar4;
*(char *)((int)puVar6 + 5) = cVar4;
*(char *)((int)puVar6 + 6) = cVar4;
pDVar3 = current;
*puVar6 = *puVar6 & 0xff000000 | *current->ot & 0xffffff;
*pDVar3->ot = *pDVar3->ot & 0xff000000 | (uint)puVar6 & 0xffffff;
pcVar10 = pDVar3->primptr;
pcVar7 = pcVar10 + 0x28;
pDVar3->primptr = pcVar7;
SetLineF4(pcVar7);
*(undefined2 *)(pcVar10 + 0x30) = 0xef;
pcVar10[0x2c] = '\0';
pcVar10[0x2d] = '\0';
pcVar10[0x2e] = -0x80;
pDVar3 = current;
*(short *)(pcVar10 + 0x32) = (short)local_30;
*(undefined2 *)(pcVar10 + 0x34) = 0x130;
*(undefined2 *)(pcVar10 + 0x38) = 0x130;
*(short *)(pcVar10 + 0x36) = (short)local_30;
*(undefined2 *)(pcVar10 + 0x3c) = 0xf0;
*(short *)(pcVar10 + 0x3a) = (short)local_2c;
*(short *)(pcVar10 + 0x3e) = (short)local_2c;
*(uint *)(pcVar10 + 0x28) = *(uint *)(pcVar10 + 0x28) & 0xff000000 | pDVar3->ot[1] & 0xffffff;
puVar5 = pDVar3->ot;
puVar5[1] = puVar5[1] & 0xff000000 | (uint)pcVar7 & 0xffffff;
SetLineF2(pcVar10 + 0x44);
pcVar10[0x48] = '\0';
pcVar10[0x49] = '\0';
pcVar10[0x4a] = -0x80;
pDVar3 = current;
*(undefined2 *)(pcVar10 + 0x4c) = 0xef;
*(undefined2 *)(pcVar10 + 0x4e) = uVar12;
*(undefined2 *)(pcVar10 + 0x50) = 0xef;
*(short *)(pcVar10 + 0x52) = (short)local_2c;
*(uint *)(pcVar10 + 0x44) = *(uint *)(pcVar10 + 0x44) & 0xff000000 | pDVar3->ot[1] & 0xffffff;
pDVar3->ot[1] = pDVar3->ot[1] & 0xff000000 | (uint)(pcVar10 + 0x44) & 0xffffff;
pDVar3->primptr = pDVar3->primptr + 0x2c;
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ WorldToMultiplayerMap(struct VECTOR *in /*$a3*/, struct VECTOR *out /*$a2*/)
// line 1778, offset 0x00019994
/* begin block 1 */
// Start line: 1779
// Start offset: 0x00019994
// Variables:
// int x; // $v1
// int z; // $a0
/* end block 1 */
// End offset: 0x00019A60
// End Line: 1795
/* begin block 2 */
// Start line: 6811
/* end block 2 */
// End Line: 6812
/* begin block 3 */
// Start line: 6895
/* end block 3 */
// End Line: 6896
/* begin block 4 */
// Start line: 6898
/* end block 4 */
// End Line: 6899
void WorldToMultiplayerMap(VECTOR *in,VECTOR *out)
{
int iVar1;
int iVar2;
int iVar3;
iVar1 = MissionHeader->region;
if (iVar1 != 0) {
iVar3 = iVar1 / regions_across;
if (regions_across == 0) {
trap(7);
}
if (regions_across == 0) {
trap(7);
}
iVar2 = in->vx - ((iVar1 % regions_across) * 0x10000 + cells_across * -0x400);
iVar1 = cells_down * -0x400;
if (iVar2 < 0) {
iVar2 = iVar2 + 0x7ff;
}
out->vx = iVar2 >> 0xb;
iVar1 = in->vz - ((iVar3 + -1) * 0x10000 + iVar1);
if (iVar1 < 0) {
iVar1 = iVar1 + 0x7ff;
}
out->vz = 0x40 - (iVar1 >> 0xb);
return;
}
out->vx = 0x20;
out->vz = 0x20;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ ProcessPalletLump(char *lump_ptr /*$a0*/, int lump_size /*$a1*/)
// line 1970, offset 0x00019f44
/* begin block 1 */
// Start line: 1971
// Start offset: 0x00019F44
// Variables:
// int total_cluts; // $v0
// int clutValue; // $s1
// int tpageindex; // $s2
// int texnum; // $s3
// int palette; // $s4
// int clut_number; // $v1
// unsigned short clutTable[320]; // stack offset -680
// char *buffPtr; // $s0
/* begin block 1.1 */
// Start line: 2013
// Start offset: 0x00019FD0
/* end block 1.1 */
// End offset: 0x00019FD0
// End Line: 2013
/* end block 1 */
// End offset: 0x0001A094
// End Line: 2034
/* begin block 2 */
// Start line: 8209
/* end block 2 */
// End Line: 8210
/* begin block 3 */
// Start line: 3940
/* end block 3 */
// End Line: 3941
void ProcessPalletLump(char *lump_ptr,int lump_size)
{
char cVar1;
ushort uVar2;
undefined3 extraout_var;
int *piVar3;
int *piVar4;
int iVar5;
int iVar6;
u_short *puVar7;
u_short local_2a8 [320];
if ((*(int *)lump_ptr != 0) && (*(int *)(lump_ptr + 4) != -1)) {
piVar3 = (int *)(lump_ptr + 4);
puVar7 = local_2a8;
do {
iVar6 = *piVar3;
iVar5 = piVar3[1];
cVar1 = GetCarPalIndex(piVar3[2]);
piVar4 = piVar3 + 4;
if (piVar3[3] == -1) {
LoadImage(&clutpos,piVar4);
piVar4 = piVar3 + 0xc;
uVar2 = GetClut((int)clutpos.x,(int)clutpos.y);
*puVar7 = uVar2;
puVar7 = puVar7 + 1;
IncrementClutNum(&clutpos);
}
else {
uVar2 = local_2a8[piVar3[3]];
}
civ_clut[CONCAT31(extraout_var,cVar1) * 0xc0 + iVar5 * 6 + iVar6 + 1] = uVar2;
piVar3 = piVar4;
} while (*piVar4 != -1);
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ load_civ_palettes(struct RECT *cluts /*$a0*/)
// line 2043, offset 0x0001a094
/* begin block 1 */
// Start line: 8350
/* end block 1 */
// End Line: 8351
/* begin block 2 */
// Start line: 8360
/* end block 2 */
// End Line: 8361
/* begin block 3 */
// Start line: 8510
/* end block 3 */
// End Line: 8511
void load_civ_palettes(RECT *cluts)
{
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ FlashOverheadMap(int r /*$a0*/, int g /*$a1*/, int b /*$a2*/)
// line 2319, offset 0x00018980
/* begin block 1 */
// Start line: 2321
// Start offset: 0x00018980
// Variables:
// struct TILE *tile; // $a3
/* end block 1 */
// End offset: 0x00018AA0
// End Line: 2341
/* begin block 2 */
// Start line: 5094
/* end block 2 */
// End Line: 5095
/* begin block 3 */
// Start line: 5638
/* end block 3 */
// End Line: 5639
/* begin block 4 */
// Start line: 5639
/* end block 4 */
// End Line: 5640
/* begin block 5 */
// Start line: 5650
/* end block 5 */
// End Line: 5651
void FlashOverheadMap(int r,int g,int b)
{
DB *pDVar1;
uint *puVar2;
char *pcVar3;
puVar2 = (uint *)current->primptr;
*(char *)((int)puVar2 + 3) = '\x03';
*(char *)(puVar2 + 1) = (char)r;
*(char *)((int)puVar2 + 5) = (char)g;
*(char *)((int)puVar2 + 6) = (char)b;
*(char *)((int)puVar2 + 7) = 'b';
pDVar1 = current;
*(undefined2 *)(puVar2 + 2) = 0xfa;
*(undefined2 *)((int)puVar2 + 10) = 0xb6;
*(undefined2 *)(puVar2 + 3) = 0x3c;
*(undefined2 *)((int)puVar2 + 0xe) = 0x3c;
*puVar2 = *puVar2 & 0xff000000 | *pDVar1->ot & 0xffffff;
*pDVar1->ot = *pDVar1->ot & 0xff000000 | (uint)puVar2 & 0xffffff;
pcVar3 = pDVar1->primptr;
pDVar1->primptr = pcVar3 + 0x10;
pcVar3[0x13] = '\a';
pcVar3[0x17] = '$';
pDVar1 = current;
*(undefined2 *)(pcVar3 + 0x18) = 0xffff;
*(undefined2 *)(pcVar3 + 0x1a) = 0xffff;
*(undefined2 *)(pcVar3 + 0x20) = 0xffff;
*(undefined2 *)(pcVar3 + 0x22) = 0xffff;
*(undefined2 *)(pcVar3 + 0x28) = 0xffff;
*(undefined2 *)(pcVar3 + 0x2a) = 0xffff;
*(undefined2 *)(pcVar3 + 0x26) = 0x20;
*(uint *)(pcVar3 + 0x10) = *(uint *)(pcVar3 + 0x10) & 0xff000000 | *pDVar1->ot & 0xffffff;
*pDVar1->ot = *pDVar1->ot & 0xff000000 | (uint)(pcVar3 + 0x10) & 0xffffff;
pDVar1->primptr = pDVar1->primptr + 0x20;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ LoadMapTile(int tpage /*$a0*/, int x /*$a1*/, int y /*$a2*/)
// line 2350, offset 0x00018aa0
/* begin block 1 */
// Start line: 2351
// Start offset: 0x00018AA0
// Variables:
// struct RECT MapSegment; // stack offset -16
// int temp; // $a0
// int count; // $a2
// int idx; // $a3
/* end block 1 */
// End offset: 0x00018BF4
// End Line: 2383
/* begin block 2 */
// Start line: 5724
/* end block 2 */
// End Line: 5725
/* begin block 3 */
// Start line: 5734
/* end block 3 */
// End Line: 5735
/* begin block 4 */
// Start line: 5742
/* end block 4 */
// End Line: 5743
void LoadMapTile(int tpage,int x,int y)
{
char cVar1;
char *pcVar2;
int iVar3;
short local_10;
short local_e;
undefined2 local_c;
undefined2 local_a;
local_c = 8;
local_a = 0x20;
local_e = MapRect.y + (&MapSegmentPos)[tpage].y;
local_10 = MapRect.x + (&MapSegmentPos)[tpage].x;
iVar3 = x + y * tilehnum;
if ((((iVar3 < (int)(uint)(byte)overlaidmaps[GameLevel].toptile) && (-1 < iVar3)) && (-1 < x << 5)
) && (x << 5 < overlaidmaps[GameLevel].width)) {
UnpackRNC(MapBitMaps + *(ushort *)(MapBitMaps + iVar3 * 2),MapBuffer);
}
else {
iVar3 = 0x1ff;
pcVar2 = CHAR_ARRAY_000aba47;
cVar1 = overlaidmaps[GameLevel].dummy;
do {
*pcVar2 = cVar1;
iVar3 = iVar3 + -1;
pcVar2 = pcVar2 + -1;
} while (-1 < iVar3);
}
DrawSync(0);
LoadImage(&local_10,MapBuffer);
DrawSync(0);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ SetMapPos()
// line 2392, offset 0x00019a60
/* begin block 1 */
// Start line: 7532
/* end block 1 */
// End Line: 7533
/* begin block 2 */
// Start line: 8130
/* end block 2 */
// End Line: 8131
/* begin block 3 */
// Start line: 8131
/* end block 3 */
// End Line: 8132
/* WARNING: Unknown calling convention yet parameter storage is locked */
void SetMapPos(void)
{
int iVar1;
iVar1 = overlaidmaps[GameLevel].scale;
if (iVar1 == 0) {
trap(7);
}
if (iVar1 == 0) {
trap(7);
}
x_map = overlaidmaps[GameLevel].x_offset + player.pos[0] / iVar1;
y_map = overlaidmaps[GameLevel].y_offset - player.pos[2] / iVar1;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ draw_box()
// line 2405, offset 0x00018bf4
/* begin block 1 */
// Start line: 2407
// Start offset: 0x00018BF4
// Variables:
// struct LINE_F4 *line4; // $s0
// struct LINE_F2 *line2; // $s1
/* end block 1 */
// End offset: 0x00018D54
// End Line: 2427
/* begin block 2 */
// Start line: 5860
/* end block 2 */
// End Line: 5861
/* begin block 3 */
// Start line: 5883
/* end block 3 */
// End Line: 5884
/* begin block 4 */
// Start line: 5884
/* end block 4 */
// End Line: 5885
/* begin block 5 */
// Start line: 5887
/* end block 5 */
// End Line: 5888
/* WARNING: Unknown calling convention yet parameter storage is locked */
void draw_box(void)
{
DB *pDVar1;
ulong *puVar2;
uint *puVar3;
puVar3 = (uint *)current->primptr;
SetLineF4(puVar3);
*(char *)(puVar3 + 1) = '\0';
*(char *)((int)puVar3 + 5) = '\0';
*(char *)((int)puVar3 + 6) = -0x80;
pDVar1 = current;
*(undefined2 *)(puVar3 + 2) = 0xf9;
*(undefined2 *)((int)puVar3 + 10) = 0xb5;
*(undefined2 *)(puVar3 + 3) = 0x136;
*(undefined2 *)((int)puVar3 + 0xe) = 0xb5;
*(undefined2 *)(puVar3 + 4) = 0x136;
*(undefined2 *)((int)puVar3 + 0x12) = 0xf2;
*(undefined2 *)(puVar3 + 5) = 0xf9;
*(undefined2 *)((int)puVar3 + 0x16) = 0xf2;
*puVar3 = *puVar3 & 0xff000000 | pDVar1->ot[1] & 0xffffff;
puVar2 = pDVar1->ot;
puVar2[1] = puVar2[1] & 0xff000000 | (uint)puVar3 & 0xffffff;
SetLineF2(puVar3 + 7);
*(char *)(puVar3 + 8) = '\0';
*(char *)((int)puVar3 + 0x21) = '\0';
*(char *)((int)puVar3 + 0x22) = -0x80;
pDVar1 = current;
*(undefined2 *)(puVar3 + 9) = 0xf9;
*(undefined2 *)((int)puVar3 + 0x26) = 0xb5;
*(undefined2 *)(puVar3 + 10) = 0xf9;
*(undefined2 *)((int)puVar3 + 0x2a) = 0xf2;
puVar3[7] = puVar3[7] & 0xff000000 | pDVar1->ot[1] & 0xffffff;
pDVar1->ot[1] = pDVar1->ot[1] & 0xff000000 | (uint)(puVar3 + 7) & 0xffffff;
pDVar1->primptr = pDVar1->primptr + 0x2c;
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawN(struct VECTOR *pScreenPosition /*$s2*/, int direct /*$s7*/)
// line 2435, offset 0x00018d54
/* begin block 1 */
// Start line: 2436
// Start offset: 0x00018D54
// Variables:
// struct XYPAIR lastPoint; // stack offset -48
// struct XYPAIR *pPoint; // $s0
// char loop; // $s4
/* begin block 1.1 */
// Start line: 2446
// Start offset: 0x00018DC4
// Variables:
// struct LINE_F2 *pLine; // $a2
/* end block 1.1 */
// End offset: 0x00018EC4
// End Line: 2469
/* end block 1 */
// End offset: 0x00018F18
// End Line: 2471
/* begin block 2 */
// Start line: 5969
/* end block 2 */
// End Line: 5970
/* begin block 3 */
// Start line: 5978
/* end block 3 */
// End Line: 5979
/* WARNING: Could not reconcile some variable overlaps */
void DrawN(VECTOR *pScreenPosition,int direct)
{
int iVar1;
DB *pDVar2;
byte bVar3;
uint *puVar4;
XYPAIR *pXVar5;
int local_30;
int local_2c;
pXVar5 = &XYPAIR_0009ba3c;
bVar3 = 0;
local_30 = NVertex.x + pScreenPosition->vx;
local_2c = NVertex.y + pScreenPosition->vz;
do {
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\x03';
*(char *)((int)puVar4 + 7) = '@';
*(undefined2 *)(puVar4 + 2) = (undefined2)local_30;
*(undefined2 *)((int)puVar4 + 10) = (undefined2)local_2c;
local_30 = pXVar5->x + pScreenPosition->vx;
local_2c = pXVar5->y + pScreenPosition->vz;
*(undefined2 *)(puVar4 + 3) = (undefined2)local_30;
iVar1 = gTimeOfDay;
*(undefined2 *)((int)puVar4 + 0xe) = (undefined2)local_2c;
if (iVar1 == 3) {
*(char *)(puVar4 + 1) = 'K';
*(char *)((int)puVar4 + 5) = 'K';
*(char *)((int)puVar4 + 6) = 'K';
}
else {
*(char *)(puVar4 + 1) = '`';
*(char *)((int)puVar4 + 5) = '`';
*(char *)((int)puVar4 + 6) = '`';
}
*(byte *)((int)puVar4 + 7) = *(byte *)((int)puVar4 + 7) | 2;
pDVar2 = current;
if (direct == 0) {
*puVar4 = *puVar4 & 0xff000000 | *current->ot & 0xffffff;
*pDVar2->ot = *pDVar2->ot & 0xff000000 | (uint)puVar4 & 0xffffff;
}
else {
DrawPrim(puVar4);
}
bVar3 = bVar3 + 1;
pXVar5 = pXVar5 + 1;
current->primptr = current->primptr + 0x10;
} while (bVar3 < 3);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawCompass()
// line 2479, offset 0x00018f18
/* begin block 1 */
// Start line: 2481
// Start offset: 0x00018F18
// Variables:
// struct VECTOR position[5]; // stack offset -88
// struct XYPAIR *pNorth; // $a1
// int scale; // $a0
/* begin block 1.1 */
// Start line: 2482
// Start offset: 0x00018F18
// Variables:
// char loop; // $t2
// struct VECTOR *pPosition; // $a3
// void *pot; // $s0
/* begin block 1.1.1 */
// Start line: 2511
// Start offset: 0x000190B8
// Variables:
// struct LINE_G2 *pLine; // $a0
/* end block 1.1.1 */
// End offset: 0x000190B8
// End Line: 2511
/* end block 1.1 */
// End offset: 0x00019194
// End Line: 2525
/* end block 1 */
// End offset: 0x00019194
// End Line: 2526
/* begin block 2 */
// Start line: 6209
/* end block 2 */
// End Line: 6210
/* begin block 3 */
// Start line: 6218
/* end block 3 */
// End Line: 6219
/* begin block 4 */
// Start line: 6219
/* end block 4 */
// End Line: 6220
/* begin block 5 */
// Start line: 6220
/* end block 5 */
// End Line: 6221
/* WARNING: Could not reconcile some variable overlaps */
/* WARNING: Unknown calling convention yet parameter storage is locked */
void DrawCompass(void)
{
undefined2 uVar1;
DB *pDVar2;
byte bVar3;
uint *puVar4;
int *piVar5;
ulong *potz;
VECTOR local_58;
int local_48;
int local_40;
int local_38 [2];
int local_30;
VECTOR local_28;
int local_18;
int local_10;
local_48 = north[GameLevel].x * overlaidmaps[GameLevel].scale;
local_40 = north[GameLevel].y * overlaidmaps[GameLevel].scale;
local_58.vx = local_48 * 0x14 + 8 >> 4;
local_38[0] = local_48 + 2 >> 2;
local_58.vz = local_40 * 0x14 + 8 >> 4;
local_30 = local_40 + 2 >> 2;
local_28.vx = (local_40 - local_48) * 0xab >> 10;
local_28.vz = (-local_48 - local_40) * 0xab >> 10;
local_10 = -local_28.vx;
local_18 = local_28.vz;
WorldToOverheadMapPositions(&local_58,&local_58,3,'\x01',0);
WorldToOverheadMapPositions(&local_28,&local_28,2,'\x01',1);
piVar5 = local_38;
bVar3 = 0;
local_28.vx = local_28.vx + local_48;
local_28.vz = local_28.vz + local_40;
local_18 = local_18 + local_48;
local_10 = local_10 + local_40;
potz = current->ot;
do {
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\x04';
*(char *)((int)puVar4 + 7) = 'P';
*(undefined2 *)(puVar4 + 2) = (undefined2)local_48;
*(undefined2 *)((int)puVar4 + 10) = (undefined2)local_40;
*(undefined2 *)(puVar4 + 4) = *(undefined2 *)piVar5;
uVar1 = *(undefined2 *)(piVar5 + 2);
piVar5 = piVar5 + 4;
*(char *)(puVar4 + 1) = '`';
*(char *)((int)puVar4 + 5) = '`';
*(char *)((int)puVar4 + 6) = '`';
*(char *)(puVar4 + 3) = '\0';
*(char *)((int)puVar4 + 0xd) = '\0';
*(char *)((int)puVar4 + 0xe) = '\0';
*(char *)((int)puVar4 + 7) = 'R';
*(undefined2 *)((int)puVar4 + 0x12) = uVar1;
pDVar2 = current;
bVar3 = bVar3 + 1;
*puVar4 = *puVar4 & 0xff000000 | *potz & 0xffffff;
*potz = *potz & 0xff000000 | (uint)puVar4 & 0xffffff;
pDVar2->primptr = pDVar2->primptr + 0x14;
} while (bVar3 < 3);
DrawN(&local_58,0);
TransparencyOn(potz,0x20);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawBigCompass(struct VECTOR *root /*$a0*/, int angle /*$a1*/)
// line 2534, offset 0x00019194
/* begin block 1 */
// Start line: 2535
// Start offset: 0x00019194
// Variables:
// struct VECTOR position[5]; // stack offset -96
// struct VECTOR *pPosition; // $s0
// char loop; // $s1
/* begin block 1.1 */
// Start line: 2557
// Start offset: 0x00019300
// Variables:
// struct LINE_G2 *pLine; // $a1
/* end block 1.1 */
// End offset: 0x00019300
// End Line: 2557
/* end block 1 */
// End offset: 0x000193B4
// End Line: 2569
/* begin block 2 */
// Start line: 6432
/* end block 2 */
// End Line: 6433
/* begin block 3 */
// Start line: 6433
/* end block 3 */
// End Line: 6434
/* begin block 4 */
// Start line: 6442
/* end block 4 */
// End Line: 6443
/* begin block 5 */
// Start line: 6444
/* end block 5 */
// End Line: 6445
/* WARNING: Could not reconcile some variable overlaps */
void DrawBigCompass(VECTOR *root,int angle)
{
undefined2 uVar1;
byte bVar2;
uint uVar3;
char *pcVar4;
uint uVar5;
uint uVar6;
int *piVar7;
VECTOR local_60;
int local_50;
int local_4c;
int local_40;
int local_3c;
int local_30;
int local_2c;
int local_20;
int local_1c;
piVar7 = &local_40;
bVar2 = 0;
local_40 = root->vx + map_x_offset;
uVar5 = big_north[GameLevel] + angle & 0xfff;
local_3c = root->vz + map_z_offset;
local_50 = local_40 + ((int)rcossin_tbl[uVar5 * 2] * 0x19 >> 0xc);
local_60.vx = local_40 + ((int)rcossin_tbl[uVar5 * 2] * 0xf >> 0xb);
uVar3 = uVar5 - 200 & 0xfff;
uVar6 = uVar5 + 200 & 0xfff;
local_4c = local_3c + ((int)rcossin_tbl[uVar5 * 2 + 1] * 0x19 >> 0xc);
local_60.vz = local_3c + ((int)rcossin_tbl[uVar5 * 2 + 1] * 0xf >> 0xb);
local_30 = local_40 + ((int)rcossin_tbl[uVar3 * 2] * 5 >> 10);
local_2c = local_3c + ((int)rcossin_tbl[uVar3 * 2 + 1] * 5 >> 10);
local_20 = local_40 + ((int)rcossin_tbl[uVar6 * 2] * 5 >> 10);
local_1c = local_3c + ((int)rcossin_tbl[uVar6 * 2 + 1] * 5 >> 10);
do {
pcVar4 = current->primptr;
pcVar4[3] = '\x04';
pcVar4[7] = 'P';
*(undefined2 *)(pcVar4 + 8) = (undefined2)local_50;
*(undefined2 *)(pcVar4 + 10) = (undefined2)local_4c;
*(undefined2 *)(pcVar4 + 0x10) = *(undefined2 *)piVar7;
uVar1 = *(undefined2 *)(piVar7 + 1);
piVar7 = piVar7 + 4;
pcVar4[4] = '`';
pcVar4[5] = '`';
pcVar4[6] = '`';
pcVar4[0xc] = '\0';
pcVar4[0xd] = '\0';
pcVar4[0xe] = '\0';
pcVar4[7] = 'R';
*(undefined2 *)(pcVar4 + 0x12) = uVar1;
DrawPrim(pcVar4);
bVar2 = bVar2 + 1;
current->primptr = current->primptr + 0x14;
} while (bVar2 < 3);
DrawN(&local_60,1);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ CopIndicator(int xpos /*$a3*/, int strength /*$a1*/)
// line 2577, offset 0x000193b4
/* begin block 1 */
// Start line: 2578
// Start offset: 0x000193B4
// Variables:
// struct POLY_F3 *tri; // $a2
// int str2; // $fp
// void *pot; // stack offset -56
/* end block 1 */
// End offset: 0x00019594
// End Line: 2607
/* begin block 2 */
// Start line: 6667
/* end block 2 */
// End Line: 6668
/* begin block 3 */
// Start line: 6676
/* end block 3 */
// End Line: 6677
/* begin block 4 */
// Start line: 6680
/* end block 4 */
// End Line: 6681
void CopIndicator(int xpos,int strength)
{
short sVar1;
DB *pDVar2;
char cVar3;
uint *puVar4;
ulong *puVar5;
int iVar6;
puVar5 = current->ot;
if (0xff < strength) {
strength = 0xff;
}
iVar6 = strength * (strength + 0x100);
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\x04';
*(char *)((int)puVar4 + 7) = ' ';
*(char *)(puVar4 + 1) = (char)strength;
if (strength < 0) {
strength = strength + 3;
}
cVar3 = (char)(strength >> 2);
*(char *)((int)puVar4 + 5) = cVar3;
sVar1 = (short)xpos;
*(char *)((int)puVar4 + 6) = cVar3;
*(short *)(puVar4 + 2) = sVar1 + -0xc;
*(undefined2 *)((int)puVar4 + 10) = 0x100;
*(short *)(puVar4 + 3) = sVar1;
*(undefined2 *)((int)puVar4 + 0xe) = 0xe2;
*(short *)(puVar4 + 4) = sVar1 + 0xc;
*(undefined2 *)((int)puVar4 + 0x12) = 0x100;
*(char *)((int)puVar4 + 7) = '\"';
*puVar4 = *puVar4 & 0xff000000 | puVar5[1] & 0xffffff;
pDVar2 = current;
puVar5[1] = puVar5[1] & 0xff000000 | (uint)puVar4 & 0xffffff;
pDVar2->primptr = pDVar2->primptr + 0x14;
TransparencyOn(puVar5 + 1,0x20);
puVar4 = (uint *)current->primptr;
*(char *)((int)puVar4 + 3) = '\x04';
cVar3 = (char)(iVar6 >> 9);
*(char *)(puVar4 + 1) = cVar3;
*(char *)((int)puVar4 + 5) = cVar3;
*(char *)((int)puVar4 + 6) = cVar3;
*(short *)(puVar4 + 2) = sVar1 + -0xc;
*(undefined2 *)((int)puVar4 + 10) = 0x100;
*(undefined2 *)((int)puVar4 + 0xe) = 0xe2;
*(short *)(puVar4 + 4) = sVar1 + 0xc;
*(undefined2 *)((int)puVar4 + 0x12) = 0x100;
*(char *)((int)puVar4 + 7) = '\"';
*(short *)(puVar4 + 3) = sVar1;
*puVar4 = *puVar4 & 0xff000000 | puVar5[1] & 0xffffff;
pDVar2 = current;
puVar5[1] = puVar5[1] & 0xff000000 | (uint)puVar4 & 0xffffff;
pDVar2->primptr = pDVar2->primptr + 0x14;
TransparencyOn(puVar5 + 1,0x40);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ DrawSightCone(struct COP_SIGHT_DATA *pCopSightData /*$a0*/, struct VECTOR *pPosition /*$a1*/, int direction /*$t6*/)
// line 2609, offset 0x00019594
/* begin block 1 */
// Start line: 2610
// Start offset: 0x00019594
// Variables:
// struct VECTOR vertex[9]; // stack offset -160
// struct VECTOR *pVertex; // $t0
// int angle; // $a3
// int frontViewAngle; // $t1
// int negFrontViewAngle; // $a2
// int frontViewDistance; // $t4
// int surroundViewDistance; // $t3
/* begin block 1.1 */
// Start line: 2624
// Start offset: 0x000195E8
// Variables:
// int len; // $a1
/* begin block 1.1.1 */
// Start line: 2636
// Start offset: 0x00019600
// Variables:
// int temp; // $v0
/* end block 1.1.1 */
// End offset: 0x00019600
// End Line: 2636
/* end block 1.1 */
// End offset: 0x00019600
// End Line: 2636
/* begin block 1.2 */
// Start line: 2643
// Start offset: 0x0001966C
// Variables:
// struct VECTOR *pVertex; // $a2
// void *pot; // $a3
/* begin block 1.2.1 */
// Start line: 2651
// Start offset: 0x000196B8
// Variables:
// struct POLY_G3 *poly; // $a1
// struct VECTOR *pNextVertex; // $a0
/* end block 1.2.1 */
// End offset: 0x000196DC
// End Line: 2659
/* end block 1.2 */
// End offset: 0x000197BC
// End Line: 2670
/* end block 1 */
// End offset: 0x000197BC
// End Line: 2671
/* begin block 2 */
// Start line: 6761
/* end block 2 */
// End Line: 6762
/* begin block 3 */
// Start line: 6764
/* end block 3 */
// End Line: 6765
/* WARNING: Could not reconcile some variable overlaps */
void DrawSightCone(COP_SIGHT_DATA *pCopSightData,VECTOR *pPosition,int direction)
{
short sVar1;
short sVar2;
short sVar3;
short sVar4;
short sVar5;
undefined2 uVar6;
DB *pDVar7;
uint uVar8;
int *piVar9;
int *piVar10;
uint *puVar11;
int iVar12;
ulong *potz;
int *piVar13;
int local_a0;
int local_98;
int local_90 [2];
int local_88 [26];
int aiStack32 [4];
iVar12 = 0;
sVar1 = pCopSightData->frontViewDistance;
sVar2 = pCopSightData->surroundViewDistance;
sVar3 = pCopSightData->frontViewAngle;
local_a0 = pPosition->vx;
local_98 = pPosition->vz;
piVar13 = local_90;
do {
if ((iVar12 <= (int)sVar3) || (sVar4 = sVar2, 0x1000 - (int)sVar3 <= iVar12)) {
sVar4 = sVar1;
}
uVar8 = iVar12 + direction & 0xfff;
sVar5 = rcossin_tbl[uVar8 * 2 + 1];
iVar12 = iVar12 + 0x200;
*piVar13 = local_a0 + ((int)rcossin_tbl[uVar8 * 2] * (int)sVar4 + 0x800 >> 0xc);
piVar13[2] = local_98 + ((int)sVar5 * (int)sVar4 + 0x800 >> 0xc);
piVar13 = piVar13 + 4;
} while (iVar12 < 0x1000);
WorldToOverheadMapPositions((VECTOR *)&local_a0,(VECTOR *)&local_a0,9,'\0',0);
potz = current->ot;
piVar13 = local_90;
while (piVar13 < &stack0xfffffff0) {
piVar9 = piVar13 + 4;
puVar11 = (uint *)current->primptr;
piVar10 = piVar9;
if (aiStack32 < piVar9) {
piVar10 = local_90;
}
*(char *)((int)puVar11 + 3) = '\x06';
*(char *)((int)puVar11 + 7) = '0';
*(undefined2 *)(puVar11 + 2) = (undefined2)local_a0;
*(undefined2 *)((int)puVar11 + 10) = (undefined2)local_98;
*(undefined2 *)(puVar11 + 4) = *(undefined2 *)piVar13;
*(undefined2 *)((int)puVar11 + 0x12) = *(undefined2 *)(piVar13 + 2);
*(undefined2 *)(puVar11 + 6) = *(undefined2 *)piVar10;
uVar6 = *(undefined2 *)(piVar10 + 2);
*(char *)(puVar11 + 1) = '`';
*(char *)((int)puVar11 + 5) = '`';
*(char *)((int)puVar11 + 6) = '`';
*(char *)(puVar11 + 3) = '\0';
*(char *)((int)puVar11 + 0xd) = '\0';
*(char *)((int)puVar11 + 0xe) = '\0';
*(char *)(puVar11 + 5) = '\0';
*(char *)((int)puVar11 + 0x15) = '\0';
*(char *)((int)puVar11 + 0x16) = '\0';
*(char *)((int)puVar11 + 7) = '2';
*(undefined2 *)((int)puVar11 + 0x1a) = uVar6;
*puVar11 = *puVar11 & 0xff000000 | *potz & 0xffffff;
pDVar7 = current;
*potz = *potz & 0xff000000 | (uint)puVar11 & 0xffffff;
pDVar7->primptr = pDVar7->primptr + 0x1c;
piVar13 = piVar9;
}
TransparencyOn(potz,0x20);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ WorldToOverheadMapPositions(struct VECTOR *pGlobalPosition /*$s1*/, struct VECTOR *pOverheadMapPosition /*$s3*/, int count /*$s2*/, char inputRelative /*$s5*/, int outputRelative /*stack 16*/)
// line 2703, offset 0x00019af0
/* begin block 1 */
// Start line: 2704
// Start offset: 0x00019AF0
// Variables:
// struct MATRIX TempMatrix; // stack offset -80
// int sin; // $a1
// int cos; // $a2
// int angle; // $v1
// int scale; // $s0
/* begin block 1.1 */
// Start line: 2745
// Start offset: 0x00019C20
// Variables:
// struct SVECTOR tempVector; // stack offset -48
// long flag; // stack offset -40
/* end block 1.1 */
// End offset: 0x00019CC0
// End Line: 2760
/* end block 1 */
// End offset: 0x00019D0C
// End Line: 2764
/* begin block 2 */
// Start line: 8754
/* end block 2 */
// End Line: 8755
void WorldToOverheadMapPositions
(VECTOR *pGlobalPosition,VECTOR *pOverheadMapPosition,int count,char inputRelative,
int outputRelative)
{
int iVar1;
uint local_50;
uint local_4c;
uint local_44;
uint local_40;
undefined4 local_3c;
undefined4 local_34;
undefined2 local_30;
undefined2 local_2e;
undefined2 local_2c;
undefined auStack40 [8];
local_4c = (uint)(ushort)rcossin_tbl[(player.dir & 0xfffU) * 2];
local_50 = (uint)(ushort)rcossin_tbl[(player.dir & 0xfffU) * 2 + 1];
local_44 = (uint)(ushort)-rcossin_tbl[(player.dir & 0xfffU) * 2];
local_40 = local_40 & 0xffff0000 | (uint)(ushort)rcossin_tbl[(player.dir & 0xfffU) * 2 + 1];
if ((char)outputRelative == '\0') {
local_3c = 0x118;
local_34 = 0xd4;
}
else {
local_3c = 0;
local_34 = 0;
}
setCopControlWord(2,0,local_50);
setCopControlWord(2,0x800,local_4c);
setCopControlWord(2,0x1000,0x1000);
setCopControlWord(2,0x1800,local_44);
setCopControlWord(2,0x2000,local_40);
setCopControlWord(2,0x2800,local_3c);
setCopControlWord(2,0x3000,0);
setCopControlWord(2,0x3800,local_34);
count = count + -1;
iVar1 = overlaidmaps[GameLevel].scale;
while (count != -1) {
local_2e = 0;
if (inputRelative == '\0') {
if (iVar1 == 0) {
trap(7);
}
local_30 = (undefined2)((pGlobalPosition->vx - player.pos[0]) / iVar1);
if (iVar1 == 0) {
trap(7);
}
local_2c = (undefined2)((player.pos[2] - pGlobalPosition->vz) / iVar1);
}
else {
if (iVar1 == 0) {
trap(7);
}
local_30 = (undefined2)(pGlobalPosition->vx / iVar1);
if (iVar1 == 0) {
trap(7);
}
local_2c = (undefined2)(-pGlobalPosition->vz / iVar1);
}
RotTrans(&local_30,pOverheadMapPosition,auStack40);
count = count + -1;
pGlobalPosition = pGlobalPosition + 1;
pOverheadMapPosition = pOverheadMapPosition + 1;
}
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ SetFullscreenMapMatrix()
// line 2771, offset 0x00019d0c
/* begin block 1 */
// Start line: 2773
// Start offset: 0x00019D0C
// Variables:
// struct VECTOR translate; // stack offset -32
// struct SVECTOR direction; // stack offset -16
/* end block 1 */
// End offset: 0x00019DE8
// End Line: 2787
/* begin block 2 */
// Start line: 8933
/* end block 2 */
// End Line: 8934
/* begin block 3 */
// Start line: 8941
/* end block 3 */
// End Line: 8942
/* begin block 4 */
// Start line: 8942
/* end block 4 */
// End Line: 8943
/* WARNING: Unknown calling convention yet parameter storage is locked */
void SetFullscreenMapMatrix(void)
{
undefined4 uVar1;
undefined4 uVar2;
undefined4 uVar3;
SVECTOR local_10;
uVar3 = DAT_00010440;
uVar2 = DAT_0001043c;
uVar1 = DAT_00010438;
local_10.vx = 0;
if (gUseRotatedMap == 0) {
local_10.vy = 0;
}
else {
local_10.vy = (ushort)player.dir & 0xfff;
}
local_10.vz = 0;
RotMatrixXYZ(&map_matrix,&local_10);
MulMatrix0(&aspect,&map_matrix,&map_matrix);
setCopControlWord(2,0,map_matrix.m[0]._0_4_);
setCopControlWord(2,0x800,map_matrix.m._4_4_);
setCopControlWord(2,0x1000,map_matrix.m[1]._2_4_);
setCopControlWord(2,0x1800,map_matrix.m[2]._0_4_);
setCopControlWord(2,0x2000,map_matrix._16_4_);
setCopControlWord(2,0x2800,uVar1);
setCopControlWord(2,0x3000,uVar2);
setCopControlWord(2,0x3800,uVar3);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ WorldToFullscreenMap(struct VECTOR *in /*$a0*/, struct VECTOR *out /*$a1*/)
// line 2794, offset 0x00019de8
/* begin block 1 */
// Start line: 8983
/* end block 1 */
// End Line: 8984
/* begin block 2 */
// Start line: 8991
/* end block 2 */
// End Line: 8992
/* begin block 3 */
// Start line: 8992
/* end block 3 */
// End Line: 8993
void WorldToFullscreenMap(VECTOR *in,VECTOR *out)
{
OVERMAP *pOVar1;
int iVar2;
int iVar3;
int iVar4;
int iVar5;
iVar2 = GameLevel;
iVar5 = in->vx;
pOVar1 = overlaidmaps + GameLevel;
iVar3 = pOVar1->scale;
if (iVar3 == 0) {
trap(7);
}
iVar4 = overlaidmaps[GameLevel].x_offset;
out->vy = 0;
out->vx = iVar4 + iVar5 / iVar3 + 0x31;
iVar3 = pOVar1->scale;
if (iVar3 == 0) {
trap(7);
}
out->vz = overlaidmaps[iVar2].y_offset - (in->vz / iVar3 + -0x31);
return;
}
// decompiled code
// original method signature:
// void /*$ra*/ WorldToFullscreenMap2(struct VECTOR *in /*$a0*/, struct VECTOR *out /*$a1*/)
// line 2806, offset 0x00019e7c
/* begin block 1 */
// Start line: 2807
// Start offset: 0x00019E7C
// Variables:
// struct SVECTOR pos; // stack offset -24
// long flag; // stack offset -16
/* end block 1 */
// End offset: 0x00019F44
// End Line: 2819
/* begin block 2 */
// Start line: 9016
/* end block 2 */
// End Line: 9017
/* begin block 3 */
// Start line: 9020
/* end block 3 */
// End Line: 9021
void WorldToFullscreenMap2(VECTOR *in,VECTOR *out)
{
int iVar1;
short local_18;
undefined2 local_16;
short local_14;
undefined auStack16 [8];
iVar1 = overlaidmaps[GameLevel].scale;
if (iVar1 == 0) {
trap(7);
}
local_16 = 0;
if (iVar1 == 0) {
trap(7);
}
local_18 = (*(short *)&overlaidmaps[GameLevel].x_offset + (short)(in->vx / iVar1) + 0x31) -
(short)player_position.vx;
local_14 = (*(short *)&overlaidmaps[GameLevel].y_offset - ((short)(in->vz / iVar1) + -0x31)) -
(short)player_position.vz;
RotTrans(&local_18,out,auStack16);
return;
}