protected void updatePos() { super.updatePos(); float speed = getSpeed(); float speed_lim = getRoad().getSpeedLimit(); int dist_ints = next_ints_dist(); int dist_obst = dist_ints; int dist_new_car = dist_ints; if (front_car != null) { dist_new_car = getDist(front_car); if (dist_new_car < dist_obst) dist_obst = dist_new_car; } if ((float) dist_obst > 4F * speed) { float a = 0.0F; if ((double) speed < 0.8D * (double) speed_lim) a = 50F; else if (speed < speed_lim) a = 10F; else if (speed > speed_lim) a = 10F * (speed_lim - speed); if ((double) (speed + a) < 10D) a = 10F - speed; accelerate(a); } else if (dist_ints < 6) { boolean stop_inter = false; if (!stop_inter) { int dir = random.nextInt(3); Road roads[] = nextInter.getRoads(); int d[] = new int[3]; int direction = getDir(); d[0] = RoadGrid.getLeftDir(direction); d[1] = direction; for (d[2] = RoadGrid.getRightDir(direction); roads[d[dir]] == null; dir = random.nextInt(3)) ; accelerate(-50F); make_Turn(d[dir]); } if (watch_red || front_car != null) { accelerate(-50F); stop_inter = true; } } else if (speed > 12F) accelerate(-(speed * speed) / (float) (4 * dist_ints)); else accelerate(10F - speed); if (front_car != null) { double diff; if (getRoad().getDir() == getDir() && (getDist((Car) this, front_car, getDir()) < 2 * getSpeed())) { if (getSpeed() > front_car.getSpeed()) diff = getSpeed() - front_car.getSpeed(); else diff = -1 * (getSpeed() - front_car.getSpeed()); accelerate(-1 * (float) (diff / 2.0f), 2); if ((int) Math.sqrt(Coords.distSqrd(front_car.getPos(), getPos())) < 20) accelerate((float) (-1 * getSpeed() * getSpeed() / (0.01)), 20); } } }