diff --git a/obj/roadsign.cc b/obj/roadsign.cc index 857c2276e..331a41631 100644 --- a/obj/roadsign.cc +++ b/obj/roadsign.cc @@ -627,9 +627,10 @@ sync_result roadsign_t::sync_step(uint32 /*delta_t*/) } else { // change every ~32s - uint32 ticks = ((welt->get_ticks()>>10)+ticks_offset) % (ticks_ns+ticks_ow); + // Must not overflow if ticks_ns+ticks_ow=256 + uint32 ticks = ((welt->get_ticks()>>10)+ticks_offset) % ((uint32)ticks_ns+(uint32)ticks_ow); - uint8 new_state = (ticks >= ticks_ns) ^ (welt->get_settings().get_rotation() & 1); + uint8 new_state = (ticks >= ticks_ns); if(state!=new_state) { state = new_state; dir = (new_state==0) ? ribi_t::northsouth : ribi_t::eastwest; @@ -646,6 +647,11 @@ void roadsign_t::rotate90() obj_t::rotate90(); if(automatic && !desc->is_private_way()) { state = (state+1)&1; + if (ticks_offset >= ticks_ns) { + ticks_offset -= ticks_ns; + } else { + ticks_offset += ticks_ow; + } uint8 temp = ticks_ns; ticks_ns = ticks_ow; ticks_ow = temp; diff --git a/obj/roadsign.h b/obj/roadsign.h index c00d11d15..55d788e92 100644 --- a/obj/roadsign.h +++ b/obj/roadsign.h @@ -131,9 +131,21 @@ public: // change the phases of the traffic lights uint8 get_ticks_ns() const { return ticks_ns; } - void set_ticks_ns(uint8 ns) { ticks_ns = ns; } + void set_ticks_ns(uint8 ns) { + ticks_ns = ns; + // To prevent overflow in ticks_offset when rotating + if (ticks_ow > 256-ticks_ns) { + ticks_ow = 256-ticks_ns; + } + } uint8 get_ticks_ow() const { return ticks_ow; } - void set_ticks_ow(uint8 ow) { ticks_ow = ow; } + void set_ticks_ow(uint8 ow) { + ticks_ow = ow; + // To prevent overflow in ticks_offset when rotating + if (ticks_ns > 256-ticks_ow) { + ticks_ns = 256-ticks_ow; + } + } uint8 get_ticks_offset() const { return ticks_offset; } void set_ticks_offset(uint8 offset) { ticks_offset = offset; }