##############################
# Puzzle-Game by AhoK@DALnet #
##############################

set ACAKChannel         "#Lombok"
set ACAKPointsName      "Points"
set ACAKPointsPerAnswer 5
set ACAKQuestionTime    60
set ACAKMarker          "*"
set ACAKAskedFile       "eggdrop/scripts/puzzle.asked"
set ACAKQuestionFile    "eggdrop/scripts/puzzle.db"
set ACAKCFGFile         "eggdrop/scripts/puzzle.cfg"
set ACAKRunning 0
set ACAKAllAnswered 0
set ACAKRoundOver 0
set ACAKQNumber 0
set ACAKQuestion ""
set ACAKQuestions(0) ""
set ACAKAsked ""
set ACAKQCount 0
set ACAKAnswerCount 0
set ACAKDisplayNum 0
set ACAKNumAnswered 0
set ACAKForced 0
set ACAKForcedQuestion ""
set ACAKAutoStart 0
set ACAKtimeanswer 1
set ACAKAdNumber 0
set ACAKAd(0) "$botnick"
set ACAKAd(1) "$botnick"
set ACAKAd(2) "$botnick"
set ACAKAdTimer ""
set ACAKQuestionTimer ""
set KDebug 0
set ACAKVersion "contact my owner Dion"

proc ACAK_Start {nick uhost hand chan args} {
global ACAKChannel ACAKRunning ACAKQCount ACAKQNumber ACAKQuestionFile ACAKAdNumber ACAKVersion KDebug CountAnswer CountNoAnswer
if {($chan != $ACAKChannel)||($ACAKRunning != 0)} {return}
set ACAKQCount 0
set ACAKAdNumber 0
ACAK_ReadCFG
if {![file exist $ACAKQuestionFile]} {
putcmdlog "\[ACAK\] Question File: $ACAKQuestionFile Unreadable Or Does Not Exist"
return 0
}
set ACAKQCount [ACAK_ReadQuestionFile]
if {$ACAKQCount < 2} {
putcmdlog "\[ACAK\] Not Enough Questions in Question File $ACAKQuestionFile"
return 0
}
set ACAKAskedFileLen [ACAK_ReadAskedFile]
if {$ACAKAskedFileLen >= $ACAKQCount} {
ACAK_ResetAsked
return 0
}
set ACAKRunning 1
bind pubm - "*" ACAKCheckGuess
ACAKAskQuestion
return 1
}
proc ACAK_nostop {nick uhost hand chan args} {
global ACAKChannel ACAKRunning ACAKQuestionTimer ACAKAdTimer
if {($chan != $ACAKChannel)||($ACAKRunning != 1)} {return}
set ACAKRunning 0
catch {killutimer $ACAKQuestionTimer}
catch {killutimer $ACAKAdTimer}
catch {unbind pubm - "*" ACAKCheckGuess}
acakmsg "\00306Game is nostopped by \00304\[\00312$nick!$uhost\00304\]"
return 1
}
proc ACAKPickQuestion {} {
global ACAKAsked ACAKQCount KDebug
set ACAKUnasked [expr ($ACAKQCount - [llength $ACAKAsked])]
if {$ACAKUnasked < 1} {
ACAK_ResetAsked
}
set pickdone 0
while {$pickdone == 0} {
set kidx 0
set foundinasked 0
set pick [rand $ACAKQCount]
while {[lindex $ACAKAsked $kidx] != ""} {
if {[lindex $ACAKAsked $kidx] == $pick} {
set foundinasked 1
# acaklog "ACAK" "Found Pick:$pick in Asked"
break
}
incr kidx
}
if {$foundinasked == 0} {incr pickdone}
}
ACAK_AddAsked $pick
return $pick
}
proc ACAKParseQuestion {QNum} {
global ACAKMarker ACAKQuestions ACAKQuestion ACAKAnswers ACAKAnswerCount ACAKForcedQuestion KDebug
set KAnswersLeft ""
if {$QNum < 0} {
set ACAKFileQuestion $ACAKForcedQuestion
} {
set ACAKFileQuestion $ACAKQuestions($QNum)
}
if {$KDebug > 1} {acaklog "acak" "Picked:$QNum Question:$ACAKFileQuestion"}
if [info exists ACAKAnswers] {unset ACAKAnswers}
# Position of first "*"
set ACAKMarkerIDX [string first $ACAKMarker $ACAKFileQuestion]
if {$ACAKMarkerIDX < 1} {
acaklog "ACAK" "Malformed Question #$QNum"
}
set ACAKQuestionEndIDX [expr $ACAKMarkerIDX - 1]
set ACAKQuestion [string range $ACAKFileQuestion 0 $ACAKQuestionEndIDX]
incr ACAKMarkerIDX
set KAnswersLeft [string range $ACAKFileQuestion $ACAKMarkerIDX end]
set KDoneParsing 0
set ACAKAnswerCount 0
while {$KDoneParsing != 1 } {
set KAnswerEnd [string first $ACAKMarker $KAnswersLeft]
if {$KAnswerEnd < 1} {
set KDoneParsing 1
set KAnswerEnd [string length $KAnswersLeft]
}
set KAnswer [string range $KAnswersLeft 0 [expr $KAnswerEnd -1]]
set ACAKAnswers($ACAKAnswerCount) "# $KAnswer"
set ACAKMarkerIDX [expr $KAnswerEnd +1]
set KAnswersLeft [string range $KAnswersLeft $ACAKMarkerIDX end]
incr ACAKAnswerCount
}
}
proc ACAKAskQuestion {} {
global ACAKRunning ACAKQNumber ACAKAllAnswered ACAKRoundOver ACAKQuestion ACAKQCount
global ACAKPointsPerAnswer ACAKPointsName ACAKNumAnswered ACAKAnswerCount
global ACAKQuestionTimer ACAKQuestionTime ACAKDisplayNum ACAKForced ACAKLastGuesser
global tipno tiplist TipsToUse InfoItem ACAKtimestart ACAKtimeanswer
if {$ACAKRunning != 1} {return}
if {$ACAKForced == 1} {
ACAKParseQuestion -1
set ACAKQNumber 0
set ACAKForced 0
set ACAKForcedQuestion ""
} {
set ACAKQNumber [ACAKPickQuestion]
ACAKParseQuestion $ACAKQNumber
}
set ACAKAllAnswered 0
set ACAKLastGuesser ""
set ACAKDisplayNum 0
set ACAKNumAnswered 0
set ACAKRoundOver 0
set ACAKPointsPerAnswer [rand 3]
if {$ACAKPointsPerAnswer < 1} {set ACAKPointsPerAnswer 3}
set ACAKPointsPerAnswer [expr $ACAKPointsPerAnswer *10]
set ACAKBonus [expr $ACAKPointsPerAnswer *5]
set ACAKPointTotal [expr $ACAKPointsPerAnswer *$ACAKAnswerCount]
if {$ACAKtimeanswer==1} {
set ACAKtimestart [clock clicks -milliseconds]
}
if {$ACAKAnswerCount == 1} {
acakmsg ""
acakmsg ""
acakmsg ""
} elseif {$ACAKAnswerCount >= 2} {
acakmsg "\0030,2 :: Question No. $ACAKQNumber\/$ACAKQCount \00308\[\00311 ®Puzzle® \00308\] \0030tpi@DALnet :: \003"
acakmsg "\002\037\0032Hint\002\037: Susunlah Huruf Berikut Sehingga Mempunyai Arti"
acakmsg "\002\037\0032Question\002\037: $ACAKQuestion \[\00306 $ACAKAnswerCount Jawaban \00302\]"
acakmsg "\0030,2 ::\00311 +$ACAKPointsPerAnswer \0030 $ACAKPointsName Untuk setiap jawaban - Total:\00311 $ACAKPointTotal\0030 $ACAKPointsName - Bonus:\00311 +$ACAKBonus\0030 $ACAKPointsName :: \037-= GudLuck =-\037 :: "
}
set KRemain [expr int([expr $ACAKQuestionTime /2])]
set ACAKQuestionTimer [utimer $KRemain "ACAKDisplayRemainingTime $KRemain"]
}
proc ACAKCheckGuess {nick uhost hand chan args} {
global ACAKChannel ACAKRunning ACAKAnswerCount ACAKAnswers ACAKRoundOver ACAKtimeanswer
global ACAKPointsName ACAKPointsPerAnswer ACAKNumAnswered ACAKAllAnswered ACAKLastGuesser KDebug
global lastwinner lastwinnercount botnick userlist quizconf rankfile ACAKtimestart ACAKtimetoanswer
variable bestscore 0 lastbestscore 0 lastbest ""
variable userarray
variable authorsolved 0 waitforrank 0 gameend 0
if {($chan != $ACAKChannel)||($ACAKRunning != 1)||($ACAKRoundOver == 1)} {return}
mx_getcreate_userentry $nick $nick
array set userarray $userlist($nick)
set lastbest [lindex [lsort -command mx_sortrank [array names userlist]] 0]
if {$lastbest == ""} {
set lastbestscore 0
} else {
array set aa $userlist($lastbest)
set lastbestscore $aa(score)
}
regsub -all \[{',.!}] $args "" args
if {[string length args] == 0} {return}
set ACAKGuessOld $args
set ACAKGuess [string tolower $ACAKGuessOld]
if {$KDebug > 1} {acaklog "ACAK" "Guess: $nick $ACAKGuess"}
foreach z [array names ACAKAnswers] {
set ACAKTry [lrange $ACAKAnswers($z) 1 end]
set ACAKTryOld $ACAKTry
regsub -all \[{',.!}] $ACAKTry "" ACAKTry
set ACAKTry [string tolower $ACAKTry]
if {$KDebug > 1} {acaklog "ACAK" "Try: $ACAKTry"}
if {$ACAKTry == $ACAKGuess} {
if {[lindex $ACAKAnswers($z) 0] == "#"} {
set ACAKAnswers($z) "$nick $ACAKGuessOld"
set ACAKtimetoanswer ""
if {$ACAKtimeanswer==1} {
set ACAKtimetoanswer [expr [expr [clock clicks -milliseconds]-$ACAKtimestart]/1000.00]
}
incr userarray(score) $ACAKPointsPerAnswer
if {$userarray(score) == 1} {
set userarray(started) [unixtime]
}
set userlist($nick) [array get userarray]
acakmsg "\0032Jawaban Betul :\00302\[\00306 [expr $ACAKNumAnswered+1]. $ACAKTryOld \00302\] by \00306$nick \00302score:\00306 +$ACAKPointsPerAnswer \00302- less then \00306$ACAKtimetoanswer \00302seconds - Total Score: \00306$userarray(score) \00302Points and Ranked: \00306[mx_get_rank_pos $nick]"
pushmode $ACAKChannel +v $nick
tmcquiz_rank_save {} {} {}
incr ACAKNumAnswered
if {$ACAKNumAnswered == $ACAKAnswerCount} {
set ACAKAllAnswered 1
set ACAKRoundOver 1
if {$ACAKAnswerCount == 1} {
set ACAKLastGuesser ""
acakmsg ""
ACAK_TriviaResults
} elseif {$ACAKAnswerCount >= 2} {
set ACAKLastGuesser $nick
acakmsg "\00306You've Guessed Them All, \00302Well Done!!!"
ACAK_ShowResults
}
ACAK_Recycle
}
return
}
}
}
}
proc ACAKDisplayRemainingTime {remaining} {
global ACAKRunning ACAKAllAnswered ACAKNumAnswered ACAKAnswerCount ACAKQuestionTimer ACAKQuestionTime ACAKDisplayNum
global ACAKQuestion
if {($ACAKRunning != 1)||($ACAKAllAnswered == 1)} {return}
if {$ACAKAnswerCount == 1} {
acakmsg "\00306$remaining \00302secs remaining"
} elseif {$ACAKAnswerCount >= 2} {
acakmsg "\00306$remaining \00302secs remaining"
}
incr ACAKDisplayNum
set KRemain [expr int([expr $ACAKQuestionTime /4])]
if {$ACAKDisplayNum < 2} {
set ACAKQuestionTimer [utimer $KRemain "ACAKDisplayRemainingTime $KRemain"]
} {
set ACAKQuestionTimer [utimer $KRemain ACAKTimesUp]
}
}
proc ACAKTimesUp {} {
global ACAKAnswers ACAKAllAnswered ACAKRoundOver ACAKNumAnswered ACAKAnswerCount ACAKQuestionTimer ACAKAdTimer
global tgcurrentanswer tghinttimer tgtimenext tgchan tgnextqtimer tgstreak tgstreakmin
global tgscoresbyname tgranksbyname tgranksbynum tgcongrats tgscorestotal tgmissed
global tgtimestart tgshowallscores tgrealnames tgscoresbyrank
if {$ACAKAllAnswered == 1} { return 1}
set ACAKRoundOver 1
set acakmissed "Time's Up! \003 "
append KMissed "\00302Times Up. Sisa Jawaban (\00306[expr $ACAKAnswerCount - $ACAKNumAnswered]\00302): "
set KAnswersRemaining [expr ($ACAKAnswerCount - $ACAKNumAnswered)]
set kcount 0
foreach z [array names ACAKAnswers] {
if {[lindex $ACAKAnswers($z) 0] == "#"} {
append KMissed "\00302\[\00306 [lrange $ACAKAnswers($z) 1 end] \00302\]"
incr kcount
if {$kcount < $KAnswersRemaining} {append KMissed " "}
}
}
acakmsg "$KMissed"
ACAK_ShowResults
if {$ACAKNumAnswered > 0} {
acakmsg "\0030,14 Total number answered correctly:\002 $ACAKNumAnswered\002 from a possible\002 $ACAKAnswerCount \002"
} {
acakmsg "\00302Kita masuk ke soal Trivia.. Harap Siap"
}
set tgnextqtimer [utimer $tgtimenext tgnextq]
set tgplaying 1
set tgstreak 0
set tgmissed 0
}
proc ACAK_Recycle {} {
global tgcurrentanswer tghinttimer tgtimenext tgchan tgnextqtimer tgstreak tgstreakmin
global tgscoresbyname tgranksbyname tgranksbynum tgcongrats tgscorestotal tgmissed
global tgtimestart tgshowallscores tgrealnames tgscoresbyrank tgtimeanswer
global ACAKAnswers ACAKNumAnswered ACAKQuestionTimer ACAKAdTimer
catch {killutimer $ACAKQuestionTimer}
if [info exists ACAKAnswers] {unset ACAKAnswers}
set ACAKQuestion ""
set ACAKNumAnswered 0
set tgnextqtimer [utimer $tgtimenext tgnextq]
set tgplaying 1
set tgstreak 0
set tgmissed 0
}
proc ACAK_ShowResults {} {
global ACAKAnswers ACAKPointsPerAnswer ACAKPointsName ACAKAllAnswered ACAKLastGuesser
global botnick quizconf rankfile userlist lastwinner lastwinnercount
if {$ACAKAllAnswered == 1} {
set ACAKBonus [expr $ACAKPointsPerAnswer *5]
set nick $ACAKLastGuesser
mx_getcreate_userentry $nick $nick
array set userarray $userlist($nick)
set lastbest [lindex [lsort -command mx_sortrank [array names userlist]] 0]
if {$lastbest == ""} {
set lastbestscore 0
} else {
array set aa $userlist($lastbest)
set lastbestscore $aa(score)
}
incr userarray(score) $ACAKBonus
if {$userarray(score) == 1} {
set userarray(started) [unixtime]
}
set userlist($nick) [array get userarray]
acakmsg "\0036 $ACAKLastGuesser \0032dapat BONUS \0036+$ACAKBonus pts \0032(Total Score:\0036 $userarray(score)\0032) (Rank:\0036 [mx_get_rank_pos $nick]\0032)"
tmcquiz_rank_save {} {} {}
}
}
proc ACAK_TriviaResults {} {
global ACAKAnswers ACAKPointsPerAnswer ACAKPointsName ACAKAllAnswered ACAKLastGuesser
}
proc ACAK_AddAsked {KQnum} {
global ACAKAsked ACAKAskedFile
set f [open $ACAKAskedFile a]
puts $f $KQnum
close $f
lappend ACAKAsked $KQnum
}
proc ACAK_ReadAskedFile {} {
global ACAKAsked ACAKAskedFile
set KAsked 0
set ACAKAsked ""
if {![file exists $ACAKAskedFile]} {
set f [open $ACAKAskedFile w]
} {
set f [open $ACAKAskedFile r]
while {[gets $f KQnum] != -1} {
lappend ACAKAsked "$KQnum"
incr KAsked
}
}
close $f
return $KAsked
}
proc ACAK_ResetAsked {} {
global ACAKAskedFile ACAKAsked
set f [open $ACAKAskedFile w]
puts $f "0"
close $f
set ACAKAsked ""
}
proc ACAK_ReadQuestionFile {} {
global ACAKQuestionFile ACAKQuestions
set KQuestions 0
set f [open $ACAKQuestionFile r]
while {[gets $f q] != -1} {
set ACAKQuestions($KQuestions) $q
incr KQuestions
}
close $f
return $KQuestions
}
proc ACAK_ShowAsked {nick uhost hand chan args} {
global ACAKQCount ACAKAsked ACAKQuestions
set ACAKStatsAsked [llength $ACAKAsked]
set ACAKStatsUnasked [expr ($ACAKQCount - $ACAKStatsAsked)]
acakmsg "Total: $ACAKQCount Asked: $ACAKStatsAsked Remaining: $ACAKStatsUnasked \003"
}
proc ACAK_ReadCFG {} {
global ACAKCFGFile ACAKChannel ACAKAutoStart ACAKAskedFile ACAKQuestionFile ACAKPointsName ACAKAd
if {[file exist $ACAKCFGFile]} {
set f [open $ACAKCFGFile r]
while {[gets $f s] != -1} {
set kkey [string tolower [lindex [split $s "="] 0]]
set kval [lindex [split $s "="] 1]
switch $kkey {
points { set ACAKPointsName $kval }
channel { set ACAKChannel $kval }
autostart { set ACAKAutoStart $kval }
askedfile { set ACAKAskedFile $kval }
ACAKfile { set ACAKQuestionFile $kval }
ad1 { set ACAKAd(0) $kval }
ad2 { set ACAKAd(1) $kval }
ad3 { set ACAKAd(2) $kval }
}
}
close $f
if {($ACAKAutoStart < 0)||($ACAKAutoStart > 1)} {set ACAKAutoStart 1}
return
}
acaklog "ACAK" "Config file $ACAKCFGFile not found... using defaults"
}
proc ACAK_WriteCFG {} {
global ACAKCFGFile ACAKChannel ACAKAutoStart ACAKAskedFile ACAKQuestionFile ACAKPointsName ACAKAd
set f [open $ACAKCFGFile w]
puts $f "# This file is automatically overwritten"
puts $f "Points=$ACAKPointsName"
puts $f "Channel=$ACAKChannel"
puts $f "AutoStart=$ACAKAutoStart"
puts $f "AskedFile=$ACAKAskedFile"
puts $f "ACAKFile=$ACAKQuestionFile"
puts $f "Ad1=$ACAKAd(0)"
puts $f "Ad2=$ACAKAd(1)"
puts $f "Ad3=$ACAKAd(2)"
close $f
}
proc acakmsg {what} {
global ACAKChannel
putquick "PRIVMSG $ACAKChannel :$what"
}
proc acaklog {who what} {
putcmdlog "\[$who\] $what"
}
proc dcc_ACAKrehash {hand idx arg} {
global ACAKQCount
putcmdlog "#$hand# Rehashing ACAK config"
ACAK_ReadCFG
set ACAKQCount [ACAK_ReadQuestionFile]
if {$ACAKQCount < 2} {
acaklog "ACAK" "Not Enough Questions in Question File $ACAKQuestionFile"
return 0
}
set ACAKAskedFileLen [ACAK_ReadAskedFile]
if {$ACAKAskedFileLen >= $ACAKQCount} {
acaklog "ACAK" "Asked file out of sync with question database: resetting"
ACAK_ResetAsked
return 0
}
acaklog "ACAK" "Questions:$ACAKQCount Asked:$ACAKAskedFileLen Remaining:[expr ($ACAKQCount - $ACAKAskedFileLen)]"
}
ACAK_ReadCFG


putlog "Puzzle tpi DALnet ® Succesfully LoaDeD..."


