예제 #1
0
        public override void Resolve(ResolveParams rp)
        {
            Map map = BaseGen.globalSettings.map;
            RectActionTrigger rectActionTrigger;

            if (rp.TryGetCustom <RectActionTrigger>("trigger", out rectActionTrigger))
            {
                GenSpawn.Spawn(rectActionTrigger, rectActionTrigger.Rect.CenterCell, map);
            }
        }
        public override void Resolve(ResolveParams rp)
        {
            Map map = BaseGen.globalSettings.map;
            ActivatedActionDef actionDef;

            if (rp.TryGetCustom <ActivatedActionDef>("mainAdventureAction", out actionDef))
            {
                ActionTrigger       actionTrigger = null;
                IEnumerable <Thing> source        = from t in map.listerThings.AllThings
                                                    where t is ActionTrigger
                                                    select t;
                if (source.Count <Thing>() == 0)
                {
                    List <Room> allRooms = map.regionGrid.allRooms;
                    if (allRooms.Count == 0)
                    {
                        Log.Error("Could not find contained room for adventure trigger!");
                    }
                    else
                    {
                        Room room = allRooms.RandomElementByWeight((Room r) => 1f / r.GetStat(RoomStatDefOf.Space));
                        actionTrigger = new ActionTrigger();
                        foreach (IntVec3 item in room.Cells)
                        {
                            actionTrigger.Cells.Add(item);
                        }
                        IntVec3 loc = actionTrigger.Cells.RandomElement <IntVec3>();
                        GenSpawn.Spawn(actionTrigger, loc, map);
                    }
                }
                else
                {
                    actionTrigger = (source.RandomElement <Thing>() as ActionTrigger);
                }
                if (actionTrigger != null)
                {
                    actionTrigger.actionDef = actionDef;
                }
            }
        }
        public override void Resolve(ResolveParams rp)
        {
            char[] array;
            if (rp.TryGetCustom <char[]>("hasDoor", out array))
            {
                if (rp.rect.Width < 3 && rp.rect.Height < 3)
                {
                    return;
                }
                ResolveParams resolveParams = rp;
                char[]        array2        = array;
                int           i             = 0;
                while (i < array2.Length)
                {
                    char c = array2[i];
                    if (c == 'N')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.North);
                        resolveParams.rect     = new CellRect(rp.rect.minX + 1, rp.rect.maxZ, rp.rect.Width - 2, 1);
                        goto IL_1AA;
                    }
                    if (c == 'S')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.South);
                        resolveParams.rect     = new CellRect(rp.rect.minX + 1, rp.rect.minZ, rp.rect.Width - 2, 1);
                        goto IL_1AA;
                    }
                    if (c == 'E')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.East);
                        resolveParams.rect     = new CellRect(rp.rect.maxX, rp.rect.minZ + 1, 1, rp.rect.Height - 2);
                        goto IL_1AA;
                    }
                    if (c == 'W')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.West);
                        resolveParams.rect     = new CellRect(rp.rect.minX, rp.rect.minZ + 1, 1, rp.rect.Height - 2);
                        goto IL_1AA;
                    }
IL_1BB:
                    i++;
                    continue;
IL_1AA:
                    BaseGen.symbolStack.Push("wallDoor", resolveParams);
                    goto IL_1BB;
                }
            }
            //float num;
            //rp.TryGetCustom<float>("madAnimalChance", ref num);
            //float num2;
            //rp.TryGetCustom<float>("luciferiumGasChance", ref num2);
            //float num3;
            //rp.TryGetCustom<float>("psionicLandmineChance", ref num3);
            //float num4;
            //rp.TryGetCustom<float>("smallGoldChance", ref num4);
            //float num5;
            //rp.TryGetCustom<float>("smallSilverChance", ref num5);
            //RectActionTrigger rectActionTrigger = ThingMaker.MakeThing(ThingDefOfReconAndDiscovery.RectActionTrigger, null) as RectActionTrigger;
            //rectActionTrigger.Rect = rp.rect;
            //if (Rand.Chance(num))
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.MadAnimal;
            //}
            //else if (Rand.Chance(num2))
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.LuciferiumGas;
            //}
            //else if (Rand.Chance(num3))
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.PsionicLandmine;
            //}
            //else if (Rand.Chance(num4))
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.SmallGold;
            //}
            //else if (Rand.Chance(num5))
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.SmallSilver;
            //}
            //else
            //{
            //    rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.BaseActivatedAction;
            //}
            //if (rectActionTrigger.actionDef != null)
            //{
            //    ResolveParams resolveParams2 = rp;
            //    resolveParams2.SetCustom<RectActionTrigger>("trigger", rectActionTrigger, false);
            //    BaseGen.symbolStack.Push("placeTrigger", resolveParams2);
            //}
            BaseGen.symbolStack.Push("emptyRoom", rp);
        }
        public void Transfer()
        {
            //Planting blueprint
            float totalCost           = 0;
            int   transferredTerrains = 0;
            int   transferredTiles    = 0;
            int   totalTerrains       = 0;
            int   totalItems          = 0;

            //update rect to actual placement rect using width and height
            rp.rect = new CellRect(mapOriginX, mapOriginZ, blueprint.width, blueprint.height);
            CoverageMap coverageMap = null;

            rp.TryGetCustom <CoverageMap>(Constants.CoverageMap, out coverageMap);

            for (int z = 0; z < blueprint.height; z++)
            {
                for (int x = 0; x < blueprint.width; x++)
                {
                    IntVec3 mapLocation = new IntVec3(x + mapOriginX, 0, z + mapOriginZ);
                    //Check if thepoint is in allowed bounds of the map
                    if (!mapLocation.InBounds(map) || mapLocation.InNoBuildEdgeArea(map))
                    {
                        continue; //ignore invalid cells
                    }

                    if (options.overwritesEverything || Rand.Chance(0.6f))
                    {
                        if (blueprint.terrainMap[x, z] != null ||
                            blueprint.itemsMap[x, z].Count > 0 ||
                            blueprint.wallMap[x, z] > 1)
                        {
                            ClearCell(mapLocation, map, true);
                        }
                    }
                }
            }


            for (int z = 0; z < blueprint.height; z++)
            {
                for (int x = 0; x < blueprint.width; x++)
                {
                    IntVec3 mapLocation = new IntVec3(x + mapOriginX, 0, z + mapOriginZ);
                    if (coverageMap != null)
                    {
                        if (coverageMap.isMarked(mapLocation.x, mapLocation.z) == true) //cell was used earlier
                        {
                            continue;                                                   //skip already covered tiles
                        }
                        else
                        {
                            if (blueprint.wallMap[x, z] > 1 || blueprint.wallMap[x, z] == -1)
                            {
                                coverageMap.Mark(mapLocation.x, mapLocation.z);                                                               //mark cell as used
                            }
                        }
                    }

                    //Check if thepoint is in allowed bounds of the map
                    if (!mapLocation.InBounds(map) || mapLocation.InNoBuildEdgeArea(map))
                    {
                        continue; //ignore invalid cells
                    }

                    //Construct terrain if some specific terrain stored in the blueprint
                    if (blueprint.terrainMap[x, z] != null)
                    {
                        totalTerrains++;
                        TerrainDef blueprintTerrain = TerrainDef.Named(blueprint.terrainMap[x, z].defName);
                        if (!map.terrainGrid.TerrainAt(mapLocation).IsWater)
                        {
                            map.terrainGrid.SetTerrain(mapLocation, blueprintTerrain);
                            totalCost += blueprint.terrainMap[x, z].cost;
                            transferredTerrains++;
                        }
                    }

                    //construct roof evetywhere if we doing complete transfer (ignoring outside: room with index 1).
                    if (blueprint.roofMap[x, z] == true && options.overwritesEverything && blueprint.wallMap[x, z] != 1)
                    {
                        map.roofGrid.SetRoof(mapLocation, RoofDefOf.RoofConstructed);
                    }


                    //Add items
                    if (blueprint.itemsMap[x, z] != null && blueprint.itemsMap[x, z].Count > 0 /* && cellUsed[mapLocation.x, mapLocation.z] == false*/)
                    {
                        totalItems += blueprint.itemsMap[x, z].Count;

                        bool cellIsAlreadyCleared = false;
                        foreach (ItemTile itemTile in blueprint.itemsMap[x, z])
                        {
                            if (!cellIsAlreadyCleared)   //first item to be spawned should also clear place for itself. we can't do it beforehand because we don't know if it will be able and get a chance to be spawned.
                            {
                                bool forceCleaning = (blueprint.wallMap[x, z] > 1) && Rand.Chance(0.9f);

                                if (!ClearCell(mapLocation, map, forceCleaning))
                                {
                                    break; //if cell was not cleared successfully -> break things placement cycle and move on to the next item
                                }
                                else
                                {
                                    cellIsAlreadyCleared = true;
                                }
                            }

                            Thing thing = MakeThingFromItemTile(itemTile);
                            if (thing != null)
                            {
                                try {
                                    GenSpawn.Spawn(thing, mapLocation, map, new Rot4(itemTile.rot));
                                    try {
                                        switch (thing.def.tickerType)
                                        {
                                        case TickerType.Never:
                                            break;

                                        case TickerType.Normal:
                                            thing.Tick();
                                            break;

                                        case TickerType.Long:
                                            thing.TickLong();
                                            break;

                                        case TickerType.Rare:
                                            thing.TickRare();
                                            break;
                                        }
                                        //Debug.Message("Ticked");
                                    } catch (Exception e) {
                                        //Debug.Message("Exception while tried to perform tick for {0} of cost {1}", thing.def.defName, itemTile.cost);
                                        thing.Destroy();
                                        throw e;
                                    }

                                    //Debug.Message("Setting up props");
                                    //Breakdown breakdownables: it't yet impossible to silently breakdown an item which is not spawned.
                                    CompBreakdownable b = thing.TryGetComp <CompBreakdownable>();
                                    if (b != null && options.enableDeterioration)
                                    {
                                        if (Rand.Chance(0.8f))
                                        {
                                            b.DoBreakdown();
                                        }
                                    }

                                    //reduce HP for haulable things in water
                                    if (thing.def.EverHaulable)
                                    {
                                        TerrainDef t = map.terrainGrid.TerrainAt(mapLocation);
                                        if (t != null && t.IsWater)
                                        {
                                            thing.HitPoints = (thing.HitPoints - 10) / Rand.Range(5, 20) + Rand.Range(1, 10); //things in marsh or river are really in bad condition
                                        }
                                    }
                                    transferredTiles++;
                                    totalCost += itemTile.cost;
                                } catch (Exception e) {
                                    //Debug.Message("Failed to spawn item {0} of cost {1} because of exception", thing, itemTile.cost);
                                    //ignore
                                }
                            }
                        }
                    }
                }

                if (options.shouldKeepDefencesAndPower)
                {
                    RestoreDefencesAndPower();
                }
                options.uncoveredCost = totalCost;
            }
            Debug.Log(Debug.BlueprintTransfer, "Transferred blueprint of size {0}x{1}, age {2}, total cost of approximately {3}. Items: {4}/{5}, terrains: {6}/{7}", blueprint.width, blueprint.height, -blueprint.dateShift, totalCost, transferredTiles, totalItems, transferredTerrains, totalTerrains);
        }
예제 #5
0
        public override void Resolve(ResolveParams rp)
        {
            char[] array;
            if (rp.TryGetCustom <char[]>("hasDoor", out array))
            {
                if (rp.rect.Width < 3 && rp.rect.Height < 3)
                {
                    return;
                }
                ResolveParams resolveParams = rp;
                char[]        array2        = array;
                int           i             = 0;
                while (i < array2.Length)
                {
                    char c = array2[i];
                    if (c == 'N')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.North);
                        resolveParams.rect     = new CellRect(rp.rect.minX + 1, rp.rect.maxZ, rp.rect.Width - 2, 1);
                        goto IL_1AA;
                    }
                    if (c == 'S')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.South);
                        resolveParams.rect     = new CellRect(rp.rect.minX + 1, rp.rect.minZ, rp.rect.Width - 2, 1);
                        goto IL_1AA;
                    }
                    if (c == 'E')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.East);
                        resolveParams.rect     = new CellRect(rp.rect.maxX, rp.rect.minZ + 1, 1, rp.rect.Height - 2);
                        goto IL_1AA;
                    }
                    if (c == 'W')
                    {
                        resolveParams.thingRot = new Rot4?(Rot4.West);
                        resolveParams.rect     = new CellRect(rp.rect.minX, rp.rect.minZ + 1, 1, rp.rect.Height - 2);
                        goto IL_1AA;
                    }
IL_1BB:
                    i++;
                    continue;
IL_1AA:
                    BaseGen.symbolStack.Push("wallDoor", resolveParams, null);
                    goto IL_1BB;
                }
            }
            float chance;

            rp.TryGetCustom <float>("madAnimalChance", out chance);
            float chance2;

            rp.TryGetCustom <float>("luciferiumGasChance", out chance2);
            float chance3;

            rp.TryGetCustom <float>("psionicLandmineChance", out chance3);
            float chance4;

            rp.TryGetCustom <float>("smallGoldChance", out chance4);
            float chance5;

            rp.TryGetCustom <float>("smallSilverChance", out chance5);
            RectActionTrigger rectActionTrigger = ThingMaker.MakeThing(ThingDefOfReconAndDiscovery.RD_RectActionTrigger, null) as RectActionTrigger;

            rectActionTrigger.Rect = rp.rect;
            if (Rand.Chance(chance))
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_MadAnimal;
            }
            else if (Rand.Chance(chance2))
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_LuciferiumGas;
            }
            else if (Rand.Chance(chance3))
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_PsionicLandmine;
            }
            else if (Rand.Chance(chance4))
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_SmallGold;
            }
            else if (Rand.Chance(chance5))
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_SmallSilver;
            }
            else
            {
                rectActionTrigger.actionDef = ActionDefOfReconAndDiscovery.RD_BaseActivatedAction;
            }
            if (rectActionTrigger.actionDef != null)
            {
                ResolveParams resolveParams2 = rp;
                resolveParams2.SetCustom <RectActionTrigger>("trigger", rectActionTrigger, false);
                BaseGen.symbolStack.Push("placeTrigger", resolveParams2, null);
            }
            BaseGen.symbolStack.Push("emptyRoom", rp, null);
        }
예제 #6
0
        public override void Resolve(ResolveParams rp)
        {
            int num;

            if (!rp.TryGetCustom <int>("minRoomDimension", out num))
            {
                Log.Error("Could not find a field minRoomDimension");
            }
            else
            {
                int width  = rp.rect.Width;
                int height = rp.rect.Height;
                Log.Message(string.Format("Current nested room dimensions -> ({0}:{1})", width, height));
                if (width < 2 * num && height < 2 * num)
                {
                    this.MakeRoom(rp);
                }
                else if ((width < 4 * num || height < 4 * num) && Rand.Value < 0.2f)
                {
                    ResolveParams rp2 = rp;
                    ResolveParams rp3 = rp;
                    rp2.rect.Width = rp.rect.Width / 2;
                    rp3.rect.minX  = rp2.rect.maxX;
                    rp3.rect.Width = rp.rect.Width / 2;
                    this.MakeRoom(rp2);
                    this.MakeRoom(rp3);
                }
                else if (width < 4 * num && height < 4 * num && Rand.Value < 0.1f)
                {
                    this.MakeRoom(rp);
                }
                else
                {
                    List <CellRect> list  = new List <CellRect>();
                    List <CellRect> list2 = new List <CellRect>();
                    if (width > 2 * num)
                    {
                        list.Add(new CellRect(rp.rect.minX, rp.rect.minZ, rp.rect.Width / 2, rp.rect.Height));
                        list.Add(new CellRect(rp.rect.minX + rp.rect.Width / 2 - 1, rp.rect.minZ, rp.rect.Width / 2, rp.rect.Height));
                    }
                    else
                    {
                        list.Add(new CellRect(rp.rect.minX, rp.rect.minZ, rp.rect.Width, rp.rect.Height));
                    }
                    foreach (CellRect item in list)
                    {
                        if (height > 2 * num)
                        {
                            list2.Add(new CellRect(item.minX, item.minZ, item.Width, item.Height / 2));
                            list2.Add(new CellRect(item.minX, item.minZ + item.Height / 2 - 1, item.Width, item.Height / 2));
                        }
                        else
                        {
                            list2.Add(item);
                        }
                    }
                    foreach (CellRect rect in list2)
                    {
                        ResolveParams resolveParams = rp;
                        resolveParams.rect = rect;
                        resolveParams.SetCustom <int>("minRoomDimension", num, false);
                        BaseGen.symbolStack.Push("nestedRoomMaze", resolveParams, null);
                    }
                }
            }
        }