fix(sarcophagus): inclou les cantonades diagonals al perímetre
This commit is contained in:
1 parent
d26abcb9d5
commit
642e0653b2
3 files changed
+43
-30
No files matched your search
@@ -97,14 +97,16 @@ void Sarcophagus::place(int anchor_col, int anchor_row, const BlockedPredicate&
|
||||
void Sarcophagus::computePerimeter(const BlockedPredicate& is_blocked) {
|
||||
perimeter_tiles_.clear();
|
||||
|
||||
// El perímetre ortogonal d'un rectangle (w,h) de tiles són les files
|
||||
// de tiles immediatament N, S, E, O. No s'hi inclouen les cantonades
|
||||
// diagonals (tile NO, NE, SO, SE), perquè el jugador fa passes pels
|
||||
// quatre costats i no pot "tallar" per una diagonal: això garanteix
|
||||
// que el recorregut completa només si passa per cada costat.
|
||||
// El perímetre d'un rectangle (w,h) de tiles són les files de tiles
|
||||
// immediatament adjacents: N, S, E, O *més* les quatre cantonades
|
||||
// diagonals (NO, NE, SO, SE). En la pràctica el jugador trepitja
|
||||
// aquestes cantonades en doblar les cantonades del sarcòfag, així que
|
||||
// si no s'hi compten, el cerco no es pot tancar visualment encara
|
||||
// que es completi a nivell de codi (o, pitjor, s'obre sense que el
|
||||
// jugador hagi clos realment el contorn).
|
||||
//
|
||||
// - Fila Nord: (col, row-1) per col ∈ [col0, col0+w-1]
|
||||
// - Fila Sud: (col, row+h) per col ∈ [col0, col0+w-1]
|
||||
// - Fila Nord: (col, row-1) per col ∈ [col0-1, col0+w] (inclou NO i NE)
|
||||
// - Fila Sud: (col, row+h) per col ∈ [col0-1, col0+w] (inclou SO i SE)
|
||||
// - Columna O: (col0-1, row) per row ∈ [row0, row0+h-1]
|
||||
// - Columna E: (col0+w, row) per row ∈ [row0, row0+h-1]
|
||||
|
||||
@@ -113,12 +115,12 @@ void Sarcophagus::computePerimeter(const BlockedPredicate& is_blocked) {
|
||||
perimeter_tiles_.insert({col, row});
|
||||
};
|
||||
|
||||
// Nord i Sud
|
||||
for (int dc = 0; dc < tile_size_w_; ++dc) {
|
||||
// Nord i Sud (incloent les quatre cantonades diagonals)
|
||||
for (int dc = -1; dc <= tile_size_w_; ++dc) {
|
||||
maybe_insert(anchor_col_ + dc, anchor_row_ - 1);
|
||||
maybe_insert(anchor_col_ + dc, anchor_row_ + tile_size_h_);
|
||||
}
|
||||
// Oest i Est
|
||||
// Oest i Est (les cantonades ja les ha posat el bucle N/S)
|
||||
for (int dr = 0; dr < tile_size_h_; ++dr) {
|
||||
maybe_insert(anchor_col_ - 1, anchor_row_ + dr);
|
||||
maybe_insert(anchor_col_ + tile_size_w_, anchor_row_ + dr);
|
||||
|
||||
Reference in new issue
Block a user