|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 6866 (0x1ad2) Types: TextFile Names: »blood.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Abermud/blood.c«
/* ** The combat system, This is one piece of code where mobile player ** differences still show up a lot. ** in_fight and pfighting should be player properties for quick reference */ #include "kernel.h" #ifdef RCSID static char RCS[] = "$Header: blood.c,v 1.1 89/03/13 09:35:34 rsalz Exp $"; #endif /* RCSID */ /* ** Calculate damage done by an item */ int dambyitem(it) int it; { if (it == -1) return 8; return !otstbit(it, 15) ? -1 : obyte(it, 0) + 8; } /* ** Command function block to handle wielding of weapons. On full ** database version of system, you should use a parameter for the ** item to wield */ weapcom() { int a; if ((a = ob1) == -1) bprintf("Whats a %s?\n", item1); else if (dambyitem(a) < 0) { bprintf("Thats not a weapon\n"); setpwpn(mynum, -1); error(); } else setpwpn(mynum, a); } /* ** Routine to hit a player, not just the kill command - lower level */ hitplayer(victim, wpn) int victim, wpn; { int x[4]; int cth, ddn, res; char ms[80]; /* Catch case of victim being ex'd or quiting etc */ if (EMPTY(pname(victim))) return; /* Bloody special cases, they get everywhere! */ if (plev(mynum) < 11 && EQ(pname(victim), "Chicken") && !psex(victim)) { bprintf("As you look up you see the sky is somehow different\n"); bprintf("The next second you're crushed to death as the sky hits you\n"); sprintf(ms, "You see %s squashed as they attack Chicken Licken\n", pname(mynum)); sendsys(pname(mynum), pname(mynum), -10000, ploc(mynum), ms); loseme(); crapup("Chicken Licken was right\n"); } if (testpeace()) return; if (!iscarrby(wpn, mynum) && wpn != -1) { bprintf("You belatedly realise you dont have the %s,\nand are forced to use your hands instead..\n", oname(wpn)); if (pwpn(mynum) == wpn) setpwpn(mynum, -1); wpn = -1; } setpwpn(mynum, wpn); if (wpn == 32 && iscarrby(16, victim)) { bprintf("The runesword flashes back away from its target, growling in anger!\n"); return; } if (dambyitem(wpn) < 0) { bprintf("That's no good as a weapon\n"); setpwpn(mynum, -1); error(); return; } if (in_fight) { bprintf("You are already fighting!\n"); error(); return; } fighting = victim; setpfighting(mynum, victim); in_fight = 300; res = randperc(); /* Shields still hard wired - needs changing to armour table */ cth = 57; if (iswornby(89, victim) || iswornby(113, victim) || iswornby(114, victim)) cth -= 10; if (cth < 0) cth = 0; if (cth > res) { bprintf("You hit \001p%s\001 ", pname(victim)); if (wpn != -1) bprintf("with the %s", oname(wpn)); bprintf("\n"); ddn = randperc() % (1 + dambyitem(wpn)); x[0] = mynum; x[1] = ddn; x[2] = wpn; if (pstr(victim) - ddn < 0) { bprintf("Your last blow did the trick\n"); if (pstr(victim) >= 0) { /* Bonus ? */ if (victim < 16) setpscore(mynum, pscore(mynum) + (plev(victim) * plev(victim) * plev(victim) * 10)); else setpscore(mynum, pscore(mynum) + 10 * damof(victim)); } setpstr(victim, -1); /* MARK ALREADY DEAD */ in_fight = 0; fighting = -1; setpfighting(mynum, -1); } sendsys(pname(victim), pname(mynum), -10021, ploc(mynum), (char *) x); if (victim > 15) woundmn(victim, ddn); setpscore(mynum, pscore(mynum) + ddn * 2); calibme(); return; } bprintf("You missed \001p%s\001\n", pname(victim)); x[0] = mynum; x[1] = -1; x[2] = wpn; sendsys(pname(victim), pname(mynum), -10021, ploc(mynum), (char *) x); if (victim > 15) woundmn(victim, 0); } /* ** The killing and hitting command */ killcom() { if (pl1 == -1 && ob1 == -1) { bprintf("Kill who\n"); error(); return; } if (EQ(item1, "door")) { if (EQ(pname(mynum), "Moog")) wreckdoor(); else { printf("Who do you think you are , Moog ?\n"); error(); } return; } if (ob1 != -1) { breakitem(ob1); return; } if (pl1 == -1) { bprintf("You can't do that\n"); error(); return; } if (pl1 == mynum) { bprintf("Come on, it will look better tomorrow...\n"); error(); return; } if (ploc(pl1) != ploc(mynum)) { bprintf("They aren't here\n"); error(); return; } if (shimge[0]) { bprintf("Sorry its too peaceful for violence!\n"); error(); return; } if (ptstflg(pl1, 12)) { bprintf("Not them..\n"); error(); return; } if (ob2 == -1) { hitplayer(pl1, pwpn(mynum)); return; } hitplayer(pl1, ob2); } /* ** Receive a combat event */ bloodrcv(array, isme) int *array; int isme; { char ms[128]; if (!isme) return; /* Hit views handled elsewhere */ if (array[0] < 0) return; /* Silly value dump */ if (EMPTY(pname(array[0]))) return; /* Enemy has beem ex'd */ fighting = array[0]; setpfighting(mynum, array[0]); in_fight = 300; if (ploc(mynum) != ploc(array[0])) return; if (array[1] == -1) { bprintf("\001p%s\001 attacks you", pname(array[0])); if (array[2] != -1) bprintf(" with the %s", oname(array[2])); bprintf("\n"); } else { bprintf("You are wounded by \001p%s\001", pname(array[0])); if (array[2] > -1) bprintf(" with the %s", oname(array[2])); bprintf("\n"); if (plev(mynum) < 10) { setpstr(mynum, pstr(mynum) - array[1]); if (array[0] == 16) { setpscore(mynum, pscore(mynum) - 100 * array[1]); bprintf("You feel weaker, as the wraiths icy touch seems to drain your very life force\n"); if (pscore(mynum) < 0) setpstr(mynum, -1); } } if (pstr(mynum) < 0) { mudlog("%s slain by %s", pname(mynum), pname(array[0])); dumpitems(); closeworld(); delpers(pname(mynum)); openworld(); sprintf(ms, "\001p%s\001 has just died.\n", pname(mynum)); sendsys(pname(mynum), pname(mynum), -10000, ploc(mynum), ms); sprintf(ms, "[ \001p%s\001 has been slain by \001p%s\001 ]\n", pname(mynum), pname(array[0])); sendsys(pname(mynum), pname(mynum), -10113, ploc(mynum), ms); loseme(); crapup("Oh dear... you seem to be slightly dead\n"); } me_cal = 1; /* Queue an update when ready */ } } breakitem(x) { switch (x) { default: bprintf("You can't do that\n"); break; case 171: sys_reset(); break; case 93: bprintf("You smash it apart to reveal a gem inside\n"); oclrbit(94, 0); setoloc(94, oloc(93), ocarrf(93)); destroy(93); break; case -1: bprintf("What is that ?\n"); break; } } wreckdoor() { int a; if ((a = fobna("door")) == -1) bprintf("Sos Moogie, no doors here!\n"); else if (state(a) == 0) bprintf("Its already open.\n"); else { setobjstate(a, 0); bprintf("The door flies open!\n"); broad( "\001dYou hear the distinctive crunch of Moog meeting door\n\001"); } } testpeace() { return shimge[0] ? 1 : 0; }