/* * * ACT_MOB.C: Trilby@Refugee MUD * Copyright 1997, Lord Thomas Burbridge * * Mobile memory procedures. * * This work is a derivative of ROM2.4 * Copyright 1995, Russ Taylor. */ #include <sys/time.h> #include <sys/types.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include "merc.h" #include "tables.h" #include "recycle.h" #include "utils.h" MEM_DATA *get_mem_data(CHAR_DATA * ch, CHAR_DATA * target) { MEM_DATA *remember; if (!IS_NPC(ch)) { bug("get_mem_data: ch not NPC", 0); return NULL; } if (ch == NULL) { bug("get_mem_data: NULL ch", 0); return NULL; } if (target == NULL) { bug("get_mem_data: NULL target", 0); return NULL; } for (remember = ch->memory; remember != NULL; remember = remember->next) { if (remember->id == target->id) return remember; } return NULL; } void mob_remember(CHAR_DATA * ch, CHAR_DATA * target, int reaction) { MEM_DATA *remember; char buf4[MAX_STRING_LENGTH]; if (!IS_NPC(ch)) { sprintf(buf4, "mob_remember: ch %s not NPC from mob %s", ch->name, target->name); bug(buf4, 0); return; } if (ch == NULL) { bug("mob_remember: NULL ch", 0); return; } if (target == NULL) { bug("mob_remember: NULL target", 0); return; } if ((remember = get_mem_data(ch, target)) == NULL) { remember = new_mem_data(); remember->next = ch->memory; ch->memory = remember; } remember->id = target->id; remember->when = current_time; SET_BIT(remember->reaction, reaction); return; } void mem_fade(CHAR_DATA * ch) { /* called from char_update */ MEM_DATA *remember, *remember_next; if (ch == NULL) { bug("mem_fade: NULL ch", 0); return; } if (!IS_NPC(ch)) { bug("mem_fade: ch not NPC", 0); return; } if (ch->memory == NULL) return; for (remember = ch->memory; remember != NULL; remember = remember_next) { remember_next = remember->next; if (IS_NPC(ch) && IS_SET(ch->off_flags, OFF_HUNT) && ch->hunting == NULL && IS_SET(remember->reaction, MEM_HOSTILE)) ch->hunting = get_char_id(remember->id); if (current_time - remember->when < (96 * 60)) mob_forget(ch, remember); } return; } void mob_forget(CHAR_DATA * ch, MEM_DATA * memory) { if (!IS_NPC(ch)) { bug("mob_forget: ch not NPC", 0); return; } if (ch == NULL) { bug("mob_forget: NULL ch", 0); return; } if (memory == NULL) return; if (memory == ch->memory) { ch->memory = memory->next; } else { MEM_DATA *prev; for (prev = ch->memory; prev != NULL; prev = prev->next) { if (prev->next == memory) { prev->next = memory->next; break; } if (prev == NULL) { bug("mob_forget: memory not found", 0); return; } } } free_mem_data(memory); return; }