                  else if @state.proposedMove \
                       then @state.viewingMove + 1 \
                       else @state.viewingMove
-    scoringMode = (@state.viewingMove == null or
-                   @state.viewingMove == moveCount(origSgfObject)) and
-                  isPassedTwice sgfObject
+    isViewingLatestMove = @state.viewingMove == null or
+                          @state.viewingMove == actionCount(origSgfObject)
+    isOnTurn = tesuji_charm.onTurn and isViewingLatestMove
+    # show proposed scores in board view?
+    showScoring = isPassedTwice sgfObject, moves: moveToShow
+    # allow user to change stone markings?
+    scoringMode = isOnTurn and showScoring
+    # allow user to place a proposed new stone?
+    playMode = isOnTurn and not showScoring
+
     objState = stateFromSgfObject sgfObject,
                                   moves: moveToShow,
-                                  scoring: scoringMode
-                                  deadStones: @state.deadStones
+                                  scoring: showScoring,
+                                  deadStones: if scoringMode \
+                                              then @state.deadStones \
+                                              else null
     {boardState, lastPlayed, prisoners, scores} = objState
     size = parseInt(sgfObject.gameTrees[0].nodes[0].SZ, 10) or 19
     nextColor = null

    throw Error "no passes found before resumption node"
  return lastPassSeen

isPassedTwice = (sgfObject) ->
  # true iff sgf ends with two successive passes
  nodes = sgfObject.gameTrees[0].nodes
  len = nodes.length
  isPass = (node) -> node.B == '' or node.W == ''
  hasMoveOrResume = (node) -> (typeof node.B == 'string' and node.B != '') or
                              (typeof node.W == 'string' and node.W != '') or
                              node.TCRESUME?
  passesSeen = 0
  i = len - 1
  while i >= 0 and not hasMoveOrResume(nodes[i])
    if isPass(nodes[i])
      passesSeen += 1

    scores = null
  {boardState, lastPlayed: {x, y}, prisoners, scores}

deadStonesFromSgfObject = (sgfObject, state, options={}) ->
  "Read current territories in sgfObject, mark dead stones in `state`
  accordingly, and return an array of points for all dead stones."
  {moves} = options
  nodes = sgfObject.gameTrees[0].nodes
  nodeIndex = if moves \
              then nodeNoFromActionNo sgfObject, moves \
              else nodes.length - 1
  node = nodes[nodeIndex]
  deadStones = []
  for tag in node.TB or []
    [x, y] = decodeSgfCoord tag
