Naike
2009-05-29 02:05:44
Theres been some time since i released my old responder..
Got some requests to fix it back up, so i did..
Dictionary.ini was made using Widgets form(Look attachements).
Note: had to put it as .rar becuase Villavu don't accept .ini files.
Responds to basic questions, More can be added without trouble.
How to use: Replace CAutoResponder and put Dictionary.ini in Includes/SRL
NOT Includes/SRL/SRL!!!!!
This change does not break any scripts unless it uses it's own CAutoResponder.
CAutoResponder.scar
Dictionary.ini
Got some requests to fix it back up, so i did..
Dictionary.ini was made using Widgets form(Look attachements).
Note: had to put it as .rar becuase Villavu don't accept .ini files.
Responds to basic questions, More can be added without trouble.
How to use: Replace CAutoResponder and put Dictionary.ini in Includes/SRL
NOT Includes/SRL/SRL!!!!!
This change does not break any scripts unless it uses it's own CAutoResponder.
CAutoResponder.scar
//-----------------------------------------------------------------//
//-- Scar Standard Resource Library --//
//-- ยป AutoRespond Routines --//
//-----------------------------------------------------------------//
// * Procedure SetResponseChance(Chance: Integer); // * by N1ke!
// * Procedure SetDicArrays; // * by N1ke!
// * Function SplitName(Name: String):String; // * by N1ke!
// * Procedure RenewTrigger(var Text : TStringArray); // * by N1ke!
// * Procedure RenewAllTriggers; // * by N1ke!
// * Procedure DebugDicArrays; // * by N1ke!
// * Procedure DebugDictionary; // * by N1ke!
// * Function ReplaceSign(Text : String): string; // * by N1ke!
// * Function ChatIsNormal: Boolean; // * by N1ke!
// * Procedure CloseQC; // * by N1ke!
// * Function ChatText(Text: TStringArray): Boolean; // * by N1ke!
// * Procedure DeleteIndex(Index : Integer; var Arr : TStringArray); // * by N1ke!
// * procedure SetupSRLAutoResponder(ChanceResponse: Integer); // * by N1ke!
// * Function Responder: Boolean; // * by N1ke!
Type
RowType = Record
Trigger, Response: TStringArray;
UsedResponse: Integer;
end;
PlayerDictionary = Record
Row: Array of RowType;
end;
var
PlayerDic: Array of PlayerDictionary;
SQAA, UseAutoResponder: Boolean;
ResponseArrays: TStringArray;
ChanceResponding, ResponsesMade: Integer;
{*******************************************************************************
Procedure SetResponseChance(Chance: Integer);
By: N1ke!
Description: Sets response chance.
Example SetResponseChance(75); would set the response chance to 75%.
Reason it's a Procedure instead of just the var is the following:
Vars can be hard to remember, and is annoying to find out!
Also, you can simply find it by Clicking CTRL + Space then typing SetRes ect.
*******************************************************************************}
Procedure SetResponseChance(Chance: Integer);
begin
ChanceResponding := Chance;
end;
{*******************************************************************************
Procedure SetDicArrays;
By: N1ke!
Description: Loads the length of the arrays using the Dictionary.ini.
*******************************************************************************}
Procedure SetDicArrays;
var
i, ii : integer;
begin
SetArrayLength(PlayerDic, HowManyPlayers);
For i:= 0 to High(PlayerDic) do
begin
SetArrayLength(PlayerDic[i].Row, StrToInt(ReadIni('General', 'Rows', AppPath + 'includes\SRL\Dictionary.ini')) + 1);
For ii:= 1 to High(PlayerDic[i].Row) do
begin
SetArrayLength(PlayerDic[i].Row[ii].Trigger, StrToInt(ReadINI('Row' + IntToStr(ii), 'TriggerCount', AppPath + 'includes\SRL\Dictionary.ini'))+ 1);
SetArrayLength(PlayerDic[i].Row[ii].Response, StrToInt(ReadINI('Row' + IntToStr(ii), 'ResponseCount', AppPath + 'includes\SRL\Dictionary.ini'))+ 1);
end;
end;
end;
{*******************************************************************************
Function SplitName(Name: String):String;
By: N1ke!
Description: Makes a name into a human like nick.
Example, Input = 1 w0nt l0se output = w0nt
If a name got many spaces it will delete them and result in the 3
first letters. Example, Input = N 1 k e e Output = N1k
*******************************************************************************}
Function SplitName(Name: String):String;
var I : integer;
begin
If Length(GetOthers(Name)) < 3 then
If Pos(' ', Name) > 0 then
begin
Result := Copy(Name, Pos(' ', Name), Length(Name));
Delete(Result, Pos(' ', Result), 1);
If Pos(' ', Name) > 0 then
Delete(Result, Pos(' ', Result), Length(Result));
If Not Length(Result) <= 2 then
Exit;
end;
For I:=0 to Length(GetOthers(Name))+1do
Delete(Name, Pos(' ', Name), 1);
Result := Left(Name, 3);
end;
{*******************************************************************************
Procedure RenewTrigger(var Text : TStringArray);
By: N1ke!
Description: Renews a trigger to match the currentplayer.
*******************************************************************************}
Procedure RenewTrigger(var Text : TStringArray; Player: Integer);
var
TStrP: TStringArray;
Temp: String;
I, II, L: integer;
begin
L := GetArrayLength(Text);
TStrP:= ['$name', '$namesplit'];
For I:=0 to High(Text) do
For ii:=0 to High(TStrP) do
begin
if Pos( LowerCase(TStrP[II]), LowerCase(Text[I])) > 0 then
begin
Case Lowercase(TStrP[I]) of
'$name' : Temp := Players[Player].Name;
'$namesplit' : Temp := SplitName(Players[Player].Name);
end;
Text[i] := Replace(Text[i], LowerCase(TStrP[I]), Temp);
end else Text[i] := Text[i];
end;
SetArrayLength(Text, L);
end;
{*******************************************************************************
Procedure RenewAllTriggers;
By: N1ke!
Description: Renews all triggers to match the currentplayer.
*******************************************************************************}
Procedure RenewAllTriggers;
var
i, ii: integer;
begin
For i:=0 to High(PlayerDic)do
For ii:=1 to High(PlayerDic[i].Row)do
RenewTrigger(PlayerDic[I].Row[ii].Trigger, I);
end;
{*******************************************************************************
Procedure DebugDicArrays;
By: N1ke!
Description: Debugs the length of the triggers and responses.
*******************************************************************************}
Procedure DebugDicArrays;
var
I, II : Integer;
begin
If GetArrayLength(PlayerDic) = 0 Then Exit;
For I:=0 To High(PlayerDic)do
For II:=1 to High(PlayerDic[I].Row)do
Writeln('[' + IntToStr(i) + '] Row: ' + IntToStr(II) + ' | Triggers: ' + IntToStr(High(PlayerDic[I].Row[II].Trigger)) + ' | Responses: ' + IntToStr(High(PlayerDic[I].Row[II].Response)));
end;
{*******************************************************************************
Procedure DebugDictionary;
By: N1ke!
Description: Debugs the hole dictionary.
*******************************************************************************}
Procedure DebugDictionary;
var
I, II, III, IIII : Integer;
begin
If GetArrayLength(PlayerDic) = 0 Then Exit;
For I:=0 To High(PlayerDic)do
For II:=1 to High(PlayerDic[I].Row)do
begin
Writeln('[' + IntToStr(i) + ']Row: ' + IntToStr(II));
For III:=0 to High(PlayerDic[I].Row[II].Trigger) - 1 do
Writeln('Trigger[' + IntToStr(III) + '] = ' + PlayerDic[I].Row[II].Trigger[III]);
For IIII:=0 to High(PlayerDic[I].Row[II].Response) - 1 do
Writeln('Response[' + IntToStr(IIII) + '] = ' + PlayerDic[I].Row[II].Response[IIII]);
end;
end;
{*******************************************************************************
Function ReplaceResponseSign(Text : String): string;
By: N1ke!
Description: Checks if players have been switched.
*******************************************************************************}
Function ReplaceResponseSign(Text : String): string;
var
TStrP: TStringArray;
I: integer;
begin
TStrP:= ['$attack', '$strength', '$defence', '$range', '$prayer',
'$magic', '$runecrafting', '$hitpoints', '$agility', '$herblore',
'$thieving', '$crafting', '$fletching', '$slayer', '$mining', '$smithing', '$fishing', '$cooking',
'$firemaking', '$woodcutting', '$farming', '$construction', '$hunter', '$summoning'];
for I:= 0 to high(TStrP) do
begin
if Pos( LowerCase(TStrP[I]), LowerCase(text)) > 0 then
begin
Result := TStrP[I];
Delete(TStrP[I], Pos('$', TStrP[I]), 1);
If Players[CurrentPlayer].Level[i+1] = 0 then Players[CurrentPlayer].Level[i+1] := GetSkillInfo(TStrP[I], False);
Result := Replace(Text, LowerCase(Result), IntToStr(Players[CurrentPlayer].Level[i+1]));
Exit;
end;
end;
end;
{*******************************************************************************
Function ChatIsNormal: Boolean;
By: N1ke!
Description: Checks if chat is normal, without QC open.
*******************************************************************************}
Function ChatIsNormal: Boolean;
var
x, y: Integer;
begin
Result := FindColorTolerance(x, y, 14474460, 5, 456, 192, 471, 4);
end;
{*******************************************************************************
Procedure CloseQC;
By: N1ke!
Description: Closes QC if it's open.
*******************************************************************************}
Procedure CloseQC;
begin
If ChatIsNormal then Exit;
MouseBox(8, 347, 20, 357, 1);
end;
{*******************************************************************************
Function ChatText(Text: TStringArray): Boolean;
By: N1ke!
Description: Tries to find a match between a trigger array and the last
typed message. If the message is from the current player it will exit.
*******************************************************************************}
Function ChatText(Text: TStringArray; var Sresult: String): Boolean;
var
I, II: integer;
S, Name : string;
begin
LastChatter(Name);
if (not (GetLastChatText(S))) then Exit;
II := High(Text);
for I := 0 to II do
begin
if Pos(LowerCase(Text[i]), LowerCase(S)) = 1 then
begin
SResult := Name + ': ' + Text[i];
Result := True;
Exit;
end;
end;
end;
{*******************************************************************************
Procedure DeleteIndex(Index : Integer; var Arr : TStringArray);
By: N1ke!
Description: Deletes a index in a TStringArray.
*******************************************************************************}
Procedure DeleteIndex(Index : Integer; var Arr : TStringArray);
var
i : integer;
Begin
for i:= index to High(Arr)do
begin
if i = High(Arr) then Break;
Arr[i] := Arr[i+1];
end;
SetArrayLength(Arr, High(Arr));
end;
{*******************************************************************************
procedure SetupSRLAutoResponder(ChanceResponse: Integer);
By: N1ke!
Description: Loads dictionary and sets up the responder.
*******************************************************************************}
procedure SetupAutoResponder(ChanceOfResponding: Integer; SaveQuestions: Boolean);
var
I, II, III : Integer;
Begin
SetDicArrays;
SetResponseChance(ChanceOfResponding);
SQAA := SaveQuestions;
For I := 0 to High(PlayerDic)do
For II := 1 to High(PlayerDic[i].Row) do
begin
For III := 0 to High(PlayerDic[i].Row[II].Trigger) do
PlayerDic[i].Row[II].Trigger[III] := ReadINI('Row' + IntToStr(II), 'Trigger' + IntToStr(III), AppPath + 'includes\SRL\Dictionary.ini');
For III := 0 to High(PlayerDic[i].Row[II].Response) do
PlayerDic[i].Row[II].Response[III] := ReadINI('Row' + IntToStr(II), 'Response' + IntToStr(III), AppPath + 'includes\SRL\Dictionary.ini');
end;
RenewAllTriggers;
UseAutoResponder := True;
MarkTime(PlayerDic[CurrentPlayer].Row[i].UsedResponse);
end;
{*******************************************************************************
Function Respond: Boolean;
By: N1ke!
Description: Responds to triggers which is set in the Dictionary.ini file.
Also add small mistakes and deletes the response after.
*******************************************************************************}
Function Respond: Boolean;
var
I, N: Integer;
Msg, GBCM: String;
Begin
If Not UseAutoResponder Then Exit;
GBCM := GetBlackChatMessage;
If (Pos(Lowercase(Players[CurrentPlayer].Name) , Lowercase(GBCM)) <> 0) then Exit;
If GBCM = 'Welcome to RuneScape.' then Exit;
For I :=0 to High(PlayerDic[CurrentPlayer].Row) do
begin
If Not ChatText(PlayerDic[CurrentPlayer].Row[i].Trigger, Msg)then Continue;
If TimeFromMark(PlayerDic[CurrentPlayer].Row[i].UsedResponse) < 1000*30+Random(60)then Exit;
If GetArrayLength(PlayerDic[CurrentPlayer].Row[i].Response) = 0 then Exit;
If ChanceResponding < Random(100) then Exit;
N := RandomRange(0, High(PlayerDic[CurrentPlayer].Row[i].Response));
PlayerDic[CurrentPlayer].Row[i].Response[N] := ReplaceResponseSign(PlayerDic[CurrentPlayer].Row[i].Response[N]);
case Random(4) of
0..2: TypeSend(PlayerDic[CurrentPlayer].Row[i].Response[N]);
3: TypeSend(AddMistakes(PlayerDic[CurrentPlayer].Row[i].Response[N], 10+Random(20)));
end;
Writeln(Msg);
Writeln(Players[CurrentPlayer].Name + ': ' + PlayerDic[CurrentPlayer].Row[i].Response[N]);
MarkTime(PlayerDic[CurrentPlayer].Row[i].UsedResponse)
Result := True;
If SQAA then
begin
AddToSRLLog('Trigger: ' + Msg + ' | Response: ' + Players[CurrentPlayer].Name + ': ' + PlayerDic[CurrentPlayer].Row[i].Response[N]);
SetArrayLength(ResponseArrays, ResponsesMade+1);
ResponseArrays[ResponsesMade] := TheTime + ' | Trigger: ' + Msg + ' | Response: ' + Players[CurrentPlayer].Name + ': ' + PlayerDic[CurrentPlayer].Row[i].Response[N];
end;
Inc(ResponsesMade);
DeleteIndex(N, PlayerDic[CurrentPlayer].Row[i].Response);
Exit;
end;
end;
Procedure SetupSRLAutoResponder; // To avoid errors.
begin
end;
Dictionary.ini
[General]
Type=Trigger-Response Dictionary
Version=1
Author=N1ke!
Rows=25
[Row1]
TriggerCount=7
Trigger0=hi
Trigger1=hello
Trigger2=wazzup
Trigger3=hai
Trigger4=hey
Trigger5=sup
Trigger6=how are you
ResponseCount=7
Response0=oh, hey
Response1=hi
Response2=hey
Response3='sup
Response4=hai
Response5=haloo
Response6=hello
[Row2]
TriggerCount=6
Trigger0=wc lvl
Trigger1=wc level
Trigger2=woodcutting lvl
Trigger3=woodcutting level
Trigger4=woodcuting lvl
Trigger5=woodcutting level
ResponseCount=5
Response0=$woodcutting
Response1=mine's $woodcutting
Response2=my woodcutting level is $woodcutting
Response3=I'm $woodcutting
Response4=I am $woodcutting
[Row3]
TriggerCount=2
Trigger0=mining lvl
Trigger1=mining level
ResponseCount=6
Response0=$mining
Response1=mine's $mining
Response2=my mining level is $mining
Response3=Im $mining
Response4=Im $mining mining
Response5=$mining
[Row4]
TriggerCount=4
Trigger0=fishing lvl
Trigger1=fishing level
Trigger2=fish level
Trigger3=fish lvl
ResponseCount=6
Response0=$fishing
Response1=mine's $fishing
Response2=my fishing level is $fishing
Response3=Im $fishing
Response4=Im $fishing fishing
Response5=$fishing
[Row5]
TriggerCount=4
Trigger0=rc lvl
Trigger1=rc level
Trigger2=runecrafting level
Trigger3=runecrafting lvl
ResponseCount=6
Response0=my rc level is $runecrafting
Response1=im $runecrafting
Response2=im $runecrafting runecrafting
Response3=$runecrafting
Response4=my runecrafting level is $runecrafting
Response5=im $runecrafting rc
[Row6]
TriggerCount=6
Trigger0=attack level
Trigger1=attack lvl
Trigger2=att level
Trigger3=att lvl
Trigger4=atack level
Trigger5=attak level
ResponseCount=7
Response0=My attack level is $attack
Response1=My att level is $attack
Response2=$attack
Response3=Im $attack attack
Response4=Im $attack att
Response5=$attack attack
Response6=$attack att
[Row7]
TriggerCount=4
Trigger0=strength level
Trigger1=strength lvl
Trigger2=str level
Trigger3=str lvl
ResponseCount=7
Response0=My strength level is $strength
Response1=My str level is $strength
Response2=$strength
Response3=Im $strength strength
Response4=Im $strength str
Response5=$strength strength
Response6=$strength str
[Row8]
TriggerCount=4
Trigger0=defence level
Trigger1=defence lvl
Trigger2=def level
Trigger3=def lvl
ResponseCount=7
Response0=My defence level is $defence
Response1=My def level is $defence
Response2=$defence
Response3=Im $defence defence
Response4=Im $defence def
Response5=$defence defence
Response6=$defence def
[Row9]
TriggerCount=6
Trigger0=range level
Trigger1=ranging lvl
Trigger2=ranging level
Trigger3=range lvl
ResponseCount=5
Response0=My range level is $range
Response1=My ranging level is $range
Response2=$range
Response3=Im $range range
Response4=$range range
Trigger4=ranged level
Trigger5=ranged lvl
[Row10]
TriggerCount=4
Trigger0=mage level
Trigger1=mage lvl
Trigger2=magic level
Trigger3=magic lvl
ResponseCount=6
Response0=My mage level is $magic
Response1=My magic level is $magic
Response2=Im $magic mage
Response3=Im $magic magic
Response4=$magic mage
Response5=$magic magic
[Row11]
TriggerCount=4
Trigger0=prayer level
Trigger1=prayer lvl
Trigger2=pray level
Trigger3=pray lvl
ResponseCount=8
Response0=My pray level is $prayer
Response1=My pray lvl is $prayer
Response2=My prayer level is $prayer
Response3=My prayer lvl is $prayer
Response4=Im $prayer pray
Response5=Im $prayer prayer
Response6=$prayer pray
Response7=$prayer prayer
[Row12]
TriggerCount=4
Trigger0=prayer level
Trigger1=prayer lvl
Trigger2=pray level
Trigger3=pray lvl
ResponseCount=8
Response0=My hp level is $hp
Response1=My hitpoints lvl is $hp
Response2=My hitpoints level is $hp
Response3=My hp lvl is $hp
Response4=Im $hp hp
Response5=Im $hp hitpoints
Response6=$hp hp
Response7=$hp hitpoints
[Row13]
TriggerCount=2
Trigger0=agility level
Trigger1=agility lvl
ResponseCount=4
Response0=$agility
Response1=Im $agility
Response2=Im $agility agility
Response3=my agility level is $agility
[Row14]
TriggerCount=2
Trigger0=herblore level
Trigger1=herblore lvl
ResponseCount=4
Response0=$herblore
Response1=Im $herblore
Response2=Im $herblore herblore
Response3=my herblore level is $herblore
[Row15]
TriggerCount=2
Trigger0=thieving level
Trigger1=thieving lvl
ResponseCount=4
Response0=$thieving
Response1=Im $thieving
Response2=Im $thieving thieving
Response3=my thieving level is $thieving
[Row16]
TriggerCount=4
Trigger0=crafting level
Trigger1=crafting lvl
Trigger2=craft level
Trigger3=craft lvl
ResponseCount=4
Response0=$crafting
Response1=Im $crafting
Response2=Im $crafting crafting
Response3=my crafting level is $crafting
[Row17]
TriggerCount=4
Trigger0=fletching level
Trigger1=fletching lvl
Trigger2=fletch level
Trigger3=fletch lvl
ResponseCount=4
Response0=$fletching
Response1=Im $fletching
Response2=Im $fletching fletching
Response3=my fletching level is $fletching
[Row18]
TriggerCount=4
Trigger0=slayer level
Trigger1=slay lvl
Trigger2=slay level
Trigger3=slayer lvl
ResponseCount=6
Response0=$slayer
Response1=Im $slayer
Response2=Im $slayer slayer
Response3=Im $slayer slay
Response4=my slayer level is $slayer
Response5=my slay level is $slayer
[Row19]
TriggerCount=2
Trigger0=smithing level
Trigger1=smithing lvl
ResponseCount=4
Response0=$smithing
Response1=Im $smithing
Response2=Im $smithing smithing
Response3=my smithing level is $smithing
[Row20]
TriggerCount=4
Trigger0=cooking level
Trigger1=scooking lvl
Trigger2=cook level
Trigger3=cook lvl
ResponseCount=4
Response0=$cooking
Response1=Im $cooking
Response2=Im $cooking cooking
Response3=my cooking level is $cooking
[Row21]
TriggerCount=4
Trigger0=firemaking level
Trigger1=fm lvl
Trigger2=fm level
Trigger3=firemaking lvl
ResponseCount=6
Response0=$firemaking
Response1=Im $firemaking
Response2=Im $firemaking firemaking
Response3=Im $firemaking fm
Response4=my firemaking level is $firemaking
Response5=my fm level is $firemaking
[Row22]
TriggerCount=2
Trigger0=construction level
Trigger1=construction lvl
ResponseCount=4
Response0=$construction
Response1=Im $construction
Response2=Im $construction construction
Response3=$construction construction
[Row23]
TriggerCount=4
Trigger0=hunter level
Trigger1=hunting lvl
Trigger2=hunting level
Trigger3=hunter lvl
ResponseCount=6
Response0=$hunter
Response1=Im $hunter
Response2=Im $hunter hunter
Response3=Im $hunter hunting
Response4=my hunter level is $hunter
Response5=my hunting level is $hunter
[Row24]
TriggerCount=2
Trigger0=summoning level
Trigger1=summoning lvl
ResponseCount=4
Response0=$summoning
Response1=Im $summoning
Response2=Im $summoning summoning
Response3=my summoning level is $summoning
[Row25]
TriggerCount=2
Trigger0=$name
Trigger1=$namesplit
ResponseCount=9
Response0=?
Response1=what
Response2=busy
Response3=hai
Response4=i don't want to chat
Response5=hallo
Response6=sup
Response7=hi
Response8=hey