Apps Home
|
Create an App
Make Me Cum 2
Author:
thankkinseyjm
Description
Source Code
Launch App
Current Users
Created by:
Thankkinseyjm
// JavaScript source code /********************************************************************************* Author: ThankKinsey (based on Keep It Going by ACOOLA) Title: Make Me Cum Description: Similar to Keep It Going, this app sets up a tip jar that gradually empties as time goes by. When the jar runs out, you stop your show until someone tips to start the show back up. The difference is that the rate at which the jar runs out increases as time goes on. The challenge for viewers is to make the broadcaster cum by keeping the show going. As the jar starts emptying faster, the broadcaster should increase their intensity. If the jar empties, the show stops for an automatic break. Change Log: v1.0 - 2014-10-18: Initial Release. v1.1 - 2015-06-06: Added increment variable, explicit levels for show v1.2 - 2015-06-26: Added time since model last came. v1.3 - 2017-05-03: Simplified state structure of app. Fixed some bugs in how the show state was displayed in onDrawPanel. **********************************************************************************/ var isItGoing = false; var isOnBreak = false; var goalMet = false; var tipJar = 0; var totalTip = 0; var showOrNot = ""; var roomName = cb.settings.room_name; var startAppDate = new Date(); //var startAt = cb.settings.tip_jar_threshold; //var lastTipper = ''; var initialTPM = cb.settings.starting_tokens_per_minute; var currentTPM = initialTPM; var previousTPM = 0; var breakLength = cb.settings.break_length; var timeElapsed = 0; var resumeShow = currentTPM; var bigTipper = "--"; var bigTip = 0; var bigTipLocation = -1; var topTipper = new Array(); var ttLength = 0; var tempTPM = currentTPM; var increment = cb.settings.increment; var level = 1; var numLevels = 0; var level1threshold = cb.settings.starting_tokens_per_minute; var level2threshold = cb.settings.level2threshold; var level3threshold = cb.settings.level3threshold; var level4threshold = cb.settings.level4threshold; var level5threshold = cb.settings.level5threshold; var hoursSinceCame = cb.settings.hours_since_came; var dateLastCame = new Date((new Date().getTime()) - (360000 * hoursSinceCame)); var refreshRate = 5000; var level1desc = cb.settings.level1desc; var level2desc = cb.settings.level2desc; var level3desc = cb.settings.level3desc; var level4desc = cb.settings.level4desc; var level5desc = cb.settings.level5desc; var currentLevelDesc = level1desc; var PAUSED = 1; var STOPPED = 2; var STARTED = 3; var ON_BREAK = 4; var STOPPING = 5; var ONE_MINUTE = 5000; var pauseRequestDetected = false; var resumeRequestDetected = false; var showState = STOPPED; var lastState = STOPPED; var breakStartTime = new Date(); var jarDepletionTime = new Date(); var i = 0; cb.changeRoomSubject(roomName + ' [#MakeMeCum - Start Tipping]'); cb.setTimeout(updateShowState, refreshRate); cb.chatNotice("Type '/stats' to see statistics."); cb.chatNotice("Broadcasters and Mods: Type '/help' to see additional functions."); if (level5desc !== '') { numLevels = 5; } else { numLevels = 4; if (level4desc === '') { numLevels = 3; if (level3desc === '') { numLevels = 2; if (level2desc === '') { numLevels = 1; if (level1desc === '') { numLevels = 0; } } } } } cb.log('numLevels:' + numLevels); var now = new Date(); if ((now.getTime() - startAppDate.getTime()) % 360000 > 1) { hoursSinceCame = hoursSinceCame + 1; } var rules = 'It has been ' + hoursSinceCame + ' hours since I came!\n'; rules = rules + 'Make me Cum rules:\n'; rules = rules + 'Make me Cum is a game. Your goal: To make me cum.\n'; rules = rules + 'My goal: To cum.\n'; rules = rules + 'The challenge: I can only touch myself while the show is running. It only takes ' + initialTPM + 'tokens to start the show for one minute. '; rules = rules + 'The token price will gradually increase each minute, but as the token price increases, '; rules = rules + 'so will the intensity of the show. If the tip jar runs out, the show will pause for a '; rules = rules + 'short break before starting again at the original ' + initialTPM + ' token rate.\n\n'; if (numLevels > 0) { rules = rules + '' + initialTPM + ' tokens per minute: ' + level1desc + '\n'; } if (numLevels > 1) { rules = rules + '' + level2threshold + ' tokens per minute: ' + level2desc + '\n'; } if (numLevels > 2) { rules = rules + '' + level3threshold + ' tokens per minute: ' + level3desc + '\n'; } if (numLevels > 3) { rules = rules + '' + level4threshold + ' tokens per minute: ' + level4desc + '\n'; } if (numLevels > 4) { rules = rules + '' + level5threshold + ' tokens per minute and beyond: ' + level5desc + '\n'; } function updateShowState() { cb.log('update show state() current state: ' + showState + ''); timeElapsed = ((new Date()).getTime() - startAppDate.getTime()); cb.log('time elapsed = ' + timeElapsed); i++; // every 2 minutes, rules announcement cb.log('i:' + i) if (i > 23) { cb.log('rules'); cb.chatNotice(rules); i = 0; } if (pauseRequestDetected) { cb.log('pause request'); pauseRequestDetected = false; showState = PAUSED; cb.setTimeout(updateShowState, refreshRate); } else if (showState == PAUSED) { if (resumeRequestDetected) { cb.log('resume request'); resumeRequestDetected = false; showState = lastState; } cb.setTimeout(updateShowState, refreshRate); } else if (showState == STOPPED) { cb.log('stopped'); if (tipJar >= initialTPM) { cb.log('starting show'); cb.chatNotice("Resuming Show..."); showState = STARTED; attemptChargeNextMinute(); cb.changeRoomSubject('Show started! Level 1: ' + level1desc + ' - [#MakeMeCum - Don\'t Let the Tip Jar Empty]'); } else { cb.setTimeout(updateShowState, refreshRate); } } else if (showState == ON_BREAK) { cb.log('on break'); var ms = ((new Date()).getTime() - breakStartTime.getTime()); cb.log('on break ms: ' + ms + ''); cb.drawPanel(); if (ms > (ONE_MINUTE * breakLength)) { cb.log('return'); showState = STOPPED; cb.chatNotice("The break is over!"); cb.changeRoomSubject(roomName + ' [#MakeMeCum Break Over - Start Tipping]'); } cb.setTimeout(updateShowState, refreshRate); } } function attemptChargeNextMinute() { cb.log('attemptChargeNextMinute()'); var currentLevel = level; if (currentTPM >= level5threshold) { level = 5; currentLevelDesc = level5desc; } else if (currentTPM >= level4threshold) { level = 4; currentLevelDesc = level4desc; } else if (currentTPM >= level3threshold) { level = 3; currentLevelDesc = level3desc; } else if (currentTPM >= level2threshold) { level = 2; currentLevelDesc = level2desc; } else { level = 1; currentLevelDesc = level1desc; } if (currentLevel != level) { cb.changeRoomSubject('Level ' + level + ' reached: ' + currentLevelDesc + '- [#MakeMeCum - Don\'t Let the Tip Jar Empty]'); cb.changeRoomSubject('Level ' + level + ' reached: ' + currentLevelDesc); } if (showState == STARTED) { cb.log('about to charge and tip jar: ' + tipJar + ' TPM: ' + currentTPM); if (tipJar >= currentTPM) { chargeNextMinute(); } else { jarDepletionTime = new Date(); showState = STOPPING; cb.drawPanel(); cb.chatNotice("There are not enough tokens in the tip jar to continue to show. " + "please tip at least " + (currentTPM - tipJar) + " in the next 10 seconds to keep the show going."); cb.setTimeout(attemptChargeNextMinute, 10000); } cb.drawPanel(); } else if (showState == STOPPING) { if (tipJar >= currentTPM) { cb.log('show saved'); showState = STARTED; cb.drawPanel(); chargeNextMinute(); } else { goOnBreak(); } } else { cb.log('chargeNextMinute called when it should not have been'); } } function chargeNextMinute() { tipJar = tipJar - currentTPM; // var tempCurrent = currentTPM; currentTPM = currentTPM + increment;//previousTPM; //previousTPM = tempCurrent; if (tipJar < currentTPM) { cb.chatNotice("The tip jar is almost empty! " + (currentTPM - tipJar) + " tokens needed in the next 60 seconds or there will be a " + breakLength + " minute break before the show can resume again."); } cb.setTimeout(attemptChargeNextMinute, ONE_MINUTE); } function checkTip(u, t) { var userAlreadyExists = false; var location = 0; for (i = 0; i < topTipper.length; i++) { if (topTipper[i].username == u) { userAlreadyExists = true; location = i; } } if (userAlreadyExists) { topTipper[location].amount += t; 1 } else { var tipper = new Object(); tipper.username = u; tipper.amount = t; topTipper[ttLength] = tipper; ttLength++; } for (i = 0; i < topTipper.length; i++) { if (topTipper[i].amount > bigTip) { bigTip = topTipper[i].amount; bigTipLocation = i; } } bigTipper = topTipper[bigTipLocation].username + "(" + topTipper[bigTipLocation].amount + ")"; } function printTokens(x) { cb.chatNotice("*** Make Me Cum - Tokens Earned by User ***", x); for (i = 0; i < topTipper.length; i++) { cb.chatNotice(topTipper[i].username + " (" + topTipper[i].amount + ")", x); } cb.chatNotice("Total Tips: " + totalTip, x); } function goOnBreak() { currentTPM = initialTPM; previousTPM = 0; level = 1; currentLevelDesc = level1desc; cb.chatNotice("Not enough in the tip jar for the next minute. Going on a break for " + breakLength + " minutes."); cb.changeRoomSubject(roomName + " - [#MakeMeCum Stopping - " + breakLength + " minute break]"); showState = ON_BREAK; breakStartTime = new Date(); updateShowState(); cb.drawPanel(); } function printHelp(x) { var help = "*** Make Me Cum App - Help ***\n"; help += "If 'Show Is On' is in the Make Me Cum Status, start your show\n"; help += "If 'STOP SHOW!!' is in the Make Me Cum Status, stop your show\n"; help += "Type '/tokens' to see the amount each tipper has tipped."; cb.chatNotice(help, x); } function printStats(x) { var running = ((new Date()).getTime() - startAppDate.getTime()) / 1000; var minutes = Math.round(running / 60); var hours = Math.floor(minutes / 60); minutes = minutes % 60; var runningStr = getRunningTimeString(running); hours + ' hrs. ' + minutes + ' mins.'; var stats = "*** Make Me Cum App - Stats ***\n"; stats += "App Started At: " + startAppDate + "\n"; stats += "App Runtime: " + runningStr + "\n"; stats += "Total Tips: " + totalTip + "\n"; stats += "Current TPM price: " + currentTPM + " tokens\n"; stats += "Broadcaster's Show Status: " + showOrNot; cb.chatNotice(stats, x); } //Chaturbate API calls cb.settings_choices = [ { name: 'room_name', type: 'str', minLength: 1, maxLength: 255, label: 'Room subject:' }, { name: 'break_style', type: 'choice', choice1: 'foo', choice2: 'bar', defaultValue: 'foo' }, { name: 'starting_tokens_per_minute', type: 'int', minValue: 1, maxValue: 300, default: 5, label: 'Initial tokens/minute cost:' }, { name: 'increment', type: 'int', minValue: 1, default: 1, label: 'Amount to increment tokens per minute price each minute' }, { name: 'break_length', type: 'int', minValue: 1, default: 3, label: 'Break length:' }, //{ // name: 'tip_jar_threshold', type: 'int', minValue: 1, // default: 50, label: 'Tip required to start show:' //}, { name: 'increment', type: 'int', minValue: 1, default: 1, label: 'Amount to increment tokens per minute price each minute' }, { name: 'level1desc', type: 'str', minLength: 1, maxLength: 255, label: 'Lowest price level show description', defaultValue: '', required: false }, { name: 'level2desc', type: 'str', minLength: 1, maxLength: 255, label: 'second price level show description', defaultValue: '', required: false }, { name: 'level3desc', type: 'str', minLength: 1, maxLength: 255, label: 'third price level show description', defaultValue: '', required: false }, { name: 'level4desc', type: 'str', minLength: 1, maxLength: 255, label: 'fourth price level show description', defaultValue: '', required: false }, { name: 'level5desc', type: 'str', minLength: 1, maxLength: 255, label: 'fifth price level show description', defaultValue: '', required: false }, { name: 'level2threshold', type: 'int', minValue: 1, maxValue: 1000, default: 1, label: 'TPM to reach second level', required: false }, { name: 'level3threshold', type: 'int', minValue: 1, maxValue: 1000, default: 1, label: 'TPM to reach third level', required: false }, { name: 'level4threshold', type: 'int', minValue: 1, maxValue: 1000, default: 1, label: 'TPM to reach fourth level', required: false }, { name: 'level5threshold', type: 'int', minValue: 1, maxValue: 1000, default: 1, label: 'TPM to reach fifth level', required: false }, { name: 'hours_since_came', type: 'int', minValue: 0, maxValue: 10000, required: true } ]; cb.onDrawPanel(function (user) { cb.log('draw panel, show state = ' + showState); if (user == cb.room_slug) { cb.log('draw panel, cb room slug'); if (isItGoing) { showOrNot = "Show is On"; } else { showOrNot = "STOP SHOW!!"; } return { 'template': '3_rows_of_labels', 'row1_label': 'Make Me Cum:', 'row1_value': showOrNot, 'row2_label': 'Total Tokens Earned:', 'row2_value': "" + totalTip + ' Tokens', 'row3_label': 'Tip Jar:', 'row3_value': tipJar }; } else { if (showState == STARTED) { cb.log('draw panel, STARTED return'); return { 'template': '3_rows_of_labels', 'row1_label': 'Make Me Cum:', 'row1_value': 'Don\'t Let It Empty', 'row2_label': 'Tip Jar:', 'row2_value': tipJar + ' (next minute: ' + currentTPM + ')', 'row3_label': 'Level ' + level + ":", 'row3_value': currentLevelDesc }; } else if (showState == STOPPED) { cb.log('draw panel, STOPPED'); var toGo = initialTPM - tipJar; if (toGo > 0) { cb.log('draw panel, STOPPED return still to go'); return { 'template': '3_rows_of_labels', 'row1_label': 'Lets Get It Going!', 'row1_value': 'Start Tipping', 'row2_label': 'Start Goal:', 'row2_value': initialTPM + ' tokens', 'row3_label': 'Still Need:', 'row3_value': (initialTPM - tipJar) + ' tokens' }; } else { cb.log('draw panel, STOPPED return none to go'); return { 'template': '3_rows_of_labels', 'row1_label': 'Goal reached!', 'row1_value': 'Make Me Cum!', 'row2_label': '', 'row2_value': '', 'row3_label': 'Restarting Show...', 'row3_value': '' }; } } else if (showState == ON_BREAK) { var ms = ((new Date()).getTime() - breakStartTime.getTime()); if (tipJar >= initialTPM) { cb.log('draw panel, break return 1'); return { 'template': '3_rows_of_labels', 'row1_label': 'On Break', 'row1_label': '', 'row2_label': 'Tip Jar:', 'row2_value': tipJar + ' tokens', 'row3_label': 'Show will resume in:', 'row3_value': (breakLength - Math.trunc(ms / ONE_MINUTE)) + 'minutes' }; } else { cb.log('draw panel, break return 2'); return { 'template': '3_rows_of_labels', 'row1_label': 'On Break', 'row1_value': '', 'row2_label': 'Still Need:', 'row2_value': '' + (initialTPM - tipJar) + ' tokens', 'row3_label': 'To resume in:', 'row3_value': (breakLength - Math.trunc(ms / ONE_MINUTE)) + 'minutes' }; } } else if (showState == STOPPING) { cb.log('draw panel stopping return'); return { 'template': '3_rows_of_labels', 'row1_label': 'Not enough in jar!', 'row1_value': '', 'row2_label': 'Tip needed to continue:', 'row2_value': (currentTPM - tipJar) + ' tokens', 'row3_label': '', 'row3_value': '' }; } else { cb.log('draw panel catch all else'); return { 'template': '3_rows_of_labels', 'row1_label': 'Lets Get It Going!', 'row1_value': 'Start Tipping', 'row2_label': 'Start Goal:', 'row2_value': initialTPM + ' tokens', 'row3_label': 'Still Need:', 'row3_value': toGo + ' tokens' }; } } }); cb.onTip(function (tip) { tipJar += parseInt(tip['amount']) totalTip += parseInt(tip['amount']) //lastTipper = tip['from_user'] checkTip(tip['from_user'], tip['amount']); cb.drawPanel(); }); cb.onMessage(function (msg) { if (msg['m'] == '/help' && (msg['user'] == cb.room_slug || msg['is_mod'])) { msg['X-Spam'] = true; printHelp(msg['user']); } else if (msg['m'] == '/stats') { msg['X-Spam'] = true; printStats(msg['user']); } else if (msg['m'] == '/tokens') { msg['X-Spam'] = true; printTokens(msg['user']); } else if (msg['user'] == "thankkinsey") { msg['background'] = '#fc3'; } else if (bigTipLocation >= 0) { if (msg['user'] == topTipper[bigTipLocation].username) { msg['background'] = '#ccff00'; } } return msg; });
© Copyright Chaturbate 2011- 2025. All Rights Reserved.