void ui_actor_state_wnd::update_round_states( CActor* actor, ALife::EHitType hit_type, EStateType stt_type ) { CCustomOutfit* outfit = actor->GetOutfit(); PIItem itm = actor->inventory().ItemFromSlot(HELMET_SLOT); CHelmet* helmet = smart_cast<CHelmet*>(itm); float value = (outfit)? outfit->GetDefHitTypeProtection( hit_type ) : 0.0f; value += actor->GetProtection_ArtefactsOnBelt( hit_type ); value += helmet?helmet->GetDefHitTypeProtection(ALife::eHitTypeShock):0.0f; float max_power = actor->conditions().GetZoneMaxPower( hit_type ); value = value / max_power; // = 0..1 // m_state[stt_type]->set_progress_shape( value ); m_state[stt_type]->set_arrow( value );//0..1 m_state[stt_type]->set_text( value );//0..1 }
void ui_actor_state_wnd::UpdateActorInfo( CInventoryOwner* owner ) { CActor* actor = smart_cast<CActor*>( owner ); if ( !actor ) { return; } float value = 0.0f; value = actor->conditions().GetHealth(); value = floor(value * 55) / 55; // number of sticks in progress bar // show bleeding icon m_state[stt_health]->set_progress(value); value = actor->conditions().BleedingSpeed(); m_state[stt_bleeding]->show_static(false, 1); m_state[stt_bleeding]->show_static(false, 2); m_state[stt_bleeding]->show_static(false, 3); if(!fis_zero(value, EPS)) { if(value<0.35f) m_state[stt_bleeding]->show_static(true, 1); else if(value<0.7f) m_state[stt_bleeding]->show_static(true, 2); else m_state[stt_bleeding]->show_static(true, 3); } // show radiation icon value = actor->conditions().GetRadiation(); m_state[stt_radiation]->show_static(false, 1); m_state[stt_radiation]->show_static(false, 2); m_state[stt_radiation]->show_static(false, 3); if(!fis_zero(value, EPS)) { if(value<0.35f) m_state[stt_radiation]->show_static(true, 1); else if(value<0.7f) m_state[stt_radiation]->show_static(true, 2); else m_state[stt_radiation]->show_static(true, 3); } CCustomOutfit* outfit = actor->GetOutfit(); PIItem itm = actor->inventory().ItemFromSlot(HELMET_SLOT); CHelmet* helmet = smart_cast<CHelmet*>(itm); m_state[stt_fire]->set_progress(0.0f); m_state[stt_radia]->set_progress(0.0f); m_state[stt_acid]->set_progress(0.0f); m_state[stt_psi]->set_progress(0.0f); m_state[stt_wound]->set_progress(0.0f); m_state[stt_fire_wound]->set_progress(0.0f); m_state[stt_shock]->set_progress(0.0f); m_state[stt_power]->set_progress(0.0f); float burn_value = 0.0f; float radi_value = 0.0f; float cmbn_value = 0.0f; float tele_value = 0.0f; float woun_value = 0.0f; float shoc_value = 0.0f; float fwou_value = 0.0f; CEntityCondition::BOOSTER_MAP cur_booster_influences = actor->conditions().GetCurBoosterInfluences(); CEntityCondition::BOOSTER_MAP::const_iterator it; it = cur_booster_influences.find(eBoostRadiationProtection); if(it!=cur_booster_influences.end()) radi_value += it->second.fBoostValue; it = cur_booster_influences.find(eBoostChemicalBurnProtection); if(it!=cur_booster_influences.end()) cmbn_value += it->second.fBoostValue; it = cur_booster_influences.find(eBoostTelepaticProtection); if(it!=cur_booster_influences.end()) tele_value += it->second.fBoostValue; if(outfit) { burn_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeBurn); radi_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeRadiation); cmbn_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeChemicalBurn); tele_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeTelepatic); woun_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeWound); shoc_value += outfit->GetDefHitTypeProtection(ALife::eHitTypeShock); IKinematics* ikv = smart_cast<IKinematics*>(actor->Visual()); VERIFY(ikv); u16 spine_bone = ikv->LL_BoneID("bip01_spine"); fwou_value += outfit->GetBoneArmor(spine_bone)*outfit->GetCondition(); if(!outfit->bIsHelmetAvaliable) { u16 spine_bone = ikv->LL_BoneID("bip01_head"); fwou_value += outfit->GetBoneArmor(spine_bone)*outfit->GetCondition(); } } if(helmet) { burn_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeBurn); radi_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeRadiation); cmbn_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeChemicalBurn); tele_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeTelepatic); woun_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeWound); shoc_value += helmet->GetDefHitTypeProtection(ALife::eHitTypeShock); IKinematics* ikv = smart_cast<IKinematics*>(actor->Visual()); VERIFY(ikv); u16 spine_bone = ikv->LL_BoneID("bip01_head"); fwou_value += helmet->GetBoneArmor(spine_bone)*helmet->GetCondition(); } //fire burn protection progress bar { burn_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeBurn); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeBurn); burn_value = floor(burn_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_fire]->set_progress(burn_value);//0..1 } //radiation protection progress bar { radi_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeRadiation); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeRadiation); radi_value = floor(radi_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_radia]->set_progress(radi_value);//0..1 } //chemical burn protection progress bar { cmbn_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeChemicalBurn); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeChemicalBurn); cmbn_value = floor(cmbn_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_acid]->set_progress(cmbn_value);//0..1 } //telepatic protection progress bar { tele_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeTelepatic); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeTelepatic); tele_value = floor(tele_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_psi]->set_progress(tele_value);//0..1 } //wound protection progress bar { float max_power = actor->conditions().GetMaxWoundProtection(); woun_value = floor(woun_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_wound]->set_progress(woun_value);//0..1 } //shock protection progress bar { shoc_value += actor->GetProtection_ArtefactsOnBelt(ALife::eHitTypeShock); float max_power = actor->conditions().GetZoneMaxPower(ALife::eHitTypeShock); shoc_value = floor(shoc_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_shock]->set_progress(shoc_value);//0..1 } //fire wound protection progress bar { float max_power = actor->conditions().GetMaxFireWoundProtection(); fwou_value = floor(fwou_value / max_power * 31) / 31; // number of sticks in progress bar m_state[stt_fire_wound]->set_progress(fwou_value); } //power restore speed progress bar { value = actor->GetRestoreSpeed(ALife::ePowerRestoreSpeed) / actor->conditions().GetMaxPowerRestoreSpeed();; value = floor(value * 31) / 31; // number of sticks in progress bar m_state[stt_power]->set_progress(value);//0..1 } // ----------------------------------------------------------------------------------- UpdateHitZone(); }
void CUIHudStatesWnd::FakeUpdateIndicatorType(u8 t, float power) { ALife::EInfluenceType type = (ALife::EInfluenceType)t; if ( type < ALife::infl_rad || ALife::infl_psi < type ) { VERIFY2( 0, "Failed EIndicatorType for CStatic!" ); return; } CActor* actor = smart_cast<CActor*>( Level().CurrentViewEntity() ); if(!actor) return; LPCSTR texture = ""; string128 str; switch(type) { case ALife::infl_rad: texture = "ui_inGame2_triangle_Radiation_"; break; case ALife::infl_fire: texture = "ui_inGame2_triangle_Fire_"; break; case ALife::infl_acid: texture = "ui_inGame2_triangle_Biological_"; break; case ALife::infl_psi: texture = "ui_inGame2_triangle_Psy_"; break; default: NODEFAULT; } float hit_power = power; ALife::EHitType hit_type = m_zone_hit_type[type]; CCustomOutfit* outfit = actor->GetOutfit(); CHelmet* helmet = smart_cast<CHelmet*>(actor->inventory().ItemFromSlot(HELMET_SLOT)); float protect = (outfit) ? outfit->GetDefHitTypeProtection( hit_type ) : 0.0f; protect += (helmet) ? helmet->GetDefHitTypeProtection(hit_type) : 0.0f; protect += actor->GetProtection_ArtefactsOnBelt( hit_type ); CEntityCondition::BOOSTER_MAP cur_booster_influences = actor->conditions().GetCurBoosterInfluences(); CEntityCondition::BOOSTER_MAP::const_iterator it; if(hit_type==ALife::eHitTypeChemicalBurn) { it = cur_booster_influences.find(eBoostChemicalBurnProtection); if(it!=cur_booster_influences.end()) protect += it->second.fBoostValue; } else if(hit_type==ALife::eHitTypeRadiation) { it = cur_booster_influences.find(eBoostRadiationProtection); if(it!=cur_booster_influences.end()) protect += it->second.fBoostValue; } else if(hit_type==ALife::eHitTypeTelepatic) { it = cur_booster_influences.find(eBoostTelepaticProtection); if(it!=cur_booster_influences.end()) protect += it->second.fBoostValue; } float max_power = actor->conditions().GetZoneMaxPower( hit_type ); protect = protect / max_power; // = 0..1 if ( hit_power < EPS ) { m_indik[type]->Show(false); actor->conditions().SetZoneDanger( 0.0f, type ); return; } m_indik[type]->Show(true); if ( hit_power < protect ) { xr_sprintf(str, sizeof(str), "%s%s", texture, "green"); texture = str; m_indik[type]->InitTexture(texture); actor->conditions().SetZoneDanger( 0.0f, type ); return; } if ( hit_power - protect < m_zone_threshold[type] ) { xr_sprintf(str, sizeof(str), "%s%s", texture, "yellow"); texture = str; m_indik[type]->InitTexture(texture); actor->conditions().SetZoneDanger( 0.0f, type ); return; } xr_sprintf(str, sizeof(str), "%s%s", texture, "red"); texture = str; m_indik[type]->InitTexture(texture); actor->conditions().SetZoneDanger( hit_power - protect, type ); }