/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * _/ _/ * * _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ * *************************************************************************** * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), * * Additional credits are in the help file CODECREDITS * * All Rights Reserved. * ***************************************************************************/ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "interp.h" #define ARENA_LVNUM 200 // lower vnum for the arena #define ARENA_HVNUM 217 // upper vnum for the arena #define ARENA_PLAYERS 6 // max players in the arena int arenapeople = 0; int next_arena_room; void do_arenastats(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; int hp_stats = 0; int mana_stats = 0; int move_stats = 0; if (IS_NPC(ch)) return; if (ch->in_room != NULL) { if (IS_SET(ch->in_room->room_flags, ROOM_ARENA)) { send_to_char("Your in the arena.\n\r", ch); return; } } send_to_char("#G People in the arena#n\n\r\n\r", ch); send_to_char("#RName Health Stamina Mana#n\n\r", ch); send_to_char("#0----------------------------------------------#n\n\r", ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->character != NULL) { if (d->character->in_room != NULL) { if (!IS_SET (d->character->in_room->room_flags, ROOM_ARENA)) continue; if (d->character->max_hit > 0) hp_stats = 100 * d->character->hit / d->character->max_hit; if (d->character->max_move > 0) move_stats = 100 * d->character->move / d->character->max_move; if (d->character->max_mana > 0) mana_stats = 100 * d->character->mana / d->character->max_mana; xprintf(buf, "%-15s %3d/100 %3d/100 %3d/100\n\r", d->character->name, hp_stats, move_stats, mana_stats); send_to_char(buf, ch); } } } return; } void do_arenaset(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg1[MIL]; char arg2[MIL]; char arg3[MIL]; char arg4[MIL]; argument = one_argument(argument, arg1); argument = one_argument(argument, arg2); argument = one_argument(argument, arg3); argument = one_argument(argument, arg4); if (IS_NPC(ch)) return; if (arg1[0] == '\0') { send_to_char ("Syntax : arenaset <player1> <player2> <player3> <player4>\n\r", ch); return; } xprintf(buf, "%s 50", arg1); do_transfer(ch, buf); do_restore(ch, arg1); if (arg2[0] != '\0') { xprintf(buf, "%s 58", arg2); do_transfer(ch, buf); do_restore(ch, arg2); } if (arg3[0] != '\0') { xprintf(buf, "%s 65", arg3); do_transfer(ch, buf); do_restore(ch, arg3); } if (arg4[0] != '\0') { xprintf(buf, "%s 67", arg4); do_transfer(ch, buf); do_restore(ch, arg4); } xprintf(buf, "The fighters have entered the arena, the battle has begun"); do_ainfo(ch, buf); return; } void open_arena() { arenaopen = TRUE; next_arena_room = ARENA_LVNUM; // first person to join will be put in this room. if (number_range(1, 10) > 0) { do_ainfo(NULL, "#wThe doors to the #RARENA#w open and the crowd cheers. Type #RARENAJOIN#w to Battle#n"); } return; } void close_arena() { CHAR_DATA *gch = NULL; CHAR_DATA *vch; int arenaplayers = 0; arenaopen = FALSE; for (vch = char_list; vch != NULL; vch = vch->next) { if (IS_NPC(vch)) continue; if (vch->in_room != NULL) { if (IS_SET(vch->in_room->room_flags, ROOM_ARENA)) { gch = vch; arenaplayers++; } } } /* * if there was only one player, remove him */ if (arenaplayers <= 1) { if (arenaplayers) { char_from_room(gch); char_to_room(gch, get_room_index(ROOM_VNUM_ALTAR)); } do_ainfo(NULL, "#wThe crowd #GBOOS#w as the #RArena#w doors close due to lack of brave souls#n"); arenapeople = 0; current_arena = FALSE; return; } else for (vch = char_list; vch != NULL; vch = vch->next) { if (IS_NPC(vch)) continue; if (vch->in_room != NULL) { if (IS_SET(vch->in_room->room_flags, ROOM_ARENA)) { gch = vch; char_from_room(vch); char_to_room(vch, get_room_index(next_arena_room)); next_arena_room += (ARENA_HVNUM - ARENA_LVNUM) / ARENA_PLAYERS; } } } do_ainfo(NULL, "#wThe Gladiators are ready let the #RBLOODBATH#w begin.#n"); arenapeople = 0; return; } void do_arenajoin(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; ROOM_INDEX_DATA *location; one_argument(argument, arg); if (IS_NPC(ch)) return; if (ch->fight_timer > 0) { send_to_char("You have a fighttimer.\n\r", ch); return; } if (!str_cmp(arg, "start")) { if (current_arena == TRUE) { stc("There is currently an arena match in progress.",ch); return; } if (ch->hit < (ch->max_hit * .9)) { stc("You are not healthy enough.\n\r",ch); return; } if (arenaopen) { stc("The arena is already open.\n\r",ch); return; } xprintf(buf,"#GThe arena has been opened at the request of #R%s.", ch->name); do_info(ch, buf); open_arena(); pulse_arena = PULSE_ARENA; return; } if (!arenaopen) { send_to_char("The arena is closed.\n\r", ch); return; } if (ch->in_room != NULL) { if (IS_SET(ch->in_room->room_flags, ROOM_ARENA) || IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)) { send_to_char ("This room is not connected to the astral sphere.\n\r", ch); return; } } for (d = descriptor_list; d != NULL; d = d->next) { if (d->character != NULL) { if (!d->connected == CON_PLAYING) continue; if (d->character->in_room != NULL) { if (IS_SET (d->character->in_room->room_flags, ROOM_ARENA)) arenapeople++; } } } if (arenapeople > ARENA_PLAYERS) { send_to_char("The arena is crowded right now.\n\r", ch); return; } if ((location = get_room_index(ROOM_VNUM_ARENA_WAITING)) == NULL) return; char_from_room(ch); char_to_room(ch, location); xprintf(buf, "The crowd cheers on %s as they step into the arena!", ch->name); current_arena = TRUE; do_ainfo(ch, buf); do_restore(ch, "self"); strip_aggression(ch); return; } void do_resign(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; CHAR_DATA *gch = NULL; int found = 0; ROOM_INDEX_DATA *location; char buf[MAX_STRING_LENGTH]; if (IS_NPC(ch)) return; if (ch->in_room != NULL) { if (!IS_SET(ch->in_room->room_flags, ROOM_ARENA)) { send_to_char("Your not in the arena.\n\r", ch); return; } } xprintf(buf, "%s resigns from the arena", ch->name); do_ainfo(ch, buf); if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL) return; char_from_room(ch); char_to_room(ch, location); ch->fight_timer = 0; do_restore(ch, "self"); do_call(ch, "all"); ch->pcdata->alosses++; for (victim = char_list; victim != NULL; victim = victim->next) { if (IS_NPC(victim)) continue; if (victim->in_room != NULL && IS_SET(victim->in_room->room_flags, ROOM_ARENA) && victim->pcdata->chobj == NULL) { gch = victim; found++; } } if (found == 1) { xprintf(buf, "#C%s #yemerges victorious from the #Rarena#n", gch->name); gch->pcdata->awins++; do_ainfo(gch, buf); if ((location = get_room_index(ROOM_VNUM_ALTAR)) == NULL) return; char_from_room(gch); char_to_room(gch, location); gch->fight_timer = 0; do_restore(gch, "self"); current_arena = FALSE; win_prize(gch); } return; } /* * The challenge system, uses specific vnums of rooms, so don't remove those. */ void do_challenge(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument, arg); one_argument(argument, arg2); if (IS_NPC(ch)) return; if (arg[0] == '\0' || arg2[0] == '\0') { send_to_char("Syntax : Challenge <person> <death/spar>\n\r", ch); return; } if (!TIME_UP(ch, TIMER_CHALLENGE)) { send_to_char ("You can only use challenge once every 2 mud hours.\n\r", ch); return; } if ((victim = get_char_world(ch, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char("You can't challenge monsters.\n\r", ch); return; } if (victim == ch) { send_to_char("Ehm, no.\n\r", ch); return; } if (victim->level != 3) { send_to_char("You can only challenge avatars.\n\r", ch); return; } if (victim == ch->challenger) { send_to_char("You have already challenged them.\n\r", ch); return; } if (!str_cmp(arg2, "death")) ch->deathmatch = TRUE; else if (!str_cmp(arg2, "spar")) ch->deathmatch = FALSE; else { do_challenge(ch, ""); return; } if (ch->deathmatch) { bool canDecap, canKillYou; if (!str_cmp(ch->pcdata->last_decap[0], victim->name)) canDecap = FALSE; else canDecap = fair_fight(ch, victim); if (!str_cmp(victim->pcdata->last_decap[0], ch->name)) canKillYou = FALSE; else canKillYou = fair_fight(victim, ch); if (!canKillYou || !canDecap) { send_to_char ("You cannot challenge someone in a deathmatch if you cannot kill eachother.\n\r", ch); return; } } ch->challenger = victim; send_to_char("You challenge them.\n\r", ch); SET_TIMER(ch, TIMER_CHALLENGE, 2); if (ch->deathmatch) xprintf(buf, "You have been challenged to a #Gdeathmatch#n by %s. Type agree %s to start the fight.\n\r", ch->name, ch->name); else xprintf(buf, "You have been challenged to a #Gspar#n by %s. Type agree %s to start the fight.\n\r", ch->name, ch->name); send_to_char(buf, victim); WAIT_STATE(ch, 8); return; } void do_decline(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument(argument, arg); if (IS_NPC(ch)) return; if (arg[0] == '\0') { send_to_char("Decline whom?\n\r", ch); return; } if ((victim = get_char_world(ch, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char ("You can't decline a monster, since it can't challenge you.\n\r", ch); return; } if (victim->challenger != ch) { send_to_char ("They aren't challenging you. (they may have cancelled the challenge)\n\r", ch); return; } victim->challenger = NULL; send_to_char("You decline their challenge.\n\r", ch); send_to_char("Your challenge has been declined.\n\r", victim); return; } void do_accept2(CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; bool canDecap, canKillYou; ROOM_INDEX_DATA *location; one_argument(argument, arg); if (IS_NPC(ch)) return; if (!arena2) { send_to_char ("The Forbidden Fortress is currently being used by someone else.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Accept who's challenge?\n\r", ch); return; } if ((victim = get_char_world(ch, arg)) == NULL) { send_to_char("They aren't here.\n\r", ch); return; } if (IS_NPC(victim)) { send_to_char ("You cannot accept a challenge from a monster.\n\r", ch); return; } if (victim->challenger != ch) { send_to_char("You haven't been challenged by them.\n\r", ch); return; } if (victim->level != 3) { send_to_char("They have to be avatar.\n\r", ch); return; } if (victim->fight_timer > 0) { send_to_char ("They have a fighttimer currently, you'll have to wait.\n\r", ch); return; } if (ch->fight_timer > 0) { send_to_char("Not with a fight timer.\n\r", ch); return; } if (IS_SET(victim->extra, EXTRA_AFK)) { send_to_char("They are AFK!\n\r", ch); return; } if (victim->position != POS_STANDING) { send_to_char ("They are not standing, you'll have to wait.\n\r", ch); return; } if (ch->in_room != NULL) { if (IS_SET(ch->in_room->room_flags, ROOM_ARENA) || IS_SET(ch->in_room->room_flags, ROOM_ASTRAL)) { send_to_char ("This room is not connected to the astral sphere.\n\r", ch); return; } } if (victim->in_room != NULL) { if (IS_SET(victim->in_room->room_flags, ROOM_ARENA) || IS_SET(victim->in_room->room_flags, ROOM_ASTRAL)) { send_to_char ("Their room is not connected to the astral sphere.\n\r", ch); return; } } if (victim->deathmatch) { if (!str_cmp(ch->pcdata->last_decap[0], victim->name)) canDecap = FALSE; else canDecap = fair_fight(ch, victim); if (!str_cmp(victim->pcdata->last_decap[0], ch->name)) canKillYou = FALSE; else canKillYou = fair_fight(victim, ch); if (!canKillYou || !canDecap) { send_to_char ("You cannot accept a deathmatch if you cannot kill eachother.\n\r", ch); return; } } if ((location = get_room_index(ROOM_VNUM_FORTRESS1)) == NULL) { bug("Fortress Missing.", 0); return; } char_from_room(ch); char_to_room(ch, location); if ((location = get_room_index(ROOM_VNUM_FORTRESS2)) == NULL) { bug("Fortress Missing.", 0); return; } char_from_room(victim); char_to_room(victim, location); do_restore(victim, victim->name); do_restore(ch, ch->name); if (!victim->deathmatch) xprintf(buf, "%s and %s enter #CThe Forbidden Fortress#n to test their skills", ch->name, victim->name); else xprintf(buf, "%s and %s enter #CThe Forbidden Fortress#n to duel for their lives", ch->name, victim->name); do_ainfo(ch, buf); strip_aggression(ch); strip_aggression(victim); arena2 = FALSE; if (victim->deathmatch) arena2death = TRUE; else arena2death = FALSE; victim->challenger = NULL; return; } void do_fortressstats(CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; int hp_stats = 0; int mana_stats = 0; int move_stats = 0; if (IS_NPC(ch)) return; if (in_fortress(ch)) { send_to_char("Hehe.\n\r", ch); return; } send_to_char("#G Forbidden Fortress#n\n\r\n\r", ch); send_to_char("#RName Health Stamina Mana#n\n\r", ch); send_to_char("#0----------------------------------------------#n\n\r", ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->character != NULL) { if (d->character->in_room != NULL) { if (!in_fortress(d->character)) continue; if (d->character->max_hit > 0) hp_stats = 100 * d->character->hit / d->character->max_hit; if (d->character->max_move > 0) move_stats = 100 * d->character->move / d->character->max_move; if (d->character->max_mana > 0) mana_stats = 100 * d->character->mana / d->character->max_mana; xprintf(buf, "%-15s %3d/100 %3d/100 %3d/100\n\r", d->character->name, hp_stats, move_stats, mana_stats); send_to_char(buf, ch); } } } return; } void do_bet(CHAR_DATA * ch, char *argument) { CHAR_DATA *gch; CHAR_DATA *vch; char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int amount, max_bet = 1000; argument = one_argument(argument, arg); one_argument(argument, arg2); if (IS_NPC(ch)) return; if (in_fortress(ch)) { send_to_char("You cannot bet on this fight.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("Syntax : bet <person> <amount>\n\r", ch); return; } if ((amount = atoi(arg2)) < 100) { send_to_char("You must bet at least 100 bones.\n\r", ch); return; } if ((gch = get_char_world(ch, arg)) == NULL) { send_to_char("Bet on whom?\n\r", ch); return; } if (IS_NPC(gch)) { send_to_char("It is not possible to bet on mobiles.\n\r", ch); return; } if (!in_fortress(gch) && !tourney) { send_to_char("They are not in the fortress.\n\r", ch); return; } if (!in_arena(gch) && tourney) { send_to_char("They are not in the arena.\n\r", ch); return; } if (!arena2death && !tourney) { send_to_char ("It is not a deathmatch, you can only bet on deathmatches.\n\r", ch); return; } if (ch->pcdata->betting_char > 0) { send_to_char ("But you already have a wager on this fight.\n\r", ch); return; } if (ch->bones < amount) { send_to_char("But you don't have that many bones.\n\r", ch); return; } if (amount > max_bet) { xprintf(buf, "You can only bet %d bones, that is the maximum.\n\r", max_bet); send_to_char(buf, ch); return; } for (vch = char_list; vch; vch = vch->next) { if (IS_NPC(vch)) continue; if (!in_fortress(vch)) continue; if (vch->hit < vch->max_hit * 0.75) { send_to_char ("Not all players have more than 3/4th of their hps left.\n\r", ch); return; } } ch->bones -= amount; ch->pcdata->betting_amount = amount; ch->pcdata->betting_char = gch->pcdata->playerid; xprintf(buf, "%s places %d on %s as the winner of the deathmatch.", ch->name, amount, gch->name); do_ainfo(ch, buf); return; } void update_bets(CHAR_DATA * ch, CHAR_DATA * victim, bool payoff) { CHAR_DATA *gch; char buf[MAX_STRING_LENGTH]; for (gch = char_list; gch; gch = gch->next) { if (IS_NPC(gch)) continue; if (payoff && gch->pcdata->betting_char == ch->pcdata->playerid) { xprintf(buf, "Congratulations, you win %d bones.\n\r", gch->pcdata->betting_amount * 2); send_to_char(buf, gch); gch->bones += gch->pcdata->betting_amount * 2; xprintf(buf, "ARENA: %s wins %d bones for betting on %s.", gch->name, gch->pcdata->betting_amount * 2, ch->name); log_string(LOG_COMMAND, buf); } else if (!payoff && gch->pcdata->betting_char == ch->pcdata->playerid) { xprintf(buf, "Since the fight ended without a kill, your money is returned.\n\r"); send_to_char(buf, gch); gch->bones += gch->pcdata->betting_amount; } gch->pcdata->betting_amount = 0; gch->pcdata->betting_char = 0; } }