/***************************************************************************
* 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. *
* *
* Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley *
* *
* 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. *
* *
* _/ _/_/_/ _/ _/ _/ ACK! MUD is modified *
* _/_/ _/ _/ _/ _/ Merc2.0/2.1/2.2 code *
* _/ _/ _/ _/_/ _/ (c)Stephen Zepp 1998 *
* _/_/_/_/ _/ _/ _/ Version #: 4.3 *
* _/ _/ _/_/_/ _/ _/ _/ *
* *
* http://ackmud.nuc.net/ *
* zenithar@ackmud.nuc.net *
* 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. *
***************************************************************************/
/***************************************************************************
* _/_/_/_/ _/ _/ _/_/_/_/ _/_/_/_/ AckFUSS is modified ACK!MUD 4.3.1 *
* _/ _/ _/ _/ _/ copyright Matt Goff (Kline) 2008 *
* _/_/ _/ _/ _/_/_/_/ _/_/_/_/ *
* _/ _/ _/ _/ _/ Support for this code is provided *
* _/ _/_/_/_/ _/_/_/_/ _/_/_/_/ at www.ackmud.net -- check it out!*
***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include "globals.h"
#ifndef DEC_ACT_COMM_H
#include "h/act_comm.h"
#endif
#ifndef DEC_ACT_INFO_H
#include "h/act_info.h"
#endif
#ifndef DEC_ACT_WIZ_H
#include "h/act_wiz.h"
#endif
#ifndef DEC_BUILD_H
#include "h/build.h"
#endif
#ifndef DEC_COMM_H
#include "h/comm.h"
#endif
void save_brands( )
{
FILE *fp;
char brand_file_name[MAX_STRING_LENGTH];
DL_LIST *brand;
BRAND_DATA *this_brand;
snprintf( brand_file_name, MSL, "%s", BRANDS_FILE );
if( ( fp = file_open( brand_file_name, "w" ) ) == NULL )
{
bug( "Save brands list: file_open", 0 );
perror( "failed open of brands.lst in save_brands" );
}
else
{
for( brand = first_brand; brand != NULL; brand = brand->next )
{
this_brand = (BRAND_DATA *)brand->this_one;
fprintf( fp, "#BRAND~\n" );
fprintf( fp, "%s~\n", this_brand->branded );
fprintf( fp, "%s~\n", this_brand->branded_by );
fprintf( fp, "%s~\n", this_brand->dt_stamp );
fprintf( fp, "%s~\n", this_brand->message );
fprintf( fp, "%s~\n", this_brand->priority );
}
fprintf( fp, "#END~\n\n" );
}
file_close(fp);
return;
}
void load_brands( void )
{
FILE *brandsfp;
char brands_file_name[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
BRAND_DATA *this_brand;
DL_LIST *brand_member;
snprintf( brands_file_name, MSL, "%s", BRANDS_FILE );
snprintf( buf, MSL, "Loading %s",BRANDS_FILE);
log_f("%s",buf);
if( ( brandsfp = file_open( brands_file_name, "r" ) ) == NULL )
{
bug( "Load brands Table: file_open", 0 );
perror( "failed open of brands_table.dat in load_brands_table" );
}
else
{
for( ;; )
{
char *word;
word = fread_string( brandsfp );
if( !str_cmp( word, "#BRAND" ) )
{
this_brand = new BRAND_DATA;
GET_FREE( brand_member, dl_list_free );
this_brand->branded = fread_string( brandsfp );
this_brand->branded_by = fread_string( brandsfp );
this_brand->dt_stamp = fread_string( brandsfp );
this_brand->message = fread_string( brandsfp );
this_brand->priority = fread_string( brandsfp );
free_string( word );
brand_member->this_one = this_brand;
brand_member->next = NULL;
brand_member->prev = NULL;
LINK( brand_member, first_brand, last_brand, next, prev );
}
else if( !str_cmp( word, "#END" ) )
{
free_string( word );
break;
}
else
{
free_string( word );
monitor_chan( "Load_brands: bad section.", MONITOR_BAD );
break;
}
}
file_close( brandsfp );
log_f("Done.");
}
}
void do_qpspend( CHAR_DATA * ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
/* char arg3 [MAX_INPUT_LENGTH]; */
char buf[MAX_STRING_LENGTH];
char brandbuf[MSL];
char catbuf[MSL];
snprintf( brandbuf, MSL, "%s", "" );
snprintf( catbuf, MSL, "%s", "" );
smash_tilde( argument );
argument = one_argument( argument, arg1 );
/* argument = one_argument( argument, arg2 ); */
if( IS_NPC( ch ) )
{
send_to_char( "Not for NPC's.\n\r", ch );
return;
}
if( arg1[0] == '\0' )
{
send_to_char( "Syntax: qpspend enter | exit | assist <message> \n\r", ch );
send_to_char( "or: qpspend show | buy | clear | recall | home | corpse | rescue\n\r", ch );
send_to_char( "or: qpspend set name |short | long <message>\n\r", ch );
send_to_char( "To set your enter or exit message, for example, type:\n\r", ch );
send_to_char( "qpspend enter waddles in from\n\r", ch );
send_to_char( "qpspend show to see a test, then qpspend buy\n\r", ch );
return;
}
#if 0
if( !str_cmp( arg1, "state" ) )
{
argument = one_argument( argument, arg2 );
if( !is_name( arg2, "unique rename" ) )
{
send_to_char( "That is not a currently implemented editing state.\n\r", ch );
return;
}
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( arg2 );
return;
}
#endif
if( !str_cmp( arg1, "enter" ) )
{
if( str_cmp( ch->pcdata->pedit_state, "walk" ) )
{
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( "none" );
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "walk" );
}
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( argument );
return;
}
if( !str_cmp( arg1, "exit" ) )
{
if( str_cmp( ch->pcdata->pedit_state, "walk" ) )
{
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( "none" );
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "walk" );
}
free_string( ch->pcdata->pedit_string[1] );
ch->pcdata->pedit_string[1] = str_dup( argument );
return;
}
if( !str_cmp( arg1, "assist" ) )
{
if( str_cmp( ch->pcdata->pedit_state, "assist" ) )
{
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( "none" );
free_string( ch->pcdata->pedit_string[1] );
ch->pcdata->pedit_string[1] = str_dup( "none" );
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "assist" );
}
free_string( ch->pcdata->pedit_string[0] );
if( !is_name( "*name*", argument ) )
{
send_to_char( "You must include *name* by itself somewhere in your assist message!\n\r", ch );
ch->pcdata->pedit_string[0] = str_dup( "none" );
return;
}
if( str_cmp( "assist", ch->pcdata->pedit_state ) )
{
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "assist" );
}
ch->pcdata->pedit_string[0] = str_dup( argument );
return;
}
if( !str_cmp( arg1, "show" ) )
{
if( !str_cmp( ch->pcdata->pedit_state, "walk" ) )
{
char move_buf[MSL];
char test_string[MSL];
short qp_cost = 0;
if( !str_cmp( ch->pcdata->pedit_string[0], "none" ) )
{
snprintf( test_string, MSL, "%s", ch->pcdata->room_enter );
}
else
{
snprintf( test_string, MSL, "%s", ch->pcdata->pedit_string[0] );
qp_cost++;
}
snprintf( move_buf, MSL, "$L%s$n %s $T.", get_ruler_title( ch->pcdata->ruler_rank, ch->login_sex ), test_string );
act( move_buf, ch, NULL, rev_name[1], TO_CHAR );
if( !str_cmp( ch->pcdata->pedit_string[1], "none" ) )
{
snprintf( test_string, MSL, "%s", ch->pcdata->room_exit );
}
else
{
snprintf( test_string, MSL, "%s", ch->pcdata->pedit_string[1] );
qp_cost++;
}
snprintf( move_buf, MSL, "$L%s$n %s $T.", get_ruler_title( ch->pcdata->ruler_rank, ch->login_sex ), test_string );
act( move_buf, ch, NULL, dir_name[1], TO_CHAR );
snprintf( buf, MSL, "Purchase cost is %d qps.\n\r", qp_cost );
send_to_char( buf, ch );
return;
}
else if( !str_cmp( ch->pcdata->pedit_state, "assist" ) )
{
snprintf( buf, MSL, "Current message:\n\r %s\n\r",
( !str_cmp( ch->pcdata->pedit_string[0], "none" ) ?
ch->pcdata->assist_msg : ch->pcdata->pedit_string[0] ) );
send_to_char( buf, ch );
}
return;
}
if( !str_cmp( arg1, "buy" ) )
{
short qp_cost = 0;
char *strtime;
short i;
if( !str_cmp( ch->pcdata->pedit_state, "walk" ) )
{
if( str_cmp( ch->pcdata->pedit_string[0], "none" ) )
qp_cost++;
if( str_cmp( ch->pcdata->pedit_string[1], "none" ) )
qp_cost++;
if( ch->pcdata->quest_points < qp_cost )
{
send_to_char( "You don't have enough quest points!\n\r", ch );
for( i = 0; i < 5; i++ )
{
if( str_cmp( ch->pcdata->pedit_string[i], "none" ) )
{
free_string( ch->pcdata->pedit_string[i] );
ch->pcdata->pedit_string[i] = str_dup( "none" );
}
}
return;
}
else if( qp_cost == 0 )
{
send_to_char( "No changes.\n\r", ch );
return;
}
else
{
if( str_cmp( ch->pcdata->pedit_string[0], "none" ) )
{
free_string( ch->pcdata->room_enter );
ch->pcdata->room_enter = str_dup( ch->pcdata->pedit_string[0] );
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( "none" );
snprintf( catbuf, MSL, "Enter message changed to %s\n\r", ch->pcdata->room_enter );
strncat( brandbuf, catbuf, MSL );
}
if( str_cmp( ch->pcdata->pedit_string[1], "none" ) )
{
free_string( ch->pcdata->room_exit );
ch->pcdata->room_exit = str_dup( ch->pcdata->pedit_string[1] );
free_string( ch->pcdata->pedit_string[1] );
ch->pcdata->pedit_string[1] = str_dup( "none" );
snprintf( catbuf, MSL, "Exit message changed to %s\n\r", ch->pcdata->room_exit );
strncat( brandbuf, catbuf, MSL );
}
free_string( ch->pcdata->pedit_string[0] );
ch->pcdata->pedit_string[0] = str_dup( "none" );
free_string( ch->pcdata->pedit_string[1] );
ch->pcdata->pedit_string[1] = str_dup( "none" );
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "none" );
ch->pcdata->quest_points -= qp_cost;
do_save( ch, "auto" );
{
BRAND_DATA *brand;
DL_LIST *brand_member;
brand = new BRAND_DATA;
GET_FREE( brand_member, dl_list_free );
brand->branded = str_dup( ch->name );
brand->branded_by = str_dup( "@@rSystem@@N" );
brand->priority = str_dup( "normal" );
brand->message = str_dup( brandbuf );
strtime = ctime( ¤t_time );
strtime[strlen( strtime ) - 1] = '\0';
brand->dt_stamp = str_dup( strtime );
brand_member->next = NULL;
brand_member->prev = NULL;
brand_member->this_one = brand;
LINK( brand_member, first_brand, last_brand, next, prev );
save_brands( );
send_to_char( "Your messages have been updated, and logged for inspection by an Immortal.\n\r", ch );
}
return;
}
}
else if( !str_cmp( ch->pcdata->pedit_state, "assist" ) )
{
char assistbuf[MSL];
char *parse = ch->pcdata->pedit_string[0];
char word1[MSL];
assistbuf[0] = '\0';
if( ch->pcdata->quest_points < 3 )
{
send_to_char( "You do not have enough quest points!\n\r", ch );
for( i = 0; i < 5; i++ )
{
if( str_cmp( ch->pcdata->pedit_string[i], "none" ) )
{
free_string( ch->pcdata->pedit_string[i] );
ch->pcdata->pedit_string[i] = str_dup( "none" );
}
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "none" );
}
return;
}
for( ;; )
{
parse = one_word( parse, word1 );
if( word1[0] == '\0' )
break;
if( !str_cmp( "*name*", word1 ) )
{
strncat( assistbuf, "$N ", MSL );
continue;
}
else
{
snprintf( catbuf, MSL, "%s ", word1 );
strncat( assistbuf, catbuf, MSL );
}
}
free_string( ch->pcdata->assist_msg );
ch->pcdata->assist_msg = str_dup( assistbuf );
for( i = 0; i < 5; i++ )
{
if( str_cmp( ch->pcdata->pedit_string[i], "none" ) )
{
free_string( ch->pcdata->pedit_string[i] );
ch->pcdata->pedit_string[i] = str_dup( "none" );
}
}
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( "none" );
send_to_char( "Done!\n\r", ch );
ch->pcdata->quest_points -= 3;
do_save( ch, "auto" );
{
BRAND_DATA *brand;
DL_LIST *brand_member;
brand = new BRAND_DATA;
GET_FREE( brand_member, dl_list_free );
brand->branded = str_dup( ch->name );
brand->branded_by = str_dup( "@@rSystem@@N" );
brand->priority = str_dup( "normal" );
snprintf( brandbuf, MSL, "Assist message changed to %s\n\r", ch->pcdata->assist_msg );
brand->message = str_dup( brandbuf );
strtime = ctime( ¤t_time );
strtime[strlen( strtime ) - 1] = '\0';
brand->dt_stamp = str_dup( strtime );
brand_member->next = NULL;
brand_member->prev = NULL;
brand_member->this_one = brand;
LINK( brand_member, first_brand, last_brand, next, prev );
save_brands( );
send_to_char( "Your messages have been updated, and logged for inspection by an Immortal.\n\r", ch );
}
return;
}
return;
}
if( !str_cmp( arg1, "rescue" ) )
{
if( ch->in_room->vnum == ROOM_VNUM_JAIL )
{
send_to_char( "No one can rescue you from here.\n\r", ch );
return;
}
if( ch->pcdata->quest_points < 10 )
{
send_to_char( "You don't have enough quest points. Cost is 10 qp.\n\r", ch );
return;
}
else
{
ROOM_INDEX_DATA *location;
if( ( location = get_room_index( ch->pcdata->recall_vnum ) ) == NULL )
location = get_room_index( 3001 );
act( "@@mZenithar @@Wappears before you, and takes you to your Happy Place!", ch, NULL, NULL, TO_CHAR );
act( "@@mZenithar @@Wappears before you, and takes $n to $s Happy Place!", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, location );
do_look( ch, "" );
act( "$n steps into the room from a @@apulsating @@mvortex@@N.", ch, NULL, NULL, TO_ROOM );
ch->pcdata->quest_points -= 10;
do_save( ch, "auto" );
return;
}
}
if( !str_cmp( arg1, "home" ) )
{
if( ch->pcdata->quest_points < 50 )
{
send_to_char( "You don't have enough quest points. Cost is 50 qp.\n\r", ch );
return;
}
else
{
if( ch->in_room->sector_type != SECT_RECALL_OK )
{
send_to_char( "This is not a legal location to call your home.\n\r", ch );
return;
}
else if( ( ch->in_room == NULL ) || ( ch->in_room->vnum < 3 ) )
{
send_to_char( "You are LOST!\n\r", ch );
return;
}
else
{
ch->pcdata->recall_vnum = ch->in_room->vnum;
ch->pcdata->quest_points -= 50;
do_save( ch, "auto" );
send_to_char( "You know call this room your home, and will recall here!\n\r", ch );
return;
}
}
}
if( !str_cmp( arg1, "corpse" ) )
{
if( ch->pcdata->quest_points < 10 )
{
send_to_char( "You don't have enough quest points. Cost is 10 qp.\n\r", ch );
return;
}
else if( ( ch->in_room == NULL ) || ( ch->in_room->vnum < 3 ) )
{
send_to_char( "You are completly LOST!!\n\r", ch );
return;
}
else
{
OBJ_DATA *obj;
bool found = FALSE;
for( obj = first_obj; obj != NULL; obj = obj->next )
{
if( ( ( obj->pIndexData->vnum ) == OBJ_VNUM_CORPSE_PC ) && ( !str_cmp( ch->name, obj->owner ) ) && ( !( obj->in_room == ch->in_room ) ) ) /*don't work! */
{
found = TRUE;
obj_from_room( obj );
obj_to_room( obj, ch->in_room );
act( "Got the blighter!", ch, NULL, NULL, TO_CHAR );
}
}
/*
* act used to enable mobiles to check for CR triggers...
*/
if( !found )
{
act( "Couldn't find it.", ch, NULL, NULL, TO_CHAR );
}
ch->pcdata->quest_points -= 10;
do_save( ch, "auto" );
return;
}
}
if( !str_cmp( arg1, "set" ) )
{
if( !is_name( arg2, "unique rename" ) )
{
send_to_char( "That is not a currently implemented editing state.\n\r", ch );
return;
}
free_string( ch->pcdata->pedit_state );
ch->pcdata->pedit_state = str_dup( arg2 );
return;
}
if( !str_cmp( arg1, "clear" ) )
{
short i;
for( i = 0; i < 5; i++ )
{
free_string( ch->pcdata->pedit_string[i] );
ch->pcdata->pedit_string[i] = str_dup( "none" );
}
return;
}
}
void do_immbrand( CHAR_DATA * ch, char *argument )
{
DL_LIST *brand_list;
DL_LIST *this_brand;
BRAND_DATA *brand;
char buf[MAX_STRING_LENGTH];
char buf1[MAX_STRING_LENGTH * 7];
char arg[MAX_INPUT_LENGTH];
int vnum = 0;
int anum = 0;
if( IS_NPC( ch ) )
return;
argument = one_argument( argument, arg );
smash_tilde( argument );
if( arg[0] == '\0' )
{
do_immbrand( ch, "read" );
return;
}
if( !str_cmp( arg, "list" ) )
{
vnum = 0;
buf1[0] = '\0';
for( brand_list = first_brand; brand_list; brand_list = brand_list->next )
{
brand = (BRAND_DATA *)brand_list->this_one;
snprintf( buf, MSL, "[%3d] @@r%s@@W: @@GBrander@@W: %s @@a%s @@ePriority: %s@@N\n\r",
vnum, brand->branded, brand->branded_by, brand->dt_stamp, brand->priority );
strncat( buf1, buf, MSL );
vnum++;
if( vnum > 100 )
{
strncat( buf1, "---More Follow---\n\r", MSL );
break;
}
}
if( vnum == 0 )
send_to_char( "There are no outstanding brands.\n\r", ch );
else
{
/*
* act message
*/
send_to_char( buf1, ch );
}
return;
}
if( !str_cmp( arg, "read" ) )
{
if( is_number( argument ) )
{
anum = atoi( argument );
}
else
{
send_to_char( "Read which brand?\n\r", ch );
return;
}
vnum = 0;
buf1[0] = '\0';
for( brand_list = first_brand; brand_list; brand_list = brand_list->next )
{
if( vnum++ == anum )
{
brand = (BRAND_DATA *)brand_list->this_one;
snprintf( buf, MSL, "[%3d] @@r%s@@W: @@GBrander@@W: %s @@a%s @@ePriority: %s@@N\n\r",
anum, brand->branded, brand->branded_by, brand->dt_stamp, brand->priority );
strncat( buf1, buf, MSL );
strncat( buf1, brand->message, MSL );
send_to_char( buf1, ch );
return;
}
else
continue;
send_to_char( "No such brand.\n\r", ch );
return;
}
}
if( !str_cmp( arg, "write" ) || !str_cmp( arg, "edit" ) )
{
if( ch->current_brand == NULL )
ch->current_brand = new BRAND_DATA;
build_strdup( &ch->current_brand->message, "$edit", TRUE, FALSE, ch );
return;
}
if( !str_cmp( arg, "player" ) )
{
if( ch->current_brand == NULL )
ch->current_brand = new BRAND_DATA;
free_string( ch->current_brand->branded );
ch->current_brand->branded = str_dup( argument );
send_to_char( "Ok.\n\r", ch );
return;
}
if( !str_cmp( arg, "priority" ) )
{
if( ch->current_brand == NULL )
ch->current_brand = new BRAND_DATA;
free_string( ch->current_brand->priority );
ch->current_brand->priority = str_dup( argument );
send_to_char( "Ok.\n\r", ch );
return;
}
if( !str_cmp( arg, "clear" ) )
{
if( ch->current_brand )
{
delete ch->current_brand;
ch->current_brand = NULL;
}
save_brands( );
send_to_char( "Ok.\n\r", ch );
return;
}
if( !str_cmp( arg, "show" ) )
{
if( !ch->current_brand )
{
send_to_char( "You have no brand in progress.\n\r", ch );
return;
}
buf1[0] = '\0';
snprintf( buf, MSL, "[%3d] %s: Brander: %s Date: %s Priority: %s\n\r",
vnum,
ch->current_brand->branded,
ch->current_brand->branded_by, ch->current_brand->dt_stamp, ch->current_brand->priority );
strncat( buf1, buf, MSL );
strncat( buf1, ch->current_brand->message, MSL );
send_to_char( buf1, ch );
return;
}
if( !str_cmp( arg, "post" ) )
{
char *strtime;
if( !ch->current_brand )
{
send_to_char( "You have no brand in progress.\n\r", ch );
return;
}
if( !str_cmp( ch->current_brand->branded, "" ) )
{
send_to_char( "You need to provide a player name .\n\r", ch );
return;
}
if( !str_cmp( ch->current_brand->message, "" ) )
{
send_to_char( "You need to provide a message.\n\r", ch );
return;
}
strtime = ctime( ¤t_time );
strtime[strlen( strtime ) - 1] = '\0';
free_string( ch->current_brand->dt_stamp );
ch->current_brand->dt_stamp = str_dup( strtime );
free_string( ch->current_brand->branded_by );
ch->current_brand->branded_by = str_dup( ch->name );
GET_FREE( this_brand, dl_list_free );
this_brand->next = NULL;
this_brand->prev = NULL;
this_brand->this_one = ch->current_brand;
LINK( this_brand, first_brand, last_brand, next, prev );
ch->current_brand = NULL;
save_brands( );
send_to_char( "Ok.\n\r", ch );
return;
}
if( !str_cmp( arg, "remove" ) )
{
if( !is_number( argument ) )
{
send_to_char( "Remove which letter number?\n\r", ch );
return;
}
anum = atoi( argument );
vnum = 0;
for( brand_list = first_brand; brand_list; brand_list = brand_list->next )
{
if( vnum++ == anum )
{
break;
}
}
if( brand_list != NULL )
{
UNLINK( brand_list, first_brand, last_brand, next, prev );
brand = (BRAND_DATA *)brand_list->this_one;
delete brand;
brand_list->this_one = NULL;
PUT_FREE( brand_list, dl_list_free );
save_brands( );
return;
}
send_to_char( "No such brand.\n\r", ch );
return;
}
send_to_char( "Huh? Type 'help letter' for usage.\n\r", ch );
return;
}
void do_statraise(CHAR_DATA *ch, char *argument)
{
int cost = 5;
int statcap = 25;
char buf[MSL];
/* Note, you'll need to edit your stat tables in const.c
* to give bonuses past 25 for each stat, based on whatever
* limit you set in this function --Kline
*/
if( IS_NPC(ch) ) /* Not on mobs */
return;
if( argument[0] == '\0' ) /* No arg supplied, show the syntax */
{
send_to_char("Syntax is: statraise <str/int/wis/dex/con>\n\r",ch);
return;
}
if( !str_prefix(argument,"str") ) /* Matches on 's', 'st', 'str' */
{
if( ch->pcdata->max_str >= statcap )
{
snprintf(buf,MSL,"You can not raise your Str any further. The limit is %d.\n\r",statcap);
send_to_char(buf,ch);
return;
}
cost *= ch->pcdata->max_str; /* Take base cost (5) mult by current value */
if( ch->pcdata->quest_points < cost )
{
snprintf(buf,MSL,"It costs %d QP to raise your Str, but you only have %d.\n\r",cost,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
ch->pcdata->max_str++; /* Raise the actual cap */
ch->pcdata->perm_str++; /* Give them a free stat train */
ch->pcdata->quest_points -= cost;
snprintf(buf,MSL,"You have spent %d QP to raise your Str! It is now %d and you have %d QP remaining.\n\r",cost,ch->pcdata->max_str,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
else if( !str_prefix(argument,"int") ) /* Matches on 'i', 'in', 'int' */
{
if( ch->pcdata->max_int >= statcap )
{
snprintf(buf,MSL,"You can not raise your Int any further. The limit is %d.\n\r",statcap);
send_to_char(buf,ch);
return;
}
cost *= ch->pcdata->max_int; /* Take base cost (5) mult by current value */
if( ch->pcdata->quest_points < cost )
{
snprintf(buf,MSL,"It costs %d QP to raise your Int, but you only have %d.\n\r",cost,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
ch->pcdata->max_int++; /* Raise the actual cap */
ch->pcdata->perm_int++; /* Give them a free stat train */
ch->pcdata->quest_points -= cost;
snprintf(buf,MSL,"You have spent %d QP to raise your Int! It is now %d and you have %d QP remaining.\n\r",cost,ch->pcdata->max_int,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
else if( !str_prefix(argument,"wis") ) /* Matches on 'w', 'wi', 'wis' */
{
if( ch->pcdata->max_wis >= statcap )
{
snprintf(buf,MSL,"You can not raise your Wis any further. The limit is %d.\n\r",statcap);
send_to_char(buf,ch);
return;
}
cost *= ch->pcdata->max_wis; /* Take base cost (5) mult by current value */
if( ch->pcdata->quest_points < cost )
{
snprintf(buf,MSL,"It costs %d QP to raise your Wis, but you only have %d.\n\r",cost,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
ch->pcdata->max_wis++; /* Raise the actual cap */
ch->pcdata->perm_wis++; /* Give them a free stat train */
ch->pcdata->quest_points -= cost;
snprintf(buf,MSL,"You have spent %d QP to raise your Wis! It is now %d and you have %d QP remaining.\n\r",cost,ch->pcdata->max_wis,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
else if( !str_prefix(argument,"dex") ) /* Matches on 'd', 'de', 'dex' */
{
if( ch->pcdata->max_dex >= statcap )
{
snprintf(buf,MSL,"You can not raise your Dex any further. The limit is %d.\n\r",statcap);
send_to_char(buf,ch);
return;
}
cost *= ch->pcdata->max_dex; /* Take base cost (5) mult by current value */
if( ch->pcdata->quest_points < cost )
{
snprintf(buf,MSL,"It costs %d QP to raise your Dex, but you only have %d.\n\r",cost,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
ch->pcdata->max_dex++; /* Raise the actual cap */
ch->pcdata->perm_dex++; /* Give them a free stat train */
ch->pcdata->quest_points -= cost;
snprintf(buf,MSL,"You have spent %d QP to raise your Dex! It is now %d and you have %d QP remaining.\n\r",cost,ch->pcdata->max_dex,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
else if( !str_prefix(argument,"con") ) /* Matches on 'c', 'co', 'con' */
{
if( ch->pcdata->max_con >= statcap )
{
snprintf(buf,MSL,"You can not raise your Con any further. The limit is %d.\n\r",statcap);
send_to_char(buf,ch);
return;
}
cost *= ch->pcdata->max_con; /* Take base cost (5) mult by current value */
if( ch->pcdata->quest_points < cost )
{
snprintf(buf,MSL,"It costs %d QP to raise your Con, but you only have %d.\n\r",cost,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
ch->pcdata->max_con++; /* Raise the actual cap */
ch->pcdata->perm_con++; /* Give them a free stat train */
ch->pcdata->quest_points -= cost;
snprintf(buf,MSL,"You have spent %d QP to raise your Con! It is now %d and you have %d QP remaining.\n\r",cost,ch->pcdata->max_con,ch->pcdata->quest_points);
send_to_char(buf,ch);
return;
}
else /* Invalid argument, display syntax */
{
send_to_char("Syntax is: statraise <str/int/wis/dex/con>\n\r",ch);
return;
}
}