simplify achievement tracking for special objects
This turned out to be a lot more work than I anticipated, but it is definitely simpler (other than having #wizmakemap take achievements away if you replace the level that contains the 'prize', which wasn't handled before). I cheated and made Mine's End into a no-bones level because the new flagging scheme for luckstone, bag, and amulet can't carry over from one game to another. It probably should have been no-bones all along. Sokoban didn't have this issue because it's already no-bones. Existing save files are invalidated.
This commit is contained in:
12
src/invent.c
12
src/invent.c
@@ -835,20 +835,14 @@ struct obj *obj;
|
||||
}
|
||||
|
||||
/* "special achievements" aren't discoverable during play, they
|
||||
end up being recorded in XLOGFILE at end of game, nowhere else;
|
||||
record_achieve_special overloads corpsenm which is ordinarily
|
||||
initialized to NON_PM (-1) rather than to 0; any special prize
|
||||
must never be a corpse, egg, tin, figurine, or statue because
|
||||
their use of obj->corpsenm for monster type would conflict,
|
||||
nor be a leash (corpsenm overloaded for m_id of leashed
|
||||
monster) or a novel (corpsenm overloaded for novel index) */
|
||||
end up being recorded in XLOGFILE at end of game, nowhere else */
|
||||
if (is_mines_prize(obj)) {
|
||||
u.uachieve.mines_luckstone = 1;
|
||||
obj->record_achieve_special = NON_PM;
|
||||
g.context.achieveo.mines_prize_oid = 0;
|
||||
obj->nomerge = 0;
|
||||
} else if (is_soko_prize(obj)) {
|
||||
u.uachieve.finish_sokoban = 1;
|
||||
obj->record_achieve_special = NON_PM;
|
||||
g.context.achieveo.soko_prize_oid = 0;
|
||||
obj->nomerge = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user