spidey-decomp/chunk.cpp

121 lines
2.3 KiB
C++
Raw Normal View History

2024-05-24 16:50:07 +02:00
#include "chunk.h"
2024-07-24 17:08:14 +02:00
#include "baddy.h"
#include "mem.h"
2024-07-24 17:40:39 +02:00
#include "bit.h"
#include "utils.h"
2024-05-24 16:50:07 +02:00
2024-07-24 17:08:14 +02:00
#include "validate.h"
2024-05-24 16:50:07 +02:00
2024-07-24 17:40:39 +02:00
extern SFlatBitVelocity FlatBitVelocities[];
2024-08-05 17:19:04 +02:00
extern CBody* ControlBaddyList;
2024-07-24 17:08:14 +02:00
2024-07-24 17:51:07 +02:00
// @MEDIUMTODO
void Chunk_ChunkItemByChecksum(u32 Checksum)
{
printf("void Chunk_ChunkItemByChecksum(u32 Checksum)");
}
2024-07-24 17:40:39 +02:00
// @Ok
// @Test
void CChunkControl::AddChunk(CItem* pItem)
{
if ( this->field_FA < this->field_F8 )
{
SChunkEntry *entry = &this->field_FC[this->field_FA];
this->field_FA++;
entry->pItem = pItem;
i32 v4 = Rnd(4096) & 0xFFF;
i32 v5 = Rnd(32) + 32;
entry->field_4.vx = v5 * FlatBitVelocities[v4].vxVel;
entry->field_4.vy = (-48 - Rnd(32)) << 12;
entry->field_4.vz = v5 * FlatBitVelocities[v4].vzVel;
entry->field_14.vx = Rnd(512) - 256;
entry->field_14.vy = Rnd(512) - 256;
entry->field_14.vz = Rnd(512) - 256;
entry->field_1C = Rnd(120) + 120;
}
}
2024-07-24 17:32:42 +02:00
// @Ok
void CChunkControl::AI(void)
{
i8 v1 = 1;
for (u32 i = 0; i < this->field_FA; i++)
{
SChunkEntry *entry = &this->field_FC[i];
if (entry->pItem)
{
if (entry->field_1C <= this->field_80)
{
Chunk_MakeItemDisappear(entry->pItem);
entry->pItem = 0;
}
else
{
v1 = 0;
entry->field_1C = entry->field_1C - this->field_80;
entry->pItem->mPos = entry->field_4;
entry->field_4.vy += 0x8000;
entry->pItem->mAngles = entry->field_14;
}
}
}
if (v1)
{
this->Die();
}
}
2024-07-24 17:09:57 +02:00
// @Ok
CChunkControl::~CChunkControl(void)
{
this->DeleteFrom(reinterpret_cast<CBody**>(&ControlBaddyList));
if (this->field_FC)
2024-07-24 17:32:42 +02:00
Mem_Delete(static_cast<void*>(this->field_FC));
2024-07-24 17:09:57 +02:00
}
2024-07-24 17:08:14 +02:00
// @Ok
2024-07-24 17:32:42 +02:00
INLINE CChunkControl::CChunkControl(CVector* a2, u16 a3)
2024-07-24 17:08:14 +02:00
{
this->mPos = *a2;
this->AttachTo(reinterpret_cast<CBody**>(&ControlBaddyList));
this->field_F8 = a3;
if (this->field_F8)
2024-07-24 17:32:42 +02:00
this->field_FC = static_cast<SChunkEntry*>(DCMem_New(32 * this->field_F8, 0, 1, 0, 1));
2024-07-24 17:08:14 +02:00
}
// @Ok
2024-07-24 17:32:42 +02:00
INLINE void Chunk_MakeItemDisappear(CItem* item)
2024-05-24 16:50:07 +02:00
{
item->mFlags |= 0x21;
}
2024-07-24 17:08:14 +02:00
void validate_CChunkControl(void)
{
VALIDATE_SIZE(CChunkControl, 0x100);
VALIDATE(CChunkControl, field_F8, 0xF8);
2024-07-24 17:32:42 +02:00
VALIDATE(CChunkControl, field_FA, 0xFA);
2024-07-24 17:08:14 +02:00
VALIDATE(CChunkControl, field_FC, 0xFC);
}
2024-07-24 17:32:42 +02:00
void validate_SChunkEntry(void)
{
VALIDATE_SIZE(SChunkEntry, 0x20);
VALIDATE(SChunkEntry, pItem, 0x0);
VALIDATE(SChunkEntry, field_4, 0x4);
VALIDATE(SChunkEntry, field_14, 0x14);
VALIDATE(SChunkEntry, field_1C, 0x1C);
}