--- class.c	Wed Aug 26 13:06:53 1998
+++ class.c.new	Wed Aug 26 13:15:53 1998
@@ -176,6 +176,26 @@ int guild_info[][3] = {
 
 
 
+/* Order of saving throws: PARA, ROD, PETRI, BREATH, SPELL */
+/* This matrix determines the base saving throw for each   */
+/* class (i.e. the saving throw needed at level 1).        */
+int saving_throw_base[NUM_CLASSES][5] = {
+  { 70, 55, 65, 75, 60 }, /* MU */
+  { 60, 70, 65, 80, 75 }, /* CL */
+  { 65, 70, 60, 80, 75 }, /* TH */
+  { 70, 80, 75, 85, 85 }, /* WA */
+};        
+
+/* This is the rate at which saving throws improve, *10 */
+/* So, if a saving throw improves at a rate of 1.4 per  */
+/* level, it is entered into this matrix as -14.        */
+int saving_throw_improve[NUM_CLASSES][5] = {
+  { -14, -16, -17, -17, -17 }, /* MU */
+  { -16, -15, -15, -15, -15 }, /* CL */
+  { -10, -20, -10, -10, -20 }, /* TH */
+  { -21, -21, -21, -25, -21 }, /* WA */
+};
+
 /*
  * Saving throws for:
  * MCTW
@@ -187,1129 +207,33 @@ int guild_info[][3] = {
 
 byte saving_throws(int class_num, int type, int level)
 {
-
-  switch (class_num) {
-  case CLASS_MAGIC_USER:
-    switch (type) {
-    case SAVING_PARA:	/* Paralyzation */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 70;
-      case  2: return 69;
-      case  3: return 68;
-      case  4: return 67;
-      case  5: return 66;
-      case  6: return 65;
-      case  7: return 63;
-      case  8: return 61;
-      case  9: return 60;
-      case 10: return 59;
-      case 11: return 57;
-      case 12: return 55;
-      case 13: return 54;
-      case 14: return 53;
-      case 15: return 53;
-      case 16: return 52;
-      case 17: return 51;
-      case 18: return 50;
-      case 19: return 48;
-      case 20: return 46;
-      case 21: return 45;
-      case 22: return 44;
-      case 23: return 42;
-      case 24: return 40;
-      case 25: return 38;
-      case 26: return 36;
-      case 27: return 34;
-      case 28: return 32;
-      case 29: return 30;
-      case 30: return 28;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for mage paralyzation saving throw.");
-      }
-    case SAVING_ROD:	/* Rods */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 55;
-      case  2: return 53;
-      case  3: return 51;
-      case  4: return 49;
-      case  5: return 47;
-      case  6: return 45;
-      case  7: return 43;
-      case  8: return 41;
-      case  9: return 40;
-      case 10: return 39;
-      case 11: return 37;
-      case 12: return 35;
-      case 13: return 33;
-      case 14: return 31;
-      case 15: return 30;
-      case 16: return 29;
-      case 17: return 27;
-      case 18: return 25;
-      case 19: return 23;
-      case 20: return 21;
-      case 21: return 20;
-      case 22: return 19;
-      case 23: return 17;
-      case 24: return 15;
-      case 25: return 14;
-      case 26: return 13;
-      case 27: return 12;
-      case 28: return 11;
-      case 29: return 10;
-      case 30: return  9;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for mage rod saving throw.");
-      }
-    case SAVING_PETRI:	/* Petrification */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 65;
-      case  2: return 63;
-      case  3: return 61;
-      case  4: return 59;
-      case  5: return 57;
-      case  6: return 55;
-      case  7: return 53;
-      case  8: return 51;
-      case  9: return 50;
-      case 10: return 49;
-      case 11: return 47;
-      case 12: return 45;
-      case 13: return 43;
-      case 14: return 41;
-      case 15: return 40;
-      case 16: return 39;
-      case 17: return 37;
-      case 18: return 35;
-      case 19: return 33;
-      case 20: return 31;
-      case 21: return 30;
-      case 22: return 29;
-      case 23: return 27;
-      case 24: return 25;
-      case 25: return 23;
-      case 26: return 21;
-      case 27: return 19;
-      case 28: return 17;
-      case 29: return 15;
-      case 30: return 13;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for mage petrification saving throw.");
-      }
-    case SAVING_BREATH:	/* Breath weapons */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 75;
-      case  2: return 73;
-      case  3: return 71;
-      case  4: return 69;
-      case  5: return 67;
-      case  6: return 65;
-      case  7: return 63;
-      case  8: return 61;
-      case  9: return 60;
-      case 10: return 59;
-      case 11: return 57;
-      case 12: return 55;
-      case 13: return 53;
-      case 14: return 51;
-      case 15: return 50;
-      case 16: return 49;
-      case 17: return 47;
-      case 18: return 45;
-      case 19: return 43;
-      case 20: return 41;
-      case 21: return 40;
-      case 22: return 39;
-      case 23: return 37;
-      case 24: return 35;
-      case 25: return 33;
-      case 26: return 31;
-      case 27: return 29;
-      case 28: return 27;
-      case 29: return 25;
-      case 30: return 23;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for mage breath saving throw.");
-      }
-    case SAVING_SPELL:	/* Generic spells */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 60;
-      case  2: return 58;
-      case  3: return 56;
-      case  4: return 54;
-      case  5: return 52;
-      case  6: return 50;
-      case  7: return 48;
-      case  8: return 46;
-      case  9: return 45;
-      case 10: return 44;
-      case 11: return 42;
-      case 12: return 40;
-      case 13: return 38;
-      case 14: return 36;
-      case 15: return 35;
-      case 16: return 34;
-      case 17: return 32;
-      case 18: return 30;
-      case 19: return 28;
-      case 20: return 26;
-      case 21: return 25;
-      case 22: return 24;
-      case 23: return 22;
-      case 24: return 20;
-      case 25: return 18;
-      case 26: return 16;
-      case 27: return 14;
-      case 28: return 12;
-      case 29: return 10;
-      case 30: return  8;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for mage spell saving throw.");
-      }
-    default:
-      log("SYSERR: Invalid saving throw type.");
-    }
-    break;
-  case CLASS_CLERIC:
-    switch (type) {
-    case SAVING_PARA:	/* Paralyzation */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 60;
-      case  2: return 59;
-      case  3: return 48;
-      case  4: return 46;
-      case  5: return 45;
-      case  6: return 43;
-      case  7: return 40;
-      case  8: return 37;
-      case  9: return 35;
-      case 10: return 34;
-      case 11: return 33;
-      case 12: return 31;
-      case 13: return 30;
-      case 14: return 29;
-      case 15: return 27;
-      case 16: return 26;
-      case 17: return 25;
-      case 18: return 24;
-      case 19: return 23;
-      case 20: return 22;
-      case 21: return 21;
-      case 22: return 20;
-      case 23: return 18;
-      case 24: return 15;
-      case 25: return 14;
-      case 26: return 12;
-      case 27: return 10;
-      case 28: return  9;
-      case 29: return  8;
-      case 30: return  7;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for cleric paralyzation saving throw.");
-      }
-    case SAVING_ROD:	/* Rods */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 70;
-      case  2: return 69;
-      case  3: return 68;
-      case  4: return 66;
-      case  5: return 65;
-      case  6: return 63;
-      case  7: return 60;
-      case  8: return 57;
-      case  9: return 55;
-      case 10: return 54;
-      case 11: return 53;
-      case 12: return 51;
-      case 13: return 50;
-      case 14: return 49;
-      case 15: return 47;
-      case 16: return 46;
-      case 17: return 45;
-      case 18: return 44;
-      case 19: return 43;
-      case 20: return 42;
-      case 21: return 41;
-      case 22: return 40;
-      case 23: return 38;
-      case 24: return 35;
-      case 25: return 34;
-      case 26: return 32;
-      case 27: return 30;
-      case 28: return 29;
-      case 29: return 28;
-      case 30: return 27;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for cleric rod saving throw.");
-      }
-    case SAVING_PETRI:	/* Petrification */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 65;
-      case  2: return 64;
-      case  3: return 63;
-      case  4: return 61;
-      case  5: return 60;
-      case  6: return 58;
-      case  7: return 55;
-      case  8: return 53;
-      case  9: return 50;
-      case 10: return 49;
-      case 11: return 48;
-      case 12: return 46;
-      case 13: return 45;
-      case 14: return 44;
-      case 15: return 43;
-      case 16: return 41;
-      case 17: return 40;
-      case 18: return 39;
-      case 19: return 38;
-      case 20: return 37;
-      case 21: return 36;
-      case 22: return 35;
-      case 23: return 33;
-      case 24: return 31;
-      case 25: return 29;
-      case 26: return 27;
-      case 27: return 25;
-      case 28: return 24;
-      case 29: return 23;
-      case 30: return 22;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for cleric petrification saving throw.");
-      }
-    case SAVING_BREATH:	/* Breath weapons */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 80;
-      case  2: return 79;
-      case  3: return 78;
-      case  4: return 76;
-      case  5: return 75;
-      case  6: return 73;
-      case  7: return 70;
-      case  8: return 67;
-      case  9: return 65;
-      case 10: return 64;
-      case 11: return 63;
-      case 12: return 61;
-      case 13: return 60;
-      case 14: return 59;
-      case 15: return 57;
-      case 16: return 56;
-      case 17: return 55;
-      case 18: return 54;
-      case 19: return 53;
-      case 20: return 52;
-      case 21: return 51;
-      case 22: return 50;
-      case 23: return 48;
-      case 24: return 45;
-      case 25: return 44;
-      case 26: return 42;
-      case 27: return 40;
-      case 28: return 39;
-      case 29: return 38;
-      case 30: return 37;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for cleric breath saving throw.");
-      }
-    case SAVING_SPELL:	/* Generic spells */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 75;
-      case  2: return 74;
-      case  3: return 73;
-      case  4: return 71;
-      case  5: return 70;
-      case  6: return 68;
-      case  7: return 65;
-      case  8: return 63;
-      case  9: return 60;
-      case 10: return 59;
-      case 11: return 58;
-      case 12: return 56;
-      case 13: return 55;
-      case 14: return 54;
-      case 15: return 53;
-      case 16: return 51;
-      case 17: return 50;
-      case 18: return 49;
-      case 19: return 48;
-      case 20: return 47;
-      case 21: return 46;
-      case 22: return 45;
-      case 23: return 43;
-      case 24: return 41;
-      case 25: return 39;
-      case 26: return 37;
-      case 27: return 35;
-      case 28: return 34;
-      case 29: return 33;
-      case 30: return 32;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for cleric spell saving throw.");
-      }
-    default:
-      log("SYSERR: Invalid saving throw type.");
-    }
-    break;
-  case CLASS_THIEF:
-    switch (type) {
-    case SAVING_PARA:	/* Paralyzation */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 65;
-      case  2: return 64;
-      case  3: return 63;
-      case  4: return 62;
-      case  5: return 61;
-      case  6: return 60;
-      case  7: return 59;
-      case  8: return 58;
-      case  9: return 57;
-      case 10: return 56;
-      case 11: return 55;
-      case 12: return 54;
-      case 13: return 53;
-      case 14: return 52;
-      case 15: return 51;
-      case 16: return 50;
-      case 17: return 49;
-      case 18: return 48;
-      case 19: return 47;
-      case 20: return 46;
-      case 21: return 45;
-      case 22: return 44;
-      case 23: return 43;
-      case 24: return 42;
-      case 25: return 41;
-      case 26: return 40;
-      case 27: return 39;
-      case 28: return 38;
-      case 29: return 37;
-      case 30: return 36;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for thief paralyzation saving throw.");
-      }
-    case SAVING_ROD:	/* Rods */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 70;
-      case  2: return 68;
-      case  3: return 66;
-      case  4: return 64;
-      case  5: return 62;
-      case  6: return 60;
-      case  7: return 58;
-      case  8: return 56;
-      case  9: return 54;
-      case 10: return 52;
-      case 11: return 50;
-      case 12: return 48;
-      case 13: return 46;
-      case 14: return 44;
-      case 15: return 42;
-      case 16: return 40;
-      case 17: return 38;
-      case 18: return 36;
-      case 19: return 34;
-      case 20: return 32;
-      case 21: return 30;
-      case 22: return 28;
-      case 23: return 26;
-      case 24: return 24;
-      case 25: return 22;
-      case 26: return 20;
-      case 27: return 18;
-      case 28: return 16;
-      case 29: return 14;
-      case 30: return 13;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for thief rod saving throw.");
-      }
-    case SAVING_PETRI:	/* Petrification */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 60;
-      case  2: return 59;
-      case  3: return 58;
-      case  4: return 58;
-      case  5: return 56;
-      case  6: return 55;
-      case  7: return 54;
-      case  8: return 53;
-      case  9: return 52;
-      case 10: return 51;
-      case 11: return 50;
-      case 12: return 49;
-      case 13: return 48;
-      case 14: return 47;
-      case 15: return 46;
-      case 16: return 45;
-      case 17: return 44;
-      case 18: return 43;
-      case 19: return 42;
-      case 20: return 41;
-      case 21: return 40;
-      case 22: return 39;
-      case 23: return 38;
-      case 24: return 37;
-      case 25: return 36;
-      case 26: return 35;
-      case 27: return 34;
-      case 28: return 33;
-      case 29: return 32;
-      case 30: return 31;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for thief petrification saving throw.");
-      }
-    case SAVING_BREATH:	/* Breath weapons */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 80;
-      case  2: return 79;
-      case  3: return 78;
-      case  4: return 77;
-      case  5: return 76;
-      case  6: return 75;
-      case  7: return 74;
-      case  8: return 73;
-      case  9: return 72;
-      case 10: return 71;
-      case 11: return 70;
-      case 12: return 69;
-      case 13: return 68;
-      case 14: return 67;
-      case 15: return 66;
-      case 16: return 65;
-      case 17: return 64;
-      case 18: return 63;
-      case 19: return 62;
-      case 20: return 61;
-      case 21: return 60;
-      case 22: return 59;
-      case 23: return 58;
-      case 24: return 57;
-      case 25: return 56;
-      case 26: return 55;
-      case 27: return 54;
-      case 28: return 53;
-      case 29: return 52;
-      case 30: return 51;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for thief breath saving throw.");
-      }
-    case SAVING_SPELL:	/* Generic spells */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 75;
-      case  2: return 73;
-      case  3: return 71;
-      case  4: return 69;
-      case  5: return 67;
-      case  6: return 65;
-      case  7: return 63;
-      case  8: return 61;
-      case  9: return 59;
-      case 10: return 57;
-      case 11: return 55;
-      case 12: return 53;
-      case 13: return 51;
-      case 14: return 49;
-      case 15: return 47;
-      case 16: return 45;
-      case 17: return 43;
-      case 18: return 41;
-      case 19: return 39;
-      case 20: return 37;
-      case 21: return 35;
-      case 22: return 33;
-      case 23: return 31;
-      case 24: return 29;
-      case 25: return 27;
-      case 26: return 25;
-      case 27: return 23;
-      case 28: return 21;
-      case 29: return 19;
-      case 30: return 17;
-      case 31: return  0;
-      case 32: return  0;
-      case 33: return  0;
-      case 34: return  0;
-      case 35: return  0;
-      case 36: return  0;
-      case 37: return  0;
-      case 38: return  0;
-      case 39: return  0;
-      case 40: return  0;
-      default:
-	log("SYSERR: Missing level for thief spell saving throw.");
-      }
-    default:
-      log("SYSERR: Invalid saving throw type.");
-    }
-    break;
-  case CLASS_WARRIOR:
-    switch (type) {
-    case SAVING_PARA:	/* Paralyzation */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 70;
-      case  2: return 68;
-      case  3: return 67;
-      case  4: return 65;
-      case  5: return 62;
-      case  6: return 58;
-      case  7: return 55;
-      case  8: return 53;
-      case  9: return 52;
-      case 10: return 50;
-      case 11: return 47;
-      case 12: return 43;
-      case 13: return 40;
-      case 14: return 38;
-      case 15: return 37;
-      case 16: return 35;
-      case 17: return 32;
-      case 18: return 28;
-      case 19: return 25;
-      case 20: return 24;
-      case 21: return 23;
-      case 22: return 22;
-      case 23: return 20;
-      case 24: return 19;
-      case 25: return 17;
-      case 26: return 16;
-      case 27: return 15;
-      case 28: return 14;
-      case 29: return 13;
-      case 30: return 12;
-      case 31: return 11;
-      case 32: return 10;
-      case 33: return  9;
-      case 34: return  8;
-      case 35: return  7;
-      case 36: return  6;
-      case 37: return  5;
-      case 38: return  4;
-      case 39: return  3;
-      case 40: return  2;
-      default:
-	log("SYSERR: Missing level for warrior paralyzation saving throw.");
-      }
-    case SAVING_ROD:	/* Rods */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 80;
-      case  2: return 78;
-      case  3: return 77;
-      case  4: return 75;
-      case  5: return 72;
-      case  6: return 68;
-      case  7: return 65;
-      case  8: return 63;
-      case  9: return 62;
-      case 10: return 60;
-      case 11: return 57;
-      case 12: return 53;
-      case 13: return 50;
-      case 14: return 48;
-      case 15: return 47;
-      case 16: return 45;
-      case 17: return 42;
-      case 18: return 38;
-      case 19: return 35;
-      case 20: return 34;
-      case 21: return 33;
-      case 22: return 32;
-      case 23: return 30;
-      case 24: return 29;
-      case 25: return 27;
-      case 26: return 26;
-      case 27: return 25;
-      case 28: return 24;
-      case 29: return 23;
-      case 30: return 22;
-      case 31: return 20;
-      case 32: return 18;
-      case 33: return 16;
-      case 34: return 14;
-      case 35: return 12;
-      case 36: return 10;
-      case 37: return  8;
-      case 38: return  6;
-      case 39: return  5;
-      case 40: return  4;
-      default:
-	log("SYSERR: Missing level for warrior rod saving throw.");
-      }
-    case SAVING_PETRI:	/* Petrification */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 75;
-      case  2: return 73;
-      case  3: return 72;
-      case  4: return 70;
-      case  5: return 67;
-      case  6: return 63;
-      case  7: return 60;
-      case  8: return 58;
-      case  9: return 57;
-      case 10: return 55;
-      case 11: return 52;
-      case 12: return 48;
-      case 13: return 45;
-      case 14: return 43;
-      case 15: return 42;
-      case 16: return 40;
-      case 17: return 37;
-      case 18: return 33;
-      case 19: return 30;
-      case 20: return 29;
-      case 21: return 28;
-      case 22: return 26;
-      case 23: return 25;
-      case 24: return 24;
-      case 25: return 23;
-      case 26: return 21;
-      case 27: return 20;
-      case 28: return 19;
-      case 29: return 18;
-      case 30: return 17;
-      case 31: return 16;
-      case 32: return 15;
-      case 33: return 14;
-      case 34: return 13;
-      case 35: return 12;
-      case 36: return 11;
-      case 37: return 10;
-      case 38: return  9;
-      case 39: return  8;
-      case 40: return  7;
-      default:
-	log("SYSERR: Missing level for warrior petrification saving throw.");
-      }
-    case SAVING_BREATH:	/* Breath weapons */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 85;
-      case  2: return 83;
-      case  3: return 82;
-      case  4: return 80;
-      case  5: return 75;
-      case  6: return 70;
-      case  7: return 65;
-      case  8: return 63;
-      case  9: return 62;
-      case 10: return 60;
-      case 11: return 55;
-      case 12: return 50;
-      case 13: return 45;
-      case 14: return 43;
-      case 15: return 42;
-      case 16: return 40;
-      case 17: return 37;
-      case 18: return 33;
-      case 19: return 30;
-      case 20: return 29;
-      case 21: return 28;
-      case 22: return 26;
-      case 23: return 25;
-      case 24: return 24;
-      case 25: return 23;
-      case 26: return 21;
-      case 27: return 20;
-      case 28: return 19;
-      case 29: return 18;
-      case 30: return 17;
-      case 31: return 16;
-      case 32: return 15;
-      case 33: return 14;
-      case 34: return 13;
-      case 35: return 12;
-      case 36: return 11;
-      case 37: return 10;
-      case 38: return  9;
-      case 39: return  8;
-      case 40: return  7;
-      default:
-	log("SYSERR: Missing level for warrior breath saving throw.");
-      }
-    case SAVING_SPELL:	/* Generic spells */
-      switch (level) {
-      case  0: return 90;
-      case  1: return 85;
-      case  2: return 83;
-      case  3: return 82;
-      case  4: return 80;
-      case  5: return 77;
-      case  6: return 73;
-      case  7: return 70;
-      case  8: return 68;
-      case  9: return 67;
-      case 10: return 65;
-      case 11: return 62;
-      case 12: return 58;
-      case 13: return 55;
-      case 14: return 53;
-      case 15: return 52;
-      case 16: return 50;
-      case 17: return 47;
-      case 18: return 43;
-      case 19: return 40;
-      case 20: return 39;
-      case 21: return 38;
-      case 22: return 36;
-      case 23: return 35;
-      case 24: return 34;
-      case 25: return 33;
-      case 26: return 31;
-      case 27: return 30;
-      case 28: return 29;
-      case 29: return 28;
-      case 30: return 27;
-      case 31: return 25;
-      case 32: return 23;
-      case 33: return 21;
-      case 34: return 19;
-      case 35: return 17;
-      case 36: return 15;
-      case 37: return 13;
-      case 38: return 11;
-      case 39: return  9;
-      case 40: return  7;
-      default:
-	log("SYSERR: Missing level for warrior spell saving throw.");
-      }
-    default:
-      log("SYSERR: Invalid saving throw type.");
-    }
-  default:
-    log("SYSERR: Invalid class saving throw.");
-  }
-
-  /* Should not get here unless something is wrong. */
-  return 100;
+  float mod;
+  
+  mod = (saving_throw_improve[class_num][type] / 10.0) * (level - 1);
+  
+  return (saving_throw_base[class_num][type] + mod);
 }
 
 /* THAC0 for classes and levels.  (To Hit Armor Class 0) */
 int thaco(int class_num, int level)
 {
-  switch (class_num) {
-  case CLASS_MAGIC_USER:
-    switch (level) {
-    case  0: return 100;
-    case  1: return  20;
-    case  2: return  20;
-    case  3: return  20;
-    case  4: return  19;
-    case  5: return  19;
-    case  6: return  19;
-    case  7: return  18;
-    case  8: return  18;
-    case  9: return  18;
-    case 10: return  17;
-    case 11: return  17;
-    case 12: return  17;
-    case 13: return  16;
-    case 14: return  16;
-    case 15: return  16;
-    case 16: return  15;
-    case 17: return  15;
-    case 18: return  15;
-    case 19: return  14;
-    case 20: return  14;
-    case 21: return  14;
-    case 22: return  13;
-    case 23: return  13;
-    case 24: return  13;
-    case 25: return  12;
-    case 26: return  12;
-    case 27: return  12;
-    case 28: return  11;
-    case 29: return  11;
-    case 30: return  11;
-    case 31: return  10;
-    case 32: return  10;
-    case 33: return  10;
-    case 34: return   9;
-    default:
-      log("SYSERR: Missing level for mage thac0.");
-    }
-  case CLASS_CLERIC:
-    switch (level) {
-    case  0: return 100;
-    case  1: return  20;
-    case  2: return  20;
-    case  3: return  20;
-    case  4: return  18;
-    case  5: return  18;
-    case  6: return  18;
-    case  7: return  16;
-    case  8: return  16;
-    case  9: return  16;
-    case 10: return  14;
-    case 11: return  14;
-    case 12: return  14;
-    case 13: return  12;
-    case 14: return  12;
-    case 15: return  12;
-    case 16: return  10;
-    case 17: return  10;
-    case 18: return  10;
-    case 19: return   8;
-    case 20: return   8;
-    case 21: return   8;
-    case 22: return   6;
-    case 23: return   6;
-    case 24: return   6;
-    case 25: return   4;
-    case 26: return   4;
-    case 27: return   4;
-    case 28: return   2;
-    case 29: return   2;
-    case 30: return   2;
-    case 31: return   1;
-    case 32: return   1;
-    case 33: return   1;
-    case 34: return   1;
+  t = 100; /* Default THAC0 */
+  
+  if (level > 0) {
+    switch (class_num) {
+    case CLASS_MAGIC_USER: t = 20 - ((level - 1) / 3);       break;
+    case CLASS_CLERIC:     t = 20 - (((level - 1) / 3) * 2); break;
+    case CLASS_THIEF:      t = 20 - ((level - 1) / 2);       break;
+    case CLASS_WARRIOR:    t = 20 - (level - 1);             break;
     default:
-      log("SYSERR: Missing level for cleric thac0.");
+      log("SYSERR: Unknown class in thac0 chart.");
     }
-  case CLASS_THIEF:
-    switch (level) {
-    case  0: return 100;
-    case  1: return  20;
-    case  2: return  20;
-    case  3: return  19;
-    case  4: return  19;
-    case  5: return  18;
-    case  6: return  18;
-    case  7: return  17;
-    case  8: return  17;
-    case  9: return  16;
-    case 10: return  16;
-    case 11: return  15;
-    case 12: return  15;
-    case 13: return  14;
-    case 14: return  14;
-    case 15: return  13;
-    case 16: return  13;
-    case 17: return  12;
-    case 18: return  12;
-    case 19: return  11;
-    case 20: return  11;
-    case 21: return  10;
-    case 22: return  10;
-    case 23: return   9;
-    case 24: return   9;
-    case 25: return   8;
-    case 26: return   8;
-    case 27: return   7;
-    case 28: return   7;
-    case 29: return   6;
-    case 30: return   6;
-    case 31: return   5;
-    case 32: return   5;
-    case 33: return   4;
-    case 34: return   4;
-    default:
-      log("SYSERR: Missing level for thief thac0.");
-    }
-  case CLASS_WARRIOR:
-    switch (level) {
-    case  0: return 100;
-    case  1: return  20;
-    case  2: return  19;
-    case  3: return  18;
-    case  4: return  17;
-    case  5: return  16;
-    case  6: return  15;
-    case  7: return  14;
-    case  8: return  14;
-    case  9: return  13;
-    case 10: return  12;
-    case 11: return  11;
-    case 12: return  10;
-    case 13: return   9;
-    case 14: return   8;
-    case 15: return   7;
-    case 16: return   6;
-    case 17: return   5;
-    case 18: return   4;
-    case 19: return   3;
-    case 20: return   2;
-    case 21: return   1;
-    case 22: return   1;
-    case 23: return   1;
-    case 24: return   1;
-    case 25: return   1;
-    case 26: return   1;
-    case 27: return   1;
-    case 28: return   1;
-    case 29: return   1;
-    case 30: return   1;
-    case 31: return   1;
-    case 32: return   1;
-    case 33: return   1;
-    case 34: return   1;
-    default:
-      log("SYSERR: Missing level for warrior thac0.");
-    }
-  default:
-    log("SYSERR: Unknown class in thac0 chart.");
   }
-
-  /* Will not get there unless something is wrong. */
-  return 100;
+  
+  if (t < 1) /* Nobody can have a THAC0 better than 1! */
+    t = 1;
+    
+  return (t);
 }
 
 
