From 735987ff330323fc38ffe93b36f25cd2e04bb1b8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= <tastyfish@seznam.cz>
Date: Sat, 15 Sep 2018 11:34:08 +0200
Subject: [PATCH] Fix walls

---
 demo2.cpp | 52 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 34 insertions(+), 18 deletions(-)

diff --git a/demo2.cpp b/demo2.cpp
index 91fcfd7..cd2adcf 100644
--- a/demo2.cpp
+++ b/demo2.cpp
@@ -55,28 +55,35 @@ Player player;
 #define INFO_BAR_START 70
 #define TEXTURE_MAX_DISTANCE (UNITS_PER_SQUARE * 6)
 
+// temporary defines for better visibility of walls and floors below
+#define D 6
+#define o 0
+
 const unsigned char level[] =
 {
-/*                    10  12  14  16  18  20  22  24  26  28  30
-  0 1 2 3 4 5 6 7 8 9   11  13  15  17  19  21  23  25  27  29  31 */
-  4,0,0,4,0,0,4,0,0,4,0,0,2,4,0,4,4,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2, // 0
-  0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,0,0,0,1,3,2,4,0,4,0,0,0,0,0,0,0,0, // 1
-  0,0,0,0,0,0,0,0,0,0,0,0,2,4,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0, // 2
-  0,0,5,0,0,0,0,0,0,0,0,0,2,4,4,0,3,1,1,0,2,1,2,3,0,0,1,0,1,0,0,2, // 3
-  0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,2, // 4
-  0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,2,3,0,2,2,0,0,0,0,0,0,0,0,0,2, // 5
-  4,0,3,1,3,1,0,2,2,2,3,2,2,2,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 6
-  0,0,2,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,1,2,0,5,5,0,0,0,0,0, // 7
-  0,0,1,0,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,0,0,0,4,0,0,0,5,0,0,2,0,0, // 8
-  0,0,2,0,0,0,0,0,0,2,3,2,4,0,0,0,2,2,4,1,4,0,4,4,4,3,2,0,0,4,2,2, // 9
-  0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,3,3,4,0,0,0,0,0,1,0,0,0,0,0,0,0,4, // 10
-  2,0,0,0,3,0,0,0,0,0,0,0,0,0,3,3,2,4,0,0,0,0,0,1,0,0,4,0,0,3,0,1, // 11
-  1,3,1,0,4,4,4,2,2,1,2,6,2,2,3,0,0,1,4,0,0,0,3,3,3,5,2,0,0,0,0,2, // 12
-  0,0,0,0,0,0,0,0,0,4,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1, // 13
-  0,0,0,3,0,5,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, // 14
-  0,0,0,0,0,0,0,0,0,4,0,0,0,0,2,0,0,5,0,0,4,0,0,1,0,3,0,3,0,3,0,1  // 15
+/*                    1o  12  14  16  18  2o  22  24  26  28  3o
+  o 1 2 3 4 5 6 7 8 9   11  13  15  17  19  21  23  25  27  29  31 */
+  4,o,o,4,o,o,4,o,o,4,o,o,2,4,o,4,4,o,o,o,o,D,o,2,o,o,o,o,o,o,o,2, // o
+  o,o,o,o,o,o,o,o,o,o,o,o,3,4,o,o,o,o,1,3,2,4,o,4,o,o,o,o,o,o,o,o, // 1
+  o,o,o,o,o,o,o,o,o,o,o,o,2,4,o,o,o,o,1,o,o,o,o,3,o,o,o,o,o,o,o,o, // 2
+  o,o,5,o,o,o,o,o,o,o,o,o,2,4,4,o,3,1,1,o,2,1,2,3,o,o,1,o,1,o,o,2, // 3
+  o,o,o,o,o,o,o,o,o,o,o,o,2,o,o,o,o,2,o,o,o,2,o,o,o,o,o,o,o,o,o,2, // 4
+  o,o,o,o,o,o,o,o,o,o,o,o,2,o,o,o,o,2,3,o,2,2,o,o,o,o,o,o,o,o,o,2, // 5
+  4,o,3,1,3,1,o,2,2,2,3,2,2,2,o,o,3,2,o,o,o,o,o,o,o,o,o,o,o,o,o,o, // 6
+  o,o,2,o,o,o,o,o,o,5,o,o,o,o,o,o,o,5,o,o,o,o,1,2,o,5,5,o,o,o,o,o, // 7
+  o,o,1,o,o,o,o,o,o,5,o,o,o,o,o,o,o,D,o,o,o,o,4,o,o,o,5,o,o,2,o,o, // 8
+  o,o,2,o,o,o,o,o,o,2,3,2,4,o,o,o,2,2,4,1,4,o,4,4,4,3,2,o,o,4,2,2, // 9
+  o,o,4,4,4,o,o,o,o,o,o,o,o,o,o,3,3,4,o,o,o,o,o,1,o,o,o,o,o,o,o,4, // 1o
+  2,o,o,o,3,o,o,o,o,o,o,o,o,o,3,3,2,4,o,o,o,o,o,1,o,o,4,o,o,3,o,1, // 11
+  1,3,1,o,4,4,4,2,2,1,2,D,2,2,3,o,o,1,4,o,o,o,3,3,3,5,2,o,o,o,o,2, // 12
+  o,o,o,o,o,o,o,o,o,4,o,o,o,o,2,o,o,o,o,o,o,o,o,o,o,o,o,o,o,3,o,1, // 13
+  o,o,o,3,o,5,o,3,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,4, // 14
+  o,o,o,o,o,o,o,o,o,4,o,o,o,o,2,o,o,5,o,o,4,o,o,1,o,3,o,3,o,3,o,1  // 15
 };
 
+#undef D
+#undef o
+
 const unsigned char texture1[] =
 {  32, 36 // width, height
   ,0x01,0x01,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09
@@ -86,6 +93,7 @@ const unsigned char texture1[] =
   ,0x0a,0x0a,0x12,0x0a,0x09,0x12,0x09,0x09,0x09,0x09,0x09,0x12,0x09,0x09
   ,0x09,0x01,0x01,0x01,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09
   ,0x09,0x09,0x0a,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0a,0x09,0x09,0x09
+
   ,0x09,0x09,0x09,0x09,0x12,0x09,0x09,0x09,0x09,0x01,0x01,0x01,0x12,0x0a
   ,0x12,0x09,0x12,0x09,0x12,0x12,0x0a,0x09,0x12,0x09,0x12,0x12,0x12,0x1a
   ,0x1b,0x1b,0x12,0x12,0x12,0x09,0x09,0x12,0x09,0x09,0x12,0x12,0x09,0x09
@@ -768,9 +776,14 @@ unsigned char textureAverageColors[TEXTURES];
 
 Unit floorHeightAt(int16_t x, int16_t y)
 {
+  if (x < 0 || x >= LEVEL_X_RES || y < 0 || y >= LEVEL_Y_RES)
+    return UNITS_PER_SQUARE * 2;
+
   Unit square = level[(LEVEL_Y_RES - y -1) * LEVEL_X_RES + x];
 
 #ifdef RENDER_PRECISE
+  /* algorithm used with this version doesn't support rolling doors, so give
+     door square zero height */
   return square == 0 || square == 6 ? 0 : UNITS_PER_SQUARE * 2;
 #else
   return square == 0 ? 0 : UNITS_PER_SQUARE * 2;
@@ -779,6 +792,9 @@ Unit floorHeightAt(int16_t x, int16_t y)
 
 Unit collisionAt(int16_t x, int16_t y)
 {
+  if (x < 0 || x >= LEVEL_X_RES || y < 0 || y >= LEVEL_Y_RES)
+    return UNITS_PER_SQUARE;
+
   Unit square = level[(LEVEL_Y_RES - y -1) * LEVEL_X_RES + x];
   return square == 0 || square == 6 ? 0 : UNITS_PER_SQUARE;
 }