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

@ -95,7 +95,7 @@ find_slot(void (*func)())
* Start a daemon, takes a function. * Start a daemon, takes a function.
*/ */
void void
start_daemon(void (*func)(), int arg, int type) start_daemon(void (*func)(), void *arg, int type)
{ {
reg struct delayed_action *dev; reg struct delayed_action *dev;
@ -103,7 +103,7 @@ start_daemon(void (*func)(), int arg, int type)
if (dev != NULL) { if (dev != NULL) {
dev->d_type = type; dev->d_type = type;
dev->d_func = func; dev->d_func = func;
dev->d_.arg = arg; dev->d_.varg = arg;
dev->d_time = DAEMON; dev->d_time = DAEMON;
demoncnt += 1; /* update count */ demoncnt += 1; /* update count */
} }
@ -154,7 +154,7 @@ do_daemons(int flag)
* Executing each one, giving it the proper arguments * Executing each one, giving it the proper arguments
*/ */
if (dev->d_type == flag && dev->d_time == DAEMON) if (dev->d_type == flag && dev->d_time == DAEMON)
(*dev->d_func)(dev->d_.arg); (*dev->d_func)(dev->d_.varg);
} }
@ -163,7 +163,7 @@ do_daemons(int flag)
* Start a fuse to go off in a certain number of turns * Start a fuse to go off in a certain number of turns
*/ */
void void
fuse(void (*func)(), int arg, int time, int type) fuse(void (*func)(), void *arg, int time, int type)
{ {
reg struct delayed_action *wire; reg struct delayed_action *wire;
@ -171,7 +171,10 @@ fuse(void (*func)(), int arg, int time, int type)
if (wire != NULL) { if (wire != NULL) {
wire->d_type = type; wire->d_type = type;
wire->d_func = func; wire->d_func = func;
wire->d_.arg = arg; if (func == changeclass || func == res_strength)
wire->d_.arg = *(int *) arg;
else
wire->d_.varg = arg;
wire->d_time = time; wire->d_time = time;
fusecnt += 1; /* update count */ fusecnt += 1; /* update count */
} }
@ -232,8 +235,10 @@ do_fuses(int flag)
if(flag == wire->d_type && wire->d_time > 0 && if(flag == wire->d_type && wire->d_time > 0 &&
--wire->d_time == 0) { --wire->d_time == 0) {
wire->d_type = EMPTY; wire->d_type = EMPTY;
if (wire->d_func != NULL) if (wire->d_func == changeclass || wire->d_func == res_strength)
(*wire->d_func)(wire->d_.arg); (*wire->d_func)(wire->d_.arg);
else if (wire->d_func != NULL)
(*wire->d_func)(wire->d_.varg);
fusecnt -= 1; fusecnt -= 1;
} }
} }

View file

@ -111,7 +111,7 @@ doctor(struct thing *tp)
void void
swander(void) swander(void)
{ {
start_daemon(rollwand, 0, BEFORE); start_daemon(rollwand, NULL, BEFORE);
} }
/* /*
@ -134,7 +134,7 @@ rollwand(void)
if (levtype != POSTLEV) if (levtype != POSTLEV)
wanderer(); wanderer();
kill_daemon(rollwand); kill_daemon(rollwand);
fuse(swander, 0, WANDERTIME, BEFORE); fuse(swander, NULL, WANDERTIME, BEFORE);
} }
between = 0; between = 0;
} }
@ -663,7 +663,7 @@ spell_recovery(void)
time = SPELLTIME - max(17-pstats.s_intel, 0); time = SPELLTIME - max(17-pstats.s_intel, 0);
time = max(time, 5); time = max(time, 5);
if (spell_power > 0) spell_power--; if (spell_power > 0) spell_power--;
fuse(spell_recovery, 0, time, AFTER); fuse(spell_recovery, NULL, time, AFTER);
} }
/* /*
* give the hero back some prayer points * give the hero back some prayer points
@ -676,7 +676,7 @@ prayer_recovery(void)
time = SPELLTIME - max(17-pstats.s_wisdom, 0); time = SPELLTIME - max(17-pstats.s_wisdom, 0);
time = max(time, 5); time = max(time, 5);
if (pray_time > 0) pray_time--; if (pray_time > 0) pray_time--;
fuse(prayer_recovery, 0, time, AFTER); fuse(prayer_recovery, NULL, time, AFTER);
} }
/* /*
* give the hero back some chant points * give the hero back some chant points
@ -689,5 +689,5 @@ chant_recovery(void)
time = SPELLTIME - max(17-pstats.s_wisdom, 0); time = SPELLTIME - max(17-pstats.s_wisdom, 0);
time = max(time, 5); time = max(time, 5);
if (chant_time > 0) chant_time--; if (chant_time > 0) chant_time--;
fuse(chant_recovery, 0, time, AFTER); fuse(chant_recovery, NULL, time, AFTER);
} }

View file

@ -294,7 +294,7 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
if (on(player, HASSTINK)) lengthen(unstink, STINKTIME); if (on(player, HASSTINK)) lengthen(unstink, STINKTIME);
else { else {
turn_on(player, HASSTINK); turn_on(player, HASSTINK);
fuse(unstink, 0, STINKTIME, AFTER); fuse(unstink, NULL, STINKTIME, AFTER);
} }
} }
} }
@ -308,8 +308,10 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
msg("You cringe at %s's chilling touch.", msg("You cringe at %s's chilling touch.",
prname(attname, FALSE)); prname(attname, FALSE));
chg_str(-1); chg_str(-1);
if (lost_str++ == 0) if (lost_str++ == 0) {
fuse(res_strength, 0, CHILLTIME, AFTER); int fuse_arg = 0;
fuse(res_strength, &fuse_arg, CHILLTIME, AFTER);
}
else lengthen(res_strength, CHILLTIME); else lengthen(res_strength, CHILLTIME);
} }
} }
@ -344,7 +346,7 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
} }
else { else {
turn_on(*def, HASDISEASE); turn_on(*def, HASDISEASE);
fuse(cure_disease, 0, roll(HEALTIME,SICKTIME), AFTER); fuse(cure_disease, NULL, roll(HEALTIME,SICKTIME), AFTER);
msg(terse ? "You have been diseased." msg(terse ? "You have been diseased."
: "You have contracted a disease!"); : "You have contracted a disease!");
} }
@ -478,7 +480,7 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
turn_off(*att, CANDANCE); turn_off(*att, CANDANCE);
turn_on(*def, ISDANCE); turn_on(*def, ISDANCE);
msg("You begin to dance uncontrollably!"); msg("You begin to dance uncontrollably!");
fuse(undance, 0, roll(2,4), AFTER); fuse(undance, NULL, roll(2,4), AFTER);
} }
/* /*
@ -491,7 +493,7 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
(find_slot(suffocate) == 0)) { (find_slot(suffocate) == 0)) {
turn_on(*att, DIDSUFFOCATE); turn_on(*att, DIDSUFFOCATE);
msg("%s is beginning to suffocate you.", prname(attname, TRUE)); msg("%s is beginning to suffocate you.", prname(attname, TRUE));
fuse(suffocate, 0, roll(9,3), AFTER); fuse(suffocate, NULL, roll(9,3), AFTER);
} }
/* /*
@ -530,11 +532,11 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
msg("You smell an unpleasant odor."); msg("You smell an unpleasant odor.");
else { else {
int odor_str = -(rnd(6)+1); int odor_str = -(rnd(6)+1);
int fuse_arg2 = 0;
msg("You are overcome by a foul odor."); msg("You are overcome by a foul odor.");
if (lost_str == 0) { if (lost_str == 0) {
chg_str(odor_str); chg_str(odor_str);
fuse(res_strength, 0, SMELLTIME, AFTER); fuse(res_strength, &fuse_arg2, SMELLTIME, AFTER);
lost_str -= odor_str; lost_str -= odor_str;
} }
else lengthen(res_strength, SMELLTIME); else lengthen(res_strength, SMELLTIME);

View file

@ -174,7 +174,7 @@ wghtchk(void)
ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) ); ch = CCHAR( mvwinch(stdscr, hero.y, hero.x) );
if((ch != FLOOR && ch != PASSAGE)) { if((ch != FLOOR && ch != PASSAGE)) {
extinguish(wghtchk); extinguish(wghtchk);
fuse(wghtchk,TRUE,1,AFTER); fuse(wghtchk, NULL, 1, AFTER);
inwhgt = FALSE; inwhgt = FALSE;
return; return;
} }

View file

@ -538,7 +538,7 @@ roll_em(struct thing *att_er, struct thing *def_er, struct object *weap,
if (find_slot(unconfuse)) if (find_slot(unconfuse))
lengthen(unconfuse, HUHDURATION); lengthen(unconfuse, HUHDURATION);
else else
fuse(unconfuse, 0, HUHDURATION, AFTER); fuse(unconfuse, NULL, HUHDURATION, AFTER);
turn_on(player, ISHUH); turn_on(player, ISHUH);
} }
else msg("You feel dizzy, but it quickly passes."); else msg("You feel dizzy, but it quickly passes.");

View file

@ -393,18 +393,18 @@ main(int argc, char *argv[], char *envp[])
* Start up daemons and fuses * Start up daemons and fuses
*/ */
start_daemon(doctor, &player, AFTER); start_daemon(doctor, &player, AFTER);
fuse(swander, 0, WANDERTIME, AFTER); fuse(swander, NULL, WANDERTIME, AFTER);
if (player.t_ctype == C_MAGICIAN || player.t_ctype == C_RANGER) if (player.t_ctype == C_MAGICIAN || player.t_ctype == C_RANGER)
fuse(spell_recovery, 0, SPELLTIME, AFTER); fuse(spell_recovery, NULL, SPELLTIME, AFTER);
if (player.t_ctype == C_DRUID || player.t_ctype == C_RANGER) if (player.t_ctype == C_DRUID || player.t_ctype == C_RANGER)
fuse(chant_recovery, 0, SPELLTIME, AFTER); fuse(chant_recovery, NULL, SPELLTIME, AFTER);
if (player.t_ctype == C_CLERIC || player.t_ctype == C_PALADIN) if (player.t_ctype == C_CLERIC || player.t_ctype == C_PALADIN)
fuse(prayer_recovery, 0, SPELLTIME, AFTER); fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
start_daemon(stomach, 0, AFTER); start_daemon(stomach, NULL, AFTER);
if (player.t_ctype == C_THIEF || if (player.t_ctype == C_THIEF ||
player.t_ctype == C_ASSASIN || player.t_ctype == C_ASSASIN ||
player.t_ctype == C_MONK) player.t_ctype == C_MONK)
start_daemon(trap_look, 0, AFTER); start_daemon(trap_look, NULL, AFTER);
/* Does this character have any special knowledge? */ /* Does this character have any special knowledge? */
switch (player.t_ctype) { switch (player.t_ctype) {

View file

@ -81,11 +81,11 @@ changeclass(int newclass)
* if he becomes a spell caster of some kind, give him a fuse * if he becomes a spell caster of some kind, give him a fuse
*/ */
if (newclass == C_MAGICIAN || newclass == C_RANGER) if (newclass == C_MAGICIAN || newclass == C_RANGER)
fuse(spell_recovery, 0, SPELLTIME, AFTER); fuse(spell_recovery, NULL, SPELLTIME, AFTER);
if (newclass == C_DRUID || newclass == C_RANGER) if (newclass == C_DRUID || newclass == C_RANGER)
fuse(chant_recovery, 0, SPELLTIME, AFTER); fuse(chant_recovery, NULL, SPELLTIME, AFTER);
if ((newclass==C_CLERIC || newclass==C_PALADIN) && !cur_misc[HEIL_ANKH]) if ((newclass==C_CLERIC || newclass==C_PALADIN) && !cur_misc[HEIL_ANKH])
fuse(prayer_recovery, 0, SPELLTIME, AFTER); fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
/* /*
* if he's changing from a fighter then may have to change * if he's changing from a fighter then may have to change
* his sword since only fighter can use two-handed * his sword since only fighter can use two-handed
@ -117,7 +117,7 @@ changeclass(int newclass)
* if he becomes a thief then add the trap_look() daemon * if he becomes a thief then add the trap_look() daemon
*/ */
if (newclass == C_THIEF || newclass == C_ASSASIN || newclass == C_MONK) if (newclass == C_THIEF || newclass == C_ASSASIN || newclass == C_MONK)
start_daemon(trap_look, 0, AFTER); start_daemon(trap_look, NULL, AFTER);
char_type = player.t_ctype = newclass; char_type = player.t_ctype = newclass;
save = pstats.s_hpt; save = pstats.s_hpt;
max_stats.s_hpt = pstats.s_hpt = 0; max_stats.s_hpt = pstats.s_hpt = 0;
@ -1025,7 +1025,7 @@ use_mm(int which)
msg("aaAAACHOOOooo. Cough. Cough. Sneeze. Sneeze."); msg("aaAAACHOOOooo. Cough. Cough. Sneeze. Sneeze.");
if (!find_slot(dust_appear)) { if (!find_slot(dust_appear)) {
turn_on(player, ISINVIS); turn_on(player, ISINVIS);
fuse(dust_appear, 0, DUSTTIME, AFTER); fuse(dust_appear, NULL, DUSTTIME, AFTER);
PLAYER = IPLAYER; PLAYER = IPLAYER;
light(&hero); light(&hero);
} }
@ -1054,7 +1054,7 @@ use_mm(int which)
if (find_slot(unchoke)) if (find_slot(unchoke))
lengthen(unchoke, DUSTTIME); lengthen(unchoke, DUSTTIME);
else else
fuse(unchoke, 0, DUSTTIME, AFTER); fuse(unchoke, NULL, DUSTTIME, AFTER);
turn_on(player, ISHUH); turn_on(player, ISHUH);
turn_on(player, ISBLIND); turn_on(player, ISBLIND);
light(&hero); light(&hero);

View file

@ -649,7 +649,7 @@ wake_monster(int y, int x)
if (find_slot(unconfuse)) if (find_slot(unconfuse))
lengthen(unconfuse, HUHDURATION); lengthen(unconfuse, HUHDURATION);
else { else {
fuse(unconfuse, 0, HUHDURATION, AFTER); fuse(unconfuse, NULL, HUHDURATION, AFTER);
msg("%s's gaze has confused you.",prname(mname, TRUE)); msg("%s's gaze has confused you.",prname(mname, TRUE));
turn_on(player, ISHUH); turn_on(player, ISHUH);
} }
@ -691,7 +691,7 @@ wake_monster(int y, int x)
if (!save(VS_WAND, &player, 0)) { if (!save(VS_WAND, &player, 0)) {
msg("The gaze of %s blinds you", prname(mname, FALSE)); msg("The gaze of %s blinds you", prname(mname, FALSE));
turn_on(player, ISBLIND); turn_on(player, ISBLIND);
fuse(sight, 0, rnd(30)+20, AFTER); fuse(sight, NULL, rnd(30)+20, AFTER);
light(&hero); light(&hero);
} }
} }

View file

@ -249,12 +249,13 @@ picked_up:
/* Relics can do strange things when you pick them up */ /* Relics can do strange things when you pick them up */
if (obj->o_type == RELIC) { if (obj->o_type == RELIC) {
int newclass;
switch (obj->o_which) { switch (obj->o_which) {
/* the ankh of Heil gives you prayers */ /* the ankh of Heil gives you prayers */
case HEIL_ANKH: case HEIL_ANKH:
msg("The ankh welds itself into your hand."); msg("The ankh welds itself into your hand.");
if (player.t_ctype != C_CLERIC && player.t_ctype != C_PALADIN) if (player.t_ctype != C_CLERIC && player.t_ctype != C_PALADIN)
fuse(prayer_recovery, 0, SPELLTIME, AFTER); fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
/* A cloak must be worn. */ /* A cloak must be worn. */
when EMORI_CLOAK: when EMORI_CLOAK:
@ -306,7 +307,7 @@ picked_up:
msg("The excrutiating pain slowly turns into a dull throb."); msg("The excrutiating pain slowly turns into a dull throb.");
when QUILL_NAGROM: when QUILL_NAGROM:
fuse(quill_charge,0,player.t_ctype==C_MAGICIAN ? 4 : 8,AFTER); fuse(quill_charge,NULL,player.t_ctype==C_MAGICIAN ? 4 : 8,AFTER);
/* Weapons will insist on being wielded. */ /* Weapons will insist on being wielded. */
when MUSTY_DAGGER: when MUSTY_DAGGER:
@ -316,7 +317,8 @@ picked_up:
/* For the daggers start a fuse to change player to a thief. */ /* For the daggers start a fuse to change player to a thief. */
/* and set a daemon to eat gold. */ /* and set a daemon to eat gold. */
if (obj->o_which == MUSTY_DAGGER) { if (obj->o_which == MUSTY_DAGGER) {
fuse(changeclass, C_THIEF, roll(20, 20), AFTER); newclass = C_THIEF;
fuse(changeclass, &newclass, roll(20, 20), AFTER);
if (purse > 0) if (purse > 0)
msg("Your purse feels lighter"); msg("Your purse feels lighter");
else else
@ -326,7 +328,8 @@ picked_up:
} }
/* For the axe start a fuse to change player to a fighter. */ /* For the axe start a fuse to change player to a fighter. */
if (obj->o_which == AXE_AKLAD) if (obj->o_which == AXE_AKLAD)
fuse(changeclass, C_FIGHTER, roll(20, 20), AFTER); newclass = C_FIGHTER;
fuse(changeclass, &newclass, roll(20, 20), AFTER);
if (cur_weapon != NULL) { if (cur_weapon != NULL) {
msg("The artifact insists you release your current weapon."); msg("The artifact insists you release your current weapon.");
if (!dropcheck(cur_weapon)) { if (!dropcheck(cur_weapon)) {

View file

@ -150,7 +150,7 @@ add_haste(bool blessed)
else { else {
msg("You feel yourself moving %sfaster.", blessed ? "much " : ""); msg("You feel yourself moving %sfaster.", blessed ? "much " : "");
turn_on(player, ISHASTE); turn_on(player, ISHASTE);
fuse(nohaste, 0, roll(hasttime, hasttime), AFTER); fuse(nohaste, NULL, roll(hasttime, hasttime), AFTER);
} }
} }
@ -206,7 +206,7 @@ add_slow(void)
lengthen(noslow, roll(HASTETIME,HASTETIME)); lengthen(noslow, roll(HASTETIME,HASTETIME));
else { else {
turn_on(player, ISSLOW); turn_on(player, ISSLOW);
fuse(noslow, 0, roll(HASTETIME,HASTETIME), AFTER); fuse(noslow, NULL, roll(HASTETIME,HASTETIME), AFTER);
} }
} }
} }
@ -324,7 +324,7 @@ quaff(int which, int kind, int flags, bool is_potion)
} }
else { /* Just light a fuse for how long player is safe */ else { /* Just light a fuse for how long player is safe */
if (off(player, ISCLEAR)) { if (off(player, ISCLEAR)) {
fuse(unclrhead, 0, CLRDURATION, AFTER); fuse(unclrhead, NULL, CLRDURATION, AFTER);
msg("A faint blue aura surrounds your head."); msg("A faint blue aura surrounds your head.");
} }
else { /* If we have a fuse lengthen it, else we else { /* If we have a fuse lengthen it, else we
@ -491,7 +491,7 @@ quaff(int which, int kind, int flags, bool is_potion)
{ {
msg("A cloak of darkness falls around you."); msg("A cloak of darkness falls around you.");
turn_on(player, ISBLIND); turn_on(player, ISBLIND);
fuse(sight, 0, SEEDURATION, AFTER); fuse(sight, NULL, SEEDURATION, AFTER);
light(&hero); light(&hero);
} }
else else
@ -501,7 +501,7 @@ quaff(int which, int kind, int flags, bool is_potion)
if (off(player, CANSEE)) { if (off(player, CANSEE)) {
turn_on(player, CANSEE); turn_on(player, CANSEE);
msg("Your eyes begin to tingle."); msg("Your eyes begin to tingle.");
fuse(unsee, 0, blessed ? SEEDURATION*3 :SEEDURATION, AFTER); fuse(unsee, NULL, blessed ? SEEDURATION*3 :SEEDURATION, AFTER);
light(&hero); light(&hero);
} }
else if (find_slot(unsee) != 0) else if (find_slot(unsee) != 0)
@ -523,7 +523,7 @@ quaff(int which, int kind, int flags, bool is_potion)
if (on(player, CANINWALL)) if (on(player, CANINWALL))
lengthen(unphase, duration*PHASEDURATION); lengthen(unphase, duration*PHASEDURATION);
else { else {
fuse(unphase, 0, duration*PHASEDURATION, AFTER); fuse(unphase, NULL, duration*PHASEDURATION, AFTER);
turn_on(player, CANINWALL); turn_on(player, CANINWALL);
} }
msg("You feel %slight-headed!", msg("You feel %slight-headed!",
@ -547,7 +547,7 @@ quaff(int which, int kind, int flags, bool is_potion)
} }
} }
else { else {
fuse(land, 0, duration*FLYTIME, AFTER); fuse(land, NULL, duration*FLYTIME, AFTER);
turn_on(player, ISFLY); turn_on(player, ISFLY);
} }
if (say_message) { if (say_message) {
@ -610,7 +610,7 @@ quaff(int which, int kind, int flags, bool is_potion)
if (off(player, ISINVIS)) { if (off(player, ISINVIS)) {
turn_on(player, ISINVIS); turn_on(player, ISINVIS);
msg("You have a tingling feeling all over your body"); msg("You have a tingling feeling all over your body");
fuse(appear, 0, blessed ? GONETIME*3 : GONETIME, AFTER); fuse(appear, NULL, blessed ? GONETIME*3 : GONETIME, AFTER);
PLAYER = IPLAYER; PLAYER = IPLAYER;
light(&hero); light(&hero);
} }
@ -675,7 +675,7 @@ quaff(int which, int kind, int flags, bool is_potion)
if (!find_slot(unskill)) { /* No skill */ if (!find_slot(unskill)) { /* No skill */
pstats.s_lvladj = -2; pstats.s_lvladj = -2;
pstats.s_lvl += pstats.s_lvladj; pstats.s_lvl += pstats.s_lvladj;
fuse(unskill, 0, SKILLDURATION, AFTER); fuse(unskill, NULL, SKILLDURATION, AFTER);
} }
else { /* Has an artifical skill */ else { /* Has an artifical skill */
/* Is the skill beneficial? */ /* Is the skill beneficial? */
@ -714,7 +714,7 @@ quaff(int which, int kind, int flags, bool is_potion)
if (!find_slot(unskill)) { if (!find_slot(unskill)) {
pstats.s_lvladj = adjust; pstats.s_lvladj = adjust;
pstats.s_lvl += pstats.s_lvladj; pstats.s_lvl += pstats.s_lvladj;
fuse(unskill, 0, fuse(unskill, NULL,
blessed ? SKILLDURATION*2 : SKILLDURATION, AFTER); blessed ? SKILLDURATION*2 : SKILLDURATION, AFTER);
} }
else { /* Has an artifical skill */ else { /* Has an artifical skill */
@ -763,7 +763,7 @@ quaff(int which, int kind, int flags, bool is_potion)
} }
} }
else { else {
fuse(nofire, 0, duration*FIRETIME, AFTER); fuse(nofire, NULL, duration*FIRETIME, AFTER);
turn_on(player, NOFIRE); turn_on(player, NOFIRE);
} }
if (say_message) { if (say_message) {
@ -789,7 +789,7 @@ quaff(int which, int kind, int flags, bool is_potion)
} }
} }
else { else {
fuse(nocold, 0, duration*COLDTIME, AFTER); fuse(nocold, NULL, duration*COLDTIME, AFTER);
turn_on(player, NOCOLD); turn_on(player, NOCOLD);
} }
if (say_message) { if (say_message) {
@ -811,7 +811,7 @@ quaff(int which, int kind, int flags, bool is_potion)
lengthen(nobolt, duration*BOLTTIME); lengthen(nobolt, duration*BOLTTIME);
} }
else { else {
fuse(nobolt, 0, duration*BOLTTIME, AFTER); fuse(nobolt, NULL, duration*BOLTTIME, AFTER);
turn_on(player, NOBOLT); turn_on(player, NOBOLT);
} }
if (say_message) if (say_message)

View file

@ -90,9 +90,9 @@ ring_on(struct linked_list *item)
} }
} }
when R_SEARCH: when R_SEARCH:
start_daemon(ring_search, 0, AFTER); start_daemon(ring_search, NULL, AFTER);
when R_TELEPORT: when R_TELEPORT:
start_daemon(ring_teleport, 0, AFTER); start_daemon(ring_teleport, NULL, AFTER);
} }
status(FALSE); status(FALSE);
if (r_know[obj->o_which] && r_guess[obj->o_which]) if (r_know[obj->o_which] && r_guess[obj->o_which])

View file

@ -1223,7 +1223,7 @@ struct delayed_action *find_slot(void (*func)());
int findmindex(char *name); int findmindex(char *name);
void fix_stick(struct object *cur); void fix_stick(struct object *cur);
void fumble(void); void fumble(void);
void fuse(void (*func)(), int arg, int time, int type); void fuse(void (*func)(), void *arg, int time, int type);
void genmonsters(int least, bool treas); void genmonsters(int least, bool treas);
coord get_coordinates(void); coord get_coordinates(void);
bool get_dir(coord *direction); bool get_dir(coord *direction);
@ -1357,7 +1357,7 @@ bool skirmish(struct thing *attacker, coord *mp, struct object *weap,
bool thrown); bool thrown);
struct linked_list *spec_item(int type, int which, int hit, int damage); struct linked_list *spec_item(int type, int which, int hit, int damage);
void spell_recovery(void); void spell_recovery(void);
void start_daemon(void (*func)(), int arg, int type); void start_daemon(void (*func)(), void *arg, int type);
void status(bool display); void status(bool display);
void steal(void); void steal(void);
bool step_ok(int y, int x, int can_on_monst, struct thing *flgptr); bool step_ok(int y, int x, int can_on_monst, struct thing *flgptr);

View file

@ -590,7 +590,7 @@ do_zap(struct thing *zapper, struct object *obj, coord *direction, int which,
turn_on(player, HASDISEASE); turn_on(player, HASDISEASE);
turn_on(player, HASINFEST); turn_on(player, HASINFEST);
turn_on(player, DOROT); turn_on(player, DOROT);
fuse(cure_disease, 0, roll(HEALTIME,SICKTIME), AFTER); fuse(cure_disease, NULL, roll(HEALTIME,SICKTIME), AFTER);
infest_dam++; infest_dam++;
} }
else msg("You fell momentarily sick"); else msg("You fell momentarily sick");
@ -1188,7 +1188,7 @@ at_hero: if (!save(VS_BREATH, &player,
rnd(20)+HUHDURATION); rnd(20)+HUHDURATION);
else { else {
turn_on(player, ISHUH); turn_on(player, ISHUH);
fuse(unconfuse, 0, fuse(unconfuse, NULL,
rnd(20)+HUHDURATION, AFTER); rnd(20)+HUHDURATION, AFTER);
msg( msg(
"The confusion gas has confused you."); "The confusion gas has confused you.");

View file

@ -209,7 +209,7 @@ confus_player(void)
if (find_slot(unconfuse)) if (find_slot(unconfuse))
lengthen(unconfuse, HUHDURATION); lengthen(unconfuse, HUHDURATION);
else else
fuse(unconfuse, 0, HUHDURATION, AFTER); fuse(unconfuse, NULL, HUHDURATION, AFTER);
turn_on(player, ISHUH); turn_on(player, ISHUH);
} }
else msg("You feel dizzy for a moment, but it quickly passes."); else msg("You feel dizzy for a moment, but it quickly passes.");

View file

@ -327,7 +327,7 @@ wear(void)
msg("Wearing %s", inv_name(obj,TRUE)); msg("Wearing %s", inv_name(obj,TRUE));
cur_misc[WEAR_GAUNTLET] = obj; cur_misc[WEAR_GAUNTLET] = obj;
if (obj->o_which == MM_FUMBLE) if (obj->o_which == MM_FUMBLE)
start_daemon(fumble, 0, AFTER); start_daemon(fumble, NULL, AFTER);
/* /*
* the jewel of attacks does an aggavate monster * the jewel of attacks does an aggavate monster
*/ */
@ -351,7 +351,7 @@ wear(void)
msg("Wearing %s",inv_name(obj,TRUE)); msg("Wearing %s",inv_name(obj,TRUE));
cur_misc[WEAR_NECKLACE] = obj; cur_misc[WEAR_NECKLACE] = obj;
msg("The necklace is beginning to strangle you!"); msg("The necklace is beginning to strangle you!");
start_daemon(strangle, 0, AFTER); start_daemon(strangle, NULL, AFTER);
otherwise: otherwise:
msg("What a strange item you have!"); msg("What a strange item you have!");
} }

View file

@ -172,7 +172,10 @@ fuse(void (*dfunc)(), void *arg, int time, int type)
if (wire != NULL) { if (wire != NULL) {
wire->d_type = type; wire->d_type = type;
wire->d_func = dfunc; wire->d_func = dfunc;
wire->d_arg.vp = arg; if (dfunc == changeclass || dfunc == res_strength)
wire->d_arg.i = *(int *) arg;
else
wire->d_arg.vp = arg;
wire->d_time = time; wire->d_time = time;
fusecnt += 1; /* update count */ fusecnt += 1; /* update count */
} }
@ -220,26 +223,28 @@ extinguish(void (*dfunc)())
void void
do_fuses(int flag) do_fuses(int flag)
{ {
struct delayed_action *wire; struct delayed_action *wire;
int i; int i;
/* /*
* Step though the list * Step though the list
*/ */
for (i = 0; i < MAXFUSES; i++) { for (i = 0; i < MAXFUSES; i++) {
wire = &f_list[i]; wire = &f_list[i];
/* /*
* Decrementing counters and starting things we want. We also need * Decrementing counters and starting things we want. We also need
* to remove the fuse from the list once it has gone off. * to remove the fuse from the list once it has gone off.
*/ */
if(flag == wire->d_type && wire->d_time > 0 && if(flag == wire->d_type && wire->d_time > 0 &&
--wire->d_time == 0) { --wire->d_time == 0) {
wire->d_type = EMPTY; wire->d_type = EMPTY;
if (wire->d_func != NULL) if (*wire->d_func == changeclass || *wire->d_func == res_strength)
(*wire->d_func)(wire->d_arg.vp); (*wire->d_func)(wire->d_arg.i);
fusecnt -= 1; else if (wire->d_func != NULL)
} (*wire->d_func)(wire->d_arg.vp);
fusecnt -= 1;
} }
}
} }
/* /*

View file

@ -323,8 +323,10 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
msg("You cringe at %s's chilling touch.", msg("You cringe at %s's chilling touch.",
prname(attname, FALSE)); prname(attname, FALSE));
chg_str(-1); chg_str(-1);
if (lost_str++ == 0) if (lost_str++ == 0) {
fuse(res_strength, NULL, CHILLTIME, AFTER); int temp_arg = 0;
fuse(res_strength, &temp_arg, CHILLTIME, AFTER);
}
else lengthen(res_strength, CHILLTIME); else lengthen(res_strength, CHILLTIME);
} }
} }
@ -548,11 +550,12 @@ effect(struct thing *att, struct thing *def, struct object *weap, bool thrown,
else { else {
int odor_str = -(rnd(6)+1); int odor_str = -(rnd(6)+1);
int temp_arg2 = 0;
msg("You are overcome by a foul odor!"); msg("You are overcome by a foul odor!");
if (lost_str == 0) { if (lost_str == 0) {
chg_str(odor_str); chg_str(odor_str);
fuse(res_strength, NULL, SMELLTIME, AFTER); fuse(res_strength, &temp_arg2, SMELLTIME, AFTER);
lost_str -= odor_str; lost_str -= odor_str;
} }
else lengthen(res_strength, SMELLTIME); else lengthen(res_strength, SMELLTIME);

View file

@ -966,7 +966,6 @@ killed(struct linked_list *item, bool pr, bool points, bool treasure)
register struct linked_list *pitem, *nexti, *mitem; register struct linked_list *pitem, *nexti, *mitem;
char *monst; char *monst;
int adj; /* used for hit point adj. below. */ int adj; /* used for hit point adj. below. */
long temp;
tp = THINGPTR(item); tp = THINGPTR(item);
@ -1029,8 +1028,7 @@ killed(struct linked_list *item, bool pr, bool points, bool treasure)
if (roll(1,100) < killed_chance) { if (roll(1,100) < killed_chance) {
msg("You had a feeling this was going to happen... "); msg("You had a feeling this was going to happen... ");
msg("**POOF** "); msg("**POOF** ");
temp = C_ASSASSIN; /* make him pay */ changeclass(C_ASSASSIN); /* make him pay */
changeclass(&temp);
} }
else { else {
switch (rnd(9)) { switch (rnd(9)) {

View file

@ -24,9 +24,9 @@
*/ */
void void
changeclass(long *newclass) changeclass(int newclass)
{ {
if (*newclass == player.t_ctype) { if (newclass == player.t_ctype) {
msg("You feel more skillful."); msg("You feel more skillful.");
raise_level(); raise_level();
} }
@ -38,19 +38,19 @@ changeclass(long *newclass)
*/ */
long save; long save;
msg("You are transformed into a %s! ", char_class[*newclass].name); msg("You are transformed into a %s! ", char_class[newclass].name);
/* /*
* if he becomes a thief or an assassin give him studded leather armor * if he becomes a thief or an assassin give him studded leather armor
*/ */
if ((*newclass == C_THIEF || *newclass == C_ASSASSIN) && if ((newclass == C_THIEF || newclass == C_ASSASSIN) &&
cur_armor != NULL && cur_armor->o_which != STUDDED_LEATHER) cur_armor != NULL && cur_armor->o_which != STUDDED_LEATHER)
cur_armor->o_which = STUDDED_LEATHER; cur_armor->o_which = STUDDED_LEATHER;
/* /*
* if he becomes a monk he can't wear any armor * if he becomes a monk he can't wear any armor
* so give him a cloak of protection * so give him a cloak of protection
*/ */
if (*newclass == C_MONK && cur_armor != NULL) { if (newclass == C_MONK && cur_armor != NULL) {
cur_armor->o_ac = armors[cur_armor->o_which].a_class - cur_armor->o_ac = armors[cur_armor->o_which].a_class -
cur_armor->o_ac; cur_armor->o_ac;
cur_armor->o_type = MM; cur_armor->o_type = MM;
@ -62,8 +62,8 @@ changeclass(long *newclass)
/* /*
* otherwise give him plate armor * otherwise give him plate armor
*/ */
if ((*newclass != C_THIEF || if ((newclass != C_THIEF ||
*newclass != C_ASSASSIN || *newclass != C_MONK) && newclass != C_ASSASSIN || newclass != C_MONK) &&
cur_armor != NULL && cur_armor->o_which != PLATE_ARMOR) cur_armor != NULL && cur_armor->o_which != PLATE_ARMOR)
cur_armor->o_which = PLATE_ARMOR; cur_armor->o_which = PLATE_ARMOR;
@ -81,11 +81,11 @@ changeclass(long *newclass)
/* /*
* if he becomes a spell caster of some kind, give him a fuse * if he becomes a spell caster of some kind, give him a fuse
*/ */
if (*newclass == C_MAGICIAN || *newclass == C_RANGER) if (newclass == C_MAGICIAN || newclass == C_RANGER)
fuse(spell_recovery, NULL, SPELLTIME, AFTER); fuse(spell_recovery, NULL, SPELLTIME, AFTER);
if (*newclass == C_DRUID || *newclass == C_MONK) if (newclass == C_DRUID || newclass == C_MONK)
fuse(chant_recovery, NULL, SPELLTIME, AFTER); fuse(chant_recovery, NULL, SPELLTIME, AFTER);
if ((*newclass==C_CLERIC || *newclass==C_PALADIN) && !cur_misc[HEIL_ANKH]) if ((newclass==C_CLERIC || newclass==C_PALADIN) && !cur_misc[HEIL_ANKH])
fuse(prayer_recovery, NULL, SPELLTIME, AFTER); fuse(prayer_recovery, NULL, SPELLTIME, AFTER);
/* /*
* if he's changing from a fighter, ranger, or paladin then we * if he's changing from a fighter, ranger, or paladin then we
@ -98,8 +98,8 @@ changeclass(long *newclass)
cur_weapon != NULL && cur_weapon->o_type == WEAPON && cur_weapon != NULL && cur_weapon->o_type == WEAPON &&
(cur_weapon->o_which == BASWORD || (cur_weapon->o_which == BASWORD ||
cur_weapon->o_which == TWOSWORD) && cur_weapon->o_which == TWOSWORD) &&
!(*newclass == C_FIGHTER || *newclass == C_RANGER || !(newclass == C_FIGHTER || newclass == C_RANGER ||
*newclass == C_PALADIN) && newclass == C_PALADIN) &&
cur_weapon->o_which == TWOSWORD) cur_weapon->o_which == TWOSWORD)
cur_weapon->o_which = SWORD; cur_weapon->o_which = SWORD;
@ -113,8 +113,8 @@ changeclass(long *newclass)
cur_weapon != NULL && cur_weapon->o_type == WEAPON && cur_weapon != NULL && cur_weapon->o_type == WEAPON &&
(cur_weapon->o_which == BASWORD || (cur_weapon->o_which == BASWORD ||
cur_weapon->o_which == TWOSWORD) && cur_weapon->o_which == TWOSWORD) &&
!(*newclass == C_THIEF || *newclass == C_ASSASSIN || !(newclass == C_THIEF || newclass == C_ASSASSIN ||
*newclass == C_MONK) && newclass == C_MONK) &&
cur_weapon->o_which == BASWORD) cur_weapon->o_which == BASWORD)
cur_weapon->o_which = SWORD; cur_weapon->o_which = SWORD;
@ -130,12 +130,12 @@ changeclass(long *newclass)
* if he becomes a thief, assassin, or monk then add * if he becomes a thief, assassin, or monk then add
* the trap_look() daemon * the trap_look() daemon
*/ */
if (*newclass == C_THIEF || *newclass == C_ASSASSIN || if (newclass == C_THIEF || newclass == C_ASSASSIN ||
*newclass == C_MONK) newclass == C_MONK)
start_daemon(trap_look, NULL, AFTER); start_daemon(trap_look, NULL, AFTER);
/* adjust stats */ /* adjust stats */
char_type = player.t_ctype = *newclass; char_type = player.t_ctype = newclass;
save = pstats.s_hpt; save = pstats.s_hpt;
max_stats.s_hpt = pstats.s_hpt = 0; max_stats.s_hpt = pstats.s_hpt = 0;
max_stats.s_lvl = pstats.s_lvl = 0; max_stats.s_lvl = pstats.s_lvl = 0;
@ -1103,7 +1103,7 @@ use_mm(int which)
when MM_SKILLS: when MM_SKILLS:
detach (pack, item); detach (pack, item);
inpack--; inpack--;
changeclass(&obj->o_ac); changeclass(obj->o_ac);
when MM_CRYSTAL: when MM_CRYSTAL:
{ {
register char *str; register char *str;

View file

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

View file

@ -1245,7 +1245,7 @@ int can_shoot(coord *er, coord *ee, coord *shoot_dir);
bool cansee(int y, int x); bool cansee(int y, int x);
void carry_obj(struct thing *mp, int chance); void carry_obj(struct thing *mp, int chance);
void cast(void); void cast(void);
void changeclass(long *newclass); void changeclass(int newclass);
void chant(void); void chant(void);
void chant_recovery(void); void chant_recovery(void);
void chase(struct thing *tp, coord *ee, struct room *rer, struct room *ree, void chase(struct thing *tp, coord *ee, struct room *rer, struct room *ree,