mirror of
https://codeberg.org/noisytoot/notnotdnethack.git
synced 2025-05-04 06:15:11 +01:00
Merge branch 'development-half_dragon' into compat-3.9.0
Conflicts: include/monattk.h src/cmd.c
This commit is contained in:
commit
35c894a95d
17 changed files with 222 additions and 13 deletions
|
@ -346,6 +346,11 @@ E NEARDATA char plname[PL_NSIZ];
|
|||
E NEARDATA char dogname[];
|
||||
E NEARDATA char catname[];
|
||||
E NEARDATA char horsename[];
|
||||
E NEARDATA char lizardname[];
|
||||
E NEARDATA char spidername[];
|
||||
E NEARDATA char dragonname[];
|
||||
E NEARDATA char parrotname[];
|
||||
E NEARDATA char monkeyname[];
|
||||
#ifdef CONVICT
|
||||
E NEARDATA char ratname[];
|
||||
#endif /* CONVICT */
|
||||
|
|
|
@ -163,6 +163,7 @@ struct flag {
|
|||
int panLgod; /* deity selection for binder character */
|
||||
int panNgod; /* deity selection for binder character */
|
||||
int panCgod; /* deity selection for binder character */
|
||||
int HDbreath; /* half-dragon breath weapon type*/
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -136,6 +136,7 @@
|
|||
(ptr) == &mons[PM_TULANI] \
|
||||
)
|
||||
#define is_vampire(ptr) (((ptr)->mflags2 & M2_VAMPIRE) != 0L)
|
||||
#define is_half_dragon(ptr) attacktype_fordmg(ptr, AT_BREA, AD_HDRG)
|
||||
#define is_elf(ptr) (((ptr)->mflags2 & M2_ELF) != 0L && !is_drow(ptr))
|
||||
#define is_drow(ptr) (((ptr)->mflags2 & M2_ELF) != 0L && ((ptr)->mflags3 & M3_DARKSIGHT) != 0L)
|
||||
#define is_dwarf(ptr) (((ptr)->mflags2 & M2_DWARF) != 0L)
|
||||
|
|
|
@ -329,6 +329,24 @@ struct you {
|
|||
int umonnum; /* current monster number */
|
||||
|
||||
int mh, mhmax, mtimedone; /* for polymorph-self */
|
||||
#define MATTK_DSCALE 1
|
||||
#define MATTK_BREATH 2
|
||||
#define MATTK_SPIT 3
|
||||
#define MATTK_MAGIC 4
|
||||
#define MATTK_REMV 5
|
||||
#define MATTK_GAZE 6
|
||||
#define MATTK_SUMM 7
|
||||
#define MATTK_WEBS 8
|
||||
#define MATTK_HIDE 9
|
||||
#define MATTK_MIND 10
|
||||
#define MATTK_CLOCK 11
|
||||
#define MATTK_DARK 12
|
||||
#define MATTK_REPL 13
|
||||
#define MATTK_UHORN 14
|
||||
#define MATTK_SHRIEK 15
|
||||
#define MATTK_SCREAM 16
|
||||
#define MATTK_HOLE 17
|
||||
#define MATTK_REACH 18
|
||||
struct attribs macurr, /* for monster attribs */
|
||||
mamax; /* for monster attribs */
|
||||
int ulycn; /* lycanthrope type */
|
||||
|
|
|
@ -28,18 +28,19 @@
|
|||
#define HFire_resistance u.uprops[FIRE_RES].intrinsic
|
||||
#define EFire_resistance u.uprops[FIRE_RES].extrinsic
|
||||
#define Fire_resistance (HFire_resistance || EFire_resistance || \
|
||||
resists_fire(&youmonst) || \
|
||||
resists_fire(&youmonst) || (Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_FIRE) ||\
|
||||
ward_at(u.ux,u.uy) == SIGIL_OF_CTHUGHA || u.sealsActive&SEAL_FAFNIR)
|
||||
|
||||
#define HCold_resistance u.uprops[COLD_RES].intrinsic
|
||||
#define ECold_resistance u.uprops[COLD_RES].extrinsic
|
||||
#define Cold_resistance (HCold_resistance || ECold_resistance || \
|
||||
#define Cold_resistance (HCold_resistance || ECold_resistance || (Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_COLD) ||\
|
||||
resists_cold(&youmonst) || \
|
||||
ward_at(u.ux,u.uy) == BRAND_OF_ITHAQUA || u.sealsActive&SEAL_AMON)
|
||||
|
||||
#define HSleep_resistance u.uprops[SLEEP_RES].intrinsic
|
||||
#define ESleep_resistance u.uprops[SLEEP_RES].extrinsic
|
||||
#define Sleep_resistance (HSleep_resistance || ESleep_resistance || \
|
||||
(Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_SLEE) || \
|
||||
resists_sleep(&youmonst) || u.sealsActive&SEAL_CHUPOCLOPS)
|
||||
|
||||
#define HDisint_resistance u.uprops[DISINT_RES].intrinsic
|
||||
|
@ -50,19 +51,19 @@
|
|||
#define HShock_resistance u.uprops[SHOCK_RES].intrinsic
|
||||
#define EShock_resistance u.uprops[SHOCK_RES].extrinsic
|
||||
#define Shock_resistance (HShock_resistance || EShock_resistance || \
|
||||
resists_elec(&youmonst) || \
|
||||
resists_elec(&youmonst) || (Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_ELEC) ||\
|
||||
ward_at(u.ux,u.uy) == TRACERY_OF_KARAKAL || u.sealsActive&SEAL_ASTAROTH)
|
||||
|
||||
#define HPoison_resistance u.uprops[POISON_RES].intrinsic
|
||||
#define EPoison_resistance u.uprops[POISON_RES].extrinsic
|
||||
#define Poison_resistance (HPoison_resistance || EPoison_resistance || \
|
||||
resists_poison(&youmonst) || \
|
||||
resists_poison(&youmonst) || (Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_DRST) ||\
|
||||
(ward_at(u.ux,u.uy) == WINGS_OF_GARUDA && num_wards_at(u.ux, u.uy) > rn2(7))\
|
||||
|| u.sealsActive&SEAL_YMIR)
|
||||
|
||||
#define HAcid_resistance u.uprops[ACID_RES].intrinsic
|
||||
#define EAcid_resistance u.uprops[ACID_RES].extrinsic
|
||||
#define Acid_resistance (HAcid_resistance || EAcid_resistance || \
|
||||
#define Acid_resistance (HAcid_resistance || EAcid_resistance || (Race_if(PM_HALF_DRAGON) && flags.HDbreath == AD_ACID) ||\
|
||||
resists_acid(&youmonst) || u.sealsActive&SEAL_ECHIDNA)
|
||||
|
||||
#define HDrain_resistance u.uprops[DRAIN_RES].intrinsic
|
||||
|
@ -278,12 +279,13 @@
|
|||
(ELevitation & ~W_ARTI) == 0L && \
|
||||
!is_floater(youmonst.data))
|
||||
|
||||
#define HFlying u.uprops[FLYING].intrinsic
|
||||
#define EFlying u.uprops[FLYING].extrinsic
|
||||
#ifdef STEED
|
||||
# define Flying (EFlying || is_flyer(youmonst.data) || \
|
||||
# define Flying (EFlying || HFlying || is_flyer(youmonst.data) || \
|
||||
(u.usteed && is_flyer(u.usteed->data)))
|
||||
#else
|
||||
# define Flying (EFlying || is_flyer(youmonst.data))
|
||||
# define Flying (EFlying || HFlying || is_flyer(youmonst.data))
|
||||
#endif
|
||||
/* May touch surface; does not override any others */
|
||||
|
||||
|
|
|
@ -619,6 +619,9 @@ moveloop()
|
|||
#endif
|
||||
{
|
||||
moveamt = youmonst.data->mmove;
|
||||
if(Race_if(PM_HALF_DRAGON)) moveamt = (moveamt*2)/3;
|
||||
if(!moveamt) moveamt = 1;
|
||||
|
||||
if(u.sealsActive&SEAL_EURYNOME && IS_POOL(levl[u.ux][u.uy].typ)){
|
||||
if (Very_fast) { /* speed boots or potion */
|
||||
/* average movement is 1.78 times normal */
|
||||
|
|
|
@ -133,6 +133,9 @@ const struct innate {
|
|||
{ 21, &(HPolymorph_control), "in control", "out of control" },
|
||||
{ 0, 0, 0, 0 } },
|
||||
|
||||
hlf_abil[] = { { 14, &(HFlying), "wings sprout from your back", "your wings shrivel and die" },
|
||||
{ 0, 0, 0, 0 } },
|
||||
|
||||
inc_abil[] = { { 1, &(HAntimagic), "", "" },
|
||||
{ 0, 0, 0, 0 } };
|
||||
|
||||
|
@ -707,6 +710,7 @@ int oldlevel, newlevel;
|
|||
case PM_CLOCKWORK_AUTOMATON:rabil = clk_abil; break;
|
||||
case PM_INCANTIFIER: rabil = inc_abil; break;
|
||||
case PM_VAMPIRE: rabil = vam_abil; break;
|
||||
case PM_HALF_DRAGON: rabil = hlf_abil; break;
|
||||
case PM_HUMAN:
|
||||
case PM_DWARF:
|
||||
case PM_GNOME:
|
||||
|
|
|
@ -220,6 +220,11 @@ NEARDATA struct obj zeroobj = DUMMY;
|
|||
/* originally from dog.c */
|
||||
NEARDATA char dogname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char catname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char parrotname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char monkeyname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char spidername[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char lizardname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char dragonname[PL_PSIZ] = DUMMY;
|
||||
NEARDATA char horsename[PL_PSIZ] = DUMMY;
|
||||
#ifdef CONVICT
|
||||
NEARDATA char ratname[PL_PSIZ] = DUMMY;
|
||||
|
|
|
@ -1891,7 +1891,7 @@ find_ac()
|
|||
if(Race_if(PM_ORC)){
|
||||
uac -= (u.ulevel+1)/3;
|
||||
uac -= (u.ulevel+2)/3;
|
||||
}
|
||||
} else if(Race_if(PM_HALF_DRAGON)) uac -= (u.ulevel)/3;
|
||||
if(u.sealsActive&SEAL_ECHIDNA) uac -= (ACURR(A_CON)-10)/2;
|
||||
if(u.specialSealsActive&SEAL_DAHLVER_NAR && !Upolyd) uac -= min(u.ulevel/2,(u.uhpmax - u.uhp)/10);
|
||||
else if(u.specialSealsActive&SEAL_DAHLVER_NAR && Upolyd) uac -= min(u.ulevel/2,(u.mhmax - u.mh)/10);
|
||||
|
|
26
src/dog.c
26
src/dog.c
|
@ -49,10 +49,8 @@ pet_type()
|
|||
}
|
||||
else if (urole.petnum != NON_PM)
|
||||
return (urole.petnum);
|
||||
else if (preferred_pet == 'c')
|
||||
return (PM_KITTEN);
|
||||
else if (preferred_pet == 'd')
|
||||
return (PM_LITTLE_DOG);
|
||||
else if(Race_if(PM_HALF_DRAGON))
|
||||
return PM_TINY_PSEUDODRAGON;
|
||||
else if (Role_if(PM_PIRATE)) {
|
||||
if (preferred_pet == 'B')
|
||||
return (PM_PARROT);
|
||||
|
@ -61,6 +59,10 @@ pet_type()
|
|||
else
|
||||
return (rn2(2) ? PM_PARROT : PM_MONKEY);
|
||||
}
|
||||
else if (preferred_pet == 'c')
|
||||
return (PM_KITTEN);
|
||||
else if (preferred_pet == 'd')
|
||||
return (PM_LITTLE_DOG);
|
||||
else
|
||||
return (rn2(2) ? PM_KITTEN : PM_LITTLE_DOG);
|
||||
}
|
||||
|
@ -162,6 +164,16 @@ makedog()
|
|||
petname = dogname;
|
||||
else if (pettype == PM_PONY)
|
||||
petname = horsename;
|
||||
else if (pettype == PM_PARROT)
|
||||
petname = parrotname;
|
||||
else if (pettype == PM_MONKEY)
|
||||
petname = monkeyname;
|
||||
else if(is_spider(&mons[pettype]))
|
||||
petname = spidername;
|
||||
else if(is_dragon(&mons[pettype]))
|
||||
petname = dragonname;
|
||||
else if(mons[pettype].mlet == S_LIZARD)
|
||||
petname = lizardname;
|
||||
#ifdef CONVICT
|
||||
else if (pettype == PM_SEWER_RAT)
|
||||
petname = ratname;
|
||||
|
@ -178,6 +190,12 @@ makedog()
|
|||
if(Role_if(PM_RANGER)) petname = "Sirius"; /* Orion's dog */
|
||||
}
|
||||
|
||||
if (!*petname && pettype == PM_KITTEN) {
|
||||
if(Role_if(PM_NOBLEMAN)) petname = "Puss"; /* Puss in Boots */
|
||||
if(Role_if(PM_WIZARD) && flags.female) petname = rn2(2) ? "Crookshanks" : "Greebo"; /* Hermione and Nanny Ogg */
|
||||
if(Role_if(PM_WIZARD) && !flags.female) petname = rn2(2) ? "Tom Kitten" : "Mister"; /* Beatrix Potter and Harry Dresden */
|
||||
}
|
||||
|
||||
#ifdef CONVICT
|
||||
if (!*petname && pettype == PM_SEWER_RAT) {
|
||||
if(Role_if(PM_CONVICT)) petname = "Nicodemus"; /* Rats of NIMH */
|
||||
|
|
10
src/files.c
10
src/files.c
|
@ -2010,6 +2010,16 @@ char *tmp_levels;
|
|||
(void) strncpy(dogname, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "CATNAME", 3)) {
|
||||
(void) strncpy(catname, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "LIZARDNAME", 3)) {
|
||||
(void) strncpy(lizardname, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "DRAGONNAME", 3)) {
|
||||
(void) strncpy(dragonname, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "SPIDERNAME", 3)) {
|
||||
(void) strncpy(spidername, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "PARROTNAME", 3)) {
|
||||
(void) strncpy(parrotname, bufp, PL_PSIZ-1);
|
||||
} else if (match_varname(buf, "MONKEYNAME", 3)) {
|
||||
(void) strncpy(monkeyname, bufp, PL_PSIZ-1);
|
||||
#ifdef CONVICT
|
||||
} else if (match_varname(buf, "RATNAME", 3)) {
|
||||
(void) strncpy(catname, bufp, PL_PSIZ-1);
|
||||
|
|
|
@ -23,6 +23,28 @@ int flag;
|
|||
mon->mintrinsics |= (ptr->mresists & 0x03FF);
|
||||
else
|
||||
mon->mintrinsics = (ptr->mresists & 0x03FF);
|
||||
if(is_half_dragon(ptr)){
|
||||
switch(flags.HDbreath){
|
||||
case AD_FIRE:
|
||||
mon->mintrinsics |= MR_FIRE;
|
||||
break;
|
||||
case AD_COLD:
|
||||
mon->mintrinsics |= MR_COLD;
|
||||
break;
|
||||
case AD_ELEC:
|
||||
mon->mintrinsics |= MR_ELEC;
|
||||
break;
|
||||
case AD_ACID:
|
||||
mon->mintrinsics |= MR_ACID;
|
||||
break;
|
||||
case AD_SLEE:
|
||||
mon->mintrinsics |= MR_SLEEP;
|
||||
break;
|
||||
case AD_DRST:
|
||||
mon->mintrinsics |= MR_POISON;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
82
src/monst.c
82
src/monst.c
|
@ -1878,6 +1878,65 @@ then fill new spaces with our spawn!
|
|||
* As reptiles, dragons are cold-blooded and thus aren't seen
|
||||
* with infravision. Red dragons are the exception.
|
||||
*/
|
||||
MON("tiny pseudodragon", S_DRAGON,//3
|
||||
LVL(2, 9, 6, 0, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 1, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 1),
|
||||
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_MEW, MZ_TINY), 0, 0,
|
||||
M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("pseudodragon", S_DRAGON,//3
|
||||
LVL(4, 9, 4, 1, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 1, 6),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 2),
|
||||
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_MEW, MZ_SMALL), 0, 0,
|
||||
M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("riding pseudodragon", S_DRAGON,//3
|
||||
LVL(6, 9, 2, 2, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 2, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 3),
|
||||
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_MEW, MZ_MEDIUM), 0, 0,
|
||||
M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("large pseudodragon", S_DRAGON,//3
|
||||
LVL(10, 9, 0, 4, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 2, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 4),
|
||||
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_ROAR, MZ_LARGE), 0, 0,
|
||||
M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("winged pseudodragon", S_DRAGON,//3
|
||||
LVL(14, 9, -2, 8, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 2, 6),
|
||||
ATTK(AT_CLAW, AD_PHYS, 1, 4),ATTK(AT_CLAW, AD_PHYS, 1, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 6),
|
||||
NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_ROAR, MZ_LARGE), 0, 0,
|
||||
M1_FLY|M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("huge pseudodragon", S_DRAGON,//3
|
||||
LVL(20, 9, -4, 16, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 2, 6),
|
||||
ATTK(AT_CLAW, AD_PHYS, 2, 4),ATTK(AT_CLAW, AD_PHYS, 2, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 1, 8),
|
||||
NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_ROAR, MZ_HUGE), 0, 0,
|
||||
M1_FLY|M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("gigantic pseudodragon", S_DRAGON,//3
|
||||
LVL(30, 9, -6, 32, -5), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 3, 6),
|
||||
ATTK(AT_CLAW, AD_PHYS, 3, 4),ATTK(AT_CLAW, AD_PHYS, 3, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 4, 8),
|
||||
NO_ATTK, NO_ATTK),
|
||||
SIZ(150, 150, 0, MS_ROAR, MZ_GIGANTIC), 0, 0,
|
||||
M1_FLY|M1_NOHANDS|M1_CARNIVORE,
|
||||
M2_GREEDY|M2_JEWELS|M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BRIGHT_CYAN),
|
||||
MON("baby gray dragon", S_DRAGON,//5
|
||||
LVL(4, 9, 2, 10, 0), (G_GENO|G_NOGEN),
|
||||
A(ATTK(AT_BITE, AD_PHYS, 2, 6),
|
||||
|
@ -2672,6 +2731,14 @@ struct permonst _mons2[] = {
|
|||
MR_COLD|MR_SLEEP|MR_POISON, 0,
|
||||
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS,
|
||||
M2_UNDEAD|M2_HOSTILE|M2_ELF|M2_FEMALE, M3_INFRAVISION|M3_DARKSIGHT, CLR_BLACK),
|
||||
MON("half-dragon mummy", S_MUMMY,//7
|
||||
LVL(6, 12, 4, 30, -5), (G_GENO|G_NOCORPSE|1),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 2, 4),
|
||||
ATTK(AT_BREA, AD_HDRG, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN),
|
||||
MR_COLD|MR_SLEEP|MR_POISON, 0,
|
||||
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID|M1_POIS,
|
||||
M2_UNDEAD|M2_HOSTILE, 0, HI_ZAP),
|
||||
MON("ettin mummy", S_MUMMY,//8
|
||||
LVL(7, 12, 4, 30, -6), (G_GENO|G_NOCORPSE|1),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6),
|
||||
|
@ -3306,6 +3373,14 @@ struct permonst _mons2[] = {
|
|||
MR_COLD|MR_SLEEP|MR_POISON, 0,
|
||||
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID,
|
||||
M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_ELF|M2_MALE, M3_INFRAVISION|M3_DARKSIGHT, CLR_BLACK),
|
||||
MON("half-dragon zombie", S_ZOMBIE,//
|
||||
LVL(5, 6, 9, 0, -5), (G_GENO|G_SGROUP|G_NOCORPSE|1),
|
||||
A(ATTK(AT_CLAW, AD_FIRE, 1, 6),
|
||||
ATTK(AT_NONE, AD_HDRG, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(WT_ELF, 175, 0, MS_SILENT, MZ_HUMAN),
|
||||
MR_COLD|MR_SLEEP|MR_POISON, 0,
|
||||
M1_BREATHLESS|M1_MINDLESS|M1_HUMANOID,
|
||||
M2_UNDEAD|M2_STALK|M2_HOSTILE|M2_MALE, 0, HI_ZAP),
|
||||
MON("ettin zombie", S_ZOMBIE,//7
|
||||
LVL(6, 8, 6, 0, -4), (G_GENO|G_NOCORPSE|1),
|
||||
A(ATTK(AT_CLAW, AD_PHYS, 1,10), ATTK(AT_CLAW, AD_PHYS, 1,10),
|
||||
|
@ -4897,6 +4972,13 @@ is a red right hand
|
|||
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
|
||||
M1_HUMANOID|M1_OMNIVORE,
|
||||
M2_NOPOLY|M2_HUMAN|M2_STRONG|M2_COLLECT, M3_INFRAVISIBLE, HI_DOMESTIC),
|
||||
MON("half-dragon", S_DRAGON,//13
|
||||
LVL(10, 12, 10, 1, 0), G_NOGEN,
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_STUN, 1, 6),
|
||||
ATTK(AT_BREA, AD_HDRG, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK),
|
||||
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
|
||||
M1_HUMANOID|M1_CARNIVORE,
|
||||
M2_NOPOLY|M2_HUMAN|M2_HOSTILE|M2_STRONG|M2_GREEDY|M2_JEWELS, M3_INFRAVISIBLE, HI_DOMESTIC),
|
||||
MON("exile", S_HUMAN,//7
|
||||
LVL(5, 12, 10, 50, 0), G_NOGEN,
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 1, 4),
|
||||
|
|
|
@ -1353,6 +1353,7 @@ breamu(mtmp, mattk) /* monster breathes at you (ranged) */
|
|||
|
||||
/* if new breath types are added, change AD_ACID to max type */
|
||||
int typ = (mattk->adtyp == AD_RBRE) ? rnd(AD_ACID) : mattk->adtyp ;
|
||||
if(typ == AD_HDRG) typ = flags.HDbreath;
|
||||
|
||||
if(lined_up(mtmp)) {
|
||||
|
||||
|
@ -1396,6 +1397,7 @@ breamm(mtmp, mdef, mattk) /* monster breathes at monst (ranged) */
|
|||
{
|
||||
/* if new breath types are added, change AD_ACID to max type */
|
||||
int typ = (mattk->adtyp == AD_RBRE) ? rnd(AD_ACID) : mattk->adtyp ;
|
||||
if(typ == AD_HDRG) typ = flags.HDbreath;
|
||||
|
||||
if(mtmp->data->maligntyp < 0 && u.uz.dnum == law_dnum && on_level(&illregrd_level,&u.uz)) return 0;
|
||||
|
||||
|
|
|
@ -858,11 +858,14 @@ dobreathe(mdat)
|
|||
if (!getdir((char *)0)) return(0);
|
||||
|
||||
mattk = attacktype_fordmg(mdat, AT_BREA, AD_ANY);
|
||||
if(!mattk && Race_if(PM_HALF_DRAGON)) mattk = attacktype_fordmg(&mons[PM_HALF_DRAGON], AT_BREA, AD_ANY);
|
||||
if (!mattk)
|
||||
impossible("bad breath attack?"); /* mouthwash needed... */
|
||||
else{
|
||||
int type = mattk->adtyp;
|
||||
if(type == AD_HDRG) type = flags.HDbreath;
|
||||
if(is_dragon(mdat)) flags.drgn_brth = 1;
|
||||
buzz((int) (20 + mattk->adtyp-1), (int)mattk->damn,
|
||||
buzz((int) (20 + type-1), (int)mattk->damn,
|
||||
u.ux, u.uy, u.dx, u.dy,0,0);
|
||||
flags.drgn_brth = 0;
|
||||
}
|
||||
|
|
13
src/role.c
13
src/role.c
|
@ -736,6 +736,19 @@ const struct Race races[] = {
|
|||
{ 3, 0, 4, 0, 4, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
},
|
||||
{ "Half-dragon", "Half-dragon", "Half-dragonhood", "Hlf",
|
||||
{0, 0},
|
||||
PM_HALF_DRAGON, NON_PM, PM_HALF_DRAGON_MUMMY, PM_HALF_DRAGON_ZOMBIE,
|
||||
MH_CLOCK|MH_ORC | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_CHAOTIC|ROLE_NEUTRAL,
|
||||
MH_HUMAN, MH_GNOME|MH_ORC, MH_ELF|MH_DWARF,
|
||||
/* Str Int Wis Dex Con Cha */
|
||||
{ 3, 3, 3, 3, 3, 3 },
|
||||
{ STR19(25), 20, 20, 10, 20, 20 },
|
||||
/* Init Lower Higher */
|
||||
{ 4, 0, 0, 4, 2, 0 }, /* Hit points */
|
||||
{ 4, 0, 0, 4, 2, 0 }, /* Energy */
|
||||
NORMALNIGHTVIS
|
||||
},
|
||||
{ "clockwork automaton", "automatic", "clockwork-kind", "Clk",
|
||||
{0, 0},
|
||||
PM_CLOCKWORK_AUTOMATON, NON_PM, NON_PM, NON_PM,
|
||||
|
|
20
src/u_init.c
20
src/u_init.c
|
@ -1989,6 +1989,26 @@ u_init()
|
|||
}
|
||||
|
||||
u.oonaenergy = !rn2(3) ? AD_FIRE : rn2(2) ? AD_COLD : AD_ELEC;
|
||||
switch(rnd(6)){
|
||||
case 1:
|
||||
flags.HDbreath = AD_COLD;
|
||||
break;
|
||||
case 2:
|
||||
flags.HDbreath = AD_FIRE;
|
||||
break;
|
||||
case 3:
|
||||
flags.HDbreath = AD_SLEE;
|
||||
break;
|
||||
case 4:
|
||||
flags.HDbreath = AD_ELEC;
|
||||
break;
|
||||
case 5:
|
||||
flags.HDbreath = AD_DRST;
|
||||
break;
|
||||
case 6:
|
||||
flags.HDbreath = AD_ACID;
|
||||
break;
|
||||
}
|
||||
/* Fix up the alignment quest nemesi */
|
||||
mons[PM_OONA].mcolor = (u.oonaenergy == AD_FIRE) ? CLR_RED
|
||||
: (u.oonaenergy == AD_COLD) ? CLR_CYAN
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue