Index: include/artilist.h =================================================================== --- include/artilist.h (revision 2) +++ include/artilist.h (working copy) @@ -25,6 +25,7 @@ #define FIRE(a,b) {0,AD_FIRE,a,b} #define ELEC(a,b) {0,AD_ELEC,a,b} /* electrical shock */ #define STUN(a,b) {0,AD_STUN,a,b} /* magical attack */ +#define DRST(a,b) {0,AD_DRST,a,b} /* poison attack */ STATIC_OVL NEARDATA struct artifact artilist[] = { #endif /* MAKEDEFS_C */ @@ -44,6 +45,13 @@ (SPFX_NOGEN|SPFX_RESTR|SPFX_SEEK|SPFX_DEFN|SPFX_INTEL|SPFX_SEARCH),0,0, PHYS(5,10), DRLI(0,0), NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 4000L ), /* + * The Knight needed a chaotic longsword to obtain, since Excalibur + * will be restricted from him... +*/ +A("Dirge", LONG_SWORD, + (SPFX_ATTK|SPFX_NOGEN|SPFX_RESTR|SPFX_DEFN|SPFX_INTEL),0,0, + DRST(5,0), DRLI(0,0), NO_CARY, 0, A_CHAOTIC, NON_PM, NON_PM, 3000L ), +/* * Stormbringer only has a 2 because it can drain a level, * providing 8 more. */ @@ -182,8 +190,9 @@ HEALING, A_NEUTRAL, PM_HEALER, NON_PM, 5000L ), A("The Magic Mirror of Merlin", MIRROR, - (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK), SPFX_ESP, 0, - NO_ATTK, NO_DFNS, CARY(AD_MAGM), + (SPFX_NOGEN|SPFX_RESTR|SPFX_INTEL|SPFX_SPEAK|SPFX_REFLECT), + (SPFX_REFLECT|SPFX_ESP|SPFX_HSPDAM), 0, + NO_ATTK, NO_DFNS, NO_CARY, 0, A_LAWFUL, PM_KNIGHT, NON_PM, 1500L ), A("The Eyes of the Overworld", LENSES, @@ -250,6 +259,7 @@ #undef FIRE #undef ELEC #undef STUN +#undef DRST #endif /*artilist.h*/ Index: include/obj.h =================================================================== --- include/obj.h (revision 2) +++ include/obj.h (working copy) @@ -138,8 +138,7 @@ objects[otmp->otyp].oc_skill <= P_SABER) #define is_pole(otmp) ((otmp->oclass == WEAPON_CLASS || \ otmp->oclass == TOOL_CLASS) && \ - (objects[otmp->otyp].oc_skill == P_POLEARMS || \ - objects[otmp->otyp].oc_skill == P_LANCE)) + (objects[otmp->otyp].oc_skill == P_POLEARMS)) #define is_spear(otmp) (otmp->oclass == WEAPON_CLASS && \ objects[otmp->otyp].oc_skill >= P_SPEAR && \ objects[otmp->otyp].oc_skill <= P_JAVELIN) Index: src/role.c =================================================================== --- src/role.c (revision 2) +++ src/role.c (working copy) @@ -144,7 +144,7 @@ PM_KING_ARTHUR, PM_PAGE, PM_IXOTH, PM_QUASIT, PM_OCHRE_JELLY, S_IMP, S_JELLY, ART_MAGIC_MIRROR_OF_MERLIN, - MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL, + MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_CHAOTIC, /* Str Int Wis Dex Con Cha */ { 13, 7, 14, 8, 10, 17 }, { 30, 15, 15, 10, 20, 10 }, @@ -381,7 +381,44 @@ {{0, 0}} }; +/* + * Realistically we don't need to build another structure array just for this + * but this does leave us a framework to do more crossaligned roles + * sometimes in the future, if we feel like it + * + * ideally we'd just properly expand roles[] but the hack is easier for a patch + */ +const struct Role align_roles[] = { +{ {"Dark Knight", 0}, + { {"Sniveler", 0}, + {"Pawn", 0}, + {"Brute", 0}, + {"Mercenary", 0}, + {"Blackguard", 0}, + {"Turncoat", 0}, + {"Knave", 0}, + {"Dark Baron", 0}, + {"Dark Paladin", 0} }, + "Lugh", "_Brigit", "Manannan Mac Lir", /* Celtic */ + "Kni", "Camelot Castle", "the Isle of Glass", + PM_KNIGHT, NON_PM, PM_PONY, + PM_KING_ARTHUR, PM_PAGE, PM_IXOTH, + PM_QUASIT, PM_OCHRE_JELLY, S_IMP, S_JELLY, + ART_MAGIC_MIRROR_OF_MERLIN, + MH_HUMAN | ROLE_MALE|ROLE_FEMALE | ROLE_LAWFUL|ROLE_CHAOTIC, + /* Str Int Wis Dex Con Cha */ + { 13, 7, 14, 8, 10, 17 }, + { 30, 15, 15, 10, 20, 10 }, + /* Init Lower Higher */ + { 14, 0, 0, 8, 2, 0 }, /* Hit points */ + { 1, 4, 0, 1, 0, 2 },10, /* Energy */ + 10, 8,-2, 0, 9, A_WIS, SPE_TURN_UNDEAD, -4 +}, +/* new terminator, though we don't need it here */ +{{0, 0}} +}; + /* The player's role, created at runtime from initial * choices. This may be munged in role_init(). */ @@ -1388,6 +1425,11 @@ urole = roles[flags.initrole]; urace = races[flags.initrace]; + /* kick it over to alternate-alignment role */ + if (alignmnt == A_CHAOTIC && Role_if(PM_KNIGHT)) { + urole = align_roles[0]; + } + /* Fix up the quest leader */ if (urole.ldrnum != NON_PM) { mons[urole.ldrnum].msound = MS_LEADER; Index: src/steed.c =================================================================== --- src/steed.c (revision 2) +++ src/steed.c (working copy) @@ -194,6 +194,7 @@ { struct obj *otmp; char buf[BUFSZ]; + int role_modifier; struct permonst *ptr; /* Sanity checks */ @@ -311,8 +312,11 @@ mon_nam(mtmp)); return (FALSE); } + /* A Knight should be able to ride his own horse! + so we get a bonus for all horse-like things */ + role_modifier = (Role_if(PM_KNIGHT) && mtmp->data->mlet == S_UNICORN) ? 10 : 0; if (!force && (Confusion || Fumbling || Glib || Wounded_legs || - otmp->cursed || (u.ulevel+mtmp->mtame < rnd(MAXULEV/2+5)))) { + otmp->cursed || (u.ulevel+mtmp->mtame+role_modifier < rnd(MAXULEV/2+5)))) { if (Levitation) { pline("%s slips away from you.", Monnam(mtmp)); return FALSE; Index: src/muse.c =================================================================== --- src/muse.c (revision 2) +++ src/muse.c (working copy) @@ -2089,6 +2089,12 @@ if (fmt && str) pline(fmt, str, "armor"); return TRUE; + } else if (EReflecting & W_ART) { + /* Due to the Magic Mirror, which shows as W_ART */ + if (fmt && str) { + pline(fmt, str, "mirror"); + } + return TRUE; } else if (youmonst.data == &mons[PM_SILVER_DRAGON]) { if (fmt && str) pline(fmt, str, "scales"); Index: src/monmove.c =================================================================== --- src/monmove.c (revision 2) +++ src/monmove.c (working copy) @@ -131,15 +131,27 @@ int x, y; struct monst *mtmp; { + int resist_percentage; + if (mtmp->isshk || mtmp->isgd || mtmp->iswiz || !mtmp->mcansee || mtmp->mpeaceful || mtmp->data->mlet == S_HUMAN || is_lminion(mtmp) || mtmp->data == &mons[PM_ANGEL] || - is_rider(mtmp->data) || mtmp->data == &mons[PM_MINOTAUR]) + is_rider(mtmp->data) || mtmp->data == &mons[PM_MINOTAUR] || + mtmp->mnum == quest_info(MS_NEMESIS)) return(FALSE); + /* the smallest monsters always respect Elbereth; + * more powerful things less so */ + if (mtmp->m_lev < 10) { + resist_percentage = (mtmp->m_lev * 1.5) - 3; + } else { + resist_percentage = (mtmp->m_lev * 2.0); + } + boolean mresists = rn2(100) < resist_percentage; + return (boolean)(sobj_at(SCR_SCARE_MONSTER, x, y) #ifdef ELBERETH - || sengr_at("Elbereth", x, y) + || (sengr_at("Elbereth", x, y) && !mresists) #endif || (mtmp->data->mlet == S_VAMPIRE && IS_ALTAR(levl[x][y].typ))); Index: src/makemon.c =================================================================== --- src/makemon.c (revision 2) +++ src/makemon.c (working copy) @@ -994,6 +994,13 @@ if (Inhell && is_bat(ptr)) mon_adjust_speed(mtmp, 2, (struct obj *)0); break; + case S_DRAGON: + /* Dragons are always generated awake and pissed for Knights. */ + if (Role_if(PM_KNIGHT)) { + mtmp->mpeaceful = mtmp->mtame = FALSE; + mtmp->msleeping = 0; + } + break; } if ((ct = emits_light(mtmp->data)) > 0) new_light_source(mtmp->mx, mtmp->my, ct, Index: src/pray.c =================================================================== --- src/pray.c (revision 2) +++ src/pray.c (working copy) @@ -1120,6 +1120,7 @@ dosacrifice() { register struct obj *otmp; + struct obj* wtmp; int value = 0; int pm; aligntyp altaralign = a_align(u.ux,u.uy); @@ -1219,6 +1220,21 @@ } else adjalign(5); if (carried(otmp)) useup(otmp); else useupf(otmp, 1L); + + /* create Dirge from player's longsword here if possible */ + if (u.ualign.type == A_CHAOTIC && Role_if(PM_KNIGHT) && + uwep->otyp == LONG_SWORD && !uwep->oartifact && + !exist_artifact(LONG_SWORD, artiname(ART_DIRGE))) { + + uwep = oname(uwep, artiname(ART_DIRGE)); + bless(uwep); + uwep->oeroded = uwep->oeroded2 = 0; + uwep->oerodeproof = TRUE; + discover_artifact(ART_DIRGE); + exercise(A_WIS,TRUE); + pline("Your sword slithers in your hand and seems to change!"); + } + return(1); } else if (otmp->oxlth && otmp->oattached == OATTACHED_MONST && ((mtmp = get_mtraits(otmp, FALSE)) != (struct monst *)0) Index: src/mon.c =================================================================== --- src/mon.c (revision 2) +++ src/mon.c (working copy) @@ -502,6 +502,26 @@ #ifdef STEED if (mon == u.usteed) { + /* if you aren't a good rider you can't go as fast + * this offsets to some degree the perma-bonus we had to + * give Knights to let them be able to use starting equipment + * (ie. their pony) safely */ + + switch (P_SKILL(P_RIDING)) { + case P_BASIC: + mmove -= 4; + break; + case P_SKILLED: + break; + case P_EXPERT: + mmove += 4; + break; + case P_UNSKILLED: + default: + mmove -= 6; + break; + } + if (u.ugallop && flags.mv) { /* average movement is 1.50 times normal */ mmove = ((rn2(2) ? 4 : 5) * mmove) / 3; Index: src/monst.c =================================================================== --- src/monst.c (revision 2) +++ src/monst.c (working copy) @@ -924,6 +924,13 @@ SIZ(1500, 300, 0, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, CLR_BROWN), + MON("nightmare", S_UNICORN, + LVL(5, 20, 5, 0, -9), (G_GENO|2), + A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_DRST, 1, 2), + NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), + SIZ(1500, 300, 0, MS_NEIGH, MZ_LARGE), MR_POISON, MR_POISON, + M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, + M3_INFRAVISIBLE, CLR_GREEN), MON("warhorse", S_UNICORN, LVL(7, 24, 4, 0, 0), (G_GENO|2), A(ATTK(AT_KICK, AD_PHYS, 1, 10), ATTK(AT_BITE, AD_PHYS, 1, 4), @@ -2731,7 +2738,7 @@ MON("Demogorgon", S_DEMON, LVL(106, 15, -8, 95, -20), (G_HELL|G_NOCORPSE|G_NOGEN|G_UNIQ), A(ATTK(AT_MAGC, AD_SPEL, 8, 6), ATTK(AT_STNG, AD_DRLI, 1, 4), - ATTK(AT_CLAW, AD_DISE, 1, 6), ATTK(AT_CLAW, AD_DISE, 1, 6), + ATTK(AT_CLAW, AD_FIRE, 6, 6), ATTK(AT_CLAW, AD_FIRE, 6, 6), NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_GROWL, MZ_HUGE), MR_FIRE|MR_POISON, 0, M1_FLY|M1_SEE_INVIS|M1_NOHANDS|M1_POIS, @@ -3248,7 +3255,7 @@ ATTK(AT_MAGC, AD_SPEL, 0, 0), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_SAMU, 2, 4), NO_ATTK ), SIZ(WT_DRAGON, 1600, 0, MS_NEMESIS, MZ_GIGANTIC), - MR_FIRE|MR_STONE, MR_FIRE, + MR_FIRE|MR_STONE|MR_POISON, MR_FIRE, M1_FLY|M1_THICK_HIDE|M1_NOHANDS|M1_CARNIVORE|M1_SEE_INVIS, M2_NOPOLY|M2_PNAME|M2_HOSTILE|M2_STRONG|M2_NASTY|M2_STALK| M2_GREEDY|M2_JEWELS|M2_MAGIC, Index: src/botl.c =================================================================== --- src/botl.c (revision 2) +++ src/botl.c (working copy) @@ -71,7 +71,6 @@ register struct Role *role; register int i; - /* Find the role */ for (role = (struct Role *) roles; role->name.m; role++) if (monnum == role->malenum || monnum == role->femalenum) @@ -79,6 +78,11 @@ if (!role->name.m) role = &urole; + /* Gratuitous hack */ + if (u.ualign.type == A_CHAOTIC && Role_if(PM_KNIGHT)) { + role = &urole; + } + /* Find the rank */ for (i = xlev_to_rank((int)lev); i >= 0; i--) { if (female && role->rank[i].f) return (role->rank[i].f); Index: src/artifact.c =================================================================== --- src/artifact.c (revision 2) +++ src/artifact.c (working copy) @@ -63,10 +63,14 @@ if (art->role == Role_switch && art->alignment != A_NONE) art->alignment = alignmnt; - /* Excalibur can be used by any lawful character, not just knights */ - if (!Role_if(PM_KNIGHT)) + /* Excalibur can be used by any lawful character, not just knights + So can Dirge, for that matter */ + if (!Role_if(PM_KNIGHT)) { artilist[ART_EXCALIBUR].role = NON_PM; + artilist[ART_DIRGE].role = NON_PM; + } + /* Fix up the quest artifact */ if (urole.questarti) { artilist[urole.questarti].alignment = alignmnt; @@ -472,10 +476,19 @@ else u.xray_range = -1; vision_full_recalc = 1; } - if ((spfx & SPFX_REFLECT) && (wp_mask & W_WEP)) { + if (spfx & SPFX_REFLECT) { + /* Knights only have to carry the mirror; everyone else must wield it */ + if (Role_if(PM_KNIGHT)) { + if (on) { + EReflecting |= wp_mask; + } else { + EReflecting &= ~wp_mask; + } + } else if (wp_mask & W_WEP) { if (on) EReflecting |= wp_mask; else EReflecting &= ~wp_mask; } + } if(wp_mask == W_ART && !on && oart->inv_prop) { /* might have to turn off invoked power too */ @@ -1005,6 +1018,14 @@ hittee, !spec_dbon_applies ? '.' : '!'); return realizes_damage; } + /* the fifth basic attack: poison */ + if (attacks(AD_DRST, otmp)) { + if (realizes_damage) { + pline_The("venomous blade %s %s%c",spec_dbon_applies ? "strikes" : "nicks", + hittee, spec_dbon_applies ? '!' : '.'); + return realizes_damage; + } + } if (attacks(AD_STUN, otmp) && dieroll <= MB_MAX_DIEROLL) { /* Magicbane's special attacks (possibly modifies hittee[]) */ Index: src/dog.c =================================================================== --- src/dog.c (revision 2) +++ src/dog.c (working copy) @@ -100,6 +100,9 @@ chance = rn2(10); /* 0==tame, 1==peaceful, 2==hostile */ if (chance > 2) chance = otmp->blessed ? 0 : !otmp->cursed ? 1 : 2; /* 0,1,2: b=80%,10,10; nc=10%,80,10; c=10%,10,80 */ + if (Role_if(PM_KNIGHT) && mtmp->data->mlet == S_DRAGON) { + chance = 2; + } if (chance > 0) { mtmp->mtame = 0; /* not tame after all */ if (chance == 2) { /* hostile (cursed figurine) */ @@ -140,8 +143,13 @@ pettype = pet_type(); if (pettype == PM_LITTLE_DOG) petname = dogname; - else if (pettype == PM_PONY) + else if (pettype == PM_PONY) { petname = horsename; + /* hijack creation for chaotic knights */ + if (u.ualign.type == A_CHAOTIC && Role_if(PM_KNIGHT)) { + pettype = PM_NIGHTMARE; + } + } else petname = catname; @@ -160,7 +168,7 @@ #ifdef STEED /* Horses already wear a saddle */ - if (pettype == PM_PONY && !!(otmp = mksobj(SADDLE, TRUE, FALSE))) { + if ((pettype == PM_PONY || pettype == PM_NIGHTMARE) && !!(otmp = mksobj(SADDLE, TRUE, FALSE))) { if (mpickobj(mtmp, otmp)) panic("merged saddle?"); mtmp->misc_worn_check |= W_SADDLE; @@ -753,6 +761,11 @@ || (mtmp->data->mflags3 & M3_WANTSARTI)) return((struct monst *)0); + /* Knights can never tame dragons. Natural enemies, y'see. */ + if (Role_if(PM_KNIGHT) && mtmp->data->mlet == S_DRAGON) { + return ((struct monst *)0); + } + /* worst case, at least it'll be peaceful. */ mtmp->mpeaceful = 1; set_malign(mtmp); Index: src/eat.c =================================================================== --- src/eat.c (revision 2) +++ src/eat.c (working copy) @@ -231,7 +231,7 @@ if (!food || food->otyp != AMULET_OF_STRANGULATION) return; } else if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL) { - adjalign(-1); /* gluttony is unchivalrous */ + adjalign(-10); /* gluttony is unchivalrous */ You_feel("like a glutton!"); } Index: src/apply.c =================================================================== --- src/apply.c (revision 2) +++ src/apply.c (working copy) @@ -1360,7 +1360,12 @@ teleds(cc.x, cc.y, TRUE); nomul(-1); nomovemsg = ""; + /* Knights get it for cheaper */ + if (Role_if(PM_KNIGHT)) { + morehungry(rnd(10)); + } else { morehungry(rnd(25)); + } return 1; } } Index: src/uhitm.c =================================================================== --- src/uhitm.c (revision 2) +++ src/uhitm.c (working copy) @@ -219,10 +219,9 @@ { if (Role_if(PM_KNIGHT) && u.ualign.type == A_LAWFUL && (!mtmp->mcanmove || mtmp->msleeping || - (mtmp->mflee && !mtmp->mavenge)) && - u.ualign.record > -10) { + (mtmp->mflee && !mtmp->mavenge))) { You("caitiff!"); - adjalign(-1); + adjalign(-10); } } @@ -525,6 +524,7 @@ boolean unarmed = !uwep && !uarm && !uarms; #ifdef STEED int jousting = 0; + int joustdmg; #endif int wtype; struct obj *monwep; @@ -907,7 +907,7 @@ use_skill(wtype, 1); } - if (ispoisoned) { + if (ispoisoned || obj->oartifact == ART_DIRGE) { int nopoison = (10 - (obj->owt/10)); if(nopoison < 2) nopoison = 2; if Role_if(PM_SAMURAI) { @@ -915,9 +915,9 @@ adjalign(-sgn(u.ualign.type)); } else if ((u.ualign.type == A_LAWFUL) && (u.ualign.record > -10)) { You_feel("like an evil coward for using a poisoned weapon."); - adjalign(-1); + adjalign(Role_if(PM_KNIGHT) ? -10 : -1); } - if (obj && !rn2(nopoison)) { + if (obj && !rn2(nopoison) && obj->oartifact != ART_DIRGE) { obj->opoisoned = FALSE; Your("%s %s no longer poisoned.", xname(obj), otense(obj, "are")); @@ -947,7 +947,18 @@ #ifdef STEED if (jousting) { - tmp += d(2, (obj == uwep) ? 10 : 2); /* [was in dmgval()] */ + /* + * jousting damage is a bit too strong in the early game + * ...another change necessitated by making the Knight 100% + * to ride his starting pony. + * + * While it's appropriate to consider that a fully-armored Knight + * on a horse would be able to completely mop up the Mines, + * game balance says there should be at least SOME effort + * involved in getting to the luckstone.... + */ + joustdmg = 5 + u.ulevel/3; /* 2d5 -> 2d15 */ + tmp += d(2, (obj == uwep) ? joustdmg : 2); /* [was in dmgval()] */ You("joust %s%s", mon_nam(mon), canseemon(mon) ? exclam(tmp) : "."); if (jousting < 0) { Index: src/u_init.c =================================================================== --- src/u_init.c (revision 2) +++ src/u_init.c (working copy) @@ -72,7 +72,7 @@ static struct trobj Knight[] = { { LONG_SWORD, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, { LANCE, 1, WEAPON_CLASS, 1, UNDEF_BLESS }, - { RING_MAIL, 1, ARMOR_CLASS, 1, UNDEF_BLESS }, + { PLATE_MAIL, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { HELMET, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { SMALL_SHIELD, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, { LEATHER_GLOVES, 0, ARMOR_CLASS, 1, UNDEF_BLESS }, @@ -320,17 +320,16 @@ static const struct def_skill Skill_K[] = { { P_DAGGER, P_BASIC }, { P_KNIFE, P_BASIC }, { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, - { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_SKILLED }, - { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_SKILLED }, + { P_SHORT_SWORD, P_SKILLED }, { P_BROAD_SWORD, P_EXPERT }, + { P_LONG_SWORD, P_EXPERT }, { P_TWO_HANDED_SWORD, P_EXPERT }, { P_SCIMITAR, P_BASIC }, { P_SABER, P_SKILLED }, - { P_CLUB, P_BASIC }, { P_MACE, P_SKILLED }, + { P_CLUB, P_BASIC }, { P_MACE, P_BASIC }, { P_MORNING_STAR, P_SKILLED }, { P_FLAIL, P_BASIC }, - { P_HAMMER, P_BASIC }, { P_POLEARMS, P_SKILLED }, - { P_SPEAR, P_SKILLED }, { P_JAVELIN, P_SKILLED }, + { P_HAMMER, P_BASIC }, { P_POLEARMS, P_EXPERT }, + { P_SPEAR, P_EXPERT }, { P_JAVELIN, P_BASIC }, { P_TRIDENT, P_BASIC }, { P_LANCE, P_EXPERT }, { P_BOW, P_BASIC }, { P_CROSSBOW, P_SKILLED }, - { P_ATTACK_SPELL, P_SKILLED }, { P_HEALING_SPELL, P_SKILLED }, - { P_CLERIC_SPELL, P_SKILLED }, + { P_HEALING_SPELL, P_SKILLED }, { P_CLERIC_SPELL, P_SKILLED }, #ifdef STEED { P_RIDING, P_EXPERT }, #endif Index: dat/quest.txt =================================================================== --- dat/quest.txt (revision 2) +++ dat/quest.txt (working copy) @@ -1148,15 +1148,15 @@ "Verily, %p, thou hast done well. That thou hast survived thus far is a credit to thy valor, but thou art yet unprepared for the demands required as Our Champion. %rA, no matter how -pure, could never hope to defeat the foul %n. +brave, could never hope to defeat the foul %n. "Journey forth from this place, and hone thy skills. Return to -Our presence when thou hast attained the noble title of %R." +Our presence when thou hast attained the title of %R." %E %Cc Kni 00020 -"Thou dishonourest Us, %p! Thou hast strayed from the path of -chivalry! Go from Our presence and do penance. Only when thou art again -pure mayst thou return hence." +"Thou dishonourest Us, %p! Thou hast strayed from thine chosen +path! Go from Our presence and do penance. Only when thou +hast regained thy soul's direction mayst thou return hence." %E %Cc Kni 00021 "Ah, %p. Thou art truly ready, as no %c before thee hath