/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* _/ _/_/_/ _/ _/ _/ ACK! MUD is modified *
* _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code *
* _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 *
* _/_/_/_/ _/ _/ _/ Version #: 4.3 *
* _/ _/ _/_/_/ _/ _/ _/ *
* *
* http://ackmud.nuc.net/ *
* zenithar@ackmud.nuc.net *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock *
* *
* Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
* This mud is NOT to be copied in whole or in part, or to be run without *
* the permission of Matthew Little. Nobody else has permission to *
* authorise the use of this code. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
/**** Local Functions ****/
CHAR_DATA *get_quest_target args ((int min_level, int max_level));
CHAR_DATA *get_quest_giver args ((int min_level, int max_level));
OBJ_DATA *load_aquest_object args ((CHAR_DATA * target));
void clear_quest args ((void));
/* 17 messages, organised by blocks for each personality
indented messages are for when the target mob gets killed */
struct qmessage_type
{
char *const message1;
char *const message2;
};
const struct qmessage_type qmessages[5][17] = {
{
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"",
""},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""}, {"",
""},
{"", ""}
},
{
{"Oh my! My %s has been stolen from me, and I am too young to find it!",
""},
{"Would someone please search for my %s? I'm sure that it will be much too hard for me to find.", ""},
{"What will I do without my %s?", ""},
{"Can't anybody find my %s for me?", ""},
{"Help me! My %s is still missing!", ""},
{"Keep searching for my %s, and i'll ask my mom if she knows who stole it!", ""},
{"Does anyone know who stole my %s?", ""},
{"My mom says %s stole my %s. I know it is too hard for me to get back. Oh my, what will I do?",
"Yeay!! It looks like whoever stole my %s is now dead!! Thank you very much!"},
{"Please, can you go kill %s? I need my %s!! I can't sleep without it!!",
"Well, thank you for killing the nasty thief, but can you please return my %s to me?"},
{"My mom says %s stole my %s. I know it is too hard for me to get back. Oh my, what will I do?",
"Yeay!! It looks like whoever stole my %s is now dead!! Thank you very much!"},
{"It's time for my nap now, and %s still has my %s!! Can anyone please get it back for me?",
"Please, time is running out! Return my %s to me!"},
{"%s is a real meanie for stealing my %s! Can you pretty pretty pretty please get it back for me?",
"Please, time is running out! Return my %s to me!"},
{"It's time for my nap now, and %s still has my %s!! Can anyone please get it back for me?",
"Please, time is running out! Return my %s to me!"},
{"Oh my, I'll never get up to watch cartoons tomorrow now! %s is still holding my %s ransom, and I need it for my nap!",
"How can I sleep without my %s?"},
{"I give up! %s can keep my %s for all I care! I didn't want to take a nap, anyway!",
"I give up! I never want to see my %s again!"},
{"Mommy, can I watch cartoons now, instead of taking a nap?? PLEASE??",
""},
{"Oh THANK YOU, %s!! Now that I have my %s again, I can go sleepy sleep!",
""}
},
{
{"Hmm, I seem to have lost my %s. Oh well, didn't really need it much, anyway.", ""},
{"I wonder where I could find another %s? Anyone have any ideas?", ""},
{"Where can my %s have gone?", ""},
{"I guess no one really cares, anyway, but I think I might need a %s later.", ""},
{"I guess I should try and find my %s, but I really don't feel like it.",
""},
{"If anyone has an extra %s, I might be willing to reward them for it.",
""},
{"Doesn't anyone out there know where to find a %s?", ""},
{"Hmm, maybe %s knew something I didn't, and thought it was a good idea to steal my %s. Maybe he could use it, I know I can't.",
"I guess my %s didn't help him much, since he is now dead! I do miss it though."},
{"Hmm, maybe it IS worth something. Could someone go kill %s and get my %s back for me?",
"I guess my %s didn't help him much, since he is now dead! I do miss it though."},
{"I would pay a lot if someone would kill %s and get my %s back. I don't really know where it went.",
"Even though it's not worth very much, my %s is kind of important to me. Oh, well, guess I will never see it again."},
{"Hmm, maybe it IS worth something. Could someone go kill %s and get my %s back for me?",
"I guess my %s didn't help him much, since he is now dead! I do miss it though."},
{"I would pay a lot if someone would kill %s and get my %s back. I don't really know where it went.",
"Even though it's not worth very much, my %s is kind of important to me. Oh, well, guess I will never see it again."},
{"Oh well, since no one will help me, I guess %s can keep my %s.",
"It must be cursed, since everyone who has it is dead. I don't think I want my %s after all!"},
{"Oh well, since no one will help me, I guess %s can keep my %s.",
"It must be cursed, since everyone who has it is dead. I don't think I want my %s after all!"},
{"I give up! %s can keep my %s for all I care!",
"I give up! I never want to see my %s again!"},
{"Well, I will stop asking now, but don't ever ask ME for any favors, ok?", ""},
{"Well, looks like %s has recovered my %s for me. Not sure I want it anymore, but thanks anyway.", ""}
},
{
{"Alright, what the heck, I wake up from my nap and my %s is gone!", ""},
{"Come on you freaks, find my %s for me!", ""},
{"Where can my %s have gone?", ""},
{"Get off your asses and find my %s!", ""},
{"Help me! My %s has not yet been recovered!", ""},
{"Keep searching for my %s, and i'll find out who stole it!", ""},
{"Were there no witnesses to the theft of my %s?", ""},
{"It was %s who stole my %s from me! Someone help me!",
"It looks like whoever stole my %s is now dead!!"},
{"Please, time is running out! Kill %s and recover my %s for me NOW!",
"Please, time is running out! Return my %s to me!"},
{"Please, time is running out! Kill %s and recover my %s for me NOW!",
"Please, time is running out! Return my %s to me!"},
{"Please, time is running out! Kill %s and recover my %s for me NOW!",
"Please, time is running out! Return my %s to me!"},
{"Please, time is running out! Kill %s and recover my %s for me NOW!",
"Please, time is running out! Return my %s to me!"},
{"I give up! %s can keep my %s for all I care!",
"I give up! I never want to see my %s again!"},
{"I give up! %s can keep my %s for all I care!",
"I give up! I never want to see my %s again!"},
{"I give up! %s can keep my %s for all I care!",
"I give up! I never want to see my %s again!"},
{"Shoot! Just forget about recovering ANYTHING for me, ok?", ""},
{"At Last! %s has recovered %s for me!", ""}
},
{
{"Muuaahhhaaahaaaa! Some puny mortal has stolen my %s! I shall seek revenge!!", ""},
{"I shall send many minions to seek my %s! All that steal from me shall die!!", ""},
{"SO, you have defeated my servants. I shall still regain my %s!!", ""},
{"I am prepared to reward well anyone that aids the return of my %s. Are any of you puny mortals willing to attempt my challenge?", ""},
{"If you are worthy, I will grant many favors upon anyone that returns my %s.", ""},
{"Matthew, By the dark powers, I command you to seek my %s! Now, if any of you worthless mortals wish to attempt to return it, I shall grant you many powers!", ""},
{"I sense that Unique is nearing the witless thief who stole my %s. Now, my vengence shall be sweet!", ""},
{"Ahhh, my servant has returned, and informs me that %s stole my %s. They shall be incinerated by the powers that I command!!!",
"Matthew has informed me that the weakling that stole my %s has met his maker!!"},
{"Are none of you powerful enough to kill %s and regain my %s? Bah!! Mortals are useless, except as side dishes!!",
"Though my taste for blood has been satiated, my %s still evades my grasp!"},
{"Are none of you powerful enough to kill %s and regain my %s ? Bah!! Mortals are useless, except as side dishes!!",
"Though my taste for blood has been satiated, my %s still evades my grasp!"},
{"Are none of you powerful enough to kill %s and regain my %s ? Bah!! Mortals are useless, except as side dishes!!",
"Though my taste for blood has been satiated, my %s still evades my grasp!"},
{"I should have known that a powerless, puny mortal could never be the servant of my vengence against %s, or regain my %s!!",
"I shall rain death upon all of you for refusing to return my %s!!!"},
{"I should have known that a powerless, puny mortal could never be the servant of my vengence against %s, or regain my %s!!",
"I shall rain death upon all of you for refusing to return my %s!!!"},
{"I shall slay your brothers and poison your fields for refusing to seek %s and return my %s!!!!",
"Though my vengeance has been served, I shall drink your souls for your failure to return my %s!!!"},
{"I shall slay your brothers and poison your fields for refusing to seek %s and return my %s!!!!",
"Though my vengeance has been served, I shall drink your souls for your failure to return my %s!!!"},
{"Death and great suffering shall be your punishment for failing me!!!?",
""},
{"Well done. It seems that %s at least has a modicum of strength, unlike you worthless idiots who failed to return my %s! My curse shall lie upon you for the rest of your short days!", ""}
}
};
void do_mobquest (CHAR_DATA * ch, char *argument)
{
extern bool quest;
extern bool auto_quest;
extern CHAR_DATA *quest_mob;
extern CHAR_DATA *quest_target;
extern OBJ_DATA *aquest_object;
extern int quest_timer;
extern int quest_wait;
extern sh_int quest_personality;
char buf[MAX_STRING_LENGTH];
char new_long_desc[MAX_STRING_LENGTH];
if (argument[0] == '\0') /* Display status */
{
if (!quest)
{
send_to_char ("There is no quest currently running.\n\r", ch);
if (auto_quest)
send_to_char ("Quests are currently running automatically.\n\r",
ch);
if (quest_wait > 0)
{
sprintf (buf, "The next quest may occur in %d minutes.\n\r",
quest_wait);
send_to_char (buf, ch);
}
return;
}
else
send_to_char ("There is currently a quest running ", ch);
if (auto_quest)
send_to_char ("(Automatically)", ch);
send_to_char ("\n\rQuest Details:\n\r\n\r", ch);
if (quest_mob)
{
sprintf (buf, "The questing mobile is: %s [In Room %d]\n\r",
quest_mob->short_descr, quest_mob->in_room->vnum);
send_to_char (buf, ch);
}
else
{
send_to_char ("The questing mobile is dead!\n\r", ch);
}
if (quest_target)
{
sprintf (buf, "Target Mobile is: %s [In Room %d]\n\r",
quest_target->short_descr, quest_target->in_room->vnum);
send_to_char (buf, ch);
}
else
send_to_char ("The target mobile is dead!\n\r", ch);
sprintf (buf, "Target Object is: %s.\n\r", aquest_object->short_descr);
send_to_char (buf, ch);
sprintf (buf, "The Quest has been running for %d/15 minutes.\n\r",
quest_timer);
send_to_char (buf, ch);
return;
}
if (!strcmp (argument, "stop"))
{
if (quest)
{
sprintf (buf,
"The quest has been stopped by an Immortal. Please speak up if you have already retrieved the item");
do_qtalk (ch, buf);
clear_quest ();
quest_wait = 0;
}
return;
}
if (!strcmp (argument, "start"))
{
/* generate a new quest! */
if (quest)
{
send_to_char ("There is already a quest running...\n\r", ch);
return;
}
if (auto_quest)
{
auto_quest = FALSE;
send_to_char ("Automatic Quests now OFF.\n\r", ch);
}
quest_mob = get_quest_giver (1, 2500);
if (quest_mob == NULL)
{
send_to_char ("Failed to find a quest mob\n\r", ch);
return;
}
quest_personality = number_range (1, 4);
quest_target = get_quest_target (1, 400);
if ((quest_target == NULL) || (quest_target == quest_mob))
{
send_to_char ("Failed to find a quest target\n\r", ch);
return;
}
aquest_object = load_aquest_object (quest_target);
if (aquest_object == NULL)
{
send_to_char
("An invalid quest object was encountered. Check log files.\n\r",
ch);
quest = FALSE;
return;
}
quest_timer = 0;
quest = TRUE;
new_long_desc[0] = '\0';
if (quest_mob->long_descr_orig != NULL)
free_string (quest_mob->long_descr_orig);
quest_mob->long_descr_orig = str_dup (quest_mob->long_descr);
sprintf (new_long_desc, "%s says have you found my %s ?\n\r",
quest_mob->short_descr,
smash_article (aquest_object->short_descr));
if (quest_mob->long_descr != NULL)
free_string (quest_mob->long_descr);
quest_mob->long_descr = str_dup (new_long_desc);
if (IS_SET (quest_mob->act, ACT_AGGRESSIVE))
REMOVE_BIT (quest_mob->act, ACT_AGGRESSIVE);
SET_BIT (quest_mob->act, ACT_NOTRAVEL);
SET_BIT (quest_mob->act, ACT_NOSUMMON);
SET_BIT (quest_mob->act, ACT_NO_KILL);
new_long_desc[0] = '\0';
if (quest_target->long_descr_orig != NULL)
free_string (quest_target->long_descr_orig);
quest_target->long_descr_orig = str_dup (quest_target->long_descr);
sprintf (new_long_desc, "%s says I stole the %s !!!\n\r",
quest_target->short_descr,
smash_article (aquest_object->short_descr));
if (quest_target->long_descr != NULL)
free_string (quest_target->long_descr);
quest_target->long_descr = str_dup (new_long_desc);
if (IS_SET (quest_mob->act, ACT_AGGRESSIVE))
REMOVE_BIT (quest_mob->act, ACT_AGGRESSIVE);
SET_BIT (quest_mob->act, ACT_NOTRAVEL);
SET_BIT (quest_mob->act, ACT_NOSUMMON);
send_to_char ("QUEST STARTED!\n\r\n\r", ch);
sprintf (buf, "The questing mobile is: %s [In Room %d]\n\r",
quest_mob->short_descr, quest_mob->in_room->vnum);
send_to_char (buf, ch);
if (IS_SET (quest_target->act, ACT_AGGRESSIVE))
REMOVE_BIT (quest_target->act, ACT_AGGRESSIVE);
sprintf (buf, "Target Mobile is: %s [In Room %d]\n\r",
quest_target->short_descr, quest_target->in_room->vnum);
send_to_char (buf, ch);
sprintf (buf, "Target Object is: %s.\n\r", aquest_object->short_descr);
send_to_char (buf, ch);
sprintf (buf, "Mob Personality is: %d.\n\r", quest_personality);
send_to_char (buf, ch);
return;
}
if (!str_cmp (argument, "auto"))
{
send_to_char ("AutoQuest now initiated!\n\r", ch);
do_questinfo (ch, "#cAuto-Quest has been initiated!");
auto_quest = TRUE;
return;
}
if (!str_cmp (argument, "autooff"))
{
send_to_char ("AutoQuest disabled!\n\r", ch);
do_questinfo (ch, "#cAuto-Quest has been disabled!");
auto_quest = FALSE;
return;
}
return;
}
/*
* get_quest_target : This attempts to pick a random mobile to hold the quest
* item for the player (questor). Various checks are made to ensure that the
* questor has a chance of killing the mobile, etc.
* Returns NULL if it didn't get a mobile this time.
*/
CHAR_DATA *get_quest_target (int min_level, int max_level)
{
CHAR_DATA *target;
int min_index = 0; /* the minimum number of times to go through the list */
min_index = number_range (1, 1000);
for (target = char_list; target != NULL; target = target->next)
{
if (!IS_NPC (target))
continue;
min_index -= 1;
if (min_index > 0)
continue;
if ((target->level < min_level)
|| (target->level > max_level) || (IS_SET (target->act, ACT_PET)))
continue;
/* Lastly, some random choice */
if (number_percent () < 2)
break;
}
return target;
}
/*
* load_aquest_object : This takes a pointer to OBJ_INDEX_DATA and places the
* object onto the target.
*/
OBJ_DATA *load_aquest_object (CHAR_DATA * target)
{
OBJ_INDEX_DATA *pObj;
OBJ_DATA *object;
int foo;
foo = number_range (OBJ_VNUM_QUEST_MIN, OBJ_VNUM_QUEST_MAX);
pObj = get_obj_index (foo);
if (pObj == NULL)
{
bug ("load_aquest_object : Invalid object vnum %d.", foo);
return NULL;
}
object = create_object (pObj, 1);
object->item_type = ITEM_QPRIZE;
obj_to_char (object, target);
return object;
}
CHAR_DATA *get_quest_giver (int min_level, int max_level)
{
CHAR_DATA *target;
int min_index = 0;
min_index = number_range (0, 1000);
for (target = char_list; target != NULL; target = target->next)
{
if (!IS_NPC (target))
continue;
min_index -= 1;
if (min_index > 0)
continue;
if (target->pIndexData->count > 4)
continue;
if ((target->level < min_level)
|| (target->level > max_level) || (IS_SET (target->act, ACT_PET)))
continue;
{
if (number_percent () < 2)
break;
}
}
return target;
}
/*
* quest_inform : Makes the questing mobile give out information to the
* players on the mud. Starts off real simple, and gets more helpful as
* time runs out :P
*/
void quest_inform (void)
{
char buf[MAX_STRING_LENGTH];
extern CHAR_DATA *quest_mob;
extern CHAR_DATA *quest_target;
extern OBJ_DATA *aquest_object;
extern int quest_timer;
extern sh_int quest_personality;
extern const struct qmessage_type qmessages[5][17];
/* Work out what the mob should tell the players.... */
/* Add random element to each case so quests look different each time? */
if (quest_timer < 7)
{
sprintf (buf, qmessages[quest_personality][quest_timer].message1,
smash_article (aquest_object->short_descr));
}
else
{
if (quest_target)
sprintf (buf, qmessages[quest_personality][quest_timer].message1,
quest_target->short_descr,
smash_article (aquest_object->short_descr));
else
sprintf (buf, qmessages[quest_personality][quest_timer].message2,
aquest_object->short_descr);
}
quest_timer++;
if (quest_mob && quest_timer < 16)
do_qtalk (quest_mob, buf);
if (quest_timer == 1)
{
sprintf (buf, " %s is questing for %s ", NAME (quest_mob),
aquest_object->short_descr);
do_questinfo (quest_mob, buf);
}
if (!quest_mob)
{
clear_quest ();
}
return;
}
void quest_complete (CHAR_DATA * ch)
{
extern CHAR_DATA *quest_mob;
extern OBJ_DATA *aquest_object;
extern sh_int quest_personality;
extern const struct qmessage_type qmessages[5][17];
char buf[MAX_STRING_LENGTH];
sprintf (buf, qmessages[quest_personality][16].message1, NAME (ch),
smash_article (aquest_object->short_descr));
do_qtalk (quest_mob, buf);
clear_quest ();
return;
}
void quest_cancel ()
{
extern CHAR_DATA *quest_mob;
if (quest_mob)
do_qtalk (quest_mob,
"Shoot! Just forget about recovering ANYTHING for me, ok?");
clear_quest ();
return;
}
void clear_quest ()
{
extern bool quest;
extern CHAR_DATA *quest_mob;
extern CHAR_DATA *quest_target;
extern OBJ_DATA *aquest_object;
extern int quest_timer;
extern int quest_wait;
extern sh_int quest_personality;
/* Clear ALL values, ready for next quest */
quest = FALSE;
extract_obj (aquest_object);
if (quest_mob)
{
free_string (quest_mob->long_descr);
quest_mob->long_descr = str_dup (quest_mob->long_descr_orig);
free_string (quest_mob->long_descr_orig);
quest_mob->long_descr_orig = NULL;
}
if (quest_target)
{
free_string (quest_target->long_descr);
quest_target->long_descr = str_dup (quest_target->long_descr_orig);
free_string (quest_target->long_descr_orig);
quest_target->long_descr_orig = NULL;
};
quest_mob = NULL;
quest_target = NULL;
aquest_object = NULL;
quest_timer = 0;
quest_wait = 2 + number_range (1, 4);
quest_personality = 0;
return;
}
void generate_auto_quest ()
{
extern bool quest;
extern CHAR_DATA *quest_mob;
extern CHAR_DATA *quest_target;
extern OBJ_DATA *aquest_object;
extern int quest_timer;
extern int quest_wait;
extern sh_int quest_personality;
char new_long_desc[MAX_STRING_LENGTH];
sh_int loop_counter = 0;
/* generate a new quest! */
if (quest)
{
return;
}
quest_mob = NULL;
quest_target = NULL;
quest_personality = number_range (1, 4);
while ((quest_mob == NULL) && (loop_counter < 500))
{
loop_counter++;
quest_mob = get_quest_giver (1, 2500);
}
if (quest_mob == NULL)
{
quest = FALSE;
quest_wait = number_range (1, 3);
return;
}
loop_counter = 0;
while ((quest_target == NULL) && (loop_counter < 500))
{
loop_counter++;
quest_target = get_quest_target (40, 400);
}
if (quest_target == NULL)
{
quest = FALSE;
quest_wait = number_range (1, 3);
return;
}
aquest_object = load_aquest_object (quest_target);
if (aquest_object == NULL)
{
quest = FALSE;
quest_wait = number_range (1, 3);
return;
}
quest_timer = 0;
quest = TRUE;
new_long_desc[0] = '\0';
if (quest_mob->long_descr_orig != NULL)
free_string (quest_mob->long_descr_orig);
quest_mob->long_descr_orig = str_dup (quest_mob->long_descr);
sprintf (new_long_desc, "%s says have you found my %s ?\n\r",
quest_mob->short_descr, aquest_object->short_descr);
if (quest_mob->long_descr != NULL)
free_string (quest_mob->long_descr);
quest_mob->long_descr = str_dup (new_long_desc);
SET_BIT (quest_mob->act, ACT_NOTRAVEL);
SET_BIT (quest_mob->act, ACT_NOSUMMON);
new_long_desc[0] = '\0';
if (quest_target->long_descr_orig != NULL)
free_string (quest_target->long_descr_orig);
quest_target->long_descr_orig = str_dup (quest_target->long_descr);
sprintf (new_long_desc, "%s says I stole the %s !!!\n\r",
quest_target->short_descr, aquest_object->short_descr);
if (quest_target->long_descr != NULL)
free_string (quest_target->long_descr);
quest_target->long_descr = str_dup (new_long_desc);
SET_BIT (quest_mob->act, ACT_NOTRAVEL);
SET_BIT (quest_mob->act, ACT_NOSUMMON);
return;
}
void ask_quest_question (CHAR_DATA * ch, char *argument)
{
extern CHAR_DATA *quest_mob;
extern CHAR_DATA *quest_target;
extern OBJ_DATA *aquest_object;
extern sh_int quest_timer;
extern bool quest;
char buf[MAX_STRING_LENGTH];
buf[0] = '\0';
if (!quest || IS_NPC (ch))
return;
if ((!str_cmp (argument, "who is the thief?"))
|| (!str_cmp (argument, "who was the thief?"))
|| (!str_cmp (argument, "who stole it?"))
|| (!str_cmp (argument, "what mob?"))
|| (!str_cmp (argument, "who stole the item?")))
{
if (quest_mob)
{
if (quest_timer < 7)
{
sprintf (buf, "I don't even know who stole it yet!");
}
else if (aquest_object && quest_target)
{
sprintf (buf, "It was %s who stole my %s.",
quest_target->short_descr, aquest_object->short_descr);
}
}
else if (aquest_object)
{
sprintf (buf,
"Don't worry about who stole my %s, they have received their just reward!",
aquest_object->short_descr);
}
if (quest_mob != NULL)
do_qtalk (quest_mob, buf);
return;
}
if (!str_cmp (argument, "what item?"))
{
if (quest_mob && aquest_object)
{
sprintf (buf, "My %s was stolen from me, find it!.",
aquest_object->short_descr);
do_qtalk (quest_mob, buf);
return;
}
}
if (!str_cmp (argument, "where are you?"))
if (quest_mob)
{
sprintf (buf,
"You can find me in %s, in the room '%s', please hurry!!",
quest_mob->in_room->area->name, quest_mob->in_room->name);
do_qtalk (quest_mob, buf);
return;
}
if (!str_cmp (argument, "where is the thief?"))
{
if (quest_mob)
{
if ((quest_target) && (quest_timer > 7))
{
if (quest_timer < 10)
{
sprintf (buf,
"I don't really know where %s is, let me try and find out.",
quest_target->short_descr);
}
else if (quest_target)
{
sprintf (buf, "I'm not really sure, but I THINK %s is in %s",
quest_target->short_descr,
quest_target->in_room->area->name);
}
}
else if ((quest_target) && (quest_timer <= 7))
{
sprintf (buf, "I don't even know who stole it yet!");
}
else
{
sprintf (buf,
"Don't worry about where the thief who stole my %s is, they have received their just reward",
aquest_object->short_descr);
}
do_qtalk (quest_mob, buf);
}
}
return;
}
void give_token (CHAR_DATA * questmaster, CHAR_DATA * ch, int value)
{
OBJ_DATA *obj;
char buf[MAX_STRING_LENGTH];
obj = create_object (get_obj_index (OBJ_VNUM_PROTOPLASM), 50);
if (WizConfig->qpbonus > 1)
value *= WizConfig->qpbonus;
obj->value[0] = value;
obj->level = value;
obj->cost = 1000;
obj->item_type = ITEM_QUEST;
obj_to_char (obj, ch);
free_string (obj->name);
obj->name = str_dup ("quest token");
free_string (obj->short_descr);
sprintf (buf, "a %d point quest token", value);
obj->short_descr = str_dup (buf);
free_string (obj->description);
sprintf (buf, "A %d point quest token lies on the floor.", value);
obj->description = str_dup (buf);
act ("You receive $p from $N.", ch, obj, questmaster, TO_CHAR);
act ("$n receives $p from $N.", ch, obj, questmaster, TO_ROOM);
if (!IS_NPC (ch))
{
ch->pcdata->score[SCORE_NUM_QUEST]++;
ch->pcdata->score[SCORE_QUEST] += value;
}
ch->pcdata->questsrun++;
ch->pcdata->questtotal += value;
do_autosave (ch, "");
}