> I would be very appreciative to see how you done this one as i'm working
> on something somewhat like this, only storing preferences in files much
> like player object files. (side note, if you do it right, no pfile wipe
> is needed :P) Anyways, i'm sorta stuck on the idea atm and some new info
> would be very handy.
Ok...I think I follow what you are doing.
Yeah, I agree it could be done without a pwipe but seeing as my mud isn't
even up yet, I didn't really care whether or not it modified the pfile.
Heck, I'd never even thought of posting code till I decided to see what
others thought about it. Also, if I ever do make it a patch, most patches
I think are used by newbies starting their own muds so a pfile wipe wouldn't
make any difference. But that's beside the point. I'll try to see if I
can remember how I have it written. (It's on my home PC. I'm at school.)
I'm still working on this currently so its not complete yet...
In structs.h
>Replaced #define PRF_COLOR_1 (1 << 10)
> and #define PRF_COLOR_2 (1 << 11) // I think they are 10 and 11
> with #define PRF_USES_COLOR (1 << 10)
> and #define PRF_UNUSED (1 << 11) // May need it later anyway
>Macros defining the slots in the array each field is located
>
> #define COL_SAY 0 // the color of says is held in colorprefs[0]
> #define COL_TELL 1 // the color of tells is held in colorprefs[1] etc.
>Macros giving each color a number so that it is possible to do something like
>colorprefs[COL_SAY]=COL_RED;
>
> #define COL_BLK 0
> #define COL_RED 1 // etc.
>In the player struct I have an array of ints holding the users preferred colors
>
> int colorprefs[30];
>
>(30 allows more fields to be added later on if wanted without another pwipe.
> Currently only 20 or so fields are defined.)
Currently working on (when I have the time) a function that I have placed right
now in color.c. I might move it somewhere else later if a find a more suitable
place but I figgered it was dealing with colors so I might as well put it in
the color.c file.
In color.c
> A function that takes an integer value and returns its color code
>
> char getcolor(int color)
> {
> switch (color) {
> case COL_BLK:
> return (code of color black)
> case COL_RED:
> return (code of color red)
> .
> .
> .
> default:
> return (default/normal color);
> }
> }
> Could also just put all codes in a colorlist just as:
> static char *colorlist[]= { . . . };
> then just return colorlist[color];
In act.informative.c
> changed
> static char *ctypes[]={ "off", "normal", "sparse", "complete", "\n"};
> to
> static char *coptions[]={ "off", "full", "\n"};
> Can't use "on" cuz do_color calls one_argument which filters out all fill
> words of which "on" is one.
> added
> static char *cfields[]= { "say", "tell", (all allowable fields), "\n"};
> added
> static char *ctypes[]={ "black", "red", (all allowable types), "\n"};
> changed one_argument to two_arguements (doesn't affect the above)
> This allows user to enter "color off" or "color full"
> as well as "color say red" or "color tell cyan" etc
> searches the coptions list to see if arg1 is in the list.
> if so and arg1="off" then REMOVE_BIT(PRF_FLAGS(ch), PRF_USES_COLOR);
> if arg1="full" then SET_BIT(PRF_FLAGS(ch), PRF_USES_COLOR);
> and then return;
> if arg1 not in coptions, then it searches the cfields list and gets the
> position in the list it was found at if found. If not return an error.
> if arg1 found, search ctypes list for arg2 and get position in the list
> it was found at if found. If not send_to_char an error and return.
> if both args valid then ch->colorprefs[fieldslot]=colorslot
And finally in utils.h
> Macros such as:
> #define GET_SAY(ch) (PRF_FLAGGED(ch, PRF_USES_COLOR) ? \
> ch->colorprefs[COL_SAY] : COL_NULL)
> that returns the users preferred color for a given field if they use color
> otherwise return the nul (base) color to prevent non-ansi terminals from
> flipping.
Then anywhere in the program where you have CC_RED(ch, C_ON) or something
similar you just replace with "getcolor(C_SAY)"
e.g.
What used to be (in perform_tell)
send_to_char(CCRED(vict, C_ON), vict);
Is now changed to
send_to_char(getcolor(C_TELL(vict)), vict);
So I think that's about the extent of it. Like I said this is from what I
can remember so I may have missed something or messed something up a bit.
Hope that helps a little
Ali Baba
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST