// util func2 auto time_taken_ms(int N) { auto vec = make_random_vector(N); auto ret = execute(mysort, vec); auto ns = std::chrono::duration_cast<std::chrono::milliseconds>(ret.second); return ns.count(); }
void get_top_component(int M,int N,double *comp,double *data,int num_iterations=30) { make_random_vector(M,comp); for (int ii=0; ii<num_iterations; ii++) { process_gui_events_if_needed(); XXT_vector_mult(M,N,data,comp); normalize_vector(M,comp); } }
// ----------------------------------------------------------------------------- //do whatever this thing does in a frame void do_controlcen_frame(object *obj) { int best_gun_num; // If a boss level, then Control_center_present will be 0. if (!Control_center_present) return; #ifndef NDEBUG if (!Robot_firing_enabled || (Game_suspended & SUSP_ROBOTS)) return; #else if (!Robot_firing_enabled) return; #endif if (!(Control_center_been_hit || Control_center_player_been_seen)) { if (!(FrameCount % 8)) { // Do every so often... vms_vector vec_to_player; fix dist_to_player; int i; segment *segp = &Segments[obj->segnum]; // This is a hack. Since the control center is not processed by // ai_do_frame, it doesn't know to deal with cloaked dudes. It // seems to work in single-player mode because it is actually using // the value of Believed_player_position that was set by the last // person to go through ai_do_frame. But since a no-robots game // never goes through ai_do_frame, I'm making it so the control // center can spot cloaked dudes. if (Game_mode & GM_MULTI) Believed_player_pos = Objects[Players[Player_num].objnum].pos; // Hack for special control centers which are isolated and not reachable because the // real control center is inside the boss. for (i=0; i<MAX_SIDES_PER_SEGMENT; i++) if (segp->children[i] != -1) break; if (i == MAX_SIDES_PER_SEGMENT) return; vm_vec_sub(&vec_to_player, &ConsoleObject->pos, &obj->pos); dist_to_player = vm_vec_normalize_quick(&vec_to_player); if (dist_to_player < F1_0*200) { Control_center_player_been_seen = player_is_visible_from_object(obj, &obj->pos, 0, &vec_to_player, 0); Control_center_next_fire_time = 0; } } return; } if ((Control_center_next_fire_time < 0) && !(Player_is_dead && (GameTime > Player_time_of_death+F1_0*2))) { if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) best_gun_num = calc_best_gun(N_controlcen_guns, Gun_pos, Gun_dir, &Believed_player_pos); else best_gun_num = calc_best_gun(N_controlcen_guns, Gun_pos, Gun_dir, &ConsoleObject->pos); if (best_gun_num != -1) { vms_vector vec_to_goal; fix dist_to_player; fix delta_fire_time; if (Players[Player_num].flags & PLAYER_FLAGS_CLOAKED) { vm_vec_sub(&vec_to_goal, &Believed_player_pos, &Gun_pos[best_gun_num]); dist_to_player = vm_vec_normalize_quick(&vec_to_goal); } else { vm_vec_sub(&vec_to_goal, &ConsoleObject->pos, &Gun_pos[best_gun_num]); dist_to_player = vm_vec_normalize_quick(&vec_to_goal); } if (dist_to_player > F1_0*300) { Control_center_been_hit = 0; Control_center_player_been_seen = 0; return; } #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_controlcen_fire(&vec_to_goal, best_gun_num, obj-Objects); #endif Laser_create_new_easy( &vec_to_goal, &Gun_pos[best_gun_num], obj-Objects, CONTROLCEN_WEAPON_NUM, 1); // 1/4 of time, fire another thing, not directly at player, so it might hit him if he's constantly moving. if (rand() < 32767/4) { vms_vector randvec; make_random_vector(&randvec); vm_vec_scale_add2(&vec_to_goal, &randvec, F1_0/4); vm_vec_normalize_quick(&vec_to_goal); #ifdef NETWORK if (Game_mode & GM_MULTI) multi_send_controlcen_fire(&vec_to_goal, best_gun_num, obj-Objects); #endif Laser_create_new_easy( &vec_to_goal, &Gun_pos[best_gun_num], obj-Objects, CONTROLCEN_WEAPON_NUM, 1); } delta_fire_time = (NDL - Difficulty_level) * F1_0/4; if (Game_mode & GM_MULTI) // slow down rate of fire in multi player delta_fire_time *= 2; Control_center_next_fire_time = delta_fire_time; } } else Control_center_next_fire_time -= FrameTime; }
// ----------------------------------------------------------------------------- //do whatever this thing does in a frame void DoReactorFrame (object *objP) { int best_gun_num; // If a boss level, then gameData.reactor.bPresent will be 0. if (!gameData.reactor.bPresent) return; #ifndef NDEBUG if (!gameStates.app.cheats.bRobotsFiring || (gameStates.app.bGameSuspended & SUSP_ROBOTS)) return; #else if (!gameStates.app.cheats.bRobotsFiring) return; #endif if (! (gameData.reactor.bHit || gameData.reactor.bSeenPlayer)) { if (! (gameData.app.nFrameCount % 8)) { // Do every so often... vms_vector vec_to_player; fix dist_to_player; int i; segment *segp = &gameData.segs.segments[objP->segnum]; // This is a hack. Since the control center is not processed by // ai_do_frame, it doesn't know to deal with cloaked dudes. It // seems to work in single-player mode because it is actually using // the value of Believed_player_position that was set by the last // person to go through ai_do_frame. But since a no-robots game // never goes through ai_do_frame, I'm making it so the control // center can spot cloaked dudes. if (gameData.app.nGameMode & GM_MULTI) gameData.ai.vBelievedPlayerPos = gameData.objs.objects[gameData.multi.players[gameData.multi.nLocalPlayer].objnum].pos; // Hack for special control centers which are isolated and not reachable because the // real control center is inside the boss. for (i=0; i<MAX_SIDES_PER_SEGMENT; i++) if (IS_CHILD (segp->children[i])) break; if (i == MAX_SIDES_PER_SEGMENT) return; VmVecSub (&vec_to_player, &gameData.objs.console->pos, &objP->pos); dist_to_player = VmVecNormalizeQuick (&vec_to_player); if (dist_to_player < F1_0*200) { gameData.reactor.bSeenPlayer = ObjectCanSeePlayer (objP, &objP->pos, 0, &vec_to_player); gameData.reactor.nNextFireTime = 0; } } return; } // Periodically, make the reactor fall asleep if player not visible. if (gameData.reactor.bHit || gameData.reactor.bSeenPlayer) { if ((Last_time_cc_vis_check + F1_0*5 < gameData.app.xGameTime) || (Last_time_cc_vis_check > gameData.app.xGameTime)) { vms_vector vec_to_player; fix dist_to_player; VmVecSub (&vec_to_player, &gameData.objs.console->pos, &objP->pos); dist_to_player = VmVecNormalizeQuick (&vec_to_player); Last_time_cc_vis_check = gameData.app.xGameTime; if (dist_to_player < F1_0*120) { gameData.reactor.bSeenPlayer = ObjectCanSeePlayer (objP, &objP->pos, 0, &vec_to_player); if (!gameData.reactor.bSeenPlayer) gameData.reactor.bHit = 0; } } } if ((gameData.reactor.nNextFireTime < 0) && ! (gameStates.app.bPlayerIsDead && (gameData.app.xGameTime > gameStates.app.nPlayerTimeOfDeath+F1_0*2))) { if (gameData.multi.players[gameData.multi.nLocalPlayer].flags & PLAYER_FLAGS_CLOAKED) best_gun_num = CalcBestReactorGun (N_controlcen_guns, Gun_pos, Gun_dir, &gameData.ai.vBelievedPlayerPos); else best_gun_num = CalcBestReactorGun (N_controlcen_guns, Gun_pos, Gun_dir, &gameData.objs.console->pos); if (best_gun_num != -1) { int rand_prob, count; vms_vector vec_to_goal; fix dist_to_player; fix delta_fire_time; if (gameData.multi.players[gameData.multi.nLocalPlayer].flags & PLAYER_FLAGS_CLOAKED) { VmVecSub (&vec_to_goal, &gameData.ai.vBelievedPlayerPos, &Gun_pos[best_gun_num]); dist_to_player = VmVecNormalizeQuick (&vec_to_goal); } else { VmVecSub (&vec_to_goal, &gameData.objs.console->pos, &Gun_pos[best_gun_num]); dist_to_player = VmVecNormalizeQuick (&vec_to_goal); } if (dist_to_player > F1_0*300) { gameData.reactor.bHit = 0; gameData.reactor.bSeenPlayer = 0; return; } #ifdef NETWORK if (gameData.app.nGameMode & GM_MULTI) MultiSendCtrlcenFire (&vec_to_goal, best_gun_num, OBJ_IDX (objP)); #endif CreateNewLaserEasy (&vec_to_goal, &Gun_pos[best_gun_num], OBJ_IDX (objP), CONTROLCEN_WEAPON_NUM, 1); // some of time, based on level, fire another thing, not directly at player, so it might hit him if he's constantly moving. rand_prob = F1_0/ (abs (gameData.missions.nCurrentLevel)/4+2); count = 0; while ((d_rand () > rand_prob) && (count < 4)) { vms_vector randvec; make_random_vector (&randvec); VmVecScaleInc (&vec_to_goal, &randvec, F1_0/6); VmVecNormalizeQuick (&vec_to_goal); #ifdef NETWORK if (gameData.app.nGameMode & GM_MULTI) MultiSendCtrlcenFire (&vec_to_goal, best_gun_num, OBJ_IDX (objP)); #endif CreateNewLaserEasy (&vec_to_goal, &Gun_pos[best_gun_num], OBJ_IDX (objP), CONTROLCEN_WEAPON_NUM, 0); count++; } delta_fire_time = (NDL - gameStates.app.nDifficultyLevel) * F1_0/4; if (gameStates.app.nDifficultyLevel == 0) delta_fire_time += F1_0/2; if (gameData.app.nGameMode & GM_MULTI) // slow down rate of fire in multi player delta_fire_time *= 2; gameData.reactor.nNextFireTime = delta_fire_time; } } else gameData.reactor.nNextFireTime -= gameData.app.xFrameTime; }