diff --git a/migrations/csvexport.phy b/migrations/csvexport.phy new file mode 100644 index 0000000000..f50799e73b --- /dev/null +++ b/migrations/csvexport.phy @@ -0,0 +1,10 @@ +import csv + +data = csv.reader(open('/home/slappybag/backrs/800dollar.csv', 'rb'), delimiter=",", quotechar='|') +column = [] + +for row in data: + column.append(row[9]) + +print "one:" +print column \ No newline at end of file diff --git a/src/app/algos.coffee b/src/app/algos.coffee index 5a24d1b9a5..1e9ab67cdf 100644 --- a/src/app/algos.coffee +++ b/src/app/algos.coffee @@ -48,8 +48,15 @@ module.exports.hpModifier = (value, armorDef, helmDef, shieldDef, level, priorit Future use {priority} user-defined priority multiplier ### -module.exports.gpModifier = (value, modifier, priority='!') -> - return value * modifier * priorityValue(priority) +module.exports.gpModifier = (value, modifier, priority='!', streak, model) -> + val = value * modifier * priorityValue(priority) + if streak and model + streakBonus = streak / 100 + 1 # eg, 1-day streak is 1.1, 2-day is 1.2, etc + afterStreak = val * streakBonus + model.set('_streakBonus', afterStreak - val) if (val > 0) # can we do this without model? just global emit? + return afterStreak + else + return val ### Calculates the next task.value based on direction diff --git a/src/app/browser.coffee b/src/app/browser.coffee index 9256a4021f..c954716d01 100644 --- a/src/app/browser.coffee +++ b/src/app/browser.coffee @@ -157,18 +157,32 @@ setupGrowlNotifications = (model) -> else if num > 0 statsNotification " + #{rounded} XP", 'xp' - user.on 'set', 'stats.gp', (captures, args) -> - num = captures - args - absolute = Math.abs(num) + ### + Show "+ 5 {gold_coin} 3 {silver_coin}" + ### + showCoins = (money) -> + absolute = Math.abs(money) gold = Math.floor(absolute) silver = Math.floor((absolute-gold)*100) - sign = if num < 0 then '-' else '+' if gold and silver > 0 - statsNotification "#{sign} #{gold} #{silver} ", 'gp' + return "#{gold} #{silver} " else if gold > 0 - statsNotification "#{sign} #{gold} ", 'gp' + return "#{gold} " else if silver > 0 - statsNotification "#{sign} #{silver} ", 'gp' + return "#{silver} " + + user.on 'set', 'stats.gp', (captures, args) -> + money = captures - args + return unless !!money # why is this happening? gotta find where stats.gp is being set from (-)habit + sign = if money < 0 then '-' else '+' + statsNotification "#{sign} #{showCoins(money)}", 'gp' + + # Append Bonus + bonus = model.get('_streakBonus') + if (money > 0) and !!bonus + bonus = 0.01 if bonus < 0.01 + statsNotification "+ #{showCoins(bonus)} Streak Bonus!" + model.del('_streakBonus') user.on 'set', 'stats.lvl', (captures, args) -> if captures > args diff --git a/src/app/helpers.coffee b/src/app/helpers.coffee index a60e2b4c03..ebad1dc51e 100644 --- a/src/app/helpers.coffee +++ b/src/app/helpers.coffee @@ -27,7 +27,7 @@ removeWhitespace = (str) -> username = (auth, override) -> #some people define custom profile name in Avatar -> Profile - return override if override? + return override if override if auth?.facebook?.displayName? auth.facebook.displayName diff --git a/src/app/party.coffee b/src/app/party.coffee index 87b091cb20..8159a40493 100644 --- a/src/app/party.coffee +++ b/src/app/party.coffee @@ -166,12 +166,18 @@ module.exports.app = (appExports, model, app) -> return unless /\S/.test text chat.unshift id: model.id() + uuid: user.get('id') + contributor: user.get('backer.contributor') + npc: user.get('backer.npc') text: text user: helpers.username(model.get('_user.auth'), model.get('_user.profile.name')) timestamp: +new Date model.set(input, '') chat.remove 200 # keep a max messages cap + model.on 'unshift', '_party.chat', -> $('.chat-message').tooltip() + model.on 'unshift', '_tavern.chat.messages', -> $('.chat-message').tooltip() + appExports.partySendChat = -> sendChat('_party.chat', '_chatMessage') model.set '_user.party.lastMessageSeen', model.get('_party.chat')[0].id @@ -180,6 +186,10 @@ module.exports.app = (appExports, model, app) -> model.setNull '_tavern.chat', {messages:[]} #we can remove this later, first time run only sendChat('_tavern.chat.messages', '_tavernMessage') + appExports.partyMessageKeyup = (e, el, next) -> + return next() unless e.keyCode is 13 + appExports.partySendChat() + appExports.tavernMessageKeyup = (e, el, next) -> return next() unless e.keyCode is 13 appExports.tavernSendChat() diff --git a/src/app/scoring.coffee b/src/app/scoring.coffee index d487909e80..8046d64c6d 100644 --- a/src/app/scoring.coffee +++ b/src/app/scoring.coffee @@ -12,7 +12,7 @@ MODIFIER = algos.MODIFIER # each new level, armor, weapon add 2% modifier (this ### Drop System ### -randomDrop = (model, delta, priority) -> +randomDrop = (model, delta, priority, streak=0) -> user = model.at('_user') # limit drops to 2 / day @@ -23,11 +23,10 @@ randomDrop = (model, delta, priority) -> return if reachedDropLimit and model.flags.nodeEnv != 'development' # % chance of getting a pet or meat - # debugging purpose - 50% chance during development, 3% chance on prod - chanceMultiplier = if (model.flags.nodeEnv is 'development') then 50 else 1 - # TODO temporary min cap of 1 so people still get rewarded for good habits. Will change once we have streaks - deltaMultiplier = if Math.abs(delta) < 1 then 1 else Math.abs(delta) - chanceMultiplier = chanceMultiplier * deltaMultiplier * algos.priorityValue(priority) # multiply chance by reddness + chanceMultiplier = Math.abs(delta) + chanceMultiplier *= algos.priorityValue(priority) # multiply chance by reddness + chanceMultiplier += streak # streak bonus + console.log chanceMultiplier if user.get('flags.dropsEnabled') and Math.random() < (.05 * chanceMultiplier) # current breakdown - 3% (adjustable) chance on drop @@ -94,7 +93,7 @@ score = (model, taskId, direction, times, batch, cron) -> taskPath = "tasks.#{taskId}" taskObj = obj.tasks[taskId] - {type, value} = taskObj + {type, value, streak} = taskObj priority = taskObj.priority or '!' # If they're trying to purhcase a too-expensive reward, confirm they want to take a hit for it @@ -120,7 +119,10 @@ score = (model, taskId, direction, times, batch, cron) -> level = user.get('stats.lvl') weaponStrength = items.items.weapon[user.get('items.weapon')].strength exp += algos.expModifier(delta,weaponStrength,level, priority) / 2 # / 2 hack for now bcause people leveling too fast - gp += algos.gpModifier(delta, 1, priority) + if streak + gp += algos.gpModifier(delta, 1, priority, streak, model) + else + gp += algos.gpModifier(delta, 1, priority) subtractPoints = -> level = user.get('stats.lvl') @@ -144,10 +146,18 @@ score = (model, taskId, direction, times, batch, cron) -> if cron? # cron calculateDelta() subtractPoints() + batch.set "#{taskPath}.streak", 0 else calculateDelta(false) if delta != 0 addPoints() # obviously for delta>0, but also a trick to undo accidental checkboxes + if direction is 'up' + streak = if streak then streak + 1 else 1 + else + streak = if streak then streak - 1 else 0 + batch.set "#{taskPath}.streak", streak + taskObj.streak = streak + when 'todo' if cron? #cron @@ -183,7 +193,7 @@ score = (model, taskId, direction, times, batch, cron) -> batch.commit() # Drop system - randomDrop(model, delta, priority) if direction is 'up' + randomDrop(model, delta, priority, streak) if direction is 'up' return delta diff --git a/src/app/unlock.coffee b/src/app/unlock.coffee index 742aa1436b..7a240aea7e 100644 --- a/src/app/unlock.coffee +++ b/src/app/unlock.coffee @@ -68,20 +68,28 @@ module.exports.app = (appExports, model) -> user.on 'push', 'items.pets', (after, before) -> return if user.get('achievements.beastMaster') if before >= 90 # evidently before is the count? - dontPersist = model._dontPersist - model._dontPersist = false - user.set 'achievements.beastMaster', true, -> - model._dontPersist = dontPersist + dontPersist = model._dontPersist; model._dontPersist = false + user.set 'achievements.beastMaster', true, (-> model._dontPersist = dontPersist) $('#beastmaster-achievement-modal').modal('show') user.on 'set', 'items.*', (after, before) -> return if user.get('achievements.ultimateGear') items = user.get('items') if parseInt(items.weapon) == 6 and parseInt(items.armor) == 5 and parseInt(items.head) == 5 and parseInt(items.shield) == 5 - debugger - dontPersist = model._dontPersist - model._dontPersist = false - user.set 'achievements.ultimateGear', true, -> - model._dontPersist = dontPersist + dontPersist = model._dontPersist; model._dontPersist = false + user.set 'achievements.ultimateGear', true, (-> model._dontPersist = dontPersist) $('#max-gear-achievement-modal').modal('show') + user.on 'set', 'tasks.*.streak', (id, after, before) -> + if after > 0 + + # 21-day streak, as per the old philosophy of doign a thing 21-days in a row makes a habit + if (after % 21) is 0 + dontPersist = model._dontPersist; model._dontPersist = false + user.incr 'achievements.streak', 1, (-> model._dontPersist = dontPersist) + $('#streak-achievement-modal').modal('show') + + # they're undoing a task at the 21 mark, take back their badge + else if (before - after is 1) and (before % 21 is 0) + dontPersist = model._dontPersist; model._dontPersist = false + user.incr 'achievements.streak', -1, (-> model._dontPersist = dontPersist) diff --git a/src/server/store.coffee b/src/server/store.coffee index 7d26ec2ed7..24e3b96828 100644 --- a/src/server/store.coffee +++ b/src/server/store.coffee @@ -39,8 +39,11 @@ userAccess = (store) -> uid = captures.shift() attrPath = captures.join('.') # new array shifted left, after shift() was run + if attrPath is 'backer' + return accept(false) # we can only manually set this stuff in the database + # public access to users.*.party.invitation (TODO, lock down a bit more) - if (attrPath == 'party.invitation') + if attrPath is 'party.invitation' return accept(true) # Same session (user.id = this.session.userId) @@ -91,6 +94,7 @@ partySystem = (store) -> 'party', 'profile', 'achievements', + 'backer', 'preferences', 'auth.local.username', 'auth.facebook.displayName') diff --git a/styles/app/game-pane.styl b/styles/app/game-pane.styl index 1a9870afb5..072047bc24 100644 --- a/styles/app/game-pane.styl +++ b/styles/app/game-pane.styl @@ -15,7 +15,7 @@ position relative height 300px -.tavern-chat +.tavern-chat, .party-chat li height 60px diff --git a/views/app/alerts.html b/views/app/alerts.html index 2d54863a56..ee57e471b3 100644 --- a/views/app/alerts.html +++ b/views/app/alerts.html @@ -13,10 +13,16 @@
+