Error CTaskBuild::IsEnded() { CAuto* automat; float angle, dist, time; if ( m_engine->GetPause() ) return ERR_CONTINUE; if ( m_bError ) return ERR_STOP; if ( m_phase == TBP_TURN ) // preliminary rotation? { angle = m_object->GetAngleY(0); angle = Math::NormAngle(angle); // 0..2*Math::PI if ( Math::TestAngle(angle, m_angleY-Math::PI*0.01f, m_angleY+Math::PI*0.01f) ) { m_physics->SetMotorSpeedZ(0.0f); dist = Math::Distance(m_object->GetPosition(0), m_metal->GetPosition(0)); if ( dist > 30.0f ) { time = m_physics->GetLinTimeLength(dist-30.0f, 1.0f); m_speed = 1.0f/time; } else { time = m_physics->GetLinTimeLength(30.0f-dist, -1.0f); m_speed = 1.0f/time; } m_phase = TBP_MOVE; m_progress = 0.0f; } return ERR_CONTINUE; } if ( m_phase == TBP_MOVE ) // preliminary forward/backward? { dist = Math::Distance(m_object->GetPosition(0), m_metal->GetPosition(0)); if ( dist >= 25.0f && dist <= 35.0f ) { m_physics->SetMotorSpeedX(0.0f); m_motion->SetAction(MHS_GUN); // takes gun m_phase = TBP_TAKE; m_speed = 1.0f/1.0f; m_progress = 0.0f; } else { if ( m_progress > 1.0f ) // timeout? { m_metal->SetLock(false); // usable again if ( dist < 30.0f ) return ERR_BUILD_METALNEAR; else return ERR_BUILD_METALAWAY; } } return ERR_CONTINUE; } if ( m_phase == TBP_TAKE ) // takes gun { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_motion->SetAction(MHS_FIRE); // shooting position m_object->SetObjectParent(14, 4); m_object->SetPosition(14, Math::Vector(0.6f, 0.1f, 0.3f)); m_object->SetAngleZ(14, 0.0f); m_phase = TBP_PREP; m_speed = 1.0f/1.0f; m_progress = 0.0f; } if ( m_phase == TBP_PREP ) // prepares? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_soundChannel = m_sound->Play(SOUND_TREMBLE, m_object->GetPosition(0), 0.0f, 1.0f, true); m_sound->AddEnvelope(m_soundChannel, 0.7f, 1.0f, 1.0f, SOPER_CONTINUE); m_sound->AddEnvelope(m_soundChannel, 0.7f, 1.5f, 7.0f, SOPER_CONTINUE); m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.5f, 2.0f, SOPER_STOP); m_camera->StartEffect(Gfx::CAM_EFFECT_VIBRATION, m_metal->GetPosition(0), 1.0f); m_phase = TBP_BUILD; m_speed = 1.0f/10.f; // duration of 10s m_progress = 0.0f; } if ( m_phase == TBP_BUILD ) // construction? { if ( m_progress < 1.0f ) return ERR_CONTINUE; DeleteMark(m_metal->GetPosition(0), 20.0f); m_metal->DeleteObject(); // removes the metal delete m_metal; m_metal = 0; m_building->SetZoom(0, 1.0f); m_building->SetCirVibration(Math::Vector(0.0f, 0.0f, 0.0f)); m_building->SetLock(false); // building usable m_main->CreateShortcuts(); m_displayText->DisplayError(INFO_BUILD, m_buildingPos, 10.0f, 50.0f); automat = m_building->GetAuto(); if ( automat != 0 ) { automat->Init(); } m_motion->SetAction(MHS_GUN); // hands gun m_phase = TBP_TERM; m_speed = 1.0f/1.0f; m_progress = 0.0f; } if ( m_phase == TBP_TERM ) // rotation terminale ? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_motion->SetAction(-1); m_object->SetObjectParent(14, 0); m_object->SetPosition(14, Math::Vector(-1.5f, 0.3f, -1.35f)); m_object->SetAngleZ(14, Math::PI); if ( m_type == OBJECT_FACTORY || m_type == OBJECT_RESEARCH || m_type == OBJECT_NUCLEAR ) { m_phase = TBP_RECEDE; m_speed = 1.0f/1.5f; m_progress = 0.0f; } } if ( m_phase == TBP_RECEDE ) // back? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_physics->SetMotorSpeedX(0.0f); } Abort(); return ERR_STOP; }
CObject* CObjectManager::CreateObject(Math::Vector pos, float angle, float zoom, float height, ObjectType type, float power, bool trainer, bool toy, int option) { CObject* object = nullptr; if ( type == OBJECT_NULL ) return nullptr; if ( type == OBJECT_HUMAN || type == OBJECT_TECH ) { trainer = false; // necessarily } if ( type == OBJECT_PORTICO || type == OBJECT_BASE || type == OBJECT_DERRICK || type == OBJECT_FACTORY || type == OBJECT_STATION || type == OBJECT_CONVERT || type == OBJECT_REPAIR || type == OBJECT_DESTROYER|| type == OBJECT_TOWER || type == OBJECT_NEST || type == OBJECT_RESEARCH || type == OBJECT_RADAR || type == OBJECT_INFO || type == OBJECT_ENERGY || type == OBJECT_LABO || type == OBJECT_NUCLEAR || type == OBJECT_PARA || type == OBJECT_SAFE || type == OBJECT_HUSTON || type == OBJECT_TARGET1 || type == OBJECT_TARGET2 || type == OBJECT_START || type == OBJECT_END ) { object = new CObject(); object->CreateBuilding(pos, angle, height, type, power); CAuto* automat = object->GetAuto(); if (automat != nullptr) { automat->Init(); } } else if ( type == OBJECT_FRET || type == OBJECT_STONE || type == OBJECT_URANIUM || type == OBJECT_METAL || type == OBJECT_POWER || type == OBJECT_ATOMIC || type == OBJECT_BULLET || type == OBJECT_BBOX || type == OBJECT_KEYa || type == OBJECT_KEYb || type == OBJECT_KEYc || type == OBJECT_KEYd || type == OBJECT_TNT || type == OBJECT_SCRAP1 || type == OBJECT_SCRAP2 || type == OBJECT_SCRAP3 || type == OBJECT_SCRAP4 || type == OBJECT_SCRAP5 || type == OBJECT_BOMB || type == OBJECT_WAYPOINT || type == OBJECT_SHOW || type == OBJECT_WINFIRE || type == OBJECT_BAG || type == OBJECT_MARKPOWER || type == OBJECT_MARKSTONE || type == OBJECT_MARKURANIUM || type == OBJECT_MARKKEYa || type == OBJECT_MARKKEYb || type == OBJECT_MARKKEYc || type == OBJECT_MARKKEYd || type == OBJECT_EGG ) { object = new CObject(); object->CreateResource(pos, angle, type, power); } else if ( type == OBJECT_FLAGb || type == OBJECT_FLAGr || type == OBJECT_FLAGg || type == OBJECT_FLAGy || type == OBJECT_FLAGv ) { object = new CObject(); object->CreateFlag(pos, angle, type); } else if ( type == OBJECT_BARRIER0 || type == OBJECT_BARRIER1 || type == OBJECT_BARRIER2 || type == OBJECT_BARRIER3 || type == OBJECT_BARRIER4 ) { object = new CObject(); object->CreateBarrier(pos, angle, height, type); } else if ( type == OBJECT_PLANT0 || type == OBJECT_PLANT1 || type == OBJECT_PLANT2 || type == OBJECT_PLANT3 || type == OBJECT_PLANT4 || type == OBJECT_PLANT5 || type == OBJECT_PLANT6 || type == OBJECT_PLANT7 || type == OBJECT_PLANT8 || type == OBJECT_PLANT9 || type == OBJECT_PLANT10 || type == OBJECT_PLANT11 || type == OBJECT_PLANT12 || type == OBJECT_PLANT13 || type == OBJECT_PLANT14 || type == OBJECT_PLANT15 || type == OBJECT_PLANT16 || type == OBJECT_PLANT17 || type == OBJECT_PLANT18 || type == OBJECT_PLANT19 || type == OBJECT_TREE0 || type == OBJECT_TREE1 || type == OBJECT_TREE2 || type == OBJECT_TREE3 || type == OBJECT_TREE4 || type == OBJECT_TREE5 || type == OBJECT_TREE6 || type == OBJECT_TREE7 || type == OBJECT_TREE8 || type == OBJECT_TREE9 ) { object = new CObject(); object->CreatePlant(pos, angle, height, type); } else if ( type == OBJECT_MUSHROOM0 || type == OBJECT_MUSHROOM1 || type == OBJECT_MUSHROOM2 || type == OBJECT_MUSHROOM3 || type == OBJECT_MUSHROOM4 || type == OBJECT_MUSHROOM5 || type == OBJECT_MUSHROOM6 || type == OBJECT_MUSHROOM7 || type == OBJECT_MUSHROOM8 || type == OBJECT_MUSHROOM9 ) { object = new CObject(); object->CreateMushroom(pos, angle, height, type); } else if ( type == OBJECT_TEEN0 || type == OBJECT_TEEN1 || type == OBJECT_TEEN2 || type == OBJECT_TEEN3 || type == OBJECT_TEEN4 || type == OBJECT_TEEN5 || type == OBJECT_TEEN6 || type == OBJECT_TEEN7 || type == OBJECT_TEEN8 || type == OBJECT_TEEN9 || type == OBJECT_TEEN10 || type == OBJECT_TEEN11 || type == OBJECT_TEEN12 || type == OBJECT_TEEN13 || type == OBJECT_TEEN14 || type == OBJECT_TEEN15 || type == OBJECT_TEEN16 || type == OBJECT_TEEN17 || type == OBJECT_TEEN18 || type == OBJECT_TEEN19 || type == OBJECT_TEEN20 || type == OBJECT_TEEN21 || type == OBJECT_TEEN22 || type == OBJECT_TEEN23 || type == OBJECT_TEEN24 || type == OBJECT_TEEN25 || type == OBJECT_TEEN26 || type == OBJECT_TEEN27 || type == OBJECT_TEEN28 || type == OBJECT_TEEN29 || type == OBJECT_TEEN30 || type == OBJECT_TEEN31 || type == OBJECT_TEEN32 || type == OBJECT_TEEN33 || type == OBJECT_TEEN34 || type == OBJECT_TEEN35 || type == OBJECT_TEEN36 || type == OBJECT_TEEN37 || type == OBJECT_TEEN38 || type == OBJECT_TEEN39 || type == OBJECT_TEEN40 || type == OBJECT_TEEN41 || type == OBJECT_TEEN42 || type == OBJECT_TEEN43 || type == OBJECT_TEEN44 || type == OBJECT_TEEN45 || type == OBJECT_TEEN46 || type == OBJECT_TEEN47 || type == OBJECT_TEEN48 || type == OBJECT_TEEN49 ) { object = new CObject(); object->SetOption(option); object->CreateTeen(pos, angle, zoom, height, type); } else if ( type == OBJECT_QUARTZ0 || type == OBJECT_QUARTZ1 || type == OBJECT_QUARTZ2 || type == OBJECT_QUARTZ3 || type == OBJECT_QUARTZ4 || type == OBJECT_QUARTZ5 || type == OBJECT_QUARTZ6 || type == OBJECT_QUARTZ7 || type == OBJECT_QUARTZ8 || type == OBJECT_QUARTZ9 ) { object = new CObject(); object->CreateQuartz(pos, angle, height, type); } else if ( type == OBJECT_ROOT0 || type == OBJECT_ROOT1 || type == OBJECT_ROOT2 || type == OBJECT_ROOT3 || type == OBJECT_ROOT4 || type == OBJECT_ROOT5 || type == OBJECT_ROOT6 || type == OBJECT_ROOT7 || type == OBJECT_ROOT8 || type == OBJECT_ROOT9 ) { object = new CObject(); object->CreateRoot(pos, angle, height, type); } else if ( type == OBJECT_HOME1 ) { object = new CObject(); object->CreateHome(pos, angle, height, type); } else if ( type == OBJECT_RUINmobilew1 || type == OBJECT_RUINmobilew2 || type == OBJECT_RUINmobilet1 || type == OBJECT_RUINmobilet2 || type == OBJECT_RUINmobiler1 || type == OBJECT_RUINmobiler2 || type == OBJECT_RUINfactory || type == OBJECT_RUINdoor || type == OBJECT_RUINsupport || type == OBJECT_RUINradar || type == OBJECT_RUINconvert || type == OBJECT_RUINbase || type == OBJECT_RUINhead ) { object = new CObject(); object->CreateRuin(pos, angle, height, type); } else if ( type == OBJECT_APOLLO1 || type == OBJECT_APOLLO3 || type == OBJECT_APOLLO4 || type == OBJECT_APOLLO5 ) { object = new CObject(); object->CreateApollo(pos, angle, type); } else if ( type == OBJECT_MOTHER || type == OBJECT_ANT || type == OBJECT_SPIDER || type == OBJECT_BEE || type == OBJECT_WORM ) { object = new CObject(); object->CreateInsect(pos, angle, type); // no eggs } else if ( type == OBJECT_HUMAN || type == OBJECT_TECH || type == OBJECT_TOTO || type == OBJECT_MOBILEfa || type == OBJECT_MOBILEta || type == OBJECT_MOBILEwa || type == OBJECT_MOBILEia || type == OBJECT_MOBILEfc || type == OBJECT_MOBILEtc || type == OBJECT_MOBILEwc || type == OBJECT_MOBILEic || type == OBJECT_MOBILEfi || type == OBJECT_MOBILEti || type == OBJECT_MOBILEwi || type == OBJECT_MOBILEii || type == OBJECT_MOBILEfs || type == OBJECT_MOBILEts || type == OBJECT_MOBILEws || type == OBJECT_MOBILEis || type == OBJECT_MOBILErt || type == OBJECT_MOBILErc || type == OBJECT_MOBILErr || type == OBJECT_MOBILErs || type == OBJECT_MOBILEsa || type == OBJECT_MOBILEtg || type == OBJECT_MOBILEft || type == OBJECT_MOBILEtt || type == OBJECT_MOBILEwt || type == OBJECT_MOBILEit || type == OBJECT_MOBILEdr || type == OBJECT_APOLLO2 ) { object = new CObject(); object->SetOption(option); object->CreateVehicle(pos, angle, type, power, trainer, toy); } return object; }