Skip to content

Commit

Permalink
refactor: Rename chunk properties
Browse files Browse the repository at this point in the history
Before this patch, chunk properties were still prefixed with WORLD-, which
no longer makes sense after #292. Moreover, blocks and biomes did not
have CHUNK- as part of their name at all.

After renaming, there were a lot of clashes with variables such as CHUNK-X
which subsequently needed renaming, too.
  • Loading branch information
meyfa committed Feb 2, 2025
1 parent 56a456f commit 7f1cba3
Show file tree
Hide file tree
Showing 4 changed files with 180 additions and 181 deletions.
124 changes: 62 additions & 62 deletions src/chunks.cob
Original file line number Diff line number Diff line change
Expand Up @@ -29,38 +29,38 @@ DATA DIVISION.
WORKING-STORAGE SECTION.
COPY DD-CLIENTS.
COPY DD-SERVER-PROPERTIES.
01 CHUNK-START-X BINARY-LONG.
01 CHUNK-END-X BINARY-LONG.
01 CHUNK-START-Z BINARY-LONG.
01 CHUNK-END-Z BINARY-LONG.
01 CHUNK-X BINARY-LONG.
01 CHUNK-Z BINARY-LONG.
01 X-START BINARY-LONG.
01 X-END BINARY-LONG.
01 Z-START BINARY-LONG.
01 Z-END BINARY-LONG.
01 X-POS BINARY-LONG.
01 Z-POS BINARY-LONG.
LINKAGE SECTION.
01 LK-CLIENT BINARY-LONG UNSIGNED.

PROCEDURE DIVISION USING LK-CLIENT.
*> enqueue 3x3 chunks around the player first
MOVE 0 TO CHUNK-QUEUE-BEGIN(LK-CLIENT)
MOVE 0 TO CHUNK-QUEUE-END(LK-CLIENT)
COMPUTE CHUNK-START-X = CENTER-CHUNK-X(LK-CLIENT) - 1
COMPUTE CHUNK-END-X = CENTER-CHUNK-X(LK-CLIENT) + 1
COMPUTE CHUNK-START-Z = CENTER-CHUNK-Z(LK-CLIENT) - 1
COMPUTE CHUNK-END-Z = CENTER-CHUNK-Z(LK-CLIENT) + 1
PERFORM VARYING CHUNK-X FROM CHUNK-START-X BY 1 UNTIL CHUNK-X > CHUNK-END-X
PERFORM VARYING CHUNK-Z FROM CHUNK-START-Z BY 1 UNTIL CHUNK-Z > CHUNK-END-Z
CALL "EnqueueChunk" USING LK-CLIENT CHUNK-X CHUNK-Z
COMPUTE X-START = CENTER-CHUNK-X(LK-CLIENT) - 1
COMPUTE X-END = CENTER-CHUNK-X(LK-CLIENT) + 1
COMPUTE Z-START = CENTER-CHUNK-Z(LK-CLIENT) - 1
COMPUTE Z-END = CENTER-CHUNK-Z(LK-CLIENT) + 1
PERFORM VARYING X-POS FROM X-START BY 1 UNTIL X-POS > X-END
PERFORM VARYING Z-POS FROM Z-START BY 1 UNTIL Z-POS > Z-END
CALL "EnqueueChunk" USING LK-CLIENT X-POS Z-POS
END-PERFORM
END-PERFORM

*> now enqueue all chunks in the view distance
COMPUTE CHUNK-START-X = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-X = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE CHUNK-START-Z = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-Z = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
PERFORM VARYING CHUNK-X FROM CHUNK-START-X BY 1 UNTIL CHUNK-X > CHUNK-END-X
PERFORM VARYING CHUNK-Z FROM CHUNK-START-Z BY 1 UNTIL CHUNK-Z > CHUNK-END-Z
COMPUTE X-START = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE X-END = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE Z-START = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE Z-END = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
PERFORM VARYING X-POS FROM X-START BY 1 UNTIL X-POS > X-END
PERFORM VARYING Z-POS FROM Z-START BY 1 UNTIL Z-POS > Z-END
*> Note: EnqueueChunk will automatically skip duplicates
CALL "EnqueueChunk" USING LK-CLIENT CHUNK-X CHUNK-Z
CALL "EnqueueChunk" USING LK-CLIENT X-POS Z-POS
END-PERFORM
END-PERFORM

Expand Down Expand Up @@ -124,14 +124,14 @@ WORKING-STORAGE SECTION.
COPY DD-PLAYERS.
COPY DD-SERVER-PROPERTIES.
01 PLAYER-ID BINARY-LONG UNSIGNED.
01 CHUNK-START-X BINARY-LONG.
01 CHUNK-END-X BINARY-LONG.
01 CHUNK-START-Z BINARY-LONG.
01 CHUNK-END-Z BINARY-LONG.
01 CHUNK-X BINARY-LONG.
01 CHUNK-Z BINARY-LONG.
01 PREV-CENTER-CHUNK-X BINARY-LONG.
01 PREV-CENTER-CHUNK-Z BINARY-LONG.
01 X-START BINARY-LONG.
01 X-END BINARY-LONG.
01 Z-START BINARY-LONG.
01 Z-END BINARY-LONG.
01 X-POS BINARY-LONG.
01 Z-POS BINARY-LONG.
01 PREV-CENTER-CHUNK-X BINARY-LONG.
01 PREV-CENTER-CHUNK-Z BINARY-LONG.
LINKAGE SECTION.
01 LK-CLIENT BINARY-LONG UNSIGNED.

Expand Down Expand Up @@ -159,34 +159,34 @@ PROCEDURE DIVISION USING LK-CLIENT.
*> TODO: make this code look better

*> first: parallel to the X axis
COMPUTE CHUNK-START-X = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-X = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE X-START = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE X-END = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
IF CENTER-CHUNK-Z(LK-CLIENT) < PREV-CENTER-CHUNK-Z
COMPUTE CHUNK-START-Z = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-Z = FUNCTION MIN(PREV-CENTER-CHUNK-Z - VIEW-DISTANCE, CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE)
COMPUTE Z-START = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE Z-END = FUNCTION MIN(PREV-CENTER-CHUNK-Z - VIEW-DISTANCE, CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE)
ELSE
COMPUTE CHUNK-START-Z = FUNCTION MAX(PREV-CENTER-CHUNK-Z + VIEW-DISTANCE, CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE)
COMPUTE CHUNK-END-Z = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
COMPUTE Z-START = FUNCTION MAX(PREV-CENTER-CHUNK-Z + VIEW-DISTANCE, CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE)
COMPUTE Z-END = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
END-IF
PERFORM VARYING CHUNK-X FROM CHUNK-START-X BY 1 UNTIL CHUNK-X > CHUNK-END-X
PERFORM VARYING CHUNK-Z FROM CHUNK-START-Z BY 1 UNTIL CHUNK-Z > CHUNK-END-Z
CALL "EnqueueChunk" USING LK-CLIENT CHUNK-X CHUNK-Z
PERFORM VARYING X-POS FROM X-START BY 1 UNTIL X-POS > X-END
PERFORM VARYING Z-POS FROM Z-START BY 1 UNTIL Z-POS > Z-END
CALL "EnqueueChunk" USING LK-CLIENT X-POS Z-POS
END-PERFORM
END-PERFORM

*> second: parallel to the Z axis
COMPUTE CHUNK-START-Z = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-Z = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
COMPUTE Z-START = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE Z-END = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
IF CENTER-CHUNK-X(LK-CLIENT) < PREV-CENTER-CHUNK-X
COMPUTE CHUNK-START-X = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-X = FUNCTION MIN(PREV-CENTER-CHUNK-X - VIEW-DISTANCE, CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE)
COMPUTE X-START = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE X-END = FUNCTION MIN(PREV-CENTER-CHUNK-X - VIEW-DISTANCE, CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE)
ELSE
COMPUTE CHUNK-START-X = FUNCTION MAX(PREV-CENTER-CHUNK-X + VIEW-DISTANCE, CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE)
COMPUTE CHUNK-END-X = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE X-START = FUNCTION MAX(PREV-CENTER-CHUNK-X + VIEW-DISTANCE, CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE)
COMPUTE X-END = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
END-IF
PERFORM VARYING CHUNK-X FROM CHUNK-START-X BY 1 UNTIL CHUNK-X > CHUNK-END-X
PERFORM VARYING CHUNK-Z FROM CHUNK-START-Z BY 1 UNTIL CHUNK-Z > CHUNK-END-Z
CALL "EnqueueChunk" USING LK-CLIENT CHUNK-X CHUNK-Z
PERFORM VARYING X-POS FROM X-START BY 1 UNTIL X-POS > X-END
PERFORM VARYING Z-POS FROM Z-START BY 1 UNTIL Z-POS > Z-END
CALL "EnqueueChunk" USING LK-CLIENT X-POS Z-POS
END-PERFORM
END-PERFORM
END-IF
Expand Down Expand Up @@ -255,38 +255,38 @@ WORKING-STORAGE SECTION.
COPY DD-CLIENTS.
COPY DD-SERVER-PROPERTIES.
01 CHUNK-INDEX BINARY-LONG UNSIGNED.
01 CHUNK-START-X BINARY-LONG.
01 CHUNK-END-X BINARY-LONG.
01 CHUNK-START-Z BINARY-LONG.
01 CHUNK-END-Z BINARY-LONG.
01 CHUNK-X BINARY-LONG.
01 CHUNK-Z BINARY-LONG.
01 X-START BINARY-LONG.
01 X-END BINARY-LONG.
01 Z-START BINARY-LONG.
01 Z-END BINARY-LONG.
01 X-POS BINARY-LONG.
01 Z-POS BINARY-LONG.
COPY DD-CHUNK-REF.
LINKAGE SECTION.
01 LK-CLIENT BINARY-LONG UNSIGNED.

PROCEDURE DIVISION USING LK-CLIENT.
*> Determine the client's view area to avoid sending chunks outside of it
COMPUTE CHUNK-START-X = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-X = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE CHUNK-START-Z = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE CHUNK-END-Z = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE
COMPUTE X-START = CENTER-CHUNK-X(LK-CLIENT) - VIEW-DISTANCE
COMPUTE X-END = CENTER-CHUNK-X(LK-CLIENT) + VIEW-DISTANCE
COMPUTE Z-START = CENTER-CHUNK-Z(LK-CLIENT) - VIEW-DISTANCE
COMPUTE Z-END = CENTER-CHUNK-Z(LK-CLIENT) + VIEW-DISTANCE

*> Since end points one beyond the last item, the queue is empty once begin = end.
PERFORM UNTIL CHUNK-QUEUE-BEGIN(LK-CLIENT) = CHUNK-QUEUE-END(LK-CLIENT)
*> Dequeue the next chunk
MOVE CHUNK-QUEUE-X(LK-CLIENT, CHUNK-QUEUE-BEGIN(LK-CLIENT) + 1) TO CHUNK-X
MOVE CHUNK-QUEUE-Z(LK-CLIENT, CHUNK-QUEUE-BEGIN(LK-CLIENT) + 1) TO CHUNK-Z
MOVE CHUNK-QUEUE-X(LK-CLIENT, CHUNK-QUEUE-BEGIN(LK-CLIENT) + 1) TO X-POS
MOVE CHUNK-QUEUE-Z(LK-CLIENT, CHUNK-QUEUE-BEGIN(LK-CLIENT) + 1) TO Z-POS
ADD 1 TO CHUNK-QUEUE-BEGIN(LK-CLIENT)
IF CHUNK-QUEUE-BEGIN(LK-CLIENT) >= CHUNK-QUEUE-LENGTH
MOVE 0 TO CHUNK-QUEUE-BEGIN(LK-CLIENT)
END-IF
*> Check if the chunk is within the client's view area
IF CHUNK-X >= CHUNK-START-X AND CHUNK-X <= CHUNK-END-X AND CHUNK-Z >= CHUNK-START-Z AND CHUNK-Z <= CHUNK-END-Z
CALL "World-EnsureChunk" USING CHUNK-X CHUNK-Z CHUNK-INDEX
IF X-POS >= X-START AND X-POS <= X-END AND Z-POS >= Z-START AND Z-POS <= Z-END
CALL "World-EnsureChunk" USING X-POS Z-POS CHUNK-INDEX
IF CHUNK-INDEX > 0
SET ADDRESS OF WORLD-CHUNK TO WORLD-CHUNK-POINTER(CHUNK-INDEX)
CALL "SendPacket-ChunkData" USING LK-CLIENT WORLD-CHUNK
SET ADDRESS OF CHUNK TO WORLD-CHUNK-POINTER(CHUNK-INDEX)
CALL "SendPacket-ChunkData" USING LK-CLIENT CHUNK
END-IF
*> Stop once a chunk has been sent
EXIT PERFORM
Expand Down
32 changes: 17 additions & 15 deletions src/copybooks/DD-CHUNK-REF.cpy
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
*> --- Copybook: reference to a loaded chunk structure ---

01 WORLD-CHUNK BASED.
02 WORLD-CHUNK-DIRTY BINARY-CHAR UNSIGNED.
02 WORLD-CHUNK-X BINARY-LONG.
02 WORLD-CHUNK-Z BINARY-LONG.
02 WORLD-SECTION OCCURS WORLD-SECTION-COUNT TIMES.
03 WORLD-SECTION-NON-AIR BINARY-LONG UNSIGNED.
78 CHUNK-SECTION-COUNT VALUE 24.

01 CHUNK BASED.
02 CHUNK-DIRTY BINARY-CHAR UNSIGNED.
02 CHUNK-X BINARY-LONG.
02 CHUNK-Z BINARY-LONG.
02 CHUNK-SECTION OCCURS CHUNK-SECTION-COUNT TIMES.
03 CHUNK-SECTION-NON-AIR BINARY-LONG UNSIGNED.
*> block IDs (16x16x16) - X increases fastest, then Z, then Y
03 WORLD-SECTION-BLOCKS.
04 WORLD-BLOCK OCCURS 4096 TIMES.
05 WORLD-BLOCK-ID BINARY-LONG UNSIGNED.
03 CHUNK-SECTION-BLOCKS.
04 CHUNK-BLOCK OCCURS 4096 TIMES.
05 CHUNK-BLOCK-ID BINARY-LONG UNSIGNED.
*> biome IDs (4x4x4)
03 WORLD-SECTION-BIOMES.
04 WORLD-BIOME OCCURS 64 TIMES.
05 WORLD-BIOME-ID BINARY-LONG UNSIGNED.
02 WORLD-BLOCK-ENTITY-COUNT BINARY-LONG UNSIGNED.
03 CHUNK-SECTION-BIOMES.
04 CHUNK-BIOME OCCURS 64 TIMES.
05 CHUNK-BIOME-ID BINARY-LONG UNSIGNED.
02 CHUNK-BLOCK-ENTITY-COUNT BINARY-LONG UNSIGNED.
*> block entity IDs for each block
02 WORLD-BLOCK-ENTITIES.
02 CHUNK-BLOCK-ENTITIES.
*> set to a value < 0 to indicate no entity (since 0 is a valid ID)
*> TODO: support storing entity data, not just IDs
03 WORLD-BLOCK-ENTITY-ID OCCURS 98304 TIMES BINARY-CHAR.
03 CHUNK-BLOCK-ENTITY-ID OCCURS 98304 TIMES BINARY-CHAR.
2 changes: 0 additions & 2 deletions src/copybooks/DD-WORLD.cpy
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
*> --- Copybook: shared data for the world state ---

*> Constants
78 WORLD-CHUNK-CAPACITY VALUE 65536.
78 WORLD-SECTION-COUNT VALUE 24.

*> Age of the world in ticks.
01 WORLD-AGE BINARY-LONG-LONG EXTERNAL.
Expand Down
Loading

0 comments on commit 7f1cba3

Please sign in to comment.