Skip to content

Commit

Permalink
Fixed diggers reset on nevverending tasks.
Browse files Browse the repository at this point in the history
Diggers should be reset when repeatively doing a task which
can't be finished (digging gems) over 10 times in a row.

This functionality was damaged by overcomplicated conditions;
this change fixes the reset on neverending tasks, and adds
a log message when the reset is performed. Some other log
messages were also improved.
  • Loading branch information
mefistotelis committed Jul 14, 2015
1 parent f726497 commit e87e4b7
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 38 deletions.
5 changes: 3 additions & 2 deletions src/creature_states_spdig.c
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,7 @@ short imp_converts_dungeon(struct Thing *spdigtng)
slb = get_slabmap_block(slb_x, slb_y);
slbattr = get_slab_attrs(slb);
set_creature_instance(spdigtng, CrInst_DESTROY_AREA, 0, 0, 0);
// If the area we're converting is an enemy room, issue event to that player
if (slbattr->category == SlbAtCtg_RoomInterior)
{
room = room_get(slb->room_index);
Expand Down Expand Up @@ -990,7 +991,7 @@ short imp_digs_mines(struct Thing *spdigtng)
if (game.play_gameturn - cctrl->tasks_check_turn > 128)
{
if (check_out_imp_has_money_for_treasure_room(spdigtng)) {
cctrl->digger.task_repeats++;
// Note - do not increase cctrl->digger.task_repeats here; the task is to mine, not to return gold.
return 1;
}
cctrl->tasks_check_turn = game.play_gameturn;
Expand All @@ -1006,7 +1007,7 @@ short imp_doing_nothing(struct Thing *spdigtng)
{
struct CreatureControl *cctrl;
struct Dungeon *dungeon;
SYNCDBG(19,"Starting");
SYNCDBG(19,"Starting for %s index %d",thing_model_name(spdigtng),(int)spdigtng->index);
TRACE_THING(spdigtng);
if (!thing_is_creature_special_digger(spdigtng))
{
Expand Down
10 changes: 5 additions & 5 deletions src/magic.c
Original file line number Diff line number Diff line change
Expand Up @@ -277,26 +277,26 @@ TbBool can_cast_power_on_thing(PlayerNumber plyr_idx, const struct Thing *thing,
if ((powerst->can_cast_flags & PwCast_NConscCrtrs) == 0)
{
if (creature_is_being_unconscious(thing) || creature_is_dying(thing)) {
SYNCDBG(8,"Player %d cannot cast %s on unconscious %s",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing));
SYNCDBG(8,"Player %d cannot cast %s on unconscious %s index %d",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing),(int)thing->index);
return false;
}
}
if ((powerst->can_cast_flags & PwCast_BoundCrtrs) == 0)
{
if (armageddon_blocks_creature_pickup(thing, plyr_idx)) {
SYNCDBG(8,"Player %d cannot cast %s while armageddon blocks %s",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing));
SYNCDBG(8,"Player %d cannot cast %s while armageddon blocks %s index %d",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing),(int)thing->index);
return false;
}
if (creature_is_dragging_something(thing)) {
SYNCDBG(8,"Player %d cannot cast %s while %s is dragging something",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing));
SYNCDBG(8,"Player %d cannot cast %s while %s index %d is dragging something",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing),(int)thing->index);
return false;
}
if (creature_is_being_sacrificed(thing) || creature_is_being_summoned(thing)) {
SYNCDBG(8,"Player %d cannot cast %s on %s while entering/leaving",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing));
SYNCDBG(8,"Player %d cannot cast %s on %s index %d while entering/leaving",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing),(int)thing->index);
return false;
}
if (creature_affected_by_spell(thing, SplK_Teleport)) {
SYNCDBG(8,"Player %d cannot cast %s on %s while teleporting",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing));
SYNCDBG(8,"Player %d cannot cast %s on %s index %d while teleporting",(int)plyr_idx,power_code_name(pwkind),thing_model_name(thing),(int)thing->index);
return false;
}
}
Expand Down
51 changes: 25 additions & 26 deletions src/spdigger_stack.c
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,7 @@ TbBool check_out_unconverted_place(struct Thing *thing)
{
long stl_x,stl_y;
long slb_x,slb_y;
SYNCDBG(19,"Starting");
SYNCDBG(19,"Starting for %s index %d",thing_model_name(thing),(int)thing->index);
TRACE_THING(thing);
slb_x = subtile_slab_fast(thing->mappos.x.stl.num);
slb_y = subtile_slab_fast(thing->mappos.y.stl.num);
Expand All @@ -787,7 +787,7 @@ TbBool check_out_unconverted_place(struct Thing *thing)
return true;
}
}
if ( check_out_unconverted_spiral(thing, 1) )
if (check_out_unconverted_spiral(thing, 1))
{
return true;
}
Expand All @@ -798,7 +798,7 @@ long check_out_unprettied_place(struct Thing *thing)
{
long stl_x,stl_y;
long slb_x,slb_y;
SYNCDBG(19,"Starting");
SYNCDBG(19,"Starting for %s index %d",thing_model_name(thing),(int)thing->index);
TRACE_THING(thing);
slb_x = subtile_slab_fast(thing->mappos.x.stl.num);
slb_y = subtile_slab_fast(thing->mappos.y.stl.num);
Expand Down Expand Up @@ -828,28 +828,21 @@ long check_out_unprettied_place(struct Thing *thing)
TbBool is_digging_indestructible_place(const struct Thing *creatng)
{
struct CreatureControl *cctrl;
MapSubtlCoord base_stl_x,base_stl_y;
long i;
SYNCDBG(19,"Starting");
cctrl = creature_control_get_from_thing(creatng);
base_stl_x = stl_num_decode_x(cctrl->digger.task_stl);
base_stl_y = stl_num_decode_y(cctrl->digger.task_stl);
for (i=0; i < 4; i++)
MapSlabCoord slb_x,slb_y;
slb_x = subtile_slab_fast(stl_num_decode_x(cctrl->digger.task_stl));
slb_y = subtile_slab_fast(stl_num_decode_y(cctrl->digger.task_stl));
SYNCDBG(19,"Starting for %s index %d at %d,%d",thing_model_name(creatng),(int)creatng->index,(int)slb_x,(int)slb_y);
// Note that digger task position stores the cantral subtile on slab to be excavated
// which happens to be the same subtile as one stored in keeper map tasks
long task_idx;
task_idx = find_dig_from_task_list(creatng->owner, cctrl->digger.task_stl);
if (task_idx != -1)
{
SubtlCodedCoords task_pos;
MapSlabCoord slb_x,slb_y;
long task_idx;
slb_x = subtile_slab_fast(base_stl_x)+small_around[i].delta_x;
slb_y = subtile_slab_fast(base_stl_y)+small_around[i].delta_y;
task_pos = get_subtile_number(slab_subtile_center(slb_x), slab_subtile_center(slb_y));
task_idx = find_dig_from_task_list(creatng->owner, task_pos);
if (task_idx != -1)
{
struct SlabMap *slb;
slb = get_slabmap_block(slb_x, slb_y);
if (slab_kind_is_indestructible(slb->kind)) {
return true;
}
struct SlabMap *slb;
slb = get_slabmap_block(slb_x, slb_y);
if (slab_kind_is_indestructible(slb->kind)) {
return true;
}
}
return false;
Expand Down Expand Up @@ -2258,7 +2251,7 @@ long check_out_imp_last_did(struct Thing *creatng)
struct Dungeon *dungeon;
struct Room *room;
cctrl = creature_control_get_from_thing(creatng);
SYNCDBG(19,"Starting for %s index %d, last did %d",thing_model_name(creatng),(int)creatng->index,(int)cctrl->digger.last_did_job);
SYNCDBG(19,"Starting for %s index %d, last did %d repeated %d times",thing_model_name(creatng),(int)creatng->index,(int)cctrl->digger.last_did_job,(int)cctrl->digger.task_repeats);
TRACE_THING(creatng);
switch (cctrl->digger.last_did_job)
{
Expand All @@ -2267,9 +2260,15 @@ long check_out_imp_last_did(struct Thing *creatng)
case SDLstJob_DigOrMine:
if (is_digging_indestructible_place(creatng)) {
// If we were digging gems, do task reset every few times it went to treasury
// This allows to switch to other tasks and not consuming all the imp workforce for ever
if ((cctrl->digger.task_repeats % 10) == 0)
// This allows to switch to other tasks and not consuming all the diggers workforce for ever
dungeon = get_dungeon(creatng->owner);
if (((cctrl->digger.task_repeats % 10) == 0) && (dungeon->digger_stack_length > 1)) {
// Set position in digger tasks list to a random place
SYNCDBG(9,"Digger %s index %d reset due to neverending task",thing_model_name(creatng),(int)creatng->index);
cctrl->digger.stack_update_turn = dungeon->digger_stack_update_turn;
cctrl->digger.task_stack_pos = ACTION_RANDOM(dungeon->digger_stack_length);
break;
}
}
if (check_out_undug_place(creatng) || check_out_undug_area(creatng))
{
Expand Down
10 changes: 5 additions & 5 deletions src/tasks_list.c
Original file line number Diff line number Diff line change
Expand Up @@ -143,12 +143,12 @@ long find_dig_from_task_list(PlayerNumber plyr_idx, SubtlCodedCoords srch_tsk)
{
struct Dungeon *dungeon;
struct MapTask *mtask;
long i,max;
long i,imax;
dungeon = get_dungeon(plyr_idx);
max = dungeon->field_AF7;
if (max > MAPTASKS_COUNT)
max = MAPTASKS_COUNT;
for (i=0; i < max; i++)
imax = dungeon->field_AF7;
if (imax > MAPTASKS_COUNT)
imax = MAPTASKS_COUNT;
for (i=0; i < imax; i++)
{
mtask = &dungeon->task_list[i];
if ((mtask->coords == srch_tsk) && (mtask->kind != SDDigTask_Unknown3))
Expand Down

0 comments on commit e87e4b7

Please sign in to comment.