From a1c64eebe013bc5b7df72cce44aa85d66ead38e2 Mon Sep 17 00:00:00 2001
From: Ben Longbons <b.r.longbons@gmail.com>
Date: Tue, 2 Apr 2013 17:03:32 -0700
Subject: Fail sooner when the impossible things happen

---
 src/map/clif.cpp  |  6 +++---
 src/map/pc.cpp    |  1 +
 src/map/skill.cpp | 27 ++++++++++++++-------------
 src/map/skill.hpp |  2 +-
 4 files changed, 19 insertions(+), 17 deletions(-)

(limited to 'src')

diff --git a/src/map/clif.cpp b/src/map/clif.cpp
index 24060a4..1691959 100644
--- a/src/map/clif.cpp
+++ b/src/map/clif.cpp
@@ -3018,7 +3018,7 @@ int clif_skillinfo(struct map_session_data *sd, SkillID skillid, int type,
     else
         WFIFOW(fd, 12) = range;
     memset(WFIFOP(fd, 14), 0, 24);
-    WFIFOB(fd, 38) = bool(sd->status.skill[skillid].lv < skill_get_max_raise(skillid));
+    WFIFOB(fd, 38) = sd->status.skill[skillid].lv < skill_get_max_raise(skillid);
     WFIFOSET(fd, clif_parse_func_table[0x147].len);
 
     return 0;
@@ -3054,7 +3054,7 @@ int clif_skillinfoblock(struct map_session_data *sd)
                 range = battle_get_range(&sd->bl) - (range + 1);
             WFIFOW(fd, len + 10) = range;
             memset(WFIFOP(fd, len + 12), 0, 24);
-            WFIFOB(fd, len + 36) = bool(sd->status.skill[i].lv < skill_get_max_raise(i));
+            WFIFOB(fd, len + 36) = sd->status.skill[i].lv < skill_get_max_raise(i);
             len += 37;
         }
     }
@@ -3083,7 +3083,7 @@ int clif_skillup(struct map_session_data *sd, SkillID skill_num)
     if (range < 0)
         range = battle_get_range(&sd->bl) - (range + 1);
     WFIFOW(fd, 8) = range;
-    WFIFOB(fd, 10) = bool(sd->status.skill[skill_num].lv < skill_get_max_raise(skill_num));
+    WFIFOB(fd, 10) = sd->status.skill[skill_num].lv < skill_get_max_raise(skill_num);
     WFIFOSET(fd, clif_parse_func_table[0x10e].len);
 
     return 0;
diff --git a/src/map/pc.cpp b/src/map/pc.cpp
index 050bd4e..a344839 100644
--- a/src/map/pc.cpp
+++ b/src/map/pc.cpp
@@ -856,6 +856,7 @@ int pc_checkweighticon(struct map_session_data *sd)
     if (sd->weight * 10 >= sd->max_weight * 9)
         flag = 2;
 
+    // this is horribly hackish and may have caused crashes
     if (flag == 1)
     {
         if (!sd->sc_data[StatusChange::SC_WEIGHT50].timer)
diff --git a/src/map/skill.cpp b/src/map/skill.cpp
index 8a2deb2..4375541 100644
--- a/src/map/skill.cpp
+++ b/src/map/skill.cpp
@@ -761,7 +761,7 @@ int skill_status_change_active(struct block_list *bl, StatusChange type)
     return sc_data[type].timer != nullptr;
 }
 
-int skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid)
+void skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid)
 {
     eptr<struct status_change, StatusChange> sc_data;
     int opt_flag = 0, calc_flag = 0;
@@ -771,29 +771,32 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, TimerData
     Opt2 *opt2;
     Opt3 *opt3;
 
-    nullpo_ret(bl);
+    nullpo_retv(bl);
     if (bl->type != BL::PC && bl->type != BL::MOB)
     {
         if (battle_config.error_log)
             PRINTF("skill_status_change_end: neither MOB nor PC !\n");
-        return 0;
+        return;
     }
     sc_data = battle_get_sc_data(bl);
     if (not sc_data)
-        return 0;
+        return;
     sc_count = battle_get_sc_count(bl);
-    nullpo_ret(sc_count);
+    nullpo_retv(sc_count);
     option = battle_get_option(bl);
-    nullpo_ret(option);
+    nullpo_retv(option);
     opt1 = battle_get_opt1(bl);
-    nullpo_ret(opt1);
+    nullpo_retv(opt1);
     opt2 = battle_get_opt2(bl);
-    nullpo_ret(opt2);
+    nullpo_retv(opt2);
     opt3 = battle_get_opt3(bl);
-    nullpo_ret(opt3);
+    nullpo_retv(opt3);
+
+    if (!sc_data[type].timer)
+        return;
+    assert ((*sc_count) > 0);
+    assert (sc_data[type].timer == tid || !tid);
 
-    if ((*sc_count) > 0 && sc_data[type].timer
-        && (sc_data[type].timer == tid || !tid))
     {
 
         if (!tid)
@@ -854,8 +857,6 @@ int skill_status_change_end(struct block_list *bl, StatusChange type, TimerData
         if (bl->type == BL::PC && calc_flag)
             pc_calcstatus((struct map_session_data *) bl, 0);  /* ステータス再計算 */
     }
-
-    return 0;
 }
 
 int skill_update_heal_animation(struct map_session_data *sd)
diff --git a/src/map/skill.hpp b/src/map/skill.hpp
index 10b6d89..a724781 100644
--- a/src/map/skill.hpp
+++ b/src/map/skill.hpp
@@ -86,7 +86,7 @@ int skill_status_change_start(struct block_list *bl, StatusChange type,
         int val1,
         interval_t tick);
 int skill_status_change_active(struct block_list *bl, StatusChange type);  // [fate]
-int skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid);
+void skill_status_change_end(struct block_list *bl, StatusChange type, TimerData *tid);
 int skill_status_change_clear(struct block_list *bl, int type);
 
 // mobスキルのため
-- 
cgit v1.2.3-70-g09d2