Code: Select all
#################
## SKILLS GAME ##
#################
proc fixfreeze {type} {setall tired no}
###########################################################
# Commands: #
# #
# !go <skill> #
# Now seperated to prevent major lag. Go is one proc. #
# #
# !lamp <skill> #
# Now given randomly instead of hourly (Random Event.) #
# #
# !store <item> #
# Use that cash you got! #
# #
###########################################################
## Variables ##
## Internal Variables ##
set id 0; # Used for lists
# Fish
# (Thank goodness for RuneHq.)
set fish {shrimp sardines herring anchovies trout pike salmon tuna lobsters bass swordfish monkfish sharks }
set fishlevels {1 5 10 15 20 25 30 35 40 46 50 62 76}
set fishexp {10 20 30 40 50 60 70 80 90 100 100 120 110}
## Convinence functions ##
proc notice {nick msg} { putserv "NOTICE $nick :$msg" }
proc msgchan {chan msg} { putserv "PRIVMSG $chan :$msg" }
proc msgnick {nick msg} { putserv "PRIVMSG $nick :$msg" }
proc getstat {hand stat} { return [getuser $hand XTRA $stat] }
proc setstat {hand stat setting} { return [setuser $hand XTRA $stat $setting] }
## Bindings ##
bind pub - !go "pub:go 0"
bind pub - .go "pub:go 0"
bind pub - @go "pub:go 1"
bind pub - !help "help 0"
bind pub - .help "help 0"
bind pub - @help "help 1"
bind pub - !commands "help 0"
bind pub - .commands "help 0"
bind pub - @commands "help 1"
bind pub - !rank "pub:rank 0"
bind pub - .rank "pub:rank 0"
bind pub - @rank "pub:rank 1"
bind pub - !bank "pub:bank 0"
bind pub - .bank "pub:bank 0"
bind pub - @bank "pub:bank 1"
bind pub - !stats "pub:stats 0"
bind pub - .stats "pub:stats 0"
bind pub - @stats "pub:stats 1"
## Functions ##
proc pub:go {outloud nick user hand chan text} {
######################################## ABOUT ######################################
## So, basically skills are just manipulations of a lot of varibles and user stats. ##
## Once more skills start to fill in here, I'll move them out to individual procs. ##
#######################################################################################
if {[checkreg $nick $chan] == 0} { return 0 }; # If he's not registered, stop.
set command [lindex $text 0]; # Set the skill to train
#if {[lindex $text 0] == ".go" || [lindex $text 0] == "!go"} {set outloud 0} else {set outloud 1}
if {$command == "fish"} {
go_fish $outloud $nick $user $hand $chan $text
}
if {$command == "cook"} {
go_cook $outloud $nick $user $hand $chan $text
}
if {$command == "sell"} {
go_sell $outloud $nick $user $hand $chan $text
}
}
proc help {outloud nick user hand chan text} {
global botnick
notice $nick "$nick in $chan uses !help"
if {$outloud == 0} {
notice $nick "Welcome to the skills game! To get started, '/msg $botnick !reg', this will register you into the sytem. Afterwards, you may use '.go <action>' in any channel with $botnick in it to play. Go ahead, try using '.go fish' in a channel."
notice $nick "Current actions availible are: fish, cook, sell. Other commands include: !rank, !bank, !stats, !help"
} else {
msgchan $chan "Welcome to the skills game! To get started, '/msg $botnick !reg', this will register you into the sytem. Afterwards, you may use '.go <action>' in any channel with $botnick in it to play. Go ahead, try using '.go fish' in a channel."
msgchan $chan "Current actions availible are: fish, cook, sell. Other commands include: !rank, !bank, !stats, !help"
}
}
proc levelup { exp level hand nick skill } {
set newlevel [getlevel $exp]; # Get the level based on exp
if {$newlevel > $level} {
if {$skill == "fishing"} {
setstat $hand lvlfishing $newlevel; # Set the fishing level to the new one
notice $nick "Congratulations, you are now fishing level $newlevel!"
notice $nick "[hand2nick $hand] is now fishing level $newlevel (previous $level.)"
} elseif {$skill == "cooking"} {
setstat $hand lvlcooking $newlevel; # Set the cooking level to the new one
notice $nick "Congratulations, you are now cooking level $newlevel!"
notice $nick "[hand2nick $hand] is now cooking level $newlevel (previous $level.)"
}
}
}
# Thanks to Thommey! :)
proc getlevel { exp } { set a 0; set b 1; while {$a <= $exp} { set a [expr {$a + int($b + 300 * pow(2,$b/7.0)) / 4.0}]; incr b }; expr {$b-1} }
proc getfish { level } {
global fish fishlevels id; # Grab the fish/levels list
set max [llength $fish]; # Used for the while loop
incr max -1
while {$max > -1} {
# notice $nick "Current position in array: $max"
set testlevel [lindex $fishlevels $max]; # Get the current level to test
#msgchan "#ThorsHammer" $testlevel
if {$level >= $testlevel} {
set id $max; # Used for exp rates
# notice $nick "Fish returned: [lindex $fish $max]"
return [lindex $fish $max]; # Returns the highest fish you can catch
break
set max 0; # Probably not needed because of return...
} else {incr max -1}; # Keep the loop going
}
}
proc fishplace { fish2check } {
global fish fishlevels id; # Grab the fish/levels list
set max [llength $fish]; # Used for the while loop
incr max -1
while {$max > -1} {
# notice $nick "Current position in array: $max"
set testfish [lindex $fish $max]; # Get the current level to test
#msgchan "#ThorsHammer" $testlevel
if {$fish2check == $testfish} {
set id $max;
# notice $nick "Fish returned: [lindex $fish $max]"
return $max; # Returns the highest fish you can catch
break
set max 0; # Probably not needed because of return...
} else {incr max -1}; # Keep the loop going
}
return 0
}
proc sotired { nick hand } {
setstat $hand tired "yes"
set howlong [expr {round(rand()*5)+2}]
notice $nick "You look tired, good sir. Have a rest for at least $howlong minutes."
timer $howlong "notice $nick {You can now use a skill again, good sir!}"
timer $howlong "setstat $hand tired no"
}
proc checkreg { nick chan } {
# If the person hasn't yet said hello to the bot, tell them to. Ugly code. :(
global botnick
if {[nick2hand $nick $chan] == "*"} {
notice $nick "You are not registered yet. Please '/msg $botnick !reg' to login, and use !help in-channel to start."
return 0
} else { return 1 }
}
proc userexists {hand} {
# Return 1 if the user has registered.
if {[getstat $hand expfishing] == ""} {return 0} else {return 1}
}
proc newprofile { hand } {
global fish
setstat $hand lvlfishing 1
setstat $hand expfishing 0
setstat $hand lvlcooking 1
setstat $hand expcooking 0
setstat $hand money 0
setstat $hand tired "no"
setstat $hand diamonds 0
set x 0; while {$x <= [llength $fish]} {
# Create a section for each fish availible
setstat $hand [lindex $fish $x] 0
incr x +1
}
}
proc wipeall {} {
set users [userlist]
notice $nick "Wiping the profiles down... :("
foreach u $users {
newprofile $u
}
notice $nick "Done! :)"
}
proc setall {a b} {
set users [userlist]
foreach u $users {
setstat $u $a $b
}
notice $nick "Done! :)"
}
proc go_fish {outloud nick user hand chan text} {
global id fishexp ::lastbind;
if {[getuser $hand XTRA tired] == "yes"} { return 0 }; # If tired; stop.
set level [getstat $hand lvlfishing]; # Get fishing level
set exp [getstat $hand expfishing]; # Get fishing exp
if {$exp == ""} {
newprofile $hand; # Create user's profile
set level 1; set exp 0; # Fix varibles to prevent error
}
set fish2get [getfish $level]; # Sets the fish to catch
set ammount [rand 30]; # Set ammount of fish to catch
set exprate [lindex $fishexp $id]; # Set the experience rate
set expearned [expr {$ammount * $exprate}]; # Set ammount of exp earned this catch
set fish [getstat $hand $fish2get]; # Set ammount of fish
incr exp $expearned; # Set new exp ammount
incr fish $ammount; # Set new fish ammount
setstat $hand expfishing $exp; # Save changes to exp
setstat $hand $fish2get $fish; # Save changes to fish
if {$outloud == 0} {
notice $nick "You went out and caught $ammount $fish2get. You now have $fish $fish2get and have gained $expearned exp."
} elseif {$outloud == 1} {
msgchan $chan "$nick went out and caught $ammount $fish2get. He now has $fish $fish2get and has gained $expearned exp."
}
notice $nick "$nick caught $ammount $fish2get (totalling $fish) in $chan."
#if {$chan == "#ThorsHammer"} {specialevent 1 $nick}; # Diamonds! :)
levelup $exp $level $hand $nick fishing; # Check if user got a new level
sotired $nick $hand; # Make user tired
}
proc go_cook {outloud nick user hand chan text} {
global id fishexp ::lastbind;
set level [getstat $hand lvlcooking]; # Get cooking level
set exp [getstat $hand expcooking]; # Get cooking exp
if {$exp == ""} {
newprofile $hand; # Create user's profile
set level 1; set exp 0; # Fix varibles to prevent error
}
set ammount [getstat $hand [lindex $text 1]]; # Get ammount of fish to fry!
if {$ammount < 1} {
notice $nick "You don't have any of that!"
return 0
}
set fish [lindex $text 1]; # What fish are we catching?
set exprate [expr {[lindex $fishexp $id]*1.2}]; # Faster exp then fishing
set expearned [expr {round($ammount * $exprate)}]; # Gotta round
incr exp $expearned; # Save changes to exp
setstat $hand expcooking $exp
setstat $hand $fish 0
if {$outloud == 0} {
notice $nick "You cooked all $ammount of your $fish, netting you $expearned xp."
} elseif {$outloud == 1} {
msgchan $chan "$nick cooked all $ammount of his $fish, netting him $expearned xp."
}
notice $nick "$nick cooked $ammount $fish, earning $expearned xp in $chan."
levelup $exp $level $hand $nick cooking
}
proc go_sell {outloud nick user hand chan text} {
global fishlevels ::lastbind
set money [getstat $hand money]
set profiletest [getstat $hand expcooking]
if {$profiletest == ""} {
newprofile $hand; # Create user's profile
set level 1; set exp 0; # Fix varibles to prevent error
}
set ammount [getstat $hand [lindex $text 1]]; # Get ammount of fish to fry!
if {$ammount < 1} {
notice $nick "You don't have any of that!"
return 0
}
set fish [lindex $text 1]
set moneyrate [lindex $fishlevels [fishplace [lindex $text 1]]]
set earned [expr {$ammount*$moneyrate}]
incr money $earned
if {$outloud == 0} {
notice $nick "You sold all $ammount of your raw $fish, earning you \$$earned!"
} elseif {$outloud == 1} {
msgchan $chan "$nick sold all $ammount of his raw $fish, earning him \$$earned!"
}
setstat $hand $fish 0
setstat $hand "money" $money
}
proc scorelist {} {
# Returns money values in order from greatest to smallest
set users [userlist]
set overallmoney {}
foreach u $users {
lappend overallmoney [getstat $u money]
}
return [lsort -decreasing -integer $overallmoney];
}
proc whohas {score} {
set users [userlist]
foreach u $users {
if {[getstat $u money] == $score} {return $u}
}
return ""; # If no one has that score
}
proc rankmoney {nick} {
set scores [scorelist]
set compare [getstat [nick2hand $nick] money]
set rank 1
foreach u $scores {
if {$u == $compare} {return $rank} else {set rank [expr {$rank + 1}]}
}
return "ERROR: INVALID"
}
proc updatescores {repeat} {
global highscores
set highscores [scorelist]
if {$repeat} {timer 30 "updatescores"}
}
proc pub:rank {outloud nick user hand chan text} {
global highscores
if {[lindex $text 0] == ".rank" || [lindex $text 0] == "!rank"} {set outloud 0} else {set outloud 1}
set cash [getstat $hand money]
set name [lindex $text 0]
if {$name == ""} then {set name $nick}
notice $nick "Here 1. Name: $name"
if {[string is integer $name]} {
notice $nick "Here 2."
updatescores 0
set player [lindex $highscores [expr {$name - 1}]]
if {$player == ""} {
notice $nick "Nobody is rank $name at the moment.."
} else {
notice $nick "Rank $name goes to [whohas $player], with \$$player."
}
} else {
notice $nick "Here 3."
if {![string is integer [getstat [nick2hand $name] lvlfishing]]} {notice $nick "$name hasn't registered yet.."; return 0}
set rnk [rankmoney $name]
notice $nick "Here 4. Rank: $rnk"
if {$outloud == 0} {notice $nick "$name ([nick2hand $name]) is rank $rnk with \$[getstat [nick2hand $name] money]."} else {
msgchan $chan "$name ([nick2hand $player]) is rank $rnk with \$[getstat [nick2hand $name] money]."
}
}
}
proc pub:bank {outloud nick user hand chan text} {
set get {money shrimp sardines herring anchovies trout pike salmon tuna lobsters bass swordfish monkfish sharks diamonds}
set alt {dollars shrimp sardines herring anchovies trout pike salmon tuna lobsters bass swordfish monkfish sharks diamonds}
set l ""
set listplace 0
#if {[lindex $text 0] == ".bank" || [lindex $text 0] == "!bank"} {set outloud 0} else {set outloud 1}
set player [lindex $text 0]
if {$player == ""} then {set player $hand}
if {[userexists [nick2hand $player]] == 0} then {notice $nick "User $player doesn't exist.. Perhaps you should try a different nick?"; return 0}
foreach u $get {
set ammount [getstat [nick2hand $player] $u]
if {$ammount > 0} {
if {$l == ""} {
append l "$ammount [lindex $alt $listplace]"
} else {
append l ", $ammount [lindex $alt $listplace]"
}
}
incr listplace 1
}
if {$l == ""} {
if {$outloud == 0} {
notice $nick "$player currently doesn't have anything of value."
} else {
msgchan $chan "$player currently doesn't have anything of value."
}
} else {
if {$outloud == 0} {
notice $nick "$player currently has: $l"
} else {
msgchan $chan "$player currently has: $l"
}
}
}
proc pub:stats {outloud nick user hand chan text} {
if {[lindex $text 0] == ""} {
if {$outloud == 0} {
notice $nick "$nick ($hand) stats: Fishing level [getstat $hand lvlfishing] ([getstat $hand expfishing] XP), Cooking level [getstat $hand lvlcooking] ([getstat $hand expcooking] XP), \$[getstat $hand money]."
} else {
msgchan $chan "$nick ($hand) stats: Fishing level [getstat $hand lvlfishing] ([getstat $hand expfishing] XP), Cooking level [getstat $hand lvlcooking] ([getstat $hand expcooking] XP), \$[getstat $hand money]."
}
} else {
set player [lindex $text 0]
if {[userexists [nick2hand $player]] == 0} {notice $nick "$player hasn't played or registered yet.."; return 0}
if {$outloud == 0} {
notice $nick "$player ([nick2hand $player]) stats: Fishing level [getstat [nick2hand $player] lvlfishing] ([getstat [nick2hand $player] expfishing] XP), Cooking level [getstat [nick2hand $player] lvlcooking] ([getstat [nick2hand $player] expcooking] XP), \$[getstat [nick2hand $player] money]."
} else {
msgchan $chan "$player ([nick2hand $player]) stats: Fishing level [getstat [nick2hand $player] lvlfishing] ([getstat [nick2hand $player] expfishing] XP), Cooking level [getstat [nick2hand $player] lvlcooking] ([getstat [nick2hand $player] expcooking] XP), \$[getstat [nick2hand $player] money]."
}
}
}
proc specialevent {type nick} {
# List of special events:
#########################
# 1) Chance of finding a diamond
if {$type == 1} {
set chance [expr {round(rand()*50)}]
if {$chance == 1} {
set diamonds [getstat [nick2hand $nick] diamonds]
incr diamonds 1
setstat [nick2hand $nick] "diamonds" $diamonds
notice $nick "(Special) $nick found a diamond!"
notice $nick "While you were working, you found something in the sand... it's a diamond! You decide to store it in your bank to show it off."
}
}
}
set highscores [scorelist]
updatescores 0
if {[timers] == ""} {updatescores 1}
-------------------------------------------------
hi cant somone fix this tcl
i got error msg when check rank :: Tcl error [pub:rank 1]: expected integer but got ""
Moderation: thanks to use the [ code ] tag to enclose scripts