00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <config.h>
00035
00036 #include "file.h"
00037 #include "path.h"
00038 #include "prototypes.h"
00039 #include "sect.h"
00040
00041 static int
00042 update_coastal_flag(coord x, coord y, coord ign_x, coord ign_y)
00043 {
00044 int n;
00045 struct sctstr sect;
00046
00047 for (n = 1; n <= 6; n++) {
00048 getsect(x + diroff[n][0], y + diroff[n][1], §);
00049 if (sect.sct_x == ign_x && sect.sct_y == ign_y)
00050 continue;
00051 if (sect.sct_type == SCT_WATER || sect.sct_type == SCT_BTOWER ||
00052 sect.sct_type == SCT_BSPAN)
00053 return 1;
00054 }
00055
00056 return 0;
00057 }
00058
00059 static int
00060 coastal_sea_to_land(coord x, coord y)
00061 {
00062 int n, c;
00063 struct sctstr sect;
00064
00065 for (n = 1; n <= 6; n++) {
00066 getsect(x + diroff[n][0], y + diroff[n][1], §);
00067 c = update_coastal_flag(sect.sct_x, sect.sct_y, x, y);
00068 if (!sect.sct_coastal != !c) {
00069 sect.sct_coastal = c;
00070 putsect(§);
00071 }
00072 }
00073
00074 return update_coastal_flag(x, y, x, y);
00075 }
00076
00077 static int
00078 coastal_land_to_sea(coord x, coord y)
00079 {
00080 int n;
00081 struct sctstr sect;
00082
00083 for (n = 1; n <= 6; ++n) {
00084 getsect(x + diroff[n][0], y + diroff[n][1], §);
00085 if (!sect.sct_coastal) {
00086 sect.sct_coastal = 1;
00087 putsect(§);
00088 }
00089 }
00090
00091 return 1;
00092 }
00093
00094
00095
00096
00097
00098
00099 void
00100 set_coastal(struct sctstr *sp, int olddes, int newdes)
00101 {
00102 int old_water = olddes == SCT_WATER
00103 || olddes == SCT_BTOWER || olddes == SCT_BSPAN;
00104 int new_water = newdes == SCT_WATER
00105 || newdes == SCT_BTOWER || newdes == SCT_BSPAN;
00106
00107 if (new_water != old_water)
00108 sp->sct_coastal = new_water
00109 ? coastal_land_to_sea(sp->sct_x, sp->sct_y)
00110 : coastal_sea_to_land(sp->sct_x, sp->sct_y);
00111 }