[CF-Devel] Patch: skill & experience

crossfire-devel at archives.real-time.com crossfire-devel at archives.real-time.com
Sat Jan 3 05:09:35 CST 2004


Hello, and happy new year!

Playing with inscription skill, i found a small bug (there's another, crashing 
one, patch will follow as soon as i solve it :)).

What happens is that, when you first use a skill you don't own (like 
inscription, or a skill with a talisman), give_skill_by_name gets called to 
insert the skill in inventory. But player's contr->last_skill_ob does not get 
updated. This field is often used to quickly find skills by number.
So for instance using inscription two times, when you don't have exp the first, 
will give you TWO inscription skills in inventory! (and a third use gives a 3rd 
object).

My patch changes give_skill_by_name to update contr->last_skill_ob after 
inserting skill item.

Also, the first time you use a skill like that, you do get the skill object, but 
not the actual experience.
This is because add_player_exp will not update newly inserted object in 
inventory. I fixed that also.

Nicolas 'Ryo'
-------------- next part --------------
Index: common/living.c
===================================================================
RCS file: /cvsroot/crossfire/crossfire/common/living.c,v
retrieving revision 1.58
diff -u -r1.58 living.c
--- common/living.c	28 Dec 2003 06:06:00 -0000	1.58
+++ common/living.c	3 Jan 2004 10:59:11 -0000
@@ -1491,6 +1491,16 @@
 	LOG(llevError, "add_player_exp: couldn't find skill %s\n", skill_name);
 	return NULL;
     }
+
+    /* Sanity check: if player knows the skill (in op->contr->last_skill_ob),
+     * don't do anything (except log something's weird)
+     */
+    if ( ( skill_obj->subtype < NUM_SKILLS ) && ( op->contr->last_skill_ob[ skill_obj->subtype ] ) )
+        {
+        LOG( llevError, "add_player_exp: last_skill_ob not NULL for skill %s (%d)\n", skill_name, skill_obj->subtype );
+        return NULL;
+        }
+
     /* clear the flag - exp goes into this bucket, but player
      * still doesn't know it.
      */
@@ -1498,6 +1508,8 @@
     skill_obj->stats.exp = 0;
     skill_obj->level = 1;
     insert_ob_in_ob(skill_obj, op);
+    if ( skill_obj->subtype < NUM_SKILLS )
+        op->contr->last_skill_ob[ skill_obj->subtype ] = skill_obj;
     return skill_obj;
 }
 
@@ -1625,7 +1637,7 @@
 	    if (!skill_obj) {
 		if (flag == SK_EXP_NONE) return;
 		else if (flag == SK_EXP_ADD_SKILL)
-		    give_skill_by_name(op, skill_name);
+		    skill_obj = give_skill_by_name(op, skill_name);
 	    }
 	}
     }
-------------- next part --------------
_______________________________________________
crossfire-devel mailing list
     
     crossfire-devel at lists.real-time.com
     
     
     https://mailman.real-time.com/mailman/listinfo/crossfire-devel
     
     
    


More information about the crossfire mailing list