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:
parent
a1dcf5f2e9
commit
47ae624567
8 changed files with 102 additions and 16 deletions
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
|
19
src/pickup.c
19
src/pickup.c
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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) {
|
||||
|
|
62
src/sp_lev.c
62
src/sp_lev.c
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue