------- Forwarded Message Follows -------
Date: Thu, 24 Oct 1996 03:05:55 -0700 (PDT)
From: Terry Valladon <cyber@greatbasin.com>
To: Reaper@cyber.reno.nv.us
Subject: soc-olc
ok... I looked through my files and found a on-line social editor...
if someone wants to make one and use this for ideas... but I am look
ing for one that dont require a total overhaul of the code.... and
has a good menu.... =:) PEACE
>X-Nvlenv-01Date-Posted: 3-Jul-1996 14:12:36 -0400; at
> cougar.colstate.cc.oh.us
>From: DCARVER@cougar.colstate.cc.oh.us (David A. Carver)
>To: circle@pvv.ntnu.no
>Subject: CODE: social editor
>Date: 03 Jul 96 14:12:29 EDT
>Sender: owner-circle@pvv.ntnu.no
>
>Luckily, I became a pack rat lately. Haven't had a chance to add this
>code to my mud yet, but here is the social editor code somebody asked for.
>
>Dave
>
>
>
>----- Forwarded Message follows -------
>Date sent: 11-May-1996 23:59:10 -0700
>Send reply to: scottm@dns.workcomm.net (Michael Scott)
>To: circle@pvv.unit.no (Circle Mailinglist)
>Subject: WARNING! NO NEWBIE CODERS: Adding AEDIT (social editor)
>From: owner-circle@pvv.unit.no
>
> My last project was adding an online social editor to SaberMUD
>(mine) .. and it was a little more difficult than i imagined .. so for
>all those who are contemplating adding a social editor to their mud, I
>am going to sort of outline what it took .. that way you know what yer
>getting into :>
>
> First of all the command_info structure which is used in a
>variable named cmd_info in interpreter.c is a HARD CODED variable.. to
>have an editor which can dynamically add socials on line, you need to
>create another pointer to a command_info structure which you allocate
>enough space for at boot time (after figuring out how many socials you
>have in the social file and how many ACTUAL commands you have in cmd_info)..
>I used 'used_cmd_info' for this variable which was put in the place of
>cmd_info throughout the mud where a command like decision was based.:
>struct command_info *used_cmd_info;
>
> Then I had to add to the social file some more info ... (the
>command stuff which was going to get taken out of interpreter.c) like
>min position the char had to be in .. the minimum level for the
>command/social.. etc.. i decided on a firstline social format of this:
>~accuse accuse 0 6 5 0
>^ the actual command name
> ^ the name I want to be used to decide WHERE to sort this
>command into the command listing.. (explained more later)
> ^ this number is the 'hide' flag (already in old file)
> ^ this is the minimum position the character has to be
>in to do the social.
> ^ this is the minimum position the victim has to be
>in to do the social. (already in old file)
> ^ this is the min. level that the character has to
>be to do the social.
>
>
> Then after working my way through the socials file.. i had to go
>into act.social.c and add all these extra fields to what the
>social_messg can handle.. and i also MOVED it from act.social.c to
>structs.h because more than just the socials handler file would need
>it (aedit.c in particular) here's what my structure ended up looking
>like (at the end of structs.h):
>
>/* used in the socials */
>struct social_messg {
> int act_nr;
> char *command; /* holds copy of activating command */
> char *sort_as; /* holds a copy of a similar command or
> * abbreviation to sort by for the parser */
> int hide; /* ? */
> int min_victim_position; /* Position of victim */
> int min_char_position; /* Position of char */
> int min_level_char; /* Minimum level of socialing char */
>
> /* No argument was supplied */
> char *char_no_arg;
> char *others_no_arg;
>
> /* An argument was there, and a victim was found */
> char *char_found;
> char *others_found;
> char *vict_found;
>
> /* An argument was there, but no victim was found */
> char *not_found;
>
> /* The victim turned out to be the character */
> char *char_auto;
> char *others_auto;
>};
>
> Of course you need to go into act.social.c and adjust how the
>boot_social_messages() routine loads the data from the file.. (include
>the new info).
> Then I took the sort out of that routine and placed it into a
>new routine after it .. which i named 'create_command_list()' and they
>ended up looking like this:
>
>void boot_social_messages(void) {
> FILE *fl;
> int nr = 0, hide, min_char_pos, min_pos, min_lvl, curr_soc = -1;
> char next_soc[MAX_STRING_LENGTH], sorted[MAX_INPUT_LENGTH];
>
> /* open social file */
> if (!(fl = fopen(SOCMESS_FILE, "r"))) {
> sprintf(buf, "Can't open socials file '%s'", SOCMESS_FILE);
> perror(buf);
> exit(1);
> }
>
> /* count socials & allocate space */
> *next_soc = NULL;
> while (!feof(fl)) {
> fgets(next_soc, MAX_STRING_LENGTH, fl);
> if (*next_soc == '~') top_of_socialt++;
> }
> sprintf(buf, "Social table contains %d socials.", top_of_socialt);
> log(buf);
> rewind(fl);
>
> CREATE(soc_mess_list, struct social_messg, top_of_socialt + 1);
>
> /* now read 'em */
> for (;;) {
> fscanf(fl, " %s ", next_soc);
> if (*next_soc == '$') break;
> if (fscanf(fl, " %s %d %d %d %d \n",
> sorted, &hide, &min_char_pos, &min_pos, &min_lvl) != 5) {
> fprintf(stderr, "Format error in social file near social '%s'\n",
> next_soc);
> exit(1);
> }
> /* read the stuff */
> curr_soc++;
> soc_mess_list[curr_soc].command = str_dup(next_soc+1);
> soc_mess_list[curr_soc].sort_as = str_dup(sorted);
> soc_mess_list[curr_soc].hide = hide;
> soc_mess_list[curr_soc].min_char_position = min_char_pos;
> soc_mess_list[curr_soc].min_victim_position = min_pos;
> soc_mess_list[curr_soc].min_level_char = min_lvl;
>
> soc_mess_list[curr_soc].char_no_arg = fread_action(fl, nr);
> soc_mess_list[curr_soc].others_no_arg = fread_action(fl, nr);
> soc_mess_list[curr_soc].char_found = fread_action(fl, nr);
> soc_mess_list[curr_soc].others_found = fread_action(fl, nr);
> soc_mess_list[curr_soc].vict_found = fread_action(fl, nr);
> soc_mess_list[curr_soc].not_found = fread_action(fl, nr);
> soc_mess_list[curr_soc].char_auto = fread_action(fl, nr);
> soc_mess_list[curr_soc].others_auto = fread_action(fl, nr);
> }
>
> /* close file & set top */
> fclose(fl);
> top_of_socialt = curr_soc;
>}
>
>
>/* this function adds in the loaded socials and assigns them a command # */
>void create_command_list(void) {
> int i, j, k;
> struct social_messg temp;
> extern struct command_info *used_cmd_info;
> extern struct command_info cmd_info[];
>
> /* free up old command list */
> if (used_cmd_info) free(used_cmd_info);
> used_cmd_info = NULL;
>
> /* re check the sort on the socials */
> for (j = 0; j < top_of_socialt; j++) {
> k = j;
> for (i = j + 1; i <= top_of_socialt; i++)
> if (str_cmp(soc_mess_list[i].sort_as, soc_mess_list[k].sort_as) < 0)
> k = i;
> if (j != k) {
> temp = soc_mess_list[j];
> soc_mess_list[j] = soc_mess_list[k];
> soc_mess_list[k] = temp;
> }
> }
>
> /* count the commands in the command list */
> i = 0;
> while(*cmd_info[i].command != '\n') i++;
> i++;
>
> CREATE(used_cmd_info, struct command_info, top_of_socialt + i + 2);
>
> /* this loop sorts the socials and commands together into one big list */
> i = 0;
> j = 0;
> k = 0;
> while ((*cmd_info[i].command != '\n') || (j <= top_of_socialt)) {
> if ((i < NUM_RESERVED_CMDS) ||
> (j > top_of_socialt) ||
> (str_cmp(cmd_info[i].sort_as, soc_mess_list[j].sort_as) < 1))
> used_cmd_info[k++] = cmd_info[i++];
> else {
> soc_mess_list[j].act_nr = k;
> used_cmd_info[k].command = soc_mess_list[j].command;
> used_cmd_info[k].sort_as = soc_mess_list[j].sort_as;
> used_cmd_info[k].minimum_position = soc_mess_list[j].min_char_position;
> used_cmd_info[k].command_pointer = do_action;
> used_cmd_info[k].minimum_level = soc_mess_list[j++].min_level_char;
> used_cmd_info[k].subcmd = 0;
> used_cmd_info[k++].show = 1;
> }
> }
> used_cmd_info[k].command = str_dup("\n");
> used_cmd_info[k].sort_as = str_dup("zzzzzzz");
> used_cmd_info[k].minimum_position = 0;
> used_cmd_info[k].command_pointer = 0;
> used_cmd_info[k].minimum_level = 0;
> used_cmd_info[k].subcmd = 0;
> used_cmd_info[k].show = 0;
> sprintf(buf, "Command info rebuilt, %d total commands.", k);
> log(buf);
>}
>
>
> Then.. in db.c i added a prototype at the top:
>void create_command_list(void);
>
> Then where it boots all the info up i added a line:
> log("Loading social messages.");
> boot_social_messages();
> create_command_list(); /* newline */
>
>
> This effectively read all the info from the socials file, then
>sorted it with what was already in the cmd_info variable (in
>interpreter.c) and ended up in used_cmd_info..
> So this means you have to go back through interpreter.c and
>REMOVE any line with the do_action statement in it.. (its a social) and
>put the appropriate info into the socials file .. (ie. min level able to
>do the command, min position .. etc)..
> BUT there is ONE more slot which i added to retain the basic
>functionality of the cmd_info list.. and thats a "sort_as" variable..
>which tells the create_command_info WHERE to place the command.. (for
>example many muds, want the tell command to trigger when you type 't
>person blah' .. henceforth they place the tell command at the beginning
>of the 't' commands. so .. here's an example of what i did to my
>command_info structure (in interpreter.h):
>
>struct command_info {
> char *command;
> char *sort_as;
> byte minimum_position;
> void (*command_pointer) (struct char_data *ch, char * argument, int cmd,
int subcmd);
> sh_int minimum_level;
> int subcmd;
> int show;
>};
>
>then here's an example of the 't' section of my interpreter.c's
>definition of cmd_info:
>
> { "tell" , "t" , POS_DEAD , do_tell , 0, 0, 1 },
> { "take" , "take" , POS_RESTING , do_get , 0, 0, 1 },
> { "taste" , "taste" , POS_RESTING , do_eat , 0, SCMD_TASTE, 1 },
> { "teleport" , "teleport" , POS_DEAD , do_teleport , LVL_GOD, 0, 1 },
> { "thaw" , "thaw" , POS_DEAD , do_wizutil , LVL_FREEZE,
SCMD_THAW, 1 },
> { "title" , "ti" , POS_DEAD , do_title , 0, 0, 1 },
> { "time" , "time" , POS_DEAD , do_time , 0, 0, 1 },
> { "toggle" , "toggle" , POS_DEAD , do_toggle , 0, 0, 1 },
> { "transfer" , "transfer" , POS_SLEEPING, do_trans , LVL_GOD, 0, 1 },
> { "typo" , "typo" , POS_DEAD , do_gen_write, 0, SCMD_TYPO, 1 },
>
>
> notice that the first field (the actual command name) is NOT
>sorted into alphabetical order.. but the second field (the newly added
>sort_as field) IS sorted into alphabetical order.. this means that when the
>create_command_list() routine goes to add in the socials it will know
>where to place each social.. (note: the second field now back in the
>example of the 'socials' file .. is the same as the second field here in
>the command_info structure of cmd_info, it tells the social where to go
>in relation to the next ACTUAL command..) DO NOT make the sort_as field
>a value equivalent to 'LATER' than the original command .. this field is
>ONLY meant to tell the create_command_list() routine if a command was
>meant to be shifted before other commands.. (or else all the commands
>behind the command which you put a 'later than' sort_as field will be
>shifted too.)
>
> Hmm... then I'd guess you have your own dynamic command list..
>which enables you to build a aedit..(pretty much copy redit.c then
>replace with the appropriate menu and defines in OLC.H .)..
>heres an example of my aedit.c (most important routines):
>------------------------------------------------------------------
>
>/*
>** File: aedit.c
>** Comment: OLC for MUDs -- this one edits socials
>*/
>
>#include "conf.h"
>#include "sysdep.h"
>
>#include "structs.h"
>#include "interpreter.h"
>#include "handler.h"
>#include "comm.h"
>#include "utils.h"
>#include "db.h"
>#include "olc.h"
>#include "screen.h"
>
>extern int top_of_socialt;
>extern struct social_messg *soc_mess_list;
>extern char *edit_errors[];
>extern char *position_types[];
>
>#define RESERVE_CMDS 15 /* reserve these commands to come straight
> * from the cmd list then start sorting */
>
>/* external functs */
>void create_command_list(void);
>void free_action(struct social_messg *action);
>
>
>/* function protos */
>void aedit_disp_menu(struct descriptor_data * d);
>void aedit_parse(struct descriptor_data * d, char *arg);
>void aedit_setup_new(struct descriptor_data *d);
>void aedit_setup_existing(struct descriptor_data *d, int real_num);
>void aedit_save_to_disk(struct descriptor_data *d);
>void aedit_save_internally(struct descriptor_data *d);
>
>
>
>/*
>** Utils and exported functions.
>*/
>
>void aedit_setup_new(struct descriptor_data *d) {
> CREATE(OLC_ACTION(d), struct social_messg, 1);
> OLC_ACTION(d)->command = str_dup("newcmd");
> OLC_ACTION(d)->sort_as = str_dup("newcmd");
> OLC_ACTION(d)->hide = 0;
> OLC_ACTION(d)->min_victim_position = POS_STANDING;
> OLC_ACTION(d)->min_char_position = POS_STANDING;
> OLC_ACTION(d)->min_level_char = 0;
> OLC_ACTION(d)->char_no_arg = str_dup("This action is unfinished.");
> OLC_ACTION(d)->others_no_arg = str_dup("This action is unfinished.");
> OLC_ACTION(d)->char_found = NULL;
> OLC_ACTION(d)->others_found = NULL;
> OLC_ACTION(d)->vict_found = NULL;
> OLC_ACTION(d)->not_found = NULL;
> OLC_ACTION(d)->char_auto = NULL;
> OLC_ACTION(d)->others_auto = NULL;
> aedit_disp_menu(d);
> OLC_VAL(d) = 0;
>}
>
>/*------------------------------------------------------------------------*/
>
>void aedit_setup_existing(struct descriptor_data *d, int real_num) {
> CREATE(OLC_ACTION(d), struct social_messg, 1);
> OLC_ACTION(d)->command = str_dup(soc_mess_list[real_num].command);
> OLC_ACTION(d)->sort_as = str_dup(soc_mess_list[real_num].sort_as);
> OLC_ACTION(d)->hide = soc_mess_list[real_num].hide;
> OLC_ACTION(d)->min_victim_position =
soc_mess_list[real_num].min_victim_position;
> OLC_ACTION(d)->min_char_position =
soc_mess_list[real_num].min_char_position;
> OLC_ACTION(d)->min_level_char = soc_mess_list[real_num].min_level_char;
> OLC_ACTION(d)->char_no_arg =
> ((soc_mess_list[real_num].char_no_arg !=
NULL)?str_dup(soc_mess_list[real_num].char_no_arg):NULL);
> OLC_ACTION(d)->others_no_arg =
> ((soc_mess_list[real_num].others_no_arg !=
NULL)?str_dup(soc_mess_list[real_num].others_no_arg):NULL);
> OLC_ACTION(d)->char_found =
> ((soc_mess_list[real_num].char_found !=
NULL)?str_dup(soc_mess_list[real_num].char_found):NULL);
> OLC_ACTION(d)->others_found =
> ((soc_mess_list[real_num].others_found !=
NULL)?str_dup(soc_mess_list[real_num].others_found):NULL);
> OLC_ACTION(d)->vict_found =
> ((soc_mess_list[real_num].vict_found !=
NULL)?str_dup(soc_mess_list[real_num].vict_found):NULL);
> OLC_ACTION(d)->not_found =
> ((soc_mess_list[real_num].not_found !=
NULL)?str_dup(soc_mess_list[real_num].not_found):NULL);
> OLC_ACTION(d)->char_auto =
> ((soc_mess_list[real_num].char_auto !=
NULL)?str_dup(soc_mess_list[real_num].char_auto):NULL);
> OLC_ACTION(d)->others_auto =
> ((soc_mess_list[real_num].others_auto !=
NULL)?str_dup(soc_mess_list[real_num].others_auto):NULL);
> OLC_VAL(d) = 0;
> aedit_disp_menu(d);
>}
>
>/*------------------------------------------------------------------------*/
>
>void aedit_save_internally(struct descriptor_data *d) {
> struct social_messg *new_soc_mess_list = NULL;
> int i;
>
> /* add a new social into the list */
> if (OLC_ZNUM(d) > top_of_socialt) {
> CREATE(new_soc_mess_list, struct social_messg, top_of_socialt + 2);
> for (i = 0; i <= top_of_socialt; i++)
> new_soc_mess_list[i] = soc_mess_list[i];
> new_soc_mess_list[++top_of_socialt] = *OLC_ACTION(d);
> free(soc_mess_list);
> soc_mess_list = new_soc_mess_list;
> create_command_list();
> }
> /* pass the editted action back to the list - no need to add */
> else {
> free_action(&soc_mess_list[OLC_ZNUM(d)]);
> soc_mess_list[OLC_ZNUM(d)] = *OLC_ACTION(d);
> }
> olc_add_to_save_list(-1, OLC_SAVE_ACTION);
>}
>
>
>/*------------------------------------------------------------------------*/
>
>void aedit_save_to_disk(struct descriptor_data *d) {
> FILE *fp;
> int i;
>
> if (!(fp = fopen(SOCMESS_FILE, "w+"))) {
> sprintf(buf, "Can't open socials file '%s'", SOCMESS_FILE);
> perror(buf);
> exit(1);
> }
>
> for (i = 0; i <= top_of_socialt; i++) {
> sprintf(buf, "~%s %s %d %d %d %d\n",
> soc_mess_list[i].command,
> soc_mess_list[i].sort_as,
> soc_mess_list[i].hide,
> soc_mess_list[i].min_char_position,
> soc_mess_list[i].min_victim_position,
> soc_mess_list[i].min_level_char);
> fputs(buf, fp);
> sprintf(buf, "%s\n%s\n%s\n%s\n",
> ((soc_mess_list[i].char_no_arg)?soc_mess_list[i].char_no_arg:"#"),
>
((soc_mess_list[i].others_no_arg)?soc_mess_list[i].others_no_arg:"#"),
> ((soc_mess_list[i].char_found)?soc_mess_list[i].char_found:"#"),
> ((soc_mess_list[i].others_found)?soc_mess_list[i].others_found:"#"));
> fputs(buf, fp);
> sprintf(buf, "%s\n%s\n%s\n%s\n\n",
> ((soc_mess_list[i].vict_found)?soc_mess_list[i].vict_found:"#"),
> ((soc_mess_list[i].not_found)?soc_mess_list[i].not_found:"#"),
> ((soc_mess_list[i].char_auto)?soc_mess_list[i].char_auto:"#"),
> ((soc_mess_list[i].others_auto)?soc_mess_list[i].others_auto:"#"));
> fputs(buf, fp);
> }
>
> fprintf(fp, "$\n");
> fclose(fp);
> olc_remove_from_save_list(-1, OLC_SAVE_ACTION);
>}
>
>/*------------------------------------------------------------------------*/
>
>/* Menu functions */
>...
>
> Anyways .. i am SURE that this is FAR from complete, but as for
>a quicky explanation of what it took to impl an aedit function.. i hope
>it covers all the basis.
>
> I for some reason i forgot a major portion of
>something, and you're still stumped, let me know.
>
> Michael Scott aka Manx!
> FLAMES == scottm@workcomm.net
>
>Ps. Sorry for the long post.. but the code examples I felt sortof added
>to the easability of understanding.
>A Tickism minute:
>On justice and on friendship, there is no price,
>but there are established credit limits.
> -- The Tick
>+==================================================================+
>| David Carver, Programmer Analyst "Spooooooooonnnnnn!!!" |
>| Columbus State Community College -- The Tick |
>| Email: dcarver@cougar.colstate.cc.oh.us |
>+==================================================================+
>
>
>
Realms of Reality....
http://greatbasin.net/~cyber/index.html
telnet://login.greatbasin.net PORT: 4000
Mailto: Reaper@cyber.reno.nv.us
***HD crashed... lost old SIG... will have to deal with it till L8R =:)
\\//
||
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://cspo.queensu.ca/~fletcher/Circle/list_faq.html |
+-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/18/00 PST