public Faction(string type, Polity polity, CellGroup coreGroup, float influence, Faction parentFaction = null)
    {
        World = polity.World;

        LastUpdateDate = World.CurrentDate;

        long idOffset = 0;

        if (parentFaction != null)
        {
            idOffset = parentFaction.Id + 1;
        }

        PolityId = polity.Id;
        Polity   = polity;

        CoreGroup   = coreGroup;
        CoreGroupId = coreGroup.Id;

        long id = GenerateUniqueIdentifier(World.CurrentDate, 100L, idOffset);

        Info = new FactionInfo(type, id, this);

        Culture = new FactionCulture(this);

        CoreGroup.AddFactionCore(this);

        Influence = influence;

        GenerateName(parentFaction);

        IsInitialized = false;
    }
    public void MigrateToNewCoreGroup()
    {
        CoreGroup.RemoveFactionCore(this);

        CoreGroup   = NewCoreGroup;
        CoreGroupId = NewCoreGroup.Id;

        CoreGroup.AddFactionCore(this);

        if (IsDominant)
        {
            Polity.SetCoreGroup(CoreGroup);
        }
    }