Apps Home
|
Create an App
Tip Tumbler
Author:
rubzombie
Description
Source Code
Launch App
Current Users
Created by:
Rubzombie
// startof CBSv2 module - not for re-compilation (function(a,k){function g(a){this.message=a}g.prototype=Error();g.prototype.name="InvalidCharacterError";a.btoa||(a.btoa=function(a){a=String(a);for(var f,b,n=0,c=k,q="";a.charAt(n|0)||(c="=",n%1);q+=c.charAt(63&f>>8-n%1*8)){b=a.charCodeAt(n+=.75);if(255<b)throw new g('"btoa" failed: The string to be encoded contains characters outside of the Latin1 range.');f=f<<8|b}return q});a.atob||(a.atob=function(a){a=String(a).replace(/=+$/,"");if(1==a.length%4)throw new g('"atob" failed: The string to be decoded is not correctly encoded.'); for(var f=0,b,n,c=0,q="";n=a.charAt(c++);~n&&(b=f%4?64*b+n:n,f++%4)?q+=String.fromCharCode(255&b>>(-2*f&6)):0)n=k.indexOf(n);return q})})("undefined"===typeof exports?this:exports,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="); (function(a){var k=cb.onMessage,g=null,u=null,f,b="#"+(cb.settings.hasOwnProperty("slot")?cb.settings.slot:"")+"CBSv2",n=/^\/#[0-3]CBSv2\//;cb.log("CBS::v2::CB app/bot data Save/restore::20170923.009::Release");cb.onMessage=function(c){if("function"!==typeof c)throw new TypeError(c+" is not a function");k(function(k){var d=k.m.replace(/\s*/g,"").split("/");if(3<d.length&&""===d[0]&&d[1]===b){if(g&&u&&k.user===cb.room_slug){var p=d[2];if(4===d.length)d[3]="?",k.m=d.join("/");else if(6===d.length){if(!(f|| {}).hasOwnProperty(p)){var q=g();f={};f[p]=a.btoa(a.unescape(a.encodeURIComponent(q)));q||cb.log("onSave returned no data.")}f.hasOwnProperty(p)&&(q=parseInt(d[3],10),p=f[p].slice(q,q+512),d[4]=p,d[5]=p.length,k.m=d.join("/"))}else 7===d.length&&("0"===d[3]&&(f={},f[p]=""),f.hasOwnProperty(p)&&(d[3]=f[p].length,d[6]=d[4].length,k.m=d.join("/"),d[4]?f[p]+=d[4]:(q=a.decodeURIComponent(a.escape(a.atob(f[p]))),u(q),cb.chatNotice("Previously Saved Data Restored.",cb.room_slug))))}k["X-Spam"]=!0}else n.test(k.m)&& (k["X-Spam"]=!0);return c(k)});return c};cb.onRestore=function(a){if("function"!==typeof a)throw new TypeError(a+" is not a function");return u=a};cb.onSave=function(a){if("function"!==typeof a)throw new TypeError(a+" is not a function");return g=a};cb.onMessage(function(a){return a})})("undefined"===typeof exports?this:exports); // endof CBSv2 module - not for re-compilation var A=function(){function D(a,b){a=a||0;return a.toString()+" "+(1===a?b:b+"s")}function V(){var a=0,b=0;return{b:function(){return a},a:function(){return b},j:function(b){a+=b},clear:function(c){a+=c;b++},toString:function(){return D(a,"token")+" and "+D(b,"clear")}}}function O(a){a=/^\d+$/.exec(a.replace(/^\s+|\s+$/g,""));null!==a&&(a=Number(a[0]));return a}function W(a,b,c){return c.indexOf(a)===b}function l(a){if(a&&"string"===typeof a){l.hasOwnProperty("log")||(l.log=[]);var b=/(..)(:..)(:..)/.exec(new Date), c=b[1]%12||12;l.log.push((10>c?"0"+c:c)+b[2]+b[3]+" "+(12>b[1]?"A":"P")+"M : "+a);25<l.log.length&&l.log.shift();a=("Tip Tumbler: "+a).replace(/\+/g,"\uff0b").replace(/&/g,encodeURIComponent("&"))}l.hasOwnProperty("log")||cb.log(a.replace(/(\r\n|\n|\r|\\n)/gm," ").trim())}function H(a){var b=Array.prototype.slice.call(arguments),c,d=0,f;a&&"string"===typeof a&&("Enable"===cb.settings.multi_line_safe&&(c=a.split(/ *\n */),d=c.length,a=c[0]),b[0]=("Tip Tumbler: "+a.replace(/\+/g,"\uff0b")).replace(/&/g, encodeURIComponent("&")));cb.chatNotice.apply(cb,b);for(f=1;f<d;f++)b[0]=c[f].replace(/\+/g,"\uff0b").replace(/&/g,encodeURIComponent("&")),cb.chatNotice.apply(cb,b)}function n(a,b){var c=Array.prototype.slice.call(arguments);b&&"string"===typeof b&&b.length&&(c[0]=""+a,H.apply(X,c))}function P(){var a=0!==p?"Clear the Tip Tumbler board for "+F:"Tip Tumbler board cleared! Time for "+F;Q!==a&&(l("Changing subject to: "+a),cb.changeRoomSubject(a),Q=a)}function R(a){l("setDescription(): str: "+a);a= (a||cb.settings.goal_description||"").trim();for(var b=/\\u([0-9a-f]{4})/gi,c,d=[];null!==(c=b.exec(a));)d.push(c[1]);if(d.length)for(d=d.filter(W),b=0,c=d.length;b<c;b++)a=a.replace(new RegExp("\\\\u"+d[b],"gi"),String.fromCharCode(parseInt(d[b],16)));1>a.length||F===a||(F=a,n("goal description set: "+a,cb.room_slug,"#d5ebf8"))}function S(a){var b=1<cb.settings.rows?"_":"";return 0===a?b+"__":10>a?b+a.toString()+"_":100>a?a.toString()+"_":a.toString()}function T(a){l("showBoard(): user: "+a);var b, c,d;a=a||"";cb.chatNotice("",a,(cb.settings.rows-1)%2?"#d5ebf8":"#f2f9fd");for(b=0;b<cb.settings.rows;b++){c=0;for(d="_";10>c;c++)d+=S(e[10*b+c]);H("Board #"+I+": "+d,a,(cb.settings.rows+b)%2?"#d5ebf8":"#f2f9fd")}cb.chatNotice("\nType /help for help, /tip to play.\n",a,(cb.settings.rows+b)%2?"#d5ebf8":"#f2f9fd")}function M(){l("update_panel()");var a,b,c,d,f;if(0===p)d="Board Cleared!";else if(B!==x){if(d="hi ("+B+") lo ("+x+")",p<=cb.settings.nuke_threshold||y)d+=" nuke ("+p+")"}else d="nuke ("+ p+")";a=1<cb.settings.rows?cb.settings.rows-2:0;c=0;for(f=[];a<cb.settings.rows;a++,c++)for(b=0,f[c]="_";10>b;b++)f[c]+=S(e[10*a+b]);J.row1_value=d;J.row2_value=1<f.length?f[0]:"";J.row3_value=f[1]||f[0]}function U(){var a,b,c;a=0;e=[];x=1;B=10*cb.settings.rows;for(p=0;a<cb.settings.rows;a++)for(b=0;10>b;b++)c=10*a+b+1,e.push(c),p+=c;G=e.length;K=!1;I++;H("New Game: Board #"+I,"",(cb.settings.rows-1)%2?"#d5ebf8":"#f2f9fd");T();M();cb.drawPanel();P();q={};z=w=null}function Y(a){var b,c,d,f=[],k=[], g=[];v=[];for(b=0;b<G;b++){if(e[b]===a)return v.push(a),a;0<e[b]&&f.unshift(e[b])}d=f.length;for(b=0;b<=d;b++)k[b]=[],g[b]=[];for(c=0;c<=a;c++)k[0][c]=0;for(b=1;b<=d;b++)for(c=0;c<=a;c++)if(c>=f[b-1]){var h=k[b-1][c],r=f[b-1]+k[b-1][c-f[b-1]];k[b][c]=h>r?h:r;g[b][c]=f[b-1]+k[b-1][c-f[b-1]]>k[b-1][c]?1:-1}else g[b][c]=-1,k[b][c]=k[b-1][c];b=d;for(c=a;0<b;b--)1===g[b][c]&&(v.push(f[b-1]),c-=f[b-1]);return k[d][a]}function Z(){var a,b=G,c;do{c=0;for(a=1;a<=b-10;a++)e[a-1]>e[a-1+10]&&(c=e[a-1],e[a-1]= e[a-1+10],e[a-1+10]=c,c=a-1+10);b=c}while(0!==b)}function C(a){var b=(new Date).valueOf(),c=a.m,d=a.user,f="rubzombie"===d,k=d===cb.room_slug,g=a.is_mod,h=a.hasOwnProperty("is_pm")&&a.is_pm,r=/\/(tiptumbler|tt|#[0-3])?(board|help|hi|lo|nukes?|reset|show)\s*(\d+)?\s*([^\/]*)/ig,e,q,t,m=!1;if(E)if(k||g){if(/\/(sh|sphammer|#[0-3])?(english|enonly|sphammered)/i.test(c)||/\/(sh|sphammer)(help|spam)/i.test(c))E=!1,l("SpamBlockerAd: SpHammer detected");/\/(ngs|nogreyspammers)(help|spam|\?)/i.test(c)&&(E= !1,l("SpamBlockerAd: No Grey Spammers detected"))}else/<<<( has been SPAM HAMMERED| spHammer hit#)/.test(c)&&"#595959"===a.background&&"#999999"===a.c&&(E=!1,l("SpamBlockerAd: SpHammer detected"));if(!a["X-Spam"]&&"/"===c.trim()[0])for(;null!==(e=r.exec(c));)if(g=(e[1]||"tt").toLowerCase(),"tt"===g||"tiptumbler"===g||g===L)switch(t="",a["X-Spam"]=!0,q=(e[3]||"").trim(),g=e[4],e=e[2].toLowerCase(),e){case "board":case "show":T(d);break;case "help":f&&(t+="version: 2014/12/25.0\nTippers make the goal happen by clearing the Tip Tumbler board...\nTip Tumbler: "); t+="Help:\nTip to clear the board.\nTumble un-tipped amounts into view by clearing those in the bottom 2 rows of the info area, below the cam.\nType /show in chat to see the whole board.\nTip Tumbler: In-chat commands:\n";k&&(t+="\u00a0\u00a0/reset [rows [goal description]] - reset board\n\u00a0\u00a0/nukes - toggle nuke tip hints on and off\n\u00a0\u00a0/nukes max - set max nuke tip hint to max tokens\n");t+="\u00a0\u00a0/show - show the whole board\n";if(k||a.has_tokens)t+="\u00a0\u00a0/hi - show high tip hint\n\u00a0\u00a0/lo - show low tip hint\n\u00a0\u00a0/nuke - show nuke tip hint\n"; t+="\u00a0\u00a0/help - show this help message\n";n(t,d,"#f2f9fd");break;case "hi":k||a.has_tokens?n("Highest remaining value on board: "+(0===p?p:B),d,"#d5ebf8"):n("Sorry, high tip hint is only available to users with tokens.",d,"#d5ebf8");break;case "lo":k||a.has_tokens?n("Lowest remaining value on board: "+(0===p?p:x),d,"#d5ebf8"):n("Sorry, low tip hint is only available to users with tokens.",d,"#d5ebf8");break;case "nuke":k||a.has_tokens?n("Total remaining tokens on board: "+p,d,"#d5ebf8"):n("Sorry, 'nuke' tip hint is only available to users with tokens.", d,"#d5ebf8");break;case "nukes":k&&(g=q,l("toggleNukes(): val: "+g),void 0===g?y=!y:(g=O(g),null===g?(l("new_nuke_threshold: "+g),n("Error!! New 'nuke' hint threshold invalid value!",cb.room_slug,"#d5ebf8")):(cb.settings.nuke_threshold=g,n("max 'nuke' tip hint set: "+g+" token"+(1===g?"":"s"),cb.room_slug,"#d5ebf8"),y=!1)),cb.settings.hide_large_nukes=y?"No":"Yes",M(),cb.drawPanel(),n((y?"Showing":"Hiding")+" 'nuke' tip hints larger than "+cb.settings.nuke_threshold+" token"+(1===cb.settings.nuke_threshold? "":"s")+". Type /nukes again to "+(y?"hide":"show")+" them.",cb.room_slug,"#d5ebf8"));break;case "reset":k&&(m=O(q),l("setBoard(): val: "+m),e=void 0,null===m||void 0===m?e=cb.settings.rows||10:1>m?(n("minimum board size: 1 row",cb.room_slug,"#f2f9fd"),e=1):10<m?(n("maximum board size: 10 rows",cb.room_slug,"#f2f9fd"),e=10):e=m,cb.settings.rows!==e&&(cb.settings.rows=e,n("board size set: "+e+" row"+(1===e?"":"s"),cb.room_slug,"#d5ebf8")),R(g),m=!0)}m&&U();if(!k&&!a["X-Spam"]&&!h&&E){f=c.replace(/[\W_]/g, "").toLowerCase();k=f.replace(/[aeiou]/g,"");r=m=!1;h=d.replace(/_[0-9a-f]+/ig,"");C.hasOwnProperty("echo_user")&&C.hasOwnProperty("echo_text")&&(r=C.echo_text===c&&C.echo_user===h);C.echo_user=h;C.echo_text=c;!0===(m=r)&&l("SpamBlockerAd: echo match");h=0;for(r=u.f.length;!m&&h<r&&!(k.length<u.f[h].length);h++)!0===(m=-1!==k.indexOf(u.f[h]))&&l("SpamBlockerAd: simple match ("+h+"): "+u.f[h]);h=0;for(r=u.text.length;!m&&h<r;h++)!0===(m=u.text[h].test(c))&&l("SpamBlockerAd: text match ("+h+"): "+u.text[h].source); h=0;for(r=u.i.length;!m&&h<r;h++)!0===(m=u.i[h].test(f))&&l("SpamBlockerAd: plain match ("+h+"): "+u.i[h].source);h=0;for(r=u.g.length;!m&&h<r;h++)!0===(m=(new RegExp("(?:^|\\s):"+u.g[h]+"(?=\\s|$)","")).test(c))&&l("SpamBlockerAd: blacklist emoticons match ("+h+"): "+u.g[h]);m&&(n(["Message from the author:\n\u00a0\u00a0Thanks for using my "+(N?"app":"bot")+" :)\n\u00a0\u00a0By the way, user "+d+" has just spammed your chat!\n\u00a0\u00a0To stop them doing it again, launch my spam blocker, No\u00a0Grey\u00a0Spammers.\n\u00a0\u00a0See this "+ (N?"app":"bot")+"'s Description for a link ;)","End of Message"].join("\nTip Tumbler: "),cb.room_slug,"#f37e7e"),E=!1)}l("onMessage: "+((new Date).valueOf()-b)+"ms");return a}var u={text:[/[^\u0000-\u0080\u00ad\u2605\u2606\u2654\u2655\u265a\u265b]/],i:[],f:"dlnws mcmcm rtmnt chnskv cht4fr frtkns wgwgwg bst4cms httpggl lv4prty lvtrffn nd4strp prfllsn bnjknntt kkmlvlns nsxyjngs pssy4shw vcmsssns wlchstdt 100kstnls chnnmnwhr cmsssnscm grls4prty prmmchtcm rgclsngsn sndtdrtch tknsgnrtr tmrqrllh1 tpgmscrck bfrtsptchd glsmtrprtl mnhndynmmr schnmnprfl schtglbntr snddrtchlv wwwsxchtsr knntjmlgckn lslsnndmldn stdchlngwlg strmngnkdcm wtchmcmgrls chbnnjngsgls dtschmtrprtl fndfrtknshck hrgldtschkrl pyplrwstrnnn schfdsmwgdch wsnddglnpmml wstrnnnrpypl jckjxshrngnds kstnlsndhnrsk llrdngsnchthr mncmstjtztchn wndmrmnfrrlds dknnmnglbwchsn mprdndstrngtrk n1gnhmpgstfrtg chtwththswsmgrl stdnglchnnmnwhr wnnjrktwthmfrfr fsllnghtpcsndvds dsthtdstwchmmrsnd hbknfnnzllnntrssn nrnchbzckmtdntpps schfcktrffnndcmsx fdrstdnglchnnmnwhr llnfssthnmprflvnmr nynwnnjrktwthmfrfr vrllmsndfstnrdtsch glbdgbtsgrnchtmhrdr snddwskstnlsndglrst wsnddnnnndglndtschn chtrbtknnmndchvrgssn ftzstmgglndbrchtshrt mchvrdrcmllswshrwllt nynhrdrmstfckldrmlfs mchnchtlngwrtnndkmmzmr wrbckhtknnmchdjmlbschn kstnlsdtngprtlndtschlnd ntrssntbrmchfndstdnmnmprfl wnnjschtnmnprflndkntktrtmchdrt hbthrgntlchdhlfschlgschffthrvlldtn thsmnstrlysnfbtchsllngthmtfhsgrlfrnd dspmmrsndnfchzdmmvnjdmmdwrdnsgbnntndnsnstnflltdchknrfsnbldsnngwrbngrn".split(" "), g:"anarchy dance69 endlesspoop exbf extremevomit extremevomit2 extremevomitscat FISTING fuckass1 gape420 gay gay6 gaybj gayfuck2 gayfuck5 gaysuck2 goats3 gross kena kisshug55 kisshug56 kisshug57 powerbottom prolapse56 prolapse57 prolapse58 shit50 shit55 shithead takeit tubgirl3 vbutt wag".split(" ")},X=this,L=null,N,F="",I=0,e=[],G,v=[],B,x,p,K=!1,Q="",y=!1,q={},w=null,z=null,J={template:"3_rows_11_21_31",row1_value:"Tip Tumbler",row2_value:"...",row3_value:"..."},E=!0;return{l:function(){l("version: 2014/12/25.0"); l("init(): goal_description: "+F+"\nrows: "+cb.settings.rows+"\nhide_large_nukes: "+cb.settings.hide_large_nukes);cb.settings.hasOwnProperty("slot")&&(L="#"+cb.settings.slot);N="#0"===L;cb.settings.hasOwnProperty("slot")&&(L="#"+cb.settings.slot);R(cb.settings.goal_description);y="No"===cb.settings.hide_large_nukes;U()},o:200,h:10,onMessage:C,s:function(a){var b=(new Date).valueOf(),c,d=a.from_user,f=q[d]||new V,k=[],g="";a.amount<x&&!K&&(n("Sorry, your tip was lower than the lowest remaining on the board ("+ x+") But, thank you for playing :)",d,"#d5ebf8"),n(d+"'s tip was too small to clear anything from the board.",cb.room_slug,"#f2f9fd"));f.j(a.amount-Y(a.amount));for(a=0;a<v.length;a++)for(f.clear(v[a]),c=0,x=G,p=B=0;c<G;c++)e[c]===v[a]?e[c]=0:0<e[c]&&(p+=e[c],e[c]<x&&(x=e[c]),e[c]>B&&(B=e[c]));v.length&&(Z(),M(),cb.drawPanel(),n("Your tip cleared "+v.join(", ")+" from the board. Thank you for playing :)",d,"#d5ebf8"),n(d+"'s tip cleared "+v.join(", ")+" from the board."+(10<v.length?" Yeehaw!":5< v.length?" Woo-hoo!":""),cb.room_slug,"#f2f9fd"));q[d]=f;0<function(a,b){if(null===a)return-1;if(null===b)return 1;a=q[a];b=q[b];return a.b()<b.b()?-1:a.b()>b.b()||a.a()<b.a()?1:a.a()>b.a()?-1:0}(d,w)&&(w=d);0<function(a,b){if(null===a)return-1;if(null===b)return 1;a=q[a];b=q[b];return a.a()<b.a()?-1:a.a()>b.a()?1:a.b()<b.b()?-1:a.b()>b.b()?1:0}(d,z)&&(z=d);0!==p||K||(K=!0,P(),g=d!==w&&d!==z?g+("Thanks to "+d+", for clearing the board.\n"):g+("Board #"+I+": Cleared!\n"),Object.keys(q).forEach(function(a){a!== w&&a!==z&&k.push(a)}),k.length&&(g+="Thanks to "+k.join(", ")+".\n"),g=w!==z?g+("Special thanks to King Tipper"+w+", "+q[w]+".\nSpecial thanks to Master Clearer"+z+", "+q[z]+"."):g+("Special thanks to King Tipper and Master Clearer, "+w+", "+q[w]+"."),H(g,"","#d5ebf8"));l("onTip: "+((new Date).valueOf()-b)+"ms")},u:J}}(); cb.settings_choices=[{defaultValue:A.h,label:"Board Size (number of rows, max "+A.h+")",maxValue:A.h,minValue:1,name:"rows",type:"int"},{label:"Goal Description ('Clear the Tip Tumbler board for...')",maxLength:255,minLength:1,name:"goal_description",type:"str"},{choice1:"Yes",choice2:"No",defaultValue:"Yes",label:"Hide 'Nuke' Tip Hints...",name:"hide_large_nukes",required:!1,type:"choice"},{defaultValue:A.o,label:"...Greater than ... (tokens)",minValue:0,name:"nuke_threshold",required:!1,type:"int"}, {choice1:"Enable",choice2:"Disable",defaultValue:"Disable",label:"(Multi-line Safe Mode)",name:"multi_line_safe",type:"choice"}];cb.onDrawPanel(function(){return A.u});cb.onMessage(function(D){return A.onMessage(D)});cb.onTip(function(D){A.s(D)});A.l();
© Copyright Chaturbate 2011- 2026. All Rights Reserved.