diff -Naur nethack-3.4.3/include/monflag.h nethack-handling/include/monflag.h --- nethack-3.4.3/include/monflag.h 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/include/monflag.h 2005-02-24 13:25:30.000000000 +1100 @@ -160,6 +160,11 @@ #define M3_INFRAVISION 0x0100 /* has infravision */ #define M3_INFRAVISIBLE 0x0200 /* visible by infravision */ +/* MRKR: M3_NATUAL means the monster is of a kind that can be quieted */ +/* with animal handling, i.e. it is is "natural animal" */ + +#define M3_NATURAL 0x0400 /* a natural aniaml */ + #define MZ_TINY 0 /* < 2' */ #define MZ_SMALL 1 /* 2-4' */ #define MZ_MEDIUM 2 /* 4-7' */ diff -Naur nethack-3.4.3/include/skills.h nethack-handling/include/skills.h --- nethack-3.4.3/include/skills.h 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/include/skills.h 2005-02-20 15:05:41.000000000 +1100 @@ -74,8 +74,11 @@ #define P_LAST_H_TO_H P_TWO_WEAPON_COMBAT #endif #define P_FIRST_H_TO_H P_BARE_HANDED_COMBAT - -#define P_NUM_SKILLS (P_LAST_H_TO_H+1) +/* MRKR: Non combat skills */ +#define P_ANIMAL_HANDLING (P_LAST_H_TO_H+1) +#define P_FIRST_NON_COMBAT P_ANIMAL_HANDLING +#define P_LAST_NON_COMBAT P_ANIMAL_HANDLING +#define P_NUM_SKILLS (P_LAST_NON_COMBAT+1) /* These roles qualify for a martial arts bonus */ #define martial_bonus() (Role_if(PM_SAMURAI) || Role_if(PM_MONK)) diff -Naur nethack-3.4.3/src/monst.c nethack-handling/src/monst.c --- nethack-3.4.3/src/monst.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/src/monst.c 2005-02-24 13:47:08.000000000 +1100 @@ -200,21 +200,23 @@ A(ATTK(AT_BITE, AD_PHYS, 1, 2), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, - CLR_BROWN), + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("fox", S_DOG, LVL(0, 15, 7, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_RED), MON("coyote", S_DOG, LVL(1, 12, 7, 0, 0), (G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(300, 250, 0, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("werejackal", S_DOG, LVL(2, 12, 7, 10, -7), (G_NOGEN|G_NOCORPSE), @@ -228,14 +230,16 @@ A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, 0, MS_BARK, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, + M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("dog", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1 ,6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, + M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("large dog", S_DOG, LVL(6, 15, 4, 0, 0), (G_GENO|1), @@ -243,20 +247,22 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(800, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), + M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("dingo", S_DOG, LVL(4, 16, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1 ,6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 200, 0, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_YELLOW), MON("wolf", S_DOG, LVL(5, 12, 4, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(500, 250, 0, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("werewolf", S_DOG, LVL(5, 12, 4, 20, -7), (G_NOGEN|G_NOCORPSE), @@ -270,21 +276,23 @@ A(ATTK(AT_BITE, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(850, 350, 0, MS_BARK, MZ_MEDIUM), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("winter wolf cub", S_DOG, LVL(5, 12, 4, 0, -5), (G_NOHELL|G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 8), ATTK(AT_BREA, AD_COLD, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 200, 0, MS_BARK, MZ_SMALL), MR_COLD, MR_COLD, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, 0, CLR_CYAN), + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_NATURAL, CLR_CYAN), MON("winter wolf", S_DOG, LVL(7, 12, 4, 20, 0), (G_NOHELL|G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_COLD, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(700, 300, 0, MS_BARK, MZ_LARGE), MR_COLD, MR_COLD, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_HOSTILE|M2_STRONG, 0, CLR_CYAN), + M2_HOSTILE|M2_STRONG, M3_NATURAL, CLR_CYAN), MON("hell hound pup", S_DOG, LVL(7, 12, 4, 20, -5), (G_HELL|G_GENO|G_SGROUP|1), A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_BREA, AD_FIRE, 2, 6), @@ -306,7 +314,9 @@ ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1000, 350, 0, MS_BARK, MZ_LARGE), MR_FIRE, MR_FIRE, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_NOPOLY|M2_HOSTILE|M2_STRONG|M2_PNAME|M2_MALE, M3_INFRAVISIBLE, + M2_NOPOLY|M2_HOSTILE|M2_STRONG|M2_PNAME|M2_MALE, + /* MRKR: What the heck, let 'em try */ + M3_INFRAVISIBLE|M3_NATURAL, CLR_RED), #endif /* @@ -366,34 +376,38 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(150, 150, 0, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), + M2_WANDER|M2_DOMESTIC, M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("housecat", S_FELINE, LVL(4, 16, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(200, 200, 0, MS_MEW, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_DOMESTIC, + M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("jaguar", S_FELINE, LVL(4, 15, 6, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("lynx", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_CYAN), MON("panther", S_FELINE, LVL(5, 15, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE,M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BLACK), MON("large cat", S_FELINE, LVL(6, 15, 4, 0, 0), (G_GENO|1), @@ -401,13 +415,14 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(250, 250, 0, MS_MEW, MZ_SMALL), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE, HI_DOMESTIC), + M2_STRONG|M2_DOMESTIC, M3_INFRAVISIBLE|M3_NATURAL, HI_DOMESTIC), MON("tiger", S_FELINE, LVL(6, 12, 6, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_CLAW, AD_PHYS, 2, 4), ATTK(AT_BITE, AD_PHYS, 1,10), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 300, 0, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_YELLOW), /* * gremlins and gargoyles @@ -748,7 +763,8 @@ A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(400, 100, 0, MS_SILENT, MZ_LARGE), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("mumak", S_QUADRUPED, LVL(5, 9, 0, 0, -2), (G_GENO|1), @@ -756,42 +772,42 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_ROAR, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), MON("leocrotta", S_QUADRUPED, LVL(6, 18, 4, 10, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 6), ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_CLAW, AD_PHYS, 2, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 500, 0, MS_IMITATE, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, M2_HOSTILE|M2_STRONG, - M3_INFRAVISIBLE, CLR_RED), + M3_INFRAVISIBLE|M3_NATURAL, CLR_RED), MON("wumpus", S_QUADRUPED, LVL(8, 3, 2, 10, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2500, 500, 0, MS_BURBLE, MZ_LARGE), 0, 0, M1_CLING|M1_ANIMAL|M1_NOHANDS|M1_OMNIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_CYAN), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_CYAN), MON("titanothere", S_QUADRUPED, LVL(12, 12, 6, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2650, 650, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), MON("baluchitherium", S_QUADRUPED, LVL(14, 12, 5, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 5, 4), ATTK(AT_CLAW, AD_PHYS, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), MON("mastodon", S_QUADRUPED, LVL(20, 12, 5, 0, 0), (G_GENO|1), A(ATTK(AT_BUTT, AD_PHYS, 4, 8), ATTK(AT_BUTT, AD_PHYS, 4, 8), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(3800, 800, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_THICK_HIDE|M1_NOHANDS|M1_HERBIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_BLACK), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_BLACK), /* * rodents */ @@ -800,21 +816,24 @@ A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 12, 0, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("giant rat", S_RODENT, LVL(1, 10, 7, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_TINY), 0, 0, - M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("rabid rat", S_RODENT, LVL(2, 12, 6, 0, 0), (G_GENO|1), A(ATTK(AT_BITE, AD_DRCO, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 5, 0, MS_SQEEK, MZ_TINY), MR_POISON, 0, - M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, M3_INFRAVISIBLE, + M1_ANIMAL|M1_NOHANDS|M1_POIS|M1_CARNIVORE, M2_HOSTILE, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("wererat", S_RODENT, LVL(2, 12, 6, 10, -7), (G_NOGEN|G_NOCORPSE), @@ -829,15 +848,16 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_TUNNEL|M1_ANIMAL|M1_NOHANDS|M1_METALLIVORE, - M2_HOSTILE|M2_GREEDY|M2_JEWELS|M2_COLLECT, M3_INFRAVISIBLE, CLR_GRAY), + M2_HOSTILE|M2_GREEDY|M2_JEWELS|M2_COLLECT, + M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), MON("woodchuck", S_RODENT, LVL(3, 3, 0, 20, 0), (G_NOGEN|G_GENO), A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SILENT, MZ_SMALL), 0, 0, M1_TUNNEL/*LOGGING*/|M1_ANIMAL|M1_NOHANDS|M1_SWIM|M1_HERBIVORE, - /* In reality, they tunnel instead of cutting lumber. Oh, well. */ - M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BROWN), + /* In reality, they tunnel instead of cutting lumber. Oh, well. */ + M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), /* * spiders & scorpions (keep webmaker() in sync if new critters are added) */ @@ -916,21 +936,21 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1300, 250, 0, MS_NEIGH, MZ_MEDIUM), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("horse", S_UNICORN, LVL(5, 20, 5, 0, 0), (G_GENO|2), A(ATTK(AT_KICK, AD_PHYS, 1, 8), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), 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), + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), 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), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1800, 350, 0, MS_NEIGH, MZ_LARGE), 0, 0, M1_ANIMAL|M1_NOHANDS|M1_HERBIVORE, M2_WANDER|M2_STRONG|M2_DOMESTIC, - M3_INFRAVISIBLE, CLR_BROWN), + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), /* * vortices */ @@ -993,28 +1013,28 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 250, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE|M1_NOTAKE, - M2_HOSTILE, 0, CLR_BROWN), + M2_HOSTILE, M3_NATURAL, CLR_BROWN), MON("baby purple worm", S_WORM, LVL(8, 3, 5, 0, 0), G_GENO, A(ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(600, 250, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_CARNIVORE, M2_HOSTILE, - 0, CLR_MAGENTA), + M3_NATURAL, CLR_MAGENTA), MON("long worm", S_WORM, LVL(8, 3, 5, 10, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1500, 500, 0, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_OVIPAROUS|M1_CARNIVORE|M1_NOTAKE, - M2_HOSTILE|M2_STRONG|M2_NASTY, 0, CLR_BROWN), + M2_HOSTILE|M2_STRONG|M2_NASTY, M3_NATURAL, CLR_BROWN), MON("purple worm", S_WORM, LVL(15, 9, 6, 20, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 2, 8), ATTK(AT_ENGL, AD_DGST, 1,10), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(2700, 700, 0, MS_SILENT, MZ_GIGANTIC), 0, 0, M1_ANIMAL|M1_SLITHY|M1_NOLIMBS|M1_OVIPAROUS|M1_CARNIVORE, - M2_HOSTILE|M2_STRONG|M2_NASTY, 0, CLR_MAGENTA), + M2_HOSTILE|M2_STRONG|M2_NASTY, M3_NATURAL, CLR_MAGENTA), /* * xan, &c */ @@ -1063,7 +1083,7 @@ ATTK(AT_BITE, AD_PHYS, 3, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1200, 600, 0, MS_SILENT, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, - M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE, CLR_BROWN), + M2_HOSTILE|M2_STRONG, M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), /* * Angels and other lawful minions */ @@ -1122,7 +1142,8 @@ A(ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(20, 20, 0, MS_SQEEK, MZ_TINY), 0, 0, - M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER, M3_INFRAVISIBLE, + M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, M2_WANDER, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("giant bat", S_BAT, LVL(2, 22, 7, 0, 0), (G_GENO|2), @@ -1130,14 +1151,14 @@ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(30, 30, 0, MS_SQEEK, MZ_SMALL), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_RED), + M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE|M3_NATURAL, CLR_RED), MON("raven", S_BAT, LVL(4, 20, 6, 0, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_BLND, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(40, 20, 0, MS_SQAWK, MZ_SMALL), 0, 0, M1_FLY|M1_ANIMAL|M1_NOHANDS|M1_CARNIVORE, - M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE, CLR_BLACK), + M2_WANDER|M2_HOSTILE, M3_INFRAVISIBLE|M3_NATURAL, CLR_BLACK), MON("vampire bat", S_BAT, LVL(5, 20, 6, 0, 0), (G_GENO|2), A(ATTK(AT_BITE, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_DRST, 0, 0), @@ -1580,7 +1601,8 @@ NO_ATTK, NO_ATTK), SIZ(1300, 600, 0, MS_BURBLE, MZ_LARGE), 0, 0, M1_ANIMAL|M1_FLY|M1_CARNIVORE, - M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, M3_INFRAVISIBLE, CLR_ORANGE), + M2_HOSTILE|M2_STRONG|M2_NASTY|M2_COLLECT, + M3_INFRAVISIBLE|M3_NATURAL, CLR_ORANGE), #if 0 /* DEFERRED */ MON("vorpal jabberwock", S_JABBERWOCK, LVL(20, 12, -2, 50, 0), (G_GENO|1), @@ -2071,13 +2093,15 @@ A(ATTK(AT_CLAW, AD_SITM, 0, 0), ATTK(AT_BITE, AD_PHYS, 1, 3), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK), SIZ(100, 50, 0, MS_GROWL, MZ_SMALL), 0, 0, - M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, 0, M3_INFRAVISIBLE, CLR_GRAY), + M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, 0, + M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), MON("ape", S_YETI, LVL(4, 12, 6, 0, 0), (G_GENO|G_SGROUP|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_CLAW, AD_PHYS, 1, 3), ATTK(AT_BITE, AD_PHYS, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1100, 500, 0, MS_GROWL, MZ_LARGE), 0, 0, - M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_STRONG, M3_INFRAVISIBLE, + M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_STRONG, + M3_INFRAVISIBLE|M3_NATURAL, CLR_BROWN), MON("owlbear", S_YETI, LVL(5, 12, 5, 0, 0), (G_GENO|3), @@ -2085,28 +2109,29 @@ ATTK(AT_HUGS, AD_PHYS, 2, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1700, 700, 0, MS_ROAR, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, - M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE, CLR_BROWN), + M2_HOSTILE|M2_STRONG|M2_NASTY, M3_INFRAVISIBLE|M3_NATURAL, + CLR_BROWN), MON("yeti", S_YETI, LVL(5, 15, 6, 0, 0), (G_GENO|2), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_BITE, AD_PHYS, 1, 4), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1600, 700, 0, MS_GROWL, MZ_LARGE), MR_COLD, MR_COLD, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, - M3_INFRAVISIBLE, CLR_WHITE), + M3_INFRAVISIBLE|M3_NATURAL, CLR_WHITE), MON("carnivorous ape", S_YETI, LVL(6, 12, 6, 0, 0), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_CLAW, AD_PHYS, 1, 4), ATTK(AT_HUGS, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1250, 550, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_CARNIVORE, M2_HOSTILE|M2_STRONG, - M3_INFRAVISIBLE, CLR_BLACK), + M3_INFRAVISIBLE|M3_NATURAL, CLR_BLACK), MON("sasquatch", S_YETI, LVL(7, 15, 6, 0, 2), (G_GENO|1), A(ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_CLAW, AD_PHYS, 1, 6), ATTK(AT_KICK, AD_PHYS, 1, 8), NO_ATTK, NO_ATTK, NO_ATTK), SIZ(1550, 750, 0, MS_GROWL, MZ_LARGE), 0, 0, M1_ANIMAL|M1_HUMANOID|M1_SEE_INVIS|M1_OMNIVORE, M2_STRONG, - M3_INFRAVISIBLE, CLR_GRAY), + M3_INFRAVISIBLE|M3_NATURAL, CLR_GRAY), /* * Zombies */ diff -Naur nethack-3.4.3/src/sounds.c nethack-handling/src/sounds.c --- nethack-3.4.3/src/sounds.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/src/sounds.c 2005-03-01 10:12:27.000000000 +1100 @@ -923,6 +923,43 @@ return (0); } + /* MRKR: Animal handling */ + + if (P_SKILL(P_ANIMAL_HANDLING) != P_ISRESTRICTED) { + if (!mtmp->mpeaceful && mtmp->data->mflags3 & M3_NATURAL) { + You("murmur calming noises to %s.", mon_nam(mtmp)); + + int prob = 5 * P_SKILL(P_ANIMAL_HANDLING); + int diff = (u.ulevel - mtmp->m_lev); + + if (diff < 0) { + // For every 4 levels, halve the probability of success + + for (diff = (-diff - 1) / 4 + 1; + diff > 0;diff--) prob /= 2; + } + else if (diff > 0) { + // For every 4 levels, halve the probability of failure + prob = 100 - prob; + for (diff = diff / 4; + diff > 0;diff--) prob /= 2; + prob = 100 - prob; + } + + if (rn2(100) < prob) { + pline("%s calms down.", Monnam(mtmp)); + mtmp->mpeaceful = 1; + set_malign(mtmp); +#ifdef PARTIAL_XP + grant_partial_experience(mtmp, 1, 2); +#endif + } + use_skill(P_ANIMAL_HANDLING, 1); + } + domonnoise(mtmp); + return 1; + } + return domonnoise(mtmp); } diff -Naur nethack-3.4.3/src/u_init.c nethack-handling/src/u_init.c --- nethack-3.4.3/src/u_init.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/src/u_init.c 2005-02-20 16:01:17.000000000 +1100 @@ -300,6 +300,7 @@ { 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_ANIMAL_HANDLING, P_BASIC }, { P_NONE, 0 } }; @@ -348,6 +349,7 @@ { P_CLERIC_SPELL, P_SKILLED }, { P_ESCAPE_SPELL, P_BASIC }, { P_MATTER_SPELL, P_BASIC }, { P_MARTIAL_ARTS, P_GRAND_MASTER }, + { P_ANIMAL_HANDLING, P_SKILLED }, { P_NONE, 0 } }; @@ -404,6 +406,7 @@ #ifdef STEED { P_RIDING, P_BASIC }, #endif + { P_ANIMAL_HANDLING, P_EXPERT }, { P_BARE_HANDED_COMBAT, P_BASIC }, { P_NONE, 0 } }; @@ -447,6 +450,7 @@ #ifdef STEED { P_RIDING, P_BASIC }, #endif + { P_ANIMAL_HANDLING, P_BASIC }, { P_TWO_WEAPON_COMBAT, P_SKILLED }, { P_BARE_HANDED_COMBAT, P_SKILLED }, { P_NONE, 0 } diff -Naur nethack-3.4.3/src/weapon.c nethack-handling/src/weapon.c --- nethack-3.4.3/src/weapon.c 2003-12-08 10:39:13.000000000 +1100 +++ nethack-handling/src/weapon.c 2005-02-24 14:49:43.000000000 +1100 @@ -25,6 +25,7 @@ #define PN_CLERIC_SPELL (-12) #define PN_ESCAPE_SPELL (-13) #define PN_MATTER_SPELL (-14) +#define PN_ANIMAL_HANDLING (-15) STATIC_DCL void FDECL(give_may_advance_msg, (int)); @@ -51,8 +52,9 @@ PN_MATTER_SPELL, PN_BARE_HANDED, PN_TWO_WEAPONS, #ifdef STEED - PN_RIDING + PN_RIDING, #endif + PN_ANIMAL_HANDLING }; /* note: entry [0] isn't used */ @@ -72,6 +74,7 @@ "clerical spells", "escape spells", "matter spells", + "animal handling", }; /* indexed vis `is_martial() */ STATIC_VAR NEARDATA const char * const barehands_or_martial[] = { @@ -839,6 +842,7 @@ { P_FIRST_H_TO_H, P_LAST_H_TO_H, "Fighting Skills" }, { P_FIRST_WEAPON, P_LAST_WEAPON, "Weapon Skills" }, { P_FIRST_SPELL, P_LAST_SPELL, "Spellcasting Skills" }, + { P_FIRST_NON_COMBAT, P_LAST_NON_COMBAT, "Non-Combat Skills" }, }; /* @@ -1283,6 +1287,11 @@ P_SKILL(P_RIDING) = P_BASIC; #endif + /* MRKR: Rangers start with basic animal handling */ + if (Role_if(PM_RANGER)) { + P_SKILL(P_ANIMAL_HANDLING) = P_BASIC; + } + /* * Make sure we haven't missed setting the max on a skill * & set advance