public void Emit(float dt)
        {
            PrimaryElement firstPrimaryElement = GetFirstPrimaryElement();

            if (!((UnityEngine.Object)firstPrimaryElement == (UnityEngine.Object)null))
            {
                Storage component = GetComponent <Storage>();
                float   mass      = firstPrimaryElement.Mass;
                float   num       = Mathf.Min(mass, base.master.emptyRate * dt);
                if (!(num <= 0f))
                {
                    Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag;
                    component.ConsumeAndGetDisease(prefabTag, num, out SimUtil.DiseaseInfo disease_info, out float aggregate_temperature);
                    Vector3 position = base.transform.GetPosition();
                    position.y += 1.8f;
                    bool flag = GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH;
                    position.x += ((!flag) ? 0.2f : (-0.2f));
                    int num2 = Grid.PosToCell(position) + ((!flag) ? 1 : (-1));
                    if (Grid.Solid[num2])
                    {
                        num2 += (flag ? 1 : (-1));
                    }
                    Element element = firstPrimaryElement.Element;
                    byte    idx     = element.idx;
                    if (element.IsLiquid)
                    {
                        FallingWater.instance.AddParticle(num2, idx, num, aggregate_temperature, disease_info.idx, disease_info.count, true, false, false, false);
                    }
                    else
                    {
                        SimMessages.ModifyCell(num2, idx, aggregate_temperature, num, disease_info.idx, disease_info.count, SimMessages.ReplaceType.None, false, -1);
                    }
                }
            }
        }
Пример #2
0
        public void Process(WorldGen worldGen, Chunk world, SeededRandom rnd)
        {
            SetValuesFunction setValues = delegate(int index, object elem, Sim.PhysicsData pd, Sim.DiseaseCell dc)
            {
                SimMessages.ModifyCell(index, ElementLoader.GetElementIndex((elem as Element).id), pd.temperature, pd.mass, dc.diseaseIdx, dc.elementCount, SimMessages.ReplaceType.Replace, false, -1);
            };

            DoProcess(worldGen, world, setValues, rnd);
        }
 public static void ModifyCell(int gamecell, int elementidx, float temperature, float mass, byte diseaseid, int diseasecount)
 {
     if ((double)temperature < 0.0 || 10000.0 < (double)temperature)
     {
         Debug.Log("Modifycelltofailed: int" + gamecell + " int" + elementidx + "float" + temperature + "float" + mass + " byte" + diseaseid + " disease name " + Db.Get().Diseases.GetIndex(diseaseid) + " int" + diseasecount);
         return;
     }
     if ((double)temperature == 0.0 && (double)mass > 0.0 && elementidx >= 0)
     {
         Debug.Log("Modifycelltofailed: int" + gamecell + " int" + elementidx + "float" + temperature + "float" + mass + " byte" + diseaseid + " disease name " + Db.Get().Diseases.GetIndex(diseaseid) + " int" + diseasecount);
         return;
     }
     SimMessages.ModifyCell(gamecell, elementidx, temperature, mass, diseaseid, diseasecount, SimMessages.ReplaceType.Replace, false, -1);
 }
Пример #4
0
        static public void Postfix(GameObject go)
        {
            PrimaryElement firstPrimaryElement = this.GetFirstPrimaryElement();

            if ((UnityEngine.Object)firstPrimaryElement == (UnityEngine.Object)null)
            {
                return;
            }
            Storage component = this.GetComponent <Storage>();
            float   num       = Mathf.Min(firstPrimaryElement.Mass, this.master.emptyRate * dt);

            if ((double)num <= 0.0)
            {
                return;
            }
            Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag;

            SimUtil.DiseaseInfo disease_info;
            float aggregate_temperature;

            component.ConsumeAndGetDisease(prefabTag, num, out disease_info, out aggregate_temperature);
            Vector3 position = this.transform.GetPosition();

            position.y += 1.8f;
            bool flag = this.GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH;

            position.x += !flag ? 0.2f : -0.2f;
            int index = Grid.PosToCell(position) + (!flag ? 1 : -1);

            if (Grid.Solid[index])
            {
                index += !flag ? -1 : 1;
            }
            Element element = firstPrimaryElement.Element;
            byte    idx     = element.idx;

            ConduitDispenser conduitDispenser = go.AddOrGet <ConduitDispenser>();

            if (!conduitDispenser.IsConnected)
            {
                if (element.IsLiquid)
                {
                    FallingWater.instance.AddParticle(index, idx, num, aggregate_temperature, disease_info.idx, disease_info.count, true, false, false, false);
                }
                else
                {
                    SimMessages.ModifyCell(index, (int)idx, aggregate_temperature, num, disease_info.idx, disease_info.count, SimMessages.ReplaceType.None, false, -1);
                }
            }
        }
Пример #5
0
            // Token: 0x0600004E RID: 78 RVA: 0x000034A0 File Offset: 0x000016A0
            public void Emit(float dt)
            {
                PrimaryElement firstPrimaryElement = this.GetFirstPrimaryElement();

                if (firstPrimaryElement == null)
                {
                    return;
                }
                Storage component = this.GetComponent <Storage>();
                float   num       = Mathf.Min(firstPrimaryElement.Mass, this.master.EmptyRate * dt);

                if ((double)num <= 0.0)
                {
                    return;
                }
                Tag prefabTag = firstPrimaryElement.GetComponent <KPrefabID>().PrefabTag;

                SimUtil.DiseaseInfo diseaseInfo;
                float temperature;
                float amount_consumed;

                // public void ConsumeAndGetDisease(Tag tag, float amount, out float amount_consumed, out SimUtil.DiseaseInfo disease_info, out float aggregate_temperature)
                component.ConsumeAndGetDisease(prefabTag, num, out amount_consumed, out diseaseInfo, out temperature);
                Vector3 position = this.transform.GetPosition();

                position.y += 1.8f;
                bool flag = this.GetComponent <Rotatable>().GetOrientation() == Orientation.FlipH;

                position.x += (flag ? -0.2f : 0.2f);
                int num2 = Grid.PosToCell(position) + (flag ? -1 : 1);

                if (Grid.Solid[num2])
                {
                    num2 += (flag ? 1 : -1);
                }
                Element element = firstPrimaryElement.Element;
                byte    idx     = element.idx;

                if (element.IsLiquid)
                {
                    FallingWater.instance.AddParticle(num2, idx, num, temperature, diseaseInfo.idx, diseaseInfo.count, true);
                    return;
                }
                SimMessages.ModifyCell(num2, (int)idx, temperature, num, diseaseInfo.idx, diseaseInfo.count);
            }
Пример #6
0
        public unsafe static bool DoSettleSim(WorldGenSettings settings, Sim.Cell[] cells, float[] bgTemp, Sim.DiseaseCell[] dcs, WorldGen.OfflineCallbackFunction updateProgressFn, Data data, List <KeyValuePair <Vector2I, TemplateContainer> > templateSpawnTargets, Action <OfflineWorldGen.ErrorInfo> error_cb, Action <Sim.Cell[], float[], Sim.DiseaseCell[]> onSettleComplete)
        {
            Sim.SIM_Initialize(Sim.DLL_MessageHandler);
            SimMessages.CreateSimElementsTable(ElementLoader.elements);
            SimMessages.CreateWorldGenHACKDiseaseTable(WorldGen.diseaseIds);
            Sim.DiseaseCell[] dc = new Sim.DiseaseCell[dcs.Length];
            SimMessages.SimDataInitializeFromCells(Grid.WidthInCells, Grid.HeightInCells, cells, bgTemp, dc);
            int num = 500;

            updateProgressFn(UI.WORLDGEN.SETTLESIM.key, 0f, WorldGenProgressStages.Stages.SettleSim);
            Vector2I min = new Vector2I(0, 0);
            Vector2I max = new Vector2I(Grid.WidthInCells, Grid.HeightInCells);

            byte[] bytes = null;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (BinaryWriter writer = new BinaryWriter(memoryStream))
                {
                    try
                    {
                        Sim.Save(writer);
                    }
                    catch (Exception ex)
                    {
                        string message    = ex.Message;
                        string stackTrace = ex.StackTrace;
                        WorldGenLogger.LogException(message, stackTrace);
                        return(updateProgressFn(new StringKey("Exception in Sim Save"), -1f, WorldGenProgressStages.Stages.Failure));
                    }
                }
                bytes = memoryStream.ToArray();
            }
            FastReader reader = new FastReader(bytes);

            if (Sim.Load(reader) != 0)
            {
                updateProgressFn(UI.WORLDGEN.FAILED.key, -1f, WorldGenProgressStages.Stages.Failure);
                return(true);
            }
            byte[] array = new byte[Grid.CellCount];
            for (int i = 0; i < Grid.CellCount; i++)
            {
                array[i] = byte.MaxValue;
            }
            for (int j = 0; j < num; j++)
            {
                SimMessages.NewGameFrame(0.2f, min, max);
                IntPtr intPtr = Sim.HandleMessage(SimMessageHashes.PrepareGameData, array.Length, array);
                updateProgressFn(UI.WORLDGEN.SETTLESIM.key, (float)j / (float)num * 100f, WorldGenProgressStages.Stages.SettleSim);
                if (!(intPtr == IntPtr.Zero))
                {
                    Sim.GameDataUpdate *ptr = (Sim.GameDataUpdate *)(void *) intPtr;
                    for (int k = 0; k < ptr->numSubstanceChangeInfo; k++)
                    {
                        Sim.SubstanceChangeInfo substanceChangeInfo = ptr->substanceChangeInfo[k];
                        int cellIdx = substanceChangeInfo.cellIdx;
                        cells[cellIdx].elementIdx   = ptr->elementIdx[cellIdx];
                        cells[cellIdx].insulation   = ptr->insulation[cellIdx];
                        cells[cellIdx].properties   = ptr->properties[cellIdx];
                        cells[cellIdx].temperature  = ptr->temperature[cellIdx];
                        cells[cellIdx].mass         = ptr->mass[cellIdx];
                        cells[cellIdx].strengthInfo = ptr->strengthInfo[cellIdx];
                    }
                    foreach (KeyValuePair <Vector2I, TemplateContainer> templateSpawnTarget in templateSpawnTargets)
                    {
                        Cell templateCellData;
                        for (int l = 0; l < templateSpawnTarget.Value.cells.Count; l++)
                        {
                            templateCellData = templateSpawnTarget.Value.cells[l];
                            Vector2I key  = templateSpawnTarget.Key;
                            int      x    = key.x;
                            Vector2I key2 = templateSpawnTarget.Key;
                            int      num2 = Grid.OffsetCell(Grid.XYToCell(x, key2.y), templateCellData.location_x, templateCellData.location_y);
                            if (Grid.IsValidCell(num2))
                            {
                                cells[num2].elementIdx  = (byte)ElementLoader.GetElementIndex(templateCellData.element);
                                cells[num2].temperature = templateCellData.temperature;
                                cells[num2].mass        = templateCellData.mass;
                                dcs[num2].diseaseIdx    = (byte)WorldGen.diseaseIds.FindIndex((string name) => name == templateCellData.diseaseName);
                                dcs[num2].elementCount  = templateCellData.diseaseCount;
                            }
                        }
                    }
                }
            }
            for (int m = 0; m < Grid.CellCount; m++)
            {
                int callbackIdx = (m != Grid.CellCount - 1) ? (-1) : 2147481337;
                SimMessages.ModifyCell(m, cells[m].elementIdx, cells[m].temperature, cells[m].mass, dcs[m].diseaseIdx, dcs[m].elementCount, SimMessages.ReplaceType.Replace, false, callbackIdx);
            }
            bool flag = false;

            while (!flag)
            {
                SimMessages.NewGameFrame(0.2f, min, max);
                IntPtr intPtr2 = Sim.HandleMessage(SimMessageHashes.PrepareGameData, array.Length, array);
                if (!(intPtr2 == IntPtr.Zero))
                {
                    Sim.GameDataUpdate *ptr2 = (Sim.GameDataUpdate *)(void *) intPtr2;
                    for (int n = 0; n < ptr2->numCallbackInfo; n++)
                    {
                        Sim.CallbackInfo callbackInfo = ptr2->callbackInfo[n];
                        if (callbackInfo.callbackIdx == 2147481337)
                        {
                            flag = true;
                            break;
                        }
                    }
                }
            }
            Sim.HandleMessage(SimMessageHashes.SettleWorldGen, 0, null);
            bool result = SaveSim(settings, data, error_cb);

            onSettleComplete(cells, bgTemp, dcs);
            Sim.Shutdown();
            return(result);
        }