Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to verify your details, confirm your email, resolve issues, making threats, or asking for money, are
spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the
password reset link.
Due to spam on this forum, all posts now need moderator approval.
Entire forum
➜ SMAUG
➜ SMAUG coding
➜ So I was strolling through the code one day...
So I was strolling through the code one day...
|
It is now over 60 days since the last post. This thread is closed.
Refresh page
Posted by
| Aqueus
USA (47 posts) Bio
|
Date
| Sun 25 Feb 2007 03:35 AM (UTC) |
Message
| Ok, maybe I'm totally wrong about the code in here, but I am very sure that I did all the right steps.
I declared the function in mud.h "DECLARE_DO_FUN", and all that jazz...
Did all the do_fun fun in tables.c, and generally matched it so that it's declaration was everywhere that mpgoto was at...
Here's the code...
/* allows the mobile to gift pl to people */
void do_mpgivepl( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
long int pl_gain = 0;
progbug( "Entering MPgivepl", ch );
if ( !IS_NPC( ch ) )
{
send_to_char( "Huh?\n\r", ch );
progbug( "Mpgivepl - ch not NPC", ch );
return;
}
if ( IS_NPC(victim) )
{
progbug( "Mpadvance - Victim is NPC", ch );
return;
}
argument = one_argument(argument, arg);
if ( arg[0] == '\0' || argument[0] == '\0' )
{
progbug( "Mpgivepl - Bad argument", ch );
return;
}
pl_gain = atoi(argument);
if( (victim = get_char_room(ch,arg)) == NULL )
{
progbug( "Mpgivepl - Target not found", ch );
return;
}
gain_exp(ch, pl_gain);
bug( argument, 0 );
sprintf( buf, "Your powerlevel increases by %s points!", num_punct(pl_gain) );
act( AT_HIT, buf, ch, NULL, victim, TO_CHAR );
}
I can explain line-by-line if there are any questions, but now to the point:
It doesn't do anything. Period. When I write "mpgivepl $n 5000" in a prog it doesn't do anything. Not even the first bug "Entering MPgivepl"...
So I'm wondering if I need to declare it elsewhere, that somehow grepping couldn't find, or maybe I just screwed up in the code.
-Tiernan
P.S. this is DBSC, a derivative of SMAUG. | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #1 on Sun 25 Feb 2007 04:07 AM (UTC) |
Message
| Did you create the command in-game using cedit? (see the wiki commands section here for more info) |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Aqueus
USA (47 posts) Bio
|
Date
| Reply #2 on Sun 25 Feb 2007 04:25 AM (UTC) Amended on Mon 26 Feb 2007 05:31 AM (UTC) by Nick Gammon
|
Message
| Ok, it's a command now, and all of the bugs are properly showing, but it's still not doing anything...
I mean all the data is moving properly, but it's not effecting to the character.
I'll shuffle through the code, but could someone suggest potential errors?
Perhaps I'm not addressing the victim properly? | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #3 on Sun 25 Feb 2007 04:29 AM (UTC) |
Message
| Well, at a guess...
gain_exp(ch, pl_gain);
should be affecting the victim, not the actor (ch), ne?
Also; this block of code:
if ( IS_NPC(victim) )
{
progbug( "Mpadvance - Victim is NPC", ch );
return;
}
should come after you actually look up the victim with get_char_room.
Oh, and your ACT flag should probably be TO_VICT, not TO_CHAR. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Aqueus
USA (47 posts) Bio
|
Date
| Reply #4 on Sun 25 Feb 2007 04:59 AM (UTC) Amended on Sun 25 Feb 2007 05:31 AM (UTC) by Aqueus
|
Message
| Funny enough I found those errors, too... this is the current block of code:
void do_mpgivepl( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
long int pl_gain = 0;
if ( !IS_NPC( ch ) )
{
send_to_char( "Huh?\n\r", ch );
return;
}
argument = one_argument(argument, arg);
pl_gain = atoi(argument);
if ( arg[0] == '\0' || argument[0] == '\0' )
{
progbug( "Mpgivepl - Bad argument", ch );
return;
}
if( (victim = get_char_room(ch,arg)) == NULL )
{
progbug( "Mpgivepl - Target not found", ch );
return;
}
if ( IS_NPC(victim) )
{
progbug( "Mpadvance - Victim is NPC", ch );
return;
}
gain_exp(victim, pl_gain);
sprintf( buf, "Victim: %s", victim->name );
bug( buf, 0 );
sprintf( buf, "Your powerlevel increases by %s points!", num_punct(pl_gain) );
act( AT_HIT, buf, ch, NULL, victim, TO_VICT );
}
The bug works better, but no difference occurs with the victim's PL(powerlevel) I've examined gain_exp, but found nothing... Damn, I suck. -.- >.> =(
Maybe it has something to do with pl_gain... How could I go about displaying a number somewhere? When I try and bug it, it's asking for a string, so... blarg...
The worst part about this is that I copied the code from another place (do_plset) so I could get it working inside a mprog, which would allow quest-stuffs to give PL. It works in the other code just fine. Double-blarg. | Top |
|
Posted by
| Meerclar
USA (733 posts) Bio
|
Date
| Reply #5 on Sun 25 Feb 2007 05:38 AM (UTC) |
Message
| Unless the mprog code was modded for the DBSC distro, I'm half remembering some serious limitations to what character attributes could be modified via mprog. Post a link to the main DBSC distro site and I'll have a look at it to be sure I'm remembering it right and it wasn't changed. |
Meerclar - Lord of Cats
Coder, Builder, and Tormenter of Mortals
Stormbringer: Rebirth
storm-bringer.org:4500
www.storm-bringer.org | Top |
|
Posted by
| Aqueus
USA (47 posts) Bio
|
Date
| Reply #6 on Sun 25 Feb 2007 06:08 AM (UTC) |
Message
| Ok, well, I solved the problem, but in quite the inelegant way.
I copied the guts of exp_gain that I wanted to use into the mpcommand and everything worked... a little too well, actually and for a few minutes it leveled me down to a mortal. (I had mset myself really low, and it correct my level according to my pl, fun stuff. =p)
So, yeah, in short: copied what I needed, the code ended up looking like this:
void do_mpgivepl( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
long double modgain;
int rank = 0, newRank = 0;
int trueRank = 0;
if ( !IS_NPC( ch ) )
{
send_to_char( "Huh?\n\r", ch );
return;
}
argument = one_argument(argument, arg);
modgain = atoi(argument);
if ( arg[0] == '\0' || argument[0] == '\0' )
{
progbug( "Mpgivepl - Bad argument", ch );
return;
}
if( (victim = get_char_room(ch,arg)) == NULL )
{
progbug( "Mpgivepl - Target not found", ch );
return;
}
if ( IS_NPC(victim) )
{
progbug( "Mpadvance - Victim is NPC", ch );
return;
}
rank = get_rank_number(victim);
trueRank = get_true_rank(victim);
victim->exp += modgain;
if (NOT_AUTHED(victim) && victim->exp >= MAX_EXP_PRE_AUTH)
{
send_to_char("Your power level can not increase until you are authorized.\n\r", victim);
victim->exp = MAX_EXP_PRE_AUTH;
victim->pl = (victim->pl - (victim->pl - MAX_EXP_PRE_AUTH ));
return;
}
if ( rank != get_rank_number(victim) )
{
sprintf( buf, "%s's rank has changed to %s", victim->name, get_rank_color(victim));
do_info(victim, buf);
}
if ( trueRank != (newRank = get_true_rank(victim)) && !IS_IMMORTAL(victim) )
{
victim->level = newRank;
}
if ( (victim->exp >= ( pow(victim->max_train, 1.916056) * 6000) )
&& (victim->max_train < 370) )
{
set_char_color( AT_LBLUE + AT_BLINK, victim );
ch_printf( victim, "You gained an additional training point!\n\r" );
victim->train += 1;
victim->max_train += 1;
}
sprintf( buf, "Your powerlevel increases by %s points!", num_punct(modgain) );
act( AT_HIT, buf, ch, NULL, victim, TO_VICT );
}
| Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #7 on Sun 25 Feb 2007 06:14 AM (UTC) |
Message
| You really don't want to copy things out like that. Really, really.
You should try tracing through the code of gain_exp to look at what it's doing. What you did (copying the lines you needed) goes against several rules of good programming practice, and can cause you much grief later on. I would really recommend fixing it the "clean" way.
This is a great opportunity to learn how to use gdb. Use Nick's guide here as a reference.
http://www.gammon.com.au/forum/bbshowpost.php?bbsubject_id=3653
Set a breakpoint at the line that calls gain_exp. Go from there. Step through the code. See if the experience is actually being added. If not, see what's preventing it.
If you don't want to use gdb, then use printf or bug-call debugging. Do whatever you want, just don't copy-paste the function segments. :-) |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Aqueus
USA (47 posts) Bio
|
Date
| Reply #8 on Sun 25 Feb 2007 06:56 AM (UTC) |
Message
| Don't worry, I went through everything thoroughly, and I only grabbed the specific parts of the code I needed. No fluff, and I kept all the integral parts of the code there.
Also, before I copied the code I did some bug-call debugging, as you call it, and found that no matter what I did when I called exp_gain it was getting sent 0 as the number to increase their PL.
I eventually tried "exp_gain(victim, 500000);" to see if that would work, but it didn't. Solutions only came when I grabbed the chunks of code I needed.
Again, don't worry, I know what the code does, I just can't get it to work the 'clean' way. | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #9 on Sun 25 Feb 2007 08:30 AM (UTC) |
Message
| The point isn't getting only the essential parts. It is still very wrong to duplicate the functionality. The point is to figure out why the function call as-is is not working. Trust me, you really, really don't want to be yanking out parts of functions.
So, when you were calling gain_exp, the parameter was zero, even though the pl_gain variable it was non-zero right before calling the function? Are you entirely sure of that? I don't have your code here so I cannot check this myself, but I have to admit that I find this rather surprising. Something fishy is going on; I have the impression that I'm not seeing the whole story. There is no reason for a non-zero parameter to suddenly become zero. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Gohan_TheDragonball
USA (183 posts) Bio
|
Date
| Reply #10 on Tue 27 Feb 2007 09:27 PM (UTC) |
Message
| how funny is this line:
victim->pl = (victim->pl - (victim->pl - MAX_EXP_PRE_AUTH ));
instead of just:
victim->pl = MAX_EXP_PRE_AUTH; | Top |
|
Posted by
| Nick Gammon
Australia (23,133 posts) Bio
Forum Administrator |
Date
| Reply #11 on Wed 28 Feb 2007 12:37 AM (UTC) |
Message
| Pretty funny. |
- Nick Gammon
www.gammon.com.au, www.mushclient.com | Top |
|
Posted by
| David Haley
USA (3,881 posts) Bio
|
Date
| Reply #12 on Wed 28 Feb 2007 03:56 AM (UTC) |
Message
| Yeah, I don't get it either. The only possibility that I can see is that it's trying to play games with integer overflow, but not only does that not make sense in principle, but it also doesn't seem to be the case anyhow. (Even with overflows, all that will just cancel itself out.)
This is probably a case of a more complex formula being trimmed down and modified, until it reached this state that was correct, and nobody really noticed or cared enough to change it. |
David Haley aka Ksilyan
Head Programmer,
Legends of the Darkstone
http://david.the-haleys.org | Top |
|
Posted by
| Volk
(5 posts) Bio
|
Date
| Reply #13 on Thu 08 Mar 2007 01:39 PM (UTC) |
Message
| Hey, looking back on your code.. i'd hazard a guess here -
The first one (with the call to gain_exp) showed:
long int pl_gain = 0;
gain_exp(victim, pl_gain);
The second one (with the gain_exp code ripped and pasted in) showed:
long double modgain;
victim->exp += modgain;
So, could there maybe have been a problem with sending a long int to gain_exp rather than a long double? | Top |
|
The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).
To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.
38,977 views.
It is now over 60 days since the last post. This thread is closed.
Refresh page
top