Apps Home
|
Create an App
Make Me Cum
Author:
thankkinsey
Description
Source Code
Launch App
Current Users
Created by:
Thankkinsey
// 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 saviorPrizeEnabled; var saviorPrizeDesc = ''; var showStartTime = new Date().getTime(); var tipsThisShow = 0; var savior = ''; var showInDanger = false; 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 pauseRequestDetected = false; var resumeRequestDetected = false; var showState = STOPPED; var lastState = STOPPED; var breakStartTime = 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..."); startShow(); } 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 + ''); if (ms > (4000 * breakLength)) { cb.log('return'); showState = STOPPED; cb.chatNotice("The break is over!"); } cb.setTimeout(updateShowState, refreshRate); } } function startShow() { showState = STARTED; showStartTime = new Date().getTime(); cb.changeRoomSubject('Show started! Level 1: ' + level1desc + ' - [#MakeMeCum - Don\'t Let the Tip Jar Empty]'); savior = lastTipper; chargeNextMinute(); updateShowState(); } function chargeNextMinute() { cb.log('chargeNextMinute()'); var oldLevel = 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 (oldLevel != level) { cb.changeRoomSubject('Level ' + level + ' reached: ' + currentLevelDesc + '- [#MakeMeCum - Don\'t Let the Tip Jar Empty]'); } if (showState == STARTED) { cb.log('about to charge and tip jar: ' + tipJar + ' TPM: ' + currentTPM); if (tipJar >= currentTPM) { tipJar = tipJar - currentTPM; // var tempCurrent = currentTPM; currentTPM = currentTPM + increment;//previousTPM; //previousTPM = tempCurrent; checkShowDanger(); cb.setTimeout(chargeNextMinute, 8000); } else { cb.log('going on break'); goOnBreak(); } cb.drawPanel(); } else { cb.log('chargeNextMinute called when show was not running!'); } } function checkShowDanger() { if (tipJar < currentTPM) { showInDanger = true; 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."); } else { if (showInDanger) { savior = lastTipper; thankSavior(); showInDanger = false; } showInDanger = false; } } function thankSavior() { cb.chatNotice('Thank you ' + savior + ' for keeping the show going!'); if (saviorPrizeEnabled) { cb.chatNotice('Whoever saved the show from ending most recently when I cum will win ***' + saviorPrizeDesc + '***') } } 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; } } checkShowDanger(); 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(); } 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: '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', required: false }, { name: 'level2desc', type: 'str', minLength: 1, maxLength: 255, label: 'second price level show description', required: false }, { name: 'level3desc', type: 'str', minLength: 1, maxLength: 255, label: 'third price level show description', required: false }, { name: 'level4desc', type: 'str', minLength: 1, maxLength: 255, label: 'fourth price level show description', required: false }, { name: 'level5desc', type: 'str', minLength: 1, maxLength: 255, label: 'fifth price level show description', 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) { if (user == 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) { 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) { var toGo = initialTPM - tipJar; if (toGo > 0) { 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' }; } else { 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) { return { 'template': '3_rows_of_labels', 'row1_label': 'On Break', 'row1_label': '', 'row2_label': 'Tip Jar:', 'row2_value': tipJar + ' tokens', 'row3_label': 'Time remaining:', 'row3_value': (breakLength - Math.trunc(ms / 60000)) + 'minutes' }; } else { return { 'template': '3_rows_of_labels', 'row1_label': 'On Break', 'row1_value': '', 'row2_label': 'Still Need:', 'row2_value': '' + (initialTPM - tipJar) + ' tokens', 'row3_label': 'Time Remaining:', 'row3_value': (breakLength - Math.trunc(ms / 60000)) + 'minutes' }; } } } }); 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.