void SArtefactActivation::Load() { for(int i=0; i<(int)eMax; ++i) m_activation_states.push_back(SStateDef()); LPCSTR activation_seq = pSettings->r_string(*m_af->cNameSect(),"artefact_activation_seq"); m_activation_states[(int)eStarting].Load(activation_seq, "starting"); m_activation_states[(int)eFlying].Load(activation_seq, "flying"); m_activation_states[(int)eBeforeSpawn].Load(activation_seq, "idle_before_spawning"); m_activation_states[(int)eSpawnZone].Load(activation_seq, "spawning"); }
void SArtefactActivation::SpawnAnomaly() { VERIFY(!ph_world->Processing()); string128 tmp; LPCSTR str = pSettings->r_string("artefact_spawn_zones",*m_af->cNameSect()); VERIFY3(3==_GetItemCount(str),"Bad record format in artefact_spawn_zones",str); float zone_radius = (float)atof(_GetItem(str,1,tmp)); float zone_power = (float)atof(_GetItem(str,2,tmp)); LPCSTR zone_sect = _GetItem(str,0,tmp); //must be last call of _GetItem... (LPCSTR !!!) Fvector pos; m_af->Center(pos); CSE_Abstract *object = Level().spawn_item( zone_sect, pos, m_af->ai_location().level_vertex_id(), 0xffff, true ); CSE_ALifeAnomalousZone* AlifeZone = smart_cast<CSE_ALifeAnomalousZone*>(object); VERIFY(AlifeZone); CShapeData::shape_def _shape; _shape.data.sphere.P.set (0.0f,0.0f,0.0f); _shape.data.sphere.R = zone_radius; _shape.type = CShapeData::cfSphere; AlifeZone->assign_shapes (&_shape,1); AlifeZone->m_maxPower = zone_power; AlifeZone->m_owner_id = m_owner_id; AlifeZone->m_space_restrictor_type = RestrictionSpace::eRestrictorTypeNone; NET_Packet P; object->Spawn_Write (P,TRUE); Level().Send (P,net_flags(TRUE)); F_entity_Destroy (object); #ifdef DEBUG Msg("artefact [%s] spawned a zone [%s] at [%f]", *m_af->cName(), zone_sect, Device.fTimeGlobal); #endif }
void CScientificDetector::UpfateWork() { ui().Clear (); CAfList::ItemsMapIt ait_b = m_artefacts.m_ItemInfos.begin(); CAfList::ItemsMapIt ait_e = m_artefacts.m_ItemInfos.end(); CAfList::ItemsMapIt ait = ait_b; Fvector detector_pos = Position(); for(;ait_b!=ait_e;++ait_b) { CArtefact *pAf = ait_b->first; if(pAf->H_Parent()) continue; ui().RegisterItemToDraw (pAf->Position(), pAf->cNameSect()); if(pAf->CanBeInvisible()) { float d = detector_pos.distance_to(pAf->Position()); if(d<m_fAfVisRadius) pAf->SwitchVisibility(true); } } CZoneList::ItemsMapIt zit_b = m_zones.m_ItemInfos.begin(); CZoneList::ItemsMapIt zit_e = m_zones.m_ItemInfos.end(); CZoneList::ItemsMapIt zit = zit_b; for(;zit_b!=zit_e;++zit_b) { CCustomZone* pZone = zit_b->first; ui().RegisterItemToDraw (pZone->Position(),pZone->cNameSect()); } m_ui->update (); }
void CUIArtefactParams::SetInfo(CGameObject *obj) { CArtefact *art = smart_cast<CArtefact*> (obj); R_ASSERT2(art, "object is not CArtefact"); const shared_str& af_section = art->cNameSect(); CActor *pActor = Actor(); if (!pActor) return; string128 _buff; float _h = 0.0f; DetachAll (); for(u32 i=_item_start; i<_max_item_index; ++i) { CUIStatic* _s = m_info_items[i]; float _val; if(i<_max_item_index1) { #ifdef AF_SHOW_DYNAMIC_PARAMS float _actor_val = pActor->conditions().GetParamByName(af_actor_param_names[i]); float CArtefact::* pRestoreSpeed = af_prop_offsets[i]; _val = (art->*pRestoreSpeed); // alpet: используется указатель на данные класса #else _val = pSettings->r_float (af_section, af_item_sect_names[i]); float _actor_val = pSettings->r_float ("actor_condition", af_actor_param_names[i]); #endif if (fis_zero(_val)) continue; _val = (_val/_actor_val)*100.0f; }else { #ifdef AF_SHOW_DYNAMIC_PARAMS u32 idx = i - _max_item_index1; // absorbation index _val = art->m_ArtefactHitImmunities.immunities()[idx]; // real absorbation values #else shared_str _sect = pSettings->r_string(af_section, "hit_absorbation_sect"); _val = pSettings->r_float(_sect, af_item_sect_names[i]); #endif if (fsimilar(_val, 1.0f)) continue; _val = (1.0f - _val); _val *= 100.0f; } LPCSTR _sn = "%"; if(i==_item_radiation_restore_speed || i==_item_power_restore_speed) { _val /= 100.0f; _sn = ""; } LPCSTR _color = (_val>0)?"%c[green]":"%c[red]"; if(i==_item_bleeding_restore_speed) _val *= -1.0f; if(i==_item_bleeding_restore_speed || i==_item_radiation_restore_speed) _color = (_val>0)?"%c[red]":"%c[green]"; sprintf_s ( _buff, "%s %s %+.0f %s", CStringTable().translate(af_item_param_names[i]).c_str(), _color, _val, _sn); _s->SetText (_buff); _s->SetWndPos (_s->GetWndPos().x, _h); _h += _s->GetWndSize().y; AttachChild (_s); } SetHeight (_h); }