I felt creative last night, so I added a new type of spellcasting. It works
_alright_ with a few kinks.
Here's what I did, using Circlemud 3.0 (very modified):
I wanted players to take time to cast a spell. I also wanted to modify
their prompt to show how far along they are in the spellcasting. I modified
the following lines:
inside comm.c in the heartbeat I added
<snip>
if (!(pulse % (PASSES_PER_SEC))) /* 1 second */
update_spells();
</snip>
this is used to update the progress of each player's spellcasting every
second.
Heres is the func update_spells
void update_spells(void)
{
struct char_data *i, *next_char;
for (i = character_list; i; i = next_char)
{
if (IS_CASTING(i))
{
if ((i)->player.casting_time_left > 1)
(i)->player.casting_time_left--;
else if ((i)->player.casting_time_left == 1)
{
send_to_char(make_prompt(i), i);
cast_spell(i, i->player.spell_vict,
i->player.spell_obj_vict, i->player.casting_spell);
IS_CASTING(i) = 0;
}
}
}
return;
}
(sorry about the long lines)
inside the spell_parser.c I modified the ACMD(do_cast) to look like this:
(near the end of it)
<snip>
ch->player.spell_vict = tch;
ch->player.spell_obj_vict = tobj;
ch->player.casting_spell = spellnum;
ch->player.casting_time_left = SINFO.casting_time;
IS_CASTING(ch) = TRUE;
/* cast spell returns 1 on success; subtract mana & set waitstate */
//if (cast_spell(ch, tch, tobj, spellnum))
//{
// WAIT_STATE(ch, PULSE_VIOLENCE);
// if (mana > 0)
// GET_MANA(ch) = MAX(0, MIN(GET_MAX_MANA(ch), GET_MANA(ch) - mana));
//}
</snip>
This assigns the target data to the char struct, sets them to casting, and
sets up the casting time left.
I also added a line to the make_prompt func:
right before strcat(prompt, ">");
</snip>
if (IS_CASTING(d->character))
{
spell_percent = 100 *
(spell_info[d->character->player.casting_spell].casting_time -
(d->character->player.casting_time_left)) /
spell_info[d->character->player.casting_spell].casting_time;
sprintf(prompt + strlen(prompt), "%s(%s %d)", BCCCYN(d->character, NRM),
spells[d->character->player.casting_spell], spell_percent);
}
</snip>
all the objects I created in this are working fine, cept I want to modify
the code in order to send a prompt to the char at certain keypoints in the
spellcasting (25%, 50%, 75%, 100%) I have spells set to a generic 5 real
life seconds to cast(it works great) but that won't fall on 25%, 50%, etc.
I wanted to multiply the casting time (in seconds) by PULSES_PER_SECOND and
then remove the update_spells() from inside the if statement. While I
realize that this will bog down the performance of the code, i might be able
to get away with 2 times every second. How do I do this?
Thanks in advance. (sorry about the long lines)
Rob
_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/05/01 PST