src/hcode/btech/pcombat.c

Go to the documentation of this file.
00001 /*
00002  * Author: Markus Stenberg <fingon@iki.fi>
00003  *
00004  *  Copyright (c) 1997 Markus Stenberg
00005  *  Copyright (c) 1998-2002 Thomas Wouters
00006  *  Copyright (c) 2000-2002 Cord Awtry 
00007  *       All rights reserved
00008  */
00009 
00010 #include "mech.h"
00011 
00012 static struct {
00013         char *name;
00014         int loc;
00015         int loci;
00016         int deft;
00017         int defmin;
00018         int defpros;
00019         int defmax;
00020 } Armors[] = {
00021         {
00022         "Helmet", HEAD, 1, PC_IMPA | PC_HEAT, 10, 30, 30}, {
00023         "Combat Helmet", HEAD, 2, PC_IMPA | PC_SHAR | PC_HEAT, 20, 50, 60}, {
00024         "Gloves", RARM, 1, PC_SHAR | PC_HEAT, 10, 30, 20}, {
00025         "Combat Gloves", RARM, 2, PC_SHAR | PC_HEAT | PC_IMPA, 20, 50, 60}, {
00026         "Boots", RLEG, 1, PC_SHAR | PC_IMPA, 20, 40, 50}, {
00027         "Combat Boots", RLEG, 2, PC_SHAR | PC_IMPA | PC_HEAT, 40, 50, 100}, {
00028         "Flak Vest", CTORSO, 1, PC_SHAR, 20, 30, 60}, {
00029         "Abrasive Vest", CTORSO, 2, PC_IMPA | PC_HEAT, 30, 40, 80}, {
00030         "Combat Vest", CTORSO, 3, PC_IMPA | PC_HEAT | PC_SHAR, 40, 50, 100}, {
00031         "Flak Armorplate", CTORSO, 4, PC_SHAR, 40, 50, 80}, {
00032         "Abrasive Armorplate", CTORSO, 5, PC_IMPA | PC_HEAT, 40, 50, 80}, {
00033         "Combat Armorplate", CTORSO, 6, PC_IMPA | PC_SHAR | PC_HEAT, 50,
00034                         50, 120}, {
00035         "DEST Armor", CTORSO, 7, PC_IMPA | PC_SHAR | PC_HEAT, 50, 70, 120}, {
00036         "Black Robes", CTORSO, 8, PC_IMPA | PC_SHAR | PC_HEAT, 60, 80, 140}, {
00037         NULL, -1, -1, 0, 0, 0, 0}
00038 };
00039 
00040 int pc_to_dam_conversion(MECH * target, int weapindx, int dam)
00041 {
00042         int i = 0;
00043 
00044         if(MechType(target) == CLASS_MW)
00045                 return dam;
00046         if(weapindx < 0 || !(MechWeapons[weapindx].special & PCOMBAT))
00047                 return dam;
00048         i = dam / 100;
00049         dam = dam % 100;
00050         if(Number(1, 100) <= dam)
00051                 i++;
00052         return i;
00053 }
00054 
00055 int dam_to_pc_conversion(MECH * target, int weapindx, int dam)
00056 {
00057         int i = 0, j;
00058 
00059         if(weapindx >= 0 && MechWeapons[weapindx].special & PCOMBAT)
00060                 return dam;
00061         if(MechType(target) != CLASS_MW)
00062                 return dam;
00063         /* Target is MW _and_ we have yet to convert damage */
00064         for(j = 0; j < dam; j++)
00065                 i += Number(80, 130);
00066         return i;
00067 }
00068 
00069 static int pcombat_hitloc(int loc)
00070 {
00071         switch (loc) {
00072         case LTORSO:
00073         case RTORSO:
00074                 return CTORSO;
00075         case LARM:
00076                 return RARM;
00077         case LLEG:
00078                 return RLEG;
00079         }
00080         return loc;
00081 }
00082 
00083 int armor_effect(MECH * wounded, int cause, int hitloc, int intDamage, int id)
00084 {
00085         int i;
00086         int block;
00087         int noblock = 0;
00088 
00089         if(id != -2)
00090                 intDamage = (intDamage * Number(75, 125)) / 100;
00091         if(MechType(wounded) != CLASS_MW)
00092                 return intDamage;
00093         hitloc = pcombat_hitloc(hitloc);
00094         if(!GetSectArmor(wounded, hitloc))
00095                 return intDamage;
00096         for(i = 0; Armors[i].name; i++)
00097                 if(Armors[i].loc == hitloc &&
00098                    Armors[i].loci == GetSectArmor(wounded, hitloc))
00099                         break;
00100         if(Number(1, 5) == 1) {
00101                 if(Number(1, 2) == 1)
00102                         intDamage = intDamage * 2;
00103                 else
00104                         noblock = 1;
00105         } else if(Number(1, 10) == 2)
00106                 intDamage = intDamage / 2;
00107         if(!Armors[i].name)
00108                 return intDamage;
00109         if(cause >= 0 &&
00110            !((Armors[i].deft) & (MechWeapons[cause].special & PCOMBAT)) &&
00111            (MechWeapons[cause].special & PCOMBAT))
00112                 return intDamage;
00113         block =
00114                 BOUNDED(Number(1, (Armors[i].defmin / 2)),
00115                                 abs(intDamage * Armors[i].defpros / 100),
00116                                 Armors[i].defmax / 2);
00117         if(noblock)
00118                 block = 0;
00119         if(abs(intDamage) < block) {
00120                 mech_printf(wounded, MECHALL, "Your armor blocks all of the damage!");
00121                 return 0;
00122         }
00123         if(block) {
00124                 mech_printf(wounded, MECHALL,
00125                                         "Armor blocks %d points of the damage!", block);
00126         }
00127         return (abs(intDamage) - block) * intDamage / abs(intDamage);
00128 }

Generated on Mon May 28 04:25:24 2007 for BattletechMUX by  doxygen 1.4.7