//------------------------------------------------------------------------------------ // Update for all StarSystem parts //------------------------------------------------------------------------------------ void StarSystemUpdate() { if (!StarSystem_InitedAll) return; // static space stars if (psSpaceStatic!=0) psSpaceStatic->Update(vw_GetTime()); }
//----------------------------------------------------------------------------- // инициализация переменных камеры для игры //----------------------------------------------------------------------------- void InitGameCamera() { GamePoint = VECTOR3D(0.0f, 0.0f, 0.0f); GameCameraLastUpdate = vw_GetTime(1); GameCameraDeviation = 0.0f; GameCameraDeviationTime = 0.0f; GameCameraNeedDeviation = 0.0f; GameCameraDeviationPower = 0.0f; GameCameraNeedStartDeviation = 0.0f; GameCameraDeviationAge = 0.0f; vw_SetCameraDeviation(VECTOR3D(0,0,0)); }
void SetMenu2(eGameStatus Menu) { // текущее меню уже стало невидимым, освобождаем память после воркшопа + выключаем голосовые сообщения // раньше удалять нельзя - для вывода используем данные из 3д объектов (!) switch (GameStatus) { case WORKSHOP: WorkshopDestroyData(); VoiceNeedMoreEnergy = 0; VoiceAmmoOut = 0; break; default: break; } PrevMenu = GameStatus; GameStatus = Menu; float Time = vw_GetTime(); Button1Transp = 1.0f; LastButton1UpdateTime = Time; Button2Transp = 1.0f; LastButton2UpdateTime = Time; Button3Transp = 1.0f; LastButton3UpdateTime = Time; Button4Transp = 1.0f; LastButton4UpdateTime = Time; Button5Transp = 1.0f; LastButton5UpdateTime = Time; Button6Transp = 1.0f; LastButton6UpdateTime = Time; Button7Transp = 1.0f; LastButton7UpdateTime = Time; Button8Transp = 1.0f; LastButton8UpdateTime = Time; Button9Transp = 1.0f; LastButton9UpdateTime = Time; Button10Transp = 1.0f; LastButton10UpdateTime = Time; Button11Transp = 1.0f; LastButton11UpdateTime = Time; Button12Transp = 1.0f; LastButton12UpdateTime = Time; Button13Transp = 1.0f; LastButton13UpdateTime = Time; Button14Transp = 1.0f; LastButton14UpdateTime = Time; }
//------------------------------------------------------------------------------------ // Прорисовка второго слоя "пыли" с тайловой анимацией //------------------------------------------------------------------------------------ void StarSystemDrawSecondLayer(int DrawType) { if (Setup.VisualEffectsQuality <= 1) { int VFV = RI_3f_XYZ | RI_4f_COLOR | RI_1_TEX; float *buff; buff = new float[4*9]; if (buff == 0) return; float width_2, heigh_2, length_2; width_2 = 0.0f; heigh_2 = 110.0f; length_2 = 110.0f; float x,y,z; x = GamePoint.x; y = GamePoint.y; z = GamePoint.z; float StartTransparentLayer2 = 0.9f; float EndTransparentLayer2 = 0.7f; if (DrawType == 2) { width_2 = length_2 = 175.0f; heigh_2 = 0.0f; VECTOR3D CurrentCameraLocation; vw_GetCameraLocation(&CurrentCameraLocation); x = GamePoint.x+GameCameraGetDeviation()*2.0f + CurrentCameraLocation.x*0.5f; y = GamePoint.y-GameCameraGetDeviation(); z = GamePoint.z+25.0f; StartTransparentLayer2 = StarsTileStartTransparentLayer2; EndTransparentLayer2 = StarsTileEndTransparentLayer2; } int k=0; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer2; buff[k++] = 3.2f; buff[k++] = 0.0f+StarsTile2; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer2; buff[k++] = 3.2f; buff[k++] = 3.0f+StarsTile2; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer2; buff[k++] = 0.2f; buff[k++] = 0.0f+StarsTile2; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer2; buff[k++] = 0.2f; buff[k++] = 3.0f+StarsTile2; if (DrawType == 1) { StarsTile2 -= 0.04f*(vw_GetTime() - StarsTileUpdateTime2); StarsTileUpdateTime2 = vw_GetTime(); } else { StarsTile2 -= 0.12f*(vw_GetTime(1) - StarsTileUpdateTime2); StarsTileUpdateTime2 = vw_GetTime(1); } if (StarsTile2 < -3.0f) StarsTile2 += 3.0f; eTexture *TileTexture = vw_FindTextureByName("DATA/SKYBOX/tile_stars.tga"); vw_SetTexture(0, TileTexture); // по умолчанию всегда трилинейная фильтрация, если надо - ставим билинейную if (Setup.TextureFilteringMode == 1) vw_SetTextureFiltering(RI_TEXTURE_BILINEAR); vw_SetTextureBlend(true, RI_BLEND_SRCALPHA, RI_BLEND_ONE); vw_DepthTest(false, -1); if (DrawType == 1) { vw_PushMatrix(); vw_Rotate(-20.0f, 0.0f, 0.0f, 1.0f); vw_Rotate(-45.0f, 0.0f, 1.0f, 0.0f); vw_Rotate(30.0f, 1.0f, 0.0f, 0.0f); } vw_SendVertices(RI_TRIANGLE_STRIP, 4, VFV, buff, 9*sizeof(float)); if (DrawType == 1) vw_PopMatrix(); vw_DepthTest(true, RI_LESSEQUAL); vw_SetTextureBlend(false, 0, 0); vw_BindTexture(0, 0); if (buff != 0){delete [] buff; buff = 0;} } }
//------------------------------------------------------------------------------------ // StarSystem draw function //------------------------------------------------------------------------------------ void StarSystemDraw(int DrawType) { if (!StarSystem_InitedAll) return; // current camera location VECTOR3D CurrentCameraLocation; vw_GetCameraLocation(&CurrentCameraLocation); vw_DepthTest(false, -1); if (StarSystem_Inited) { // SkyBox vw_PushMatrix(); vw_Translate(CurrentCameraLocation); vw_Rotate(StarSystem_BaseRotation.x, 1.0f, 0.0f, 0.0f); vw_Rotate(StarSystem_BaseRotation.y, 0.0f, 1.0f, 0.0f); vw_Rotate(StarSystem_BaseRotation.z, 0.0f, 0.0f, 1.0f); SkyBoxDraw(); vw_PopMatrix(); } // static space stars if (psSpaceStatic!=0) psSpaceStatic->Draw(); vw_DepthTest(true, RI_LESSEQUAL); // космические объекты // рисуем планеты и большие астероиды _до_ тайловой анимации CSpaceObject *tmp1 = StartSpaceObject; while (tmp1!=0) { CSpaceObject *tmp2 = tmp1->Next; // если это планета на заднем фоне if (tmp1->ObjectType == 14) { if (DrawType == 2) { vw_PushMatrix(); vw_Translate(VECTOR3D(CurrentCameraLocation.x*0.90f-GameCameraGetDeviation()*4.0f, GameCameraGetDeviation()*2.0f,0.0f)); } tmp1->Draw(false); if (DrawType == 2) vw_PopMatrix(); } else // если это большой астероид летящий на заднем фоне if (tmp1->ObjectType == 15 && (tmp1->ObjectCreationType>10 && tmp1->ObjectCreationType<20)) { if (DrawType == 2) { vw_PushMatrix(); vw_Translate(VECTOR3D(CurrentCameraLocation.x*0.70f-GameCameraGetDeviation()*4.0f, GameCameraGetDeviation()*2.0f,0.0f)); } tmp1->Draw(false); if (DrawType == 2) vw_PopMatrix(); } tmp1 = tmp2; } // очищаем буфер глубины, чтобы "3д подложка" не участвовала в проверке глубины vw_Clear(RI_DEPTH_BUFFER); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Прорисовка подложки с тайловой анимацией //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ { int VFV = RI_3f_XYZ | RI_4f_COLOR | RI_1_TEX; float *buff = 0; buff = new float[4*9]; if (buff == 0) return; float width_2, heigh_2, length_2; width_2 = 0.0f; heigh_2 = 110.0f; length_2 = 110.0f; float x,y,z; x = GamePoint.x; y = GamePoint.y; z = GamePoint.z; float StartTransparentLayer1 = 0.7f; float EndTransparentLayer1 = 0.7f; if (DrawType == 2) { width_2 = length_2 = 175.0f; heigh_2 = 0.0f; // чем ниже слой, тем меньше его двигаем при перемещении камеры (при стандартном аспект рейшен) x = GamePoint.x+GameCameraGetDeviation() + CurrentCameraLocation.x*0.8f; y = GamePoint.y-GameCameraGetDeviation()*0.5f; z = GamePoint.z+25.0f; StartTransparentLayer1 = StarsTileStartTransparentLayer1; EndTransparentLayer1 = StarsTileEndTransparentLayer1; } int k=0; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer1; buff[k++] = 1.0f; buff[k++] = 0.0f+StarsTile/3.0f; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer1; buff[k++] = 1.0f; buff[k++] = 1.0f+StarsTile/3.0f; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer1; buff[k++] = 0.0f; buff[k++] = 0.0f+StarsTile/3.0f; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer1; buff[k++] = 0.0f; buff[k++] = 1.0f+StarsTile/3.0f; if (DrawType == 1) { StarsTile -= 0.015f*(vw_GetTime() - StarsTileUpdateTime); StarsTileUpdateTime = vw_GetTime(); } else { StarsTile -= 0.035f*(vw_GetTime(1) - StarsTileUpdateTime); StarsTileUpdateTime = vw_GetTime(1); } if (StarsTile < -3.0f) StarsTile += 3.0f; eTexture *TileTexture = vw_FindTextureByName("DATA/SKYBOX/tile_back.tga"); vw_SetTexture(0, TileTexture); // по умолчанию всегда трилинейная фильтрация, если надо - ставим билинейную if (Setup.TextureFilteringMode == 1) vw_SetTextureFiltering(RI_TEXTURE_BILINEAR); vw_SetTextureBlend(true, RI_BLEND_SRCALPHA, RI_BLEND_ONE); vw_DepthTest(false, -1); if (DrawType == 1) { vw_PushMatrix(); vw_Rotate(-20.0f, 0.0f, 0.0f, 1.0f); vw_Rotate(-45.0f, 0.0f, 1.0f, 0.0f); vw_Rotate(30.0f, 1.0f, 0.0f, 0.0f); } vw_SendVertices(RI_TRIANGLE_STRIP, 4, VFV, buff, 9*sizeof(float)); // звезды рисуем отдельно, четкими (со своими текстурными координатами) k=0; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer1; buff[k++] = 3.0f; buff[k++] = 0.0f+StarsTile; buff[k++] = x + width_2; buff[k++] = y + heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer1; buff[k++] = 3.0f; buff[k++] = 3.0f+StarsTile; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z + length_2+length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = StartTransparentLayer1; buff[k++] = 0.0f; buff[k++] = 0.0f+StarsTile; buff[k++] = x - width_2; buff[k++] = y - heigh_2; buff[k++] = z - length_2/2; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = 1.0f; buff[k++] = EndTransparentLayer1; buff[k++] = 0.0f; buff[k++] = 3.0f+StarsTile; vw_SetTexture(0, vw_FindTextureByName("DATA/SKYBOX/tile_stars.tga")); vw_SendVertices(RI_TRIANGLE_STRIP, 4, VFV, buff, 9*sizeof(float)); if (DrawType == 1) vw_PopMatrix(); vw_DepthTest(true, RI_LESSEQUAL); vw_SetTextureBlend(false, 0, 0); vw_BindTexture(0, 0); if (buff != 0){delete [] buff; buff = 0;} } // корректируем положение частиц "космической пыли", если в игре и камера движется if (DrawType == 2) { VECTOR3D TMPpsSpace; psSpace->GetLocation(&TMPpsSpace); psSpace->SetStartLocation(TMPpsSpace); psSpace->MoveSystemLocation(VECTOR3D(0,10,250)+GamePoint); } }
//------------------------------------------------------------------------------------ // создание корабля игрока при покупке нового корпуса //------------------------------------------------------------------------------------ void WorkshopCreateBuyShip() { // продаем все оружие и все системы // 1 - Системы int EngineSystem = Setup.Profile[CurrentProfile].EngineSystem; if (Setup.Profile[CurrentProfile].EngineSystem != 0) Setup.Profile[CurrentProfile].Money += GetSystemCost(Setup.Profile[CurrentProfile].EngineSystem); Setup.Profile[CurrentProfile].EngineSystem = 0; int PowerSystem = Setup.Profile[CurrentProfile].PowerSystem; if (Setup.Profile[CurrentProfile].PowerSystem != 0) Setup.Profile[CurrentProfile].Money += GetSystemCost(Setup.Profile[CurrentProfile].PowerSystem+4); Setup.Profile[CurrentProfile].PowerSystem = 0; int TargetingSystem = Setup.Profile[CurrentProfile].TargetingSystem; if (Setup.Profile[CurrentProfile].TargetingSystem != 0) Setup.Profile[CurrentProfile].Money += GetSystemCost(Setup.Profile[CurrentProfile].TargetingSystem+8); Setup.Profile[CurrentProfile].TargetingSystem = 0; int TargetingMechanicSystem = Setup.Profile[CurrentProfile].TargetingMechanicSystem; if (Setup.Profile[CurrentProfile].TargetingMechanicSystem != 0) Setup.Profile[CurrentProfile].Money += GetSystemCost(Setup.Profile[CurrentProfile].TargetingMechanicSystem+12); Setup.Profile[CurrentProfile].TargetingMechanicSystem = 0; int AdvancedProtectionSystem = Setup.Profile[CurrentProfile].AdvancedProtectionSystem; if (Setup.Profile[CurrentProfile].AdvancedProtectionSystem != 0) Setup.Profile[CurrentProfile].Money += GetSystemCost(Setup.Profile[CurrentProfile].AdvancedProtectionSystem+16); Setup.Profile[CurrentProfile].AdvancedProtectionSystem = 0; // 2 - Оружие int OldWeaponQuantity = WorkshopFighterGame->WeaponQuantity; for (int i=0; i<WorkshopFighterGame->WeaponQuantity; i++) if (WorkshopFighterGame->Weapon[i] != 0) { Setup.Profile[CurrentProfile].Money += GetWeaponCost(WorkshopFighterGame->Weapon[i]->ObjectCreationType, WorkshopFighterGame->Weapon[i]->Ammo, WorkshopFighterGame->Weapon[i]->AmmoStart); delete WorkshopFighterGame->Weapon[i]; WorkshopFighterGame->Weapon[i] = 0; } // 3 - корпус Setup.Profile[CurrentProfile].Money += GetWorkshopShipCost(Setup.Profile[CurrentProfile].Ship)*Setup.Profile[CurrentProfile].ShipHullUpgrade - GetWorkshopShipRepairCost(Setup.Profile[CurrentProfile].Ship, WorkshopFighterGame); // сейчас у нас все в "деньгах", покупаем корпус Setup.Profile[CurrentProfile].Ship = CurrentWorkshopNewFighter; Setup.Profile[CurrentProfile].Money -= GetWorkshopShipCost(Setup.Profile[CurrentProfile].Ship); // создаем объект if (WorkshopFighterGame != 0){delete WorkshopFighterGame; WorkshopFighterGame = 0;} int TMPGameNPCArmorPenalty = GameNPCArmorPenalty; GameNPCArmorPenalty = 1; WorkshopFighterGame = new CEarthSpaceFighter; WorkshopFighterGame->Create(Setup.Profile[CurrentProfile].Ship); WorkshopFighterGame->ID = 1000; WorkshopFighterGame->EngineDestroyType = true; WorkshopFighterGame->ShowStrength = false; Setup.Profile[CurrentProfile].ShipHullCurrentStrength = WorkshopFighterGame->Strength; Setup.Profile[CurrentProfile].ShipHullUpgrade = 1; // пытаемся купить // 1 - Системы if (EngineSystem != 0) if (Setup.Profile[CurrentProfile].Money >= GetSystemCost(EngineSystem)) { Setup.Profile[CurrentProfile].Money -= GetSystemCost(EngineSystem); Setup.Profile[CurrentProfile].EngineSystem = EngineSystem; } if (PowerSystem != 0) if (Setup.Profile[CurrentProfile].Money >= GetSystemCost(PowerSystem+4)) { Setup.Profile[CurrentProfile].Money -= GetSystemCost(PowerSystem+4); Setup.Profile[CurrentProfile].PowerSystem = PowerSystem; } if (TargetingSystem != 0) if (Setup.Profile[CurrentProfile].Money >= GetSystemCost(TargetingSystem+8)) { Setup.Profile[CurrentProfile].Money -= GetSystemCost(TargetingSystem+8); Setup.Profile[CurrentProfile].TargetingSystem = TargetingSystem; } if (TargetingMechanicSystem != 0) if (Setup.Profile[CurrentProfile].Money >= GetSystemCost(TargetingMechanicSystem+12)) { Setup.Profile[CurrentProfile].Money -= GetSystemCost(TargetingMechanicSystem+12); Setup.Profile[CurrentProfile].TargetingMechanicSystem = TargetingMechanicSystem; } if (AdvancedProtectionSystem != 0) if (Setup.Profile[CurrentProfile].Money >= GetSystemCost(AdvancedProtectionSystem+16)) { Setup.Profile[CurrentProfile].Money -= GetSystemCost(AdvancedProtectionSystem+16); Setup.Profile[CurrentProfile].AdvancedProtectionSystem = AdvancedProtectionSystem; } // покупаем оружие, если можем... нет - ставим что продали его (это сделали ранее) // всегда покупаем новое, т.е. с полным боекомплектом! for (int i=0; i<WorkshopFighterGame->WeaponQuantity; i++) { if (Setup.Profile[CurrentProfile].Weapon[i] != 0) { if (Setup.Profile[CurrentProfile].Money >= GetWeaponBaseCost(Setup.Profile[CurrentProfile].Weapon[i])) { if (SetEarthSpaceFighterWeapon(WorkshopFighterGame, i+1, Setup.Profile[CurrentProfile].Weapon[i])) { if (WorkshopFighterGame->Weapon[i]->Fire != 0) if (WorkshopFighterGame->Weapon[i]->Fire->Light != 0){vw_ReleaseLight(WorkshopFighterGame->Weapon[i]->Fire->Light); WorkshopFighterGame->Weapon[i]->Fire->Light = 0;} Setup.Profile[CurrentProfile].Money -= GetWeaponBaseCost(Setup.Profile[CurrentProfile].Weapon[i]); Setup.Profile[CurrentProfile].WeaponAmmo[i] = WorkshopFighterGame->Weapon[i]->AmmoStart; Setup.Profile[CurrentProfile].WeaponSlotYAngle[i] = 0.0f; } else // если поставить не смогли - не такой слот { Setup.Profile[CurrentProfile].Weapon[i] = 0; Setup.Profile[CurrentProfile].WeaponAmmo[i] = 0; } }// если не хватило денег снова купить else { Setup.Profile[CurrentProfile].Weapon[i] = 0; Setup.Profile[CurrentProfile].WeaponAmmo[i] = 0; } } } // если было больше слотов чем есть сейчас if (OldWeaponQuantity > WorkshopFighterGame->WeaponQuantity) for (int i=0; i<OldWeaponQuantity; i++) if (WorkshopFighterGame->WeaponQuantity <= i) Setup.Profile[CurrentProfile].Weapon[i] = 0; // создаем системы (визуальные) SetEarthSpaceFighterEngine(WorkshopFighterGame, Setup.Profile[CurrentProfile].EngineSystem); if (Setup.Profile[CurrentProfile].AdvancedProtectionSystem == 2) SetEarthSpaceFighterArmour(WorkshopFighterGame, 7); else SetEarthSpaceFighterArmour(WorkshopFighterGame, Setup.Profile[CurrentProfile].ShipHullUpgrade-1); GameNPCArmorPenalty = TMPGameNPCArmorPenalty; WorkshopFighterGame->SetLocation(VECTOR3D(1000,-1000-(WorkshopFighterGame->Height/2.0f + WorkshopFighterGame->AABB[6].y), -(WorkshopFighterGame->Length/2.0f + WorkshopFighterGame->AABB[6].z))); // чтобы оружие заняло свое место... WorkshopFighterGame->Update(vw_GetTime()); WorkshopFighterGame->SetRotation(VECTOR3D(0.0f,150.0f,0.0f)); }
//------------------------------------------------------------------------------------ // инициализация меню //------------------------------------------------------------------------------------ void InitMenu() { CreateCursor(); // установка курсора на центр // получаем размер клиентской области int W, H; vw_GetViewport(0, 0, &W, &H); float AWw = W*1.0f; float AHw = H*1.0f; float ARWidth; float ARHeight; vw_GetAspectWH(&ARWidth, &ARHeight); // установка мышки, чтобы не учитывать перемещения в меню #ifndef USE_GLES SDL_WarpMouse((int)((512.0f+256.0f)/(ARWidth/AWw)), (int)(384.0f/(ARHeight/AHw))); #endif Button1Transp = 1.0f; LastButton1UpdateTime = 0.0f; Button2Transp = 1.0f; LastButton2UpdateTime = 0.0f; Button3Transp = 1.0f; LastButton3UpdateTime = 0.0f; Button4Transp = 1.0f; LastButton4UpdateTime = 0.0f; Button5Transp = 1.0f; LastButton5UpdateTime = 0.0f; Button6Transp = 1.0f; LastButton6UpdateTime = 0.0f; Button7Transp = 1.0f; LastButton7UpdateTime = 0.0f; Button8Transp = 1.0f; LastButton8UpdateTime = 0.0f; Button9Transp = 1.0f; LastButton9UpdateTime = 0.0f; Button10Transp = 1.0f; LastButton10UpdateTime = 0.0f; Button11Transp = 1.0f; LastButton11UpdateTime = 0.0f; Button12Transp = 1.0f; LastButton12UpdateTime = 0.0f; Button13Transp = 1.0f; LastButton13UpdateTime = 0.0f; Button14Transp = 1.0f; LastButton14UpdateTime = 0.0f; LastMenuUpdateTime = 0.0f; MenuContentTransp = 0.0f; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // иним камеру, всегда до работы со скриптом (!!!) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vw_ResizeScene(45.0f, Setup.fAspectRatioWidth/Setup.fAspectRatioHeight, 1.0f, 2000.0f); InitGameCamera(); vw_SetCameraLocation(VECTOR3D(-50,30,-50)); vw_SetCameraMoveAroundPoint(VECTOR3D(0,0,0), 0.0f, VECTOR3D(0.0f, 0.0f, 0.0f)); if (Script != 0){delete Script; Script = 0;} Script = new ScriptEngine; if (Setup.MenuScript > 2) Setup.MenuScript = 0; switch (Setup.MenuScript) { case 0: Script->RunScript("DATA/SCRIPT/menu1.xml", vw_GetTime()); break; case 1: Script->RunScript("DATA/SCRIPT/menu2.xml", vw_GetTime()); break; case 2: Script->RunScript("DATA/SCRIPT/menu3.xml", vw_GetTime()); break; // на всякий случай default: Script->RunScript("DATA/SCRIPT/menu1.xml", vw_GetTime()); break; } Setup.MenuScript ++; // немного прокручиваем скрипт float Time1 = vw_GetTime(); Script->StartTime = Time1-30; Script->TimeLastOp = Time1-30; for (float i=Time1-30; i<Time1;i+=1.0f) { UpdateAllObject3D(i); Script->Update(i); } Script->StartTime = Time1; Script->TimeLastOp = Time1; // активные частицы космоса psSpace = 0; if (psSpace==0) psSpace = new eParticleSystem; psSpace->ColorStart.r = 0.80f; psSpace->ColorStart.g = 0.80f; psSpace->ColorStart.b = 1.00f; psSpace->ColorEnd.r = 0.70f; psSpace->ColorEnd.g = 0.70f; psSpace->ColorEnd.b = 1.00f; psSpace->AlphaStart = 1.00f; psSpace->AlphaEnd = 0.00f; psSpace->SizeStart = 0.10f; psSpace->SizeVar = 0.05f; psSpace->SizeEnd = 0.30f; psSpace->Speed = 4.00f; psSpace->SpeedVar = 8.00f; psSpace->Theta = 0.00f; psSpace->Life = 10.00f; psSpace->LifeVar = 0.00f; psSpace->CreationType = 1; psSpace->CreationSize = VECTOR3D(2.0f,50.0f,30.0f); psSpace->ParticlesPerSec = 140; psSpace->Texture[0] = vw_FindTextureByName("DATA/GFX/flare3.tga"); psSpace->Direction = VECTOR3D(1.0f, 0.0f, 0.0f); psSpace->Resize = 0.1f; psSpace->SetStartLocation(VECTOR3D(-50,10,-20)); // немного "прокручиваем", чтобы сразу по появлению было заполнено float Time = psSpace->TimeLastUpdate; for (float i=Time; i<Time+20;i+=1.0f) { psSpace->Update(i); } psSpace->TimeLastUpdate = Time; LastMenuUpdateTime = vw_GetTime(); NeedShowMenu = true; NeedHideMenu = false; LastMenuOnOffUpdateTime = vw_GetTime(); MenuBlackTransp = 1.0f; NeedOnMenu = true; // подстраховка, если не укажем меню, перейдем в основное GameStatus = MAIN_MENU; DrawGameCursor = true; StarsTileUpdateTime = vw_GetTime(); StarsTileUpdateTime2 = vw_GetTime(); }
//------------------------------------------------------------------------------------ // прорисовка меню //------------------------------------------------------------------------------------ void DrawMenu() { // делаем плавное появление меню if (NeedShowMenu) { MenuContentTransp = 2.4f*(vw_GetTime()-LastMenuUpdateTime); if (MenuContentTransp >= 1.0f) { MenuContentTransp = 1.0f; NeedShowMenu = false; LastMenuUpdateTime = vw_GetTime(); // выводим подсказку, если нужно if (GameStatus == PROFILE) if (Setup.NeedShowHint[0]) SetCurrentDialogBox(9); if (GameStatus == WORKSHOP) { if (CurrentWorkshop == 1) if (Setup.NeedShowHint[1]) SetCurrentDialogBox(10); if (CurrentWorkshop == 2) if (Setup.NeedShowHint[2]) SetCurrentDialogBox(11); if (CurrentWorkshop == 3) if (Setup.NeedShowHint[3]) SetCurrentDialogBox(12); } if (GameStatus == MISSION) { // проверяем, если в одном из профайлов уже открыли 3 миссии - выводим хинт с пожертвованием bool NeedShowDonate = false; for (int i=0; i<5; i++) { if (Setup.Profile[i].Used) if (Setup.Profile[i].ByMissionExperience[2] > 0) NeedShowDonate = true; } if (NeedShowDonate) if (Setup.NeedShowHint[6]) SetCurrentDialogBox(15); } } } // делаем полавное угасание меню if (NeedHideMenu) { MenuContentTransp = 1.0f - 2.4f*(vw_GetTime() - LastMenuUpdateTime); if (MenuContentTransp <= 0.0f) { MenuContentTransp = 0.0f; SetMenu2(NextMenu); LastMenuUpdateTime = vw_GetTime(); NeedShowMenu = true; NeedHideMenu = false; } } vw_SetCameraMoveAroundPoint(VECTOR3D(0,0,0), 0.0f, VECTOR3D(0.0f, 0.0f, 0.0f)); vw_CameraLookAt(); // всегда первым рисуем скайбокс и "далекое" окружение StarSystemUpdate(); StarSystemDraw(1); // рисуем название игры, чтобы звезды и корабли пролетали перед ним vw_Start2DMode(-1,1); // надпись AstroMenace RECT SrcRect, DstRect; SetRect(&SrcRect,0,0,863,128 ); int StartX = (Setup.iAspectRatioWidth - 863)/2; SetRect(&DstRect,StartX,10,StartX+863,10+128); if (GameStatus != WORKSHOP && GameStatus != INFORMATION && GameStatus != INTERFACE && GameStatus != OPTIONS && GameStatus != CONFCONTROL && GameStatus != OPTIONS_ADVANCED) { vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/astromenace.tga"), true, MenuContentTransp, 0.0f, RI_UL_CORNER, 1.0f, 1.0f, 1.0f); } vw_End2DMode(); // рисуем все 3д объекты DrawAllObject3D(1); // после полной прорисовки делаем обновление данных UpdateAllObject3D(vw_GetTime()); vw_UpdateAllParticleSystems(vw_GetTime()); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // работаем со скриптом, пока он есть //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ if (Script != 0) if (!Script->Update(vw_GetTime())) { // удаляем скрипт delete Script; Script = 0; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // переходим в 2д режим для прорисовки всех 2д частей //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vw_Start2DMode(-1,1); switch(GameStatus) { case MAIN_MENU: MainMenu(); break; case TOP_SCORES: TopScoresMenu(); break; case INTERFACE: InterfaceMenu(MenuContentTransp, &Button10Transp, &LastButton10UpdateTime); break; case OPTIONS: OptionsMenu(MenuContentTransp, &Button10Transp, &LastButton10UpdateTime, &Button11Transp, &LastButton11UpdateTime); break; case OPTIONS_ADVANCED: OptionsAdvMenu(MenuContentTransp, &Button10Transp, &LastButton10UpdateTime, &Button11Transp, &LastButton11UpdateTime); break; case INFORMATION: InformationMenu(); break; case CREDITS: CreditsMenu(); break; case CONFCONTROL: ConfControlMenu(MenuContentTransp, &Button10Transp, &LastButton10UpdateTime); break; case PROFILE: ProfileMenu(); break; case DIFFICULTY: DifficultyMenu(); break; case MISSION: MissionMenu(); break; case WORKSHOP: WorkshopMenu(); break; default: break; } //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // последнее - вывод версии и копирайта //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Version vw_DrawFont(6, 740, 0, 0, 1.0f, 1.0f,1.0f,1.0f, 0.99f, "%s %s %s %i", vw_GetText("11_Version"), GAME_VERSION, vw_GetText("11_build"), GAME_BUILD); // Copyright int CSize = vw_FontSize("%s © 2007-2012, Viewizard", vw_GetText("11_Copyright")); vw_DrawFont(Setup.iAspectRatioWidth-7-CSize, 740, 0, 0, 1.0f, 1.0f,1.0f,1.0f, 0.99f, "%s © 2007-2012, Viewizard", vw_GetText("11_Copyright")); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // завершение прорисовки //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ vw_End2DMode(); // если нужно - рисуем в окошке еще одном switch(GameStatus) { case INFORMATION: InformationDrawObject(); break; default: break; } // черное затемнение, если нужно if (NeedOnMenu) { MenuBlackTransp = 1.0f - 2.4f*(vw_GetTime() - LastMenuOnOffUpdateTime); if (MenuBlackTransp <= 0.0f) { MenuBlackTransp = 0.0f; NeedOnMenu = false; LastMenuOnOffUpdateTime = vw_GetTime(); } vw_Start2DMode(-1,1); RECT SrcRect, DstRect; SetRect(&SrcRect,0,0,2,2); SetRect(&DstRect,0,0,Setup.iAspectRatioWidth,768); vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/blackpoint.tga"), true, MenuBlackTransp); vw_End2DMode(); } // черное затемнение, если нужно if (NeedOffMenu) { MenuBlackTransp = 2.4f*(vw_GetTime() - LastMenuOnOffUpdateTime); if (MenuBlackTransp >= 1.0f) { MenuBlackTransp = 1.0f; NeedOffMenu = false; LastMenuOnOffUpdateTime = vw_GetTime(); // переход на игру WorkshopDestroyData(); ComBuffer = GAME; } vw_Start2DMode(-1,1); RECT SrcRect, DstRect; SetRect(&SrcRect,0,0,2,2); SetRect(&DstRect,0,0,Setup.iAspectRatioWidth,768); vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/blackpoint.tga"), true, MenuBlackTransp); vw_End2DMode(); } }
void SetMenu(eGameStatus Menu) { Audio_PlaySound2D(3,1.0f); switch (Menu) { case PROFILE: NewProfileNamePos = 0; memset(NewProfileName, 0, sizeof(NewProfileName)); break; case OPTIONS: case OPTIONS_ADVANCED: case CONFCONTROL: SetOptionsMenu(Menu); break; case TOP_SCORES: // копируем исходные данные for (int i=0; i<10; i++) { strcpy(GameName[i], Setup.TopScores[i].Name); GameScore[i] = Setup.TopScores[i].Score; } // проверяем профайлы for (int j=0; j<5; j++) if (Setup.Profile[j].Used) { AddTopScores(Setup.Profile[j].Experience, Setup.Profile[j].Name, true); } break; case MISSION: vw_ResetWheelStatus(); // ставим нужный лист миссий StartMission = 0; EndMission = 4; if (CurrentMission != -1) if (CurrentMission > 2)// нужно сдвинуть лист, чтобы выбранный элемент был по середине списка { StartMission = CurrentMission-2; EndMission = CurrentMission+2; if (CurrentMission >= AllMission-2) { StartMission = AllMission-5; EndMission = AllMission-1; } } break; case INFORMATION: vw_ResetWheelStatus(); CreateNum = 1; CreateInfoObject(); break; case CREDITS: CreditsCurrentPos = 0.0f; LastCreditsCurrentPosUpdateTime = vw_GetTime(); break; default: break; } NextMenu = Menu; // прячем текущее меню NeedShowMenu = false; NeedHideMenu = true; LastMenuUpdateTime = vw_GetTime(); }
//------------------------------------------------------------------------------------ // прорисовка кнопки 384 //------------------------------------------------------------------------------------ bool DrawButton384(int X, int Y, const char *Text, float Transp, float *ButTransp, float *Update) { RECT SrcRect, DstRect; bool ON = false; bool CanClick = false; float IntTransp = Transp; // работаем с клавиатурой if ((Transp >= 0.99f) && !isDialogBoxDrawing() && DrawGameCursor) CurrentActiveMenuElement++; bool InFocusByKeyboard = false; if (CurrentKeyboardSelectMenuElement > 0) { if (CurrentKeyboardSelectMenuElement == CurrentActiveMenuElement) { InFocusByKeyboard = true; } } SetRect(&DstRect,X+2,Y+1,X+384,Y+63); if ((vw_OnRect(&DstRect) || InFocusByKeyboard) && !isDialogBoxDrawing() && DrawGameCursor) { // если тухнем или появляемся - не жать ON = true; if (Transp==1.0f) { CanClick = true; CurrentCursorStatus = 1; } if (*ButTransp == 1.0f) { Audio_PlaySound2D(1,1.0f); *Update = vw_GetTime(); *ButTransp = 0.99f; } (*ButTransp) -= 3.0f*(vw_GetTime() - (*Update)); if (*ButTransp < 0.60f) *ButTransp = 0.60f; *Update = vw_GetTime(); IntTransp = (*ButTransp) * Transp; } else { if (*ButTransp < 1.0f) { (*ButTransp) += 3.0f*(vw_GetTime() - (*Update)); if (*ButTransp > 1.0f) *ButTransp =1.0f; *Update = vw_GetTime(); } IntTransp = (*ButTransp) * Transp; } // размер задней тени SetRect(&SrcRect,2,2,512-2,96-2 ); // рисуем тень SetRect(&DstRect,X-64+2,Y-17+2,X-64+512-2,Y-17+96-2); vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/button384_back.tga"), true, IntTransp, 0.0f, RI_UL_CORNER, 1.0f, 1.0f, 1.0f); SetRect(&SrcRect,0,0,384,64 ); // рисуем кнопку SetRect(&DstRect,X,Y,X+384,Y+64); if (!ON) vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/button384_out.tga"), true, Transp); else vw_DrawTransparent(&DstRect, &SrcRect, vw_FindTextureByName("DATA/MENU/button384_in.tga"), true, Transp); // получаем длину текста int Size = vw_FontSize(Text); // если текст сильно большой - сжимаем буквы, чтобы не вылазило за пределы кнопки float WScale = 0; if (Size > 310) { Size = 310; WScale = -310; } // находим смещение текста int SizeI = X + (SrcRect.right-SrcRect.left-Size)/2; // рисуем текст if (!ON) vw_DrawFont(SizeI, Y+21, WScale, 0, 1.0f, 1.0f,1.0f,1.0f, (0.7f*Transp)/2.0f, Text); else vw_DrawFont(SizeI, Y+21, WScale, 0, 1.0f, 1.0f,1.0f,1.0f, Transp, Text); if (CanClick) if (vw_GetWindowLBMouse(true) || (InFocusByKeyboard && (vw_GetKeys(SDLK_KP_ENTER) || vw_GetKeys(SDLK_RETURN)))) { Audio_PlaySound2D(2,1.0f); if (InFocusByKeyboard) { vw_SetKeys(SDLK_KP_ENTER, false); vw_SetKeys(SDLK_RETURN, false); } return true; } return false; }