[Solved] Modding the Pawn Card

Started by Argain, June 10, 2014, 05:20:19 AM

Previous topic - Next topic

Argain

Is it possible to mod the PawnCardUtility class to alter the Colonist Creation menu? I tried using an assembly with a modified version of it, but it didn't overwrite during runtime.

Cala13er

As far as I know. No you can't, that is hardcoded.

Edit : I did try do it myself for start with more colonists mod.

Argain

Hmm, well the MapGenerator.xml can be modded... maybe we could create a class to run the moment map generation is complete? Like a secondary Colonist Creation menu that's enhanced?

Argain

In Genstep_Colonists class:

public override void Generate()
{
                //Insert new code to run before spawning colonists here!
Genstep_Colonists.SpawnStartingColonists();
Genstep_Colonists.SpawnStartingZones();
}

Argain

Soo... I started trying to mod the MapGenerator and got some errors:

Quote
ReflectionTypeLoadException getting types in assembly ColonistCreationMod: System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (bool)

  at System.Reflection.Assembly.GetTypes () [0x00000] in <filename unknown>:0

  at Verse.ModAssemblyHandler.AssemblyIsUsable (System.Reflection.Assembly asm) [0x00000] in <filename unknown>:0


Loader exceptions:

   => System.TypeLoadException: Could not load type 'Verse.ModdedMapInitParams' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type 'Verse.ModdedPage_CharMaker' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type '<>c__DisplayClass4' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type '<>c__DisplayClass6' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.


Could not load class ModdedGenstep_Colonists, ColonistCreationMod from node <li Class="ModdedGenstep_Colonists, ColonistCreationMod" />

Is my mod overreaching the boundaries? Or did I oops something in the xml file?

Argain

Tried removing the assembly reference in the xml file, since I just learned it's not supported anymore... but still throwing the same errors  :-\

Haplo

One thing you could try: don't use the Verse namespace. Use something other like your mod name or so..
It may conflict with the game namespace..

Argain

Quote
Loader exceptions:

   => System.TypeLoadException: Could not load type 'ColonistCreationMod.ModdedMapInitParams' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type 'ColonistCreationMod.ModdedPage_CharMaker' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type '<>c__DisplayClass4' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type '<>c__DisplayClass6' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.


Could not load class ModdedGenstep_Colonists from node <li Class="ModdedGenstep_Colonists" />

No luck :(

Argain

It says in BaseMapGenerators.xml:
Quote
<!-- Hardcoded, the colonists themselves and their zones -->
<li Class="Genstep_Colonists"/>

So, that's probably the cause?

Argain

Wasn't that either... tried inserting my own custom genstep:
Quote
<li Class="Genstep_ColonistCreationMod" />
at the top of the list and it still threw an error about not being able to load the class. The class is also within its own namespace:


using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Verse;
using UnityEngine;

namespace ColonistCreationMod
{
    public class Genstep_ColonistCreationMod : Genstep
    {
        public override void Generate()
        {
            Find.LayerStack.Add(new ModdedPage_CharMaker());
        }
    }

    public class ModdedPage_CharMaker : Layer
    {
        private const float TopAreaHeight = 80f;
        private Pawn curPawn;
        private static readonly Vector2 WinSize = new Vector2(900f, 750f);

        public ModdedPage_CharMaker()
        {
            this.curPawn = MapInitParams.colonists[0];
            base.SetCentered(ModdedPage_CharMaker.WinSize);
            this.category = LayerCategory.GameDialog;
            this.clearNonEditDialogs = true;
            this.forcePause = true;
        }

        private void RandomizeCurChar()
        {
            do
            {
                this.curPawn = MapInitParams.RegeneratePawn(this.curPawn);
            }
            while (!MapInitParams.AnyoneCanDoBasicWorks());
        }

        protected override void FillWindow(Rect inRect)
        {
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 300f, 300f), Translator.Translate("Enhanced Colonist Creation"));
            GenFont.SetFontSmall();
            Rect rect = new Rect(0f, 80f, inRect.width, inRect.height - 60f - 80f);
            Widgets.DrawMenuSection(rect);
            TabDrawer.DrawTabs(rect,
                from c in MapInitParams.colonists
                select new TabRecord(c.Label, delegate
                {
                    this.SelectConfig(c);
                }, c == this.curPawn));
            Rect innerRect = GenUI.GetInnerRect(rect, 17f);
            GUI.BeginGroup(innerRect);
            ModdedPawnCardUtility.DrawPawnCard(this.curPawn, new Action(this.RandomizeCurChar));
            GUI.EndGroup();
            Action action = delegate
            {
                AcceptanceReport acceptanceReport = this.CanStart();
                if (acceptanceReport.accepted)
                {
                    Action action2 = delegate
                    {
                        MapInitParams.startedFromEntry = true;
                    };
                }
                else
                {
                    Messages.Message(acceptanceReport.reasonText);
                }
            };
            DialogUtility.DoNextBackButtons(this.winRect, Translator.Translate("Continue"), action, delegate
            {
            });
        }

        private AcceptanceReport CanStart()
        {
            AcceptanceReport result;
            foreach (Pawn current in MapInitParams.colonists)
            {
                if (!current.Name.Valid)
                {
                    result = new AcceptanceReport(Translator.Translate("EveryoneNeedsValidName"));
                    return result;
                }
            }
            result = AcceptanceReport.WasAccepted;
            return result;
        }

        private void SelectConfig(Pawn c)
        {
            if (c != this.curPawn)
            {
                this.curPawn = c;
            }
        }
    }

    public static class ModdedPawnCardUtility
    {
        private const int MainRectsY = 100;
        private const float MainRectsHeight = 450f;
        private const int ConfigRectTitlesHeight = 40;
        public static Vector2 PawnCardSize = new Vector2(570f, 470f);

        public static void DrawPawnCard(Pawn pawn)
        {
            ModdedPawnCardUtility.DrawPawnCard(pawn, null);
        }

        public static void DrawPawnCard(Pawn curPawn, Action randomizeCallback)
        {
            bool flag = randomizeCallback != null;
            Rect rect = new Rect(0f, 0f, 300f, 30f);

            if (flag)
            {
                Rect rect2 = new Rect(rect);
                rect2.width *= 0.333f;
                Rect rect3 = new Rect(rect);
                rect3.width *= 0.333f;
                rect3.x += rect3.width;
                Rect rect4 = new Rect(rect);
                rect4.width *= 0.333f;
                rect4.x += rect3.width * 2f;
                PawnCardUtility.DoNameInputRect(rect2, ref curPawn.story.name.first, 12);
                if (curPawn.story.name.nick == curPawn.story.name.first || curPawn.story.name.nick == curPawn.story.name.last)
                {
                    GUI.color = new Color(1f, 1f, 1f, 0.5f);
                }
                PawnCardUtility.DoNameInputRect(rect3, ref curPawn.story.name.nick, 9);
                GUI.color = Color.white;
                PawnCardUtility.DoNameInputRect(rect4, ref curPawn.story.name.last, 12);
                TooltipHandler.TipRegion(rect2, "FirstNameDesc".Translate());
                TooltipHandler.TipRegion(rect3, "ShortIdentifierDesc".Translate());
                TooltipHandler.TipRegion(rect4, "LastNameDesc".Translate());
            }
            else
            {
                rect.width = 999f;
                GenFont.SetFontMedium();
                GUI.Label(rect, curPawn.Name.ToString());
                GenFont.SetFontSmall();
            }

            if (randomizeCallback != null)
            {
                Rect butRect = new Rect(320f, 0f, 175f, 40f);
                if (Widgets.TextButton(butRect, "Randomize".Translate()))
                {
                    randomizeCallback();
                }
            }

            Rect position = new Rect(0f, 45f, 300f, 30f);
            string text = (curPawn.gender != Gender.Male) ? "Female".Translate() : "Male".Translate();
            GUI.Label(position, string.Concat(new string[]
{
text,
" ",
curPawn.def.label,
" ",
curPawn.KindLabel,
", ",
"AgeIndicator".Translate(new object[]
{
curPawn.age
})
}));
            Rect rect5 = new Rect(0f, 100f, 260f, 450f);
            Rect rect6 = new Rect(rect5.xMax + 17f, 100f, 280f, 450f);
            Rect innerRect = rect5.GetInnerRect(10f);
            Rect innerRect2 = rect6.GetInnerRect(10f);
            GUI.BeginGroup(innerRect);
            float num = 0f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 200f, 30f), "Backstory".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            IEnumerator enumerator = Enum.GetValues(typeof(BackstorySlot)).GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    BackstorySlot backstorySlot = (BackstorySlot)((int)enumerator.Current);
                    Rect rect7 = new Rect(0f, num, innerRect.width, 24f);
                    if (rect7.Contains(Event.current.mousePosition))
                    {
                        Widgets.DrawHighlight(rect7);
                    }
                    TooltipHandler.TipRegion(rect7, curPawn.story.GetBackstory(backstorySlot).FullDescriptionFor(curPawn));
                    GUI.skin.label.alignment = TextAnchor.MiddleLeft;
                    string str = (backstorySlot != BackstorySlot.Adulthood) ? "Childhood".Translate() : "Adulthood".Translate();
                    GUI.Label(rect7, str + ":");
                    GUI.skin.label.alignment = TextAnchor.UpperLeft;
                    Rect position2 = new Rect(rect7);
                    position2.x += 90f;
                    position2.width -= 90f;
                    string title = curPawn.story.GetBackstory(backstorySlot).title;
                    GUI.Label(position2, title);
                    num += rect7.height + 2f;
                }
            }
            finally
            {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }
            }
            num += 25f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, num, 200f, 30f), "IncapableOf".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            StringBuilder stringBuilder = new StringBuilder();
            List<WorkTags> list = curPawn.story.DisabledWorkTags.ToList<WorkTags>();
            if (list.Count == 0)
            {
                stringBuilder.Append("(" + "NoneLower".Translate() + "), ");
            }
            else
            {
                foreach (WorkTags current in list)
                {
                    stringBuilder.Append(current.LabelTranslated());
                    stringBuilder.Append(", ");
                }
            }
            string text2 = stringBuilder.ToString();
            text2 = text2.Substring(0, text2.Length - 2);
            Rect position3 = new Rect(0f, num, innerRect.width, 999f);
            GUI.Label(position3, text2);
            num += 100f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, num, 200f, 30f), "Traits".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            foreach (Trait current2 in curPawn.story.traits.allTraits)
            {
                Rect rect8 = new Rect(0f, num, innerRect.width, 24f);
                if (rect8.Contains(Event.current.mousePosition))
                {
                    Widgets.DrawHighlight(rect8);
                }
                GUI.Label(rect8, current2.def.label);
                num += rect8.height + 2f;
                TooltipHandler.TipRegion(rect8, "TraitsDoNothing".Translate());
            }
            GUI.EndGroup();
            GUI.BeginGroup(innerRect2);
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 200f, 30f), "Skills".Translate());
            SkillDrawer.SkillDrawMode drawMode;
            if (Game.Mode == GameMode.Gameplay)
            {
                drawMode = SkillDrawer.SkillDrawMode.Gameplay;
            }
            else
            {
                drawMode = SkillDrawer.SkillDrawMode.Menu;
            }
            SkillDrawer.DrawSkillsOf(curPawn, new Vector2(0f, 35f), drawMode);
            GUI.EndGroup();
        }

        public static void DoNameInputRect(Rect rect, ref string name, int maxLength)
        {
            GUI.skin.settings.doubleClickSelectsWord = true;
            GUI.skin.textField.alignment = TextAnchor.MiddleLeft;
            GUI.skin.textField.contentOffset = new Vector2(12f, 0f);
            string text = GUI.TextField(rect, name);
            Regex regex = new Regex("^[a-zA-Z '\\-]*$");
            if (text.Length <= maxLength && regex.IsMatch(text))
            {
                name = text;
            }
        }
    }
}



Here's the error message:
Quote
Loader exceptions:

   => System.TypeLoadException: Could not load type 'ColonistCreationMod.ModdedPage_CharMaker' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

   => System.TypeLoadException: Could not load type '<>c__DisplayClass6' from assembly 'ColonistCreationMod, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.


Could not load class Genstep_ColonistCreationMod from node <li Class="Genstep_ColonistCreationMod" />

Almost seems like it's mostly just complaining about the ModdedPage_CharMaker class? Wondering if maybe the methods within it are conflicting with existing methods...

Argain

#10
Changed all the method names so they can't conflict with any other public methods:


using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Verse;
using UnityEngine;

namespace ColonistCreationMod
{
    public class Genstep_ColonistCreationMod : Genstep
    {
        public override void Generate()
        {
            Find.LayerStack.Add(new ModdedPage_CharMaker());
        }
    }

    public class ModdedPage_CharMaker : Layer
    {
        private const float TopAreaHeight = 80f;
        private Pawn curPawn;
        private static readonly Vector2 WinSize = new Vector2(900f, 750f);

        public ModdedPage_CharMaker()
        {
            this.curPawn = MapInitParams.colonists[0];
            base.SetCentered(ModdedPage_CharMaker.WinSize);
            this.category = LayerCategory.GameDialog;
            this.clearNonEditDialogs = true;
            this.forcePause = true;
        }

        private void ModdedRandomizeCurChar()
        {
            do
            {
                this.curPawn = MapInitParams.RegeneratePawn(this.curPawn);
            }
            while (!MapInitParams.AnyoneCanDoBasicWorks());
        }

        protected void ModdedFillWindow(Rect inRect)
        {
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 300f, 300f), Translator.Translate("Enhanced Colonist Creation"));
            GenFont.SetFontSmall();
            Rect rect = new Rect(0f, 80f, inRect.width, inRect.height - 60f - 80f);
            Widgets.DrawMenuSection(rect);
            TabDrawer.DrawTabs(rect,
                from c in MapInitParams.colonists
                select new TabRecord(c.Label, delegate
                {
                    this.ModdedSelectConfig(c);
                }, c == this.curPawn));
            Rect innerRect = GenUI.GetInnerRect(rect, 17f);
            GUI.BeginGroup(innerRect);
            ModdedPawnCardUtility.ModdedDrawPawnCard(this.curPawn, new Action(this.ModdedRandomizeCurChar));
            GUI.EndGroup();
            Action action = delegate
            {
                AcceptanceReport acceptanceReport = this.ModdedCanStart();
                if (acceptanceReport.accepted)
                {
                    Action action2 = delegate
                    {
                        MapInitParams.startedFromEntry = true;
                    };
                }
                else
                {
                    Messages.Message(acceptanceReport.reasonText);
                }
            };
            DialogUtility.DoNextBackButtons(this.winRect, Translator.Translate("Continue"), action, delegate
            {
            });
        }

        private AcceptanceReport ModdedCanStart()
        {
            AcceptanceReport result;
            foreach (Pawn current in MapInitParams.colonists)
            {
                if (!current.Name.Valid)
                {
                    result = new AcceptanceReport(Translator.Translate("EveryoneNeedsValidName"));
                    return result;
                }
            }
            result = AcceptanceReport.WasAccepted;
            return result;
        }

        private void ModdedSelectConfig(Pawn c)
        {
            if (c != this.curPawn)
            {
                this.curPawn = c;
            }
        }
    }

    public static class ModdedPawnCardUtility
    {
        private const int MainRectsY = 100;
        private const float MainRectsHeight = 450f;
        private const int ConfigRectTitlesHeight = 40;
        public static Vector2 PawnCardSize = new Vector2(570f, 470f);

        public static void ModdedDrawPawnCard(Pawn pawn)
        {
            ModdedPawnCardUtility.ModdedDrawPawnCard(pawn, null);
        }

        public static void ModdedDrawPawnCard(Pawn curPawn, Action randomizeCallback)
        {
            bool flag = randomizeCallback != null;
            Rect rect = new Rect(0f, 0f, 300f, 30f);

            if (flag)
            {
                Rect rect2 = new Rect(rect);
                rect2.width *= 0.333f;
                Rect rect3 = new Rect(rect);
                rect3.width *= 0.333f;
                rect3.x += rect3.width;
                Rect rect4 = new Rect(rect);
                rect4.width *= 0.333f;
                rect4.x += rect3.width * 2f;
                PawnCardUtility.DoNameInputRect(rect2, ref curPawn.story.name.first, 12);
                if (curPawn.story.name.nick == curPawn.story.name.first || curPawn.story.name.nick == curPawn.story.name.last)
                {
                    GUI.color = new Color(1f, 1f, 1f, 0.5f);
                }
                PawnCardUtility.DoNameInputRect(rect3, ref curPawn.story.name.nick, 9);
                GUI.color = Color.white;
                PawnCardUtility.DoNameInputRect(rect4, ref curPawn.story.name.last, 12);
                TooltipHandler.TipRegion(rect2, "FirstNameDesc".Translate());
                TooltipHandler.TipRegion(rect3, "ShortIdentifierDesc".Translate());
                TooltipHandler.TipRegion(rect4, "LastNameDesc".Translate());
            }
            else
            {
                rect.width = 999f;
                GenFont.SetFontMedium();
                GUI.Label(rect, curPawn.Name.ToString());
                GenFont.SetFontSmall();
            }

            if (randomizeCallback != null)
            {
                Rect butRect = new Rect(320f, 0f, 175f, 40f);
                if (Widgets.TextButton(butRect, "Randomize".Translate()))
                {
                    randomizeCallback();
                }
            }

            Rect position = new Rect(0f, 45f, 300f, 30f);
            string text = (curPawn.gender != Gender.Male) ? "Female".Translate() : "Male".Translate();
            GUI.Label(position, string.Concat(new string[]
{
text,
" ",
curPawn.def.label,
" ",
curPawn.KindLabel,
", ",
"AgeIndicator".Translate(new object[]
{
curPawn.age
})
}));
            Rect rect5 = new Rect(0f, 100f, 260f, 450f);
            Rect rect6 = new Rect(rect5.xMax + 17f, 100f, 280f, 450f);
            Rect innerRect = rect5.GetInnerRect(10f);
            Rect innerRect2 = rect6.GetInnerRect(10f);
            GUI.BeginGroup(innerRect);
            float num = 0f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 200f, 30f), "Backstory".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            IEnumerator enumerator = Enum.GetValues(typeof(BackstorySlot)).GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    BackstorySlot backstorySlot = (BackstorySlot)((int)enumerator.Current);
                    Rect rect7 = new Rect(0f, num, innerRect.width, 24f);
                    if (rect7.Contains(Event.current.mousePosition))
                    {
                        Widgets.DrawHighlight(rect7);
                    }
                    TooltipHandler.TipRegion(rect7, curPawn.story.GetBackstory(backstorySlot).FullDescriptionFor(curPawn));
                    GUI.skin.label.alignment = TextAnchor.MiddleLeft;
                    string str = (backstorySlot != BackstorySlot.Adulthood) ? "Childhood".Translate() : "Adulthood".Translate();
                    GUI.Label(rect7, str + ":");
                    GUI.skin.label.alignment = TextAnchor.UpperLeft;
                    Rect position2 = new Rect(rect7);
                    position2.x += 90f;
                    position2.width -= 90f;
                    string title = curPawn.story.GetBackstory(backstorySlot).title;
                    GUI.Label(position2, title);
                    num += rect7.height + 2f;
                }
            }
            finally
            {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }
            }
            num += 25f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, num, 200f, 30f), "IncapableOf".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            StringBuilder stringBuilder = new StringBuilder();
            List<WorkTags> list = curPawn.story.DisabledWorkTags.ToList<WorkTags>();
            if (list.Count == 0)
            {
                stringBuilder.Append("(" + "NoneLower".Translate() + "), ");
            }
            else
            {
                foreach (WorkTags current in list)
                {
                    stringBuilder.Append(current.LabelTranslated());
                    stringBuilder.Append(", ");
                }
            }
            string text2 = stringBuilder.ToString();
            text2 = text2.Substring(0, text2.Length - 2);
            Rect position3 = new Rect(0f, num, innerRect.width, 999f);
            GUI.Label(position3, text2);
            num += 100f;
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, num, 200f, 30f), "Traits".Translate());
            num += 30f;
            GenFont.SetFontSmall();
            foreach (Trait current2 in curPawn.story.traits.allTraits)
            {
                Rect rect8 = new Rect(0f, num, innerRect.width, 24f);
                if (rect8.Contains(Event.current.mousePosition))
                {
                    Widgets.DrawHighlight(rect8);
                }
                GUI.Label(rect8, current2.def.label);
                num += rect8.height + 2f;
                TooltipHandler.TipRegion(rect8, "TraitsDoNothing".Translate());
            }
            GUI.EndGroup();
            GUI.BeginGroup(innerRect2);
            GenFont.SetFontMedium();
            GUI.Label(new Rect(0f, 0f, 200f, 30f), "Skills".Translate());
            SkillDrawer.SkillDrawMode drawMode;
            if (Game.Mode == GameMode.Gameplay)
            {
                drawMode = SkillDrawer.SkillDrawMode.Gameplay;
            }
            else
            {
                drawMode = SkillDrawer.SkillDrawMode.Menu;
            }
            SkillDrawer.DrawSkillsOf(curPawn, new Vector2(0f, 35f), drawMode);
            GUI.EndGroup();
        }
    }
}


But still throwing the exact same error, so guess that didn't make a difference  :-\ Anybody know what "<>c__DisplayClass6" is in reference to? Sure isn't something I made.

Argain

Apparently the Load Exceptions were a result of targeting the wrong .NET framework (needed to target 3.5), so got those cleared up... just the "Could not load class Genstep_ColonistCreationMod from node <li Class="Genstep_ColonistCreationMod" />" to resolve  ;D

Argain

<li Class="ColonistCreationMod.Genstep_ColonistCreationMod" /> finally no errors! And I am successfully raising a modded form of the Colonist Creation menu after the map generates but before the colonists are spawned... so this is definitely seeming a viable route  ;D will consider this problem 'solved' now and stop spamming this thread lol

nmid

Does this mean you can add more colonists to the colonist creation menu?
I like how this game can result in quotes that would be quite unnerving when said in public, out of context. StorymasterQ

Argain

#14
Yep! And it's something I'll be trying to implement into my Colonist Creation Mod (http://ludeon.com/forums/index.php?topic=4066.0) eventually... was thinking something along the lines of being able to add more tabs during the colonist creation, or just showing a dialog menu before-hand for selecting how many starting colonists you want. The latter option would be a lot easier to implement.

[edit] It's already implemented now  ;D