mIRC Home    About    Download    Register    News    Help

Print Thread
#270801 01/10/22 05:17 PM
Joined: Mar 2022
Posts: 15
CeraVea Offline OP
Pikka bird
OP Offline
Pikka bird
Joined: Mar 2022
Posts: 15
I have this Fam Feud script that's working pretty neatly until my computer lost power and then when I restarted the bot, apparently it did not save the scores and had to start all over again. I am not sure how to check but I do see a buildscore alias that I thought should store the score somewhere but idk. i am still new to scripting and I couldn't figure this out yet.

Appreciate any help from yall big-time scripters! smile

Code
;Family Feud 
;Runs a channel-wide game of Family Feud with questions and answers specified in a txt file (Default .txt file name is FamFeud.txt)
;Fam Feud text File: https://drive.google.com/file/d/1lTvLQ0Yi3W4FkTXs-0WBCCllLQ-p_dnj/view?usp=sharing
;Enjoy :D

/*
-------------
Commands:
!start number
-------------
Starts the game
"!start 1" starts a 1 round game, "!start unlimited or !start" starts an unlimited game
-------------
!stop -- Stops the game
-------------
!score -- Notices a user his/her score
-------------
!scores -- Messages the scores to the channel (Also messaged at the end of each round)
-------------
*/

;Reads from a text file and grabs a random line's Question and answers in the format: Question*Answer1-Answer2-Answer3-Answer4-Answer5-Answer6-Answer7-Answer8

on *:LOAD:/FFsetchan $?="Type the name of the channel you would like Family Feud to be active in (Including #)"

menu nicklist,channel,status,menubar,query {
  Family Feud
  .$iif(%FF.on != 2,Start):/FFStart $me $chan $?="How many rounds? For unlimited rounds say unlimited."
  .$iif(%FF.on == 2,Stop):/FFStop $me $chan
  .Set Family Feud Channel:/FFsetchan $?="Type the name of the channel you would like Family Feud to be active in (Including #)"
}

alias FFsetchan { set %chanFF $1 } 

alias question {
  set %FF.line $read(FamFeud.txt)
  set %FF.num $pos(%FF.line, *, 1)
  set %FF.length $len(%FF.line)
  set %FF.numA %FF.length - %FF.num
  set %FF.numQ %FF.num - 1
  set %FF.dashes $count(%FF.line, -)

  set %FF.answers $right(%FF.line, %FF.numA)
  set %FF.question $left(%FF.line, %FF.numQ)

  set %FF.numcom $pos(%FF.answers, -, 1) - 1
  set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
  set %FF.a1 $left(%FF.answers, %FF.numcom)
  set %FF.answers $right(%FF.answers, %FF.numcom2)
  if ( %FF.dashes > 0 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a2 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }
  if ( %FF.dashes > 1 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a3 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }
  if ( %FF.dashes > 2 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a4 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }
  if ( %FF.dashes > 3 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a5 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }
  if ( %FF.dashes > 4 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a6 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }
  if ( %FF.dashes > 5 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a7 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }

  if ( %FF.dashes == 0 ) { set %FF.a1 %FF.answers }
  if ( %FF.dashes == 1 ) { set %FF.a2 %FF.answers }
  if ( %FF.dashes == 2 ) { set %FF.a3 %FF.answers }
  if ( %FF.dashes == 3 ) { set %FF.a4 %FF.answers }
  if ( %FF.dashes == 4 ) { set %FF.a5 %FF.answers }
  if ( %FF.dashes == 5 ) { set %FF.a6 %FF.answers }
  if ( %FF.dashes == 6 ) { set %FF.a7 %FF.answers }
  if ( %FF.dashes == 7 ) { set %FF.a8 %FF.answers }
  if ( %FF.dashes > 7 ) {
    set %FF.numcom $pos(%FF.answers, -, 1) - 1
    set %FF.numcom2 $len(%FF.answers) - $pos(%FF.answers, -, 1)
    set %FF.a8 $left(%FF.answers, %FF.numcom)
    set %FF.answers $right(%FF.answers, %FF.numcom2)
  }

  inc %FF.dashes

  ;I was having issues with my other answer variables and timers so I just made a second set for the check alias.
  set %FF.answerz 0
  set %FF.a12 %FF.a1
  set %FF.a22 %FF.a2
  set %FF.a32 %FF.a3
  set %FF.a42 %FF.a4
  set %FF.a52 %FF.a5
  set %FF.a62 %FF.a6
  set %FF.a72 %FF.a7
  set %FF.a82 %FF.a8
  if (%FF.roundsplayed != $null) { msg %chanFF 10Round %FF.roundsplayed / %FF.rounds $+ 8 $chr(124) $+ $chr(124) 10Question ( $+ $readn $+ / $+ $lines(FamFeud.txt) $+ ):4 %FF.question }
  else { msg %chanFF 10Question ( $+ $readn $+ / $+ $lines(FamFeud.txt) $+ ):4 %FF.question }
  msg %chanFF 10There are4 %FF.dashes 10answers!
}

alias game {
  if (%FF.roundsplayed == $null || %FF.roundsplayed <= %FF.rounds) {
    question
    .timer1 1 60 game2
    .timer3 1 40 remaining
  }
  else { FFstop }
}

alias game2 {
  if ( %FF.dashes == 1 ) { msg %chanFF 10That's it!  The answer was:4 %FF.a12 }
  if ( %FF.dashes == 2 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 and %FF.a22 }
  if ( %FF.dashes == 3 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , and %FF.a32 }
  if ( %FF.dashes == 4 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , %FF.a32 $+ , and %FF.a42 }
  if ( %FF.dashes == 5 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , %FF.a32 $+ , %FF.a42 $+ , and %FF.a52 }
  if ( %FF.dashes == 6 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , %FF.a32 $+ , %FF.a42 $+ , %FF.a52 $+ , and %FF.a62 }
  if ( %FF.dashes == 7 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , %FF.a32 $+ , %FF.a42 $+ , %FF.a52 $+ , %FF.a62 $+ , and %FF.a72 }
  if ( %FF.dashes == 8 ) { msg %chanFF 10That's it!  The answers were (in order):4 %FF.a12 $+ , %FF.a22 $+ , %FF.a32 $+ , %FF.a42 $+ , %FF.a52 $+ , %FF.a62 $+ , %FF.a72 $+ , and %FF.a82 }
  buildscores
  if (%FF.roundsplayed != $null) { inc %FF.roundsplayed }
  unset %FF.a*
  if (%FF.roundsplayed > %FF.rounds) { FFstop }
  if (%FF.on == 2) { msg %chanFF %FF.scoreoutput }
  if (%FF.on == 2) { .timer2 1 10 game }
  ;7 second delay between questions.
}

alias remaining {
  set %FF.remain 10The remaining answers are:4
  if ( %FF.a1 != $null ) { set %FF.remain %FF.remain #1 }
  if ( %FF.a2 != $null ) { set %FF.remain %FF.remain #2 }
  if ( %FF.a3 != $null ) { set %FF.remain %FF.remain #3 }
  if ( %FF.a4 != $null ) { set %FF.remain %FF.remain #4 }
  if ( %FF.a5 != $null ) { set %FF.remain %FF.remain #5 }
  if ( %FF.a6 != $null ) { set %FF.remain %FF.remain #6 }
  if ( %FF.a7 != $null ) { set %FF.remain %FF.remain #7 }
  if ( %FF.a8 != $null ) { set %FF.remain %FF.remain #8 }
  msg %chanFF %FF.remain
}

on *:TEXT:!start*:%chanFF:{ 
  if ($2 != $null) { FFstart $nick $chan $2 }
  else { FFstart $nick $chan unlimited }
}

alias FFstart {
  if ( %FF.on != 2 ) {
    msg %chanFF 10,1A game has been started by $1
    msg %chanFF 10,1Game commands: 4,1!start <number> 10,1"8,1!start 110,1" starts a 1 round game, "4,1!start unlimited10,1 or 4,1!start10,1" starts an unlimited game ; 4,1!stop 10,1- Stops the game ; 4,1!score 10,1- Notices a user his/her score ; 4,1!scores 10,1- Messages the scores to the channel (Also messages at the end of each round)
    set %FF.answerz 0
    set %FF.on 2
    set %FF.roundsplayed 1
    if ($3 == unlimited) { unset %FF.roundsplayed }
    else { set %FF.rounds $3 }
    game
  }
  else { .notice $1 The game's already going, maybe you should try answering some questions now. }
}

on *:TEXT:!stop:%chanFF:{ FFstop $nick $chan }

alias FFstop { 
  if ( %FF.on == 2 ) {
    if ($1 != $null) msg %chanFF 10Game stopped by $1 $+ .
    else msg %chanFF 10Game over!
    buildscores
    msg %chanFF %FF.scoreoutput
    .timer1 off
    .timer2 off
    .timer3 off
    unset %FF.*
  }
  else { .notice $1 Stop what? }
}

on *:TEXT:!score:%chanFF:{
  if ( %FF.on == 2 && %chanFF == $chan ) {
    if ( %FF.score. [ $+ [ $nick ] ] != $null ) {
      .notice $nick Your score is %FF.score. [ $+ [ $nick ] ] $+ .
    }
    else {
      .notice $nick Your score is 0.
    }
  }
  else {
    .notice $nick There's no game going on, dumbass.
  }
}

;Text events for all 8 answers

on *:TEXT:%FF.a1:%chanFF:{
  msg %chanFF 10Survey says,4 50 points10!4 $nick 10got the 4#1 10answer,4 %FF.a1 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 50
  unset %FF.a1
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a2:%chanFF:{
  msg %chanFF 10Survey says,4 35 points10!4 $nick 10got the 4#2 10answer,4 %FF.a2 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 35
  unset %FF.a2
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a3:%chanFF:{
  msg %chanFF 10Survey says,4 28 points10!4 $nick 10got the 4#3 10answer,4 %FF.a3 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 28
  unset %FF.a3
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a4:%chanFF:{
  msg %chanFF 10Survey says,4 20 points10!4 $nick 10got the 4#4 10answer,4 %FF.a4 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 20
  unset %FF.a4
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a5:%chanFF:{
  msg %chanFF 10Survey says,4 15 points10!4 $nick 10got the 4#5 10answer,4 %FF.a5 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 15
  /unset %FF.a5
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a6:%chanFF:{
  msg %chanFF 10Survey says,4 10 points10!4 $nick 10got the 4#6 10answer,4 %FF.a6 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 10
  unset %FF.a6
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a7:%chanFF:{
  msg %chanFF 10Survey says,4 8 points10!4 $nick 10got the 4#7 10answer,4 %FF.a7 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 8
  unset %FF.a7
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

on *:TEXT:%FF.a8:%chanFF:{
  msg %chanFF 10Survey says,4 5 points10!4 $nick 10got the 4#8 10answer,4 %FF.a8 $+ 10!
  inc %FF.score. [ $+ [ $nick ] ] 5
  unset %FF.a8
  set %FF.answerz %FF.answerz + 1
  check %FF.answerz
}

alias buildscores {
  set %FF.count 0
  set %FF.added 0
  set %FF.totalnicks $nick(%chanFF,0,a)
  set %FF.highest 0
  set %FF.highestnick $me
  set %FF.x $var(%FF.score.*, 0)
  set %FF.scoreoutput 10Scores:
  while (%FF.added < %FF.x) {
    while (%FF.count <= %FF.totalnicks) {
      set %FF.testnick $nick(%chanFF,%FF.count,a)
      if (%FF.score. [ $+ [ %FF.testnick ] ] != $null) && (%FF.score. [ $+ [ %FF.testnick ] ] >= %FF.highest) && (%FF.testnick !isin %FF.scoreoutput) {
        set %FF.highest %FF.score. [ $+ [ %FF.testnick ] ]
        set %FF.highestnick %FF.testnick
      }
      inc %FF.count
    }
    if (%FF.highest != 0) { set %FF.scoreoutput %FF.scoreoutput 04 $+ %FF.highestnick $+ 10:04 %FF.highest 08 $+ $chr(124) }
    set %FF.highest 0
    set %FF.highesttnick $me
    inc %FF.added
    set %FF.count 0
  }
  set %FF.chop $calc($len(%FF.scoreoutput) - 1)
  set %FF.scoreoutput $left(%FF.scoreoutput,%FF.chop)
  if (%FF.scoreoutput == 10Scores:) set %FF.scoreoutput 10Nobody has any points!
}

;Checks to see if all answers have been said before time limit is up
alias check {
  if ( $1 == %FF.dashes ) { 
    .timer1 off
    .timer3 off
    game2 
  }
}

;Accounts for nickname changes mid-game.
on *:NICK:{
  if ( %FF.score. [ $+ [ $nick ] ] != $null ) {
    set %FF.score. [ $+ [ $newnick ] ] %FF.score. [ $+ [ $nick ] ]
    unset %FF.score. [ $+ [ $nick ] ]
  }
}

;Notices the scores of players in the channel in order to the person that said !scores
on *:TEXT:!scores:%chanFF:{
  buildscores
  .notice $nick %FF.scoreoutput
}
ON *:TEXT:!famfeudhelp*:#: {
  if ($nick isop #) && ($me isop #) {
    timer 1 2 msg # Family Feud Commands:
    timer 1 3 msg # !start number - Starts the game (!start 1 starts a 1 round game, while !start unlimited or !start starts an unlimited game)
    timer 1 4 msg # !stop - Stops the game
  timer 1 5 msg # !score - Notices a user his/her score ; !scores - Messages the scores to the channel (Also messaged at the end of each round) }
}


JilValentine | (Read error: EOF from client) | https://jilvalentine.de
Joined: Jan 2004
Posts: 1,948
Hoopy frood
Offline
Hoopy frood
Joined: Jan 2004
Posts: 1,948
From looking at the script, it appears the scores are saved as global variables with names like %FF.score.nick where the 'nick' is replaced with the actual nick. So if someone changes their nick the score starts at zero.

This kind of problem can happen when files are being written-to when the computer crashes, which often results in a zero-size file. You can see your list of variables by clicking on the 'variables' tab once you're in the Alt+R script editor. The default location is a file named 'vars.ini' located in the 'scripts' folder beneath the one where mirc.ini is located.

Unfortunately, mIRC doesn't make a practice of making regular backups of its own .ini files, so if something happens to mirc.ini vars.ini etc, there's no recovery from it.

There may be a backup that was made during an install if you install new updated versions into the same mIRC folder. This next command can be pasted into your 'status window', and will show you if there are any variables files that may have been during a backup:

//echo -a $findfile($mircdir,var*.ini;var*.bak,0,echo -a $asctime($file($1-).mtime) size $file($1-).size $1-)

Hopefully there's a backup of the file in another subfolder somewhere, having a recent enough timestamp to be of value.

--

Going forward, something you can do to defend against this is to run a script I made a while ago for situations like this.

https://mircscripts.info/?page=project&id=pVcK1

The script will save backups of mirc.ini, and optionally can save backups of the other settings files that mIRC itself writes to. The filenames are saved including the weekday as part of the filename, so if you use mIRC every day, you can end up with a rolling backup from each day of the past week.

By default I only enabled backups of mirc.ini because it's the most likely of the settings files to have this happen to it, due to being the one most frequently written to. But the script has comment lines in it to show you how to enable saving backups of the other settings files. In your case, there's a comment on line 98 telling that line 99 is the command to make backups of the vars.ini variables, file, and you can enable that by removing the semi-colon from the front.

It's not just having your settings files trashed by a computer crash that these backups are for. Sometimes you can make a configuration change that you either can't figure out how you did it, or how to undo it, or it's too much work to restore things the way you like them. For example, if you accidentally click on the 'cascade' or 'tile' icon, it can be hard to undo that. So, you can use a backup of mirc.ini from the past week to get things back to the way they were before. With a week's worth of backups, then hopefully there'd be at least one of them that's 'good'.

Note that to restore a backup you may need to copy the backup on top of the 'correct' filename while mIRC is not running, because some of the settings files are simply writing the internal settings to disk, and mIRC may ignore your swap and just write on top of it.


Link Copied to Clipboard