arogue7, xrogue: improve the handling of the arguments to fuses.

fuse() now expects a pointer as the argument to a fuse function.  If
this is one of the functions that takes int, fuse() follows the pointer
and stores that value in the f_list slot, in the integer field of the
argument union.  When the fuse goes off, do_fuses() recognizes the
function and passes it the integer field instead of the pointer.

This has the disadvantage of hard-coding the functions that require int
in daemon.c, but since the int is copied into f_list, it no longer has
to be in static or global memory, which simplifies several files.
This commit is contained in:
John "Elwin" Edwards 2016-03-11 17:40:00 -05:00
parent dafa5cc722
commit 758c6b1bf0
21 changed files with 147 additions and 124 deletions

View file

@ -36,15 +36,7 @@ add_pack(struct linked_list *item, bool silent)
register struct object *obj, *op = NULL;
register bool exact, from_floor;
bool giveflag = 0;
static long cleric = C_CLERIC,
monk = C_MONK,
magician = C_MAGICIAN,
assassin = C_ASSASSIN,
druid = C_DRUID,
thief = C_THIEF,
fighter = C_FIGHTER,
ranger = C_RANGER,
paladin = C_PALADIN;
int newclass;
if (item == NULL)
{
@ -263,8 +255,10 @@ picked_up:
/* start a fuse to change player into a paladin */
if (quest_item != HEIL_ANKH) {
msg("You hear a strange, distant hypnotic calling... ");
if (player.t_ctype != C_PALADIN && obj->o_which ==HEIL_ANKH)
fuse(changeclass, &paladin, roll(8, 8), AFTER);
if (player.t_ctype != C_PALADIN && obj->o_which ==HEIL_ANKH) {
newclass = C_PALADIN;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* A cloak must be worn. */
@ -287,8 +281,10 @@ picked_up:
/* start a fuse to change player into a monk */
if (quest_item != EMORI_CLOAK) {
msg("You suddenly become calm and quiet. ");
if (player.t_ctype != C_MONK && obj->o_which == EMORI_CLOAK)
fuse(changeclass, &monk, roll(8, 8), AFTER);
if (player.t_ctype != C_MONK && obj->o_which == EMORI_CLOAK) {
newclass = C_MONK;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* The amulet must be worn. */
@ -312,7 +308,8 @@ picked_up:
if (player.t_ctype != C_MAGICIAN &&
obj->o_which == STONEBONES_AMULET) {
msg("You sense approaching etheric forces... ");
fuse(changeclass, &magician, roll(8, 8), AFTER);
newclass = C_MAGICIAN;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
@ -331,8 +328,10 @@ picked_up:
/* start a fuse to change player into an assassin */
if (quest_item != EYE_VECNA) {
msg("Your blood rushes and you begin to sweat profusely... ");
if (player.t_ctype != C_ASSASSIN && obj->o_which == EYE_VECNA)
fuse(changeclass, &assassin, roll(8, 8), AFTER);
if (player.t_ctype != C_ASSASSIN && obj->o_which == EYE_VECNA) {
newclass = C_ASSASSIN;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
when QUILL_NAGROM:
@ -340,8 +339,10 @@ picked_up:
/* start a fuse to change player into a druid */
if (quest_item != QUILL_NAGROM) {
msg("You begin to see things differently... ");
if (player.t_ctype != C_DRUID && obj->o_which == QUILL_NAGROM)
fuse(changeclass, &druid, roll(8, 8), AFTER);
if (player.t_ctype != C_DRUID && obj->o_which == QUILL_NAGROM) {
newclass = C_DRUID;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* Weapons will insist on being wielded. */
@ -362,7 +363,8 @@ picked_up:
if (player.t_ctype != C_THIEF &&
obj->o_which == MUSTY_DAGGER) {
msg("You look about furtively. ");
fuse(changeclass, &thief, roll(8, 8), AFTER);
newclass = C_THIEF;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* start a fuse to change player into a fighter */
@ -370,7 +372,8 @@ picked_up:
if (player.t_ctype != C_FIGHTER &&
obj->o_which == AXE_AKLAD) {
msg("Your bones feel strengthened. ");
fuse(changeclass, &fighter, roll(8, 8), AFTER);
newclass = C_FIGHTER;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
if (cur_weapon != NULL) {
@ -405,8 +408,10 @@ picked_up:
/* start a fuse to change player into a ranger */
if (quest_item != BRIAN_MANDOLIN) {
msg("You are transfixed with empathy. ");
if (player.t_ctype != C_RANGER && obj->o_which == BRIAN_MANDOLIN)
fuse(changeclass, &ranger, roll(8, 8), AFTER);
if (player.t_ctype != C_RANGER && obj->o_which == BRIAN_MANDOLIN) {
newclass = C_RANGER;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* add to the music */
@ -415,8 +420,10 @@ picked_up:
/* start a fuse to change player into a cleric */
if (quest_item != GERYON_HORN) {
msg("You follow their calling. ");
if (player.t_ctype != C_CLERIC && obj->o_which == GERYON_HORN)
fuse(changeclass, &cleric, roll(8, 8), AFTER);
if (player.t_ctype != C_CLERIC && obj->o_which == GERYON_HORN) {
newclass = C_CLERIC;
fuse(changeclass, &newclass, roll(8, 8), AFTER);
}
}
/* the card can not be picked up, it must be traded for */