summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/plugins/superdom.c79
1 files changed, 76 insertions, 3 deletions
diff --git a/apps/plugins/superdom.c b/apps/plugins/superdom.c
index 3cbc5f285d..312c48cdeb 100644
--- a/apps/plugins/superdom.c
+++ b/apps/plugins/superdom.c
@@ -19,9 +19,7 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21/* TODO list: 21/* TODO list:
22 - don't hardcode board size
23 - improve AI (move, use nukes, etc.) 22 - improve AI (move, use nukes, etc.)
24 - allow for configurable AI
25*/ 23*/
26 24
27 25
@@ -1294,7 +1292,11 @@ static int launch_nuke(int colour, int nukex, int nukey, int targetx, int target
1294 board[targetx][targety].nuke = false; 1292 board[targetx][targety].nuke = false;
1295 board[targetx][targety].farm = false; 1293 board[targetx][targety].farm = false;
1296 /* TODO: Fallout carried by wind */ 1294 /* TODO: Fallout carried by wind */
1297 1295 draw_board();
1296 if(human)
1297 rb->sleep(HZ*2);
1298 else
1299 rb->sleep(HZ);
1298 return RET_VAL_OK; 1300 return RET_VAL_OK;
1299} 1301}
1300 1302
@@ -2098,7 +2100,78 @@ static int find_adj_target(int x, int y, struct cursor* adj)
2098 2100
2099static void computer_movement(void) 2101static void computer_movement(void)
2100{ 2102{
2103 /* use nukes */
2104 if(superdom_settings.compdiff>=3)
2105 {
2106 struct cursor nukes[10]; /* 10 for now, change as needed */
2107 int nukes_back=0;
2108 rb->splashf(HZ, "computer has %d nukes", compres.nukes);
2109 if(compres.nukes>0)
2110 {
2111 for(int i=1;i<=BOARD_SIZE && nukes_back<compres.nukes && nukes_back<10;i++)
2112 {
2113 for(int j=1;j<BOARD_SIZE && nukes_back<compres.nukes && nukes_back<10 ;j++)
2114 {
2115 if(board[i][j].nuke)
2116 {
2117 nukes[nukes_back].x=i;
2118 nukes[nukes_back].y=j;
2119 nukes_back++;
2120 }
2121 rb->yield();
2122 }
2123 }
2124 bool found_target=true;
2125 struct cursor adj;
2126 int next_nuke=0;
2127 /* first, use nukes for defence */
2128 while(found_target && next_nuke<nukes_back)
2129 {
2130 found_target = false;
2131 for(int i=1;i<=BOARD_SIZE && nukes_back<compres.nukes && nukes_back<10;i++)
2132 {
2133 for(int j=1;j<=BOARD_SIZE && nukes_back<compres.nukes && nukes_back<10;j++)
2134 {
2135 if((board[i][j].colour == COLOUR_DARK) &&
2136 (board[i][j].farm || board[i][j].ind || board[i][j].nuke) &&
2137 find_adj_target(i, j, &adj))
2138 {
2139 found_target = true;
2140 rb->splashf(2*HZ, "Launching nuke for defence, from (%d, %d) to (%d, %d)", nukes[next_nuke].x, nukes[next_nuke].y, adj.x, adj.y);
2141 launch_nuke(COLOUR_DARK, nukes[next_nuke].x, nukes[next_nuke].y, adj.x, adj.y);
2142 next_nuke++;
2143 }
2144 rb->yield();
2145 }
2146 }
2147 }
2101 2148
2149 /* if we still have any left over, use those for offence */
2150 found_target = true;
2151 while(found_target && next_nuke<nukes_back)
2152 {
2153 found_target = false;
2154 for(int i=1;i<=BOARD_SIZE;i++)
2155 {
2156 for(int j=1;j<=BOARD_SIZE;j++)
2157 {
2158 if(board[i][j].colour == COLOUR_LIGHT &&
2159 (board[i][j].ind || board[i][j].farm || board[i][j].nuke) &&
2160 (calc_strength(COLOUR_DARK, i, j) >= calc_strength(COLOUR_LIGHT, i, j)))
2161 {
2162 found_target = true;
2163 rb->splashf(2*HZ, "Launching nuke for offence, nuke index %d", next_nuke);
2164 launch_nuke(COLOUR_DARK, nukes[next_nuke].x, nukes[next_nuke].y, i, j);
2165 next_nuke++;
2166 }
2167 rb->yield();
2168 }
2169 }
2170 }
2171
2172 }
2173 }
2174 /* TODO: move other units */
2102} 2175}
2103 2176
2104static void computer_war(void) 2177static void computer_war(void)