Ticket #710: circle-detection.patch

File circle-detection.patch, 8.8 KB (added by rhinocesaurus, 12 years ago)

Changed all detection and mapping spells from 81x45 rectangle to radius 32 circle.

  • src/spells2.c

     
    890890 
    891891/* 
    892892 * Useful constants for the area around the player to detect. 
    893  * This is instead of using circular detection spells. 
    894893 */ 
    895 #define DETECT_DIST_X   40      /* Detect 42 grids to the left & right */ 
    896 #define DETECT_DIST_Y   22      /* Detect 22 grids to the top & bottom */ 
     894#define DETECT_DIST     32      /* Detect 32 grids in all directions */ 
    897895 
    898896 
    899897 
     
    907905{ 
    908906        int i, x, y; 
    909907        int x1, x2, y1, y2; 
     908        int py, px, dy, dx; 
     909        int d; 
    910910 
     911        /* Extract player location */ 
     912        py = p_ptr->py; 
     913        px = p_ptr->px; 
     914 
    911915        /* Pick an area to map */ 
    912         y1 = p_ptr->py - DETECT_DIST_Y; 
    913         y2 = p_ptr->py + DETECT_DIST_Y; 
    914         x1 = p_ptr->px - DETECT_DIST_X; 
    915         x2 = p_ptr->px + DETECT_DIST_X; 
     916        y1 = py - DETECT_DIST; 
     917        y2 = py + DETECT_DIST; 
     918        x1 = px - DETECT_DIST; 
     919        x2 = px + DETECT_DIST; 
    916920 
    917921        if (y1 < 0) y1 = 0; 
    918922        if (x1 < 0) x1 = 0; 
     
    926930                        if (cave_feat[y][x] < FEAT_SECRET) 
    927931                        { 
    928932                                if (!in_bounds_fully(y, x)) continue; 
     933                         
     934                                /* Distance components */ 
     935                                dy = (py > y) ? (py - y) : (y - py); 
     936                                dx = (px > x) ? (px - x) : (x - px); 
    929937 
     938                                /* Distance squared */ 
     939                                d = dy*dy + dx*dx; 
     940                         
     941                                /* Don't detect outside the radius */ 
     942                                if (d > DETECT_DIST * DETECT_DIST) continue; 
     943 
     944 
    930945                                /* Memorize normal features */ 
    931946                                if (cave_feat[y][x] > FEAT_INVIS) 
    932947                                { 
     
    963978{ 
    964979        int y, x; 
    965980        int x1, x2, y1, y2; 
     981        int py, px, dy, dx; 
     982        int d; 
    966983 
    967984        bool detect = FALSE; 
    968985 
    969986        (void)aware; 
    970987 
     988        /* Extract player location */ 
     989        py = p_ptr->py; 
     990        px = p_ptr->px; 
     991 
    971992        /* Pick an area to map */ 
    972         y1 = p_ptr->py - DETECT_DIST_Y; 
    973         y2 = p_ptr->py + DETECT_DIST_Y; 
    974         x1 = p_ptr->px - DETECT_DIST_X; 
    975         x2 = p_ptr->px + DETECT_DIST_X; 
     993        y1 = py - DETECT_DIST; 
     994        y2 = py + DETECT_DIST; 
     995        x1 = px - DETECT_DIST; 
     996        x2 = px + DETECT_DIST; 
    976997 
    977998        if (y1 < 0) y1 = 0; 
    978999        if (x1 < 0) x1 = 0; 
     
    9841005                for (x = x1; x < x2; x++) 
    9851006                { 
    9861007                        if (!in_bounds_fully(y, x)) continue; 
     1008                         
     1009                        /* Distance components */ 
     1010                        dy = (py > y) ? (py - y) : (y - py); 
     1011                        dx = (px > x) ? (px - x) : (x - px); 
    9871012 
     1013                        /* Distance squared */ 
     1014                        d = dy*dy + dx*dx; 
     1015                         
     1016                        /* Don't detect outside the radius */ 
     1017                        if (d > DETECT_DIST * DETECT_DIST) continue; 
     1018 
    9881019                        /* Detect invisible traps */ 
    9891020                        if (cave_feat[y][x] == FEAT_INVIS) 
    9901021                        { 
     
    10451076{ 
    10461077        int y, x; 
    10471078        int x1, x2, y1, y2; 
     1079        int py, px, dy, dx; 
     1080        int d; 
    10481081 
    10491082        bool doors = FALSE, stairs = FALSE; 
    10501083 
     1084        /* Extract player location */ 
     1085        py = p_ptr->py; 
     1086        px = p_ptr->px; 
    10511087 
    10521088        /* Pick an area to map */ 
    1053         y1 = p_ptr->py - DETECT_DIST_Y; 
    1054         y2 = p_ptr->py + DETECT_DIST_Y; 
    1055         x1 = p_ptr->px - DETECT_DIST_X; 
    1056         x2 = p_ptr->px + DETECT_DIST_X; 
     1089        y1 = py - DETECT_DIST; 
     1090        y2 = py + DETECT_DIST; 
     1091        x1 = px - DETECT_DIST; 
     1092        x2 = px + DETECT_DIST; 
    10571093 
    10581094        if (y1 < 0) y1 = 0; 
    10591095        if (x1 < 0) x1 = 0; 
     
    10661102                { 
    10671103                        if (!in_bounds_fully(y, x)) continue; 
    10681104 
     1105                        /* Distance components */ 
     1106                        dy = (py > y) ? (py - y) : (y - py); 
     1107                        dx = (px > x) ? (px - x) : (x - px); 
     1108 
     1109                        /* Distance squared */ 
     1110                        d = dy*dy + dx*dx; 
     1111                         
     1112                        /* Don't detect outside the radius */ 
     1113                        if (d > DETECT_DIST * DETECT_DIST) continue; 
     1114 
    10691115                        /* Detect secret doors */ 
    10701116                        if (cave_feat[y][x] == FEAT_SECRET) 
    10711117                                place_closed_door(y, x); 
     
    11221168        int i; 
    11231169        int y, x; 
    11241170        int x1, x2, y1, y2; 
     1171        int py, px, dy, dx; 
     1172        int d; 
    11251173 
    11261174        bool gold_buried = FALSE; 
    11271175        bool objects = FALSE; 
    11281176 
     1177        /* Extract player location */ 
     1178        py = p_ptr->py; 
     1179        px = p_ptr->px; 
    11291180 
    11301181        /* Pick an area to map */ 
    1131         y1 = p_ptr->py - DETECT_DIST_Y; 
    1132         y2 = p_ptr->py + DETECT_DIST_Y; 
    1133         x1 = p_ptr->px - DETECT_DIST_X; 
    1134         x2 = p_ptr->px + DETECT_DIST_X; 
     1182        y1 = py - DETECT_DIST; 
     1183        y2 = py + DETECT_DIST; 
     1184        x1 = px - DETECT_DIST; 
     1185        x2 = px + DETECT_DIST; 
    11351186 
    11361187        if (y1 < 0) y1 = 0; 
    11371188        if (x1 < 0) x1 = 0; 
     
    11441195                { 
    11451196                        if (!in_bounds_fully(y, x)) continue; 
    11461197 
     1198                        /* Distance components */ 
     1199                        dy = (py > y) ? (py - y) : (y - py); 
     1200                        dx = (px > x) ? (px - x) : (x - px); 
     1201 
     1202                        /* Distance squared */ 
     1203                        d = dy*dy + dx*dx; 
     1204                         
     1205                        /* Don't detect outside the radius */ 
     1206                        if (d > DETECT_DIST * DETECT_DIST) continue; 
     1207 
    11471208                        /* Notice embedded gold */ 
    11481209                        if ((cave_feat[y][x] == FEAT_MAGMA_H) || 
    11491210                            (cave_feat[y][x] == FEAT_QUARTZ_H)) 
     
    11831244                y = o_ptr->iy; 
    11841245                x = o_ptr->ix; 
    11851246 
    1186                 /* Only detect nearby objects */ 
     1247                /* Only try nearby objects */ 
    11871248                if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
    11881249 
     1250                /* Distance components */ 
     1251                dy = (py > y) ? (py - y) : (y - py); 
     1252                dx = (px > x) ? (px - x) : (x - px); 
     1253 
     1254                /* Distance squared */ 
     1255                d = dy*dy + dx*dx; 
     1256                         
     1257                /* Don't detect outside the radius */ 
     1258                if (d > DETECT_DIST * DETECT_DIST) continue; 
     1259 
    11891260                /* Hack -- memorize it */ 
    11901261                o_ptr->marked = TRUE; 
    11911262 
     
    12231294{ 
    12241295        int i, y, x, tv; 
    12251296        int x1, x2, y1, y2; 
     1297        int py, px, dy, dx; 
     1298        int d; 
    12261299 
    12271300        bool detect = FALSE; 
    12281301 
     1302        /* Extract player location */ 
     1303        py = p_ptr->py; 
     1304        px = p_ptr->px; 
    12291305 
    12301306        /* Pick an area to map */ 
    1231         y1 = p_ptr->py - DETECT_DIST_Y; 
    1232         y2 = p_ptr->py + DETECT_DIST_Y; 
    1233         x1 = p_ptr->px - DETECT_DIST_X; 
    1234         x2 = p_ptr->px + DETECT_DIST_X; 
     1307        y1 = py - DETECT_DIST; 
     1308        y2 = py + DETECT_DIST; 
     1309        x1 = px - DETECT_DIST; 
     1310        x2 = px + DETECT_DIST; 
    12351311 
    12361312        if (y1 < 0) y1 = 0; 
    12371313        if (x1 < 0) x1 = 0; 
     
    12511327                /* Location */ 
    12521328                y = o_ptr->iy; 
    12531329                x = o_ptr->ix; 
     1330                 
     1331                /* Only try nearby objects */ 
     1332                if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
     1333                 
     1334                /* Distance components */ 
     1335                dy = (py > y) ? (py - y) : (y - py); 
     1336                dx = (px > x) ? (px - x) : (x - px); 
    12541337 
     1338                /* Distance squared */ 
     1339                d = dy*dy + dx*dx; 
     1340                         
     1341                /* Don't detect outside the radius */ 
     1342                if (d > DETECT_DIST * DETECT_DIST) continue; 
    12551343 
    1256                 /* Only detect nearby objects */ 
    1257                 if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
    1258  
    12591344                /* Examine the tval */ 
    12601345                tv = o_ptr->tval; 
    12611346 
     
    12951380{ 
    12961381        int i, y, x; 
    12971382        int x1, x2, y1, y2; 
     1383        int py, px, dy, dx; 
     1384        int d; 
    12981385 
    12991386        bool flag = FALSE; 
    13001387 
    13011388 
     1389        /* Extract player location */ 
     1390        py = p_ptr->py; 
     1391        px = p_ptr->px; 
     1392 
    13021393        /* Pick an area to map */ 
    1303         y1 = p_ptr->py - DETECT_DIST_Y; 
    1304         y2 = p_ptr->py + DETECT_DIST_Y; 
    1305         x1 = p_ptr->px - DETECT_DIST_X; 
    1306         x2 = p_ptr->px + DETECT_DIST_X; 
     1394        y1 = py - DETECT_DIST; 
     1395        y2 = py + DETECT_DIST; 
     1396        x1 = px - DETECT_DIST; 
     1397        x2 = px + DETECT_DIST; 
    13071398 
    13081399        if (y1 < 0) y1 = 0; 
    13091400        if (x1 < 0) x1 = 0; 
     
    13231414                y = m_ptr->fy; 
    13241415                x = m_ptr->fx; 
    13251416 
    1326                 /* Only detect nearby monsters */ 
     1417                /* Only try nearby monsters */ 
    13271418                if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
    13281419 
     1420                /* Distance components */ 
     1421                dy = (py > y) ? (py - y) : (y - py); 
     1422                dx = (px > x) ? (px - x) : (x - px); 
     1423 
     1424                /* Distance squared */ 
     1425                d = dy*dy + dx*dx; 
     1426                         
     1427                /* Don't detect outside the radius */ 
     1428                if (d > DETECT_DIST * DETECT_DIST) continue; 
     1429                 
    13291430                /* Detect all non-invisible monsters */ 
    13301431                if (!(r_ptr->flags[1] & (RF1_INVISIBLE))) 
    13311432                { 
     
    13601461{ 
    13611462        int i, y, x; 
    13621463        int x1, x2, y1, y2; 
     1464        int py, px, dy, dx; 
     1465        int d; 
    13631466 
    13641467        bool flag = FALSE; 
    13651468 
     1469        /* Extract player location */ 
     1470        py = p_ptr->py; 
     1471        px = p_ptr->px; 
     1472 
    13661473        /* Pick an area to map */ 
    1367         y1 = p_ptr->py - DETECT_DIST_Y; 
    1368         y2 = p_ptr->py + DETECT_DIST_Y; 
    1369         x1 = p_ptr->px - DETECT_DIST_X; 
    1370         x2 = p_ptr->px + DETECT_DIST_X; 
     1474        y1 = py - DETECT_DIST; 
     1475        y2 = py + DETECT_DIST; 
     1476        x1 = px - DETECT_DIST; 
     1477        x2 = px + DETECT_DIST; 
    13711478 
    13721479        if (y1 < 0) y1 = 0; 
    13731480        if (x1 < 0) x1 = 0; 
     
    13871494                y = m_ptr->fy; 
    13881495                x = m_ptr->fx; 
    13891496 
    1390                 /* Only detect nearby objects */ 
     1497                /* Only try nearby monsters */ 
    13911498                if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
    13921499 
     1500                /* Distance components */ 
     1501                dy = (py > y) ? (py - y) : (y - py); 
     1502                dx = (px > x) ? (px - x) : (x - px); 
     1503 
     1504                /* Distance squared */ 
     1505                d = dy*dy + dx*dx; 
     1506                         
     1507                /* Don't detect outside the radius */ 
     1508                if (d > DETECT_DIST * DETECT_DIST) continue; 
     1509                 
    13931510                /* Detect invisible monsters */ 
    13941511                if (r_ptr->flags[1] & (RF1_INVISIBLE)) 
    13951512                { 
     
    14341551{ 
    14351552        int i, y, x; 
    14361553        int x1, x2, y1, y2; 
     1554        int py, px, dy, dx; 
     1555        int d; 
    14371556 
    14381557        bool flag = FALSE; 
    14391558 
     1559        /* Extract player location */ 
     1560        py = p_ptr->py; 
     1561        px = p_ptr->px; 
     1562 
    14401563        /* Pick an area to map */ 
    1441         y1 = p_ptr->py - DETECT_DIST_Y; 
    1442         y2 = p_ptr->py + DETECT_DIST_Y; 
    1443         x1 = p_ptr->px - DETECT_DIST_X; 
    1444         x2 = p_ptr->px + DETECT_DIST_X; 
     1564        y1 = py - DETECT_DIST; 
     1565        y2 = py + DETECT_DIST; 
     1566        x1 = px - DETECT_DIST; 
     1567        x2 = px + DETECT_DIST; 
    14451568 
    14461569        if (y1 < 0) y1 = 0; 
    14471570        if (x1 < 0) x1 = 0; 
     
    14611584                y = m_ptr->fy; 
    14621585                x = m_ptr->fx; 
    14631586 
    1464                 /* Only detect nearby objects */ 
     1587                /* Only try nearby monsters */ 
    14651588                if (x < x1 || y < y1 || x > x2 || y > y2) continue; 
    14661589 
     1590                /* Distance components */ 
     1591                dy = (py > y) ? (py - y) : (y - py); 
     1592                dx = (px > x) ? (px - x) : (x - px); 
     1593 
     1594                /* Distance squared */ 
     1595                d = dy*dy + dx*dx; 
     1596                         
     1597                /* Don't detect outside the radius */ 
     1598                if (d > DETECT_DIST * DETECT_DIST) continue; 
     1599                 
    14671600                /* Detect evil monsters */ 
    14681601                if (r_ptr->flags[2] & (RF2_EVIL)) 
    14691602                {