home *** CD-ROM | disk | FTP | other *** search
/ Launch & Play / spustahrej2.iso / Egoboo / code / enchant.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-12-03  |  83.7 KB  |  2,115 lines

  1. // enchant.c
  2.  
  3. // Egoboo, Copyright (C) 2000 Aaron Bishop
  4.  
  5. #include "egoboo.h"
  6.  
  7. //--------------------------------------------------------------------------------------------
  8. void do_enchant_spawn()
  9. {
  10.     // ZZ> This function lets enchantments spawn particles
  11.     int cnt, tnc;
  12.     unsigned short facing, particle, eve, character;
  13.  
  14.  
  15.     cnt = 0;
  16.     while(cnt < MAXENCHANT)
  17.     {
  18.         if(encon[cnt])
  19.         {
  20.             eve = enceve[cnt];
  21.             if(evecontspawnamount[eve]>0)
  22.             {
  23.                 encspawntime[cnt]--;
  24.                 if(encspawntime[cnt] == 0)
  25.                 {
  26.                     character = enctarget[cnt];
  27.                     encspawntime[cnt] = evecontspawntime[eve];
  28.                     facing = chrturnleftright[character];
  29.                     tnc = 0;
  30.                     while(tnc < evecontspawnamount[eve])
  31.                     {
  32.                         particle = spawn_one_particle(chrxpos[character], chrypos[character], chrzpos[character],
  33.                                            facing, eve, evecontspawnpip[eve],
  34.                                            MAXCHR, SPAWNLAST, chrteam[encowner[cnt]], encowner[cnt], tnc, MAXCHR);
  35.                         facing+=evecontspawnfacingadd[eve];
  36.                         tnc++;
  37.                     }
  38.                 }
  39.             }
  40.         }
  41.         cnt++;
  42.     }
  43. }
  44.  
  45.  
  46. //--------------------------------------------------------------------------------------------
  47. void disenchant_character(unsigned short cnt)
  48. {
  49.     // ZZ> This function removes all enchantments from a character
  50.     while(chrfirstenchant[cnt] != MAXENCHANT)
  51.     {
  52.         remove_enchant(chrfirstenchant[cnt]);
  53.     }
  54. }
  55.  
  56. //char.c
  57. //--------------------------------------------------------------------------------------------
  58. void damage_character(unsigned short character, unsigned short direction,
  59.     int damagebase, int damagerand, unsigned char damagetype, unsigned char team,
  60.     unsigned short attacker, unsigned short effects)
  61. {
  62.     // ZZ> This function calculates and applies damage to a character.  It also
  63.     //     sets alerts and begins actions.  Blocking and frame invincibility
  64.     //     are done here too.  Direction is 0 if the attack is coming head on,
  65.     //     16384 if from the right, 32768 if from the back, 49152 if from the
  66.     //     left.
  67.     int tnc;
  68.     unsigned short action;
  69.     int damage, basedamage;
  70.     unsigned short experience, model, left, right;
  71.  
  72.  
  73.     if(chralive[character] && damagebase>=0 && damagerand>=1)
  74.     {
  75.         // Lessen damage for resistance, 0 = Weakness, 1 = Normal, 2 = Resist, 3 = Big Resist
  76.         // This can also be used to lessen effectiveness of healing
  77.         damage = damagebase+(rand()%damagerand);
  78.         basedamage = damage;
  79.         damage = damage>>(chrdamagemodifier[character][damagetype]&DAMAGESHIFT);
  80.  
  81.  
  82.         // Allow charging
  83.         if(chrdamagemodifier[character][damagetype]&DAMAGECHARGE)
  84.         {
  85.             chrmana[character] += damage;
  86.             if(chrmana[character] > chrmanamax[character])
  87.             {
  88.                 chrmana[character] = chrmanamax[character];
  89.             }
  90.             return;
  91.         }
  92.  
  93.  
  94.         // Invert damage to heal
  95.         if(chrdamagemodifier[character][damagetype]&DAMAGEINVERT)
  96.             damage=-damage;
  97.  
  98.  
  99.         // Remember the damage type
  100.         chrdamagetypelast[character] = damagetype;
  101.         chrdirectionlast[character] = direction;
  102.  
  103.  
  104.         // Do it already
  105.         if(damage > 0)
  106.         {
  107.             // Only damage if not invincible
  108.             if(chrdamagetime[character]==0 && chrinvictus[character]==FALSE)
  109.             {
  110.                 model = chrmodel[character];
  111.                 if((effects&DAMFXBLOC)==FALSE)
  112.                 {
  113.                     // Only damage if hitting from proper direction
  114.                     if(madframefx[chrframe[character]]&MADFXINVICTUS)
  115.                     {
  116.                         // I Frame...
  117.                         direction -= capiframefacing[model];
  118.                         left = (~capiframeangle[model]);
  119.                         right = capiframeangle[model];
  120.                         // Check for shield
  121.                         if(chraction[character] >= ACTIONPA && chraction[character] <= ACTIONPD)
  122.                         {
  123.                             // Using a shield?
  124.                             if(chraction[character] < ACTIONPC)
  125.                             {
  126.                                 // Check left hand
  127.                                 if(chrholdingwhich[character][0] != MAXCHR)
  128.                                 {
  129.                                     left = (~capiframeangle[chrmodel[chrholdingwhich[character][0]]]);
  130.                                     right = capiframeangle[chrmodel[chrholdingwhich[character][0]]];
  131.                                 }
  132.                             }
  133.                             else
  134.                             {
  135.                                 // Check right hand
  136.                                 if(chrholdingwhich[character][1] != MAXCHR)
  137.                                 {
  138.                                     left = (~capiframeangle[chrmodel[chrholdingwhich[character][1]]]);
  139.                                     right = capiframeangle[chrmodel[chrholdingwhich[character][1]]];
  140.                                 }
  141.                             }
  142.                         }
  143.                     }
  144.                     else
  145.                     {
  146.                         // N Frame
  147.                         direction -= capnframefacing[model];
  148.                         left = (~capnframeangle[model]);
  149.                         right = capnframeangle[model];
  150.                     }
  151.                     // Check that direction
  152.                     if(direction > left || direction < right)
  153.                     {
  154.                         damage = 0;
  155.                     }
  156.                 }
  157.  
  158.  
  159.  
  160.                 if(damage!=0)
  161.                 {
  162.                     if(effects&DAMFXARMO)
  163.                     {
  164.                         chrlife[character]-=damage;
  165.                     }
  166.                     else
  167.                     {
  168.                         chrlife[character]-=((damage*chrdefense[character])>>8);
  169.                     }
  170.  
  171.  
  172.                     if(basedamage > MINDAMAGE)
  173.                     {
  174.                         // Call for help if below 1/2 life
  175.                         if(chrlife[character] < (chrlifemax[character]>>1))
  176.                             call_for_help(character);
  177.                         // Spawn blood particles
  178.                         if(capbloodvalid[model] && (damagetype < DAMAGEHOLY || capbloodvalid[model]==ULTRABLOODY))
  179.                         {
  180.                             spawn_one_particle(chrxpos[character], chrypos[character], chrzpos[character],
  181.                                    chrturnleftright[character]+direction, chrmodel[character], capbloodprttype[model],
  182.                                    MAXCHR, SPAWNLAST, chrteam[character], character, 0, MAXCHR);
  183.                         }
  184.                         // Set attack alert if it wasn't an accident
  185.                         if(team == DAMAGETEAM)
  186.                         {
  187.                             chrattacklast[character] = MAXCHR;
  188.                         }
  189.                         else
  190.                         {
  191.                             // Don't alert the character too much if under constant fire
  192.                             if(chrcarefultime[character] == 0)
  193.                             {
  194.                                 // Don't let characters chase themselves...  That would be silly
  195.                                 if(attacker != character)
  196.                                 {
  197.                                     chralert[character] = chralert[character]|ALERTIFATTACKED;
  198.                                     chrattacklast[character] = attacker;
  199.                                     chrcarefultime[character] = CAREFULTIME;
  200.                                 }
  201.                             }
  202.                         }
  203.                     }
  204.  
  205.  
  206.                     // Taking damage action
  207.                     action = ACTIONHA;
  208.                     if(chrlife[character] < 0)
  209.                     {
  210.                         // Character has died
  211.                         chralive[character] = FALSE;
  212.                         disenchant_character(character);
  213.                         chrwaskilled[character] = TRUE;
  214.                         chrkeepaction[character] = TRUE;
  215.                         chrlife[character] = -1;
  216.                         chrplatform[character] = TRUE;
  217.                         chrbumpdampen[character] = chrbumpdampen[character]/2.0;
  218.                         action = ACTIONKA;
  219.                         // Give kill experience
  220.                         experience = capexperienceworth[model]+(chrexperience[character]*capexperienceexchange[model]);
  221.                         if(attacker < MAXCHR)
  222.                         {
  223.                             // Set target
  224.                             chraitarget[character] = attacker;
  225.                             if(team == DAMAGETEAM)  chraitarget[character] = character;
  226.                             if(team == NULLTEAM)  chraitarget[character] = character;
  227.                             // Award direct kill experience
  228.                             if(teamhatesteam[chrteam[attacker]][chrteam[character]])
  229.                             {
  230.                                 give_experience(attacker, experience, XPKILLENEMY);
  231.                             }
  232.                             // Check for hated
  233.                             if(capidsz[chrmodel[attacker]][IDSZHATE]==capidsz[model][IDSZPARENT] ||
  234.                                capidsz[chrmodel[attacker]][IDSZHATE]==capidsz[model][IDSZTYPE])
  235.                             {
  236.                                 give_experience(attacker, experience, XPKILLHATED);
  237.                             }
  238.                         }
  239.                         // Clear all shop passages that it owned...
  240.                         tnc = 0;
  241.                         while(tnc < numshoppassage)
  242.                         {
  243.                             if(shopowner[tnc] == character)
  244.                             {
  245.                                 shopowner[tnc] = NOOWNER;
  246.                             }
  247.                             tnc++;
  248.                         }
  249.                         // Let the other characters know it died
  250.                         tnc = 0;
  251.                         while(tnc < MAXCHR)
  252.                         {
  253.                             if(chron[tnc] && chralive[tnc])
  254.                             {
  255.                                 if(chraitarget[tnc] == character)
  256.                                 {
  257.                                     chralert[tnc] = chralert[tnc]|ALERTIFTARGETKILLED;
  258.                                 }
  259.                                 if((teamhatesteam[chrteam[tnc]][team]==FALSE)&&(teamhatesteam[chrteam[tnc]][chrteam[character]]==TRUE))
  260.                                 {
  261.                                     // All allies get team experience, but only if they also hate the dead guy's team
  262.                                     give_experience(tnc, experience, XPTEAMKILL);
  263.                                 }
  264.                             }
  265.                             tnc++;
  266.                         }
  267.                         // Check if it was a leader
  268.                         if(teamleader[chrteam[character]]==character)
  269.                         {
  270.                             // It was a leader, so set more alerts
  271.                             tnc = 0;
  272.                             while(tnc < MAXCHR)
  273.                             {
  274.                                 if(chron[tnc]&&chrteam[tnc]==chrteam[character])
  275.                                 {
  276.                                     // All folks on the leaders team get the alert
  277.                                     chralert[tnc] = chralert[tnc]|ALERTIFLEADERKILLED;
  278.                                 }
  279.                                 tnc++;
  280.                             }
  281.                             // The team now has no leader
  282.                             teamleader[chrteam[character]] = NOLEADER;
  283.                         }
  284.                         detach_character_from_mount(character, TRUE, FALSE);
  285.                         action+=(rand()&3);
  286.                         play_action(character, action, FALSE);
  287.                         // Turn off all sounds if it's a player
  288.                         if(chrisplayer[character])
  289.                         {
  290.                             tnc = 0;
  291.                             while(tnc < MAXWAVE)
  292.                             {
  293.                                 stop_sound(capwaveindex[chrmodel[character]][tnc]);
  294.                                 tnc++;
  295.                             }
  296.                         }
  297.                         // Afford it one last thought if it's an AI
  298.                         teammorale[chrbaseteam[character]]--;
  299.                         chrteam[character] = chrbaseteam[character];
  300.                         chralert[character] = ALERTIFKILLED;
  301.                         chrsparkle[character] = NOSPARKLE;
  302.                         chraitime[character] = 1;  // No timeout...
  303.                         let_character_think(character);
  304.                     }
  305.                     else
  306.                     {
  307.                         if(basedamage > MINDAMAGE)
  308.                         {
  309.                             action+=(rand()&3);
  310.                             play_action(character, action, FALSE);
  311.                             // Make the character invincible for a limited time only
  312.                             if(!(effects & DAMFXTIME))
  313.                                 chrdamagetime[character] = DAMAGETIME;
  314.                         }
  315.                     }
  316.                 }
  317.                 else
  318.                 {
  319.                     // Spawn a defend particle
  320.                     spawn_one_particle(chrxpos[character], chrypos[character], chrzpos[character], chrturnleftright[character], MAXMODEL, DEFEND, MAXCHR, SPAWNLAST, NULLTEAM, MAXCHR, 0, MAXCHR);
  321.                     chrdamagetime[character] = DEFENDTIME;
  322.                     chralert[character] = chralert[character]|ALERTIFBLOCKED;
  323.                 }
  324.             }
  325.         }
  326.         else if(damage < 0)
  327.         {
  328.             chrlife[character]-=damage;
  329.             if(chrlife[character] > chrlifemax[character])  chrlife[character] = chrlifemax[character];
  330.  
  331.             // Isssue an alert
  332.             chralert[character] = chralert[character]|ALERTIFHEALED;
  333.             chrattacklast[character] = attacker;
  334.             if(team != DAMAGETEAM)
  335.             {
  336.                 chrattacklast[character] = MAXCHR;
  337.             }
  338.         }
  339.     }
  340. }
  341.  
  342. //--------------------------------------------------------------------------------------------
  343. void kill_character(unsigned short character, unsigned short killer)
  344. {
  345.     // ZZ> This function kills a character...  MAXCHR killer for accidental death
  346.     unsigned char modifier;
  347.  
  348.     if(chralive[character])
  349.     {
  350.         chrdamagetime[character] = 0;
  351.         chrlife[character] = 1;
  352.         modifier = chrdamagemodifier[character][DAMAGECRUSH];
  353.         chrdamagemodifier[character][DAMAGECRUSH] = 1;
  354.         if(killer != MAXCHR)
  355.         {
  356.             damage_character(character, 0, 512, 1, DAMAGECRUSH, chrteam[killer], killer, DAMFXARMO|DAMFXBLOC);
  357.         }
  358.         else
  359.         {
  360.             damage_character(character, 0, 512, 1, DAMAGECRUSH, DAMAGETEAM, chrbumplast[character], DAMFXARMO|DAMFXBLOC);
  361.         }
  362.         chrdamagemodifier[character][DAMAGECRUSH] = modifier;
  363.     }
  364. }
  365.  
  366. //--------------------------------------------------------------------------------------------
  367. void spawn_poof(unsigned short character, unsigned short profile)
  368. {
  369.     // ZZ> This function spawns a character poof
  370.     unsigned short sTmp;
  371.     unsigned short origin;
  372.     int iTmp;
  373.  
  374.  
  375.     sTmp = chrturnleftright[character];
  376.     iTmp = 0;
  377.     origin = chraiowner[character];
  378.     while(iTmp < capgopoofprtamount[profile])
  379.     {
  380.         spawn_one_particle(chroldx[character], chroldy[character], chroldz[character],
  381.             sTmp, profile, capgopoofprttype[profile],
  382.             MAXCHR, SPAWNLAST, chrteam[character], origin, iTmp, MAXCHR);
  383.         sTmp+=capgopoofprtfacingadd[profile];
  384.         iTmp++;
  385.     }
  386. }
  387.  
  388. //--------------------------------------------------------------------------------------------
  389. void naming_names(int profile)
  390. {
  391.     // ZZ> This function generates a random name
  392.     int read, write, section, mychop;
  393.     char cTmp;
  394.  
  395.     if(capsectionsize[profile][0] == 0)
  396.     {
  397.         namingnames[0] = 'B';
  398.         namingnames[1] = 'l';
  399.         namingnames[2] = 'a';
  400.         namingnames[3] = 'h';
  401.         namingnames[4] = 0;
  402.     }
  403.     else
  404.     {
  405.         write = 0;
  406.         section = 0;
  407.         while(section < MAXSECTION)
  408.         {
  409.             if(capsectionsize[profile][section] != 0)
  410.             {
  411.                 mychop = capsectionstart[profile][section] + (rand()%capsectionsize[profile][section]);
  412.                 read = chopstart[mychop];
  413.                 cTmp = chopdata[read];
  414.                 while(cTmp != 0 && write < MAXCAPNAMESIZE-1)
  415.                 {
  416.                     namingnames[write]=cTmp;
  417.                     write++;
  418.                     read++;
  419.                     cTmp = chopdata[read];
  420.                 }
  421.             }
  422.             section++;
  423.         }        
  424.         if(write >= MAXCAPNAMESIZE) write = MAXCAPNAMESIZE-1;
  425.         namingnames[write] = 0;
  426.     }
  427. }
  428.  
  429. //--------------------------------------------------------------------------------------------
  430. void read_naming(int profile, char *szLoadname)
  431. {
  432.     // ZZ> This function reads a naming file
  433.     FILE *fileread;
  434.     int section, chopinsection, cnt;
  435.     char mychop[32], cTmp;
  436.  
  437.     fileread = fopen(szLoadname, "r");
  438.     if(fileread)
  439.     {
  440.         section = 0;
  441.         chopinsection = 0;
  442.         while(goto_colon_yesno(fileread) && section < MAXSECTION)
  443.         {
  444.             fscanf(fileread, "%s", mychop);
  445.             if(mychop[0] != 'S' || mychop[1] != 'T' || mychop[2] != 'O' || mychop[3] != 'P')
  446.             {
  447.                 if(chopwrite >= CHOPDATACHUNK)  chopwrite = CHOPDATACHUNK-1;
  448.                 chopstart[numchop] = chopwrite;
  449.                 cnt = 0;
  450.                 cTmp = mychop[0];
  451.                 while(cTmp != 0 && cnt < 31 && chopwrite < CHOPDATACHUNK)
  452.                 {
  453.                     if(cTmp == '_') cTmp = ' ';
  454.                     chopdata[chopwrite]=cTmp;
  455.                     cnt++;
  456.                     chopwrite++;
  457.                     cTmp = mychop[cnt];
  458.                 }
  459.                 if(chopwrite >= CHOPDATACHUNK)  chopwrite = CHOPDATACHUNK-1;
  460.                 chopdata[chopwrite]=0;  chopwrite++;
  461.                 chopinsection++;
  462.                 numchop++;
  463.             }
  464.             else
  465.             {
  466.                 capsectionsize[profile][section] = chopinsection;
  467.                 capsectionstart[profile][section] = numchop-chopinsection;
  468.                 section++;
  469.                 chopinsection = 0;
  470.             }
  471.         }
  472.         fclose(fileread);
  473.     }
  474. }
  475.  
  476. //--------------------------------------------------------------------------------------------
  477. void prime_names(void)
  478. {
  479.     // ZZ> This function prepares the name chopper for use
  480.     int cnt, tnc;
  481.  
  482.     numchop = 0;
  483.     chopwrite = 0;
  484.     cnt = 0;
  485.     while(cnt < MAXMODEL)
  486.     {
  487.         tnc = 0;
  488.         while(tnc < MAXSECTION)
  489.         {
  490.             capsectionstart[cnt][tnc] = MAXCHOP;
  491.             capsectionsize[cnt][tnc] = 0;
  492.             tnc++;
  493.         }
  494.         cnt++;
  495.     }
  496. }
  497.  
  498. //--------------------------------------------------------------------------------------------
  499. void tilt_characters_to_terrain()
  500. {
  501.     // ZZ> This function sets all of the character's starting tilt values
  502.     int cnt;
  503.     unsigned char twist;
  504.  
  505.     cnt = 0;
  506.     while(cnt < MAXCHR)
  507.     {
  508.         if(chrstickybutt[cnt]&&chron[cnt])
  509.         {
  510.             twist = meshtwist[chronwhichfan[cnt]];
  511.             chrturnmaplr[cnt] = maplrtwist[twist];
  512.             chrturnmapud[cnt] = mapudtwist[twist];
  513.         }
  514.         cnt++;
  515.     }
  516. }
  517.  
  518. //--------------------------------------------------------------------------------------------
  519. int spawn_one_character(float x, float y, float z, int profile, unsigned char team,
  520.   unsigned char skin, unsigned short facing, char *name, int override)
  521. {
  522.     // ZZ> This function spawns a character and returns the character's index number
  523.     //     if it worked, MAXCHR otherwise
  524.     int cnt, tnc, ix, iy;
  525.  
  526.  
  527.     // Make sure the team is valid
  528.     if(team > MAXTEAM-1)
  529.         team = MAXTEAM-1;
  530.  
  531.  
  532.     // Get a new character
  533.     cnt = MAXCHR;
  534.     if(madused[profile])
  535.     {
  536.         if(override < MAXCHR)
  537.         {
  538.             cnt = get_free_character();
  539.             if(cnt != override)
  540.             {
  541.                 // Picked the wrong one, so put this one back and find the right one
  542.                 tnc = 0;
  543.                 while(tnc < MAXCHR)
  544.                 {
  545.                     if(freechrlist[tnc] == override)
  546.                     {
  547.                         freechrlist[tnc] = cnt;
  548.                         tnc = MAXCHR;
  549.                     }
  550.                     tnc++;
  551.                 }
  552.                 cnt = override;
  553.             }
  554.         }
  555.         else
  556.         {
  557.             cnt = get_free_character();
  558.         }
  559.         if(cnt != MAXCHR)
  560.         {
  561.             // IMPORTANT!!!
  562.             chrindolist[cnt] = FALSE;
  563.             chrisequipped[cnt] = FALSE;
  564.             chrsparkle[cnt] = NOSPARKLE;
  565.             chroverlay[cnt] = FALSE;
  566.             chrmissilehandler[cnt] = cnt;
  567.  
  568.             // SetXY stuff...  Just in case
  569.             tnc = 0;
  570.             while(tnc < MAXSTOR)
  571.             {
  572.                 chraix[cnt][tnc] = 0;
  573.                 chraiy[cnt][tnc] = 0;
  574.                 tnc++;
  575.             }
  576.  
  577.             // RTS Speech stuff...  Turn all off
  578.             tnc = 0;
  579.             while(tnc < MAXSPEECH)
  580.             {
  581.                 chrwavespeech[cnt][tnc] = -1;
  582.                 tnc++;
  583.             }
  584.  
  585.             // Set up model stuff
  586.             chron[cnt] = TRUE;
  587.             chrreloadtime[cnt] = 0;
  588.             chrinwhichhand[cnt] = GRIPLEFT;
  589.             chrwaskilled[cnt] = FALSE;
  590.             chrinpack[cnt] = FALSE;
  591.             chrnextinpack[cnt] = MAXCHR;
  592.             chrnuminpack[cnt] = 0;
  593.             chrmodel[cnt] = profile;
  594.             chrbasemodel[cnt] = profile;
  595.             chrstoppedby[cnt] = capstoppedby[profile];
  596.             chrlifeheal[cnt] = caplifeheal[profile];
  597.             chrmanacost[cnt] = capmanacost[profile];
  598.             chrinwater[cnt] = FALSE;
  599.             chrnameknown[cnt] = capnameknown[profile];
  600.             chrammoknown[cnt] = capnameknown[profile];
  601.             chrhitready[cnt] = TRUE;
  602.             chrboretime[cnt] = BORETIME;
  603.             chrcarefultime[cnt] = CAREFULTIME;
  604.             chrcanbecrushed[cnt] = FALSE;
  605.             chrdamageboost[cnt] = 0;
  606.             chricon[cnt] = capicon[profile];
  607.  
  608.  
  609.             // Enchant stuff
  610.             chrfirstenchant[cnt] = MAXENCHANT;
  611.             chrundoenchant[cnt] = MAXENCHANT;
  612.             chrcanseeinvisible[cnt] = capcanseeinvisible[profile];
  613.             chrcanseekurse[cnt] = capcanseekurse[profile];
  614.             chrcanchannel[cnt] = FALSE;
  615.             chrmissiletreatment[cnt] = MISNORMAL;
  616.             chrmissilecost[cnt] = 0;
  617.  
  618.  
  619.             // Kurse state
  620.             chriskursed[cnt] = ((rand()%100) < capkursechance[profile]);
  621.             if(capisitem[profile]==FALSE)  chriskursed[cnt] = FALSE;
  622.  
  623.  
  624.             // Ammo
  625.             chrammomax[cnt] = capammomax[profile];
  626.             chrammo[cnt] = capammo[profile];
  627.  
  628.  
  629.             // Gender
  630.             chrgender[cnt] = capgender[profile];
  631.             if(chrgender[cnt] == GENRANDOM)  chrgender[cnt] = GENFEMALE+(rand()&1);
  632.  
  633.  
  634.  
  635.             // Team stuff
  636.             chrteam[cnt] = team;
  637.             chrbaseteam[cnt] = team;
  638.             chrcounter[cnt] = teammorale[team];
  639.             if(capinvictus[profile]==FALSE)  teammorale[team]++;
  640.             chrorder[cnt] = 0;
  641.             // Firstborn becomes the leader
  642.             if(teamleader[team]==NOLEADER)
  643.             {
  644.                 teamleader[team] = cnt;
  645.             }
  646.             // Skin
  647.             if(capskinoverride[profile]!=NOSKINOVERRIDE)
  648.             {
  649.                 skin = capskinoverride[profile]&3;
  650.             }
  651.             if(skin >= madskins[profile])
  652.             {
  653.                 skin = 0;
  654.                 if(madskins[profile] > 1)
  655.                 {
  656.                     skin = rand()%madskins[profile];
  657.                 }
  658.             }
  659.             chrtexture[cnt] = madskinstart[profile]+skin;
  660.             // Life and Mana
  661.             chralive[cnt] = TRUE;
  662.             chrlifecolor[cnt] = caplifecolor[profile];
  663.             chrmanacolor[cnt] = capmanacolor[profile];
  664.             chrlifemax[cnt] = generate_number(caplifebase[profile], capliferand[profile]);
  665.             chrlife[cnt] = chrlifemax[cnt];
  666.             chrlifereturn[cnt] = caplifereturn[profile];
  667.             chrmanamax[cnt] = generate_number(capmanabase[profile], capmanarand[profile]);
  668.             chrmanaflow[cnt] = generate_number(capmanaflowbase[profile], capmanaflowrand[profile]);
  669.             chrmanareturn[cnt] = generate_number(capmanareturnbase[profile], capmanareturnrand[profile])>>MANARETURNSHIFT;
  670.             chrmana[cnt] = chrmanamax[cnt];
  671.             // SWID
  672.             chrstrength[cnt] = generate_number(capstrengthbase[profile], capstrengthrand[profile]);
  673.             chrwisdom[cnt] = generate_number(capwisdombase[profile], capwisdomrand[profile]);
  674.             chrintelligence[cnt] = generate_number(capintelligencebase[profile], capintelligencerand[profile]);
  675.             chrdexterity[cnt] = generate_number(capdexteritybase[profile], capdexterityrand[profile]);
  676.             // Damage
  677.             chrdefense[cnt] = capdefense[profile][skin];
  678.             chrreaffirmdamagetype[cnt]=capattachedprtreaffirmdamagetype[profile];
  679.             chrdamagetargettype[cnt] = capdamagetargettype[profile];
  680.             tnc = 0;
  681.             while(tnc < MAXDAMAGETYPE)
  682.             {
  683.                 chrdamagemodifier[cnt][tnc] = capdamagemodifier[profile][tnc][skin];
  684.                 tnc++;
  685.             }
  686.             // AI stuff
  687.             chraitype[cnt]= madai[chrmodel[cnt]];
  688.             chrisplayer[cnt] = FALSE;
  689.             chrislocalplayer[cnt] = FALSE;
  690.             chralert[cnt] = ALERTIFSPAWNED;
  691.             chraistate[cnt] = capstateoverride[profile];
  692.             chraicontent[cnt] = capcontentoverride[profile];
  693.             chraitarget[cnt] = cnt;
  694.             chraiowner[cnt] = cnt;
  695.             chraichild[cnt] = cnt;
  696.             chraitime[cnt] = 0;
  697.             chrlatchx[cnt] = 0;
  698.             chrlatchy[cnt] = 0;
  699.             chrlatchbutton[cnt] = 0;
  700.             chrturnmode[cnt] = TURNMODEVELOCITY;
  701.             // Flags
  702.             chrstickybutt[cnt] = capstickybutt[profile];
  703.             chropenstuff[cnt] = capcanopenstuff[profile];
  704.             chrtransferblend[cnt] = captransferblend[profile];
  705.             chrenviro[cnt] = capenviro[profile];
  706.             chrwaterwalk[cnt] = capwaterwalk[profile];
  707.             chrplatform[cnt] = capplatform[profile];
  708.             chrisitem[cnt] = capisitem[profile];
  709.             chrinvictus[cnt] = capinvictus[profile];
  710.             chrismount[cnt] = capismount[profile];
  711.             chrcangrabmoney[cnt] = capcangrabmoney[profile];
  712.             // Jumping
  713.             chrjump[cnt] = capjump[profile];
  714.             chrjumpnumber[cnt] = 0;
  715.             chrjumpnumberreset[cnt] = capjumpnumber[profile];
  716.             chrjumptime[cnt] = JUMPDELAY;
  717.             // Other junk
  718.             chrflyheight[cnt] = capflyheight[profile];
  719.             chrmaxaccel[cnt] = capmaxaccel[profile][skin];
  720.             chralpha[cnt] = capalpha[profile];
  721.             chrlight[cnt] = caplight[profile];
  722.             chrflashand[cnt] = capflashand[profile];
  723.             chrsheen[cnt] = capsheen[profile];
  724.             chrdampen[cnt] = capdampen[profile];
  725.             // Character size and bumping
  726.             chrfat[cnt] = capsize[profile];
  727.             chrsizegoto[cnt] = chrfat[cnt];
  728.             chrsizegototime[cnt] = 0;
  729.             chrshadowsize[cnt] = capshadowsize[profile]*chrfat[cnt];
  730.             chrbumpsize[cnt] = capbumpsize[profile]*chrfat[cnt];
  731.             chrbumpsizebig[cnt] = capbumpsizebig[profile]*chrfat[cnt];
  732.             chrbumpheight[cnt] = capbumpheight[profile]*chrfat[cnt];
  733.  
  734.             chrshadowsizesave[cnt] = capshadowsize[profile];
  735.             chrbumpsizesave[cnt] = capbumpsize[profile];
  736.             chrbumpsizebigsave[cnt] = capbumpsizebig[profile];
  737.             chrbumpheightsave[cnt] = capbumpheight[profile];
  738.  
  739.             chrbumpdampen[cnt] = capbumpdampen[profile];
  740.             chrweight[cnt] = capweight[profile]*chrfat[cnt];
  741.             if(capweight[profile]==255) chrweight[cnt] = 65535;
  742.             chrbumplast[cnt] = cnt;
  743.             chrattacklast[cnt] = MAXCHR;
  744.             chrhitlast[cnt] = cnt;
  745.             // Grip info
  746.             chrattachedto[cnt] = MAXCHR;
  747.             chrholdingwhich[cnt][0] = MAXCHR;
  748.             chrholdingwhich[cnt][1] = MAXCHR;
  749.             // Image rendering
  750.             chruoffset[cnt] = 0;
  751.             chrvoffset[cnt] = 0;
  752.             chruoffvel[cnt] = capuoffvel[profile];
  753.             chrvoffvel[cnt] = capvoffvel[profile];
  754.             chrredshift[cnt] = 0;
  755.             chrgrnshift[cnt] = 0;
  756.             chrblushift[cnt] = 0;
  757.             // Movement
  758.             chrsneakspd[cnt] = capsneakspd[profile];
  759.             chrwalkspd[cnt] = capwalkspd[profile];
  760.             chrrunspd[cnt] = caprunspd[profile];
  761.  
  762.  
  763.             // Set up position
  764.             chrxpos[cnt] = x;
  765.             chrypos[cnt] = y;
  766.             chroldx[cnt] = x;
  767.             chroldy[cnt] = y;
  768.             chrturnleftright[cnt] = facing;
  769.             chrlightturnleftright[cnt] = 0;
  770.             ix = x;
  771.             iy = y;
  772.             chronwhichfan[cnt] = (ix>>7)+meshfanstart[iy>>7];
  773.             chrlevel[cnt] = get_level(chrxpos[cnt], chrypos[cnt], chronwhichfan[cnt], chrwaterwalk[cnt])+RAISE;
  774.             if(z < chrlevel[cnt])
  775.                 z = chrlevel[cnt];
  776.             chrzpos[cnt] = z;
  777.             chroldz[cnt] = z;
  778.             chrxstt[cnt] = chrxpos[cnt];
  779.             chrystt[cnt] = chrypos[cnt];
  780.             chrzstt[cnt] = chrzpos[cnt];
  781.             chrxvel[cnt] = 0;
  782.             chryvel[cnt] = 0;
  783.             chrzvel[cnt] = 0;
  784.             chrturnmaplr[cnt] = 32768;  // These two mean on level surface
  785.             chrturnmapud[cnt] = 32768;
  786.             chrscale[cnt] = chrfat[cnt]*madscale[chrmodel[cnt]]*4;
  787.  
  788.  
  789.             // AI and action stuff
  790.             chraigoto[cnt] = 0;
  791.             chraigotoadd[cnt] = 1;
  792.             chraigotox[cnt][0] = chrxpos[cnt];
  793.             chraigotoy[cnt][0] = chrypos[cnt];
  794.             chractionready[cnt] = TRUE;
  795.             chrkeepaction[cnt] = FALSE;
  796.             chrloopaction[cnt] = FALSE;
  797.             chraction[cnt] = ACTIONDA;
  798.             chrnextaction[cnt] = ACTIONDA;
  799.             chrlip[cnt] = 0;
  800.             chrframe[cnt] = madframestart[chrmodel[cnt]];
  801.             chrlastframe[cnt] = chrframe[cnt];
  802.             chrpassage[cnt] = 0;
  803.             chrholdingweight[cnt] = 0;
  804.  
  805.  
  806.             // Timers set to 0
  807.             chrgrogtime[cnt] = 0;
  808.             chrdazetime[cnt] = 0;
  809.  
  810.  
  811.             // Money is added later
  812.             chrmoney[cnt] = capmoney[profile];
  813.  
  814.  
  815.             // Name the character
  816.             if(name == NULL)
  817.             {
  818.                 // Generate a random name
  819.                 naming_names(profile);
  820.                 sprintf(chrname[cnt], "%s", namingnames);
  821.             }
  822.             else
  823.             {
  824.                 // A name has been given
  825.                 tnc = 0;
  826.                 while(tnc < MAXCAPNAMESIZE-1)
  827.                 {
  828.                     chrname[cnt][tnc] = name[tnc];
  829.                     tnc++;
  830.                 }
  831.                 chrname[cnt][tnc] = 0;
  832.             }
  833.  
  834.             // Set up initial fade in lighting
  835.             tnc = 0;
  836.             while(tnc < madtransvertices[chrmodel[cnt]])
  837.             {
  838.                 chrvrta[cnt][tnc] = 0;
  839.                 tnc++;
  840.             }
  841.  
  842.  
  843.             // Particle attachments
  844.             tnc = 0;
  845.             while(tnc < capattachedprtamount[profile])
  846.             {
  847.                 spawn_one_particle(chrxpos[cnt], chrypos[cnt], chrzpos[cnt],
  848.                                    0, chrmodel[cnt], capattachedprttype[profile],
  849.                                    cnt, SPAWNLAST+tnc, chrteam[cnt], cnt, tnc, MAXCHR);
  850.                 tnc++;
  851.             }
  852.             chrreaffirmdamagetype[cnt] = capattachedprtreaffirmdamagetype[profile];
  853.  
  854.  
  855.             // Experience
  856.             tnc = generate_number(capexperiencebase[profile], capexperiencerand[profile]);
  857.             if(tnc > MAXXP) tnc = MAXXP;
  858.             chrexperience[cnt] = tnc;
  859.             chrexperiencelevel[cnt] = capleveloverride[profile];
  860.         }
  861.     }
  862.     return cnt;
  863. }
  864.  
  865. //--------------------------------------------------------------------------------------------
  866. void respawn_character(unsigned short character)
  867. {
  868.     // ZZ> This function respawns a character
  869.     unsigned short item;
  870.  
  871.     if(chralive[character]==FALSE)
  872.     {
  873.         spawn_poof(character, chrmodel[character]);
  874.         disaffirm_attached_particles(character);
  875.         chralive[character] = TRUE;
  876.         chrboretime[character] = BORETIME;
  877.         chrcarefultime[character] = CAREFULTIME;
  878.         chrlife[character] = chrlifemax[character];
  879.         chrmana[character] = chrmanamax[character];
  880.         chrxpos[character] = chrxstt[character];
  881.         chrypos[character] = chrystt[character];
  882.         chrzpos[character] = chrzstt[character];
  883.         chrxvel[character] = 0;
  884.         chryvel[character] = 0;
  885.         chrzvel[character] = 0;
  886.         chrteam[character] = chrbaseteam[character];
  887.         chrcanbecrushed[character] = FALSE;
  888.         chrturnmaplr[character] = 32768;  // These two mean on level surface
  889.         chrturnmapud[character] = 32768;
  890.         if(teamleader[chrteam[character]]==NOLEADER)  teamleader[chrteam[character]]=character;
  891.         if(chrinvictus[character]==FALSE)  teammorale[chrbaseteam[character]]++;
  892.         chractionready[character] = TRUE;
  893.         chrkeepaction[character] = FALSE;
  894.         chrloopaction[character] = FALSE;
  895.         chraction[character] = ACTIONDA;
  896.         chrnextaction[character] = ACTIONDA;
  897.         chrlip[character] = 0;
  898.         chrframe[character] = madframestart[chrmodel[character]];
  899.         chrlastframe[character] = chrframe[character];
  900.         chrplatform[character] = capplatform[chrmodel[character]];
  901.         chrflyheight[character] = capflyheight[chrmodel[character]];
  902.         chrbumpdampen[character] = capbumpdampen[chrmodel[character]];
  903.         chrbumpsize[character] = capbumpsize[chrmodel[character]]*chrfat[character];
  904.         chrbumpsizebig[character] = capbumpsizebig[chrmodel[character]]*chrfat[character];
  905.         chrbumpheight[character] = capbumpheight[chrmodel[character]]*chrfat[character];
  906.  
  907.         chrbumpsizesave[character] = capbumpsize[chrmodel[character]];
  908.         chrbumpsizebigsave[character] = capbumpsizebig[chrmodel[character]];
  909.         chrbumpheightsave[character] = capbumpheight[chrmodel[character]];
  910.  
  911. //        chralert[character] = ALERTIFSPAWNED;
  912.         chralert[character] = 0;
  913. //        chraistate[character] = 0;
  914.         chraitarget[character] = character;
  915.         chraitime[character] = 0;
  916.         chrgrogtime[character] = 0;
  917.         chrdazetime[character] = 0;
  918.         reaffirm_attached_particles(character);
  919.  
  920.  
  921.         // Let worn items come back
  922.         item = chrnextinpack[character];
  923.         while(item != MAXCHR)
  924.         {
  925.             if(chrisequipped[item])
  926.             {
  927.                 chrisequipped[item] = FALSE;
  928.                 chralert[item] |= ALERTIFATLASTWAYPOINT;  // doubles as PutAway
  929.             }
  930.             item = chrnextinpack[item];
  931.         }
  932.     }
  933. }
  934.  
  935. //--------------------------------------------------------------------------------------------
  936. unsigned short change_armor(unsigned short character, unsigned short skin)
  937. {
  938.     // ZZ> This function changes the armor of the character
  939.     unsigned short enchant, sTmp;
  940.     int iTmp;
  941.  
  942.  
  943.     // Remove armor enchantments
  944.     enchant = chrfirstenchant[character];
  945.     while(enchant < MAXENCHANT)
  946.     {
  947.         unset_enchant_value(enchant, SETSLASHMODIFIER);
  948.         unset_enchant_value(enchant, SETCRUSHMODIFIER);
  949.         unset_enchant_value(enchant, SETPOKEMODIFIER);
  950.         unset_enchant_value(enchant, SETHOLYMODIFIER);
  951.         unset_enchant_value(enchant, SETEVILMODIFIER);
  952.         unset_enchant_value(enchant, SETFIREMODIFIER);
  953.         unset_enchant_value(enchant, SETICEMODIFIER);
  954.         unset_enchant_value(enchant, SETZAPMODIFIER);
  955.         enchant = encnextenchant[enchant];
  956.     }
  957.  
  958.  
  959.     // Change the skin
  960.     sTmp = chrmodel[character];
  961.     if(skin > madskins[sTmp])  skin = 0;
  962.     chrtexture[character] = madskinstart[sTmp]+skin;
  963.  
  964.  
  965.     // Change stats associated with skin
  966.     chrdefense[character] = capdefense[sTmp][skin];
  967.     iTmp = 0;
  968.     while(iTmp < MAXDAMAGETYPE)
  969.     {
  970.         chrdamagemodifier[character][iTmp] = capdamagemodifier[sTmp][iTmp][skin];
  971.         iTmp++;
  972.     }
  973.     chrmaxaccel[character] = capmaxaccel[sTmp][skin];
  974.  
  975.  
  976.     // Reset armor enchantments
  977.     // These should really be done in reverse order ( Start with last enchant ), but
  978.     // I don't care at this point !!!BAD!!!
  979.     enchant = chrfirstenchant[character];
  980.     while(enchant < MAXENCHANT)
  981.     {
  982.         set_enchant_value(enchant, SETSLASHMODIFIER, enceve[enchant]);
  983.         set_enchant_value(enchant, SETCRUSHMODIFIER, enceve[enchant]);
  984.         set_enchant_value(enchant, SETPOKEMODIFIER, enceve[enchant]);
  985.         set_enchant_value(enchant, SETHOLYMODIFIER, enceve[enchant]);
  986.         set_enchant_value(enchant, SETEVILMODIFIER, enceve[enchant]);
  987.         set_enchant_value(enchant, SETFIREMODIFIER, enceve[enchant]);
  988.         set_enchant_value(enchant, SETICEMODIFIER, enceve[enchant]);
  989.         set_enchant_value(enchant, SETZAPMODIFIER, enceve[enchant]);
  990.         add_enchant_value(enchant, ADDACCEL, enceve[enchant]);
  991.         add_enchant_value(enchant, ADDDEFENSE, enceve[enchant]);
  992.         enchant = encnextenchant[enchant];
  993.     }
  994.     return skin;
  995. }
  996.  
  997. //--------------------------------------------------------------------------------------------
  998. void change_character(unsigned short cnt, unsigned short profile, unsigned char skin,
  999.     unsigned char leavewhich)
  1000. {
  1001.     // ZZ> This function polymorphs a character, changing stats, dropping weapons
  1002.     int tnc, enchant;
  1003.     unsigned short sTmp, item;
  1004.  
  1005.  
  1006.     profile = profile & (MAXMODEL-1);
  1007.     if(madused[profile])
  1008.     {
  1009.         // Drop left weapon
  1010.         sTmp = chrholdingwhich[cnt][0];
  1011.         if(sTmp != MAXCHR && (capgripvalid[profile][0]==FALSE || capismount[profile]))
  1012.         {
  1013.             detach_character_from_mount(sTmp, TRUE, TRUE);
  1014.             if(chrismount[cnt])
  1015.             {
  1016.                 chrzvel[sTmp] = DISMOUNTZVEL;
  1017.                 chrzpos[sTmp]+=DISMOUNTZVEL;
  1018.                 chrjumptime[sTmp]=JUMPDELAY;
  1019.             }
  1020.         }
  1021.  
  1022.  
  1023.         // Drop right weapon
  1024.         sTmp = chrholdingwhich[cnt][1];
  1025.         if(sTmp != MAXCHR && capgripvalid[profile][1]==FALSE)
  1026.         {
  1027.             detach_character_from_mount(sTmp, TRUE, TRUE);
  1028.             if(chrismount[cnt])
  1029.             {
  1030.                 chrzvel[sTmp] = DISMOUNTZVEL;
  1031.                 chrzpos[sTmp]+=DISMOUNTZVEL;
  1032.                 chrjumptime[sTmp]=JUMPDELAY;
  1033.             }
  1034.         }
  1035.  
  1036.  
  1037.         // Remove particles
  1038.         disaffirm_attached_particles(cnt);
  1039.  
  1040.  
  1041.         // Remove enchantments
  1042.         if(leavewhich == LEAVEFIRST)
  1043.         {
  1044.             // Remove all enchantments except top one
  1045.             enchant = chrfirstenchant[cnt];
  1046.             if(enchant != MAXENCHANT)
  1047.             {
  1048.                 while(encnextenchant[enchant] != MAXENCHANT)
  1049.                 {
  1050.                     remove_enchant(encnextenchant[enchant]);
  1051.                 }
  1052.             }
  1053.         }
  1054.         if(leavewhich == LEAVENONE)
  1055.         {
  1056.             // Remove all enchantments
  1057.             disenchant_character(cnt);
  1058.         }
  1059.  
  1060.  
  1061.         // Stuff that must be set
  1062.         chrmodel[cnt] = profile;
  1063.         chrstoppedby[cnt] = capstoppedby[profile];
  1064.         chrlifeheal[cnt] = caplifeheal[profile];
  1065.         chrmanacost[cnt] = capmanacost[profile];
  1066.         // Ammo
  1067.         chrammomax[cnt] = capammomax[profile];
  1068.         chrammo[cnt] = capammo[profile];
  1069.         // Gender
  1070.         if(capgender[profile] != GENRANDOM)  // GENRANDOM means keep old gender
  1071.         {
  1072.             chrgender[cnt] = capgender[profile];
  1073.         }
  1074.  
  1075.  
  1076.         // AI stuff
  1077.         chraitype[cnt]= madai[profile];
  1078.         chraistate[cnt] = 0;
  1079.         chraitime[cnt] = 0;
  1080.         chrlatchx[cnt] = 0;
  1081.         chrlatchy[cnt] = 0;
  1082.         chrlatchbutton[cnt] = 0;
  1083.         chrturnmode[cnt] = TURNMODEVELOCITY;
  1084.         // Flags
  1085.         chrstickybutt[cnt] = capstickybutt[profile];
  1086.         chropenstuff[cnt] = capcanopenstuff[profile];
  1087.         chrtransferblend[cnt] = captransferblend[profile];
  1088.         chrenviro[cnt] = capenviro[profile];
  1089.         chrplatform[cnt] = capplatform[profile];
  1090.         chrisitem[cnt] = capisitem[profile];
  1091.         chrinvictus[cnt] = capinvictus[profile];
  1092.         chrismount[cnt] = capismount[profile];
  1093.         chrcangrabmoney[cnt] = capcangrabmoney[profile];
  1094.         chrjumptime[cnt] = JUMPDELAY;
  1095.         // Character size and bumping
  1096.         chrshadowsize[cnt] = capshadowsize[profile]*chrfat[cnt];
  1097.         chrbumpsize[cnt] = capbumpsize[profile]*chrfat[cnt];
  1098.         chrbumpsizebig[cnt] = capbumpsizebig[profile]*chrfat[cnt];
  1099.         chrbumpheight[cnt] = capbumpheight[profile]*chrfat[cnt];
  1100.  
  1101.         chrshadowsizesave[cnt] = capshadowsize[profile];
  1102.         chrbumpsizesave[cnt] = capbumpsize[profile];
  1103.         chrbumpsizebigsave[cnt] = capbumpsizebig[profile];
  1104.         chrbumpheightsave[cnt] = capbumpheight[profile];
  1105.  
  1106.         chrbumpdampen[cnt] = capbumpdampen[profile];
  1107.         chrweight[cnt] = capweight[profile]*chrfat[cnt];
  1108.         if(capweight[profile]==255) chrweight[cnt] = 65535;
  1109.         // Character scales...  Magic numbers
  1110.         if(chrattachedto[cnt] == MAXCHR)
  1111.         {
  1112.             chrscale[cnt] = chrfat[cnt]*madscale[profile]*4;
  1113.         }
  1114.         else
  1115.         {
  1116.             chrscale[cnt] = chrfat[cnt]/(chrfat[chrattachedto[cnt]]*1280);
  1117.             tnc = madvertices[chrmodel[chrattachedto[cnt]]] - chrinwhichhand[cnt];
  1118.             chrweapongrip[cnt][0] = tnc;
  1119.             chrweapongrip[cnt][1] = tnc+1;
  1120.             chrweapongrip[cnt][2] = tnc+2;
  1121.             chrweapongrip[cnt][3] = tnc+3;
  1122.         }
  1123.         item = chrholdingwhich[cnt][0];
  1124.         if(item != MAXCHR)
  1125.         {
  1126.             chrscale[item] = chrfat[item]/(chrfat[cnt]*1280);
  1127.             tnc = madvertices[chrmodel[cnt]] - GRIPLEFT;
  1128.             chrweapongrip[item][0] = tnc;
  1129.             chrweapongrip[item][1] = tnc+1;
  1130.             chrweapongrip[item][2] = tnc+2;
  1131.             chrweapongrip[item][3] = tnc+3;
  1132.         }
  1133.         item = chrholdingwhich[cnt][1];
  1134.         if(item != MAXCHR)
  1135.         {
  1136.             chrscale[item] = chrfat[item]/(chrfat[cnt]*1280);
  1137.             tnc = madvertices[chrmodel[cnt]] - GRIPRIGHT;
  1138.             chrweapongrip[item][0] = tnc;
  1139.             chrweapongrip[item][1] = tnc+1;
  1140.             chrweapongrip[item][2] = tnc+2;
  1141.             chrweapongrip[item][3] = tnc+3;
  1142.         }
  1143.         // Image rendering
  1144.         chruoffset[cnt] = 0;
  1145.         chrvoffset[cnt] = 0;
  1146.         chruoffvel[cnt] = capuoffvel[profile];
  1147.         chrvoffvel[cnt] = capvoffvel[profile];
  1148.         // Movement
  1149.         chrsneakspd[cnt] = capsneakspd[profile];
  1150.         chrwalkspd[cnt] = capwalkspd[profile];
  1151.         chrrunspd[cnt] = caprunspd[profile];
  1152.  
  1153.  
  1154.         // AI and action stuff
  1155.         chractionready[cnt] = TRUE;
  1156.         chrkeepaction[cnt] = FALSE;
  1157.         chrloopaction[cnt] = FALSE;
  1158.         chraction[cnt] = ACTIONDA;
  1159.         chrnextaction[cnt] = ACTIONDA;
  1160.         chrlip[cnt] = 0;
  1161.         chrframe[cnt] = madframestart[profile];
  1162.         chrlastframe[cnt] = chrframe[cnt];
  1163.         chrholdingweight[cnt] = 0;
  1164.  
  1165.  
  1166.         // Set the skin
  1167.         change_armor(cnt, skin);
  1168.  
  1169.  
  1170.         // Reaffirm them particles...
  1171.         chrreaffirmdamagetype[cnt] = capattachedprtreaffirmdamagetype[profile];
  1172.         reaffirm_attached_particles(cnt);
  1173.  
  1174.  
  1175.         // Set up initial fade in lighting
  1176.         tnc = 0;
  1177.         while(tnc < madtransvertices[chrmodel[cnt]])
  1178.         {
  1179.             chrvrta[cnt][tnc] = 0;
  1180.             tnc++;
  1181.         }
  1182.     }
  1183. }
  1184.  
  1185. //--------------------------------------------------------------------------------------------
  1186. unsigned short get_target_in_block(int x, int y, unsigned short character, char items,
  1187.     char friends, char enemies, char dead, char seeinvisible, unsigned int idsz,
  1188.     char excludeid)
  1189. {
  1190.     // ZZ> This is a good little helper, that returns != MAXCHR if a suitable target
  1191.     //     was found
  1192.     int cnt;
  1193.     unsigned short charb;
  1194.     unsigned int fanblock;
  1195.     unsigned char team;
  1196.  
  1197.  
  1198.     if(x >= 0 && x < (meshsizex>>2) && y >= 0 && y < (meshsizey>>2))
  1199.     {
  1200.         team = chrteam[character];
  1201.         fanblock = x+meshblockstart[y];
  1202.         charb = meshbumplistchr[fanblock];
  1203.         cnt = 0;
  1204.         while(cnt < meshbumplistchrnum[fanblock])
  1205.         {
  1206.             if(dead != chralive[charb] && (seeinvisible || (chralpha[charb]>INVISIBLE && chrlight[charb]>INVISIBLE)))
  1207.             {
  1208.                 if((enemies && teamhatesteam[team][chrteam[charb]] && chrinvictus[charb]==FALSE) ||
  1209.                    (items && chrisitem[charb]) ||
  1210.                    (friends && chrbaseteam[charb]==team))
  1211.                 {
  1212.                     if(charb != character && chrattachedto[character] != charb)
  1213.                     {
  1214.                         if(chrisitem[charb] == FALSE || items)
  1215.                         {
  1216.                             if(idsz != IDSZNONE)
  1217.                             {
  1218.                                 if(capidsz[chrmodel[charb]][IDSZPARENT] == idsz ||
  1219.                                    capidsz[chrmodel[charb]][IDSZTYPE] == idsz)
  1220.                                 {
  1221.                                     if(!excludeid) return charb;
  1222.                                 }
  1223.                                 else
  1224.                                 {
  1225.                                     if(excludeid)  return charb;
  1226.                                 }
  1227.                             }
  1228.                             else
  1229.                             {
  1230.                                 return charb;
  1231.                             }
  1232.                         }
  1233.                     }
  1234.                 }
  1235.             }
  1236.             charb = chrbumpnext[charb];
  1237.             cnt++;
  1238.         }
  1239.     }
  1240.     return MAXCHR;
  1241. }
  1242.  
  1243. //--------------------------------------------------------------------------------------------
  1244. unsigned short get_nearby_target(unsigned short character, char items,
  1245.     char friends, char enemies, char dead, unsigned int idsz)
  1246. {
  1247.     // ZZ> This function finds a nearby target, or it returns MAXCHR if it can't find one
  1248.     int x, y;
  1249.     char seeinvisible;
  1250.     seeinvisible = chrcanseeinvisible[character];
  1251.  
  1252.  
  1253.     // Current fanblock
  1254.     x = ((int)chrxpos[character])>>9;
  1255.     y = ((int)chrypos[character])>>9;
  1256.     return get_target_in_block(x, y, character, items, friends, enemies, dead, seeinvisible, idsz, 0);
  1257. }
  1258.  
  1259. //--------------------------------------------------------------------------------------------
  1260. unsigned char cost_mana(unsigned short character, int amount, unsigned short killer)
  1261. {
  1262.     // ZZ> This function takes mana from a character ( or gives mana ),
  1263.     //     and returns TRUE if the character had enough to pay, or FALSE
  1264.     //     otherwise
  1265.     int iTmp;
  1266.  
  1267.  
  1268.     iTmp = chrmana[character] - amount;
  1269.     if(iTmp < 0)
  1270.     {
  1271.         chrmana[character] = 0;
  1272.         if(chrcanchannel[character])
  1273.         {
  1274.             chrlife[character] += iTmp;
  1275.             if(chrlife[character] <= 0)
  1276.             {
  1277.                 kill_character(character, character);
  1278.             }
  1279.             return TRUE;
  1280.         }
  1281.         return FALSE;
  1282.     }
  1283.     else
  1284.     {
  1285.         chrmana[character] = iTmp;
  1286.         if(iTmp > chrmanamax[character])
  1287.         {
  1288.             chrmana[character] = chrmanamax[character];
  1289.         }
  1290.     }
  1291.     return TRUE;
  1292. }
  1293.  
  1294. //--------------------------------------------------------------------------------------------
  1295. unsigned short find_distant_target(unsigned short character, int maxdistance)
  1296. {
  1297.     // ZZ> This function finds a target, or it returns MAXCHR if it can't find one...
  1298.     //     maxdistance should be the square of the actual distance you want to use
  1299.     //     as the cutoff...
  1300.     int cnt, distance, xdistance, ydistance;
  1301.     unsigned char team;
  1302.  
  1303.     team = chrteam[character];
  1304.     cnt = 0;
  1305.     while(cnt < MAXCHR)
  1306.     {
  1307.         if(chron[cnt])
  1308.         {
  1309.             if(chrattachedto[cnt]==MAXCHR && chrinpack[cnt]==FALSE)
  1310.             {
  1311.                 if(teamhatesteam[team][chrteam[cnt]] && chralive[cnt] && chrinvictus[cnt]==FALSE)
  1312.                 {
  1313.                     if(chrcanseeinvisible[character] || (chralpha[cnt]>INVISIBLE && chrlight[cnt]>INVISIBLE))
  1314.                     {
  1315.                         xdistance = chrxpos[cnt] - chrxpos[character];
  1316.                         ydistance = chrypos[cnt] - chrypos[character];
  1317.                         distance = xdistance*xdistance + ydistance*ydistance;
  1318.                         if(distance < maxdistance)
  1319.                         {
  1320.                             return cnt;
  1321.                         }
  1322.                     }
  1323.                 }
  1324.             }
  1325.         }
  1326.         cnt++;
  1327.     }
  1328.     return MAXCHR;
  1329. }
  1330.  
  1331. //--------------------------------------------------------------------------------------------
  1332. void switch_team(int character, unsigned char team)
  1333. {
  1334.     // ZZ> This function makes a character join another team...
  1335.     if(team < MAXTEAM)
  1336.     {
  1337.         if(chrinvictus[character]==FALSE)
  1338.         {
  1339.             teammorale[chrbaseteam[character]]--;
  1340.             teammorale[team]++;
  1341.         }
  1342.         if((chrismount[character]==FALSE || chrholdingwhich[character][0]==MAXCHR) &&
  1343.            (chrisitem[character]==FALSE || chrattachedto[character]==MAXCHR))
  1344.         {
  1345.             chrteam[character] = team;
  1346.         }
  1347.         chrbaseteam[character] = team;
  1348.         if(teamleader[team]==NOLEADER)
  1349.         {
  1350.             teamleader[team] = character;
  1351.         }
  1352.     }
  1353. }
  1354.  
  1355. //--------------------------------------------------------------------------------------------
  1356. void get_nearest_in_block(int x, int y, unsigned short character, char items,
  1357.     char friends, char enemies, char dead, char seeinvisible, unsigned int idsz)
  1358. {
  1359.     // ZZ> This is a good little helper
  1360.     float distance, xdis, ydis;
  1361.     int cnt;
  1362.     unsigned char team;
  1363.     unsigned short charb;
  1364.     unsigned int fanblock;
  1365.  
  1366.  
  1367.     if(x >= 0 && x < (meshsizex>>2) && y >= 0 && y < (meshsizey>>2))
  1368.     {
  1369.         team = chrteam[character];
  1370.         fanblock = x+meshblockstart[y];
  1371.         charb = meshbumplistchr[fanblock];
  1372.         cnt = 0;
  1373.         while(cnt < meshbumplistchrnum[fanblock])
  1374.         {
  1375.             if(dead != chralive[charb] && (seeinvisible || (chralpha[charb]>INVISIBLE && chrlight[charb]>INVISIBLE)))
  1376.             {
  1377.                 if((enemies && teamhatesteam[team][chrteam[charb]]) ||
  1378.                    (items && chrisitem[charb]) ||
  1379.                    (friends && chrteam[charb]==team) ||
  1380.                    (friends && enemies))
  1381.                 {
  1382.                     if(charb != character && chrattachedto[character] != charb && chrattachedto[charb] == MAXCHR && chrinpack[charb] == FALSE)
  1383.                     {
  1384.                         if(chrinvictus[charb] == FALSE || items)
  1385.                         {
  1386.                             if(idsz != IDSZNONE)
  1387.                             {
  1388.                                 if(capidsz[chrmodel[charb]][IDSZPARENT] == idsz ||
  1389.                                    capidsz[chrmodel[charb]][IDSZTYPE] == idsz)
  1390.                                 {
  1391.                                     xdis = chrxpos[character] - chrxpos[charb];
  1392.                                     ydis = chrypos[character] - chrypos[charb];
  1393.                                     xdis = xdis*xdis;
  1394.                                     ydis = ydis*ydis;
  1395.                                     distance = xdis+ydis;
  1396.                                     if(distance < globaldistance)
  1397.                                     {
  1398.                                         globalnearest = charb;
  1399.                                         globaldistance = distance;
  1400.                                     }
  1401.                                 }
  1402.                             }
  1403.                             else
  1404.                             {
  1405.                                 xdis = chrxpos[character] - chrxpos[charb];
  1406.                                 ydis = chrypos[character] - chrypos[charb];
  1407.                                 xdis = xdis*xdis;
  1408.                                 ydis = ydis*ydis;
  1409.                                 distance = xdis+ydis;
  1410.                                 if(distance < globaldistance)
  1411.                                 {
  1412.                                     globalnearest = charb;
  1413.                                     globaldistance = distance;
  1414.                                 }
  1415.                             }
  1416.                         }
  1417.                     }
  1418.                 }
  1419.             }
  1420.             charb = chrbumpnext[charb];
  1421.             cnt++;
  1422.         }
  1423.     }
  1424.     return;
  1425. }
  1426.  
  1427. //--------------------------------------------------------------------------------------------
  1428. unsigned short get_nearest_target(unsigned short character, char items,
  1429.     char friends, char enemies, char dead, unsigned int idsz)
  1430. {
  1431.     // ZZ> This function finds an target, or it returns MAXCHR if it can't find one
  1432.     int x, y;
  1433.     char seeinvisible;
  1434.     seeinvisible = chrcanseeinvisible[character];
  1435.  
  1436.  
  1437.     // Current fanblock
  1438.     x = ((int)chrxpos[character])>>9;
  1439.     y = ((int)chrypos[character])>>9;
  1440.  
  1441.  
  1442.     globalnearest = MAXCHR;
  1443.     globaldistance = 999999;
  1444.     get_nearest_in_block(x, y, character, items, friends, enemies, dead, seeinvisible, idsz);
  1445.  
  1446.     get_nearest_in_block(x-1, y, character, items, friends, enemies, dead, seeinvisible, idsz);
  1447.     get_nearest_in_block(x+1, y, character, items, friends, enemies, dead, seeinvisible, idsz);
  1448.     get_nearest_in_block(x, y-1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1449.     get_nearest_in_block(x, y+1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1450.  
  1451.     get_nearest_in_block(x-1, y+1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1452.     get_nearest_in_block(x+1, y-1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1453.     get_nearest_in_block(x-1, y-1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1454.     get_nearest_in_block(x+1, y+1, character, items, friends, enemies, dead, seeinvisible, idsz);
  1455.     return globalnearest;
  1456. }
  1457.  
  1458. //--------------------------------------------------------------------------------------------
  1459. unsigned short get_wide_target(unsigned short character, char items,
  1460.     char friends, char enemies, char dead, unsigned int idsz, char excludeid)
  1461. {
  1462.     // ZZ> This function finds an target, or it returns MAXCHR if it can't find one
  1463.     int x, y;
  1464.     unsigned short enemy;
  1465.     char seeinvisible;
  1466.     seeinvisible = chrcanseeinvisible[character];
  1467.  
  1468.     // Current fanblock
  1469.     x = ((int)chrxpos[character])>>9;
  1470.     y = ((int)chrypos[character])>>9;
  1471.     enemy = get_target_in_block(x, y, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1472.     if(enemy != MAXCHR)  return enemy;
  1473.  
  1474.     enemy = get_target_in_block(x-1, y, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1475.     if(enemy != MAXCHR)  return enemy;
  1476.     enemy = get_target_in_block(x+1, y, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1477.     if(enemy != MAXCHR)  return enemy;
  1478.     enemy = get_target_in_block(x, y-1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1479.     if(enemy != MAXCHR)  return enemy;
  1480.     enemy = get_target_in_block(x, y+1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1481.     if(enemy != MAXCHR)  return enemy;
  1482.  
  1483.     enemy = get_target_in_block(x-1, y+1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1484.     if(enemy != MAXCHR)  return enemy;
  1485.     enemy = get_target_in_block(x+1, y-1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1486.     if(enemy != MAXCHR)  return enemy;
  1487.     enemy = get_target_in_block(x-1, y-1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1488.     if(enemy != MAXCHR)  return enemy;
  1489.     enemy = get_target_in_block(x+1, y+1, character, items, friends, enemies, dead, seeinvisible, idsz, excludeid);
  1490.     return enemy;
  1491. }
  1492.  
  1493. //--------------------------------------------------------------------------------------------
  1494. void issue_clean(unsigned short character)
  1495. {
  1496.     // ZZ> This function issues a clean up order to all teammates
  1497.     unsigned char team;
  1498.     unsigned short cnt;
  1499.  
  1500.  
  1501.     team = chrteam[character];
  1502.     cnt = 0;
  1503.     while(cnt < MAXCHR)
  1504.     {
  1505.         if(chrteam[cnt]==team && chralive[cnt] == FALSE)
  1506.         {
  1507.             chraitime[cnt] = 2;  // Don't let it think too much...
  1508.             chralert[cnt]=ALERTIFCLEANEDUP;
  1509.         }
  1510.         cnt++;
  1511.     }
  1512. }
  1513.  
  1514. //--------------------------------------------------------------------------------------------
  1515. int restock_ammo(unsigned short character, unsigned int idsz)
  1516. {
  1517.     // ZZ> This function restocks the characters ammo, if it needs ammo and if
  1518.     //     either its parent or type idsz match the given idsz.  This
  1519.     //     function returns the amount of ammo given.
  1520.     int amount, model;
  1521.  
  1522.     amount = 0;
  1523.     if(character < MAXCHR)
  1524.     {
  1525.         if(chron[character])
  1526.         {
  1527.             model = chrmodel[character];
  1528.             if(capidsz[model][IDSZPARENT] == idsz || capidsz[model][IDSZTYPE] == idsz)
  1529.             {
  1530.                 if(chrammo[character] < chrammomax[character])
  1531.                 {
  1532.                     amount = chrammomax[character] - chrammo[character];
  1533.                     chrammo[character] = chrammomax[character];
  1534.                 }
  1535.             }
  1536.         }
  1537.     }
  1538.     return amount;
  1539. }
  1540.  
  1541. //--------------------------------------------------------------------------------------------
  1542. void issue_order(unsigned short character, unsigned int order)
  1543. {
  1544.     // ZZ> This function issues an order for help to all teammates
  1545.     unsigned char team;
  1546.     unsigned char counter;
  1547.     unsigned short cnt;
  1548.  
  1549.  
  1550.     team = chrteam[character];
  1551.     counter = 0;
  1552.     cnt = 0;
  1553.     while(cnt < MAXCHR)
  1554.     {
  1555.         if(chrteam[cnt]==team)
  1556.         {
  1557.             chrorder[cnt] = order;
  1558.             chrcounter[cnt] = counter;
  1559.             chralert[cnt]=chralert[cnt]|ALERTIFORDERED;
  1560.             counter++;
  1561.         }
  1562.         cnt++;
  1563.     }
  1564. }
  1565.  
  1566. //--------------------------------------------------------------------------------------------
  1567. void issue_special_order(unsigned int order, unsigned int idsz)
  1568. {
  1569.     // ZZ> This function issues an order to all characters with the a matching special IDSZ
  1570.     unsigned char counter;
  1571.     unsigned short cnt;
  1572.  
  1573.  
  1574.     counter = 0;
  1575.     cnt = 0;
  1576.     while(cnt < MAXCHR)
  1577.     {
  1578.         if(chron[cnt])
  1579.         {
  1580.             if(capidsz[chrmodel[cnt]][IDSZSPECIAL] == idsz)
  1581.             {
  1582.                 chrorder[cnt] = order;
  1583.                 chrcounter[cnt] = counter;
  1584.                 chralert[cnt]=chralert[cnt]|ALERTIFORDERED;
  1585.                 counter++;
  1586.             }
  1587.         }
  1588.         cnt++;
  1589.     }
  1590. }
  1591.  
  1592. //--------------------------------------------------------------------------------------------
  1593. void set_alerts(int character)
  1594. {
  1595.     // ZZ> This function polls some alert conditions
  1596.     if(chraitime[character]!=0)
  1597.     {
  1598.         chraitime[character]--;
  1599.     }
  1600.     if(chrxpos[character]<chraigotox[character][chraigoto[character]]+WAYTHRESH&&
  1601.        chrxpos[character]>chraigotox[character][chraigoto[character]]-WAYTHRESH&&
  1602.        chrypos[character]<chraigotoy[character][chraigoto[character]]+WAYTHRESH&&
  1603.        chrypos[character]>chraigotoy[character][chraigoto[character]]-WAYTHRESH)
  1604.     {
  1605.         chralert[character]=chralert[character]|ALERTIFATWAYPOINT;
  1606.         chraigoto[character]++;
  1607.         if(chraigoto[character]==chraigotoadd[character])
  1608.         {
  1609.             chraigoto[character] = 0;
  1610.             if(capisequipment[chrmodel[character]]==FALSE)
  1611.             {
  1612.                 chralert[character]=chralert[character]|ALERTIFATLASTWAYPOINT;
  1613.             }
  1614.         }
  1615.     }
  1616. }
  1617.  
  1618. //--------------------------------------------------------------------------------------------
  1619. void free_all_enchants()
  1620. {
  1621.     // ZZ> This functions frees all of the enchantments
  1622.     numfreeenchant = 0;
  1623.     while(numfreeenchant < MAXENCHANT)
  1624.     {
  1625.         freeenchant[numfreeenchant]=numfreeenchant;
  1626.         encon[numfreeenchant] = FALSE;
  1627.         numfreeenchant++;
  1628.     }
  1629. }
  1630.  
  1631. //--------------------------------------------------------------------------------------------
  1632. void load_one_enchant_type(char* szLoadName, unsigned short profile)
  1633. {
  1634.     // ZZ> This function loads the enchantment associated with an object
  1635.     FILE* fileread;
  1636.     char cTmp;
  1637.     int iTmp, tTmp, idsz, test;
  1638.     float fTmp;
  1639.     int num;
  1640.  
  1641.     globalname = szLoadName;
  1642.     evevalid[profile] = FALSE;
  1643.     fileread = fopen(FILENAME(szLoadName), "r");
  1644.     if(fileread)
  1645.     {
  1646.         evevalid[profile] = TRUE;
  1647.  
  1648.  
  1649.         // TRUE/FALSE values
  1650.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1651.             everetarget[profile] = FALSE;
  1652.             if(cTmp == 'T' || cTmp == 't')  everetarget[profile] = TRUE;
  1653.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1654.             eveoverride[profile] = FALSE;
  1655.             if(cTmp == 'T' || cTmp == 't')  eveoverride[profile] = TRUE;
  1656.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1657.             everemoveoverridden[profile] = FALSE;
  1658.             if(cTmp == 'T' || cTmp == 't')  everemoveoverridden[profile] = TRUE;
  1659.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1660.             evekillonend[profile] = FALSE;
  1661.             if(cTmp == 'T' || cTmp == 't')  evekillonend[profile] = TRUE;
  1662.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1663.             evepoofonend[profile] = FALSE;
  1664.             if(cTmp == 'T' || cTmp == 't')  evepoofonend[profile] = TRUE;
  1665.  
  1666.  
  1667.         // More stuff
  1668.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);  evetime[profile] = iTmp;
  1669.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);  eveendmessage[profile] = iTmp;
  1670.  
  1671.  
  1672.         // Drain stuff
  1673.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);  eveownermana[profile] = fTmp*256;
  1674.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);  evetargetmana[profile] = fTmp*256;
  1675.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1676.             eveendifcantpay[profile] = FALSE;
  1677.             if(cTmp == 'T' || cTmp == 't')  eveendifcantpay[profile] = TRUE;
  1678.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);  eveownerlife[profile] = fTmp*256;
  1679.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);  evetargetlife[profile] = fTmp*256;
  1680.  
  1681.  
  1682.         // Specifics
  1683.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1684.             evedontdamagetype[profile] = DAMAGENULL;
  1685.             if(cTmp=='S' || cTmp=='s')  evedontdamagetype[profile] = DAMAGESLASH;
  1686.             if(cTmp=='C' || cTmp=='c')  evedontdamagetype[profile] = DAMAGECRUSH;
  1687.             if(cTmp=='P' || cTmp=='p')  evedontdamagetype[profile] = DAMAGEPOKE;
  1688.             if(cTmp=='H' || cTmp=='h')  evedontdamagetype[profile] = DAMAGEHOLY;
  1689.             if(cTmp=='E' || cTmp=='e')  evedontdamagetype[profile] = DAMAGEEVIL;
  1690.             if(cTmp=='F' || cTmp=='f')  evedontdamagetype[profile] = DAMAGEFIRE;
  1691.             if(cTmp=='I' || cTmp=='i')  evedontdamagetype[profile] = DAMAGEICE;
  1692.             if(cTmp=='Z' || cTmp=='z')  evedontdamagetype[profile] = DAMAGEZAP;
  1693.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1694.             eveonlydamagetype[profile] = DAMAGENULL;
  1695.             if(cTmp=='S' || cTmp=='s')  eveonlydamagetype[profile] = DAMAGESLASH;
  1696.             if(cTmp=='C' || cTmp=='c')  eveonlydamagetype[profile] = DAMAGECRUSH;
  1697.             if(cTmp=='P' || cTmp=='p')  eveonlydamagetype[profile] = DAMAGEPOKE;
  1698.             if(cTmp=='H' || cTmp=='h')  eveonlydamagetype[profile] = DAMAGEHOLY;
  1699.             if(cTmp=='E' || cTmp=='e')  eveonlydamagetype[profile] = DAMAGEEVIL;
  1700.             if(cTmp=='F' || cTmp=='f')  eveonlydamagetype[profile] = DAMAGEFIRE;
  1701.             if(cTmp=='I' || cTmp=='i')  eveonlydamagetype[profile] = DAMAGEICE;
  1702.             if(cTmp=='Z' || cTmp=='z')  eveonlydamagetype[profile] = DAMAGEZAP;
  1703.         goto_colon(fileread);  everemovedbyidsz[profile] = get_idsz(fileread);
  1704.  
  1705.  
  1706.         // Now the set values
  1707.         num = 0;
  1708.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1709.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1710.             cTmp = get_first_letter(fileread);
  1711.             evesetvalue[profile][num] = DAMAGESLASH;
  1712.             if(cTmp=='C' || cTmp=='c')  evesetvalue[profile][num] = DAMAGECRUSH;
  1713.             if(cTmp=='P' || cTmp=='p')  evesetvalue[profile][num] = DAMAGEPOKE;
  1714.             if(cTmp=='H' || cTmp=='h')  evesetvalue[profile][num] = DAMAGEHOLY;
  1715.             if(cTmp=='E' || cTmp=='e')  evesetvalue[profile][num] = DAMAGEEVIL;
  1716.             if(cTmp=='F' || cTmp=='f')  evesetvalue[profile][num] = DAMAGEFIRE;
  1717.             if(cTmp=='I' || cTmp=='i')  evesetvalue[profile][num] = DAMAGEICE;
  1718.             if(cTmp=='Z' || cTmp=='z')  evesetvalue[profile][num] = DAMAGEZAP;
  1719.             num++;
  1720.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1721.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1722.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1723.             num++;
  1724.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1725.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1726.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1727.             num++;
  1728.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1729.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1730.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1731.             num++;
  1732.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1733.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1734.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1735.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1736.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1737.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1738.             num++;
  1739.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1740.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1741.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1742.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1743.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1744.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1745.             num++;
  1746.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1747.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1748.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1749.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1750.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1751.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1752.             num++;
  1753.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1754.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1755.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1756.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1757.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1758.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1759.             num++;
  1760.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1761.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1762.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1763.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1764.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1765.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1766.             num++;
  1767.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1768.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1769.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1770.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1771.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1772.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1773.             num++;
  1774.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1775.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1776.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1777.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1778.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1779.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1780.             num++;
  1781.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1782.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1783.             cTmp = get_first_letter(fileread);  iTmp = 0;
  1784.             if(cTmp == 'T') iTmp = DAMAGEINVERT;
  1785.             if(cTmp == 'C') iTmp = DAMAGECHARGE;
  1786.             fscanf(fileread, "%d", &tTmp);  evesetvalue[profile][num] = iTmp|tTmp;
  1787.             num++;
  1788.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1789.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1790.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1791.             num++;
  1792.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1793.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1794.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1795.             num++;
  1796.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1797.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1798.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1799.             num++;
  1800.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1801.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1802.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1803.             num++;
  1804.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1805.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1806.             fscanf(fileread, "%d", &iTmp);  evesetvalue[profile][num] = iTmp;
  1807.             num++;
  1808.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1809.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1810.             cTmp = get_first_letter(fileread);
  1811.             evesetvalue[profile][num] = (cTmp=='T' || cTmp=='t');
  1812.             num++;
  1813.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1814.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1815.             cTmp = get_first_letter(fileread);
  1816.             evesetvalue[profile][num] = (cTmp=='T' || cTmp=='t');
  1817.             num++;
  1818.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1819.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1820.             cTmp = get_first_letter(fileread);
  1821.             evesetvalue[profile][num] = MISNORMAL;
  1822.             if(cTmp=='R' || cTmp=='r')  evesetvalue[profile][num] = MISREFLECT;
  1823.             if(cTmp=='D' || cTmp=='d')  evesetvalue[profile][num] = MISDEFLECT;
  1824.             num++;
  1825.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1826.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1827.             fscanf(fileread, "%f", &fTmp);  fTmp = fTmp * 16;
  1828.             evesetvalue[profile][num] = fTmp;
  1829.             num++;
  1830.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1831.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1832.             evesetvalue[profile][num] = TRUE;
  1833.             num++;
  1834.         goto_colon(fileread);  cTmp = get_first_letter(fileread);
  1835.             evesetyesno[profile][num] = (cTmp=='T' || cTmp=='t');
  1836.             evesetvalue[profile][num] = TRUE;
  1837.             num++;
  1838.  
  1839.  
  1840.         // Now read in the add values
  1841.         num = 0;
  1842.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1843.             eveaddvalue[profile][num] = fTmp * 16;
  1844.             num++;
  1845.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1846.             eveaddvalue[profile][num] = fTmp * 127;
  1847.             num++;
  1848.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1849.             eveaddvalue[profile][num] = fTmp * 127;
  1850.             num++;
  1851.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1852.             eveaddvalue[profile][num] = fTmp * 4;
  1853.             num++;
  1854.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1855.             eveaddvalue[profile][num] = fTmp * 127;
  1856.             num++;
  1857.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);
  1858.             eveaddvalue[profile][num] = iTmp;
  1859.             num++;
  1860.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);
  1861.             eveaddvalue[profile][num] = iTmp;
  1862.             num++;
  1863.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);
  1864.             eveaddvalue[profile][num] = iTmp;
  1865.             num++;
  1866.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);
  1867.             eveaddvalue[profile][num] = iTmp;
  1868.             num++;
  1869.         goto_colon(fileread);  fscanf(fileread, "%d", &iTmp);  // Defense is backwards
  1870.             eveaddvalue[profile][num] = -iTmp;
  1871.             num++;
  1872.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1873.             eveaddvalue[profile][num] = fTmp * 4;
  1874.             num++;
  1875.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1876.             eveaddvalue[profile][num] = fTmp * 4;
  1877.             num++;
  1878.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1879.             eveaddvalue[profile][num] = fTmp * 4;
  1880.             num++;
  1881.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1882.             eveaddvalue[profile][num] = fTmp * 4;
  1883.             num++;
  1884.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1885.             eveaddvalue[profile][num] = fTmp * 4;
  1886.             num++;
  1887.         goto_colon(fileread);  fscanf(fileread, "%f", &fTmp);
  1888.             eveaddvalue[profile][num] = fTmp * 4;
  1889.             num++;
  1890.  
  1891.         // Clear expansions...
  1892.         evecontspawntime[profile] = 0;
  1893.         evecontspawnamount[profile] = 0;
  1894.         evecontspawnfacingadd[profile] = 0;
  1895.         evecontspawnpip[profile] = 0;
  1896.         evewaveindex[profile] = -1;
  1897.         evefrequency[profile] = 11025;
  1898.         evestayifnoowner[profile] = 0;
  1899.         eveoverlay[profile] = 0;
  1900.         // Read expansions
  1901.         while(goto_colon_yesno(fileread))
  1902.         {
  1903.             idsz = get_idsz(fileread);
  1904.             fscanf(fileread, "%c%d", &cTmp, &iTmp);
  1905.             test = ('A'-'A'<<15)|('M'-'A'<<10)|('O'-'A'<<5)|('U'-'A');  // [AMOU]
  1906.             if(idsz == test)  evecontspawnamount[profile] = iTmp;
  1907.             test = ('T'-'A'<<15)|('Y'-'A'<<10)|('P'-'A'<<5)|('E'-'A');  // [TYPE]
  1908.             if(idsz == test)  evecontspawnpip[profile] = iTmp;
  1909.             test = ('T'-'A'<<15)|('I'-'A'<<10)|('M'-'A'<<5)|('E'-'A');  // [TIME]
  1910.             if(idsz == test)  evecontspawntime[profile] = iTmp;
  1911.             test = ('F'-'A'<<15)|('A'-'A'<<10)|('C'-'A'<<5)|('E'-'A');  // [FACE]
  1912.             if(idsz == test)  evecontspawnfacingadd[profile] = iTmp;
  1913.             test = ('S'-'A'<<15)|('E'-'A'<<10)|('N'-'A'<<5)|('D'-'A');  // [SEND]
  1914.             if(idsz == test)
  1915.             {
  1916.                 if(iTmp >= 0 && iTmp < MAXWAVE)
  1917.                 {
  1918.                     evewaveindex[profile] = capwaveindex[profile][iTmp];
  1919.                 }
  1920.             }
  1921.             test = ('S'-'A'<<15)|('F'-'A'<<10)|('R'-'A'<<5)|('Q'-'A');  // [SFRQ]
  1922.             if(idsz == test)  evefrequency[profile] = iTmp;
  1923.             test = ('S'-'A'<<15)|('T'-'A'<<10)|('A'-'A'<<5)|('Y'-'A');  // [STAY]
  1924.             if(idsz == test)  evestayifnoowner[profile] = iTmp;
  1925.             test = ('O'-'A'<<15)|('V'-'A'<<10)|('E'-'A'<<5)|('R'-'A');  // [OVER]
  1926.             if(idsz == test)  eveoverlay[profile] = iTmp;
  1927.         }
  1928.  
  1929.  
  1930.         // All done ( finally )
  1931.         fclose(fileread);
  1932.     }
  1933. }
  1934.  
  1935. //--------------------------------------------------------------------------------------------
  1936. unsigned short get_free_enchant()
  1937. {
  1938.     // ZZ> This function returns the next free enchantment or MAXENCHANT if there are none
  1939.     if(numfreeenchant > 0)
  1940.     {
  1941.         numfreeenchant--;
  1942.         return freeenchant[numfreeenchant];
  1943.     }
  1944.     return MAXENCHANT;
  1945. }
  1946.  
  1947. //--------------------------------------------------------------------------------------------
  1948. void unset_enchant_value(unsigned short enchantindex, unsigned char valueindex)
  1949. {
  1950.     // ZZ> This function unsets a set value
  1951.     unsigned short character;
  1952.  
  1953.     if(encsetyesno[enchantindex][valueindex]==TRUE)
  1954.     {
  1955.         character = enctarget[enchantindex];
  1956.         switch(valueindex)
  1957.         {
  1958.             case SETDAMAGETYPE:
  1959.                 chrdamagetargettype[character] = encsetsave[enchantindex][valueindex];
  1960.                 break;
  1961.             case SETNUMBEROFJUMPS:
  1962.                 chrjumpnumberreset[character] = encsetsave[enchantindex][valueindex];
  1963.                 break;
  1964.             case SETLIFEBARCOLOR:
  1965.                 chrlifecolor[character] = encsetsave[enchantindex][valueindex];
  1966.                 break;
  1967.             case SETMANABARCOLOR:
  1968.                 chrmanacolor[character] = encsetsave[enchantindex][valueindex];
  1969.                 break;
  1970.             case SETSLASHMODIFIER:
  1971.                 chrdamagemodifier[character][DAMAGESLASH] = encsetsave[enchantindex][valueindex];
  1972.                 break;
  1973.             case SETCRUSHMODIFIER:
  1974.                 chrdamagemodifier[character][DAMAGECRUSH] = encsetsave[enchantindex][valueindex];
  1975.                 break;
  1976.             case SETPOKEMODIFIER:
  1977.                 chrdamagemodifier[character][DAMAGEPOKE] = encsetsave[enchantindex][valueindex];
  1978.                 break;
  1979.             case SETHOLYMODIFIER:
  1980.                 chrdamagemodifier[character][DAMAGEHOLY] = encsetsave[enchantindex][valueindex];
  1981.                 break;
  1982.             case SETEVILMODIFIER:
  1983.                 chrdamagemodifier[character][DAMAGEEVIL] = encsetsave[enchantindex][valueindex];
  1984.                 break;
  1985.             case SETFIREMODIFIER:
  1986.                 chrdamagemodifier[character][DAMAGEFIRE] = encsetsave[enchantindex][valueindex];
  1987.                 break;
  1988.             case SETICEMODIFIER:
  1989.                 chrdamagemodifier[character][DAMAGEICE] = encsetsave[enchantindex][valueindex];
  1990.                 break;
  1991.             case SETZAPMODIFIER:
  1992.                 chrdamagemodifier[character][DAMAGEZAP] = encsetsave[enchantindex][valueindex];
  1993.                 break;
  1994.             case SETFLASHINGAND:
  1995.                 chrflashand[character] = encsetsave[enchantindex][valueindex];
  1996.                 break;
  1997.             case SETLIGHTBLEND:
  1998.                 chrlight[character] = encsetsave[enchantindex][valueindex];
  1999.                 break;
  2000.             case SETALPHABLEND:
  2001.                 chralpha[character] = encsetsave[enchantindex][valueindex];
  2002.                 break;
  2003.             case SETSHEEN:
  2004.                 chrsheen[character] = encsetsave[enchantindex][valueindex];
  2005.                 break;
  2006.             case SETFLYTOHEIGHT:
  2007.                 chrflyheight[character] = encsetsave[enchantindex][valueindex];
  2008.                 break;
  2009.             case SETWALKONWATER:
  2010.                 chrwaterwalk[character] = encsetsave[enchantindex][valueindex];
  2011.                 break;
  2012.             case SETCANSEEINVISIBLE:
  2013.                 chrcanseeinvisible[character] = encsetsave[enchantindex][valueindex];
  2014.                 break;
  2015.             case SETMISSILETREATMENT:
  2016.                 chrmissiletreatment[character] = encsetsave[enchantindex][valueindex];
  2017.                 break;
  2018.             case SETCOSTFOREACHMISSILE:
  2019.                 chrmissilecost[character] = encsetsave[enchantindex][valueindex];
  2020.                 chrmissilehandler[character] = character;
  2021.                 break;
  2022.             case SETMORPH:
  2023.                 // Need special handler for when this is removed
  2024.                 change_character(character, chrbasemodel[character], encsetsave[enchantindex][valueindex], LEAVEALL);
  2025.                 break;
  2026.             case SETCHANNEL:
  2027.                 chrcanchannel[character] = encsetsave[enchantindex][valueindex];
  2028.                 break;
  2029.         }
  2030.         encsetyesno[enchantindex][valueindex] = FALSE;
  2031.     }
  2032. }
  2033.  
  2034. //--------------------------------------------------------------------------------------------
  2035. void remove_enchant_value(unsigned short enchantindex, unsigned char valueindex)
  2036. {
  2037.     // ZZ> This function undoes cumulative modification to character stats
  2038.     float fvaluetoadd;
  2039.     int valuetoadd;
  2040.  
  2041.     unsigned short character = enctarget[enchantindex];
  2042.     switch(valueindex)
  2043.     {
  2044.         case ADDJUMPPOWER:
  2045.             fvaluetoadd = encaddsave[enchantindex][valueindex]/16.0;
  2046.             chrjump[character]-=fvaluetoadd;
  2047.             break;
  2048.         case ADDBUMPDAMPEN:
  2049.             fvaluetoadd = encaddsave[enchantindex][valueindex]/128.0;
  2050.             chrbumpdampen[character]-=fvaluetoadd;
  2051.             break;
  2052.         case ADDBOUNCINESS:
  2053.             fvaluetoadd = encaddsave[enchantindex][valueindex]/128.0;
  2054.             chrdampen[character]-=fvaluetoadd;
  2055.             break;
  2056.         case ADDDAMAGE:
  2057.             valuetoadd = encaddsave[enchantindex][valueindex];
  2058.             chrdamageboost[character]-=valuetoadd;
  2059.             break;
  2060.         case ADDSIZE:
  2061.             fvaluetoadd = encaddsave[enchantindex][valueindex]/128.0;
  2062.             chrsizegoto[character]-=fvaluetoadd;
  2063.             chrsizegototime[character] = SIZETIME;
  2064.             break;
  2065.         case ADDACCEL:
  2066.             fvaluetoadd = encaddsave[enchantindex][valueindex]/1000.0;
  2067.             chrmaxaccel[character]-=fvaluetoadd;
  2068.             break;
  2069.         case ADDRED:
  2070.             valuetoadd = encaddsave[enchantindex][valueindex];
  2071.             chrredshift[character]-=valuetoadd;
  2072.             break;
  2073.         case ADDGRN:
  2074.             valuetoadd = encaddsave[enchantindex][valueindex];
  2075.             chrgrnshift[character]-=valuetoadd;
  2076.             break;
  2077.         case ADDBLU:
  2078.             valuetoadd = encaddsave[enchantindex][valueindex];
  2079.             chrblushift[character]-=valuetoadd;
  2080.             break;
  2081.         case ADDDEFENSE:
  2082.             valuetoadd = encaddsave[enchantindex][valueindex];
  2083.             chrdefense[character]-=valuetoadd;
  2084.             break;
  2085.         case ADDMANA:
  2086.             valuetoadd = encaddsave[enchantindex][valueindex];
  2087.             chrmanamax[character]-=valuetoadd;
  2088.             chrmana[character]-=valuetoadd;
  2089.             if(chrmana[character] < 0) chrmana[character] = 0;
  2090.             break;
  2091.         case ADDLIFE:
  2092.             valuetoadd = encaddsave[enchantindex][valueindex];
  2093.             chrlifemax[character]-=valuetoadd;
  2094.             chrlife[character]-=valuetoadd;
  2095.             if(chrlife[character] < 1) chrlife[character] = 1;
  2096.             break;
  2097.         case ADDSTRENGTH:
  2098.             valuetoadd = encaddsave[enchantindex][valueindex];
  2099.             chrstrength[character]-=valuetoadd;
  2100.             break;
  2101.         case ADDWISDOM:
  2102.             valuetoadd = encaddsave[enchantindex][valueindex];
  2103.             chrwisdom[character]-=valuetoadd;
  2104.             break;
  2105.         case ADDINTELLIGENCE:
  2106.             valuetoadd = encaddsave[enchantindex][valueindex];
  2107.             chrintelligence[character]-=valuetoadd;
  2108.             break;
  2109.         case ADDDEXTERITY:
  2110.             valuetoadd = encaddsave[enchantindex][valueindex];
  2111.             chrdexterity[character]-=valuetoadd;
  2112.             break;
  2113.     }
  2114. }
  2115.