/* ************************************************************************ * File: arena.c * * Usage: DeltaMUD Arena * * * * All rights reserved. See license.doc for complete information. * * * * Copyright (C) 1998 By Michael "Mulder" Fara, Kurt "Frak" Hopfer * * and Lance "Thargor" * * CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. * ************************************************************************ */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "screen.h" /* extern variables */ extern int arena_zone; extern int arena_preproom; extern int arena_observeroom; extern int arena_combatant; extern int arena_observer; extern struct char_data *arenamaster; extern struct char_data *defaultobserve; extern struct room_data *world; extern struct descriptor_data *descriptor_list; extern struct char_data *character_list; /* extern functions */ void deobserve(struct char_data *); void clearobservers(struct char_data*); void linkobserve(struct char_data *who, struct char_data *to); ACMD(do_tell); ACMD(do_action); ACMD (do_gen_comm); void inc_matchcount(struct char_data *ch) { if (GET_ARENASTAT(ch) == ARENA_COMBATANT1){ GET_ARENASTAT(ch) = ARENA_COMBATANT2; send_to_char ("\r\nYou've used up one of your arena matches. " "Two left.\r\n\r\n", ch); } else if (GET_ARENASTAT(ch) == ARENA_COMBATANT1w){ GET_ARENASTAT(ch) = ARENA_COMBATANT2; send_to_char ("\r\nYou've used up one of your arena matches. " "One left.\r\n\r\n", ch); } else if (GET_ARENASTAT(ch) == ARENA_COMBATANT2){ GET_ARENASTAT(ch) = ARENA_COMBATANT3; send_to_char ("\r\nYou've used up two of your arena matches. " "One left.\r\n\r\n", ch); } else if (GET_ARENASTAT(ch) == ARENA_COMBATANT3){ GET_ARENASTAT(ch) = ARENA_COMBATANTZ; send_to_char ("\r\nYou've used up all three of your arena matches!\r\n" "Thank you. Come again.\r\n\r\n", ch); } else { mudlog ("DEBUG: arena combatant but not flagged as such?", BRF, LVL_IMMORT, TRUE); send_to_char ("Hmmm, your arena matches are screwed!\r\n", ch); } } void trans_to_preproom(struct char_data *ch) { GET_HIT(ch) = 1; char_from_room (ch); char_to_room (ch, real_room(arena_preproom)); act ("$n has entered the Arena Prep Room.", FALSE, ch, 0, 0, TO_NOTVICT); look_at_room (ch, 0); } void match_over(struct char_data *winner, struct char_data *loser, char *msg, int loser_to_preproom) { int winnings; if (winner == NULL) return; if (loser == NULL) return; if (IS_NPC(winner) || IS_NPC(loser)) return; if (!IS_ARENACOMBATANT(winner)){ sprintf (buf2, "DEBUG: match_over called but %s (winner) is not flagged an arena combatant?!\r\n", GET_NAME(winner)); mudlog (buf2, BRF, LVL_GRGOD, TRUE); return; } if (!IS_ARENACOMBATANT(loser)){ sprintf (buf2, "DEBUG: match_over called but %s (loser) is not flagged an arena combatant?!\r\n", GET_NAME(loser)); mudlog (buf2, BRF, LVL_GRGOD, TRUE); return; } winnings = (int) (GET_LEVEL(loser) * arena_combatant * number(5,15) * 0.1); act ("$n has WON this match!", FALSE, winner, 0, 0, TO_NOTVICT); sprintf(buf2,"\r\n&RYou are victorious!!! " "You have been rewarded %d coins for winning.&n\r\n\r\n", winnings); send_to_char (buf2, winner); GET_GOLD(winner) += winnings; if (GET_ARENAWINS(winner) < 254) GET_ARENAWINS(winner) += 1; GET_ARENAFLEETIMER(winner) = 0; act ("$n has lost this match!", FALSE, loser, 0, 0, TO_NOTVICT); send_to_char ("\r\n&RYou have lost the match! Sorry...&n\r\n\r\n", loser); if (GET_ARENALOSSES(loser) < 254) GET_ARENALOSSES(loser) += 1; GET_ARENAFLEETIMER(loser) = 0; if (FIGHTING(winner)) stop_fighting(winner); if (FIGHTING(loser)) stop_fighting(FIGHTING(loser)); GET_POS(loser) = POS_STANDING; if (GET_ARENASTAT(winner) == ARENA_COMBATANT1) GET_ARENASTAT(winner) = ARENA_COMBATANT1w; inc_matchcount(loser); sprintf(buf2, "%s has won a match against %s! %s", GET_NAME(winner), GET_NAME(loser), msg); do_gen_comm (arenamaster, buf2, 1, SCMD_ARENA); log(buf2); if (loser_to_preproom == TRUE) trans_to_preproom(loser); } void bup_affects(struct char_data *ch) { if (IS_NPC(ch)) return; BUP_WIMP_LEV(ch) = GET_WIMP_LEV(ch); GET_WIMP_LEV(ch) = 0; BUP_RECALL_LEV(ch) = GET_RECALL_LEV(ch); GET_RECALL_LEV(ch) = 0; BUP_AFF_FLAGS(ch) = AFF_FLAGS(ch); BUP_AFFECTED(ch) = ch->affected; AFF_FLAGS(ch) = 0; ch->affected = NULL; } void restore_bup_affects(struct char_data *ch) { if (IS_NPC(ch)) return; /* First clearoff the arena affects */ while (ch->affected) affect_remove(ch, ch->affected); /* Now restore the backed up one */ AFF_FLAGS(ch) = BUP_AFF_FLAGS(ch); ch->affected = BUP_AFFECTED(ch); GET_WIMP_LEV(ch) = BUP_WIMP_LEV(ch); GET_RECALL_LEV(ch) = BUP_RECALL_LEV(ch); }