From: ian Date: Mon, 5 May 2008 11:23:49 +0000 (+0000) Subject: really set polarity of interferers during resolution X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=1ecf306ebaf9a149678ef4f107258ed0b68ebf31;p=trains.git really set polarity of interferers during resolution --- diff --git a/hostside/resolve.c b/hostside/resolve.c index 151c471..0c5c55c 100644 --- a/hostside/resolve.c +++ b/hostside/resolve.c @@ -171,6 +171,16 @@ static int resmain_getmovpos(TrackLocation *t, TrackAdvanceContext *c, return 0; } +static MovPosComb just_getmovpos(Segment *d, TrackAdvanceContext *tac) { + MovPosComb target; + TrackLocation tloc; + int r; + + tloc.seg= d; + r= resmain_getmovpos(&tloc,tac,&target); assert(!r); + return target; +} + static int resolve_complete_main(void) { int problems, phase, nextphase; TRAIN_ITERVARS(t); @@ -310,28 +320,28 @@ static int resolve_complete_main(void) { } } - TrackLocation tloc; + if (problems) return problems; + TrackAdvanceContext tac; - Segment *interferer; + MovPosComb target; tac.getmovpos= resmain_getmovpos; - int r; FOR_SEGMENT(d,NOOP,NOOP) { if (problems) return problems; - tloc.seg= d; d->iselem_u= 0; - interferer= segment_interferes(&tac,d); - if (interferer && interferer->i->invertible) { - actual_inversions_start(); - interferer->seg_inverted= d->seg_inverted; - actual_inversions_segment(interferer); - actual_inversions_done(); - } + target= just_getmovpos(d,&tac); - MovPosComb target; - r= resmain_getmovpos(&tloc,&tac,&target); assert(!r); + if (d->i->invertible && target<0) { + Segment *interferer= segment_interferes(&tac,d); + if (interferer) { + actual_inversions_start(); + d->seg_inverted= interferer->seg_inverted; + actual_inversions_segment(d); + actual_inversions_done(); + } + } if (d->i->n_poscombs>1) { d->movposcomb= -1;