/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Dystopia Mud improvements copyright (C) 2000, 2001 by Brian Graversen * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ /*************************************************************************** * _/ _/ * * _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ * * _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ * *************************************************************************** * Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), * * Additional credits are in the help file CODECREDITS * * All Rights Reserved. * ***************************************************************************/ /* Online Social Editting Module, * (c) 1996,97 Erwin S. Andreasen <erwin@andreasen.org> * See the file "License.social-edit" for important licensing information */ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #define SOCIAL_FILE "../txt/socials.txt" int maxSocial; struct social_type *social_table; void load_social(FILE * fp, struct social_type *social) { social->name = fread_string(fp); social->char_no_arg = fread_string(fp); social->others_no_arg = fread_string(fp); social->char_found = fread_string(fp); social->others_found = fread_string(fp); social->vict_found = fread_string(fp); social->char_auto = fread_string(fp); social->others_auto = fread_string(fp); } void load_social_table() { FILE *fp; int i; fp = fopen(SOCIAL_FILE, "r"); if (!fp) { bug("Could not open " SOCIAL_FILE " for reading.", 0); exit(1); } fscanf(fp, "%d\n", &maxSocial); /* * IMPORTANT to use malloc so we can realloc later on */ social_table = malloc(sizeof(struct social_type) * (maxSocial + 1)); for (i = 0; i < maxSocial; i++) load_social(fp, &social_table[i]); /* * For backwards compatibility */ social_table[maxSocial].name = str_dup(""); /* empty! */ fclose(fp); } void save_social(const struct social_type *s, FILE * fp) { /* * get rid of (null) */ fprintf(fp, "%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n%s~\n\n", s->name ? s->name : "", s->char_no_arg ? s->char_no_arg : "", s->others_no_arg ? s->others_no_arg : "", s->char_found ? s->char_found : "", s->others_found ? s->others_found : "", s->vict_found ? s->vict_found : "", s->char_auto ? s->char_auto : "", s->others_auto ? s->others_auto : ""); } void save_social_table() { FILE *fp; int i; fp = fopen(SOCIAL_FILE, "w"); if (!fp) { bug("Could not open " SOCIAL_FILE " for writing.", 0); return; } for (maxSocial = 0; social_table[maxSocial].name[0]; maxSocial++) ; /* empty */ fprintf(fp, "%d\n", maxSocial); for (i = 0; i < maxSocial; i++) save_social(&social_table[i], fp); fclose(fp); } /* Find a social based on name */ int social_lookup(const char *name) { int i; for (i = 0; i < maxSocial; i++) if (!str_cmp(name, social_table[i].name)) return i; return -1; } /* * Social editting command */ void do_sedit(CHAR_DATA * ch, char *argument) { char cmd[MAX_INPUT_LENGTH], social[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int iSocial; smash_tilde(argument); argument = one_argument(argument, cmd); argument = one_argument(argument, social); if (!cmd[0]) { send_to_char("Huh? Type HELP SEDIT to see syntax.\n\r", ch); return; } if (!social[0]) { send_to_char("What social do you want to operate on?\n\r", ch); return; } iSocial = social_lookup(social); if (str_cmp(cmd, "new") && (iSocial == -1)) { send_to_char("No such social exists.\n\r", ch); return; } if (!str_cmp(cmd, "delete")) /* Remove a social */ { int i, j; struct social_type *new_table = malloc(sizeof(struct social_type) * maxSocial); if (!new_table) { send_to_char ("Memory allocation failed. Brace for impact...\n\r", ch); return; } /* * Copy all elements of old table into new table, except the deleted social */ for (i = 0, j = 0; i < maxSocial + 1; i++) if (i != iSocial) /* copy, increase only if copied */ { new_table[j] = social_table[i]; j++; } free(social_table); social_table = new_table; maxSocial--; /* Important :() */ send_to_char("That social is history now.\n\r", ch); } else if (!str_cmp(cmd, "new")) /* Create a new social */ { struct social_type *new_table; if (iSocial != -1) { send_to_char ("A social with that name already exists\n\r", ch); return; } /* * reallocate the table */ /* * Note that the table contains maxSocial socials PLUS one empty spot! */ maxSocial++; new_table = realloc(social_table, sizeof(struct social_type) * (maxSocial + 1)); if (!new_table) /* realloc failed */ { send_to_char ("Memory allocation failed. Brace for impact.\n\r", ch); return; } social_table = new_table; social_table[maxSocial - 1].name = str_dup(social); social_table[maxSocial - 1].char_no_arg = str_dup(""); social_table[maxSocial - 1].others_no_arg = str_dup(""); social_table[maxSocial - 1].char_found = str_dup(""); social_table[maxSocial - 1].others_found = str_dup(""); social_table[maxSocial - 1].vict_found = str_dup(""); social_table[maxSocial - 1].char_auto = str_dup(""); social_table[maxSocial - 1].others_auto = str_dup(""); social_table[maxSocial].name = str_dup(""); /* 'terminating' empty string */ send_to_char("New social added.\n\r", ch); } else if (!str_cmp(cmd, "show")) /* Show a certain social */ { xprintf(buf, "Social: %s\n\r" "(cnoarg) No argument given, character sees:\n\r" "%s\n\r\n\r" "(onoarg) No argument given, others see:\n\r" "%s\n\r\n\r" "(cfound) Target found, character sees:\n\r" "%s\n\r\n\r" "(ofound) Target found, others see:\n\r" "%s\n\r\n\r" "(vfound) Target found, victim sees:\n\r" "%s\n\r\n\r" "(cself) Target is character himself:\n\r" "%s\n\r\n\r" "(oself) Target is character himself, others see:\n\r" "%s\n\r", social_table[iSocial].name, social_table[iSocial].char_no_arg, social_table[iSocial].others_no_arg, social_table[iSocial].char_found, social_table[iSocial].others_found, social_table[iSocial].vict_found, social_table[iSocial].char_auto, social_table[iSocial].others_auto); send_to_char(buf, ch); return; /* return right away, do not save the table */ } else if (!str_cmp(cmd, "cnoarg")) /* Set that argument */ { free_string(social_table[iSocial].char_no_arg); social_table[iSocial].char_no_arg = str_dup(argument); if (!argument[0]) send_to_char ("Character will now see nothing when this social is used without arguments.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "onoarg")) { free_string(social_table[iSocial].others_no_arg); social_table[iSocial].others_no_arg = str_dup(argument); if (!argument[0]) send_to_char ("Others will now see nothing when this social is used without arguments.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "cfound")) { free_string(social_table[iSocial].char_found); social_table[iSocial].char_found = str_dup(argument); if (!argument[0]) send_to_char ("The character will now see nothing when a target is found.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "ofound")) { free_string(social_table[iSocial].others_found); social_table[iSocial].others_found = str_dup(argument); if (!argument[0]) send_to_char ("Others will now see nothing when a target is found.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "vfound")) { free_string(social_table[iSocial].vict_found); social_table[iSocial].vict_found = str_dup(argument); if (!argument[0]) send_to_char ("Victim will now see nothing when a target is found.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "cself")) { free_string(social_table[iSocial].char_auto); social_table[iSocial].char_auto = str_dup(argument); if (!argument[0]) send_to_char ("Character will now see nothing when targetting self.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else if (!str_cmp(cmd, "oself")) { free_string(social_table[iSocial].others_auto); social_table[iSocial].others_auto = str_dup(argument); if (!argument[0]) send_to_char ("Others will now see nothing when character targets self.\n\r", ch); else printf_to_char(ch, "New message is now:\n\r%s\n\r", argument); } else { send_to_char("Huh? Try HELP SEDIT.\n\r", ch); return; } /* * We have done something. update social table */ save_social_table(); }