# True/False -Game tpi@DALnet #

set TRUEChannel         "#lombok"
set TRUEPointsName      "Points"
set TRUEPointsPerAnswer 5
set TRUEQuestionTime    60
set TRUEMarker          "*"
set TRUEAskedFile       "eggdrop/scripts/true.asked"
set TRUEQuestionFile    "eggdrop/scripts/true.db"
set TRUECFGFile         "eggdrop/scripts/true.cfg"
set TRUERunning 0
set TRUEAllAnswered 0
set TRUERoundOver 0
set TRUEQNumber 0
set TRUEQuestion ""
set TRUEQuestions(0) ""
set TRUEAsked ""
set TRUEQCount 0
set TRUEAnswerCount 0
set TRUEDisplayNum 0
set TRUENumAnswered 0
set TRUEForced 0
set TRUEForcedQuestion ""
set TRUEAutoStart 0
set TRUEtimeanswer 1
set TRUEAdNumber 0
set TRUEAd(0) "$botnick"
set TRUEAd(1) "$botnick"
set TRUEAd(2) "$botnick"
set TRUEAdTimer ""
set TRUEQuestionTimer ""
set KDebug 0
set TRUEVersion "2.3.4"
proc TRUE_Start {nick uhost hand chan args} {
global TRUEChannel TRUERunning TRUEQCount TRUEQNumber TRUEQuestionFile TRUEAdNumber TRUEVersion KDebug CountAnswer CountNoAnswer
if {($chan != $TRUEChannel)||($TRUERunning != 0)} {return}
set TRUEQCount 0
set TRUEAdNumber 0
TRUE_ReadCFG
if {![file exist $TRUEQuestionFile]} {
putcmdlog "\[TRUE\] Question File: $TRUEQuestionFile Unreadable Or Does Not Exist"
return 0
}
set TRUEQCount [TRUE_ReadQuestionFile]
if {$TRUEQCount < 2} {
putcmdlog "\[TRUE\] Not Enough Questions in Question File $TRUEQuestionFile"
return 0
}
set TRUEAskedFileLen [TRUE_ReadAskedFile]

if {$TRUEAskedFileLen >= $TRUEQCount} {
#   TRUEmsg "All Questions Asked: Resetting \003"
TRUE_ResetAsked
return 0
}
set TRUERunning 1
bind pubm - "*" TRUECheckGuess
TRUEAskQuestion
return 1
}
proc TRUE_nostop {nick uhost hand chan args} {
global TRUEChannel TRUERunning TRUEQuestionTimer TRUEAdTimer
if {($chan != $TRUEChannel)||($TRUERunning != 1)} {return}
set TRUERunning 0
catch {killutimer $TRUEQuestionTimer}
catch {killutimer $TRUEAdTimer}
catch {unbind pubm - "*" TRUECheckGuess}
TRUEmsg "\00306Game is nostopped by \00304\[\00312$nick!$uhost\00304\]"
return 1
}
proc TRUEPickQuestion {} {
global TRUEAsked TRUEQCount KDebug
set TRUEUnasked [expr ($TRUEQCount - [llength $TRUEAsked])]
if {$TRUEUnasked < 1} {
#   TRUEmsg "[TRUE] [kcr] All Questions Asked: Resetting \003"
TRUE_ResetAsked
}
set pickdone 0
while {$pickdone == 0} {
set kidx 0
set foundinasked 0
set pick [rand $TRUEQCount]
while {[lindex $TRUEAsked $kidx] != ""} {
if {[lindex $TRUEAsked $kidx] == $pick} {
set foundinasked 1
# TRUElog "TRUE" "Found Pick:$pick in Asked"
break
}
incr kidx
}
if {$foundinasked == 0} {incr pickdone}
}
# TRUElog "TRUE" "Picked Question:$pick"
TRUE_AddAsked $pick
return $pick
}
proc TRUEParseQuestion {QNum} {
global TRUEMarker TRUEQuestions TRUEQuestion TRUEAnswers TRUEAnswerCount TRUEForcedQuestion KDebug
set KAnswersLeft ""
if {$QNum < 0} {
set TRUEFileQuestion $TRUEForcedQuestion
} {
set TRUEFileQuestion $TRUEQuestions($QNum)
}
if {$KDebug > 1} {TRUElog "TRUE" "Picked:$QNum Question:$TRUEFileQuestion"}
if [info exists TRUEAnswers] {unset TRUEAnswers}
# Position of first "*"
set TRUEMarkerIDX [string first $TRUEMarker $TRUEFileQuestion]
if {$TRUEMarkerIDX < 1} {
TRUElog "TRUE" "Malformed Question #$QNum"
}
set TRUEQuestionEndIDX [expr $TRUEMarkerIDX - 1]
set TRUEQuestion [string range $TRUEFileQuestion 0 $TRUEQuestionEndIDX]
incr TRUEMarkerIDX
set KAnswersLeft [string range $TRUEFileQuestion $TRUEMarkerIDX end]
set KDoneParsing 0
set TRUEAnswerCount 0
while {$KDoneParsing != 1 } {
set KAnswerEnd [string first $TRUEMarker $KAnswersLeft]
if {$KAnswerEnd < 1} {
set KDoneParsing 1
set KAnswerEnd [string length $KAnswersLeft]
}
set KAnswer [string range $KAnswersLeft 0 [expr $KAnswerEnd -1]]
set TRUEAnswers($TRUEAnswerCount) "# $KAnswer"
set TRUEMarkerIDX [expr $KAnswerEnd +1]
set KAnswersLeft [string range $KAnswersLeft $TRUEMarkerIDX end]
incr TRUEAnswerCount
}
}
proc TRUEAskQuestion {} {
global TRUERunning TRUEQNumber TRUEAllAnswered TRUERoundOver TRUEQuestion TRUEQCount
global TRUEPointsPerAnswer TRUEPointsName TRUENumAnswered TRUEAnswerCount
global TRUEQuestionTimer TRUEQuestionTime TRUEDisplayNum TRUEForced TRUELastGuesser
global tipno tiplist TipsToUse InfoItem TRUEtimestart TRUEtimeanswer
if {$TRUERunning != 1} {return}
if {$TRUEForced == 1} {
TRUEParseQuestion -1
set TRUEQNumber 0
set TRUEForced 0
set TRUEForcedQuestion ""
} {
set TRUEQNumber [TRUEPickQuestion]
TRUEParseQuestion $TRUEQNumber
}
set TRUEAllAnswered 0
set TRUELastGuesser ""
set TRUEDisplayNum 0
set TRUENumAnswered 0
set TRUERoundOver 0
set TRUEPointsPerAnswer [rand 3]
if {$TRUEPointsPerAnswer < 1} {set TRUEPointsPerAnswer 3}
set TRUEPointsPerAnswer [expr $TRUEPointsPerAnswer *10]
set TRUEBonus [expr $TRUEPointsPerAnswer *5]
set TRUEPointTotal [expr $TRUEPointsPerAnswer *$TRUEAnswerCount]
if {$TRUEtimeanswer==1} {
set TRUEtimestart [clock clicks -milliseconds]
}
if {$TRUEAnswerCount == 1} {
TRUEmsg "\0030,2 :: Question No. $TRUEQNumber\/$TRUEQCount \00308\[\00311 ®True/False® \00308\] \0030tpi@DALnet :: "
TRUEmsg "\002\037\0032Question\002\037: $TRUEQuestion \003"
TRUEmsg "\0030,2 ::\00311 +$TRUEPointsPerAnswer\0030 $TRUEPointsName Bila Anda Menjawab Benar :: \037-= GudLuck =-\037 ::"
}
set KRemain [expr int([expr $TRUEQuestionTime /2])]
set TRUEQuestionTimer [utimer $KRemain "TRUEDisplayRemainingTime $KRemain"]
}
proc TRUECheckGuess {nick uhost hand chan args} {
global TRUEChannel TRUERunning TRUEAnswerCount TRUEAnswers TRUERoundOver TRUEtimeanswer
global TRUEPointsName TRUEPointsPerAnswer TRUENumAnswered TRUEAllAnswered TRUELastGuesser KDebug
global lastwinner lastwinnercount botnick userlist quizconf rankfile TRUEtimestart TRUEtimetoanswer
variable bestscore 0 lastbestscore 0 lastbest ""
variable userarray
variable authorsolved 0 waitforrank 0 gameend 0
if {($chan != $TRUEChannel)||($TRUERunning != 1)||($TRUERoundOver == 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 TRUEGuessOld $args
set TRUEGuess [string tolower $TRUEGuessOld]
if {$KDebug > 1} {TRUElog "TRUE" "Guess: $nick $TRUEGuess"}
foreach z [array names TRUEAnswers] {
set TRUETry [lrange $TRUEAnswers($z) 1 end]
set TRUETryOld $TRUETry
regsub -all \[{',.!}] $TRUETry "" TRUETry
set TRUETry [string tolower $TRUETry]
if {$KDebug > 1} {TRUElog "TRUE" "Try: $TRUETry"}
if {$TRUETry == $TRUEGuess} {
if {[lindex $TRUEAnswers($z) 0] == "#"} {
set TRUEAnswers($z) "$nick $TRUEGuessOld"
set TRUEtimetoanswer ""
if {$TRUEtimeanswer==1} {
set TRUEtimetoanswer [expr [expr [clock clicks -milliseconds]-$TRUEtimestart]/1000.00]
}
incr userarray(score) $TRUEPointsPerAnswer
if {$userarray(score) == 1} {
set userarray(started) [unixtime]
}
set userlist($nick) [array get userarray]
TRUEmsg "\0032Jawaban Betul : \00306$TRUETryOld \00302by \00306$nick \00302score:\00306 +$TRUEPointsPerAnswer \00302- less then \00306$TRUEtimetoanswer \00302seconds - Total Score: \00306$userarray(score) \00302Points and Ranked: \00306[mx_get_rank_pos $nick]"
pushmode $TRUEChannel +v $nick
tmcquiz_rank_save {} {} {}
incr TRUENumAnswered
if {$TRUENumAnswered == $TRUEAnswerCount} {
set TRUEAllAnswered 1
set TRUERoundOver 1
if {$TRUEAnswerCount == 1} {
set TRUELastGuesser ""
TRUEmsg ""
TRUE_TriviaResults
} elseif {$TRUEAnswerCount >= 2} {
set TRUELastGuesser $nick
TRUEmsg ""
TRUE_ShowResults
}
TRUE_Recycle
}
return
}
}
}
}
proc TRUEDisplayRemainingTime {remaining} {
global TRUERunning TRUEAllAnswered TRUENumAnswered TRUEAnswerCount TRUEQuestionTimer TRUEQuestionTime TRUEDisplayNum
global TRUEQuestion
if {($TRUERunning != 1)||($TRUEAllAnswered == 1)} {return}
if {$TRUEAnswerCount == 1} {
TRUEmsg "\0036 $remaining \0032secs remaining...\003"
} elseif {$TRUEAnswerCount >= 2} {
TRUEmsg "\00306$remaining \00302secs remaining..."
}
incr TRUEDisplayNum
set KRemain [expr int([expr $TRUEQuestionTime /4])]
if {$TRUEDisplayNum < 2} {
set TRUEQuestionTimer [utimer $KRemain "TRUEDisplayRemainingTime $KRemain"]
} {
set TRUEQuestionTimer [utimer $KRemain TRUETimesUp]
}
}
proc TRUETimesUp {} {
global TRUEAnswers TRUEAllAnswered TRUERoundOver TRUENumAnswered TRUEAnswerCount TRUEQuestionTimer TRUEAdTimer
global tkcurrentanswer tkhinttimer tktimenext tkchan tknextqtimer tkstreak tkstreakmin
global tkscoresbyname tkranksbyname tkranksbynum tkcongrats tkscorestotal tkmissed
global tktimestart tkshowallscores tkrealnames tkscoresbyrank
if {$TRUEAllAnswered == 1} { return 1}
set TRUERoundOver 1
set TRUEmissed "Time's Up! \003 "
append KMissed "\00302Times Up. Jawabannya adalah: "
set KAnswersRemaining [expr ($TRUEAnswerCount - $TRUENumAnswered)]
set kcount 0
foreach z [array names TRUEAnswers] {
if {[lindex $TRUEAnswers($z) 0] == "#"} {
append KMissed "\00306[lrange $TRUEAnswers($z) 1 end]"
incr kcount
if {$kcount < $KAnswersRemaining} {append KMissed " - "}
}
}
TRUEmsg "$KMissed"
TRUE_ShowResults
if {$TRUENumAnswered > 0} {
# TRUEmsg "\00302Total Number Answered Correctly:  $TRUENumAnswered from a possible $TRUEAnswerCount! \003"
} {
TRUEmsg "\00302Now go to the next Game"
}
set tknextqtimer [utimer $tktimenext tknextq]
set tkplaying 1
set tkstreak 0
set tkmissed 0
}
proc TRUE_Recycle {} {
global tkcurrentanswer tkhinttimer tktimenext tkchan tknextqtimer tkstreak tkstreakmin
global tkscoresbyname tkranksbyname tkranksbynum tkcongrats tkscorestotal tkmissed
global tktimestart tkshowallscores tkrealnames tkscoresbyrank tktimeanswer
global TRUEAnswers TRUENumAnswered TRUEQuestionTimer TRUEAdTimer
catch {killutimer $TRUEQuestionTimer}
if [info exists TRUEAnswers] {unset TRUEAnswers}
set TRUEQuestion ""
set TRUENumAnswered 0
set tknextqtimer [utimer $tktimenext tknextq]
set tkplaying 1
set tkstreak 0
set tkmissed 0
}
proc TRUE_ShowResults {} {
global TRUEAnswers TRUEPointsPerAnswer TRUEPointsName TRUEAllAnswered TRUELastGuesser
global botnick quizconf rankfile userlist lastwinner lastwinnercount
if {$TRUEAllAnswered == 1} {
set TRUEBonus [expr $TRUEPointsPerAnswer *5]
set nick $TRUELastGuesser
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) $TRUEBonus
if {$userarray(score) == 1} {
set userarray(started) [unixtime]
}
set userlist($nick) [array get userarray]
TRUEmsg ""
tmcquiz_rank_save {} {} {}
}
}
proc TRUE_TriviaResults {} {
global TRUEAnswers TRUEPointsPerAnswer TRUEPointsName TRUEAllAnswered TRUELastGuesser
}
proc TRUE_AddAsked {KQnum} {
global TRUEAsked TRUEAskedFile
set f [open $TRUEAskedFile a]
puts $f $KQnum
close $f
lappend TRUEAsked $KQnum
}
proc TRUE_ReadAskedFile {} {
global TRUEAsked TRUEAskedFile
set KAsked 0
set TRUEAsked ""
if {![file exists $TRUEAskedFile]} {
set f [open $TRUEAskedFile w]
} {
set f [open $TRUEAskedFile r]
while {[gets $f KQnum] != -1} {
lappend TRUEAsked "$KQnum"
incr KAsked
}
}
close $f
return $KAsked
}
proc TRUE_ResetAsked {} {
global TRUEAskedFile TRUEAsked
set f [open $TRUEAskedFile w]
puts $f "0"
close $f
set TRUEAsked ""
}
proc TRUE_ReadQuestionFile {} {
global TRUEQuestionFile TRUEQuestions
set KQuestions 0
set f [open $TRUEQuestionFile r]
while {[gets $f q] != -1} {
set TRUEQuestions($KQuestions) $q
incr KQuestions
}
close $f
return $KQuestions
}
proc TRUE_ShowAsked {nick uhost hand chan args} {
global TRUEQCount TRUEAsked TRUEQuestions
set TRUEStatsAsked [llength $TRUEAsked]
set TRUEStatsUnasked [expr ($TRUEQCount - $TRUEStatsAsked)]
TRUEmsg "Total: $TRUEQCount Asked: $TRUEStatsAsked Remaining: $TRUEStatsUnasked \003"
}
proc TRUE_ReadCFG {} {
global TRUECFGFile TRUEChannel TRUEAutoStart TRUEAskedFile TRUEQuestionFile TRUEPointsName TRUEAd
if {[file exist $TRUECFGFile]} {
set f [open $TRUECFGFile r]
while {[gets $f s] != -1} {
set kkey [string tolower [lindex [split $s "="] 0]]
set kval [lindex [split $s "="] 1]
switch $kkey {
points { set TRUEPointsName $kval }
channel { set TRUEChannel $kval }
autostart { set TRUEAutoStart $kval }
askedfile { set TRUEAskedFile $kval }
TRUEfile { set TRUEQuestionFile $kval }
ad1 { set TRUEAd(0) $kval }
ad2 { set TRUEAd(1) $kval }
ad3 { set TRUEAd(2) $kval }
}
}
close $f
if {($TRUEAutoStart < 0)||($TRUEAutoStart > 1)} {set TRUEAutoStart 1}
return
}
TRUElog "TRUE" "Config file $TRUECFGFile not found... using defaults"
}
proc TRUE_WriteCFG {} {
global TRUECFGFile TRUEChannel TRUEAutoStart TRUEAskedFile TRUEQuestionFile TRUEPointsName TRUEAd
set f [open $TRUECFGFile w]
puts $f "# This file is automatically overwritten"
puts $f "Points=$TRUEPointsName"
puts $f "Channel=$TRUEChannel"
puts $f "AutoStart=$TRUEAutoStart"
puts $f "AskedFile=$TRUEAskedFile"
puts $f "TRUEFile=$TRUEQuestionFile"
puts $f "Ad1=$TRUEAd(0)"
puts $f "Ad2=$TRUEAd(1)"
puts $f "Ad3=$TRUEAd(2)"
close $f
}
proc TRUEmsg {what} {
global TRUEChannel
putquick "PRIVMSG $TRUEChannel :$what"
}
proc TRUElog {who what} {
putcmdlog "\[$who\] $what"
}
proc dcc_TRUErehash {hand idx arg} {
global TRUEQCount
putcmdlog "#$hand# Rehashing TRUE config"
TRUE_ReadCFG
set TRUEQCount [TRUE_ReadQuestionFile]
if {$TRUEQCount < 2} {
TRUElog "TRUE" "Not Enough Questions in Question File $TRUEQuestionFile"
return 0
}
set TRUEAskedFileLen [TRUE_ReadAskedFile]
if {$TRUEAskedFileLen >= $TRUEQCount} {
TRUElog "TRUE" "Asked file out of sync with question database: resetting"
TRUE_ResetAsked
return 0
}
TRUElog "TRUE" "Questions:$TRUEQCount Asked:$TRUEAskedFileLen Remaining:[expr ($TRUEQCount - $TRUEAskedFileLen)]"
}
TRUE_ReadCFG


putlog "True/False tpi DALnet ® Succesfully LoaDeD..."
