Esempio n. 1
0
 public void ReceiveHouse(PlayerEntity playerEntity)
 {
     if (rank < 9)
     {
         DaggerfallUI.MessageBox(NoHouseId);
     }
     else if ((flags & HouseFlagMask) > 0)
     {
         DaggerfallUI.MessageBox(HardStrings.serviceReceiveHouseAlready);
     }
     else
     {   // Give a house if one availiable
         if (DaggerfallBankManager.OwnsHouse)
         {
             DaggerfallUI.MessageBox((int)TransactionResult.ALREADY_OWN_HOUSE);
         }
         else
         {
             BuildingDirectory buildingDirectory = GameManager.Instance.StreamingWorld.GetCurrentBuildingDirectory();
             if (buildingDirectory)
             {
                 List <BuildingSummary> housesForSale = buildingDirectory.GetHousesForSale();
                 if (housesForSale.Count > 0)
                 {
                     BuildingSummary house = housesForSale[UnityEngine.Random.Range(0, housesForSale.Count)];
                     DaggerfallBankManager.AllocateHouseToPlayer(house, GameManager.Instance.PlayerGPS.CurrentRegionIndex);
                     flags = flags | HouseFlagMask;
                     DaggerfallUI.MessageBox(HouseId);
                     return;
                 }
             }
             DaggerfallUI.MessageBox((int)TransactionResult.NO_HOUSES_FOR_SALE);
         }
     }
 }
Esempio n. 2
0
        /// <summary>
        /// Gets BuildingSummary array generated from DFBlock data.
        /// </summary>
        /// <param name="blockData"></param>
        /// <returns></returns>
        public static BuildingSummary[] GetBuildingData(DFBlock blockData)
        {
            // Store building information
            int buildingCount = blockData.RmbBlock.SubRecords.Length;

            BuildingSummary[] buildings = new BuildingSummary[buildingCount];
            for (int i = 0; i < buildingCount; i++)
            {
                // Create building summary
                buildings[i] = new BuildingSummary();

                // Set building data
                DFLocation.BuildingData buildingData = blockData.RmbBlock.FldHeader.BuildingDataList[i];
                buildings[i].NameSeed     = buildingData.NameSeed;
                buildings[i].FactionId    = buildingData.FactionId;
                buildings[i].LocationId   = buildingData.LocationId;
                buildings[i].BuildingType = buildingData.BuildingType;
                buildings[i].Quality      = buildingData.Quality;

                // Set building transform info
                DFBlock.RmbSubRecord subRecord = blockData.RmbBlock.SubRecords[i];
                buildings[i].Position = new Vector3(subRecord.XPos, 0, BlocksFile.RMBDimension - subRecord.ZPos) * MeshReader.GlobalScale;
                buildings[i].Rotation = new Vector3(0, -subRecord.YRotation / BlocksFile.RotationDivisor, 0);
                buildings[i].Matrix   = Matrix4x4.TRS(buildings[i].Position, Quaternion.Euler(buildings[i].Rotation), Vector3.one);
            }

            return(buildings);
        }
Esempio n. 3
0
        /// <summary>
        /// Gets BuildingSummary array generated from DFBlock data.
        /// DFBlock data should be provided from RMBLayout.GetLocationBuildingData() output.
        /// Otherwise not all building data will be present.
        /// </summary>
        /// <param name="blockData">DFBlock data.</param>
        /// <param name="layoutX">X coordindate in map layout used to generate building key.</param>
        /// <param name="layoutY">Y coordindate in map layout used to generate building key.</param>
        /// <returns>BuildingSummary.</returns>
        public static BuildingSummary[] GetBuildingData(DFBlock blockData, int layoutX = -1, int layoutY = -1)
        {
            // Store building information
            int buildingCount = blockData.RmbBlock.SubRecords.Length;

            BuildingSummary[] buildings = new BuildingSummary[buildingCount];
            for (int i = 0; i < buildingCount; i++)
            {
                // Create building summary
                buildings[i] = new BuildingSummary();

                // Set building data
                DFLocation.BuildingData buildingData = blockData.RmbBlock.FldHeader.BuildingDataList[i];
                buildings[i].buildingKey  = BuildingDirectory.MakeBuildingKey((byte)layoutX, (byte)layoutY, (byte)i);
                buildings[i].NameSeed     = buildingData.NameSeed;
                buildings[i].FactionId    = buildingData.FactionId;
                buildings[i].BuildingType = buildingData.BuildingType;
                buildings[i].Quality      = buildingData.Quality;

                // Set building transform info
                DFBlock.RmbSubRecord subRecord = blockData.RmbBlock.SubRecords[i];
                buildings[i].Position = new Vector3(subRecord.XPos, 0, BlocksFile.RMBDimension - subRecord.ZPos) * MeshReader.GlobalScale;
                buildings[i].Rotation = new Vector3(0, -subRecord.YRotation / BlocksFile.RotationDivisor, 0);
                buildings[i].Matrix   = Matrix4x4.TRS(buildings[i].Position, Quaternion.Euler(buildings[i].Rotation), Vector3.one);

                // First model of record is building model
                if (subRecord.Exterior.Block3dObjectRecords.Length > 0)
                {
                    buildings[i].ModelID = subRecord.Exterior.Block3dObjectRecords[0].ModelIdNum;
                }
            }

            return(buildings);
        }
Esempio n. 4
0
        public static int GetHousePrice(BuildingSummary house)
        {
            // Get model data and radius which defines price
            ModelData modelData;

            DaggerfallUnity.Instance.MeshReader.GetModelData(house.ModelID, out modelData);
            float houseRadius = modelData.DFMesh.Radius;

            return((int)(houseRadius * housePriceMult));
        }
Esempio n. 5
0
        /// <summary>
        /// Gets building summary.
        /// </summary>
        /// <param name="key">Building key.</param>
        /// <param name="buildingSummaryOut">Building summary out.</param>
        /// <returns>True if lookup successful.</returns>
        public bool GetBuildingSummary(int key, out BuildingSummary buildingSummaryOut)
        {
            if (!buildingDict.ContainsKey(key))
            {
                buildingSummaryOut = new BuildingSummary();
                return(false);
            }

            buildingSummaryOut = buildingDict[key];

            return(true);
        }
Esempio n. 6
0
        public static void AllocateHouseToPlayer(BuildingSummary house, int regionIndex)
        {
            // Set player owned house for this region
            DFLocation location = GameManager.Instance.PlayerGPS.CurrentLocation;
            int        mapID    = location.MapTableData.MapId;

            houses[regionIndex].location    = location.Name;
            houses[regionIndex].mapID       = mapID;
            houses[regionIndex].buildingKey = house.buildingKey;

            // Ensure building is discovered
            GameManager.Instance.PlayerGPS.DiscoverBuilding(house.buildingKey);

            // Add interior scene to permanent list
            SaveLoadManager.StateManager.AddPermanentScene(DaggerfallInterior.GetSceneName(mapID, house.buildingKey));
        }
Esempio n. 7
0
        public static int GetHousePrice(BuildingSummary house)
        {
            // Get model data and radius which defines price
            ModelData modelData;

            DaggerfallUnity.Instance.MeshReader.GetModelData(house.ModelID, out modelData);
            PlayerEntity player          = GameManager.Instance.PlayerEntity;
            float        playerPers      = ((player.Stats.LivePersonality - 50) * .001f) * -1;
            float        playerWill      = ((player.Stats.LiveWillpower - 50) * .0005f) * -1; // 9% difference positive or negative total.
            float        playerLuck      = ((player.Stats.LiveLuck - 50) * .0003f) * -1;
            float        mercantileValue = (player.Skills.GetLiveSkillValue(DFCareer.Skills.Mercantile) * .0012f) * -1;
            float        etiquetteValue  = (player.Skills.GetLiveSkillValue(DFCareer.Skills.Etiquette) * .0002f) * -1;                    // 16% difference positive or negative total.
            float        streetwiseValue = (player.Skills.GetLiveSkillValue(DFCareer.Skills.Streetwise) * .0002f) * -1;
            float        playerPriceMod  = playerPers + playerWill + playerLuck + mercantileValue + etiquetteValue + streetwiseValue + 1; // Overall Maximum increase or decrease is 25% for house price.
            float        houseRadius     = modelData.DFMesh.Radius;                                                                       // So first change I may as well make is having player stats and skills have some effect on the price of purchasing and selling property, not a huge effect, but something to simulate haggling or negotiation of some sort, possibly for boats as well. Thinking Personality, Luck, Mercantile, and maybe some Etiquete and Streetwise.

            return((int)Mathf.Round((houseRadius * housePriceMult) * playerPriceMod));
        }
        public static void AllocateHouseToPlayer(BuildingSummary house, int regionIndex)
        {
            // Set player owned house for this region
            DFLocation location = GameManager.Instance.PlayerGPS.CurrentLocation;
            int        mapID    = location.MapTableData.MapId;

            houses[regionIndex].location    = location.Name;
            houses[regionIndex].mapID       = mapID;
            houses[regionIndex].buildingKey = house.buildingKey;

            // Ensure building is discovered
            GameManager.Instance.PlayerGPS.DiscoverBuilding(house.buildingKey);

            // Add interior scene to permanent list
            SaveLoadManager.StateManager.AddPermanentScene(DaggerfallInterior.GetSceneName(mapID, house.buildingKey));

            // Add note to journal
            GameManager.Instance.PlayerEntity.Notebook.AddNote(
                TextManager.Instance.GetText("DaggerfallUI", "houseDeed").Replace("%town", location.Name).Replace("%region", MapsFile.RegionNames[regionIndex]));
        }
        private void Display3dModelSelection(int selectedIdx)
        {
            if (goModel)
            {
                Object.Destroy(goModel);
                goModel = null;
            }

            // Position camera and set model id
            uint modelId = 0;

            if (housesForSale == null)
            {
                camera.transform.position = new Vector3(0, 12, DaggerfallBankManager.GetShipCameraDist((ShipType)selectedIdx));
                modelId = DaggerfallBankManager.GetShipModelId((ShipType)selectedIdx);
            }
            else
            {
                camera.transform.position = new Vector3(0, 3, -20);
                BuildingSummary house = housesForSale[selectedIdx];
                modelId = house.ModelID;
            }

            // Inject custom GameObject if available else create standard mesh game object for the model
            goModel = MeshReplacement.ImportCustomGameobject(modelId, goBankPurchase.transform, new Matrix4x4());
            if (goModel == null)
            {
                goModel = GameObjectHelper.CreateDaggerfallMeshGameObject(modelId, goBankPurchase.transform);
            }

            goModel.layer = layer;

            // Apply current climate
            ClimateBases   climateBase = ClimateSwaps.FromAPIClimateBase(GameManager.Instance.PlayerGPS.ClimateSettings.ClimateType);
            ClimateSeason  season      = (DaggerfallUnity.WorldTime.Now.SeasonValue == DaggerfallDateTime.Seasons.Winter) ? ClimateSeason.Winter : ClimateSeason.Summer;
            DaggerfallMesh dfMesh      = goModel.GetComponent <DaggerfallMesh>();

            dfMesh.SetClimate(climateBase, season, WindowStyle.Day);
        }
Esempio n. 10
0
        // Check if non-house building is unlocked and enterable
        private bool BuildingIsUnlocked(BuildingSummary buildingSummary)
        {
            bool unlocked = false;

            DFLocation.BuildingTypes type = buildingSummary.BuildingType;

            // TODO: Guild structures can become unlocked 24hr depending on player rank

            // Handle House1 through House4
            // TODO: Figure out the rest of house door calculations.
            if (type >= DFLocation.BuildingTypes.House1 && type <= DFLocation.BuildingTypes.House4 &&
                DaggerfallUnity.Instance.WorldTime.Now.IsDay)
            {
                unlocked = true;
            }
            // Handle other structures (stores, temples, taverns, palaces)
            else if (type <= DFLocation.BuildingTypes.Palace)
            {
                unlocked = (openHours[(int)type] <= DaggerfallUnity.Instance.WorldTime.Now.Hour &&
                            closeHours[(int)type] > DaggerfallUnity.Instance.WorldTime.Now.Hour);
            }
            return(unlocked);
        }
Esempio n. 11
0
        public static TransactionResult PurchaseHouse(BuildingSummary house, int regionIndex)
        {
            if (house.buildingKey < 1)
            {
                return(TransactionResult.NONE);
            }

            int          amount       = GetHousePrice(house);
            PlayerEntity playerEntity = GameManager.Instance.PlayerEntity;
            var          playerGold   = playerEntity.GetGoldAmount();
            var          accountGold  = BankAccounts[regionIndex].accountGold;

            if (amount > playerGold + accountGold)
            {
                return(TransactionResult.NOT_ENOUGH_GOLD);
            }

            amount = playerEntity.DeductGoldAmount(amount);
            bankAccounts[regionIndex].accountGold -= amount;

            AllocateHouseToPlayer(house, regionIndex);

            return(TransactionResult.PURCHASED_HOUSE);
        }
        public static TransactionResult PurchaseHouse(BuildingSummary house, int regionIndex)
        {
            if (house.buildingKey < 1)
            {
                return(TransactionResult.NONE);
            }

            int          amount       = GetHousePrice(house);
            PlayerEntity playerEntity = GameManager.Instance.PlayerEntity;
            var          playerGold   = playerEntity.GetGoldAmount();
            var          accountGold  = BankAccounts[regionIndex].accountGold;

            if (amount > playerGold + accountGold)
            {
                return(TransactionResult.NOT_ENOUGH_GOLD);
            }

            amount = playerEntity.DeductGoldAmount(amount);
            bankAccounts[regionIndex].accountGold -= amount;

            // Set player owned house for this region
            DFLocation location = GameManager.Instance.PlayerGPS.CurrentLocation;
            int        mapID    = location.MapTableData.MapId;

            houses[regionIndex].location    = location.Name;
            houses[regionIndex].mapID       = mapID;
            houses[regionIndex].buildingKey = house.buildingKey;

            // Ensure building is discovered
            GameManager.Instance.PlayerGPS.DiscoverBuilding(house.buildingKey);

            // Add interior scene to permanent list
            SaveLoadManager.StateManager.AddPermanentScene(DaggerfallInterior.GetSceneName(mapID, house.buildingKey));

            return(TransactionResult.PURCHASED_HOUSE);
        }
Esempio n. 13
0
 public static int GetHouseSellPrice(BuildingSummary house)
 {
     return((int)(GetHousePrice(house) * deedSellMult));
 }
 public void GeneratePurchaseHousePopup(BuildingSummary house)
 {
     GeneratePopup(DaggerfallBankManager.PurchaseHouse(house, regionIndex));
 }
        public void UpdateMarkers(bool RemoveMarkersOnly = false)
        {
            foreach (GameObject marker in buildingInfoCollection)
            {
                if (marker.GetComponent <BuildingMarker>() != null)
                {
                    BuildingMarker markerInstance = marker.GetComponent <BuildingMarker>();
                    Destroy(markerInstance.marker.attachedDoorIcon);
                    Destroy(markerInstance.marker.attachedLabel);
                    Destroy(markerInstance.marker.attachedMesh);
                    Destroy(markerInstance.marker.attachedQuestIcon);
                    Destroy(markerInstance.marker.attachedIcon);
                    Destroy(markerInstance);
                }
                if (marker != null)
                {
                    Destroy(marker);
                }
            }
            buildingInfoCollection.Clear();
            buildingInfoCollection = new List <GameObject>();

            if (RemoveMarkersOnly)
            {
                return;
            }

            generatingMarkers = true;

            //Vector3 position = currentCityNav.WorldToScenePosition(new DFPosition(Minimap.currentLocation.Summary.MapPixelX, Minimap.currentLocation.Summary.MapPixelX), true);
            List <BuildingSummary> housesForSaleList = buildingDirectory.GetHousesForSale();

            foreach (DaggerfallRMBBlock block in blockArray)
            {
                Vector3 blockPosition = block.transform.position;
                //setup a new static buildings object to hold the rmb blocks static buildings object.
                DaggerfallStaticBuildings staticBuildingContainer = block.GetComponentInChildren <DaggerfallStaticBuildings>();

                //if there are not any buildings in this block, stop code from crashing script and return.
                if (staticBuildingContainer == null)
                {
                    continue;
                }

                //resize static building array based on the number of static building pbjects in the container.
                StaticBuildingArray = new StaticBuilding[staticBuildingContainer.transform.childCount];
                //load blocks static building array into the empty array for looping through.
                StaticBuildingArray = staticBuildingContainer.Buildings;

                // Find the doors for the buildings and drop into a list for referencing below when setting up individual building information.
                StaticDoor[]           doors         = DaggerfallStaticDoors.FindDoorsInCollections(GameManager.Instance.StreamingWorld.CurrentPlayerLocationObject.StaticDoorCollections, DoorTypes.Building);
                List <CombineInstance> houseMeshList = new List <CombineInstance>();
                //runs through building array.
                foreach (StaticBuilding building in StaticBuildingArray)
                {
                    //sets up and grabes the current buildings material, summary object/info, placing/final position, game model.
                    BuildingSummary SavedBuilding = new BuildingSummary();
                    buildingDirectory.GetBuildingSummary(building.buildingKey, out SavedBuilding);

                    if (SavedBuilding.BuildingType == DFLocation.BuildingTypes.AllValid)
                    {
                        continue;
                    }

                    Vector3 markerPosition = new Vector3(0, 0, 0);

                    if (building.size.z > tallestSpot)
                    {
                        tallestSpot = building.size.z;
                    }

                    //create gameobject for building marker.
                    GameObject buildingMarkerObject = GameObjectHelper.CreateDaggerfallMeshGameObject(SavedBuilding.ModelID, null, false, null, true, false);
                    buildingMarkerObject.GetComponent <Renderer>().enabled = false;
                    buildingMarkerObject.transform.position = new Vector3(blockPosition.x + SavedBuilding.Position.x, blockPosition.y + tallestSpot + 10f, blockPosition.z + SavedBuilding.Position.z);
                    //buildingMarkerObject.SetActive(false);
                    BuildingMarker buildingsInfo = buildingMarkerObject.AddComponent <BuildingMarker>();
                    MeshRenderer   buildingMesh  = buildingMarkerObject.GetComponent <MeshRenderer>();
                    buildingsInfo.marker.attachedMesh       = buildingMarkerObject;
                    buildingMarkerObject.transform.position = buildingMarkerObject.transform.position;
                    buildingMarkerObject.transform.Rotate(SavedBuilding.Rotation);
                    buildingMarkerObject.layer = Minimap.layerMinimap;
                    buildingMarkerObject.transform.localScale = new Vector3(1, 0.01f, 1);
                    buildingMarkerObject.name               = string.Concat(SavedBuilding.BuildingType.ToString(), " Marker ", SavedBuilding.buildingKey);
                    buildingMesh.shadowCastingMode          = 0;
                    buildingMesh.lightProbeUsage            = UnityEngine.Rendering.LightProbeUsage.Off;
                    buildingMesh.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
                    //Destroy(buildingMarkerObject.GetComponent<MeshCollider>());
                    //grab and store all building info into the building marker object.
                    buildingsInfo.marker.staticBuilding  = building;
                    buildingsInfo.marker.buildingSummary = SavedBuilding;
                    buildingsInfo.marker.buildingKey     = SavedBuilding.buildingKey;

                    foreach (BuildingSummary buildingInfo in housesForSaleList)
                    {
                        if (buildingInfo.BuildingType == DFLocation.BuildingTypes.HouseForSale)
                        {
                            buildingsInfo.marker.buildingType = DFLocation.BuildingTypes.HouseForSale;
                        }
                        else
                        {
                            buildingsInfo.marker.buildingType = SavedBuilding.BuildingType;
                        }
                    }

                    buildingsInfo.marker.buildingLocation = GameManager.Instance.PlayerGPS.CurrentLocation;

                    //buildingPositionList.Add(new Vector3(block.transform.position.x + SavedBuilding.Position.x, SavedBuilding.Position.y, block.transform.position.z + SavedBuilding.Position.z));
                    buildingsInfo.marker.position = buildingMarkerObject.transform.position;

                    foreach (StaticDoor buildingsDoor in doors)
                    {
                        if (building.buildingKey == buildingsDoor.buildingKey)
                        {
                            buildingsInfo.marker.doorPosition = DaggerfallStaticDoors.GetDoorPosition(buildingsDoor);
                        }
                    }

                    //setup ref properties for quest resource locator below.
                    bool   pcLearnedAboutExistence     = false;
                    bool   receivedDirectionalHints    = false;
                    bool   locationWasMarkedOnMapByNPC = false;
                    string overrideBuildingName        = string.Empty;

                    //check if the building contains a quest using quest resouces. If found to contain a quest, mark it so.
                    if (GameManager.Instance.TalkManager.IsBuildingQuestResource(GameManager.Instance.PlayerGPS.CurrentMapID, buildingsInfo.marker.buildingKey, ref overrideBuildingName, ref pcLearnedAboutExistence, ref receivedDirectionalHints, ref locationWasMarkedOnMapByNPC))
                    {
                        Minimap.lastQuestMarkerPosition  = buildingsInfo.marker.position;
                        buildingsInfo.marker.questActive = true;
                    }
                    //save building to building collection. This is more for other modders to use how they wish, since it contains all the building info for every building in a city.
                    buildingInfoCollection.Add(buildingMarkerObject);
                }
            }
            markersGenerated = true;
        }