MONTH_PROG SNIPPET (Smaug 1.4)
With this prog and ifcheck you can make similar things like in time_prog, but checking the month you are, for instance you could load seasonal objects, etc.
1.- The 'ifcheck' is really easy to do, just open MUD_PROG.C and look for
if ( !str_cmp(chck, "time") )
{
return mprog_veval(time_info.time, opr, atoi(rval), mob );
}
and add below:
if ( !str_cmp(chck, "month") )
{
return mprog_veval(time_info.month, opr, atoi(rval), mob );
}
Now do a 'make' and you can use it like 'if time($n) ..'
Remember, in Smaug there are 17 months (and progs uses 0 to 16, not 1 to 17).
An easy example:
>greet_prog 100~
if month($n)==3
mpecho Happy Christmas
~
|
Of course you can use ' >', '< ', ' or ', etc.
2.- To add MONTH_PROG is a little harder, but just follow my indications:
In DB.C:
look for if ( !str_cmp( name, "time_prog" ) ) return TIME_PROG;
and add below if ( !str_cmp( name, "month_prog" ) ) return MONTH_PROG;
In MUD_COMM.C :
look for case TIME_PROG: return "time_prog";
and add below case MONTH_PROG: return "month_prog";
In MUD.H:
look for typedef enum{ . . . . . . }prog_types
and add into ,MONTH_PROG
add also this functions after the other _trigger ... similar functions
void mprog_month_trigger args ( ( CHAR_DATA *mob ) );
void rprog_month_trigger ( CHAR_DATA *ch );
void oprog_month_trigger ( OBJ_DATA *obj );
In MUD_PROG.C:
add this (look the similar functions of time and put them near, for easy understanding) Look than time has not oprogs.
/**************************************************************************
* Month_prog coded by Desden, el Chaman Tibetano (J.L.Sogorb) *
* October 1998 *
* Email: jose@luisso.net *
* *
**************************************************************************/
void mprog_month_check( CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj,
void *vo, int type)
{
MPROG_DATA * mprg;
for ( mprg = mob->pIndexData->mudprogs; mprg; mprg = mprg->next )
{
if ( mprg->type == type && time_info.month == atoi(mprg->arglist))
mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
}
return;
}
void rprog_month_check( CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj,
void *vo, int type )
{
ROOM_INDEX_DATA * room = (ROOM_INDEX_DATA *) vo;
MPROG_DATA * mprg;
for ( mprg = room->mudprogs; mprg; mprg = mprg->next )
{
if ( mprg->type == type && time_info.month == atoi(mprg->arglist))
mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
}
return;
}
void oprog_month_check( CHAR_DATA *mob, CHAR_DATA *actor, OBJ_DATA *obj,
void *vo, int type)
{
MPROG_DATA * mprg;
for ( mprg = obj->pIndexData->mudprogs; mprg; mprg = mprg->next )
{
if ( mprg->type == type
&& time_info.month == atoi( mprg->arglist ) )
mprog_driver( mprg->comlist, mob, actor, obj, vo, FALSE );
}
return;
}
void mprog_month_trigger( CHAR_DATA *mob )
{
if ( HAS_PROG(mob->pIndexData,MONTH_PROG) )
mprog_month_check(mob,NULL,NULL,NULL,MONTH_PROG);
}
void rprog_month_trigger( CHAR_DATA *ch )
{
if ( HAS_PROG(ch->in_room,MONTH_PROG))
{
rset_supermob( ch->in_room );
rprog_month_check( supermob, NULL, NULL, ch->in_room,MONTH_PROG );
release_supermob();
}
}
void oprog_month_trigger( OBJ_DATA *obj )
{
if ( HAS_PROG(obj->pIndexData, MONTH_PROG) )
{
set_supermob( obj );
oprog_month_check(supermob,NULL,obj,NULL,MONTH_PROG);
release_supermob();
}
}
In UPDATE.C:
Add at the beggining of the file:
static bool update_month_trigger;
look for time_info.month++; into void time_update()
and add upon update_month_trigger = 1;
into char_update(void)
look for similar time checkings and add:
if (IS_NPC(ch)&& update_month_trigger==1) mprog_month_trigger(ch);
if (char_died(ch))
continue;
if (IS_NPC(ch)&& update_month_trigger==1) rprog_month_trigger(ch);
if (char_died(ch))
continue;
Also look for clear_vrooms (); and add just below :
if(time_info.hour == 1)
update_month_trigger = 0;
and the last thing :)
in obj_update(void) look for
set_cur_obj( obj );
if ( obj->carried_by )
oprog_random_trigger( obj );
else
if( obj->in_room && obj->in_room->area->nplayer > 0 )
oprog_random_trigger( obj );
and change it to:
set_cur_obj( obj );
if ( obj->carried_by )
{
oprog_random_trigger( obj );
if(update_month_trigger==1) oprog_month_trigger(obj);
}
else
if( obj->in_room && obj->in_room->area->nplayer > 0 )
{
oprog_random_trigger( obj );
if(update_month_trigger==1) oprog_month_trigger(obj);
}
3.- Now do a 'make clean' and a 'make'.
Now you can use MONTH_PROG like TIME_PROG, it works just in the moment the
mud reaches the month. It can be used with mobs, rooms and objects.
Note than in these progs there is not a player making the trigger, so you can't
use $n, you must use $i (the mob or supermob).
An example:
>month_prog 5~
shout Well, spring has come.
~
|
***************************************************************************
I hope you enjoy it. If you have any question or problem, please mail me:
I'll greet you also if you mail me telling you are using this code and if
you like it. Thank you.
jose@luisso.net
**************** Desden, el Chaman Tibetano ---- Oct 1998 *****************