Decompile CreateGridCellConnections (0x0233E43C)

573 instructions in overlay_29, the immediate neighbour of
GenerateExtraHallways. No region preprocessor directives -- all three regions
assemble identical text, so one source serves US/EU/JP.

asm/overlay_29_0233CF84.s is split: the function becomes the new pair
src/overlay_29_0233E43C.c + include/overlay_29_0233E43C.h, and the remainder
becomes asm/overlay_29_0233ED34.s. main.lsf gains two objects.

The header adds a provisional prototype for CreateHallway, which had no C
declaration anywhere in the tree. Its arity of 7 is read off its own prologue
(ten pushed registers, no sub sp, and reads at [sp,#0x28]/[sp,#0x2c]/[sp,#0x30]);
the parameter types are the loosest that fit and the names are positional
placeholders.

struct unk_0233C9E8 and FLOOR_GENERATION_STATUS come from
include/overlay_29_0233C9E8.h, landed by the previous function; the grid's
450/30 strides and 450/30 = 15 confirm the (*)[15] shape independently here.

Authored by Claude (Opus 5) under human direction. Confirmed by a matching
build: build/pmdsky.us/pmdsky.us.nds: OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
cecilarmitais
2026-09-11 14:20:40 -07:00
parent fd3564d312
commit 4c7fe63636
7 changed files with 2699 additions and 2977 deletions

View File

@@ -1,15 +1,9 @@
#pragma once
.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN
.public DIRECTIONS_XY
.public DUNGEON_PTR
.public DungeonRandInt
.public DungeonRandRange
.public FLOOR_GENERATION_STATUS
.public GetFloorType
.public GetTile
.public GenerateMaze
.public GetTileSafe
.public IsDestinationFloorWithMonster
.public IsOutlawMonsterHouseFloor
.public PosIsOutOfBounds
.public IsNextToHallway
.public SetSpawnFlag5
.public _s32_div_f
.public abs

View File

@@ -0,0 +1,14 @@
#pragma once
.public CORNER_CARDINAL_NEIGHBOR_IS_OPEN
.public DIRECTIONS_XY
.public DUNGEON_PTR
.public DungeonRandInt
.public DungeonRandRange
.public FLOOR_GENERATION_STATUS
.public GetFloorType
.public GetTile
.public GetTileSafe
.public IsDestinationFloorWithMonster
.public IsOutlawMonsterHouseFloor
.public PosIsOutOfBounds
.public abs

File diff suppressed because it is too large Load Diff

2344
asm/overlay_29_0233ED34.s Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
#ifndef PMDSKY_OVERLAY_29_0233E43C_H
#define PMDSKY_OVERLAY_29_0233E43C_H
#include "overlay_29_0233C9E8.h"
void CreateHallway(s32 arg1, s32 arg2, s32 arg3, s32 arg4, bool8 arg5, s32 arg6, s32 arg7);
void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x,
s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6);
#endif //PMDSKY_OVERLAY_29_0233E43C_H

View File

@@ -1228,6 +1228,8 @@ Overlay OVY_29
Object asm/overlay_29_0233AE84.o
Object src/overlay_29_0233C9E8.o
Object asm/overlay_29_0233CF84.o
Object src/overlay_29_0233E43C.o
Object asm/overlay_29_0233ED34.o
Object src/overlay_29_02340CAC.o
Object asm/overlay_29_02340CE4.o
Object src/dungeon_generation.o

325
src/overlay_29_0233E43C.c Normal file
View File

@@ -0,0 +1,325 @@
#include "overlay_29_0233E43C.h"
#include "overlay_29_0233C9E8.h"
#include "dg_random.h"
#include "dungeon_map_access.h"
void CreateGridCellConnections(struct unk_0233C9E8 (*grid)[15], s32 grid_size_x, s32 grid_size_y, s32 *arg4, s32 *arg5, bool8 arg6)
{
s32 i;
s32 j;
for (i = 0; i < grid_size_x; i++) {
for (j = 0; j < grid_size_y; j++) {
if (grid[i][j].field_0x8 != 0) {
grid[i][j].field_0x11[6] = 0;
grid[i][j].field_0x11[7] = 0;
grid[i][j].field_0x11[8] = 0;
grid[i][j].field_0x11[9] = 0;
continue;
}
if (i <= 0) {
grid[i][j].field_0x11[4] = 0;
}
if (j <= 0) {
grid[i][j].field_0x11[2] = 0;
}
if (i >= grid_size_x - 1) {
grid[i][j].field_0x11[5] = 0;
}
if (j >= grid_size_y - 1) {
grid[i][j].field_0x11[3] = 0;
}
grid[i][j].field_0x11[6] = grid[i][j].field_0x11[2];
grid[i][j].field_0x11[7] = grid[i][j].field_0x11[3];
grid[i][j].field_0x11[8] = grid[i][j].field_0x11[4];
grid[i][j].field_0x11[9] = grid[i][j].field_0x11[5];
}
}
for (i = 0; i < grid_size_x; i++) {
for (j = 0; j < grid_size_y; j++) {
s32 v0;
s32 v1;
if (grid[i][j].field_0x8 != 0) {
continue;
}
if (grid[i][j].field_0xa == 0) {
v0 = grid[i][j].field_0x0;
v1 = grid[i][j].field_0x2;
} else {
v0 = DungeonRandRange(grid[i][j].field_0x0 + 1, grid[i][j].field_0x4 - 1);
v1 = DungeonRandRange(grid[i][j].field_0x2 + 1, grid[i][j].field_0x6 - 1);
}
if (grid[i][j].field_0x11[6] != 0) {
if (grid[i][j - 1].field_0x8 == 0) {
s32 t;
if (grid[i][j - 1].field_0xa == 0) {
t = grid[i][j - 1].field_0x0;
} else {
t = DungeonRandRange(grid[i][j - 1].field_0x0 + 1, grid[i][j - 1].field_0x4 - 1);
}
CreateHallway(v0, grid[i][(u32)j].field_0x2, t, grid[i][(u32)j - 1].field_0x6 - 1, TRUE,
arg4[i], arg5[j]);
}
grid[i][j].field_0x11[6] = 0;
grid[i][j - 1].field_0x11[7] = 0;
grid[i][j].field_0xb = 1;
grid[i][j - 1].field_0xb = 1;
}
if (grid[i][j].field_0x11[7] != 0) {
if (grid[i][j + 1].field_0x8 == 0) {
s32 t;
if (grid[i][j + 1].field_0xa == 0) {
t = grid[i][j + 1].field_0x0;
} else {
t = DungeonRandRange(grid[i][j + 1].field_0x0 + 1, grid[i][j + 1].field_0x4 - 1);
}
CreateHallway(v0, grid[i][(u32)j].field_0x6 - 1, t, grid[i][(u32)j + 1].field_0x2, TRUE,
arg4[i], arg5[j + 1] - 1);
}
grid[i][j].field_0x11[7] = 0;
grid[i][j + 1].field_0x11[6] = 0;
grid[i][j].field_0xb = 1;
grid[i][j + 1].field_0xb = 1;
}
if (grid[i][j].field_0x11[8] != 0) {
if (grid[i - 1][j].field_0x8 == 0) {
s32 t;
if (grid[i - 1][j].field_0xa == 0) {
t = grid[i - 1][j].field_0x2;
} else {
t = DungeonRandRange(grid[i - 1][j].field_0x2 + 1, grid[i - 1][j].field_0x6 - 1);
}
CreateHallway(grid[i][(u32)j].field_0x0, v1, grid[i - 1][(u32)j].field_0x0 - 1, t, FALSE,
arg4[i], arg5[j]);
}
grid[i][j].field_0x11[8] = 0;
grid[i - 1][j].field_0x11[9] = 0;
grid[i][j].field_0xb = 1;
grid[i - 1][j].field_0xb = 1;
}
if (grid[i][j].field_0x11[9] != 0) {
if (grid[i + 1][j].field_0x8 == 0) {
s32 t;
if (grid[i + 1][j].field_0xa == 0) {
t = grid[i + 1][j].field_0x2;
} else {
t = DungeonRandRange(grid[i + 1][j].field_0x2 + 1, grid[i + 1][j].field_0x6 - 1);
}
CreateHallway(grid[i][(u32)j].field_0x4 - 1, v1, grid[i + 1][(u32)j].field_0x0, t, FALSE,
arg4[i + 1] - 1, arg5[j]);
}
grid[i][j].field_0x11[9] = 0;
grid[i + 1][j].field_0x11[8] = 0;
grid[i][j].field_0xb = 1;
grid[i + 1][j].field_0xb = 1;
}
}
}
if (arg6) {
return;
}
for (i = 0; i < grid_size_x; i++) {
for (j = 0; j < grid_size_y; j++) {
struct unk_0233C9E8 *cell;
if (DungeonRandInt(100) >= 5) {
continue;
}
cell = &grid[i][j];
if (cell->field_0x8 != 0) {
continue;
}
if (cell->field_0xb == 0) {
continue;
}
if (cell->field_0x11[1] != 0 || cell->field_0x9 != 0) {
continue;
}
if (cell->field_0xa == 0) {
continue;
}
switch (DungeonRandInt(4)) {
case 0: {
s32 x0, y0, y1;
int x1;
s32 y, x;
s32 room;
if (i < 1) {
break;
}
if (cell[-15].field_0xb == 0) {
break;
}
if (cell[-15].field_0x8 != 0) {
break;
}
if (cell[-15].field_0xa == 0) {
break;
}
if (cell[-15].field_0x9 != 0 || cell[-15].field_0x11[1] != 0) {
break;
}
x0 = cell[-15].field_0x0;
y0 = cell[-15].field_0x2 < cell->field_0x2 ? cell[-15].field_0x2 : cell->field_0x2;
x1 = cell->field_0x4;
y1 = cell[-15].field_0x6 > cell->field_0x6 ? cell[-15].field_0x6 : cell->field_0x6;
room = GetTile(cell->field_0x0, cell->field_0x2)->room;
for (x = x0; x < x1; x++) {
for (y = y0; y < y1; y++) {
struct tile *t = GetTileSafe(x, y);
t->terrain_flags &= ~3;
t->terrain_flags |= 1;
t->room = room;
}
}
cell[-15].field_0x0 = x0;
cell[-15].field_0x4 = x1;
cell[-15].field_0x2 = y0;
cell[-15].field_0x6 = y1;
cell->field_0x11[1] = 1;
cell[-15].field_0x11[1] = 1;
cell->field_0xb = 0;
cell->field_0x11[0] = 1;
break;
}
case 1: {
s32 x0, y0, y1;
int x1;
s32 y, x;
s32 room;
if (j < 1) {
break;
}
if (cell[-1].field_0xb == 0) {
break;
}
if (cell[-1].field_0x8 != 0) {
break;
}
if (cell[-1].field_0xa == 0) {
break;
}
if (cell[-1].field_0x9 != 0 || cell[-1].field_0x11[1] != 0) {
break;
}
x0 = cell[-1].field_0x0 < cell->field_0x0 ? cell[-1].field_0x0 : cell->field_0x0;
y0 = cell[-1].field_0x2;
x1 = cell[-1].field_0x4 > cell->field_0x4 ? cell[-1].field_0x4 : cell->field_0x4;
y1 = cell->field_0x6;
room = GetTile(cell->field_0x0, cell->field_0x2)->room;
for (x = x0; x < x1; x++) {
for (y = y0; y < y1; y++) {
struct tile *t = GetTileSafe(x, y);
t->terrain_flags &= ~3;
t->terrain_flags |= 1;
t->room = room;
}
}
cell[-1].field_0x0 = x0;
cell[-1].field_0x4 = x1;
cell[-1].field_0x2 = y0;
cell[-1].field_0x6 = y1;
cell->field_0x11[1] = 1;
cell[-1].field_0x11[1] = 1;
cell->field_0xb = 0;
cell->field_0x11[0] = 1;
break;
}
case 2: {
s32 x0, y0, x1, y1, y, x;
s32 room;
if (i > grid_size_x - 2) {
break;
}
if (grid[i + 1][j].field_0xb == 0) {
break;
}
if (grid[i + 1][j].field_0x8 != 0) {
break;
}
if (grid[i + 1][j].field_0xa == 0) {
break;
}
if (grid[i + 1][j].field_0x9 != 0 || grid[i + 1][j].field_0x11[1] != 0) {
break;
}
x0 = cell->field_0x0;
y0 = cell->field_0x2 < grid[i + 1][j].field_0x2 ? cell->field_0x2 : grid[i + 1][j].field_0x2;
x1 = grid[i + 1][j].field_0x4;
y1 = cell->field_0x6 > grid[i + 1][j].field_0x6 ? cell->field_0x6 : grid[i + 1][j].field_0x6;
room = GetTile(cell->field_0x0, cell->field_0x2)->room;
for (x = x0; x < x1; x++) {
for (y = y0; y < y1; y++) {
struct tile *t = GetTileSafe(x, y);
t->terrain_flags &= ~3;
t->terrain_flags |= 1;
t->room = room;
}
}
cell->field_0x0 = x0;
cell->field_0x4 = x1;
cell->field_0x2 = y0;
cell->field_0x6 = y1;
grid[i + 1][j].field_0x11[1] = 1;
cell->field_0x11[1] = 1;
grid[i + 1][j].field_0xb = 0;
grid[i + 1][j].field_0x11[0] = 1;
break;
}
case 3: {
s32 x0, y0, x1, y1, y, x;
s32 room;
if (j > grid_size_y - 2) {
break;
}
if (grid[i][j + 1].field_0xb == 0) {
break;
}
if (grid[i][j + 1].field_0x8 != 0) {
break;
}
if (grid[i][j + 1].field_0xa == 0) {
break;
}
if (grid[i][j + 1].field_0x9 != 0 || grid[i][j + 1].field_0x11[1] != 0) {
break;
}
x0 = cell->field_0x0 < grid[i][j + 1].field_0x0 ? cell->field_0x0 : grid[i][j + 1].field_0x0;
y0 = cell->field_0x2;
x1 = cell->field_0x4 > grid[i][j + 1].field_0x4 ? cell->field_0x4 : grid[i][j + 1].field_0x4;
y1 = grid[i][j + 1].field_0x6;
room = GetTile(cell->field_0x0, cell->field_0x2)->room;
for (x = x0; x < x1; x++) {
for (y = y0; y < y1; y++) {
struct tile *t = GetTileSafe(x, y);
t->terrain_flags &= ~3;
t->terrain_flags |= 1;
t->room = room;
}
}
cell->field_0x0 = x0;
cell->field_0x4 = x1;
cell->field_0x2 = y0;
cell->field_0x6 = y1;
grid[i][j + 1].field_0x11[1] = 1;
cell->field_0x11[1] = 1;
grid[i][j + 1].field_0xb = 0;
grid[i][j + 1].field_0x11[0] = 1;
break;
}
}
}
}
}