bool CAI_Rat::switch_if_no_enemy() { if (!switch_if_enemy() || (switch_if_enemy() && ( !switch_if_alife() || ( (Device.dwTimeGlobal - memory().memory(memory().enemy().selected()).m_level_time > m_dwRetreatTime) && ( (m_tLastSound.dwTime < m_dwLastUpdateTime) || !m_tLastSound.tpEntity || (m_tLastSound.tpEntity->g_Team() == g_Team()) || !bfCheckIfSoundFrightful() ) ) ) ) ) { memory().enable (memory().enemy().selected(),false); return true; } return false; }
void CPhantom::net_Export (NET_Packet& P) // export to server { // export R_ASSERT (Local()); u8 flags = 0; P.w_float (GetfHealth()); P.w_float (0); P.w_u32 (0); P.w_u32 (0); P.w_u32 (Device.dwTimeGlobal); P.w_u8 (flags); float yaw, pitch, bank; XFORM().getHPB (yaw,pitch,bank); P.w_float /*w_angle8*/ (yaw); P.w_float /*w_angle8*/ (yaw); P.w_float /*w_angle8*/ (pitch); P.w_float /*w_angle8*/ (0); P.w_u8 (u8(g_Team())); P.w_u8 (u8(g_Squad())); P.w_u8 (u8(g_Group())); }
void CBaseMonster::Die(CObject* who) { if (StateMan) StateMan->critical_finalize(); m_psy_aura.on_monster_death(); m_radiation_aura.on_monster_death(); m_fire_aura.on_monster_death(); m_base_aura.on_monster_death(); if ( m_anti_aim ) { m_anti_aim->on_monster_death (); } inherited::Die(who); if (is_special_killer(who)) sound().play (MonsterSound::eMonsterSoundDieInAnomaly); else sound().play (MonsterSound::eMonsterSoundDie); monster_squad().remove_member ((u8)g_Team(),(u8)g_Squad(),(u8)g_Group(),this); if ( m_grouping_behaviour ) { m_grouping_behaviour->set_squad(NULL); } if (m_controlled) m_controlled->on_die(); }
BOOL CAI_Rat::feel_vision_isRelevant(CObject* O) { CEntityAlive* E = smart_cast<CEntityAlive*> (O); if (!E) return FALSE; if ((E->g_Team() == g_Team()) && (E->g_Alive())) return FALSE; return TRUE; }
// Core events void CAI_Crow::net_Export (NET_Packet& P) // export to server { // export R_ASSERT (Local()); u8 flags = 0; P.w_float (GetfHealth()); P.w_float (0); P.w_u32 (0); P.w_u32 (0); P.w_u32 (Level().timeServer()); P.w_u8 (flags); float yaw, pitch, bank; XFORM().getHPB (yaw,pitch,bank); P.w_float /*w_angle8*/ (yaw); P.w_float /*w_angle8*/ (yaw); P.w_float /*w_angle8*/ (pitch); P.w_float /*w_angle8*/ (0); P.w_u8 (u8(g_Team())); P.w_u8 (u8(g_Squad())); P.w_u8 (u8(g_Group())); }
bool CAI_Rat::get_if_tp_entity() { if ( m_tLastSound.tpEntity && (m_tLastSound.tpEntity->g_Team() != g_Team()) && (!bfCheckIfSoundFrightful())) { return true; } return false; }
void CEntity::net_Destroy () { if (m_registered_member) { m_registered_member = false; if (IsGameTypeSingle()) Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).unregister_member(this); } inherited::net_Destroy (); set_ready_to_save (); }
void CBaseMonster::ChangeTeam(int team, int squad, int group) { if ((team == g_Team()) && (squad == g_Squad()) && (group == g_Group())) return; #ifdef DEBUG if (!g_Alive()) { ai().script_engine().print_stack (); VERIFY2 (g_Alive(),"you are trying to change team of a dead entity"); } #endif // DEBUG // remove from current team monster_squad().remove_member ((u8)g_Team(),(u8)g_Squad(),(u8)g_Group(),this); inherited::ChangeTeam (team,squad,group); monster_squad().register_member ((u8)g_Team(),(u8)g_Squad(),(u8)g_Group(), this); if ( m_grouping_behaviour ) { m_grouping_behaviour->set_squad( monster_squad().get_squad(this) ); } }
void CEntity::ChangeTeam(int team, int squad, int group) { if ((team == g_Team()) && (squad == g_Squad()) && (group == g_Group())) return; VERIFY2 (g_Alive(), "Try to change team of a dead object"); if(IsGameTypeSingle()) { VERIFY (m_registered_member); } // remove from current team on_before_change_team (); Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).unregister_member (this); id_Team = team; id_Squad = squad; id_Group = group; // add to new team Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).register_member (this); on_after_change_team (); }
BOOL CBaseMonster::net_Spawn (CSE_Abstract* DC) { if (!inherited::net_Spawn(DC)) return(FALSE); CSE_Abstract *e = (CSE_Abstract*)(DC); R_ASSERT2 (ai().get_level_graph() && ai().get_cross_table() && (ai().level_graph().level_id() != u32(-1)),"There is no AI-Map, level graph, cross table, or graph is not compiled into the game graph!"); monster_squad().register_member ((u8)g_Team(),(u8)g_Squad(),(u8)g_Group(), this); settings_overrides (); if (GetScriptControl()) { m_control_manager->animation().reset_data (); ProcessScripts (); } m_pPhysics_support->in_NetSpawn (e); control().update_frame(); control().update_schedule(); // spawn inventory item // if (ai().get_alife()) { // // CSE_ALifeMonsterBase *se_monster = smart_cast<CSE_ALifeMonsterBase*>(ai().alife().objects().object(ID())); // VERIFY (se_monster); // // if (se_monster->m_flags.is(CSE_ALifeMonsterBase::flNeedCheckSpawnItem)) { // float prob = Random.randF(); // if ((prob < m_spawn_probability) || fsimilar(m_spawn_probability,1.f)) // se_monster->m_flags.set(CSE_ALifeMonsterBase::flSkipSpawnItem, FALSE); // // se_monster->m_flags.set(CSE_ALifeMonsterBase::flNeedCheckSpawnItem, FALSE); // } // // if (!se_monster->m_flags.is(CSE_ALifeMonsterBase::flSkipSpawnItem)) { // CSE_Abstract *object = Level().spawn_item (m_item_section,Position(),ai_location().level_vertex_id(),ID(),true); // CSE_ALifeObject *alife_object = smart_cast<CSE_ALifeObject*>(object); // if (alife_object) // alife_object->m_flags.set (CSE_ALifeObject::flCanSave,FALSE); // // { // NET_Packet P; // object->Spawn_Write (P,TRUE); // Level().Send (P,net_flags(TRUE)); // F_entity_Destroy (object); // } // } // } return(TRUE); }
void CEntity::Die(CObject* who) { if (!AlreadyDie()) set_death_time(); set_ready_to_save (); SetfHealth (-1.f); if(IsGameTypeSingle()) { VERIFY (m_registered_member); } m_registered_member = false; if (IsGameTypeSingle()) Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).unregister_member(this); }
void CBaseMonster::net_Destroy() { // функция должена быть вызвана перед inherited if (m_controlled) m_controlled->on_destroy (); if (StateMan) StateMan->critical_finalize (); inherited::net_Destroy (); m_pPhysics_support->in_NetDestroy (); monster_squad().remove_member ((u8)g_Team(),(u8)g_Squad(),(u8)g_Group(),this); #ifdef DEBUG m_show_debug_info = 0; #endif }
bool CAI_Rat::switch_to_free_recoil() { if ( (m_tLastSound.dwTime >= m_dwLastUpdateTime) && ( !m_tLastSound.tpEntity || ( (!switch_to_eat() || (memory().item().selected()->ID() != m_tLastSound.tpEntity->ID())) && (m_tLastSound.tpEntity->g_Team() != g_Team()) ) ) && !switch_if_enemy() ) { return true; } return false; }
void CCustomMonster::net_Export(NET_Packet& P) // export to server { R_ASSERT (Local()); // export last known packet R_ASSERT (!NET.empty()); net_update& N = NET.back(); P.w_float (GetfHealth()); P.w_u32 (N.dwTimeStamp); P.w_u8 (0); P.w_vec3 (N.p_pos); P.w_float /*w_angle8*/ (N.o_model); P.w_float /*w_angle8*/ (N.o_torso.yaw); P.w_float /*w_angle8*/ (N.o_torso.pitch); P.w_float /*w_angle8*/ (N.o_torso.roll); P.w_u8 (u8(g_Team())); P.w_u8 (u8(g_Squad())); P.w_u8 (u8(g_Group())); }
void CBaseMonster::net_Export(NET_Packet& P) { R_ASSERT (Local()); // export last known packet R_ASSERT (!NET.empty()); net_update& N = NET.back(); P.w_float (GetfHealth()); P.w_u32 (N.dwTimeStamp); P.w_u8 (0); P.w_vec3 (N.p_pos); P.w_float /*w_angle8*/ (N.o_model); P.w_float /*w_angle8*/ (N.o_torso.yaw); P.w_float /*w_angle8*/ (N.o_torso.pitch); P.w_float /*w_angle8*/ (N.o_torso.roll); P.w_u8 (u8(g_Team())); P.w_u8 (u8(g_Squad())); P.w_u8 (u8(g_Group())); GameGraph::_GRAPH_ID l_game_vertex_id = ai_location().game_vertex_id(); P.w (&l_game_vertex_id, sizeof(l_game_vertex_id)); P.w (&l_game_vertex_id, sizeof(l_game_vertex_id)); // P.w (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); // P.w (&m_fGoingSpeed, sizeof(m_fGoingSpeed)); float f1 = 0; if (ai().game_graph().valid_vertex_id(l_game_vertex_id)) { f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.w (&f1, sizeof(f1)); f1 = Position().distance_to (ai().game_graph().vertex(l_game_vertex_id)->level_point()); P.w (&f1, sizeof(f1)); } else { P.w (&f1, sizeof(f1)); P.w (&f1, sizeof(f1)); } }
BOOL CEntity::net_Spawn (CSE_Abstract* DC) { m_level_death_time = 0; m_game_death_time = 0; m_killer_id = ALife::_OBJECT_ID(-1); CSE_Abstract *e = (CSE_Abstract*)(DC); CSE_ALifeCreatureAbstract *E = smart_cast<CSE_ALifeCreatureAbstract*>(e); // Initialize variables if (E) { SetfHealth (E->get_health()); R_ASSERT2(!((E->get_killer_id() != ALife::_OBJECT_ID(-1)) && g_Alive()), make_string("server entity [%s][%d] has an killer [%d] and not dead", E->name_replace(), E->ID, E->get_killer_id()).c_str()); m_killer_id = E->get_killer_id(); if (m_killer_id == ID()) m_killer_id = ALife::_OBJECT_ID(-1); } else SetfHealth (1.0f); // load damage params if (!E) { // Car or trader only!!!! CSE_ALifeCar *C = smart_cast<CSE_ALifeCar*>(e); CSE_ALifeTrader *T = smart_cast<CSE_ALifeTrader*>(e); CSE_ALifeHelicopter *H = smart_cast<CSE_ALifeHelicopter*>(e); R_ASSERT2 (C||T||H,"Invalid entity (no inheritance from CSE_CreatureAbstract, CSE_ALifeItemCar and CSE_ALifeTrader and CSE_ALifeHelicopter)!"); id_Team = id_Squad = id_Group = 0; } else { id_Team = E->g_team(); id_Squad = E->g_squad(); id_Group = E->g_group(); CSE_ALifeMonsterBase *monster = smart_cast<CSE_ALifeMonsterBase*>(E); if (monster) { MONSTER_COMMUNITY monster_community; monster_community.set (pSettings->r_string(*cNameSect(), "species")); if(monster_community.team() != 255) id_Team = monster_community.team(); } } if (g_Alive() && IsGameTypeSingle()) { m_registered_member = true; Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).register_member(this); ++Level().seniority_holder().team(g_Team()).squad(g_Squad()).group(g_Group()).m_dwAliveCount; } if(!g_Alive()) { m_level_death_time = Device.dwTimeGlobal; m_game_death_time = E->m_game_death_time;; } if (!inherited::net_Spawn(DC)) return (FALSE); // SetfHealth (E->fHealth); IKinematics* pKinematics=smart_cast<IKinematics*>(Visual()); CInifile* ini = NULL; if(pKinematics) ini = pKinematics->LL_UserData(); if (ini) { if (ini->section_exist("damage_section") && !use_simplified_visual()) CDamageManager::reload(pSettings->r_string("damage_section","damage"),ini); CParticlesPlayer::LoadParticles(pKinematics); } return TRUE; }
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 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); } }
CAI_Rat::ERatStates CAI_Rat::get_state() { return ERatStates(dwfChooseAction(m_dwActionRefreshRate,m_fAttackSuccessProbability,m_fAttackSuccessProbability,m_fAttackSuccessProbability,m_fAttackSuccessProbability,g_Team(),g_Squad(),g_Group(),aiRatAttackMelee,aiRatAttackMelee,aiRatAttackMelee,aiRatRetreat,aiRatRetreat,this,30.f)); }