/// /// /// interface ContentTypeOptions { id : string; defaultValue : boolean; description : Say | string; currentValueDescription? : (c : ContentType) => Say | string; /** * Use sparingly. Content-Types that shouldn't be allowed to change are those that either: * - Fundamental to the game in some way. Most of these will only remain stuck until the game has enough content to make do without it. * - Something that's only a negative signal: signalizing that this content will not appear during development/gameplay at all, letting players know it isn't available and probably won't be. */ changeable? : boolean; } class ContentType extends StoredMemory { private description : Say; private valueDescription : (c : ContentType) => Say | string = () => { return new Say (JSON.stringify(this.getValue())); }; private changeable : boolean = true; private static memoryPrefix = "ct_"; public constructor (options : ContentTypeOptions) { super(ContentType.memoryPrefix + options.id, options.defaultValue); this.description = options.description instanceof Say ? options.description : new Say(options.description); this.valueDescription = options.currentValueDescription == undefined ? this.valueDescription : options.currentValueDescription; if (options.changeable == false) { this.storeValue(options.defaultValue); // prevent localStorage alterations from affecting something that can't be changed this.changeable = false; } ContentHandler.registerContentType(this); } public getDescription () { return this.description; } public getValueDescription () { let desc = this.valueDescription(this); if (desc instanceof Say) { return desc; } else { return new Say(desc); } } public toggle () { if (this.changeable) { this.storeValue(!this.getValue()); } } public isAllowed() { return this.getValue(); } public static MM = new ContentType({ changeable : false, // There will be too little content at first for us to block part of it for no good reason, maybe at some point description : "Homosexual (M/M) sexual events", id : "MM", defaultValue : true }); public static FF = new ContentType({ changeable : false, // There will be too little content at first for us to block part of it for no good reason, maybe at some point description : "Homosexual (F/F) sexual events", id : "FF", defaultValue : true }); public static MF = new ContentType({ changeable : false, // There will be too little content at first for us to block part of it for no good reason, maybe at some point description : "Heterosexual (M/F) sexual events", id : "MF", defaultValue : true }); public static Beast = new ContentType({ changeable : true, description : "Sexual events with either monsters or magical beasts. MM/MF/FF take precedence over this one if blocked. Sufficiently human creatures do not get counted into this.", id : "Beast", defaultValue : true }); public static Scat = new ContentType({ changeable : false, description : "Scatologic sexual events", id : "Scat", defaultValue : false // There is no intention of ever adding these }); public static Pee = new ContentType({ changeable : false, description : "Sexual events with urine", id : "Urophilia", defaultValue : false // There is no intention of ever adding these }); }