Anagram script
 

News:

29 December 2022 - PtokaX 0.5.3.0 (20th anniversary edition) released...
11 April 2017 - PtokaX 0.5.2.2 released...
8 April 2015 Anti child and anti pedo pr0n scripts are not allowed anymore on this board!
28 September 2015 - PtokaX 0.5.2.1 for Windows 10 IoT released...
3 September 2015 - PtokaX 0.5.2.1 released...
16 August 2015 - PtokaX 0.5.2.0 released...
1 August 2015 - Crowdfunding for ADC protocol support in PtokaX ended. Clearly nobody want ADC support...
30 June 2015 - PtokaX 0.5.1.0 released...
30 April 2015 Crowdfunding for ADC protocol support in PtokaX
26 April 2015 New support hub!
20 February 2015 - PtokaX 0.5.0.3 released...
13 April 2014 - PtokaX 0.5.0.2 released...
23 March 2014 - PtokaX testing version 0.5.0.1 build 454 is available.
04 March 2014 - PtokaX.org sites were temporary down because of DDOS attacks and issues with hosting service provider.

Main Menu

Anagram script

Started by Mikko, 26 July, 2005, 01:21:57

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Mikko

Can anyone modify this great anagram script to create daily, weekly and all time scores? I think it should be posting daily scores since game and weekly & all time scores only when requested by user.
Thanks.


sAuthor = "RabidWombat";
sEmail = "cbarber@dwc.edu";
sConversion = " Converted to LUA 5 by ??????Hawk?????? 03/03/2005"
bGameRunning, bGamePaused = nil, nil;
sJumblePhrase, sActualPhrases, NoSpacePhrase = nil,nil,nil;
iLength, iBonusTime = 0, 0;
sScoreOutput, sHintOutput, sHelpOutput, sOpHelpOutput = nil, nil, nil, "";
iTimeCount, iGameNoReplyCount = 0, 0;
tScores, tScoresByName  = { n = 0 }, {};
tChannelUsers, iChannelCount = {}, nil;

-- PtokaX Events --

function Main()
   dofile("jumble.cfg");

   sScoreFormula = "return "..sScoreFormula;
   sBonusFormula = "return "..sBonusFormula;
   sHintFormula  = "return "..sHintFormula;

   frmHub:RegBot(sBotName);

   sHelpOutput = StrReplace(tStringTable[1]);

   for cmd,tTemp in tCommands do
      if(tTemp[1] == DisplayJumbleHelp) then
         sJumbleHelp = cmd;
      end

      sCmd, sDesc = cmd, tTemp[3];

      if(tTemp[2] == 0) then
         sHelpOutput = sHelpOutput..StrReplace(tStringTable[2]);
      else
         sOpHelpOutput = sOpHelpOutput..StrReplace(tStringTable[2]);
      end
   end

   OldSendToAll = SendToAll;
   UserDisconnected = LeaveJumble;
   OpDisconnected = LeaveJumble;

   SetTimer(1000);

   ReadScoresFromFile();
   SetScores();
end

function OnTimer()
   if(bGamePaused) then
      iTimeCount = iTimeCount + 1;

      if(iTimeCount >= iPauseTime) then
         StartJumblePhrase();
      end
   elseif(bGameRunning) then
      iTimeCount = iTimeCount + 1;

      if(iTimeCount == iHintTime) then
         SendToAll(sBotName, sHintOutput);
      elseif (iTimeCount == iGameEndTime - 10) then
         SendToAll(sBotName, StrReplace(tStringTable[3]));
      elseif (iTimeCount == iGameEndTime) then
         StopJumblePhrase();
         if(iGameNoReplyCount >= 3) then
            StopJumbleGame();
         end
      else

      end
   else

   end
end



function ChatArrival(curUser, sData)
   local s, e, sNewData, chat, cmd, args = string.find(sData, "(%b<>%s+((%S+)%s*([^%|]*)))%|$");
   local s, e, sTo = string.find(sData, "^%$To: (%S+)");

   if(cmd == nil or (sTo and sTo ~= sBotName)) then return 0; end

   sUserName = curUser.sName;

   if(sTo) then
      curUser.SendData = curUser.SendPM;
   end

   cmd = string.lower(cmd);

   if(tCommands[cmd] and (tCommands[cmd][2] == 0 or curUser.bOperator)) then
      curUser:SendData(sData);
      tCommands[cmd][1](curUser, args);
      return 1;
   else
      if (not(iChannelCount) and string.sub(sData,1,1) == "<") then
         iGameNoReplyCount = 0;
      end

      if(iChannelCount and string.find(sData, "$To: "..sBotName, 1, 1) == 1 and cmd == "!me") then
         sNewData = "* "..sUserName..string.sub(chat, 4);
      end

      if(bGameRunning and bGamePaused == nil and string.find(string.upper(chat), sActualPhrase, 1, 1)) then
         SendToAll(sNewData);

         iBonusTime = math.max(iBonusTimeLimit - iTimeCount, 0);

         iScore = assert(loadstring(StrReplace(sScoreFormula)))();
         iBonus = assert(loadstring(StrReplace(sBonusFormula)))();

         if(tScoresByName[sUserName]) then
            tScoresByName[sUserName][2] = tScoresByName[sUserName][2] + iScore + iBonus;
         else
            tScoresByName[sUserName] = {sUserName, iScore + iBonus};
            table.insert(tScores, tScoresByName[sUserName]);
         end

         iRank = SetScores(sUserName);
         iRankTotal = table.getn(tScores);
         iUserScore = tScoresByName[sUserName][2];

         WriteScoresToFile();

         StopJumblePhrase();

         if(iBonusTime ~= 0) then
            SendToAll(sBotName, StrReplace(tStringTable[4]));
         else
            SendToAll(sBotName, StrReplace(tStringTable[5]));
         end

         iGameNoReplyCount = 0;

         return 1;
      else
         if(iChannelCount and string.find(sData, "^$To: "..sBotName, 1, 1) == 1) then
            if(tChannelUsers[sUserName] == nil) then
               JoinJumble(curUser);
            else
               SendToAll(sNewData);
               iGameNoReplyCount = 0;
            end

            return 1;
         end
      end

   end
end

-- Command Functions --

function StartJumbleGame(curUser, args)
   if(bGameRunning) then return; end
         if(args ~= "") then
            HubGameActive = 2
            local s, e, args = string.find(args, "([%w%s]+)$");
               args = "Jumble\\"..args..".txt";
               local f,e = io.open(args,"r")
               if f then
                  sJumbleWordsFile = args;
                  f:close(f)
               end
         end
   OldSendToAll(sBotName, StrReplace(tStringTable[6]));
   StartJumblePhrase();
   SendToAll(sBotName, StrReplace(tStringTable[7]));

   iGameNoReplyCount = 0;
end

function StopJumbleGame(curUser)
   if not(bGameRunning) then return; end

   if not(bGamePaused) then
      StopJumblePhrase();
   end

   if(curUser) then
      OldSendToAll(sBotName, StrReplace(tStringTable[8]));
   else
      OldSendToAll(sBotName, StrReplace(tStringTable[21]));
      -- TODO: fix numbers
   end

   bGameRunning, bGamePaused = nil, nil;
   iBonusTime, iLength = 0, 0;
   StopTimer();
end

function DisplayJumblePhrase(curUser)
   if(bGameRunning and not bGamePaused) then
      if(curUser == nil) then
         SendToAll(sBotName, StrReplace(tStringTable[9]));
      else
         curUser:SendData(sBotName, StrReplace(tStringTable[9]));
      end
   end
end

function DisplayJumbleHelp(curUser)
   if(curUser.bOperator) then
      curUser:SendData(sBotName, sHelpOutput..sOpHelpOutput);
   else
      curUser:SendData(sBotName, sHelpOutput);
   end
end

function DisplayJumbleScores(curUser)
   curUser:SendData(sBotName, sScoresOutput);
end

function DisplayMyJumbleScore(curUser)
   iRank = tScoresByName[curUser.sName][3];
   iRankTotal = table.getn(tScores);
   iUserScore = tScoresByName[sUserName][2];

   if(tScoresByName[curUser.sName]) then
      curUser:SendData(sBotName, StrReplace(tStringTable[10]));
   else
      curUser:SendData(sBotName, StrReplace(tStringTable[11]));
   end
end

function DisplayJumbleHint(curUser)
   if(iTimeCount >= iHintTime) then
      curUser:SendData(sBotName, sHintOutput);
   end
end

function JoinJumble(curUser)
   if(iChannelCount and tChannelUsers[curUser.sName] == nil) then
      SendToAll(sBotName, StrReplace(tStringTable[12]));

      curUser:SendPM(sBotName, StrReplace(tStringTable[13]));
      curUser.SendData = curUser.SendPM;

      DisplayJumblePhrase(curUser);
      DisplayJumbleHint(curUser);

      tChannelUsers[curUser.sName] = 1;
      iChannelCount = iChannelCount + 1;
   end
end

function LeaveJumble(curUser)
   if(iChannelCount and tChannelUsers[curUser.sName]) then
      sUserName = curUser.sName;
      SendToAll(sBotName, StrReplace(tStringTable[14]));

      tChannelUsers[curUser.sName] = nil;
      iChannelCount = iChannelCount - 1;

      if(iChannelCount <= 0) then
         iChannelCount = 0;
         StopJumbleGame();
      end
   end
end

function SetPrivateJumbleGame(curUser)
   if(iChannelCount == nil) then
      SendToAll = SendToAllInChannel;
      iChannelCount = 0;
   end
end

function SetPublicJumbleGame(curUser)
   if(iChannelCount) then
      SendToAll = OldSendToAll;
      tChannelUsers = {};
      iChannelCount = nil;
   end
end

-- Jumble Phrase Functions --

function JumbleString(str)
   local tStr = { n = 0; };
   local newString = "";

   string.gsub(str, "(.)", function(c) table.insert(tStr, c); end);

   math.randomseed(os.clock());

   -- Fisher-Yates shuffle
   for n = table.getn(tStr), 1, -1 do
      local pos = math.random(n);
      newString = tStr[pos].." "..newString;
      tStr[pos] = tStr[n];
   end

   return newString;
end

function JumblePhrase(phr)
   return string.sub(string.gsub(phr, "(%S+)", function (w) return JumbleString(w).."  "; end), 1, -2);
end

function StartJumblePhrase()
   local hFile,Er = io.open(sJumbleWordsFile, "r");
   if(hFile == nil) then
      SendToAll(sBotName, "Error opening "..sJumbleWordsFile);
            return;
   end
   local _, phr = nil, nil;
   local iFileSize = hFile:seek("end")
   math.randomseed(os.clock());
   while(phr == nil) do
      hFile:seek("set", math.random(iFileSize)-1);
       _, phr = hFile:read( "*l", "*l");
   end
   hFile:close();
   sActualPhrase = string.upper(phr);
   sNoSpacePhrase = string.gsub(sActualPhrase, "%s", "");
   sJumblePhrase = JumblePhrase(sActualPhrase);
   iLength = string.len(sNoSpacePhrase);

   SetJumbleHint();

   SendToAll(sBotName, StrReplace(tStringTable[9]));

   iTimeCount = 0;
   bGameRunning = 1;
   bGamePaused = nil;
   StopTimer(); StartTimer();
end

function StopJumblePhrase()
   SendToAll(sBotName, StrReplace(tStringTable[15]));
   sActualPhrase, sNoSpacePhrase, sJumblePhrase = nil, nil, nil;

   iTimeCount = 0;
   bGamePaused = 1;
   iGameNoReplyCount = iGameNoReplyCount + 1;
end

-- String Functions --

function StrReplace(sString)
   sString = string.gsub(sString, "%$(%w+)", function (w)
      if(string.sub(w,1,1) == "$") then
         return string.sub(w,2,-1);
      else
         return _G[w] or "nil";
      end
   end);

   return sString;
end

-- Score Functions --

function SetScores(sName)
   local iCount = table.getn(tScores);
   iDisplayCount = iDisplayScores or iCount

   if(iDisplayScores) then
      sScoresOutput = StrReplace(tStringTable[16]);
   else
      sScoresOutput = StrReplace(tStringTable[17]);
   end

   if(iCount == 0) then
      sScoresOutput = StrReplace(tStringTable[18]);
   else
      table.sort(tScores, function(a, b) return a[2] > b[2]; end);

      for i = 1, iCount, 1 do
         tScores[3] = i;   -- set ranks for all users
      end

      for i = 1, math.min(iDisplayCount, iCount), 1 do
         iPos = i;
         sUserName = tScores[iPos][1];
         iUserScore = tScores[iPos][2];
         sScoresOutput = sScoresOutput..StrReplace(tStringTable[19]);
      end
   end

   sUserName = sName;

   if(sName) then
      return tScoresByName[sName][3];
   end
end

function ReadScoresFromFile()
   dofile(sJumbleScoresFile);

   for i = 1, table.getn(tScores), 1 do
      tScoresByName[tScores[1]] = tScores;
   end
end
function ToArrival(user, data)
   ChatArrival(user, data)
end
function WriteScoresToFile()
   local hFile,Er = io.open(sJumbleScoresFile, "w");
   hFile:write("tScores = {\n");
   for i = 1, table.getn(tScores), 1 do
      hFile:write("["..i.."] = {"..string.format("%q", tScores[1])..","..tScores[2].."},\n");
   end
   hFile:write("n="..table.getn(tScores).."\n");
   hFile:write("};");
   hFile:close();
end

-- Hint Functions --

function SetJumbleHint()
   local tRevealArray = { };

   local iReveal = assert(loadstring(StrReplace(sHintFormula)))();

   local iPos = nil;

   while(iReveal > 0) do
      repeat iPos = math.random(iLength); until tRevealArray[iPos] == nil

      tRevealArray[iPos] = 1;
      iReveal = iReveal - 1;
   end

   tRevealArray.iPos = 1;

   sHint = string.gsub(sActualPhrase, "(%S)", function (c)
                     if (c == nil) then return ""; end

                     local out, tTemp = nil, tRevealArray;

                     if(tTemp[tTemp.iPos]) then
                        out = c;
                     else
                        out = sHintChar;
                     end

                     tTemp.iPos = tTemp.iPos + 1;

                     return out.." ";
                  end);
   sHint = string.sub(sHint, 1, -2);

   sHintOutput = StrReplace(tStringTable[20]);
end

-- Channel Functions --

function SendToAllInChannel(sSender, sRawOutput)
   if(sSender) then
      local _;

      if(sRawOutput == nil) then
         sRawOutput = sSender;
         _, _, sSender = string.find(sRawOutput, "^%<(.-)%>");
      else
         sRawOutput = "<"..sSender.."> "..sRawOutput;
      end

      for nick, val in tChannelUsers do
         if(nick ~= sSender) then
            SendToNick(nick, "$To: "..nick.." From: "..sBotName.." $"..sRawOutput);
         end
      end
   end
end


SMF spam blocked by CleanTalk