/* $Id: memento.c,v 1.666 2004/09/20 10:49:50 shrike Exp $ */
/************************************************************************************
* Copyright 2004 Astrum Metaphora consortium *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
************************************************************************************/
#include <stdio.h>
#include "merc.h"
bool memento_set(CHAR_DATA *ch, const char *name, int vnum, int type)
{
varr* list;
vo_t vo;
memento_t *memento;
if (ch == NULL)
return FALSE;
switch (type)
{
case TYPE_ROOM:
list = &ch->remembered_rooms;
if ((vo.r = get_room_index(vnum)) == NULL)
return FALSE;;
break;
case TYPE_OBJ:
list = &ch->remembered_objects;
if ((vo.o = get_obj_index(vnum)) == NULL)
return FALSE;
break;
case TYPE_MOB:
list = &ch->remembered_mobs;
if ((vo.m = get_mob_index(vnum)) == NULL)
return FALSE;
break;
case TYPE_PC:
list = &ch->remembered_people;
if ((vo.vnum = vnum) == 0)
return FALSE;
break;
default:
return FALSE;
break;
}
memento = varr_enew(list);
memento->name = str_dup(name);
memento->id = vo;
varr_qsort(list, cmpstr);
return TRUE;
}
memento_t * lookup_remembered_room (CHAR_DATA *ch, ROOM_INDEX_DATA *room)
{
int i;
memento_t *memento;
if (ch == NULL)
return NULL;
for (i = 0; i < ch->remembered_rooms.nused; i++)
{
memento = VARR_GET(&ch->remembered_rooms, i);
if (memento->id.r == room)
return memento;
}
return NULL;
}
memento_t * lookup_remembered_obj (CHAR_DATA *ch, OBJ_INDEX_DATA *obj)
{
int i;
memento_t *memento;
if (ch == NULL)
return NULL;
for (i = 0; i < ch->remembered_objects.nused; i++)
{
memento = VARR_GET(&ch->remembered_objects, i);
if (memento->id.o == obj)
return memento;
}
return NULL;
}
memento_t * lookup_remembered_mob (CHAR_DATA *ch, MOB_INDEX_DATA *mob)
{
int i;
memento_t *memento;
if (ch == NULL)
return NULL;
for (i = 0; i < ch->remembered_mobs.nused; i++)
{
memento = VARR_GET(&ch->remembered_mobs, i);
if (memento->id.m == mob)
return memento;
}
return NULL;
}
memento_t * lookup_remembered_pc (CHAR_DATA *ch, int id)
{
int i;
memento_t *memento;
if (ch == NULL)
return NULL;
for (i = 0; i < ch->remembered_people.nused; i++)
{
memento = VARR_GET(&ch->remembered_people, i);
if (memento->id.vnum == id)
return memento;
}
return NULL;
}
int memento_type(CHAR_DATA *ch, const char *name)
{
memento_t *m;
if (ch == NULL)
return TYPE_NONE;
if ((m = memento_lookup(ch->remembered_rooms, name)) != NULL)
return TYPE_ROOM;
if ((m = memento_lookup(ch->remembered_mobs, name)) != NULL)
return TYPE_MOB;
if ((m = memento_lookup(ch->remembered_objects, name)) != NULL)
return TYPE_OBJ;
if ((m = memento_lookup(ch->remembered_people, name)) != NULL)
return TYPE_PC;
return TYPE_NONE;
}
ROOM_INDEX_DATA * get_remembered_room_index(CHAR_DATA *ch, const char *name)
{
memento_t *m;
if (ch == NULL)
return NULL;
if ((m = memento_lookup(ch->remembered_rooms, name)) == NULL)
return NULL;
return m->id.r;
}
MOB_INDEX_DATA * get_remembered_mob_index(CHAR_DATA *ch, const char *name)
{
memento_t *m;
if (ch == NULL)
return NULL;
if ((m = memento_lookup(ch->remembered_mobs, name)) == NULL)
return NULL;
return m->id.m;
}
OBJ_INDEX_DATA * get_remembered_obj_index(CHAR_DATA *ch, const char *name)
{
memento_t *m;
if (ch == NULL)
return NULL;
if ((m = memento_lookup(ch->remembered_objects, name)) == NULL)
return NULL;
return m->id.o;
}
int get_remembered_pc_id(CHAR_DATA *ch, const char *name)
{
memento_t *m;
if (ch == NULL)
return 0;
if ((m = memento_lookup(ch->remembered_people, name)) == NULL)
return 0;
return m->id.vnum;
}
void show_remembered_rooms(CHAR_DATA *ch)
{
int i;
memento_t *m;
ROOM_INDEX_DATA *room;
if (ch->remembered_rooms.nused == 0)
{
char_act("You haven't remembered any places.", ch);
return;
}
char_act("You remembered the following places:", ch);
for (i = 0; i < ch->remembered_rooms.nused; i++)
{
m = VARR_GET(&ch->remembered_rooms, i);
room = m->id.r;
if (room == NULL)
act("$t...um, you forgot where is this.", ch, m->name, NULL, TO_CHAR);
else
act("$FL20{$T} $t", ch, mlstr_cval(room->name, ch), m->name, TO_CHAR);
}
char_act(str_empty, ch);
}
void show_remembered_objects(CHAR_DATA *ch)
{
int i;
memento_t *m;
OBJ_INDEX_DATA *object;
if (ch->remembered_objects.nused == 0)
{
char_act("You haven't remembered any objects.", ch);
return;
}
char_act("You remembered the following objects:", ch);
for (i = 0; i < ch->remembered_objects.nused; i++)
{
m = VARR_GET(&ch->remembered_objects, i);
object = m->id.o;
if (object == NULL)
act("$t...um, you forgot what is this.", ch, m->name, NULL, TO_CHAR);
else
act("$FL20{$T} $t", ch, format_short(object->short_descr, object->name, ch, 0), m->name, TO_CHAR);
}
char_act(str_empty, ch);
}
void show_remembered_people(CHAR_DATA *ch)
{
int i;
memento_t *m;
MOB_INDEX_DATA *mob;
if (ch->remembered_mobs.nused == 0
&& ch->remembered_people.nused == 0)
{
char_act("You haven't remembered any people or creatures.", ch);
return;
}
char_act("You remembered the following people and creatures:", ch);
for (i = 0; i < ch->remembered_mobs.nused; i++)
{
m = VARR_GET(&ch->remembered_mobs, i);
mob = m->id.m;
if (mob == NULL)
act("$t...um, you forgot who is this.", ch, m->name, NULL, TO_CHAR);
else
act("$FL20{$T} $t", ch, format_short(mob->short_descr, mob->name, ch, 0), m->name, TO_CHAR);
}
for (i = 0; i < ch->remembered_people.nused; i++)
{
m = VARR_GET(&ch->remembered_people, i);
act("$t", ch, m->name, NULL, TO_CHAR);
}
char_act(str_empty, ch);
}
void remember_room(CHAR_DATA *ch, ROOM_INDEX_DATA *room, const char *name)
{
memento_t *memento;
memento = varr_enew(&ch->remembered_rooms);
memento->name = str_dup(name);
memento->id.r = room;
varr_qsort(&ch->remembered_rooms, cmpstr);
}
void remember_object(CHAR_DATA *ch, OBJ_INDEX_DATA *obj, const char *name)
{
memento_t *memento;
memento = varr_enew(&ch->remembered_objects);
memento->name = str_dup(name);
memento->id.o = obj;
varr_qsort(&ch->remembered_objects, cmpstr);
}
void remember_mob(CHAR_DATA *ch, MOB_INDEX_DATA *mob, const char *name)
{
memento_t *memento;
memento = varr_enew(&ch->remembered_mobs);
memento->name = str_dup(name);
memento->id.m = mob;
varr_qsort(&ch->remembered_mobs, cmpstr);
}
void remember_pc(CHAR_DATA *ch, int id, const char *name)
{
memento_t *memento;
memento = varr_enew(&ch->remembered_people);
memento->name = str_dup(name);
memento->id.vnum = id;
varr_qsort(&ch->remembered_people, cmpstr);
}
DO_FUN(do_remember)
{
char arg[MAX_STRING_LENGTH];
char tmp[MAX_STRING_LENGTH];
OBJ_DATA *obj;
CHAR_DATA *mob;
int type;
argument = one_argument(argument, arg, sizeof(arg));
one_argument(argument, tmp, sizeof(arg));
if (!str_cmp(tmp, "as"))
argument = one_argument(argument, tmp, sizeof(arg));
if (IS_NULLSTR(arg))
{
show_remembered_rooms(ch);
show_remembered_people(ch);
show_remembered_objects(ch);
return;
}
if (!str_cmp(arg, "places"))
{
show_remembered_rooms(ch);
return;
}
if (!str_cmp(arg, "objects"))
{
show_remembered_objects(ch);
return;
}
if (!str_cmp(arg, "people"))
{
show_remembered_people(ch);
return;
}
if ((type = memento_type(ch, argument)) != TYPE_NONE)
{
act("You already remembered a $t by this name.", ch, (type == TYPE_ROOM) ? "room" : (type == TYPE_OBJ) ? "object" : "creature", NULL, TO_CHAR);
return;
}
if (!str_cmp(arg, "here"))
{
remember_room(ch, ch->in_room, argument);
act("You remembered $r as $T.", ch, ch->in_room, argument, TO_CHAR);
return;
}
if ((mob = get_char_room(ch, arg)) != NULL)
{
if (IS_NPC(mob))
remember_mob(ch, mob->pIndexData, argument);
else
remember_pc(ch, mob->id, argument);
act("You remembered $i as $T.", ch, mob, argument, TO_CHAR);
return;
}
if ((obj = get_obj_room(ch, arg)) != NULL)
{
remember_object(ch, obj->pIndexData, argument);
act("You remembered $p as $T.", ch, obj, argument, TO_CHAR);
return;
}
char_act("You don't see that here.", ch);
return;
}
DO_FUN(do_forget)
{
memento_t *m;
const char *name = argument;
if ((m = memento_lookup(ch->remembered_rooms, name)) != NULL)
{
char_act("You forgot about a place important to you before.", ch);
varr_del(&ch->remembered_rooms, (void *) m);
return;
}
if ((m = memento_lookup(ch->remembered_mobs, name)) != NULL)
{
char_act("You forgot about someone important to you before.", ch);
varr_del(&ch->remembered_mobs, (void *) m);
return;
}
if ((m = memento_lookup(ch->remembered_objects, name)) != NULL)
{
char_act("You forgot about someone important to you before.", ch);
varr_del(&ch->remembered_objects, (void *) m);
return;
}
if ((m = memento_lookup(ch->remembered_people, name)) != NULL)
{
char_act("You forgot about something important to you before.", ch);
varr_del(&ch->remembered_people, (void *) m);
return;
}
char_act("Seems, you already forgot this.", ch);
return;
}