#include <glib.h>
#include <sys/types.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <merc.h>
#include <recycle.h>
#include <tables.h>
extern GMemChunk *obj_mem_chunk;
extern GMemChunk *extra_desc_mem_chunk;
extern bool fBootDb;
extern char str_empty [1];
/*
* Array of containers read for proper re-nesting of objects.
*/
static OBJ_DATA * rgObjNest[MAX_NEST];
extern GSList *obj_free;
OBJ_DATA *obj;
void init_obj(OBJ_DATA *obj)
{
obj->OOwner = g_string_new("");
obj->page_content = g_string_new("");
obj->questowner = g_string_new("");
obj->questmaker = g_string_new("");
obj->victpoweruse = g_string_new("");
obj->owner = g_string_new("");
obj->victpoweroff = g_string_new("");
obj->victpoweron = g_string_new("");
obj->chpoweruse = g_string_new("");
obj->chpoweroff = g_string_new("");
obj->chpoweron = g_string_new("");
obj->description = g_string_new("");
obj->short_descr = g_string_new("");
obj->name = g_string_new("");
}
/*
* reset the Values after recycle.
*/
void reset_object( OBJ_DATA *obj )
{
int x;
obj->plane = 0;
obj->last_seen_on = 0;
for (x = 0; x < MAX_SPHERE; x++)
obj->sphere[x] = 0;
for (x = 0; x < 4; x++)
obj->value[x] = 0;
obj->timer = 0;
obj->level = 0;
obj->cost = 0;
obj->points = 0;
obj->quest = 0;
obj->resistance = 0;
obj->toughness = 0;
obj->condition = 0;
obj->specpower = 0;
obj->spectype = 0;
obj->weight = 0;
obj->wear_loc = 0;
obj->wear_flags = 0;
obj->extra_flags = 0;
obj->item_type = 0;
obj->mprog_delay = 0;
obj->mprog_target = NULL;
obj->in_room = NULL;
obj->pIndexData = NULL;
obj->affected = NULL;
obj->extra_descr = NULL;
obj->chobj = NULL;
obj->carried_by = NULL;
obj->on = NULL;
obj->in_obj = NULL;
obj->contains = NULL;
obj->next_content = NULL;
obj->OOwner = g_string_assign(obj->OOwner,"");
obj->page_content = g_string_assign(obj->page_content,"");
obj->questowner = g_string_assign(obj->questowner,"");
obj->questmaker = g_string_assign(obj->questmaker,"");
obj->victpoweruse = g_string_assign(obj->victpoweruse,"");
obj->owner = g_string_assign(obj->owner,"");
obj->victpoweroff = g_string_assign(obj->victpoweroff,"");
obj->victpoweron = g_string_assign(obj->victpoweron,"");
obj->chpoweruse = g_string_assign(obj->chpoweruse,"");
obj->chpoweroff = g_string_assign(obj->chpoweroff,"");
obj->chpoweron = g_string_assign(obj->chpoweron,"");
obj->description = g_string_assign(obj->description,"");
obj->short_descr = g_string_assign(obj->short_descr,"");
obj->name = g_string_assign(obj->name,"");
}
void set_rObjNest_null(){
int iNest;
for ( iNest = 0; iNest < MAX_NEST; iNest++ )
rgObjNest[iNest] = NULL;
}
OBJ_DATA *new_obj(void)
{
//static OBJ_DATA obj_zero;
OBJ_DATA *obj;
if (g_slist_length(obj_free) == 0)
{
obj = g_chunk_new (OBJ_DATA, obj_mem_chunk);
init_obj(obj);
}
else
{
obj = (OBJ_DATA *)obj_free->data;
obj_free = g_slist_remove(obj_free,obj);
mudsetting->objects_recycled++;
mudsetting->Objects_Recycled_HEAP--;
}
//*obj = obj_zero;
reset_object(obj);
VALIDATE(obj);
return obj;
}
void free_obj(OBJ_DATA *obj)
{
if (!IS_VALID(obj))
return;
INVALIDATE(obj);
obj_free = g_slist_append(obj_free,obj);
mudsetting->Objects_Recycled_HEAP++;
// Subject from objects created, and add to recycled
mudsetting->objects_created--;
}
extern GSList *extra_descr_free;
EXTRA_DESCR_DATA *new_extra_descr(void)
{
EXTRA_DESCR_DATA *ed;
if (g_slist_length(extra_descr_free) == 0)
{
ed = g_chunk_new (EXTRA_DESCR_DATA, extra_desc_mem_chunk);
}
else
{
ed = (EXTRA_DESCR_DATA *)extra_descr_free->data;
extra_descr_free = g_slist_remove(extra_descr_free,ed);
}
ed->keyword = &str_empty[0];
ed->description = &str_empty[0];
VALIDATE(ed);
return ed;
}
void free_extra_descr(EXTRA_DESCR_DATA *ed)
{
if (!IS_VALID(ed))
return;
INVALIDATE(ed);
extra_descr_free = g_slist_append(extra_descr_free,ed);
}
bool deadbeat(CHAR_DATA *ch, OBJ_DATA *obj)
{
char buf[MAX_STRING_LENGTH];
int min_out ,hour_out,i,objexpcost,objquestcost;
bool found = FALSE;
if (IS_IMMORTAL(ch))
return FALSE;
if ( !IS_SET(obj->quest, QUEST_ARTIFACT) )
return FALSE;
if ( copyover_start == TRUE )
return FALSE;
if (obj->last_seen_on == 0)
return FALSE;
sprintf(buf, "You logged out: %s",ctime(&obj->last_seen_on));
write_to_buffer(ch->desc,buf,0);
sprintf(buf, "The current time: %s",ctime(¤t_time));
send_to_char(buf,ch);
// min_out = ( (int)time(0) - obj->last_seen_on ) / ( PULSE_PER_SECOND * 12 );
// hour_out = (((int)time(0) - obj->last_seen_on ) / ( (PULSE_PER_SECOND * 12) * 60 ));
min_out = ( (long)current_time - obj->last_seen_on ) / 60;
hour_out = (( (long)current_time - obj->last_seen_on ) / ( 60 * 60 ));
if ( hour_out > 0 )
sprintf(buf,"Your artifact, %s was logged out %d minutes ( %d hours)\n\r", obj->short_descr->str, min_out, hour_out);
else
sprintf(buf,"Your artifact, %s was logged out %d minute(s)\n\r", obj->short_descr->str, min_out);
send_to_char(buf,ch);
/* find the artifact in the table to get cost */
for(i = 0; i < 20; i++)
{
if (obj->pIndexData->vnum == rent_table[i].obj_vnum)
{
found = TRUE;
break;
}
}
if (!found)
{
bug("Artifact not found in the rent table!",0);
return FALSE;
}
/* calculate cost, get hour rate */
objexpcost = (rent_table[i].exp_cost / 24) * hour_out;
objquestcost = (rent_table[i].qp_cost / 24) * hour_out;
ch->exp = ch->exp - objexpcost;
ch->pcdata->quest = ch->pcdata->quest - objquestcost;
ch->pcdata->spent[SPENT_QP] += objquestcost;
sprintf(buf,"You paid %d exp, %d Quest points to keep %s.\n\r",objexpcost,objquestcost,obj->short_descr->str);
send_to_char(buf,ch);
if ( ch->exp <= 0 )
{
send_to_char("You are a deadbeat for not having enough exp to pay for your artifact!\n\r",ch);
return TRUE;
}
if ( ch->pcdata->quest <= 0 )
{
send_to_char("You are a deadbeat for not having enough quest points to pay for your artifact!\n\r",ch);
return TRUE;
}
return FALSE;
}
/*
* Write an object and its contents.
*/
void fwrite_obj( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest )
{
EXTRA_DESCR_DATA *ed;
AFFECT_DATA *paf;
int sn;
/*
int vnum = obj->pIndexData->vnum;
*
* Slick recursion to write lists backwards,
* so loading them will load in forwards order.
*/
if ( obj->next_content != NULL )
fwrite_obj( ch, obj->next_content, fp, iNest );
/*
* Castrate storage characters.
*/
if ( (obj->chobj != NULL && (!IS_NPC(obj->chobj) &&
obj->chobj->pcdata->obj_vnum != 0)))
return;
fprintf( fp, "#OBJECT\n" );
fprintf( fp, "Nest %d\n", iNest );
fprintf( fp, "Name %s~\n", obj->name->str );
fprintf( fp, "ShortDescr %s~\n", obj->short_descr->str );
fprintf( fp, "Description %s~\n", obj->description->str );
if (obj->chpoweron != NULL && strlen(obj->chpoweron->str) > 1 && str_cmp(obj->chpoweron->str,"(null)") )
fprintf( fp, "Poweronch %s~\n", obj->chpoweron->str );
if (obj->chpoweroff != NULL && strlen(obj->chpoweroff->str) > 1 && str_cmp(obj->chpoweroff->str,"(null)"))
fprintf( fp, "Poweroffch %s~\n", obj->chpoweroff->str );
if (obj->chpoweruse != NULL && strlen(obj->chpoweruse->str) > 1 && str_cmp(obj->chpoweruse->str,"(null)"))
fprintf( fp, "Powerusech %s~\n", obj->chpoweruse->str );
if (obj->victpoweron != NULL && strlen(obj->victpoweron->str) > 1 && str_cmp(obj->victpoweron->str,"(null)"))
fprintf( fp, "Poweronvict %s~\n", obj->victpoweron->str );
if (obj->victpoweroff != NULL && strlen(obj->victpoweroff->str) > 1 && str_cmp(obj->victpoweroff->str,"(null)"))
fprintf( fp, "Poweroffvict %s~\n", obj->victpoweroff->str );
if (obj->victpoweruse != NULL && strlen(obj->victpoweruse->str) > 1 && str_cmp(obj->victpoweruse->str,"(null)"))
fprintf( fp, "Powerusevict %s~\n", obj->victpoweruse->str );
if (obj->page_content != NULL && obj->page_content->len > 1 && str_cmp(obj->page_content->str,"(null)"))
fprintf( fp, "Page %s~\n", obj->page_content->str );
if (obj->questmaker != NULL && strlen(obj->questmaker->str) > 1)
fprintf( fp, "Questmaker %s~\n", obj->questmaker->str );
if (obj->questowner != NULL && strlen(obj->questowner->str) > 1)
fprintf( fp, "Questowner %s~\n", obj->questowner->str );
if (obj->OOwner != NULL && strlen(obj->OOwner->str) > 1)
fprintf( fp, "OOwner %s~\n", obj->OOwner->str );
/*
if ( vnum < 17 || ( vnum >= 30003 && vnum <= 30037 ) )
fprintf( fp, "Vnum %d\n", obj->pIndexData->vnum );
else
fprintf( fp, "Vnum 30041\n" );
*/
fprintf( fp, "Vnum %d\n", obj->pIndexData->vnum );
fprintf( fp, "ExtraFlags %d\n", obj->extra_flags );
fprintf( fp, "WearFlags %d\n", obj->wear_flags );
fprintf( fp, "WearLoc %d\n", obj->wear_loc );
fprintf( fp, "ItemType %d\n", obj->item_type );
if (IS_SET(obj->quest, QUEST_ARTIFACT) )
//fprintf( fp, "Last_seen %d\n", (int)time(0)) );
fprintf( fp, "Last_seen %ld\n", (long)current_time );
fprintf( fp, "Weight %d\n", obj->weight );
if (obj->spectype != 0)
fprintf( fp, "Spectype %d\n", obj->spectype );
if (obj->specpower != 0)
fprintf( fp, "Specpower %d\n", obj->specpower );
fprintf( fp, "Condition %d\n", obj->condition );
fprintf( fp, "Toughness %d\n", obj->toughness );
fprintf( fp, "Resistance %d\n", obj->resistance );
if (obj->quest != 0)
fprintf( fp, "Quest %d\n", obj->quest );
if (obj->points != 0)
fprintf( fp, "Points %d\n", obj->points
);
fprintf( fp, "NSphere ");
for ( sn = 0 ; sn < MAX_SPHERE ; sn++ )
{
fprintf( fp, " %d", obj->sphere[sn]);
}
fprintf( fp, "\n");
fprintf( fp, "Plane %d\n", obj->plane );
fprintf( fp, "Level %d\n", obj->level );
fprintf( fp, "Timer %d\n", obj->timer );
fprintf( fp, "Cost %d\n", obj->cost );
fprintf( fp, "Values %d %d %d %d\n",
obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
switch ( obj->item_type )
{
case ITEM_POTION:
if ( obj->value[1] > 0 )
{
fprintf( fp, "Spell 1 '%s'\n",
skill_table[obj->value[1]].name );
}
if ( obj->value[2] > 0 )
{
fprintf( fp, "Spell 2 '%s'\n",
skill_table[obj->value[2]].name );
}
if ( obj->value[3] > 0 )
{
fprintf( fp, "Spell 3 '%s'\n",
skill_table[obj->value[3]].name );
}
break;
case ITEM_SCROLL:
if ( obj->value[1] > 0 )
{
fprintf( fp, "Spell 1 '%s'\n",
skill_table[obj->value[1]].name );
}
if ( obj->value[2] > 0 )
{
fprintf( fp, "Spell 2 '%s'\n",
skill_table[obj->value[2]].name );
}
if ( obj->value[3] > 0 )
{
fprintf( fp, "Spell 3 '%s'\n",
skill_table[obj->value[3]].name );
}
break;
case ITEM_PILL:
case ITEM_STAFF:
case ITEM_WAND:
if ( obj->value[3] > 0 )
{
fprintf( fp, "Spell 3 '%s'\n",
skill_table[obj->value[3]].name );
}
break;
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
/*
if ( paf->type < 0 || paf->type >= MAX_SKILL ) continue;
*/
fprintf( fp, "AffectData %d %d %d\n",
paf->duration, paf->modifier, paf->location );
}
/*
if ( vnum >= 17 && ( vnum < 30003 || vnum > 30037 ) )
{
for ( paf = obj->pIndexData->affected; paf != NULL; paf = paf->next )
{
**
if ( paf->type < 0 || paf->type >= MAX_SKILL ) continue;
**
fprintf( fp, "AffectData %d %d %d\n",
paf->duration, paf->modifier, paf->location );
}
}
*/
for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
{
fprintf( fp, "ExtraDescr %s~ %s~\n",
ed->keyword, ed->description );
}
/*
if ( vnum >= 17 && ( vnum < 30003 || vnum > 30037 ) )
{
for ( ed = obj->pIndexData->extra_descr; ed != NULL; ed = ed->next )
{
fprintf( fp, "ExtraDescr %s~ %s~\n",
ed->keyword, ed->description );
}
}
*/
fprintf( fp, "End\n\n" );
if ( obj->contains != NULL )
fwrite_obj( ch, obj->contains, fp, iNest + 1 );
return;
}
void fread_obj( CHAR_DATA *ch, FILE *fp )
{
//static OBJ_DATA obj_zero;
OBJ_DATA *obj;
char log[MAX_STRING_LENGTH];
char *word;
int dummy;
int iNest;
bool fMatch;
bool fNest;
bool fVnum;
obj = new_obj();
obj->spectype = 0;
obj->last_seen_on = 0;
obj->specpower = 0;
obj->condition = 100;
obj->toughness = 0;
obj->resistance = 100;
obj->quest = 0;
obj->points = 0;
obj->plane = 1;
/*
obj->sphere[0] = 0;
obj->sphere[1] = 0;
obj->sphere[2] = 0;
obj->sphere[3] = 0;
obj->sphere[4] = 0;
obj->sphere[5] = 0;
obj->sphere[6] = 0;
obj->sphere[7] = 0;
obj->sphere[8] = 0;
*/
fNest = FALSE;
fVnum = TRUE;
iNest = 0;
for ( ; ; )
{
word = feof( fp ) ? (char *)"End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
{
AFFECT_DATA *paf;
paf = new_affect();
paf->type = 0;
paf->duration = fread_number( fp );
paf->modifier = fread_number( fp );
paf->location = fread_number( fp );
paf->bitvector = 0;
paf->next = obj->affected;
obj->affected = paf;
fMatch = TRUE;
break;
}
break;
case 'C':
KEY( "Condition", obj->condition, fread_number( fp ) );
KEY( "Cost", obj->cost, fread_number( fp ) );
break;
case 'D':
h_KEY( "Description", obj->description, nonfread_string(obj->description, fp ) );
break;
case 'E':
KEY( "ExtraFlags", obj->extra_flags, fread_number( fp ) );
if ( !str_cmp( word, "ExtraDescr" ) )
{
EXTRA_DESCR_DATA *ed;
/*
if ( extra_descr_free == NULL )
{
ed = alloc_perm( sizeof(*ed) );
}
else
{
ed = extra_descr_free;
extra_descr_free = extra_descr_free->next;
}
*/
ed = new_extra_descr();
ed->keyword = fread_string( fp );
ed->description = fread_string( fp );
ed->next = obj->extra_descr;
obj->extra_descr = ed;
fMatch = TRUE;
}
if ( !str_cmp( word, "End" ) )
{
if ( !fNest || !fVnum )
{
bug( "Fread_obj: incomplete object.", 0 );
free_obj(obj);
return;
}
else
{
g_slist_append(object_list,obj);
obj->pIndexData->count++;
/*** RENT PROC HERE **/
if (!IS_IMMORTAL(ch))
{
if (deadbeat(ch,obj))
{
obj_to_char( obj, ch );
unequip_char( ch, obj );
extract_obj(obj);
strip_note(ch,obj);
return;
}
}
if ( iNest == 0 || rgObjNest[iNest] == NULL )
obj_to_char( obj, ch );
else
obj_to_obj( obj, rgObjNest[iNest-1] );
//Add to the values
mudsetting->total_objects_created++ ;
mudsetting->objects_created++;
return;
}
}
break;
case 'I':
KEY( "ItemType", obj->item_type, fread_number( fp ) );
break;
case 'L':
KEY( "Level", obj->level, fread_number( fp ) );
KEY( "Last_seen",obj->last_seen_on, fread_number( fp ) );
break;
case 'N':
h_KEY( "Name", obj->name, nonfread_string(obj->name, fp ) );
if ( !str_cmp( word, "Nest" ) )
{
iNest = fread_number( fp );
if ( iNest < 0 || iNest >= MAX_NEST )
{
bug( "Fread_obj: bad nest %d.", iNest );
}
else
{
rgObjNest[iNest] = obj;
fNest = TRUE;
}
fMatch = TRUE;
}
if ( !str_cmp( word, "NSphere" ) )
{
for ( dummy = 0 ; dummy < MAX_SPHERE; dummy++ )
{
obj->sphere[dummy] = fread_number( fp );
}
fMatch = TRUE;
break;
}
break;
case 'O':
h_KEY( "OOwner", obj->OOwner, nonfread_string(obj->OOwner, fp ) );
break;
case 'P':
KEY( "Points", obj->points, fread_number( fp ) );
KEY( "Plane", obj->plane, fread_number( fp ) );
h_KEY( "Poweronch", obj->chpoweron, nonfread_string(obj->chpoweron, fp ) );
h_KEY( "Poweroffch", obj->chpoweroff, nonfread_string(obj->chpoweroff, fp ) );
h_KEY( "Powerusech", obj->chpoweruse, nonfread_string(obj->chpoweruse, fp ) );
h_KEY( "Poweronvict", obj->victpoweron, nonfread_string(obj->victpoweron, fp ) );
h_KEY( "Poweroffvict", obj->victpoweroff, nonfread_string(obj->victpoweroff, fp ) );
h_KEY( "Powerusevict", obj->victpoweruse, nonfread_string(obj->victpoweruse, fp ) );
h_KEY( "Page", obj->page_content, nonfread_string(obj->page_content, fp ) );
break;
case 'Q':
KEY( "Quest", obj->quest, fread_number( fp ) );
KEY( "Qtimer", ch->countdown, fread_number( fp ) );
h_KEY( "Questmaker", obj->questmaker, nonfread_string(obj->questmaker, fp ) );
h_KEY( "Questowner", obj->questowner, nonfread_string(obj->questowner, fp ) );
break;
case 'R':
KEY( "Resistance", obj->resistance, fread_number( fp ) );
break;
case 'S':
h_KEY( "ShortDescr", obj->short_descr, nonfread_string(obj->short_descr, fp ) );
KEY( "Spectype", obj->spectype, fread_number( fp ) );
KEY( "Specpower", obj->specpower, fread_number( fp ) );
if ( !str_cmp( word, "Spell" ) )
{
int iValue;
int sn;
iValue = fread_number( fp );
sn = skill_lookup( fread_word( fp ) );
if ( iValue < 0 || iValue > 3 )
{
bug( "Fread_obj: bad iValue %d.", iValue );
}
else if ( sn < 0 )
{
bug( "Fread_obj: unknown skill.", 0 );
}
else
{
obj->value[iValue] = sn;
}
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Sphere" ) )
{
for ( dummy = 0 ; dummy < (MAX_SPHERE -1 ); dummy++ )
{
obj->sphere[dummy] = fread_number( fp );
}
fMatch = TRUE;
break;
}
break;
case 'T':
KEY( "Timer", obj->timer, fread_number( fp ) );
KEY( "Toughness", obj->toughness, fread_number( fp ) );
break;
case 'V':
if ( !str_cmp( word, "Values" ) )
{
obj->value[0] = fread_number( fp );
obj->value[1] = fread_number( fp );
obj->value[2] = fread_number( fp );
obj->value[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Vnum" ) )
{
int vnum;
vnum = fread_number( fp );
if ( ( obj->pIndexData = get_obj_index( vnum ) ) == NULL )
{
vnum = 30041;
if ( ( obj->pIndexData = get_obj_index( vnum ) ) == NULL )
bug( "Fread_obj: bad vnum %d.", vnum );
else
fVnum = TRUE;
}
else
fVnum = TRUE;
fMatch = TRUE;
break;
}
break;
case 'W':
KEY( "WearFlags", obj->wear_flags, fread_number( fp ) );
KEY( "WearLoc", obj->wear_loc, fread_number( fp ) );
KEY( "Weight", obj->weight, fread_number( fp ) );
break;
}
if (Player_Error == TRUE)
{
write_to_buffer(ch->desc,"Your pfilE has a problem, please note Spiral or Dominion with another char",0);
sprintf(log,"Pfile error in player %s",ch->name->str);
log_string2(log);
logchan(log_buf, NULL, NULL,WIZ_LINK,0, LEVEL_QUESTMAKER);
close_socket(ch->desc);
Player_Load = FALSE;
return;
}
if ( !fMatch )
{
bug( "Fread_obj: no match.", 0 );
fread_to_eol( fp );
}
}
//Init object
if (obj->OOwner->str[0] == '\0' && obj->questowner->str[0] != '\0')
obj->OOwner = obj->questowner;
}
/*
* Create an instance of an object.
*/
OBJ_DATA *create_object( OBJ_INDEX_DATA *pObjIndex, int level )
{
//static OBJ_DATA obj_zero;
OBJ_DATA *obj;
if ( pObjIndex == NULL )
{
bug( "Create_object: NULL pObjIndex.", 0 );
exit( 1 );
}
obj = new_obj();
obj->pIndexData = pObjIndex;
obj->in_room = NULL;
obj->level = level;
obj->wear_loc = -1;
obj->contains = NULL;
obj->affected = NULL;
obj->name = g_string_assign(obj->name,pObjIndex->name);
obj->short_descr = g_string_assign(obj->short_descr,pObjIndex->short_descr);
obj->description = g_string_assign(obj->description,pObjIndex->description);
if (pObjIndex->chpoweron != NULL)
{
obj->chpoweron = g_string_assign(obj->chpoweron,pObjIndex->chpoweron);
obj->chpoweroff = g_string_assign(obj->chpoweroff,pObjIndex->chpoweroff);
obj->chpoweruse = g_string_assign(obj->chpoweruse,pObjIndex->chpoweruse);
obj->victpoweron = g_string_assign(obj->victpoweron,pObjIndex->victpoweron);
obj->victpoweroff = g_string_assign(obj->victpoweroff,pObjIndex->victpoweroff);
obj->victpoweruse = g_string_assign(obj->victpoweruse,pObjIndex->victpoweruse);
obj->spectype = pObjIndex->spectype;
obj->specpower = pObjIndex->specpower;
}
else
{
obj->chpoweron = g_string_assign(obj->chpoweron, "(null)" );
obj->chpoweroff = g_string_assign(obj->chpoweroff, "(null)" );
obj->chpoweruse = g_string_assign(obj->chpoweruse, "(null)" );
obj->victpoweron = g_string_assign(obj->victpoweron, "(null)" );
obj->victpoweroff = g_string_assign(obj->victpoweroff, "(null)" );
obj->victpoweruse = g_string_assign(obj->victpoweruse, "(null)" );
obj->spectype = 0;
obj->specpower = 0;
}
obj->questmaker = g_string_assign(obj->questmaker, "" );
obj->questowner = g_string_assign(obj->questowner, "" );
obj->page_content = g_string_assign(obj->page_content, "" );
obj->OOwner = g_string_assign(obj->OOwner,"");
obj->owner = g_string_assign(obj->owner,"");
obj->chobj = NULL;
obj->quest = 0;
obj->points = 0;
obj->item_type = pObjIndex->item_type;
obj->extra_flags = pObjIndex->extra_flags;
obj->wear_flags = pObjIndex->wear_flags;
obj->value[0] = pObjIndex->value[0];
obj->value[1] = pObjIndex->value[1];
obj->value[2] = pObjIndex->value[2];
obj->value[3] = pObjIndex->value[3];
obj->weight = pObjIndex->weight;
obj->plane = 1;
obj->cost = number_fuzzy( 10 )
* number_fuzzy( level ) * number_fuzzy( level );
if (obj->pIndexData->vnum >= 29500 && obj->pIndexData->vnum <= 29599)
{
SET_BIT(obj->quest, QUEST_ARTIFACT);
obj->condition = 100;
obj->toughness = 100;
obj->resistance = 1;
obj->level = 60;
obj->cost = 1000000;
}
else if (obj->pIndexData->vnum >= 29600 && obj->pIndexData->vnum <= 29699)
{
SET_BIT(obj->quest, QUEST_RELIC);
obj->condition = 100;
obj->toughness = 100;
obj->resistance = 1;
}
else if (obj->pIndexData->vnum == 30042)
{
SET_BIT(obj->quest, QUEST_MASTERY);
obj->condition = 100;
obj->toughness = 100;
obj->resistance = 1;
}
else
{
obj->condition = 100;
obj->toughness = 5;
obj->resistance = 25;
}
/*
* Mess with object properties.
*/
switch ( obj->item_type )
{
default:
bug( "Read_object: vnum %d bad type.", pObjIndex->vnum );
break;
case ITEM_LIGHT:
case ITEM_TREASURE:
case ITEM_FURNITURE:
case ITEM_TRASH:
case ITEM_CONTAINER:
case ITEM_DRINK_CON:
case ITEM_KEY:
case ITEM_FOOD:
case ITEM_BOAT:
case ITEM_CORPSE_NPC:
case ITEM_CORPSE_PC:
case ITEM_FOUNTAIN:
case ITEM_PORTAL:
case ITEM_EGG:
case ITEM_VOODOO:
case ITEM_STAKE:
case ITEM_MISSILE:
case ITEM_AMMO:
case ITEM_QUEST:
case ITEM_QUESTCARD:
case ITEM_QUESTMACHINE:
case ITEM_SYMBOL:
case ITEM_BOOK:
case ITEM_PAGE:
case ITEM_TOOL:
case ITEM_FOCI:
case ITEM_COOKIE:
case ITEM_TFILET:
case ITEM_FIRE:
case ITEM_WALL:
case ITEM_SUNSHIELD:
case ITEM_PET_FOOD:
case ITEM_WWF_CONT:
break;
case ITEM_SCROLL:
obj->value[0] = number_fuzzy( obj->value[0] );
break;
case ITEM_WAND:
case ITEM_STAFF:
obj->value[0] = number_fuzzy( obj->value[0] );
obj->value[1] = number_fuzzy( obj->value[1] );
obj->value[2] = obj->value[1];
break;
case ITEM_WEAPON:
if (!IS_SET(obj->quest, QUEST_ARTIFACT)
&& !IS_SET(obj->quest, QUEST_RELIC))
{
obj->value[1] = number_range( 1, 10 );
obj->value[2] = number_range((obj->value[1]+1),(obj->value[1]*2));
}
break;
case ITEM_SLOT_MACHINE:
if (obj->value[2] > 5)
obj->value[2] = 5;
else if(obj->value[2] < 3)
obj->value[2] = 3;
break;
case ITEM_ARMOR:
if (!IS_SET(obj->quest, QUEST_ARTIFACT)
&& !IS_SET(obj->quest, QUEST_RELIC))
obj->value[0] = number_range( 5, 15 );
break;
case ITEM_POTION:
case ITEM_PILL:
obj->value[0] = number_fuzzy( number_fuzzy( obj->value[0] ) );
break;
case ITEM_MONEY:
obj->value[0] = obj->cost;
break;
}
object_list = g_slist_append(object_list,obj);
pObjIndex->count++;
//Add the total objects -- Spiral
mudsetting->total_objects_created++;
mudsetting->objects_created++;
return obj;
}
/*
* Translates mob virtual number to its obj index struct.
* Hash table lookup.
*/
OBJ_INDEX_DATA *get_obj_index( int vnum )
{
OBJ_INDEX_DATA *pObjIndex;
for ( pObjIndex = obj_index_hash[vnum % MAX_KEY_HASH];
pObjIndex != NULL;
pObjIndex = pObjIndex->next )
{
if ( pObjIndex->vnum == vnum )
return pObjIndex;
}
if ( fBootDb )
{
bug( "Get_obj_index: bad vnum %d.", vnum );
exit( 1 );
}
return NULL;
}
/*
* Move an object into an object.
*/
void obj_to_obj( OBJ_DATA *obj, OBJ_DATA *obj_to )
{
if (obj == NULL) return;
obj->next_content = obj_to->contains;
obj_to->contains = obj;
obj->in_obj = obj_to;
obj->in_room = NULL;
obj->carried_by = NULL;
for ( ; obj_to != NULL; obj_to = obj_to->in_obj )
{
if ( obj_to->carried_by != NULL && !IS_SET(obj_to->spectype,SITEM_MORPH))
obj_to->carried_by->carry_weight += get_obj_weight( obj );
}
return;
}