This assumes you have the reaper decompiled in quakec. Edit as told below, Compile. Run quake -listen 16 -game {reapa directory}. MAME then kill the bots. Scoreboard code is based on work by Alan Kivlin. Reaperbot by Steven Polge. Hacked by Terry Hendrix. Please read the author's copyrights and abide by them. 1.Open Botspawn.qc. 2.Go to the function void() AddAnotherBot. Before the line "newbot = AddBot();" add this line: if (fClientNo == 15) return; 3.After the line "newbot = AddBot();" add these lines: newbot.id = FindGood(); newbot.colormap = newbot.id + 1; 4.Find the lines that begin with "if (NUMBOTS == TRUE)" now paste over all the lines till you get to "};" with this: if ( (NUMBOTS == TRUE) ) { newbot.netname = "Hal2000"; } else { if ( (NUMBOTS == FL_SWIM) ) { newbot.netname = "STP"; } else { if ( (NUMBOTS == MOVETYPE_WALK) ) { newbot.netname = "Flip"; } else { if ( (NUMBOTS == MOVETYPE_STEP) ) { newbot.netname = "Ack"; } else { if ( (NUMBOTS == MOVETYPE_FLY) ) { newbot.netname = "Ugly"; } else { if ( (NUMBOTS == MOVETYPE_TOSS) ) { newbot.netname = "Evil"; } else { if ( (NUMBOTS == MOVETYPE_PUSH) ) { newbot.netname = "Goody"; } else { if ( (NUMBOTS == FL_CLIENT) ) { newbot.netname = "Bitch"; } else { if ( (NUMBOTS == MOVETYPE_FLYMISSILE) ) { newbot.netname = "Maxx"; } else { if ( (NUMBOTS == MOVETYPE_BOUNCE) ) { newbot.netname = "Alpha"; } else { if ( (NUMBOTS == MOVETYPE_BOUNCEMISSILE) ) { newbot.netname = "Beta"; } else { if ( (NUMBOTS == 12.000) ) { newbot.netname = "Gamma"; } else { if ( (NUMBOTS == 13.000) ) { newbot.netname = "Tau"; } else { if ( (NUMBOTS == 14.000) ) { newbot.netname = "Omega"; } else { if ( (NUMBOTS == 15.000) ) { newbot.netname = "Xi"; } } } } } } } } } } } } } } } local float r, top, bottom; r = random(); top = (random () * 10); top = ceil(top); if (top == 10) { if (r > 0.9) top = 10; else if (r > 0.8) top = 11; else if (r < 0.4) top = 12; else top = 13; } bottom = (random () * 10); bottom = ceil(bottom); if (bottom == 10) { if (r > 0.9) bottom = 10; else if (r > 0.8) bottom = 11; else if (r < 0.4) bottom = 12; else bottom = 13; } WriteByte( MSG_ALL, MSG_UPDATENAME ); WriteByte( MSG_ALL, newbot.id ); WriteString( MSG_ALL, newbot.netname ); WriteByte( MSG_ALL, MSG_UPDATECOLORS ); WriteByte( MSG_ALL, newbot.id ); WriteByte( MSG_ALL, top * 16 + bottom ); WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, newbot.id ); WriteShort( MSG_ALL, newbot.frags ); 5. Open client.qc. 6. Add this at the top: float fClientNo; float fActiveClients; .float id; // message id for update name float MSG_UPDATENAME = 13; // message id for update frags float MSG_UPDATEFRAGS = 14; // message id for update colors float MSG_UPDATECOLORS = 17; float() FindGood = { fClientNo = fClientNo + 1; // if (fClientNo == 15) BotManage("dropany"); if (!(fActiveClients & 1)) { fActiveClients = fActiveClients | 1; return 1; } else if (!(fActiveClients & 2)) { fActiveClients = fActiveClients | 2; return 2; } else if (!(fActiveClients & 4)) { fActiveClients = fActiveClients | 4; return 3; } else if (!(fActiveClients & 8)) { fActiveClients = fActiveClients | 8; return 4; } else if (!(fActiveClients & 16)) { fActiveClients = fActiveClients | 16; return 5; } else if (!(fActiveClients & 32)) { fActiveClients = fActiveClients | 32; return 6; } else if (!(fActiveClients & 64)) { fActiveClients = fActiveClients | 64; return 7; } else if (!(fActiveClients & 128)) { fActiveClients = fActiveClients | 128; return 8; } else if (!(fActiveClients & 256)) { fActiveClients = fActiveClients | 256; return 9; } else if (!(fActiveClients & 512)) { fActiveClients = fActiveClients | 512; return 10; } else if (!(fActiveClients & 1024)) { fActiveClients = fActiveClients | 1024; return 11; } else if (!(fActiveClients & 2048)) { fActiveClients = fActiveClients | 2048; return 12; } else if (!(fActiveClients & 4096)) { fActiveClients = fActiveClients | 4096; return 13; } else if (!(fActiveClients & 8192)) { fActiveClients = fActiveClients | 8192; return 14; } else if (!(fActiveClients & 16384)) { fActiveClients = fActiveClients | 16384; return 15; } else if (!(fActiveClients & 32768)) { fActiveClients = fActiveClients | 32768; return 16; } else return -1; }; void(float abba) MakeGood = { local float ackbar; ackbar = 1; abba = abba - 1; while (abba > 0) { ackbar = ackbar * 2; abba = abba - 1; } fClientNo = fClientNo - 1; fActiveClients = fActiveClients - (fActiveClients & ackbar); }; void(entity object) Update_Frags = { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, object.id ); WriteShort( MSG_ALL, object.frags ); }; 6.Find the text "bprint (" entered the game\n");" and add the line: self.id = FindGood(); after it. 7.Find the text "bprint (" left the game with ");" and add the line: MakeGood(self.id); after it. 8.Replace ClientObituary with this ClientObituary: void (entity targ, entity attacker) ClientObituary = { local float rnum; local string deathstring; local string deathstring2; rnum = random (); if ( ((targ.classname == "player") || (targ.classname == "dmbot")) ) { if ( (attacker.classname == "teledeath") ) { bprint (targ.teamname); bprint (targ.netname); bprint (" was telefragged by "); bprint (attacker.owner.teamname); bprint (attacker.owner.netname); bprint ("\n"); if ( (attacker.owner.classname == "dmbot") ) { TELEFRAGFLAG = TRUE; } attacker.owner.frags = (attacker.owner.frags + TRUE); countkill (attacker.owner,targ); if (attacker.owner.classname == "dmbot") { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, attacker.owner.id ); WriteShort( MSG_ALL, attacker.owner.frags ); } return ; } if ( (attacker.classname == "teledeath2") ) { bprint ("Satan's power deflects "); bprint (targ.teamname); bprint (targ.netname); bprint ("'s telefrag\n"); countkill (targ,targ); targ.frags = (targ.frags - TRUE); if (targ.classname == "dmbot") { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, targ.id ); WriteShort( MSG_ALL, targ.frags ); } return ; } if ( ((attacker.classname == "player") || (attacker.classname == "dmbot")) ) { if ( (targ == attacker) ) { attacker.frags = (attacker.frags - TRUE); if (attacker.classname == "dmbot") { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, attacker.id ); WriteShort( MSG_ALL, attacker.frags ); } countkill (attacker,attacker); bprint (targ.teamname); bprint (targ.netname); if ( ((targ.weapon == FL_GODMODE) && (targ.waterlevel > TRUE)) ) { bprint (" discharges into the water.\n"); return ; } if ( (targ.weapon == FL_INWATER) ) { bprint (" tries to put the pin back in\n"); } else { if ( rnum ) { bprint (" becomes bored with life\n"); } else { bprint (" checks if his weapon is loaded\n"); } } return ; } else { attacker.frags = (attacker.frags + TRUE); if (attacker.classname == "dmbot") { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, attacker.id ); WriteShort( MSG_ALL, attacker.frags ); } countkill (attacker,targ); rnum = attacker.weapon; if ( (rnum == IT_AXE) ) { deathstring = " was ax-murdered by "; deathstring2 = "\n"; } if ( (rnum == IT_SHOTGUN) ) { deathstring = " chewed on "; deathstring2 = "'s boomstick\n"; } if ( (rnum == IT_SUPER_SHOTGUN) ) { deathstring = " ate 2 loads of "; deathstring2 = "'s buckshot\n"; } if ( (rnum == IT_NAILGUN) ) { deathstring = " was nailed by "; deathstring2 = "\n"; } if ( (rnum == IT_SUPER_NAILGUN) ) { deathstring = " was punctured by "; deathstring2 = "\n"; } if ( (rnum == IT_GRENADE_LAUNCHER) ) { deathstring = " eats "; deathstring2 = "'s pineapple\n"; if ( (targ.health < -40.000) ) { deathstring = " was gibbed by "; deathstring2 = "'s grenade\n"; } } if ( (rnum == IT_ROCKET_LAUNCHER) ) { deathstring = " rides "; deathstring2 = "'s rocket\n"; if ( (targ.health < -40.000) ) { deathstring = " was gibbed by "; deathstring2 = "'s rocket\n"; } } if ( (rnum == IT_LIGHTNING) ) { deathstring = " accepts "; if ( (attacker.waterlevel > TRUE) ) { deathstring2 = "'s discharge\n"; } else { deathstring2 = "'s shaft\n"; } } bprint (targ.teamname); bprint (targ.netname); bprint (deathstring); bprint (attacker.teamname); bprint (attacker.netname); bprint (deathstring2); } return ; } else { targ.frags = (targ.frags - TRUE); if (targ.classname == "dmbot") { WriteByte( MSG_ALL, MSG_UPDATEFRAGS ); WriteByte( MSG_ALL, targ.id ); WriteShort( MSG_ALL, targ.frags ); } rnum = targ.watertype; countkill (targ,targ); bprint (targ.teamname); bprint (targ.netname); if ( (rnum == CONTENT_WATER) ) { if ( (random () < 0.500) ) { bprint (" sleeps with the fishes\n"); } else { bprint (" sucks it down\n"); } return ; } else { if ( (rnum == CONTENT_SLIME) ) { if ( (random () < 0.500) ) { bprint (" gulped a load of slime\n"); } else { bprint (" can't exist on slime alone\n"); } return ; } else { if ( (rnum == CONTENT_LAVA) ) { if ( (targ.health < -15.000) ) { bprint (" burst into flames\n"); return ; } if ( (random () < 0.500) ) { bprint (" turned into hot slag\n"); } else { bprint (" visits the Volcano God\n"); } return ; } } } if ( (attacker.flags & FL_MONSTER) ) { if ( (attacker.classname == "monster_army") ) { bprint (" was shot by a Grunt\n"); } if ( (attacker.classname == "monster_demon1") ) { bprint (" was eviscerated by a Fiend\n"); } if ( (attacker.classname == "monster_dog") ) { bprint (" was mauled by a Rottweiler\n"); } if ( (attacker.classname == "monster_dragon") ) { bprint (" was fried by a Dragon\n"); } if ( (attacker.classname == "monster_enforcer") ) { bprint (" was blasted by an Enforcer\n"); } if ( (attacker.classname == "monster_fish") ) { bprint (" was fed to the Rotfish\n"); } if ( (attacker.classname == "monster_hell_knight") ) { bprint (" was slain by a Death Knight\n"); } if ( (attacker.classname == "monster_knight") ) { bprint (" was slashed by a Knight\n"); } if ( (attacker.classname == "monster_ogre") ) { bprint (" was destroyed by an Ogre\n"); } if ( (attacker.classname == "monster_oldone") ) { bprint (" became one with Shub-Niggurath\n"); } if ( (attacker.classname == "monster_shalrath") ) { bprint (" was exploded by a Vore\n"); } if ( (attacker.classname == "monster_shambler") ) { bprint (" was smashed by a Shambler\n"); } if ( (attacker.classname == "monster_tarbaby") ) { bprint (" was slimed by a Spawn\n"); } if ( (attacker.classname == "monster_vomit") ) { bprint (" was vomited on by a Vomitus\n"); } if ( (attacker.classname == "monster_wizard") ) { bprint (" was scragged by a Scrag\n"); } if ( (attacker.classname == "monster_zombie") ) { bprint (" joins the Zombies\n"); } return ; } if ( (attacker.classname == "explo_box") ) { bprint (" blew up\n"); return ; } if ( ((attacker.solid == SOLID_BSP) && (attacker != world)) ) { bprint (" was squished\n"); return ; } if ( (targ.deathtype == "falling") ) { targ.deathtype = ""; bprint (" fell to his death\n"); return ; } if ( ((attacker.classname == "trap_shooter") || (attacker.classname == "trap_spikeshooter")) ) { bprint (" was spiked\n"); returnà; } if ( (attacker.classname == "fireball") ) { bprint (" ate a lavaball\n"); return ; } if ( (attacker.classname == "trigger_changelevel") ) { bprint (" tried to leave\n"); return ; } bprint (" died\n"); } } };