1
0
Fork 0
mirror of https://codeberg.org/noisytoot/notnotdnethack.git synced 2025-08-05 12:15:26 +01:00

Madmen half dragons are Gith-descendants.

More humanoid.

-Female: Zerth: Mercurial weapon, RDSM, and spiked armor.
--Chaos dragon: random breath weapon

-Male: Knight: Silver sword and armor.
--Red dragon
This commit is contained in:
ChrisANG 2021-12-24 21:46:36 -05:00
parent a1dcf5f2e9
commit 47ae624567
8 changed files with 102 additions and 16 deletions

View file

@ -513,7 +513,7 @@ you_calc_movement()
Race_if(PM_GNOME)
|| Race_if(PM_DWARF)
|| Race_if(PM_ORC)
|| (Race_if(PM_HALF_DRAGON) && Role_if(PM_NOBLEMAN) && flags.initgend)
|| (Race_if(PM_HALF_DRAGON) && ((Role_if(PM_NOBLEMAN) && flags.initgend) || Role_if(PM_MADMAN)))
)) moveamt = 12;
else moveamt = youmonst.data->mmove;
if(uarmf && uarmf->otyp == STILETTOS && !Flying && !Levitation) moveamt = (moveamt*5)/6;

View file

@ -543,6 +543,7 @@ boolean you_abilities;
case AD_SLEE: mtyp = PM_ORANGE_DRAGON; break;
case AD_ACID: mtyp = PM_YELLOW_DRAGON; break;
case AD_MAGM: mtyp = PM_GRAY_DRAGON; break;
case AD_RBRE: mtyp = PM_SHIMMERING_DRAGON; break;
default: impossible("unhandled HD type %d", flags.HDbreath); mtyp = PM_RED_DRAGON; break;
}
/* note: when shield and armor match despite color differences, it is the shield's color that is used */

View file

@ -2497,8 +2497,8 @@ find_ac()
}
}
if(Race_if(PM_HALF_DRAGON)){
//DS half dragons may be more humanoid
if(Role_if(PM_NOBLEMAN) && flags.initgend){
//Some half dragons are more humanoid
if((Role_if(PM_NOBLEMAN) && flags.initgend) || Role_if(PM_MADMAN)){
if(carrying_art(ART_DRAGON_S_HEART_STONE))
uac -= (u.ulevel+5)/10;
else uac -= (u.ulevel+5)/15; //level 10 and 25
@ -2532,7 +2532,7 @@ int base_nat_udr()
if(Race_if(PM_HALF_DRAGON)){
//DS half dragons may be more humanoid
if(Role_if(PM_NOBLEMAN) && flags.initgend){
if((Role_if(PM_NOBLEMAN) && flags.initgend) || Role_if(PM_MADMAN)){
if(carrying_art(ART_DRAGON_S_HEART_STONE))
udr += (u.ulevel)/10;
else udr += (u.ulevel)/15;

View file

@ -2604,8 +2604,25 @@ boolean past;
knows_object(otmp->otyp);
switch(urace.malenum){
default:
case PM_HUMAN:
case PM_HALF_DRAGON:
if(flags.initgend){
//Read through and find mercurial weapon, grant expert skill
for(otmp = box->cobj; otmp; otmp = otmp->nobj){
if(otmp->obj_material == MERCURIAL){
expert_weapon_skill(objects[otmp->otyp].oc_skill);
}
}
expert_weapon_skill(P_ATTACK_SPELL);
u.umartial = TRUE;
gm_weapon_skill(P_BARE_HANDED_COMBAT);
}
else {
expert_weapon_skill(P_TWO_HANDED_SWORD);
expert_weapon_skill(P_ATTACK_SPELL);
skilled_weapon_skill(P_BEAST_MASTERY);
}
break;
case PM_HUMAN:
case PM_VAMPIRE:
case PM_INCANTIFIER:
case PM_GNOME:

View file

@ -870,6 +870,7 @@ struct permonst *mdat;
case AD_DRST: mtyp = PM_GREEN_DRAGON; break;
case AD_SLEE: mtyp = PM_ORANGE_DRAGON; break;
case AD_ACID: mtyp = PM_YELLOW_DRAGON; break;
case AD_RBRE: mtyp = PM_SHIMMERING_DRAGON; break;
default:
impossible("bad HDbreath %d", flags.HDbreath);
return 0;
@ -971,6 +972,7 @@ doelementalbreath()
mon = makemon(&mons[PM_POISON_PARAELEMENTAL], u.ux, u.uy, MM_EDOG|MM_ADJACENTOK);
break;
case AD_SLEE:
case AD_RBRE:
mon = makemon(&mons[PM_DREAM_QUASIELEMENTAL], u.ux, u.uy, MM_EDOG|MM_ADJACENTOK);
break;
case AD_MAGM:

View file

@ -2764,15 +2764,6 @@ int tary;
return FALSE;
}
/* Random breath attacks */
if (typ == AD_RBRE){
if (pa->mtyp == PM_CHROMATIC_DRAGON)
typ = chromatic_dragon_breaths[rn2(SIZE(chromatic_dragon_breaths))];
else if (pa->mtyp == PM_PLATINUM_DRAGON)
typ = platinum_dragon_breaths[rn2(SIZE(platinum_dragon_breaths))];
else
typ = random_breaths[rn2(SIZE(random_breaths))];
}
/* Halfdragon breath attack */
if (typ == AD_HDRG) {
if (youagr && Race_if(PM_HALF_DRAGON))
@ -2786,6 +2777,15 @@ int tary;
mult = 4; /* increased duration */
}
/* Random breath attacks */
if (typ == AD_RBRE){
if (pa->mtyp == PM_CHROMATIC_DRAGON)
typ = chromatic_dragon_breaths[rn2(SIZE(chromatic_dragon_breaths))];
else if (pa->mtyp == PM_PLATINUM_DRAGON)
typ = platinum_dragon_breaths[rn2(SIZE(platinum_dragon_breaths))];
else
typ = random_breaths[rn2(SIZE(random_breaths))];
}
/* if cancelled, (or the player is strangled) can't use breath attack */
if (youagr ? Strangled : magr->mcan) {
if (youagr) {

View file

@ -1287,7 +1287,7 @@ default_case:
}
otmp->spe = 0;
}
// Madman's old stuff
// Madman's old stuff to reclaim
if(Is_container(otmp) && otmp->spe == 7){
struct obj *stuff;
stuff = mksartifact(ART_RITE_OF_DETESTATION);
@ -1300,7 +1300,6 @@ default_case:
switch(urace.malenum){
default:
case PM_HUMAN:
case PM_HALF_DRAGON:
case PM_VAMPIRE:
case PM_INCANTIFIER:
case PM_GNOME:
@ -1347,6 +1346,65 @@ default_case:
default_add_2(GNOMISH_POINTY_HAT);
}
break;
case PM_HALF_DRAGON:
if(flags.initgend){
//Zerth
int merctypes[] = {BROADSWORD, LONG_SWORD, TWO_HANDED_SWORD, KATANA, TSURUGI, SPEAR, TRIDENT, MACE, MORNING_STAR };
int gauntlettypes[] = {GAUNTLETS_OF_POWER, GAUNTLETS, GAUNTLETS_OF_DEXTERITY, ORIHALCYON_GAUNTLETS };
int boottypes[] = {ARMORED_BOOTS, HIGH_BOOTS, SPEED_BOOTS, WATER_WALKING_BOOTS, JUMPING_BOOTS, KICKING_BOOTS, FLYING_BOOTS };
int index;
index = rn2(SIZE(merctypes));
stuff = mksobj(merctypes[index], MKOBJ_NOINIT);
set_material_gm(stuff, MERCURIAL);
add_to_container(otmp, stuff);
//Spiked gauntlets
stuff = mksobj(gauntlettypes[rn2(SIZE(gauntlettypes))], MKOBJ_NOINIT);
if(index < SPEAR){
add_oprop(stuff, OPROP_SPIKED);
stuff->spe = 2;
}
else {
add_oprop(stuff, OPROP_BLADED);
stuff->spe = 2;
}
add_to_container(otmp, stuff);
default_add_2(RED_DRAGON_SCALE_MAIL);
//Spiked boots
stuff = mksobj(boottypes[rn2(SIZE(boottypes))], MKOBJ_NOINIT);
add_oprop(stuff, OPROP_SPIKED);
stuff->spe = 2;
add_to_container(otmp, stuff);
}
else {
//Knight
stuff = mksobj(TWO_HANDED_SWORD, mkobjflags);
set_material_gm(otmp, SILVER);
add_oprop(otmp, OPROP_PSIOW);
add_oprop(otmp, OPROP_VORPW);
otmp->spe = 3;
add_to_container(otmp, stuff);
stuff = mksobj(find_gcirclet(), mkobjflags);
set_material_gm(otmp, SILVER);
otmp->spe = 2;
add_to_container(otmp, stuff);
stuff = mksobj(ARCHAIC_PLATE_MAIL, mkobjflags);
set_material_gm(otmp, SILVER);
otmp->spe = 2;
add_to_container(otmp, stuff);
stuff = mksobj(ARCHAIC_GAUNTLETS, mkobjflags);
set_material_gm(otmp, SILVER);
otmp->spe = 2;
add_to_container(otmp, stuff);
stuff = mksobj(ARCHAIC_BOOTS, mkobjflags);
set_material_gm(otmp, SILVER);
otmp->spe = 2;
add_to_container(otmp, stuff);
}
break;
case PM_DWARF:
default_add(HIGH_BOOTS);
stuff = mksobj(RUFFLED_SHIRT, MKOBJ_NOINIT);

View file

@ -2637,6 +2637,14 @@ u_init()
flags.HDbreath = AD_COLD;
HCold_resistance |= (FROMRACE|FROMOUTSIDE);
}
} else if(Role_if(PM_MADMAN)){
if(flags.initgend){
flags.HDbreath = AD_RBRE;
}
else {
flags.HDbreath = AD_FIRE;
HFire_resistance |= (FROMRACE|FROMOUTSIDE);
}
} else switch(rnd(6)){
case 1:
flags.HDbreath = AD_COLD;