/*******************************************************************************
Save this file to your ./src directory, and if necessary, add zoom.o to your
Makefile. Alternately, just paste spell_warp into magic.c. Now, follow the
rest of these instructions...
-------------------------------------------------------------------------merc.h-
Now, add this to struct area_data:
int warp_room;
int warp_cost;
------------------------------------------------------------------------magic.h-
Add this to the bottom of the file.
DECLARE_SPELL_FUN( spell_warp );
------------------------------------------------------------------------const.c-
Add this to your skill table.
{
"warp", {15, 20, 35, 45}, {2, 2, 3, 4},
spell_warp, TAR_IGNORE, POS_STANDING,
NULL, SLOT (0), 5, 12,
"", "!Warp!", ""},
----------------------------------------------------------------------olc_act.c-
Add this to aedit_show, wherever you'd like:
sprintf (buf, "Warp: %s (room %d, %dmp)\n\r",
get_room_index (pArea->warp_room) ?
get_room_index (pArea->warp_room)->name : "none",
pArea->warp_room, pArea->warp_cost);
send_to_char (buf, ch);
Add this function amongst the other aedit functions:
AEDIT (aedit_warp)
{
AREA_DATA *pArea;
char arg[MSL];
EDIT_AREA (ch, pArea);
argument = one_argument (argument, arg);
if (!str_prefix (arg, "room"))
{
ROOM_INDEX_DATA * pRoom;
int vnum;
if (!is_number (argument) || argument[0] == '\0')
{
send_to_char ("Syntax: warp room [vnum]\n\r", ch);
return FALSE;
}
vnum = atoi (argument);
if ((pRoom = get_room_index (vnum)) == NULL)
{
send_to_char ("No such room!\n\r", ch);
return FALSE;
}
pArea->warp_room = vnum;
send_to_char ("Warp room set.\n\r", ch);
return TRUE;
}
else if (!str_prefix (arg, "cost"))
{
if (!is_number (argument) || argument[0] == '\0')
{
send_to_char ("Syntax: warp cost [cost]\n\r", ch);
return FALSE;
}
pArea->warp_cost = atoi (argument);
send_to_char ("Warp cost set.\n\r", ch);
return TRUE;
}
else
{
send_to_char ("Syntax: warp [room|cost] [#]\n\r", ch);
return FALSE;
}
}
--------------------------------------------------------------------olc.c/olc.h-
Add the prototype and command entry for aedit_warp.
---------------------------------------------------------------------olc_save.c-
Find the following line in save_area():
fprintf (fp, "End\n\n\n\n");
Put this above it:
fprintf (fp, "Warp %d %d\n", pArea->warp_room, pArea->warp_cost);
**** IMPORTANT: Now, do a clean compile, copyover, and asave world.
---------------------------------------------------------------------------db.c-
Add this to the switch in new_load_area():
case 'W':
if (!str_cmp (word, "Warp"))
{
pArea->warp_room = fread_number (fp);
pArea->warp_cost = fread_number (fp);
}
break;
Now compile and copyover again. If it crashes, you ignored the important note.
Otherwise, enjoy. I've included a default helpfile if you don't wish to write
your own.
--------------------------------------------------------------------------------
-1 'WARP'~
Syntax: cast warp
The Warp spell will take you to a predefined place, usually the entrance to,
the area you're in. The actual casting cost differs from place to place.
~
*******************************************************************************/
/***************************************************************************
* You may use this code as you see fit within any non-commercial MUD. *
* My only conditions are that my comments remain in tact, that you do not *
* hesitate to give me feedback on the code, and that you don't claim my *
* work as your own. Enjoy. -- Midboss *
* *********************************************************************** *
* "Warp" spell for instant transportation out of dungeons. *
***************************************************************************/
#include <stdio.h>
#include "merc.h"
#include "interp.h"
/*
* Comment this out if you want it to be user only.
*/
#define GROUP
void spell_warp (int sn, int level, CHAR_DATA * ch, void *vo, int target)
{
ROOM_INDEX_DATA * to_room, * was_in;
AREA_DATA * pArea;
CHAR_DATA * gch, * gch_next;
int cost = 0, members = 1;
pArea = ch->in_room->area;
to_room = get_room_index (pArea->warp_room);
was_in = ch->in_room;
/*
* Are we allowed?
*/
if (IS_SET (ch->in_room->room_flags, ROOM_NO_RECALL)
|| to_room == NULL)
{
send_to_char ("You can't warp out of here.\n\r", ch);
return;
}
#ifdef GROUP
for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room)
if (is_same_group (gch, ch) && gch != ch)
++members;
#endif
/*
* Check the mana cost.
*/
cost = pArea->warp_cost * members;
if (ch->mana < cost)
{
send_to_char ("You don't have enough mana.\n\r", ch);
return;
}
ch->mana = UMAX (0, ch->mana - cost);
/*
* Now move the character.
*/
act ("You disappear in a flash of light.",
ch, NULL, NULL, TO_CHAR);
act ("$n disappears in a flash of light.",
ch, NULL, NULL, TO_ROOM);
char_from_room (ch);
char_to_room (ch, to_room);
act ("$n suddenly appears in a flash of light.",
ch, NULL, NULL, TO_ROOM);
do_function (ch, &do_look, "auto");
/*
* Move the group if necessary.
*/
#ifdef GROUP
for (gch = was_in->people; gch != NULL; gch = gch_next)
{
gch_next = gch->next_in_room;
if (is_same_group (gch, ch) && gch != ch)
{
act ("You disappear in a flash of light.",
gch, NULL, NULL, TO_CHAR);
act ("$n disappears in a flash of light.",
gch, NULL, NULL, TO_ROOM);
char_from_room (gch);
char_to_room (gch, to_room);
act ("$n suddenly appears in a flash of light.",
gch, NULL, NULL, TO_ROOM);
do_function (gch, &do_look, "auto");
}
}
#endif
}