On Tue, 9 Mar 2004, Bernd Edler wrote: > > I noticed a bug: > If a natural stat gets below 1, one can no longer > raise it with stat potions. > > It is possible to get to 0, if you drink too many > cursed stat potions. > You can even have a negative natural starting stat due to > negative class modificators. > Example: start int 9 -> quez,int 9-8 = 1 -> barbarian, int 1-6 = -5. > > With this patch one can now raise these stats with potions. > Furthermore cursed potions no longer drain you below 1. > > Now for the question: > > In the original code tmp->stats.sp (the potions spellpoints) > is used in the if condition,then set to 0 if a stat is changed. > > As i do not understand the intention for /* Fix it up for super potions */ > , i can not emulate the desired behavior. > > I do know, that this stuff has no relevance to normal stat potions,as > their sp is 0 anyway. > > So if somebody can explain that, i can finish this patch. > After checking the archetypes, artifacts and all map files, i think that potions with stat boni and sp!=0 do not exist in the game. Thus, i am positive, this new patch will fix the bug without breaking anything else. -------------- next part -------------- Index: common/living.c =================================================================== RCS file: /cvsroot/crossfire/crossfire/common/living.c,v retrieving revision 1.60 diff -c -r1.60 living.c *** common/living.c 27 Feb 2004 23:00:26 -0000 1.60 --- common/living.c 13 Mar 2004 22:36:30 -0000 *************** *** 355,361 **** * that gives them that ability. */ int change_abil(object *op, object *tmp) { ! int flag=QUERY_FLAG(tmp,FLAG_APPLIED)?1:-1,i,j,success=0; object refop; char message[MAX_BUF]; int potion_max=0; --- 355,362 ---- * that gives them that ability. */ int change_abil(object *op, object *tmp) { ! int flag=QUERY_FLAG(tmp,FLAG_APPLIED)?1:-1; ! int i,j,potion,newstat,success=0; object refop; char message[MAX_BUF]; int potion_max=0; *************** *** 367,390 **** if(op->type==PLAYER) { if (tmp->type==POTION) { for(j=0;j<NUM_STATS;j++) { i = get_attr_value(&(op->contr->orig_stats),j); ! ! /* Check to see if stats are within limits such that this can be ! * applied. ! */ ! if (((i+flag*get_attr_value(&(tmp->stats),j))<= ! (20+tmp->stats.sp + get_attr_value(&(op->arch->clone.stats),j))) ! && i>0) ! { ! change_attr_value(&(op->contr->orig_stats),j, ! flag*get_attr_value(&(tmp->stats),j)); ! tmp->stats.sp=0;/* Fix it up for super potions */ ! } ! else { ! /* potion is useless - player has already hit the natural maximum */ ! potion_max = 1; ! } } /* This section of code ups the characters normal stats also. I am not * sure if this is strictly necessary, being that fix_player probably --- 368,388 ---- if(op->type==PLAYER) { if (tmp->type==POTION) { + potion_max=1; for(j=0;j<NUM_STATS;j++) { i = get_attr_value(&(op->contr->orig_stats),j); ! potion = flag*get_attr_value(&(tmp->stats),j); ! newstat=i+potion; ! if (potion<0) { /* stat drain */ ! if (i<1) continue; /* No miracle cure for negative starting stats */ ! else if (newstat<1) newstat=1; /* No drain below 1 */ ! } ! else if (newstat>20+get_attr_value(&(op->arch->clone.stats),j)) ! newstat=20+get_attr_value(&(op->arch->clone.stats),j); ! if ( newstat != i ) { ! set_attr_value(&(op->contr->orig_stats),j,newstat); ! potion_max=0; ! } } /* This section of code ups the characters normal stats also. I am not * sure if this is strictly necessary, being that fix_player probably -------------- next part -------------- _______________________________________________ crossfire-devel mailing list crossfire-devel at lists.real-time.com https://mailman.real-time.com/mailman/listinfo/crossfire-devel