#include "sea_ai\Script_defines.h" #include "sea_ai\SeaPeople.h" #include "sea_ai\AIGroup.c" #include "sea_ai\AIShip.c" #include "sea_ai\AIFort.c" #include "sea_ai\AISea.c" #include "sea_ai\AICameras.c" #include "sea_ai\AIAbordage.c" #include "sea_ai\AIFantom.c" #include "sea_ai\AICannon.c" #include "sea_ai\AIBalls.c" #include "sea_ai\AIIsland.c" #include "sea_ai\AISeaGoods.c" #include "sea_ai\AITasks\AITasks.c" #include "sea_ai\ShipBortFire.c" #include "sea_ai\ShipDead.c" #include "sea_ai\ShipWalk.c" #include "sea_ai\Telescope.c" #include "battle_interface\BattleInterface.c" #event_handler("Sea_FirstInit", "Sea_FirstInit"); #define PLAYER_GROUP "OurGroup" string sCurrentSeaExecute = "execute"; string sCurrentSeaRealize = "realize"; int iAITemplatesNum; bool bSeaActive; bool bSkipSeaLogin = false; bool bIslandLoaded = false; bool bSeaReloadStarted = false; bool bNotEnoughBalls; bool bStorm, bTornado; bool bSeaQuestGroupHere = false; int iStormLockSeconds = 0; object Island, IslandReflModel; object Touch, AISea; object SeaFader; object Seafoam, BallSplash, SinkEffect, PeopleOnShip, Telescope, SeaOperator, Artifact; object Sharks; object SeaLighter; object SeaLocatorShow; object LoginGroupsNow; bool bSeaShowLocators = true; bool bQuestDisableMapEnter = false; bool bFromCoast = false; float SeaMapLoadX = -1570.99; float SeaMapLoadZ = 950.812; float SeaMapLoadAY = 10.54; float fSeaExp = 0.0; float fSeaExpTimer = 0.0; void DeleteSeaEnvironment() { ref rPlayer = GetMainCharacter(); StopMusic(); bSeaActive = false; sCurrentSeaExecute = "execute"; sCurrentSeaRealize = "realize"; rPlayer.Ship.Stopped = true; DeleteBattleInterface(); DelEventHandler(SHIP_BORT_FIRE, "Ship_BortFire"); DelEventHandler(BALL_FLY_UPDATE, "Ball_OnFlyUpdate"); SendMessage(&AISea, "l", AI_MESSAGE_UNLOAD); DeleteSea(); DeleteClass(&Island); DeleteClass(&IslandReflModel); DeleteClass(&Touch); DeleteClass(&Seafoam); DeleteClass(&BallSplash); DeleteClass(&SinkEffect); DeleteClass(&PeopleOnShip); DeleteClass(&SeaLocatorShow); DeleteClass(&SeaOperator); DeleteClass(&Telescope); DeleteClass(&Sharks); DeleteClass(&SeaLighter); if (IsEntity(&Artifact)) DeleteClass(&Artifact); DeleteBallsEnvironment(); DeleteCannonsEnvironment(); DeleteSeaCamerasEnvironment(); DeleteShipEnvironment(); DeleteFortEnvironment(); DeleteAbordageEnvironment(); DeleteSeaGoodsEnvironment(); DeleteWeatherEnvironment(); DeleteAttribute(&AISea,""); LayerFreeze(SEA_EXECUTE, true); LayerFreeze(SEA_REALIZE, true); LayerFreeze("realize", false); LayerFreeze("execute", false); DeleteClass(&AISea); DeleteAnimals(); // delete masts fall modules DeleteEntitiesByType("mast"); // delete particle system DeleteParticles(); // delete our group Group_DeleteGroup(PLAYER_GROUP); // delete fantom and dead groups Group_DeleteUnusedGroup(); // LanguageCloseFile(iSeaSectionLang); // Encounter_DeleteDeadQuestMapEncounters(); } void CreateSeaEnvironment() { sCurrentSeaExecute = SEA_EXECUTE; sCurrentSeaRealize = SEA_REALIZE; iSeaSectionLang = LanguageOpenFile("SeaSection.txt"); CreateParticleEntity(); Ship_Walk_Init(); LayerFreeze("realize", true); LayerFreeze("execute", true); LayerCreate("sea_reflection", 1); LayerFreeze("sea_reflection", false); InterfaceStates.Buttons.Resume.enable = true; bSeaActive = true; LayerCreate(SEA_REALIZE, 1); LayerSetRealize(SEA_REALIZE, 1); LayerCreate(SEA_EXECUTE, 1); LayerSetExecute(SEA_EXECUTE, 1); LayerFreeze(SEA_EXECUTE, false); LayerFreeze(SEA_REALIZE, false); CreateSea(SEA_EXECUTE, SEA_REALIZE); ReloadProgressUpdate(); CreateWeather(SEA_EXECUTE, SEA_REALIZE); ReloadProgressUpdate(); CreateEntity(&AISea, "sea_ai"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &AISea, 1); LayerAddObject(SEA_REALIZE, &AISea, -1); CreateEntity(&Touch, "touch"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &Touch, 1); Touch.CollisionDepth = -10.0; //LayerAddObject(SEA_REALIZE, &Touch, -1); // for collision debug CreateEntity(&BallSplash, "BallSplash"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &BallSplash, -1); LayerAddObject(SEA_REALIZE, &BallSplash, 65535); CreateEntity(&SinkEffect, "SINKEFFECT"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &SinkEffect, 65531); LayerAddObject(SEA_REALIZE, &SinkEffect, 65531); CreateEntity(&PeopleOnShip, "PEOPLE_ON_SHIP"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &PeopleOnShip, 100); LayerAddObject(SEA_REALIZE, &PeopleOnShip, 100); CreateEntity(&SeaLocatorShow, "SeaLocatorShow"); ReloadProgressUpdate(); LayerAddObject(SEA_REALIZE, &SeaLocatorShow, -1); CreateEntity(&Telescope, "TELESCOPE"); ReloadProgressUpdate(); LayerAddObject(SEA_EXECUTE, &Telescope, -1); LayerAddObject(SEA_REALIZE, &Telescope, -3); TelescopeInitParameters(&Telescope); CreateSeaAnimals(); ReloadProgressUpdate(); // create all other environment CreateBallsEnvironment(); ReloadProgressUpdate(); CreateCannonsEnvironment(); ReloadProgressUpdate(); CreateSeaCamerasEnvironment(); ReloadProgressUpdate(); CreateShipEnvironment(); ReloadProgressUpdate(); CreateFortEnvironment(); ReloadProgressUpdate(); CreateAbordageEnvironment(); ReloadProgressUpdate(); CreateSeaGoodsEnvironment(); ReloadProgressUpdate(); SetEventHandler(SHIP_CREATE, "Ship_Walk_Create", 0); SetEventHandler("MSG_TELESCOPE_REQUEST", "Telescope_Request", 0); SetEventHandler(SHIP_BORT_FIRE, "Ship_BortFire", 0); bNotEnoughBalls = false; Sharks.execute = SEA_EXECUTE; Sharks.realize = SEA_REALIZE; Sharks.executeModels = 75; Sharks.realizeModels = 75; Sharks.executeParticles = 78; Sharks.realizeParticles = 100001; CreateEntity(&Sharks, "Sharks"); ReloadProgressUpdate(); PeopleOnShip.isNight = Whr_IsNight(); } void Sea_LandLoad() { bSeaReloadStarted = true; PauseAllSounds(); ResetSoundScheme(); if (bSeaActive == false) return; if (bCanEnterToLand == true) { LayerFreeze("realize", false); LayerFreeze("execute", false); Reload(arIslandReload, sIslandLocator, sIslandID); } } void Sea_MapStartFade() { DelEventHandler("FaderEvent_StartFade", "Sea_MapStartFade"); DeleteSeaEnvironment(); } void Sea_MapEndFade() { DelEventHandler("FaderEvent_EndFade", "Sea_MapEndFade"); wdmCreateMap(SeaMapLoadX, SeaMapLoadZ, SeaMapLoadAY); } void Sea_MapLoadXZ_AY(float x, float z, float ay) { Sea_MapLoad(); SeaMapLoadX = x; SeaMapLoadZ = z; SeaMapLoadAY = ay; } void Sea_MapLoad() { bSeaReloadStarted = true; PauseAllSounds(); ResetSoundScheme(); SetEventHandler("FaderEvent_StartFade", "Sea_MapStartFade", 0); SetEventHandler("FaderEvent_EndFade", "Sea_MapEndFade", 0); CreateEntity(&SeaFader, "fader"); SendMessage(&SeaFader, "lfl", FADER_OUT, 0.7, true); SendMessage(&SeaFader, "l", FADER_STARTFRAME); SendMessage(&SeaFader, "ls", FADER_PICTURE, "loading\sea.tga"); bSkipSeaLogin = true; ref rPlayer = GetMainCharacter(); SeaMapLoadX = stf(rPlayer.Ship.Pos.x); SeaMapLoadZ = stf(rPlayer.Ship.Pos.z); SeaMapLoadAY = stf(rPlayer.Ship.Ang.y); } string sTaskList[2]; void Sea_FreeTaskList() { ref rMassive; makeref(rMassive, sTaskList); SetArraySize(rMassive, 2); } void Sea_AddGroup2TaskList(string sGroupID) { ref rMassive; makeref(rMassive, sTaskList); int iSize = GetArraySize(rMassive); SetArraySize(rMassive, iSize + 1); sTaskList[iSize-2] = sGroupID; } void Sea_LoginGroupNow(string sGroupID) { LoginGroupsNow.QuestGroups = ""; aref arGroups; makearef(arGroups, LoginGroupsNow.QuestGroups); string sID = "n" + GetAttributesNum(arGroups); arGroups.(sID) = sGroupID; } void SeaLogin(ref Login) { int i, j, iShipType; float x, y, z, ay; ref rCharacter, rGroup, rEncounter; aref rRawGroup; aref arQCGroups; string sGName; int iNumQCGroups; int iRDTSC = RDTSC_B(); // clear load groups now object DeleteAttribute(&LoginGroupsNow, ""); iStormLockSeconds = 0; iNumFantoms = 0; bSkipSeaLogin = false; bSeaReloadStarted = false; bSeaQuestGroupHere = false; bIslandLoaded = false; fSeaExp = 0.0; fSeaExpTimer = 0.0; Sea_FreeTaskList(); Encounter_DeleteDeadQuestMapEncounters(); // weather parameters WeatherParams.Tornado = false; WeatherParams.Storm = false; if (CheckAttribute(&Login,"Storm")) { WeatherParams.Storm = Login.Storm; } if (CheckAttribute(&Login,"Tornado")) { WeatherParams.Tornado = Login.Tornado; } bStorm = sti(WeatherParams.Storm); bTornado = sti(WeatherParams.Tornado); if (bStorm) { iStormLockSeconds = 60; } // Island int iIslandIndex = FindIsland(Login.Island); //Trace("Island id = " + Login.Island + ", Island index = " + iIslandIndex); string sIslandID = ""; if (iIslandIndex != -1) { sIslandID = Islands[iIslandIndex].id; } // main character ref rPlayer = GetMainCharacter(); rPlayer.Ship.Stopped = false; rPlayer.Ship.POS.Mode = SHIP_SAIL; rPlayer.location = sIslandID; // clear old fantom relations in our character if (CheckAttribute(rPlayer, "Relation")) { aref arRelations; makearef(arRelations, rPlayer.Relation); int iNumRelations = GetAttributesNum(arRelations); for (i=0; i= FANTOM_CHARACTERS) { DeleteAttribute(arRelations, sRName); iNumRelations--; i--; } } } // Quest check Event(EVENT_SEA_LOGIN, ""); if (bSkipSeaLogin) return; // Sea Fader start if (!CheckAttribute(&Login,"ImageName")) { Login.ImageName = "loading\sea.tga"; } CreateEntity(&SeaFader, "fader"); SendMessage(&SeaFader, "lfl", FADER_IN, 0.5, true); SendMessage(&SeaFader, "ls", FADER_PICTURE0, Login.ImageName); // create all sea modules CreateSeaEnvironment(); // delete our group Group_DeleteGroup(PLAYER_GROUP); // set commander to group Group_SetGroupCommander(PLAYER_GROUP, Characters[GetMainCharacterIndex()].id); // set our group position Group_SetXZ_AY(PLAYER_GROUP, stf(Login.PlayerGroup.x), stf(Login.PlayerGroup.z), stf(Login.PlayerGroup.ay) ); //Trace("Set group : " + PLAYER_GROUP + ", x = " + Login.PlayerGroup.x + ", z = " + Login.PlayerGroup.z + ", ay = " + Login.PlayerGroup.ay); Sea.MaxSeaHeight = 50.0; ReloadProgressUpdate(); // login island if exist if (sIslandID != "") { CreateEntity(&Island, "Island"); Island.LightingPath = GetLightingPath(); if (GetTargetPlatform() != "xbox") { CreateEntity(&SeaLighter, "lighter"); SendMessage(&SeaLighter, "ss", "ModelsPath", Islands[iIslandIndex].filespath.models); SendMessage(&SeaLighter, "ss", "LightPath", GetLightingPath()); } SendMessage(&Island, "lsss", MSG_ISLAND_LOAD_GEO, "islands", Islands[iIslandIndex].filespath.models, Islands[iIslandIndex].model); LayerAddObject(SEA_REALIZE, &Island, 65529); LayerAddObject("mast_island_trace", &Island, 1); LayerAddObject("sun_trace", &Island, 1); CreateEntity(&IslandReflModel, "MODELR"); string sReflModel = Islands[iIslandIndex].filespath.models + "\" + Islands[iIslandIndex].refl_model; SendMessage(&IslandReflModel, "ls", MSG_MODEL_SET_LIGHT_PATH, GetLightingPath()); SendMessage(&IslandReflModel, "ls", MSG_MODEL_LOAD_GEO, sReflModel); LayerAddObject("sea_reflection", &IslandReflModel, -1); SendMessage(SeaLighter, "ssi", "AddModel", Islands[iIslandIndex].refl_model, &IslandReflModel); bIslandLoaded = true; SendMessage(&SeaLocatorShow, "a", &Islands[iIslandIndex]); Fort_Login(iIslandIndex); Sea.MaxSeaHeight = 3.0; } AISea.Island = sIslandID; // clear some of group attributes for (i=0; i