Skip to content

Commit

Permalink
Add the markLastMove to the flattener.
Browse files Browse the repository at this point in the history
  • Loading branch information
artasparks committed Mar 21, 2016
1 parent 562e471 commit e4ec920
Show file tree
Hide file tree
Showing 7 changed files with 234 additions and 221 deletions.
69 changes: 34 additions & 35 deletions src/compiled/glift.js

Large diffs are not rendered by default.

181 changes: 93 additions & 88 deletions src/compiled/glift_combined.js
Original file line number Diff line number Diff line change
Expand Up @@ -13805,28 +13805,27 @@ glift.flattener.flatten = function(movetreeInitial, opt_options) {
mt, options.problemConditions);

// Get the marks at the current position
var mksOut = glift.flattener.markMap_(mt);
var labels = mksOut.labels; // map of ptstr to label str
var marks = mksOut.marks; // map of ptstr to symbol
var markMap = glift.flattener.markMap_(mt);

// Optionally update the labels with labels used to indicate variations.
var sv = glift.enums.showVariations
if (showVars === sv.ALWAYS || (
showVars === sv.MORE_THAN_ONE && mt.node().numChildren() > 1)) {
glift.flattener.updateLabelsWithVariations_(mt, marks, labels);
glift.flattener.updateLabelsWithVariations_(mt, markMap);
}

// Calculate the collision stones and update the marks / labels maps if
// necessary.
var collisions = glift.flattener.createStoneLabels_(
applied.stones, stoneMap, marks, labels, startingMoveNum);
applied.stones, stoneMap, markMap, startingMoveNum);

// Optionally mark the last move played. Existing labels get preference.
glift.flattener.markLastMove_(markMap, mt.getLastMove(), options.markLastMove);

// Finally! Generate the intersections double-array.
var board = glift.flattener.board.create(cropping, stoneMap, marks, labels);
var board = glift.flattener.board.create(cropping, stoneMap, markMap);

// TODO(kashomon): Support
// - lastMove
// - nextPossibleMoves
// - selectedNextMove
// - correctNextMoves
var comment = mt.properties().getComment() || '';
Expand All @@ -13849,8 +13848,7 @@ glift.flattener.flatten = function(movetreeInitial, opt_options) {
mainlineMove: mainlineMove,
nextMainlineMove: nextMainlineMove,
stoneMap: stoneMap,
markMap: marks,
labelMap: labels,
markMap: markMap,
ko: goban.getKo(),
// ProblemSpecific:
correctNextMoves: correctNextMoves,
Expand Down Expand Up @@ -14047,6 +14045,51 @@ glift.flattener.findStartingMoveNum_ = function(mt, nextMovesTreepath) {
return mvnum;
};

/**
* Returns a map of ptstr to correct next moves. Usually used for creating marks
* or other such display-handling.
*
* @param {!glift.rules.MoveTree} mt
* @param {!glift.rules.ProblemConditions|undefined} conditions
* @return {!Object<glift.PtStr, glift.rules.Move>} object of correct next moves.
* @private
*/
glift.flattener.getCorrectNextMoves_ = function(mt, conditions) {
var correctNextMap = {};
if (conditions) {
var correctNextArr = glift.rules.problems.correctNextMoves(mt, conditions);
for (var i = 0; i < correctNextArr.length; i++) {
var move = correctNextArr[i];
if (move.point) {
correctNextMap[move.point.toString()] = move;
}
}
}
return correctNextMap;
};

/**
* Update the labels with variations numbers of the next movez. This is an
* optional step and usually isn't done for diagrams-for-print.
*
* @param {!glift.rules.MoveTree} mt
* @param {!glift.flattener.MarkMap} markMap
* @private
*/
glift.flattener.updateLabelsWithVariations_ = function(mt, markMap) {
for (var i = 0; i < mt.node().numChildren(); i++) {
var move = mt.node().getChild(i).properties().getMove();
if (move && move.point) {
var pt = move.point;
var ptStr = pt.toString();
if (markMap.labels[ptStr] === undefined) {
markMap.labels[ptStr] = '' + (i + 1);
}
markMap.marks[ptStr] = glift.flattener.symbols.NEXTVARIATION;
}
}
};

/**
* Create or apply labels to identify collisions that occurred during apply.
*
Expand All @@ -14055,25 +14098,23 @@ glift.flattener.findStartingMoveNum_ = function(mt, nextMovesTreepath) {
*
* returns: an array of collision objects:
*
*
*
* Sadly, this has has the side effect of altering the marks / labels maps --
* not in the underlying movetree, but in the ultimate representation.
* not in the underlying movetree, but in the ultimate representation in the
* board.
*
* @param {!Array<!glift.rules.Move>} appliedStones The result of applying the
* treepath.
* @param {!Object<!glift.PtStr, !glift.rules.Move>} stoneMap Map of ptstring
* to the move.
* @param {!Object<!glift.PtStr, !glift.flattener.symbols>} marks
* @param {!Object<!glift.PtStr, string>} labels
* @param {!glift.flattener.MarkMap} markMap
* @param {number} startingMoveNum
*
* @return {!Array<!glift.flattener.Collision>}
* @private
*/
// TODO(kashomon): Guard this with a autoLabelMoves flag.
glift.flattener.createStoneLabels_ = function(
appliedStones, stoneMap, marks, labels, startingMoveNum) {
appliedStones, stoneMap, markMap, startingMoveNum) {
if (!appliedStones || appliedStones.length === 0) {
return []; // Don't perform relabeling if no stones are found.
}
Expand All @@ -14085,10 +14126,10 @@ glift.flattener.createStoneLabels_ = function(

// Remove any number labels currently existing in the marks map.
var digitRegex = /[0-9]/;
for (var ptstr in labels) {
if (digitRegex.test(labels[ptstr])) {
delete labels[ptstr];
delete marks[ptstr];
for (var ptstr in markMap.labels) {
if (digitRegex.test(markMap.labels[ptstr])) {
delete markMap.labels[ptstr];
delete markMap.marks[ptstr];
}
}

Expand All @@ -14114,75 +14155,48 @@ glift.flattener.createStoneLabels_ = function(
label: undefined,
collisionStoneColor: colStoneColor
};
if (labels[ptStr]) { // First see if there are any available labels.
col.label = labels[ptStr];
if (markMap.labels[ptStr]) { // First see if there are any available labels.
col.label = markMap.labels[ptStr];
} else if (glift.util.typeOf(stone.collision) === 'number') {
var collisionNum = stone.collision + startingMoveNum;
col.label = (collisionNum) + ''; // label is idx.
} else { // should be null
var lbl = extraLabs.charAt(labsIdx);
labsIdx++;
col.label = lbl;
marks[ptStr] = symb.TEXTLABEL;
labels[ptStr] = lbl;
markMap.marks[ptStr] = symb.TEXTLABEL;
markMap.labels[ptStr] = lbl;
}
collisions.push(col);

// This is not a collision stone. Perform standard move-labeling.
} else {
// Create new labels for our move number.
marks[ptStr] = symb.TEXTLABEL; // Override labels.
labels[ptStr] = (nextMoveNum) + ''
markMap.marks[ptStr] = symb.TEXTLABEL; // Override labels.
markMap.labels[ptStr] = (nextMoveNum) + ''
}
}
return collisions;
};

/**
* Update the labels with variations numbers. This is an optional step and
* usually isn't done for diagrams-for-print.
* Optionally mark the last move (by updating the mark map) if:
*
* @param {!glift.rules.MoveTree} mt
* @param {!Object<!glift.PtStr, !glift.flattener.symbols>} marks Map of ptstring
* to the move.
* @param {!Object<!glift.PtStr, string>} labels
* @private
*/
glift.flattener.updateLabelsWithVariations_ = function(mt, marks, labels) {
for (var i = 0; i < mt.node().numChildren(); i++) {
var move = mt.node().getChild(i).properties().getMove();
if (move && move.point) {
var pt = move.point;
var ptStr = pt.toString();
if (labels[ptStr] === undefined) {
labels[ptStr] = '' + (i + 1);
}
marks[ptStr] = glift.flattener.symbols.NEXTVARIATION;
}
}
};

/**
* Returns a map of ptstr to correct next moves. Usually used for creating marks
* or other such display-handling.
* 0. The last move is defined.
* 1. There is no existing mark in the markMap at the location.
* 2. The markLastMove option is true.
*
* @param {!glift.rules.MoveTree} mt
* @param {!glift.rules.ProblemConditions|undefined} conditions
* @return {!Object<glift.PtStr, glift.rules.Move>} object of correct next moves.
* @private
* @param {!glift.flattener.MarkMap} markMap
* @param {?glift.rules.Move} lastMove
* @param {boolean|undefined} markLast
*/
glift.flattener.getCorrectNextMoves_ = function(mt, conditions) {
var correctNextMap = {};
if (conditions) {
var correctNextArr = glift.rules.problems.correctNextMoves(mt, conditions);
for (var i = 0; i < correctNextArr.length; i++) {
var move = correctNextArr[i];
if (move.point) {
correctNextMap[move.point.toString()] = move;
}
glift.flattener.markLastMove_ = function(markMap, lastMove, markLast) {
if (lastMove && lastMove.point) {
var ptstr = lastMove.point.toString();
if (!markMap.marks[ptstr] && markLast) {
markMap.marks[ptstr] = glift.flattener.symbols.LASTMOVE;
}
}
return correctNextMap;
};

goog.provide('glift.flattener.board');
Expand All @@ -14197,13 +14211,12 @@ glift.flattener.board = {
* how to crop the board.
* @param {!Object<!glift.rules.Move>} stoneMap A map from pt-string to
* move.
* @param {!Object<glift.flattener.symbols>} markMap A map from pt-string to
* mark symbol.
* @param {!Object<string>} labelMap A map from pt-string to label string
* @param {!glift.flattener.MarkMap} markMap A map from pt-string to
* mark symbol, and a map from pt-string to label string.
*
* @return {!glift.flattener.Board<Intersection>}
*/
create: function(cropping, stoneMap, markMap, labelMap) {
create: function(cropping, stoneMap, markMap) {
var point = glift.util.point;
var board = [];
var bbox = cropping.bbox;
Expand All @@ -14214,8 +14227,8 @@ glift.flattener.board = {
var ptStr = pt.toString();
var stone = stoneMap[ptStr];
var stoneColor = stone ? stone.color : glift.enums.states.EMPTY;
var mark = markMap[ptStr];
var label = labelMap[ptStr]
var mark = markMap.marks[ptStr];
var label = markMap.labels[ptStr]
row.push(glift.flattener.intersection.create(
pt, stoneColor, mark, label, cropping.size));
}
Expand Down Expand Up @@ -14511,8 +14524,7 @@ goog.provide('glift.flattener.FlattenedParams');
* mainlineMove: ?glift.rules.Move,
* nextMainlineMove: ?glift.rules.Move,
* stoneMap: !Object<glift.PtStr, !glift.rules.Move>,
* markMap: !Object<glift.PtStr, !glift.flattener.symbols>,
* labelMap: !Object<glift.PtStr, string>,
* markMap: !glift.flattener.MarkMap,
* ko: ?glift.Point,
* correctNextMoves: !Object<glift.PtStr, !glift.rules.Move>,
* problemResult: ?glift.enums.problemResults
Expand All @@ -14537,9 +14549,9 @@ glift.flattener.emptyFlattened = function(size) {
return glift.flattener.emptyFlattenedCache_[size];
}
var mt = glift.rules.movetree.getInstance(size);
var flattened = glift.flattener.flatten(mt);
glift.flattener.emptyFlattenedCache_[size] = flattened;
return flattened;
var flat = glift.flattener.flatten(mt);
glift.flattener.emptyFlattenedCache_[size] = flat;
return flat;
};

/**
Expand Down Expand Up @@ -14628,18 +14640,11 @@ glift.flattener.Flattened = function(params) {

/**
* All the marks!
* @private {!Object<glift.PtStr, !glift.flattener.symbols>}
* @private {!glift.flattener.MarkMap}
* @const
*/
this.markMap_ = params.markMap;

/**
* All the labels!
* @private {!Object<glift.PtStr, string>}
* @const
*/
this.labelMap_ = params.labelMap;

/**
* The Ko point. Will be null if there is currently no Ko.
* @private {?glift.Point}
Expand Down Expand Up @@ -14785,8 +14790,8 @@ glift.flattener.Flattened.prototype = {
*
* @return {!Object<glift.PtStr, string>}
*/
labelMap: function() {
return this.labelMap_;
labels: function() {
return this.markMap_.labels;
},

/**
Expand All @@ -14798,8 +14803,8 @@ glift.flattener.Flattened.prototype = {
*
* @return {!Object<glift.PtStr, glift.flattener.symbols>}
*/
markMap: function() {
return this.markMap_;
marks: function() {
return this.markMap_.marks;
},

/**
Expand Down
11 changes: 5 additions & 6 deletions src/flattener/board.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,12 @@ glift.flattener.board = {
* how to crop the board.
* @param {!Object<!glift.rules.Move>} stoneMap A map from pt-string to
* move.
* @param {!Object<glift.flattener.symbols>} markMap A map from pt-string to
* mark symbol.
* @param {!Object<string>} labelMap A map from pt-string to label string
* @param {!glift.flattener.MarkMap} markMap A map from pt-string to
* mark symbol, and a map from pt-string to label string.
*
* @return {!glift.flattener.Board<Intersection>}
*/
create: function(cropping, stoneMap, markMap, labelMap) {
create: function(cropping, stoneMap, markMap) {
var point = glift.util.point;
var board = [];
var bbox = cropping.bbox;
Expand All @@ -27,8 +26,8 @@ glift.flattener.board = {
var ptStr = pt.toString();
var stone = stoneMap[ptStr];
var stoneColor = stone ? stone.color : glift.enums.states.EMPTY;
var mark = markMap[ptStr];
var label = labelMap[ptStr]
var mark = markMap.marks[ptStr];
var label = markMap.labels[ptStr]
row.push(glift.flattener.intersection.create(
pt, stoneColor, mark, label, cropping.size));
}
Expand Down

0 comments on commit e4ec920

Please sign in to comment.