Equipment: a cloak, a dagger or short sword, and some gold. Spells : Blink, Invisibility, Teleport Self
Most importantly, in melee combat Maurice will try to steal items from the player. Due to technical limitations he can only steal item types monsters can carry and only if said item slot is still free. All applicable items get weighted by item value, and if nothing is applicable he will steal some gold instead. If even that isn't possible, he'll complain a bit and teleport away.
Maurice is placed in the same depth as Gastronok. He's not actually hard (except for the occasional weapon brand or wand), but rather annoying. :p
Stealing from monsters hasn't been implemented, and I don't think it's as interesting. Maurice is currently prevented from stealing items the player has equipped, though I'm considering allowing him to steal a wielded weapon, at least. The limitations of monsters' inventories means that Maurice will never attempt to steal armour (slot already filled) or jewellery (missing slot). Maybe we could try to force valuable items into inappropriate but rarely used slots, e.g. MSLOT_MISC.
Other than in the FR (see 2838375) Maurice does not disappear from the level, so you can still hunt him down. He also doesn't get a crossbow or blowgun yet, though that's an interesting idea. However, handing out a secondary weapon would mean that he couldn't steal weapons either.
Doesn't have a tile yet, and I have no image of him in my head either.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10776 c06c8d41-db1a-0410-9941-cceddc491573
PS3OYZOHCD464IMPYTISQO2NDD4WLHZHKAT5TBB2VMAU2JBNPYRQC
T7BPCYJKTZ7RICLL7K2PF2ZIEO5O7G3NJKOAOWLPIMPIEB7PPXAQC
CD4DJVU34YAQAN2IBQGIK6SSINNKBXE3LQKAOWBTI4XSVRCEJHVQC
S5V3RJKXDPM5GF5RVW2IDSCCOY2NKZZLMFAFQNZVTQH2BRT7P77AC
CDEPLMOVB2CPWOX4TFKAQPESAKG5EYHMIDSJDKLPLT67AFVA7FSQC
JYK24KLEOXA3NZGTQJPEVC5NRWTIXHSLZR3YD57EMWLOTJHPC4PAC
FS4GAKLP3QPPVMI3RCBFMOTBPJXTOXWB4FXGK3QO2IMXZ5AHVMNQC
Q6QWWEURCCP5CRAMRDPFPMM7B6FLLOQZZMI553QKG4KEYVMXARCAC
4QYXUNAH54YJPAHB42Z3PPG7MGWGZ3G6Q5V2GTVOAB4MWECG52IAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
C5WZ62XDFNON4HCJOXC6IL6SQYLE6TKX7DDSJX3MTWAZ4HHM27GQC
T4FNOPMWYYJHJBTTY33PB43HTJPKEC46L62YERTWIX73HYZSELXQC
ASH5CK6CPBKMLGGIRJ5GKTWMS5W3OBVHTL66RTYZIPFM6KFBYA3QC
T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC
3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
RKROW7KCH7MJL4PYI5RRWEPNFAWTZU6GIZVHLUWP34NDU63HELUAC
2FHNLTLN3DVVD67N4QMAQ2LO7YY4GVZWXJAOIWGCCYYGIX7UHSVQC
TTLTKFWPSA5YKJNZHRWQMIJKLX7EYHTWGHX3MJUVBEXWCHZHSYCQC
KZMLJTPHO2VSNRKKZ252S7F25KWFIH2WT4JR6GLUJROADBU7WLYAC
PQYLCUBDA6P4UY7X3NLIUUKMJ5GTQTB5X64VNSQVMCFS6ONMXXOQC
6XJP54KUBUB46BX7ANY5DHMN24Q7EHJSQKS7U2BHCAUQUKNJD7DQC
2J3TK3NYTO5XO6IHLTV5O6B3HYN2NHXD5ST3WLL5KPTUOVS5F3RQC
UZTLX4J6HKEAPFLUWL4WVUXZKSUONPOEJVLG5Q5MC4HEYBYERRIQC
AOAY6DBJDKJXJ3G4ROBIKYR4UUDKI5Y6TBP6N7DAONV75OEVOGUQC
CQKH4FU2BZOMP5VWWOH2CEWDAYOV7FV53VOFQRF7R64DCQMP73LAC
TZ2SH2SPO5TFSFL2OCV5A32P2X4CRHEKEK7ENUFCBVF3RKUWAD4AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
QX6BW6RP7EVCKNQRF3ZL4377XVNS4AM3KWU3W7HPFUWWJJQZORLQC
WPCL2ABFWUA7JQUJSGS267ZV3V6F6Y24DRLD23Q3LT3NDSWYH6JAC
UWYK2M6I6P6EFAVHLWQGDK77STFO3SPO5SVOF5WZTOKUH2O6BBHQC
CCDQMJMMVC6MIZRZ6JSKKCMEDPUGEVVSFPJUOC5WP63J6SX35MXAC
G7ZXJ4RUQB3U5NL2DEWXMTHRRDT7WTONWKTPOOGWFCE46ZWUVLOQC
S7Y7E2KDAFMTLDIXUTR673SYL5N35VXYGLRU67L42WHVYG5SEPBQC
AFHBHRB752ORI6ALRVZLPJ4WO2VYLABP2ATTEEVWMTKSN46XZBZQC
Y56C5OMUQ5XF2G6DKDV4R5MED44UOIUPTBBQVWQBUHYIXYA5MOZAC
BMHUBADDGIOZRVN4P3O5QKIDUYD4RFWBS7MP5X6LZWAYHUBRVD2QC
FBLTPG3A4ZEAVOJBHH4DCPUF4ZBLOTN5WWVZJADVCFTEKRHK5R6QC
ERDDGBLUEKZ5SIVBKSK3XOWIORPGQRJKWG2RDGT3XQSWOMV36V2QC
RVST2QHYJ757ZHK4AUJ5NGPDZ44AD6RVFVXYPKQIBJXZBDNUCHXQC
{
MONS_MAURICE, '@', DARKGREY, "Maurice",
M_UNIQUE | M_SPELLCASTER | M_ACTUAL_SPELLS | M_WARM_BLOOD | M_SPEAKS,
MR_NO_FLAGS,
550, 20, MONS_HUMAN, MONS_HUMAN, MH_NATURAL, -4,
{ {AT_HIT, AF_STEAL, 9}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 5, 0, 0, 60 },
1, 13, MST_MAURICE, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT, I_HIGH,
HT_LAND, 11, DEFAULT_ENERGY, MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
static void _steal_item_from_player(monsters *mon)
{
int steal_what = -1;
int total_value = 0;
for (int m = 0; m < ENDOFPACK; ++m)
{
if (!is_valid_item(you.inv[m]))
continue;
// Cannot unequip player.
// TODO: Allow stealing of the wielded weapon?
// Needs to be unwielded properly and should never lead to
// fatal stat loss.
if (item_is_equipped(you.inv[m]))
continue;
mon_inv_type monslot = item_to_mslot(you.inv[m]);
if (monslot == NUM_MONSTER_SLOTS)
continue;
// Only try to steal stuff we can still store somewhere.
if (mon->inv[monslot] != NON_ITEM)
{
if (monslot == MSLOT_WEAPON
&& mon->inv[MSLOT_ALT_WEAPON] == NON_ITEM)
{
monslot = MSLOT_ALT_WEAPON;
}
else
continue;
}
// Candidate for stealing.
const int value = item_value(you.inv[m], true);
total_value += value;
if (x_chance_in_y(value, total_value))
steal_what = m;
}
if (steal_what == -1 || you.gold > 0 && one_chance_in(10))
{
// Found no item worth stealing, try gold.
if (you.gold == 0)
{
if (silenced(mon->pos()))
return;
std::string complaint = getSpeakString("Maurice nonstealing");
if (!complaint.empty())
{
complaint = replace_all(complaint, "@The_monster@",
mon->name(DESC_CAP_THE));
mpr(complaint.c_str(), MSGCH_TALK);
}
bolt beem;
beem.source = mon->pos();
beem.target = mon->pos();
beem.beam_source = mon->mindex();
// Try to teleport away.
if (mon->has_ench(ENCH_TP))
{
mons_cast_noise(mon, beem, SPELL_BLINK);
monster_blink(mon);
}
else
mons_cast(mon, beem, SPELL_TELEPORT_SELF);
return;
}
const int stolen_amount = std::min(20 + random2(800), you.gold);
if (mon->inv[MSLOT_GOLD] != NON_ITEM)
{
// If Maurice already's got some gold, simply increase the amount.
mitm[mon->inv[MSLOT_GOLD]].quantity += stolen_amount;
}
else
{
// Else create a new item for this pile of gold.
const int idx = items(0, OBJ_GOLD, OBJ_RANDOM, true, 0, 0);
if (idx == NON_ITEM)
return;
item_def &new_item = mitm[idx];
new_item.base_type = OBJ_GOLD;
new_item.sub_type = 0;
new_item.plus = 0;
new_item.plus2 = 0;
new_item.special = 0;
new_item.flags = 0;
new_item.link = NON_ITEM;
new_item.quantity = stolen_amount;
new_item.pos.reset();
item_colour(new_item);
unlink_item(idx);
mon->inv[MSLOT_GOLD] = idx;
new_item.set_holding_monster(mon->mindex());
}
mprf("%s steals %s your gold!",
mon->name(DESC_CAP_THE).c_str(),
stolen_amount == you.gold ? "all" : "some of");
you.attribute[ATTR_GOLD_FOUND] -= stolen_amount;
you.gold -= stolen_amount;
return;
}
ASSERT(steal_what != -1);
// Create new item.
int index = get_item_slot(10);
if (index == NON_ITEM)
return;
item_def &new_item = mitm[index];
// Copy item.
new_item = you.inv[steal_what];
// Set quantity, and set the item as unlinked.
new_item.quantity -= random2(new_item.quantity);
new_item.pos.reset();
new_item.link = NON_ITEM;
const mon_inv_type mslot = item_to_mslot(new_item);
mprf("%s steals %s!",
mon->name(DESC_CAP_THE).c_str(),
new_item.name(DESC_NOCAP_YOUR).c_str());
unlink_item(index);
mon->inv[mslot] = index;
new_item.set_holding_monster(mon->mindex());
mon->equip(new_item, mslot, true);
// Item is gone from player's inventory.
dec_inv_item_quantity(steal_what, new_item.quantity);
}
############ MAURICE ### A thief.
Maurice
@_Maurice_common_@
w:6
@_Maurice_medium_@
w:2
@_Maurice_rare_@
%%%%
_Maurice_common_
VISUAL:@The_monster@ tries to hide in the shadows.
@The_monster@ shouts, "HAHA!"
@The_monster@ says, "Nice gear. Can I borrow some?"
@The_monster@ shouts, "Mine, all mine!"
%%%%
_Maurice_medium_
VISUAL:@The_monster@ looks sneaky.
@The_monster@ says, "Lost something?"
@The_monster@ says, "Very interesting."
@The_monster@ says, "Have you got some gold to spare?"
%%%%
_Maurice_rare_
@The_monster@ says, "Betcha didn't see that coming, eh?"
@The_monster@ says to @foe@, "Money or life? Never mind, I think I'll take both."
@The_monster@ says, "Killing adventurers and taking their stuff. It's what I do."
%%%%
# Triggered when Maurice tries to steal something, but doesn't find anything.
Maurice nonstealing
@The_monster@ grunts, "Curses!"
@The_monster@ mutters, "Now where did you hide it?"
@The_monster@ groans, "What are you, a monk?"
%%%%