Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 22.21 KB | None | 0 0
  1. #!/opt/xampp/perl/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use CGI;
  6. my $query=new CGI;
  7.  
  8. # Variables
  9. my $DebugMode = 0;
  10. my $SkillCount = 0;
  11. my @Skills = ();
  12. my $CharFile = "";
  13. my $CharCulti = 0;
  14. my $SkillDB = "./Variables/PWSkills.txt";
  15. my $CurrentFile = 0;
  16. my $SkillText = 0;
  17. #######################################################################
  18. print "Content-type: text/html\n\n";
  19. #######################################################################
  20. print "<b>";
  21. print "UberFoX's PW Char Skill Editor 1.0 (For PW 1.3.6)<br>";
  22. print "Coded by UberFoX (uberfox\@hotmail.com)<br>";
  23. print "</b>";
  24. print "<br>";
  25. #######################################################################
  26. sub trim($){# Perl trim function to remove whitespace from the start and end of the string
  27.     my $string = shift;
  28.     $string =~ s/^\s+//mg;
  29.     $string =~ s/\s+$//mg;
  30.     return $string;
  31. }
  32. #######################################################################
  33. sub SaveChar {
  34.     # Build the new skill string
  35.     my $NewSkillList = BuildSkills($SkillText);
  36.     # Save new skill list to XML
  37.     SaveSkills($NewSkillList);
  38.     # Save modified char
  39.     open (DATABASE, ">$CurrentFile");
  40.     print DATABASE "$CharFile\n";
  41.     close (DATABASE);
  42. }
  43. sub Main {
  44.     if($query->param("CharXML")){
  45.         my $CharXML = $query->param("CharXML");
  46.         my $CharName = "";
  47.         my $CharCulti = "";
  48.         my $Output = "";
  49.         if($CharXML =~ /<variable name="name" type="Octets">(.*)</im){
  50.             $CharName = $1;
  51.         }else{
  52.             $Output .= "Invalid char file!<br>";
  53.             return 0;
  54.         }
  55.         # Lets find a file to create
  56.         my $ID = 0;
  57.         while( -e "./Variables/Chars/$ID.txt"){
  58.             $ID++;
  59.         }
  60.         $CurrentFile = "./Variables/Chars/$ID.txt";
  61.         open (DBASE, ">$CurrentFile");
  62.         print DBASE $CharXML;
  63.         close (DBASE);
  64.         $Output .= "Loaded Char Name Is: \"$CharName\"<br>";
  65.         LoadCharFile($CurrentFile);
  66.         $CharCulti = GetCharStat("level2");
  67.         $SkillText = LoadCharSkills();
  68.         LoadSkills($SkillText); # Load the skills!
  69.         $Output .= "Cultivation Level: $CharCulti<br>"; # Display culti
  70.         $Output .= ListSkillsActual(); # List all skills
  71.         open (DBASE, "./Variables/Console.txt");
  72.         my $Data = join('', <DBASE>);
  73.         $Output =~ s/<br>/\n/gi;
  74.         $Data =~ s/#Output/$Output/;
  75.         $Data =~ s/#CharID/$ID/;
  76.         print $Data;
  77.         close (DBASE);
  78.     }elsif($query->param("Command")){
  79.         my $Output = "";
  80.         my $CharName;
  81.         my $Command = $query->param("Command");
  82.         my $ID = $query->param("CharID");
  83.         $CurrentFile = "./Variables/Chars/$ID.txt";
  84.         if( -e "$CurrentFile"){
  85.         }else{
  86.             print "Char file not found!";
  87.             return 0;
  88.         }
  89.         open (DBASE, "$CurrentFile");
  90.         my $CharXML = join('', <DBASE>);
  91.         close (DBASE);
  92.         if($CharXML =~ /<variable name="name" type="Octets">(.*)</im){
  93.             $CharName = $1;
  94.         }else{
  95.             print "Invalid char file!<br>";
  96.             return 0;
  97.         }
  98.         $Output .= "Loaded Char Name Is: \"$CharName\"<br><br>";
  99.         LoadCharFile($CurrentFile);
  100.         $SkillText = LoadCharSkills();
  101.         LoadSkills($SkillText); # Load the skills!
  102.         $Command = trim($Command);
  103.         if($Command =~ /^help$/sim){
  104.             $Output .= "skills // Show list of all skills on charactor\n";
  105.             $Output .= "repu // Show current repu on charactor\n";
  106.             $Output .= "repu [Number] // Set charactor repu to this value (300,000 for Rank9)\n";
  107.             $Output .= "culti // Show current culti on charactor\n";
  108.             $Output .= "culti [Number] // Set charactor culti to this value (22 is max Light, 33 is max Dark)\n";
  109.             $Output .= "skill a [Number] [Number] nameofskill // Add skill with level and extra level to charactor (Uses Regex)\n";
  110.             $Output .= "craft // Add all craft skills (Level 10)\n";
  111.             $Output .= "listadd // List all possible skills to add (just copy + paste the line into command box)\n";
  112.             $Output .= "listdel // List all possible skills to delete (just copy + paste the line into command box)\n";
  113.             $Output .= "xml // Display current XML of char\n";
  114.             $Output .= "\n";
  115.             $Output .= "Edit the char how you wish then use xml command to get finished char back\n";
  116.         }elsif($Command =~ /^culti$/sim){ # Show cultivation level
  117.             $Output .= "Cultivation Level: $CharCulti\n";
  118.         }elsif($Command =~ /^culti\s{1,}(\d{1,})$/sim){ # Set cultivation level
  119.             my $sCutli = trim($1);
  120.             SetCharStat("level2", $sCutli);
  121.             $CharCulti = GetCharStat("level2");
  122.             $Output .= "Cultivation level changed to: $CharCulti\n";
  123.             SaveChar();
  124.         }elsif($Command =~ /^repu$/sim){ # Show reputation level
  125.             my $CharRepu = GetCharStat("reputation");
  126.             $Output .= "Reputation level: $CharRepu\n";
  127.         }elsif($Command =~ /^repu\s{1,}(\d{1,})$/sim){ # Set reputation level
  128.             my $sRepu = trim($1);
  129.             SetCharStat("reputation", $sRepu);
  130.             my $CharRepu = GetCharStat("reputation");
  131.             $Output .= "Reputation level changed to: $CharRepu\n";
  132.             SaveChar();
  133.         }elsif($Command =~ /^skills$/sim){
  134.             $Output .= ListSkillsActual(); # List all skills
  135.         }elsif($Command =~ /^skill\s{1,}a\s{1,}(\d{1,})\s{1,}(\d{1,})\s{1,}(.*)$/sim){ # Add a skill
  136.             my $sSkillLevel = trim($1);
  137.             my $sSkillExtraLevel = trim($2);
  138.             my $sSkillName = trim($3);
  139.             $Output .= AddSkillRX($sSkillName, $sSkillExtraLevel, $sSkillLevel);
  140.             SaveChar();
  141.         }elsif($Command =~ /^skill\s{1,}d\s{1,}(.*)$/sim){ # Del a skill
  142.             my $sSkillName = trim($1);
  143.             $Output .= DelSkillRX($sSkillName);
  144.             SaveChar();
  145.         }elsif($Command =~ /^craft$/sim){
  146.             DelSkill("9E000000"); # Blacksmith
  147.             DelSkill("9F000000"); # Tailor
  148.             DelSkill("A1000000"); # Pharmasist
  149.             DelSkill("A0000000"); # Accessories
  150.             AddSkill("9E000000", 200, 10); # Blacksmith
  151.             AddSkill("9F000000", 200, 10); # Tailor
  152.             AddSkill("A1000000", 200, 10); # Pharmasist
  153.             AddSkill("A0000000", 200, 10); # Accessories
  154.             $Output .= "Done adding all craft skills\n";
  155.             SaveChar();
  156.         }elsif($Command =~ /^listadd$/sim){
  157.             open (DBASE, "$SkillDB");
  158.             my @DBASE=<DBASE>;
  159.             my $Count = 0;
  160.             foreach $_ (@DBASE) {
  161.                 my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  162.                 my $Level = 10;
  163.                 if($sName =~ /Holy\-|Dark\-/i)
  164.                 {
  165.                     $Level = 1;
  166.                 }
  167.                 $sName = EscapeRex($sName);
  168.                 $Output .= "skill a $Level 0 ^$sName\$<br>" if $Count;
  169.                 $Count++;
  170.             }
  171.             close (DBASE);
  172.         }elsif($Command =~ /^listdel$/sim){
  173.             foreach $_ (@Skills){
  174.                 my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  175.                 my $sSkillIDX = RemoveSpaces(DecToPoke($sSkillID, "DWORD"));
  176.                 my $sExtraCountX = RemoveSpaces(DecToPoke($sExtraCount, "DWORD"));
  177.                 my $sCounterX = RemoveSpaces(DecToPoke($sCounter, "DWORD"));
  178.                 my $CurSkill .= "$sSkillIDX$sExtraCountX$sCounterX";
  179.                 my ($SkillInfo, $SkillAll, $SkillID, $Counter, $ExtraCount) = GetSkillInfo($CurSkill);
  180.                 my $SkillName = GetSkillNameFromID($SkillID);
  181.                 $SkillName = EscapeRex($SkillName);
  182.                 $Output .= "skill d ^$SkillName\$<br>";
  183.                
  184.             }
  185.         }elsif($Command =~ /^xml$/sim){
  186.             $Output = $CharXML;
  187.         }else{
  188.             $Output .= "Invalid command!<br>";
  189.         }
  190.         # Print output
  191.         open (DBASE, "./Variables/Console.txt");
  192.         my $Data = join('', <DBASE>);
  193.         $Output =~ s/<br>/\n/gi;
  194.         $Data =~ s/#Output/$Output/;
  195.         $Data =~ s/#CharID/$ID/;
  196.         print $Data;
  197.         close (DBASE);
  198.     }else{
  199.         open (DBASE, "./Variables/InputCharForm.txt");
  200.         my $Data = join('', <DBASE>);
  201.         print $Data;
  202.         close (DBASE);
  203.     }
  204. }
  205. #######################################################################
  206. sub EscapeRex {
  207.     my $Text  = $_[0];
  208.     $Text =~ s/(\+|\*|\-|\?|\!|\[|\]|\{|\})/\\$1/g;
  209.     return $Text;
  210. }
  211. #######################################################################
  212. sub DecToPoke {
  213.     my $Myvalue  = $_[0];
  214.     my $ForceType  = $_[1];
  215.    
  216.     my $MyvalueSize = "";
  217.     if ($ForceType eq "NONE") {
  218.         $MyvalueSize = "BYTE";
  219.         if ($Myvalue <= 255) {
  220.             $MyvalueSize = "BYTE";
  221.         }
  222.         elsif ($Myvalue <= 65535) {
  223.             $MyvalueSize = "WORD";
  224.         }
  225.         elsif ($Myvalue >= 65536) {
  226.             $MyvalueSize = "DWORD";
  227.         }
  228.         else {
  229.         }
  230.     }else {
  231.         $MyvalueSize = $ForceType;
  232.     }
  233.    
  234.     if ($MyvalueSize eq "BYTE") {
  235.         $Myvalue = unpack("H*",pack("C*", $Myvalue));
  236.     }
  237.     elsif ($MyvalueSize eq "WORD") {
  238.         $Myvalue = unpack("H*",pack("S*", $Myvalue));
  239.     }
  240.     elsif ($MyvalueSize eq "DWORD") {
  241.         $Myvalue = unpack("H*",pack("N*", $Myvalue));
  242.     }
  243.     else {
  244.     }  
  245.     $Myvalue = RevHex($Myvalue,0);
  246.     $Myvalue =~ tr/a-z/A-Z/;
  247.  
  248.     return $Myvalue;
  249. }
  250. #######################################################################
  251. sub RemoveSpaces {
  252.     my $Input = $_[0];
  253.     $Input =~ s/\s//g;
  254.     return $Input;
  255. }
  256. #######################################################################
  257. sub SetCharStat {
  258.     my ($sStat, $sStatLevel) = @_;
  259.     $CharFile =~ s/(<variable name="$sStat" type="int">)\d{1,}/$1$sStatLevel/i;
  260.     return 1;
  261. }
  262. #######################################################################
  263. sub GetCharStat {
  264.     my ($sStat) = @_;
  265.     if($CharFile =~ /<variable name="$sStat" type="int">(\d{1,})/){
  266.         my $StatLevel = $1;
  267.         return $StatLevel;
  268.     }
  269.     return 0;
  270. }
  271. #######################################################################
  272. sub CheckSkillLevel {
  273.     my $SkillID = $_[0];
  274.     my $SkillIDDec = RevHex($SkillID, 1);
  275.     $SkillIDDec = hex($SkillIDDec);
  276.     foreach $_ (@Skills) {
  277.         my ($sID, $sCount, $sExtra)=split(/\|/);
  278.         if($sID eq $SkillIDDec){
  279.             return $sCount;
  280.         }
  281.     }
  282.     return 0;
  283. }
  284. #######################################################################
  285. sub CheckSkillPrevExists {
  286.     my $SkillID = $_[0];
  287.     my $SkillIDCOde =  RemoveSpaces(DecToPoke($SkillID, "DWORD"));
  288.     $SkillIDCOde =~ tr/a-z/A-Z/;
  289.     open (DBASE, "$SkillDB");
  290.     my @DBASE=<DBASE>;
  291.     foreach $_ (@DBASE) {
  292.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  293.         $sID =~ tr/a-z/A-Z/;
  294.         if($SkillIDCOde eq $sID){
  295.             if($sIDSpell eq "0"){
  296.                 print "Sorry, This book is not yet added\n";
  297.                 return 0;
  298.             }else{
  299.                 my $sSkillLevel = CheckSkillLevel($sIDSpell);
  300.                 #if($sSkillLevel == 10){
  301.                 if($sSkillLevel >= 1){ # DEBUG! We allow it if the skill is 1 or higher! USE AT OWN RISK!
  302.                     print "Pre-Requirement skill is lvl 10\n";
  303.                     return 1;
  304.                 }else{
  305.                     print "Pre-Requirement skill is not yet lvl 10 (Currently: $sSkillLevel)\n";
  306.                     return 0;
  307.                 }
  308.             }
  309.         }
  310.     }
  311.     close (DBASE);
  312.     return 0;
  313. }
  314. #######################################################################
  315. sub GetSkillNameFromID {
  316.     my $SkillID = $_[0];
  317.     my $SkillIDCOde =  RemoveSpaces(DecToPoke($SkillID, "DWORD"));
  318.     $SkillIDCOde =~ tr/a-z/A-Z/;
  319.     open (DBASE, "$SkillDB");
  320.     my @DBASE=<DBASE>;
  321.     foreach $_ (@DBASE) {
  322.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  323.         $sID =~ tr/a-z/A-Z/;
  324.         if($SkillIDCOde eq $sID){
  325.             return $sName;
  326.         }
  327.     }
  328.     close (DBASE);
  329.     return "";
  330. }
  331. #######################################################################
  332. sub GetIDOfSkillFromName {
  333.     my $SkillName = $_[0];
  334.     open (DBASE, "$SkillDB");
  335.     my @DBASE=<DBASE>;
  336.     foreach $_ (@DBASE) {
  337.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  338.         if($SkillName =~ /^$sName$/i){
  339.             my $NewID = RevHex($sID, 1);
  340.             $NewID = hex($NewID);
  341.             return "$NewID";
  342.         }
  343.     }
  344.     close (DBASE);
  345.     return 0;
  346. }
  347. #######################################################################
  348. sub CheckSkillDuplicate {
  349.     my $SkillID = $_[0];
  350.     my $SkillName = GetSkillNameFromID($SkillID);
  351.     my $SkillNameOpposit = $SkillName;
  352.     if($SkillNameOpposit =~ /Dark/i){
  353.         $SkillNameOpposit =~ s/Dark/Holy/;
  354.     }elsif($SkillNameOpposit =~ /Holy/i){
  355.         $SkillNameOpposit =~ s/Holy/Dark/;
  356.     }
  357.     my $OppositSkillID = GetIDOfSkillFromName($SkillNameOpposit);
  358.     my $OppositStatus = CheckSkillExists($OppositSkillID);
  359.     if($OppositStatus){
  360.         return $OppositStatus;
  361.     }
  362.     return 0;
  363. }
  364. #######################################################################
  365. sub DelSkill {
  366.     my ($SkillID) = @_;
  367.     $SkillID = RevHex($SkillID, 1);
  368.     $SkillID = hex($SkillID);
  369.     my $SkillExists = 0;
  370.     my @NewArray = ();
  371.     foreach $_ (@Skills){
  372.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  373.         unless($sSkillID eq $SkillID){
  374.             push(@NewArray, $_);
  375.         }else{
  376.             print "Skill deleted\n";
  377.             $SkillCount--;
  378.         }
  379.     }
  380.     @Skills = @NewArray;
  381.     return 0;
  382. }
  383. #######################################################################
  384. sub DelSkillRX {
  385.     my ($SkillRX) = @_;
  386.     my $SkillID = 0;
  387.     my $sSkillName = "";
  388.     foreach $_ (@Skills){
  389.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  390.         my $sName = GetSkillNameFromID($sSkillID);
  391.         if($sName =~ /$SkillRX/i){
  392.             $sSkillName = $sName;
  393.             $SkillID = $sSkillID;
  394.         }
  395.     }
  396.     my $SkillExists = 0;
  397.     my @NewArray = ();
  398.     my $Found = 0;
  399.     foreach $_ (@Skills){
  400.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  401.         unless($sSkillID eq $SkillID){
  402.             push(@NewArray, $_);
  403.         }else{
  404.             $Found = 1;
  405.             $SkillCount--;
  406.         }
  407.     }
  408.     @Skills = @NewArray;
  409.     if($Found){
  410.         return "Skill deleted";
  411.     }else{
  412.         return "Skill not found";
  413.     }
  414. }
  415. #######################################################################
  416. sub AddSkill {
  417.     my ($SkillID, $ExtraCount, $SCounter) = @_;
  418.     $SkillID = RevHex($SkillID, 1);
  419.     $SkillID = hex($SkillID);
  420.     my $NewSkill .= "$SkillID|$SCounter|$ExtraCount";
  421.     # Check if skill is already added....
  422.     my $SkillExists = 0;
  423.     foreach $_ (@Skills){
  424.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  425.         if($sSkillID eq $SkillID){
  426.             $SkillExists = 1;
  427.         }
  428.     }
  429.     unless($SkillExists){ # Skill doesnt exist
  430.         print "Skill Added\n";
  431.         push(@Skills, "$NewSkill");
  432.         $SkillCount++;
  433.         return 1;
  434.     }else{ # Skill does exist
  435.         print "Skill Cannot Be Added -- Already Exists!\n";
  436.         return 0;
  437.     }
  438. }
  439. #######################################################################
  440. sub AddSkillRX {
  441.     my ($SkillRX, $ExtraCount, $SCounter) = @_;
  442.     my $SkillID = 0;
  443.     my $sSkillName = "";
  444.     open (DBASE, "$SkillDB");
  445.     my @DBASE=<DBASE>;
  446.     foreach $_ (@DBASE) {
  447.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  448.         if($sName =~ /$SkillRX/i){
  449.             $sSkillName = $sName;
  450.             $SkillID = $sID;
  451.         }
  452.     }
  453.     close (DBASE);
  454.     unless($SkillID){
  455.         return "Skill cannot be added since it does not exist in DB!\n";
  456.     }
  457.     $SkillID = RevHex($SkillID, 1);
  458.     $SkillID = hex($SkillID);
  459.     my $NewSkill .= "$SkillID|$SCounter|$ExtraCount";
  460.     # Check if skill is already added....
  461.     my $SkillExists = 0;
  462.     foreach $_ (@Skills){
  463.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  464.         if($sSkillID eq $SkillID){
  465.             $SkillExists = 1;
  466.         }
  467.     }
  468.     unless($SkillExists){ # Skill doesnt exist
  469.         push(@Skills, "$NewSkill");
  470.         $SkillCount++;
  471.         return "Skill ($sSkillName) Added\n";
  472.     }else{ # Skill does exist
  473.         return "Skill Cannot Be Added -- Already Exists!\n";
  474.     }
  475. }
  476. #######################################################################
  477. sub CheckSkillCulti {
  478.     my $SkillID = $_[0];
  479.     my $SkillName = GetSkillNameFromID($SkillID);
  480.     if($SkillName =~ /Dark/i){
  481.         if($CharCulti == 31 or $CharCulti == 32){ # LVL 2 Dark Fairy
  482.             return 1, 31;
  483.         }else{
  484.             return 0, 31;
  485.         }
  486.     }elsif($SkillName =~ /Holy/i){
  487.         if($CharCulti == 21 or $CharCulti == 22){ # LVL 2 Holy Fairy
  488.             return 1, 21;
  489.         }else{
  490.             return 0, 21;
  491.         }
  492.     }
  493.     return 0, 0;
  494. }
  495. #######################################################################
  496. sub AddBookSkill {
  497.     my ($SkillID, $ExtraCount, $SCounter) = @_;
  498.     my $NewSkill .= "$SkillID|$SCounter|$ExtraCount";
  499.     # Check skill is not already added
  500.     my $DupeExists = CheckSkillDuplicate($SkillID);
  501.     if($DupeExists == 1){
  502.         print "You can't use both dark/holy skill at same time\n";
  503.         return 0;
  504.     }
  505.     # Check Skill exists and pre-requirements exist
  506.     my $Exists = CheckSkillExists($SkillID);
  507.     if($Exists == 0){
  508.         my $PrevExist = CheckSkillPrevExists($SkillID);
  509.         if($PrevExist == 1){
  510.             # Check cultivation for this book (This is the LAST thing you check)
  511.             my ($CultiCheck, $CultiNeeded) = CheckSkillCulti($SkillID);
  512.             if($CultiCheck == 0){
  513.                 print "Can't use this book with your cultivation level '$CharCulti' you need '$CultiNeeded'\n";
  514.                 return 0;
  515.             }
  516.             print "Skill Added\n";
  517.             push(@Skills, "$NewSkill");
  518.             $SkillCount++;
  519.             return 1;
  520.         }else{
  521.             print "You don't have the pre-requirements for this skill\n";
  522.             return 0;
  523.         }
  524.     }else{
  525.         print "You already have this skill\n";
  526.         return 0;
  527.     }
  528. }
  529. #######################################################################
  530. sub CheckSkillExists {
  531.     my $SkillID = $_[0];
  532.     foreach $_ (@Skills) {
  533.         my ($sID, $sCount, $sExtra)=split(/\|/);
  534.         if($sID eq $SkillID){
  535.             return 1;
  536.         }
  537.     }
  538.     return 0;
  539. }
  540. #######################################################################
  541. sub DoSkillBooks {
  542.     my $SkillText = $_[0];
  543.     open (DBASE, "$SkillDB");
  544.     my @DBASE=<DBASE>;
  545.     foreach $_ (@DBASE) {
  546.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  547.         # Check scroll exists
  548.         if($sIDScroll){
  549.             if($sIDScroll =~ /\d{1,}/){
  550.                 if($CharFile =~ /<items><variable name="id" type="int">$sIDScroll.*?<\/items>/sim){
  551.                     print "### SKILL BOOK BELOW ###\n";
  552.                     #print "Found skill book: $sName ($sIDScroll) (SkillID: $sID)\n";
  553.                     print "Found skill book: $sName\n";
  554.                     # Add the skill to char
  555.                     $sID = RevHex($sID, 1);
  556.                     $sID = hex($sID);
  557.                     my $DoStatus = AddBookSkill("$sID", "0", "1");
  558.                     if($DoStatus == 1){ # Then its valid!
  559.                         # Delete the skill book
  560.                         $CharFile =~ s/<items><variable name="id" type="int">$sIDScroll.*?<\/items>//sim;
  561.                     }
  562.                     print "### SKILL BOOK ABOVE ###\n";
  563.                 }
  564.             }
  565.         }
  566.     }
  567.     close (DBASE);
  568.     return "N/A";
  569. }
  570. #######################################################################
  571. sub SaveSkills {
  572.     my $SkillList = $_[0];
  573.     if($CharFile =~ s/<variable name="skills" type="Octets">(.*?)<\/variable>/<variable name="skills" type="Octets">$SkillList<\/variable>/ism){
  574.         return 1;
  575.     }else{
  576.         return 0;
  577.     }
  578. }
  579. #######################################################################
  580. sub LoadCharSkills {
  581.     my $SkillList;
  582.     if($CharFile =~ /<variable name="skills" type="Octets">(.*?)<\/variable>/ism){
  583.         $SkillList = $1;
  584.     }
  585.     return $SkillList;
  586. }
  587. #######################################################################
  588. sub LoadCharFile {
  589.     my $CharName = $_[0];
  590.     # Clear old char file
  591.     open(LOGIN,"$CharName");
  592.     my @raw_data=<LOGIN>;
  593.     close(LOGIN);
  594.     my $CharFileX = join('', @raw_data);
  595.     $CharFile = $CharFileX;
  596. }
  597. #######################################################################
  598. sub BuildSkills {
  599.     my $SkillText = $_[0];
  600.     my $NewSkillList = "";
  601.     my $TempSkillCount = $SkillCount;
  602.     $TempSkillCount = RemoveSpaces(DecToPoke($TempSkillCount, "DWORD"));
  603.     $NewSkillList .= "$TempSkillCount";
  604.     foreach $_ (@Skills){
  605.         my ($SkillID, $SCounter, $ExtraCount)=split(/\|/);
  606.         $SkillID = RemoveSpaces(DecToPoke($SkillID, "DWORD"));
  607.         $ExtraCount = RemoveSpaces(DecToPoke($ExtraCount, "DWORD"));
  608.         $SCounter = RemoveSpaces(DecToPoke($SCounter, "DWORD"));
  609.         $NewSkillList .= "$SkillID$ExtraCount$SCounter";
  610.     }
  611.     # PW uses noncaps so lets fix it
  612.     $NewSkillList =~ tr/A-Z/a-z/;
  613.     return $NewSkillList;
  614. }
  615. #######################################################################
  616. sub LoadSkills {
  617.     my $SkillText = $_[0];
  618.     # Clear Buffs First
  619.     $SkillCount = 0;
  620.     @Skills = ();
  621.     # Begin
  622.     my $SearchLen = length($SkillText);
  623.     $SearchLen -= 8;
  624.     $SearchLen /= 24;
  625.     $SkillCount = $SearchLen;
  626.     my $POS = 0;
  627.     # Get Skill Count
  628.     my $Counter = substr($SkillText, $POS, 8);
  629.     # Get all skills
  630.     $POS = 8;
  631.     for(my $count = 0; $count <= $SearchLen; $count++) {
  632.         my $CurSkill = substr($SkillText, $POS, 24);
  633.         if(length($CurSkill) >= 24){
  634.             my ($SkillInfo, $SkillAll, $SkillID, $SCounter, $ExtraCount) = GetSkillInfo($CurSkill);
  635.             push(@Skills, $SkillAll);
  636.             #print "$CurSkill | $SkillInfo\n";
  637.             $POS += 24;
  638.         }
  639.     }
  640. }
  641. #######################################################################
  642. sub RevHex {
  643.     my $StrToDo  = $_[0];
  644.     my $IgnoreSpace  = $_[1];
  645.     my $count = 0;
  646.     my $RemadeStr = "";
  647.     while ($count <= length($StrToDo)/2+2) {
  648.         my $StrToDoTmp = substr($StrToDo, $count, 2);
  649.         if($IgnoreSpace eq 1){
  650.             $RemadeStr = "$StrToDoTmp$RemadeStr";
  651.         }else{
  652.             $RemadeStr = "$StrToDoTmp $RemadeStr";
  653.         }
  654.         $count = $count+2;
  655.     }
  656.     $RemadeStr = trim($RemadeStr);
  657.     return $RemadeStr;
  658. }
  659. #######################################################################
  660. sub GetSkillInfo {
  661.     my $SkillText = $_[0];
  662.     my $SkillID = substr($SkillText, 0, 8);
  663.     my $Counter = substr($SkillText, 16, 8);
  664.     my $ExtraCount = substr($SkillText, 8, 8);
  665.     my $SkillName = GetSkillName($SkillID);
  666.     $SkillID = RevHex($SkillID, 1);
  667.     $SkillID = hex($SkillID);
  668.     $Counter = RevHex($Counter, 1);
  669.     $Counter = hex($Counter);
  670.     $ExtraCount = RevHex($ExtraCount, 1);
  671.     $ExtraCount = hex($ExtraCount);
  672.     my $SkillInfo = "$SkillName | Value: $Counter | Extra: $ExtraCount";
  673.     my $SkillAll = "$SkillID|$Counter|$ExtraCount";
  674.     return $SkillInfo, $SkillAll, $SkillID, $Counter, $ExtraCount;
  675. }
  676. #######################################################################
  677. sub GetSkillName {
  678.     my $SkillText = $_[0];
  679.     open (DBASE, "$SkillDB");
  680.     my @DBASE=<DBASE>;
  681.     foreach $_ (@DBASE) {
  682.         my ($sID, $sIDSpell, $sIDScroll, $sName, $sBlank)=split(/\|/);
  683.         if($sID =~ /^$SkillText/i){
  684.             return $sName;
  685.         }
  686.     }
  687.     close (DBASE);
  688.     return "N/A";
  689. }
  690. #######################################################################
  691. sub ListSkillsActual {
  692.     my $SkillExists = 0;
  693.     my $Count = 0;
  694.     my $Ret = "";
  695.     foreach $_ (@Skills){
  696.         my ($sSkillID, $sCounter, $sExtraCount) = split(/\|/);
  697.         my $sSkillIDX = RemoveSpaces(DecToPoke($sSkillID, "DWORD"));
  698.         my $sExtraCountX = RemoveSpaces(DecToPoke($sExtraCount, "DWORD"));
  699.         my $sCounterX = RemoveSpaces(DecToPoke($sCounter, "DWORD"));
  700.         my $CurSkill .= "$sSkillIDX$sExtraCountX$sCounterX";
  701.         my ($SkillInfo, $SkillAll, $SkillID, $Counter, $ExtraCount) = GetSkillInfo($CurSkill);
  702.         if($DebugMode){
  703.             $Ret .= "$CurSkill | $SkillInfo<br>";
  704.         }else{
  705.             $Ret .= "Found Skill: $SkillInfo<br>";
  706.         }
  707.     }
  708.     return $Ret;
  709. }
  710. #######################################################################
  711. sub ListSkills {
  712.     my $SkillText = $_[0];
  713.     my $SearchLen = length($SkillText);
  714.     $SearchLen -= 8;
  715.     $SearchLen /= 24;
  716.     my $POS = 0;
  717.     # Get Skill Count
  718.     my $Counter = substr($SkillText, $POS, 8);
  719.     if($DebugMode){
  720.         print "$Counter | (Found '$SearchLen' skills)\n";
  721.     }else{
  722.         print "Found '$SearchLen' skills\n";
  723.     }
  724.     # Get all skills
  725.     $POS = 8;
  726.     for(my $count = 0; $count <= $SearchLen; $count++) {
  727.         my $CurSkill = substr($SkillText, $POS, 24);
  728.         if(length($CurSkill) >= 24){
  729.             my ($SkillInfo, $SkillAll, $SkillID, $SCounter, $ExtraCount) = GetSkillInfo($CurSkill);
  730.             if($DebugMode){
  731.                 print "$CurSkill | $SkillInfo\n";
  732.             }else{
  733.                 print "Found Skill: $SkillInfo\n";
  734.             }
  735.             $POS += 24;
  736.         }
  737.     }
  738. }
  739. #######################################################################
  740. Main();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement