UNPKG

generator-sts-protemplate

Version:

Yeoman generator for starting up new Slay the Spire mods

454 lines (416 loc) 14.5 kB
"use strict"; const Generator = require("yeoman-generator"); const chalk = require("chalk"); const yosay = require("yosay"); const path = require("path"); const mkdirp = require("mkdirp"); module.exports = class extends Generator { constructor(args, opts) { super(args, opts); this.option("empty"); Boolean(this.options.empty); } async prompting() { this.log( yosay( `Welcome to the ${chalk.red("sts")}${chalk.green("-pro")}${chalk.blue( "tem" )}${chalk.magenta("plate")} generator!` ) ); this.answers = await this.prompt([ { type: "input", name: "modIdPascal", message: "Mod ID PascalCase:", validate: function(input) { if (input === "") { return "Your mod ID can't be blank."; } return true; } }, { type: "author", name: "author", message: "Who is making this?" }, { type: "input", name: "steamPath", message: "Where is steam installed?", default: "C:\\Program Files (x86)\\Steam\\steamapps" }, { type: "input", name: "description", message: "Provide a description of your mod" } ]); this.answers.modIdPascal = this.answers.modIdPascal.charAt(0).toUpperCase() + this.answers.modIdPascal.slice(1); this.modIdCamel = toCamelCase(this.answers.modIdPascal); if (!this.options.empty) { this.templateChoices = await this.prompt({ type: "checkbox", name: "options", message: "What parts do you want to generate?", choices: [ "Cards", "Relics", "CardMods", "Powers", "Actions", "Character" ] }); // Go through the list of picked options and set each create option this.customizations = {}; Object.assign( this.customizations, this.templateChoices.options.includes("Cards") && { createCards: true }, this.templateChoices.options.includes("Relics") && { createRelics: true }, this.templateChoices.options.includes("CardMods") && { createCardMods: true }, this.templateChoices.options.includes("Powers") && { createPowers: true }, this.templateChoices.options.includes("Actions") && { createActions: true }, this.templateChoices.options.includes("Character") && { createChar: true } ); this.answers.modIdPascal = this.answers.modIdPascal.charAt(0).toUpperCase() + this.answers.modIdPascal.slice(1); this.modIdCamel = toCamelCase(this.answers.modIdPascal); if (this.customizations.createChar) { this.character = await this.prompt([ { type: "input", name: "charName", message: "What is the name of the character (in PascalCase)?", default: "TheTodo" }, { type: "input", name: "charColor", message: "What is the color for this character?", default: "GREY" } ]); } else { this.character = { charName: "TheTodo", charColor: "GREY" }; } // Change TheTodo to THE_TODO for use in Enums this.character.charNameEnum = this.character.charName .split(/(?=[A-Z])/) .join("_") .toUpperCase(); // Change TheTodo to The Todo and the Todo for charstrings this.character.charStringsCapital = this.character.charName .replace(/([A-Z])/g, " $1") .trim(); this.character.charStringsFirstLower = this.character.charStringsCapital.slice(0, 1).toLowerCase() + this.character.charStringsCapital.slice(1); // Change color Enum this.character.charColor = ( this.character.charName.toLowerCase().replace("the", "") + "_" + this.character.charColor ).toUpperCase(); } } writing() { if (!this.options.empty) { // Entrypoint this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/TodoMod.java`), this.destinationPath( `src/main/java/${this.modIdCamel}/${this.answers.modIdPascal}.java` ), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, modIdLower: this.answers.modIdPascal.toLowerCase(), createCards: this.customizations.createCards, createRelics: this.customizations.createRelics, createPowers: this.customizations.createPowers, createChar: this.customizations.createChar, charName: this.character.charName, charNameEnum: this.character.charNameEnum, charColor: this.character.charColor } ); // Custom Character if (this.customizations.createChar) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/TheTodo.java`), this.destinationPath( `src/main/java/${this.modIdCamel}/${this.character.charName}.java` ), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, createCards: this.customizations.createCards, createRelics: this.customizations.createRelics, charName: this.character.charName, charNameEnum: this.character.charNameEnum, charColor: this.character.charColor } ); } // Pom this.fs.copyTpl( this.templatePath("pom.xml"), this.destinationPath("pom.xml"), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, modIdLower: this.answers.modIdPascal.toLowerCase(), modIdSpaces: this.answers.modIdPascal .replace(/([A-Z])/g, " $1") .slice(1), steamPath: this.answers.steamPath, description: this.answers.description } ); // README this.fs.copyTpl( this.templatePath("README"), this.destinationPath("README.md") ); // Actions if (this.customizations.createActions) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/actions/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/actions/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel }, null, { globOptions: { dot: true } } ); } // Cardmods if (this.customizations.createCardMods) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/cardmods/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/cardmods/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel }, null, { globOptions: { dot: true } } ); } // Cards if (this.customizations.createCards) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/cards/**/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/cards/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, createChar: this.customizations.createChar, charName: this.character.charName, charColor: this.character.charColor }, null, { globOptions: { dot: true } } ); } // Powers if (this.customizations.createPowers) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/powers/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/powers/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, modIdLower: this.answers.modIdPascal.toLowerCase() }, null, { globOptions: { dot: true } } ); } // Relics if (this.customizations.createRelics) { this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/relics/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/relics/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, createChar: this.customizations.createChar, charName: this.character.charName, charColor: this.character.charColor }, null, { globOptions: { dot: true } } ); } // Util this.fs.copyTpl( this.templatePath(`src/main/java/theTodo/util/*`), this.destinationPath(`src/main/java/${this.modIdCamel}/util/`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, createPowers: this.customizations.createPowers, createActions: this.customizations.createActions }, null, { globOptions: { dot: true } } ); // Resources this.fs.copyTpl( this.templatePath(`src/main/resources/todomodResources/**/*`), this.destinationPath( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/` ), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, charName: this.character.charName, charStringsCapital: this.character.charStringsCapital, charStringsFirstLower: this.character.charStringsFirstLower }, null, { globOptions: { dot: true } } ); this.fs.copyTpl( this.templatePath(`src/main/resources/ModTheSpire.json`), this.destinationPath(`src/main/resources/ModTheSpire.json`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, author: this.answers.author } ); // Delete unused stuff if (!this.customizations.createCards) { this.fs.delete( `src/main/java/${this.modIdCamel}/util/CardArtRoller.java` ); this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/localization/eng/Cardstrings.json` ); } if (!this.customizations.createRelics) { this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/localization/eng/Relicstrings.json` ); } if (!this.customizations.createCardMods) { this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/InlineCardModDemo.java` ); this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/SelectCardsPlusCardMods.java` ); } if (!this.customizations.createPowers) { this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/localization/eng/Powerstrings.json` ); this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/ExampleTwoAmountPowerCard.java` ); this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/InlinePowerDemo.java` ); } if (!this.customizations.createChar) { this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/images/char` ); this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/images/charSelect` ); this.fs.delete( `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/localization/eng/Charstrings.json` ); } if (!this.customizations.createActions) { this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/EasyModalChoiceDemo.java` ); this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/EasyXCostDemo.java` ); this.fs.delete( `src/main/java/${this.modIdCamel}/cards/democards/complex/InlinePowerDemo.java` ); } } else { // Entrypoint this.fs.copyTpl( this.templatePath(`empty/src/main/java/theTodo/TodoMod.java`), this.destinationPath( `src/main/java/${this.modIdCamel}/${this.answers.modIdPascal}.java` ), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, modIdLower: this.answers.modIdPascal.toLowerCase() } ); // Pom this.fs.copyTpl( this.templatePath("pom.xml"), this.destinationPath("pom.xml"), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, modIdLower: this.answers.modIdPascal.toLowerCase(), modIdSpaces: this.answers.modIdPascal .replace(/([A-Z])/g, " $1") .slice(1), steamPath: this.answers.steamPath, description: this.answers.description } ); // Resources mkdirp.sync( path.join( this.destinationPath(), `src/main/resources/${this.answers.modIdPascal.toLowerCase()}Resources/` ) ); this.fs.copyTpl( this.templatePath(`src/main/resources/ModTheSpire.json`), this.destinationPath(`src/main/resources/ModTheSpire.json`), { modIdPascal: this.answers.modIdPascal, modIdCamel: this.modIdCamel, author: this.answers.author } ); // README this.fs.copyTpl( this.templatePath("README"), this.destinationPath("README.md") ); } } }; function toCamelCase(modId) { if (modId) { let firstChar = modId.charAt(0).toLowerCase(); let newName = firstChar + modId.slice(1); return newName; } return modId; }