00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #if defined(macintosh)
00029 #include <types.h>
00030 #include <time.h>
00031 #else
00032 #include <sys/types.h>
00033 #include <sys/time.h>
00034 #endif
00035 #include <stdio.h>
00036 #include <string.h>
00037 #include <stdlib.h>
00038 #include "merc.h"
00039 #include "recycle.h"
00040
00041
00042
00043 NOTE_DATA *note_free;
00044
00045 NOTE_DATA *new_note()
00046 {
00047 NOTE_DATA *note;
00048 if (note_free == NULL)
00049 note = alloc_perm(sizeof(*note));
00050 else
00051 {
00052 note = note_free;
00053 note_free = note_free->next;
00054 }
00055 VALIDATE(note);
00056 return note;
00057 }
00058 void free_note(NOTE_DATA *note)
00059 {
00060 if (!IS_VALID(note))
00061 return;
00062 free_string( note->text );
00063 free_string( note->subject );
00064 free_string( note->to_list );
00065 free_string( note->date );
00066 free_string( note->sender );
00067 INVALIDATE(note);
00068 note->next = note_free;
00069 note_free = note;
00070 }
00071
00072
00073
00074 BAN_DATA *ban_free;
00075
00076 BAN_DATA *new_ban (void)
00077 {
00078 static BAN_DATA ban_zero;
00079 BAN_DATA *ban;
00080
00081 if (ban_free == NULL)
00082 ban = alloc_perm (sizeof (*ban));
00083 else
00084 {
00085 ban = ban_free;
00086 ban_free = ban_free->next;
00087 }
00088
00089 *ban = ban_zero;
00090 VALIDATE (ban);
00091 ban->name = &str_empty[0];
00092 return ban;
00093 }
00094
00095 void free_ban (BAN_DATA * ban)
00096 {
00097 if (!IS_VALID (ban))
00098 return;
00099
00100 free_string (ban->name);
00101 INVALIDATE (ban);
00102
00103 ban->next = ban_free;
00104 ban_free = ban;
00105 }
00106
00107
00108 DESCRIPTOR_DATA *descriptor_free;
00109
00110 DESCRIPTOR_DATA *new_descriptor (void)
00111 {
00112 static DESCRIPTOR_DATA d_zero;
00113 DESCRIPTOR_DATA *d;
00114
00115 if (descriptor_free == NULL)
00116 d = alloc_perm (sizeof (*d));
00117 else
00118 {
00119 d = descriptor_free;
00120 descriptor_free = descriptor_free->next;
00121 }
00122
00123 *d = d_zero;
00124 VALIDATE (d);
00125
00126 d->connected = CON_GET_NAME;
00127 d->showstr_head = NULL;
00128 d->showstr_point = NULL;
00129 d->outsize = 2000;
00130 d->outbuf = alloc_mem (d->outsize);
00131
00132 return d;
00133 }
00134
00135 void free_descriptor (DESCRIPTOR_DATA * d)
00136 {
00137 if (!IS_VALID (d))
00138 return;
00139
00140 free_string (d->host);
00141 free_mem (d->outbuf, d->outsize);
00142 INVALIDATE (d);
00143 d->next = descriptor_free;
00144 descriptor_free = d;
00145 }
00146
00147
00148 GEN_DATA *gen_data_free;
00149
00150 GEN_DATA *new_gen_data (void)
00151 {
00152 static GEN_DATA gen_zero;
00153 GEN_DATA *gen;
00154
00155 if (gen_data_free == NULL)
00156 gen = alloc_perm (sizeof (*gen));
00157 else
00158 {
00159 gen = gen_data_free;
00160 gen_data_free = gen_data_free->next;
00161 }
00162 *gen = gen_zero;
00163 VALIDATE (gen);
00164 return gen;
00165 }
00166
00167 void free_gen_data (GEN_DATA * gen)
00168 {
00169 if (!IS_VALID (gen))
00170 return;
00171
00172 INVALIDATE (gen);
00173
00174 gen->next = gen_data_free;
00175 gen_data_free = gen;
00176 }
00177
00178
00179 EXTRA_DESCR_DATA *extra_descr_free;
00180
00181 EXTRA_DESCR_DATA *new_extra_descr (void)
00182 {
00183 EXTRA_DESCR_DATA *ed;
00184
00185 if (extra_descr_free == NULL)
00186 ed = alloc_perm (sizeof (*ed));
00187 else
00188 {
00189 ed = extra_descr_free;
00190 extra_descr_free = extra_descr_free->next;
00191 }
00192
00193 ed->keyword = &str_empty[0];
00194 ed->description = &str_empty[0];
00195 VALIDATE (ed);
00196 return ed;
00197 }
00198
00199 void free_extra_descr (EXTRA_DESCR_DATA * ed)
00200 {
00201 if (!IS_VALID (ed))
00202 return;
00203
00204 free_string (ed->keyword);
00205 free_string (ed->description);
00206 INVALIDATE (ed);
00207
00208 ed->next = extra_descr_free;
00209 extra_descr_free = ed;
00210 }
00211
00212
00213
00214 AFFECT_DATA *affect_free;
00215
00216 AFFECT_DATA *new_affect (void)
00217 {
00218 static AFFECT_DATA af_zero;
00219 AFFECT_DATA *af;
00220
00221 if (affect_free == NULL)
00222 af = alloc_perm (sizeof (*af));
00223 else
00224 {
00225 af = affect_free;
00226 affect_free = affect_free->next;
00227 }
00228
00229 *af = af_zero;
00230
00231
00232 VALIDATE (af);
00233 return af;
00234 }
00235
00236 void free_affect (AFFECT_DATA * af)
00237 {
00238 if (!IS_VALID (af))
00239 return;
00240
00241 INVALIDATE (af);
00242 af->next = affect_free;
00243 affect_free = af;
00244 }
00245
00246
00247 OBJ_DATA *obj_free;
00248
00249 OBJ_DATA *new_obj (void)
00250 {
00251 static OBJ_DATA obj_zero;
00252 OBJ_DATA *obj;
00253
00254 if (obj_free == NULL)
00255 obj = alloc_perm (sizeof (*obj));
00256 else
00257 {
00258 obj = obj_free;
00259 obj_free = obj_free->next;
00260 }
00261 *obj = obj_zero;
00262 VALIDATE (obj);
00263
00264 return obj;
00265 }
00266
00267 void free_obj (OBJ_DATA * obj)
00268 {
00269 AFFECT_DATA *paf, *paf_next;
00270 EXTRA_DESCR_DATA *ed, *ed_next;
00271
00272 if (!IS_VALID (obj))
00273 return;
00274
00275 for (paf = obj->affected; paf != NULL; paf = paf_next)
00276 {
00277 paf_next = paf->next;
00278 free_affect (paf);
00279 }
00280 obj->affected = NULL;
00281
00282 for (ed = obj->extra_descr; ed != NULL; ed = ed_next)
00283 {
00284 ed_next = ed->next;
00285 free_extra_descr (ed);
00286 }
00287 obj->extra_descr = NULL;
00288
00289 free_string (obj->name);
00290 free_string (obj->description);
00291 free_string (obj->short_descr);
00292 free_string (obj->owner);
00293 INVALIDATE (obj);
00294
00295 obj->next = obj_free;
00296 obj_free = obj;
00297 }
00298
00299
00300
00301 CHAR_DATA *char_free;
00302
00303 CHAR_DATA *new_char (void)
00304 {
00305 static CHAR_DATA ch_zero;
00306 CHAR_DATA *ch;
00307 int i;
00308
00309 if (char_free == NULL)
00310 ch = alloc_perm (sizeof (*ch));
00311 else
00312 {
00313 ch = char_free;
00314 char_free = char_free->next;
00315 }
00316
00317 *ch = ch_zero;
00318 VALIDATE (ch);
00319 ch->name = &str_empty[0];
00320 ch->short_descr = &str_empty[0];
00321 ch->long_descr = &str_empty[0];
00322 ch->description = &str_empty[0];
00323 ch->prompt = &str_empty[0];
00324 ch->prefix = &str_empty[0];
00325 ch->logon = current_time;
00326 ch->lines = PAGELEN;
00327 for (i = 0; i < 4; i++)
00328 ch->armor[i] = 100;
00329 ch->position = POS_STANDING;
00330 ch->hit = 20;
00331 ch->max_hit = 20;
00332 ch->mana = 100;
00333 ch->max_mana = 100;
00334 ch->move = 100;
00335 ch->max_move = 100;
00336 for (i = 0; i < MAX_STATS; i++)
00337 {
00338 ch->perm_stat[i] = 13;
00339 ch->mod_stat[i] = 0;
00340 }
00341
00342 return ch;
00343 }
00344
00345
00346 void free_char (CHAR_DATA * ch)
00347 {
00348 OBJ_DATA *obj;
00349 OBJ_DATA *obj_next;
00350 AFFECT_DATA *paf;
00351 AFFECT_DATA *paf_next;
00352
00353 if (!IS_VALID (ch))
00354 return;
00355
00356 if (IS_NPC (ch))
00357 mobile_count--;
00358
00359 for (obj = ch->carrying; obj != NULL; obj = obj_next)
00360 {
00361 obj_next = obj->next_content;
00362 extract_obj (obj);
00363 }
00364
00365 for (paf = ch->affected; paf != NULL; paf = paf_next)
00366 {
00367 paf_next = paf->next;
00368 affect_remove (ch, paf);
00369 }
00370
00371 free_string (ch->name);
00372 free_string (ch->short_descr);
00373 free_string (ch->long_descr);
00374 free_string (ch->description);
00375 free_string (ch->prompt);
00376 free_string (ch->prefix);
00377
00378 free_note (ch->pnote);
00379 free_pcdata (ch->pcdata);
00380
00381 ch->next = char_free;
00382 char_free = ch;
00383
00384 INVALIDATE (ch);
00385 return;
00386 }
00387
00388 PC_DATA *pcdata_free;
00389
00390 PC_DATA *new_pcdata (void)
00391 {
00392 int alias;
00393
00394 static PC_DATA pcdata_zero;
00395 PC_DATA *pcdata;
00396
00397 if (pcdata_free == NULL)
00398 pcdata = alloc_perm (sizeof (*pcdata));
00399 else
00400 {
00401 pcdata = pcdata_free;
00402 pcdata_free = pcdata_free->next;
00403 }
00404
00405 *pcdata = pcdata_zero;
00406
00407 for (alias = 0; alias < MAX_ALIAS; alias++)
00408 {
00409 pcdata->alias[alias] = NULL;
00410 pcdata->alias_sub[alias] = NULL;
00411 }
00412
00413 pcdata->buffer = new_buf ();
00414
00415 VALIDATE (pcdata);
00416 return pcdata;
00417 }
00418
00419
00420 void free_pcdata (PC_DATA * pcdata)
00421 {
00422 int alias;
00423
00424 if (!IS_VALID (pcdata))
00425 return;
00426
00427 free_string (pcdata->pwd);
00428 free_string (pcdata->bamfin);
00429 free_string (pcdata->bamfout);
00430 free_string (pcdata->title);
00431 free_buf (pcdata->buffer);
00432
00433 for (alias = 0; alias < MAX_ALIAS; alias++)
00434 {
00435 free_string (pcdata->alias[alias]);
00436 free_string (pcdata->alias_sub[alias]);
00437 }
00438 INVALIDATE (pcdata);
00439 pcdata->next = pcdata_free;
00440 pcdata_free = pcdata;
00441
00442 return;
00443 }
00444
00445
00446
00447
00448
00449 long last_pc_id;
00450 long last_mob_id;
00451
00452 long get_pc_id (void)
00453 {
00454 int val;
00455
00456 val = (current_time <= last_pc_id) ? last_pc_id + 1 : current_time;
00457 last_pc_id = val;
00458 return val;
00459 }
00460
00461 long get_mob_id (void)
00462 {
00463 last_mob_id++;
00464 return last_mob_id;
00465 }
00466
00467 MEM_DATA *mem_data_free;
00468
00469
00470
00471 BUFFER *buf_free;
00472
00473 MEM_DATA *new_mem_data (void)
00474 {
00475 MEM_DATA *memory;
00476
00477 if (mem_data_free == NULL)
00478 memory = alloc_mem (sizeof (*memory));
00479 else
00480 {
00481 memory = mem_data_free;
00482 mem_data_free = mem_data_free->next;
00483 }
00484
00485 memory->next = NULL;
00486 memory->id = 0;
00487 memory->reaction = 0;
00488 memory->when = 0;
00489 VALIDATE (memory);
00490
00491 return memory;
00492 }
00493
00494 void free_mem_data (MEM_DATA * memory)
00495 {
00496 if (!IS_VALID (memory))
00497 return;
00498
00499 memory->next = mem_data_free;
00500 mem_data_free = memory;
00501 INVALIDATE (memory);
00502 }
00503
00504
00505
00506
00507 const int buf_size[MAX_BUF_LIST] = {
00508 16, 32, 64, 128, 256, 1024, 2048, 4096, 8192, 16384, 32768 - 70
00509 };
00510
00511
00512
00513 int get_size (int val)
00514 {
00515 int i;
00516
00517 for (i = 0; i < MAX_BUF_LIST; i++)
00518 if (buf_size[i] >= val)
00519 {
00520 return buf_size[i];
00521 }
00522
00523 return -1;
00524 }
00525
00526 BUFFER *new_buf ()
00527 {
00528 BUFFER *buffer;
00529
00530 if (buf_free == NULL)
00531 buffer = alloc_perm (sizeof (*buffer));
00532 else
00533 {
00534 buffer = buf_free;
00535 buf_free = buf_free->next;
00536 }
00537
00538 buffer->next = NULL;
00539 buffer->state = BUFFER_SAFE;
00540 buffer->size = get_size (BASE_BUF);
00541
00542 buffer->string = alloc_mem (buffer->size);
00543 buffer->string[0] = '\0';
00544 VALIDATE (buffer);
00545
00546 return buffer;
00547 }
00548
00549 BUFFER *new_buf_size (int size)
00550 {
00551 BUFFER *buffer;
00552
00553 if (buf_free == NULL)
00554 buffer = alloc_perm (sizeof (*buffer));
00555 else
00556 {
00557 buffer = buf_free;
00558 buf_free = buf_free->next;
00559 }
00560
00561 buffer->next = NULL;
00562 buffer->state = BUFFER_SAFE;
00563 buffer->size = get_size (size);
00564 if (buffer->size == -1)
00565 {
00566 bug ("new_buf: buffer size %d too large.", size);
00567 exit (1);
00568 }
00569 buffer->string = alloc_mem (buffer->size);
00570 buffer->string[0] = '\0';
00571 VALIDATE (buffer);
00572
00573 return buffer;
00574 }
00575
00576
00577 void free_buf (BUFFER * buffer)
00578 {
00579 if (!IS_VALID (buffer))
00580 return;
00581
00582 free_mem (buffer->string, buffer->size);
00583 buffer->string = NULL;
00584 buffer->size = 0;
00585 buffer->state = BUFFER_FREED;
00586 INVALIDATE (buffer);
00587
00588 buffer->next = buf_free;
00589 buf_free = buffer;
00590 }
00591
00592
00593 bool add_buf (BUFFER * buffer, char *string)
00594 {
00595 int len;
00596 char *oldstr;
00597 int oldsize;
00598
00599 oldstr = buffer->string;
00600 oldsize = buffer->size;
00601
00602 if (buffer->state == BUFFER_OVERFLOW)
00603 return FALSE;
00604
00605 len = strlen (buffer->string) + strlen (string) + 1;
00606
00607 while (len >= buffer->size)
00608 {
00609 buffer->size = get_size (buffer->size + 1);
00610 {
00611 if (buffer->size == -1)
00612 {
00613 buffer->size = oldsize;
00614 buffer->state = BUFFER_OVERFLOW;
00615 bug ("buffer overflow past size %d", buffer->size);
00616 return FALSE;
00617 }
00618 }
00619 }
00620
00621 if (buffer->size != oldsize)
00622 {
00623 buffer->string = alloc_mem (buffer->size);
00624
00625 strcpy (buffer->string, oldstr);
00626 free_mem (oldstr, oldsize);
00627 }
00628
00629 strcat (buffer->string, string);
00630 return TRUE;
00631 }
00632
00633
00634 void clear_buf (BUFFER * buffer)
00635 {
00636 buffer->string[0] = '\0';
00637 buffer->state = BUFFER_SAFE;
00638 }
00639
00640
00641 char *buf_string (BUFFER * buffer)
00642 {
00643 return buffer->string;
00644 }
00645
00646
00647 MPROG_LIST *mprog_free;
00648
00649 MPROG_LIST *new_mprog (void)
00650 {
00651 static MPROG_LIST mp_zero;
00652 MPROG_LIST *mp;
00653
00654 if (mprog_free == NULL)
00655 mp = alloc_perm (sizeof (*mp));
00656 else
00657 {
00658 mp = mprog_free;
00659 mprog_free = mprog_free->next;
00660 }
00661
00662 *mp = mp_zero;
00663 mp->vnum = 0;
00664 mp->trig_type = 0;
00665 mp->code = str_dup ("");
00666 VALIDATE (mp);
00667 return mp;
00668 }
00669
00670 void free_mprog (MPROG_LIST * mp)
00671 {
00672 if (!IS_VALID (mp))
00673 return;
00674
00675 INVALIDATE (mp);
00676 mp->next = mprog_free;
00677 mprog_free = mp;
00678 }
00679
00680 HELP_AREA *had_free;
00681
00682 HELP_AREA *new_had (void)
00683 {
00684 HELP_AREA *had;
00685 static HELP_AREA zHad;
00686
00687 if (had_free)
00688 {
00689 had = had_free;
00690 had_free = had_free->next;
00691 }
00692 else
00693 had = alloc_perm (sizeof (*had));
00694
00695 *had = zHad;
00696
00697 return had;
00698 }
00699
00700 HELP_DATA *help_free;
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716 OCLASS_DATA *class_free;
00717 OCLASS_DATA *new_class (void)
00718 {
00719 OCLASS_DATA *pClass;
00720 if (class_free)
00721 {
00722 pClass = class_free;
00723 class_free = class_free->next;
00724 }
00725 else
00726 pClass = alloc_perm(sizeof(*pClass));
00727 return pClass;
00728 }
00729
00730
00731 void free_help (HELP_DATA * help)
00732 {
00733 free_string (help->keyword);
00734 free_string (help->text);
00735 help->next = help_free;
00736 help_free = help;
00737 }