From: George <gagreer@dragon.ham.muohio.edu> Someone mentioned multihitting in relation to a fountain of code or something and since it's pretty easy, here goes: heh, the fount of code (if it could be named such) is in the ftp.circlemud.org contrib directory... called Lostlands1.05.tgz (orsomething similar). Based on pl8, modified by yours truly. On to george's code: The for(j = 1; j <=4; j++) loop for attacks seems slightly less efficient where it is, since it means that you go through combat_list 4 times, and when there's a great lot of players on, this could equate to lag. (maybe) Instead, if you move take out that for, and change the if (j > numhits) to something like while (numhits-- > 0), it should work. (at least, it looks similar to the one I'm using). THe problem with the change is, though it makes it more efficient (I think), it makes each ch attack their full amount at one time, where as George's code allows 'staggered' combat. (which, if you don't mind the hypothetical extra processor time, is preferenciably better). (code below, with my comments in []) void perform_violence(void) { [code snip] for (j = 1;j <= 4;j++) { ^^^-- Change the 4 if you add more than 4 attacks/round [ ^^ THIS FOR IS THE ONE I"M TALKING ABOUT] for (ch = combat_list; ch; ch = next_combat_list) { next_combat_list = ch->next_fighting; switch GET_CLASS(ch) { case CLASS_CLERIC: numhits = GET_LEVEL(ch) / HIT_CLERIC; break; case CLASS_WARRIOR: numhits = GET_LEVEL(ch) / HIT_WARRIOR; break; case CLASS_THIEF: numhits = GET_LEVEL(ch) / HIT_THIEF; break; case CLASS_MAGIC_USER: numhits = GET_LEVEL(ch) / HIT_MAGIC; break; default: numhits = GET_LEVEL(ch) / HIT_MOB; } numhits = MAX(1, numhits); << Without this line you will have _0_ attacks per round (you just sit there) if (numhits >= j) { [ ^^^ CHANGE THIS TO: while (numhits-- > 0) ] if (FIGHTING(ch) == NULL || ch->in_room != FIGHTING(ch)->in_room) { stop_fighting(ch); continue; } [npc scrambling snip] hit(ch, FIGHTING(ch), TYPE_UNDEFINED); if (MOB_FLAGGED(ch, MOB_SPEC) && mob_index[GET_MOB_RNUM(ch)].func != NULL) (mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, ""); } } Note: The {}'s might not line up as I had to cut out some of my custom code, but you should get the idea... -George -- Billy H. Chan bhchan@po.eecs.berkeley.edu bhchan@csua.berkeley.edu CogSci/CompSci http://www.csua.berkeley.edu/~bhchan ResumeInside
This archive was generated by hypermail 2b30 : 12/18/00 PST