summaryrefslogtreecommitdiffstats
path: root/crawl-ref
diff options
context:
space:
mode:
authorjohnny shelley <jwshelley@shell-23006.(none)>2009-11-15 03:52:15 +0000
committerStefan O'Rear <stefanor@cox.net>2009-11-14 23:22:03 -0800
commitdd56050f2d05db6ed7ff5bc99acd1032707c27fd (patch)
treebc15eec8b791380652ed3dd7b68609684e8333ca /crawl-ref
parent4cb4bea3108f8fa560669bab120623729b3ff4b8 (diff)
downloadcrawl-ref-dd56050f2d05db6ed7ff5bc99acd1032707c27fd.tar.gz
crawl-ref-dd56050f2d05db6ed7ff5bc99acd1032707c27fd.zip
Warper Overhaul - Renamed to Arcane Marksman
Missile Changes -- electricity missiles are now an option - they are always destroyed reaping / dispersal ammo is now always destroyed as it can be created by players poison ammo can again affect rocks / bullets etc - still no nets. Apparently this is a contact poison, but mainly it's to close the gap between sling users and archers. SKILLS -- Ranged weapon 3 Dodging 2 Spellcasting 2 Enchantments OR Translocations 3 EQUIPMENT -- Robe Ration Scroll of blink Some ranged weapon options as Hunter No melee weapon! Either book of elemental missiles or warped missiles The book of Elemental Missiles Spells Type Level a - Corona Enchantment 1 b - Swiftness Enchantment/Air 2 c - Repel Missiles Enchantment/Air 2 d - Flame Ammunition Enchantment/Fire 3 e - Frost Ammunition Enchantment/Ice 3 f - Poison Ammunition Enchantment/Poison 4 The book of Warped Missiles Spells Type Level a - Apportation Translocation 1 b - Portal Projectile Translocation 2 c - Repel Missiles Enchantment/Air 2 d - Blink Translocation 2 e - Returning Ammunition Enchantment/Translocation 3 f - Warp Ammunition Enchantment/Translocation 5 The book of Devastating Missiles Spells Type Level a - Poison Ammunition Enchantment/Poison 4 b - Warp Ammunition Enchantment/Translocation 5 c - Shocking Ammunition Enchantment/Air 5 d - Haste Enchantment 6 e - Deflect Missiles Enchantment/Air 6 f - Exploding Ammunition Enchantment/Fire/Air 7 g - Reaping Ammunition Enchantment/Necromancy 7 Signed-off-by: Stefan O'Rear <stefanor@cox.net>
Diffstat (limited to 'crawl-ref')
-rw-r--r--crawl-ref/docs/crawl_manual.txt9
-rw-r--r--crawl-ref/source/acr.cc2
-rw-r--r--crawl-ref/source/dat/descript/spells.txt28
-rw-r--r--crawl-ref/source/describe.cc6
-rw-r--r--crawl-ref/source/enum.h20
-rw-r--r--crawl-ref/source/item_use.cc3
-rw-r--r--crawl-ref/source/itemname.cc6
-rw-r--r--crawl-ref/source/itemprop.h3
-rw-r--r--crawl-ref/source/jobs.cc6
-rw-r--r--crawl-ref/source/newgame.cc85
-rw-r--r--crawl-ref/source/ng-restr.cc2
-rw-r--r--crawl-ref/source/shopping.cc1
-rw-r--r--crawl-ref/source/spells2.cc5
-rw-r--r--crawl-ref/source/spells3.cc125
-rw-r--r--crawl-ref/source/spells3.h2
-rw-r--r--crawl-ref/source/spl-book.cc71
-rw-r--r--crawl-ref/source/spl-cast.cc30
-rw-r--r--crawl-ref/source/spl-data.h91
-rw-r--r--crawl-ref/source/tilepick.cc2
19 files changed, 426 insertions, 71 deletions
diff --git a/crawl-ref/docs/crawl_manual.txt b/crawl-ref/docs/crawl_manual.txt
index 4560941534..3fd7ac0353 100644
--- a/crawl-ref/docs/crawl_manual.txt
+++ b/crawl-ref/docs/crawl_manual.txt
@@ -1962,11 +1962,12 @@ Reavers:
Reavers are warriors who learn the magics of destruction in order to
complement their deadliness in hand combat.
-Warpers:
+Arcane Marksmen:
--------
-Warpers specialise in translocation magic, and are experts in travelling
-long distances and positioning themselves precisely and use this to
-their advantage in melee or missile combat.
+Arcane Marksmen specialize in dealing ranged damage via enchanted
+weapons. Initially, they may choose either elemental damage types or
+translocation effects. Additionally, they have spells which will aid
+in staying at a distance and defend against other ranged weapon users.
Magicians: A magician is not a job by itself, but a type of job,
diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc
index 4ebfd170cc..ca2006a7e2 100644
--- a/crawl-ref/source/acr.cc
+++ b/crawl-ref/source/acr.cc
@@ -4416,7 +4416,7 @@ static void _compile_time_asserts()
COMPILE_CHECK(SK_EVOCATIONS == 39 , c2);
COMPILE_CHECK(SP_VAMPIRE == 30 , c3);
COMPILE_CHECK(SPELL_DEBUGGING_RAY == 103 , c4);
- COMPILE_CHECK(SPELL_PETRIFY == 155 , c5);
+ COMPILE_CHECK(SPELL_RETURNING_AMMUNITION == 162 , c5);
COMPILE_CHECK(NUM_SPELLS == 207 , c6);
//jmf: NEW ASSERTS: we ought to do a *lot* of these
diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt
index 0da4437bb1..20ceafdad2 100644
--- a/crawl-ref/source/dat/descript/spells.txt
+++ b/crawl-ref/source/dat/descript/spells.txt
@@ -230,6 +230,10 @@ Extension
This spell extends the duration of most enchantments affecting the caster. Be wary that using it slowly contaminates you with magical energy.
%%%%
+Exploding Ammunition
+
+This spell will make missile weapons held by the caster extremely unstable.
+%%%%
Fire Brand
This spell sets a weapon held by the caster ablaze. It will not affect weapons otherwise subject to special enchantments.
@@ -242,6 +246,10 @@ Fireball
This spell hurls an exploding bolt of fire. This spell does not cost additional spell levels if the learner already knows Delayed Fireball.
%%%%
+Flame Ammunition
+
+This spell will ignite missile weapons held by the caster.
+%%%%
Flame Tongue
This spell creates a short burst of flame.
@@ -266,6 +274,10 @@ Freezing Cloud
This spell conjures up a large cloud of lethally cold vapour.
%%%%
+Frost Ammunition
+
+This spell will freeze missile weapons held by the caster.
+%%%%
Fulsome Distillation
This spell extracts the vile and poisonous essences from a corpse. A rotten corpse may produce a stronger potion. You probably don't want to drink the results.
@@ -426,6 +438,10 @@ Projected Noise
This spell produces a noise emanating from a place of the caster's own choosing.
%%%%
+Reaping Ammunition
+
+This spell will infuse missile weapons held by the caster with necromantic magic which may create zombies from enemies slain by the weapon.
+%%%%
Recall
This spell is greatly prized by summoners and necromancers, as it allows the caster to recall any friendly creatures nearby to a position adjacent to the caster.
@@ -442,6 +458,10 @@ Resist Poison
This spell protects the caster from exposure to all poisons for a period of time.
%%%%
+Returning Ammunition
+
+This spell will cause the weilded missile weapons to return to the caster after fired.
+%%%%
Ring of Flames
This spell surrounds the caster with a mobile ring of searing flame, and keeps other fire clouds away from the caster. This spell attunes the caster to the forces of fire, increasing their fire magic and giving protection from fire. However, it also makes them much more susceptible to the forces of ice.
@@ -470,6 +490,10 @@ Shock
This spell throws a bouncing bolt of electricity.
%%%%
+Shocking Ammunition
+
+This spell will electrically charge missile weapons held by the caster.
+%%%%
Silence
This spell eliminates all sound near the caster. This makes reading scrolls, casting spells, praying or yelling in the caster's vicinity impossible. (Applies to caster too, of course.) This spell will not hide your presence, since its oppressive, unnatural effect will almost certainly alert any living creature that something is very wrong.
@@ -627,6 +651,10 @@ Venom Bolt
This spell throws a bolt of poison.
%%%%
+Warp Ammunition
+
+This spell will infuse missile weapons held by the caster with distortional energy.
+%%%%
Warp Weapon
This spell temporarily binds a localized warp field to the invoker's weapon. Note that unlike other brands, distortion can not be made permanent by reading a scroll of vorpalise weapon.
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc
index 6b2283fd3d..d210a64827 100644
--- a/crawl-ref/source/describe.cc
+++ b/crawl-ref/source/describe.cc
@@ -1032,6 +1032,10 @@ static std::string _describe_ammo(const item_def &item)
if (bolt_name.empty())
bolt_name = "frost";
// Intentional fall-through.
+ case SPMSL_ELECTRIC:
+ if (bolt_name.empty())
+ bolt_name = "electricity";
+ // Intentional fall-through.
case SPMSL_CHAOS:
if (bolt_name.empty())
bolt_name = "a random type";
@@ -1068,6 +1072,7 @@ static std::string _describe_ammo(const item_def &item)
description += "If it kills a monster, causing it to leave "
"a corpse, the corpse will be animated as a zombie "
"friendly to the one who " + threw_or_fired + " it.";
+ always_destroyed = true;
break;
case SPMSL_PENETRATION:
description += "It will pass through any targets it hits, "
@@ -1078,6 +1083,7 @@ static std::string _describe_ammo(const item_def &item)
description += "Any target it hits will blink, with a "
"tendency towards blinking further away from the one "
"who " + threw_or_fired + " it.";
+ always_destroyed = true;
break;
case SPMSL_EXPLODING:
description += "It will explode into fragments upon "
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 268cefcb26..ad5fd564bd 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -320,9 +320,12 @@ enum book_type
BOOK_PARTY_TRICKS, //jmf: 04jan2000
BOOK_BEASTS, // 40
BOOK_STALKING, // renamed -- assassination was confusing -- bwr
- MAX_NORMAL_BOOK = BOOK_STALKING,
+ BOOK_ELEMENTAL_MISSILES,
+ BOOK_WARPED_MISSILES,
+ BOOK_DEVASTATING_MISSILES,
+ MAX_NORMAL_BOOK = BOOK_DEVASTATING_MISSILES,
- MIN_GOD_ONLY_BOOK, // 42
+ MIN_GOD_ONLY_BOOK, // 45
BOOK_ANNIHILATIONS = MIN_GOD_ONLY_BOOK,
BOOK_DEMONOLOGY,
BOOK_NECRONOMICON,
@@ -330,14 +333,14 @@ enum book_type
MAX_FIXED_BOOK = MAX_GOD_ONLY_BOOK,
- BOOK_RANDART_LEVEL, // 45
+ BOOK_RANDART_LEVEL, // 48
BOOK_RANDART_THEME,
BOOK_CARD_EFFECT, // not implemented
MAX_MEMORISABLE_BOOK = BOOK_CARD_EFFECT,
BOOK_MANUAL,
- BOOK_DESTRUCTION, // 49
+ BOOK_DESTRUCTION, // 52
NUM_BOOKS
};
@@ -1459,7 +1462,7 @@ enum job_type
JOB_REAVER,
JOB_STALKER,
JOB_MONK, // 25
- JOB_WARPER,
+ JOB_ARCANE_MARKSMAN,
JOB_WANDERER, // 27
JOB_ARTIFICER, // 28 -Greenberg/Bane
NUM_JOBS, // always after the last job
@@ -2860,6 +2863,13 @@ enum spell_type
SPELL_PORTAL_PROJECTILE,
SPELL_SUMMON_UGLY_THING,
SPELL_PETRIFY,
+ SPELL_FLAME_AMMUNITION,
+ SPELL_FROST_AMMUNITION,
+ SPELL_SHOCKING_AMMUNITION,
+ SPELL_WARP_AMMUNITION,
+ SPELL_EXPLODING_AMMUNITION,
+ SPELL_REAPING_AMMUNITION,
+ SPELL_RETURNING_AMMUNITION,
// Mostly monster-only spells after this point:
SPELL_HELLFIRE_BURST = 175,
diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc
index e9a0160bea..caf76bfd2d 100644
--- a/crawl-ref/source/item_use.cc
+++ b/crawl-ref/source/item_use.cc
@@ -2052,7 +2052,8 @@ bool setup_missile_beam(const actor *agent, bolt &beam, item_def &item,
const bool reaping = (bow_brand == SPWPN_REAPING
|| ammo_brand == SPMSL_REAPING)
&& bow_brand != SPWPN_HOLY_WRATH;
- const bool charged = bow_brand == SPWPN_ELECTROCUTION;
+ const bool charged = bow_brand == SPWPN_ELECTROCUTION
+ || ammo_brand == SPMSL_ELECTRIC;
const bool blessed = bow_brand == SPWPN_HOLY_WRATH
&& ammo_brand != SPMSL_REAPING;
diff --git a/crawl-ref/source/itemname.cc b/crawl-ref/source/itemname.cc
index 5de5f16256..ea9c56062e 100644
--- a/crawl-ref/source/itemname.cc
+++ b/crawl-ref/source/itemname.cc
@@ -879,6 +879,9 @@ static const char* book_type_name(int booktype)
case BOOK_CANTRIPS: return "Cantrips";
case BOOK_PARTY_TRICKS: return "Party Tricks";
case BOOK_STALKING: return "Stalking";
+ case BOOK_ELEMENTAL_MISSILES: return "Elemental Missiles";
+ case BOOK_WARPED_MISSILES: return "Warped Missiles";
+ case BOOK_DEVASTATING_MISSILES: return "Devastating Missiles";
case BOOK_RANDART_LEVEL: return "Fixed Level";
case BOOK_RANDART_THEME: return "Fixed Theme";
case BOOK_CARD_EFFECT: return "Card Effects";
@@ -1181,6 +1184,9 @@ std::string item_def::name_aux(description_level_type desc,
case SPMSL_DISPERSAL:
buff << ((terse) ? " (disperse)" : " of dispersal");
break;
+ case SPMSL_ELECTRIC:
+ buff << ((terse) ? " (shock)" : " of electricity");
+ break;
default:
buff << " (buggy)";
diff --git a/crawl-ref/source/itemprop.h b/crawl-ref/source/itemprop.h
index 3d7b57383c..c0cd22966f 100644
--- a/crawl-ref/source/itemprop.h
+++ b/crawl-ref/source/itemprop.h
@@ -361,7 +361,8 @@ enum special_missile_type // to separate from weapons in general {dlb}
SPMSL_EXPLODING, // 10
SPMSL_STEEL,
SPMSL_SILVER,
- NUM_SPECIAL_MISSILES // 12
+ SPMSL_ELECTRIC,
+ NUM_SPECIAL_MISSILES // 13
};
enum special_ring_type // jewellery mitm[].special values
diff --git a/crawl-ref/source/jobs.cc b/crawl-ref/source/jobs.cc
index 9d037ea3bd..3968356636 100644
--- a/crawl-ref/source/jobs.cc
+++ b/crawl-ref/source/jobs.cc
@@ -21,7 +21,7 @@ static job_type old_jobs_order[] = {
JOB_CHAOS_KNIGHT, JOB_TRANSMUTER,
JOB_HEALER, JOB_REAVER,
JOB_STALKER, JOB_MONK,
- JOB_WARPER, JOB_WANDERER,
+ JOB_ARCANE_MARKSMAN, JOB_WANDERER,
JOB_ARTIFICER
};
@@ -36,7 +36,7 @@ static job_type new_jobs_order[] = {
JOB_HEALER, JOB_CHAOS_KNIGHT,
JOB_DEATH_KNIGHT, JOB_CRUSADER,
// general and niche spellcasters (incl. Crusader above)
- JOB_REAVER, JOB_WARPER,
+ JOB_REAVER, JOB_ARCANE_MARKSMAN,
JOB_WIZARD, JOB_CONJURER,
JOB_ENCHANTER, JOB_SUMMONER,
JOB_NECROMANCER, JOB_TRANSMUTER,
@@ -69,7 +69,7 @@ static const char * Class_Name_List[ NUM_JOBS ] =
"Fire Elementalist", "Ice Elementalist", "Summoner", "Air Elementalist",
"Earth Elementalist", "Crusader", "Death Knight", "Venom Mage",
"Chaos Knight", "Transmuter", "Healer", "Reaver", "Stalker",
- "Monk", "Warper", "Wanderer", "Artificer" };
+ "Monk", "Arcane Marksman", "Wanderer", "Artificer" };
int get_class_index_by_abbrev(const char *abbrev)
{
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index b0760bc6de..6cbc55326d 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -1355,7 +1355,7 @@ static void _give_last_paycheck(job_type which_job)
break;
case JOB_WANDERER:
- case JOB_WARPER:
+ case JOB_ARCANE_MARKSMAN:
case JOB_ASSASSIN:
you.gold = 50;
break;
@@ -1461,7 +1461,7 @@ static void _jobs_stat_init(job_type which_job)
case JOB_STALKER: s = 2; i = 4; d = 6; hp = 12; mp = 1; break;
case JOB_HUNTER: s = 4; i = 3; d = 5; hp = 13; mp = 0; break;
- case JOB_WARPER: s = 3; i = 5; d = 4; hp = 12; mp = 1; break;
+ case JOB_ARCANE_MARKSMAN: s = 3; i = 5; d = 4; hp = 12; mp = 1; break;
case JOB_MONK: s = 3; i = 2; d = 7; hp = 13; mp = 0; break;
case JOB_TRANSMUTER: s = 2; i = 5; d = 5; hp = 12; mp = 1; break;
@@ -4256,30 +4256,77 @@ bool _give_items_skills()
weap_skill = 3;
break;
- case JOB_WARPER:
- _newgame_make_item(0, EQ_WEAPON, OBJ_WEAPONS, WPN_SHORT_SWORD);
+ case JOB_ARCANE_MARKSMAN:
- if (!_choose_weapon())
- return (false);
+ _newgame_make_item(0, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_ROBE);
- if (you.inv[0].quantity < 1)
- _newgame_clear_item(0);
+ switch (you.species)
+ {
+ case SP_SLUDGE_ELF:
+ case SP_HILL_ORC:
+ case SP_MERFOLK:
+ _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_JAVELIN, -1, 6);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1,
+ 2);
+ break;
- _newgame_make_item(1, EQ_BODY_ARMOUR, OBJ_ARMOUR, ARM_LEATHER_ARMOUR,
- ARM_ROBE);
- _newgame_make_item(2, EQ_NONE, OBJ_BOOKS, BOOK_SPATIAL_TRANSLOCATIONS);
+ case SP_TROLL:
+ case SP_OGRE:
+ _newgame_make_item(1, EQ_NONE, OBJ_MISSILES, MI_LARGE_ROCK, -1, 5);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_THROWING_NET, -1,
+ 3);
+ break;
- // One free escape.
- _newgame_make_item(3, EQ_NONE, OBJ_SCROLLS, SCR_BLINKING);
- _newgame_make_item(4, EQ_NONE, OBJ_MISSILES, MI_DART, -1, 20);
+ case SP_HALFLING:
+ case SP_KOBOLD:
+ _newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_SLING);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_SLING_BULLET, -1,
+ 30);
+
+ // Wield the sling instead.
+ you.equip[EQ_WEAPON] = 1;
+ break;
+
+ case SP_MOUNTAIN_DWARF:
+ case SP_DEEP_DWARF:
+ _newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_CROSSBOW);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_BOLT, -1, 25);
+
+ // Wield the crossbow instead.
+ you.equip[EQ_WEAPON] = 1;
+ break;
+
+ default:
+ _newgame_make_item(1, EQ_NONE, OBJ_WEAPONS, WPN_BOW);
+ _newgame_make_item(2, EQ_NONE, OBJ_MISSILES, MI_ARROW, -1, 25);
+
+ // Wield the bow instead.
+ you.equip[EQ_WEAPON] = 1;
+ break;
+ }
+
+ if (is_range_weapon(you.inv[1]))
+ you.skills[range_skill(you.inv[1])] = 3;
+ else
+ you.skills[SK_THROWING] = 3;
+
+ if (!_choose_book(3, BOOK_ELEMENTAL_MISSILES, 2))
+ return (false);
+
+ _newgame_make_item(4, EQ_NONE, OBJ_SCROLLS, SCR_BLINKING);
- you.skills[SK_FIGHTING] = 1;
- you.skills[SK_ARMOUR] = 1;
you.skills[SK_DODGING] = 2;
you.skills[SK_SPELLCASTING] = 2;
- you.skills[SK_TRANSLOCATIONS] = 3;
- you.skills[SK_DARTS] = 1;
- weap_skill = 3;
+
+ switch (you.inv[3].sub_type)
+ {
+ case BOOK_ELEMENTAL_MISSILES:
+ you.skills[SK_ENCHANTMENTS] = 3;
+ break;
+ case BOOK_WARPED_MISSILES:
+ you.skills[SK_TRANSLOCATIONS] = 3;
+ break;
+ }
break;
case JOB_WIZARD:
diff --git a/crawl-ref/source/ng-restr.cc b/crawl-ref/source/ng-restr.cc
index fc43191023..cf4d7bd5b2 100644
--- a/crawl-ref/source/ng-restr.cc
+++ b/crawl-ref/source/ng-restr.cc
@@ -340,7 +340,7 @@ char_choice_restriction class_allowed(species_type speci,
return (CC_UNRESTRICTED);
}
- case JOB_WARPER:
+ case JOB_ARCANE_MARKSMAN:
switch (speci)
{
case SP_HUMAN:
diff --git a/crawl-ref/source/shopping.cc b/crawl-ref/source/shopping.cc
index 04251a8841..44cd017fb9 100644
--- a/crawl-ref/source/shopping.cc
+++ b/crawl-ref/source/shopping.cc
@@ -1188,6 +1188,7 @@ unsigned int item_value( item_def item, bool ident )
case SPMSL_FLAME:
case SPMSL_FROST:
+ case SPMSL_ELECTRIC:
valued *= 25;
break;
diff --git a/crawl-ref/source/spells2.cc b/crawl-ref/source/spells2.cc
index 14cd3f19ec..639c21d6d7 100644
--- a/crawl-ref/source/spells2.cc
+++ b/crawl-ref/source/spells2.cc
@@ -345,6 +345,11 @@ bool brand_weapon(brand_type which_brand, int power)
duration_affected = 7;
break;
+ case SPWPN_RETURNING:
+ msg += " wiggles in your hand.";
+ duration_affected = 5;
+ break;
+
default:
break;
}
diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc
index 524883c932..f6cd30dbd8 100644
--- a/crawl-ref/source/spells3.cc
+++ b/crawl-ref/source/spells3.cc
@@ -1979,35 +1979,132 @@ bool cast_sanctuary(const int power)
return (true);
}
-void cast_poison_ammo()
+void cast_brand_ammo(special_missile_type which_type)
{
const int ammo = you.equip[EQ_WEAPON];
if (ammo == -1
|| you.inv[ammo].base_type != OBJ_MISSILES
|| get_ammo_brand( you.inv[ammo] ) != SPMSL_NORMAL
- || you.inv[ammo].sub_type == MI_STONE
- || you.inv[ammo].sub_type == MI_SLING_BULLET
- || you.inv[ammo].sub_type == MI_LARGE_ROCK
|| you.inv[ammo].sub_type == MI_THROWING_NET)
{
canned_msg(MSG_NOTHING_HAPPENS);
return;
}
+ preserve_quiver_slots q;
+ const char *old_desc = you.inv[ammo].name(DESC_CAP_YOUR).c_str();
+
+ switch (which_type)
{
- preserve_quiver_slots q;
- const char *old_desc = you.inv[ammo].name(DESC_CAP_YOUR).c_str();
- if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_POISONED ))
- {
- mprf("%s %s covered in a thin film of poison.", old_desc,
- (you.inv[ammo].quantity == 1) ? "is" : "are");
+
+ case SPMSL_POISONED:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_POISONED ))
+ {
+ mprf("%s %s covered in a thin film of poison.", old_desc,
+ (you.inv[ammo].quantity == 1) ? "is" : "are");
- if (ammo == you.equip[EQ_WEAPON])
- you.wield_change = true;
- }
- else
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_FLAME:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_FLAME ))
+ {
+ mprf("%s %s warm to the touch.", old_desc,
+ (you.inv[ammo].quantity == 1) ? "feels" : "feel");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_FROST:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_FROST ))
+ {
+ mprf("%s %s cool to the touch.", old_desc,
+ (you.inv[ammo].quantity == 1) ? "feels" : "feel");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_DISPERSAL:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_DISPERSAL ))
+ {
+ mprf("%s %s rather jumpy.", old_desc,
+ (you.inv[ammo].quantity == 1) ? "seems" : "seem");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_ELECTRIC:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_ELECTRIC ))
+ {
+ mprf("%s %s you!", old_desc,
+ (you.inv[ammo].quantity == 1) ? "shocks" : "shock");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_EXPLODING:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_EXPLODING ))
+ {
+ mprf("%s %s unstable!", old_desc,
+ (you.inv[ammo].quantity == 1) ? "seems" : "seem");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_REAPING:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_REAPING ))
+ {
+ mprf("%s %s of rotten flesh!", old_desc,
+ (you.inv[ammo].quantity == 1) ? "smells" : "smell");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ case SPMSL_RETURNING:
+ if (set_item_ego_type( you.inv[ammo], OBJ_MISSILES, SPMSL_RETURNING ))
+ {
+ mprf("%s %s in your hand.", old_desc,
+ (you.inv[ammo].quantity == 1) ? "wiggles" : "wiggle");
+
+ if (ammo == you.equip[EQ_WEAPON])
+ you.wield_change = true;
+ }
+ else
+ canned_msg(MSG_NOTHING_HAPPENS);
+ break;
+
+ default:
canned_msg(MSG_NOTHING_HAPPENS);
+ break;
}
}
diff --git a/crawl-ref/source/spells3.h b/crawl-ref/source/spells3.h
index 7656213bcb..e70b3957c0 100644
--- a/crawl-ref/source/spells3.h
+++ b/crawl-ref/source/spells3.h
@@ -17,7 +17,7 @@ bool allow_control_teleport(bool quiet = false);
int airstrike(int power, dist &beam);
bool cast_bone_shards(int power, bolt &);
-void cast_poison_ammo();
+void cast_brand_ammo(special_missile_type which_brand);
bool cast_selective_amnesia(bool force);
bool cast_smiting(int power, const coord_def& where);
bool remove_sanctuary(bool did_attack = false);
diff --git a/crawl-ref/source/spl-book.cc b/crawl-ref/source/spl-book.cc
index 989e5db899..c805c37a04 100644
--- a/crawl-ref/source/spl-book.cc
+++ b/crawl-ref/source/spl-book.cc
@@ -518,7 +518,40 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 42 - Book of Annihilations - Vehumet special
+ // 42 - Book of Elemental Missiles
+ {SPELL_CORONA,
+ SPELL_SWIFTNESS,
+ SPELL_REPEL_MISSILES,
+ SPELL_FLAME_AMMUNITION,
+ SPELL_FROST_AMMUNITION,
+ SPELL_POISON_AMMUNITION,
+ SPELL_NO_SPELL,
+ SPELL_NO_SPELL,
+ },
+
+ // 43 - Book of Warped Missiles
+ {SPELL_APPORTATION,
+ SPELL_PORTAL_PROJECTILE,
+ SPELL_REPEL_MISSILES,
+ SPELL_BLINK,
+ SPELL_RETURNING_AMMUNITION,
+ SPELL_WARP_AMMUNITION,
+ SPELL_NO_SPELL,
+ SPELL_NO_SPELL,
+ },
+
+ // 44 Book of Devastating Missiles
+ {SPELL_POISON_AMMUNITION,
+ SPELL_WARP_AMMUNITION,
+ SPELL_SHOCKING_AMMUNITION,
+ SPELL_HASTE,
+ SPELL_DEFLECT_MISSILES,
+ SPELL_EXPLODING_AMMUNITION,
+ SPELL_REAPING_AMMUNITION,
+ SPELL_NO_SPELL,
+ },
+
+ // 45 - Book of Annihilations - Vehumet special
{SPELL_ISKENDERUNS_MYSTIC_BLAST,
SPELL_POISON_ARROW,
SPELL_CHAIN_LIGHTNING,
@@ -529,7 +562,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 43 - Book of Demonology - Vehumet special
+ // 46 - Book of Demonology - Vehumet special
{SPELL_ABJURATION,
SPELL_RECALL,
SPELL_CALL_IMP,
@@ -540,7 +573,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 44 - Necronomicon - Kikubaaqudgha special
+ // 47 - Necronomicon - Kikubaaqudgha special
{SPELL_SYMBOL_OF_TORMENT,
SPELL_CONTROL_UNDEAD,
SPELL_HAUNT,
@@ -551,7 +584,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 45 - Randart Spellbook (by level)
+ // 48 - Randart Spellbook (by level)
{SPELL_NO_SPELL,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -562,7 +595,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 46 - Randart Spellbook (by theme)
+ // 49 - Randart Spellbook (by theme)
{SPELL_NO_SPELL,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -573,7 +606,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 47 - Book of Card Effects
+ // 50 - Book of Card Effects
{SPELL_NO_SPELL,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -584,7 +617,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 48 - manuals of all kinds
+ // 51 - manuals of all kinds
{SPELL_NO_SPELL,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -595,7 +628,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 49 - Tome of Destruction
+ // 52 - Tome of Destruction
{SPELL_NO_SPELL,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -608,7 +641,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
// Rods - start at NUM_BOOKS.
- // 50 - Rod of smiting
+ // 53 - Rod of smiting
{SPELL_SMITING,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -619,7 +652,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 51 - Rod of summoning
+ // 54 - Rod of summoning
{SPELL_ABJURATION,
SPELL_RECALL,
SPELL_SUMMON_ELEMENTAL,
@@ -630,7 +663,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 52 - Rod of destruction (fire)
+ // 55 - Rod of destruction (fire)
{SPELL_THROW_FLAME,
SPELL_BOLT_OF_FIRE,
SPELL_FIREBALL,
@@ -641,7 +674,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 53 - Rod of destruction (ice)
+ // 56 - Rod of destruction (ice)
{SPELL_THROW_FROST,
SPELL_THROW_ICICLE,
SPELL_FREEZING_CLOUD,
@@ -652,7 +685,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 54 - Rod of destruction (lightning, iron, fireball)
+ // 57 - Rod of destruction (lightning, iron, fireball)
{SPELL_LIGHTNING_BOLT,
SPELL_IRON_SHOT,
SPELL_FIREBALL,
@@ -663,7 +696,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 55 - Rod of destruction (inaccuracy, magma, cold)
+ // 58 - Rod of destruction (inaccuracy, magma, cold)
{SPELL_BOLT_OF_INACCURACY,
SPELL_BOLT_OF_MAGMA,
SPELL_BOLT_OF_COLD,
@@ -674,7 +707,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 56 - Rod of warding
+ // 59 - Rod of warding
{SPELL_ABJURATION,
SPELL_CONDENSATION_SHIELD,
SPELL_CAUSE_FEAR,
@@ -685,7 +718,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 57 - Rod of discovery
+ // 60 - Rod of discovery
{SPELL_DETECT_SECRET_DOORS,
SPELL_DETECT_TRAPS,
SPELL_DETECT_ITEMS,
@@ -696,7 +729,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 58 - Rod of demonology
+ // 61 - Rod of demonology
{SPELL_ABJURATION,
SPELL_RECALL,
SPELL_CALL_IMP,
@@ -707,7 +740,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 59 - Rod of striking
+ // 62 - Rod of striking
{SPELL_STRIKING,
SPELL_NO_SPELL,
SPELL_NO_SPELL,
@@ -718,7 +751,7 @@ static spell_type spellbook_template_array[][SPELLBOOK_SIZE] =
SPELL_NO_SPELL,
},
- // 60 - Rod of venom
+ // 63 - Rod of venom
{SPELL_CURE_POISON,
SPELL_VENOM_BOLT,
SPELL_POISON_ARROW,
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 366cfe4882..171bbe08d7 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1921,9 +1921,37 @@ spret_type your_spells(spell_type spell, int powc, bool allow_fail)
break;
case SPELL_POISON_AMMUNITION:
- cast_poison_ammo();
+ cast_brand_ammo(SPMSL_POISONED);
break;
+ case SPELL_FLAME_AMMUNITION:
+ cast_brand_ammo(SPMSL_FLAME);
+ break;
+
+ case SPELL_FROST_AMMUNITION:
+ cast_brand_ammo(SPMSL_FROST);
+ break;
+
+ case SPELL_WARP_AMMUNITION:
+ cast_brand_ammo(SPMSL_DISPERSAL);
+ break;
+
+ case SPELL_SHOCKING_AMMUNITION:
+ cast_brand_ammo(SPMSL_ELECTRIC);
+ break;
+
+ case SPELL_EXPLODING_AMMUNITION:
+ cast_brand_ammo(SPMSL_EXPLODING);
+ break;
+
+ case SPELL_REAPING_AMMUNITION:
+ cast_brand_ammo(SPMSL_REAPING);
+ break;
+
+ case SPELL_RETURNING_AMMUNITION:
+ cast_brand_ammo(SPMSL_RETURNING);
+ break;
+
// Transformations.
case SPELL_BLADE_HANDS:
if (!transform(powc, TRAN_BLADE_HANDS))
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index e8d212591e..4e678f2ce1 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -2447,6 +2447,97 @@
},
{
+ SPELL_FLAME_AMMUNITION, "Flame Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_FIRE,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 3,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_FROST_AMMUNITION, "Frost Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_ICE,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 3,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_SHOCKING_AMMUNITION, "Shocking Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_AIR,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 5,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_EXPLODING_AMMUNITION, "Exploding Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_FIRE | SPTYP_AIR,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 7,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_WARP_AMMUNITION, "Warp Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 5,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_REAPING_AMMUNITION, "Reaping Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_NECROMANCY,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 7,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
+ SPELL_RETURNING_AMMUNITION, "Returning Ammunition",
+ SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION,
+ SPFLAG_HELPFUL | SPFLAG_BATTLE,
+ 3,
+ 0,
+ -1,-1,
+ 0,
+ NULL,
+ false,
+ true
+},
+
+{
SPELL_NO_SPELL, "nonexistent spell",
0,
SPFLAG_TESTING,
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 61760bace8..6d051badc4 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -3471,7 +3471,7 @@ void tilep_job_default(int job, int gender, int *parts)
parts[TILEP_PART_BOOTS] = TILEP_BOOTS_SHORT_BROWN;
break;
- case JOB_WARPER:
+ case JOB_ARCANE_MARKSMAN:
parts[TILEP_PART_BODY] = TILEP_BODY_ROBE_BROWN;
parts[TILEP_PART_HELM] = TILEP_HELM_GANDALF;
parts[TILEP_PART_HAND1] = TILEP_HAND1_SARUMAN;