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;}elsecontinue;}// 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);}elsemons_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?"%%%%