mirror of
https://codeberg.org/noisytoot/notnotdnethack.git
synced 2025-08-14 00:21:38 +01:00
Merge branch 'devel-3.21.3' of https://github.com/Chris-plus-alphanumericgibberish/dNAO
This commit is contained in:
commit
da4365ce68
61 changed files with 1530 additions and 415 deletions
dat
include
junethack_trophies
src
allmain.capply.cartifact.cattrib.cdo.cdo_name.cdo_wear.cdogmove.cdungeon.ceat.cengrave.cenlighten.cinvent.clock.cmakemon.cmcastu.cminion.cmkobj.cmkroom.cmon.cmondata.cmonst.cmplayer.cmusic.cobjects.cobjnam.cpager.cpline.cpotion.cpray.cread.crole.cshk.cspell.csteal.ctimeout.ctopten.ctrap.cu_init.cweapon.cwizard.cworn.cxhity.czap.c
|
@ -693,7 +693,7 @@ MAP
|
|||
ENDMAP
|
||||
#0123456789012345678901234567890123456789012345678901234567890123456789012345
|
||||
# 1 2 3 4 5 6 7 7
|
||||
RANDOM_PLACES:(26,01),(26,17),(42,01),(42,07),(29,14),(43,14),(43,04)
|
||||
RANDOM_PLACES:(26,01),(26,17),(42,01),(42,17),(29,14),(39,14),(39,04)
|
||||
|
||||
# Stairs
|
||||
STAIR:place[1],down
|
||||
|
|
|
@ -106,6 +106,7 @@ STAIR:(68,10),down
|
|||
OBJECT:'#',"uncharged lantern",(62,18)
|
||||
CONTAINER:'(',"sack",(62,18)
|
||||
OBJECT:'#',"+2 blessed wrathful silver elven broadsword",contained
|
||||
OBJECT:'(',"magic torch",contained
|
||||
OBJECT:'#',"platinum bar",contained
|
||||
|
||||
# Warning
|
||||
|
@ -272,6 +273,7 @@ STAIR:(66,15),down
|
|||
OBJECT:'#',"uncharged lantern",(67,17)
|
||||
CONTAINER:'(',"sack",(67,17)
|
||||
OBJECT:'#',"+2 blessed wrathful silver elven broadsword",contained
|
||||
OBJECT:'(',"magic torch",contained
|
||||
OBJECT:'#',"platinum bar",contained
|
||||
|
||||
# Non diggable walls
|
||||
|
|
|
@ -487,7 +487,8 @@ extern struct artifact * artilist;
|
|||
/* artifact has no specific material or size, eg "silver Grimtooth" */
|
||||
#define is_malleable_artifact(a) (is_nameable_artifact((a)) || (a) == &artilist[ART_EXCALIBUR] || (a) == &artilist[ART_GUNGNIR] || (a) == &artilist[ART_DIRGE])
|
||||
|
||||
#define is_living_artifact(obj) ((obj)->oartifact == ART_TENTACLE_ROD || (obj)->oartifact == ART_DRAGONHEAD_SHIELD || (obj)->oartifact == ART_CRUCIFIX_OF_THE_MAD_KING || (obj)->oartifact == ART_RITUAL_RINGED_SPEAR || (obj)->oartifact == ART_RINGED_BRASS_ARMOR || (obj)->oartifact == ART_IBITE_ARM || (arti_is_prop(obj, ARTI_BLOODTHRST) && roll_generic_flat_madness()))
|
||||
#define is_living_artifact(obj) ((obj)->oartifact == ART_TENTACLE_ROD || (obj)->oartifact == ART_DRAGONHEAD_SHIELD || (obj)->oartifact == ART_CRUCIFIX_OF_THE_MAD_KING || (obj)->oartifact == ART_RITUAL_RINGED_SPEAR || (obj)->oartifact == ART_RINGED_BRASS_ARMOR || (obj)->oartifact == ART_IBITE_ARM)
|
||||
#define is_bloodthirsty_artifact(obj) (arti_is_prop(obj, ARTI_BLOODTHRST) && roll_generic_flat_madness(FALSE))
|
||||
|
||||
#define is_mastery_artifact_nameable(a) (\
|
||||
/* Mastery artifacts */\
|
||||
|
|
|
@ -768,7 +768,7 @@ A("The Holy Moonlight Sword", LONG_SWORD, (const char *)0, // begging for a d
|
|||
ATTK(AD_PHYS, 12, 0), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
ENLIGHTENING, NOFLAG
|
||||
ENLIGHTENING, (ARTI_PLUSTEN)
|
||||
),
|
||||
|
||||
/* can be transformed by offering your blood */
|
||||
|
@ -781,7 +781,7 @@ A("Bloodletter", MORNING_STAR, (const char *)0,
|
|||
ATTK(AD_BLUD, 8, 12), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
BLOODLETTER, NOFLAG
|
||||
BLOODLETTER, (ARTI_PLUSTEN)
|
||||
),
|
||||
|
||||
/*Needs encyc entry*/
|
||||
|
@ -2130,7 +2130,7 @@ A("Idol of Bokrug, the water-lizard", STATUE, "sea-green stone likeness of a wa
|
|||
NOINVOKE, NOFLAG
|
||||
),
|
||||
|
||||
A("The Star of Hypernotus", AMULET_VERSUS_CURSES, "blue-green star-shaped stone",
|
||||
A("The Star of Hypernotus", AMULET_VERSUS_CURSES, "blue-green star-shaped %s",
|
||||
2500L, GEMSTONE, MZ_DEFAULT, WT_DEFAULT,
|
||||
A_NEUTRAL, PM_MADMAN, NON_PM, TIER_S, (ARTG_NOGEN|ARTG_NOWISH|ARTG_MAJOR),
|
||||
NO_MONS(),
|
||||
|
|
|
@ -846,7 +846,8 @@ struct u_achieve {
|
|||
#define FEM_DRA_NOB_QUEST 0x1L << 45
|
||||
#define DEVIL_VAULT 0x1L << 46
|
||||
#define DEMON_VAULT 0x1L << 47
|
||||
#define ACHIEVE_NUMBER 59
|
||||
#define BOKRUG_QUEST 0x1L << 48
|
||||
#define ACHIEVE_NUMBER 60
|
||||
};
|
||||
|
||||
E struct u_achieve achieve;
|
||||
|
|
|
@ -140,6 +140,7 @@ E int FDECL(touch_artifact, (struct obj *,struct monst *, int));
|
|||
E int FDECL(spec_abon, (struct obj *,struct monst *, boolean));
|
||||
E boolean FDECL(spec_dbon, (struct obj *,struct monst *,int,int*,int*));
|
||||
E boolean FDECL(oproperty_dbon, (struct obj *, struct monst *, int, int*, int*));
|
||||
E void FDECL(mercy_blade_conflict, (struct monst *, struct monst *, int, boolean));
|
||||
E int FDECL(spec_applies, (struct obj *,struct monst *, boolean));
|
||||
E void FDECL(discover_artifact, (int));
|
||||
E void FDECL(undiscover_artifact, (int));
|
||||
|
@ -203,8 +204,8 @@ E double FDECL(conplus, (int));
|
|||
E void FDECL(change_usanity, (int, boolean));
|
||||
E void FDECL(change_uinsight, (int));
|
||||
E boolean NDECL(check_insight);
|
||||
E int NDECL(roll_generic_madness);
|
||||
E int NDECL(roll_generic_flat_madness);
|
||||
E int FDECL(roll_generic_madness, (int));
|
||||
E int FDECL(roll_generic_flat_madness, (int));
|
||||
E int FDECL(roll_madness, (long int));
|
||||
E int FDECL(mad_turn, (long int));
|
||||
E int FDECL(flat_mad_turn, (long int));
|
||||
|
@ -212,6 +213,7 @@ E int FDECL(mad_monster_turn, (struct monst *, long int));
|
|||
E void NDECL(roll_av_frigophobia);
|
||||
E void NDECL(roll_frigophobia);
|
||||
E void FDECL(give_madness, (struct monst *));
|
||||
E void FDECL(you_inflict_madness, (struct monst *));
|
||||
E void NDECL(calc_total_maxhp);
|
||||
E void NDECL(calc_total_maxen);
|
||||
E schar FDECL(acurr, (int));
|
||||
|
@ -2526,6 +2528,7 @@ E void NDECL(check_loadout_trophy);
|
|||
E void NDECL(give_nightmare_hunter_trophy);
|
||||
E void NDECL(check_madman_trophy);
|
||||
E void NDECL(check_drunkard_trophy);
|
||||
E void NDECL(give_bokrug_trophy);
|
||||
#endif
|
||||
|
||||
/* ### rumors.c ### */
|
||||
|
@ -2942,6 +2945,7 @@ E int NDECL(uescape_entanglement);
|
|||
|
||||
E void NDECL(u_init);
|
||||
E void FDECL(knows_object,(int) );
|
||||
E void FDECL(know_random_obj,(int));
|
||||
E void NDECL(scatter_weapons);
|
||||
|
||||
/* ### unixmain.c ### */
|
||||
|
@ -3277,6 +3281,7 @@ E void FDECL(bypass_obj, (struct obj *));
|
|||
E void NDECL(clear_bypasses);
|
||||
E int FDECL(magic_negation, (struct monst *));
|
||||
E void FDECL(light_damage, (genericptr_t, long));
|
||||
E int NDECL(heal_mlevel_bonus);
|
||||
|
||||
/* ### write.c ### */
|
||||
|
||||
|
|
|
@ -237,11 +237,12 @@
|
|||
#define AD_LOKO 159 /*Lokoban prize loot*/
|
||||
#define AD_HOLY 160 /* Holy energy (MM-stype damage not resisted by MR and doubled against holy-haters) */
|
||||
#define AD_UNHY 161 /* Unholy energy (MM-stype damage not resisted by MR and doubled against unholy-haters) */
|
||||
#define AD_PERH 162 /* "Per-Hit-Die damage (x damage per HD of the defender, be careful with damage die size!) */
|
||||
|
||||
//#define AD_AHAZU 116 /* */
|
||||
//Amon is a headbutt (AT_BUTT/AD_PHYS)
|
||||
//Chupoclops is a poisonous bite (AT_BITE/AD_DRST)
|
||||
#define AD_DUNSTAN 162
|
||||
#define AD_DUNSTAN 163
|
||||
#define AD_IRIS AD_DUNSTAN+1
|
||||
#define AD_NABERIUS AD_DUNSTAN+2
|
||||
#define AD_OTIAX AD_DUNSTAN+3
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
|| (levl[(mon)->mx][(mon)->my].lit && (viz_array[(mon)->my][(mon)->mx]&TEMP_DRK1 && !(viz_array[(mon)->my][(mon)->mx]&TEMP_LIT1))))))
|
||||
#define is_deaf(mon) (!((mon)->mcanhear) ||\
|
||||
(mon)->mtyp == PM_NUPPERIBO ||\
|
||||
(mon)->mtyp == PM_APHANACTONAN_ASSESSOR ||\
|
||||
(mon)->mtyp == PM_ALABASTER_ELF ||\
|
||||
(mon)->mtyp == PM_ALABASTER_ELF_ELDER)
|
||||
|
||||
|
@ -112,7 +113,7 @@
|
|||
((ptr)->mtyp == PM_CYCLOPS || \
|
||||
(ptr)->mtyp == PM_MONOTON || \
|
||||
(ptr)->mtyp == PM_FLOATING_EYE) ? 1 : 2)
|
||||
#define sensitive_ears(ptr) (((ptr)->mflagsv & MV_ECHOLOCATE) != 0L)
|
||||
#define sensitive_ears(ptr) (((ptr)->mflagsv & MV_ECHOLOCATE) != 0L || (ptr)->mtyp == PM_APHANACTONAN_AUDIENT)
|
||||
#define nohands(ptr) (((ptr)->mflagsb & (MB_NOHANDS|MB_NOLIMBS)) != 0L)
|
||||
#define nolimbs(ptr) (((ptr)->mflagsb & MB_NOLIMBS) == MB_NOLIMBS)
|
||||
#define nofeet(ptr) ((ptr)->mflagsb & MB_NOFEET)
|
||||
|
@ -415,10 +416,10 @@
|
|||
(ptr)->mtyp == PM_ENORMOUS_RAT || \
|
||||
(ptr)->mtyp == PM_RODENT_OF_UNUSUAL_SIZE)
|
||||
#define is_dragon(ptr) (((ptr)->mflagsa & MA_DRAGON) != 0L)
|
||||
#define is_true_dragon(ptr) ((monsndx(ptr) >= PM_BABY_GRAY_DRAGON && monsndx(ptr) <= PM_DEEP_DRAGON) || \
|
||||
#define is_true_dragon(ptr) ((monsndx(ptr) >= PM_BABY_GRAY_DRAGON && monsndx(ptr) <= PM_YELLOW_DRAGON) || \
|
||||
(ptr)->mtyp == PM_EDEN || (ptr)->mtyp == PM_FAFNIR || \
|
||||
(ptr)->mtyp == PM_PLATINUM_DRAGON || (ptr)->mtyp == PM_CHROMATIC_DRAGON)
|
||||
#define is_true_adult_dragon(ptr) ((monsndx(ptr) >= PM_GRAY_DRAGON && monsndx(ptr) <= PM_DEEP_DRAGON) || \
|
||||
#define is_true_adult_dragon(ptr) ((monsndx(ptr) >= PM_GRAY_DRAGON && monsndx(ptr) <= PM_YELLOW_DRAGON) || \
|
||||
(ptr)->mtyp == PM_PLATINUM_DRAGON || (ptr)->mtyp == PM_CHROMATIC_DRAGON || (ptr)->mtyp == PM_IXOTH || (ptr)->mtyp == PM_SMAUG)
|
||||
#define is_pseudodragon(ptr) (monsndx(ptr) >= PM_TINY_PSEUDODRAGON && monsndx(ptr) <= PM_GIGANTIC_PSEUDODRAGON)
|
||||
#define is_bird(ptr) (((ptr)->mflagsa & MA_AVIAN) != 0L)
|
||||
|
@ -619,6 +620,7 @@
|
|||
#define can_breathe(ptr) attacktype(ptr, AT_BREA)
|
||||
#define taxes_sanity(ptr) (((ptr)->mflagsg & MG_SANLOSS) != 0L)
|
||||
#define yields_insight(ptr) (((ptr)->mflagsg & MG_INSIGHT) != 0L)
|
||||
#define banish_kill(mtyp) (mtyp == PM_SECRET_WHISPERER || mtyp == PM_TRUTH_SEER || mtyp == PM_DREAM_EATER || mtyp == PM_VEIL_RENDER)
|
||||
|
||||
#define cantwield(ptr) (nohands(ptr))
|
||||
#define could_twoweap(ptr) attacktype(ptr, AT_XWEP)
|
||||
|
|
|
@ -159,30 +159,33 @@ struct monst {
|
|||
Bitfield(menvy,1);/* wants only others stuff */ /*94*/
|
||||
/*Monster madnesses*/
|
||||
Bitfield(msanctity,1);/* can't attack women */ /*95*/
|
||||
/**unimplemented**/
|
||||
Bitfield(mgluttony,1);/* eats food */ /*96*/
|
||||
Bitfield(mfrigophobia,1);/* won't cross water */ /*97*/
|
||||
Bitfield(mfrigophobia,1);/* won't cross ice */ /*97*/
|
||||
Bitfield(mcannibal,1);/* attacks same race, eats corpses */ /*98*/
|
||||
Bitfield(mrage,1);/* berserk plus moral */ /*99*/
|
||||
Bitfield(mrage,1);/* berserk plus morale*/ /*99*/
|
||||
Bitfield(margent,1);/* can't attack men, distracted by mirrors */ /*100*/
|
||||
Bitfield(msuicide,1);/* doesn't defend self */ /*101*/
|
||||
Bitfield(mnudist,1);/* takes off clothing */ /*102*/
|
||||
Bitfield(mophidio,1);/* attacked by snakes */ /*103*/
|
||||
Bitfield(marachno,1);/* attacked by spiders, can't attack women */ /*104*/
|
||||
Bitfield(mthalasso,1);/* attacked by seamonsters */ /*105*/
|
||||
Bitfield(mhelmintho,1);/* attacked by wormy things */ /*106*/
|
||||
Bitfield(mentomo,1);/* attacked by insects */ /*105*/
|
||||
Bitfield(mthalasso,1);/* attacked by seamonsters */ /*106*/
|
||||
Bitfield(mhelmintho,1);/* attacked by wormy things */ /*107*/
|
||||
Bitfield(mparanoid,1);/* attacks the wrong squares */ /*108*/
|
||||
Bitfield(mtalons,1);/* won't use items */ /*107*/
|
||||
Bitfield(mdreams,1);/* blasted by cthulhu while asleep */ /*108*/
|
||||
Bitfield(mscaiaphilia,1);/* won't move into the light */ /*109*/
|
||||
Bitfield(mforgetful,1);/* can't use wizard spellcasting */ /*110*/
|
||||
Bitfield(mtoobig,1);/* elevated spell failure */ /*111*/
|
||||
Bitfield(mrotting,1);/* spreads poison clouds */ /*112*/
|
||||
Bitfield(mtalons,1);/* won't use items */ /*109*/
|
||||
Bitfield(mdreams,1);/* blasted by cthulhu while asleep */ /*110*/
|
||||
Bitfield(mscaiaphilia,1);/* won't move into the light */ /*111*/
|
||||
Bitfield(mforgetful,1);/* can't use wizard spellcasting */ /*112*/
|
||||
Bitfield(mapostasy,1);/* can't use priest spellcasting */ /*113*/
|
||||
Bitfield(mtoobig,1);/* elevated spell failure */ /*114*/
|
||||
Bitfield(mrotting,1);/* spreads poison clouds */ /*115*/
|
||||
|
||||
Bitfield(deadmonster,2); /* is DEADMONSTER */ /*114*/
|
||||
Bitfield(deadmonster,2); /* is DEADMONSTER */ /*116*/
|
||||
#define DEADMONSTER_DEAD 0x1
|
||||
#define DEADMONSTER_PURGE 0x2
|
||||
#define DEADMONSTER(mon) ((mon) != &youmonst && (mon)->deadmonster)
|
||||
Bitfield(mnoise,1); /* made noise in the last turn (dochug) */ /*115*/
|
||||
Bitfield(mnoise,1); /* made noise in the last turn (dochug) */ /*118*/
|
||||
|
||||
unsigned long long int seenmadnesses; /* monster has seen these madnesses */
|
||||
|
||||
|
|
|
@ -487,6 +487,9 @@ struct obj {
|
|||
#define is_rakuyo(otmp) (otmp->otyp == RAKUYO || \
|
||||
otmp->otyp == RAKUYO_SABER || \
|
||||
otmp->otyp == RAKUYO_DAGGER)
|
||||
#define is_mercy_blade(otmp) (otmp->otyp == BLADE_OF_MERCY || \
|
||||
otmp->otyp == BLADE_OF_GRACE || \
|
||||
otmp->otyp == BLADE_OF_PITY)
|
||||
#define rakuyo_prop(otmp) (check_oprop(otmp, OPROP_RAKUW))
|
||||
#define is_insight_weapon(otmp) (check_oprop(otmp, OPROP_CCLAW) || \
|
||||
rakuyo_prop(otmp) || \
|
||||
|
@ -495,6 +498,7 @@ struct obj {
|
|||
otmp->oartifact == ART_BLOODLETTER || \
|
||||
otmp->oartifact == ART_LASH_OF_THE_COLD_WASTE || \
|
||||
otmp->obj_material == MERCURIAL || \
|
||||
is_mercy_blade(otmp) || \
|
||||
otmp->otyp == ISAMUSEI ||\
|
||||
otmp->otyp == DISKOS ||\
|
||||
otmp->otyp == BESTIAL_CLAW)
|
||||
|
@ -633,11 +637,13 @@ struct obj {
|
|||
#define spec_prop_otyp(otmp) ((pure_weapon(otmp) || dark_weapon(otmp) || force_weapon(otmp)) || is_tipped_spear(otmp) || \
|
||||
(otmp)->otyp == SUNROD || \
|
||||
(otmp)->otyp == TORCH || \
|
||||
(otmp)->otyp == MAGIC_TORCH || \
|
||||
(otmp)->otyp == SHADOWLANDER_S_TORCH || \
|
||||
(otmp)->otyp == CROW_QUILL || \
|
||||
(otmp)->otyp == SET_OF_CROW_TALONS || \
|
||||
(otmp)->otyp == ISAMUSEI || \
|
||||
(otmp)->otyp == DISKOS || \
|
||||
is_mercy_blade(otmp) || \
|
||||
(otmp)->otyp == KAMEREL_VAJRA)
|
||||
#define spec_prop_material(otmp) (otmp->obj_material == MERCURIAL)
|
||||
#define is_multigen(otmp) ((otmp->oclass == WEAPON_CLASS && \
|
||||
|
@ -776,7 +782,11 @@ struct obj {
|
|||
|| (otmp)->otyp == WITCH_HAT)
|
||||
|
||||
#define is_plusten(otmp) (arti_plusten(otmp)\
|
||||
|| is_rakuyo(otmp))
|
||||
|| is_rakuyo(otmp)\
|
||||
|| is_mercy_blade(otmp)\
|
||||
|| otmp->otyp == ISAMUSEI\
|
||||
|| otmp->otyp == BESTIAL_CLAW\
|
||||
)
|
||||
#define is_plussev_armor(otmp) (is_elven_armor((otmp))\
|
||||
|| arti_plussev((otmp))\
|
||||
|| ((otmp)->otyp == CORNUTHAUM && Role_if(PM_WIZARD))\
|
||||
|
@ -968,6 +978,7 @@ struct obj {
|
|||
|| (otmp)->otyp == TALLOW_CANDLE\
|
||||
|| (otmp)->otyp == WAX_CANDLE\
|
||||
|| (otmp)->otyp == TORCH\
|
||||
|| (otmp)->otyp == MAGIC_TORCH\
|
||||
|| (otmp)->otyp == SHADOWLANDER_S_TORCH\
|
||||
|| (otmp)->otyp == CANDLE_OF_INVOCATION\
|
||||
|| (otmp)->otyp == POT_OIL)
|
||||
|
|
|
@ -575,7 +575,7 @@ struct levelflags {
|
|||
/* Not currently used */
|
||||
Bitfield(slime, 1); /* corpses on level become slimes */
|
||||
Bitfield(fungi, 1); /* corpses on level become fungi */
|
||||
Bitfield(dun, 1); /* level is the dun savana */
|
||||
Bitfield(dun, 1); /* level is the Dun Savannah */
|
||||
Bitfield(necro, 1); /* corpses on level rise as undead */
|
||||
/* End not currently used */
|
||||
/*28*/
|
||||
|
|
|
@ -19,7 +19,18 @@ struct spell {
|
|||
int sp_know; /* knowlege of spell */
|
||||
};
|
||||
|
||||
#define KEEN 20000
|
||||
|
||||
#define incrnknow(spell) spl_book[spell].sp_know = KEEN
|
||||
#define percdecrnknow(spell, knw) spl_book[spell].sp_know = max(0, spl_book[spell].sp_know - (KEEN*knw)/100)
|
||||
|
||||
#define spellev(spell) spl_book[spell].sp_lev
|
||||
#define spellname(spell) OBJ_NAME(objects[spellid(spell)])
|
||||
#define spellet(spell) \
|
||||
((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26)))
|
||||
|
||||
#define decrnknow(spell) spl_book[spell].sp_know--
|
||||
#define ndecrnknow(spell, knw) spl_book[spell].sp_know = max(0, spl_book[spell].sp_know - knw)
|
||||
#define spellid(spell) spl_book[spell].sp_id
|
||||
#define spellknow(spell) spl_book[spell].sp_know
|
||||
#define emergency_spell(spell) (spellid(spell) == SPE_HEALING || spellid(spell) == SPE_EXTRA_HEALING || \
|
||||
|
|
|
@ -233,6 +233,8 @@ struct Race {
|
|||
#define NIGHTVISION2 2
|
||||
#define NIGHTVISION3 3
|
||||
|
||||
int spelspec; /* spell (SPE_) the species excels at */
|
||||
int spelsbon; /* penalty (-bonus) for that spell */
|
||||
/*** Properties in variable-length arrays ***/
|
||||
/* intrinsics (see attrib.c) */
|
||||
|
||||
|
@ -638,10 +640,11 @@ struct you {
|
|||
#define MAD_TOO_BIG 0x0000000040000000L
|
||||
#define MAD_APOSTASY 0x0000000080000000L
|
||||
#define MAD_ROTTING 0x0000000100000000L
|
||||
#define LAST_MADNESS MAD_ROTTING
|
||||
int uinsight; /* to record level of insight */
|
||||
/*Insight rate calculation: 40: "high insight" 300: "Approximate per-turn WoYendor intervention rate" 5: "total number of harmful effects" */
|
||||
#define INSIGHT_RATE (40*300*5)
|
||||
#define COA_PROB (max(1, 5000*pow(.95,(Role_if(PM_ANACHRONOUNBINDER)?max(0,u.uinsight-100):u.uinsight))))
|
||||
#define COA_PROB (max(1, 10000*pow(.95,(Role_if(PM_ANACHRONOUNBINDER)?max(0,u.uinsight-100):u.uinsight))))
|
||||
uchar wimage; /* to record if you have the image of a Weeping Angel in your mind */
|
||||
int umorgul; /* to record the number of morgul wounds */
|
||||
int utaneggs; /* tannin eggs */
|
||||
|
@ -693,30 +696,31 @@ struct you {
|
|||
#define PUMMEL 5
|
||||
|
||||
long wardsknown; /* known wards */
|
||||
#define WARD_ELBERETH 0x0000001L
|
||||
#define WARD_HEPTAGRAM 0x0000002L
|
||||
#define WARD_GORGONEION 0x0000004L
|
||||
#define WARD_ACHERON 0x0000008L
|
||||
#define WARD_PENTAGRAM 0x0000010L
|
||||
#define WARD_HEXAGRAM 0x0000020L
|
||||
#define WARD_HAMSA 0x0000040L
|
||||
#define WARD_ELDER_SIGN 0x0000080L
|
||||
#define WARD_EYE 0x0000100L
|
||||
#define WARD_QUEEN 0x0000200L
|
||||
#define WARD_CAT_LORD 0x0000400L
|
||||
#define WARD_GARUDA 0x0000800L
|
||||
#define WARD_CTHUGHA 0x0001000L
|
||||
#define WARD_ITHAQUA 0x0002000L
|
||||
#define WARD_KARAKAL 0x0004000L
|
||||
#define WARD_YELLOW 0x0008000L
|
||||
#define WARD_TRANSIT 0x0010000L
|
||||
#define WARD_STABILIZE 0x0020000L
|
||||
#define WARD_TOUSTEFNA 0x0040000L
|
||||
#define WARD_DREPRUN 0x0080000L
|
||||
#define WARD_OTTASTAFUR 0x0100000L
|
||||
#define WARD_KAUPALOKI 0x0200000L
|
||||
#define WARD_VEIOISTAFUR 0x0400000L
|
||||
#define WARD_THJOFASTAFUR 0x0800000L
|
||||
#define WARD_ELBERETH (0x1L<<0)
|
||||
#define WARD_HEPTAGRAM (0x1L<<1)
|
||||
#define WARD_GORGONEION (0x1L<<2)
|
||||
#define WARD_ACHERON (0x1L<<3)
|
||||
#define WARD_PENTAGRAM (0x1L<<4)
|
||||
#define WARD_HEXAGRAM (0x1L<<5)
|
||||
#define WARD_HAMSA (0x1L<<6)
|
||||
#define WARD_ELDER_SIGN (0x1L<<7)
|
||||
#define WARD_EYE (0x1L<<8)
|
||||
#define WARD_QUEEN (0x1L<<9)
|
||||
#define WARD_CAT_LORD (0x1L<<10)
|
||||
#define WARD_GARUDA (0x1L<<11)
|
||||
#define WARD_CTHUGHA (0x1L<<12)
|
||||
#define WARD_ITHAQUA (0x1L<<13)
|
||||
#define WARD_KARAKAL (0x1L<<14)
|
||||
#define WARD_YELLOW (0x1L<<15)
|
||||
#define WARD_TRANSIT (0x1L<<16)
|
||||
#define WARD_STABILIZE (0x1L<<17)
|
||||
#define WARD_TOUSTEFNA (0x1L<<18)
|
||||
#define WARD_DREPRUN (0x1L<<19)
|
||||
#define WARD_OTTASTAFUR (0x1L<<20)
|
||||
#define WARD_KAUPALOKI (0x1L<<21)
|
||||
#define WARD_VEIOISTAFUR (0x1L<<22)
|
||||
#define WARD_THJOFASTAFUR (0x1L<<23)
|
||||
#define NUM_WARDS 23
|
||||
|
||||
|
||||
int sealorder[31];
|
||||
|
|
BIN
junethack_trophies/dnh_elf_shared_quest.png
Normal file
BIN
junethack_trophies/dnh_elf_shared_quest.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 944 B |
BIN
junethack_trophies/dnh_illuminated.png
Normal file
BIN
junethack_trophies/dnh_illuminated.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 1 KiB |
BIN
junethack_trophies/dnh_madman_quest.png
Normal file
BIN
junethack_trophies/dnh_madman_quest.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 1.7 KiB |
|
@ -1,47 +1,47 @@
|
|||
achieveXname,name,description,icon,
|
||||
archeologist_quest,Walking international incident,Completed the revised archeologist quest,X,
|
||||
caveman_quest,Serpent slayer,Completed the revised caveman quest,X,
|
||||
convict_quest,Sentence commuted,Completed the revised convict quest,X,
|
||||
knight_quest,Into the crystal cave,Completed the revised knight quest,X,
|
||||
anachrononaut_quest,Back from the future,Completed the anachrononaut quest,X,
|
||||
android_quest,Glory to mankind,Completed the android quest,X,
|
||||
anachrononaut_ascension,No fate,Ascended an Anachrononaut and saved the future,X,
|
||||
binder_quest,33 spirits,Completed the binder quest,X,
|
||||
binder_ascension,The other side of the sky,Ascended a Binder,X,
|
||||
pirate_quest,Not so inconceivable,Completed the pirate quest,X,
|
||||
bard_quest,Not so spoony,Completed the bard quest,X,
|
||||
base_noble_quest,Rebellion crushed,Completed the base noble quest,X,
|
||||
hedrow_noble_quest,Family drama,Completed the hedrow noble quest,X,
|
||||
hedrow_shared_quest,On agency,Completed the hedrow shared quest,X,
|
||||
drow_noble_quest,Foreshadowing,Completed the drow noble quest,X,
|
||||
drow_shared_quest,Old friends,Completed the drow shared quest,,Two @
|
||||
dwarf_noble_quest,Durin's Bane's Bane,Completed the dwarf noble quest,,@ and & on a bridge over lava
|
||||
dwarf_knight_quest,Battle of (5-4) armies,Completed the dwarf knight quest,,@ facing a bunch of o
|
||||
gnome_ranger_quest,Strongest of all time,Completed the gnome ranger quest,,Gnome sniping a kobold
|
||||
elf_shared_quest,Driven out,Completed the elf shared quest,,
|
||||
clockwork_ascension,Deus ex machina,Ascended a clockwork automaton,,
|
||||
chiropteran_ascension,Bat outa hell,Ascended a chiropteran,,
|
||||
yuki_onna_ascension,Snow in heaven,Ascended a yuki-onna,,
|
||||
half_dragon_ascension,Three halves,Ascended a half-dragon,,
|
||||
law_quest,Ripple-resistant tower,Completed the law quest,,
|
||||
neutral_quest,Key to the (corpse) city,Completed the neutral quest,,
|
||||
chaos_temple_quest,Asinine paradigm,Completed the chaos temple quest,,
|
||||
mithardir_quest,Chasing after the wind,Completed the mithardir quest,,
|
||||
mordor_quest,Fossil of the First Age,Completed the mordor quest,,
|
||||
second_thoughts,Second thoughts,Completed a drow shared quest loyally before completing the traitor's quest,,Drow surrounded by corpses
|
||||
illuminated,Illuminated,Learned every word of creation and accumulated 30 passive sylabel bonuses,,@ with a bunch of colored dashes
|
||||
exodus,Exodus,Ascended with a pet android commander or operator android,,
|
||||
fully_upgraded,Super Fighting Robot,Acquried all clockwork upgrades (except high-tension spring),,
|
||||
hunter_of_nightmares,Hunter of Nightmares,Defeated at least one of each of the secret insight bosses,,
|
||||
two_keys,Two Keys,Ascended having only touched two alignment keys,,Me with a headache
|
||||
quite_mad,Quite Mad,Suffered from at least 6 madnesses,,
|
||||
booze_hound,Booze Hound,Maxed out your drunkard score by drinking at least 90 potions of booze,,Dog surrounded by booze potions
|
||||
New June 2021,,,,
|
||||
madman_quest,Oh good. I'm not crazy.,Completed the madman quest,,
|
||||
lamashtu_kill,Does this count as a paradox?,Destroyed Lamashtu (Demon Queen of the future),,
|
||||
baalphegor_kill,A universe without motion,Destroyed Baalphegor,,
|
||||
angel_hell_vault OR ancient_hell_vault OR tanninim_hell_vault,Relics of a bygone era,Opened one type of hellish seal,,
|
||||
angel_hell_vault AND ancient_hell_vault AND tanninim_hell_vault,There are a lot of these….,Opened all three types of hellish seal (across all games played),,
|
||||
archeologist_quest,Walking international incident,Completed the revised archeologist quest,dnh_archeologist_quest.png,
|
||||
caveman_quest,Serpent slayer,Completed the revised caveman quest,dnh_caveman_quest.png,
|
||||
convict_quest,Sentence commuted,Completed the revised convict quest,dnh_convict_quest.png,
|
||||
knight_quest,Into the crystal cave,Completed the revised knight quest,dnh_knight_quest.png,
|
||||
anachrononaut_quest,Back from the future,Completed the anachrononaut quest,dnh_anachrononaut_quest.png,
|
||||
android_quest,Glory to mankind,Completed the android quest,dnh_android_quest.png,
|
||||
anachrononaut_ascension,No fate,Ascended an Anachrononaut and saved the future,dnh_anachrononaut_ascension.png,
|
||||
binder_quest,33 spirits,Completed the binder quest,dnh_binder_quest.png,
|
||||
binder_ascension,The other side of the sky,Ascended a Binder,dnh_binder_ascension.png,
|
||||
pirate_quest,Not so inconceivable,Completed the pirate quest,dnh_pirate_quest.png,
|
||||
bard_quest,Not so spoony,Completed the bard quest,dnh_bard_quest.png,
|
||||
base_noble_quest,Rebellion crushed,Completed the base noble quest,dnh_noble_quest.png,
|
||||
hedrow_noble_quest,Family drama,Completed the hedrow noble quest,dnh_hedrow_noble_quest.png,
|
||||
hedrow_shared_quest,On agency,Completed the hedrow shared quest,dnh_hedrow_shared_quest.png,
|
||||
drow_noble_quest,Foreshadowing,Completed the drow noble quest,dnh_drow_noble_quest.png,
|
||||
drow_shared_quest,Old friends,Completed the drow shared quest,dnh_drow_shared_quest.png,
|
||||
dwarf_noble_quest,Durin's Bane's Bane,Completed the dwarf noble quest,x,@ and & on a bridge over lava
|
||||
dwarf_knight_quest,Battle of (5-4) armies,Completed the dwarf knight quest,x,@ facing a bunch of o
|
||||
gnome_ranger_quest,Strongest of all time,Completed the gnome ranger quest,x,Gnome sniping a kobold
|
||||
elf_shared_quest,Driven out,Completed the elf shared quest,dnh_elf_shared_quest.png,
|
||||
clockwork_ascension,Deus ex machina,Ascended a clockwork automaton,x,Gear-@ with a hovering crown
|
||||
chiropteran_ascension,Bat outa hell,Ascended a chiropteran,x,B above lava with a hovering crown
|
||||
yuki_onna_ascension,Snow in heaven,Ascended a yuki-onna,x,n with snowflakes with a hovering crown
|
||||
half_dragon_ascension,Three halves,Ascended a half-dragon,x,D with a hovering crown
|
||||
law_quest,Ripple-resistant tower,Completed the law quest,x,Butterfly
|
||||
neutral_quest,Key to the (corpse) city,Completed the neutral quest,x,
|
||||
chaos_temple_quest,Asinine paradigm,Completed the chaos temple quest,x,Black mage face?
|
||||
mithardir_quest,Chasing after the wind,Completed the mithardir quest,x,
|
||||
mordor_quest,Fossil of the First Age,Completed the mordor quest,x,& under rock?
|
||||
second_thoughts,Second thoughts,Completed a drow shared quest loyally before completing the traitor's quest,x,Drow surrounded by corpses
|
||||
illuminated,Illuminated,Learned every word of creation and accumulated 30 passive sylabel bonuses,dnh_illuminated.png,@ with a bunch of colored dashes
|
||||
exodus,Exodus,Ascended with a pet android commander or operator android,x,
|
||||
fully_upgraded,Super Fighting Robot,Acquried all clockwork upgrades (except high-tension spring),x,
|
||||
hunter_of_nightmares,Hunter of Nightmares,Defeated at least one of each of the secret insight bosses,x,
|
||||
two_keys,Two Keys,Ascended having only touched two alignment keys,x,Me with a headache
|
||||
quite_mad,Quite Mad,Suffered from at least 6 madnesses,x,
|
||||
booze_hound,Booze Hound,Maxed out your drunkard score by drinking at least 90 potions of booze,x,Dog surrounded by booze potions
|
||||
madman_quest,Oh good. I'm not crazy.,Completed the madman quest,x,@ with the stranger right behind
|
||||
lamashtu_kill,Does this count as a paradox?,Destroyed Lamashtu (Demon Queen of the future),x,
|
||||
baalphegor_kill,A universe without motion,Destroyed Baalphegor,x,
|
||||
angel_hell_vault OR ancient_hell_vault OR tanninim_hell_vault,Relics of a bygone era,Opened one type of hellish seal,x,Statue in a vault
|
||||
angel_hell_vault AND ancient_hell_vault AND tanninim_hell_vault,There are a lot of these.,Opened all three types of hellish seal (across all games played),x,Three statues
|
||||
bokrug_ascension,Detestable gods,Completed Bokrug's ascension ritual,x,Bokrug statue over water
|
||||
notdNetHack,,,,
|
||||
get_kroo,Kroo's Bling,Acquire the dismal swamp completion prize.,,
|
||||
get_poplar,Punishing Poplars,Acquire the black forest completion prize.,,
|
||||
|
|
|
|
@ -2052,6 +2052,10 @@ karemade:
|
|||
LBperim = TRUE;
|
||||
} else if(!mtmp) LBperim = FALSE;
|
||||
}
|
||||
//Center of All may show up
|
||||
/*if(!Infuture && !mvitals[PM_CENTER_OF_ALL].died && !rn2(COA_PROB)){
|
||||
coa_arrive();
|
||||
}*/
|
||||
//Random monster generation block
|
||||
if(In_mithardir_terminus(&u.uz) &&
|
||||
mvitals[PM_ASPECT_OF_THE_SILENCE].born == 0 &&
|
||||
|
@ -2061,9 +2065,6 @@ karemade:
|
|||
)){
|
||||
makemon(&mons[PM_ASPECT_OF_THE_SILENCE], 0, 0, NO_MM_FLAGS);
|
||||
}
|
||||
/*else if(!Infuture && !mvitals[PM_CENTER_OF_ALL].died && !Is_nowhere(&u.uz) && !rn2(COA_PROB)){
|
||||
coa_arrive();
|
||||
}*/
|
||||
else if(!(Is_illregrd(&u.uz) && u.ualign.type == A_LAWFUL && !u.uevent.uaxus_foe) && /*Turn off random generation on axus's level if lawful*/
|
||||
!In_void(&u.uz) &&
|
||||
!rn2(u.uevent.udemigod ? 25 :
|
||||
|
@ -2085,15 +2086,6 @@ karemade:
|
|||
if(tries >= 0)
|
||||
makemon(ford_montype(-1), x, y, MM_ADJACENTOK);
|
||||
}
|
||||
} else if(!(mvitals[PM_HOUND_OF_TINDALOS].mvflags&G_GONE && !In_quest(&u.uz)) && (level_difficulty()+u.ulevel)/2+5 > monstr[PM_HOUND_OF_TINDALOS] && !DimensionalLock && check_insight()){
|
||||
int x, y;
|
||||
for(x = 1; x < COLNO; x++)
|
||||
for(y = 0; y < ROWNO; y++){
|
||||
if(IS_CORNER(levl[x][y].typ) && couldsee(x, y) && rn2(45) < u.ulevel){
|
||||
create_gas_cloud(x, y, 4, 30, FALSE);
|
||||
makemon(&mons[PM_HOUND_OF_TINDALOS], x, y, MM_ADJACENTOK);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (u.uevent.invoked && xupstair && rn2(10)) {
|
||||
(void) makemon((struct permonst *)0, xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -2108,6 +2100,32 @@ karemade:
|
|||
}
|
||||
else (void) makemon((struct permonst *)0, 0, 0, NO_MM_FLAGS);
|
||||
}
|
||||
if(!(mvitals[PM_HOUND_OF_TINDALOS].mvflags&G_GONE && !In_quest(&u.uz))
|
||||
&& (level_difficulty()+u.ulevel)/2+5 > monstr[PM_HOUND_OF_TINDALOS]
|
||||
&& !DimensionalLock
|
||||
&& check_insight()
|
||||
){
|
||||
int x, y;
|
||||
int cx, cy;
|
||||
char messaged = FALSE;
|
||||
for(x = 1; x < COLNO; x++)
|
||||
for(y = 0; y < ROWNO; y++){
|
||||
if(IS_CORNER(levl[x][y].typ) && rn2(20) < u.ulevel){
|
||||
//x,y is an angle, but we want to place the *monster* on a floor space NEXT to the corner.
|
||||
for(cx = x-1; cx < x+2; cx+=2)
|
||||
for(cy = y-1; cy < y+2; cy+=2){
|
||||
//If this "corner" is off map, continue
|
||||
if(!isok(cx,cy) || !IS_ROOM(levl[cx][cy].typ) || !couldsee(cx, cy))
|
||||
continue;
|
||||
//Is this not a corner?
|
||||
if(!IS_WALL(levl[x][cy].typ) || !IS_WALL(levl[cx][y].typ))
|
||||
continue;
|
||||
create_fog_cloud(cx, cy, 2, 30, FALSE);
|
||||
makemon(&mons[PM_HOUND_OF_TINDALOS], cx, cy, MM_ADJACENTOK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Infuture && !(Is_qstart(&u.uz) && !Race_if(PM_ANDROID)) && !rn2(35)){
|
||||
struct monst* mtmp = makemon(&mons[PM_SEMBLANCE], rn1(COLNO-3,2), rn1(ROWNO-3,2), MM_ADJACENTOK);
|
||||
|
@ -2168,8 +2186,8 @@ karemade:
|
|||
for(i = rn2(4); i > 0 && u.ulevel > 2; i--){
|
||||
losexp("mind dissolution",FALSE,TRUE,TRUE);
|
||||
}
|
||||
forget((pre_drain - u.ulevel) * 100/(pre_drain)); //drain some proportion of your memory
|
||||
losexp("mind dissolution",TRUE,TRUE,TRUE);
|
||||
forget((pre_drain - u.ulevel) * 100/(pre_drain)); //drain some proportion of your memory
|
||||
}
|
||||
|
||||
if(mad_turn(MAD_HOST)){
|
||||
|
@ -4050,6 +4068,7 @@ printAttacks(buf, ptr)
|
|||
"silver moonlight", /*144*/
|
||||
"holy energy", /*145*/
|
||||
"unholy energy", /*146*/
|
||||
"level-based damage", /*147*/
|
||||
// "[[ahazu abduction]]", /**/
|
||||
"[[stone choir]]", /* */
|
||||
"[[water vampire]]", /* */
|
||||
|
|
75
src/apply.c
75
src/apply.c
|
@ -32,6 +32,7 @@ STATIC_DCL void FDECL(use_candle, (struct obj **));
|
|||
STATIC_DCL void FDECL(use_lamp, (struct obj *));
|
||||
STATIC_DCL int FDECL(swap_aegis, (struct obj *));
|
||||
STATIC_DCL int FDECL(use_rakuyo, (struct obj *));
|
||||
STATIC_DCL int FDECL(use_mercy_blade, (struct obj *));
|
||||
STATIC_DCL int FDECL(use_force_blade, (struct obj *));
|
||||
STATIC_DCL void FDECL(light_cocktail, (struct obj *));
|
||||
STATIC_DCL void FDECL(light_torch, (struct obj *));
|
||||
|
@ -1523,7 +1524,7 @@ struct obj *obj;
|
|||
doname(obj), (const char *)0); /*shouldn't merge, but may drop*/
|
||||
if(dagger && !uswapwep && carried(dagger)){
|
||||
setuswapwep(dagger);
|
||||
dotwoweapon();
|
||||
if(!u.twoweap) dotwoweapon();
|
||||
}
|
||||
} else {
|
||||
if(!uswapwep || uswapwep->otyp != RAKUYO_DAGGER){
|
||||
|
@ -1549,6 +1550,70 @@ struct obj *obj;
|
|||
return 0;
|
||||
}
|
||||
|
||||
STATIC_OVL int
|
||||
use_mercy_blade(obj)
|
||||
struct obj *obj;
|
||||
{
|
||||
struct obj *dagger;
|
||||
if(obj != uwep){
|
||||
if(obj->otyp == BLADE_OF_MERCY) You("must wield %s to unlatch it.", the(xname(obj)));
|
||||
else You("must wield %s to latch it.", the(xname(obj)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(obj->unpaid
|
||||
|| (obj->otyp == BLADE_OF_MERCY && uswapwep && uswapwep->otyp == BLADE_OF_PITY && uswapwep->unpaid)
|
||||
){
|
||||
You("need to buy it.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(obj->otyp == BLADE_OF_MERCY){
|
||||
You("unlatch %s.",the(xname(obj)));
|
||||
obj->otyp = BLADE_OF_GRACE;
|
||||
obj->quan += 1;
|
||||
dagger = splitobj(obj, 1L);
|
||||
|
||||
obj_extract_self(dagger);
|
||||
dagger->otyp = BLADE_OF_PITY;
|
||||
fix_object(obj);
|
||||
fix_object(dagger);
|
||||
|
||||
// if (obj->oartifact && obj->oartifact == ART_BLADE_SINGER_S_SABER){
|
||||
// artifact_exists(dagger, artiname(ART_BLADE_DANCER_S_DAGGER), FALSE);
|
||||
// dagger = oname(dagger, artiname(ART_BLADE_DANCER_S_DAGGER));
|
||||
// }
|
||||
|
||||
dagger = hold_another_object(dagger, "You drop %s!",
|
||||
doname(obj), (const char *)0); /*shouldn't merge, but may drop*/
|
||||
if(dagger && !uswapwep && carried(dagger)){
|
||||
setuswapwep(dagger);
|
||||
if(!u.twoweap) dotwoweapon();
|
||||
}
|
||||
} else {
|
||||
if(!uswapwep || uswapwep->otyp != BLADE_OF_PITY){
|
||||
You("need the matching dagger in your swap-weapon sheath or offhand.");
|
||||
return 0;
|
||||
}
|
||||
if(!mergable_traits(obj, uswapwep) &&
|
||||
!((obj->oartifact && obj->oartifact == ART_BLADE_SINGER_S_SABER) &&
|
||||
(uswapwep->oartifact && uswapwep->oartifact == ART_BLADE_DANCER_S_DAGGER))
|
||||
){
|
||||
pline("They don't fit together!");
|
||||
return 0;
|
||||
}
|
||||
if (u.twoweap) {
|
||||
u.twoweap = 0;
|
||||
update_inventory();
|
||||
}
|
||||
useupall(uswapwep);
|
||||
obj->otyp = BLADE_OF_MERCY;
|
||||
fix_object(obj);
|
||||
You("latch %s.",the(xname(obj)));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
STATIC_OVL int
|
||||
use_force_blade(obj)
|
||||
struct obj *obj;
|
||||
|
@ -1579,7 +1644,7 @@ struct obj *obj;
|
|||
doname(obj), (const char *)0); /*shouldn't merge, but may drop*/
|
||||
if(dagger && !uswapwep && carried(dagger)){
|
||||
setuswapwep(dagger);
|
||||
dotwoweapon();
|
||||
if(!u.twoweap) dotwoweapon();
|
||||
}
|
||||
} else {
|
||||
if(!uswapwep || uswapwep->otyp != FORCE_BLADE){
|
||||
|
@ -7234,6 +7299,9 @@ doapply()
|
|||
else if(is_tipped_spear(obj)) res = swap_point(obj);
|
||||
else if(obj->otyp == RAKUYO || obj->otyp == RAKUYO_SABER){
|
||||
return use_rakuyo(obj);
|
||||
}
|
||||
else if(obj->otyp == BLADE_OF_MERCY || obj->otyp == BLADE_OF_GRACE){
|
||||
return use_mercy_blade(obj);
|
||||
} else if(obj->otyp == DOUBLE_FORCE_BLADE || obj->otyp == FORCE_BLADE){
|
||||
return use_force_blade(obj);
|
||||
} else switch(obj->otyp){
|
||||
|
@ -7580,6 +7648,9 @@ doapply()
|
|||
case SHADOWLANDER_S_TORCH:
|
||||
light_torch(obj);
|
||||
break;
|
||||
case MAGIC_TORCH:
|
||||
light_torch(obj);
|
||||
break;
|
||||
case SUNROD:
|
||||
light_torch(obj);
|
||||
break;
|
||||
|
|
176
src/artifact.c
176
src/artifact.c
|
@ -4181,6 +4181,110 @@ int * truedmgptr;
|
|||
return ((*truedmgptr != original_truedmgptr) || (*plusdmgptr != original_plusdmgptr));
|
||||
}
|
||||
|
||||
void
|
||||
mercy_blade_conflict(mdef, magr, spe, lethal)
|
||||
struct monst *mdef;
|
||||
struct monst *magr;
|
||||
int spe;
|
||||
boolean lethal;
|
||||
{
|
||||
int x, y, cx, cy, count = 0;
|
||||
struct monst *target;
|
||||
struct monst *targets[8];
|
||||
extern const int clockwisex[8];
|
||||
extern const int clockwisey[8];
|
||||
boolean youdef = (mdef == &youmonst);
|
||||
boolean youagr = (magr == &youmonst);
|
||||
boolean youtar;
|
||||
static boolean in_conflict = FALSE;
|
||||
|
||||
if(in_conflict)
|
||||
return;
|
||||
|
||||
in_conflict = TRUE;
|
||||
|
||||
x = x(mdef);
|
||||
y = y(mdef);
|
||||
for(int i = 0; i < 8; i++){
|
||||
cx = x + clockwisex[i];
|
||||
cy = y + clockwisey[i];
|
||||
if(!isok(cx, cy))
|
||||
continue;
|
||||
target = m_u_at(cx, cy);
|
||||
if(!target)
|
||||
continue;
|
||||
|
||||
if(target == mdef || target == magr)
|
||||
continue;
|
||||
|
||||
youtar = (target == &youmonst);
|
||||
|
||||
if(youtar){
|
||||
if(youagr)
|
||||
continue;
|
||||
else if(magr->mpeaceful)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(DEADMONSTER(target))
|
||||
continue;
|
||||
|
||||
|
||||
if( (youagr && target->mpeaceful)
|
||||
|| (youdef && !target->mpeaceful)
|
||||
|| (youtar && magr->mpeaceful)
|
||||
|| (!youagr && !youdef && !youtar && (magr->mpeaceful == target->mpeaceful))
|
||||
)
|
||||
continue;
|
||||
|
||||
if(!youtar && imprisoned(target))
|
||||
continue;
|
||||
|
||||
targets[count++] = target;
|
||||
}
|
||||
if(count){
|
||||
target = targets[rn2(count)];
|
||||
if(youdef){
|
||||
int temp_encouraged = u.uencouraged;
|
||||
if(lethal)
|
||||
pline("The blade lodges in you %s!", body_part(SPINE));
|
||||
u.uencouraged = (youagr ? (u.uinsight + ACURR(A_CHA))/5 : magr->m_lev/5) + spe;
|
||||
flags.forcefight = TRUE;
|
||||
xattacky(mdef, target, x(target), y(target));
|
||||
flags.forcefight = FALSE;
|
||||
u.uencouraged = temp_encouraged;
|
||||
}
|
||||
else {
|
||||
int temp_encouraged = mdef->encouraged;
|
||||
boolean friendly_fire;
|
||||
long result;
|
||||
mdef->encouraged = (youagr ? (u.uinsight + ACURR(A_CHA))/5 : magr->m_lev/5) + spe;
|
||||
if(lethal)
|
||||
pline("The blade lodges in %s %s!", s_suffix(mon_nam(mdef)), mbodypart(mdef, SPINE));
|
||||
friendly_fire = !mm_grudge(mdef, target);
|
||||
result = xattacky(mdef, target, x(target), y(target));
|
||||
if(friendly_fire && (result&(MM_DEF_DIED|MM_DEF_LSVD)) && !taxes_sanity(mdef->data) && !mindless_mon(mdef) && !resist(mdef, POTION_CLASS, 0, NOTELL)){
|
||||
if (canseemon(mdef) && !lethal)
|
||||
pline("%s goes insane!", Monnam(mdef));
|
||||
mdef->mcrazed = 1;
|
||||
mdef->mberserk = 1;
|
||||
(void) set_apparxy(mdef);
|
||||
if(!rn2(4)){
|
||||
mdef->mconf = 1;
|
||||
(void) set_apparxy(mdef);
|
||||
}
|
||||
if(!rn2(10)){
|
||||
mdef->mnotlaugh=0;
|
||||
mdef->mlaughing=rnd(5);
|
||||
}
|
||||
}
|
||||
mdef->encouraged = temp_encouraged;
|
||||
}
|
||||
}
|
||||
|
||||
in_conflict = FALSE;
|
||||
}
|
||||
|
||||
/* prints no hitmessages (only "blinded by the flash"?) */
|
||||
void
|
||||
otyp_hit(magr, mdef, otmp, basedmg, plusdmgptr, truedmgptr, dieroll)
|
||||
|
@ -4208,6 +4312,14 @@ int dieroll; /* needed for Magicbane and vorpal blades */
|
|||
if (!rn2(3)) destroy_item(mdef, POTION_CLASS, AD_FIRE);
|
||||
}
|
||||
}
|
||||
if (otmp->otyp == MAGIC_TORCH && otmp->lamplit){
|
||||
if (!Fire_res(mdef)) {
|
||||
if (species_resists_cold(mdef))
|
||||
(*truedmgptr) += 3 * (rnd(4) + 2*otmp->spe) / 2;
|
||||
else
|
||||
(*truedmgptr) += rnd(4) + 2*otmp->spe;
|
||||
}
|
||||
}
|
||||
if (otmp->otyp == SHADOWLANDER_S_TORCH && otmp->lamplit){
|
||||
if (!Cold_res(mdef)) {
|
||||
if (species_resists_fire(mdef))
|
||||
|
@ -4340,6 +4452,27 @@ int dieroll; /* needed for Magicbane and vorpal blades */
|
|||
bonus /= 2;
|
||||
*truedmgptr += bonus;
|
||||
}
|
||||
if(is_mercy_blade(otmp)){
|
||||
if(!u.veil && !Magic_res(mdef)){
|
||||
int mod = min(u.uinsight, 50);
|
||||
if(youagr && u.uinsight > 25)
|
||||
mod += min((u.uinsight-25)/2, ACURR(A_CHA));
|
||||
*truedmgptr += basedmg*mod/50;
|
||||
}
|
||||
if(u.uinsight >= 25 && !resist(mdef, youagr ? SPBOOK_CLASS : WEAPON_CLASS, 0, NOTELL)){
|
||||
if(youdef){
|
||||
if(u.uencouraged >= 0 && magr->mcha/5 > 0)
|
||||
You("feel a rush of irrational mercy!");
|
||||
u.uencouraged = max(-1*(otmp->spe + magr->mcha), u.uencouraged - magr->mcha/5);
|
||||
}
|
||||
else if(youagr){
|
||||
mdef->encouraged = max(-1*(otmp->spe + ACURR(A_CHA)), mdef->encouraged - ACURR(A_CHA)/5);
|
||||
}
|
||||
else {
|
||||
mdef->encouraged = max(-1*(otmp->spe + magr->mcha), mdef->encouraged - magr->mcha/5);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pure_weapon(otmp) && otmp->spe >= 6){
|
||||
if(youagr){
|
||||
|
@ -9546,6 +9679,7 @@ arti_invoke(obj)
|
|||
struct obj *statue = mksartifact(ART_IDOL_OF_BOKRUG__THE_WATER_);
|
||||
statue->oerodeproof = TRUE;
|
||||
statue->spe = 1;
|
||||
give_bokrug_trophy();
|
||||
place_object(statue, 37+rn2(7), 18+rn2(2));
|
||||
You_hear("water bubbling.");
|
||||
int i, j;
|
||||
|
@ -11728,9 +11862,9 @@ dosymbiotic_equip()
|
|||
}
|
||||
if(uarm && (uarm->otyp == LIVING_ARMOR || uarm->otyp == BARNACLE_ARMOR))
|
||||
dosymbiotic(&youmonst, uarm);
|
||||
if(uwep && ((check_oprop(uwep, OPROP_LIVEW) && u.uinsight >= 40) || is_living_artifact(uwep) ))
|
||||
if(uwep && ((check_oprop(uwep, OPROP_LIVEW) && u.uinsight >= 40) || is_living_artifact(uwep) || is_bloodthirsty_artifact(uwep) ))
|
||||
doliving(&youmonst, uwep);
|
||||
if(uswapwep && ((check_oprop(uswapwep, OPROP_LIVEW) && u.twoweap && u.uinsight >= 40) || is_living_artifact(uswapwep) ))
|
||||
if(uswapwep && ((check_oprop(uswapwep, OPROP_LIVEW) && u.twoweap && u.uinsight >= 40) || is_living_artifact(uswapwep) || (is_bloodthirsty_artifact(uswapwep) && u.twoweap) ))
|
||||
doliving(&youmonst, uswapwep);
|
||||
if(uarms && ((check_oprop(uarms, OPROP_LIVEW) && u.uinsight >= 40) || is_living_artifact(uarms) ))
|
||||
doliving(&youmonst, uarms);
|
||||
|
@ -11919,25 +12053,29 @@ living_items()
|
|||
|
||||
/* Animate objects in the dungeon -- this only happens to items in one chain (floor) and it changes the state of the dungeon,
|
||||
* so it's convenient not to handle this in the all_items() loop */
|
||||
|
||||
for (obj = fobj; obj; obj = nobj) {
|
||||
nobj = obj->nobj;
|
||||
if(obj->otyp == STATUE && !get_ox(obj, OX_EMON) && !(obj->spe) && !rn2(70) && check_insight()){
|
||||
// if(obj->otyp == STATUE && !get_ox(obj, OX_EMON) && !(obj->spe)){
|
||||
mtmp = animate_statue(obj, obj->ox, obj->oy, ANIMATE_NORMAL, (int *) 0);
|
||||
if(mtmp){
|
||||
set_template(mtmp, TOMB_HERD);
|
||||
mtmp->m_lev += 4;
|
||||
mtmp->mhpmax += d(4, 8);
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
// mtmp->m_ap_type = M_AP_OBJECT;
|
||||
// mtmp->mappearance = STATUE;
|
||||
// mtmp->m_ap_type = M_AP_MONSTER;
|
||||
// mtmp->mappearance = PM_STONE_GOLEM;
|
||||
newsym(mtmp->mx, mtmp->my);
|
||||
extern const int monstr[];
|
||||
if((level_difficulty()+u.ulevel)/2 > monstr[PM_STONE_GOLEM] && check_insight()){
|
||||
for (obj = fobj; obj; obj = nobj) {
|
||||
nobj = obj->nobj;
|
||||
if(obj->otyp == STATUE && !get_ox(obj, OX_EMON) && !(obj->spe)){
|
||||
mtmp = animate_statue(obj, obj->ox, obj->oy, ANIMATE_NORMAL, (int *) 0);
|
||||
if(mtmp){
|
||||
set_template(mtmp, TOMB_HERD);
|
||||
mtmp->m_lev += 4;
|
||||
mtmp->mhpmax += d(4, 8);
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
// mtmp->m_ap_type = M_AP_OBJECT;
|
||||
// mtmp->mappearance = STATUE;
|
||||
// mtmp->m_ap_type = M_AP_MONSTER;
|
||||
// mtmp->mappearance = PM_STONE_GOLEM;
|
||||
newsym(mtmp->mx, mtmp->my);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if((obj->otyp == BROKEN_ANDROID || obj->otyp == BROKEN_GYNOID || obj->otyp == LIFELESS_DOLL) && obj->ovar1){
|
||||
}
|
||||
for (obj = fobj; obj; obj = nobj) {
|
||||
nobj = obj->nobj;
|
||||
if((obj->otyp == BROKEN_ANDROID || obj->otyp == BROKEN_GYNOID || obj->otyp == LIFELESS_DOLL) && obj->ovar1){
|
||||
xchar ox, oy;
|
||||
get_obj_location(obj, &ox, &oy, 0);
|
||||
if(obj->ovar1 <= u.uinsight && !rn2(20)){
|
||||
|
|
110
src/attrib.c
110
src/attrib.c
|
@ -1460,10 +1460,11 @@ check_insight()
|
|||
}
|
||||
|
||||
int
|
||||
roll_generic_madness()
|
||||
roll_generic_madness(clearable)
|
||||
boolean clearable;
|
||||
{
|
||||
int sanlevel;
|
||||
if(ClearThoughts)
|
||||
if(clearable && ClearThoughts)
|
||||
return 0;
|
||||
|
||||
sanlevel = (int)(((float)rand()/(float)(RAND_MAX)) * ((float)rand()/(float)(RAND_MAX)) * 100);
|
||||
|
@ -1474,10 +1475,11 @@ roll_generic_madness()
|
|||
}
|
||||
|
||||
int
|
||||
roll_generic_flat_madness()
|
||||
roll_generic_flat_madness(clearable)
|
||||
int clearable;
|
||||
{
|
||||
int sanlevel;
|
||||
if(ClearThoughts)
|
||||
if(clearable && ClearThoughts)
|
||||
return 0;
|
||||
|
||||
if(u.usanity < rnd(100))
|
||||
|
@ -1688,6 +1690,106 @@ struct monst *mon;
|
|||
check_madman_trophy();
|
||||
}
|
||||
|
||||
/* A monster has seen/whatever you and may contract madnesses
|
||||
*/
|
||||
void
|
||||
you_inflict_madness(mon)
|
||||
struct monst *mon;
|
||||
{
|
||||
if(mon->seenmadnesses != u.umadness){
|
||||
unsigned long long int madflag;
|
||||
for(madflag = 0x1L; madflag <= LAST_MADNESS; madflag = madflag << 1){
|
||||
if(u.umadness&madflag && !(mon->seenmadnesses&madflag)){
|
||||
mon->seenmadnesses |= madflag;
|
||||
if(d(2,30) > mon->m_lev){
|
||||
if(madflag == MAD_DELUSIONS
|
||||
|| madflag == MAD_REAL_DELUSIONS
|
||||
|| madflag == MAD_SPORES
|
||||
|| madflag == MAD_SPIRAL
|
||||
|| madflag == MAD_GOAT_RIDDEN
|
||||
|| madflag == MAD_FORMICATION
|
||||
){
|
||||
mon->mcrazed = 1;
|
||||
}
|
||||
else if(madflag == MAD_SANCTITY){
|
||||
mon->msanctity = 1;
|
||||
}
|
||||
else if(madflag == MAD_GLUTTONY){
|
||||
mon->mgluttony = 1;
|
||||
}
|
||||
else if(madflag == MAD_FRIGOPHOBIA){
|
||||
mon->mfrigophobia = 1;
|
||||
}
|
||||
else if(madflag == MAD_CANNIBALISM){
|
||||
mon->mcannibal = 1;
|
||||
}
|
||||
else if(madflag == MAD_RAGE){
|
||||
mon->mrage = 1;
|
||||
mon->mberserk = 1;
|
||||
mon->mcrazed = 1;
|
||||
}
|
||||
else if(madflag == MAD_ARGENT_SHEEN){
|
||||
mon->margent = 1;
|
||||
}
|
||||
else if(madflag == MAD_SUICIDAL){
|
||||
mon->msuicide = 1;
|
||||
}
|
||||
else if(madflag == MAD_NUDIST){
|
||||
mon->mnudist = 1;
|
||||
}
|
||||
else if(madflag == MAD_OPHIDIOPHOBIA){
|
||||
mon->mophidio = 1;
|
||||
}
|
||||
else if(madflag == MAD_ARACHNOPHOBIA){
|
||||
mon->marachno = 1;
|
||||
}
|
||||
else if(madflag == MAD_ENTOMOPHOBIA){
|
||||
mon->mentomo = 1;
|
||||
}
|
||||
else if(madflag == MAD_THALASSOPHOBIA){
|
||||
mon->mthalasso = 1;
|
||||
}
|
||||
else if(madflag == MAD_HELMINTHOPHOBIA){
|
||||
mon->mhelmintho = 1;
|
||||
}
|
||||
else if(madflag == MAD_PARANOIA){
|
||||
mon->mparanoid = 1;
|
||||
}
|
||||
else if(madflag == MAD_TALONS){
|
||||
mon->mtalons = 1;
|
||||
}
|
||||
else if(madflag == MAD_DREAMS){
|
||||
mon->mtalons = 1;
|
||||
}
|
||||
else if(madflag == MAD_SCIAPHILIA){
|
||||
mon->mscaiaphilia = 1;
|
||||
}
|
||||
else if(madflag == MAD_FORGETFUL){
|
||||
mon->mforgetful = 1;
|
||||
}
|
||||
else if(madflag == MAD_APOSTASY){
|
||||
mon->mapostasy = 1;
|
||||
}
|
||||
else if(madflag == MAD_TOO_BIG){
|
||||
mon->mtoobig = 1;
|
||||
}
|
||||
else if(madflag == MAD_ROTTING){
|
||||
mon->mrotting = 1;
|
||||
}
|
||||
else if(madflag == MAD_FRENZY){
|
||||
mon->mhp = 1;
|
||||
}
|
||||
// MAD_HOST:
|
||||
// MAD_COLD_NIGHT:
|
||||
// MAD_OVERLORD:
|
||||
// MAD_THOUSAND_MASKS:
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* condense clumsy ACURR(A_STR) value into value that fits into game formulas
|
||||
*/
|
||||
schar
|
||||
|
|
4
src/do.c
4
src/do.c
|
@ -51,7 +51,7 @@ dodrop()
|
|||
|
||||
if(result && roll_madness(MAD_TALONS)){
|
||||
You("panic after giving up a belonging!");
|
||||
nomul(-1*rnd(6),"panic");
|
||||
HPanicking += 1+rnd(6);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -752,7 +752,7 @@ doddrop()
|
|||
|
||||
if(result && roll_madness(MAD_TALONS)){
|
||||
You("panic after giving up your property!");
|
||||
nomul(-1*rnd(6),"panic");
|
||||
HPanicking += 1+rnd(6);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -1137,7 +1137,7 @@ boolean called;
|
|||
struct obj *otmp;
|
||||
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) {
|
||||
if ((otmp->otyp == DROVEN_PLATE_MAIL || otmp->otyp == DROVEN_CHAIN_MAIL || otmp->otyp == CONSORT_S_SUIT)
|
||||
&& otmp->owornmask & mtmp->misc_worn_check){
|
||||
&& otmp->owornmask & mtmp->misc_worn_check && otmp->oward){
|
||||
Sprintf(eos(buf), "%s ", getDrowHouse(otmp->oward));
|
||||
name_at_start = FALSE;
|
||||
}
|
||||
|
@ -1200,7 +1200,7 @@ boolean called;
|
|||
struct obj *otmp;
|
||||
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) {
|
||||
if ((otmp->otyp == DROVEN_PLATE_MAIL || otmp->otyp == DROVEN_CHAIN_MAIL || otmp->otyp == CONSORT_S_SUIT)
|
||||
&& otmp->owornmask & mtmp->misc_worn_check){
|
||||
&& otmp->owornmask & mtmp->misc_worn_check && otmp->oward){
|
||||
Sprintf(eos(buf), "%s ", getDrowHouse(otmp->oward));
|
||||
name_at_start = FALSE;
|
||||
}
|
||||
|
@ -1263,7 +1263,7 @@ boolean called;
|
|||
struct obj *otmp;
|
||||
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) {
|
||||
if ((otmp->otyp == DROVEN_PLATE_MAIL || otmp->otyp == DROVEN_CHAIN_MAIL || otmp->otyp == CONSORT_S_SUIT)
|
||||
&& otmp->owornmask & mtmp->misc_worn_check){
|
||||
&& otmp->owornmask & mtmp->misc_worn_check && otmp->oward){
|
||||
Sprintf(eos(buf), "%s ", getDrowHouse(otmp->oward));
|
||||
name_at_start = FALSE;
|
||||
}
|
||||
|
|
|
@ -924,7 +924,11 @@ void
|
|||
Amulet_off()
|
||||
{
|
||||
takeoff_mask &= ~W_AMUL;
|
||||
|
||||
|
||||
if(!uamul){
|
||||
impossible("Amulet_off() was called, but no amulet is worn.");
|
||||
return;
|
||||
}
|
||||
switch(uamul->otyp) {
|
||||
case AMULET_OF_ESP:
|
||||
/* need to update ability before calling see_monsters() */
|
||||
|
@ -5084,9 +5088,9 @@ struct obj *wep;
|
|||
continue;
|
||||
|
||||
if(arti_is_prop(wep, ARTI_BLOODTHRST)){
|
||||
if( (youagr && (mdef->mpeaceful && !roll_generic_madness()))
|
||||
|| (youdef && (magr->mpeaceful && !roll_generic_madness()))
|
||||
|| (!youagr && !youdef && (magr->mpeaceful != mdef->mpeaceful))
|
||||
if( (youagr && (mdef->mpeaceful && !roll_generic_madness(TRUE)))
|
||||
|| (youdef && (magr->mpeaceful && !roll_generic_madness(TRUE)))
|
||||
|| (!youagr && !youdef && (magr->mpeaceful == mdef->mpeaceful))
|
||||
)
|
||||
continue;
|
||||
if(!rn2(4))
|
||||
|
|
|
@ -127,6 +127,7 @@ boolean check_if_better;
|
|||
(otmp->oartifact
|
||||
|| !check_oprop(otmp, OPROP_NONE)
|
||||
|| (rakuyo_prop(otmp) && u.uinsight >= 20)
|
||||
|| (is_mercy_blade(otmp) && !u.veil)
|
||||
|| (otmp->otyp == ISAMUSEI && u.uinsight >= 22)
|
||||
|| (otmp->otyp == DISKOS && u.uinsight >= 10)
|
||||
) ||
|
||||
|
|
|
@ -2811,7 +2811,7 @@ boolean printdun;
|
|||
} else if(Is_zuggtmoy_level(&mptr->lev)){
|
||||
Sprintf(eos(buf), " [Shedaklah]");
|
||||
} else if(Is_yeenoghu_level(&mptr->lev)){
|
||||
Sprintf(eos(buf), " [Dun Savana]");
|
||||
Sprintf(eos(buf), " [Dun Savannah]");
|
||||
} else if(Is_baphomet_level(&mptr->lev)){
|
||||
Sprintf(eos(buf), " [Lyktion]");
|
||||
} else if(Is_night_level(&mptr->lev)){
|
||||
|
|
|
@ -279,7 +279,7 @@ satiate_uhunger()
|
|||
u.uen = min(u.uen+400, u.uenmax*.55);
|
||||
newuhs(TRUE);
|
||||
} else {
|
||||
if(u.uhunger > min(u.uhunger+400, u.uhungermax*.55))
|
||||
if(u.uhunger > u.uhungermax*.55)
|
||||
return FALSE;
|
||||
u.uhunger = u.uhungermax*.55;
|
||||
u.uhs = NOT_HUNGRY;
|
||||
|
@ -2052,7 +2052,7 @@ struct obj *otmp;
|
|||
* alternative form's food!
|
||||
*/
|
||||
pline("That tripe ration was surprisingly good!");
|
||||
else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC)))
|
||||
else if (maybe_polyd(is_orc(youmonst.data), Race_if(PM_ORC)) || Race_if(PM_HALF_DRAGON))
|
||||
pline(Hallucination ? "Tastes great! Less filling!" :
|
||||
"Mmm, tripe... not bad!");
|
||||
else {
|
||||
|
|
|
@ -424,7 +424,11 @@ static const char *haluMesg[] = {
|
|||
"Oh, can't you see the light is fading?",
|
||||
"And in the night the demons rage and call your name",
|
||||
"No deeper madness than your own making",
|
||||
"Visions lashing blades of shame, but will you take the blame?", /* Control */
|
||||
"Visions lashing blades of shame, but will you take the blame?",
|
||||
|
||||
"You are a worm through time.",
|
||||
"You've always been the new you.",
|
||||
"The hole in your room is a hole in you.", /* Control */
|
||||
|
||||
"What's the Bureau's vacation policy?",
|
||||
"I'm interested to hear about your expenditure plan.", /* Awkward Zombie */
|
||||
|
|
|
@ -396,10 +396,12 @@ boolean dumping;
|
|||
else if (u.ualign.record >= -3) you_have("strayed");
|
||||
else if (u.ualign.record >= -8) you_have("sinned");
|
||||
else you_have("transgressed");
|
||||
#ifdef WIZARD
|
||||
if (wizard) {
|
||||
if (wizard || final) {
|
||||
Sprintf(buf, "%ld gold ", u.spawnedGold);
|
||||
enl_msg(buf, "has been", "was", " created");
|
||||
}
|
||||
#ifdef WIZARD
|
||||
if (wizard) {
|
||||
Sprintf(buf, " %d", u.ualign.record);
|
||||
enl_msg("Your alignment ", "is", "was", buf);
|
||||
Sprintf(buf, " %d sins", u.ualign.sins);
|
||||
|
@ -2788,9 +2790,9 @@ boolean dumping;
|
|||
CHECK_ACHIEVE(ELF_SHR_QUEST,"Driven out: completed elf shared quest")
|
||||
CHECK_ACHIEVE(LAW_QUEST,"Ripple-resistant tower: completed law quest")
|
||||
CHECK_ACHIEVE(NEU_QUEST,"Key to the (corpse) city: completed neutral quest")
|
||||
CHECK_ACHIEVE(CHA_QUEST,"Asinine paradigm: completed chaos temple quest")
|
||||
CHECK_ACHIEVE(MITH_QUEST,"Chasing after the wind: completed mithardir quest")
|
||||
CHECK_ACHIEVE(MORD_QUEST,"Fossil of the First Age: completed mordor quest")
|
||||
CHECK_ACHIEVE(CHA_QUEST,"Asinine paradigm: completed Chaos Temple quest")
|
||||
CHECK_ACHIEVE(MITH_QUEST,"Chasing after the wind: completed Mithardir quest")
|
||||
CHECK_ACHIEVE(MORD_QUEST,"Fossil of the First Age: completed Mordor quest")
|
||||
CHECK_ACHIEVE(SECOND_THOUGHTS,"Had second thoughts after a drow quest")
|
||||
CHECK_ACHIEVE(LAMASHTU_KILL,"Does this count as a paradox?: killed Lamashtu")
|
||||
CHECK_ACHIEVE(BAALPHEGOR_KILL,"A universe without motion: killed Baalphegor")
|
||||
|
@ -2805,6 +2807,7 @@ boolean dumping;
|
|||
CHECK_ACHIEVE(NIGHTMAREHUNTER,"Hunter of Nightmares")
|
||||
CHECK_ACHIEVE(QUITE_MAD,"Quite Mad: Suffered six madnesses")
|
||||
CHECK_ACHIEVE(TOTAL_DRUNK,"Booze Hound")
|
||||
CHECK_ACHIEVE(BOKRUG_QUEST,"Detestable gods: Completed Bokrug's ascension ritual")
|
||||
|
||||
#undef CHECK_ACHIEVE
|
||||
}
|
||||
|
|
41
src/invent.c
41
src/invent.c
|
@ -1278,6 +1278,7 @@ register const char *let,*word;
|
|||
!is_knife(otmp) && otmp->oartifact != ART_SILVER_STARLIGHT &&
|
||||
!(otmp->oartifact == ART_HOLY_MOONLIGHT_SWORD && !u.veil) &&
|
||||
otmp->otyp != RAKUYO && otmp->otyp != RAKUYO_SABER &&
|
||||
otmp->otyp != BLADE_OF_MERCY && otmp->otyp != BLADE_OF_GRACE &&
|
||||
otmp->otyp != DOUBLE_FORCE_BLADE && otmp->otyp != FORCE_BLADE &&
|
||||
otmp->otyp != MASS_SHADOW_PISTOL
|
||||
) ||
|
||||
|
@ -2287,13 +2288,16 @@ struct obj *obj;
|
|||
else if (obj->otyp == RAKUYO || obj->otyp == RAKUYO_SABER)
|
||||
add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
|
||||
"Latch or unlatch your rakuyo", MENU_UNSELECTED);
|
||||
else if (obj->otyp == BLADE_OF_MERCY || obj->otyp == BLADE_OF_MERCY)
|
||||
add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
|
||||
"Latch or unlatch your blade of mercy", MENU_UNSELECTED);
|
||||
else if (obj->otyp == DOUBLE_FORCE_BLADE || obj->otyp == FORCE_BLADE)
|
||||
add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
|
||||
"Latch or unlatch your force blade", MENU_UNSELECTED);
|
||||
else if (obj->otyp == FORCE_SWORD)
|
||||
add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
|
||||
"Unlock your force whip", MENU_UNSELECTED);
|
||||
else if (obj->otyp == TORCH || obj->otyp == SHADOWLANDER_S_TORCH)
|
||||
else if (obj->otyp == TORCH || obj->otyp == SHADOWLANDER_S_TORCH || obj->otyp == MAGIC_TORCH)
|
||||
add_menu(win, NO_GLYPH, &any, 'a', 0, ATR_NONE,
|
||||
"Light or snuff this torch", MENU_UNSELECTED);
|
||||
else if (obj->otyp == SUNROD && !obj->lamplit)
|
||||
|
@ -2387,9 +2391,20 @@ struct obj *obj;
|
|||
else if (obj->oclass == SCROLL_CLASS)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Cast the spell on this scroll", MENU_UNSELECTED);
|
||||
else if (obj->oclass == TILE_CLASS)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Speak the glyph on this tile", MENU_UNSELECTED);
|
||||
else if (obj->oclass == TILE_CLASS){
|
||||
if(obj->otyp >= SYLLABLE_OF_STRENGTH__AESH && obj->otyp <= SYLLABLE_OF_SPIRIT__VAUL)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Speak the glyph on this tile", MENU_UNSELECTED);
|
||||
else if(obj->otyp >= ANTI_CLOCKWISE_METAMORPHOSIS_G && obj->otyp <= ORRERY_GLYPH)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Study the glyph on this shard", MENU_UNSELECTED);
|
||||
else if(obj->otyp >= APHANACTONAN_RECORD && obj->otyp <= APHANACTONAN_ARCHIVE)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Study the glyphs on this disk", MENU_UNSELECTED);
|
||||
else if(obj->otyp >= FIRST_WORD && obj->otyp <= WORD_OF_KNOWLEDGE)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Study the glyph on this slab", MENU_UNSELECTED);
|
||||
}
|
||||
else if (obj->oclass == SPBOOK_CLASS)
|
||||
add_menu(win, NO_GLYPH, &any, 'r', 0, ATR_NONE,
|
||||
"Study this spellbook", MENU_UNSELECTED);
|
||||
|
@ -3100,11 +3115,15 @@ winid *datawin;
|
|||
/* other weapon special effects */
|
||||
if(obj){
|
||||
if(obj->otyp == TORCH){
|
||||
Sprintf(buf2, "Deals 1d6 bonus fire damage when lit.");
|
||||
Sprintf(buf2, "Deals 1d6 + enchantment bonus fire damage when lit.");
|
||||
OBJPUTSTR(buf2);
|
||||
}
|
||||
if(obj->otyp == MAGIC_TORCH){
|
||||
Sprintf(buf2, "Deals 1d4 + double enchantment bonus fire damage when lit.");
|
||||
OBJPUTSTR(buf2);
|
||||
}
|
||||
if(obj->otyp == SHADOWLANDER_S_TORCH){
|
||||
Sprintf(buf2, "Deals 1d6 bonus cold damage when lit.");
|
||||
Sprintf(buf2, "Deals 1d6 + enchantment bonus cold damage when lit.");
|
||||
OBJPUTSTR(buf2);
|
||||
}
|
||||
if(obj->otyp == SUNROD){
|
||||
|
@ -3426,6 +3445,15 @@ winid *datawin;
|
|||
OBJPUTSTR("Adds a new ability to the #monster powers menu.");
|
||||
OBJPUTSTR("Permanently grants plus three to pet cap.");
|
||||
break;
|
||||
case APHANACTONAN_RECORD:
|
||||
OBJPUTSTR("Read to identify some random item types.");
|
||||
break;
|
||||
case APHANACTONAN_ARCHIVE:
|
||||
OBJPUTSTR("Read to identify some random item types and other knowledge.");
|
||||
break;
|
||||
default:
|
||||
OBJPUTSTR("Read to acquire the thought symbolized by this glyph.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (olet == SPBOOK_CLASS) {
|
||||
|
@ -3563,6 +3591,7 @@ winid *datawin;
|
|||
case CANDLE_OF_INVOCATION:
|
||||
case TORCH: //actually over-ridden by being a weapon-tool
|
||||
case SUNROD: //actually over-ridden by being a weapon-tool
|
||||
case MAGIC_TORCH: //actually over-ridden by being a weapon-tool
|
||||
case LANTERN:
|
||||
case OIL_LAMP:
|
||||
case MAGIC_LAMP:
|
||||
|
|
|
@ -807,7 +807,7 @@ doforce() /* try to force a chest with your weapon */
|
|||
else
|
||||
xlock.chance = uwep->spe + objects[uwep->otyp].oc_wldam.oc_damd;
|
||||
xlock.picktyp = picktyp;
|
||||
xlock.usedtime = 0;
|
||||
xlock.usedtime = 0;
|
||||
xlock.door = door;
|
||||
xlock.box = 0;
|
||||
set_occupation(forcedoor, "forcing the door", 0);
|
||||
|
|
185
src/makemon.c
185
src/makemon.c
|
@ -4289,7 +4289,8 @@ boolean goodequip;
|
|||
PM_BLACK_DRAGON, PM_COCKATRICE, PM_STORM_GIANT,
|
||||
PM_MINOTAUR, PM_UMBER_HULK, PM_MASTER_MIND_FLAYER,
|
||||
PM_IRON_GOLEM, PM_GREEN_SLIME, PM_GIANT_TURTLE,
|
||||
PM_GREMLIN, PM_VAMPIRE_LORD, PM_ARCH_LICH,
|
||||
PM_GREMLIN, PM_VAMPIRE_LORD, PM_VAMPIRE_LADY,
|
||||
PM_ARCH_LICH,
|
||||
PM_DISENCHANTER, PM_MANTICORE, PM_SCRAP_TITAN,
|
||||
PM_GUG, PM_BEBELITH, PM_DAUGHTER_OF_BEDLAM,
|
||||
PM_ANCIENT_NAGA,PM_GUARDIAN_NAGA, PM_SERPENT_NECKED_LIONESS,
|
||||
|
@ -5903,8 +5904,10 @@ boolean goodequip;
|
|||
if(ptr->mtyp == PM_THRIAE)
|
||||
(void)mongets(mtmp, (rn2(2) ? FLUTE : HARP), mkobjflags);
|
||||
} else if(ptr->mtyp == PM_INTONER){
|
||||
int intoner_color = HI_GLASS;
|
||||
switch(rn2(6)){
|
||||
case 0:
|
||||
intoner_color = CLR_GRAY;
|
||||
otmp = mksobj(LONG_SWORD, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
set_material_gm(otmp, DRAGON_HIDE);
|
||||
|
@ -5919,10 +5922,12 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(LONG_GLOVES, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
case 1:
|
||||
intoner_color = CLR_WHITE;
|
||||
otmp = mksobj(CHAKRAM, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->objsize = MZ_HUGE;
|
||||
otmp->spe = 4;
|
||||
|
@ -5938,10 +5943,12 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(LONG_GLOVES, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
case 2:
|
||||
intoner_color = CLR_BLUE;
|
||||
otmp = mksobj(LONG_SWORD, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
set_material_gm(otmp, METAL);
|
||||
|
@ -5956,10 +5963,12 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(LONG_GLOVES, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
case 3:
|
||||
intoner_color = CLR_MAGENTA;
|
||||
otmp = mksobj(SCIMITAR, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
set_material_gm(otmp, METAL);
|
||||
|
@ -5980,10 +5989,12 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(LONG_GLOVES, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
case 4:
|
||||
intoner_color = CLR_GREEN;
|
||||
otmp = mksobj(GREEN_DRAGON_SCALE_MAIL, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
set_material_gm(otmp, GLASS);
|
||||
|
@ -5997,6 +6008,7 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
case 5:
|
||||
intoner_color = CLR_YELLOW;
|
||||
otmp = mksobj(TWO_HANDED_SWORD, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->objsize = MZ_LARGE;
|
||||
otmp->spe = 4;
|
||||
|
@ -6012,6 +6024,7 @@ boolean goodequip;
|
|||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(LONG_GLOVES, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
break;
|
||||
|
@ -6019,10 +6032,12 @@ boolean goodequip;
|
|||
otmp = mksobj(HEELED_BOOTS, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
otmp->obj_color = intoner_color;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(WAR_HAT, mkobjflags|MKOBJ_NOINIT);
|
||||
otmp->spe = 4;
|
||||
set_material_gm(otmp, GLASS);
|
||||
otmp->obj_color = intoner_color;
|
||||
add_oprop(otmp, OPROP_AXIO);
|
||||
add_oprop(otmp, OPROP_REFL);
|
||||
fix_object(otmp);
|
||||
|
@ -6417,12 +6432,39 @@ boolean goodequip;
|
|||
}
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
//Rakuyo
|
||||
otmp = mksobj(RAKUYO, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 2+rn2(3);
|
||||
MAYBE_MERC(otmp)
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
case 5:{
|
||||
//Hunter
|
||||
int weapon = rn2(3) ? RAKUYO : BLADE_OF_MERCY;
|
||||
if(weapon == BLADE_OF_MERCY){
|
||||
if(rn2(3)){
|
||||
otmp = mksobj(BLADE_OF_MERCY, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
}
|
||||
else {
|
||||
otmp = mksobj(BLADE_OF_PITY, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(BLADE_OF_GRACE, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(rn2(3)){
|
||||
otmp = mksobj(RAKUYO, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
}
|
||||
else {
|
||||
otmp = mksobj(RAKUYO_DAGGER, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
otmp = mksobj(RAKUYO_SABER, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 5;
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
}
|
||||
}
|
||||
|
||||
otmp = mksobj(RUFFLED_SHIRT, mkobjflags|MKOBJ_ARTIF);
|
||||
otmp->spe = 0+rn2(4);
|
||||
|
@ -6445,6 +6487,15 @@ boolean goodequip;
|
|||
|
||||
otmp = mongets(mtmp, BUCKLER, mkobjflags|MKOBJ_ARTIF);
|
||||
if(otmp) otmp->spe = 1+rn2(3);
|
||||
|
||||
if(weapon == BLADE_OF_MERCY){
|
||||
otmp = mongets(mtmp, MASK, mkobjflags|MKOBJ_ARTIF);
|
||||
if(otmp){
|
||||
otmp->corpsenm = PM_CROW;
|
||||
set_material_gm(otmp, METAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 6:{
|
||||
//Club-claw
|
||||
|
@ -7095,13 +7146,13 @@ boolean goodequip;
|
|||
}
|
||||
else {
|
||||
if(mtmp->female){
|
||||
(void) mongets(mtmp, rn2(20) ? SPEAR : LONG_SWORD, mkobjflags);
|
||||
(void) mongets(mtmp, STILETTO, mkobjflags);
|
||||
(void) mongets(mtmp, LEATHER_ARMOR, mkobjflags);
|
||||
(void) mongets(mtmp, GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, LOW_BOOTS, mkobjflags);
|
||||
}
|
||||
else {
|
||||
(void) mongets(mtmp, STILETTO, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(20) ? SPEAR : LONG_SWORD, mkobjflags);
|
||||
(void) mongets(mtmp, LEATHER_ARMOR, mkobjflags);
|
||||
(void) mongets(mtmp, GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, LOW_BOOTS, mkobjflags);
|
||||
|
@ -7140,36 +7191,59 @@ boolean goodequip;
|
|||
if(otmp) otmp->spe = rn1(4,3);
|
||||
}
|
||||
else {
|
||||
if(mtmp->female){
|
||||
(void) mongets(mtmp, rn2(2) ? STILETTO : RAPIER, mkobjflags);
|
||||
(void) mongets(mtmp, GENTLEWOMAN_S_DRESS, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, VICTORIAN_UNDERWEAR, mkobjflags);
|
||||
if(!rn2(100)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
(void) mongets(mtmp, GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? STILETTOS : LOW_BOOTS, mkobjflags);
|
||||
/* Knight */
|
||||
if(!rn2(4)){
|
||||
(void) mongets(mtmp, LONG_SWORD, mkobjflags);
|
||||
(void) mongets(mtmp, PLATE_MAIL, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, RUFFLED_SHIRT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? GAUNTLETS : GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? ARMORED_BOOTS : HIGH_BOOTS, mkobjflags);
|
||||
}
|
||||
/* Noble */
|
||||
else {
|
||||
/* Knight */
|
||||
if(!rn2(4)){
|
||||
(void) mongets(mtmp, LONG_SWORD, mkobjflags);
|
||||
(void) mongets(mtmp, PLATE_MAIL, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, RUFFLED_SHIRT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? GAUNTLETS : GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? ARMORED_BOOTS : HIGH_BOOTS, mkobjflags);
|
||||
}
|
||||
/* Noble */
|
||||
else {
|
||||
(void) mongets(mtmp, rn2(2) ? LONG_SWORD : RAPIER, mkobjflags);
|
||||
(void) mongets(mtmp, GENTLEMAN_S_SUIT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, RUFFLED_SHIRT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
(void) mongets(mtmp, GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? HIGH_BOOTS : LOW_BOOTS, mkobjflags);
|
||||
}
|
||||
(void) mongets(mtmp, rn2(2) ? LONG_SWORD : RAPIER, mkobjflags);
|
||||
(void) mongets(mtmp, GENTLEMAN_S_SUIT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, RUFFLED_SHIRT, mkobjflags);
|
||||
if(!rn2(20)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
(void) mongets(mtmp, GLOVES, mkobjflags);
|
||||
(void) mongets(mtmp, rn2(2) ? HIGH_BOOTS : LOW_BOOTS, mkobjflags);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PM_VAMPIRE_LADY:
|
||||
if(Infuture){
|
||||
otmp = mongets(mtmp, ARCHAIC_BOOTS, mkobjflags);
|
||||
if(otmp) otmp->spe = rn1(4,3);
|
||||
otmp = mongets(mtmp, mtmp->female ? VICTORIAN_UNDERWEAR : RUFFLED_SHIRT, mkobjflags);
|
||||
if(otmp) otmp->spe = rn1(4,3);
|
||||
otmp = mongets(mtmp, NOBLE_S_DRESS, mkobjflags);
|
||||
if(otmp){
|
||||
otmp->spe = rn1(4,3);
|
||||
set_material_gm(otmp, COPPER);
|
||||
}
|
||||
otmp = mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
if(otmp) otmp->spe = rn1(4,3);
|
||||
otmp = mongets(mtmp, ARCHAIC_GAUNTLETS, mkobjflags);
|
||||
if(otmp) otmp->spe = rn1(4,3);
|
||||
otmp = mongets(mtmp, ARCHAIC_HELM, mkobjflags);
|
||||
if(otmp) otmp->spe = rn1(4,3);
|
||||
}
|
||||
else {
|
||||
otmp = mongets(mtmp, FEDORA, mkobjflags);
|
||||
if(otmp)
|
||||
otmp->obj_color = CLR_WHITE;
|
||||
otmp = mongets(mtmp, GENTLEWOMAN_S_DRESS, mkobjflags);
|
||||
if(otmp)
|
||||
otmp->obj_color = CLR_WHITE;
|
||||
if(!rn2(20)) mongets(mtmp, VICTORIAN_UNDERWEAR, mkobjflags);
|
||||
if(!rn2(100)) mongets(mtmp, find_opera_cloak(), mkobjflags);
|
||||
otmp = mongets(mtmp, GLOVES, mkobjflags);
|
||||
if(otmp)
|
||||
otmp->obj_color = CLR_WHITE;
|
||||
(void) mongets(mtmp, rn2(2) ? STILETTOS : LOW_BOOTS, mkobjflags);
|
||||
}
|
||||
break;
|
||||
case PM_MINA_HARKER:
|
||||
(void) mongets(mtmp, STILETTO, mkobjflags);
|
||||
(void) mongets(mtmp, BOW, mkobjflags);
|
||||
|
@ -9290,35 +9364,39 @@ boolean goodequip;
|
|||
}
|
||||
} else if(ptr->mtyp == PM_LURKING_ONE) {
|
||||
int i;
|
||||
long long oprop;
|
||||
switch(rnd(20)){
|
||||
long long oprop = 0;
|
||||
int spe = rn2(4);
|
||||
if(!rn2(20)) switch(rnd(10)){
|
||||
case 1:
|
||||
case 2:
|
||||
oprop = OPROP_ELECW;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
oprop = OPROP_ACIDW;
|
||||
break;
|
||||
case 3:
|
||||
oprop = OPROP_MAGCW;
|
||||
break;
|
||||
case 4:
|
||||
oprop = OPROP_WATRW;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
oprop = OPROP_MAGCW;
|
||||
break;
|
||||
case 7:
|
||||
oprop = OPROP_WATRW;
|
||||
break;
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
oprop = OPROP_PSIOW;
|
||||
break;
|
||||
default:
|
||||
oprop = 0;
|
||||
break;
|
||||
}
|
||||
if(!oprop && !rn2(10))
|
||||
spe = 10;
|
||||
for(i = 2; i > 0; i--){
|
||||
otmp = mksobj(CLUB, mkobjflags|MKOBJ_NOINIT);
|
||||
set_material_gm(otmp, BONE);
|
||||
add_oprop(otmp, OPROP_CCLAW);
|
||||
add_oprop(otmp, oprop);
|
||||
otmp->objsize = mtmp->data->msize;
|
||||
otmp->spe = spe;
|
||||
fix_object(otmp);
|
||||
(void) mpickobj(mtmp, otmp);
|
||||
}
|
||||
|
@ -11164,7 +11242,7 @@ boolean randmonst;
|
|||
mkmon_template = CRANIUM_RAT;
|
||||
}
|
||||
/* insight check: making yith */
|
||||
else if(randmonst && check_insight()){
|
||||
else if(randmonst && check_insight() && (level_difficulty()+u.ulevel)/2+5 > monstr[PM_DEMILICH]){
|
||||
mkmon_template = YITH;
|
||||
}
|
||||
/* most general case at bottom -- creatures randomly being zombified */
|
||||
|
@ -11743,6 +11821,11 @@ int faction;
|
|||
|
||||
else if(mtmp->mtyp == PM_POLYPOID_BEING)
|
||||
mtmp->m_insight_level = 40;
|
||||
|
||||
else if(mtmp->mtyp == PM_APHANACTONAN_AUDIENT)
|
||||
mtmp->m_insight_level = rnd(8);
|
||||
else if(mtmp->mtyp == PM_APHANACTONAN_ASSESSOR)
|
||||
mtmp->m_insight_level = 16+d(4,4);
|
||||
|
||||
if(mtmp->mtyp == PM_CHOKHMAH_SEPHIRAH)
|
||||
mtmp->m_lev += u.chokhmah;
|
||||
|
@ -12101,11 +12184,10 @@ int faction;
|
|||
}
|
||||
if(Infuture){
|
||||
if (mndx == PM_MIND_FLAYER){
|
||||
m_initlgrp(mtmp, mtmp->mx, mtmp->my);
|
||||
m_initsgrp(mtmp, mtmp->mx, mtmp->my);
|
||||
}
|
||||
if (mndx == PM_MASTER_MIND_FLAYER){
|
||||
m_initsgrp(mtmp, mtmp->mx, mtmp->my);
|
||||
for(num = d(2,3); num >= 0; num--) makemon_full(&mons[PM_MIND_FLAYER], mtmp->mx, mtmp->my, MM_ADJACENTOK, template, faction);
|
||||
for(num = d(2,3); num >= 0; num--) makemon_full(&mons[PM_MIND_FLAYER], mtmp->mx, mtmp->my, MM_ADJACENTOK|MM_NOGROUP, template, faction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13812,7 +13894,7 @@ struct monst *mtmp, *victim;
|
|||
// if (mtmp->mhpmax + max_increase > hp_threshold + 1)
|
||||
// max_increase = max((hp_threshold + 1) - mtmp->mhpmax, 0);
|
||||
// cur_increase = (max_increase > 0) ? rn2(max_increase)+1 : 0;
|
||||
if(mtmp->mhpmax < hp_threshold-8 || mtmp->m_lev < victim->m_lev + d(2,5)){ /*allow monsters to quickly gain hp up to around their HP limit*/
|
||||
if(mtmp->mhpmax < hp_threshold-8 || mtmp->m_lev < victim->m_lev + (d(2,5) + heal_mlevel_bonus())){ /*allow monsters to quickly gain hp up to around their HP limit*/
|
||||
max_increase = 1;
|
||||
cur_increase = 1;
|
||||
if(Role_if(PM_BARD) && mtmp->mtame && canseemon(mtmp)){
|
||||
|
@ -14639,6 +14721,9 @@ struct monst *mon;
|
|||
|
||||
if (mon->ispolyp) lev_limit = max(lev_limit, 30);
|
||||
|
||||
if(Role_if(PM_HEALER) && mon->mtame && lev_limit < 49)
|
||||
lev_limit = min_ints(49, lev_limit + heal_mlevel_bonus());
|
||||
|
||||
return lev_limit;
|
||||
}
|
||||
#endif /* OVLB */
|
||||
|
|
16
src/mcastu.c
16
src/mcastu.c
|
@ -356,8 +356,20 @@ choose_magic_special(mtmp, type)
|
|||
struct monst *mtmp;
|
||||
unsigned int type;
|
||||
{
|
||||
int clrc_spell_power = mtmp->m_id == 0 ? (rn2(u.ulevel) * 18 / 30) : rn2(mtmp->m_lev);
|
||||
int wzrd_spell_power = mtmp->m_id == 0 ? (rn2(u.ulevel) * 24 / 30) : rn2(mtmp->m_lev);
|
||||
int clrc_spell_power;
|
||||
int wzrd_spell_power;
|
||||
if(mtmp->m_id == 0){
|
||||
clrc_spell_power = rn2(u.ulevel) * 18 / 30;
|
||||
wzrd_spell_power = rn2(u.ulevel) * 24 / 30;
|
||||
}
|
||||
else {
|
||||
if(mtmp->mtemplate == YITH){
|
||||
clrc_spell_power = wzrd_spell_power = rn2(45);
|
||||
}
|
||||
else {
|
||||
clrc_spell_power = wzrd_spell_power = rn2(mtmp->m_lev);
|
||||
}
|
||||
}
|
||||
boolean quake = FALSE;
|
||||
//50% favored spells
|
||||
if (rn2(2)) {
|
||||
|
|
|
@ -101,7 +101,7 @@ struct permonst * ptr; /* summon as though you were <X> */
|
|||
* If this daemon is unique and being re-summoned (the only way we
|
||||
* could get this far with an extinct dtype), try another.
|
||||
*/
|
||||
if (mvitals[dtype].mvflags & G_GONE && !In_quest(&u.uz)) {
|
||||
if (mvitals[dtype].mvflags & G_GONE) {
|
||||
dtype = ndemon(atyp);
|
||||
if (dtype == NON_PM) return;
|
||||
}
|
||||
|
|
11
src/mkobj.c
11
src/mkobj.c
|
@ -719,7 +719,11 @@ int mkflags;
|
|||
case EGG:
|
||||
otmp->corpsenm = NON_PM; /* generic egg */
|
||||
|
||||
if (In_sokoban(&u.uz) || Is_gatetown(&u.uz) || In_void(&u.uz)) break; /*Some levels shouldn't have mosnters spawning from eggs*/
|
||||
if (In_sokoban(&u.uz)
|
||||
|| Is_gatetown(&u.uz)
|
||||
|| Infuture
|
||||
|| In_void(&u.uz)
|
||||
) break; /*Some levels shouldn't have mosnters spawning from eggs*/
|
||||
|
||||
if (!rn2(3)) for (tryct = 200; tryct > 0; --tryct) {
|
||||
mndx = can_be_hatched(rndmonnum());
|
||||
|
@ -799,6 +803,10 @@ int mkflags;
|
|||
otmp->lamplit = 0;
|
||||
blessorcurse(otmp, 5);
|
||||
break;
|
||||
case MAGIC_TORCH:
|
||||
otmp->spe = 0;
|
||||
otmp->lamplit = 0;
|
||||
break;
|
||||
case CANDLE_OF_INVOCATION:
|
||||
case MAGIC_LAMP: otmp->spe = 1;
|
||||
otmp->lamplit = 0;
|
||||
|
@ -1819,6 +1827,7 @@ struct obj* obj;
|
|||
* work properly. */
|
||||
case BULLWHIP:
|
||||
case TORCH:
|
||||
case MAGIC_TORCH:
|
||||
case SHADOWLANDER_S_TORCH:
|
||||
case SUNROD:
|
||||
case WORM_TOOTH:
|
||||
|
|
226
src/mkroom.c
226
src/mkroom.c
|
@ -46,6 +46,7 @@ STATIC_DCL void NDECL(mkferrubarracks);
|
|||
STATIC_DCL void NDECL(mkinvertzigg);
|
||||
STATIC_DCL void FDECL(mkmch, (int));
|
||||
STATIC_DCL void FDECL(mkwrk, (int));
|
||||
STATIC_DCL void FDECL(mkaph, (int));
|
||||
STATIC_DCL void FDECL(mklostitem, (int));
|
||||
STATIC_DCL void FDECL(mklawfossil, (int));
|
||||
STATIC_DCL void FDECL(mkcamp, (int));
|
||||
|
@ -4962,6 +4963,80 @@ int typ;
|
|||
}
|
||||
}
|
||||
|
||||
STATIC_OVL
|
||||
void
|
||||
mkaph(junked)
|
||||
int junked;
|
||||
{
|
||||
int x, y, i, tries = 0, good = FALSE;
|
||||
struct obj *otmp;
|
||||
struct monst *mon;
|
||||
if(junked){
|
||||
for(i = rnd(2) + rn2(2); i > 0; i--){
|
||||
mon = makemon(&mons[PM_APHANACTONAN_AUDIENT], 0, 0, NO_MM_FLAGS);
|
||||
if(mon && !good){
|
||||
good = TRUE;
|
||||
x = mon->mx;
|
||||
y = mon->my;
|
||||
if(!rn2(20)){
|
||||
struct obj *statue;
|
||||
statue = mksobj_at(STATUE, x, y, NO_MKOBJ_FLAGS);
|
||||
if(statue){
|
||||
statue->corpsenm = PM_APHANACTONAN_ASSESSOR;
|
||||
fix_object(statue);
|
||||
otmp = mksobj(CLOCKWORK_COMPONENT, MKOBJ_NOINIT);
|
||||
if(otmp){
|
||||
otmp->quan = d(4,8)/2;
|
||||
otmp->oeroded2 = 3;
|
||||
otmp->owt = weight(otmp);
|
||||
add_to_container(statue, otmp);
|
||||
}
|
||||
otmp = mksobj(UPGRADE_KIT, NO_MKOBJ_FLAGS);
|
||||
if(otmp){
|
||||
add_to_container(statue, otmp);
|
||||
}
|
||||
if(!rn2(20)){
|
||||
otmp = mksobj(APHANACTONAN_ARCHIVE, NO_MKOBJ_FLAGS);
|
||||
if(otmp){
|
||||
add_to_container(statue, otmp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
otmp = mksobj_at(CLOCKWORK_COMPONENT, x, y, NO_MKOBJ_FLAGS);
|
||||
if(otmp){
|
||||
otmp->quan = d(4,8)/2;
|
||||
otmp->oeroded2 = 3;
|
||||
otmp->owt = weight(otmp);
|
||||
}
|
||||
if(rn2(2)){
|
||||
otmp = mksobj_at(ARCHAIC_PLATE_MAIL, x, y, NO_MKOBJ_FLAGS);
|
||||
if(otmp){
|
||||
otmp->oeroded2 = 3;
|
||||
}
|
||||
}
|
||||
if(!rn2(4)){
|
||||
otmp = mksobj_at(UPGRADE_KIT, x, y, NO_MKOBJ_FLAGS);
|
||||
if(otmp){
|
||||
otmp->oeroded2 = 3;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
mon = makemon(&mons[PM_APHANACTONAN_ASSESSOR], 0, 0, NO_MM_FLAGS);
|
||||
if(mon){
|
||||
x = mon->mx;
|
||||
y = mon->my;
|
||||
makemon(&mons[PM_APHANACTONAN_AUDIENT], x, y, MM_ADJACENTOK);
|
||||
makemon(&mons[PM_APHANACTONAN_AUDIENT], x, y, MM_ADJACENTOK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STATIC_OVL
|
||||
void
|
||||
mklostitem(typ)
|
||||
|
@ -5192,6 +5267,9 @@ place_law_features()
|
|||
{
|
||||
int n;
|
||||
if(Is_path(&u.uz)){
|
||||
int cutoff = rn2(9);
|
||||
for(n = 4; n > 0; n--)
|
||||
mkaph(cutoff >= n);
|
||||
if(!rn2(10)){
|
||||
// if(1){
|
||||
n = 10-int_sqrt(rnd(99));
|
||||
|
@ -5515,7 +5593,84 @@ int sx,sy;
|
|||
int mtyp = NON_PM;
|
||||
struct monst *mon;
|
||||
boolean polyps = FALSE;
|
||||
//Note: all throne rooms are part of rodney's forces, so everyone has prisoners.
|
||||
switch(kingtype){
|
||||
case 0:{
|
||||
int tries = 500;
|
||||
int zlevel, minmlev, maxmlev;
|
||||
|
||||
zlevel = level_difficulty();
|
||||
/* determine the level of the weakest monster to make. */
|
||||
minmlev = (zlevel + u.ulevel) / 3 - 5;
|
||||
/* determine the level of the strongest monster to make. */
|
||||
maxmlev = (zlevel + u.ulevel) / 2 + 5;
|
||||
int prisoners[] = { PM_GRIMLOCK, PM_GARGOYLE, PM_WINGED_GARGOYLE, PM_HOBBIT, PM_DWARF, PM_BUGBEAR,
|
||||
PM_DWARF_LORD, PM_DWARF_CLERIC, PM_DEEP_ONE, PM_DEEPER_ONE, PM_GNOLL, PM_GITHYANKI_PIRATE,
|
||||
PM_ELOCATOR,
|
||||
PM_IMP, PM_QUASIT, PM_TENGU, PM_URANIUM_IMP,
|
||||
PM_KOBOLD, PM_LARGE_KOBOLD,
|
||||
PM_KOBOLD_LORD, PM_KOBOLD_SHAMAN, PM_WINGED_KOBOLD,
|
||||
PM_LEPRECHAUN,
|
||||
PM_QUICKLING, PM_DRYAD,
|
||||
PM_NAIAD, PM_OREAD, PM_SWAMP_NYMPH, PM_YUKI_ONNA, PM_DEMINYMPH,
|
||||
PM_GOBLIN, PM_HOBGOBLIN,
|
||||
PM_HILL_ORC, PM_MORDOR_ORC, PM_URUK_HAI, PM_ORC_SHAMAN, PM_ORC_CAPTAIN, PM_URUK_CAPTAIN,
|
||||
PM_ANGBAND_ORC,
|
||||
PM_ANGEL, PM_KI_RIN,
|
||||
PM_JUSTICE_ARCHON, PM_SWORD_ARCHON, PM_SHIELD_ARCHON, PM_TRUMPET_ARCHON, PM_WARDEN_ARCHON, PM_THRONE_ARCHON,
|
||||
PM_MOVANIC_DEVA, PM_MONADIC_DEVA, PM_ASTRAL_DEVA, PM_GRAHA_DEVA, PM_SURYA_DEVA,
|
||||
PM_LILLEND,
|
||||
PM_COURE_ELADRIN, PM_NOVIERE_ELADRIN, PM_BRALANI_ELADRIN, PM_FIRRE_ELADRIN, PM_SHIERE_ELADRIN, PM_GHAELE_ELADRIN, PM_TULANI_ELADRIN,
|
||||
PM_PLAINS_CENTAUR, PM_FOREST_CENTAUR, PM_MOUNTAIN_CENTAUR,
|
||||
PM_SPROW, PM_DRIDER, PM_PRIESTESS_OF_GHAUNADAUR, PM_FORMIAN_CRUSHER, PM_FORMIAN_TASKMASTER,
|
||||
PM_GNOME, PM_GNOME_LORD, PM_GNOME_LADY, PM_TINKER_GNOME, PM_GNOMISH_WIZARD,
|
||||
PM_GIANT, PM_STONE_GIANT, PM_HILL_GIANT, PM_FIRE_GIANT, PM_FROST_GIANT, PM_STORM_GIANT,
|
||||
PM_ETTIN, PM_MINOTAUR, PM_MINOTAUR_PRIESTESS,
|
||||
PM_ANCIENT_NAGA,
|
||||
PM_OGRE, PM_OGRE_MAGE, PM_OGRE_LORD,
|
||||
PM_QUANTUM_MECHANIC,
|
||||
PM_SERPENT_MAN_OF_YOTH,
|
||||
PM_PISACA,
|
||||
PM_TROLL, PM_ICE_TROLL, PM_ROCK_TROLL, PM_WATER_TROLL, PM_OLOG_HAI, PM_WOOD_TROLL,
|
||||
PM_VAMPIRE, PM_VAMPIRE_LADY, PM_VAMPIRE_LORD,
|
||||
PM_YETI, PM_SASQUATCH, PM_GUG,
|
||||
PM_UNDEAD_KNIGHT, PM_WARRIOR_OF_SUNLIGHT, PM_UNDEAD_MAIDEN, PM_KNIGHT_OF_THE_PRINCESS_S_GUARD,
|
||||
PM_BLUE_SENTINEL, PM_DARKMOON_KNIGHT, PM_UNDEAD_REBEL, PM_PARDONER, PM_OCCULTIST,
|
||||
PM_LIVING_DOLL,
|
||||
PM_PLUMACH_RILMANI, PM_FERRUMACH_RILMANI, PM_CUPRILACH_RILMANI, PM_ARGENACH_RILMANI,
|
||||
PM_PEASANT, PM_MINER, PM_WEREJACKAL, PM_WOODLAND_ELF, PM_DROW_CAPTAIN, PM_GREEN_ELF,
|
||||
PM_WERERAT, PM_GREY_ELF, PM_WEREWOLF, PM_HEDROW_WARRIOR, PM_ELF_LORD, PM_ELF_LADY,
|
||||
PM_DOPPELGANGER, PM_HEDROW_WIZARD, PM_NURSE, PM_MAID, PM_UNEARTHLY_DROW, PM_DROW_MATRON,
|
||||
PM_HEDROW_BLADEMASTER,
|
||||
PM_PRISONER, PM_MINDLESS_THRALL,
|
||||
PM_WATCHMAN, PM_WATCH_CAPTAIN,
|
||||
PM_MARID, PM_DJINNI, PM_SANDESTIN,
|
||||
PM_HORNED_DEVIL, PM_ERINYS, PM_BARBED_DEVIL, PM_BONE_DEVIL, PM_ICE_DEVIL,
|
||||
PM_SUCCUBUS, PM_INCUBUS, PM_VROCK, PM_DAUGHTER_OF_BEDLAM, PM_LILITU, PM_MARILITH,
|
||||
PM_FALLEN_ANGEL,
|
||||
PM_SALAMANDER,
|
||||
PM_ARCHEOLOGIST, PM_ARCHEOLOGIST, PM_BARBARIAN, PM_BARBARIAN, PM_HALF_DRAGON, PM_HALF_DRAGON, PM_BARD, PM_BARD,
|
||||
PM_CONVICT, PM_CONVICT, PM_HEALER, PM_HEALER, PM_KNIGHT, PM_KNIGHT, PM_MONK, PM_MONK,
|
||||
PM_MADMAN, PM_MADWOMAN, PM_PRIEST, PM_PRIESTESS, PM_NOBLEMAN, PM_NOBLEWOMAN, PM_PIRATE, PM_PIRATE,
|
||||
PM_RANGER, PM_RANGER, PM_ROGUE, PM_ROGUE, PM_SAMURAI, PM_SAMURAI, PM_TOURIST, PM_TOURIST,
|
||||
PM_VALKYRIE, PM_VALKYRIE, PM_WIZARD, PM_WIZARD,
|
||||
PM_SMALL_GOAT_SPAWN, PM_GOAT_SPAWN, PM_GIANT_GOAT_SPAWN,
|
||||
PM_APPRENTICE_WITCH, PM_WITCH
|
||||
};
|
||||
do mtyp = ROLL_FROM(prisoners);
|
||||
while((tooweak(mtyp, minmlev) || toostrong(mtyp,maxmlev)) && tries--);
|
||||
}break;
|
||||
case PM_DWARF_KING:
|
||||
case PM_DWARF_QUEEN:{
|
||||
int prisoners[] = {
|
||||
PM_MINER, PM_MINER, PM_WATCHMAN, PM_WATCHMAN, PM_WATCH_CAPTAIN,
|
||||
PM_WOODLAND_ELF, PM_WOODLAND_ELF, PM_GREEN_ELF, PM_GREEN_ELF, PM_GREY_ELF,
|
||||
PM_HEDROW_WARRIOR, PM_HEDROW_WIZARD, PM_DROW_CAPTAIN,
|
||||
PM_HOBBIT, PM_HOBBIT,
|
||||
PM_DRYAD, PM_NAIAD, PM_OREAD, PM_YUKI_ONNA, PM_DEMINYMPH
|
||||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_KOBOLD_LORD:{
|
||||
int prisoners[] = {PM_GNOME, PM_GNOME, PM_GNOME, PM_GNOME, PM_GNOME_LORD, PM_GNOME_LADY, PM_TINKER_GNOME, PM_GNOMISH_WIZARD,
|
||||
PM_WOODLAND_ELF, PM_DWARF, PM_HOBBIT
|
||||
|
@ -5559,6 +5714,16 @@ int sx,sy;
|
|||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_GNOME_KING:
|
||||
case PM_GNOME_QUEEN:{
|
||||
int prisoners[] = {
|
||||
PM_MINER, PM_MINER, PM_WATCHMAN, PM_WATCHMAN, PM_WATCH_CAPTAIN,
|
||||
PM_WOODLAND_ELF, PM_WOODLAND_ELF, PM_GREEN_ELF,
|
||||
PM_HOBBIT, PM_HOBBIT,
|
||||
PM_KOBOLD, PM_LARGE_KOBOLD,
|
||||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_TITAN:{
|
||||
int prisoners[] = {
|
||||
PM_JUSTICE_ARCHON, PM_SWORD_ARCHON, PM_SHIELD_ARCHON, PM_TRUMPET_ARCHON, PM_WARDEN_ARCHON, PM_THRONE_ARCHON,
|
||||
|
@ -5596,6 +5761,7 @@ int sx,sy;
|
|||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_VAMPIRE_LADY:
|
||||
case PM_VAMPIRE_LORD:{
|
||||
int prisoners[] = {
|
||||
PM_WOODLAND_ELF, PM_GREEN_ELF, PM_GREY_ELF, PM_ELF_LADY,
|
||||
|
@ -5611,6 +5777,22 @@ int sx,sy;
|
|||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_ELVENKING:
|
||||
case PM_ELVENQUEEN:{
|
||||
int prisoners[] = {
|
||||
PM_WATCHMAN, PM_WATCHMAN, PM_WATCH_CAPTAIN,
|
||||
PM_KNIGHT, PM_KNIGHT, PM_NOBLEMAN, PM_NOBLEWOMAN,
|
||||
PM_HEDROW_WARRIOR, PM_HEDROW_WARRIOR, PM_DROW_CAPTAIN, PM_DROW_CAPTAIN, PM_DROW_MATRON,
|
||||
PM_HOBBIT, PM_HOBBIT, PM_HOBBIT, PM_HOBBIT,
|
||||
PM_DWARF, PM_DWARF, PM_DWARF_CLERIC, PM_DWARF_LORD,
|
||||
PM_DWARF, PM_DWARF, PM_DWARF_CLERIC, PM_DWARF_LORD,
|
||||
PM_HILL_ORC, PM_ORC_SHAMAN, PM_ORC_CAPTAIN, PM_ANGBAND_ORC,
|
||||
PM_UNEARTHLY_DROW, PM_UNEARTHLY_DROW, PM_LILITU, PM_MARILITH,
|
||||
PM_MIRKWOOD_SPIDER, PM_MIRKWOOD_SPIDER, PM_MIRKWOOD_ELDER,
|
||||
PM_DEMINYMPH
|
||||
};
|
||||
mtyp = ROLL_FROM(prisoners);
|
||||
}break;
|
||||
case PM_DROW_MATRON:{
|
||||
int prisoners[] = {
|
||||
PM_GREEN_ELF, PM_GREEN_ELF, PM_GREY_ELF, PM_GREY_ELF, PM_ELF_LORD, PM_ELF_LADY,
|
||||
|
@ -5698,10 +5880,21 @@ int sx,sy;
|
|||
break;
|
||||
}
|
||||
}
|
||||
if(mon->mtyp == PM_WITCH || mon->mtyp == PM_APPRENTICE_WITCH){
|
||||
struct monst *rat;
|
||||
for(rat = fmon; rat; rat = rat->nmon) if(rat->mtyp == PM_WITCH_S_FAMILIAR && mon->m_id == rat->mvar_witchID){
|
||||
mongone(rat);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(kingtype == PM_VAMPIRE_LORD){
|
||||
mon->female = TRUE;
|
||||
set_template(mon, VAMPIRIC);
|
||||
}
|
||||
if(kingtype == PM_VAMPIRE_LADY){
|
||||
mon->female = FALSE;
|
||||
set_template(mon, VAMPIRIC);
|
||||
}
|
||||
if(polyps){
|
||||
mon->ispolyp = TRUE;
|
||||
mongets(mon, MASK, NO_MKOBJ_FLAGS);
|
||||
|
@ -5725,8 +5918,6 @@ int dx,dy;
|
|||
{
|
||||
struct monst *mon;
|
||||
struct obj *obj;
|
||||
if(!kingtype || kingtype == PM_ELVENKING || kingtype == PM_ELVENQUEEN || kingtype == PM_DWARF_KING || kingtype == PM_DWARF_QUEEN || kingtype == PM_GNOME_KING || kingtype == PM_GNOME_QUEEN)
|
||||
return; //No cells for now
|
||||
levl[sx][sy].typ = CORR;
|
||||
unblock_point(sx,sy);
|
||||
levl[sx-dx][sy-dy].typ = IRONBARS;
|
||||
|
@ -5857,6 +6048,7 @@ struct mkroom *sroom;
|
|||
PM_DEEPEST_ONE,
|
||||
PM_OGRE_KING,
|
||||
PM_VAMPIRE_LORD,
|
||||
PM_VAMPIRE_LADY,
|
||||
PM_ELVENKING,
|
||||
PM_ELVENQUEEN,
|
||||
PM_DROW_MATRON,
|
||||
|
@ -5869,12 +6061,17 @@ struct mkroom *sroom;
|
|||
mon = makemon(&mons[ctype], tx, ty, NO_MM_FLAGS|MM_NOCOUNTBIRTH);
|
||||
if(mon) {
|
||||
mon->msleeping = 1;
|
||||
if (type==COURT && mon->mpeaceful) {
|
||||
mon->mpeaceful = 0;
|
||||
set_malign(mon);
|
||||
}
|
||||
if(ctype == PM_DROW_MATRON || ctype == PM_EMBRACED_DROWESS){
|
||||
set_curhouse(mon->mfaction);
|
||||
if (type==COURT) {
|
||||
//Set curhouse to coordinate equipment
|
||||
if(ctype == PM_DROW_MATRON || ctype == PM_EMBRACED_DROWESS){
|
||||
set_curhouse(mon->mfaction);
|
||||
}
|
||||
//Note: court monsters are always part of rodney's forces.
|
||||
mon->mfaction = YENDORIAN_FACTION;
|
||||
if(mon->mpeaceful){
|
||||
mon->mpeaceful = 0;
|
||||
set_malign(mon);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5903,7 +6100,7 @@ struct mkroom *sroom;
|
|||
for(sx = sroom->lx; sx <= sroom->hx; sx++)
|
||||
for(sy = sroom->ly; sy <= sroom->hy; sy++) {
|
||||
if(type == COURT){
|
||||
if(ctype == PM_KOBOLD_LORD || ctype == PM_VAMPIRE_LORD || ctype == PM_DROW_MATRON ||
|
||||
if(ctype == PM_KOBOLD_LORD || ctype == PM_VAMPIRE_LORD || ctype == PM_VAMPIRE_LADY || ctype == PM_DROW_MATRON ||
|
||||
ctype == PM_EMBRACED_DROWESS || ctype == PM_DEEPEST_ONE || ctype == PM_ORC_OF_THE_AGES_OF_STARS
|
||||
){
|
||||
levl[tx][ty].lit = 0;
|
||||
|
@ -5944,9 +6141,13 @@ struct mkroom *sroom;
|
|||
sx, sy, NO_MM_FLAGS|MM_NOCOUNTBIRTH);
|
||||
if(mon) {
|
||||
mon->msleeping = 1;
|
||||
if (type==COURT && mon->mpeaceful) {
|
||||
mon->mpeaceful = 0;
|
||||
set_malign(mon);
|
||||
if (type==COURT) {
|
||||
//Note: court monsters are always part of rodney's forces, even if they are angels.
|
||||
mon->mfaction = YENDORIAN_FACTION;
|
||||
if(mon->mpeaceful){
|
||||
mon->mpeaceful = 0;
|
||||
set_malign(mon);
|
||||
}
|
||||
if(ctype == PM_EMBRACED_DROWESS && (mon->mtyp == PM_DROW_CAPTAIN || mon->mtyp == PM_DROW_MATRON)){
|
||||
set_template(mon, M_BLACK_WEB);
|
||||
}
|
||||
|
@ -7569,6 +7770,7 @@ courtmon(kingnum)
|
|||
|
||||
case PM_VAMPIRE:
|
||||
case PM_VAMPIRE_LORD:
|
||||
case PM_VAMPIRE_LADY:
|
||||
i = rnd(100);
|
||||
if(i>90)
|
||||
return &mons[PM_VAMPIRE];
|
||||
|
|
66
src/mon.c
66
src/mon.c
|
@ -150,6 +150,7 @@ int mndx;
|
|||
case PM_ELF_MUMMY: mndx = PM_ELF; break;
|
||||
case PM_VAMPIRE:
|
||||
case PM_VAMPIRE_LORD:
|
||||
case PM_VAMPIRE_LADY:
|
||||
#if 0 /* DEFERRED */
|
||||
case PM_VAMPIRE_MAGE:
|
||||
#endif
|
||||
|
@ -373,6 +374,7 @@ register struct monst *mtmp;
|
|||
case PM_BLUE_DRAGON:
|
||||
case PM_GREEN_DRAGON:
|
||||
case PM_YELLOW_DRAGON:
|
||||
case PM_DEEP_DRAGON:
|
||||
/* Make dragon scales. This assumes that the order of the */
|
||||
/* dragons is the same as the order of the scales. */
|
||||
if (!rn2(mtmp->mrevived ? 20 : 3)) {
|
||||
|
@ -596,6 +598,7 @@ register struct monst *mtmp;
|
|||
goto default_1;
|
||||
case PM_VAMPIRE:
|
||||
case PM_VAMPIRE_LORD:
|
||||
case PM_VAMPIRE_LADY:
|
||||
/* include mtmp in the mkcorpstat() call */
|
||||
if(mtmp->mpetitioner
|
||||
&& !is_rider(mtmp->data)
|
||||
|
@ -783,6 +786,37 @@ register struct monst *mtmp;
|
|||
}
|
||||
rem_mx(mtmp, MX_ENAM);
|
||||
break;
|
||||
case PM_APHANACTONAN_AUDIENT:
|
||||
obj = mksobj_at(CLOCKWORK_COMPONENT, x, y, NO_MKOBJ_FLAGS);
|
||||
obj->quan = d(2,4);
|
||||
obj->owt = weight(obj);
|
||||
rem_mx(mtmp, MX_ENAM);
|
||||
if(!rn2(20))
|
||||
obj = mksobj_at(UPGRADE_KIT, x, y, NO_MKOBJ_FLAGS);
|
||||
obj = mksobj_at(APHANACTONAN_RECORD, x, y, NO_MKOBJ_FLAGS);
|
||||
break;
|
||||
case PM_APHANACTONAN_ASSESSOR:
|
||||
obj = mksobj_at(CLOCKWORK_COMPONENT, x, y, NO_MKOBJ_FLAGS);
|
||||
obj->quan = d(4,8);
|
||||
obj->owt = weight(obj);
|
||||
rem_mx(mtmp, MX_ENAM);
|
||||
obj = mksobj_at(UPGRADE_KIT, x, y, NO_MKOBJ_FLAGS);
|
||||
num = d(4,4);
|
||||
while (num--){
|
||||
obj = mksobj_at(EYEBALL, x, y, MKOBJ_NOINIT);
|
||||
obj->corpsenm = PM_BEHOLDER;
|
||||
}
|
||||
num = d(2,4);
|
||||
while(num--){
|
||||
obj = mksobj_at(ARCHAIC_PLATE_MAIL, x, y, NO_MKOBJ_FLAGS);
|
||||
set_material_gm(obj, COPPER);
|
||||
obj->spe = 4;
|
||||
}
|
||||
obj = mksobj_at(CORPSE, x, y, NO_MKOBJ_FLAGS);
|
||||
obj->corpsenm = PM_FLOATING_EYE;
|
||||
fix_object(obj);
|
||||
obj = mksobj_at(APHANACTONAN_ARCHIVE, x, y, NO_MKOBJ_FLAGS);
|
||||
break;
|
||||
case PM_PARASITIZED_DOLL:
|
||||
num = d(2,4);
|
||||
while (num--){
|
||||
|
@ -1848,7 +1882,10 @@ movemon()
|
|||
else continue;
|
||||
}
|
||||
//else no quant lock
|
||||
|
||||
}
|
||||
|
||||
if(Nightmare && mon_can_see_you(mtmp)){
|
||||
you_inflict_madness(mtmp);
|
||||
}
|
||||
|
||||
if(mtmp->mtyp == PM_METROID_QUEEN){
|
||||
|
@ -3214,10 +3251,10 @@ struct monst * mdef; /* another monster which is next to it */
|
|||
}
|
||||
#ifdef ATTACK_PETS
|
||||
// pets attack hostile monsters
|
||||
if (magr->mtame && !mdef->mpeaceful && magr->mhp > magr->mhpmax/2)
|
||||
if (magr->mtame && !mdef->mpeaceful && (magr->mhp > magr->mhpmax/2 || banish_kill(magr->mtyp)))
|
||||
return ALLOW_M|ALLOW_TM;
|
||||
// and vice versa, with some limitations that will help your pet survive
|
||||
if (mdef->mtame && !magr->mpeaceful && mdef->mhp > mdef->mhpmax/2 && !mdef->meating && mdef != u.usteed && !mdef->mflee)
|
||||
if (mdef->mtame && !magr->mpeaceful && (mdef->mhp > mdef->mhpmax/2 || banish_kill(mdef->mtyp)) && !mdef->meating && mdef != u.usteed && !mdef->mflee)
|
||||
return ALLOW_M|ALLOW_TM;
|
||||
#endif /* ATTACK_PETS */
|
||||
|
||||
|
@ -4394,6 +4431,7 @@ int adtyp;
|
|||
switch(mdat->mtyp){
|
||||
case PM_GAS_SPORE:
|
||||
case PM_DUNGEON_FERN_SPORE:
|
||||
case PM_APHANACTONAN_AUDIENT:
|
||||
return EXPL_NOXIOUS;
|
||||
case PM_SWAMP_FERN_SPORE:
|
||||
return EXPL_MAGICAL;
|
||||
|
@ -4498,7 +4536,6 @@ boolean was_swallowed; /* digestion */
|
|||
}
|
||||
else if (canseemon(magr)) pline("%s seems to have indigestion.", Monnam(magr));
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -4655,7 +4692,10 @@ boolean was_swallowed; /* digestion */
|
|||
mon_expl_color(mdat, mdat->mattk[i].adtyp),
|
||||
1);
|
||||
}
|
||||
if(mdat->mtyp == PM_GARO_MASTER || mdat->mtyp == PM_GARO) return (TRUE);
|
||||
if(mdat->mtyp == PM_GARO_MASTER
|
||||
|| mdat->mtyp == PM_GARO
|
||||
|| mdat->mtyp == PM_APHANACTONAN_AUDIENT
|
||||
) return (TRUE);
|
||||
else return (FALSE);
|
||||
} //End AT_BOOM != AD_HLBD && != AD_POSN
|
||||
else if(mdat->mattk[i].adtyp == AD_HLBD && mdat->mtyp == PM_ASMODEUS){
|
||||
|
@ -4742,8 +4782,7 @@ boolean was_swallowed; /* digestion */
|
|||
// The dungeon of ill regard, where Axus is found, now spawns only Modrons. So this is uneeded
|
||||
// for(quincount;quincount<7;quincount++) makemon(&mons[PM_QUINON], mon->mx, mon->my,MM_ADJACENTOK|MM_ANGRY);
|
||||
}
|
||||
else if(mdat->mattk[i].adtyp == AD_GROW || (mdat->mtyp==PM_QUINON
|
||||
&& mdat->mattk[i].adtyp == AD_STUN)){//horrid quinon kludge
|
||||
else if(mdat->mattk[i].adtyp == AD_GROW){
|
||||
struct monst *mtmp;
|
||||
struct monst * axus = (struct monst *)0;
|
||||
boolean found;
|
||||
|
@ -4757,7 +4796,7 @@ boolean was_swallowed; /* digestion */
|
|||
continue;
|
||||
if (!axus && mtmp->mtyp == PM_AXUS)
|
||||
axus = mtmp;
|
||||
if (!found && mtmp->mtyp == current_ton-1) {
|
||||
if (!found && current_ton != PM_MONOTON && mtmp->mtyp == current_ton-1) {
|
||||
set_mon_data(mtmp, current_ton);
|
||||
//Assumes Auton
|
||||
mtmp->m_lev += 1;
|
||||
|
@ -4869,6 +4908,8 @@ boolean was_swallowed; /* digestion */
|
|||
|| (mdat->geno & G_UNIQ)
|
||||
|| is_alabaster_mummy(mon->data)
|
||||
|| (uwep && uwep->oartifact == ART_SINGING_SWORD && uwep->osinging == OSING_LIFE && mon->mtame)
|
||||
|| mdat->mtyp == PM_APHANACTONAN_AUDIENT
|
||||
|| mdat->mtyp == PM_APHANACTONAN_ASSESSOR
|
||||
|| mdat->mtyp == PM_HARROWER_OF_ZARIEL
|
||||
|| mdat->mtyp == PM_UNDEAD_KNIGHT
|
||||
|| mdat->mtyp == PM_WARRIOR_OF_SUNLIGHT
|
||||
|
@ -5444,7 +5485,7 @@ int how;
|
|||
else if ((mdef->wormno ? worm_known(mdef) : cansee(mdef->mx, mdef->my))
|
||||
&& fltxt)
|
||||
pline("%s is %s%s%s!", Monnam(mdef),
|
||||
nonliving(mdef->data) ? "destroyed" : "killed",
|
||||
banish_kill(mdef->mtyp) ? "banished" : nonliving(mdef->data) ? "destroyed" : "killed",
|
||||
*fltxt ? " by the " : "",
|
||||
fltxt
|
||||
);
|
||||
|
@ -5556,7 +5597,7 @@ xkilled(mtmp, dest)
|
|||
}
|
||||
|
||||
if (dest & 1) {
|
||||
const char *verb = nonliving(mtmp->data) ? "destroy" : "kill";
|
||||
const char *verb = banish_kill(mtmp->mtyp) ? "banish" : nonliving(mtmp->data) ? "destroy" : "kill";
|
||||
|
||||
if (!wasinside && !canspotmon(mtmp))
|
||||
You("%s it!", verb);
|
||||
|
@ -5795,7 +5836,7 @@ cleanup:
|
|||
if (p_coaligned(mtmp)) u.ublessed = 0;
|
||||
if (mdat->maligntyp == A_NONE)
|
||||
adjalign((int)(ALIGNLIM / 4)); /* BIG bonus */
|
||||
} else if (mtmp->mtame && !Role_if(PM_EXILE) && !Role_if(PM_ANACHRONOUNBINDER)) {
|
||||
} else if (mtmp->mtame && u.ualign.type != A_VOID && !banish_kill(mtmp->mtyp) && !Role_if(PM_ANACHRONOUNBINDER)) {
|
||||
adjalign(-15); /* bad!! */
|
||||
/* your god is mighty displeased... */
|
||||
if (!Hallucination) You_hear("the rumble of distant thunder...");
|
||||
|
@ -8141,7 +8182,8 @@ struct monst *mtmp;
|
|||
tmpm->mpeaceful = 1;
|
||||
} else {
|
||||
if(tmpm->mtame && !(EDOG(tmpm)->loyal)){
|
||||
untame(mtmp, FALSE);
|
||||
untame(tmpm, FALSE);
|
||||
tmpm->mpeaceful = 0;
|
||||
set_malign(tmpm);
|
||||
}
|
||||
else if(!tmpm->mtame && tmpm->mpeaceful){
|
||||
|
|
|
@ -2281,7 +2281,7 @@ static const short grownups[][2] = {
|
|||
{PM_BABY_METROID, PM_METROID},{PM_METROID, PM_ALPHA_METROID}, {PM_ALPHA_METROID, PM_GAMMA_METROID},
|
||||
{PM_GAMMA_METROID, PM_ZETA_METROID}, {PM_ZETA_METROID, PM_OMEGA_METROID},
|
||||
{PM_OMEGA_METROID, PM_METROID_QUEEN},
|
||||
{PM_VAMPIRE, PM_VAMPIRE_LORD}, {PM_BAT, PM_GIANT_BAT},
|
||||
{PM_VAMPIRE, PM_VAMPIRE_LORD}, {PM_VAMPIRE, PM_VAMPIRE_LADY}, {PM_BAT, PM_GIANT_BAT},
|
||||
{PM_GIANT_BAT, PM_BATTLE_BAT}, {PM_BATTLE_BAT, PM_WARBAT},
|
||||
{PM_BABY_GRAY_DRAGON, PM_GRAY_DRAGON},
|
||||
{PM_BABY_SILVER_DRAGON, PM_SILVER_DRAGON},
|
||||
|
|
144
src/monst.c
144
src/monst.c
|
@ -176,7 +176,7 @@ NEARDATA struct permonst mons[] = {
|
|||
SIZ(WT_DIMINUTIVE*3, CN_DIMINUTIVE, MS_SILENT, MZ_TINY),
|
||||
MR_SLEEP|MR_POISON|MR_ACID|MR_STONE, MR_STONE,
|
||||
MM_AMORPHOUS|MM_BREATHLESS /*MM*/, MT_MINDLESS|MT_WANDER /*MT*/, 0 /*MF*/,
|
||||
MB_NOEYES|MB_NOLIMBS|MB_NOHEAD|MB_ACID|MB_NEUTER /*MB*/, MG_VSLASH /*MG*/,
|
||||
MB_NOEYES|MB_NOLIMBS|MB_NOHEAD|MB_ACID|MB_NEUTER /*MB*/, MG_RBLUNT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_SCENT /*MV*/, CLR_GREEN),
|
||||
MON("blob of preserved organs", S_BLOB,//2 /*Needs tile*/
|
||||
LVL(1, 0, 0, -10), (G_NOGEN),
|
||||
|
@ -216,7 +216,7 @@ NEARDATA struct permonst mons[] = {
|
|||
MR_FIRE|MR_COLD|MR_SLEEP|MR_POISON|MR_ACID|MR_STONE,
|
||||
MR_FIRE|MR_COLD|MR_SLEEP|MR_ACID,
|
||||
MM_SWIM /*MM*/, MT_MINDLESS|MT_OMNIVORE|MT_WANDER|MT_HOSTILE /*MT*/, 0 /*MF*/,
|
||||
MB_NOEYES|MB_NOLIMBS|MB_NOHEAD|MB_ACID|MB_NEUTER /*MB*/, MG_VSLASH|MG_TRACKER /*MG*/,
|
||||
MB_NOEYES|MB_NOLIMBS|MB_NOHEAD|MB_ACID|MB_NEUTER /*MB*/, MG_RBLUNT|MG_TRACKER /*MG*/,
|
||||
0 /*MA*/, MV_SCENT /*MV*/, CLR_CYAN),
|
||||
MON("blood bloater", S_BLOB,//8/*Needs tile*/
|
||||
LVL(10, 12, 0, 0), (G_LGROUP|G_HELL|G_GENO|1),
|
||||
|
@ -236,7 +236,7 @@ NEARDATA struct permonst mons[] = {
|
|||
SIZ(WT_HUGE, CN_HUGE, MS_SHOG, MZ_HUGE),
|
||||
MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON,
|
||||
MM_AMORPHOUS|MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_OMNIVORE|MT_COLLECT|MT_MAGIC|MT_HOSTILE|MT_TRAITOR /*MT*/, 0 /*MF*/,
|
||||
MB_NOHEAD|MB_ACID|MB_NEUTER|MB_NOFEET /*MB*/, MG_VSLASH|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MB_NOHEAD|MB_ACID|MB_NEUTER|MB_NOFEET /*MB*/, MG_RBLUNT|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_NORMAL /*MV*/, CLR_BRIGHT_GREEN),
|
||||
MON("priest of Ghaunadaur", S_BLOB,//24
|
||||
LVL(20, 15, 0, -15), (G_NOGEN),
|
||||
|
@ -247,7 +247,7 @@ NEARDATA struct permonst mons[] = {
|
|||
SIZ(WT_HUGE, CN_HUGE, MS_CUSS, MZ_HUGE),
|
||||
MR_COLD|MR_ELEC|MR_POISON|MR_ACID|MR_STONE, MR_COLD|MR_ELEC|MR_POISON,
|
||||
MM_AMORPHOUS|MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_OMNIVORE|MT_COLLECT|MT_MAGIC|MT_HOSTILE|MT_TRAITOR /*MT*/, 0 /*MF*/,
|
||||
MB_NOHEAD|MB_ACID|MB_MALE|MB_NOFEET /*MB*/, MG_VSLASH|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MB_NOHEAD|MB_ACID|MB_MALE|MB_NOFEET /*MB*/, MG_RBLUNT|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_NORMAL /*MV*/, HI_LORD),
|
||||
MON("mothering mass", S_BLOB,//24 /*needs encyc entry*/
|
||||
LVL(18, 14, 30, -12), (G_PLANES|G_NOCORPSE|G_NOGEN),
|
||||
|
@ -260,7 +260,7 @@ NEARDATA struct permonst mons[] = {
|
|||
MM_AMORPHOUS|MM_FLY|MM_AMPHIBIOUS|MM_SWIM|MM_WEBRIP /*MM*/, MT_COLLECT|MT_OMNIVORE|MT_STALK /*MT*/, 0 /*MF*/,
|
||||
MB_NOHEAD|MB_CAN_AMULET|MB_ACID|MB_STRONG|MB_FEMALE /*MB*/, MG_NOPOLY|MG_NOWISH|MG_INFRAVISIBLE|MG_NASTY|MG_REGEN|MG_LORD|MG_HATESUNHOLY|MG_TRACKER|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL|MA_MINION|MA_FEY /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_INFRAVISION|MV_LOWLIGHT3 /*MV*/, CLR_BRIGHT_MAGENTA),
|
||||
MON("coiling brawn", S_BLOB,//24
|
||||
MON("coiling brawn", S_BLOB,//24 /*needs encyc entry*/
|
||||
LVL(11, 12, 0, -5), (G_GENO|G_NOGEN),
|
||||
DEF(NAT_AC(5)),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6),
|
||||
|
@ -387,7 +387,7 @@ NEARDATA struct permonst mons[] = {
|
|||
MB_ANIMAL|MB_LONGHEAD|MB_NOHANDS|MB_STRONG /*MB*/, MG_INFRAVISIBLE|MG_TRACKER /*MG*/,
|
||||
MA_ANIMAL /*MA*/, MV_NORMAL|MV_SCENT /*MV*/, CLR_GRAY),
|
||||
MON("werewolf", S_DOG,//
|
||||
LVL(7, 12, 20, -7), (G_NOGEN|G_NOCORPSE),
|
||||
LVL(9, 12, 20, -7), (G_NOGEN|G_NOCORPSE),
|
||||
DEF(DEX_AC(6)),
|
||||
A(ATTK(AT_BITE, AD_WERE, 2, 6)),
|
||||
SIZ(WT_ELF, CN_SMALL, MS_BARK, MZ_MEDIUM), MR_POISON, 0,
|
||||
|
@ -526,7 +526,8 @@ NEARDATA struct permonst mons[] = {
|
|||
DEF(NAT_AC(10), NAT_DR(5)),
|
||||
A(ATTK(AT_NONE, AD_PLYS, 1,5), ATTK(AT_GAZE, AD_STDY, 1,15),
|
||||
ATTK(AT_CLAW, AD_PHYS, 5,2), ATTK(AT_KICK, AD_STUN, 5, 3),
|
||||
ATTK(AT_MAGC, AD_SPEL, 3,4), ATTK(AT_BREA, AD_SLEE, 3, 5)),
|
||||
ATTK(AT_MAGC, AD_SPEL, 3,4), ATTK(AT_BREA, AD_SLEE, 3, 5),
|
||||
ATTK(AT_NONE, AD_GROW, 0,0)),
|
||||
SIZ(1600, 500, MS_SILENT, MZ_HUMAN), MR_SLEEP|MR_POISON|MR_STONE, MR_SLEEP,
|
||||
MM_AMPHIBIOUS|MM_BREATHLESS /*MM*/, MT_MAGIC|MT_GREEDY|MT_JEWELS|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_NOHEAD|MB_NEUTER /*MB*/, MG_INFRAVISIBLE|MG_NOPOLY|MG_NASTY|MG_TRACKER|MG_NOSPELLCOOLDOWN|MG_HATESHOLY|MG_HATESUNHOLY /*MG*/,
|
||||
|
@ -628,6 +629,25 @@ NEARDATA struct permonst mons[] = {
|
|||
MM_FLY|MM_BREATHLESS /*MM*/, MT_STALK|MT_HOSTILE /*MT*/, 0 /*MF*/,
|
||||
MB_UNSOLID|MB_NOEYES|MB_NOLIMBS|MB_NOHEAD|MB_STRONG /*MB*/, MG_RALL|MG_LORD|MG_NASTY|MG_INFRAVISIBLE|MG_REGEN|MG_HATESUNHOLY|MG_NOPOLY|MG_TRACKER /*MG*/,
|
||||
MA_MINION|MA_FEY /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_INFRAVISION|MV_LOWLIGHT3 /*MV*/, CLR_BRIGHT_MAGENTA),
|
||||
MON("aphanactonan audient", S_EYE,// /*Needs encyc entry*//*Needs tile*/
|
||||
LVL(5, 7, 25, 5), (G_NOCORPSE|G_NOGEN),
|
||||
DEF(NAT_AC(5), NAT_DR(5)),
|
||||
A(ATTK(AT_HITS, AD_PERH, 1, 1),
|
||||
ATTK(AT_BOOM, AD_PHYS, 6, 6)),
|
||||
SIZ(WT_MEDIUM, CN_DIMINUTIVE, MS_SILENT, MZ_SMALL), MR_ELEC|MR_DISINT, 0,
|
||||
MM_BREATHLESS|MM_FLY|MM_FLOAT /*MM*/, 0 /*MT*/, 0 /*MF*/,
|
||||
MB_THICK_HIDE|MB_NOHEAD|MB_NEUTER|MB_NOEYES|MB_NOHANDS|MB_NOFEET /*MB*/, MG_NOWISH|MG_NOTAME|MG_RSLASH|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_EARTHSENSE /*MV*/, CLR_GRAY),
|
||||
MON("aphanactonan assessor", S_EYE, //9 /* needs encyc entry */
|
||||
LVL(20, 15, 100, 20), (G_NOCORPSE|G_NOGEN),
|
||||
DEF(NAT_AC(20), NAT_DR(10)),
|
||||
A(ATTK(AT_HITS, AD_PERH, 2, 1), ATTK(AT_HITS, AD_PERH, 2, 1),
|
||||
ATTK(AT_GAZE, AD_STDY, 1, 20), ATTK(AT_GAZE, AD_RGAZ, 4,6),
|
||||
ATTK(AT_NONE, AD_PLYS, 3, 5)),
|
||||
SIZ(WT_HUGE, CN_LARGE, MS_SILENT, MZ_LARGE), MR_ELEC|MR_DISINT, MR_DISINT,
|
||||
MM_BREATHLESS|MM_WEBRIP /*MM*/, MT_HOSTILE|MT_MINDLESS /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_THICK_HIDE|MB_NOHEAD|MB_NEUTER /*MB*/, MG_NOWISH|MG_NOTAME|MG_RSLASH|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS /*MV*/, CLR_ORANGE),
|
||||
/*
|
||||
* felines
|
||||
*/
|
||||
|
@ -1792,7 +1812,7 @@ NEARDATA struct permonst mons[] = {
|
|||
0 /*MM*/, MT_HOSTILE|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_NOHANDS|MB_OVIPAROUS|MB_POIS|MB_STRONG /*MB*/, 0 /*MG*/,
|
||||
MA_ARACHNID /*MA*/, MV_NORMAL /*MV*/, CLR_BRIGHT_MAGENTA),
|
||||
MON("yurian", S_SPIDER,//18 Dweller in the Depths
|
||||
MON("yurian", S_SPIDER,//18 Needs encyc entry
|
||||
LVL(15, 9, 0, -3), G_NOGEN,
|
||||
DEF(NAT_AC(5), SPE_AC(10), NAT_DR(2)),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 8, 2), ATTK(AT_CLAW, AD_PHYS, 4, 2),
|
||||
|
@ -2571,7 +2591,7 @@ then fill new spaces with our spawn!
|
|||
DEF(NAT_AC(5), NAT_DR_LEGS(3), NAT_DR_FEET(3), SPE_DR(3)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
|
||||
ATTK(AT_HUGS, AD_WRAP, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_SONG, MZ_HUMAN), MR_POISON, 0,
|
||||
SIZ(WT_LARGE, 400, MS_SONG, MZ_HUMAN), MR_POISON, 0,
|
||||
MM_FLY /*MM*/, MT_STALK /*MT*/, 0 /*MF*/,
|
||||
MB_POIS|MB_STRONG|MB_FEMALE|MB_HUMANOID|MB_SLITHY|MB_WINGS /*MB*/, MG_NOPOLY|MG_INFRAVISIBLE|MG_NASTY|MG_HATESUNHOLY|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_MINION|MA_REPTILIAN /*MA*/, MV_LOWLIGHT3|MV_INFRAVISION /*MV*/, CLR_BRIGHT_GREEN),
|
||||
|
@ -2675,7 +2695,7 @@ then fill new spaces with our spawn!
|
|||
A(ATTK(AT_SRPR, AD_WET, 3, 8), ATTK(AT_XSPR, AD_WET, 3, 8),
|
||||
ATTK(AT_MSPR, AD_WET, 3, 8), ATTK(AT_MSPR, AD_WET, 3, 8),
|
||||
ATTK(AT_HUGS, AD_WRAP,4, 6)),
|
||||
SIZ(WT_MEDIUM, 350, MS_HUMANOID, MZ_HUMAN),
|
||||
SIZ(WT_LARGE, 350, MS_HUMANOID, MZ_HUMAN),
|
||||
MR_SLEEP|MR_POISON|MR_MAGIC, MR_SLEEP,
|
||||
MM_AMPHIBIOUS|MM_SWIM|MM_AMORPHOUS /*MM*/, MT_COLLECT|MT_OMNIVORE|MT_STALK /*MT*/, MF_MARTIAL_E|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_SLITHY|MB_STRONG /*MB*/, MG_NOPOLY|MG_INFRAVISIBLE|MG_NASTY|MG_LORD|MG_HATESUNHOLY|MG_TRACKER /*MG*/,
|
||||
|
@ -3108,6 +3128,14 @@ then fill new spaces with our spawn!
|
|||
MM_FLY /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG /*MB*/, 0 /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SCENT /*MV*/, CLR_RED),
|
||||
MON("baby deep dragon", S_DRAGON, //6
|
||||
LVL(8, 9, 10, 0), (G_GENO|G_NOGEN),
|
||||
DEF(NAT_AC(10), NAT_DR(4)),
|
||||
A(ATTK(AT_BITE, AD_DRST, 2, 6)),
|
||||
SIZ(500, 500, MS_ROAR, MZ_HUGE), MR_DRAIN, 0,
|
||||
MM_FLY|MM_BREATHLESS|MM_TUNNEL /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG /*MB*/, 0 /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SCENT /*MV*/, CLR_MAGENTA),
|
||||
MON("baby white dragon", S_DRAGON,//5
|
||||
LVL(4, 9, 10, 0), (G_GENO|G_NOGEN),
|
||||
DEF(NAT_AC(8), NAT_DR(2)),
|
||||
|
@ -3156,14 +3184,6 @@ then fill new spaces with our spawn!
|
|||
MM_FLY /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG /*MB*/, 0 /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SCENT /*MV*/, CLR_YELLOW),
|
||||
MON("baby deep dragon", S_DRAGON, //6
|
||||
LVL(8, 9, 10, 0), (G_GENO|G_NOGEN),
|
||||
DEF(NAT_AC(10), NAT_DR(4)),
|
||||
A(ATTK(AT_BITE, AD_DRST, 2, 6)),
|
||||
SIZ(500, 500, MS_ROAR, MZ_HUGE), MR_DRAIN, 0,
|
||||
MM_FLY /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG /*MB*/, 0 /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SCENT /*MV*/, CLR_MAGENTA),
|
||||
MON("gray dragon", S_DRAGON,//23
|
||||
LVL(15, 9, 20, 4), (G_GENO|1),
|
||||
DEF(NAT_AC(14), NAT_DR(5)),
|
||||
|
@ -3204,6 +3224,17 @@ then fill new spaces with our spawn!
|
|||
MM_FLY|MM_WEBRIP /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_MAGIC|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_OVIPAROUS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG|MB_TOSTY /*MB*/, MG_INFRAVISIBLE|MG_NASTY|MG_TRACKER /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_SCENT /*MV*/, CLR_RED),
|
||||
MON("deep dragon", S_DRAGON, //26
|
||||
LVL(22, 9, 20, -6), (G_GENO|1),
|
||||
DEF(NAT_AC(21), NAT_DR(8)),
|
||||
A(ATTK(AT_BREA, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 4, 13),
|
||||
ATTK(AT_CLAW, AD_PHYS, 4, 6), ATTK(AT_CLAW, AD_PHYS, 4, 6),
|
||||
ATTK(AT_TAIL, AD_PHYS, 4, 13)),
|
||||
SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC),
|
||||
MR_DRAIN|MR_POISON|MR_MAGIC, 0,/* gain level */
|
||||
MM_FLY|MM_WEBRIP|MM_BREATHLESS|MM_TUNNEL /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_MAGIC|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG|MB_POIS /*MB*/, MG_NASTY|MG_TRACKER|MG_NOPOLY /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_DARKSIGHT|MV_SEE_INVIS|MV_SCENT /*MV*/, CLR_MAGENTA),
|
||||
MON("white dragon", S_DRAGON,//23
|
||||
LVL(15, 12, 20, -5), (G_GENO|1),
|
||||
DEF(NAT_AC(14), NAT_DR(5)),
|
||||
|
@ -3265,17 +3296,6 @@ then fill new spaces with our spawn!
|
|||
MM_FLY|MM_WEBRIP /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_MAGIC|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_OVIPAROUS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG|MB_ACID /*MB*/, MG_NASTY|MG_TRACKER /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_SCENT /*MV*/, CLR_YELLOW),
|
||||
MON("deep dragon", S_DRAGON, //26
|
||||
LVL(20, 9, 20, -6), (G_GENO|1),
|
||||
DEF(NAT_AC(16), NAT_DR(8)),
|
||||
A(ATTK(AT_BREA, AD_DRLI, 2, 8), ATTK(AT_BITE, AD_DRLI, 2, 10),
|
||||
ATTK(AT_CLAW, AD_PHYS, 3, 6), ATTK(AT_CLAW, AD_PHYS, 3, 6),
|
||||
ATTK(AT_TAIL, AD_PHYS, 4, 10)),
|
||||
SIZ(WT_DRAGON, 1500, MS_ROAR, MZ_GIGANTIC),
|
||||
MR_DRAIN|MR_POISON, 0,/* gain level */
|
||||
MM_FLY|MM_WEBRIP /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_MAGIC|MT_CARNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_OVIPAROUS|MB_NOHANDS|MB_THICK_HIDE|MB_STRONG|MB_POIS /*MB*/, MG_NASTY|MG_TRACKER /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_SCENT /*MV*/, CLR_MAGENTA),
|
||||
MON("tiny pseudodragon", S_DRAGON,//3 /*Needs encyc entry*//*Needs tile*/
|
||||
LVL(2, 15, 0, -5), (G_GENO|G_NOGEN),
|
||||
DEF(NAT_AC(4)),
|
||||
|
@ -4833,6 +4853,14 @@ struct permonst _mons2[] = {
|
|||
MM_FLY|MM_BREATHLESS /*MM*/, MT_STALK|MT_HOSTILE /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS|MB_MALE|MB_STRONG /*MB*/, MG_SANLOSS|MG_INSIGHT|MG_NOPOLY|MG_INFRAVISIBLE|MG_NASTY|MG_LORD|MG_REGEN|MG_HATESSILVER|MG_TRACKER /*MG*/,
|
||||
MA_VAMPIRE|MA_UNDEAD /*MA*/, MV_NORMAL|MV_BLOODSENSE /*MV*/, CLR_MAGENTA),
|
||||
MON("vampire lady", S_VAMPIRE,//14
|
||||
LVL(15, 10, 50, -9), (G_GENO|G_NOCORPSE|1),
|
||||
DEF(NAT_AC(18)),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 5, 12), ATTK(AT_BITE, AD_VAMP, 1, 8)),
|
||||
SIZ(WT_HUMAN*2, CN_HUMAN, MS_VAMPIRE, MZ_LARGE), MR_SLEEP|MR_POISON|MR_COLD, 0,
|
||||
MM_BREATHLESS /*MM*/, MT_STALK|MT_HOSTILE /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS|MB_FEMALE|MB_STRONG /*MB*/, MG_NOPOLY|MG_INFRAVISIBLE|MG_NASTY|MG_LORD|MG_REGEN|MG_HATESSILVER|MG_TRACKER /*MG*/,
|
||||
MA_VAMPIRE|MA_UNDEAD /*MA*/, MV_NORMAL|MV_BLOODSENSE /*MV*/, CLR_BLUE),
|
||||
#if 0 /* DEFERRED */
|
||||
MON("vampire mage", S_VAMPIRE,//
|
||||
LVL(20, 14, 50, -9), (G_GENO|G_NOCORPSE|1),
|
||||
|
@ -5205,7 +5233,7 @@ struct permonst _mons2[] = {
|
|||
SIZ(WT_LARGE, 400, MS_SILENT, MZ_HUMAN),
|
||||
MR_COLD|MR_SLEEP|MR_POISON, 0,
|
||||
MM_BREATHLESS /*MM*/, MT_MINDLESS|MT_STALK|MT_HOSTILE|MT_WAITFORU /*MT*/, MF_MARTIAL_S /*MF*/,
|
||||
MB_POIS /*MB*/, MG_VSLASH /*MG*/,
|
||||
MB_POIS /*MB*/, MG_RBLUNT /*MG*/,
|
||||
MA_UNDEAD|MA_HUMAN /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_BROWN),
|
||||
/*
|
||||
* golems
|
||||
|
@ -5586,28 +5614,12 @@ struct permonst _mons2[] = {
|
|||
#endif /* CONVICT */
|
||||
MON("werejackal", S_HUMAN,//3
|
||||
LVL(2, 12, 10, -7), G_NOGEN,
|
||||
DEF(NAT_AC(0)),
|
||||
DEF(DEX_AC(1)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS /*MB*/, MG_REGEN|MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_WERE|MA_DEMIHUMAN|MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_RED),
|
||||
MON("wererat", S_HUMAN,//3
|
||||
LVL(7, 12, 10, -7), (1),
|
||||
DEF(NAT_AC(0)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS /*MB*/, MG_REGEN|MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_WERE|MA_DEMIHUMAN|MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_BROWN),
|
||||
MON("werewolf", S_HUMAN,//6
|
||||
LVL(7, 12, 20, -7), (1),
|
||||
DEF(NAT_AC(0)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS /*MB*/, MG_REGEN|MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_WERE|MA_DEMIHUMAN|MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_ORANGE),
|
||||
MON("elf", S_HUMAN,//6
|
||||
LVL(1, 12, 2, -3), G_NOGEN, /* for corpses */
|
||||
DEF(NAT_AC(0)),
|
||||
|
@ -5648,6 +5660,14 @@ struct permonst _mons2[] = {
|
|||
0 /*MM*/, MT_COLLECT|MT_OMNIVORE /*MT*/, MF_MARTIAL_B /*MF*/,
|
||||
MB_HUMANOID /*MB*/, MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESIRON|MG_TRACKER /*MG*/,
|
||||
MA_ELF /*MA*/, MV_LOWLIGHT3|MV_SEE_INVIS /*MV*/, CLR_BRIGHT_GREEN),
|
||||
MON("wererat", S_HUMAN,//8
|
||||
LVL(7, 12, 10, -7), (1),
|
||||
DEF(DEX_AC(4)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS /*MB*/, MG_REGEN|MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_WERE|MA_DEMIHUMAN|MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_BROWN),
|
||||
MON("Grey-elf", S_HUMAN,//8
|
||||
LVL(6, 12, 10, -7), (G_GENO|G_SGROUP|2),
|
||||
DEF(DEX_AC(2), SPE_AC(1)),
|
||||
|
@ -5656,6 +5676,14 @@ struct permonst _mons2[] = {
|
|||
0 /*MM*/, MT_COLLECT|MT_OMNIVORE /*MT*/, MF_MARTIAL_B|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID /*MB*/, MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESIRON|MG_TRACKER /*MG*/,
|
||||
MA_ELF /*MA*/, MV_LOWLIGHT3|MV_SEE_INVIS /*MV*/, CLR_GRAY),
|
||||
MON("werewolf", S_HUMAN,//10
|
||||
LVL(9, 12, 20, -7), (1),
|
||||
DEF(DEX_AC(4)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 2, 4)),
|
||||
SIZ(WT_HUMAN, 400, MS_WERE, MZ_HUMAN), MR_POISON, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, 0 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS /*MB*/, MG_REGEN|MG_NOPOLY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_WERE|MA_DEMIHUMAN|MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_ORANGE),
|
||||
MON("hedrow warrior", S_HUMAN,//10 /*Needs encyc entry*/
|
||||
LVL(6, 12, 60, -9), (G_GENO|G_SGROUP|2),
|
||||
DEF(NAT_AC(0)),
|
||||
|
@ -6022,7 +6050,7 @@ struct permonst _mons2[] = {
|
|||
ATTK(AT_OBIT, AD_DRST, 1, 6),
|
||||
ATTK(AT_WDGZ, AD_STON, 0, 0)
|
||||
),
|
||||
SIZ(WT_HUMAN, 400, MS_HISS, MZ_HUMAN),
|
||||
SIZ(WT_LARGE, 800, MS_HISS, MZ_HUMAN),
|
||||
MR_POISON|MR_STONE, MR_POISON|MR_STONE,
|
||||
MM_FLY|MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_HOSTILE|MT_WAITFORU|MT_OMNIVORE /*MT*/, MF_MARTIAL_B /*MF*/,
|
||||
MB_STRONG|MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_NOWISH|MG_PNAME|MG_NOPOLY|MG_INFRAVISIBLE /*MG*/,
|
||||
|
@ -6349,7 +6377,7 @@ is a red right hand
|
|||
ATTK(AT_MARI, AD_PHYS, 1, 15), ATTK(AT_MARI, AD_PHYS, 1, 15),
|
||||
ATTK(AT_MARI, AD_PHYS, 1, 15), ATTK(AT_MARI, AD_PHYS, 1, 15),
|
||||
ATTK(AT_HUGS, AD_WRAP, 4, 6)),
|
||||
SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
|
||||
SIZ(WT_LARGE, 400, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
|
||||
0 /*MM*/, MT_STALK|MT_HOSTILE|MT_COLLECT|MT_TRAITOR /*MT*/, MF_MARTIAL_E|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_STRONG|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_INFRAVISIBLE|MG_NASTY|MG_HATESSILVER|MG_COMMANDER /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION|MV_SEE_INVIS /*MV*/, CLR_CYAN),
|
||||
|
@ -6439,7 +6467,7 @@ is a red right hand
|
|||
MM_AMORPHOUS|MM_SWIM|MM_AMPHIBIOUS /*MM*/,
|
||||
MT_OMNIVORE|MT_STALK|MT_HOSTILE|MT_COLLECT /*MT*/, MF_MARTIAL_S /*MF*/,
|
||||
MB_HUMANOID|MB_NOLIMBS|MB_ACID|MB_NEUTER|MB_POIS|MB_STRONG /*MB*/,
|
||||
MG_NOWISH|MG_NOPOLY|MG_VSLASH|MG_NASTY|MG_REGEN|MG_HATESSILVER|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MG_NOWISH|MG_NOPOLY|MG_RBLUNT|MG_NASTY|MG_REGEN|MG_HATESSILVER|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MA_UNLIVING|MA_DEMON|MA_PRIMORDIAL|MA_ELEMENTAL /*MA*/,
|
||||
MV_EXTRAMISSION|MV_SEE_INVIS|MV_INFRAVISION|MV_OMNI /*MV*/, CLR_BRIGHT_MAGENTA),
|
||||
MON("ancient of the burning wastes", S_DEMON,//23 /* Needs encyc entry */
|
||||
|
@ -6728,7 +6756,7 @@ is a red right hand
|
|||
SIZ(WT_HUGE, 0, MS_GURGLE, MZ_HUGE),
|
||||
MR_FIRE|MR_POISON|MR_ACID|MR_STONE|MR_SICK, 0,
|
||||
MM_AMPHIBIOUS|MM_AMORPHOUS|MM_SWIM /*MM*/, MT_TRAITOR|MT_STALK|MT_HOSTILE|MT_METALLIVORE|MT_WANTSAMUL|MT_WAITFORU|MT_OMNIVORE /*MT*/, 0 /*MF*/,
|
||||
MB_NOHEAD|MB_ACID|MB_POIS|MB_MALE /*MB*/, MG_NOTAME|MG_VSLASH|MG_PNAME|MG_NASTY|MG_LORD|MG_NOPOLY|MG_HATESSILVER|MG_SANLOSS /*MG*/,
|
||||
MB_NOHEAD|MB_ACID|MB_POIS|MB_MALE /*MB*/, MG_NOTAME|MG_RBLUNT|MG_PNAME|MG_NASTY|MG_LORD|MG_NOPOLY|MG_HATESSILVER|MG_SANLOSS /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION|MV_SEE_INVIS /*MV*/, HI_LORD),
|
||||
MON("Zuggtmoy", S_DEMON,//28
|
||||
LVL(50, 8, 65, -15), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ),
|
||||
|
@ -6798,7 +6826,7 @@ is a red right hand
|
|||
ATTK(AT_HUGS, AD_WRAP, 9, 1),
|
||||
ATTK(AT_BREA, AD_GOLD, 3, 9)
|
||||
),
|
||||
SIZ(WT_LARGE, 500, MS_BRIBE, MZ_LARGE), MR_FIRE|MR_POISON|MR_STONE, 0,
|
||||
SIZ(WT_HUGE, 500, MS_BRIBE, MZ_LARGE), MR_FIRE|MR_POISON|MR_STONE, 0,
|
||||
MM_SWIM /*MM*/, MT_STALK|MT_HOSTILE|MT_WAITFORU|MT_WANTSAMUL /*MT*/, MF_MARTIAL_S|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_STRONG|MB_MALE /*MB*/, MG_NOTAME|MG_LORD|MG_NOPOLY|MG_PNAME|MG_NASTY|MG_INFRAVISIBLE|MG_HATESSILVER /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS /*MV*/, HI_LORD),
|
||||
|
@ -6832,7 +6860,7 @@ is a red right hand
|
|||
ATTK(AT_WEAP, AD_PHYS, 4, 10), ATTK(AT_WEAP, AD_PHYS, 4, 10),
|
||||
ATTK(AT_HUGS, AD_WRAP, 8, 6)),
|
||||
/*ATTK(AT_HUGS, AD_WRAP, 8, 6)*/
|
||||
SIZ(WT_LARGE, 400, MS_CUSS, MZ_LARGE), MR_ACID|MR_FIRE|MR_POISON, 0,
|
||||
SIZ(WT_HUGE, 400, MS_CUSS, MZ_LARGE), MR_ACID|MR_FIRE|MR_POISON, 0,
|
||||
0 /*MM*/, MT_STALK|MT_HOSTILE|MT_COLLECT|MT_TRAITOR /*MT*/, MF_MARTIAL_E|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_NOTAME|MG_INFRAVISIBLE|MG_NOPOLY|MG_PNAME|MG_NASTY|MG_PRINCE|MG_HATESSILVER|MG_COMMANDER /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION|MV_SEE_INVIS /*MV*/, HI_LORD),
|
||||
|
@ -9295,7 +9323,7 @@ is a red right hand
|
|||
ATTK(AT_MARI, AD_PHYS, 2, 8), ATTK(AT_MARI, AD_PHYS, 2, 8),
|
||||
ATTK(AT_HUGS, AD_WRAP, 4, 6)),
|
||||
/*ATTK(AT_HUGS, AD_WRAP, 4, 6)*/
|
||||
SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
|
||||
SIZ(WT_LARGE, 400, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
|
||||
0 /*MM*/, MT_STALK|MT_HOSTILE|MT_COLLECT /*MT*/, MF_MARTIAL_S|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_INFRAVISIBLE|MG_NASTY|MG_HATESSILVER /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS /*MV*/, CLR_CYAN),
|
||||
|
@ -10068,17 +10096,17 @@ is a red right hand
|
|||
MB_HUMANOID /*MB*/, MG_NOWISH|MG_NOPOLY|MG_INFRAVISIBLE|MG_SANLOSS /*MG*/,
|
||||
MA_HUMAN /*MA*/, MV_NORMAL|MV_TELEPATHIC /*MV*/, CLR_YELLOW),
|
||||
MON("Stranger", S_HUMAN,//30
|
||||
LVL(60, 15, 70, 14), (G_NOGEN|G_UNIQ),
|
||||
LVL(60, 15, 70, 14), (G_NOGEN|G_UNIQ|G_NOCORPSE),
|
||||
DEF(SPE_AC(3)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 4,10), ATTK(AT_WEAP, AD_PHYS, 4,10),
|
||||
ATTK(AT_CLAW, AD_SQUE, 2, 8), ATTK(AT_CLAW, AD_SAMU, 2, 8),
|
||||
ATTK(AT_MAGC, AD_CLRC, 2, 8), ATTK(AT_MAGC, AD_CLRC, 2, 8)),
|
||||
SIZ(WT_HUMAN, 400, MS_PRIEST, MZ_HUMAN),
|
||||
MR_FIRE|MR_ELEC|MR_SLEEP|MR_POISON|MR_MAGIC|MR_STONE, 0,
|
||||
MR_COLD|MR_ELEC|MR_SLEEP|MR_POISON|MR_MAGIC|MR_STONE, 0,
|
||||
MM_BREATHLESS /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT|MT_MAGIC|MT_WANTSARTI|MT_WANTSAMUL /*MT*/, MF_MARTIAL_S /*MF*/,
|
||||
MB_HUMANOID|MB_STRONG|MB_NEUTER|MB_NOEYES /*MB*/,
|
||||
MG_NOSPELLCOOLDOWN|MG_NOWISH|MG_NOTAME|MG_NOPOLY|MG_PRINCE|MG_NASTY|MG_INFRAVISIBLE /*MG*/,
|
||||
MA_G_O_O|MA_MINION|MA_ET /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS /*MV*/, CLR_YELLOW),
|
||||
MA_G_O_O|MA_MINION|MA_ET /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS|MV_TELEPATHIC /*MV*/, CLR_YELLOW),
|
||||
MON("secret-whisperer", S_VORTEX,//14 /*Needs encyc entry*/
|
||||
LVL(0, 16, 0, 0), G_NOGEN,
|
||||
DEF(NAT_AC(0)),
|
||||
|
@ -10113,7 +10141,7 @@ is a red right hand
|
|||
SIZ(0, 0, MS_SECRETS, MZ_LARGE), MR_POISON, MF_BAB_FULL,
|
||||
MM_FLY|MM_BREATHLESS|MM_WEBRIP /*MM*/, MT_HOSTILE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_TRAITOR /*MT*/, MF_MARTIAL_B /*MF*/,
|
||||
MB_HUMANOID /*MB*/, MG_REGEN|MG_NOWISH|MG_NOPOLY|MG_NOSPELLCOOLDOWN|MG_NASTY|MG_INFRAVISIBLE|MG_SANLOSS|MG_INSIGHT /*MG*/,
|
||||
MA_PRIMORDIAL /*MA*/, MV_EXTRAMISSION|MV_DETECTION|MV_OMNI|MV_RLYEHIAN|MV_SEE_INVIS|MV_TELEPATHIC /*MV*/, CLR_BRIGHT_CYAN),
|
||||
MA_PRIMORDIAL /*MA*/, MV_EXTRAMISSION|MV_DETECTION|MV_OMNI|MV_SEE_INVIS|MV_TELEPATHIC /*MV*/, CLR_BRIGHT_CYAN),
|
||||
MON("servant", S_HUMAN,//7 /*Needs encyc entry*/
|
||||
LVL(5, 12, 10, 3), G_NOGEN,
|
||||
DEF(NAT_AC(0)),
|
||||
|
|
|
@ -269,7 +269,8 @@ int *weapon, *secweapon, *rweapon, *rwammo, *armor, *shirt, *cloak, *helm, *boot
|
|||
break;
|
||||
case PM_MADMAN:
|
||||
if(special){
|
||||
*weapon = RAKUYO_SABER;
|
||||
*weapon = RAKUYO;
|
||||
*shield = ROUNDSHIELD;
|
||||
*armor = GENTLEMAN_S_SUIT;
|
||||
*shirt = RUFFLED_SHIRT;
|
||||
*cloak = find_opera_cloak();
|
||||
|
@ -279,7 +280,8 @@ int *weapon, *secweapon, *rweapon, *rwammo, *armor, *shirt, *cloak, *helm, *boot
|
|||
}
|
||||
case PM_MADWOMAN:
|
||||
if(special){
|
||||
*weapon = RAKUYO_DAGGER;
|
||||
*weapon = BLADE_OF_GRACE;
|
||||
*secweapon = BLADE_OF_PITY;
|
||||
*armor = GENTLEWOMAN_S_DRESS;
|
||||
*shirt = VICTORIAN_UNDERWEAR;
|
||||
*cloak = ALCHEMY_SMOCK;
|
||||
|
@ -289,7 +291,7 @@ int *weapon, *secweapon, *rweapon, *rwammo, *armor, *shirt, *cloak, *helm, *boot
|
|||
}
|
||||
//Else
|
||||
if (rn2(4)) *weapon = KNIFE;
|
||||
else if(rn2(3)) *weapon = STILETTO;
|
||||
else if(rn2(3)) *weapon = AXE;
|
||||
else *weapon = BULLWHIP;
|
||||
*armor = STRAITJACKET;
|
||||
break;
|
||||
|
|
|
@ -1584,9 +1584,9 @@ do_pit: chasm = maketrap(x,y,PIT);
|
|||
if(!cansee(x,y) || mon)
|
||||
pline("%s is %sed!",
|
||||
cansee(x,y) ? "It" : Monnam(mtmp),
|
||||
nonliving(mtmp->data) ? "destroy" : "kill");
|
||||
banish_kill(mtmp->mtyp) ? "banish" : nonliving(mtmp->data) ? "destroy" : "kill");
|
||||
else {
|
||||
You("%s %s!", nonliving(mtmp->data) ? "destroy" :
|
||||
You("%s %s!", banish_kill(mtmp->mtyp) ? "banish" : nonliving(mtmp->data) ? "destroy" :
|
||||
"kill", mtmp->mtame ?
|
||||
x_monnam(mtmp, ARTICLE_THE, "poor",
|
||||
M_HAS_NAME(mtmp) ? SUPPRESS_SADDLE : 0, FALSE):
|
||||
|
|
156
src/objects.c
156
src/objects.c
|
@ -197,7 +197,7 @@ WEAPON(("dart"),
|
|||
WEAPON(("shuriken", "throwing star"),
|
||||
DMG(D(8)), DMG(D(6)),
|
||||
0, 1, MZ_TINY, 33, 1, 5, 2, P|S, -P_SHURIKEN, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("boomerang"),
|
||||
WEAPON(("boomerang"), /*Needs encyc entry*/
|
||||
DMG(D(9)), DMG(D(9)),
|
||||
1, 1, MZ_SMALL, 13, 5, 20, 0, B, -P_BOOMERANG, WOOD, FALSE, HI_WOOD),
|
||||
WEAPON(("chakram", "circular blade"), /*Needs encyc entry*//*Needs tile*/
|
||||
|
@ -295,7 +295,7 @@ WEAPON(("moon axe", "two-handed axe"), /*Needs encyc entry*//*Needs tile*/
|
|||
/* swords */
|
||||
WEAPON(("short sword"),
|
||||
DMG(D(6)), DMG(D(8)),
|
||||
1, 0, MZ_SMALL, 8, 30, 10, 0, P, P_SHORT_SWORD, IRON, FALSE, HI_METAL),
|
||||
1, 0, MZ_SMALL, 7, 30, 10, 0, P, P_SHORT_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("elven short sword", "runed short sword"),
|
||||
DMG(D(7)), DMG(D(7)),
|
||||
0, 0, MZ_SMALL, 2, 10, 10, 2, P, P_SHORT_SWORD, WOOD, FALSE, HI_WOOD),
|
||||
|
@ -308,32 +308,41 @@ WEAPON(("orcish short sword", "crude short sword"),
|
|||
WEAPON(("dwarvish short sword", "broad short sword"),
|
||||
DMG(D(8)), DMG(D(7)),
|
||||
0, 0, MZ_SMALL, 2, 35, 10, 0, P|S, P_SHORT_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("mirrorblade", "polished short sword"),
|
||||
WEAPON(("mirrorblade", "polished short sword"), /*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(8)),
|
||||
0, 0, MZ_SMALL, 0, 40,100, 0, P, P_SHORT_SWORD, SILVER, FALSE, HI_SILVER),
|
||||
WEAPON(("khopesh", "sickle-sword"),
|
||||
WEAPON(("khopesh", "sickle-sword"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(6)),
|
||||
0, 0, MZ_SMALL, 0, 30, 10, 0, S, P_SHORT_SWORD, COPPER, FALSE, HI_COPPER),
|
||||
WEAPON(("wakizashi", "samurai short sword"),
|
||||
DMG(D(8)), DMG(D(6)),
|
||||
0, 0, MZ_SMALL, 0, 30, 40, 1, P|S, P_SHORT_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("blade of mercy", "split-bladed short sword"), /*Needs encyc entry*/
|
||||
DMG(D(6), F(1)), DMG(D(8), F(1)),
|
||||
0, 0, MZ_MEDIUM, 1, 33,500, 2, P|S, P_SHORT_SWORD, METAL, FALSE, HI_METAL, O_MAGIC(1)),
|
||||
WEAPON(("blade of grace", "curved short sword"),
|
||||
DMG(D(6)), DMG(D(8)),
|
||||
0, 0, MZ_MEDIUM, 0, 19,400, 2, P|S, P_SHORT_SWORD, METAL, FALSE, HI_METAL, O_MAGIC(1)),
|
||||
WEAPON(("blade of pity", "curved dagger"),
|
||||
DMG(D(4)), DMG(D(6)),
|
||||
0, 0, MZ_SMALL, 0, 14,100, 2, P|S, P_DAGGER, METAL, FALSE, HI_METAL, O_MAGIC(1)),
|
||||
|
||||
WEAPON(("scimitar", "curved sword"),
|
||||
DMG(D(8)), DMG(D(8)),
|
||||
0, 0, MZ_MEDIUM, 14, 40, 15, 0, S, P_SCIMITAR, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("high-elven warsword", "runed curved sword"),
|
||||
WEAPON(("high-elven warsword", "runed curved sword"), /*Needs encyc entry*/
|
||||
DMG(D(10)), DMG(D(10)),
|
||||
0, 0, MZ_MEDIUM, 1, 20,150, 2, S, P_SCIMITAR, MITHRIL, UNIDED, HI_MITHRIL),
|
||||
WEAPON(("rapier"),
|
||||
WEAPON(("rapier"), /*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(4)),
|
||||
1, 0, MZ_MEDIUM, 5, 28, 20, 2, P, P_SABER, METAL, FALSE, HI_METAL),
|
||||
WEAPON(("saber"),
|
||||
DMG(D(8)), DMG(D(8)),
|
||||
1, 0, MZ_MEDIUM, 6, 34, 75, 0, S, P_SABER, SILVER, IDED|UNIDED, HI_SILVER),
|
||||
WEAPON(("crow quill", "feather-etched rapier"),
|
||||
WEAPON(("crow quill", "feather-etched rapier"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(8)),
|
||||
0, 0, MZ_MEDIUM, 0, 34,200, 2, P, P_SABER, METAL, FALSE, HI_METAL),
|
||||
WEAPON(("rakuyo", "double-bladed saber"),
|
||||
WEAPON(("rakuyo", "double-bladed saber"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(8)),
|
||||
0, 0, MZ_MEDIUM, 0, 38,500, 2, P|S, P_SABER, METAL, FALSE, HI_METAL, O_MAGIC(1)),
|
||||
WEAPON(("rakuyo-saber", "latch-pommeled saber"),
|
||||
|
@ -342,22 +351,22 @@ WEAPON(("rakuyo-saber", "latch-pommeled saber"),
|
|||
WEAPON(("rakuyo-dagger", "latch-pommeled dagger"),
|
||||
DMG(D(4)), DMG(D(3)),
|
||||
0, 0, MZ_SMALL, 0, 10,100, 2, P|S, P_DAGGER, METAL, FALSE, HI_METAL, O_MAGIC(1)),
|
||||
WEAPON(("isamusei", "oddly-luminous sword", "razor-thin sword"),
|
||||
WEAPON(("isamusei", "oddly-luminous sword", "razor-thin sword"), /*Needs encyc entry*/
|
||||
DMG(D(12)), DMG(D(8)),
|
||||
0, 0, MZ_MEDIUM, 1, 100,500, 2, S|B, P_BROAD_SWORD, METAL, FALSE, CLR_ORANGE, O_MAGIC(1)),
|
||||
WEAPON(("broadsword"),
|
||||
DMG(D(2, 4)), DMG(D(6), F(1)),
|
||||
1, 0, MZ_LARGE, 8, 70, 10, 0, S, P_BROAD_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("elven broadsword", "runed broadsword"),
|
||||
WEAPON(("elven broadsword", "runed broadsword"), /*Needs encyc entry*/
|
||||
DMG(D(6), D(4)), DMG(D(6), F(2)),
|
||||
0, 0, MZ_LARGE, 4, 20, 10, 2, S, P_BROAD_SWORD, WOOD, FALSE, HI_WOOD),
|
||||
WEAPON(("long sword"),
|
||||
WEAPON(("long sword"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(12)),
|
||||
1, 0, MZ_MEDIUM, 46, 40, 15, 0, S|P, P_LONG_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("crystal sword"), /*Needs encyc entry*//*Needs tile*/
|
||||
DMG(D(2, 8)), DMG(D(2, 12)),
|
||||
1, 0, MZ_LARGE, 2, 120,300, 0, S|P, P_LONG_SWORD, GLASS, FALSE, HI_GLASS),
|
||||
WEAPON(("two-handed sword"),
|
||||
WEAPON(("two-handed sword"), /*Needs encyc entry*/
|
||||
DMG(D(12)), DMG(D(3, 6)),
|
||||
1, 0, MZ_HUGE, 22,150, 50, 0, S, P_TWO_HANDED_SWORD, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("droven greatsword", "two-handed sword"), /*Needs encyc entry*//*Needs tile*/
|
||||
|
@ -385,14 +394,14 @@ WEAPON(("gold-bladed vibrosword", "black and gold sword", "long sword"), /*Needs
|
|||
WEAPON(("red-eyed vibrosword", "blue-glowing sword", "long sword"), /*Needs encyc entry*//*Needs tile*/
|
||||
DMG(D(10)), DMG(D(12)),
|
||||
0, 0, MZ_MEDIUM, 0, 10,8000, 1, P|S, P_LONG_SWORD, PLASTIC, FALSE, CLR_GRAY, O_MAGIC(1)),
|
||||
WEAPON(("white vibrozanbato", "curved white sword", "long curved sword"),
|
||||
WEAPON(("white vibrozanbato", "curved white sword", "long curved sword"), /*Needs encyc entry*/
|
||||
DMG(D(16)), DMG(D(8), D(2,6)),
|
||||
0, 0, MZ_HUGE, 0, 60,16000,2, S, P_TWO_HANDED_SWORD, SILVER, FALSE, CLR_WHITE, O_MAGIC(1)),
|
||||
WEAPON(("gold-bladed vibrozanbato", "curved black and gold sword", "long curved sword"),
|
||||
WEAPON(("gold-bladed vibrozanbato", "curved black and gold sword", "long curved sword"), /*Needs encyc entry*/
|
||||
DMG(D(16)), DMG(D(8), D(2,6)),
|
||||
0, 0, MZ_HUGE, 0, 80,16000,2, S, P_TWO_HANDED_SWORD, GOLD, FALSE, CLR_BLACK, O_MAGIC(1)),
|
||||
|
||||
WEAPON(("double force-blade", "double-bladed weapon"),
|
||||
WEAPON(("double force-blade", "double-bladed weapon"), /*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(4)),
|
||||
0, 0, MZ_HUGE, 0, 40,1000, 2, S, P_QUARTERSTAFF, PLASTIC, FALSE, CLR_RED, O_MAGIC(1)),
|
||||
/* 2x, but slower */
|
||||
|
@ -400,7 +409,7 @@ WEAPON(("force blade", "latch-ended blade"),
|
|||
DMG(D(6)), DMG(D(4)),
|
||||
0, 0, MZ_SMALL, 0, 20,500, 2, S, P_SHORT_SWORD, PLASTIC, FALSE, CLR_RED, O_MAGIC(1)),
|
||||
|
||||
WEAPON(("force sword", "hard segmented sword"),
|
||||
WEAPON(("force sword", "hard segmented sword"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(6)),
|
||||
0, 0, MZ_MEDIUM, 0, 40,1000, 2, P|B, P_BROAD_SWORD, PLASTIC, FALSE, HI_SILVER, O_MAGIC(1)),
|
||||
WEAPON(("force whip", "segmented whip"),
|
||||
|
@ -499,10 +508,10 @@ WEAPON(("club"),
|
|||
WEAPON(("clawed hand"),
|
||||
DMG(D(12)), DMG(D(6)),
|
||||
1, 0, MZ_MEDIUM, 0, 10, 300, 0, P|S, P_CLUB, BONE, FALSE, CLR_GRAY),
|
||||
WEAPON(("macuahuitl", "obsidian-edged club"),
|
||||
WEAPON(("macuahuitl", "obsidian-edged club"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(6)),
|
||||
0, 0, MZ_MEDIUM, 0, 40, 10, 0, B|S, P_CLUB, WOOD, FALSE, HI_WOOD),
|
||||
WEAPON(("breaking wheel", "wagon wheel"),
|
||||
WEAPON(("breaking wheel", "wagon wheel"), /*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(3)),
|
||||
0, 0, MZ_HUGE, 1, 150, 500, 0, B, P_NONE, WOOD, FALSE, HI_WOOD),
|
||||
WEAPON(("quarterstaff", "staff"),
|
||||
|
@ -511,7 +520,7 @@ WEAPON(("quarterstaff", "staff"),
|
|||
WEAPON(("khakkhara", "monk's staff"), /*Needs encyc entry*//*Needs tile*/
|
||||
DMG(D(6)), DMG(D(4)),
|
||||
0, 0, MZ_HUGE, 2, 80, 50, 0, B|P, P_QUARTERSTAFF, SILVER, IDED, HI_SILVER),
|
||||
WEAPON(("double sword"),
|
||||
WEAPON(("double sword"), /*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(12)),
|
||||
1, 0, MZ_HUGE, 1, 80, 30, 0, S|P, P_QUARTERSTAFF, IRON, FALSE, HI_METAL),
|
||||
WEAPON(("kamerel vajra", "short mace"), /*Needs encyc entry*/
|
||||
|
@ -534,14 +543,14 @@ WEAPON(("nunchaku", "set of chain-sticks"),
|
|||
WEAPON(("bullwhip"),
|
||||
DMG(D(2)), DMG(D(1)),
|
||||
1, 0, MZ_MEDIUM, 5, 10, 4, 0, B, P_WHIP, LEATHER, FALSE, CLR_BROWN),
|
||||
WEAPON(("viperwhip"),
|
||||
WEAPON(("viperwhip"), /*Needs encyc entry*/
|
||||
DMG(D(4)), DMG(D(3)),
|
||||
1, 0, MZ_MEDIUM, 2, 30, 40, 2, P, P_WHIP, SILVER, IDED|UNIDED, HI_SILVER),
|
||||
|
||||
WEAPON(("bestial claw"),
|
||||
WEAPON(("bestial claw"), /*Needs encyc entry*/
|
||||
DMG(D(10)), DMG(D(8)),
|
||||
1, 0, MZ_MEDIUM, 0, 10,100, 0, S|P, P_BARE_HANDED_COMBAT, BONE, FALSE, CLR_WHITE, O_MAGIC(1)),
|
||||
WEAPON(("katar"),
|
||||
WEAPON(("katar"), /*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(4)),
|
||||
1, 0, MZ_SMALL, 5, 5, 4, 0, S|P, P_BARE_HANDED_COMBAT, IRON, FALSE, HI_METAL),
|
||||
|
||||
|
@ -569,9 +578,9 @@ GUN(("handgun", "unfamiliar handgun"), 0, MZ_SMALL, 0, 12, 10
|
|||
GUN(("gun", "unfamiliar gun"), 0, MZ_MEDIUM, 0, 25, 250, 10, 3, -1, WP_BULLET, IRON, P_FIREARM, HI_METAL),/*Needs tile*/
|
||||
GUN(("long gun", "unfamiliar long gun"), 0, MZ_HUGE, 0, 30, 150, 22, -1, 1, WP_BULLET, IRON, P_FIREARM, HI_METAL),/*Needs tile*/
|
||||
GUN(("heavy gun", "unfamiliar heavy gun"), 0, MZ_HUGE, 0, 100, 2000, 20, 8, -4, WP_BULLET, IRON, P_FIREARM, HI_METAL),/*Needs tile*/
|
||||
/*Needs encyc entry*/
|
||||
GUN(("hand blaster", "hard black handmirror", "hard handmirror"), 0, MZ_MEDIUM, 0, 2, 1000, 10, 1, 0,WP_BLASTER, PLASTIC, P_FIREARM, CLR_BLACK, O_MAGIC(1)), /*Needs tile*/
|
||||
GUN(("arm blaster", "hard white bracer", "hard bracer"), 0, MZ_LARGE, 0, 8, 4500, 15, 6, 0,WP_BLASTER, PLASTIC, P_FIREARM, CLR_WHITE, O_MAGIC(1)), /*Needs tile*/
|
||||
/*Needs encyc entry*/
|
||||
GUN(("mass-shadow pistol", "rectangular device"), 0, MZ_MEDIUM, 0, 4, 4500, 10, 1, 0,WP_BLASTER, PLASTIC, P_FIREARM, CLR_GRAY, O_MAGIC(1)), /*Needs tile*/
|
||||
GUN(("cutting laser","hard tan lozenge", "hard lozenge"), 0, MZ_SMALL, 0, 1, 1000, 3, -1, 3,WP_BLASTER, PLASTIC, P_FIREARM, CLR_YELLOW, O_MAGIC(1)), /*Needs tile*/
|
||||
GUN(("flamethrower","tank with long tube"), 0, MZ_MEDIUM, 0, 45, 3000, 15, 1, 0, WP_BLASTER, METAL, P_FIREARM, CLR_ORANGE, O_MAGIC(1)), /*Needs tile*/
|
||||
|
@ -615,12 +624,16 @@ BULLET(("laser beam", "green bolt", "bolt"),
|
|||
|
||||
/* bows */
|
||||
BOW(("bow"), 1, MZ_LARGE, 24, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
|
||||
/*Needs encyc entry*/
|
||||
BOW(("elven bow", "runed bow"), 0, MZ_LARGE, 12, 20, 60, 2, WOOD, P_BOW, HI_WOOD),
|
||||
/*Needs encyc entry*/
|
||||
BOW(("orcish bow", "crude bow"), 0, MZ_LARGE, 12, 30, 60, -2, WOOD, P_BOW, CLR_BLACK),
|
||||
BOW(("yumi", "long bow"), 0, MZ_LARGE, 0, 30, 60, 0, WOOD, P_BOW, HI_WOOD),
|
||||
BOW(("sling"), 1, MZ_MEDIUM, 40, 3, 20, -1, LEATHER, P_SLING, HI_LEATHER),
|
||||
BOW(("crossbow"), 1, MZ_LARGE, 45, 50, 40, 1, WOOD, P_CROSSBOW, HI_WOOD),
|
||||
/*Needs encyc entry*/
|
||||
BOW(("droven crossbow", "spider-emblemed crossbow"), 0, MZ_LARGE, 0, 50, 120, 4, SILVER, P_CROSSBOW, CLR_BLACK), /*Needs encyc entry*/
|
||||
/*Needs encyc entry, see aklys*/
|
||||
BOW(("atlatl", "notched stick"), 0, MZ_MEDIUM, 0, 12, 30, 0, WOOD, P_SPEAR, HI_WOOD), /*Needs encyc entry*/
|
||||
|
||||
#undef WEAPON
|
||||
|
@ -692,7 +705,7 @@ HELM(("high-elven helm", "runed helm"), /*Needs encyc entry*//*Needs tile*/
|
|||
HELM(("droven helm", "spider-shaped helm"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, 0, 0, 1, 20, 5, 8, 4, 0, SHADOWSTEEL, CLR_BLACK),
|
||||
HELM(("plasteel helm", "white skull helm", "skull helm"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, 1, 0, 2, 25, 50, 8, 5, 2, PLASTIC, CLR_WHITE, O_POWER(INFRAVISION)),
|
||||
0, 1, 0, 2, 25, 50, 7, 4, 2, PLASTIC, CLR_WHITE, O_POWER(INFRAVISION)),
|
||||
HELM(("crystal helm", "fish bowl"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, 0, 0, 2,150, 300, 8, 5, 0, GLASS, HI_GLASS, O_MATSPEC(UNIDED)),
|
||||
HELM(("pontiff's crown", "filigreed faceless helm"), /*Needs encyc entry*//*Needs tile*/
|
||||
|
@ -731,6 +744,7 @@ DRGN_MAIL(("gray dragon scale mail"), 1, 1200, 7, 5, CLR_GRAY, O_POWE
|
|||
DRGN_MAIL(("silver dragon scale mail"), 1, 1200, 7, 5, DRAGON_SILVER, O_POWER(REFLECTING)),
|
||||
DRGN_MAIL(("shimmering dragon scale mail"), 1, 1200, 7, 5, CLR_CYAN, O_POWER(DISPLACED, SEE_INVIS)),
|
||||
DRGN_MAIL(("red dragon scale mail"), 1, 900, 7, 5, CLR_RED, O_POWER(FIRE_RES, FLYING)),
|
||||
DRGN_MAIL(("deep dragon scale mail"), 1, 1200, 7, 8, CLR_MAGENTA, O_POWER(DRAIN_RES, UNCHANGING)),
|
||||
DRGN_MAIL(("white dragon scale mail"), 1, 900, 7, 5, CLR_WHITE, O_POWER(COLD_RES, MAGICAL_BREATHING, SWIMMING, WATERPROOF)),
|
||||
DRGN_MAIL(("orange dragon scale mail"), 1, 900, 7, 5, CLR_ORANGE, O_POWER(FREE_ACTION, SLEEP_RES, HALLUC_RES)),
|
||||
DRGN_MAIL(("black dragon scale mail"), 1, 1200, 7, 5, CLR_BLACK, O_POWER(DISINT_RES, DRAIN_RES)),
|
||||
|
@ -748,6 +762,7 @@ DRGN_SCALES(("gray dragon scales"), 1, 700, 9, 2, CLR_GRAY, O_POWER(A
|
|||
DRGN_SCALES(("silver dragon scales"), 1, 700, 9, 2, DRAGON_SILVER, O_POWER(REFLECTING)),
|
||||
DRGN_SCALES(("shimmering dragon scales"), 1, 700, 9, 2, CLR_CYAN, O_POWER(DISPLACED, SEE_INVIS)),
|
||||
DRGN_SCALES(("red dragon scales"), 1, 500, 9, 2, CLR_RED, O_POWER(FIRE_RES, FLYING)),
|
||||
DRGN_SCALES(("deep dragon scales"), 1, 500, 9, 4, CLR_MAGENTA, O_POWER(DRAIN_RES, UNCHANGING)),
|
||||
DRGN_SCALES(("white dragon scales"), 1, 500, 9, 2, CLR_WHITE, O_POWER(COLD_RES, MAGICAL_BREATHING, SWIMMING, WATERPROOF)),
|
||||
DRGN_SCALES(("orange dragon scales"), 1, 500, 9, 2, CLR_ORANGE, O_POWER(FREE_ACTION, SLEEP_RES, HALLUC_RES)),
|
||||
DRGN_SCALES(("black dragon scales"), 1, 700, 9, 2, CLR_BLACK, O_POWER(DISINT_RES, DRAIN_RES)),
|
||||
|
@ -788,7 +803,7 @@ SUIT(("harmonium scale mail", "red-lacquered spiked scale mail", "spiked scale m
|
|||
SUIT(("power armor", "strange metal armor", "armored suit"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, 0, MZ_HUGE, ARMSZ_HEAVY, 0, 3, 500, 5000, 7, 3, 3, METAL, CLR_MAGENTA),
|
||||
SUIT(("plasteel armor", "hard white armor", "armor"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, 0, MZ_HUGE, ARMSZ_MEDIUM, 0, 5, 100, 500, 7, 3, 3, PLASTIC, CLR_WHITE),
|
||||
0, 0, MZ_HUGE, ARMSZ_MEDIUM, 0, 5, 100, 500, 5, 5, 3, PLASTIC, CLR_WHITE),
|
||||
// ARMOR(("force armor", "gemstone-adorned clothing"), /* out of date structure -- rewrite if adding */
|
||||
// 0, 0, 1, 0, 0, 5, 50, 1000, 9, 3, ARM_SUIT, GEMSTONE, CLR_BRIGHT_GREEN),
|
||||
SUIT(("splint mail"),
|
||||
|
@ -933,6 +948,7 @@ DRGN_SHIELD(("gray dragon scale shield"), 1, 1200, 7, 0, CLR_GRAY, O_
|
|||
DRGN_SHIELD(("silver dragon scale shield"), 1, 1200, 7, 0, DRAGON_SILVER, O_POWER(REFLECTING)),
|
||||
DRGN_SHIELD(("shimmering dragon scale shield"), 1, 1200, 7, 0, CLR_CYAN, O_POWER(DISPLACED, SEE_INVIS)),
|
||||
DRGN_SHIELD(("red dragon scale shield"), 1, 900, 7, 0, CLR_RED, O_POWER(FIRE_RES, FLYING)),
|
||||
DRGN_SHIELD(("deep dragon scale shield"), 1, 1200, 6, 0, CLR_MAGENTA, O_POWER(DRAIN_RES, UNCHANGING)),
|
||||
DRGN_SHIELD(("white dragon scale shield"), 1, 900, 7, 0, CLR_WHITE, O_POWER(COLD_RES, MAGICAL_BREATHING, SWIMMING, WATERPROOF)),
|
||||
DRGN_SHIELD(("orange dragon scale shield"), 1, 900, 7, 0, CLR_ORANGE, O_POWER(FREE_ACTION, SLEEP_RES, HALLUC_RES)),
|
||||
DRGN_SHIELD(("black dragon scale shield"), 1, 1200, 7, 0, CLR_BLACK, O_POWER(DISINT_RES, DRAIN_RES)),
|
||||
|
@ -1108,13 +1124,16 @@ CONTAINER(("box"), 1, MZ_HUGE, 0, 0, 30, 350, 8, WOOD, HI_WOOD)
|
|||
CONTAINER(("massive stone crate"),
|
||||
1,MZ_GIGANTIC,0, 0, 0,6000, 80, MINERAL,HI_MINERAL),/*Needs tile*/
|
||||
CONTAINER(("chest"), 1, MZ_HUGE, 0, 0, 30, 600, 16, WOOD, HI_WOOD),
|
||||
CONTAINER(("magic chest", "big chest with 10 keyholes"),
|
||||
CONTAINER(("magic chest", "big chest with 10 keyholes"), /*Needs encyc entry*/
|
||||
0,MZ_GIGANTIC,1, 0, 15,1001,7000, METAL, CLR_BRIGHT_MAGENTA),/*Needs tile*/
|
||||
/*Needs encyc entry*/
|
||||
CONTAINER(("writing desk"), 1, MZ_HUGE, 0, 0, 0, 600, 16, WOOD, HI_WOOD),
|
||||
/*Needs encyc entry*/
|
||||
CONTAINER(("ice box"), 1, MZ_HUGE, 0, 0, 5, 250, 42, PLASTIC, CLR_WHITE),
|
||||
CONTAINER(("sack", "bag"), 0, MZ_MEDIUM, 0, 0, 20, 15, 2, CLOTH, HI_CLOTH),
|
||||
CONTAINER(("oilskin sack", "bag"), 0, MZ_MEDIUM, 0, 0, 20, 15, 100, CLOTH, HI_CLOTH),
|
||||
CONTAINER(("bag of holding", "bag"), 0, MZ_MEDIUM, 1, 0, 20, 15, 100, CLOTH, HI_CLOTH),
|
||||
/*Needs encyc entry*/
|
||||
CONTAINER(("bag of tricks", "bag"), 0, MZ_MEDIUM, 1, 1, 20, 15, 100, CLOTH, HI_CLOTH),
|
||||
#define HOSTAGE(names,kn,mgc,chg,prob,ntrtn,wt,cost,mat,color,...) \
|
||||
OBJECT( names, \
|
||||
|
@ -1131,14 +1150,16 @@ TOOL(("skeleton key", "key"), 0, MZ_TINY, 0, 0, 0, 80, 3, 10,
|
|||
TOOL(("universal key", "key"), 0, MZ_TINY, 0, 0, 0, 0, 3, 10, SILVER, HI_SILVER, O_MATSPEC(UNIDED)),
|
||||
#ifdef TOURIST
|
||||
TOOL(("lock pick"), 1, MZ_TINY, 0, 0, 0, 60, 4, 20, IRON, HI_METAL),
|
||||
/*Needs encyc entry*/
|
||||
TOOL(("credit card"), 1, MZ_TINY, 0, 0, 0, 0, 1, 10, PLASTIC, CLR_WHITE),
|
||||
#else
|
||||
/*Needs encyc entry*/
|
||||
TOOL(("lock pick"), 1, MZ_TINY, 0, 0, 0, 60, 4, 20, IRON, HI_METAL),
|
||||
#endif
|
||||
/* light sources */
|
||||
TOOL(("tallow candle", "candle"), 0, MZ_TINY, 1, 0, 0, 15, 2, 10, WAX, CLR_WHITE),
|
||||
TOOL(("wax candle", "candle"), 0, MZ_TINY, 1, 0, 0, 5, 2, 20, WAX, CLR_WHITE),
|
||||
TOOL(("candle of invocation", "runed candle"),
|
||||
TOOL(("candle of invocation", "runed candle"), /*Needs encyc entry*/
|
||||
0, MZ_TINY, 0, 1, 0, 15, 2, 50, WAX, CLR_ORANGE, O_NOWISH(1)),
|
||||
TOOL(("lantern"), 1, MZ_SMALL, 0, 0, 0, 20, 30, 12, COPPER, CLR_YELLOW, O_MATSPEC(IDED|UNIDED)),
|
||||
TOOL(("oil lamp", "lamp"), 0, MZ_SMALL, 0, 0, 0, 30, 20, 10, COPPER, CLR_YELLOW),
|
||||
|
@ -1155,9 +1176,9 @@ TOOL(("mirror", "looking glass"), 0, MZ_TINY, 0, 0, 0, 60, 13, 10, GLASS, HI
|
|||
#endif
|
||||
TOOL(("crystal ball", "glass orb"),
|
||||
0, MZ_SMALL, 0, 1, 1, 15, 50, 200, GLASS, HI_GLASS),
|
||||
TOOL(("misotheistic pyramid", "black-stone pyramid"),
|
||||
TOOL(("misotheistic pyramid", "black-stone pyramid"), /*Needs encyc entry*/
|
||||
0, MZ_TINY, 1, 1, 0, 0, 1, 200, OBSIDIAN_MT, CLR_BLACK),
|
||||
TOOL(("misotheistic fragment", "shattered mirrored pyramid"),
|
||||
TOOL(("misotheistic fragment", "shattered mirrored pyramid"),/*Needs encyc entry*/
|
||||
0, MZ_TINY, 1, 1, 0, 0, 1, 200, GLASS, HI_SILVER),
|
||||
TOOL(("dimensional lock", "cerulean-willow-engraved disk", "disk"),
|
||||
0, MZ_SMALL, 1, 1, 0, 0, 10,2000, MINERAL, CLR_BRIGHT_BLUE),
|
||||
|
@ -1174,13 +1195,13 @@ TOOL(("hypospray ampule", "hard gray bottle", "hard bottle"), /*Needs encyc entr
|
|||
TOOL(("mask"), 1, MZ_SMALL, 0, 0, 0, 10, 10, 80, LEATHER, CLR_WHITE),
|
||||
TOOL(("R'lyehian faceplate", "ebon pane"), /*Needs tile*/
|
||||
0, MZ_SMALL, 0, 1, 0, 0, 15, 200, GLASS, CLR_BLACK, O_POWER(POISON_RES, WATERPROOF)),
|
||||
TOOL(("living mask", "gilled jellyfish"),
|
||||
TOOL(("living mask", "gilled jellyfish"), /*Needs encyc entry*/
|
||||
0, MZ_SMALL, 0, 1, 0, 0, 5, 200, FLESH, CLR_BLUE, O_POWER(MAGICAL_BREATHING)),
|
||||
TOOL(("lenses"), 1, MZ_TINY, 0, 0, 0, 5, 3, 80, GLASS, HI_GLASS), /*Needs encyc entry*/
|
||||
TOOL(("sunglasses", "mirrored lenses"),
|
||||
TOOL(("sunglasses", "mirrored lenses"),/*Needs encyc entry*/
|
||||
0, MZ_TINY, 0, 0, 0, 0, 3, 240, GLASS, CLR_BROWN, O_POWER(BLIND_RES)), /*Needs encyc entry*/
|
||||
TOOL(("blindfold"), 1, MZ_TINY, 0, 0, 0, 45, 2, 20, CLOTH, CLR_GRAY),
|
||||
TOOL(("android visor", "black blindfold", "blindfold"),
|
||||
TOOL(("android visor", "black blindfold", "blindfold"), /*Needs encyc entry*/
|
||||
0, MZ_TINY, 0, 0, 0, 0, 2, 40, CLOTH, CLR_BLACK),
|
||||
TOOL(("towel"), 1, MZ_TINY, 0, 0, 0, 45, 2, 50, CLOTH, CLR_MAGENTA),
|
||||
#ifdef STEED
|
||||
|
@ -1189,14 +1210,15 @@ TOOL(("leash"), 1, MZ_SMALL, 0, 0, 0, 60, 12, 20, LEATHER, HI_LEATHER)
|
|||
#else
|
||||
TOOL(("leash"), 1, MZ_SMALL, 0, 0, 0, 65, 12, 20, LEATHER, HI_LEATHER),
|
||||
#endif
|
||||
/*Needs encyc entry*/
|
||||
TOOL(("stethoscope"), 1, MZ_SMALL, 0, 0, 0, 25, 4, 75, IRON, HI_METAL),
|
||||
TOOL(("tinning kit"), 1, MZ_MEDIUM, 0, 0, 1, 15,100, 30, IRON, HI_METAL),
|
||||
TOOL(("bullet fabber", "white box with a yellow fiddly bit", "fiddly box"),/*Needs tile*/
|
||||
TOOL(("bullet fabber", "white box with a yellow fiddly bit", "fiddly box"),/*Needs tile*/ /*Needs encyc entry*/
|
||||
0, MZ_MEDIUM, 0, 1, 0, 0, 20, 30, PLASTIC, CLR_WHITE),
|
||||
TOOL(("upgrade kit"), 1, MZ_MEDIUM, 0, 0, 0, 40,100, 30, COPPER, HI_COPPER),/*Needs encyc entry*//*Needs tile*/
|
||||
TOOL(("power pack", "little white cube", "little cube"), /*Needs encyc entry*//*Needs tile*/
|
||||
0, MZ_TINY, 1, 1, 0, 0, 1, 300, PLASTIC, CLR_WHITE),
|
||||
TOOL(("trephination kit"),
|
||||
TOOL(("trephination kit"), /*Needs encyc entry*/
|
||||
1, MZ_MEDIUM, 0, 0, 1, 5, 10, 30, METAL, HI_METAL),/*Needs encyc entry*//*Needs tile*/
|
||||
TOOL(("tin opener"), 1, MZ_TINY, 0, 0, 0, 20, 4, 30, IRON, HI_METAL),
|
||||
TOOL(("can of grease"),1, MZ_SMALL, 0, 0, 1, 15, 15, 20, IRON, HI_METAL),
|
||||
|
@ -1206,7 +1228,7 @@ TOOL(("effigy", (char *)0), 1, MZ_TINY, 1, 1, 0, 20, 5, 80, LEATHER,
|
|||
|
||||
#define DOLL(names, color) \
|
||||
TOOL(DEF_BLINDNAME(names, "doll"), 0, MZ_TINY, 1, 1, 0, 0, 1, 80, CLOTH, color)
|
||||
|
||||
/*Needs encyc entry*/
|
||||
DOLL(("doll of jumping", "Pole-vaulter doll"), CLR_BLUE),
|
||||
DOLL(("doll of friendship", "Bard doll"), CLR_BRIGHT_GREEN),
|
||||
DOLL(("doll of chastity", "Priest doll"), CLR_WHITE),
|
||||
|
@ -1225,14 +1247,14 @@ DOLL(("doll of mollification", "High priest doll"), HI_GOLD),
|
|||
DOLL(("doll of clear-thinking", "Madman doll"), CLR_GRAY),
|
||||
DOLL(("doll of mind-blasting", "Squid-parasitized doll"), CLR_MAGENTA),
|
||||
#undef DOLL
|
||||
TOOL(("doll's tear", "milky gemstone", "gem"),
|
||||
TOOL(("doll's tear", "milky gemstone", "gem"),/*Needs encyc entry*/
|
||||
0, MZ_TINY, 0, 1, 0, 0, 1,8000, GEMSTONE, CLR_WHITE),
|
||||
TOOL(("holy symbol of the black mother", "tarnished triple goat-head"),
|
||||
TOOL(("holy symbol of the black mother", "tarnished triple goat-head"), /*Needs encyc entry*/
|
||||
0, MZ_TINY, 0, 1, 0, 0, 50,8000, SILVER, CLR_BLACK),
|
||||
TOOL(("magic marker"), 1, MZ_TINY, 0, 1, 1, 15, 2, 50, PLASTIC, CLR_RED),
|
||||
/* traps */
|
||||
TOOL(("land mine",(char *)0), 1, MZ_LARGE, 0, 0, 0, 0,300, 180, IRON, CLR_RED),
|
||||
TOOL(("beartrap"), 1, MZ_LARGE, 0, 0, 0, 0,100, 60, IRON, HI_METAL),
|
||||
TOOL(("beartrap"), 1, MZ_LARGE, 0, 0, 0, 0,100, 60, IRON, HI_METAL),/*Needs encyc entry*/
|
||||
WEPTOOL(("hook"),
|
||||
DMG(D(6)), DMG(D(6)),
|
||||
1, MZ_LARGE, 0, 0, 0, 80, 50, 0, P, P_PICK_AXE, CHITIN, CLR_GREEN, O_MATSPEC(IDED|UNIDED)),
|
||||
|
@ -1263,19 +1285,22 @@ TOOL(("drum of earthquake", "drum"), 0, MZ_MEDIUM, 0, 1, 1, 2, 25, 25, LEATHER,
|
|||
WEPTOOL(("pick-axe"),
|
||||
DMG(D(6)), DMG(D(3)),
|
||||
1, MZ_LARGE, 0, 0, 20, 80, 50, 0, P, P_PICK_AXE, IRON, HI_METAL),
|
||||
WEPTOOL(("seismic hammer", "dull metallic hammer"),
|
||||
WEPTOOL(("seismic hammer", "dull metallic hammer"),/*Needs encyc entry*/
|
||||
DMG(D(12)), DMG(D(10)),
|
||||
0, MZ_HUGE, 1, 1, 0,150, 250, -5, B, P_HAMMER, METAL, HI_METAL),
|
||||
/*
|
||||
* Torches work as clubs
|
||||
*/
|
||||
WEPTOOL(("torch"),
|
||||
WEPTOOL(("torch"),/*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(3)),
|
||||
1, MZ_SMALL, 0, 0, 15, 10, 5, 0, B, P_CLUB, WOOD, HI_WOOD),
|
||||
WEPTOOL(("shadowlander's torch", "black torch", "torch"),
|
||||
WEPTOOL(("magic torch", "torch"),/*Needs encyc entry*/
|
||||
DMG(D(8)), DMG(D(4)),
|
||||
0, MZ_SMALL, 1, 0, 0, 10, 500, 1, B, P_CLUB, BONE, CLR_WHITE, O_MATSPEC(UNIDED)),
|
||||
WEPTOOL(("shadowlander's torch", "black torch", "torch"),/*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(3)),
|
||||
0, MZ_SMALL, 0, 0, 10, 10, 50, 0, B, P_CLUB, WOOD, CLR_BLACK),
|
||||
WEPTOOL(("sunrod", "rod"),
|
||||
WEPTOOL(("sunrod", "rod"),/*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(3)),
|
||||
1, MZ_SMALL, 0, 0, 5, 20, 50, 0, B, P_MACE, GOLD, HI_GOLD, O_MATSPEC(UNIDED)),
|
||||
/*
|
||||
|
@ -1296,7 +1321,7 @@ WEPTOOL(("rod of force", "rod"), /*Needs encyc entry*/
|
|||
WEPTOOL(("grappling hook", "hook"),
|
||||
DMG(D(2)), DMG(D(6)),
|
||||
0, MZ_MEDIUM, 0, 0, 4, 30, 50, 0, B, P_FLAIL, IRON, HI_METAL, O_MATSPEC(UNIDED)),
|
||||
WEPTOOL(("shepherd's crook", "bent staff"),
|
||||
WEPTOOL(("shepherd's crook", "bent staff"),/*Needs encyc entry*/
|
||||
DMG(D(6)), DMG(D(4)),
|
||||
0, MZ_LARGE, 0, 0, 1, 30, 5, 0, B, P_QUARTERSTAFF, WOOD, HI_WOOD),
|
||||
/* 3.4.1: unicorn horn left classified as "magic" */
|
||||
|
@ -1361,6 +1386,7 @@ FOOD(("slime mold"), 75, MZ_TINY, 1, 5, 0, VEGGY, 250, HI_ORGANI
|
|||
|
||||
/* people food */
|
||||
FOOD(("lump of royal jelly"), 0, MZ_TINY, 1, 2, 0, VEGGY, 200, CLR_YELLOW),
|
||||
/*Needs encyc entry*/
|
||||
FOOD(("lump of soldier's jelly"),
|
||||
0, MZ_TINY, 1, 2, 0, VEGGY, 200, CLR_YELLOW),
|
||||
FOOD(("lump of dancer's jelly"),
|
||||
|
@ -1371,6 +1397,7 @@ FOOD(("lump of priestess's jelly"),
|
|||
0, MZ_TINY, 1, 2, 0, VEGGY, 200, CLR_YELLOW),
|
||||
FOOD(("lump of rhetor's jelly"),
|
||||
0, MZ_TINY, 1, 2, 0, VEGGY, 200, CLR_YELLOW),
|
||||
/*Needs encyc entry*/
|
||||
FOOD(("honeycomb"), 0, MZ_TINY, 4, 10, 0, VEGGY, 800, CLR_YELLOW),
|
||||
FOOD(("cream pie"), 25, MZ_TINY, 1, 10, 0, VEGGY, 100, CLR_WHITE),
|
||||
FOOD(("candy bar"), 13, MZ_TINY, 1, 2, 0, VEGGY, 100, CLR_BROWN),
|
||||
|
@ -1469,7 +1496,7 @@ POTION(("blood", "blood-red"), 0, 18, 50, CLR_RED, O_USKWN(1)), /* e
|
|||
#define CERAMIC_TILE(names,prob,...) OBJECT( \
|
||||
DEF_BLINDNAME(names, "shard"), BITS(0,1,0,0,1,0,0,0,MZ_TINY,0,0,0,0,P_NONE,MINERAL, IDED|UNIDED), {0}, \
|
||||
TILE_CLASS, prob, 0, 3, 300, {0}, {0}, 0, 0, 0, 6, CLR_WHITE, __VA_ARGS__)
|
||||
/* Randomized descriptions */
|
||||
/* Randomized descriptions */ /*Needs encyc entry*/
|
||||
CERAMIC_TILE(("syllable of strength: Aesh","bipartite glyph"), 167),
|
||||
CERAMIC_TILE(("syllable of power: Krau", "crossed glyph"), 166),
|
||||
CERAMIC_TILE(("syllable of life: Hoon", "knotted glyph"), 167),
|
||||
|
@ -1480,6 +1507,7 @@ POTION(("blood", "blood-red"), 0, 18, 50, CLR_RED, O_USKWN(1)), /* e
|
|||
#define BONE_TILE(names,prob,...) OBJECT( \
|
||||
DEF_BLINDNAME(names, "shard"), BITS(0,1,0,0,0,0,0,0,MZ_TINY,0,0,0,0,P_NONE,BONE, IDED|UNIDED), {0}, \
|
||||
TILE_CLASS, prob, 0, 3, 300, {0}, {0}, 0, 0, 0, 6, CLR_GRAY, __VA_ARGS__)
|
||||
/*Needs encyc entry*/
|
||||
BONE_TILE(("anti-clockwise metamorphosis glyph", "counterclockwise-rotated cross"), 0), // ANTI_CLOCKWISE_METAMORPHOSIS
|
||||
BONE_TILE(("clockwise metamorphosis glyph", "clockwise-rotated cross"), 0), // CLOCKWISE_METAMORPHOSIS
|
||||
BONE_TILE(("sparkling lake glyph", "sparkling horizontal line"), 0), // ARCANE_BULWARK
|
||||
|
@ -1503,10 +1531,16 @@ POTION(("blood", "blood-red"), 0, 18, 50, CLR_RED, O_USKWN(1)), /* e
|
|||
BONE_TILE(("beast's embrace glyph", "curling beast's claw"), 0), // BEASTS_EMBRACE
|
||||
BONE_TILE(("orrery glyph", "set of nested dotted circles"), 0), // SIGHT
|
||||
#undef BONE_TILE
|
||||
#define GOLD_DISK(names, clr, wt, sz,...) OBJECT( \
|
||||
DEF_BLINDNAME(names, "disk"), BITS(0,0,0,0,0,0,0,1,sz,0,0,0,0,P_NONE,GOLD, UNIDED), {0}, \
|
||||
TILE_CLASS, 0, 0, wt, 0, {0}, {0}, 0, 0, 0, 6, clr, __VA_ARGS__)
|
||||
GOLD_DISK(("aphanactonan record", "disk"), CLR_ORANGE, 80, MZ_MEDIUM),
|
||||
GOLD_DISK(("aphanactonan archive", "disk"), CLR_ORANGE, 800, MZ_LARGE),
|
||||
#undef GOLD_DISK
|
||||
#define METALIC_SLAB(names, clr,...) OBJECT( \
|
||||
DEF_BLINDNAME(names, "slab"), BITS(0,0,0,0,1,0,1,1,MZ_HUGE,0,0,0,0,P_NONE,METAL, IDED|UNIDED), {0}, \
|
||||
TILE_CLASS, 0, 0, 3, 3000, {0}, {0}, 0, 0, 0, 6, clr, __VA_ARGS__)
|
||||
/* Fixed descriptions (also, artifact base-items only) */
|
||||
TILE_CLASS, 0, 0, 300, 3000, {0}, {0}, 0, 0, 0, 6, clr, __VA_ARGS__)
|
||||
/* Fixed descriptions (also, artifact base-items only) *//*Needs encyc entry*/
|
||||
METALIC_SLAB(("First Word", "blinding glyph"), CLR_YELLOW),
|
||||
METALIC_SLAB(("Dividing Word", "cerulean glyph"), HI_ZAP),
|
||||
METALIC_SLAB(("Nurturing Word", "verdant glyph"), CLR_GREEN),
|
||||
|
@ -1705,9 +1739,9 @@ ROCK(("vital soulstone", "gray"),
|
|||
0, 3, 1, 99, 3, 3, 0, 1, 10, 1, MINERAL, CLR_GRAY),
|
||||
ROCK(("spiritual soulstone", "gray"),
|
||||
0, 3, 1, 99, 3, 3, 0, 1, 10, 1, MINERAL, CLR_GRAY),
|
||||
ROCK(("chunk of unrefined mithril", "silvery metal"),
|
||||
ROCK(("chunk of unrefined mithril", "silvery metal"), /*Needs encyc entry*/
|
||||
0, 0, 1, 10000,3,3, 3, 0, 0, 10, MITHRIL, HI_MITHRIL),/*Needs tile*/
|
||||
ROCK(("chunk of fossil dark", "black"),
|
||||
ROCK(("chunk of fossil dark", "black"), /*Needs encyc entry*/
|
||||
0, 0, 25, 500, 8, 8, 4, 1, 0, 1, MINERAL, CLR_BLACK),/*Needs tile*/
|
||||
ROCK(("chunk of salt", "white"),
|
||||
0, 0, 1, 1, 3, 3, 0, 0, 10, 2, SALT, CLR_GRAY), /*Needs tile*/
|
||||
|
@ -1730,17 +1764,17 @@ GEM(("catapsi vortex", "gray-flawed white"), 0, 1, 4500, 15, 6, GEMSTONE, CL
|
|||
//BITS(nmkn,mrg,uskn,ctnr,mgc,chrg,uniq,nwsh,big,tuf,dir,dtyp,sub,mtrl,shwmat)
|
||||
OBJECT(("boulder",(char *)0), BITS(1,0,0,0,0,0,0,0,MZ_GIGANTIC,0,0,0,0,P_NONE,MINERAL,0), {0},
|
||||
ROCK_CLASS, 100, 0, 6000, 0, DMG(D(20)), DMG(D(20)), 0, 0, 0, 2000, HI_MINERAL),
|
||||
OBJECT(("mass of stuff",(char *)0), BITS(1,0,0,0,0,0,0,0,MZ_GIGANTIC,0,0,0,P|B|S,P_NONE,GOLD,0), {0},
|
||||
OBJECT(("mass of stuff",(char *)0), BITS(1,0,0,0,0,0,0,0,MZ_GIGANTIC,0,0,0,P|B|S,P_NONE,GOLD,0), {0}, /*Needs encyc entry*/
|
||||
ROCK_CLASS, 0, 0, 9000, 9999, DMG(D(4,5)), DMG(D(5,4)), 0, 0, 0, 2000, HI_GOLD),
|
||||
OBJECT(("statue"), BITS(1,0,0,1,0,0,0,0, MZ_HUGE,0,0,0,0,P_NONE,MINERAL,0), {0},
|
||||
ROCK_CLASS, 800, 0, 2500, 0, DMG(D(20)), DMG(D(20)), 2, 0, 2, 2500, CLR_WHITE),
|
||||
OBJECT(("fossil"), BITS(1,0,0,0,0,0,0,0, MZ_HUGE,0,0,0,0,P_NONE,MINERAL,0), {0},
|
||||
OBJECT(("fossil"), BITS(1,0,0,0,0,0,0,0, MZ_HUGE,0,0,0,0,P_NONE,MINERAL,0), {0}, /*Needs encyc entry*/
|
||||
ROCK_CLASS, 100, 0, 2500, 0, DMG(D(20)), DMG(D(20)), 0, 0, 0, 2500, CLR_BROWN),
|
||||
OBJECT(("bed"), BITS(1,0,0,0,0,0,0,0,MZ_LARGE,1,0,0,0,P_NONE,WOOD,0), {0},
|
||||
OBJECT(("bed"), BITS(1,0,0,0,0,0,0,0,MZ_LARGE,1,0,0,0,P_NONE,WOOD,0), {0}, /*Needs encyc entry*/
|
||||
BED_CLASS, 900, 0, 2000, 1000, DMG(D(20)), DMG(D(20)), 0, 0, 0, 2000, HI_WOOD),
|
||||
OBJECT(("bedroll"), BITS(1,0,0,0,0,0,0,0,MZ_SMALL,1,0,0,0,P_NONE,CLOTH,0), {0},
|
||||
OBJECT(("bedroll"), BITS(1,0,0,0,0,0,0,0,MZ_SMALL,1,0,0,0,P_NONE,CLOTH,0), {0}, /*Needs encyc entry*/
|
||||
BED_CLASS, 100, 0, 60, 100, DMG(D(2)), DMG(D(2)), 0, 0, 0, 2000, CLR_GREEN),
|
||||
OBJECT(("gurney"), BITS(1,0,0,0,0,0,0,0,MZ_MEDIUM,1,0,0,0,P_NONE,METAL,0), {0},
|
||||
OBJECT(("gurney"), BITS(1,0,0,0,0,0,0,0,MZ_MEDIUM,1,0,0,0,P_NONE,METAL,0), {0}, /*Needs encyc entry*/
|
||||
BED_CLASS, 0, 0, 60, 100, DMG(D(4)), DMG(D(4)), 0, 0, 0, 2000, CLR_WHITE),
|
||||
|
||||
#ifdef CONVICT
|
||||
|
@ -1763,16 +1797,16 @@ CHAIN(("chain"),
|
|||
CHAIN(("sheaf of hay"),
|
||||
DMG(D(1)), DMG(D(1)),
|
||||
100, 20, 2, 0, 0, VEGGY, CLR_YELLOW),
|
||||
CHAIN(("clockwork component"),
|
||||
CHAIN(("clockwork component"), /*Needs encyc entry*/
|
||||
DMG(D(1)), DMG(D(1)),
|
||||
20, 1, 0, 0, B, COPPER, HI_COPPER),
|
||||
CHAIN(("subethaic component"),
|
||||
CHAIN(("subethaic component"), /*Needs encyc entry*/
|
||||
DMG(D(1)), DMG(D(1)),
|
||||
20, 1, 0, 0, B, GLASS, HI_GLASS),
|
||||
CHAIN(("scrap"),
|
||||
CHAIN(("scrap"), /*Needs encyc entry*/
|
||||
DMG(D(1)), DMG(D(1)),
|
||||
20, 1, 0, 0, B, IRON, CLR_BROWN),
|
||||
CHAIN(("hellfire component"),
|
||||
CHAIN(("hellfire component"), /*Needs encyc entry*/
|
||||
DMG(D(1)), DMG(D(1)),
|
||||
20, 1, 0, 0, B, METAL, CLR_ORANGE),
|
||||
|
||||
|
@ -1792,10 +1826,10 @@ CHAINCORPSE(("lifeless doll"), 750, WOOD, CLR_BRIGHT_MAGENTA), /*Needs encyc e
|
|||
#define CHAINROPE(names,dtyp,mat,color,...)\
|
||||
CHAIN(names,DMG(D(4)),DMG(D(4)),200,120,0,0,dtyp,mat,color,O_MERGE(0),__VA_ARGS__)
|
||||
|
||||
CHAINROPE(("rope of entangling"), B, VEGGY, CLR_BROWN),
|
||||
CHAINROPE(("iron bands"), B, IRON, HI_METAL),
|
||||
CHAINROPE(("razor wire"), S, METAL, HI_METAL),
|
||||
CHAINROPE(("shackles"), B, IRON, HI_METAL),
|
||||
CHAINROPE(("rope of entangling"), B, VEGGY, CLR_BROWN), /*Needs encyc entry*/
|
||||
CHAINROPE(("iron bands"), B, IRON, HI_METAL), /*Needs encyc entry*/
|
||||
CHAINROPE(("razor wire"), S, METAL, HI_METAL), /*Needs encyc entry*/
|
||||
CHAINROPE(("shackles"), B, IRON, HI_METAL), /*Needs encyc entry*/
|
||||
|
||||
#undef CHAINROPE
|
||||
|
||||
|
|
40
src/objnam.c
40
src/objnam.c
|
@ -868,7 +868,12 @@ boolean dofull;
|
|||
Strcat(buf, "stale ");
|
||||
#endif
|
||||
}
|
||||
|
||||
break;
|
||||
case TILE_CLASS:
|
||||
if ((obj->otyp == APHANACTONAN_RECORD || obj->otyp == APHANACTONAN_ARCHIVE) && !objects[obj->otyp].oc_name_known){
|
||||
Strcat(buf, "inscribed ");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1366,6 +1371,15 @@ char *buf;
|
|||
else if(u.uinsight >= 5)
|
||||
Strcat(buf, "spinning ");
|
||||
}
|
||||
if (is_mercy_blade(obj)){
|
||||
//Note: Brain fluid
|
||||
if(u.uinsight >= 50)
|
||||
Strcat(buf, "sticky ");
|
||||
if(u.uinsight >= 25)
|
||||
Strcat(buf, "sidereal ");
|
||||
else if(!u.veil)
|
||||
Strcat(buf, "twinkling ");
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1456,11 +1470,13 @@ boolean adjective;
|
|||
case CHITIN:
|
||||
return "chitin";
|
||||
case BONE:
|
||||
return "bone";
|
||||
return obj->otyp == MAGIC_TORCH ? "ivory" : "bone";
|
||||
case SHELL_MAT:
|
||||
return "shell";
|
||||
case DRAGON_HIDE:
|
||||
/* for some reason, this is dragonhide? */
|
||||
/* for some reason, this is dragonhide?
|
||||
* Chris: I used "dragonhide" here to mean "generic special leather"
|
||||
*/
|
||||
if (obj->otyp == LEO_NEMAEUS_HIDE)
|
||||
return "lionhide";
|
||||
if (obj->oartifact == ART_XIUHCOATL)
|
||||
|
@ -1510,7 +1526,9 @@ boolean adjective;
|
|||
case SILVER:
|
||||
return "silver";
|
||||
case GOLD:
|
||||
return (adjective ? "golden" : "gold");
|
||||
if(obj->otyp == APHANACTONAN_RECORD || obj->otyp == APHANACTONAN_ARCHIVE)
|
||||
return (adjective ? "golden-red" : "red gold");
|
||||
else return (adjective ? "golden" : "gold");
|
||||
case PLATINUM:
|
||||
return "platinum";
|
||||
case LEAD:
|
||||
|
@ -1582,7 +1600,7 @@ boolean adjective;
|
|||
break;
|
||||
case OBSIDIAN_MT:
|
||||
return "obsidian";
|
||||
case SALT:
|
||||
case SALT:
|
||||
return "salt";
|
||||
case SHADOWSTEEL:
|
||||
return (adjective ? "shadowsteel" : "corporeal darkness");
|
||||
|
@ -1614,6 +1632,9 @@ char *buf;
|
|||
} else if(obj->oartifact == ART_IBITE_ARM && artilist[obj->oartifact].material && obj->obj_material == artilist[obj->oartifact].material){
|
||||
//Ibite arm descriptor includes "flabby," which is both a material and an appearance :-/
|
||||
return;
|
||||
} else if(obj->oartifact == ART_STAR_OF_HYPERNOTUS && artilist[obj->oartifact].material && obj->obj_material == artilist[obj->oartifact].material){
|
||||
//Star of Hypernotus plays "fast and loose" with the material - and the material affects the final word rather than being a prefix
|
||||
return;
|
||||
} else {
|
||||
/*Special case: circlets should always show their material, but oc_showmat is tied to otyp, not appearance */
|
||||
if (obj->otyp == find_gcirclet())
|
||||
|
@ -1755,7 +1776,8 @@ boolean with_price;
|
|||
if (strstri(oart->desc, "%s")) {
|
||||
getting_obj_base_desc = TRUE;
|
||||
char * buf2 = nextobuf();
|
||||
Sprintf(buf2, oart->desc, xname(obj));
|
||||
if (obj->oartifact == ART_STAR_OF_HYPERNOTUS) Sprintf(buf2, oart->desc, (objects[obj->ovar1].oc_name_known) ? OBJ_NAME(objects[obj->ovar1]) : "stone");
|
||||
else Sprintf(buf2, oart->desc, xname(obj));
|
||||
Strcat(buf, buf2);
|
||||
getting_obj_base_desc = FALSE;
|
||||
}
|
||||
|
@ -1772,7 +1794,7 @@ boolean with_price;
|
|||
static const char standardized[] = { RING_CLASS, AMULET_CLASS, POTION_CLASS, SCROLL_CLASS,
|
||||
SPBOOK_CLASS, WAND_CLASS, GEM_CLASS, TILE_CLASS, 0 };
|
||||
|
||||
if (index(standardized, (char)obj->oclass)) {
|
||||
if (index(standardized, (char)obj->oclass) && obj->otyp != APHANACTONAN_RECORD && obj->otyp != APHANACTONAN_ARCHIVE) {
|
||||
if (!bn)
|
||||
impossible("otyp %d doesn't have a when-blind name, and is assumed to!", typ);
|
||||
if (!obj->dknown) {
|
||||
|
@ -2170,6 +2192,7 @@ weapon:
|
|||
}
|
||||
else if (obj->otyp == SHADOWLANDER_S_TORCH
|
||||
|| obj->otyp == TORCH || obj->otyp == SUNROD
|
||||
|| obj->otyp == MAGIC_TORCH
|
||||
) {
|
||||
if (obj->lamplit)
|
||||
Strcat(buf, " (lit)");
|
||||
|
@ -2248,6 +2271,7 @@ weapon:
|
|||
else if (obj->otyp == OIL_LAMP || obj->otyp == MAGIC_LAMP
|
||||
|| obj->otyp == LANTERN || Is_candle(obj) || obj->otyp == SHADOWLANDER_S_TORCH
|
||||
|| obj->otyp == TORCH || obj->otyp == SUNROD
|
||||
|| obj->otyp == MAGIC_TORCH
|
||||
) {
|
||||
if (obj->lamplit)
|
||||
Strcat(buf, " (lit)");
|
||||
|
@ -4319,7 +4343,7 @@ int wishflags;
|
|||
} else if (!strncmpi(bp, "rustling ", l=9)) {
|
||||
add_oprop_list(oprop_list, OPROP_LESSER_PSIOW);
|
||||
|
||||
} else if ((!strncmpi(bp, "deep ", l=5) && strncmpi(bp, "deep sea", 8)) || !strncmpi(bp, "mumbling ", l=9)) {
|
||||
} else if ((!strncmpi(bp, "deep ", l=5) && strncmpi(bp, "deep sea", 8) && strncmpi(bp, "deep dragon", 11)) || !strncmpi(bp, "mumbling ", l=9)) {
|
||||
add_oprop_list(oprop_list, OPROP_DEEPW);
|
||||
|
||||
} else if (!strncmpi(bp, "sizzling ", l=9)) {
|
||||
|
|
|
@ -2098,6 +2098,7 @@ get_description_of_damage_type(uchar id)
|
|||
case AD_MOON: return "silver moonlight";
|
||||
case AD_HOLY: return "holy energy";
|
||||
case AD_UNHY: return "unholy energy";
|
||||
case AD_PERH: return "level-based damage";
|
||||
default:
|
||||
impossible("bug in get_description_of_damage_type(%d)", id);
|
||||
return "<MISSING DESCRIPTION, THIS IS A BUG>";
|
||||
|
|
|
@ -584,7 +584,7 @@ register struct monst *mtmp;
|
|||
if (mtmp->mstun) Strcat(info, ", stunned");
|
||||
if (mtmp->msleeping) Strcat(info, ", asleep");
|
||||
if (mtmp->mstdy > 0) Sprintf(eos(info), ", weakened (%d)", mtmp->mstdy);
|
||||
if (mtmp->encouraged > 0) Sprintf(eos(info), ", morale (%d)", mtmp->encouraged);
|
||||
if (mtmp->encouraged != 0) Sprintf(eos(info), ", morale (%d)", mtmp->encouraged);
|
||||
else if (mtmp->mstdy < 0) Sprintf(eos(info), ", protected (%d)", mtmp->mstdy);
|
||||
#if 0 /* unfortunately mfrozen covers temporary sleep and being busy
|
||||
(donning armor, for instance) as well as paralysis */
|
||||
|
|
|
@ -3238,6 +3238,7 @@ dodip()
|
|||
}
|
||||
more_dips:
|
||||
|
||||
// Note: magic torches don't burn items (magic. The torch itself is not burned, and it doesn't burn other things. It does burn creatures though!)
|
||||
if((obj->lamplit || potion->lamplit)
|
||||
&& (obj->otyp == TORCH || obj->otyp == SHADOWLANDER_S_TORCH)
|
||||
&& (potion->otyp == POT_OIL)
|
||||
|
|
|
@ -3481,6 +3481,7 @@ struct obj *otmp;
|
|||
You("sink into cool lake water...");
|
||||
You("don't drown. You have achieved the status of Demigod%s!",
|
||||
flags.female ? "dess" : "");
|
||||
give_bokrug_trophy();
|
||||
done(ASCENDED);
|
||||
}
|
||||
//else
|
||||
|
|
146
src/read.c
146
src/read.c
|
@ -37,6 +37,7 @@ static void FDECL(ranged_set_lightsources, (int, int, genericptr_t));
|
|||
static int FDECL(read_tile, (struct obj *));
|
||||
static int FDECL(study_word, (struct obj *));
|
||||
static int NDECL(learn_word);
|
||||
static void FDECL(learn_spell_aphanactonan, (int));
|
||||
|
||||
int
|
||||
doread()
|
||||
|
@ -648,7 +649,7 @@ doread()
|
|||
) {
|
||||
pline(silly_thing_to, "read");
|
||||
return(0);
|
||||
} else if ((Babble || Strangled || Drowning)
|
||||
} else if ((Babble || Strangled || Drowning ||mad_turn(MAD_TOO_BIG))
|
||||
&& (scroll->oclass == SCROLL_CLASS || scroll->oclass == SPBOOK_CLASS || (scroll->oclass == TILE_CLASS && objects[scroll->otyp].oc_magic))
|
||||
){
|
||||
if(Strangled)
|
||||
|
@ -657,6 +658,8 @@ doread()
|
|||
You_cant("read that aloud, you're drowning!");
|
||||
else if(Babble)
|
||||
You_cant("read that aloud, you're babbling incoherently!");
|
||||
else if(mad_turn(MAD_TOO_BIG))
|
||||
pline("It's too big!");
|
||||
else
|
||||
impossible("You can't read that aloud for some reason?");
|
||||
return(0);
|
||||
|
@ -739,7 +742,7 @@ struct obj *scroll;
|
|||
{
|
||||
int duration;
|
||||
long int thought;
|
||||
|
||||
|
||||
if(!scroll->dknown){
|
||||
You("have never seen it!");
|
||||
return 0;
|
||||
|
@ -837,6 +840,87 @@ struct obj *scroll;
|
|||
}
|
||||
u.uvaul_duration += duration;
|
||||
if(!scroll->cursed) u.uvaul++;
|
||||
} else if(scroll->otyp == APHANACTONAN_RECORD){
|
||||
if(Blind){
|
||||
You("can't see the disk.");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
You("study the glyph-inscribed disk.");
|
||||
if(u.veil){
|
||||
You("can't understand what they say.");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
You("can't understand what they say...");
|
||||
pline("Suddenly, the glyphs glow in rainbow hues and escape from the fracturing disk!");
|
||||
pline("Some of the glyphs get trapped in your %s!", (eyecount(youracedata) == 1) ? body_part(EYE) : makeplural(body_part(EYE)));
|
||||
know_random_obj(2 + rn2(3) + rn2(5));
|
||||
change_uinsight(1);
|
||||
}
|
||||
}
|
||||
} else if(scroll->otyp == APHANACTONAN_ARCHIVE){
|
||||
if(Blind){
|
||||
You("can't see the disk.");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
You("study the glyph-inscribed disk.");
|
||||
if(u.veil){
|
||||
You("can't understand what it says.");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
int i;
|
||||
int rolls;
|
||||
boolean seals = FALSE, wards = FALSE, combat = FALSE;
|
||||
You("can't understand what it says...");
|
||||
pline("Suddenly, the glyphs glow in impossible hues and escape from the fracturing disk!");
|
||||
pline("Some of the glyphs get trapped in your %s!", (eyecount(youracedata) == 1) ? body_part(EYE) : makeplural(body_part(EYE)));
|
||||
know_random_obj(4 + rn2(5) + rn2(9));
|
||||
change_uinsight(rnd(8));
|
||||
change_usanity(-1*d(8,8),TRUE);
|
||||
|
||||
for(rolls = d(1,4); rolls > 0; rolls--){
|
||||
switch(rnd(4)){
|
||||
case 1:
|
||||
for(i = rnd(4); i > 0; i--){
|
||||
learn_spell_aphanactonan(rn1(SPE_BLANK_PAPER - SPE_DIG, SPE_DIG));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if(!Role_if(PM_EXILE)){
|
||||
if(!seals){
|
||||
You("see circular seals!");
|
||||
seals = TRUE;
|
||||
}
|
||||
for(i = rnd(8); i > 0; i--){
|
||||
u.sealsKnown |= 0x1L<<rn2(YMIR-FIRST_SEAL+1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if(!wards){
|
||||
You("see warding signs!");
|
||||
wards = TRUE;
|
||||
}
|
||||
for(i = d(2,4); i > 0; i--){
|
||||
u.wardsknown |= 0x1L<<rnd(NUM_WARDS-1); //Note: Ward_Elbereth is 0x1L, and does nothing.
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if(!combat){
|
||||
You("suddenly know secret combat techniques!");
|
||||
combat = TRUE;
|
||||
}
|
||||
u.uhitinc = min_ints(100, u.uhitinc+d(1,2));
|
||||
u.udaminc = min_ints(100, u.udaminc+d(1,2));
|
||||
u.uacinc = min_ints(100, u.uacinc+d(1,2));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(scroll->otyp >= ANTI_CLOCKWISE_METAMORPHOSIS_G && scroll->otyp <= BEAST_S_EMBRACE_GLYPH) {
|
||||
thought = otyp_to_thought(scroll->otyp);
|
||||
|
||||
|
@ -2476,10 +2560,10 @@ struct obj *sobj;
|
|||
altar_wrath(u.ux, u.uy);
|
||||
break;
|
||||
}
|
||||
pline("The %s shifts beneath you,%sengraving a %s ward.",
|
||||
pline("The %s shifts beneath you,%sengraving %s.",
|
||||
surface(u.ux,u.uy),
|
||||
engrHere ? " wiping away the existing engraving and " : " ",
|
||||
wardDecode[sobj->oward]
|
||||
an(wardDecode[sobj->oward])
|
||||
);
|
||||
known = TRUE;
|
||||
del_engr_ward_at(u.ux,u.uy);
|
||||
|
@ -3688,6 +3772,60 @@ createmon:
|
|||
}
|
||||
return mtmp;
|
||||
}
|
||||
|
||||
static void
|
||||
learn_spell_aphanactonan(spellnum)
|
||||
int spellnum;
|
||||
{
|
||||
int i;
|
||||
char splname[BUFSZ];
|
||||
Sprintf(splname, objects[spellnum].oc_name_known ? "\"%s\"" : "the \"%s\" spell", OBJ_NAME(objects[spellnum]));
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == spellnum) {
|
||||
if (spellknow(i) <= KEEN) {
|
||||
Your("knowledge of %s is keener.", splname);
|
||||
incrnknow(i);
|
||||
exercise(A_WIS,TRUE); /* extra study */
|
||||
} else { /* 1000 < spellknow(i) <= KEEN */
|
||||
You("know %s quite well already.", splname);
|
||||
}
|
||||
break;
|
||||
} else if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = spellnum;
|
||||
spl_book[i].sp_lev = objects[spellnum].oc_level;
|
||||
incrnknow(i);
|
||||
You("suddenly know how to cast %s!",OBJ_NAME(objects[spellnum]));
|
||||
break;
|
||||
}
|
||||
}
|
||||
int booktype;
|
||||
if ((booktype = further_study(spellnum))){
|
||||
You("can even see a way to cast another spell.");
|
||||
Sprintf(splname, objects[booktype].oc_name_known ? "\"%s\"" : "the \"%s\" spell", OBJ_NAME(objects[booktype]));
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == booktype) {
|
||||
if (spellknow(i) <= KEEN) {
|
||||
Your("knowledge of %s is keener.", splname);
|
||||
incrnknow(i);
|
||||
exercise(A_WIS, TRUE); /* extra study */
|
||||
}
|
||||
else { /* 1000 < spellknow(i) <= KEEN */
|
||||
You("know %s quite well already.", splname);
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = booktype;
|
||||
spl_book[i].sp_lev = objects[booktype].oc_level;
|
||||
incrnknow(i);
|
||||
You("add %s to your repertoire.", splname);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /* WIZARD */
|
||||
|
||||
#endif /* OVLB */
|
||||
|
|
45
src/role.c
45
src/role.c
|
@ -728,7 +728,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 2, 0, 0, 2, 1, 0 }, /* Hit points */
|
||||
{ 1, 0, 2, 0, 2, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_ABJURATION, -20
|
||||
},
|
||||
{ "clockwork automaton", "automatic", "clockwork-kind", "Clk",
|
||||
{0, 0},
|
||||
|
@ -741,7 +742,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 3, 0, 3, 0, 3, 0 }, /* Hit points */
|
||||
{ 3, 0, 3, 0, 3, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_WIZARD_LOCK, -1000
|
||||
},
|
||||
{ "Chiropteran", "Chiropteric", "Chiropteran-hood", "Bat",
|
||||
{0, 0},
|
||||
|
@ -754,7 +756,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 5, 0, 1, 3, 1, 2 }, /* Hit points */
|
||||
{ 0, 0, 0, 0, 0, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_MAGIC_MAPPING, -15
|
||||
},
|
||||
{ "dwarf", "dwarven", "dwarvenkind", "Dwa",
|
||||
{0, 0},
|
||||
|
@ -767,7 +770,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 4, 0, 0, 3, 2, 0 }, /* Hit points */
|
||||
{ 0, 0, 0, 0, 0, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_DIG, -15
|
||||
},
|
||||
{ "Drow", "droven", "drovenkind", "Dro",
|
||||
{"hedrow", "drow"},
|
||||
|
@ -780,7 +784,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 8, 0, 3, 0, 1, 0 }, /* Hit points */
|
||||
{ 8, 0, 3, 0, 3, 0 }, /* Energy */
|
||||
NO_NIGHTVISION
|
||||
NO_NIGHTVISION,
|
||||
SPE_SLEEP, -5
|
||||
},
|
||||
{ "elf", "elven", "elvenkind", "Elf",
|
||||
{"elf", "elf-maid"},
|
||||
|
@ -793,7 +798,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 7, 0, 3, 0, 1, 0 }, /* Hit points */
|
||||
{ 7, 0, 3, 0, 3, 0 }, /* Energy */
|
||||
NIGHTVISION3
|
||||
NIGHTVISION3,
|
||||
SPE_REMOVE_CURSE, -10
|
||||
},
|
||||
{ "etherealoid", "etherealoidic", "etherealoid-kind", "Eth",
|
||||
{0,0},
|
||||
|
@ -819,7 +825,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 1, 0, 0, 1, 0, 0 }, /* Hit points */
|
||||
{ 12, 0, 4, 0, 2, 2 }, /* Energy */
|
||||
NIGHTVISION2
|
||||
NIGHTVISION2,
|
||||
SPE_INVISIBILITY, -10
|
||||
},
|
||||
{ "Half-dragon", "Half-dragon", "Half-dragonhood", "Hlf",
|
||||
{0, 0},
|
||||
|
@ -832,7 +839,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 4, 0, 0, 4, 2, 0 }, /* Hit points */
|
||||
{ 4, 0, 0, 4, 2, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_DETECT_TREASURE, -10
|
||||
},
|
||||
{ "incantifier", "incantifier", "wanterkind", "Inc",
|
||||
{0, 0},
|
||||
|
@ -847,6 +855,7 @@ const struct Race races[] = {
|
|||
{ 2, 0, 0, 2, 0, 1 }, /* Hit points */
|
||||
{ 0, 0, 100, 0, 100, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
//Note: Bonus to all spells.
|
||||
},
|
||||
{ "Inheritor", "human", "humanity", "Inh",
|
||||
{"man", "woman"},
|
||||
|
@ -860,7 +869,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 2, 0, 0, 2, 1, 0 }, /* Hit points */
|
||||
{ 1, 0, 2, 0, 2, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_ABJURATION, -20
|
||||
},
|
||||
{ "orc", "orcish", "orcdom", "Orc",
|
||||
{0, 0},
|
||||
|
@ -873,7 +883,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 1, 0, 0, 1, 0, 3 }, /* Hit points */
|
||||
{ 1, 0, 1, 0, 1, 0 }, /* Energy */
|
||||
NIGHTVISION2
|
||||
NIGHTVISION2,
|
||||
SPE_CANCELLATION, -15
|
||||
},
|
||||
{ "salamander", "salamandic", "sala-broship", "Sal",
|
||||
{0, 0},
|
||||
|
@ -899,7 +910,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 3, 0, 0, 3, 2, 0 }, /* Hit points */
|
||||
{ 3, 0, 4, 0, 4, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_DRAIN_LIFE, -5
|
||||
},
|
||||
{ "yuki-onna", "yuki-onnic", "feyhood", "Swn",
|
||||
{0, 0},
|
||||
|
@ -912,7 +924,8 @@ const struct Race races[] = {
|
|||
/* Init Lower Higher */
|
||||
{ 2, 0, 1, 0, 0, 1 }, /* Hit points */
|
||||
{ 2, 0, 3, 0, 3, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
NORMALNIGHTVIS,
|
||||
SPE_CHARM_MONSTER, -15
|
||||
},
|
||||
/* Array terminator */
|
||||
{ 0, 0, 0, 0, 0 }};
|
||||
|
@ -2796,4 +2809,12 @@ check_drunkard_trophy()
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef RECORD_ACHIEVE
|
||||
void
|
||||
give_bokrug_trophy()
|
||||
{
|
||||
achieve.trophies |= BOKRUG_QUEST;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* role.c */
|
||||
|
|
|
@ -5890,7 +5890,7 @@ struct monst *mon;
|
|||
if(u.specialSealsActive&SEAL_TWO_TREES && !Invis) count++;
|
||||
if(u.specialSealsActive&SEAL_MISKA && !Invis && u.ulevel >= 10) count++;
|
||||
if(u.specialSealsActive&SEAL_NUDZIRATH) count++;
|
||||
// if(u.sealsActive&SEAL_BLACK_WEB);
|
||||
// if(u.specialSealsActive&SEAL_BLACK_WEB);
|
||||
// if(u.specialSealsActive&SEAL_NUMINA);
|
||||
}
|
||||
return count;
|
||||
|
@ -5943,7 +5943,7 @@ struct monst *mon;
|
|||
// if(u.specialSealsActive&SEAL_ACERERAK && !NoBInvis && !ublindf) count++;
|
||||
if(u.specialSealsActive&SEAL_COUNCIL && !(Blind || (ublindf && !(ublindf->otyp == LENSES || ublindf->otyp == LIVING_MASK)))) count++;
|
||||
if(u.specialSealsActive&SEAL_ALIGNMENT_THING) count++;
|
||||
if(u.sealsActive&SEAL_BLACK_WEB && !Invis && (dimness(u.ux, u.uy) <= 0)) count++;
|
||||
if(u.specialSealsActive&SEAL_BLACK_WEB && !Invis && (dimness(u.ux, u.uy) <= 0)) count++;
|
||||
}
|
||||
if(u.specialSealsActive&SEAL_NUMINA) count++;
|
||||
// if(u.specialSealsActive&SEAL_UNKNOWN_GOD) count++;
|
||||
|
|
22
src/spell.c
22
src/spell.c
|
@ -11,20 +11,10 @@ static NEARDATA schar delay; /* moves left for this spell */
|
|||
static NEARDATA struct obj *book; /* last/current book being xscribed */
|
||||
static NEARDATA int RoSbook; /* Read spell or Study Wards?" */
|
||||
|
||||
#define KEEN 20000
|
||||
#define READ_SPELL 1
|
||||
#define STUDY_WARD 2
|
||||
#define MAINTAINED_SPELL_PW_MULTIPLIER 3
|
||||
#define MAINTAINED_SPELL_HUNGER_MULTIPLIER 1
|
||||
#define incrnknow(spell) spl_book[spell].sp_know = KEEN
|
||||
#define ndecrnknow(spell, knw) spl_book[spell].sp_know = max(0, spl_book[spell].sp_know - knw)
|
||||
#define percdecrnknow(spell, knw) spl_book[spell].sp_know = max(0, spl_book[spell].sp_know - (KEEN*knw)/100)
|
||||
|
||||
#define spellev(spell) spl_book[spell].sp_lev
|
||||
#define spellname(spell) OBJ_NAME(objects[spellid(spell)])
|
||||
#define spellet(spell) \
|
||||
((char)((spell < 26) ? ('a' + spell) : ('A' + spell - 26)))
|
||||
|
||||
STATIC_PTR int NDECL(purifying_blast);
|
||||
STATIC_PTR int NDECL(stargate);
|
||||
STATIC_PTR struct permonst * NDECL(choose_crystal_summon);
|
||||
|
@ -2038,7 +2028,9 @@ purifying_blast()
|
|||
}
|
||||
}
|
||||
/* then shoot a fireball */
|
||||
basiczap(&zapdata, AD_FIRE, ZAP_SPELL, d(10, dsize));
|
||||
basiczap(&zapdata, AD_FIRE, ZAP_SPELL, 0);
|
||||
zapdata.damn = 10;
|
||||
zapdata.damd = dsize;
|
||||
zapdata.explosive = 1; zapdata.directly_hits = 0; zapdata.affects_floor = 0; zapdata.single_target = 1; zapdata.no_hit_wall = 1;
|
||||
zap(&youmonst, u.ux, u.uy, u.dx, u.dy, 25, &zapdata);
|
||||
|
||||
|
@ -2159,7 +2151,10 @@ spiriteffects(power, atme)
|
|||
case PWR_FIRE_BREATH:{
|
||||
if (!getdir((char *)0) || !(u.dx || u.dy)) return(0);
|
||||
struct zapdata zapdata = { 0 };
|
||||
zap(&youmonst, u.ux, u.uy, u.dx, u.dy, rn1(7, 7), basiczap(&zapdata, AD_FIRE, ZAP_BREATH, d(5, dsize)));
|
||||
basiczap(&zapdata, AD_FIRE, ZAP_BREATH, 0);
|
||||
zapdata.damn = 5;
|
||||
zapdata.damd = dsize;
|
||||
zap(&youmonst, u.ux, u.uy, u.dx, u.dy, rn1(7, 7), &zapdata);
|
||||
}break;
|
||||
case PWR_TRANSDIMENSIONAL_RAY:{
|
||||
int dmg;
|
||||
|
@ -6015,6 +6010,9 @@ int spell;
|
|||
if(spellid(spell) == urole.spelspec)
|
||||
splcaster += urole.spelsbon;
|
||||
|
||||
if(spellid(spell) == urace.spelspec)
|
||||
splcaster += urace.spelsbon;
|
||||
|
||||
/* `healing spell' bonus */
|
||||
if(emergency_spell(spell)){
|
||||
(uarm && uarm->otyp == HEALER_UNIFORM) ?
|
||||
|
|
|
@ -167,7 +167,7 @@ stealarm(VOID_ARGS)
|
|||
if (!tele_restrict(mtmp)) (void) rloc(mtmp, TRUE);
|
||||
if(roll_madness(MAD_TALONS)){
|
||||
You("panic after having your property stolen!!");
|
||||
nomul(-1*rnd(6),"panic");
|
||||
HPanicking += 1+rnd(6);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -447,7 +447,7 @@ gotobj:
|
|||
}
|
||||
if(roll_madness(MAD_TALONS)){
|
||||
You("panic after having your property stolen!");
|
||||
nomul(-1*rnd(6),"panic");
|
||||
HPanicking += 1+rnd(6);
|
||||
}
|
||||
//mtmp died, probably from taking a petrifying corpse
|
||||
return((mtmp->mhp <= 0) ? -1 : (multi < 0) ? 0 : 1);
|
||||
|
|
|
@ -2176,6 +2176,9 @@ struct obj * obj;
|
|||
case WAX_CANDLE:
|
||||
radius = candle_light_range(obj);
|
||||
break;
|
||||
case MAGIC_TORCH:
|
||||
radius = 4;
|
||||
break;
|
||||
case SUNROD:
|
||||
case TORCH:
|
||||
case SHADOWLANDER_S_TORCH:
|
||||
|
@ -2298,7 +2301,7 @@ lightsource_timed(obj)
|
|||
struct obj * obj;
|
||||
{
|
||||
return (obj && (
|
||||
(obj->oartifact == ART_HOLY_MOONLIGHT_SWORD) || /* ??? */
|
||||
(obj->oartifact == ART_HOLY_MOONLIGHT_SWORD) || /* ??? Chris: The timer's used to extinquish it when it's dropped. */
|
||||
(obj->otyp == DOUBLE_LIGHTSABER) ||
|
||||
(obj->otyp == LIGHTSABER) ||
|
||||
(obj->otyp == BEAMSWORD) ||
|
||||
|
@ -2363,6 +2366,7 @@ begin_burn(obj)
|
|||
if (obj->age == 0 &&
|
||||
obj->otyp != MAGIC_LAMP &&
|
||||
obj->otyp != CANDLE_OF_INVOCATION &&
|
||||
obj->otyp != MAGIC_TORCH &&
|
||||
obj->otyp != POT_STARLIGHT &&
|
||||
obj->otyp != CHUNK_OF_FOSSIL_DARK &&
|
||||
!artifact_light(obj) &&
|
||||
|
@ -2379,6 +2383,7 @@ begin_burn(obj)
|
|||
/* some things need to set lamplit on their own here */
|
||||
if (obj->otyp == MAGIC_LAMP ||
|
||||
obj->otyp == CANDLE_OF_INVOCATION ||
|
||||
obj->otyp == MAGIC_TORCH ||
|
||||
artifact_light(obj) ||
|
||||
obj_eternal_light(obj))
|
||||
obj->lamplit = TRUE;
|
||||
|
@ -2442,6 +2447,7 @@ end_burn(obj, timer_attached)
|
|||
|
||||
if (obj->otyp == MAGIC_LAMP
|
||||
|| obj->otyp == CANDLE_OF_INVOCATION
|
||||
|| obj->otyp == MAGIC_TORCH
|
||||
|| obj->otyp == POT_STARLIGHT
|
||||
|| obj->otyp == CHUNK_OF_FOSSIL_DARK
|
||||
|| artifact_light(obj)
|
||||
|
|
|
@ -1161,6 +1161,7 @@ char *achieveXbuff;
|
|||
CHECK_ACHIEVE(SPEED_PHASE,"two_keys")
|
||||
CHECK_ACHIEVE(QUITE_MAD,"quite_mad")
|
||||
CHECK_ACHIEVE(TOTAL_DRUNK,"booze_hound")
|
||||
CHECK_ACHIEVE(BOKRUG_QUEST,"bokrug_ascension")
|
||||
if(achievesWritten > 0) Sprintf(eos(achieveXbuff), ",");
|
||||
if(achieve.get_kroo) Sprintf(eos(achieveXbuff), "%s,", "get_kroo");
|
||||
if(achieve.get_poplar) Sprintf(eos(achieveXbuff), "%s,", "get_poplar");
|
||||
|
|
|
@ -2734,6 +2734,7 @@ int byplayer;
|
|||
if (byplayer) {
|
||||
golded = TRUE;
|
||||
xkilled(mon,0);
|
||||
golded = FALSE;
|
||||
} else mongolded(mon);
|
||||
}
|
||||
|
||||
|
@ -2751,6 +2752,7 @@ boolean byplayer;
|
|||
if (byplayer) {
|
||||
glassed = TRUE;
|
||||
xkilled(mon,0);
|
||||
glassed = FALSE;
|
||||
} else monglassed(mon);
|
||||
}
|
||||
|
||||
|
|
22
src/u_init.c
22
src/u_init.c
|
@ -373,7 +373,9 @@ static struct trobj Knight[] = {
|
|||
{ KITE_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
|
||||
{ GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
|
||||
{ HIGH_BOOTS, 0, ARMOR_CLASS, 1, UNDEF_BLESS },
|
||||
#define K_APPLES 7
|
||||
{ APPLE, 0, FOOD_CLASS, 10, 0 },
|
||||
#define K_CARROTS 8
|
||||
{ CARROT, 0, FOOD_CLASS, 10, 0 },
|
||||
{ 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
@ -1628,12 +1630,12 @@ register char sym;
|
|||
which appear to be more than enough tools.
|
||||
We might also add GEM_CLASS with oc_material != GLASS
|
||||
*** Contributed by Johanna Ploog */
|
||||
STATIC_OVL void
|
||||
know_random_obj()
|
||||
void
|
||||
know_random_obj(count)
|
||||
int count;
|
||||
{
|
||||
register int obj, count, ct;
|
||||
register int obj, ct;
|
||||
|
||||
count = rn1(11,5);
|
||||
for (ct = 500; ct > 0 && count > 0; ct--) {
|
||||
obj = rn2(NUM_OBJECTS);
|
||||
if (objects[obj].oc_magic &&
|
||||
|
@ -2103,7 +2105,7 @@ u_init()
|
|||
knows_object(SPE_CAUSE_FEAR);
|
||||
knows_object(SPE_CHARM_MONSTER);
|
||||
/* Bards also know a lot about legendary & magical stuff. */
|
||||
know_random_obj();
|
||||
know_random_obj(rn1(11,5));
|
||||
/* Bards also know all the basic wards. */
|
||||
u.wardsknown = WARD_ACHERON|WARD_HAMSA|WARD_ELDER_SIGN|WARD_EYE|WARD_QUEEN|WARD_CAT_LORD|WARD_GARUDA;
|
||||
u.wardsknown |= WARD_TOUSTEFNA;
|
||||
|
@ -2234,7 +2236,11 @@ u_init()
|
|||
break;
|
||||
case PM_KNIGHT:
|
||||
if(Race_if(PM_DWARF)) ini_inv(DwarfNoble);
|
||||
else ini_inv(Knight);
|
||||
else if(Race_if(PM_HALF_DRAGON)){
|
||||
Knight[K_APPLES].trquan = rn1(9, 5);
|
||||
Knight[K_CARROTS].trquan = 1;
|
||||
ini_inv(Knight);
|
||||
} else ini_inv(Knight);
|
||||
knows_class(WEAPON_CLASS);
|
||||
knows_class(ARMOR_CLASS);
|
||||
/* give knights chess-like mobility
|
||||
|
@ -2524,6 +2530,8 @@ u_init()
|
|||
u.ualign.god = u.ugodbase[UGOD_CURRENT] = u.ugodbase[UGOD_ORIGINAL] = align_to_god(u.ualign.type);
|
||||
flags.initalign = 1; // 1 == neutral
|
||||
}
|
||||
} else if(Role_if(PM_ANACHRONONAUT)){
|
||||
u.umartial = TRUE;
|
||||
} else if(!Role_if(PM_EXILE) && !Role_if(PM_CONVICT) && !Role_if(PM_MADMAN)){
|
||||
ini_inv(DrovenCloak);
|
||||
if(!flags.female && !Role_if(PM_ANACHRONOUNBINDER)){
|
||||
|
@ -2532,8 +2540,6 @@ u_init()
|
|||
u.ualign.god = u.ugodbase[UGOD_CURRENT] = u.ugodbase[UGOD_ORIGINAL] = align_to_god(u.ualign.type);
|
||||
flags.initalign = 1; // 1 == neutral
|
||||
}
|
||||
} else if(Role_if(PM_ANACHRONONAUT)){
|
||||
u.umartial = TRUE;
|
||||
}
|
||||
/* Drow can recognize all droven objects */
|
||||
if(!Role_if(PM_MADMAN)){ /*Madmen have been amnesticized*/
|
||||
|
|
26
src/weapon.c
26
src/weapon.c
|
@ -1661,6 +1661,7 @@ static const NEARDATA short hwep[] = {
|
|||
BROADSWORD/*2d4/1d6+1*/,
|
||||
MORNING_STAR/*2d4/1d6+1*/,
|
||||
CROW_QUILL/*1d8/1d8*/,
|
||||
BLADE_OF_MERCY/*1d6+1/1d8+1*/,
|
||||
RAKUYO_SABER/*1d8/1d8*/,
|
||||
SABER/*1d8/1d8*/,
|
||||
TRIDENT/*1d6+1/3d4*/,
|
||||
|
@ -1674,11 +1675,13 @@ static const NEARDATA short hwep[] = {
|
|||
KHOPESH,/*1d8/1d6*/
|
||||
DROVEN_DAGGER/*1d8/1d6*/,
|
||||
MACE/*1d6+1/1d6*/,
|
||||
MAGIC_TORCH/*1d8/1d4*/,
|
||||
ELVEN_SHORT_SWORD/*1d7/1d7*/,
|
||||
ELVEN_MACE/*1d7/1d7*/,
|
||||
ELVEN_SPEAR/*1d7/1d7*/,
|
||||
DISKOS/*1d6/1d8*/,
|
||||
SPEAR/*1d6/1d8*/,
|
||||
BLADE_OF_GRACE/*1d6/1d8*/,
|
||||
SHORT_SWORD/*1d6/1d8*/,
|
||||
RAPIER/*1d6/1d4*/,
|
||||
AXE/*1d6/1d4*/,
|
||||
|
@ -1701,6 +1704,7 @@ static const NEARDATA short hwep[] = {
|
|||
ELVEN_SICKLE/*1d6/1d3*/,
|
||||
STILETTO/*1d6/1d2*/,
|
||||
ELVEN_DAGGER/*1d5/1d3*/,
|
||||
BLADE_OF_PITY/*1d4/1d6*/,
|
||||
ATHAME/*1d4/1d4*/,
|
||||
RAKUYO_DAGGER/*1d4/1d3*/,
|
||||
DAGGER/*1d4/1d3*/,
|
||||
|
@ -1770,6 +1774,7 @@ static const NEARDATA short hpwep[] = {
|
|||
LUCERN_HAMMER, /*2d4/1d6*/
|
||||
SPETUM, /*1d6+1/2d6*/
|
||||
CROW_QUILL/*1d8/1d8*/,
|
||||
BLADE_OF_MERCY/*1d6+1/1d8+1*/,
|
||||
RAKUYO_SABER/*1d8/1d8*/,
|
||||
SABER/*1d8/1d8*/,
|
||||
TRIDENT/*1d6+1/3d4*/,
|
||||
|
@ -1785,6 +1790,7 @@ static const NEARDATA short hpwep[] = {
|
|||
BEC_DE_CORBIN, /*1d8/1d6*/
|
||||
DROVEN_DAGGER/*1d8/1d6*/,
|
||||
MACE/*1d6+1/1d6*/,
|
||||
MAGIC_TORCH/*1d8/1d4*/,
|
||||
GLAIVE, /*1d6/1d10*/
|
||||
ELVEN_SHORT_SWORD/*1d7/1d7*/,
|
||||
ELVEN_MACE/*1d7/1d7*/,
|
||||
|
@ -1793,6 +1799,7 @@ static const NEARDATA short hpwep[] = {
|
|||
FAUCHARD, /*1d6/1d8*/
|
||||
LANCE, /*1d6/1d8*/
|
||||
SPEAR/*1d6/1d8*/,
|
||||
BLADE_OF_GRACE/*1d6/1d8*/,
|
||||
SHORT_SWORD/*1d6/1d8*/,
|
||||
PARTISAN, /*1d6/1d6*/
|
||||
RAPIER/*1d6/1d4*/,
|
||||
|
@ -1816,6 +1823,7 @@ static const NEARDATA short hpwep[] = {
|
|||
ELVEN_SICKLE/*1d6/1d3*/,
|
||||
STILETTO/*1d6/1d2*/,
|
||||
ELVEN_DAGGER/*1d5/1d3*/,
|
||||
BLADE_OF_PITY/*1d4/1d6*/,
|
||||
ATHAME/*1d4/1d4*/,
|
||||
RAKUYO_DAGGER/*1d4/1d3*/,
|
||||
DAGGER/*1d4/1d3*/,
|
||||
|
@ -2551,6 +2559,7 @@ struct obj *otmp;
|
|||
|| (otmp->otyp == LIGHTSABER && otmp->oartifact != ART_ANNULUS && otmp->ovar1 == 0)
|
||||
|| otmp->otyp == SET_OF_CROW_TALONS
|
||||
|| otmp->oartifact == ART_LIFEHUNT_SCYTHE
|
||||
|| is_mercy_blade(otmp)
|
||||
)){
|
||||
if(is_rakuyo(otmp))
|
||||
bonus = 0;
|
||||
|
@ -2602,6 +2611,13 @@ struct obj *otmp;
|
|||
bonus += (arm->spe)/2;
|
||||
}
|
||||
|
||||
if(is_mercy_blade(otmp)){
|
||||
//Int only
|
||||
arm = which_armor(mon, W_ARMH);
|
||||
if(arm && arm->otyp == HELM_OF_BRILLIANCE)
|
||||
bonus += (arm->spe)/4;
|
||||
}
|
||||
|
||||
if(check_oprop(otmp, OPROP_OCLTW)){
|
||||
bonus /= 2;
|
||||
//Wis only
|
||||
|
@ -2652,6 +2668,7 @@ struct obj *otmp;
|
|||
|| (otmp->otyp == LIGHTSABER && otmp->oartifact != ART_ANNULUS && otmp->ovar1 == 0)
|
||||
|| otmp->otyp == SET_OF_CROW_TALONS
|
||||
|| otmp->oartifact == ART_LIFEHUNT_SCYTHE
|
||||
|| is_mercy_blade(otmp)
|
||||
)){
|
||||
if(is_rakuyo(otmp))
|
||||
bonus = 0;
|
||||
|
@ -2686,6 +2703,10 @@ struct obj *otmp;
|
|||
if(ACURR(A_INT) == 25) bonus += 8;
|
||||
else bonus += (ACURR(A_INT)-10)/2;
|
||||
}
|
||||
if(is_mercy_blade(otmp)){
|
||||
if(ACURR(A_INT) == 25) bonus += 4;
|
||||
else bonus += (ACURR(A_INT)-10)/4;
|
||||
}
|
||||
if(check_oprop(otmp, OPROP_OCLTW)){
|
||||
bonus /= 2;
|
||||
if(ACURR(A_WIS) == 25) bonus += 8;
|
||||
|
@ -3264,6 +3285,11 @@ struct obj *obj;
|
|||
else if(obj->otyp == KHOPESH){
|
||||
CHECK_ALTERNATE_SKILL(P_AXE)
|
||||
}
|
||||
else if(obj->otyp == BLADE_OF_MERCY || obj->otyp == BLADE_OF_GRACE){
|
||||
if(obj->otyp == BLADE_OF_GRACE)
|
||||
CHECK_ALTERNATE_SKILL(P_DAGGER)
|
||||
CHECK_ALTERNATE_SKILL(P_AXE)
|
||||
}
|
||||
else if(obj->otyp == DISKOS){
|
||||
if(!uarms && !u.twoweap)
|
||||
CHECK_ALTERNATE_SKILL(P_POLEARMS)
|
||||
|
|
|
@ -40,7 +40,7 @@ static NEARDATA const int nasties[] = {
|
|||
|
||||
/* chaotic */
|
||||
PM_RED_DRAGON, PM_BLACK_DRAGON, PM_ROCK_TROLL, PM_GREMLIN,
|
||||
PM_VAMPIRE_LORD, PM_WINGED_GARGOYLE, PM_ARCH_LICH, PM_SON_OF_TYPHON,
|
||||
PM_VAMPIRE_LORD, PM_VAMPIRE_LADY, PM_WINGED_GARGOYLE, PM_ARCH_LICH, PM_SON_OF_TYPHON,
|
||||
PM_OGRE_KING, PM_OLOG_HAI, PM_DISENCHANTER, PM_DISPLACER_BEAST,
|
||||
PM_MANTICORE, PM_GNOLL, PM_SCRAP_TITAN, PM_GUG,
|
||||
PM_ANUBAN_JACKAL, PM_BEBELITH, PM_WEREWOLF, PM_WERERAT,
|
||||
|
|
27
src/worn.c
27
src/worn.c
|
@ -993,7 +993,7 @@ struct monst *mon;
|
|||
if(mon->mtame){
|
||||
if(active_glyph(IMPURITY)) base += 3;
|
||||
if(Role_if(PM_HEALER))
|
||||
base += def_beastmastery();
|
||||
base += heal_mlevel_bonus();
|
||||
}
|
||||
if(is_alabaster_mummy(mon->data) && mon->mvar_syllable == SYLLABLE_OF_SPIRIT__VAUL)
|
||||
base += 10;
|
||||
|
@ -2260,6 +2260,31 @@ def_beastmastery()
|
|||
return bm;
|
||||
}
|
||||
|
||||
int
|
||||
heal_mlevel_bonus()
|
||||
{
|
||||
int bm = 0;
|
||||
switch (P_SKILL(P_BEAST_MASTERY)) {
|
||||
case P_ISRESTRICTED: bm += 0; break;
|
||||
case P_UNSKILLED: bm += 0; break;
|
||||
case P_BASIC: bm += 1; break;
|
||||
case P_SKILLED: bm += 2; break;
|
||||
case P_EXPERT: bm += 5; break;
|
||||
default: impossible(">Expert beast mastery unhandled"); bm += 5; break;
|
||||
}
|
||||
if((uwep && uwep->oartifact == ART_CLARENT) || (uswapwep && uswapwep->oartifact == ART_CLARENT))
|
||||
bm *= 2;
|
||||
switch (P_SKILL(P_HEALING_SPELL)) {
|
||||
case P_ISRESTRICTED: bm += 0; break;
|
||||
case P_UNSKILLED: bm += 0; break;
|
||||
case P_BASIC: bm += 1; break;
|
||||
case P_SKILLED: bm += 2; break;
|
||||
case P_EXPERT: bm += 5; break;
|
||||
default: impossible(">Expert healing unhandled"); bm += 5; break;
|
||||
}
|
||||
return bm;
|
||||
}
|
||||
|
||||
STATIC_OVL int
|
||||
def_mountedCombat()
|
||||
{
|
||||
|
|
41
src/xhity.c
41
src/xhity.c
|
@ -3102,12 +3102,23 @@ int vis;
|
|||
case 2:/* Craze */
|
||||
if (youdef) {
|
||||
You("go insane!");
|
||||
make_confused(10000, FALSE); //very large value representing insanity
|
||||
make_confused(100, FALSE);
|
||||
change_usanity(-1*d(10,6), TRUE);
|
||||
}
|
||||
else {
|
||||
else if(!mindless_mon(mdef)){
|
||||
if (canseemon(mdef))
|
||||
pline("%s goes insane!", Monnam(mdef));
|
||||
mdef->mcrazed = 1;
|
||||
mdef->mberserk = 1;
|
||||
(void) set_apparxy(mdef);
|
||||
if(!rn2(4)){
|
||||
mdef->mconf = 1;
|
||||
(void) set_apparxy(mdef);
|
||||
}
|
||||
if(!rn2(10)){
|
||||
mdef->mnotlaugh=0;
|
||||
mdef->mlaughing=rnd(5);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -4044,6 +4055,9 @@ boolean ranged;
|
|||
else {
|
||||
dmg = 0;
|
||||
}
|
||||
if(attk->adtyp == AD_PERH){
|
||||
dmg *= youdef ? u.ulevel : mdef->m_lev;
|
||||
}
|
||||
/* worms get increased damage on their bite if they are lined up with momentum */
|
||||
if(!youagr && pa->mtyp == PM_LONG_WORM && magr->wormno && attk->aatyp == AT_BITE){
|
||||
if(wormline(magr, bhitpos.x, bhitpos.y))
|
||||
|
@ -4235,6 +4249,7 @@ boolean ranged;
|
|||
case AD_BLUD: /* bloodied, phases (blade of blood) */
|
||||
case AD_MERC: /* poisoned, cold, phases (blade of mercury) */
|
||||
case AD_GLSS: /* silvered (mirror-shards) */
|
||||
case AD_PERH: /* physical damage */
|
||||
|
||||
/* abort if called with AT_NONE -- the attack was meant to only do special effects of the adtype. */
|
||||
if (attk->aatyp == AT_NONE)
|
||||
|
@ -12703,6 +12718,7 @@ int vis; /* True if action is at all visible to the player */
|
|||
|
||||
boolean hittxt = FALSE;
|
||||
boolean lethaldamage = FALSE;
|
||||
boolean mercy_blade = FALSE;
|
||||
|
||||
boolean melee = (hmoncode & HMON_WHACK);
|
||||
boolean thrust = (hmoncode & HMON_THRUST);
|
||||
|
@ -12746,6 +12762,8 @@ int vis; /* True if action is at all visible to the player */
|
|||
int elemdmg = 0; /* artifacts, objproperties, and clockwork heat */
|
||||
int specdmg = 0; /* sword of blood; sword of mercury */
|
||||
int totldmg = 0; /* total of subtotal and below */
|
||||
|
||||
int wepspe = weapon ? weapon->spe : 0; /* enchantment of weapon, saved in case it goes poof. */
|
||||
|
||||
int result; /* value to return */
|
||||
|
||||
|
@ -13211,6 +13229,9 @@ int vis; /* True if action is at all visible to the player */
|
|||
}
|
||||
}
|
||||
}
|
||||
/* Will eventually do a mercy blade attack after all messages are printed */
|
||||
if(valid_weapon_attack && (melee || thrust) && !recursed && is_mercy_blade(weapon))
|
||||
mercy_blade = TRUE;
|
||||
/* X-hating */
|
||||
/* note: setting holyobj/etc affects messages later, but damage happens regardless of whether holyobj/etc is set correctly here */
|
||||
if (weapon)
|
||||
|
@ -14997,6 +15018,7 @@ int vis; /* True if action is at all visible to the player */
|
|||
* - iron/silver/holy/unholy hating
|
||||
* - poison (if vs player, NOW call poisoned() since it will print messages)
|
||||
* - sword of blood
|
||||
* - blade of mercy conflict
|
||||
*/
|
||||
|
||||
/* sneak attack messages only if the player is attacking */
|
||||
|
@ -15738,7 +15760,20 @@ int vis; /* True if action is at all visible to the player */
|
|||
*weapon_p = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Use the mercy blade */
|
||||
/* this can print a message, can possibly kill monster, returning immediately */
|
||||
if(mercy_blade){
|
||||
if(u.uinsight >= 50 && (youdef || lethaldamage || !resist(mdef, youagr ? SPBOOK_CLASS : WEAPON_CLASS, 0, TRUE))){
|
||||
mercy_blade_conflict(mdef, magr, wepspe, lethaldamage);
|
||||
}
|
||||
//Might have died in mvm combat, for example, attacking a cockatrice.
|
||||
if(DEADMONSTER(mdef))
|
||||
return MM_DEF_DIED;
|
||||
//Don't think this can happen, but better safe than sorry.
|
||||
if(MIGRATINGMONSTER(mdef))
|
||||
return MM_AGR_STOP;
|
||||
}
|
||||
/* Deal Damage */
|
||||
/* this can possibly kill, returning immediately */
|
||||
result = xdamagey(magr, mdef, attk, totldmg);
|
||||
|
|
|
@ -1718,6 +1718,10 @@ struct obj * obj;
|
|||
else if (otmp->otyp == MAGIC_LAMP) {
|
||||
otmp = poly_obj(otmp, OIL_LAMP);
|
||||
otmp->age = 1500L; /* "best" oil lamp possible */
|
||||
}
|
||||
else if (otmp->otyp == MAGIC_TORCH) {
|
||||
otmp->otyp = TORCH;
|
||||
otmp->age = 1500L; /* "best" torch possible */
|
||||
} else if (otmp->otyp == MAGIC_MARKER) {
|
||||
otmp->recharged = 1; /* degraded quality */
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue