Mercurial > hg > early-roguelike
comparison xrogue/pack.c @ 238:e1cd27c5464f
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.
| author | John "Elwin" Edwards |
|---|---|
| date | Fri, 11 Mar 2016 17:40:00 -0500 |
| parents | 7c1cb43f346e |
| children |
comparison
equal
deleted
inserted
replaced
| 237:2236ef808bcb | 238:e1cd27c5464f |
|---|---|
| 34 { | 34 { |
| 35 register struct linked_list *ip, *lp = NULL, *ap; | 35 register struct linked_list *ip, *lp = NULL, *ap; |
| 36 register struct object *obj, *op = NULL; | 36 register struct object *obj, *op = NULL; |
| 37 register bool exact, from_floor; | 37 register bool exact, from_floor; |
| 38 bool giveflag = 0; | 38 bool giveflag = 0; |
| 39 static long cleric = C_CLERIC, | 39 int newclass; |
| 40 monk = C_MONK, | |
| 41 magician = C_MAGICIAN, | |
| 42 assassin = C_ASSASSIN, | |
| 43 druid = C_DRUID, | |
| 44 thief = C_THIEF, | |
| 45 fighter = C_FIGHTER, | |
| 46 ranger = C_RANGER, | |
| 47 paladin = C_PALADIN; | |
| 48 | 40 |
| 49 if (item == NULL) | 41 if (item == NULL) |
| 50 { | 42 { |
| 51 from_floor = TRUE; | 43 from_floor = TRUE; |
| 52 if ((item = find_obj(hero.y, hero.x)) == NULL) | 44 if ((item = find_obj(hero.y, hero.x)) == NULL) |
| 261 if (player.t_ctype != C_CLERIC && player.t_ctype != C_PALADIN) | 253 if (player.t_ctype != C_CLERIC && player.t_ctype != C_PALADIN) |
| 262 fuse(prayer_recovery, NULL, SPELLTIME, AFTER); | 254 fuse(prayer_recovery, NULL, SPELLTIME, AFTER); |
| 263 /* start a fuse to change player into a paladin */ | 255 /* start a fuse to change player into a paladin */ |
| 264 if (quest_item != HEIL_ANKH) { | 256 if (quest_item != HEIL_ANKH) { |
| 265 msg("You hear a strange, distant hypnotic calling... "); | 257 msg("You hear a strange, distant hypnotic calling... "); |
| 266 if (player.t_ctype != C_PALADIN && obj->o_which ==HEIL_ANKH) | 258 if (player.t_ctype != C_PALADIN && obj->o_which ==HEIL_ANKH) { |
| 267 fuse(changeclass, &paladin, roll(8, 8), AFTER); | 259 newclass = C_PALADIN; |
| 260 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 261 } | |
| 268 } | 262 } |
| 269 | 263 |
| 270 /* A cloak must be worn. */ | 264 /* A cloak must be worn. */ |
| 271 when EMORI_CLOAK: | 265 when EMORI_CLOAK: |
| 272 if (cur_armor != NULL || cur_misc[WEAR_CLOAK]) { | 266 if (cur_armor != NULL || cur_misc[WEAR_CLOAK]) { |
| 285 if (obj->o_charges == 0) | 279 if (obj->o_charges == 0) |
| 286 fuse(cloak_charge, obj, CLOAK_TIME, AFTER); | 280 fuse(cloak_charge, obj, CLOAK_TIME, AFTER); |
| 287 /* start a fuse to change player into a monk */ | 281 /* start a fuse to change player into a monk */ |
| 288 if (quest_item != EMORI_CLOAK) { | 282 if (quest_item != EMORI_CLOAK) { |
| 289 msg("You suddenly become calm and quiet. "); | 283 msg("You suddenly become calm and quiet. "); |
| 290 if (player.t_ctype != C_MONK && obj->o_which == EMORI_CLOAK) | 284 if (player.t_ctype != C_MONK && obj->o_which == EMORI_CLOAK) { |
| 291 fuse(changeclass, &monk, roll(8, 8), AFTER); | 285 newclass = C_MONK; |
| 286 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 287 } | |
| 292 } | 288 } |
| 293 | 289 |
| 294 /* The amulet must be worn. */ | 290 /* The amulet must be worn. */ |
| 295 when STONEBONES_AMULET: | 291 when STONEBONES_AMULET: |
| 296 case YENDOR_AMULET: | 292 case YENDOR_AMULET: |
| 310 /* start a fuse to change into a magician */ | 306 /* start a fuse to change into a magician */ |
| 311 if (quest_item != STONEBONES_AMULET) { | 307 if (quest_item != STONEBONES_AMULET) { |
| 312 if (player.t_ctype != C_MAGICIAN && | 308 if (player.t_ctype != C_MAGICIAN && |
| 313 obj->o_which == STONEBONES_AMULET) { | 309 obj->o_which == STONEBONES_AMULET) { |
| 314 msg("You sense approaching etheric forces... "); | 310 msg("You sense approaching etheric forces... "); |
| 315 fuse(changeclass, &magician, roll(8, 8), AFTER); | 311 newclass = C_MAGICIAN; |
| 312 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 316 } | 313 } |
| 317 } | 314 } |
| 318 | 315 |
| 319 /* The eye is now inserted in forehead */ | 316 /* The eye is now inserted in forehead */ |
| 320 when EYE_VECNA: | 317 when EYE_VECNA: |
| 329 waste_time(); | 326 waste_time(); |
| 330 msg("The excruciating pain slowly turns into a dull throb."); | 327 msg("The excruciating pain slowly turns into a dull throb."); |
| 331 /* start a fuse to change player into an assassin */ | 328 /* start a fuse to change player into an assassin */ |
| 332 if (quest_item != EYE_VECNA) { | 329 if (quest_item != EYE_VECNA) { |
| 333 msg("Your blood rushes and you begin to sweat profusely... "); | 330 msg("Your blood rushes and you begin to sweat profusely... "); |
| 334 if (player.t_ctype != C_ASSASSIN && obj->o_which == EYE_VECNA) | 331 if (player.t_ctype != C_ASSASSIN && obj->o_which == EYE_VECNA) { |
| 335 fuse(changeclass, &assassin, roll(8, 8), AFTER); | 332 newclass = C_ASSASSIN; |
| 333 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 334 } | |
| 336 } | 335 } |
| 337 | 336 |
| 338 when QUILL_NAGROM: | 337 when QUILL_NAGROM: |
| 339 fuse(quill_charge, NULL, 8, AFTER); | 338 fuse(quill_charge, NULL, 8, AFTER); |
| 340 /* start a fuse to change player into a druid */ | 339 /* start a fuse to change player into a druid */ |
| 341 if (quest_item != QUILL_NAGROM) { | 340 if (quest_item != QUILL_NAGROM) { |
| 342 msg("You begin to see things differently... "); | 341 msg("You begin to see things differently... "); |
| 343 if (player.t_ctype != C_DRUID && obj->o_which == QUILL_NAGROM) | 342 if (player.t_ctype != C_DRUID && obj->o_which == QUILL_NAGROM) { |
| 344 fuse(changeclass, &druid, roll(8, 8), AFTER); | 343 newclass = C_DRUID; |
| 344 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 345 } | |
| 345 } | 346 } |
| 346 | 347 |
| 347 /* Weapons will insist on being wielded. */ | 348 /* Weapons will insist on being wielded. */ |
| 348 when MUSTY_DAGGER: | 349 when MUSTY_DAGGER: |
| 349 case HRUGGEK_MSTAR: | 350 case HRUGGEK_MSTAR: |
| 360 /* start a fuse to change player into a thief */ | 361 /* start a fuse to change player into a thief */ |
| 361 if (quest_item != MUSTY_DAGGER) { | 362 if (quest_item != MUSTY_DAGGER) { |
| 362 if (player.t_ctype != C_THIEF && | 363 if (player.t_ctype != C_THIEF && |
| 363 obj->o_which == MUSTY_DAGGER) { | 364 obj->o_which == MUSTY_DAGGER) { |
| 364 msg("You look about furtively. "); | 365 msg("You look about furtively. "); |
| 365 fuse(changeclass, &thief, roll(8, 8), AFTER); | 366 newclass = C_THIEF; |
| 367 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 366 } | 368 } |
| 367 } | 369 } |
| 368 /* start a fuse to change player into a fighter */ | 370 /* start a fuse to change player into a fighter */ |
| 369 if (quest_item != AXE_AKLAD) { | 371 if (quest_item != AXE_AKLAD) { |
| 370 if (player.t_ctype != C_FIGHTER && | 372 if (player.t_ctype != C_FIGHTER && |
| 371 obj->o_which == AXE_AKLAD) { | 373 obj->o_which == AXE_AKLAD) { |
| 372 msg("Your bones feel strengthened. "); | 374 msg("Your bones feel strengthened. "); |
| 373 fuse(changeclass, &fighter, roll(8, 8), AFTER); | 375 newclass = C_FIGHTER; |
| 376 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 374 } | 377 } |
| 375 } | 378 } |
| 376 if (cur_weapon != NULL) { | 379 if (cur_weapon != NULL) { |
| 377 msg("The artifact insists you release your current weapon!"); | 380 msg("The artifact insists you release your current weapon!"); |
| 378 if (!dropcheck(cur_weapon)) { | 381 if (!dropcheck(cur_weapon)) { |
| 403 when BRIAN_MANDOLIN: | 406 when BRIAN_MANDOLIN: |
| 404 msg("You hear an ancient haunting sound... "); | 407 msg("You hear an ancient haunting sound... "); |
| 405 /* start a fuse to change player into a ranger */ | 408 /* start a fuse to change player into a ranger */ |
| 406 if (quest_item != BRIAN_MANDOLIN) { | 409 if (quest_item != BRIAN_MANDOLIN) { |
| 407 msg("You are transfixed with empathy. "); | 410 msg("You are transfixed with empathy. "); |
| 408 if (player.t_ctype != C_RANGER && obj->o_which == BRIAN_MANDOLIN) | 411 if (player.t_ctype != C_RANGER && obj->o_which == BRIAN_MANDOLIN) { |
| 409 fuse(changeclass, &ranger, roll(8, 8), AFTER); | 412 newclass = C_RANGER; |
| 413 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 414 } | |
| 410 } | 415 } |
| 411 | 416 |
| 412 /* add to the music */ | 417 /* add to the music */ |
| 413 when GERYON_HORN: | 418 when GERYON_HORN: |
| 414 msg("You begin to hear trumpets!"); | 419 msg("You begin to hear trumpets!"); |
| 415 /* start a fuse to change player into a cleric */ | 420 /* start a fuse to change player into a cleric */ |
| 416 if (quest_item != GERYON_HORN) { | 421 if (quest_item != GERYON_HORN) { |
| 417 msg("You follow their calling. "); | 422 msg("You follow their calling. "); |
| 418 if (player.t_ctype != C_CLERIC && obj->o_which == GERYON_HORN) | 423 if (player.t_ctype != C_CLERIC && obj->o_which == GERYON_HORN) { |
| 419 fuse(changeclass, &cleric, roll(8, 8), AFTER); | 424 newclass = C_CLERIC; |
| 425 fuse(changeclass, &newclass, roll(8, 8), AFTER); | |
| 426 } | |
| 420 } | 427 } |
| 421 | 428 |
| 422 /* the card can not be picked up, it must be traded for */ | 429 /* the card can not be picked up, it must be traded for */ |
| 423 when ALTERAN_CARD: | 430 when ALTERAN_CARD: |
| 424 if (giveflag == FALSE) { | 431 if (giveflag == FALSE) { |
