/************************************************************************** * File: combat_act.c * * Author: Midboss * * Purpose: Command functions for turn-based combat on ROM MUDs. * * License: * * Give credit where it is due; be it in the main combat helpfile * * or in your login sequence. Just don't claim this as your own * * original work, lest you become the next Vryce. * * * * This code is provided as-is, and was created on a stock QuickMUD * * server. The only guarantee I'll offer is that it works, when * * properly installed, on a ROM MUD (in particular, QuickMUD). * **************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include "merc.h" /* * Begins a fight! */ void do_fight (CHAR_DATA * ch, char * argument) { CHAR_DATA * vch; if (is_fighting (ch)) { send_to_char ("You're already fighting!\n\r", ch); return; } if (argument[0] == '\0') { send_to_char ("Fight whom?\n\r", ch); return; } if ((vch = get_char_room (ch, argument)) == NULL) { send_to_char ("They aren't here!\n\r", ch); return; } if (vch == ch) { send_to_char ("You won!\n\r", ch); return; } //Might want to add kill steal/illegal player kill protection to this. if (is_fighting (vch)) { char_to_combat (ch, vch->in_battle); act ("You rush headlong into the fray!", ch, NULL, vch, TO_CHAR); act ("$n rushes headlong into the fray!", ch, NULL, vch, TO_ROOM); return; } initiate_combat (ch, vch); act ("You initiate combat against $N.", ch, NULL, vch, TO_CHAR); act ("$n initiates combat against you.", ch, NULL, vch, TO_VICT); act ("$n initiates combat against $N.", ch, NULL, vch, TO_NOTVICT); return; } /* * Basic attack. This includes damroll and crude level based attack bonus and * defense application. */ void do_attack (CHAR_DATA * ch, char * argument) { CHAR_DATA * vch; if (!is_fighting (ch)) { send_to_char ("You're not fighting!\n\r", ch); return; } if (argument[0] == '\0') { send_to_char ("Attack whom?\n\r", ch); return; } if ((vch = get_char_room (ch, argument)) == NULL) { send_to_char ("They aren't here!\n\r", ch); return; } if (!is_fighting (vch) || is_same_group (ch, vch)) { send_to_char ("They aren't fighting you!\n\r", ch); return; } if (!is_active (ch)) { send_to_char ("Just wait your turn.\n\r", ch); return; } act ("You execute a physical attack against $N.", ch, NULL, vch, TO_CHAR); act ("$n executes a physical attack against you.", ch, NULL, vch, TO_VICT); act ("$n executes a physical attack against $N.", ch, NULL, vch, TO_NOTVICT); damage_new (ch, vch, (GET_DAMROLL(ch) + ch->level) - vch->level, 0, "attack", FALSE, DAM_OTHER); if (is_fighting (ch)) turn_end (ch->turn, 200 - GET_SPEED (ch)); return; } /* * Displays the active turn list. * Goes 20 turns deep, assuming everyone uses "Attack". */ void do_turns (CHAR_DATA * ch, char * argument) { char buf[100]; TURN_DATA * turn, * list; int round = 1, count = 0; int atime = 200, btime = 0; if (!is_fighting (ch)) { send_to_char ("You aren't part of a battle.\n\r", ch); return; } for (list = ch->in_battle->turn_list; list != NULL; list = list->next) count++; if (count < 1) { send_to_char ("You aren't part of a battle, yet.\n\r", ch); return; } list = ch->in_battle->turn_list; turn = ch->in_battle->turn_list; while (round < 21) { if (turn->roundtime + (atime - GET_SPEED (turn->unit)) > list->roundtime + (btime - GET_SPEED (turn->unit))) { if (list->next == NULL) { turn = list; list = ch->in_battle->turn_list; btime += 200; } else { turn = list; list = list->next; } } atime += 200; if (turn->unit != ch) { sprintf (buf, "{D[{C%2d{D]{R $N", round); act (buf, ch, NULL, turn->unit, TO_CHAR); } else { sprintf (buf, "{D[{C%2d{D]{w You{x\n\r", round); send_to_char (buf, ch); } round++; } return; } /* * Displays the unit list for a battle. */ void do_units (CHAR_DATA * ch, char * argument) { char buf[100]; CHAR_DATA * unit; int count = 0; if (!is_fighting (ch)) { send_to_char ("You aren't part of a battle.\n\r", ch); return; } for (unit = ch->in_battle->unit_list; unit != NULL; unit = unit->next_in_battle) { count++; if (unit != ch) { if (is_same_group (unit, ch)) sprintf (buf, "{D[{M%2d{D]{C $N", count); else sprintf (buf, "{D[{M%2d{D]{R $N", count); act (buf, ch, NULL, unit, TO_CHAR); } else { sprintf (buf, "{D[{M%2d{D]{w You{x\n\r", count); send_to_char (buf, ch); } } return; } /* * Skips this turn, letting the next character go first. */ void do_wait (CHAR_DATA * ch, char * argument) { if (!is_fighting (ch) || !is_active (ch)) { act ("You wait patiently.", ch, NULL, NULL, TO_CHAR); act ("$n waits patiently.", ch, NULL, NULL, TO_ROOM); return; } act ("You bide your time to see what $N will do.", ch, NULL, ch->in_battle->turn_list->next->unit, TO_CHAR); act ("$n bides $s time to see what you will do.", ch, NULL, ch->in_battle->turn_list->next->unit, TO_VICT); act ("$n bides $s time to see what $N will do.", ch, NULL, ch->in_battle->turn_list->next->unit, TO_NOTVICT); skip_turn (ch->turn, TRUE); return; } /* * Attempts to flee from combat. */ void do_escape (CHAR_DATA * ch, char * argument) { COMBAT_DATA * battle; if (!is_fighting (ch)) { send_to_char ("You try frantically to escape from your own stupidity.\n\r", ch); return; } if (!is_active (ch)) { send_to_char ("Just wait your turn to run away screaming!\n\r", ch); return; } if (number_percent () > 40) { act ("You failed to escape!", ch, NULL, NULL, TO_CHAR); act ("$n tries desperately to escape, but fails!", ch, NULL, NULL, TO_ROOM); turn_end (ch->turn, 160 - GET_SPEED (ch)); return; } battle = ch->in_battle; act ("You execute a daring escape to stage left!", ch, NULL, NULL, TO_CHAR); act ("$n executes a daring escape to stage left!", ch, NULL, NULL, TO_ROOM); char_from_combat (ch); check_victory (battle); return; }