/*
Opinions about things
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "structs.h"
#include "utils.h"
#include "spells.h"
#include "race.h"
#include "opinion.h"
#include "db.h"
/*
external stuff
*/
extern struct index_data *mob_index;
extern struct room_data *world;
extern int DEBUG;
int FreeHates( struct char_data *ch)
{
struct char_list *k, *n;
if(DEBUG) dlog("FreeHates");
for (k=ch->hates.clist; k; k = n)
{
n = k->next;
free(n);
}
}
int FreeFears( struct char_data *ch)
{
struct char_list *k, *n;
if(DEBUG) dlog("FreeFears");
for (k=ch->fears.clist; k; k = n)
{
n = k->next;
free(n);
}
}
int RemHated( struct char_data *ch, struct char_data *pud)
{
struct char_list *oldpud, *t;
if(DEBUG) dlog("RemHated");
if (pud)
{
for (oldpud = ch->hates.clist; oldpud; oldpud = oldpud->next)
{
if (!oldpud) return(FALSE);
if (oldpud->op_ch)
{
if (oldpud->op_ch == pud)
{
t = oldpud;
if (ch->hates.clist == t)
{
ch->hates.clist = 0;
free(t);
break;
}
else
{
for (oldpud = ch->hates.clist; oldpud->next != t;oldpud = oldpud->next);
oldpud->next = oldpud->next->next;
free(t);
break;
}
}
}
else
{
if (!strcmp(oldpud->name,GET_NAME(pud)))
{
t = oldpud;
if (ch->hates.clist == t)
{
ch->hates.clist = 0;
free(t);
break;
}
else
{
for (oldpud = ch->hates.clist; oldpud->next != t;oldpud = oldpud->next);
oldpud->next = oldpud->next->next;
free(t);
break;
}
}
}
}
}
if (!ch->hates.clist)
REMOVE_BIT(ch->hatefield, HATE_CHAR);
if (!ch->hatefield)
REMOVE_BIT(ch->specials.act, ACT_HATEFUL);
return( (pud) ? TRUE : FALSE);
}
int AddHated( struct char_data *ch, struct char_data *pud)
{
struct char_list *newpud;
if(DEBUG) dlog("AddHated");
if (ch == pud)
return(FALSE);
if (pud)
{
CREATE(newpud, struct char_list, 1);
newpud->op_ch = pud;
strcpy(newpud->name, GET_NAME(pud));
newpud->next = ch->hates.clist;
ch->hates.clist = newpud;
if (!IS_SET(ch->specials.act, ACT_HATEFUL))
SET_BIT(ch->specials.act, ACT_HATEFUL);
if (!IS_SET(ch->hatefield, HATE_CHAR))
SET_BIT(ch->hatefield, HATE_CHAR);
if (IS_IMMORTAL(pud))
send_to_char("---Someone hates you.\n\r",pud);
}
return( (pud) ? TRUE : FALSE );
}
int AddHatred( struct char_data *ch, int parm_type, int parm)
{
if(DEBUG) dlog("AddHatred");
switch(parm_type)
{
case OP_SEX :
if (!IS_SET(ch->hatefield, HATE_SEX))
SET_BIT(ch->hatefield, HATE_SEX);
ch->hates.sex = parm;
break;
case OP_RACE:
if (!IS_SET(ch->hatefield, HATE_RACE))
SET_BIT(ch->hatefield, HATE_RACE);
ch->hates.race = parm;
break;
case OP_GOOD:
if (!IS_SET(ch->hatefield, HATE_GOOD))
SET_BIT(ch->hatefield, HATE_GOOD);
ch->hates.good = parm;
break;
case OP_EVIL:
if (!IS_SET(ch->hatefield, HATE_EVIL))
SET_BIT(ch->hatefield, HATE_EVIL);
ch->hates.evil = parm;
break;
case OP_CLASS:
if (!IS_SET(ch->hatefield, HATE_CLASS))
SET_BIT(ch->hatefield, HATE_CLASS);
ch->hates.class = parm;
break;
case OP_VNUM:
if (!IS_SET(ch->hatefield, HATE_VNUM))
SET_BIT(ch->hatefield, HATE_VNUM);
ch->hates.vnum = parm;
break;
}
if (!IS_SET(ch->specials.act, ACT_HATEFUL)) {
SET_BIT(ch->specials.act, ACT_HATEFUL);
}
}
int RemHatred( struct char_data *ch, unsigned short bitv)
{
if(DEBUG) dlog("RemHatred");
REMOVE_BIT(ch->hatefield, bitv);
if (!ch->hatefield)
REMOVE_BIT(ch->specials.act, ACT_HATEFUL);
}
int Hates( struct char_data *ch, struct char_data *v)
{
struct char_list *i;
if(DEBUG) dlog("Hates");
if (IS_AFFECTED(ch, AFF_PARALYSIS))
return(FALSE);
if (ch == v)
return(FALSE);
if (IS_SET(ch->hatefield, HATE_CHAR)) {
if (ch->hates.clist) {
for (i = ch->hates.clist; i; i = i->next) {
if (i->op_ch) {
if ((i->op_ch == v) &&
(!strcmp(i->name, GET_NAME(v))))
return(TRUE);
} else {
if (!strcmp(i->name, GET_NAME(v)))
return(TRUE);
}
}
}
}
if (IS_SET(ch->hatefield, HATE_RACE)) {
if (ch->hates.race != -1) {
if (ch->hates.race == GET_RACE(v))
return(TRUE);
}
}
if (IS_SET(ch->hatefield, HATE_SEX)) {
if (ch->hates.sex == GET_SEX(v))
return(TRUE);
}
if (IS_SET(ch->hatefield, HATE_GOOD)) {
if (ch->hates.good < GET_ALIGNMENT(v))
return(TRUE);
}
if (IS_SET(ch->hatefield, HATE_EVIL)) {
if (ch->hates.evil > GET_ALIGNMENT(v))
return(TRUE);
}
if (IS_SET(ch->hatefield, HATE_CLASS)) {
if (HasClass(v, ch->hates.class)) {
return(TRUE);
}
}
if (IS_SET(ch->hatefield, HATE_VNUM)) {
if (ch->hates.vnum == mob_index[v->nr].virtual)
return(TRUE);
}
return(FALSE);
}
int Fears( struct char_data *ch, struct char_data *v)
{
struct char_list *i;
char buf[255];
if(DEBUG) dlog("Fears");
if (IS_AFFECTED(ch, AFF_PARALYSIS))
return(FALSE);
if (!IS_SET(ch->specials.act, ACT_AFRAID))
return(FALSE);
if (IS_SET(ch->fearfield, FEAR_CHAR)) {
if (ch->fears.clist) {
for (i = ch->fears.clist; i; i = i->next) {
if (i) {
if (i->op_ch) {
if (i->name) {
if ((i->op_ch == v) &&
(!strcmp(i->name, GET_NAME(v))))
return(TRUE);
} else {
/* lets see if this clears the problem */
RemFeared(ch, i->op_ch);
}
} else {
if (i->name) {
if (!strcmp(i->name, GET_NAME(v)))
return(TRUE);
}
}
}
}
}
}
if (IS_SET(ch->fearfield, FEAR_RACE)) {
if (ch->fears.race != -1) {
if (ch->fears.race == GET_RACE(v))
return(TRUE);
}
}
if (IS_SET(ch->fearfield, FEAR_SEX)) {
if (ch->fears.sex == GET_SEX(v))
return(TRUE);
}
if (IS_SET(ch->fearfield, FEAR_GOOD)) {
if (ch->fears.good < GET_ALIGNMENT(v))
return(TRUE);
}
if (IS_SET(ch->fearfield, FEAR_EVIL)) {
if (ch->fears.evil > GET_ALIGNMENT(v))
return(TRUE);
}
if (IS_SET(ch->fearfield, FEAR_CLASS)) {
if (HasClass(v, ch->hates.class)) {
return(TRUE);
}
}
if (IS_SET(ch->fearfield, FEAR_VNUM)) {
sprintf(buf, "you fear %i \n\r", ch->fears.vnum);
send_to_char(buf, ch);
if (ch->fears.vnum == mob_index[v->nr].virtual)
return(TRUE);
}
return(FALSE);
}
int RemFeared( struct char_data *ch, struct char_data *pud)
{
struct char_list *oldpud, *t, *tmp;
if(DEBUG) dlog("RemFeared");
if (!IS_SET(ch->specials.act, ACT_AFRAID))
return(FALSE);
if (pud && (ch->fears.clist!=0)) {
tmp = ch->fears.clist;
for (oldpud = ch->fears.clist; (oldpud!=0); oldpud = tmp) {
if (oldpud==0) return(FALSE);
tmp = oldpud->next;
if (oldpud->op_ch) {
if (oldpud->op_ch == pud) {
t = oldpud;
if (ch->fears.clist == t) {
ch->fears.clist = 0;
free(t);
break;
} else {
for (oldpud = ch->fears.clist; oldpud->next != t;
oldpud = oldpud->next);
oldpud->next = oldpud->next->next;
free(t);
break;
}
}
} else {
if (!strcmp(oldpud->name,GET_NAME(pud))) {
t = oldpud;
if (ch->fears.clist == t) {
ch->fears.clist = 0;
free(t);
break;
} else {
for (oldpud = ch->fears.clist; oldpud->next != t;
oldpud = oldpud->next);
oldpud->next = oldpud->next->next;
free(t);
break;
}
}
}
}
}
if (!ch->fears.clist)
REMOVE_BIT(ch->fearfield, FEAR_CHAR);
if (!ch->fearfield)
REMOVE_BIT(ch->specials.act, ACT_AFRAID);
return( (pud) ? TRUE : FALSE);
}
int AddFeared( struct char_data *ch, struct char_data *pud)
{
struct char_list *newpud;
if(DEBUG) dlog("AddFeared");
if (pud) {
CREATE(newpud, struct char_list, 1);
newpud->op_ch = pud;
strcpy(newpud->name,GET_NAME(pud));
newpud->next = ch->fears.clist;
ch->fears.clist = newpud;
if (!IS_SET(ch->specials.act, ACT_AFRAID)) {
SET_BIT(ch->specials.act, ACT_AFRAID);
}
if (!IS_SET(ch->fearfield, FEAR_CHAR)) {
SET_BIT(ch->fearfield, FEAR_CHAR);
}
if (IS_IMMORTAL(pud))
send_to_char("---Someone fears you.(as well they should)\n\r",pud);
}
return( (pud) ? TRUE : FALSE);
}
int AddFears( struct char_data *ch, int parm_type, int parm)
{
if(DEBUG) dlog("AddFears");
switch(parm_type) {
case OP_SEX :
if (!IS_SET(ch->fearfield, FEAR_SEX))
SET_BIT(ch->fearfield, FEAR_SEX);
ch->fears.sex = parm;
break;
case OP_RACE:
if (!IS_SET(ch->fearfield, FEAR_RACE))
SET_BIT(ch->fearfield, FEAR_RACE);
ch->fears.race = parm;
break;
case OP_GOOD:
if (!IS_SET(ch->fearfield, FEAR_GOOD))
SET_BIT(ch->fearfield, FEAR_GOOD);
ch->fears.good = parm;
break;
case OP_EVIL:
if (!IS_SET(ch->fearfield, FEAR_EVIL))
SET_BIT(ch->fearfield, FEAR_EVIL);
ch->fears.evil = parm;
break;
case OP_CLASS:
if (!IS_SET(ch->fearfield, FEAR_CLASS))
SET_BIT(ch->fearfield, FEAR_CLASS);
ch->fears.class = parm;
break;
case OP_VNUM:
if (!IS_SET(ch->fearfield, FEAR_VNUM))
SET_BIT(ch->fearfield, FEAR_VNUM);
ch->fears.vnum = parm;
break;
}
if (!IS_SET(ch->specials.act, ACT_AFRAID)) {
SET_BIT(ch->specials.act, ACT_AFRAID);
}
}
struct char_data *FindAHatee( struct char_data *ch)
{
struct char_data *tmp_ch;
if(DEBUG) dlog("FindAHatee");
if (ch->in_room < 0)
return(0);
for (tmp_ch=real_roomp(ch->in_room)->people; tmp_ch;tmp_ch = tmp_ch->next_in_room)
{
if (Hates(ch, tmp_ch) && (CAN_SEE(ch, tmp_ch))) {
if (ch->in_room == tmp_ch->in_room) {
if (ch != tmp_ch) {
return(tmp_ch);
} else {
RemHated(ch,tmp_ch);
return(0);
}
}
}
}
return(0);
}
struct char_data *FindAFearee( struct char_data *ch)
{
struct char_data *tmp_ch;
if(DEBUG) dlog("FindAFearee");
if (ch->in_room < 0)
return(0);
for (tmp_ch=real_roomp(ch->in_room)->people; tmp_ch;
tmp_ch = tmp_ch->next_in_room) {
if (Fears(ch, tmp_ch) && (CAN_SEE(ch, tmp_ch))) {
if ((ch->in_room == tmp_ch->in_room) &&
(ch != tmp_ch)) {
return(tmp_ch);
}
}
}
return(0);
}
/*
these two procedures zero out the character pointer
for quiting players, without removing names
thus the monsters will still hate them
*/
void ZeroHatred(struct char_data *ch, struct char_data *v)
{
struct char_list *oldpud;
if(DEBUG) dlog("ZeroHatred");
for (oldpud = ch->hates.clist; oldpud; oldpud = oldpud->next) {
if (oldpud) {
if (oldpud->op_ch) {
if (oldpud->op_ch == v) {
oldpud->op_ch = 0;
}
}
}
}
}
void ZeroFeared(struct char_data *ch, struct char_data *v)
{
struct char_list *oldpud;
if(DEBUG) dlog("ZeroFeared");
for (oldpud = ch->fears.clist; oldpud; oldpud = oldpud->next) {
if (oldpud) {
if (oldpud->op_ch) {
if (oldpud->op_ch == v) {
oldpud->op_ch = 0;
}
}
}
}
}
/*
these two are to make the monsters completely forget about them.
*/
void DeleteHatreds(struct char_data *ch)
{
struct char_data *i;
extern struct char_data *character_list;
if(DEBUG) dlog("DeleteHatreds");
for (i = character_list; i; i = i->next) {
if (Hates(i, ch))
RemHated(i, ch);
}
}
void DeleteFears(struct char_data *ch)
{
struct char_data *i;
extern struct char_data *character_list;
if(DEBUG) dlog("DeleteFears");
for (i = character_list; i; i = i->next) {
if (Fears(i, ch))
RemFeared(i, ch);
}
}