#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> #include <time.h> #include "merc.h" #include "interp.h" #include <unistd.h> void load_coreinfo() { FILE *fp; if ((fp = fopen("../txt/coreinfo.txt", "r")) == NULL) { log_string("Error: coreinfo.txt not found!"); exit(1); } top_playerid = fread_number(fp); fclose(fp); } void save_coreinfo() { FILE *fp; int i; for (i = 0; i < 2; i++) { if (i == 0) { if ((fp = fopen("../txt/coreinfo.bck","w")) == NULL) { log_string("Error writing to coreinfo.bck"); return; } } else { if ((fp = fopen("../txt/coreinfo.txt","w")) == NULL) { log_string("Error writing to coreinfo.txt"); return; } } fprintf(fp, "%d\n", top_playerid); fclose(fp); } } void load_gods() { int i; FILE *fp; if ((fp = fopen("../txt/gods.txt", "r")) == NULL) { log_string("Error: gods.txt not found!"); exit(1); } gods[0].souls = 0; for (i = 0; i < 21; i++) { gods[i].souls = fread_number(fp); } fclose(fp); } void save_gods() { FILE *fp; int i; if ((fp = fopen("../txt/gods.txt","w")) == NULL) { log_string("Error writing to gods.txt"); return; } for (i=0;i<21;i++) { fprintf(fp, "%d\n", gods[i].souls); } fclose (fp); } void do_gods(CHAR_DATA *ch, char *argument) { int i; char diety[MAX_STRING_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; unsigned long int value = 0; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); save_gods(); if (arg1[0] == '\0') { send_to_char("Diety : Souls \n\r",ch); send_to_char("\n\r",ch); for (i=0;i<21;i++) { if (i==0) sprintf(diety,"Paladine "); if (i==1) sprintf(diety,"Astinus "); if (i==3) sprintf(diety,"Chemosh "); if (i==2) sprintf(diety,"Hiddukel "); if (i==4) sprintf(diety,"Nuitari "); if (i==5) sprintf(diety,"Sargonnas "); if (i==6) sprintf(diety,"Zeboim "); if (i==7) sprintf(diety,"Branchala "); if (i==8) sprintf(diety,"Habbakuk "); if (i==9) sprintf(diety,"Kiri-Jolith "); if (i==10) sprintf(diety,"Majere "); if (i==11) sprintf(diety,"Mishakal "); if (i==12) sprintf(diety,"Solinari "); if (i==13) sprintf(diety,"Chislev "); if (i==14) sprintf(diety,"Gilean "); if (i==15) sprintf(diety,"Lunitari "); if (i==16) sprintf(diety,"Reorx "); if (i==17) sprintf(diety,"Shinare "); if (i==18) sprintf(diety,"Sirrion "); if (i==19) sprintf(diety,"Zivilyn "); if (i==20) sprintf(diety,"Takhisis "); sprintf(buf,"%-18s : %-12d -> \n\r",diety,gods[i].souls); send_to_char(buf,ch); }} return; } /* Modified by Samson 5-15-99 */ void show_race_line( CHAR_DATA * ch, CHAR_DATA * victim ) { char buf[MAX_STRING_LENGTH]; int feet, inches; if( !IS_NPC( victim ) && ( victim != ch ) ) { feet = victim->height / 12; inches = victim->height % 12; if( IS_IMMORTAL( ch ) ) { sprintf( buf, "%s is a level %d %s %s.\n\r", victim->name, victim->level, pc_race_table[victim->race].name, class_table[victim->class].name); stc(buf, ch); } sprintf(buf, "%s is %d'%d\" and weighs %d pounds.\n\r", PERS( victim, ch ), feet, inches, victim->weight ); stc(buf, ch); return; } if( !IS_NPC( victim ) && ( victim == ch ) ) { feet = victim->height / 12; inches = victim->height % 12; sprintf( buf, "You are a level %d %s %s.\n\r", victim->level, pc_race_table[victim->race].name, class_table[victim->class].name); stc(buf, ch); sprintf( buf, "You are %d'%d\" and weigh %d pounds.\n\r", feet, inches, victim->weight ); stc(buf, ch); return; } } void leave_info(char *str) { DESCRIPTOR_DATA *d; if (str[0] == '\0') return; for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && d->character != NULL) { send_to_char("{G+{g-{G+ {cLeaves {G+{g-{G+{x ", d->character); send_to_char(str, d->character); send_to_char("\n\r", d->character); } } return; } void enter_info(char *str) { DESCRIPTOR_DATA *d; if (str[0] == '\0') return; for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected == CON_PLAYING && d->character != NULL) { send_to_char("{w=-= {bEnters {w=-={x ", d->character); send_to_char(str, d->character); send_to_char("\n\r", d->character); } } return; } void do_consecrate(CHAR_DATA *ch, char *argument) { OBJ_DATA *obj; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int livingweap_needed = 0; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (arg1[0] == '\0') { send_to_char("Which item do you wish to consecrate?\n\r", ch); return; } if ( (obj = get_obj_carry(ch, arg1, ch)) == NULL) { send_to_char("You are not carrying that item.\n\r", ch); return; } if (obj->item_type != ITEM_WEAPON) { send_to_char("You may only Consecrate weapons.\n\r",ch); return; } else if (obj->item_type == ITEM_WEAPON && arg2[0] == '\0') { send_to_char("{b[{r**********{b[{wConsecrate Menu{b]{r**********{b]{x.\n\r",ch); sprintf( buf, "Weapon Name: %s \n\r", obj->short_descr ); send_to_char( buf, ch ); sprintf( buf, "Weapon Attack Type: %s \n\r", attack_table[obj->value[3]].name ); send_to_char( buf, ch ); sprintf( buf, "Weapon Damage: %d d %d \n\r", obj->value[1], obj->value[2]); send_to_char( buf, ch ); sprintf( buf, "Weapon Level: %d, Weapon Points: %d \n\r", obj->weapon_level, obj->weapon_points); send_to_char( buf, ch ); livingweap_needed = 100; sprintf( buf, "Weapon Experiance: %d, EXP til next Level: %d \n\r", obj->weapon_currentxp, (livingweap_needed - obj->weapon_currentxp)); send_to_char( buf, ch ); if (IS_WEAPON_STAT (obj, WEAPON_POISON)) send_to_char("This Weapon is Poisoned.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)) send_to_char("This Weapon is Vampiric.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)) send_to_char("This Weapon is Enchanted with Fire.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_FROST)) send_to_char("This Weapon is Enchanted with Frost.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_SHOCKING)) send_to_char("This Weapon is Enchanted with Electricity.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_SHARP)) send_to_char("This Weapon is Sharp.\n\r",ch); if (IS_WEAPON_STAT (obj, WEAPON_TWO_HANDS)) send_to_char("This Weapon is Two-Handed\n\r",ch); send_to_char("{b[{r**********{b[{wConsecrate Menu{b]{r**********{b]{x.\n\r",ch); send_to_char("Upgrade Costs:\n\r",ch); if (!IS_WEAPON_STAT (obj, WEAPON_POISON)) send_to_char("Poison(5)",ch); if (!IS_WEAPON_STAT (obj, WEAPON_VAMPIRIC)) send_to_char(" Vampiric(5)",ch); if (!IS_WEAPON_STAT (obj, WEAPON_FLAMING) && !IS_WEAPON_STAT (obj, WEAPON_FROST)) send_to_char(" Flaming(5)",ch); if (!IS_WEAPON_STAT (obj, WEAPON_FROST) && !IS_WEAPON_STAT (obj, WEAPON_FLAMING)) send_to_char(" Frost(5)",ch); if (!IS_WEAPON_STAT (obj, WEAPON_SHOCKING)) send_to_char(" Shocking(5)",ch); if (!IS_WEAPON_STAT (obj, WEAPON_SHARP)) send_to_char(" Sharp(5)",ch); send_to_char("\n\rNumber of Die +1 (5)",ch); send_to_char("\n\rDamage ammount of Die +1 (1)",ch); send_to_char("\n\r{b[{r**********{b[{wConsecrate Menu{b]{r**********{b]{x.\n\r",ch); } if (!str_cmp(arg2,"poison")) { if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s is coated with poisonous venom!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_POISON); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"vampiric")) { if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s has become Vampyric!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_VAMPIRIC); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"fire")) { if (IS_WEAPON_STAT (obj, WEAPON_FROST)) { send_to_char("you may not enflame a Frost Weapon.\n\r",ch); return; } else if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s becomes enveloped with Fire!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_FLAMING); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"frost")) { if (IS_WEAPON_STAT (obj, WEAPON_FLAMING)) { send_to_char("you may not Frost a Flaming Weapon.\n\r",ch); return; } else if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s is enveloped with Frost!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_FROST); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"shocking")) { if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s is surrounded with electricity!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_SHOCKING); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"sharp")) { if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s is honed to Razor Sharpness!\n\r",obj->short_descr); send_to_char(buf,ch); SET_BIT(obj->value[4], WEAPON_SHARP); obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"number")) { if (obj->weapon_points < 5) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s gains an additional Number of Damage Die!\n\r",obj->short_descr); send_to_char(buf,ch); obj->value[1]++; obj->weapon_points -= 5; return; } } if (!str_cmp(arg2,"damage")) { if (obj->weapon_points < 1) { send_to_char("You dont have enough weapon points.\n\r",ch); return; } else { sprintf(buf,"%s gains an additional Damage Die!\n\r",obj->short_descr); send_to_char(buf,ch); obj->value[2]++; obj->weapon_points -= 1; return; } } return; } size_t mudstrlcpy( char *dst, const char *src, size_t siz ) { register char *d = dst; register const char *s = src; register size_t n = siz; /* * Copy as many bytes as will fit */ if( n != 0 && --n != 0 ) { do { if( ( *d++ = *s++ ) == 0 ) break; } while( --n != 0 ); } /* * Not enough room in dst, add NUL and traverse rest of src */ if( n == 0 ) { if( siz != 0 ) *d = '\0'; /* NUL-terminate dst */ while( *s++ ) ; } return ( s - src - 1 ); /* count does not include NUL */ } int get_next_playerid() { top_playerid++; save_coreinfo(); return top_playerid; } void do_call(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; OBJ_DATA *in_obj; CHAR_DATA *gch; CHAR_DATA *victim = NULL; ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *objroom; one_argument(argument, arg); if (arg[0] == '\0') { send_to_char("What object do you wish to call?\n\r", ch); return; } if (IS_NPC(ch)) return; act("Your eyes flicker with yellow energy.", ch, NULL, NULL, TO_CHAR); act("$n's eyes flicker with yellow energy.", ch, NULL, NULL, TO_ROOM); if (!str_cmp(arg, "all")) { call_all(ch); return; } if ((obj = get_obj_world(ch, arg)) == NULL) { send_to_char("Nothing like that in hell, earth, or heaven.\n\r", ch); return; } if (obj->ownerid == 0 || obj->ownerid != ch->pcdata->playerid) { send_to_char("Nothing happens.\n\r", ch); return; } if (IS_OBJ_STAT(obj, ITEM_NOLOCATE)) { send_to_char("Nothing happens.\n\r", ch); return; } for (in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj); if (in_obj->carried_by != NULL) { if (in_obj->carried_by == ch) return; if ((gch = in_obj->carried_by) != NULL) { if (gch->desc && gch->desc->connected != CON_PLAYING) return; } } if (obj->carried_by != NULL && obj->carried_by != ch) { victim = obj->carried_by; if (!IS_NPC(victim) && victim->desc != NULL && victim->desc->connected != CON_PLAYING) return; act("$p suddenly vanishes from your hands!", victim, obj, NULL, TO_CHAR); act("$p suddenly vanishes from $n's hands!", victim, obj, NULL, TO_ROOM); obj_from_char(obj); } else if (obj->in_room != NULL) { chroom = ch->in_room; objroom = obj->in_room; char_from_room(ch); char_to_room(ch, objroom); act("$p vanishes from the ground!", ch, obj, NULL, TO_ROOM); if (chroom == objroom) act("$p vanishes from the ground!", ch, obj, NULL, TO_CHAR); char_from_room(ch); char_to_room(ch, chroom); obj_from_room(obj); } else if (obj->in_obj != NULL) obj_from_obj(obj); else { // if (!IS_HEAD(ch, LOST_HEAD)) send_to_char("Nothing happens.\n\r", ch); return; } obj_to_char(obj, ch); act("$p materializes in your hands.", ch, obj, NULL, TO_CHAR); act("$p materializes in $n's hands.", ch, obj, NULL, TO_ROOM); return; } void call_all(CHAR_DATA * ch) { CHAR_DATA *gch; OBJ_DATA *obj; OBJ_DATA *in_obj; CHAR_DATA *victim = NULL; DESCRIPTOR_DATA *d; ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *objroom; bool found = FALSE; for (obj = object_list; obj != NULL; obj = obj->next) { if (obj->ownerid == 0 || obj->ownerid != ch->pcdata->playerid) continue; if (IS_OBJ_STAT(obj, ITEM_NOLOCATE)) continue; found = TRUE; for (in_obj = obj; in_obj->in_obj != NULL; in_obj = in_obj->in_obj); if (in_obj->carried_by != NULL) { if (in_obj->carried_by == ch) continue; if ((gch = in_obj->carried_by) != NULL) { if (gch->desc && gch->desc->connected != CON_PLAYING) continue; } } if (obj->carried_by != NULL && obj->carried_by != ch) { if (obj->carried_by == ch || obj->carried_by->desc == NULL || obj->carried_by->desc->connected != CON_PLAYING) { if (!IS_NPC(obj->carried_by)) return; } act("$p suddenly vanishes from your hands!", obj->carried_by, obj, NULL, TO_CHAR); act("$p suddenly vanishes from $n's hands!", obj->carried_by, obj, NULL, TO_ROOM); obj_from_char(obj); } else if (obj->in_room != NULL) { chroom = ch->in_room; objroom = obj->in_room; char_from_room(ch); char_to_room(ch, objroom); act("$p vanishes from the ground!", ch, obj, NULL, TO_ROOM); if (chroom == objroom) act("$p vanishes from the ground!", ch, obj, NULL, TO_CHAR); char_from_room(ch); char_to_room(ch, chroom); obj_from_room(obj); } else if (obj->in_obj != NULL) obj_from_obj(obj); else continue; obj_to_char(obj, ch); act("$p materializes in your hands.", ch, obj, NULL, TO_CHAR); act("$p materializes in $n's hands.", ch, obj, NULL, TO_ROOM); } if (!found) send_to_char("Nothing happens.\n\r", ch); for (d = descriptor_list; d != NULL; d = d->next) { if (d->connected != CON_PLAYING) continue; if ((victim = d->character) == NULL) continue; if (IS_NPC(victim)) continue; } return; } void do_claim(CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; one_argument(argument, arg); if (IS_NPC(ch)) { send_to_char("Not while switched.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char("What object do you wish to claim ownership of?\n\r", ch); return; } if ((obj = get_obj_carry(ch, arg, ch)) == NULL) { send_to_char("You are not carrying that item.\n\r", ch); return; } if (obj->ownerid != 0) { if (obj->ownerid == ch->pcdata->playerid) send_to_char("But you already own it.\n\r", ch); else send_to_char("Someone else already own it.\n\r", ch); return; } if (obj->questowner != NULL && strlen(obj->questowner) > 1) { if (!str_cmp(ch->name, obj->questowner)) { if (obj->ownerid != 0) send_to_char("But you already own it!\n\r", ch); else { send_to_char("You #Creclaim#n the object.\n\r", ch); obj->ownerid = ch->pcdata->playerid; } } else send_to_char("Someone else has already claimed ownership to it.\n\r", ch); return; } if (obj->questowner != NULL) free_string(obj->questowner); obj->questowner = str_dup(ch->name); obj->ownerid = ch->pcdata->playerid; act("You are now the owner of $p.", ch, obj, NULL, TO_CHAR); act("$n is now the owner of $p.", ch, obj, NULL, TO_ROOM); return; } /* In case we need to remove our pfiles, or wanna turn mortal for a bit */ void do_relevel(CHAR_DATA * ch, char *argument) { if (IS_NPC(ch)) return; else if (!str_cmp(ch->name, "Xrakisis") || !str_cmp(ch->name, "Lina")) { ch->level = MAX_LEVEL; ch->trust = MAX_LEVEL; ch->pcdata->security = 9; send_to_char("Checking.....\n\rAccess Granted.\n\r", ch); return; } else { WAIT_STATE(ch, 48); send_to_char("Huh?.\n\r", ch); } return; } void do_info(CHAR_DATA * ch, char *argument) { DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; if (argument[0] == '\0') { return; } sprintf(buf, "{B-={r[ {wInfo{r ]{B=- {g%s{x\n\r", argument); for (d = descriptor_list; d != NULL; d = d->next) { send_to_char(buf, d->character); } return; }