fallout2-ce/src/nevs.c

197 lines
3.9 KiB
C
Raw Normal View History

2022-05-19 01:51:26 -07:00
#include "nevs.h"
#include "debug.h"
#include "memory_manager.h"
#include <stdlib.h>
#include <string.h>
static_assert(sizeof(Nevs) == 60, "wrong size");
// 0x6391C8
Nevs* _nevs;
// 0x6391CC
int _anyhits;
// nevs_alloc
// 0x488340
Nevs* _nevs_alloc()
{
if (_nevs == NULL) {
debugPrint("nevs_alloc(): nevs_initonce() not called!");
exit(99);
}
for (int i = 0; i < NEVS_COUNT; i++) {
Nevs* nevs = &(_nevs[i]);
if (nevs->field_0 == 0) {
memset(nevs, 0, sizeof(Nevs));
return nevs;
}
}
return NULL;
}
// 0x4883AC
void _nevs_close()
{
if (_nevs != NULL) {
internal_free_safe(_nevs, __FILE__, __LINE__); // "..\\int\\NEVS.C", 97
_nevs = NULL;
}
}
// 0x4883D4
void _nevs_removeprogramreferences(Program* program)
{
if (_nevs != NULL) {
for (int i = 0; i < NEVS_COUNT; i++) {
Nevs* nevs = &(_nevs[i]);
if (nevs->field_0 != 0 && nevs->program == program) {
memset(nevs, 0, sizeof(*nevs));
}
}
}
}
// nevs_initonce
// 0x488418
void _nevs_initonce()
{
// TODO: Incomplete.
// _interpretRegisterProgramDeleteCallback(_nevs_removeprogramreferences);
if (_nevs == NULL) {
_nevs = internal_calloc_safe(sizeof(Nevs), NEVS_COUNT, __FILE__, __LINE__); // "..\\int\\NEVS.C", 131
if (_nevs == NULL) {
debugPrint("nevs_initonce(): out of memory");
exit(99);
}
}
}
// nevs_find
// 0x48846C
Nevs* _nevs_find(const char* a1)
{
if (!_nevs) {
debugPrint("nevs_find(): nevs_initonce() not called!");
exit(99);
}
for (int index = 0; index < NEVS_COUNT; index++) {
Nevs* nevs = &(_nevs[index]);
if (nevs->field_0 != 0 && stricmp(nevs->field_4, a1) == 0) {
return nevs;
}
}
return NULL;
}
// 0x4884C8
int _nevs_addevent(const char* a1, Program* program, int proc, int a4)
{
Nevs* nevs;
nevs = _nevs_find(a1);
if (nevs == NULL) {
nevs = _nevs_alloc();
}
if (nevs == NULL) {
return 1;
}
nevs->field_0 = 1;
strcpy(nevs->field_4, a1);
nevs->program = program;
nevs->proc = proc;
nevs->field_2C = a4;
nevs->field_38 = NULL;
return 0;
}
// nevs_clearevent
// 0x48859C
int _nevs_clearevent(const char* a1)
{
debugPrint("nevs_clearevent( '%s');\n", a1);
Nevs* nevs = _nevs_find(a1);
if (nevs) {
memset(nevs, 0, sizeof(Nevs));
return 0;
}
return 1;
}
// nevs_signal
// 0x48862C
int _nevs_signal(const char* a1)
{
debugPrint("nevs_signal( '%s');\n", a1);
Nevs* nevs = _nevs_find(a1);
if (nevs == NULL) {
return 1;
}
debugPrint("nep: %p, used = %u, prog = %p, proc = %d", nevs, nevs->field_0, nevs->program, nevs->proc);
if (nevs->field_0 && (nevs->program && nevs->proc || nevs->field_38) && !nevs->field_34) {
nevs->field_30++;
_anyhits++;
return 0;
}
return 1;
}
// nevs_update
// 0x4886AC
void _nevs_update()
{
int v1;
int v2;
if (_anyhits == 0) {
return;
}
debugPrint("nevs_update(): we have anyhits = %u\n", _anyhits);
_anyhits = 0;
for (int index = 0; index < NEVS_COUNT; index++) {
Nevs* nevs = &(_nevs[index]);
if (nevs->field_0 && (nevs->program && nevs->proc || nevs->field_38) && !nevs->field_34) {
v1 = nevs->field_30;
if (nevs->field_34 < v1) {
v2 = v1 - 1;
nevs->field_34 = 1;
nevs->field_30--;
_anyhits += v2;
if (nevs->field_38 == NULL) {
_executeProc(nevs->program, nevs->proc);
} else {
nevs->field_38();
}
nevs->field_34 = 0;
if (nevs->field_2C == 0) {
memset(nevs, 0, sizeof(Nevs));
}
}
}
}
}