De-obfuscated most of the texture generation code

This commit is contained in:
Sasha Koshka
2022-05-01 17:16:46 -04:00
parent ddfd97f8eb
commit aa0d9623aa
4 changed files with 71 additions and 41 deletions

View File

@@ -1,4 +1,9 @@
#pragma once
#include <stdlib.h>
typedef u_int8_t Block;
#define NUMBER_OF_BLOCKS 16
#define BLOCK_AIR 0
#define BLOCK_GRASS 1

View File

@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include "blocks.h"
#include "coords.h"
#include "utility.h"
@@ -12,7 +13,6 @@
#define CHUNK_SIZE 64
#define CHUNK_DATA_SIZE CHUNK_SIZE * CHUNK_SIZE * CHUNK_SIZE
typedef u_int8_t Block;
typedef struct _Chunk Chunk;
typedef struct _World World;

View File

@@ -1,8 +1,8 @@
#include "textures.h"
#include "blocks.h"
#include<stdio.h>
int textures[12288] = {0};
const u_int16_t cobbleCracks[16] = {
int textures[TEXTURES_SIZE] = { 0 };
const u_int16_t cobbleCracks[BLOCK_TEXTURE_H] = {
0b0000001110000100,
0b0010110010000110,
0b1011100011001110,
@@ -21,23 +21,28 @@ const u_int16_t cobbleCracks[16] = {
0b0000111100111110,
};
static void genTexture (Block);
/* genTextures
* Takes in a seed and an array where the textures should go.
* Generates game textures in that array.
*/
void genTextures(unsigned int seed) {
void genTextures (unsigned int seed) {
srand(seed);
for (int blockId = 1; blockId < 16; blockId++) {
for (Block blockId = 1; blockId < NUMBER_OF_BLOCKS; blockId++) {
genTexture(blockId);
}
}
void genTexture (int blockId) {
int k = 255 - randm(96);
for (int y = 0; y < 48; y++)
for (int x = 0; x < 16; x++) {
int baseColor = 9858122;
/* genTexture
* Generates a texture for the given block ID.
*/
static void genTexture (Block blockId) {
int brightness = 255 - randm(96);
for (int y = 0; y < BLOCK_TEXTURE_H * 3; y++)
for (int x = 0; x < BLOCK_TEXTURE_W; x++) {
int baseColor = 0x966C4A;
int noiseFloor = 255;
int noiseScale = 96;
@@ -47,7 +52,7 @@ void genTexture (int blockId) {
}
if (blockId == BLOCK_STONE)
baseColor = 8355711;
baseColor = 0x7F7F7F;
if (blockId == BLOCK_GRAVEL) {
baseColor = 0xAAAAAA;
@@ -58,28 +63,28 @@ void genTexture (int blockId) {
blockId == BLOCK_STONE ||
blockId == BLOCK_WATER;
if (!needAltNoise || randm(3) == 0)
k = noiseFloor - randm(noiseScale);
brightness = noiseFloor - randm(noiseScale);
if (
blockId == BLOCK_GRASS &&
y < (x * x * (3 + x) * 81 >> 2 & 0x3) + 18
) {
baseColor = 6990400;
baseColor = 0x6AAA40;
} else if (
blockId == BLOCK_GRASS &&
y < (x * x * (3 + x) * 81 >> 2 & 0x3) + 19
) {
k = k * 2 / 3;
brightness = brightness * 2 / 3;
}
if (blockId == BLOCK_WOOD) {
baseColor = 6771249;
baseColor = 0x675231;
if (
x > 0 && x < 15 &&
((y > 0 && y < 15) || (y > 32 && y < 47))
) {
baseColor = 12359778;
baseColor = 0xBC9862;
int i6 = x - 7;
int i7 = (y & 0xF) - 7;
@@ -87,22 +92,25 @@ void genTexture (int blockId) {
if (i7 < 0) i7 = 1 - i7;
if (i7 > i6) i6 = i7;
k = 196 - randm(32) + i6 % 3 * 32;
brightness = 196 - randm(32) + i6 % 3 * 32;
} else if (randm(2) == 0) {
k = k * (150 - (x & 0x1) * 100) / 100;
brightness =
brightness *
(150 - (x & 0x1) * 100) / 100;
}
}
switch (blockId) {
case BLOCK_BRICKS:
baseColor = 11876885;
baseColor = 0xB53A15;
if ((x + y / 4 * 4) % 8 == 0 || y % 4 == 0)
baseColor = 12365733;
break;
case BLOCK_COBBLESTONE:
baseColor = 0x999999;
k -= ((cobbleCracks[y & 0xF] >> x) & 0b1) * 128;
brightness -=
((cobbleCracks[y & 0xF] >> x) & 0b1) * 128;
break;
case BLOCK_WATER:
@@ -110,49 +118,62 @@ void genTexture (int blockId) {
break;
case BLOCK_PLAYER_HEAD:
k = 255;
brightness = 255;
if (
dist2d(x, y % 16, 8, 8) > 6.2 ||
dist2d(x, y % BLOCK_TEXTURE_H, 8, 8) > 6.2 ||
(y / 16) % 3 == 2
) {
baseColor = 0x000000;
} else {
baseColor = 0xFFFFFF;
k -= dist2d(x, y % 16, 8, 2) * 8;
brightness -= dist2d (
x, y % BLOCK_TEXTURE_H,
8, 2) * 8;
}
break;
case BLOCK_PLAYER_BODY:
k = 255;
brightness = 255;
if (
(dist2d(x, y % 16, 8, 16) > 12.2 ||
(dist2d(x, y % BLOCK_TEXTURE_H, 8, 16) > 12.2 ||
(y / 16) % 3 != 1) &&
(y / 16) % 3 != 2
) {
baseColor = 0x000000;
} else {
baseColor = 0xFFFFFF;
k -= dist2d(x, y % 16, 8, 2) * 8;
brightness -= dist2d (
x, y % BLOCK_TEXTURE_H,
8, 2) * 8;
}
break;
}
int i2 = k;
if (y >= 32)
i2 /= 2;
if (blockId == BLOCK_LEAVES) {
baseColor = 5298487;
baseColor = 0x50D937;
// Randomly punch holes in the texture
if (randm(2) == 0) {
baseColor = 0;
i2 = 255;
brightness = 255;
}
}
// darken bottom of blocks
int i3 = (baseColor >> 16 & 0xFF)
* i2 / 255 << 16 | (baseColor >> 8 & 0xFF)
* i2 / 255 << 8 | (baseColor & 0xFF)
* i2 / 255;
textures[x + y * 16 + blockId * 256 * 3] = i3;
// Darken bottom of blocks
if (y >= BLOCK_TEXTURE_H * 2) {
brightness /= 2;
}
// Apply brightness value
int finalColor =
(baseColor >> 16 & 0xFF) * brightness / 255 << 16 |
(baseColor >> 8 & 0xFF) * brightness / 255 << 8 |
(baseColor & 0xFF) * brightness / 255;
textures [
x +
y * BLOCK_TEXTURE_H +
blockId * BLOCK_TEXTURE_W * BLOCK_TEXTURE_H * 3
] = finalColor;
}
}

View File

@@ -3,7 +3,11 @@
#include <math.h>
#include <stdlib.h>
#include "utility.h"
#include "blocks.h"
extern int textures[12288];
void genTextures(unsigned int);
void genTexture (int);
#define BLOCK_TEXTURE_W 16
#define BLOCK_TEXTURE_H 16
#define TEXTURES_SIZE NUMBER_OF_BLOCKS * BLOCK_TEXTURE_W * BLOCK_TEXTURE_H * 3
extern int textures[TEXTURES_SIZE];
void genTextures (unsigned int);