LiveWLdiagram::Status LiveWLdiagram :: walk (double dtime, Worm& worm, Iter& it_block)
{
  #ifdef DEBUG_MODE
  check_online (worm);
  check_halt_time (worm);
  #endif

  // Get the block and the time-distance to the block
  int site = worm.it()->site();
  it_block = worm.up() ? ++Iter(worm.it()) : --Iter(worm.it());
  const Iter& fix = (worm.it()->z.comp() == 0 ? fix_a : fix_b);

  #ifdef NN_INTERACTION
  // Check the neighbor kinks
  int block_nbi = -1;
  if (worm.up())
    for(int nbi = 0; nbi < _latt(site).nbs(); ++nbi) {
      Iter it_ass = worm.it()->assoc(nbi);
      if (it_ass->time() < it_block->time()) {
        it_block = it_ass;
        block_nbi = nbi;
      }
    }
  else
    for(int nbi = 0; nbi < _latt(site).nbs(); ++nbi) {
      Iter it_ass = --Iter(worm.it()->assoc(nbi));
      if (it_ass->time() > it_block->time()) {
        it_block = it_ass;
        block_nbi = nbi;
      }
    }
  #endif

  double dtime_block = fabs (it_block->time() - worm.it()->time());

  // Check force-halt
  double dtime_halt = fabs (halt_times(worm.ti) - worm.it()->time());

  double dtime_stop = (dtime_halt < dtime_block ? dtime_halt : dtime_block);
  bool   force_halt = (dtime_halt < dtime_block ? true : false);

  // Free
  if (dtime < dtime_stop) {
    Wld::walk (worm, dtime);
    return FREE;
  }
  // Force halt
  else if (force_halt) {
    Wld::walk (worm, dtime_stop);
    if (worm.up())
        worm.ti++;
    else
        worm.ti--;
    return FORCED_HALTED;
  }
  #ifdef NN_INTERACTION
  // Pass neighbor
  else if (block_nbi != -1) {
    Wld::pass_neighbor (worm.up(), worm.it(), it_block, block_nbi);
    return PASS_NEIGHBOR;
  }
  #endif
  // Cross end
  else if (it_block->end()) {
    this->cross_end (worm);
    return CROSS_END;
  }
  // Cross node
  else if (it_block->z.comp() != worm.it()->z.comp()
        || it_block->z.creat() == worm.it()->z.creat())
  {
    Wld::cross_node (worm);
    return CROSS_NODE;
  }
  // Meet fix-worm
  else if (it_block == fix) {
    return CRASH;
  }
  // Halted
  else {
    Wld::halt (worm);
    return HALTED;
  }
}