addLayer("g", {
    name: "good will",
    symbol: "G",
    color: goodwillColor,
    branches: [ 'f' ],
    row: 3,
    position: 5,
    resource: "good will",
    baseResource: "fame",
    infoboxes: {
        lore: {
            title: "good will",
            body: `Your massive amounts of <span style="color: ${fameColor}">fans</span> and <span style="color: ${fameColor}">fame</span> have gotten your games an amount of <span style="color: ${goodwillColor}">good will</span>. Players are more likely to become <span style="color: ${fameColor}">fans</span>, and trust your games will be good for consumers and fun to boot...<br/><br/>` +
                  `<i>However</i>, this also means there's lots to gain by cashing in that <span style="color: ${goodwillColor}">good will</span>. Buying these upgrades will have powerful effects, but <span style="color: ${goodwillColor}">good will</span> is <span style="text-shadow: 0px 0px 4px">permanently</span> harder to gain the more you've earned, so it may be better to hold off until you have a lot of <span style="color: ${fameColor}">fans</span> before spending <span style="color: ${goodwillColor}">good will</span>.`
        }
    },
    resetDescription: "Get acknowledged as trustworthy by your fans for ",
    startData() { return {
        unlocked: false,
        points: new Decimal(0),
        unused: new Decimal(0)
    }},
    layerShown() { return player[this.layer].unlocked || player.f.best.gte(6) },
    type: "static",
    requires: new Decimal(8),
    base: new Decimal(1.25),
    baseAmount() { return player.f.points },
    exponent: 0.9,
    gainMult() {
        mult = new Decimal(1)
        if (hasUpgrade("l", 15)) mult = mult.div(upgradeEffect("l", 15))
        return mult
    },
    gainExp() {
        return new Decimal(1)
    },
    roundUpCost: true,
    onPrestige(gain) {
        player[this.layer].unused = player[this.layer].unused.add(gain)
    },
    effect() {
        if (inChallenge("d", 11))
            return new Decimal(1)
        let ret = player.g.unused.add(1)
        if (challengeCompletions("d", 12) > 0) ret = ret.add(player[this.layer].points.sub(player[this.layer].unused).div(2))
        ret = ret.pow(2.5)
        if (hasUpgrade("l", 15)) ret = ret.pow(2)
        return ret
    },
    effectDescription() {
        return `which multiplies your fame and fan effects by x${formatWhole(this.effect())}.`
    },
    tooltip() { return `${formatWhole(player.g.unused)} good will` },
    hotkeys: [
        {
            key: "g",
            description: "Press G to get acknowledged as trustworthy by your fans",
            onPress() { if (canReset(this.layer)) doReset(this.layer) }
        }
    ],
    tabFormat: [
        ["infobox", "lore"],
        ["display-text", () => inChallenge("d", 11) ? `<h2 style="color: red;">Disabled during ${layers.d.challenges[player.d.activeChallenge].name} degree plan</h2>` : ""],
        ["display-text", () => `You have <h2 style="color: ${tmp.g.color}; text-shadow: ${tmp.g.color} 0px 0px 10px">${formatWhole(player.g.unused)}</h2> good will, ${layers.g.effectDescription()}`],
        ["display-text", () => `You have earned a total of ${player.g.points} good will.`],
        "blank",
        "prestige-button",
        "blank",
        ["display-text", () => `<button onClick="layers.g.respec()" class="longUpg ${player.g.unlocked ? 'can' : 'locked'}">Respec<br>(Causes good will reset)</button>`],
        "blank",
        "upgrades",
        "milestones"
    ],
    upgrades: {
        rows: 2,
        cols: 3,
        11: {
            title: "Surprise Mechanics",
            description: "Unlock a series of powerful revenue upgrades",
            cost: new Decimal(1),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g
        },
        12: {
            title: "Trojans and Worms",
            description: "Unlock a series of powerful fame upgrades",
            cost: new Decimal(1),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g
        },
        13: {
            title: "Let them make their own content",
            description: "Unlock a series of powerful update upgrades",
            cost: new Decimal(1),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g
        },
        21: {
            title: "Trick fans into refactoring for you",
            description: "Use free labor to multiply refactors gain based on your fame",
            cost: new Decimal(2),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g,
            effect() { return player.f.points.pow(2).add(1) }
        },
        22: {
            title: "Hack into college databases",
            description: "Manipulate your GPA to multiply enrollment gain based on your refactors",
            cost: new Decimal(2),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g,
            effect() { return player.r.points.pow(2).add(1) }
        },
        23: {
            title: "Run for Student Government",
            description: "Take advantage of your local colleges to spread the word about your games and multiply fame gain based on enrollments",
            cost: new Decimal(2),
            currencyDisplayName: "goodwill",
            currencyInternalName: "unused",
            currencyLocation: () => player.g,
            effect() { return player.s.points.pow(2).add(1) }
        }
    },
    milestones: {
        0: {
            requirementDescription: "1 total good will",
            effectDescription: "Start row 4 resets with 1000 fans",
            done() { return player[this.layer].points.gte(1) }
        },
        1: {
            requirementDescription: "2 total good will",
            effectDescription: "Start row 4 resets with 1 of each social media account, and unlock a new Degree program",
            done() { return player[this.layer].points.gte(2) }
        },
        2: {
            requirementDescription: "3 total good will",
            effectDescription: "Retain fame milestones and upgrades",
            done() { return player[this.layer].points.gte(3) }
        }
    },
    respec() {
        player.g.upgrades = []
        player.g.unused = player.g.points
        doReset('g', true)
    }
})