Code path debug: Difference between revisions

From Dragon Realm Wiki
Created page with "== call player;query_level() always shows 1 == <pre>/std/user.c :: query_level()</pre> This function simply returns the object variable "level", which is only modified through..."
 
No edit summary
Line 2: Line 2:
<pre>/std/user.c :: query_level()</pre>
<pre>/std/user.c :: query_level()</pre>
This function simply returns the object variable "level", which is only modified through set_level(). set_level() does a check to see whether the previous_object() is wizardp(), or if the euid of the previous_object() is UID_ADVANCE. If not, it returns. This appears to be the root of the issue, as functions which call set_level() (such as the _improve.c command) defer setting levels by calling set_level(1). set_level(1) then 'returns' with no integer (presumably 0 by default) and I believe the player's level remains what it was, 1.
This function simply returns the object variable "level", which is only modified through set_level(). set_level() does a check to see whether the previous_object() is wizardp(), or if the euid of the previous_object() is UID_ADVANCE. If not, it returns. This appears to be the root of the issue, as functions which call set_level() (such as the _improve.c command) defer setting levels by calling set_level(1). set_level(1) then 'returns' with no integer (presumably 0 by default) and I believe the player's level remains what it was, 1.
<ol>
<li><pre>/cmds/mortal/_improve.c :: cmd_improve()
    ...
    STAT_D->do_improvement(str, this_player());
    ...</pre>
<li><pre>/daemon/stat_d.c :: do_improvement()
    ...
    /* set_stats() for me is inherited from living.c */
    me->set_stats(str, current + 1);
    ...</pre>
<li><pre>/std/living.c :: set_stats()
    ...
    if(!wizardp(this_object()) && this_object()->is_player()){
        seteuid(UID_ADVANCE); // This should be enough to satisfy living.c::set_level()
        this_object()->set_level(1);
        seteuid(getuid());
    }
    ...</pre>
</ol>

Revision as of 15:44, 7 July 2020

call player;query_level() always shows 1

/std/user.c :: query_level()

This function simply returns the object variable "level", which is only modified through set_level(). set_level() does a check to see whether the previous_object() is wizardp(), or if the euid of the previous_object() is UID_ADVANCE. If not, it returns. This appears to be the root of the issue, as functions which call set_level() (such as the _improve.c command) defer setting levels by calling set_level(1). set_level(1) then 'returns' with no integer (presumably 0 by default) and I believe the player's level remains what it was, 1.

  1. /cmds/mortal/_improve.c :: cmd_improve()
        ...
        STAT_D->do_improvement(str, this_player());
        ...
  2. /daemon/stat_d.c :: do_improvement()
        ...
        /* set_stats() for me is inherited from living.c */
        me->set_stats(str, current + 1);
        ...
  3. /std/living.c :: set_stats()
        ...
        if(!wizardp(this_object()) && this_object()->is_player()){
            seteuid(UID_ADVANCE); // This should be enough to satisfy living.c::set_level()
            this_object()->set_level(1);
            seteuid(getuid());
        }
        ...