Go Back   EQEmulator Home > EQEmulator Forums > Archives > Archive::Development > Archive::Quests

Archive::Quests Archive area for Quests's posts that were moved here after an inactivity period of 90 days.

Reply
 
Thread Tools Display Modes
  #1  
Old 09-06-2004, 07:05 AM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default Buffing PERL Script (Formatting)

Hey all, it's me again =D. I wondered if anyone could help me with some formatting on a buffing NPC I am working on. See, if it doesn't work, I will end up redoing around 4000-5000 lines of code, so, I dont really want to continue with it until I know it works, hehe. I already did the first 5000 lines of code for categories and pricing and stuff, this is the part where u give him money.

Code:
sub EVENT_ITEM
{
{	
	if($ulevel < 10)
	{
		if($platinum == "100")
		{
			if($copper == "1")
			{
				quest::castspell($userid,1200);

				quest::say("Good luck on your journies $name .");
			}
		}
	}
	elsif($ulevel > 9)
	{
		if($ulevel < 20)
		{
			if($platinum == "200")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 19)
	{
		if($ulevel < 30)
		{
			if($platinum == "300")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 29)
	{
		if($ulevel < 40)
		{
			if($platinum == "400")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 39)
	{
		if($ulevel < 50)
		{
			if($platinum == "500")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 49)
	{
		if($ulevel < 60)
		{
			if($platinum == "600")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 59)
	{
		if($ulevel < 70)
		{
			if($platinum == "700")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 69)
	{
		if($ulevel < 80)
		{
			if($platinum == "800")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 79)
	{
		if($ulevel < 90)
		{
			if($platinum == "900")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
	elsif($ulevel > 89)
	{
		if($ulevel < 100)
		{
			if($platinum == "1000")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
}
}
as you can see, you pay more for buffs as you gain levesl, so, I just wanted to know if this format would work, that way if it wont, I only have to redo about 90 lines instead of 4000-5000 lines =D. If you want to look at the entire code file, send me an email at
xteam_leader@yahoo.com it is probably about 100 kb now and is in a notepad, lol. Soooo much code, been working for hours on it so far.
Reply With Quote
  #2  
Old 09-06-2004, 08:06 AM
smogo
Discordant
 
Join Date: Jan 2004
Location: 47
Posts: 339
Default

Hmm, all these nested if / elsif / else ... not too easy to work on.

Why not try a different scheme : store values for your quest in an array, and test them. Much easier to read and modify imho :
Code:

sub EVENT_ITEM{
my @data=(
	{ "minlevel" => 1,
	"maxlevel" =>9,
	"plat" => 100,
	"copper" => 1,
	"spellid" => 1200,
	"saying" => "Good luck on your journey, $name"
	},
	{ "minlevel" => 10,
	"maxlevel" =>19,
	"plat" => 200,
	"copper" => 1,
	"spellid" => 1200,
	"saying" => "Good luck on your journey, $name"
	},
	{ "minlevel" => 20,
	"maxlevel" => 30,
	"plat" => 300,
	"copper" => 1,
	"spellid" => 1200,
	"saying" => "Good luck on your journey, $name"
	}
);

	foreach $entry (@data){
		if($ulevel >= $entry->{'minlevel'}
			&& $ulevel <= $entry->{'maxlevel'}
			&& $copper == $entry->{'copper'}
			&& $platinum == $entry->{'plat'}
		){
			quest::castspell($userid, $entry->{'spellid'});
			quest::say($entry->{'saying'});
			last;
		}
	}

}

#the following is for testing only, remove or comment out if you want to include this in a real quest
sub wannatry{
	$userid=1234;
	$name="MyCharName";
	$platinum=100; $copper=1;
	$ulevel=7;

	EVENT_ITEM();
}

package quest;
sub say{
	print shift, "\n";
}

sub castspell{
	print "NPC now casting spell ", shift, "\n";
}

package main;
wannatry();
i ddn't test it fully, but should work for a start. i hope this helps.
__________________
EQEMu Quest Repository is down until something new :(
Reply With Quote
  #3  
Old 09-06-2004, 08:18 AM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

hehe, well, I already wrote about 200 lines with nesting =\ and not quite sure if I want to redo all of it, hehe, just wanted to know if it was possible that it would work =D. Ty though for the help. And you are right, it is very hard programming in the way I set it up, lol, very very very hard. I am counting it by patterns now, only way I recognize syntax and stuffs, lol

{
{
{
elsif
}
}
}
like that, if it doesn't look like that, or whatever pattern I am on, hehe, then I didn't do it yet, lol. It looks more like 2 horns, here:

Code:
elsif($ulevel > 89)
	{
		if($ulevel < 100)
		{
			if($platinum == "1000")
			{
				if($copper == "1")
				{
					quest::castspell($userid,1200);

					quest::say("Good luck on your journies $name .");
				}
			}
			elsif($platinum == "1100")
			{
				if($copper == "2")
				{
					quest::castspell($userid,1201);

					quest::say("Good luck on your journies $name .");
				}
			}
		}
	}
ya, like that, and the pattern changes and gets longer every time I add on, at one point though, I wont be able to use the patterns becuz it will be too long, and I have 54 things, up there are only 2. Well, I am going to continue on then with pattersn, and then at one point, just searching through the stuff to see if I put the write values in, hehe.
Reply With Quote
  #4  
Old 09-06-2004, 08:39 AM
Cisyouc
Demi-God
 
Join Date: Jun 2004
Location: Heaven.
Posts: 1,260
Default

try selfcast(spellid);, ive never gotten cast() to work.
__________________
namespace retval { template <class T> class ReturnValueGen { private: T x; public: ReturnValueGen() { x = 0; }; T& Generator() { return x; }; }; } int main() { retval::ReturnValueGen<int> retvalue; return retvalue.Generator(); }
C++ is wonderful.
Reply With Quote
  #5  
Old 09-06-2004, 11:47 AM
animepimp
Dragon
 
Join Date: Jan 2004
Posts: 860
Default

The way you wrote it, it will always cost either 100 or 200 plat, higher levels won't be able to buy anything. Because if level is 99 $ulevel &lt; 10 will be false and the next check $ulevel > 9 will be true, so it will skip all the other elsifs even though it fails the $ulevel &lt; 20. You need to either combine these into one line as elsif($ulevel > 9 &amp;&amp; $ ulevel &lt; 20) or just get rid of the ($ulevel > 9) because if it ever gets to that else their level must be over 9 regardless.
Reply With Quote
  #6  
Old 09-06-2004, 12:17 PM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

How it is set-up is that it first checks to see if you meet the first req, then it throws another at you and if you fail that one, it skips all of that and goes through the rest of the code. This is how code works, if you meet a requirement, then you go to that, but if you don't, you skip it. So, you meet that req, but the second one you dont meet, so then you go back and into another elsif.

But, if you are right, would this be able to fix it?

Code:
	elsif($ulevel &lt; 100)
	{
		if($ulevel > 89)
		{
for the last one. I still think my way is going to work, but if it doesn't, then what you are saying is that should fix it.
Reply With Quote
  #7  
Old 09-06-2004, 02:00 PM
animepimp
Dragon
 
Join Date: Jan 2004
Posts: 860
Default

Yeah that way should work the way you want. And you also don't need the double {'s at the beginning and end, but again they shouldn't hurt.
Reply With Quote
  #8  
Old 09-06-2004, 02:05 PM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

You were right, lol, I am redoing all 5079 lines, lol, been working about 1 1/2 hours now and a bit more than halfway done, hehe. Tx alot, I was being stupid =P
Reply With Quote
  #9  
Old 09-06-2004, 03:05 PM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

It doesn't work, lol.
Anyone Wanna help, I have lots and lots of errors, I think 5:

Bareword found where operator expected at Untitled line 120, near "if($text=~/ShapeChange30"

Lines 110-125:
Code:
                {
                        if($ulevel > 89)
                        {
                                quest::say("ShapeChange25 is 1000 Platinum Pieces and 1 Copper Piece.");
                        }
                }
        }
        #####################################################################################
        #ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#
        #####################################################################################
        if($text=~/ShapeChange30)
        {
                if($ulevel &lt; 10)
                {
                        quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
                }
(Might be a runaway multi-line // string starting on line 47)
Lines 47-101:
Code:
        if($text=~/ShapeChange25)
        {
                if($ulevel &lt; 10)
                {
                        quest::say("ShapeChange25 is 100 Platinum Pieces and 1 Copper Piece.");
                }
                elsif($ulevel &lt; 20)
                {
                        if($ulevel > 9)
                        {
                                quest::say("ShapeChange25 is 200 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 30)
                {
                        if($ulevel > 19)
                        {
                                quest::say("ShapeChange25 is 300 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 40)
                {
                        if($ulevel > 29)
                        {
                                quest::say("ShapeChange25 is 400 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 50)
                {
                        if($ulevel > 39)
                        {
                                quest::say("ShapeChange25 is 500 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 60)
                {
                        if($ulevel > 49)
                        {
                                quest::say("ShapeChange25 is 600 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 70)
                {
                        if($ulevel > 59)
                        {
                                quest::say("ShapeChange25 is 700 Platinum Pieces and 1 Copper Piece.");
                        }
                }
                elsif($ulevel &lt; 80)
                {
                        if($ulevel > 69)
                        {
                                quest::say("ShapeChange25 is 800 Platinum Pieces and 1 Copper Piece.");
                        }
                }
syntax error at Untitled line 120, near "if($text=~/ShapeChange30"
Lines 115-125:
Code:
              }
        }
        #####################################################################################
        #ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#ShapeChange30#
        #####################################################################################
        if($text=~/ShapeChange30)
        {
                if($ulevel &lt; 10)
                {
                        quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
                }
syntax error at Untitled line 126, near "elsif"
Lines 120-130:
Code:
        if($text=~/ShapeChange30)
        {
                if($ulevel &lt; 10)
                {
                        quest::say("ShapeChange30 is 200 Platinum Pieces and 2 Copper Piece.");
                }
                elsif($ulevel &lt; 20)
                {
                        if($ulevel > 9)
                        {
                                quest::say("ShapeChange30 is 300 Platinum Pieces and 2 Copper Pieces.");
If you want to see all of the code, please go to this site:
http://<br /> <a href="http://www.r...html</a><br />
Or
http://<br /> <a href="http://www.r...html</a><br />
Reply With Quote
  #10  
Old 09-06-2004, 03:21 PM
smogo
Discordant
 
Join Date: Jan 2004
Location: 47
Posts: 339
Default

you didn't close the match pattern in the if clause :
Code:
if($text=~/ShapeChange30)
should be
Code:
if($text=~/ShapeChange30/)
on all such lines.

This might not solve all your pbs, but it's a start imho. i hope this helps.
__________________
EQEMu Quest Repository is down until something new :(
Reply With Quote
  #11  
Old 09-06-2004, 04:15 PM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

Lol, tx, I didn't see that at all, =P, lol. I feel blind now, lol, and it would actually be something like if($text=~/ShapeChange/i), that way doesn't have to match the caps. once again thx, I can't believe I didn't see that I forgot to do that. When you are typing a 10,000 line code file, you sometimes forget some of the small things, ehhe.
Reply With Quote
  #12  
Old 09-09-2004, 04:22 PM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

THE BUFFER NPC IS NOW DONE!
Reply With Quote
  #13  
Old 09-10-2004, 03:36 AM
m0oni9
Hill Giant
 
Join Date: Dec 2003
Posts: 166
Default

Glancing at the script, just a couple of insights. Take it for what you will:

For your level range checking, you do not need as many checks. Consider the following:
Code:
if ($x >= 10 &amp;&amp; $x &lt;= 20)
{
   print "x is between 10 and 20 inclusive\n";
}
elsif ($x >= 21 &amp;&amp; $x &lt;= 30)
{
   print "x is between 21 and 30 inclusive\n";
}
Instead, try:
Code:
if ($x > 30)
{
   print "x is larger than 30!\n";
}
elsif ($x >= 20)
{
   print "x is between 30 and 20 inclusive\n";
}
As for all of these "if ($text =~ ...)" lines, after the first if statement, you may as well use elsif from then on.
Code:
if($text=~/hail/i)
...
elsif($text=~/categorys/i)
...
Also, the whole structure of the NPC telling what buffs he casts, etc., could probably be done with an array/hash more elegantly, and would take less code. I'm not going to draw that up, though .

Good effort on your script. I would suggest practicing with perl a bit more, and then attempt to redesign it. People have a habit of not wanting to redo or throw out their code, but in the end it will give you a better result, and likely increase your skills.
Reply With Quote
  #14  
Old 09-10-2004, 09:56 AM
Deimos
Hill Giant
 
Join Date: Jun 2004
Posts: 135
Default

Hey all, for some reason, this script isn't really working. The NPC is buffing itself instead of the players =/. Any ideas?

Code:
quest::castspell($userid,spell)
That is the correct usage, right? Or am I doing something wrong? Please tell me the correct usage, hehe.

Also, thx moonie. The code is already done though and works perfectly except for the above =/. I could have sworn it was $userid...
Reply With Quote
  #15  
Old 09-10-2004, 10:18 AM
Cisyouc
Demi-God
 
Join Date: Jun 2004
Location: Heaven.
Posts: 1,260
Default

Quote:
Originally Posted by Deimos
Hey all, for some reason, this script isn't really working. The NPC is buffing itself instead of the players =/. Any ideas?

Code:
quest::castspell($userid,spell)
That is the correct usage, right? Or am I doing something wrong? Please tell me the correct usage, hehe.

Also, thx moonie. The code is already done though and works perfectly except for the above =/. I could have sworn it was $userid...
Read my reply above where I mentioned this ahead of time.
__________________
namespace retval { template <class T> class ReturnValueGen { private: T x; public: ReturnValueGen() { x = 0; }; T& Generator() { return x; }; }; } int main() { retval::ReturnValueGen<int> retvalue; return retvalue.Generator(); }
C++ is wonderful.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

   

All times are GMT -4. The time now is 06:34 AM.


 

Everquest is a registered trademark of Daybreak Game Company LLC.
EQEmulator is not associated or affiliated in any way with Daybreak Game Company LLC.
Except where otherwise noted, this site is licensed under a Creative Commons License.
       
Powered by vBulletin®, Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Template by Bluepearl Design and vBulletin Templates - Ver3.3