예제 #1
0
파일: dfs-maze.cpp 프로젝트: ftk/XXLDDRace
void fill_maze(int x, int y, int lenght = 0)
{
  cell& cur = maze[x][y];
  cur.visited = true;
  if(lenght > endlen)
  {
    endx = x;
    endy = y;
    endlen = lenght;
  }
  for(int i = 0; i < 30; i++) // all directions in random order
  {
    direction dir = random_dir();
    int cx = x, cy = y; // neightbor
    if(!offset(dir, cx, cy))
      continue;
    cell& n = maze[cx][cy];
    if(n.visited)
      continue;
    
    // make path
    cur.break_wall(dir);
    n.break_wall(opposite(dir));
    
    
    // recursion
    fill_maze(cx, cy, lenght + 1);
  }
}
예제 #2
0
Vec3 DiffuseMaterial::out_direction(Vec3 const &in, Vec3 const &norm, double &brdf, RGB &color, CRandomMersenne *rng)
{
	// Generamos una nueva direccion. Sera una direccion aleatoria en la
	// semiesfera definida por la normal.
	brdf    = 1.0f;
	color   = radiance() * brdf;
	return versor(random_dir(norm, rng->Random(), rng->Random()));
}
예제 #3
0
파일: worm.c 프로젝트: FredrIQ/fiqhack
/*
 *  place_worm_tail_randomly()
 *
 *  Place a worm tail somewhere on a level behind the head.
 *  This routine essentially reverses the order of the wsegs from head
 *  to tail while placing them.
 *  x, and y are most likely the worm->mx, and worm->my, but don't *need* to
 *  be, if somehow the head is disjoint from the tail.
 */
void
place_worm_tail_randomly(struct monst *worm, xchar x, xchar y, enum rng rng)
{
    int wnum = worm->wormno;
    struct level *lev = worm->dlevel;
    struct wseg *curr = lev->wtails[wnum];
    struct wseg *new_tail;
    xchar ox = x, oy = y;

/*  if (!wnum) return;  bullet proofing */

    if (wnum && (!lev->wtails[wnum] || !lev->wheads[wnum])) {
        impossible("place_worm_tail_randomly: wormno is set without a tail!");
        return;
    }

    lev->wheads[wnum] = new_tail = curr;
    curr = curr->nseg;
    new_tail->nseg = NULL;
    new_tail->wx = x;
    new_tail->wy = y;

    while (curr) {
        xchar nx, ny;
        char tryct = 0;

        /* pick a random direction from x, y and search for goodpos() */

        do {
            random_dir(ox, oy, &nx, &ny, rng);
        } while (!goodpos(lev, nx, ny, worm, 0) && (tryct++ < 50));

        if (tryct < 50) {
            place_worm_seg(worm, nx, ny);
            curr->wx = ox = nx;
            curr->wy = oy = ny;
            lev->wtails[wnum] = curr;
            curr = curr->nseg;
            lev->wtails[wnum]->nseg = new_tail;
            new_tail = lev->wtails[wnum];
            if (lev == level)
                newsym(nx, ny);
        } else {        /* Oops.  Truncate because there was */
            toss_wsegs(lev, curr, FALSE);      /* no place for the rest of it */
            curr = NULL;
        }
    }
}
예제 #4
0
void CShootingObject::FireBullet(const Fvector& pos, 
								 const Fvector& shot_dir, 
								 float fire_disp,
								 const CCartridge& cartridge,
								 u16 parent_id,
								 u16 weapon_id,
								 bool send_hit)
{
	Fvector dir;
	random_dir(dir,shot_dir,fire_disp);

	m_vCurrentShootDir = dir;
	m_vCurrentShootPos = pos;
	m_iCurrentParentID = parent_id;
	
	bool aim_bullet;
	if (m_bUseAimBullet)
	{
		if (ParentMayHaveAimBullet())
		{
			if (m_fPredBulletTime==0.0)
			{
				aim_bullet=true;
			}
			else
			{
				if ((Device.fTimeGlobal-m_fPredBulletTime)>=m_fTimeToAim)
				{
					aim_bullet=true;
				}
				else
				{
					aim_bullet=false;
				}
			}
		}
		else
		{
			aim_bullet=false;
		}
	}
	else
	{
		aim_bullet=false;
	}
	m_fPredBulletTime = Device.fTimeGlobal;

	float l_fHitPower = 0.0f;
	float l_fHitPowerCritical = 0.0f;
	if (ParentIsActor())//если из оружия стреляет актёр(игрок)
	{
		if (GameID() == eGameIDSingle)
		{
			l_fHitPower			= fvHitPower[g_SingleGameDifficulty];
			l_fHitPowerCritical = fvHitPowerCritical[g_SingleGameDifficulty];
		}
		else
		{
			l_fHitPower			= fvHitPower[egdMaster];
			l_fHitPowerCritical = fvHitPowerCritical[egdMaster];
		}
	}
	else
	{
		l_fHitPower			= fvHitPower[egdMaster];
		l_fHitPowerCritical = fvHitPowerCritical[egdMaster];
	}

	Level().BulletManager().AddBullet( pos, dir,
		m_fStartBulletSpeed * cur_silencer_koef.bullet_speed,
		l_fHitPower * cur_silencer_koef.hit_power,
		l_fHitPowerCritical,
		fHitImpulse * cur_silencer_koef.hit_impulse,
		parent_id, weapon_id,
		ALife::eHitTypeFireWound, fireDistance, cartridge, send_hit, aim_bullet);
}
예제 #5
0
void test_planner(int rank)
{
     /*
      * create and destroy many plans, at random.  Check the
      * garbage-collecting allocator of twiddle factors
      */
     int i, dim;
     int r, s;
     fftw_mpi_plan p[PLANNER_TEST_SIZE];
     fftwnd_mpi_plan pnd[PLANNER_TEST_SIZE];
     int *narr, maxdim;

     chk_mem_leak = 0;
     verbose--;

     please_wait();
     if (rank < 1)
          rank = 1;

     narr = (int *) fftw_malloc(rank * sizeof(int));

     for (i = 0; i < PLANNER_TEST_SIZE; ++i) {
          p[i] = (fftw_mpi_plan) 0;
          pnd[i] = (fftwnd_mpi_plan) 0;
     }

     if (PLANNER_TEST_SIZE >= 8) {
	  p[0] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_FORWARD, 0);
	  p[1] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_FORWARD, 0);
	  p[2] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_BACKWARD, 0);
	  p[3] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_BACKWARD, 0);
	  p[4] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_FORWARD, 0);
	  p[5] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_FORWARD, 0);
	  p[6] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_BACKWARD, 0);
	  p[7] = fftw_mpi_create_plan(MPI_COMM_WORLD, 1024, FFTW_BACKWARD, 0);
     }

     maxdim = (int) pow(8192, 1.0/rank);

     for (i = 0; i < PLANNER_TEST_SIZE * PLANNER_TEST_SIZE; ++i) {
          r = rand();
          if (r < 0)
               r = -r;
          r = r % PLANNER_TEST_SIZE;

          for (dim = 0; dim < rank; ++dim) {
               do {
                    s = rand();
                    if (s < 0)
                         s = -s;
                    s = s % maxdim + 1;
               } while (s == 0);
               narr[dim] = s;
          }

          if (rank == 1) {
               if (p[r])
                    fftw_mpi_destroy_plan(p[r]);

               p[r] = fftw_mpi_create_plan(MPI_COMM_WORLD,
					   narr[0], random_dir(), 
					   measure_flag | wisdom_flag);
          }

	  if (rank > 1) {
	       if (pnd[r])
		    fftwnd_mpi_destroy_plan(pnd[r]);
	       
	       pnd[r] = fftwnd_mpi_create_plan(MPI_COMM_WORLD, rank, narr,
					       random_dir(), measure_flag |
					       wisdom_flag);
	  }

          if (i % (PLANNER_TEST_SIZE * PLANNER_TEST_SIZE / 20) == 0) {
               WHEN_VERBOSE(0, my_printf("test planner: so far so good\n"));
               WHEN_VERBOSE(0, my_printf("test planner: iteration %d"
					 " out of %d\n",
                              i, PLANNER_TEST_SIZE * PLANNER_TEST_SIZE));
          }
     }

     for (i = 0; i < PLANNER_TEST_SIZE; ++i) {
          if (p[i])
               fftw_mpi_destroy_plan(p[i]);
          if (pnd[i])
               fftwnd_mpi_destroy_plan(pnd[i]);
     }

     fftw_free(narr);
     verbose++;
     chk_mem_leak = 1;
}
예제 #6
0
파일: fftw_test.c 프로젝트: Pinkii-/PCA
void test_planner(int rank)
{
     /* 
      * create and destroy many plans, at random.  Check the
      * garbage-collecting allocator of twiddle factors 
      */
     int i, dim;
     int r, s;
     fftw_plan p[PLANNER_TEST_SIZE];
     fftwnd_plan pnd[PLANNER_TEST_SIZE];
     int *narr, maxdim;

     chk_mem_leak = 0;
     verbose--;

     please_wait();
     if (rank < 1)
	  rank = 1;

     narr = (int *) fftw_malloc(rank * sizeof(int));

     maxdim = (int) pow(8192.0, 1.0/rank);

     for (i = 0; i < PLANNER_TEST_SIZE; ++i) {
	  p[i] = (fftw_plan) 0;
	  pnd[i] = (fftwnd_plan) 0;
     }

     for (i = 0; i < PLANNER_TEST_SIZE * PLANNER_TEST_SIZE; ++i) {
	  r = rand();
	  if (r < 0)
	       r = -r;
	  r = r % PLANNER_TEST_SIZE;

	  for (dim = 0; dim < rank; ++dim) {
	       do {
		    s = rand();
		    if (s < 0)
			 s = -s;
		    s = s % maxdim + 1;
	       } while (s == 0);
	       narr[dim] = s;
	  }

	  if (rank == 1) {
	       if (p[r])
		    fftw_destroy_plan(p[r]);

	       p[r] = fftw_create_plan(narr[0], random_dir(), measure_flag |
				       wisdom_flag);
	       if (paranoid && narr[0] < 200)
		    test_correctness(narr[0]);
	  }

	  if (pnd[r])
	       fftwnd_destroy_plan(pnd[r]);

	  pnd[r] = fftwnd_create_plan(rank, narr,
				      random_dir(), measure_flag |
				      wisdom_flag);

	  if (i % (PLANNER_TEST_SIZE * PLANNER_TEST_SIZE / 20) == 0) {
	       WHEN_VERBOSE(0, printf("test planner: so far so good\n"));
	       WHEN_VERBOSE(0, printf("test planner: iteration %d out of %d\n",
			      i, PLANNER_TEST_SIZE * PLANNER_TEST_SIZE));
	  }
     }

     for (i = 0; i < PLANNER_TEST_SIZE; ++i) {
	  if (p[i])
	       fftw_destroy_plan(p[i]);
	  if (pnd[i])
	       fftwnd_destroy_plan(pnd[i]);
     }

     fftw_free(narr);
     verbose++;
     chk_mem_leak = 1;
}
예제 #7
0
void CShootingObject::FireBullet(const Fvector& pos, 
								 const Fvector& shot_dir, 
								 float fire_disp,
								 const CCartridge& cartridge,
								 u16 parent_id,
								 u16 weapon_id,
								 bool send_hit)
{
	Fvector dir;
	random_dir(dir,shot_dir,fire_disp);

	if (constDeviation.pitch != 0 || constDeviation.yaw != 0) // WARN: при больших значениях девиации стрелок может отсрелить себе голову!
	{
		float dir_yaw, dir_pitch;
		dir.getHP(dir_yaw, dir_pitch);
		dir_pitch += constDeviation.pitch;		
		dir_yaw += constDeviation.yaw;
		dir.setHP(dir_yaw, dir_pitch);
	}

	m_vCurrentShootDir = dir;
	m_vCurrentShootPos = pos;
	m_iCurrentParentID = parent_id;
	
	bool aim_bullet;
	if (m_bUseAimBullet)
	{
		if (ParentMayHaveAimBullet())
		{
			if (m_fPredBulletTime==0.0)
			{
				aim_bullet=true;
			}
			else
			{
				if ((Device.fTimeGlobal-m_fPredBulletTime)>=m_fTimeToAim)
				{
					aim_bullet=true;
				}
				else
				{
					aim_bullet=false;
				}
			}
		}
		else
		{
			aim_bullet=false;
		}
	}
	else
	{
		aim_bullet=false;
	}
	m_fPredBulletTime = Device.fTimeGlobal;

	float l_fHitPower;
	if (ParentIsActor())//если из оружия стреляет актёр(игрок)
	{
		if (GameID() == GAME_SINGLE)
		{
			l_fHitPower=fvHitPower[g_SingleGameDifficulty];
		}
		else
		{
			l_fHitPower=fvHitPower[egdMaster];
		}
	}
	else
	{
		l_fHitPower=fvHitPower[egdMaster];
	}

	Level().BulletManager().AddBullet(	pos, dir, m_fStartBulletSpeed, l_fHitPower, 
										fHitImpulse, parent_id, weapon_id, 
										m_eHitType, fireDistance, cartridge, send_hit, aim_bullet);
}