Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

346 lines (294 sloc) 8.666 kB
# Description:
# A drunkly coded, ASCII version of the famous game.
# Sort of assumes Campfire
# Game mechanics are easy: http://bruteforcex.blogspot.com/2008/03/1-4-24-dice-game.html
#
# Dependencies:
# None
#
# Configuration:
# None
#
# Commands:
# dice start - starts a game of one, four, twenty four
# dice take <dice letters> - takes dice at given levels
# dice stats - displays your statistics
# dice stats all - displays all players' statistics
#
# Authors:
# zbowling
# sukima
dieMap = ['A','B','C','D','E','F']
class BuddhaGame
constructor: () ->
@diceLeft = 6
@diceTaken = []
@lastDice = []
@steps = 0
toJSON: ->
diceLeft: @diceLeft
diceTaken: @diceTaken
lastDice: @lastDice
steps: @steps
@build: (data) ->
buddha = new BuddhaGame
for id, value of data
buddha[id] = value
buddha
rollRemainingDice: () ->
@lastDice = []
printlines = ['','','','','','','']
for dieIdx in [0...@diceLeft]
die = @randomDice()
diestr = @diceString(die,dieMap[dieIdx],die)
dielines = diestr.split "\n"
for i in [0...printlines.length]
printlines[i] += dielines[i]
@lastDice.push die
printlines
roll: ->
"new game!\n" +
@rollRemainingDice().join("\n")
take: (diceToTake) ->
dieLetters = diceToTake.toUpperCase().replace(" ","").split("")
lastDiceLeftCount = @diceLeft
for dieLetter in dieLetters
dieIndex = dieMap.indexOf dieLetter
if dieIndex != -1 and dieIndex < @lastDice.length
die_val = @lastDice[dieIndex]
if die_val != -1
@diceTaken.push die_val
@lastDice[dieIndex] = -1 #marking it invalid so you can pick it twice
@diceLeft -= 1
if @diceLeft == lastDiceLeftCount
return "(you didn't pick any dice.)"
@steps += 1
printlines = ['','','','','','','']
if @diceLeft > 1
printlines = @rollRemainingDice()
for i in [0...printlines.length]
printlines[i] += "\t > "
else if @diceLeft == 1 #only one left so lets just end the suffering
die = @randomDice()
@diceTaken.push die
@diceLeft = 0
takenString = @diceTakenStringArray()
for i in [0...printlines.length]
printlines[i] += takenString[i]
return_str = printlines.join("\n") + "\n" + @calculateScoreString()
if @diceLeft <= 0
return_str += "\nNice job!"
return_str
scoreValue: ()->
score = 0
has_one = no
has_four = no
for dieIdx in [0...@diceTaken.length]
dice_val = @diceTaken[dieIdx]
if dice_val == 4 and has_four == no
has_four = yes
else if dice_val == 1 and has_one == no
has_one = yes
else
score += dice_val
if @diceLeft <= 0 and (has_one == no or has_four == no)
score = 0
{score:score,taken:@diceTaken,hasOne:has_one,hasFour:has_four,steps:@steps}
calculateScoreString: () ->
score = 0
has_one = no
has_four = no
for dieIdx in [0...@diceTaken.length]
dice_val = @diceTaken[dieIdx]
if dice_val == 4 and has_four == no
has_four = yes
else if dice_val == 1 and has_one == no
has_one = yes
else
score += dice_val
if @diceLeft <= 0 and (has_one == no or has_four == no)
"score: 0 // bummer..."
else if has_one == no and has_four == no
"score: #{score} (you still need to take a 1 and a 4)"
else if has_one == no and has_four == yes
"score: #{score} (you still need to take a 1)"
else if has_four == no and has_one == yes
"score: #{score} (you still need to take a 4)"
else
"score: #{score}"
diceTakenStringArray: () ->
printlines = ['','','','','','','']
has_one = no
has_four = no
for dieIdx in [0...@diceTaken.length]
dice_val = @diceTaken[dieIdx]
dice_score = "-"
if dice_val == 4 and has_four == no
has_four = yes
else if dice_val == 1 and has_one == no
has_one = yes
else
dice_score = dice_val
diestr = @diceString(dice_val,"*",dice_score)
dielines = diestr.split "\n"
for i in [0...printlines.length]
printlines[i] += dielines[i]
printlines
gameover: () ->
if @diceLeft <= 0
return true
else
return false
randomDice: () ->
1 + Math.floor(Math.random() * 6)
diceString: (value,i,x) ->
switch value
when 1
"
#{x} \n
--------- \n
| | \n
| o | \n
| | \n
--------- \n
#{i} \n
"
when 2
"
#{x} \n
--------- \n
| o | \n
| | \n
| o | \n
--------- \n
#{i} \n
"
when 3
"
#{x} \n
--------- \n
| o | \n
| o | \n
| o | \n
--------- \n
#{i} \n
"
when 4
"
#{x} \n
--------- \n
| o o | \n
| | \n
| o o | \n
--------- \n
#{i} \n
"
when 5
"
#{x} \n
--------- \n
| o o | \n
| o | \n
| o o | \n
--------- \n
#{i} \n
"
when 6
"
#{x} \n
--------- \n
| o o | \n
| o o | \n
| o o | \n
--------- \n
#{i} \n
"
class BuddhaLounge
constructor: (@robot) ->
@games = {}
@playerdata = {}
@players = {}
@robot.brain.on 'loaded', =>
if @robot.brain.data.buddhagames?
for id, game_data of @robot.brain.data.buddhagames
@games[id] = BuddhaGame.build game_data
if @robot.brain.data.playerdata?
@playerdata = @robot.brain.data.playerdata
startGame: (msg, player) ->
game = new BuddhaGame
msg.reply "\n" + game.roll()
@games[player.id] = game
if not @players[player.id]?
@players[player.id] = player
if not @playerdata[player.id]?
@playerdata[player.id] = { totalScore: 0, totalGamesStarted: 0, totalGamesFinished: 0, lastScore:0}
@playerdata[player.id].totalGamesStarted += 1;
@save()
take: (msg, player, take) ->
if @games[player.id]?
game = @games[player.id]
msg.reply "\n" + game.take(take)
scoreValue = game.scoreValue()
if scoreValue.taken.length == 4 and not (scoreValue.hasOne and scoreValue.hasFour)
msg.play "drama"
if game.gameover()
if scoreValue.score == 24
if scoreValue.taken.steps == 1
msg.play "yeah"
else
msg.play "pushit"
else if scoreValue.taken.steps == 1 and scoreValue.hasOne and scoreValue.hasFour
msg.play "live"
else if scoreValue.score >= 22
msg.play "tada"
else if scoreValue.score >= 18
msg.play "greatjob"
else if scoreValue.score > 0
msg.play "crickets"
else
msg.play "trombone"
@playerdata[player.id].lastScore = scoreValue.score
@playerdata[player.id].totalScore = scoreValue.score + @playerdata[player.id].totalScore
@playerdata[player.id].totalGamesFinished = @playerdata[player.id].totalGamesFinished + 1
delete @games[player.id]
else
msg.reply "you aren't playing a game."
@save()
playerstats: (player) ->
data = @playerdata[player.id]
return "You have not played a game yet." unless data?
average = if data.totalGamesFinished > 0
data.totalScore / data.totalGamesFinished
else
0
"""
\n\tlast score: #{data.lastScore}
\taverage score: #{average}
\ttotal games finished: #{data.totalGamesFinished}
\ttotal games started: #{data.totalGamesStarted}
"""
save: ->
@robot.brain.data.buddhagames = @games
@robot.brain.data.playerdata = @playerdata
stats: (msg) ->
return_str = ""
for k,v of @players
player = k
return_str += @playerstats(v)
msg.reply return_str
reset: (msg, player) ->
delete @playerdata[player.id]
msg.reply "Your stats have been reset."
@save()
module.exports = (robot) ->
buddha = new BuddhaLounge robot
robot.hear /buddha start|dice start|bdstart/i, (msg) ->
buddha.startGame msg, msg.message.user
robot.hear /buddha stats|dice stats/i, (msg) ->
msg.reply buddha.playerstats(msg.message.user)
robot.hear /buddha stats all|dice stats all|bdstat/i, (msg) ->
buddha.stats msg
robot.hear /buddha reset|dice reset/i, (msg) ->
buddha.reset msg, msg.message.user
robot.hear /(buddha take|dice take|bdt) ([\w .-]+)/i, (msg) ->
buddha.take msg, msg.message.user, msg.match[2]
Jump to Line
Something went wrong with that request. Please try again.