/* dbhandle.c */
#include "config.h"
#include "object.h"
#include "globals.h"
#include "construct.h"
#include "interface.h"
#include "dbhandle.h"
void db_queue_for_alarm(struct object *obj, long delay, char *funcname) {
struct alarmq *new,*curr,*prev;
remove_alarm(obj,funcname);
new=MALLOC(sizeof(struct alarmq));
new->obj=obj;
new->funcname=copy_string(funcname);
new->delay=delay;
curr=alarm_list;
prev=NULL;
while (curr) {
if (new->delay<curr->delay) {
if (prev)
prev->next=new;
else
alarm_list=new;
new->next=curr;
return;
}
prev=curr;
curr=curr->next;
}
if (prev)
prev->next=new;
else
alarm_list=new;
new->next=NULL;
}
void remove_verb(struct object *obj, char *verb_name) {
struct verb *curr,*prev;
curr=obj->verb_list;
if (!curr) return;
if (!strcmp(curr->verb_name,verb_name)) {
FREE(curr->verb_name);
FREE(curr->function);
obj->verb_list=curr->next;
FREE(curr);
return;
}
prev=curr;
curr=prev->next;
while (curr) {
if (!strcmp(curr->verb_name,verb_name)) {
FREE(curr->verb_name);
FREE(curr->function);
prev->next=curr->next;
FREE(curr);
return;
}
prev=curr;
curr=curr->next;
}
}
void queue_command(struct object *player, char *cmd) {
struct cmdq *new;
if (!player) return;
new=MALLOC(sizeof(struct cmdq));
new->cmd=copy_string(cmd);
new->obj=player;
new->next=NULL;
if (cmd_tail)
cmd_tail->next=new;
if (!cmd_head)
cmd_head=new;
cmd_tail=new;
}
void queue_for_destruct(struct object *obj) {
struct destq *new;
new=dest_list;
while (new) {
if (new->obj==obj) return;
new=new->next;
}
new=MALLOC(sizeof(struct destq));
new->obj=obj;
new->next=dest_list;
dest_list=new;
}
void queue_for_alarm(struct object *obj, long delay, char *funcname) {
struct alarmq *new,*curr,*prev;
if (delay<0) return;
remove_alarm(obj,funcname);
new=MALLOC(sizeof(struct alarmq));
new->obj=obj;
new->funcname=copy_string(funcname);
new->delay=now_time+delay;
curr=alarm_list;
prev=NULL;
while (curr) {
if (new->delay<curr->delay) {
if (prev)
prev->next=new;
else
alarm_list=new;
new->next=curr;
return;
}
prev=curr;
curr=curr->next;
}
if (prev)
prev->next=new;
else
alarm_list=new;
new->next=NULL;
}
long remove_alarm(struct object *obj, char *funcname) {
struct alarmq *curr,*prev,*tmp;
long result;
curr=alarm_list;
prev=NULL;
if (!funcname) {
while (curr) {
if (obj==curr->obj) {
if (prev)
prev->next=curr->next;
else
alarm_list=curr->next;
tmp=curr->next;
FREE(curr->funcname);
FREE(curr);
curr=tmp;
} else {
prev=curr;
curr=curr->next;
}
}
return 0;
}
while (curr) {
if (obj==curr->obj && (!strcmp(funcname,curr->funcname))) {
if (prev)
prev->next=curr->next;
else
alarm_list=curr->next;
FREE(curr->funcname);
result=curr->delay-now_time;
FREE(curr);
return result;
}
prev=curr;
curr=curr->next;
}
return -1;
}
struct object *newobj() {
struct obj_blk *newblock,*curr;
struct object *obj;
signed long count;
if (free_obj_list) {
obj=free_obj_list;
free_obj_list=free_obj_list->next_object;
} else {
if (db_top==objects_allocd) {
if (!obj_list) {
obj_list=MALLOC(sizeof(struct obj_blk));
obj_list->next=NULL;
obj_list->block=MALLOC(sizeof(struct object)*OBJ_ALLOC_BLKSIZ);
} else {
curr=obj_list;
while (curr->next) curr=curr->next;
newblock=MALLOC(sizeof(struct obj_blk));
curr->next=newblock;
newblock->next=NULL;
newblock->block=MALLOC(sizeof(struct object)*OBJ_ALLOC_BLKSIZ);
}
objects_allocd+=OBJ_ALLOC_BLKSIZ;
}
curr=obj_list;
count=++db_top;
while (count>OBJ_ALLOC_BLKSIZ) {
curr=curr->next;
count-=OBJ_ALLOC_BLKSIZ;
}
obj=&(curr->block[count-1]);
obj->refno=db_top-1;
}
obj->devnum=-1;
obj->flags=0;
obj->parent=NULL;
obj->next_child=NULL;
obj->location=NULL;
obj->contents=NULL;
obj->next_object=NULL;
obj->globals=NULL;
obj->refd_by=NULL;
obj->verb_list=NULL;
return obj;
}
struct object *find_proto(char *path) {
struct object *obj;
struct proto *curr;
obj=ref_to_obj(0);
curr=obj->parent;
while (curr) {
if (!strcmp(curr->pathname,path))
return curr->proto_obj;
curr=curr->next_proto;
}
return NULL;
}
void compile_error(struct object *player, char *path, unsigned int line) {
char *buf;
if (!c_err_msg) c_err_msg="unknown error";
buf=MALLOC(21+ITOA_BUFSIZ+strlen(path)+strlen(c_err_msg));
sprintf(buf,"compile: %s.c line #%ld: %s",path,(long) line,c_err_msg);
log_sysmsg(buf);
if (player) {
send_device(player,buf);
send_device(player,"\n");
}
FREE(buf);
}
struct object *ref_to_obj(signed long refno) {
struct obj_blk *curr;
struct object *obj;
signed long count,index;
if (refno>(db_top-1)) return NULL;
if (refno<0) return NULL;
count=refno/OBJ_ALLOC_BLKSIZ;
index=refno%OBJ_ALLOC_BLKSIZ;
curr=obj_list;
while (count--)
curr=curr->next;
obj=&(curr->block[index]);
if (obj->flags & GARBAGE) return NULL;
return obj;
}