Fix floor lighting
This commit is contained in:
parent
281c1aa82a
commit
343911f736
72
src/tile.cc
72
src/tile.cc
|
@ -19,34 +19,33 @@
|
||||||
|
|
||||||
namespace fallout {
|
namespace fallout {
|
||||||
|
|
||||||
typedef struct STRUCT_51D99C {
|
typedef struct RightsideUpTableEntry {
|
||||||
int field_0;
|
int field_0;
|
||||||
int field_4;
|
int field_4;
|
||||||
} STRUCT_51D99C;
|
} RightsideUpTableEntry;
|
||||||
|
|
||||||
typedef struct STRUCT_51DA04 {
|
typedef struct UpsideDownTableEntry {
|
||||||
int field_0;
|
int field_0;
|
||||||
int field_4;
|
int field_4;
|
||||||
} STRUCT_51DA04;
|
} UpsideDownTableEntry;
|
||||||
|
|
||||||
typedef struct STRUCT_51DA6C {
|
typedef struct STRUCT_51DA6C {
|
||||||
int field_0;
|
int field_0;
|
||||||
int field_4;
|
int offsets[2];
|
||||||
int field_8;
|
int intensity;
|
||||||
int field_C; // something with light level?
|
|
||||||
} STRUCT_51DA6C;
|
} STRUCT_51DA6C;
|
||||||
|
|
||||||
typedef struct STRUCT_51DB0C {
|
typedef struct RightsideUpTriangle {
|
||||||
int field_0;
|
int field_0;
|
||||||
int field_4;
|
int field_4;
|
||||||
int field_8;
|
int field_8;
|
||||||
} STRUCT_51DB0C;
|
} RightsideUpTriangle;
|
||||||
|
|
||||||
typedef struct STRUCT_51DB48 {
|
typedef struct UpsideDownTriangle {
|
||||||
int field_0;
|
int field_0;
|
||||||
int field_4;
|
int field_4;
|
||||||
int field_8;
|
int field_8;
|
||||||
} STRUCT_51DB48;
|
} UpsideDownTriangle;
|
||||||
|
|
||||||
static void tileSetBorder(int windowWidth, int windowHeight, int hexGridWidth, int hexGridHeight);
|
static void tileSetBorder(int windowWidth, int windowHeight, int hexGridWidth, int hexGridHeight);
|
||||||
static void tileRefreshMapper(Rect* rect, int elevation);
|
static void tileRefreshMapper(Rect* rect, int elevation);
|
||||||
|
@ -103,7 +102,7 @@ const int dword_51D984[6] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 0x51D99C
|
// 0x51D99C
|
||||||
static STRUCT_51D99C _rightside_up_table[13] = {
|
static RightsideUpTableEntry _rightside_up_table[13] = {
|
||||||
{ -1, 2 },
|
{ -1, 2 },
|
||||||
{ 78, 2 },
|
{ 78, 2 },
|
||||||
{ 76, 6 },
|
{ 76, 6 },
|
||||||
|
@ -120,7 +119,7 @@ static STRUCT_51D99C _rightside_up_table[13] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 0x51DA04
|
// 0x51DA04
|
||||||
static STRUCT_51DA04 _upside_down_table[13] = {
|
static UpsideDownTableEntry _upside_down_table[13] = {
|
||||||
{ 0, 32 },
|
{ 0, 32 },
|
||||||
{ 48, 32 },
|
{ 48, 32 },
|
||||||
{ 49, 30 },
|
{ 49, 30 },
|
||||||
|
@ -151,7 +150,7 @@ static STRUCT_51DA6C _verticies[10] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 0x51DB0C
|
// 0x51DB0C
|
||||||
static STRUCT_51DB0C _rightside_up_triangles[5] = {
|
static RightsideUpTriangle _rightside_up_triangles[5] = {
|
||||||
{ 2, 3, 0 },
|
{ 2, 3, 0 },
|
||||||
{ 3, 4, 1 },
|
{ 3, 4, 1 },
|
||||||
{ 5, 6, 3 },
|
{ 5, 6, 3 },
|
||||||
|
@ -160,7 +159,7 @@ static STRUCT_51DB0C _rightside_up_triangles[5] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// 0x51DB48
|
// 0x51DB48
|
||||||
static STRUCT_51DB48 _upside_down_triangles[5] = {
|
static UpsideDownTriangle _upside_down_triangles[5] = {
|
||||||
{ 0, 3, 1 },
|
{ 0, 3, 1 },
|
||||||
{ 2, 5, 3 },
|
{ 2, 5, 3 },
|
||||||
{ 3, 6, 4 },
|
{ 3, 6, 4 },
|
||||||
|
@ -1590,7 +1589,7 @@ static void tileRenderFloor(int fid, int x, int y, Rect* rect)
|
||||||
int height = rect->bottom - rect->top + 1;
|
int height = rect->bottom - rect->top + 1;
|
||||||
int frameWidth;
|
int frameWidth;
|
||||||
int frameHeight;
|
int frameHeight;
|
||||||
int v15;
|
int tile;
|
||||||
int v76;
|
int v76;
|
||||||
int v77;
|
int v77;
|
||||||
int v78;
|
int v78;
|
||||||
|
@ -1648,22 +1647,23 @@ static void tileRenderFloor(int fid, int x, int y, Rect* rect)
|
||||||
|
|
||||||
if (v77 <= 0 || v76 <= 0) goto out;
|
if (v77 <= 0 || v76 <= 0) goto out;
|
||||||
|
|
||||||
v15 = tileFromScreenXY(savedX, savedY + 13, gElevation);
|
tile = tileFromScreenXY(savedX, savedY + 13, gElevation);
|
||||||
if (v15 != -1) {
|
if (tile != -1) {
|
||||||
int v17 = lightGetLightLevel();
|
int parity = tile & 1;
|
||||||
for (int i = v15 & 1; i < 10; i++) {
|
int ambientIntensity = lightGetLightLevel();
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
// NOTE: calling _light_get_tile two times, probably a result of using __min kind macro
|
// NOTE: calling _light_get_tile two times, probably a result of using __min kind macro
|
||||||
int v21 = _light_get_tile(elev, v15 + _verticies[i].field_4);
|
int tileIntensity = _light_get_tile(elev, tile + _verticies[i].offsets[parity]);
|
||||||
if (v21 <= v17) {
|
if (tileIntensity <= ambientIntensity) {
|
||||||
v21 = v17;
|
tileIntensity = ambientIntensity;
|
||||||
}
|
}
|
||||||
|
|
||||||
_verticies[i].field_C = v21;
|
_verticies[i].intensity = tileIntensity;
|
||||||
}
|
}
|
||||||
|
|
||||||
int v23 = 0;
|
int v23 = 0;
|
||||||
for (int i = 0; i < 9; i++) {
|
for (int i = 0; i < 9; i++) {
|
||||||
if (_verticies[i + 1].field_C != _verticies[i].field_C) {
|
if (_verticies[i + 1].intensity != _verticies[i].intensity) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1672,18 +1672,18 @@ static void tileRenderFloor(int fid, int x, int y, Rect* rect)
|
||||||
|
|
||||||
if (v23 == 9) {
|
if (v23 == 9) {
|
||||||
unsigned char* buf = artGetFrameData(art, 0, 0);
|
unsigned char* buf = artGetFrameData(art, 0, 0);
|
||||||
_dark_trans_buf_to_buf(buf + frameWidth * v78 + v79, v77, v76, frameWidth, gTileWindowBuffer, x, y, gTileWindowPitch, _verticies[0].field_C);
|
_dark_trans_buf_to_buf(buf + frameWidth * v78 + v79, v77, v76, frameWidth, gTileWindowBuffer, x, y, gTileWindowPitch, _verticies[0].intensity);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
STRUCT_51DB0C* ptr_51DB0C = &(_rightside_up_triangles[i]);
|
RightsideUpTriangle* triangle = &(_rightside_up_triangles[i]);
|
||||||
int v32 = _verticies[ptr_51DB0C->field_8].field_C;
|
int v32 = _verticies[triangle->field_8].intensity;
|
||||||
int v33 = _verticies[ptr_51DB0C->field_8].field_0;
|
int v33 = _verticies[triangle->field_8].field_0;
|
||||||
int v34 = _verticies[ptr_51DB0C->field_4].field_C - _verticies[ptr_51DB0C->field_0].field_C;
|
int v34 = _verticies[triangle->field_4].intensity - _verticies[triangle->field_0].intensity;
|
||||||
// TODO: Probably wrong.
|
// TODO: Probably wrong.
|
||||||
int v35 = v34 / 32;
|
int v35 = v34 / 32;
|
||||||
int v36 = (_verticies[ptr_51DB0C->field_0].field_C - v32) / 13;
|
int v36 = (_verticies[triangle->field_0].intensity - v32) / 13;
|
||||||
int* v37 = &(_intensity_map[v33]);
|
int* v37 = &(_intensity_map[v33]);
|
||||||
if (v35 != 0) {
|
if (v35 != 0) {
|
||||||
if (v36 != 0) {
|
if (v36 != 0) {
|
||||||
|
@ -1731,13 +1731,13 @@ static void tileRenderFloor(int fid, int x, int y, Rect* rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
STRUCT_51DB48* ptr_51DB48 = &(_upside_down_triangles[i]);
|
UpsideDownTriangle* triangle = &(_upside_down_triangles[i]);
|
||||||
int v50 = _verticies[ptr_51DB48->field_0].field_C;
|
int v50 = _verticies[triangle->field_0].intensity;
|
||||||
int v51 = _verticies[ptr_51DB48->field_0].field_0;
|
int v51 = _verticies[triangle->field_0].field_0;
|
||||||
int v52 = _verticies[ptr_51DB48->field_8].field_C - v50;
|
int v52 = _verticies[triangle->field_8].intensity - v50;
|
||||||
// TODO: Probably wrong.
|
// TODO: Probably wrong.
|
||||||
int v53 = v52 / 32;
|
int v53 = v52 / 32;
|
||||||
int v54 = (_verticies[ptr_51DB48->field_4].field_C - v50) / 13;
|
int v54 = (_verticies[triangle->field_4].intensity - v50) / 13;
|
||||||
int* v55 = &(_intensity_map[v51]);
|
int* v55 = &(_intensity_map[v51]);
|
||||||
if (v53 != 0) {
|
if (v53 != 0) {
|
||||||
if (v54 != 0) {
|
if (v54 != 0) {
|
||||||
|
|
Loading…
Reference in New Issue