Bug #586 ยป 0034-Make-dying-unit-to-correctly-triggger-auto-turn-done.patch
client/climisc.c | ||
---|---|---|
game_remove_unit(&wld, punit);
|
||
punit = NULL;
|
||
if (old > 0 && get_num_units_in_focus() == 0) {
|
||
unit_focus_advance();
|
||
unit_focus_advance(TRUE);
|
||
} else if (update) {
|
||
update_unit_pix_label(get_units_in_focus());
|
||
update_unit_info_label(get_units_in_focus());
|
client/control.c | ||
---|---|---|
goto_unit_killed(punit);
|
||
if (unit_is_in_focus(punit)
|
||
&& get_num_units_in_focus() == 1) {
|
||
unit_focus_advance(FALSE);
|
||
}
|
||
unit_list_remove(get_units_in_focus(), punit);
|
||
if (get_num_units_in_focus() < 1) {
|
||
clear_hover_state();
|
||
... | ... | |
**************************************************************************/
|
||
void unit_focus_remove(struct unit *punit)
|
||
{
|
||
bool keep_in_focus = FALSE;
|
||
if (NULL != punit
|
||
&& NULL != client.conn.playing
|
||
&& unit_owner(punit) != client.conn.playing) {
|
||
... | ... | |
clear_hover_state();
|
||
}
|
||
current_focus_remove(punit);
|
||
if (get_num_units_in_focus() > 0) {
|
||
focus_units_changed();
|
||
} else {
|
||
unit_focus_advance();
|
||
if (get_num_units_in_focus() == 1) {
|
||
unit_focus_advance(TRUE);
|
||
if (unit_is_in_focus(punit)) {
|
||
/* Unit was restored to focus (there was no other units to focus to) */
|
||
keep_in_focus = TRUE;
|
||
}
|
||
}
|
||
if (!keep_in_focus) {
|
||
current_focus_remove(punit);
|
||
if (get_num_units_in_focus() > 0) {
|
||
focus_units_changed();
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
called when user press the "Wait" command.
|
||
|
||
FIXME: Add feature to focus only units of a certain category.
|
||
@param accept_current The current focus can be kept if no other candidates
|
||
**************************************************************************/
|
||
void unit_focus_advance(void)
|
||
void unit_focus_advance(bool accept_current)
|
||
{
|
||
struct unit *candidate = NULL;
|
||
const int num_units_in_old_focus = get_num_units_in_focus();
|
||
... | ... | |
unit_list_iterate(get_units_in_focus(), punit) {
|
||
/*
|
||
* Is the unit which just lost focus a non-AI unit? If yes this
|
||
* enables the auto end turn.
|
||
* enables the auto end turn.
|
||
*/
|
||
if (punit->ssa_controller == SSA_NONE) {
|
||
non_ai_unit_focus = TRUE;
|
||
... | ... | |
} unit_list_iterate_end;
|
||
candidate = find_best_focus_candidate(FALSE);
|
||
if (!candidate) {
|
||
if (!candidate && accept_current) {
|
||
/* Accept current focus unit as last resort. */
|
||
candidate = find_best_focus_candidate(TRUE);
|
||
}
|
||
... | ... | |
}
|
||
} unit_list_iterate_end;
|
||
unit_focus_advance();
|
||
unit_focus_advance(TRUE);
|
||
}
|
||
/**********************************************************************//**
|
||
... | ... | |
punit->client.focus_status = FOCUS_WAIT;
|
||
} unit_list_iterate_end;
|
||
if (punits == get_units_in_focus()) {
|
||
unit_focus_advance();
|
||
unit_focus_advance(TRUE);
|
||
}
|
||
}
|
||
... | ... | |
punit->client.focus_status = new_status;
|
||
} unit_list_iterate_end;
|
||
if (new_status == FOCUS_DONE) {
|
||
unit_focus_advance();
|
||
unit_focus_advance(TRUE);
|
||
}
|
||
}
|
||
}
|
client/control.h | ||
---|---|---|
void unit_focus_remove(struct unit *punit);
|
||
void unit_focus_urgent(struct unit *punit);
|
||
void unit_focus_advance(void);
|
||
void unit_focus_advance(bool accept_current);
|
||
void unit_focus_update(void);
|
||
void auto_center_on_focus_unit(void);
|