diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/dat/Caveman.des nethack/dat/Caveman.des --- nh_orig/dat/Caveman.des 2003-12-07 18:39:12.000000000 -0500 +++ nethack/dat/Caveman.des 2007-04-11 13:07:04.000000000 -0400 @@ -10,25 +10,25 @@ # MAZE: "Cav-strt",' ' -FLAGS: noteleport,hardfloor +FLAGS: noteleport,hardfloor,arboreal GEOMETRY:center,center MAP - ...... .......................... ... .... ...... - ...... .......................... ........ .... ..... - ..BB ............................. ......... .... .. - .. ...................... ....... .. .... .. - .. .................... .. ....... .. ... - .. S BB ..... ....... .... .... - .. ... . .. ........ .. .. .. ... - .. ...... .. ............ .. ... - . .... .. ........ .. ........... - ... .. .. ............. ................... - ..... ..... ............................... ........... - .....B................ ... ... - ..... . .......... .... . ... .......... ... - ... .. ............. .. ................... .... - BB .. ......... BB ... .......... .. ... ... - ...... ..... B ........ .. .. .... ... - .......... .......... ..... ... ..... ........ + ...... .......................... ... PP .... ...... + ...... .......................... ........ P .... PP .....P + ..BB ............................ P.... ....P PP P.... .. + .. ...................... P.......P PP .. P P....P .. + .. P BB................... PP .. .......P P.. ... + ... ...B B ..... P ....... PP.... P .... + ..P P. ... . ... ........P .. PP .. .. ... + .. .P ....... .... P............ P..P P PP ... + PPP .. . .... ... . PP P P ........ P P .. ........... + ... P... .. .... .B...........P PP PP PP P ..........P........ + ..... P..... .............................. ........... +P .PP..B..........PPP... P PPP ... P P PPP P P PP PPP ... + ..... PP . ..........PP PPP ....P.PP ... .......... PP P... + P...P .. PPP ............. .. .........P......... P P.... + BB .........PP BB ... ..........P .. PP... ... + ...... ..... B PP ....... PP .. PPP .. .... ... + .......... .......... ...... .. ..... .........P .. ... . ..... .... .. ... .. @@ -43,11 +43,9 @@ REGION:(05,17,14,18),lit,"ordinary",unfilled,true REGION:(17,16,23,18),lit,"ordinary",unfilled,true -REGION:(35,16,44,18),lit,"ordinary",unfilled,true +REGION:(37,16,44,18),lit,"ordinary",unfilled,true # Stairs -STAIR:(02,03),down +LADDER:(02,03),down # Portal arrival point BRANCH:(71,09,71,09),(0,0,0,0) -# Doors -DOOR:locked,(19,06) # The temple altar (this will force a priest(ess) to be created) ALTAR:(36,02),coaligned,shrine @@ -64,28 +62,52 @@ MONSTER:'@',"neanderthal",(21,01) MONSTER:'@',"neanderthal",(22,01) -MONSTER:'@',"neanderthal",(26,09) +MONSTER:'@',"neanderthal",(24,08) # Non diggable walls NON_DIGGABLE:(00,00,75,19) # Random traps -TRAP:"pit",(47,11) -TRAP:"pit",(57,10) -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Monsters on siege duty (in the outer caves). -MONSTER: 'h',"bugbear",(47,02),hostile -MONSTER: 'h',"bugbear",(48,03),hostile -MONSTER: 'h',"bugbear",(49,04),hostile -MONSTER: 'h',"bugbear",(67,03),hostile -MONSTER: 'h',"bugbear",(69,04),hostile -MONSTER: 'h',"bugbear",(51,13),hostile -MONSTER: 'h',"bugbear",(53,14),hostile -MONSTER: 'h',"bugbear",(55,15),hostile -MONSTER: 'h',"bugbear",(63,10),hostile -MONSTER: 'h',"bugbear",(65,09),hostile -MONSTER: 'h',"bugbear",(67,10),hostile -MONSTER: 'h',"bugbear",(69,11),hostile -WALLIFY +TRAP:"pit",random +TRAP:"pit",random +TRAP:"pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"bear",(19,13) +TRAP:"bear",(46,11) +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +# Random jungle stuff +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: ';',"giant eel",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"monkey",random,hostile +MONSTER: 'Y',"ape",random,hostile +MONSTER: 'Y',"ape",random,hostile +MONSTER: 'Y',"ape",random,hostile +MONSTER: 'Y',"ape",random,hostile +MONSTER: 'Y',"ape",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'f',"panther",random,hostile +MONSTER: 'f',"panther",random,hostile +MONSTER: 'f',"panther",random,hostile +MONSTER: 'f',"panther",random,hostile # @@ -97,26 +119,26 @@ MAZE: "Cav-loca",' ' -FLAGS: hardfloor +FLAGS: noteleport,hardfloor,arboreal GEOMETRY:center,center MAP ............. ........... - ............... ............. - ............. ............... .......... - ........... ............. ............... - ... ... .................. - ... .......... ... .................. - ... ............ BBB................... + ........PPP.... ............. + ......PPP.... ............... .......... ... .......... ...................... - ..... .. .....B........................ - .... ............... . ........B.......................... - ...... .. .............S.............. .................. - .... .. ........... ............... - .. ... .................... + ... PP ... .................. + ... .......... ... .................. + P... ....PPP..... BBB................... + ... P .......... ...................... + PP ..... PP P .. ....PB........................ + .... ............... . P .......PB.......................... + ...... .. .............P.............. .................. + .... .. P PPP ........... ............... + .. ... PPP .................... .... BB................... - .. .. .. ............... - .. ....... .... ..... .... .. ....... S - ............ ....... .. ....... ..... ... .... - ....... ..... ...... ....... + PP .. P .. .. ............... + .. ....... .... ..... .... .. ....... P + P ......PPP... ....... .. ....... ..... ... .... + P ....... ..... ...... ....... ENDMAP @@ -124,9 +146,7 @@ REGION:(00,00,75,19),unlit,"ordinary" REGION:(52,06,73,15),lit,"ordinary",unfilled,true -# Doors -DOOR:locked,(28,11) # Stairs -STAIR:(04,03),up -STAIR:(73,10),down +LADDER:(04,03),up +LADDER:(73,10),down # Non diggable walls NON_DIGGABLE:(00,00,75,19) @@ -148,39 +168,40 @@ OBJECT:random,random,random # Random traps -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -TRAP:random,random -# Random monsters. -MONSTER:'h',"bugbear",(02,10),hostile -MONSTER:'h',"bugbear",(03,11),hostile -MONSTER:'h',"bugbear",(04,12),hostile -MONSTER:'h',"bugbear",(02,11),hostile -MONSTER:'h',"bugbear",(16,16),hostile -MONSTER:'h',"bugbear",(17,17),hostile -MONSTER:'h',"bugbear",(18,18),hostile -MONSTER:'h',"bugbear",(19,16),hostile -MONSTER:'h',"bugbear",(30,06),hostile -MONSTER:'h',"bugbear",(31,07),hostile -MONSTER:'h',"bugbear",(32,08),hostile -MONSTER:'h',"bugbear",(33,06),hostile -MONSTER:'h',"bugbear",(34,07),hostile -MONSTER:'h',"bugbear",random,hostile -MONSTER:'h',"bugbear",random,hostile -MONSTER:'h',"bugbear",random,hostile -MONSTER:'h',"bugbear",random,hostile -MONSTER:'h',random,random,hostile -MONSTER:'H',random,random,hostile -MONSTER:'H',"hill giant",(03,12),hostile -MONSTER:'H',"hill giant",(20,17),hostile -MONSTER:'H',"hill giant",(35,08),hostile -MONSTER:'H',"hill giant",random,hostile -MONSTER:'H',"hill giant",random,hostile -MONSTER:'H',"hill giant",random,hostile -MONSTER:'H',"hill giant",random,hostile -MONSTER:'H',random,random,hostile -WALLIFY +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"spiked pit",random +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +TRAP:"bear",random +# Monsters... +MONSTER:';',"electric eel",(28,11),hostile +MONSTER:';',"electric eel",(46,09),hostile +MONSTER:';',"electric eel",(46,10),hostile +MONSTER:';',"electric eel",(63,16),hostile +MONSTER:';',"giant eel",random,hostile +MONSTER:';',"giant eel",random,hostile +MONSTER:';',"giant eel",random,hostile +MONSTER:';',"giant eel",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"monkey",random,hostile +MONSTER:'Y',"monkey",random,hostile +MONSTER:'Y',"monkey",random,hostile +MONSTER:'Y',"monkey",random,hostile +MONSTER:'S',"python",random,hostile +MONSTER:'S',"python",random,hostile +MONSTER:'S',"python",random,hostile +MONSTER:'S',"python",random,hostile +# WALLIFY # @@ -219,5 +240,5 @@ REGION:(00,00,75,19),lit,"ordinary" # Stairs -STAIR:random,up +LADDER:random,up # Non diggable walls NON_DIGGABLE:(00,00,75,19) @@ -243,21 +264,49 @@ MONSTER:'F',"shrieker",(25,8) MONSTER:'F',"shrieker",(45,11) +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'Y',"carnivorous ape",random,hostile +MONSTER:'f',"tiger",random,hostile +MONSTER:'f',"tiger",random,hostile +MONSTER:'f',"tiger",random,hostile WALLIFY # -# The "fill" levels for the quest. -# -# These levels are used to fill out any levels not occupied by specific -# levels as defined above. "filla" is the upper filler, between the -# start and locate levels, and "fillb" the lower between the locate -# and goal levels. +# The level inbetween the original starting jungle and the lower levels +# where the actual caves are. # MAZE: "Cav-fila" , ' ' -INIT_MAP: '.' , ' ' , true , true , random , true -NOMAP +FLAGS: noteleport,hardfloor,arboreal +GEOMETRY: center,center +MAP + + P + PP + ... .... .PP... P .... + ..... ..PP... ....PP....... ........ + ..... ...PP... .....PPP......... P .......... + ....... ........ .....PP.......................... + ..... ......... ...PPP............ P ....P... + ..P.. ..... .... ..PP... PPP ...PPP.. + ..PP. .... .... PPP P...PPP.. + ..... ... ... PP ....P... + ..... .. ... P .........P + ..... P .. ... ........... + ...... .. ... .................. + ...... .. .. P PPP .........PPPP...........P + P ... PP .. .............................. PP + ........ PPP P .......... + PPP + + +ENDMAP # -STAIR: random, up -STAIR: random, down +LADDER: (05,04), up +LADDER: (36,05), down +# +REGION:(00,00,75,19),unlit,"ordinary" +# +NON_DIGGABLE:(00,00,75,19) # OBJECT: random, random, random @@ -269,16 +318,43 @@ OBJECT: random, random, random # -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "spiked pit", random +TRAP: "spiked pit", random +TRAP: "spiked pit", random +TRAP: "bear", (37,15) +TRAP: "bear", random +TRAP: "bear", random +TRAP: "bear", random +# +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile + +# +# The "fill" levels for the quest. +# +# These levels are used to fill out any levels not occupied by specific +# levels as defined above. "filla" is the upper filler, between the +# start and locate levels, and "fillb" the lower between the locate +# and goal levels. +# +# Obviously, "fila" has been hijacked and moved above. :) # -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', random, random, hostile -MONSTER: 'H', "hill giant", random, hostile MAZE: "Cav-filb" , ' ' @@ -286,6 +362,6 @@ NOMAP # -STAIR: random, up -STAIR: random, down +LADDER: random, up +LADDER: random, down # OBJECT: random, random, random @@ -302,15 +378,31 @@ OBJECT: random, random, random # -TRAP: random, random -TRAP: random, random -TRAP: random, random -TRAP: random, random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "pit", random +TRAP: "spiked pit", random +TRAP: "spiked pit", random +TRAP: "spiked pit", random +TRAP: "bear", random +TRAP: "bear", random +TRAP: "bear", random +TRAP: "bear", random # -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', "bugbear", random, hostile -MONSTER: 'h', random, random, hostile -MONSTER: 'h', random, random, hostile -MONSTER: 'H', "hill giant", random, hostile -MONSTER: 'H', "hill giant", random, hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'f',"tiger",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'S',"python",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile +MONSTER: 'Y',"carnivorous ape",random,hostile + diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/dat/quest.txt nethack/dat/quest.txt --- nh_orig/dat/quest.txt 2003-12-07 18:39:13.000000000 -0500 +++ nethack/dat/quest.txt 2007-04-11 10:50:50.000000000 -0400 @@ -560,10 +560,10 @@ # %Cc Cav 00001 -You descend through a barely familiar stairwell that you remember +You walk through a barely familiar overgrown path that you remember %l showing you when you embarked upon your vision quest. -You arrive back at %H, but something seems -wrong here. The usual smoke and glowing light of the fires of the -outer caves are absent, and an uneasy quiet fills the damp air. +You arrive back at %H, ... but something seems +wrong here. The jungle has a tense aura about it, and the beasts +are snarling and hostile. An uneasy quiet fills the damp air. %E %Cp Cav 00002 @@ -640,5 +640,5 @@ %Cc Cav 00020 "%pC! You have deviated from my teachings. You no longer follow -the path of the %a as you should. I banish you from these caves, to +the path of the %a as you should. I banish you from this temple, to go forth and purify yourself. Then, you might be able to accomplish this quest." @@ -648,5 +648,5 @@ great suffering among your people: -"Shortly after you left on your vision quest, the caves were invaded by +"Shortly after you left on your vision quest, the jungle was invaded by the creatures sent against us by %n. @@ -655,10 +655,13 @@ minions of %n managed to steal %o. They took it to %i and there, none of our -%g warriors have been able to go. +%g warriors have been able to go. Worse, she has invoked its power +against us, and now conflict ravages our once-peaceful jungle. "You must find %i, and within it wrest %o from %n. She guards it as jealously as she guards all treasures she attains. But with it, -we can make our caves safe once more. +we can make our jungle safe once more. Without it, the spirit of the +jungle cries out in pain, and the animals are crazed and attack all +who pass near. "Please, %p, recover %o for us, and return it here." @@ -699,10 +702,10 @@ %E %Cc Cav 00035 -You %x many large claw marks on the ground. The tunnels ahead -of you are larger than most of those in any cave complex you have -ever been in before. +You %x many large claw marks on the ground. Your brief respite +from the narrow jungle confines appears to be over... many paths lead +into the trees in all directions, and stagnant pools cover the ground. -Your nose detects the smell of carrion from within, and bones litter -the sides of the tunnels. +Your nose detects the smell of carrion from somewhere deep within, and +unidentifiable, gnawed bones litter the nearby underbrush. %E %Cp Cav 00036 @@ -713,5 +716,5 @@ nevertheless show signs of being scorched by fire. -Bones litter the floor, and there are objects scattered everywhere. +Bones cover the floor, and there are objects scattered everywhere. The air is close with the stench of sulphurous fumes. @@ -784,4 +787,10 @@ own. +He takes it from your hands and does something you cannot see. You +feel the very trees relax as the magic-induced hatred melts away from +the land. + +He returns it to you and says: + To prevent further trouble, I would like you, %p, to take %o away with you. It will help you as you Only in nethack/doc: Guidebook diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/include/artilist.h nethack/include/artilist.h --- nh_orig/include/artilist.h 2003-12-07 18:39:13.000000000 -0500 +++ nethack/include/artilist.h 2007-04-11 15:27:11.000000000 -0400 @@ -149,4 +149,8 @@ PHYS(5,0), DFNS(AD_BLND), NO_CARY, 0, A_LAWFUL, NON_PM, NON_PM, 1500L ), +A("Keolewa",CLUB, + SPFX_RESTR, 0, 0, + PHYS(5,6), NO_DFNS, NO_CARY, 0, A_NEUTRAL, PM_CAVEMAN, NON_PM, 600L ), + /* * The artifacts for the quest dungeon, all self-willed. diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/include/mondata.h nethack/include/mondata.h --- nh_orig/include/mondata.h 2003-12-07 18:39:13.000000000 -0500 +++ nethack/include/mondata.h 2007-04-11 10:50:50.000000000 -0400 @@ -189,5 +189,5 @@ #define befriend_with_obj(ptr, obj) ((obj)->oclass == FOOD_CLASS && \ - is_domestic(ptr)) + (is_domestic(ptr) || (Role_if(PM_CAVEMAN) && (ptr) == &mons[PM_MASTODON]))) #endif /* MONDATA_H */ diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/apply.c nethack/src/apply.c --- nh_orig/src/apply.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/apply.c 2007-04-11 10:50:50.000000000 -0400 @@ -32,4 +32,5 @@ STATIC_DCL void FDECL(use_trap, (struct obj *)); STATIC_DCL void FDECL(use_stone, (struct obj *)); +STATIC_DCL void FDECL(apply_flint, (struct obj *)); STATIC_PTR int NDECL(set_trap); /* occupation callback */ STATIC_DCL int FDECL(use_whip, (struct obj *)); @@ -1832,4 +1833,49 @@ } +/* creating flint arrows - DSR */ + +STATIC_OVL void +apply_flint(flint) +struct obj* flint; +{ + struct obj* obj; + char szwork[QBUFSZ]; + int flints, arrows, i; + static const char menulist[2] = {WEAPON_CLASS,0}; + + flints = flint->quan; + + Sprintf(szwork, "affix the stone%s to", plur(flints)); + if ((obj = getobj(menulist,szwork)) == 0) { + return; + } + + /* can only stick flint to arrows */ + if (obj->otyp < ARROW || obj->otyp > YA) { + You("aren't really sure what good that will do."); + return; + } + + /* can't make MIRV arrows; if they're +1, leave it be */ + if (obj->spe > 0) { + You("don't think you can make these any better than they are."); + return; + } + + arrows = obj->quan; + + /* One flint stone will do 10 arrows. */ + if (flints*10 > arrows) { + (obj->spe)++; + You("lash flint tips to the arrows."); + for (i = 0;i <= arrows/10;i++) { + useup(flint); + } + } else { + You("don't have enough flint to re-tip all of these."); + } + return; +} + /* touchstones - by Ken Arnold */ STATIC_OVL void @@ -1839,4 +1885,7 @@ struct obj *obj; boolean do_scratch; + boolean make_sparks; + int i, j; + struct monst* mtmp; const char *streak_color, *choices; char stonebuf[QBUFSZ]; @@ -1897,4 +1946,5 @@ do_scratch = FALSE; + make_sparks = FALSE; streak_color = 0; @@ -1903,4 +1953,7 @@ case RING_CLASS: if (tstone->otyp != TOUCHSTONE) { + if (tstone->otyp == FLINT && objects[obj->otyp].oc_material == IRON) { + make_sparks = TRUE; /* we'll catch it later */ + } do_scratch = TRUE; } else if (obj->oclass == GEM_CLASS && (tstone->blessed || @@ -1946,4 +1999,8 @@ streak_color = "silvery"; break; + case IRON: + if (tstone->otyp != TOUCHSTONE) { + make_sparks = TRUE; + } default: /* Objects passing the is_flimsy() test will not @@ -1960,9 +2017,59 @@ Sprintf(stonebuf, "stone%s", plur(tstone->quan)); - if (do_scratch) + if (do_scratch) { + if (!make_sparks) { pline("You make %s%sscratch marks on the %s.", streak_color ? streak_color : (const char *)"", streak_color ? " " : "", stonebuf); - else if (streak_color) + } else { + /* Iron and flint make sparks. Non-intelligent creatures + * fear fire. So anything next to Our Hero(tm) that isn't + * intelligent should have a chance of becoming afraid. */ + makeknown(tstone->otyp); + if (u.uinwater) { + pline("You'd need a flamethrower to make fire here."); + return; + } + You("strike a few sparks from the flint stone!"); + if (u.uswallow) { + /* Not even the thing you're inside can see your piddly spark. */ + pline("That's not going to make it any brighter in here."); + if (!rn2(3)) { + Your("flint stone crumbles!"); + useup(tstone); + } + return; + } + + for (i = u.ux-1;i < u.ux+2;i++) { + for (j = u.uy-1;j < u.uy+2;j++) { + if (!isok(i,j)) { + continue; + } + mtmp = m_at(i,j); + /* blind monsters can't see it */ + if (!mtmp || mtmp->mblinded || !haseyes(mtmp->data)) { + continue; + } + /* only some things will be scared: + * animals and undead fear fire, but + * not if they're fire resistant, sufficiently powerful, + * gigantic (purple worm), or currently in water */ + if ((is_animal(mtmp->data) || is_undead(mtmp->data)) && + !(resists_fire(mtmp) || mtmp->data->mcolor == CLR_MAGENTA || + mtmp->data->msize == MZ_GIGANTIC || is_pool(i,j))) { + if (rn2(3)) { + monflee(mtmp,rnd(10), TRUE, TRUE); + } + } + } + } + if (!rn2(3)) { + Your("flint stone crumbles!"); + useup(tstone); + } + return; + } + } else if (streak_color) pline("You see %s streaks on the %s.", streak_color, stonebuf); else @@ -2786,5 +2893,5 @@ if(check_capacity((char *)0)) return (0); - if (carrying(POT_OIL) || uhave_graystone()) + if (carrying(FLINT) || carrying(POT_OIL) || uhave_graystone()) Strcpy(class_list, tools_too); else @@ -2997,4 +3104,10 @@ break; case FLINT: + if (Role_if(PM_CAVEMAN)) { + apply_flint(obj); + } else { + use_stone(obj); + } + break; case LUCKSTONE: case LOADSTONE: Only in nethack/src: apply.c.orig Only in nethack/src: artifact.c.orig diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/attrib.c nethack/src/attrib.c --- nh_orig/src/attrib.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/attrib.c 2007-04-11 15:41:51.000000000 -0400 @@ -621,6 +621,5 @@ newhp() { - int hp, conplus; - + int hp, conplus, tempnum; if (u.ulevel == 0) { @@ -645,4 +644,23 @@ if (urace.hpadv.hirnd > 0) hp += rnd(urace.hpadv.hirnd); } + + /* Cavemen get a tiny HP boost if they've remained illiterate, + as well as a tiny wisdom boost. The longer they remain illit, + the bigger the HP boost gets (capped at d3) */ + + if (Role_if(PM_CAVEMAN)) { + tempnum = 0; + if (u.uconduct.literate < 1) { + if (u.ulevel < 4) { + tempnum += 1; + } else if (u.ulevel < 8) { + tempnum += rnd(2); + } else { + tempnum += rnd(3); + } + exercise(A_WIS,TRUE); + } + hp += tempnum; + } } diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/dog.c nethack/src/dog.c --- nh_orig/src/dog.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/dog.c 2007-04-11 10:50:50.000000000 -0400 @@ -754,4 +754,13 @@ return((struct monst *)0); + /* Cavemen get a special case to tame mastodons with food, + * as they're a domestic to that class. OK, a really big + * domestic, but think Flintstone, awright already? :) */ + if (Role_if(PM_CAVEMAN)) { + if (mtmp->data == &mons[PM_MASTODON]) { + mtmp->mtame = 1; + } + } + /* worst case, at least it'll be peaceful. */ mtmp->mpeaceful = 1; diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/dothrow.c nethack/src/dothrow.c --- nh_orig/src/dothrow.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/dothrow.c 2007-04-11 10:50:50.000000000 -0400 @@ -128,4 +128,9 @@ if (obj->otyp == YA && uwep && uwep->otyp == YUMI) multishot++; break; + case PM_CAVEMAN: + if (uslinging()) { /* give an extra rock to cavies */ + multishot++; + } + break; default: break; /* No bonus */ diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/eat.c nethack/src/eat.c --- nh_orig/src/eat.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/eat.c 2007-04-11 10:50:50.000000000 -0400 @@ -454,4 +454,14 @@ return TRUE; } + + /* Cavemen get a bonus for cannibalism */ + if (Role_if(PM_CAVEMAN) && your_race(&mons[pm])) { + if (allowmsg) { + You("consume the corpse in accordance with ancient ritual."); + u.ualign.record += 5; + return FALSE; + } + } + return FALSE; } diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/monmove.c nethack/src/monmove.c --- nh_orig/src/monmove.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/monmove.c 2007-04-11 10:50:50.000000000 -0400 @@ -132,8 +132,12 @@ struct monst *mtmp; { + /* Some monsters don't scare from Elbereth or SCARE_MONSTER. + * Finally, your quest nemesis is now included in this :P */ + 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->data->msound == MS_NEMESIS)) return(FALSE); diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/pray.c nethack/src/pray.c --- nh_orig/src/pray.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/pray.c 2007-04-11 10:50:50.000000000 -0400 @@ -173,6 +173,14 @@ /* - * minor troubles + * Minor troubles from here forward. + * And Cavemen get another flavor kick: their god is also + * a bit primitive, so they get a 20% chance of god being + * asleep at the switch */ + + if (Role_if(PM_CAVEMAN) && !rn2(5)) { + return (0); + } + if(Punished) return(TROUBLE_PUNISHED); if (Cursed_obj(uarmg, GAUNTLETS_OF_FUMBLING) || @@ -847,5 +855,8 @@ fixed or there were no troubles to begin with; hallucination won't be in effect so special handling for it is superfluous */ - if(pat_on_head) + + /* Cavemen may be ignored occasionally by god */ + + if(pat_on_head && (Role_if(PM_CAVEMAN) ? rn2(5) : 1)) switch(rn2((Luck + 6)>>1)) { case 0: break; @@ -1014,4 +1025,6 @@ default: impossible("Confused deity!"); break; + } else if (pat_on_head) { + You_feel("that %s is not entirely paying attention.", align_gname(g_align)); } diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/role.c nethack/src/role.c --- nh_orig/src/role.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/role.c 2007-04-11 10:50:50.000000000 -0400 @@ -89,8 +89,8 @@ {"Pioneer", 0} }, "Anu", "_Ishtar", "Anshar", /* Babylonian */ - "Cav", "the Caves of the Ancestors", "the Dragon's Lair", + "Cav", "the Deep Jungle", "the Dragon's Lair", PM_CAVEMAN, PM_CAVEWOMAN, PM_LITTLE_DOG, PM_SHAMAN_KARNOV, PM_NEANDERTHAL, PM_CHROMATIC_DRAGON, - PM_BUGBEAR, PM_HILL_GIANT, S_HUMANOID, S_GIANT, + PM_TIGER, PM_APE, S_SNAKE, S_FELINE, ART_SCEPTRE_OF_MIGHT, MH_HUMAN|MH_DWARF|MH_GNOME | ROLE_MALE|ROLE_FEMALE | diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/spell.c nethack/src/spell.c --- nh_orig/src/spell.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/spell.c 2007-04-11 10:50:50.000000000 -0400 @@ -433,5 +433,5 @@ /* Books are often wiser than their readers (Rus.) */ spellbook->in_use = TRUE; - if (!spellbook->blessed && + if ((!spellbook->blessed || (spellbook->blessed && Role_if(PM_CAVEMAN))) && spellbook->otyp != SPE_BOOK_OF_THE_DEAD) { if (spellbook->cursed) { @@ -454,4 +454,10 @@ } } + + /* Cavemen always have at least a 20% chance to fail */ + if (Role_if(PM_CAVEMAN) && read_ability > 16) { + read_ability = 16; + } + /* its up to random luck now */ if (rnd(20) > read_ability) { diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/u_init.c nethack/src/u_init.c --- nh_orig/src/u_init.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/u_init.c 2007-04-11 10:50:50.000000000 -0400 @@ -290,5 +290,5 @@ static const struct def_skill Skill_C[] = { - { P_DAGGER, P_BASIC }, { P_KNIFE, P_SKILLED }, + { P_KNIFE, P_SKILLED }, { P_AXE, P_SKILLED }, { P_PICK_AXE, P_BASIC }, { P_CLUB, P_EXPERT }, { P_MACE, P_EXPERT }, @@ -298,7 +298,6 @@ { P_JAVELIN, P_SKILLED }, { P_TRIDENT, P_SKILLED }, { P_BOW, P_SKILLED }, { P_SLING, P_EXPERT }, - { P_ATTACK_SPELL, P_BASIC }, { P_MATTER_SPELL, P_SKILLED }, - { P_BOOMERANG, P_EXPERT }, { P_UNICORN_HORN, P_BASIC }, - { P_BARE_HANDED_COMBAT, P_MASTER }, + { P_ESCAPE_SPELL, P_SKILLED }, { P_MATTER_SPELL, P_SKILLED }, + { P_BOOMERANG, P_EXPERT }, { P_BARE_HANDED_COMBAT, P_MASTER }, { P_NONE, 0 } }; diff -X /home/derek/bin/nhdiff_exceptions -idEwr -U2 nh_orig/src/weapon.c nethack/src/weapon.c --- nh_orig/src/weapon.c 2003-12-07 18:39:13.000000000 -0500 +++ nethack/src/weapon.c 2007-04-11 10:50:50.000000000 -0400 @@ -1000,4 +1000,12 @@ int skill; { + + /* Cavemen are good at what they know how to use, + * but not much on advanced fencing or combat tactics. + * So never unrestrict an edged weapon for them. */ + if (Role_if(PM_CAVEMAN) && (skill >= P_DAGGER && skill <= P_SABER)) { + return; + } + if (skill < P_NUM_SKILLS && P_RESTRICTED(skill)) { P_SKILL(skill) = P_UNSKILLED;