summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarshan Shaligram <dshaligram@users.sourceforge.net>2010-01-08 13:11:44 +0530
committerDarshan Shaligram <dshaligram@users.sourceforge.net>2010-01-08 13:16:12 +0530
commit6d0eb3000187dd587e961ca87ddb9eca947f15dc (patch)
tree420aac3eaf6aee2ef5ccf5eebcef33d1fcd19791
parent2aef97c76417be892660cf4f91da3953f222d2b9 (diff)
downloadcrawl-ref-6d0eb3000187dd587e961ca87ddb9eca947f15dc.tar.gz
crawl-ref-6d0eb3000187dd587e961ca87ddb9eca947f15dc.zip
Add snapping turtles, alligator snapping turtles and sea snakes to the Shoals, remove yaktaurs, centaurs and stone giants.
Snapping turtles get reaching attacks. Sea snakes get strong venom.
-rw-r--r--crawl-ref/source/dat/descript/monsters.txt16
-rw-r--r--crawl-ref/source/enum.h4
-rw-r--r--crawl-ref/source/fight.cc11
-rw-r--r--crawl-ref/source/fight.h2
-rw-r--r--crawl-ref/source/mon-act.cc10
-rw-r--r--crawl-ref/source/mon-data.h47
-rw-r--r--crawl-ref/source/mon-pick.cc39
-rw-r--r--crawl-ref/source/mon-place.cc3
-rw-r--r--crawl-ref/source/mon-util.h3
9 files changed, 96 insertions, 39 deletions
diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt
index 7b421ab0a9..6b6c8e2cdd 100644
--- a/crawl-ref/source/dat/descript/monsters.txt
+++ b/crawl-ref/source/dat/descript/monsters.txt
@@ -838,7 +838,7 @@ grey rat
A very large grey rat.
%%%%
-grey snake
+anaconda
A very large grey python.
%%%%
@@ -1046,6 +1046,20 @@ Mara
This tall and powerful demon is Mara, Lord of Illusions, mighty among dreamers. He is capable of creating intricately detailed illusions, able to mislead even the minds of the mightiest and most brilliant spell-casters.
%%%%
+snapping turtle
+
+A large belligerent reptile, armoured in a carapace. Its neck is
+surprisingly extensible and can reach out and bite from afar.
+%%%%
+alligator snapping turtle
+
+A huge snapping turtle of unpleasant disposition. It can reach out and
+bite from afar.
+%%%%
+sea snake
+
+A brightly coloured snake with a potent venomous bite.
+%%%%
merfolk
Half fish, half man, the merfolk are citizens of both water and land, and fierce protectors of their chosen territory.
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 8c43ec175b..90b38b78ae 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -1816,6 +1816,10 @@ enum monster_type // (int) menv[].type
MONS_MERFOLK_AQUAMANCER,
MONS_MERFOLK_JAVELINEER,
+ MONS_SNAPPING_TURTLE,
+ MONS_ALLIGATOR_SNAPPING_TURTLE,
+ MONS_SEA_SNAKE,
+
//jmf: end new monsters
MONS_WHITE_IMP = 220, // 220
MONS_LEMURE,
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index 5e61322646..9bcc3a5256 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -4542,7 +4542,7 @@ std::string melee_attack::mons_attack_verb(const mon_attack_def &attk)
return (attack_types[attk.type]);
}
-std::string melee_attack::mons_weapon_desc()
+std::string melee_attack::mons_attack_desc(const mon_attack_def &attk)
{
if (!you.can_see(attacker))
return ("");
@@ -4565,6 +4565,11 @@ std::string melee_attack::mons_weapon_desc()
return (result);
}
+ else if (attk.flavour == AF_REACH
+ && grid_distance(attacker->pos(), defender->pos()) == 2)
+ {
+ return " from afar";
+ }
return ("");
}
@@ -4592,7 +4597,7 @@ void melee_attack::mons_announce_hit(const mon_attack_def &attk)
attacker->conj_verb( mons_attack_verb(attk) ).c_str(),
mons_defender_name().c_str(),
debug_damage_number().c_str(),
- mons_weapon_desc().c_str(),
+ mons_attack_desc(attk).c_str(),
attack_strength_punctuation().c_str());
}
}
@@ -5286,7 +5291,7 @@ void melee_attack::mons_perform_attack_rounds()
}
// Skip dummy attacks.
- if ((attk.type != AT_HIT && !unarmed_ok)
+ if ((!unarmed_ok && attk.type != AT_HIT && attk.flavour != AF_REACH)
|| attk.type == AT_SHOOT)
{
--effective_attack_number;
diff --git a/crawl-ref/source/fight.h b/crawl-ref/source/fight.h
index 2bc47bd030..538858a4d8 100644
--- a/crawl-ref/source/fight.h
+++ b/crawl-ref/source/fight.h
@@ -229,7 +229,7 @@ private:
void mons_perform_attack_rounds();
void mons_check_attack_perceived();
std::string mons_attack_verb(const mon_attack_def &attk);
- std::string mons_weapon_desc();
+ std::string mons_attack_desc(const mon_attack_def &attk);
void mons_announce_hit(const mon_attack_def &attk);
void mons_announce_dud_hit(const mon_attack_def &attk);
void mons_set_weapon(const mon_attack_def &attk);
diff --git a/crawl-ref/source/mon-act.cc b/crawl-ref/source/mon-act.cc
index 092fb0aaa7..2065414df9 100644
--- a/crawl-ref/source/mon-act.cc
+++ b/crawl-ref/source/mon-act.cc
@@ -737,7 +737,8 @@ static bool _handle_potion(monsters *monster, bolt & beem)
static bool _handle_reaching(monsters *monster)
{
bool ret = false;
- const int wpn = monster->inv[MSLOT_WEAPON];
+ item_def *wpn = monster->weapon(0);
+ const mon_attack_def attk(mons_attack_spec(monster, 0));
if (monster->submerged())
return (false);
@@ -745,7 +746,8 @@ static bool _handle_reaching(monsters *monster)
if (mons_aligned(monster->mindex(), monster->foe))
return (false);
- if (wpn != NON_ITEM && get_weapon_brand(mitm[wpn]) == SPWPN_REACHING)
+ if ((wpn && get_weapon_brand(*wpn) == SPWPN_REACHING)
+ || (attk.flavour == AF_REACH && attk.damage))
{
if (monster->foe == MHITYOU)
{
@@ -782,8 +784,8 @@ static bool _handle_reaching(monsters *monster)
}
// Player saw the item reach.
- if (ret && !is_artefact(mitm[wpn]) && you.can_see(monster))
- set_ident_flags(mitm[wpn], ISFLAG_KNOW_TYPE);
+ if (ret && wpn && !is_artefact(*wpn) && you.can_see(monster))
+ set_ident_flags(*wpn, ISFLAG_KNOW_TYPE);
return (ret);
}
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 083898d3c4..80a14cf626 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -1105,6 +1105,31 @@ static monsterentry mondata[] = {
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_BIG
},
+{
+ MONS_SNAPPING_TURTLE, 't', RED, "snapping turtle",
+ M_COLD_BLOOD,
+ MR_NO_FLAGS,
+ 500, 5, MONS_SNAPPING_TURTLE, MONS_SNAPPING_TURTLE, MH_NATURAL, -3,
+ { {AT_BITE, AF_REACH, 30}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 10, 3, 6, 0 },
+ 16, 5, MST_NO_SPELLS, CE_CLEAN, Z_SMALL, S_HISS,
+ I_ANIMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 9, ACTION_ENERGY(8),
+ MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
+},
+
+{
+ MONS_ALLIGATOR_SNAPPING_TURTLE, 't', LIGHTRED, "alligator snapping turtle",
+ M_COLD_BLOOD,
+ MR_NO_FLAGS,
+ 1000, 5, MONS_SNAPPING_TURTLE, MONS_ALLIGATOR_SNAPPING_TURTLE,
+ MH_NATURAL, -3,
+ { {AT_BITE, AF_REACH, 50}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 16, 7, 4, 0 },
+ 19, 2, MST_NO_SPELLS, CE_CLEAN, Z_SMALL, S_HISS,
+ I_ANIMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
+},
+
// merfolk ('m')
{
MONS_MERFOLK, 'm', BLUE, "merfolk",
@@ -1114,7 +1139,7 @@ static monsterentry mondata[] = {
{ {AT_HIT, AF_PLAIN, 18}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 9, 2, 4, 0 },
4, 12, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
- I_NORMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 10, DEFAULT_ENERGY,
+ I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -1123,11 +1148,11 @@ static monsterentry mondata[] = {
M_WARM_BLOOD,
MR_NO_FLAGS,
500, 8, MONS_MERFOLK, MONS_MERFOLK, MH_NATURAL, -3,
- { {AT_HIT, AF_PLAIN, 24}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { {AT_HIT, AF_PLAIN, 28}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 12, 5, 4, 0 },
// Impalers prefer light armour, and are dodging experts.
0, 23, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
- I_NORMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 10, ATTACK_ENERGY(6),
+ I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, ATTACK_ENERGY(6),
MONUSE_MAGIC_ITEMS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -1139,7 +1164,7 @@ static monsterentry mondata[] = {
{ {AT_SHOOT, AF_PLAIN, 16}, {AT_HIT, AF_PLAIN, 17}, AT_NO_ATK, AT_NO_ATK },
{ 13, 5, 2, 0 },
0, 15, MST_NO_SPELLS, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
- I_NORMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 10, DEFAULT_ENERGY,
+ I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_MAGIC_ITEMS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -1151,7 +1176,7 @@ static monsterentry mondata[] = {
{ {AT_HIT, AF_PLAIN, 15}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 15, 3, 3, 0 },
0, 12, MST_MERFOLK_AQUAMANCER, CE_CONTAMINATED, Z_SMALL, S_SHOUT,
- I_NORMAL, HT_AMPHIBIOUS_LAND, FL_NONE, 10, DEFAULT_ENERGY,
+ I_NORMAL, HT_AMPHIBIOUS_WATER, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_MAGIC_ITEMS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -2925,6 +2950,18 @@ static monsterentry mondata[] = {
},
{
+ MONS_SEA_SNAKE, 'S', LIGHTCYAN, "sea snake",
+ M_COLD_BLOOD,
+ MR_NO_FLAGS,
+ 400, 10, MONS_SNAKE, MONS_SEA_SNAKE, MH_NATURAL, -3,
+ { {AT_BITE, AF_POISON_STRONG, 24}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { 10, 4, 5, 0 },
+ 2, 15, MST_NO_SPELLS, CE_POISONOUS, Z_SMALL, S_HISS,
+ I_INSECT, HT_AMPHIBIOUS_WATER, FL_NONE, 14, DEFAULT_ENERGY,
+ MONUSE_NOTHING, MONEAT_NOTHING, SIZE_MEDIUM
+},
+
+{
MONS_ANACONDA, 'S', LIGHTGREY, "anaconda",
M_COLD_BLOOD,
MR_NO_FLAGS,
diff --git a/crawl-ref/source/mon-pick.cc b/crawl-ref/source/mon-pick.cc
index 3ed21bafb6..0dfefef114 100644
--- a/crawl-ref/source/mon-pick.cc
+++ b/crawl-ref/source/mon-pick.cc
@@ -1704,37 +1704,32 @@ int mons_shoals_level(int mcls)
case MONS_MERFOLK:
case MONS_MERMAID:
- case MONS_CENTAUR:
case MONS_HIPPOGRIFF:
+ case MONS_SEA_SNAKE:
mlev++;
break;
- case MONS_YAKTAUR:
case MONS_MANTICORE:
+ case MONS_SNAPPING_TURTLE:
mlev += 2;
break;
- case MONS_CENTAUR_WARRIOR:
case MONS_CYCLOPS: // will have a sheep band
case MONS_SIREN:
case MONS_HARPY:
mlev += 3;
break;
- case MONS_STONE_GIANT:
case MONS_OKLOB_PLANT:
case MONS_SHARK:
case MONS_KRAKEN:
+ case MONS_ALLIGATOR_SNAPPING_TURTLE:
case MONS_MERFOLK_IMPALER:
case MONS_MERFOLK_AQUAMANCER:
case MONS_MERFOLK_JAVELINEER:
mlev += 4;
break;
- case MONS_YAKTAUR_CAPTAIN:
- mlev += 5;
- break;
-
default:
mlev += 99;
}
@@ -1746,38 +1741,36 @@ int mons_shoals_rare(int mcls)
switch (mcls)
{
case MONS_MERFOLK:
- return 50;
+ return 90;
+
+ case MONS_SNAPPING_TURTLE:
+ return 45;
case MONS_MERMAID:
+ case MONS_MANTICORE:
+ case MONS_SEA_SNAKE:
return 40;
case MONS_HIPPOGRIFF:
case MONS_GIANT_BAT:
case MONS_BUTTERFLY:
- case MONS_CENTAUR:
return 35;
- case MONS_SIREN:
- case MONS_YAKTAUR:
- case MONS_MERFOLK_IMPALER:
- case MONS_MERFOLK_JAVELINEER:
- return 25;
-
case MONS_CYCLOPS:
- case MONS_CENTAUR_WARRIOR:
case MONS_HARPY:
+ case MONS_SIREN:
case MONS_MERFOLK_AQUAMANCER:
+ case MONS_MERFOLK_IMPALER:
+ case MONS_MERFOLK_JAVELINEER:
return 20;
- case MONS_STONE_GIANT:
- case MONS_YAKTAUR_CAPTAIN:
case MONS_SHARK:
- case MONS_KRAKEN:
- return 10;
+ case MONS_ALLIGATOR_SNAPPING_TURTLE:
+ return 18;
case MONS_OKLOB_PLANT:
- case MONS_MANTICORE:
- return 5;
+ case MONS_KRAKEN:
+ return 10;
default:
return 0;
}
diff --git a/crawl-ref/source/mon-place.cc b/crawl-ref/source/mon-place.cc
index 884477362c..0e56e36c8f 100644
--- a/crawl-ref/source/mon-place.cc
+++ b/crawl-ref/source/mon-place.cc
@@ -199,7 +199,8 @@ bool monster_can_submerge(const monsters *mons, dungeon_feature_type grid)
{
case HT_WATER:
// Monsters can submerge in shallow water - this is intentional.
- return (feat_is_watery(grid));
+ return (feat_is_watery(grid)
+ && mons_genus(mons_base_type(mons)) != MONS_MERFOLK);
case HT_LAVA:
return (grid == DNGN_LAVA);
diff --git a/crawl-ref/source/mon-util.h b/crawl-ref/source/mon-util.h
index 931c817748..a712d1d9bd 100644
--- a/crawl-ref/source/mon-util.h
+++ b/crawl-ref/source/mon-util.h
@@ -89,7 +89,8 @@ enum mon_attack_flavour
AF_CHAOS,
AF_STEAL,
AF_STEAL_FOOD,
- AF_CRUSH
+ AF_CRUSH,
+ AF_REACH
};
// Non-spell "summoning" types to give to monsters::mark_summoned(), or