bool predicate( CEntityAlive& ea, const SHit& H, MotionID &m, float &angle ) const { m = MotionID(); if( H.initiator() != Level().CurrentControlEntity()) return false; VERIFY( ea.Visual( ) ); IKinematics *K = ea.Visual()->dcast_PKinematics(); VERIFY( K ); if( !is_bone_head( *K, H.bone() )) return false; //CAI_Stalker* s = ea.cast_stalker (); CCharacterPhysicsSupport* chs = ea.character_physics_support(); if( !chs || chs->Type( ) == CCharacterPhysicsSupport::etBitting ) return false; VERIFY( chs->movement() ); const Fvector stalker_velocity = chs->movement()->GetVelocity(); const float stalker_speed = stalker_velocity.magnitude(); const float min_stalker_speed = 3.65f; if(stalker_speed < min_stalker_speed ) return false; const Fvector stalker_velocity_dir = Fvector().mul( stalker_velocity, 1.f/stalker_speed ); const Fvector dir_to_actor = Fvector().sub( H.initiator()->Position(), ea.Position() ).normalize_safe(); const float front_angle_cos = _cos( deg2rad ( 20.f ) ); if( stalker_velocity_dir.dotproduct(dir_to_actor) < front_angle_cos ) return false; if( type_motion::front != type_motion::dir( ea, H, angle ) ) return false; Fvector p; if( Fvector().sub( H.initiator()->Position(), global_hit_position( p, ea, H ) ).magnitude() > 30.f ) return false; m = motion( front ); type_motion_diagnostic( " type_motion0: 1. = »нерционное движение вперед от попадани¤ в голову ", front, ea, H, m ); return true; }
void CBaseMonster::debug_fsm() { if (!g_Alive()) return; if (!psAI_Flags.test(aiMonsterDebug)) { DBG().object_info(this,this).clear (); return; } EMonsterState state = StateMan->get_state_type(); string128 st; switch (state) { case eStateRest_WalkGraphPoint: sprintf_s(st,"Rest :: Walk Graph"); break; case eStateRest_Idle: sprintf_s(st,"Rest :: Idle"); break; case eStateRest_Fun: sprintf_s(st,"Rest :: Fun"); break; case eStateRest_Sleep: sprintf_s(st,"Rest :: Sleep"); break; case eStateRest_MoveToHomePoint: sprintf_s(st,"Rest :: MoveToHomePoint"); break; case eStateRest_WalkToCover: sprintf_s(st,"Rest :: WalkToCover"); break; case eStateRest_LookOpenPlace: sprintf_s(st,"Rest :: LookOpenPlace"); break; case eStateEat_CorpseApproachRun: sprintf_s(st,"Eat :: Corpse Approach Run"); break; case eStateEat_CorpseApproachWalk: sprintf_s(st,"Eat :: Corpse Approach Walk"); break; case eStateEat_CheckCorpse: sprintf_s(st,"Eat :: Check Corpse"); break; case eStateEat_Eat: sprintf_s(st,"Eat :: Eating"); break; case eStateEat_WalkAway: sprintf_s(st,"Eat :: Walk Away"); break; case eStateEat_Rest: sprintf_s(st,"Eat :: Rest After Meal"); break; case eStateEat_Drag: sprintf_s(st,"Eat :: Drag"); break; case eStateAttack_Run: sprintf_s(st,"Attack :: Run"); break; case eStateAttack_Melee: sprintf_s(st,"Attack :: Melee"); break; case eStateAttack_RunAttack: sprintf_s(st,"Attack :: Run Attack"); break; case eStateAttack_RunAway: sprintf_s(st,"Attack :: Run Away"); break; case eStateAttack_FindEnemy: sprintf_s(st,"Attack :: Find Enemy"); break; case eStateAttack_Steal: sprintf_s(st,"Attack :: Steal"); break; case eStateAttack_AttackHidden: sprintf_s(st,"Attack :: Attack Hidden"); break; case eStateAttackCamp_Hide: sprintf_s(st,"Attack Camp:: Hide"); break; case eStateAttackCamp_Camp: sprintf_s(st,"Attack Camp:: Camp"); break; case eStateAttackCamp_StealOut: sprintf_s(st,"Attack Camp:: Steal Out"); break; case eStateAttack_HideInCover: sprintf_s(st,"Attack :: Hide In Cover"); break; case eStateAttack_MoveOut: sprintf_s(st,"Attack :: Move Out From Cover");break; case eStateAttack_CampInCover: sprintf_s(st,"Attack :: Camp In Cover"); break; case eStateAttack_Psy: sprintf_s(st,"Attack :: Psy"); break; case eStateAttack_MoveToHomePoint: sprintf_s(st,"Attack :: Move To Home Point"); break; case eStateAttack_HomePoint_Hide: sprintf_s(st,"Attack :: Home Point :: Hide"); break; case eStateAttack_HomePoint_Camp: sprintf_s(st,"Attack :: Home Point :: Camp"); break; case eStateAttack_HomePoint_LookOpenPlace: sprintf_s(st,"Attack :: Home Point :: Look Open Place"); break; case eStatePanic_Run: sprintf_s(st,"Panic :: Run Away"); break; case eStatePanic_FaceUnprotectedArea: sprintf_s(st,"Panic :: Face Unprotected Area"); break; case eStatePanic_HomePoint_Hide: sprintf_s(st,"Panic :: Home Point :: Hide"); break; case eStatePanic_HomePoint_LookOpenPlace: sprintf_s(st,"Panic :: Home Point :: Look Open Place"); break; case eStatePanic_HomePoint_Camp: sprintf_s(st,"Panic :: Home Point :: Camp"); break; case eStateHitted_Hide: sprintf_s(st,"Hitted :: Hide"); break; case eStateHitted_MoveOut: sprintf_s(st,"Hitted :: MoveOut"); break; case eStateHitted_Home: sprintf_s(st,"Hitted :: Home"); break; case eStateHearDangerousSound_Hide: sprintf_s(st,"Dangerous Snd :: Hide"); break; case eStateHearDangerousSound_FaceOpenPlace: sprintf_s(st,"Dangerous Snd :: FaceOpenPlace"); break; case eStateHearDangerousSound_StandScared: sprintf_s(st,"Dangerous Snd :: StandScared"); break; case eStateHearDangerousSound_Home: sprintf_s(st,"Dangerous Snd :: Home"); break; case eStateHearInterestingSound_MoveToDest: sprintf_s(st,"Interesting Snd :: MoveToDest"); break; case eStateHearInterestingSound_LookAround: sprintf_s(st,"Interesting Snd :: LookAround"); break; case eStateHearHelpSound: sprintf_s(st,"Hear Help Sound"); break; case eStateHearHelpSound_MoveToDest: sprintf_s(st,"Hear Help Sound :: MoveToDest"); break; case eStateHearHelpSound_LookAround: sprintf_s(st,"Hear Help Sound :: LookAround"); break; case eStateControlled_Follow_Wait: sprintf_s(st,"Controlled :: Follow : Wait"); break; case eStateControlled_Follow_WalkToObject: sprintf_s(st,"Controlled :: Follow : WalkToObject"); break; case eStateControlled_Attack: sprintf_s(st,"Controlled :: Attack"); break; case eStateThreaten: sprintf_s(st,"Threaten :: "); break; case eStateFindEnemy_Run: sprintf_s(st,"Find Enemy :: Run"); break; case eStateFindEnemy_LookAround_MoveToPoint: sprintf_s(st,"Find Enemy :: Look Around : Move To Point"); break; case eStateFindEnemy_LookAround_LookAround: sprintf_s(st,"Find Enemy :: Look Around : Look Around"); break; case eStateFindEnemy_LookAround_TurnToPoint: sprintf_s(st,"Find Enemy :: Look Around : Turn To Point"); break; case eStateFindEnemy_Angry: sprintf_s(st,"Find Enemy :: Angry"); break; case eStateFindEnemy_WalkAround: sprintf_s(st,"Find Enemy :: Walk Around"); break; case eStateSquad_Rest_Idle: sprintf_s(st,"Squad :: Rest : Idle"); break; case eStateSquad_Rest_WalkAroundLeader: sprintf_s(st,"Squad :: Rest : WalkAroundLeader"); break; case eStateSquad_RestFollow_Idle: sprintf_s(st,"Squad :: Follow Leader : Idle"); break; case eStateSquad_RestFollow_WalkToPoint: sprintf_s(st,"Squad :: Follow Leader : WalkToPoint"); break; case eStateCustom_Vampire: sprintf_s(st,"Attack :: Vampire"); break; case eStateVampire_ApproachEnemy: sprintf_s(st,"Vampire :: Approach to enemy"); break; case eStateVampire_Execute: sprintf_s(st,"Vampire :: Hit"); break; case eStateVampire_RunAway: sprintf_s(st,"Vampire :: Run Away"); break; case eStateVampire_Hide: sprintf_s(st,"Vampire :: Hide"); break; case eStatePredator: sprintf_s(st,"Predator"); break; case eStatePredator_MoveToCover: sprintf_s(st,"Predator :: MoveToCover"); break; case eStatePredator_LookOpenPlace: sprintf_s(st,"Predator :: Look Open Place"); break; case eStatePredator_Camp: sprintf_s(st,"Predator :: Camp"); break; case eStateBurerAttack_Tele: sprintf_s(st,"Attack :: Telekinesis"); break; case eStateBurerAttack_Gravi: sprintf_s(st,"Attack :: Gravi Wave"); break; case eStateBurerAttack_RunAround: sprintf_s(st,"Attack :: Run Around"); break; case eStateBurerAttack_FaceEnemy: sprintf_s(st,"Attack :: Face Enemy"); break; case eStateBurerAttack_Melee: sprintf_s(st,"Attack :: Melee"); break; case eStateBurerScanning: sprintf_s(st,"Attack :: Scanning"); break; case eStateCustomMoveToRestrictor: sprintf_s(st,"Moving To Restrictor :: Position not accessible"); break; case eStateSmartTerrainTask: sprintf_s(st,"ALIFE"); break; case eStateSmartTerrainTaskGamePathWalk: sprintf_s(st,"ALIFE :: Game Path Walk"); break; case eStateSmartTerrainTaskLevelPathWalk: sprintf_s(st,"ALIFE :: Level Path Walk"); break; case eStateSmartTerrainTaskWaitCapture: sprintf_s(st,"ALIFE :: Wait till smart terrain will capture me"); break; case eStateUnknown: sprintf_s(st,"Unknown State :: "); break; default: sprintf_s(st,"Undefined State ::"); break; } DBG().object_info(this,this).remove_item (u32(0)); DBG().object_info(this,this).remove_item (u32(1)); DBG().object_info(this,this).remove_item (u32(2)); DBG().object_info(this,this).add_item (*cName(), D3DCOLOR_XRGB(255,0,0), 0); DBG().object_info(this,this).add_item (st, D3DCOLOR_XRGB(255,0,0), 1); sprintf_s(st, "Team[%u]Squad[%u]Group[%u]", g_Team(), g_Squad(), g_Group()); DBG().object_info(this,this).add_item (st, D3DCOLOR_XRGB(255,0,0), 2); CEntityAlive *entity = smart_cast<CEntityAlive *>(Level().CurrentEntity()); if (entity && entity->character_physics_support()->movement()) { sprintf_s(st,"VELOCITY [%f,%f,%f] Value[%f]",VPUSH(entity->character_physics_support()->movement()->GetVelocity()),entity->character_physics_support()->movement()->GetVelocityActual()); DBG().text(this).clear(); DBG().text(this).add_item(st,200,100,COLOR_GREEN,100); } }
void CBaseMonster::add_debug_info (debug::text_tree& root_s) { if ( !g_Alive() ) { return; } typedef debug::text_tree TextTree; //----------------------------------------------- // General //----------------------------------------------- TextTree& general_s = root_s.find_or_add("General"); detail::add_debug_info(general_s, this); TextTree& current_visual_s = general_s.add_line("Current_Visual"); current_visual_s.add_line(*cNameVisual()); general_s.add_line("Health", conditions().GetHealth()); general_s.add_line("Morale", Morale.get_morale()); general_s.add_line("Angry", m_bAngry); general_s.add_line("Growling", m_bGrowling); general_s.add_line("Aggressive", m_bAggressive); general_s.add_line("Sleep", m_bSleep); TextTree& perceptors_s = general_s.find_or_add("Perceptors"); TextTree& visuals_s = perceptors_s.find_or_add("Visual"); float object_range, object_fov; update_range_fov (object_range,object_fov,eye_range,deg2rad(eye_fov)); visuals_s.add_line("Eye_Range", object_range); visuals_s.add_line("FOV", rad2deg(object_fov)); CActor* actor = smart_cast<CActor*>(Level().Objects.net_Find(0)); if ( !actor ) { actor = g_debug_actor; } if ( actor ) { visuals_s.add_line("Actor_Visible", memory().visual().visible_now(actor)); } //----------------------------------------------- // Sounds //----------------------------------------------- TextTree& sounds_s = perceptors_s.find_or_add("Sounds"); sounds_s.add_line("Num_Sounds", SoundMemory.GetNumSounds()); if ( SoundMemory.IsRememberSound() ) { TextTree& last_s = sounds_s.add_line("Last"); SoundElem last_sound; bool last_dangerous; SoundMemory.GetSound(last_sound, last_dangerous); detail::add_debug_info(last_s, last_sound, last_dangerous); if ( SoundMemory.GetNumSounds() > 1 ) { SoundElem first_sound; bool first_dangerous; SoundMemory.GetFirstSound(first_sound, first_dangerous); TextTree& first_s = sounds_s.add_line("First"); detail::add_debug_info(first_s, first_sound, first_dangerous); } } else { sounds_s.add_text("no"); } //----------------------------------------------- // Hits //----------------------------------------------- TextTree& hit_s = perceptors_s.add_line("Hits", HitMemory.get_num_hits()); // Hit if ( HitMemory.is_hit() ) { TextTree& last_hit_object_s = hit_s.add_line("Object"); detail::add_debug_info(last_hit_object_s, smart_cast<CEntity*>(HitMemory.get_last_hit_object())); hit_s.add_line("Time", HitMemory.get_last_hit_time()); hit_s.add_line("Pos", HitMemory.get_last_hit_position()); hit_s.add_line("Dir", HitMemory.get_last_hit_dir()); } //----------------------------------------------- // Corpses //----------------------------------------------- TextTree& corpse_s = general_s.find_or_add("Corpse_Man"); corpse_s.add_line("Current_Corpse", CorpseMan.get_corpse() ? *CorpseMan.get_corpse()->cName() : "none"); corpse_s.add_line("Satiety", make_xrstr("%.2f", GetSatiety())); //----------------------------------------------- // Group behavious //----------------------------------------------- TextTree& group_s = general_s.find_or_add("Group_Behaviour"); group_s.add_line("Team", g_Team()); TextTree& squad_s = group_s.add_line("Squad", g_Squad()); CMonsterSquad* squad = monster_squad().get_squad(this); if ( squad ) { squad_s.add_line("SquadActive", squad->SquadActive()); squad_s.add_line("Im_Leader", squad->GetLeader() == this); detail::add_debug_info(squad_s.add_line("Leader"), squad->GetLeader()); int num_alive = squad->squad_alife_count(); if ( !num_alive && g_Alive() ) { num_alive++; } squad_s.add_line("Alive_Count", num_alive); TextTree& squad_command_s = squad_s.add_line("My_Squad_Command"); squad_command_s.add_line("Command_Type", squad->GetCommand(this).type); TextTree& squad_goal_s = squad_s.add_line("My_Squad_Goal"); squad_goal_s.add_line("Goal_Type", squad->GetGoal(this).type); detail::add_debug_info(squad_goal_s.add_line("Goal_Entity"), squad->GetGoal(this).entity); } group_s.add_line("Group", g_Group()); //----------------------------------------------- // Brain (Fsm & Script) //----------------------------------------------- TextTree& brain_s = root_s.find_or_add("Brain"); TextTree& fsm_s = brain_s.find_or_add("Fsm"); StateMan->add_debug_info(fsm_s); TextTree& script_control_s = brain_s.add_line("Script_Control_Name"); if ( !m_bScriptControl ) { script_control_s.add_text("-"); } else { script_control_s.add_text(GetScriptControlName()); TextTree& cur_script_action_s = brain_s.add_line("Current_Script_Action"); if ( m_tpCurrentEntityAction ) { detail::add_debug_info(cur_script_action_s, m_tpCurrentEntityAction); } else { cur_script_action_s.add_text("-"); } TextTree& next_script_action_s = brain_s.add_line("Next_Script_Action"); if ( m_tpActionQueue.size() ) { detail::add_debug_info(next_script_action_s, m_tpActionQueue.front()); } else { next_script_action_s.add_text("-"); } } //----------------------------------------------- // Control Manager //----------------------------------------------- control().add_debug_info( brain_s.add_line("Control_Manager") ); TextTree& map_home_s = brain_s.add_line("Map_Home"); map_home_s.add_line("min", Home->get_min_radius()); map_home_s.add_line("mid", Home->get_mid_radius()); map_home_s.add_line("max", Home->get_max_radius()); if ( EnemyMan.get_enemy() ) { map_home_s.add_line("Enemy_At_Min", Home->at_min_home( EnemyMan.get_enemy()->Position() )); map_home_s.add_line("Enemy_At_Mid", Home->at_mid_home( EnemyMan.get_enemy()->Position() )); map_home_s.add_line("Enemy_At_Max", Home->at_home ( EnemyMan.get_enemy()->Position() )); map_home_s.add_line("Dist_To_Enemy", Position().distance_to( EnemyMan.get_enemy()->Position() )); } //----------------------------------------------- // Enemies //----------------------------------------------- TextTree& enemies_s = general_s.find_or_add("Enemies"); enemies_s.add_text(EnemyMemory.get_enemies_count()); if ( actor ) { enemies_s.add_line("Actor_Is_Enemy", EnemyMan.is_enemy(actor)); } TextTree& current_enemy_s = enemies_s.find_or_add("Current_Enemy"); if ( EnemyMan.get_enemy() ) { detail::add_enemy_debug_info(current_enemy_s, this, EnemyMan.get_enemy()); current_enemy_s.add_line("Time_Last_Seen", EnemyMan.get_enemy_time_last_seen()); current_enemy_s.add_line("See_Duration", EnemyMan.see_enemy_duration()); } else { current_enemy_s.add_text("0"); } int index = 1; for ( ENEMIES_MAP::const_iterator i = EnemyMemory.get_memory().begin(), e = EnemyMemory.get_memory().end(); i!=e; ++i ) { const CEntityAlive* p_enemy = (*i).first; if ( p_enemy != EnemyMan.get_enemy() ) { TextTree& enemy_s = enemies_s.add_line(make_xrstr("Enemy %i", index++)); detail::add_enemy_debug_info(enemy_s, this, p_enemy); } } //----------------------------------------------- // Animations //----------------------------------------------- TextTree& controller_s = root_s.find_or_add("Controllers"); TextTree& animation_s = controller_s.find_or_add("Animations"); TextTree& current_animation_s = animation_s.add_line(*anim().cur_anim_info().name); CBlend* p_blend = control().animation().current_blend(); if ( !p_blend ) { p_blend = anim().cur_anim_info().blend; } if ( p_blend ) { detail::add_debug_info(current_animation_s, p_blend); current_animation_s.add_line("Script_Animation?", p_blend->motionID == m_tpScriptAnimation); } else { current_animation_s.add_text("0"); } //----------------------------------------------- // Movement //----------------------------------------------- TextTree& movement_s = controller_s.find_or_add("Movement"); movement_s.add_line("Actual", control().path_builder().actual()); movement_s.add_line("Enabled", control().path_builder().enabled()); CEntityAlive *entity = smart_cast<CEntityAlive *>(Level().CurrentEntity()); if ( entity && entity->character_physics_support()->movement() ) { movement_s.add_line("Velocity", entity->character_physics_support()->movement()->GetVelocityActual()); } movement_s.add_line("Position").add_line(Position()); movement_s.add_line("Level_Vertex_ID", ai_location().level_vertex_id()); movement_s.add_line("Game_Vertex_ID", ai_location().game_vertex_id()); detail::add_debug_info(movement_s.add_line("Orientation_Current"), movement().body_orientation().current); detail::add_debug_info(movement_s.add_line("Orientation_Target"), movement().body_orientation().target); movement_s.add_line("Rotation_Speed", movement().body_orientation().speed); const char* pc_path_type = "undefined"; switch ( movement().path_type() ) { case MovementManager::ePathTypePatrolPath: pc_path_type = "Patrol_Path"; break; case MovementManager::ePathTypeGamePath: pc_path_type = "Game_Path"; break; case MovementManager::ePathTypeLevelPath: pc_path_type = "Level_Path"; break; } movement_s.add_line("Path_Type", pc_path_type); if ( movement().path_type() == MovementManager::ePathTypePatrolPath ) { movement_s.add_line("Path_Name", *movement().patrol().path_name()); movement_s.add_line("Completed", movement().patrol().completed()); movement_s.add_line("Current_Point", movement().patrol().get_current_point_index()); if ( movement().patrol().get_path() && movement().patrol().get_path()->vertex(movement().patrol().get_current_point_index()) ) { movement_s.add_line("Extrapolate", movement().patrol().extrapolate_path()); } else { movement_s.add_line("Extrapolate", "unknown"); } } if ( movement().path_type() == MovementManager::ePathTypeGamePath ) { movement_s.add_line("Completed", movement().game_path().completed()); movement_s.add_line("Path_Size", movement().game_path().path().size()); movement_s.add_line("Current_Point", movement().game_path().intermediate_index()); } TextTree& level_s = movement_s.add_line("Level"); level_s.add_line("Path_Size", movement().level_path().path().size()); level_s.add_line("Start_Vertex", movement().level_path().path().empty() ? -1 : movement().level_path().path().front()); level_s.add_line("End_Vertex", movement().level_path().path().empty() ? -1 : movement().level_path().path().back()); if ( !movement().detail().path().empty() ) { TextTree& detail_s = movement_s.add_line("Detail"); detail_s.add_line("Velocities", movement().detail().velocities().size()); detail_s.add_line("Extrapolate", movement().detail().extrapolate_length()); detail_s.add_line("Path_Size", movement().detail().path().size()); detail_s.add_line("Start_Point").add_line(movement().detail().path().front().position); detail_s.add_line("Dest_Point").add_line(movement().detail().path().back().position); TextTree& current_point_s = detail_s.add_line("Current_Point"); current_point_s.add_line("Index", movement().detail().curr_travel_point_index()); current_point_s.add_line("Position").add_line(movement().detail().path()[movement().detail().curr_travel_point_index()].position); CDetailPathManager::STravelParams current_velocity = movement().detail().velocity(movement().detail().path()[movement().detail().curr_travel_point_index()].velocity); detail_s.add_line("linear", current_velocity.linear_velocity); detail_s.add_line("angular", rad2deg(current_velocity.real_angular_velocity)); detail_s.add_line("speed(calc)", movement().speed()); detail_s.add_line("speed(physics)", movement().speed(character_physics_support()->movement())); } if ( movement().detail().use_dest_orientation() ) { movement_s.add_line("Orientation", movement().detail().dest_direction()); } else { movement_s.add_line("Orientation", "no"); } TextTree& atackdist_s = controller_s.find_or_add("Attack_Distance"); atackdist_s.add_line("Mind_Dist", make_xrstr("%.3f", MeleeChecker.get_min_distance())); atackdist_s.add_line("Max_Dist", make_xrstr("%.3f", MeleeChecker.get_max_distance())); atackdist_s.add_line("As_Step", make_xrstr("%.3f", MeleeChecker.dbg_as_step())); atackdist_s.add_line("As_MinDist", make_xrstr("%.3f", MeleeChecker.dbg_as_min_dist())); TextTree& restrictions_s = movement_s.add_line("Restrictions"); if ( movement().restrictions().out_restrictions().size() || movement().restrictions().in_restrictions().size() || movement().restrictions().base_out_restrictions().size() || movement().restrictions().base_in_restrictions().size() ) { detail::add_debug_info_restrictions(restrictions_s.add_line("out"), *movement().restrictions().out_restrictions()); detail::add_debug_info_restrictions(restrictions_s.add_line("in"), *movement().restrictions().in_restrictions()); detail::add_debug_info_restrictions(restrictions_s.add_line("base_out"), *movement().restrictions().base_out_restrictions()); detail::add_debug_info_restrictions(restrictions_s.add_line("base_in"), *movement().restrictions().base_in_restrictions()); restrictions_s.add_line("Actor_Accessible?", actor ? movement().restrictions().accessible(actor->Position()) : false); } else { restrictions_s.add_text("-"); } //----------------------------------------------- // Sound Player //----------------------------------------------- TextTree& sound_player_s = controller_s.find_or_add("Sound_Player"); sound_player_s.add_line("Num_Sounds", sound().objects().size()); typedef CSoundPlayer::SOUND_COLLECTIONS::const_iterator SoundIterator; u32 object_count = 0; for ( SoundIterator i=sound().objects().begin(), e=sound().objects().end(); i!=e; ++i ) { object_count += (*i).second.second->m_sounds.size(); } TextTree& now_playing_s = sound_player_s.add_line("Objects", object_count); typedef xr_vector<CSoundPlayer::CSoundSingle>::const_iterator SoundSingleIterator; index = 1; for ( SoundSingleIterator i=sound().playing_sounds().begin(), e=sound().playing_sounds().end(); i!=e; ++i ) { xr_string source = (*i).m_sound->_handle() ? (*i).m_sound->_handle()->file_name() : "no source"; xr_string status = "not yet started"; if ( Device.dwTimeGlobal >= (*i).m_start_time ) { status = (*i).m_sound->_feedback() ? "playing" : "already played"; } TextTree& current_sound_s = now_playing_s.add_line(make_xrstr("Sound %i", index++)); current_sound_s.add_line(source); current_sound_s.add_line(status); } }
void CBlackGraviArtefact::GraviStrike() { xr_list<s16> elements_list; xr_list<Fvector> bone_position_list; Fvector object_pos ; Fvector strike_dir ; rq_storage.r_clear (); for(GAME_OBJECT_LIST_it it = m_GameObjectList.begin(); m_GameObjectList.end() != it; ++it) { CPhysicsShellHolder* pGameObject = *it; if(pGameObject->Visual()) pGameObject->Center(object_pos); else object_pos.set(pGameObject->Position()); strike_dir.sub(object_pos, Position()); float distance = strike_dir.magnitude(); float impulse = 100.f*m_fStrikeImpulse * (1.f - (distance/m_fRadius)* (distance/m_fRadius)); if(impulse > .001f) { //? BOOL enabled = getEnabled(); //? setEnabled (FALSE); impulse *= CExplosive::ExplosionEffect (rq_storage,NULL,pGameObject, Position(),m_fRadius); //? setEnabled (enabled); } float hit_power ; CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(pGameObject); if(pGameObject->m_pPhysicsShell) hit_power = 0; else if(pEntityAlive && pEntityAlive->g_Alive() && pEntityAlive->character_physics_support()->movement()->CharacterExist()) hit_power = 0; else hit_power = impulse; if(impulse > .001f) { while(!elements_list.empty()) { s16 element = elements_list.front(); Fvector bone_pos = bone_position_list.front(); NET_Packet P; SHit HS; HS.GenHeader(GE_HIT, pGameObject->ID()); // u_EventGen (P,GE_HIT, pGameObject->ID()); HS.whoID =ID(); // P.w_u16 (ID()); HS.weaponID = ID(); // P.w_u16 (ID()); HS.dir = strike_dir; // P.w_dir (strike_dir); HS.power = hit_power; // P.w_float (hit_power); HS.boneID = element; // P.w_s16 (element); HS.p_in_bone_space = bone_pos; // P.w_vec3 (bone_pos); HS.impulse = impulse; // P.w_float (impulse); HS.hit_type = (ALife::eHitTypeWound); // P.w_u16 (u16(ALife::eHitTypeWound)); HS.Write_Packet(P); u_EventSend (P); elements_list.pop_front(); bone_position_list.pop_front(); } } } }