1
0
Fork 0
mirror of https://codeberg.org/noisytoot/notnotdnethack.git synced 2025-08-14 00:21:38 +01:00
This commit is contained in:
demogorgon22 2022-05-27 08:58:30 -04:00
commit da4365ce68
61 changed files with 1530 additions and 415 deletions

View file

@ -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

View file

@ -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

View file

@ -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 */\

View file

@ -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(),

View file

@ -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;

View file

@ -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 ### */

View file

@ -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

View file

@ -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)

View file

@ -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 */

View file

@ -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)

View file

@ -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*/

View file

@ -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 || \

View file

@ -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];

Binary file not shown.

After

(image error) Size: 944 B

Binary file not shown.

After

(image error) Size: 1 KiB

Binary file not shown.

After

(image error) Size: 1.7 KiB

View file

@ -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.,,

1 achieveXname name description icon
2 archeologist_quest Walking international incident Completed the revised archeologist quest X dnh_archeologist_quest.png
3 caveman_quest Serpent slayer Completed the revised caveman quest X dnh_caveman_quest.png
4 convict_quest Sentence commuted Completed the revised convict quest X dnh_convict_quest.png
5 knight_quest Into the crystal cave Completed the revised knight quest X dnh_knight_quest.png
6 anachrononaut_quest Back from the future Completed the anachrononaut quest X dnh_anachrononaut_quest.png
7 android_quest Glory to mankind Completed the android quest X dnh_android_quest.png
8 anachrononaut_ascension No fate Ascended an Anachrononaut and saved the future X dnh_anachrononaut_ascension.png
9 binder_quest 33 spirits Completed the binder quest X dnh_binder_quest.png
10 binder_ascension The other side of the sky Ascended a Binder X dnh_binder_ascension.png
11 pirate_quest Not so inconceivable Completed the pirate quest X dnh_pirate_quest.png
12 bard_quest Not so spoony Completed the bard quest X dnh_bard_quest.png
13 base_noble_quest Rebellion crushed Completed the base noble quest X dnh_noble_quest.png
14 hedrow_noble_quest Family drama Completed the hedrow noble quest X dnh_hedrow_noble_quest.png
15 hedrow_shared_quest On agency Completed the hedrow shared quest X dnh_hedrow_shared_quest.png
16 drow_noble_quest Foreshadowing Completed the drow noble quest X dnh_drow_noble_quest.png
17 drow_shared_quest Old friends Completed the drow shared quest dnh_drow_shared_quest.png Two @
18 dwarf_noble_quest Durin's Bane's Bane Completed the dwarf noble quest x @ and & on a bridge over lava
19 dwarf_knight_quest Battle of (5-4) armies Completed the dwarf knight quest x @ facing a bunch of o
20 gnome_ranger_quest Strongest of all time Completed the gnome ranger quest x Gnome sniping a kobold
21 elf_shared_quest Driven out Completed the elf shared quest dnh_elf_shared_quest.png
22 clockwork_ascension Deus ex machina Ascended a clockwork automaton x Gear-@ with a hovering crown
23 chiropteran_ascension Bat outa hell Ascended a chiropteran x B above lava with a hovering crown
24 yuki_onna_ascension Snow in heaven Ascended a yuki-onna x n with snowflakes with a hovering crown
25 half_dragon_ascension Three halves Ascended a half-dragon x D with a hovering crown
26 law_quest Ripple-resistant tower Completed the law quest x Butterfly
27 neutral_quest Key to the (corpse) city Completed the neutral quest x
28 chaos_temple_quest Asinine paradigm Completed the chaos temple quest x Black mage face?
29 mithardir_quest Chasing after the wind Completed the mithardir quest x
30 mordor_quest Fossil of the First Age Completed the mordor quest x & under rock?
31 second_thoughts Second thoughts Completed a drow shared quest loyally before completing the traitor's quest x Drow surrounded by corpses
32 illuminated Illuminated Learned every word of creation and accumulated 30 passive sylabel bonuses dnh_illuminated.png @ with a bunch of colored dashes
33 exodus Exodus Ascended with a pet android commander or operator android x
34 fully_upgraded Super Fighting Robot Acquried all clockwork upgrades (except high-tension spring) x
35 hunter_of_nightmares Hunter of Nightmares Defeated at least one of each of the secret insight bosses x
36 two_keys Two Keys Ascended having only touched two alignment keys x Me with a headache
37 quite_mad Quite Mad Suffered from at least 6 madnesses x
38 booze_hound Booze Hound Maxed out your drunkard score by drinking at least 90 potions of booze x Dog surrounded by booze potions
39 New June 2021 madman_quest Oh good. I'm not crazy. Completed the madman quest x @ with the stranger right behind
40 madman_quest lamashtu_kill Oh good. I'm not crazy. Does this count as a paradox? Completed the madman quest Destroyed Lamashtu (Demon Queen of the future) x
41 lamashtu_kill baalphegor_kill Does this count as a paradox? A universe without motion Destroyed Lamashtu (Demon Queen of the future) Destroyed Baalphegor x
42 baalphegor_kill angel_hell_vault OR ancient_hell_vault OR tanninim_hell_vault A universe without motion Relics of a bygone era Destroyed Baalphegor Opened one type of hellish seal x Statue in a vault
43 angel_hell_vault OR ancient_hell_vault OR tanninim_hell_vault angel_hell_vault AND ancient_hell_vault AND tanninim_hell_vault Relics of a bygone era There are a lot of these. Opened one type of hellish seal Opened all three types of hellish seal (across all games played) x Three statues
44 angel_hell_vault AND ancient_hell_vault AND tanninim_hell_vault bokrug_ascension There are a lot of these�. Detestable gods Opened all three types of hellish seal (across all games played) Completed Bokrug's ascension ritual x Bokrug statue over water
45 notdNetHack
46 get_kroo Kroo's Bling Acquire the dismal swamp completion prize.
47 get_poplar Punishing Poplars Acquire the black forest completion prize.

View file

@ -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]]", /* */

View file

@ -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;

View file

@ -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)){

View file

@ -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

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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))

View file

@ -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)
) ||

View file

@ -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)){

View file

@ -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 {

View file

@ -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 */

View file

@ -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
}

View file

@ -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:

View file

@ -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);

View file

@ -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 */

View file

@ -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)) {

View file

@ -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;
}

View file

@ -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:

View file

@ -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];

View file

@ -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){

View file

@ -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},

View file

@ -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)),

View file

@ -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;

View file

@ -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):

View file

@ -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

View file

@ -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)) {

View file

@ -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>";

View file

@ -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 */

View file

@ -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)

View file

@ -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

View file

@ -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 */

View file

@ -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 */

View file

@ -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++;

View file

@ -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) ?

View file

@ -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);

View file

@ -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)

View file

@ -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");

View file

@ -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);
}

View file

@ -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*/

View file

@ -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)

View file

@ -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,

View file

@ -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()
{

View file

@ -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);

View file

@ -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 */
}