2018-10-21 13:57:23 +02:00
package wat
import (
"fmt"
"time"
"strings"
"strconv"
"math/rand"
"github.com/go-irc/irc"
)
type WatGame struct {
bot * WatBot
db * WatDb
2018-10-23 01:15:28 +02:00
commands map [ string ] ( func ( * Player , [ ] string ) ( string ) )
lifeCommands map [ string ] ( func ( * Player , [ ] string ) ( string ) )
2018-10-21 13:57:23 +02:00
}
func NewWatGame ( bot * WatBot , db * WatDb ) * WatGame {
2018-10-23 01:15:28 +02:00
g := WatGame { bot , db , nil , nil }
g . commands = map [ string ] ( func ( * Player , [ ] string ) ( string ) ) {
"wat" : g . megaWat ,
"watch" : g . Watch ,
"watcoin" : g . Balance ,
"send" : g . Send ,
}
g . lifeCommands = map [ string ] ( func ( * Player , [ ] string ) ( string ) ) {
"steal" : g . Steal ,
"frame" : g . Frame ,
"punch" : g . Punch ,
"roll" : g . Roll ,
"quest" : g . QuestStart ,
}
return & g
2018-10-21 13:57:23 +02:00
}
var currency = "watcoin"
var currencys = "watcoins"
var unconscious = "wat, you're too weak for that."
2018-10-23 01:15:28 +02:00
var helpText = fmt . Sprintf ( "watcoin <nick>, watch <nick>, topten, mine, send <nick> <%s>, roll <%s>, steal <nick> <%s>, frame <nick> <%s>, punch <nick>" , currency , currency , currency , currency )
2018-10-21 13:57:23 +02:00
var rules = "A new account is created with 5 hours time credit. Mining exchanges time credit for %s: 1-10h: 1 p/h; >10h: 10 p/h; >1 day: 50 p/h; >1 month: 1000 p/h."
2018-10-23 01:15:28 +02:00
2018-10-21 13:57:23 +02:00
// missing
// invent, create, give inventory
func ( g * WatGame ) Msg ( m * irc . Message , player * Player , fields [ ] string ) {
reply := ""
2018-10-23 01:15:28 +02:00
if g . commands [ fields [ 0 ] ] != nil {
reply = g . commands [ fields [ 0 ] ] ( player , fields )
} else {
switch strings . ToLower ( fields [ 0 ] ) {
case "rules" :
reply = rules
case "help" :
reply = helpText
case "topten" :
reply = fmt . Sprintf ( "%s holders: %s" , currency , g . TopTen ( ) )
case "mine" :
reply = g . Mine ( player )
}
}
if g . lifeCommands [ fields [ 0 ] ] != nil {
2018-10-21 13:57:23 +02:00
// Nothing was handled. Maybe this is an action that requires consciousness.
if ! player . Conscious ( ) {
reply = unconscious
} else {
2018-10-23 01:15:28 +02:00
reply = g . lifeCommands [ fields [ 0 ] ] ( player , fields )
2018-10-21 13:57:23 +02:00
}
}
g . bot . reply ( m , reply )
}
2018-10-23 01:15:28 +02:00
type PositiveError struct { }
func ( e PositiveError ) Error ( ) string { return "" }
func ( g * WatGame ) Int ( str string ) ( int64 , error ) {
i , e := strconv . ParseInt ( str , 10 , 64 )
if i < 0 {
return 0 , PositiveError { }
2018-10-21 13:57:23 +02:00
}
2018-10-23 01:15:28 +02:00
return i , e
2018-10-21 13:57:23 +02:00
}
func ( g * WatGame ) Roll ( player * Player , fields [ ] string ) string {
if len ( fields ) < 2 {
return fmt . Sprintf ( "roll <%s> pls" , currency )
}
2018-10-23 01:15:28 +02:00
amount , e := g . Int ( fields [ 1 ] )
2018-10-21 13:57:23 +02:00
if e != nil {
return "wat kinda numba is that"
}
if amount > player . Coins {
return "wat? brokeass"
}
n := rand . Int63n ( 100 ) + 1
ret := fmt . Sprintf ( "%s rolls a d100 (<50 wins): It's a %d! " , player . Nick , n )
if n < 50 {
2018-10-23 01:15:28 +02:00
player . Coins += amount
2018-10-21 13:57:23 +02:00
ret += fmt . Sprintf ( "You win! Your new balance is %d" , player . Coins )
} else {
player . Coins -= amount
ret += fmt . Sprintf ( "You lose! Your new balance is %d" , player . Coins )
}
g . db . Update ( player )
return ret
}
func ( g * WatGame ) Punch ( player * Player , fields [ ] string ) string {
if len ( fields ) < 2 {
return "punch <target> pls"
}
target , err := g . GetTarget ( player . Nick , fields [ 1 ] )
if err != "" {
return err
}
chance := rand . Int63n ( 6 ) + 1
dmg := rand . Int63n ( 6 ) + 1
ret := fmt . Sprintf ( "%s rolls a d6 to punch %s: It's a %d! %s " , player . Nick , target . Nick , chance , player . Nick )
if chance < 3 {
dmg += player . Anarchy
ret += fmt . Sprintf ( "hits for %d points of damage!" , dmg )
target . Health -= dmg
g . db . Update ( target )
} else {
dmg += target . Anarchy
ret += fmt . Sprintf ( "misses miserably! %s punches back for %d damage! " , target . Nick , dmg )
player . Health -= dmg
if player . Health <= 0 {
ret += player . Nick + " has fallen unconscious."
}
g . db . Update ( player )
}
return ret
}
func ( g * WatGame ) Frame ( player * Player , fields [ ] string ) string {
if len ( fields ) < 3 {
return fmt . Sprintf ( "frame <nick> <%s> - d6 roll. If < 3, you force the target to pay me. Otherwise, you pay a fine to the target and myself." , currency )
}
2018-10-23 01:15:28 +02:00
amount , e := g . Int ( fields [ 2 ] )
2018-10-21 13:57:23 +02:00
if amount <= 0 || e != nil {
return "wat kinda number is " + fields [ 2 ] + "?"
}
if player . Coins < amount {
return "wat? you too poor for that."
}
target , err := g . GetTarget ( player . Nick , fields [ 1 ] )
if err != "" {
return err
}
if target . Coins < amount {
return fmt . Sprintf ( "wat? %s is too poor for this." , target . Nick )
}
n := rand . Int63n ( 6 ) + 1
ret := fmt . Sprintf ( "%s rolls a d6 to frame %s with %d %s: It's a %d! (<3 wins). " , player . Nick , target . Nick , amount , currency , n )
if n < 3 {
ret += fmt . Sprintf ( "You win! They pay me %d." , amount )
player . Anarchy += 1
target . Coins -= amount
// bot gets coins
} else {
ret += fmt . Sprintf ( "You were caught and pay them %d, throwing away the rest." , ( amount / 2 ) )
player . Coins -= amount
target . Coins += amount / 2
// target.Coins += amount/2
}
g . db . Update ( player )
g . db . Update ( target )
return ret
}
2018-10-23 01:15:28 +02:00
func ( g * WatGame ) DiceRoll ( prefix string ) string {
return ""
}
2018-10-21 13:57:23 +02:00
func ( g * WatGame ) Steal ( player * Player , fields [ ] string ) string {
if len ( fields ) < 3 {
return fmt . Sprintf ( "steal <nick> <%s> - d6 roll. If < 3, you steal the %s. Otherwise, you pay double the %s to %s" , currency , currency , currency , g . bot . Nick )
}
2018-10-23 01:15:28 +02:00
amount , e := g . Int ( fields [ 2 ] )
2018-10-21 13:57:23 +02:00
if amount <= 0 || e != nil {
return "wat kinda number is " + fields [ 2 ] + "?"
}
if player . Coins < amount * 2 {
return "wat? You'd go bankrupt if they steal back..."
}
target , err := g . GetTarget ( player . Nick , fields [ 1 ] )
if target == nil {
return err
}
if target . Coins < amount {
2018-10-23 01:15:28 +02:00
return fmt . Sprintf ( "wat? %s is a poor fuck and doesn't have that much to steal." , target . Nick )
2018-10-21 13:57:23 +02:00
}
n := rand . Int63n ( 6 ) + 1
2018-10-23 01:15:28 +02:00
ret := fmt . Sprintf ( "%s is trying to steal %d %s from %s... It's %d" , player . Nick , amount , currency , target . Nick , n )
2018-10-21 13:57:23 +02:00
if n < 3 {
2018-10-23 01:15:28 +02:00
ret += "! You win! Sneaky bastard!"
2018-10-21 13:57:23 +02:00
player . Coins += amount
player . Anarchy += 1
target . Coins -= amount
g . db . Update ( target )
} else {
2018-10-23 01:15:28 +02:00
ret += fmt . Sprintf ( "... You were caught and I took %d %s from your pocket." , ( amount * 2 ) , currency )
2018-10-21 13:57:23 +02:00
player . Coins -= amount * 2
}
g . db . Update ( player )
return ret
}
func ( g * WatGame ) GetTarget ( player , target string ) ( * Player , string ) {
2018-10-23 01:15:28 +02:00
t := g . db . User ( strings . ToLower ( target ) , "" , false )
2018-10-21 13:57:23 +02:00
if t . Nick == "" {
2018-10-23 01:15:28 +02:00
return nil , "Who? wat?"
2018-10-21 13:57:23 +02:00
}
if t . Nick == player {
return nil , "You can't do that to yourself, dummy."
}
return & t , ""
}
2018-10-23 01:15:28 +02:00
func ( g * WatGame ) QuestStart ( player * Player , fields [ ] string ) string {
// Begin a quest with some people. It will involve multiple dice rolls.
return ""
}
2018-10-21 13:57:23 +02:00
func ( g * WatGame ) Send ( player * Player , fields [ ] string ) string {
if len ( fields ) < 3 {
return fmt . Sprintf ( "You forgot somethin'. send <nick> <%s>" , currency )
}
amount , err := strconv . Atoi ( fields [ 2 ] )
if err != nil {
return fields [ 2 ] + " is not an integer, wat?"
}
if int64 ( amount ) > player . Coins {
return "wat? you poor fuck, you don't have enough!"
}
target , str := g . GetTarget ( player . Nick , fields [ 1 ] )
if target == nil {
return str
}
player . Coins -= int64 ( amount )
target . Coins += int64 ( amount )
g . db . Update ( player )
g . db . Update ( target )
return fmt . Sprintf ( "%s sent %s %d %s" , player . Nick , target . Nick , amount , currency )
}
func ( g * WatGame ) Mine ( player * Player ) string {
delta := time . Now ( ) . Unix ( ) - player . LastMined
if delta < 1800 {
return fmt . Sprintf ( "wat? 2 soon (%d)" , delta )
}
value := int64 ( 0 )
if delta < 36000 {
value = delta / 1800
} else if delta < 86400 {
value = 10
} else if delta < 2592000 {
value = 50
} else {
value = 1000
}
msg := ""
if player . LastMined == 0 {
msg = "with wat? you go to get a pickaxe"
value = 0
} else {
2018-10-23 01:15:28 +02:00
player . Coins += value
2018-10-21 13:57:23 +02:00
msg = fmt . Sprintf ( "%s mined %d %s for %d and has %d %s" , player . Nick , value , currency , delta , player . Coins , currency )
}
player . LastMined = time . Now ( ) . Unix ( )
g . db . Update ( player )
return msg
}
2018-10-23 01:15:28 +02:00
func ( g * WatGame ) Watch ( player * Player , fields [ ] string ) string {
if len ( fields ) > 1 {
maybePlayer , err := g . GetTarget ( "" , fields [ 1 ] )
if err != "" {
return err
}
player = maybePlayer
}
return fmt . Sprintf ( "%s's Watting: %d (%d) / Anarchy: %d (%d) / Trickery: %d (%d) / Coins: %d / Health: %d" , player . Nick , player . Level ( player . Watting ) , player . Watting , player . Level ( player . Anarchy ) , player . Anarchy , player . Trickery , player . Trickery , player . Coins , player . Health )
}
2018-10-21 13:57:23 +02:00
func ( g * WatGame ) Balance ( player * Player , fields [ ] string ) string {
balStr := "%s's %s balance: %d. Mining time credit: %d."
2018-10-23 01:15:28 +02:00
balPlayer := player
2018-10-21 13:57:23 +02:00
if len ( fields ) > 1 {
2018-10-23 01:15:28 +02:00
var err string
balPlayer , err = g . GetTarget ( "" , fields [ 1 ] )
if err != "" {
return err
2018-10-21 13:57:23 +02:00
}
}
2018-10-23 01:15:28 +02:00
return fmt . Sprintf ( balStr , balPlayer . Nick , currency , balPlayer . Coins , time . Now ( ) . Unix ( ) - balPlayer . LastMined )
2018-10-21 13:57:23 +02:00
}
func ( g * WatGame ) TopTen ( ) string {
players := g . db . TopTen ( )
ret := ""
for _ , p := range players {
ret += PrintTwo ( p . Nick , p . Coins )
}
return ret
}
func PrintTwo ( nick string , value int64 ) string {
return fmt . Sprintf ( "%s (%d) " , CleanNick ( nick ) , value )
}
2018-10-23 01:15:28 +02:00
func ( g * WatGame ) megaWat ( player * Player , _ [ ] string ) string {
2018-10-21 13:57:23 +02:00
mega := rand . Int63n ( 1000000 ) + 1
kilo := rand . Int63n ( 1000 ) + 1
reply := ""
if mega == 23 {
player . Coins += 1000000
reply = fmt . Sprintf ( "OMGWATWATWAT!!!! %s has won the MegaWat lottery and gains 1000000 %s!" , player . Nick , currency )
}
if kilo == 5 {
player . Coins += 1000
reply = fmt . Sprintf ( "OMGWAT! %s has won the KiloWat lottery and gains 1000 %s!" , player . Nick , currency )
}
player . Watting += 1
g . db . Update ( player )
return reply
}