View Single Post
  #3  
Old 06-19-2011, 06:36 AM
Leere
Sarnak
 
Join Date: Sep 2008
Location: Home
Posts: 31
Default

Recreated locally for a new diff. I've actually tried to apply it to a reverted version too, and it worked. Not sure what I broke about the first version while copy and pasting.

Code:
Index: spells.cpp
===================================================================
--- spells.cpp    (revision 1944)
+++ spells.cpp    (working copy)
@@ -933,13 +933,14 @@
     // first check for component reduction
     if(IsClient()) {
         int reg_focus = CastToClient()->GetFocusEffect(focusReagentCost,spell_id);
-        if(MakeRandomInt(0, 100) <= reg_focus) {
+        if(MakeRandomInt(1, 100) <= reg_focus) {
             mlog(SPELLS__CASTING, "Spell %d: Reagent focus item prevented reagent consumption (%d chance)", spell_id, reg_focus);
         } else {
             if(reg_focus > 0)
                 mlog(SPELLS__CASTING, "Spell %d: Reagent focus item failed to prevent reagent consumption (%d chance)", spell_id, reg_focus);
             Client *c = this->CastToClient();
             int component, component_count, inv_slot_id;
+            bool missingreags = false;
             for(int t_count = 0; t_count < 4; t_count++) {
                 component = spells[spell_id].components[t_count];
                 component_count = spells[spell_id].component_counts[t_count];
@@ -1008,7 +1009,11 @@
                 else {
                     if(c->GetInv().HasItem(component, component_count, invWhereWorn|invWherePersonal) == -1) // item not found
                     {
-                        c->Message_StringID(13, MISSING_SPELL_COMP);
+                        if (!missingreags)
+                        {
+                            c->Message_StringID(13, MISSING_SPELL_COMP);
+                            missingreags=true;
+                        }
     
                         const Item_Struct *item = database.GetItem(component);
                         if(item) {
@@ -1020,35 +1025,42 @@
                             strcpy((char*)&TempItemName, "UNKNOWN");
                             mlog(SPELLS__CASTING_ERR, "Spell %d: Canceled. Missing required reagent %s (%d)", spell_id, TempItemName, component);
                         }
+                    }
+                } // end bard/not bard ifs
+            } // end reagent loop
 
-                        if(c->GetGM())
-                            c->Message(0, "Your GM status allows you to finish casting even though you're missing required components.");
-                        else {
-                            InterruptSpell();
-                            return;
-                        }
-                    
-                    }
-                    else
+            if (missingreags) {
+                if(c->GetGM())
+                    c->Message(0, "Your GM status allows you to finish casting even though you're missing required components.");
+                else {
+                    InterruptSpell();
+                    return;
+                }
+            }
+            else
+            {
+                for(int t_count = 0; t_count < 4; t_count++) {
+                    component = spells[spell_id].components[t_count];
+                    if (component == -1)
+                        continue;
+                    component_count = spells[spell_id].component_counts[t_count];
+                    mlog(SPELLS__CASTING_ERR, "Spell %d: Consuming %d of spell component item id %d", spell_id, component, component_count);
+                    // Components found, Deleteing
+                    // now we go looking for and deleting the items one by one
+                    for(int s = 0; s < component_count; s++)
                     {
-                        mlog(SPELLS__CASTING_ERR, "Spell %d: Consuming %d of spell component item id %d", spell_id, component, component_count);
-                        // Components found, Deleteing
-                        // now we go looking for and deleting the items one by one
-                        for(int s = 0; s < component_count; s++)
+                        inv_slot_id = c->GetInv().HasItem(component, 1, invWhereWorn|invWherePersonal);
+                        if(inv_slot_id != -1)
                         {
-                            inv_slot_id = c->GetInv().HasItem(component, 1, invWhereWorn|invWherePersonal);
-                            if(inv_slot_id != -1)
-                            {
-                                c->DeleteItemInInventory(inv_slot_id, 1, true);
-                            }
-                            else
-                            {    // some kind of error in the code if this happens
-                                c->Message(13, "ERROR: reagent item disappeared while processing?");
-                            }
+                            c->DeleteItemInInventory(inv_slot_id, 1, true);
                         }
+                        else
+                        {    // some kind of error in the code if this happens
+                            c->Message(13, "ERROR: reagent item disappeared while processing?");
+                        }
                     }
-                } // end bard/not bard ifs
-            } // end reagent loop
+                }
+            } // end missingreags/consumption
         } // end `focus did not help us`
     } // end IsClient() for reagents
Tested locally: Regular spell with no reags. Single reag spell (with reag not in inventory, and with reag in inventory). Multiple reag spell (with no reags in inventory, with only the first in inventory, with only the second in inventory, with all in inventory).

All cases behaved as expected.
Reply With Quote