olist expanded, happyhour script vars and buildwalk update

This commit is contained in:
JamDog 2010-12-08 01:35:41 +00:00
parent b06cf00639
commit d2b4faf1c9
9 changed files with 327 additions and 19 deletions

View file

@ -1872,7 +1872,7 @@ ACMD(do_diagnose)
ACMD(do_toggle)
{
char buf2[4], arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
int toggle, tp, wimp_lev, result = 0, len = 0;
int toggle, tp, wimp_lev, result = 0, len = 0, i;
const char *types[] = { "off", "brief", "normal", "on", "\n" };
const struct {
@ -2147,10 +2147,16 @@ ACMD(do_toggle)
return;
}
result = PRF_TOG_CHK(ch, PRF_BUILDWALK);
if (PRF_FLAGGED(ch, PRF_BUILDWALK))
if (PRF_FLAGGED(ch, PRF_BUILDWALK)) {
for (i=0; *arg2 && *(sector_types[i]) != '\n'; i++)
if (is_abbrev(arg2, sector_types[i]))
break;
if (*(sector_types[i]) == '\n') i=0;
GET_BUILDWALK_SECTOR(ch) = i;
send_to_char(ch, "Default sector type is %s\r\n", sector_types[i]);
mudlog(CMP, GET_LEVEL(ch), TRUE,
"OLC: %s turned buildwalk on. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch));
else
} else
mudlog(CMP, GET_ADMLEVEL(ch), TRUE,
"OLC: %s turned buildwalk off. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch));
break;

View file

@ -688,6 +688,8 @@ ACMD(do_display)
ACMD(do_gen_tog)
{
long result;
int i;
char arg[MAX_INPUT_LENGTH];
const char *tog_messages[][2] = {
{"You are now safe from summoning by other players.\r\n",
@ -806,10 +808,17 @@ ACMD(do_gen_tog)
return;
}
result = PRF_TOG_CHK(ch, PRF_BUILDWALK);
if (PRF_FLAGGED(ch, PRF_BUILDWALK))
if (PRF_FLAGGED(ch, PRF_BUILDWALK)) {
one_argument(argument, arg);
for (i=0; *arg && *(sector_types[i]) != '\n'; i++)
if (is_abbrev(arg, sector_types[i]))
break;
if (*(sector_types[i]) == '\n') i=0;
GET_BUILDWALK_SECTOR(ch) = i;
send_to_char(ch, "Default sector type is %s\r\n", sector_types[i]);
mudlog(CMP, GET_ADMLEVEL(ch), TRUE,
"OLC: %s turned buildwalk on. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch));
else
} else
mudlog(CMP, GET_ADMLEVEL(ch), TRUE,
"OLC: %s turned buildwalk off. Allowed zone %d", GET_NAME(ch), GET_OLC_ZONE(ch));
break;

View file

@ -3810,6 +3810,8 @@ void load_config( void )
case 'c':
if (!str_cmp(tag, "crash_file_timeout"))
CONFIG_CRASH_TIMEOUT = num;
else if (!str_cmp(tag, "can_mail"))
CONFIG_CAN_MAIL = num;
break;
case 'd':
@ -3928,6 +3930,26 @@ void load_config( void )
CONFIG_MAP = num;
else if (!str_cmp(tag, "medit_advanced_stats"))
CONFIG_MEDIT_ADVANCED = num;
else if (!str_cmp(tag, "mail_object_cost"))
CONFIG_OBJECT_COST = num;
else if (!str_cmp(tag, "mail_objects_allowed"))
CONFIG_CAN_MAIL_OBJ = num;
else if (!str_cmp(tag, "mail_gold_allowed"))
CONFIG_CAN_MAIL_GOLD = num;
else if (!str_cmp(tag, "mail_stamp_cost"))
CONFIG_STAMP_COST = num;
else if (!str_cmp(tag, "mail_min_level"))
CONFIG_MIN_MAIL_LEVEL = num;
else if (!str_cmp(tag, "mail_min_free_level"))
CONFIG_FREE_MAIL_LEVEL = num;
else if (!str_cmp(tag, "mail_drafts_allowed"))
CONFIG_DRAFTS_ALLOWED = num;
else if (!str_cmp(tag, "mail_draft_timeout"))
CONFIG_DRAFT_TIMEOUT = num;
else if (!str_cmp(tag, "mail_min_mail_anywhere"))
CONFIG_MIN_MAIL_ANYWHERE = num;
else if (!str_cmp(tag, "mail_min_send_to_all"))
CONFIG_MIN_SEND_TO_ALL = num;
break;
case 'n':

View file

@ -389,6 +389,16 @@ void find_replacement(void *go, struct script_data *sc, trig_data *trig,
snprintf(str, slen, "%d",((num = atoi(field)) > 0) ? trgvar_in_room(num) : 0);
return;
}
else if (!str_cmp(var, "happyhour")) {
if (!str_cmp(field, "qp") && IS_HAPPYHOUR)
snprintf(str, slen, "%d", HAPPY_QP);
else if (!str_cmp(field, "exp") && IS_HAPPYHOUR)
snprintf(str, slen, "%d", HAPPY_EXP);
else if (!str_cmp(field, "gold") && IS_HAPPYHOUR)
snprintf(str, slen, "%d", HAPPY_GOLD);
else snprintf(str, slen, "%d", HAPPY_TIME);
return;
}
else if (!str_cmp(var, "time")) {
if (!str_cmp(field, "hour"))
snprintf(str, slen, "%d", time_info.hours);

View file

@ -342,6 +342,7 @@ int buildwalk(struct char_data *ch, int dir)
OLC_ROOM(d)->description = strdup(buf);
OLC_ROOM(d)->zone = OLC_ZNUM(d);
OLC_ROOM(d)->number = NOWHERE;
OLC_ROOM(d)->sector_type = GET_BUILDWALK_SECTOR(ch);
/* Save the new room to memory. redit_save_internally handles adding the
* room in the right place, etc. */

View file

@ -23,6 +23,14 @@
#include "dg_scripts.h"
#include "quest.h"
#include "modify.h"
#include "spells.h"
#define MAX_OBJ_LIST 100
struct obj_list_item {
obj_vnum vobj;
int val;
};
/* local functions */
static void list_triggers(struct char_data *ch, zone_rnum rnum, trig_vnum vmin, trig_vnum vmax);
@ -34,8 +42,9 @@ static void list_zones(struct char_data *ch, zone_rnum rnum, zone_vnum vmin, zon
void perform_mob_flag_list(struct char_data * ch, char *arg)
{
int num, mob_flag, found = 0;
int num, mob_flag, found = 0, len=0, tmp_len=0;
struct char_data *mob;
char buf[MAX_STRING_LENGTH];
mob_flag = atoi(arg);
@ -44,29 +53,32 @@ void perform_mob_flag_list(struct char_data * ch, char *arg)
return;
}
send_to_char(ch, "Listing mobiles with %s%s%s flag set.\r\n", QYEL, action_bits[mob_flag], QNRM);
len = snprintf(buf, sizeof(buf), "Listing mobiles with %s%s%s flag set.\r\n", QYEL, action_bits[mob_flag], QNRM);
for(num=0;num<=top_of_mobt;num++) {
if(IS_SET_AR((mob_proto[num].char_specials.saved.act), mob_flag)) {
if ((mob = read_mobile(num, REAL)) != NULL) {
char_to_room(mob, 0);
send_to_char(ch,"%s%3d. %s[%s%5d%s]%s Level %s%-3d%s %s%s\r\n", CCNRM(ch, C_NRM),++found,
CCCYN(ch, C_NRM), CCYEL(ch, C_NRM), GET_MOB_VNUM(mob), CCCYN(ch, C_NRM), CCNRM(ch, C_NRM),
CCYEL(ch, C_NRM), GET_LEVEL(mob), CCNRM(ch, C_NRM), GET_NAME(mob), CCNRM(ch, C_NRM));
tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d. %s[%s%5d%s]%s Level %s%-3d%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, GET_MOB_VNUM(mob), QCYN, QNRM,
QYEL, GET_LEVEL(mob), QNRM, GET_NAME(mob), QNRM);
len += tmp_len;
extract_char(mob); /* Finished with the mob - remove it from the MUD */
}
}
}
if (!found)
send_to_char(ch,"None Found!\r\n");
return;
else
page_string(ch->desc, buf, TRUE);
}
void perform_mob_level_list(struct char_data * ch, char *arg)
{
int num, mob_level, found = 0;
int num, mob_level, found = 0, len, tmp_len;
struct char_data *mob;
char buf[MAX_STRING_LENGTH];
mob_level = atoi(arg);
@ -75,23 +87,220 @@ void perform_mob_level_list(struct char_data * ch, char *arg)
return;
}
send_to_char(ch, "Listing mobiles of level %s%d%s\r\n", QYEL, mob_level, QNRM);
len = snprintf(buf, sizeof(buf), "Listing mobiles of level %s%d%s\r\n", QYEL, mob_level, QNRM);
for(num=0;num<=top_of_mobt;num++) {
if((mob_proto[num].player.level) == mob_level) {
if ((mob = read_mobile(num, REAL)) != NULL) {
char_to_room(mob, 0);
send_to_char(ch,"%s%3d. %s[%s%5d%s]%s %s%s\r\n", CCNRM(ch, C_NRM),++found,
CCCYN(ch, C_NRM), CCYEL(ch, C_NRM), GET_MOB_VNUM(mob), CCCYN(ch, C_NRM), CCNRM(ch, C_NRM),
GET_NAME(mob), CCNRM(ch, C_NRM));
tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d. %s[%s%5d%s]%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, GET_MOB_VNUM(mob),
QCYN, QNRM, GET_NAME(mob), QNRM);
len += tmp_len;
extract_char(mob); /* Finished with the mob - remove it from the MUD */
}
}
}
if (!found)
send_to_char(ch,"None Found!\r\n");
else
page_string(ch->desc, buf, TRUE);
}
return;
void add_to_obj_list(struct obj_list_item *lst, int num_items, obj_vnum nvo, int nval)
{
int j, tmp_v;
obj_vnum tmp_ov;
for(j=0;j<num_items;j++) {
if(nval > lst[j].val) {
tmp_ov = lst[j].vobj;
tmp_v = lst[j].val;
lst[j].vobj = nvo;
lst[j].val = nval;
nvo = tmp_ov;
nval = tmp_v;
}
}
}
void perform_obj_type_list(struct char_data * ch, char *arg)
{
int num, itemtype, v1, v2, found = 0;
obj_vnum ov;
obj_rnum r_num;
itemtype = atoi(arg);
for(num=0;num<=top_of_objt;num++) {
if(obj_proto[num].obj_flags.type_flag == itemtype) {
if ((r_num = real_object(obj_index[num].vnum)) != NOTHING) { /* Seems silly? */
/* Set default vals, which may be changed below */
ov = obj_index[num].vnum;
v1 = (obj_proto[num].obj_flags.value[0]);
switch (itemtype) {
case ITEM_LIGHT:
v1 = (obj_proto[num].obj_flags.value[2]);
if (v1 == -1)
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s INFINITE%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QBRED, QNRM, obj_proto[r_num].short_description, QNRM);
else
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%-3dhrs) %s%s\r\n",
QNRM,++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_SCROLL:
case ITEM_POTION:
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_WAND:
case ITEM_STAFF:
v1 = (obj_proto[num].obj_flags.value[1]);
v2 = (obj_proto[num].obj_flags.value[3]);
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%dx%s) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, skill_name(v2), obj_proto[r_num].short_description, QNRM);
break;
case ITEM_WEAPON:
v1 = ((obj_proto[num].obj_flags.value[2]+1)*(obj_proto[r_num].obj_flags.value[1])) / 2;
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%d Avg Dam) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_ARMOR:
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%dAC) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_CONTAINER:
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (Max: %d) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_DRINKCON:
case ITEM_FOUNTAIN:
if (v1 != -1)
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (Max: %d) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
else
send_to_char(ch,"%s%3d. %s[%s%8d%s] %sINFINITE%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QBRED, QNRM, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_FOOD:
v2 = (obj_proto[num].obj_flags.value[3]);
if (v2 != 0)
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%dhrs) %s %sPoisoned!%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QBGRN, QNRM);
else
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s (%dhrs) %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, v1, obj_proto[r_num].short_description, QNRM);
break;
case ITEM_MONEY:
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s %s%s (%s%d coins%s)\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, obj_proto[r_num].short_description, QNRM, QYEL, v1, QNRM);
break;
/* The 'normal' items - don't provide extra info */
case ITEM_TREASURE:
case ITEM_TRASH:
case ITEM_OTHER:
case ITEM_WORN:
case ITEM_NOTE:
case ITEM_PEN:
case ITEM_BOAT:
case ITEM_KEY:
send_to_char(ch,"%s%3d. %s[%s%8d%s]%s %s%s\r\n",
QNRM, ++found, QCYN, QYEL, ov, QCYN, QNRM, obj_proto[r_num].short_description, QNRM);
break;
default:
send_to_char(ch, "Not a valid item type");
return;
}
}
}
}
return;
}
void perform_obj_aff_list(struct char_data * ch, char *arg)
{
int num, i, apply, v1 = 0, found = 0, len = 0, tmp_len = 0;
struct obj_list_item lst[MAX_OBJ_LIST];
obj_rnum r_num;
obj_vnum ov;
char buf[MAX_STRING_LENGTH];
for(i=0;i<MAX_OBJ_LIST;i++){
lst[i].vobj = NOTHING;
lst[i].val = 0;
}
apply = atoi(arg);
if (!(apply>0 && apply<NUM_APPLIES) ){
send_to_char(ch, "Not a valid affect");
return;
} /* Special cases below */
else if ((apply == APPLY_CLASS) || /* olist affect 7 is Weapon Damage */
(apply == APPLY_LEVEL) ) { /* olist affect 8 is AC-Apply for Armor */
for (num=0;num<=top_of_objt;num++) {
if ((apply == APPLY_CLASS && obj_proto[num].obj_flags.type_flag == ITEM_WEAPON) ||
(apply == APPLY_LEVEL && obj_proto[num].obj_flags.type_flag == ITEM_ARMOR) ) {
ov = obj_index[num].vnum;
v1 = ((obj_proto[num].obj_flags.value[2]+1)*(obj_proto[num].obj_flags.value[1])/2);
if ((r_num = real_object(ov)) != NOTHING)
add_to_obj_list(lst, MAX_OBJ_LIST, ov, v1);
}
}
if (apply == APPLY_CLASS)
len = snprintf(buf, sizeof(buf), "Highest average damage per hit for Weapons\r\n");
else if (apply == APPLY_LEVEL)
len = snprintf(buf, sizeof(buf), "Highest AC Apply for Armor\r\n");
for(i=0;i<MAX_OBJ_LIST;i++){
if ((r_num = real_object(lst[i].vobj)) != NOTHING) {
tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d. %s[%s%8d%s] %s%3d %s%s%s\r\n",
QNRM, ++found, QCYN, QYEL, lst[i].vobj, QCYN,
QYEL, lst[i].val, QNRM, obj_proto[r_num].short_description, QNRM);
len += tmp_len;
}
}
page_string(ch->desc, buf, TRUE);
return; /* End of special-case handling */
}
/* Non-special cases, list objects by affect */
for (num = 0; num <= top_of_objt; num++){
for (i = 0; i < MAX_OBJ_AFFECT; i++){
if (obj_proto[num].affected[i].modifier) {
if (obj_proto[num].affected[i].location == apply){
ov = obj_index[num].vnum;
v1 = obj_proto[num].affected[i].modifier;
if ((r_num = real_object(ov)) != NOTHING)
add_to_obj_list(lst, MAX_OBJ_LIST, ov, v1);
}
}
}
}
len = snprintf(buf, sizeof(buf), "Objects with highest %s affect\r\n", apply_types[(apply)]);
for(i=0;i<MAX_OBJ_LIST;i++){
if ((r_num = real_object(lst[i].vobj)) != NOTHING) {
tmp_len = snprintf(buf+len, sizeof(buf)-len, "%s%3d. %s[%s%8d%s] %s%3d %s%s%s\r\n",
QNRM, ++found, QCYN, QYEL, lst[i].vobj, QCYN,
QYEL, lst[i].val, QNRM, obj_proto[r_num].short_description, QNRM);
len += tmp_len;
}
}
page_string(ch->desc, buf, TRUE);
}
/* Ingame Commands */
@ -104,6 +313,7 @@ ACMD(do_oasis_list)
char smax[MAX_INPUT_LENGTH];
char arg[MAX_INPUT_LENGTH], arg2[MAX_INPUT_LENGTH];
bool use_name = FALSE;
int i;
two_arguments(argument, smin, smax);
@ -159,7 +369,51 @@ ACMD(do_oasis_list)
} else
list_mobiles(ch, rzone, vmin, vmax);
break;
case SCMD_OASIS_OLIST: list_objects(ch, rzone, vmin, vmax); break;
case SCMD_OASIS_OLIST:
two_arguments(argument, arg, arg2);
if (is_abbrev(arg, "type") || is_abbrev(arg, "affect")) {
if (is_abbrev(arg, "type")) {
if (!*arg2) {
send_to_char(ch, "Which object type do you want to list?\r\n");
for (i=1; i<NUM_ITEM_TYPES; i++)
{
send_to_char(ch, "%s%2d%s-%s%-14s%s", QNRM, i, QNRM, QYEL, item_types[i], QNRM);
if (!(i%4)) send_to_char(ch, "\r\n");
}
send_to_char(ch, "\r\n");
send_to_char(ch, "Usage: %solist type <num>%s\r\n", QYEL, QNRM);
send_to_char(ch, " %solist affect <num>%s\r\n", QYEL, QNRM);
send_to_char(ch, "Displays objects of the selected type, or top 100 with the selected affect.\r\n\r\n");
return;
}
perform_obj_type_list(ch, arg2);
} else { /* Assume arg = affect */
if (!*arg2) {
send_to_char(ch, "Which object affect do you want to list?\r\n");
for (i=0; i<NUM_APPLIES; i++)
{
if (i == APPLY_CLASS) /* Special Case 1 - Weapon Dam */
send_to_char(ch, "%s%2d-%s%-14s%s", QNRM, i, QYEL, "Weapon Dam", QNRM);
else if (i == APPLY_LEVEL) /* Special Case 2 - Armor AC Apply */
send_to_char(ch, "%s%2d-%s%-14s%s", QNRM, i, QYEL, "AC Apply", QNRM);
else
send_to_char(ch, "%s%2d-%s%-14s%s", QNRM, i, QYEL, apply_types[i], QNRM);
if (!((i+1)%4)) send_to_char(ch, "\r\n");
}
send_to_char(ch, "\r\n");
send_to_char(ch, "Usage: %solist type <num>%s\r\n", QYEL, QNRM);
send_to_char(ch, " %solist affect <num>%s\r\n", QYEL, QNRM);
send_to_char(ch, "Displays objects of the selected type, or top 100 with the selected affect.\r\n\r\n");
return;
}
perform_obj_aff_list(ch, arg2);
}
} else
list_objects(ch, rzone, vmin, vmax);
break;
case SCMD_OASIS_RLIST: list_rooms(ch, rzone, vmin, vmax); break;
case SCMD_OASIS_TLIST: list_triggers(ch, rzone, vmin, vmax); break;
case SCMD_OASIS_SLIST: list_shops(ch, rzone, vmin, vmax); break;

View file

@ -1004,6 +1004,7 @@ struct player_special_data
void *last_olc_targ; /**< ? Currently Unused ? */
int last_olc_mode; /**< ? Currently Unused ? */
char *host; /**< Resolved hostname, or ip, for player. */
int buildwalk_sector;/**< Default sector type for buildwalk */
};
/** Special data used by NPCs, not PCs */

View file

@ -632,6 +632,8 @@ do \
#define GET_SKILL(ch, i) CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->saved.skills[i]))
/** Copy the current skill level i of ch to pct. */
#define SET_SKILL(ch, i, pct) do { CHECK_PLAYER_SPECIAL((ch), (ch)->player_specials->saved.skills[i]) = pct; } while(0)
/** The player's default sector type when buildwalking */
#define GET_BUILDWALK_SECTOR(ch) CHECK_PLAYER_SPECIAL((ch), ((ch)->player_specials->buildwalk_sector))
/** Get obj worn in position i on ch. */
#define GET_EQ(ch, i) ((ch)->equipment[i])