All pastes #737807 Raw Edit

Something

public text v1 · immutable
·published 2007-10-15 18:51 UTC
rendered paste body
#  _     _                 _ _     _
# | |   | |               | | |   (_)
# | |__ | | ___   ___   __| | |    _ _ __   ___ _ __
# | '_ \| |/ _ \ / _ \ / _` | |   | | '_ \ / _ \ '__|
# | |_) | | (_) | (_) | (_| | |___| | | | |  __/ |
# |_.__/|_|\___/ \___/ \__,_\_____/_|_| |_|\___|_|
#
# Blackjack Script by bloodLiner
#
#
#
# # author: bloodLiner
# # version: 1.1
# # web: http://www.bloodliner.de
# # irc: #bloodLiner @ QuakeNet
# # contact: me@bloodliner.de
#
# # Installation:
#	Lade das Script in den scripts Ordner vom Eggdrop hoch
#	und schreibe 'source scripts/blackjack.tcl' in die eggdrop.conf
#
# # Changelog:
#
#	# 11.12.2006 - v1.0: Public Release!
#	# 12.12.2006 - v1.1: Bug gefixt, der am Ende des Spiels auftrat, durch eine fehlende Variable ;)
#
# # Benutzung:
#	?blackjack 			- Spiel starten
#	?blackjack on 		- Blackjack im Channel ansschalten
#	?blackjack off		- Blackjack im Channel ausschalten
#	?blackjack stats	- Blackjack Statistik über den Channel aufrufen
#	?blackjack version	- Zeigt die Blackjack Script Version
#	?join 				- Spiel beitreten
#	?karte 				- Karte geben lassen
#	?genug				- Aufhören
#	?stop				- Für Bot Owner, falls das Spiel mal hängt mit ?stop im Channel beenden
#
#
# # Copyright
#
# Copyright (C) 2006  Michael 'bloodLiner' Gecht
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
#
# # Konfiguration:
#
# Spiel trigger einstellen. Standard wäre ?blackjack
set ::blackjack(trigger) "\?"

# Spielsperre einstellen. 300 = 5 Minuten Pause zwischen jedem Spiel.
set ::blackjack(flood) "300"

#
# # ÄNDERE AB HIER NICHTS MEHR, AUßER DU BIST DIR SICHER WAS DU MACHST!

set bj(author) 		"bloodLiner"
set bj(web) 		"http://www.bloodliner.de"
set bj(name) 		"Blackjack Script"
set bj(version) 	"v1.1"

setudef 	flag 	blackjack
setudef 	str  	blackjackc

bind pub 	* 	$::blackjack(trigger)blackjack 	game:blackjack
bind pub 	* 	$::blackjack(trigger)join 		blackjack:join
bind pub 	* 	$::blackjack(trigger)karte 		blackjack:karte
bind pub 	* 	$::blackjack(trigger)genug	 	blackjack:genug
bind pub 	n 	$::blackjack(trigger)stop 		blackjack:stop

# sendmsg proc by ircscript.de - R.I.P. #ircscript
proc sendmsg {target command message} {
	if {![string match "#*" $target]} {
		putquick "notice $target :\002« $command » «\002 $message \002»\002"
	} else {
		if {[string match "*c*" [getchanmode $target]]} {
			putquick "privmsg $target :« $command » « $message »"
		} else {
			putquick "privmsg $target :\002« $command » «\002 $message \002»\002"
		}
	}
}

# string2pattern proc by CyBex - tclhelp.net
proc str2pat {string} {
	return [string map [list \\ \\\\ \[ \\\[ \] \\\] ] $string]
}

proc game:blackjack {nick host hand chan arg} {
	switch -exact -- [string tolower [lindex [split $arg] 0]] {
		"on" {
			if {![matchattr $hand n|n $chan]} {
				return 0
			}
			if {[channel get $chan "blackjack"]} {
				putserv "notice $nick :Blackjack ist schon in $chan eingeschaltet."
				return 0
			} elseif {![channel get $chan "blackjack"]} {
				channel set $chan +blackjack
				putserv "notice $nick :Blackjack wurde erfolgreich in $chan eingeschaltet."
			}
		}
		"off" {
			if {![matchattr $hand n|n $chan]} {
				return 0
			}
			if {![channel get $chan "blackjack"]} {
				putserv "notice $nick :Blackjack ist schon in $chan ausgeschaltet."
				return 0
			} elseif {[channel get $chan "blackjack"]} {
				channel set $chan -blackjack
				putserv "notice $nick :Blackjack wurde erfolgreich in $chan ausgeschaltet."
			}
		}
		"stats" {
			if {[info exists ::blackjack(flood,count,$chan)] && [expr {[unixtime] - $::blackjack(flood,count,$chan)}] < 300} {
			return 0
			} else {
				if {[channel get $chan "blackjackc"] == ""} {
					sendmsg $chan Blackjack "Ich habe in $chan noch kein einziges Spiel gesehen!"
				} elseif {[channel get $chan "blackjackc"] == "1"} {
					sendmsg $chan Blackjack "Ich habe in $chan erst ein einziges Spiel gesehen!"
				} else {
					sendmsg $chan Blackjack "Ich habe in $chan bisher [channel get $chan "blackjackc"] Spiele gesehen!"
				}
				set ::blackjack(flood,count,$chan) [unixtime]
				utimer 300 [list unset ::blackjack(flood,count,$chan)]
			}
		}
		"version" {
			global bj
			if {[info exists ::blackjack(flood,version,$chan)] && [expr {[unixtime] - $::blackjack(flood,version,$chan)}] < 300} {
			return 0
			} else {
				sendmsg $chan Blackjack "Ich benutze das $bj(name) $bj(version) von $bj(author) - $bj(web)"
				set ::blackjack(flood,version,$chan) [unixtime]
				utimer 300 [list unset ::blackjack(flood,version,$chan)]
			}
		}
		"" {
			if {![channel get $chan "blackjack"]} {
				return 0
			} elseif {[info exists ::blackjack(flood,$chan)] && [expr {[unixtime] - $::blackjack(flood,$chan)}] < $::blackjack(flood)} {
				return 0
			} else {
				if {[info exists ::blackjack(request,$chan)] == "1" || [info exists ::blackjack(started,$chan)] == "1"} {
					puthelp "notice $nick :In $chan ist schon ein Blackjack Spiel gestartet worden!"
					return 0
				} else {
					set ::blackjack(request,$chan) "1"
				}
			}
			if {$::blackjack(request,$chan) == "1"} {
				set ::blackjack(player,$chan) "[str2pat $nick]"
				set ::blackjack(active,$chan) "0"
				sendmsg $chan Blackjack "Das Spiel beginnt in 30 Sekunden! Schreibe $::blackjack(trigger)join um dem Spiel beizutreten!"
				utimer 30 [list blackjack:expire $chan]
				return
			}
		}
	}
}

proc blackjack:join {nick host hand chan arg} {
	if {![channel get $chan "blackjack"]} {
		return 0
	} elseif {[info exists ::blackjack(request,$chan)] == "0"} {
		return 0
	} elseif {[llength $::blackjack(player,$chan)] == 5} {
		puthelp "notice $nick :Das Blackjack Spiel in $chan ist schon voll!"
		return 0
	}
	if {[lsearch $::blackjack(player,$chan) [str2pat $nick]] == "-1"} {
		lappend ::blackjack(player,$chan) $nick
		puthelp "notice $nick :Du bist dem Blackjack Spiel in $chan beigetreten!"
	} else {
		puthelp "notice $nick :Du bist dem Blackjack Spiel in $chan schon längst beigetreten!"
	}
}

proc blackjack:expire {chan} {
	if {[llength $::blackjack(player,$chan)] < 2} {
		sendmsg $chan Blackjack "Die 30 Sekunden sind um und es hat sich niemand gemeldet. Ich geh weiter Karten mischen!"
		unset ::blackjack(player,$chan)
		unset ::blackjack(request,$chan)
	} else {
		unset ::blackjack(request,$chan)
		set ::blackjack(started,$chan) "1"
		foreach player $::blackjack(player,$chan) {
			set ::blackjack(gesamt,wert,$chan,[getchanhost $player]) "0"
			set ::blackjack(gesamt,karten,$chan,[getchanhost $player]) ""
		}
		set ::blackjack(stapel,Kreuz,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
		set ::blackjack(stapel,Pik,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
		set ::blackjack(stapel,Herz,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
		set ::blackjack(stapel,Karo,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
		set ::blackjack(stapel,alle,$chan) "Kreuz Pik Herz Karo"
		sendmsg $chan Blackjack "Das Spiel beginnt. Die Spieler sind [join $::blackjack(player,$chan) ", "]. Mit ?karte lässt du dir eine Karte geben. Mit ?genug hörst du auf. [lindex $::blackjack(player,$chan) 0] fängt an!"
		set ::blackjack(idletimer,$chan) [utimer 60 [list blackjack:idle [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)] $chan]]
	}
}

proc blackjack:karte {nick host hand chan arg} {
	if {![channel get $chan "blackjack"]} {
		return 0
	} elseif {![info exists ::blackjack(started,$chan)]} {
		return 0
	} elseif {$nick != [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)]} {
		return 0
	}

	if {[info exists ::blackjack(idletimer,$chan)]} {
		killutimer $::blackjack(idletimer,$chan)
		unset ::blackjack(idletimer,$chan)
	}

	foreach stapel $::blackjack(stapel,alle,$chan) {
		if {[llength $::blackjack(stapel,$stapel,$chan)] < 1} {
			set ::blackjack(stapel,alle,$chan) "[lrange $::blackjack(stapel,alle,$chan) 0 [expr {[lsearch -exact $::blackjack(stapel,alle,$chan) $stapel] - 1}]] [lrange $::blackjack(stapel,alle,$chan) [expr {[lsearch -exact $::blackjack(stapel,alle,$chan) $stapel] + 1}] end]"
			set ::blackjack(stapel,$chan) "[rand [llength $::blackjack(stapel,alle,$chan)]]"
			set ::blackjack(stapelw,$chan) "[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)]"
			set ::blackjack(karte,$chan) "[rand [llength $::blackjack(stapel,$::blackjack(stapelw,$chan),$chan)]]"
			set ::blackjack(wert,$chan) "[lindex $::blackjack(stapel,[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)],$chan) $::blackjack(karte,$chan)]"
		} else {
			set ::blackjack(stapel,$chan) "[rand [llength $::blackjack(stapel,alle,$chan)]]"
			set ::blackjack(stapelw,$chan) "[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)]"
			set ::blackjack(karte,$chan) "[rand [llength $::blackjack(stapel,$::blackjack(stapelw,$chan),$chan)]]"
			set ::blackjack(wert,$chan) "[lindex $::blackjack(stapel,[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)],$chan) $::blackjack(karte,$chan)]"
		}
	}
	if {$::blackjack(stapelw,$chan) == "Kreuz" || $::blackjack(stapelw,$chan) == "Pik"} {
		set blackjack(farbe,$chan) "\0031,0"
	} elseif {$::blackjack(stapelw,$chan) == "Herz" || $::blackjack(stapelw,$chan) == "Karo"} {
		set blackjack(farbe,$chan) "\0030,2"
	}

	if {$::blackjack(gesamt,wert,$chan,$host) == 21 || $::blackjack(gesamt,wert,$chan,$host) > 21} {
		puthelp "notice $nick :Du hast schon $::blackjack(gesamt,wert,$chan,$host) Punkte! Gib nun ?genug ein."
		return 0
	} elseif {$::blackjack(wert,$chan) == "Bube" || $::blackjack(wert,$chan) == "Dame" ||  $::blackjack(wert,$chan) == "König"} {
		set ::blackjack(gesamt,wert,$chan,$host) "[expr {$::blackjack(gesamt,wert,$chan,$host) + 10}]"
	} elseif {$::blackjack(wert,$chan) == "Ass"} {
		if {[expr {$::blackjack(gesamt,wert,$chan,$host) + 11}] > 21} {
			set ::blackjack(gesamt,wert,$chan,$host) "[expr {$::blackjack(gesamt,wert,$chan,$host) + 1}]"
		} else {
			set ::blackjack(gesamt,wert,$chan,$host) "[expr {$::blackjack(gesamt,wert,$chan,$host) + 11}]"
		}
	} else {
		set ::blackjack(gesamt,wert,$chan,$host) "[expr {$::blackjack(gesamt,wert,$chan,$host) + $::blackjack(wert,$chan)}]"
	}

	set ::blackjack(gesamt,karten,$chan,$host) " $::blackjack(gesamt,karten,$chan,$host) $blackjack(farbe,$chan)$::blackjack(stapelw,$chan) $::blackjack(wert,$chan)\003"

	putquick "notice $nick :Deine Karten:$::blackjack(gesamt,karten,$chan,$host) - Gesamt Wert: $::blackjack(gesamt,wert,$chan,$host)"
	set ::blackjack(stapel,[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)],$chan) "[lrange $::blackjack(stapel,[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)],$chan) 0 [expr {$::blackjack(karte,$chan)-1}]] [lrange $::blackjack(stapel,[lindex $::blackjack(stapel,alle,$chan) $::blackjack(stapel,$chan)],$chan) [expr {$::blackjack(karte,$chan)+1}] end]"
}

proc blackjack:idle {nick chan} {
	sendmsg $chan Blackjack "$nick ist eingeschlafen... Wieso zum Teufel mach ich das hier eigentlich!?"
	unset ::blackjack(idletimer,$chan)
	blackjack:genug $nick [getchanhost $nick] [nick2hand $nick] $chan keyed
}

proc blackjack:kick {nick chan} {
	set ::player(kick,$chan) "$::blackjack(player,$chan)"
	set ::blackjack(player,$chan) ""
	foreach players $::player(kick,$chan) {
		if {$players != $nick} {
			lappend ::blackjack(player,$chan) "$players"
		} else {
			continue;
		}
	}
	unset ::player(kick,$chan)
}

proc blackjack:genug {nick host hand chan arg} {
	if {![channel get $chan "blackjack"]} {
		return 0
	} elseif {![info exists ::blackjack(started,$chan)]} {
		return 0
	}
	if {$nick != [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)]} {
		return 0
	}
	if {$::blackjack(gesamt,wert,$chan,$host) == 0 && [llength $::blackjack(gesamt,karten,$chan,$host)] == 0 && $arg != "keyed"} {
		puthelp "notice $nick :Du musst dir mindestens einmal eine Karte geben lassen, bevor du ?genug machen kannst"
		return 0
	} elseif {$::blackjack(gesamt,wert,$chan,[getchanhost [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)]]) > 21 || $::blackjack(gesamt,wert,$chan,[getchanhost [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)]]) == "0" && $arg == "keyed"} {
		blackjack:kick [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)] $chan
	} else {
		incr ::blackjack(active,$chan)
	}
	if {[expr {[llength $::blackjack(player,$chan)]-1}] < $::blackjack(active,$chan)} {
		if {[llength $::blackjack(player,$chan)] < 1} {
			sendmsg $chan Blackjack "Unentschieden! Alle Spieler sind ausgeschieden!"
		} else {
			set ::blackjack(winner,$chan,check) "$::blackjack(gesamt,wert,$chan,[getchanhost [lindex $::blackjack(player,$chan) 0]])"
			set ::blackjack(winner,$chan) "[lindex $::blackjack(player,$chan) 0]"
			set ::blackjack(winner,$chan,zahl) "1"
			foreach player $::blackjack(player,$chan) {
				if {$::blackjack(winner,$chan) == $player} {
					continue;
				} elseif {$::blackjack(gesamt,wert,$chan,[getchanhost $player]) > 21} {
					continue;
				} elseif {$::blackjack(gesamt,wert,$chan,[getchanhost $player]) > $::blackjack(winner,$chan,check)} {
					set ::blackjack(winner,$chan) "$player"
					set ::blackjack(winner,$chan,check) "$::blackjack(gesamt,wert,$chan,[getchanhost $player])"
					continue;
				} elseif {$::blackjack(gesamt,wert,$chan,[getchanhost $player]) == $::blackjack(winner,$chan,check)} {
					lappend ::blackjack(winner,$chan) "$player"
					continue;
				}
			}
			if {[llength $::blackjack(winner,$chan)] > 1} {
				set ::blackjack(player,$chan) "$::blackjack(winner,$chan)"
				foreach player $::blackjack(player,$chan) {
					set ::blackjack(gesamt,wert,$chan,[getchanhost $player $chan]) "0"
					set ::blackjack(gesamt,karten,$chan,[getchanhost $player $chan]) ""
				}
				set ::blackjack(stapel,Kreuz,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
				set ::blackjack(stapel,Pik,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
				set ::blackjack(stapel,Herz,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
				set ::blackjack(stapel,Karo,$chan) "Ass 2 3 4 5 6 7 8 9 10 Bube Dame König"
				set ::blackjack(stapel,alle,$chan) "Kreuz Pik Herz Karo"
				set ::blackjack(active,$chan) "0"
				sendmsg $chan Blackjack "Die Spieler [join $::blackjack(player,$chan) ", "] haben mit $::blackjack(winner,$chan,check) die gleiche Punktzahl, deswegen gibt es nun ein Stechen! [lindex $::blackjack(player,$chan) 0] fängt an."
				set ::blackjack(idletimer,$chan) [utimer 60 [list blackjack:idle [lindex $::blackjack(player,$chan) 0] $chan]]
				return 0
			} else {
				sendmsg $chan Blackjack "Der Gewinner ist $::blackjack(winner,$chan) mit $::blackjack(gesamt,wert,$chan,[getchanhost $::blackjack(winner,$chan) $chan]) Punkten!"
			}
			unset ::blackjack(winner,$chan)
			unset ::blackjack(winner,$chan,zahl)
			unset ::blackjack(winner,$chan,check)
		}
		if {[channel get $chan "blackjackc"] == ""} {
			set bjcount "0"
		} else {
		set bjcount "[channel get $chan blackjackc]"
		}
		incr bjcount
		channel set $chan blackjackc "$bjcount"
		set ::blackjack(flood,$chan) [unixtime]
		utimer 300 [list unset ::blackjack(flood,$chan)]
		foreach player $::blackjack(player,$chan) {
			unset ::blackjack(gesamt,wert,$chan,[getchanhost $player $chan])
		}
		unset ::blackjack(player,$chan)
		unset ::blackjack(started,$chan)
		unset ::blackjack(stapel,Kreuz,$chan)
		unset ::blackjack(stapel,Pik,$chan)
		unset ::blackjack(stapel,Herz,$chan)
		unset ::blackjack(stapel,Karo,$chan)
		unset ::blackjack(stapel,alle,$chan)
		unset ::blackjack(stapel,$chan)
		unset ::blackjack(stapelw,$chan)
		unset ::blackjack(karte,$chan)
		unset ::blackjack(wert,$chan)
		return 0
	} else {
		sendmsg $chan Blackjack "Ok, [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)] du bist an der Reihe!"
		set ::blackjack(idletimer,$chan) [utimer 60 [list blackjack:idle [lindex $::blackjack(player,$chan) $::blackjack(active,$chan)] $chan]]
	}
}

proc blackjack:stop {nick host hand chan arg} {
	if {[info exists ::blackjack(request,$chan)]} {
		unset ::blackjack(request,$chan)
		putquick "notice $nick :Done! Die Variable \$::blackjack(request,$chan) ist in $chan resettet!"
	}
	if {[info exists ::blackjack(started,$chan)]} {
		unset ::blackjack(started,$chan)
		putquick "notice $nick :Done! Die Variable \$::blackjack(started,$chan) ist in $chan resettet!"
	}
}

putlog "$bj(name) $bj(version) von $bj(author) - $bj(web) erfolgreich geladen!"

#EOF