1
0
Fork 0
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:
Chris-plus-alphanumericgibberish 2015-04-24 19:28:20 -04:00
commit 35c894a95d
17 changed files with 222 additions and 13 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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