Пример #1
0
        /// <summary>
        /// Applied before Emit runs.
        /// </summary>
        internal static bool Prefix(RadiationGridEmitter __instance)
        {
            int n = __instance.projectionCount;

            if (n > 0)
            {
                var startPos = (Vector2)Grid.CellToPosCCC(__instance.originCell, Grid.
                                                          SceneLayer.Building);
                float angle = __instance.angle, direction = __instance.direction - 0.5f *
                                                            angle, step = angle / n, intensity = __instance.intensity;
                var scanCells = __instance.scanCells;
                scanCells.Clear();
                for (int i = 0; i < n; i++)
                {
                    float netAngle = Mathf.Deg2Rad * (direction + Random.Range(-step, step) *
                                                      0.5f);
                    var     unitVector = new Vector2(Mathf.Cos(netAngle), Mathf.Sin(netAngle));
                    float   rads       = intensity;
                    Vector2 a2         = unitVector;
                    float   dist       = 0f;
                    while (rads > 0.01f && dist < RadiationGridEmitter.MAX_EMIT_DISTANCE)
                    {
                        int cell = Grid.PosToCell(startPos + a2 * dist);
                        // 1 / 3
                        dist += 0.333333f;
                        if (!Grid.IsValidCell(cell))
                        {
                            break;
                        }
                        if (!scanCells.Contains(cell))
                        {
                            SimMessages.ModifyRadiationOnCell(cell, Mathf.RoundToInt(rads));
                            scanCells.Add(cell);
                        }
                        float mass = Grid.Mass[cell];
                        // Attenuate over distance, with a slight random factor
                        rads *= ((mass > 0.0f) ? Mathf.Max(0f, 1f - Mathf.Pow(mass, 1.25f) *
                                                           Grid.Element[cell].molarMass / 1000000.0f) : 1.0f) *
                                Random.Range(0.96f, 0.98f);
                    }
                    direction += step;
                }
            }
            return(false);
        }