/// class ContentMoleculeFucking extends ContentMolecule { protected say : Say | ((relevantAtoms : Array) => Say); protected saidTimes = 0; public constructor (description : Say | ((relevantAtoms : Array) => Say)) { super(); this.say = description; ContentMoleculeFucking.MOLECULES.push(this); } public getSay(specificMolecule : ContentMolecule, relevantAtoms : Array) { this.saidTimes++; if (this.say instanceof Say) { return this.say; } else { //let relevantAtoms = specificMolecule.findMatches([this.fuckingAtom]) //let fuckingAtom = (specificMolecule.getAtoms()[0]); return this.say(relevantAtoms); } } public getWeight () { // TODO: Check if this implementation is good enough. let weight = -this.saidTimes; this.atoms.forEach(value => { weight += value.getAtomPriority() }); return weight; } protected static MOLECULES : Array = []; /** * Searches for Fucking molecules that describe the specificMolecule given. Assumes atoms are of the Fucking variety. * @param specificMolecule */ public static getSay (specificMolecule : ContentMolecule) { // Randomize the array to prevent the same message from showing up every time let many : Array = new Shuffler(ContentMoleculeFucking.MOLECULES).getShuffled(); // Order the array placing higher priority messages on top, but messages with same priority are still randomized many.sort((a, b) => { return b.getWeight() - a.getWeight() }); let matches = specificMolecule.findMatches(many); if (matches.length == 0) { let say = new Say("Unable to find match for this sexual passage."); specificMolecule.getAtoms().forEach((atom : ContentAtomFucking) => { say.add(Say.LINE_BREAK, "Fucker: ", atom.fucker, ". Fucked: ", atom.fucked, ". Stick: ", atom.stick, ". Hole: ", atom.hole, ". Markers: ", ...(atom.markers.getNouns()), ". Please report for fixing." ); }); Elements.CurrentTurnHandler.printAsError(say); return new Say(); } else { let finalSay = new Say(); matches.forEach((idx : number) => { let value = ContentMoleculeFucking.MOLECULES[idx]; finalSay.add( value.getSay( specificMolecule, specificMolecule.findMatches([value], true) ) ); finalSay.add(" "); }); return finalSay; } } }