diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..cbdcbbc --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.js text eol=lf diff --git a/src/roadmaps/roadmapGenerator.js b/src/roadmaps/roadmapGenerator.js index 098add2..2323917 100644 --- a/src/roadmaps/roadmapGenerator.js +++ b/src/roadmaps/roadmapGenerator.js @@ -71,19 +71,12 @@ class RoadmapGenerator { if (lastItemInResults) { lastItemInResults.ties = _.cloneDeep(tieStack); tieStack = []; - if (lastItemInResults.result.outcome !== gameResult.outcome) { - logicalColumnNumber++; - } } } else if (lastItem.outcome !== gameResult.outcome) { // If this item is different from the outcome of - // the last game then we must place it in another column - // lastItem is not tie so we can clear the tieStack + // the last game then we must place it in another + // column logicalColumnNumber++; - tieStack = []; - } else { - // If this item is the same as the outcome of current game and not a tie, then we must clear the tie stack - tieStack = [] } } @@ -201,54 +194,60 @@ class RoadmapGenerator { let k = cycleLength; let outcomes = []; - Object.values(columnDefinitions).forEach((bigRoadColumn) => { - let outcome = 'blue'; - let n = bigRoadColumn.logicalColumn; - - for (let m = 0; m < bigRoadColumn.logicalColumnDepth; m++) { - let rowMDepth = m + 1; + // Iterate columns in numeric order to ensure stable derived-road output. - if (rowMDepth >= 2) { - let compareColumn = n - k; + Object.keys(columnDefinitions) + .map((kStr) => parseInt(kStr, 10)) + .sort((a, b) => a - b) + .forEach((colIndex) => { + let bigRoadColumn = columnDefinitions[colIndex]; + let outcome = 'blue'; + let n = bigRoadColumn.logicalColumn; - // Step 2.a.1 - No column exists here. - if (compareColumn <= 0) - continue; + for (let m = 0; m < bigRoadColumn.logicalColumnDepth; m++) { + let rowMDepth = m + 1; - // Step 2.a.1 - let pColumn = columnDefinitions[compareColumn]; - if (!pColumn) - continue; - - let p = pColumn.logicalColumnDepth; - if (rowMDepth <= p) { - outcome = 'red'; - } else if (rowMDepth == (p + 1)) { - outcome = 'blue'; - } else if (rowMDepth > (p + 1)) { - outcome = 'red'; - } + if (rowMDepth >= 2) { + let compareColumn = n - k; - outcomes.push(outcome); - } else { - let kDistanceColumn = n - (k + 1); - let leftColumn = n - 1; + // Step 2.a.1 - No column exists here. + if (compareColumn <= 0) + continue; - let kDistanceColumnDefinition = columnDefinitions[kDistanceColumn]; - let leftColumnDefinition = columnDefinitions[leftColumn]; + // Step 2.a.1 + let pColumn = columnDefinitions[compareColumn]; + if (!pColumn) + continue; - if (kDistanceColumnDefinition != null && - leftColumnDefinition != null) { - if (kDistanceColumnDefinition.logicalColumnDepth == leftColumnDefinition.logicalColumnDepth) + let p = pColumn.logicalColumnDepth; + if (rowMDepth <= p) { outcome = 'red'; - else + } else if (rowMDepth == (p + 1)) { outcome = 'blue'; + } else if (rowMDepth > (p + 1)) { + outcome = 'red'; + } outcomes.push(outcome); + } else { + let kDistanceColumn = n - (k + 1); + let leftColumn = n - 1; + + let kDistanceColumnDefinition = columnDefinitions[kDistanceColumn]; + let leftColumnDefinition = columnDefinitions[leftColumn]; + + if (kDistanceColumnDefinition != null && + leftColumnDefinition != null) { + if (kDistanceColumnDefinition.logicalColumnDepth == leftColumnDefinition.logicalColumnDepth) + outcome = 'red'; + else + outcome = 'blue'; + + outcomes.push(outcome); + } } } - } - }); + }); return outcomes; }