diff options
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/superdom.c | 79 |
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 | ||
2099 | static void computer_movement(void) | 2101 | static 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 | ||
2104 | static void computer_war(void) | 2177 | static void computer_war(void) |