I've been trying to make charisma do things beyond limit the number of charmed followers you can have. I have a formula that seems somewhat fair: sell_price = item_value * shop_adjust * (1 - (get_cha - 10) / 81) buy_price = item_value * shop_adjust * (1 + (get_cha - 10) / 81) Giving for various charisma values: 3: .91358025 4: .92592593 5: .93827161 6: .95061729 7: .96296297 8: .97530865 9: .98765433 10: 1.00000000 11: 1.01234567 12: 1.02469135 13: 1.03703703 14: 1.04938271 15: 1.06172839 16: 1.07407407 17: 1.08641975 18: 1.09876543 ~10% at the most either way, for both buying and selling. Think it's too much or too little? Perhaps I should factor in the charisma of the shopkeeper too...hmmm. Other changes: * Duration of charm spell changed from '24 * 18 / GET_INT(vict)' to '24 * 2 * GET_CHA(ch) / GET_INT(vict)'. That should make it longer for CHA >= 10, and shorter for CHA <= 8. * Charisma acting as a "leash" for charmed mobiles with memory. I'm thinking of turning off the "charmed mobiles aren't aggressive" code and making it a function of the master's charisma as well. That would imply that anybody charming a hostile mobile that failed to control it would be marked a player killer. ;) Changes follow: (http://www.circlemud.org/~greerga/MOBrebellion.patch) NOTE: Only parts relevant to Charisma changes shown. See URL above for full changes. It will deliberately not compile, see the "FIXME" below. Nothing major, but look, don't touch. Index: mobact.c =================================================================== RCS file: /home/circledb/.cvs/circle/src/mobact.c,v retrieving revision 1.16 diff -u -p -r1.16 mobact.c --- mobact.c 2001/10/02 00:20:02 1.16 +++ mobact.c 2001/10/15 03:44:53 @@ -114,13 +114,45 @@ void mobile_activity(void) for (vict = world[IN_ROOM(ch)].people; vict && !found; vict = vict->next_in_room) { if (IS_NPC(vict) || !CAN_SEE(ch, vict) || PRF_FLAGGED(vict, PRF_NOHASSLE)) continue; - for (names = MEMORY(ch); names && !found; names = names->next) - if (names->id == GET_IDNUM(vict)) { - found = TRUE; - act("'Hey! You're the fiend that attacked me!!!', exclaims $n.", - FALSE, ch, 0, 0, TO_ROOM); - hit(ch, vict, TYPE_UNDEFINED); - } + for (names = MEMORY(ch); names && !found; names = names->next) { + if (names->id != GET_IDNUM(vict)) + continue; + + /* Sit. Down boy! HEEEEeeeel! */ + if (AFF_FLAGGED(ch, AFF_CHARM) && ch->master) +FIXME: Add GET_INT(vict) modifier. + if (number(1, 20) <= GET_CHA(ch->master)) + continue; + + + found = TRUE; + act("'Hey! You're the fiend that attacked me!!!', exclaims $n.", FALSE, ch, 0, 0, TO_ROOM); + hit(ch, vict, TYPE_UNDEFINED); + } + } + } + + /* + * Charmed Mob Rebellion + * + * In order to rebel, there need to be more charmed monsters + * than the person can feasibly control at a time. Then the + * mobiles have a chance based on the charisma of their leader. + * + * 1-4 = 0, 5-7 = 1, 8-10 = 2, 11-13 = 3, 14-16 = 4, 17-19 = 5, etc. + */ + if (AFF_FLAGGED(ch, AFF_CHARM) && ch->master && num_followers_charmed(ch->master) > (GET_CHA(ch->master) - 2) / 3) { + int thediesay = number(1, 20); + + if (thediesay == 20 || thediesay > GET_CHA(ch->master)) { + struct char_data *vict; + + /* We're rejecting their control; let's get revenge. */ + if ((vict = get_char_room_vis(ch, GET_NAME(ch->master), NULL)) != NULL) { + stop_follower(ch); + if (!PRF_FLAGGED(ch->master, PRF_NOHASSLE)) + hit(ch, vict, TYPE_UNDEFINED); + } } } Index: spells.c =================================================================== RCS file: /home/circledb/.cvs/circle/src/spells.c,v retrieving revision 1.22 diff -u -p -r1.22 spells.c --- spells.c 2001/10/02 00:20:02 1.22 +++ spells.c 2001/10/15 03:10:52 @@ -238,12 +238,9 @@ ASPELL(spell_charm) add_follower(victim, ch); af.type = SPELL_CHARM; - + af.duration = 24 * 2 * GET_CHA(ch); if (GET_INT(victim)) - af.duration = 24 * 18 / GET_INT(victim); - else - af.duration = 24 * 18; - + af.duration /= GET_INT(victim); af.modifier = 0; af.location = 0; af.bitvector = AFF_CHARM; I do need to add an "if (GET_CHA(ch))" check to the above though. Hmm... I should just use CAN_SEE() instead of get_char_room_vis() since 'ch->master' is already a pointer to the character.... Maybe restrict the "revenge" to only aggressive mobiles? -- George Greer greerga@circlemud.org -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/06/01 PST