Author: sveinung Date: Fri Nov 4 13:44:22 2016 New Revision: 34389 URL: http://svn.gna.org/viewcvs/freeciv?rev=34389&view=rev Log: autoattack: cargo attacks before transporters.
The function compare_units() tried to make a cargo unit auto attack before its transporter by sorting the autoattacker list. Fix the function that compares two units during the sorting so it does: * put cargo units *before* transporting units. * check the cargo status of *both* units being compared. * consider recursive transports. See bug #25259 Modified: branches/S2_5/server/unittools.c Modified: branches/S2_5/server/unittools.c URL: http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/unittools.c?rev=34389&r1=34388&r2=34389&view=diff ============================================================================== --- branches/S2_5/server/unittools.c (original) +++ branches/S2_5/server/unittools.c Fri Nov 4 13:44:22 2016 @@ -3023,13 +3023,15 @@ send_unit_info(NULL, ptrans); } -/***************************************************************** - This function is passed to unit_list_sort() to sort a list of - units according to their win chance against autoattack_x|y. - If the unit is being transported, then push it to the front of - the list, since we wish to leave its transport out of combat - if at all possible. -*****************************************************************/ +/************************************************************************** + This function is passed to unit_list_sort() to sort a list of units + according to their win chance against autoattack_target modified by + transportation relationships. + + The reason for making sure that a cargo unit is ahead of it + transporter(s) is to leave transports out of combat if at all possible. + (The transport could be destroyed during combat.) +**************************************************************************/ static int compare_units(const struct unit *const *p1, const struct unit *const *q1) { @@ -3038,7 +3040,14 @@ int p1uwc = unit_win_chance(*p1, p1def); int q1uwc = unit_win_chance(*q1, q1def); - if (p1uwc < q1uwc || unit_transport_get(*q1)) { + /* Sort by transport depth first. This makes sure that no transport + * attacks before its cargo does. */ + if (unit_transport_depth(*p1) != unit_transport_depth(*q1)) { + /* The units have a different number of recursive transporters. */ + return unit_transport_depth(*q1) - unit_transport_depth(*p1); + } + + if (p1uwc < q1uwc) { return -1; /* q is better */ } else if (p1uwc == q1uwc) { return 0; _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits