Example #1
0
float PointF::distance(const PointF other)
{
    return sqrt((x() - other.x()) * (x() - other.x()) + (y() - other.y()) * (y() - other.y()));
}
Example #2
0
void Walker::_walk()
{
  if( !_d->action.valid() || !_pathway().isValid() )
  {
    // nothing to do
    _noWay();
    _changeDirection();
    return;
  }

  float speedKoeff = 1.f;
  switch( _d->action.direction )
  {
  case direction::north:
  case direction::south:
  case direction::east:
  case direction::west:
  break;

  case direction::northEast:
  case direction::southWest:
  case direction::southEast:
  case direction::northWest:
     speedKoeff = 0.7f;
  break;

  default:
     Logger::warning( "Walker: invalid move direction: %d", _d->action.direction );
     _d->action.action = acNone;
     _d->action.direction = direction::none;
     return;
  break;
  }

  PointF delta = _d->speed.vector;
  delta.rx() = delta.x() * _d->speed.current() * speedKoeff;
  delta.ry() = delta.y() * _d->speed.current() * speedKoeff;

  PointF tmp = _d->world.pos;
  const int wcell = tilemap::cellSize().height();
  TilePos saveMpos( tmp.x() / wcell , tmp.y() / wcell );
  _d->world.pos += delta;
  _updateMappos();

  tmp = _d->world.pos;
  TilePos currentMapPos( tmp.x() / wcell, tmp.y() / wcell );

  if( !_d->map.inCenter )
  {
    float crntDst = _d->world.dst2next();
    if( crntDst < _d->world.lastDst )
    {
      _d->world.lastDst = crntDst;
    }
    else
    {      
      _d->map.path.next();
      _centerTile();
    }
  }

  if( saveMpos != currentMapPos )
  {
    _d->map.tile = &_d->city->tilemap().at( currentMapPos );
    _changeTile();
  }
}
Example #3
0
PointF::PointF(const PointF &p)
{
    mX = p.x();
    mY = p.y();
}
Example #4
0
std::string Json::serialize(const Variant &data, bool &success, const std::string& tab)
{
  std::string str;
  success = true;

  if( data.isNull() ) // invalid or null?
  {
    return "null";
  }

  switch( data.type() )
  {
    case Variant::List:
    case Variant::NStringArray: // variant is a list?
    {
      StringArray values;
      const VariantList rlist = data.toList();
      std::string serializedValue;
      serializedValue.reserve( 512 );
      for( auto item : rlist )
      {
        serializedValue = serialize( item, "" );
        if( serializedValue.empty() )
        {
            success = false;
            break;
        }

        values.push_back( serializedValue );
      }

      str = "[ " + join( values, ", " ) + " ]";
    }
    break;

    case Variant::Map: // variant is a map?
    {
      VariantMap vmap = data.toMap();
      
      if( vmap.empty() )
      {
        str = "{}";
      }
      else
      {
        str = "{ \n";
        StringArray pairs;
        std::string serializedValue;
        serializedValue.reserve( 512 );
        for( auto item : vmap )
        {        
          serializedValue = serialize( item.second, tab + "  ");
          if( serializedValue.empty())
          {
                  //success = false;
            pairs.push_back( tab + sanitizeString( item.first ) + std::string( " : \"nonSerializableValue\"" ) );
            continue;
          }
          pairs.push_back( tab + sanitizeString( item.first ) + " : " + serializedValue );
        }
        str += join(pairs, ",\n");
        std::string rtab( tab );
        rtab.resize( std::max<int>( 0, tab.size() - 2 ) );
        str += std::string( "\n" ) + rtab + "}";
      }
    }
    break;

    case Variant::String:
    case Variant::NByteArray: // a string or a byte array?
    {
      str = sanitizeString( data.toString() );
    }
    break;

    case Variant::Double:
    case Variant::Float: // double?
    {
      // TODO: cheap hack - almost locale independent double formatting
      str = utils::format( 0xff, "\"%f\"", data.toDouble() );
      str = utils::replace(str, ",", ".");
      if( str.find(".") == std::string::npos && str.find("e") == std::string::npos )
      {
         str += ".0";
      }
    }
    break;

    case Variant::NTilePos:
    {
      const TilePos& pos = data.toTilePos();
      str = utils::format( 0xff, "[ %d, %d ]", pos.i(), pos.j() );
    }
    break;

    case Variant::NSize:
    {
      const Size& size = data.toSize();
      str = utils::format( 0xff, "[ %d, %d ]", size.width(), size.height() );
    }
    break;

    case Variant::NPoint:
    {
      const Point& pos = data.toPoint();
      str = utils::format( 0xff, "[ %d, %d ]", pos.x(), pos.y() );
    }
    break;

    case Variant::NPointF:
    {
      PointF pos = data.toPointF();
      // TODO: cheap hack - almost locale independent double formatting
      std::string posX = utils::replace(utils::format( 0xff, "%f", pos.x()), ",", ".");
      std::string posY = utils::replace(utils::format( 0xff, "%f", pos.y()), ",", ".");
      str = utils::format( 0xff, "[ \"%s\", \"%s\" ]", posX.c_str(), posY.c_str() );
    }
    break;

    case Variant::Bool: // boolean value?
    {
      str = data.toBool() ? "true" : "false";
    }
    break;

    case Variant::ULongLong: // large unsigned number?
    {
      str = utils::format( 0xff, "%u", data.toULongLong() );
    }
    break;

    case Variant::Int: // simple int?
    {
      str = utils::format( 0xff, "%d", data.toInt() );
    }
    break;

    case Variant::UInt:
    {
      str = utils::format( 0xff, "%d", data.toInt() );
    }
    break;

    default:
      if ( data.canConvert( Variant::LongLong ) ) // any signed number?
      {
        str = utils::format( 0xff, "%d", data.toLongLong() );
      }
      else if (data.canConvert( Variant::Long ))
      {
        str = utils::format( 0xff, "%d", data.toLongLong() );
      }
      else if (data.canConvert( Variant::String ) ) // can value be converted to string?
      {
        // this will catch Date, DateTime, Url, ...
        str = sanitizeString( data.toString() );
      }
      else
      {
        success = false;
      }
    break;
  }

  return success ? str : std::string();
}