00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 static coolmenu *retrieve_matching_letter(coolmenu * c, char l)
00016 {
00017 l = tolower(l);
00018 for (; c; c = c->next)
00019 if (c->letter == l)
00020 return c;
00021 return NULL;
00022 }
00023
00024 #if 0
00025 static coolmenu *retrieve_matching_id(coolmenu * c, int i)
00026 {
00027 for (; c; c = c->next)
00028 if (c->id == i)
00029 return c;
00030 return NULL;
00031 }
00032 #endif
00033 #ifdef DASMAGIC4
00034 #define MAYBESHOW ShowCoolMenu(player, c)
00035 #else
00036 #define MAYBESHOW
00037 #endif
00038
00039 static void update_entry(dbref player, coolmenu * c, char l, int val)
00040 {
00041 int o;
00042 coolmenu *d = retrieve_matching_letter(c, l);
00043
00044 DOCHECK(!d, "Invalid letter!");
00045 DOCHECK(c->flags & CM_NUMBER, "Invalid type of field!");
00046 o = d->value;
00047 d->value += val;
00048 if (d->value < 0) {
00049 val = 0 - o;
00050 d->value = 0;
00051 }
00052 if (d->value > d->maxvalue) {
00053 val = d->maxvalue - o;
00054 d->value = d->maxvalue;
00055 }
00056 DOCHECK(!val,
00057 "Uh.. You think about changing something and then don't.");
00058 if (val > 0)
00059 notify_printf(player, "%s increased by %d to %d!", d->text, val,
00060 d->value);
00061 else
00062 notify_printf(player, "%s decreased by %d to %d!", d->text,
00063 0 - val, d->value);
00064 DASMAGIC3;
00065 MAYBESHOW;
00066 }
00067
00068 static void update_entry_toggle(dbref player, coolmenu * c, char l)
00069 {
00070 coolmenu *d = retrieve_matching_letter(c, l);
00071
00072 DOCHECK(!d, "Invalid letter!");
00073 DOCHECK(!(d->flags & CM_TOGGLE), "Invalid type of field!");
00074 #ifndef REAL_SNEAKY_SET
00075 if (d->value)
00076 notify_printf(player, "%s set off!", d->text);
00077 else
00078 notify_printf(player, "%s set on!", d->text);
00079 #endif
00080 d->value = !d->value;
00081 DASMAGIC3;
00082 MAYBESHOW;
00083 }
00084
00085 static void update_entry_set(dbref player, coolmenu * c, char l,
00086 char *buffer)
00087 {
00088 coolmenu *d = retrieve_matching_letter(c, l);
00089 int i;
00090
00091 DOCHECK(!d, "Invalid letter!");
00092 DOCHECK(!(d->flags & (CM_STRING | CM_NUMBER)),
00093 "Invalid type of field!");
00094 if (d->flags & CM_STRING) {
00095 if (d->text)
00096 free((void *) d->text);
00097 d->text = strdup(buffer);
00098 } else {
00099 i = atoi(buffer);
00100 if (i > d->maxvalue)
00101 i = d->maxvalue;
00102 DOCHECK(i < 0,
00103 "You consider a negative value, and then forget about it.");
00104 notify_printf(player, "%s set to %d!", d->text, i);
00105 d->value = i;
00106 }
00107 DASMAGIC3;
00108 MAYBESHOW;
00109 }
00110
00111
00112
00113 #define CMD(a) void a (dbref player, void *data, char *buffer)
00114
00115
00116 #define COMMAND_ADD(fname,letter,mod) \
00117 CMD(fname) \
00118 { DASMAGIC; DOCHECK(!c, "Huh?"); if (buffer && (strlen(buffer) > 1 || (buffer[0] && buffer[0] != ' '))) \
00119 { if (atoi(buffer) > 0) \
00120 update_entry(player, DASMAGIC2, letter, mod*atoi(buffer)); \
00121 else \
00122 notify(player, "Invalid argument!"); \
00123 } else update_entry(player, DASMAGIC2, letter, mod*1); }
00124
00125 #define COMMAND_TOGGLE(fname,letter) \
00126 CMD(fname) \
00127 { DASMAGIC; DOCHECK(!c, "Huh?"); if (buffer && (strlen(buffer) > 1 || (buffer[0] && buffer[0] != ' '))) notify(player, "Invalid argument!"); \
00128 else update_entry_toggle(player, DASMAGIC2, letter); }
00129
00130 #define COMMAND_SET(fname,letter) \
00131 CMD(fname) \
00132 { DASMAGIC; DOCHECK(!c, "Huh?"); if (!(buffer && (strlen(buffer) > 1 || (buffer[0] && buffer[0] != ' ')))) notify(player, "Lack argument(s)!"); \
00133 else update_entry_set(player, DASMAGIC2, letter, buffer); }
00134
00135 #define COMMANDS(bname,letter) \
00136 COMMAND_ADD(bname ## _add,letter,1); \
00137 COMMAND_ADD(bname ## _minus,letter,-1); \
00138 COMMAND_TOGGLE(bname ## _toggle,letter); \
00139 COMMAND_SET(bname ## _set,letter);
00140
00141 #define COMMANDSET(name) \
00142 COMMANDS(name ## _a,'a'); \
00143 COMMANDS(name ## _b,'b'); \
00144 COMMANDS(name ## _c,'c'); \
00145 COMMANDS(name ## _d,'d'); \
00146 COMMANDS(name ## _e,'e'); \
00147 COMMANDS(name ## _f,'f'); \
00148 COMMANDS(name ## _g,'g'); \
00149 COMMANDS(name ## _h,'h'); \
00150 COMMANDS(name ## _i,'i'); \
00151 COMMANDS(name ## _j,'j'); \
00152 COMMANDS(name ## _k,'k'); \
00153 COMMANDS(name ## _l,'l'); \
00154 COMMANDS(name ## _m,'m'); \
00155 COMMANDS(name ## _n,'n'); \
00156 COMMANDS(name ## _o,'o'); \
00157 COMMANDS(name ## _p,'p'); \
00158 COMMANDS(name ## _q,'q'); \
00159 COMMANDS(name ## _r,'r'); \
00160 COMMANDS(name ## _s,'s'); \
00161 COMMANDS(name ## _t,'t'); \
00162 COMMANDS(name ## _u,'u'); \
00163 COMMANDS(name ## _v,'v'); \
00164 COMMANDS(name ## _w,'w'); \
00165 COMMANDS(name ## _x,'x'); \
00166 COMMANDS(name ## _y,'y'); \
00167 COMMANDS(name ## _z,'z');