----- Original Message -----
From: "MrFONZY" <mrfonzy@yahoo.com>
> Phillip,
> anywho, I never figured out exactly how they got thiers to work, but
I'm very
> interested in trying it out so keep us up to date with what you can
get
> running!:)
>
Well, I have finished the overhaul of perform_violence. The shell of the
code is pasted below - basically replace the version below with what you
have and it will work. You do not need to change anything else! Please
bear in mind, it is a shell - there are places where I have commented to
allow you to make checks for SECOND_ATTACK etc and for weapon speed
checks (you will need to modify your objects to have an extra field for
this), dex checks etc
The basic outline is this:-
From combat_list, scroll through all players and add their multiple
attacks into a new list (top_sort) and calculate their initiatives,
modifiers, weapon speeds etc
eg. combat_list = player 1, player 2, player 3, player 4 (assuming 1,3
has 1 attack each, and 2,4 has 2 attacks)
top_sort = player 1 (initiative value 5), player 2 (iv =3), player 2 (iv
= 8), player 3 (iv = 7), player 4 (iv = 4), player 4 (iv=12)
Then sort in order of initiative value into top_sort_final
top_sort_final = player 2 (iv 3), player 4 (iv 4), player 1 (iv 5),
player 3 (iv 7), player 2 (iv 8), player 4 (iv 12)
then execute all the original perform_violence checks in the
top_sort_final order.
Now, I hope you guys can add extra flavour with the myriads of check
options etc - it should be quite obvious where to adjust it.
PS: I have only made a brief check on the code ;p
Have fun.
Horus,
soon to be revamped Dark Realms III.
void perform_violence(void)
{
struct char_data *ch;
bool same_room=FALSE, same_player = FALSE, found_lowest = FALSE;
struct sort_list {
struct char_data *pp;
int speed_roll;
struct sort_list *next_sort;
};
struct sort_list *top_sort = NULL, *top_sort_final= NULL, *new_sort,
*ns, *ns_next, *nn, *nn_next, *nn_prev;
int initiative;
for (ch = combat_list; ch; ch = next_combat_list) {
next_combat_list = ch->next_fighting;
same_room = FALSE;
/* CREATING A NEW QUEUE AND DUMP ALL ATTACKS INTO IT */
CREATE(new_sort, struct sort_list, 1);
new_sort->next_sort = top_sort;
new_sort->pp = ch;
/* CALCULATE SPEED ROLLS ETC CHECK FOR 2ND 3RD 4TH ATTACKS */
/* YOU CAN BASICALLY MAKE ANY CHECKS HERE - INCLUDING FOR WEAPON SPEED
ETC */
initiative = dice (1, 10);
initiative += 10 - GET_DEX(ch);
initiative -= GET_CLASS(ch);
new_sort->speed_roll = initiative;
top_sort = new_sort;
if (IS_NPC(ch)) initiative += dice(1,10); /* this is the perfect place
to add speed attacks from mobs */
/* Adding multi attacks into the top_sort list */
/* This is just a basic version - its best to check on skills etc */
if (GET_CLASS(ch) == CLASS_WARRIOR) {
CREATE(new_sort, struct sort_list, 1);
new_sort->next_sort = top_sort;
new_sort->pp = ch;
new_sort->speed_roll = initiative + 5;
top_sort = new_sort;
}
}
/* SORT top_sort BASED ON INITIATIVE VALUES */
for (ns = top_sort; ns; ns = ns_next) {
ns_next = ns->next_sort;
found_lowest = FALSE;
if (!top_sort_final) {
top_sort_final = ns;
top_sort_final->next_sort = NULL;
}
else if (ns->speed_roll <= top_sort_final->speed_roll) {
ns->next_sort = top_sort_final;
top_sort_final = ns;
}
else {
nn_prev = NULL;
for (nn = top_sort_final; nn && !found_lowest; nn = nn_next) {
nn_next = nn->next_sort;
if (ns->speed_roll <= nn->speed_roll) {
nn_prev->next_sort = ns;
ns->next_sort = nn;
found_lowest = TRUE;
}
else if (!nn_next) { /* reached at the end of the list */
nn->next_sort = ns;
ns->next_sort = NULL;
}
nn_prev = nn;
}
}
}
/* NOT SURE IF SPELLS ARE PLACED IN COMBAT LIST - needs to be done
later */
/* LOOP THROUGH FINAL QUEUE TO PROCESS ALL PERFORM_VIOLENCE ROUTINES */
for (ns = top_sort_final; ns; ns = ns_next) {
ns_next = ns->next_sort;
ch = ns->pp;
if (FIGHTING(ch) == NULL || ch->in_room != FIGHTING(ch)->in_room) {
stop_fighting(ch);
continue;
}
if (IS_NPC(ch)) {
if (GET_MOB_WAIT(ch) > 0) {
GET_MOB_WAIT(ch) -= PULSE_VIOLENCE;
continue;
}
GET_MOB_WAIT(ch) = 0;
if (GET_POS(ch) < POS_FIGHTING) {
GET_POS(ch) = POS_FIGHTING;
act("$n scrambles to $s feet!", TRUE, ch, 0, 0, TO_ROOM);
}
}
if (GET_POS(ch) < POS_FIGHTING) {
send_to_char("You can't fight while sitting!!\r\n", ch);
continue;
}
hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
/* XXX: Need to see if they can handle "" instead of NULL. */
if (MOB_FLAGGED(ch, MOB_SPEC) && mob_index[GET_MOB_RNUM(ch)].func !=
NULL)
(mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, "");
}
/* Clear pointers */
for (ns = top_sort_final; ns; ns = ns_next) {
ns_next = ns->next_sort;
free(ns);
}
}
--
+---------------------------------------------------------------+
| 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/06/01 PST