Deobfuscate audio_file, character_selector, options, dictionary, map, elevator, movie.cc/h (#293)

* Debobfuscate audio_file, character_selector, options, and others

* dictionary, font_manager, nevs

* elevator, map, movie

* item, mp_proto, skill

* proto_instance

* proto, proto_types

* revert dictionary, step -> i

* PR feedback

* criticalChanceModifier -> skillBonus

* skillOrCritSuccessBonus
This commit is contained in:
Mike Klaas
2026-03-09 05:14:20 +00:00
committed by GitHub
parent 3cd817d4b5
commit 404236c0cb
23 changed files with 212 additions and 208 deletions
+11 -11
View File
@@ -148,26 +148,26 @@ long audioFileSeek(int handle, long offset, int origin)
{
void* buf;
int remaining;
int a4;
int targetPosition;
AudioFile* audioFile = &(gAudioFileList[handle - 1]);
switch (origin) {
case SEEK_SET:
a4 = offset;
targetPosition = offset;
break;
case SEEK_CUR:
a4 = audioFile->fileSize + offset;
targetPosition = audioFile->fileSize + offset;
break;
case SEEK_END:
a4 = audioFile->position + offset;
targetPosition = audioFile->position + offset;
break;
default:
assert(false && "Should be unreachable");
}
if ((audioFile->flags & AUDIO_FILE_COMPRESSED) != 0) {
if (a4 <= audioFile->position) {
if (targetPosition <= audioFile->position) {
soundDecoderFree(audioFile->soundDecoder);
fseek(audioFile->stream, 0, 0);
@@ -176,20 +176,20 @@ long audioFileSeek(int handle, long offset, int origin)
audioFile->fileSize *= 2;
audioFile->position = 0;
if (a4) {
if (targetPosition != 0) {
buf = internal_malloc_safe(4096, __FILE__, __LINE__); // "..\int\audiof.c", 364
while (a4 > 4096) {
while (targetPosition > 4096) {
audioFileRead(handle, buf, 4096);
a4 -= 4096;
targetPosition -= 4096;
}
if (a4 != 0) {
audioFileRead(handle, buf, a4);
if (targetPosition != 0) {
audioFileRead(handle, buf, targetPosition);
}
internal_free_safe(buf, __FILE__, __LINE__); // "..\int\audiof.c", 370
}
} else {
buf = internal_malloc_safe(0x400, __FILE__, __LINE__); // "..\int\audiof.c", 316
remaining = audioFile->position - a4;
remaining = audioFile->position - targetPosition;
while (remaining > 1024) {
audioFileRead(handle, buf, 1024);
remaining -= 1024;
+3 -3
View File
@@ -77,7 +77,7 @@ typedef enum PremadeCharacter {
typedef struct PremadeCharacterDescription {
char fileName[20];
int face;
char field_18[20];
char vid[20];
} PremadeCharacterDescription;
static bool characterSelectorWindowInit();
@@ -959,7 +959,7 @@ void premadeCharactersInit()
faceFidsString = pch + 1;
gCustomPremadeCharacterDescriptions[index].field_18[0] = '\0';
gCustomPremadeCharacterDescriptions[index].vid[0] = '\0';
}
}
@@ -969,7 +969,7 @@ void premadeCharactersInit()
for (int index = 0; index < PREMADE_CHARACTER_COUNT; index++) {
strcpy(gCustomPremadeCharacterDescriptions[index].fileName, gPremadeCharacterDescriptions[index].fileName);
gCustomPremadeCharacterDescriptions[index].face = gPremadeCharacterDescriptions[index].face;
strcpy(gCustomPremadeCharacterDescriptions[index].field_18, gPremadeCharacterDescriptions[index].field_18);
strcpy(gCustomPremadeCharacterDescriptions[index].vid, gPremadeCharacterDescriptions[index].vid);
}
}
+2 -2
View File
@@ -5,8 +5,8 @@
namespace fallout {
typedef int(DictionaryReadProc)(FILE* stream, void* buffer, unsigned int size, int a4);
typedef int(DictionaryWriteProc)(FILE* stream, void* buffer, unsigned int size, int a4);
typedef int(DictionaryReadProc)(FILE* stream, void* buffer, unsigned int size, int a3);
typedef int(DictionaryWriteProc)(FILE* stream, void* buffer, unsigned int size, int a3);
// NOTE: Last unnamed fields are likely seek, tell, and filelength.
typedef struct DictionaryIO {
+11 -11
View File
@@ -383,10 +383,10 @@ int elevatorSelectLevel(int elevator, int* mapPtr, int* elevationPtr, int* tileP
debugPrint("\n the start elev level %d\n", *elevationPtr);
int v18 = (_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth() * _elevatorFrmImages[ELEVATOR_FRM_GAUGE].getHeight()) / 13;
float v42 = 12.0f / (float)(gElevatorLevels[elevator] - 1);
int gaugeSliceSize = (_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth() * _elevatorFrmImages[ELEVATOR_FRM_GAUGE].getHeight()) / 13;
float gaugeUnitsPerLevel = 12.0f / (float)(gElevatorLevels[elevator] - 1);
blitBufferToBuffer(
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getData() + v18 * (int)((float)(*elevationPtr) * v42),
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getData() + gaugeSliceSize * (int)((float)(*elevationPtr) * gaugeUnitsPerLevel),
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth(),
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getHeight() / 13,
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth(),
@@ -424,12 +424,12 @@ int elevatorSelectLevel(int elevator, int* mapPtr, int* elevationPtr, int* tileP
keyCode -= 500;
if (*elevationPtr != keyCode) {
float v43 = (float)(gElevatorLevels[elevator] - 1) / 12.0f;
float levelStep = (float)(gElevatorLevels[elevator] - 1) / 12.0f;
unsigned int delay = (unsigned int)(v43 * 276.92307);
unsigned int delay = (unsigned int)(levelStep * 276.92307);
if (keyCode < *elevationPtr) {
v43 = -v43;
levelStep = -levelStep;
}
int numberOfLevelsTravelled = keyCode - *elevationPtr;
@@ -439,15 +439,15 @@ int elevatorSelectLevel(int elevator, int* mapPtr, int* elevationPtr, int* tileP
soundPlayFile(gElevatorSoundEffects[gElevatorLevels[elevator] - 2][numberOfLevelsTravelled]);
float v41 = (float)keyCode * v42;
float v44 = (float)(*elevationPtr) * v42;
float targetGaugePosition = (float)keyCode * gaugeUnitsPerLevel;
float currentGaugePosition = (float)(*elevationPtr) * gaugeUnitsPerLevel;
do {
sharedFpsLimiter.mark();
unsigned int tick = getTicks();
v44 += v43;
currentGaugePosition += levelStep;
blitBufferToBuffer(
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getData() + v18 * (int)v44,
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getData() + gaugeSliceSize * (int)currentGaugePosition,
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth(),
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getHeight() / 13,
_elevatorFrmImages[ELEVATOR_FRM_GAUGE].getWidth(),
@@ -460,7 +460,7 @@ int elevatorSelectLevel(int elevator, int* mapPtr, int* elevationPtr, int* tileP
renderPresent();
sharedFpsLimiter.throttle();
} while ((v43 <= 0.0 || v44 < v41) && (v43 > 0.0 || v44 > v41));
} while ((levelStep <= 0.0 || currentGaugePosition < targetGaugePosition) && (levelStep > 0.0 || currentGaugePosition > targetGaugePosition));
inputPauseForTocks(200);
}
+4 -4
View File
@@ -324,14 +324,14 @@ static int interfaceFontGetMonospacedCharacterWidthImpl()
return 0;
}
int v1;
int spacing;
if (gCurrentInterfaceFontDescriptor->wordSpacing <= gCurrentInterfaceFontDescriptor->field_8) {
v1 = gCurrentInterfaceFontDescriptor->lineSpacing;
spacing = gCurrentInterfaceFontDescriptor->lineSpacing;
} else {
v1 = gCurrentInterfaceFontDescriptor->letterSpacing;
spacing = gCurrentInterfaceFontDescriptor->letterSpacing;
}
return v1 + gCurrentInterfaceFontDescriptor->maxHeight;
return spacing + gCurrentInterfaceFontDescriptor->maxHeight;
}
// 0x4422B4
+3 -3
View File
@@ -1451,7 +1451,7 @@ char* sfxBuildWeaponName(int effectType, Object* weapon, int hitMode, Object* ta
break;
case OBJ_TYPE_SCENERY:
protoGetProto(target->pid, &proto);
material = proto->scenery.field_2C;
material = proto->scenery.material;
break;
case OBJ_TYPE_WALL:
protoGetProto(target->pid, &proto);
@@ -1508,7 +1508,7 @@ char* sfxBuildOpenName(Object* object, int action)
char scenerySoundId;
Proto* proto;
if (protoGetProto(object->pid, &proto) != -1) {
scenerySoundId = proto->scenery.field_34;
scenerySoundId = proto->scenery.soundId;
} else {
scenerySoundId = 'A';
}
@@ -1516,7 +1516,7 @@ char* sfxBuildOpenName(Object* object, int action)
} else {
Proto* proto;
protoGetProto(object->pid, &proto);
snprintf(_sfx_file_name, sizeof(_sfx_file_name), "I%cCNTNR%c", _snd_lookup_scenery_action[action], proto->item.field_80);
snprintf(_sfx_file_name, sizeof(_sfx_file_name), "I%cCNTNR%c", _snd_lookup_scenery_action[action], proto->item.soundId);
}
compat_strupr(_sfx_file_name);
return _sfx_file_name;
+3 -3
View File
@@ -76,7 +76,7 @@ static void healingItemsInitCustom();
typedef struct DrugDescription {
int drugPid;
int gvar;
int field_8;
int maxActiveEffects;
} DrugDescription;
typedef struct BookDescription {
@@ -2756,7 +2756,7 @@ static bool _drug_effect_allowed(Object* critter, int pid)
return true;
}
if (drugDescription->field_8 == 0) {
if (drugDescription->maxActiveEffects == 0) {
return true;
}
@@ -2766,7 +2766,7 @@ static bool _drug_effect_allowed(Object* critter, int pid)
while (drugEffectEvent != nullptr) {
if (drugEffectEvent->drugPid == pid) {
count++;
if (count >= drugDescription->field_8) {
if (count >= drugDescription->maxActiveEffects) {
return false;
}
}
+24 -24
View File
@@ -68,7 +68,7 @@ static int mapLocalVariablesLoad(File* stream);
static void _map_place_dude_and_mouse();
static void square_init();
static void _square_reset();
static int _square_load(File* stream, int a2);
static int _square_load(File* stream, int flags);
static int mapHeaderWrite(MapHeader* ptr, File* stream);
static int mapHeaderRead(MapHeader* ptr, File* stream);
@@ -1094,14 +1094,14 @@ int mapLoadSaved(char* fileName)
if (!wmMapIsSaveable()) {
debugPrint("\nDestroying RANDOM encounter map.");
char v15[16];
strcpy(v15, gMapHeader.name);
char mapName[16];
strcpy(mapName, gMapHeader.name);
_strmfe(gMapHeader.name, v15, "SAV");
_strmfe(gMapHeader.name, mapName, "SAV");
_MapDirEraseFile_("MAPS\\", gMapHeader.name);
strcpy(gMapHeader.name, v15);
strcpy(gMapHeader.name, mapName);
}
return rc;
@@ -1448,7 +1448,7 @@ static int _map_save_file(File* stream)
}
// 0x483C98
int _map_save_in_game(bool a1)
int _map_save_in_game(bool isLeavingMap)
{
if (gMapHeader.name[0] == '\0') {
return 0;
@@ -1457,7 +1457,7 @@ int _map_save_in_game(bool a1)
animationStop();
_partyMemberSaveProtos();
if (a1) {
if (isLeavingMap) {
_queue_leaving_map();
_partyMemberPrepLoad();
_partyMemberPrepItemSaveAll();
@@ -1477,7 +1477,7 @@ int _map_save_in_game(bool a1)
char name[16];
if (a1 && !wmMapIsSaveable()) {
if (isLeavingMap && !wmMapIsSaveable()) {
debugPrint("\nNot saving RANDOM encounter map.");
strcpy(name, gMapHeader.name);
@@ -1497,7 +1497,7 @@ int _map_save_in_game(bool a1)
automapSaveCurrent();
if (a1) {
if (isLeavingMap) {
gMapHeader.name[0] = '\0';
_obj_remove_all();
_proto_remove_all();
@@ -1715,12 +1715,12 @@ static void _square_reset()
*p = (((buildFid(OBJ_TYPE_TILE, 1, 0, 0, 0) & 0xFFF) | (((fid >> 16) & 0xF000) >> 12)) << 16) | (fid & 0xFFFF);
fid = *p;
int v3 = (fid & 0xF000) >> 12;
int v4 = (buildFid(OBJ_TYPE_TILE, 1, 0, 0, 0) & 0xFFF) | v3;
int tileFlags = (fid & 0xF000) >> 12;
int updatedLowerTile = (buildFid(OBJ_TYPE_TILE, 1, 0, 0, 0) & 0xFFF) | tileFlags;
fid &= ~0xFFFF;
*p = v4 | ((fid >> 16) << 16);
*p = updatedLowerTile | ((fid >> 16) << 16);
p++;
}
@@ -1731,10 +1731,10 @@ static void _square_reset()
// 0x48431C
static int _square_load(File* stream, int flags)
{
int v6;
int v7;
int v8;
int v9;
int upperTileWord;
int upperTileFlags;
int upperTileArtId;
int lowerTileWord;
_square_reset();
@@ -1746,16 +1746,16 @@ static int _square_load(File* stream, int flags)
}
for (int tile = 0; tile < SQUARE_GRID_SIZE; tile++) {
v6 = arr[tile];
v6 &= ~(0xFFFF);
v6 >>= 16;
upperTileWord = arr[tile];
upperTileWord &= ~(0xFFFF);
upperTileWord >>= 16;
v7 = (v6 & 0xF000) >> 12;
v7 &= ~(0x01);
upperTileFlags = (upperTileWord & 0xF000) >> 12;
upperTileFlags &= ~(0x01);
v8 = v6 & 0xFFF;
v9 = arr[tile] & 0xFFFF;
arr[tile] = ((v8 | (v7 << 12)) << 16) | v9;
upperTileArtId = upperTileWord & 0xFFF;
lowerTileWord = arr[tile] & 0xFFFF;
arr[tile] = ((upperTileArtId | (upperTileFlags << 12)) << 16) | lowerTileWord;
}
}
}
+3 -3
View File
@@ -93,7 +93,7 @@ int mapGetGlobalVar(int var, ProgramValue& value);
int mapSetLocalVar(int var, ProgramValue& value);
int mapGetLocalVar(int var, ProgramValue& value);
int mapAllocLocalVars(int numNewVars);
void mapSetStart(int a1, int a2, int a3);
void mapSetStart(int tile, int elevation, int rotation);
char* mapGetName(int map_num, int elev);
bool mapAreSameArea(int map_num1, int map_num2);
int _get_map_idx_same(int map_num1, int map_num2);
@@ -101,7 +101,7 @@ char* mapGetCityName(int map_num);
char* mapDescriptionById(int map_index);
int mapGetCurrentMap();
int mapScroll(int dx, int dy);
int mapSetEnteringLocation(int a1, int a2, int a3);
int mapSetEnteringLocation(int elevation, int tile, int rotation);
void mapNewMap();
int mapLoadByName(char* fileName);
int mapLoadById(int map_index);
@@ -109,7 +109,7 @@ int mapLoadSaved(char* fileName);
int mapGetLoadedAreaId();
int mapSetTransition(MapTransition* transition);
int mapHandleTransition();
int _map_save_in_game(bool a1);
int _map_save_in_game(bool isLeavingMap);
} // namespace fallout
+13 -12
View File
@@ -18,14 +18,15 @@
namespace fallout {
#define CRITTER_FLAG_COUNT 10
#define SUBDATA_ROWS_PER_COLUMN 9
#define YES 0
#define NO 1
static int proto_choose_container_flags(Proto* proto);
static int proto_subdata_setup_int_button(const char* title, int key, int value, int min_value, int max_value, int* y, int a7);
static int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y, int a5);
static int proto_subdata_setup_pid_button(const char* title, int key, int pid, int* y, int a5);
static int proto_subdata_setup_int_button(const char* title, int key, int value, int min_value, int max_value, int* y, int itemIndex);
static int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y, int itemIndex);
static int proto_subdata_setup_pid_button(const char* title, int key, int pid, int* y, int itemIndex);
static void proto_critter_flags_redraw(int win, int pid);
static int proto_critter_flags_modify(int pid);
static int mp_pick_kill_type();
@@ -229,7 +230,7 @@ int proto_choose_container_flags(Proto* proto)
}
// 0x492A3C
int proto_subdata_setup_int_button(const char* title, int key, int value, int min_value, int max_value, int* y, int a7)
int proto_subdata_setup_int_button(const char* title, int key, int value, int min_value, int max_value, int* y, int itemIndex)
{
char text[36];
int button_x;
@@ -238,11 +239,11 @@ int proto_subdata_setup_int_button(const char* title, int key, int value, int mi
button_x = 10;
value_offset_x = 90;
if (a7 == 9) {
if (itemIndex == SUBDATA_ROWS_PER_COLUMN) {
*y -= 189;
}
if (a7 > 8) {
if (itemIndex >= SUBDATA_ROWS_PER_COLUMN) {
button_x = 165;
value_offset_x -= 16;
}
@@ -280,7 +281,7 @@ int proto_subdata_setup_int_button(const char* title, int key, int value, int mi
}
// 0x492B28
int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y, int a5)
int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y, int itemIndex)
{
char text[36];
char* pch;
@@ -290,11 +291,11 @@ int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y,
button_x = 10;
value_offset_x = 90;
if (a5 == 9) {
if (itemIndex == SUBDATA_ROWS_PER_COLUMN) {
*y -= 189;
}
if (a5 > 8) {
if (itemIndex >= SUBDATA_ROWS_PER_COLUMN) {
button_x = 165;
value_offset_x -= 16;
}
@@ -336,7 +337,7 @@ int proto_subdata_setup_fid_button(const char* title, int key, int fid, int* y,
}
// 0x492C20
int proto_subdata_setup_pid_button(const char* title, int key, int pid, int* y, int a5)
int proto_subdata_setup_pid_button(const char* title, int key, int pid, int* y, int itemIndex)
{
int button_x;
int value_offset_x;
@@ -344,11 +345,11 @@ int proto_subdata_setup_pid_button(const char* title, int key, int pid, int* y,
button_x = 10;
value_offset_x = 90;
if (a5 == 9) {
if (itemIndex == SUBDATA_ROWS_PER_COLUMN) {
*y -= 189;
}
if (a5 > 8) {
if (itemIndex >= SUBDATA_ROWS_PER_COLUMN) {
button_x = 165;
value_offset_x = 74;
}
+22 -22
View File
@@ -40,7 +40,7 @@ static int _blitAlpha(int win, unsigned char* data, int width, int height, int p
static int _movieScaleWindow(int win, unsigned char* data, int width, int height, int pitch);
static int _blitNormal(int win, unsigned char* data, int width, int height, int pitch);
static void movieSetPaletteEntriesImpl(unsigned char* palette, int start, int end);
static void _cleanupMovie(int a1);
static void _cleanupMovie(bool shouldEndMovie);
static void _cleanupLast();
static File* movieOpen(char* filePath);
static void movieLoadSubtitles(char* filePath);
@@ -207,8 +207,8 @@ static bool movieReadImpl(void* handle, void* buf, int count)
// 0x486654
static void movieDirectImpl(unsigned char* pixels, int src_width, int src_height, int src_x, int src_y, int dst_width, int dst_height, int dst_x, int dst_y)
{
int v14;
int v15;
int movieWindowWidth;
int movieWindowSpan;
SDL_Rect srcRect;
srcRect.x = src_x;
@@ -216,15 +216,15 @@ static void movieDirectImpl(unsigned char* pixels, int src_width, int src_height
srcRect.w = src_width;
srcRect.h = src_height;
v14 = gMovieWindowRect.right - gMovieWindowRect.left;
v15 = gMovieWindowRect.right - gMovieWindowRect.left + 1;
movieWindowWidth = gMovieWindowRect.right - gMovieWindowRect.left;
movieWindowSpan = movieWindowWidth + 1;
SDL_Rect destRect;
if (_movieScaleFlag) {
if ((gMovieFlags & MOVIE_EXTENDED_FLAG_0x08) != 0) {
destRect.y = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - dst_height) / 2;
destRect.x = (v15 - 4 * src_width / 3) / 2;
destRect.x = (movieWindowSpan - 4 * src_width / 3) / 2;
} else {
destRect.y = _movieY + gMovieWindowRect.top;
destRect.x = gMovieWindowRect.left + _movieX;
@@ -235,7 +235,7 @@ static void movieDirectImpl(unsigned char* pixels, int src_width, int src_height
} else {
if ((gMovieFlags & MOVIE_EXTENDED_FLAG_0x08) != 0) {
destRect.y = (gMovieWindowRect.bottom - gMovieWindowRect.top + 1 - dst_height) / 2;
destRect.x = (v15 - dst_width) / 2;
destRect.x = (movieWindowSpan - dst_width) / 2;
} else {
destRect.y = _movieY + gMovieWindowRect.top;
destRect.x = gMovieWindowRect.left + _movieX;
@@ -298,10 +298,10 @@ int _movieScaleSubRect(int win, unsigned char* data, int width, int height, int
return 0;
}
int v1 = width / 3;
int tripletCount = width / 3;
for (int y = 0; y < height; y++) {
int x;
for (x = 0; x < v1; x++) {
for (x = 0; x < tripletCount; x++) {
unsigned int value = data[0];
value |= data[1] << 8;
value |= data[2] << 16;
@@ -404,7 +404,7 @@ void movieInit()
}
// 0x486E98
static void _cleanupMovie(int a1)
static void _cleanupMovie(bool shouldEndMovie)
{
if (!_running) {
return;
@@ -426,7 +426,7 @@ static void _cleanupMovie(int a1)
MVE_lastBuffer = nullptr;
}
if (a1) {
if (shouldEndMovie) {
MVE_rmEndMovie();
}
@@ -637,11 +637,11 @@ static void movieRenderSubtitles()
return;
}
int v1 = fontGetLineHeight();
int v2 = (480 - _lastMovieH - _lastMovieY - v1) / 2 + _lastMovieH + _lastMovieY;
int lineHeight = fontGetLineHeight();
int subtitleY = (480 - _lastMovieH - _lastMovieY - lineHeight) / 2 + _lastMovieH + _lastMovieY;
if (_subtitleH + v2 > windowGetYres()) {
_subtitleH = windowGetYres() - v2;
if (_subtitleH + subtitleY > windowGetYres()) {
_subtitleH = windowGetYres() - subtitleY;
}
int frame;
@@ -655,7 +655,7 @@ static void movieRenderSubtitles()
MovieSubtitleListNode* next = gMovieSubtitleHead->next;
windowFill(gMovieWindow, 0, v2, _subtitleW, _subtitleH, 0);
windowFill(gMovieWindow, 0, subtitleY, _subtitleW, _subtitleH, 0);
int oldFont;
if (gMovieSubtitlesFont != -1) {
@@ -664,12 +664,12 @@ static void movieRenderSubtitles()
}
int colorIndex = (gMovieSubtitlesColorR << 10) | (gMovieSubtitlesColorG << 5) | gMovieSubtitlesColorB;
windowWrapLine(gMovieWindow, gMovieSubtitleHead->text, _subtitleW, _subtitleH, 0, v2, _colorTable[colorIndex] | 0x2000000, TEXT_ALIGNMENT_CENTER);
windowWrapLine(gMovieWindow, gMovieSubtitleHead->text, _subtitleW, _subtitleH, 0, subtitleY, _colorTable[colorIndex] | 0x2000000, TEXT_ALIGNMENT_CENTER);
Rect rect;
rect.right = _subtitleW;
rect.top = v2;
rect.bottom = v2 + _subtitleH;
rect.top = subtitleY;
rect.bottom = subtitleY + _subtitleH;
rect.left = 0;
windowRefreshRect(gMovieWindow, &rect);
@@ -806,12 +806,12 @@ static int _stepMovie()
fileRead(_alphaBuf, 1, size, _alphaHandle);
}
int v1 = _MVE_rmStepMovie();
if (v1 != -1) {
int stepResult = _MVE_rmStepMovie();
if (stepResult != -1) {
movieRenderSubtitles();
}
return v1;
return stepResult;
}
// 0x487BC8
+9 -9
View File
@@ -20,7 +20,7 @@ typedef struct Nevs {
int type;
int hits;
bool busy;
void (*field_38)();
void (*callbackProc)(); // unused
} Nevs;
static Nevs* _nevs_alloc();
@@ -138,18 +138,18 @@ int _nevs_addevent(const char* name, Program* program, int proc, int type)
nevs->program = program;
nevs->proc = proc;
nevs->type = type;
nevs->field_38 = nullptr;
nevs->callbackProc = nullptr;
return 0;
}
// nevs_clearevent
// 0x48859C
int _nevs_clearevent(const char* a1)
int _nevs_clearevent(const char* name)
{
debugPrint("nevs_clearevent( '%s');\n", a1);
debugPrint("nevs_clearevent( '%s');\n", name);
Nevs* nevs = _nevs_find(a1);
Nevs* nevs = _nevs_find(name);
if (nevs != nullptr) {
// NOTE: Uninline.
_nevs_reset(nevs);
@@ -173,7 +173,7 @@ int _nevs_signal(const char* name)
debugPrint("nep: %p, used = %u, prog = %p, proc = %d", nevs, nevs->used, nevs->program, nevs->proc);
if (nevs->used
&& ((nevs->program != nullptr && nevs->proc != 0) || nevs->field_38 != nullptr)
&& ((nevs->program != nullptr && nevs->proc != 0) || nevs->callbackProc != nullptr)
&& !nevs->busy) {
nevs->hits++;
gNevsHits++;
@@ -198,7 +198,7 @@ void _nevs_update()
for (int index = 0; index < NEVS_COUNT; index++) {
Nevs* nevs = &(gNevs[index]);
if (nevs->used
&& ((nevs->program != nullptr && nevs->proc != 0) || nevs->field_38 != nullptr)
&& ((nevs->program != nullptr && nevs->proc != 0) || nevs->callbackProc != nullptr)
&& !nevs->busy) {
if (nevs->hits > 0) {
nevs->busy = true;
@@ -206,10 +206,10 @@ void _nevs_update()
nevs->hits -= 1;
gNevsHits += nevs->hits;
if (nevs->field_38 == nullptr) {
if (nevs->callbackProc == nullptr) {
_executeProc(nevs->program, nevs->proc);
} else {
nevs->field_38();
nevs->callbackProc();
}
nevs->busy = false;
+1 -1
View File
@@ -211,7 +211,7 @@ typedef struct CritterCombatData {
} CritterCombatData;
typedef struct CritterObjectData {
int field_0; // obj_pud.reaction_to_pc
int reaction; // obj_pud.reaction_to_pc (unused)
CritterCombatData combat; // obj_pud.combat_data
int hp; // obj_pud.curr_hp
int radiation; // obj_pud.curr_rad
+1 -1
View File
@@ -2080,7 +2080,7 @@ bool _obj_portal_is_walk_thru(Object* obj)
}
}
return (proto->scenery.data.generic.field_0 & 0x04) != 0;
return (proto->scenery.data.generic.genericFlags & 0x04) != 0;
}
// 0x48B2E8
+10 -9
View File
@@ -42,7 +42,7 @@ typedef enum OptionsWindowFrm {
static int optionsWindowInit();
static int optionsWindowFree();
static void _ShadeScreen(bool a1);
static void _ShadeScreen(bool preserveWorldState);
// 0x48FC0C
static const int gPauseWindowFrmIds[PAUSE_WINDOW_FRM_COUNT] = {
@@ -328,10 +328,11 @@ static int optionsWindowFree()
}
// 0x4902B0
int showPause(bool a1)
// preserveWorldState is always false
int showPause(bool preserveWorldState)
{
bool gameMouseWasVisible;
if (!a1) {
if (!preserveWorldState) {
gOptionsWindowIsoWasEnabled = isoDisable();
colorCycleDisable();
@@ -342,7 +343,7 @@ int showPause(bool a1)
}
gameMouseSetCursor(MOUSE_CURSOR_ARROW);
_ShadeScreen(a1);
_ShadeScreen(preserveWorldState);
FrmImage frmImages[PAUSE_WINDOW_FRM_COUNT];
for (int index = 0; index < PAUSE_WINDOW_FRM_COUNT; index++) {
@@ -368,7 +369,7 @@ int showPause(bool a1)
int pauseWindowX = (screenGetWidth() - frmImages[PAUSE_WINDOW_FRM_BACKGROUND].getWidth()) / 2;
int pauseWindowY = (screenGetHeight() - frmImages[PAUSE_WINDOW_FRM_BACKGROUND].getHeight()) / 2;
if (a1) {
if (preserveWorldState) {
pauseWindowX -= 65;
pauseWindowY -= 24;
} else {
@@ -471,14 +472,14 @@ int showPause(bool a1)
sharedFpsLimiter.throttle();
}
if (!a1) {
if (!preserveWorldState) {
tileWindowRefresh();
}
windowDestroy(window);
messageListFree(&gPreferencesMessageList);
if (!a1) {
if (!preserveWorldState) {
if (gameMouseWasVisible) {
gameMouseObjectsShow();
}
@@ -498,9 +499,9 @@ int showPause(bool a1)
}
// 0x490748
static void _ShadeScreen(bool a1)
static void _ShadeScreen(bool preserveWorldState)
{
if (a1) {
if (preserveWorldState) {
mouseHideCursor();
} else {
mouseHideCursor();
+1 -1
View File
@@ -4,7 +4,7 @@
namespace fallout {
int showOptions();
int showPause(bool a1);
int showPause(bool preserveWorldState);
int _init_options_menu();
} // namespace fallout
+26 -26
View File
@@ -391,7 +391,7 @@ int proto_item_init(Proto* proto, int a2)
proto->item.weight = 10;
proto->item.cost = 0;
proto->item.inventoryFid = -1;
proto->item.field_80 = '0';
proto->item.soundId = '0';
return 0;
}
@@ -563,7 +563,7 @@ int objectDataRead(Object* obj, File* stream)
if (fileReadInt32(stream, &temp) == -1) return -1;
if (PID_TYPE(obj->pid) == OBJ_TYPE_CRITTER) {
if (fileReadInt32(stream, &(obj->data.critter.field_0)) == -1) return -1;
if (fileReadInt32(stream, &(obj->data.critter.reaction)) == -1) return -1;
if (objectCritterCombatDataRead(&(obj->data.critter.combat), stream) == -1) return -1;
if (fileReadInt32(stream, &(obj->data.critter.hp)) == -1) return -1;
if (fileReadInt32(stream, &(obj->data.critter.radiation)) == -1) return -1;
@@ -775,8 +775,8 @@ static int _proto_update_gen(Object* obj)
data->scenery.door.openFlags = proto->scenery.data.door.openFlags;
break;
case SCENERY_TYPE_STAIRS:
data->scenery.stairs.destinationBuiltTile = proto->scenery.data.stairs.field_0;
data->scenery.stairs.destinationMap = proto->scenery.data.stairs.field_4;
data->scenery.stairs.destinationBuiltTile = proto->scenery.data.stairs.destinationBuiltTile;
data->scenery.stairs.destinationMap = proto->scenery.data.stairs.destinationMap;
break;
case SCENERY_TYPE_ELEVATOR:
data->scenery.elevator.type = proto->scenery.data.elevator.type;
@@ -784,7 +784,7 @@ static int _proto_update_gen(Object* obj)
break;
case SCENERY_TYPE_LADDER_UP:
case SCENERY_TYPE_LADDER_DOWN:
data->scenery.ladder.destinationMap = proto->scenery.data.ladder.field_0;
data->scenery.ladder.destinationMap = proto->scenery.data.ladder.destinationMap;
break;
}
break;
@@ -953,8 +953,8 @@ int proto_scenery_init(Proto* proto, int pid)
proto->scenery.sid = -1;
proto->scenery.type = SCENERY_TYPE_GENERIC;
proto_scenery_subdata_init(proto, proto->scenery.type);
proto->scenery.field_2C = -1;
proto->scenery.field_34 = '0';
proto->scenery.material = -1;
proto->scenery.soundId = '0';
return 0;
}
@@ -968,8 +968,8 @@ int proto_scenery_subdata_init(Proto* proto, int type)
proto->scenery.extendedFlags |= 0x800;
break;
case SCENERY_TYPE_STAIRS:
proto->scenery.data.stairs.field_0 = -1;
proto->scenery.data.stairs.field_4 = -1;
proto->scenery.data.stairs.destinationBuiltTile = -1;
proto->scenery.data.stairs.destinationMap = -1;
proto->scenery.extendedFlags |= 0x800;
break;
case SCENERY_TYPE_ELEVATOR:
@@ -978,11 +978,11 @@ int proto_scenery_subdata_init(Proto* proto, int type)
proto->scenery.extendedFlags |= 0x800;
break;
case SCENERY_TYPE_LADDER_UP:
proto->scenery.data.ladder.field_0 = -1;
proto->scenery.data.ladder.destinationMap = -1;
proto->scenery.extendedFlags |= 0x800;
break;
case SCENERY_TYPE_LADDER_DOWN:
proto->scenery.data.ladder.field_0 = -1;
proto->scenery.data.ladder.destinationMap = -1;
proto->scenery.extendedFlags |= 0x800;
break;
}
@@ -1240,7 +1240,7 @@ int protoGetDataMember(int pid, int member, ProtoDataMemberValue* value)
value->integerValue = proto->scenery.type;
break;
case SCENERY_DATA_MEMBER_MATERIAL:
value->integerValue = proto->scenery.field_2C;
value->integerValue = proto->scenery.material;
break;
default:
debugPrint("\n\tError: Unimp'd data member in member in proto_data_member!");
@@ -1635,8 +1635,8 @@ static int protoSceneryDataRead(SceneryProtoData* scenery_data, int type, File*
return 0;
case SCENERY_TYPE_STAIRS:
if (fileReadInt32(stream, &(scenery_data->stairs.field_0)) == -1) return -1;
if (fileReadInt32(stream, &(scenery_data->stairs.field_4)) == -1) return -1;
if (fileReadInt32(stream, &(scenery_data->stairs.destinationBuiltTile)) == -1) return -1;
if (fileReadInt32(stream, &(scenery_data->stairs.destinationMap)) == -1) return -1;
return 0;
case SCENERY_TYPE_ELEVATOR:
@@ -1646,11 +1646,11 @@ static int protoSceneryDataRead(SceneryProtoData* scenery_data, int type, File*
return 0;
case SCENERY_TYPE_LADDER_UP:
case SCENERY_TYPE_LADDER_DOWN:
if (fileReadInt32(stream, &(scenery_data->ladder.field_0)) == -1) return -1;
if (fileReadInt32(stream, &(scenery_data->ladder.destinationMap)) == -1) return -1;
return 0;
case SCENERY_TYPE_GENERIC:
if (fileReadInt32(stream, &(scenery_data->generic.field_0)) == -1) return -1;
if (fileReadInt32(stream, &(scenery_data->generic.genericFlags)) == -1) return -1;
return 0;
}
@@ -1679,7 +1679,7 @@ static int protoRead(Proto* proto, File* stream)
if (_db_freadInt(stream, &(proto->item.weight)) == -1) return -1;
if (fileReadInt32(stream, &(proto->item.cost)) == -1) return -1;
if (fileReadInt32(stream, &(proto->item.inventoryFid)) == -1) return -1;
if (fileReadUInt8(stream, &(proto->item.field_80)) == -1) return -1;
if (fileReadUInt8(stream, &(proto->item.soundId)) == -1) return -1;
if (protoItemDataRead(&(proto->item.data), proto->item.type, stream) == -1) return -1;
return 0;
@@ -1703,8 +1703,8 @@ static int protoRead(Proto* proto, File* stream)
if (fileReadInt32(stream, &(proto->scenery.extendedFlags)) == -1) return -1;
if (fileReadInt32(stream, &(proto->scenery.sid)) == -1) return -1;
if (fileReadInt32(stream, &(proto->scenery.type)) == -1) return -1;
if (fileReadInt32(stream, &(proto->scenery.field_2C)) == -1) return -1;
if (fileReadUInt8(stream, &(proto->scenery.field_34)) == -1) return -1;
if (fileReadInt32(stream, &(proto->scenery.material)) == -1) return -1;
if (fileReadUInt8(stream, &(proto->scenery.soundId)) == -1) return -1;
if (protoSceneryDataRead(&(proto->scenery.data), proto->scenery.type, stream) == -1) return -1;
return 0;
case OBJ_TYPE_WALL:
@@ -1821,8 +1821,8 @@ static int protoSceneryDataWrite(SceneryProtoData* scenery_data, int type, File*
return 0;
case SCENERY_TYPE_STAIRS:
if (fileWriteInt32(stream, scenery_data->stairs.field_0) == -1) return -1;
if (fileWriteInt32(stream, scenery_data->stairs.field_4) == -1) return -1;
if (fileWriteInt32(stream, scenery_data->stairs.destinationBuiltTile) == -1) return -1;
if (fileWriteInt32(stream, scenery_data->stairs.destinationMap) == -1) return -1;
return 0;
case SCENERY_TYPE_ELEVATOR:
@@ -1832,11 +1832,11 @@ static int protoSceneryDataWrite(SceneryProtoData* scenery_data, int type, File*
return 0;
case SCENERY_TYPE_LADDER_UP:
case SCENERY_TYPE_LADDER_DOWN:
if (fileWriteInt32(stream, scenery_data->ladder.field_0) == -1) return -1;
if (fileWriteInt32(stream, scenery_data->ladder.destinationMap) == -1) return -1;
return 0;
case SCENERY_TYPE_GENERIC:
if (fileWriteInt32(stream, scenery_data->generic.field_0) == -1) return -1;
if (fileWriteInt32(stream, scenery_data->generic.genericFlags) == -1) return -1;
return 0;
}
@@ -1864,7 +1864,7 @@ static int protoWrite(Proto* proto, File* stream)
if (_db_fwriteLong(stream, proto->item.weight) == -1) return -1;
if (fileWriteInt32(stream, proto->item.cost) == -1) return -1;
if (fileWriteInt32(stream, proto->item.inventoryFid) == -1) return -1;
if (fileWriteUInt8(stream, proto->item.field_80) == -1) return -1;
if (fileWriteUInt8(stream, proto->item.soundId) == -1) return -1;
if (protoItemDataWrite(&(proto->item.data), proto->item.type, stream) == -1) return -1;
return 0;
@@ -1887,8 +1887,8 @@ static int protoWrite(Proto* proto, File* stream)
if (fileWriteInt32(stream, proto->scenery.extendedFlags) == -1) return -1;
if (fileWriteInt32(stream, proto->scenery.sid) == -1) return -1;
if (fileWriteInt32(stream, proto->scenery.type) == -1) return -1;
if (fileWriteInt32(stream, proto->scenery.field_2C) == -1) return -1;
if (fileWriteUInt8(stream, proto->scenery.field_34) == -1) return -1;
if (fileWriteInt32(stream, proto->scenery.material) == -1) return -1;
if (fileWriteUInt8(stream, proto->scenery.soundId) == -1) return -1;
if (protoSceneryDataWrite(&(proto->scenery.data), proto->scenery.type, stream) == -1) return -1;
case OBJ_TYPE_WALL:
if (fileWriteInt32(stream, proto->wall.lightDistance) == -1) return -1;
+32 -30
View File
@@ -619,45 +619,45 @@ static int _obj_remove_from_inven(Object* critter, Object* item)
{
Rect updatedRect;
int fid;
int v11 = 0;
int appearanceUpdateType = 0;
if (critterGetItem2(critter) == item) {
if (critter != gDude || interfaceGetCurrentHand()) {
fid = buildFid(OBJ_TYPE_CRITTER, critter->fid & 0xFFF, FID_ANIM_TYPE(critter->fid), 0, critter->rotation);
objectSetFid(critter, fid, &updatedRect);
v11 = 2;
appearanceUpdateType = 2;
} else {
v11 = 1;
appearanceUpdateType = 1;
}
} else if (critterGetItem1(critter) == item) {
if (critter == gDude && !interfaceGetCurrentHand()) {
fid = buildFid(OBJ_TYPE_CRITTER, critter->fid & 0xFFF, FID_ANIM_TYPE(critter->fid), 0, critter->rotation);
objectSetFid(critter, fid, &updatedRect);
v11 = 2;
appearanceUpdateType = 2;
} else {
v11 = 1;
appearanceUpdateType = 1;
}
} else if (critterGetArmor(critter) == item) {
if (critter == gDude) {
int v5 = 1;
int defaultFid = 1;
Proto* proto;
if (protoGetProto(0x1000000, &proto) != -1) {
v5 = proto->fid;
defaultFid = proto->fid;
}
fid = buildFid(OBJ_TYPE_CRITTER, v5, FID_ANIM_TYPE(critter->fid), (critter->fid & 0xF000) >> 12, critter->rotation);
fid = buildFid(OBJ_TYPE_CRITTER, defaultFid, FID_ANIM_TYPE(critter->fid), (critter->fid & 0xF000) >> 12, critter->rotation);
objectSetFid(critter, fid, &updatedRect);
v11 = 3;
appearanceUpdateType = 3;
}
}
int rc = itemRemove(critter, item, 1);
if (v11 >= 2) {
if (appearanceUpdateType >= 2) {
tileWindowRefreshRect(&updatedRect, critter->elevation);
}
if (v11 <= 2 && critter == gDude) {
if (appearanceUpdateType <= 2 && critter == gDude) {
interfaceUpdateItems(false, INTERFACE_ITEM_ACTION_DEFAULT, INTERFACE_ITEM_ACTION_DEFAULT);
}
@@ -1119,12 +1119,12 @@ int objectUseItem(Object* userObj, Object* item)
if (root != nullptr) {
int flags = item->flags & OBJECT_IN_ANY_HAND;
itemRemove(root, item, 1);
Object* v8 = itemReplace(root, item, flags);
Object* replacementItem = itemReplace(root, item, flags);
if (root == gDude) {
int leftItemAction;
int rightItemAction;
interfaceGetItemActions(&leftItemAction, &rightItemAction);
if (v8 == nullptr) {
if (replacementItem == nullptr) {
if ((flags & OBJECT_IN_LEFT_HAND) != 0) {
leftItemAction = INTERFACE_ITEM_ACTION_DEFAULT;
} else if ((flags & OBJECT_IN_RIGHT_HAND) != 0) {
@@ -1243,32 +1243,32 @@ static int _protinst_default_use_item(Object* user, Object* targetObj, Object* i
int objectUseItemOnInternal(Object* critter, Object* targetObj, Object* item)
{
int messageId = -1;
int criticalChanceModifier = 0;
int skillBonus = 0;
int skill = -1;
switch (item->pid) {
case PROTO_ID_DOCTORS_BAG:
// The supplies in the Doctor's Bag run out.
messageId = 900;
criticalChanceModifier = 20;
skillBonus = 20;
skill = SKILL_DOCTOR;
break;
case PROTO_ID_FIRST_AID_KIT:
// The supplies in the First Aid Kit run out.
messageId = 901;
criticalChanceModifier = 20;
skillBonus = 20;
skill = SKILL_FIRST_AID;
break;
case PROTO_ID_PARAMEDICS_BAG:
// The supplies in the Paramedic's Bag run out.
messageId = 910;
criticalChanceModifier = 40;
skillBonus = 40;
skill = SKILL_DOCTOR;
break;
case PROTO_ID_FIELD_MEDIC_FIRST_AID_KIT:
// The supplies in the Field Medic First Aid Kit run out.
messageId = 911;
criticalChanceModifier = 40;
skillBonus = 40;
skill = SKILL_FIRST_AID;
break;
}
@@ -1333,7 +1333,7 @@ int objectUseItemOnInternal(Object* critter, Object* targetObj, Object* item)
return -1;
}
if (skillUse(critter, targetObj, skill, criticalChanceModifier) != 0) {
if (skillUse(critter, targetObj, skill, skillBonus) != 0) {
return 0;
}
@@ -1398,8 +1398,10 @@ int objectUseItemOn(Object* user, Object* targetObj, Object* item)
}
// 0x49C6BC
int checkSceneryUseActionPointCost(Object* obj, Object* a2)
int checkSceneryUseActionPointCost(Object* obj, Object* _)
{
(void)_; // unused
if (!isInCombat()) {
return 0;
}
@@ -2249,27 +2251,27 @@ int objectAttemptPlacementPartyMember(Object* obj, int tile, int elevation)
return -1;
}
int v9 = tile;
int v7 = 0;
int destinationTile = tile;
int rotation = 0;
if (!wmEvalTileNumForPlacement(tile)) {
v9 = gDude->tile;
for (int v4 = 1; v4 <= 100; v4++) {
destinationTile = gDude->tile;
for (int i = 1; i <= 100; i++) {
// TODO: Check.
v7++;
v9 = tileGetTileInDirection(v9, v7 % ROTATION_COUNT, 1);
if (wmEvalTileNumForPlacement(v9) != 0) {
rotation++;
destinationTile = tileGetTileInDirection(destinationTile, rotation % ROTATION_COUNT, 1);
if (wmEvalTileNumForPlacement(destinationTile) != 0) {
break;
}
if (tileDistanceBetween(gDude->tile, v9) > 8) {
v9 = tile;
if (tileDistanceBetween(gDude->tile, destinationTile) > 8) {
destinationTile = tile;
break;
}
}
}
objectShow(obj, nullptr);
objectSetLocation(obj, v9, elevation, nullptr);
objectSetLocation(obj, destinationTile, elevation, nullptr);
return 0;
}
+4 -4
View File
@@ -7,7 +7,7 @@ namespace fallout {
int objectGetSid(Object* object, int* sidPtr);
int objectSetScriptFromProto(Object* object, int* sidPtr);
int objectSetScript(Object* obj, int a2, int a3);
int objectSetScript(Object* obj, int scriptType, int scriptIndex);
int objectLookAt(Object* critter, Object* target);
int objectLookAtFunc(Object* critter, Object* target, void (*fn)(char* string));
int objectExamine(Object* critter, Object* target);
@@ -15,15 +15,15 @@ int objectExamineFunc(Object* critter, Object* target, void (*fn)(char* string))
int objectPickup(Object* critter, Object* item);
int objectDrop(Object* invenObj, Object* itemObj);
int objectDestroy(Object* obj);
int objectUseItemInternal(Object* a1, Object* a2);
int objectUseItemInternal(Object* critter, Object* item);
int objectUseItem(Object* userObj, Object* item);
int objectUseItemOnInternal(Object* critter, Object* targetObj, Object* item);
int objectUseItemOn(Object* user, Object* targetObj, Object* item);
int checkSceneryUseActionPointCost(Object* obj, Object* a2);
int checkSceneryUseActionPointCost(Object* obj, Object* _);
int objectUse(Object* user, Object* targetObj);
int objectUseDoor(Object* user, Object* doorObj, bool animateOnly = false);
int objectUseContainer(Object* critter, Object* item);
int objectUseSkillOn(Object* a1, Object* a2, int skill);
int objectUseSkillOn(Object* source, Object* target, int skill);
bool objectIsLocked(Object* obj);
int objectLock(Object* obj);
int objectUnlock(Object* obj);
+7 -7
View File
@@ -329,7 +329,7 @@ typedef struct ItemProto {
int weight; // weight
int cost; // cost
int inventoryFid; // inv_fid
unsigned char field_80;
unsigned char soundId;
} ItemProto;
typedef struct CritterProtoData {
@@ -365,8 +365,8 @@ typedef struct {
} SceneryProtoDoorData;
typedef struct {
int field_0; // d.lower_tile
int field_4; // d.upper_tile
int destinationBuiltTile; // d.lower_tile
int destinationMap; // d.upper_tile
} SceneryProtoStairsData;
typedef struct {
@@ -375,11 +375,11 @@ typedef struct {
} SceneryProtoElevatorData;
typedef struct {
int field_0;
int destinationMap; // destination map
} SceneryProtoLadderData;
typedef struct {
int field_0;
int genericFlags;
} SceneryProtoGenericData;
typedef struct SceneryProtoData {
@@ -403,9 +403,9 @@ typedef struct SceneryProto {
int sid; // sid
int type; // type
SceneryProtoData data;
int field_2C; // material
int material; // material
int field_30; //
unsigned char field_34;
unsigned char soundId;
} SceneryProto;
typedef struct WallProto {

Some files were not shown because too many files have changed in this diff Show More