// merc.h
// Fortress
DECLARE_DO_FUN( do_garrison );
DECLARE_DO_FUN( do_hire );
/* Guild */
void save_fortress args( (void) );
void load_fortress args( (void) );
typedef struct fortress
{
int guard;
int soldier;
} FORTRESS;
FORTRESS fortress[12];
// guild.c
void do_garrison(CHAR_DATA *ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char guild[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int x;
argument = one_argument( argument, arg1 );
sprintf(buf,"Dark Hand Guards: %d\n\r",fortress[0].guard);
send_to_char( buf, ch );
sprintf(buf,"Dark Hand Soldiers: %d\n\r",fortress[0].soldier);
send_to_char( buf, ch );
sprintf(buf,"Guardian Guards: %d\n\r",fortress[1].guard);
send_to_char( buf, ch );
sprintf(buf,"Guardian Soldiers: %d\n\r",fortress[1].soldier);
send_to_char( buf, ch );
sprintf(buf,"Beast Guards: %d\n\r",fortress[2].guard);
send_to_char( buf, ch );
sprintf(buf,"Beast Soldiers: %d\n\r",fortress[2].soldier);
send_to_char( buf, ch );
sprintf(buf,"Damned Guards: %d\n\r",fortress[3].guard);
send_to_char( buf, ch );
sprintf(buf,"Damned Soldiers: %d\n\r",fortress[3].soldier);
send_to_char( buf, ch );
sprintf(buf,"Crusaders Guards: %d\n\r",fortress[4].guard);
send_to_char( buf, ch );
sprintf(buf,"Crusaders Soldiers: %d\n\r",fortress[4].soldier);
send_to_char( buf, ch );
sprintf(buf,"Druid Guards: %d\n\r",fortress[5].guard);
send_to_char( buf, ch );
sprintf(buf,"Druid Soldiers: %d\n\r",fortress[5].soldier);
send_to_char( buf, ch );
return;
}
void do_hire(CHAR_DATA *ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char guild[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int x;
x = ch->guild;
argument = one_argument( argument, arg1 );
if (arg1[0] == '\0')
{
send_to_char("Soldier 100,000\n\r",ch);
send_to_char("Guard 100,000\n\r",ch);
}
for( x = 1; x < 7;x++)
{
if (!str_cmp(arg1,"soldier"))
{
if (ch->pcgold < 100000 )
{
send_to_char("You don't have the 100,000 gold needed.\n\r",ch);
return;
}
fortress[x].soldier++;
send_to_char("You hire a soldier.\n\r",ch);
ch->pcgold -= 100000;
save_fortress();
return;
}
if (!str_cmp(arg1,"guard"))
{
if (ch->pcgold < 100000 )
{
send_to_char("You don't have the 100,000 gold needed.\n\r",ch);
return;
}
fortress[x].guard++;
send_to_char("You hire a guard.\n\r",ch);
ch->pcgold -= 100000;
save_fortress();
return;
}
}
return;
}
void do_garrison(CHAR_DATA *ch, char *argument)
{
sprintf(buf,"Guardian Guards: %d\n\r",fortress[1].guard);
send_to_char( buf, ch );
sprintf(buf,"Guardian Soldiers: %d\n\r",fortress[1].soldier);
send_to_char( buf, ch );
}
vnum = fread_number(fp);
if (vnum == 0)
break;
if (vnum == 5101)
{
if (fortress[1].guard < pReset->arg2)
{
break;
}
}
pMob = create_mobile(pMobIndex);
/* OLC
* Reset one room. Called by reset_area and olc.
*/
void reset_room(ROOM_INDEX_DATA * pRoom)
{
RESET_DATA *pReset;
CHAR_DATA *pMob;
OBJ_DATA *pObj;
CHAR_DATA *LastMob = NULL;
OBJ_DATA *LastObj = NULL;
int iExit;
int level = 0;
bool last;
if (!pRoom)
return;
pMob = NULL;
last = FALSE;
int vnum; // i put this in
FILE *fp; // i put this in 2
for (iExit = 0; iExit < MAX_DIR; iExit++)
{
EXIT_DATA *pExit;
if ((pExit = pRoom->exit[iExit]))
{
pExit->exit_info = pExit->rs_flags;
if ((pExit->to_room != NULL) && ((pExit = pExit->to_room->exit[rev_dir[iExit]])))
{
/* nail the other side */
pExit->exit_info = pExit->rs_flags;
}
}
}
for (pReset = pRoom->reset_first; pReset != NULL; pReset = pReset->next)
{
MOB_INDEX_DATA *pMobIndex;
OBJ_INDEX_DATA *pObjIndex;
OBJ_INDEX_DATA *pObjToIndex;
ROOM_INDEX_DATA *pRoomIndex;
switch (pReset->command)
{
default:
bug("Reset_room: bad command %c.", pReset->command);
break;
case 'M':
if (!(pMobIndex = get_mob_index(pReset->arg1)))
{
bug("Reset_room: 'M': bad vnum %d.", pReset->arg1);
continue;
}
if (pMobIndex->count >= pReset->arg2)
{
last = FALSE;
break;
}
/* vnum = fread_number(fp);
if (vnum == 0)
break;
if (vnum == 5101) // 5101 is the mob vnum of the guardian guard
{
if (fortress[1].guard < pReset->arg2)
{
break;
}
}
*/
pMob = create_mobile(pMobIndex);
/*
* Some more hard coding.
*/
if (room_is_dark(pRoom))
SET_BIT(pMob->affected_by, AFF_INFRARED);
char_to_room(pMob, pRoom);
LastMob = pMob;
level = URANGE(0, pMob->level - 2, LEVEL_HERO);
last = TRUE;
break;
case 'O':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
bug("Reset_room: 'O': bad vnum %d.", pReset->arg1);
continue;
}
if (!(pRoomIndex = get_room_index(pReset->arg3)))
{
bug("Reset_room: 'O': bad vnum %d.", pReset->arg3);
continue;
}
if (count_obj_list(pObjIndex, pRoom->contents) > 0)
break;
pObj = create_object(pObjIndex, number_fuzzy(level));
pObj->cost = 0;
obj_to_room(pObj, pRoom);
break;
case 'P':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
bug("Reset_room: 'P': bad vnum %d.", pReset->arg1);
continue;
}
if (!(pObjToIndex = get_obj_index(pReset->arg3)))
{
bug("Reset_room: 'P': bad vnum %d.", pReset->arg3);
continue;
}
if (!(LastObj = get_obj_type(pObjToIndex)) || count_obj_list(pObjIndex, LastObj->contains) > 0)
break;
pObj = create_object(pObjIndex, number_fuzzy(level));
obj_to_obj(pObj, LastObj);
/*
* Ensure that the container gets reset. OLC 1.1b
*/
if (LastObj->item_type == ITEM_CONTAINER)
{
LastObj->value[1] = LastObj->pIndexData->value[1];
}
else
{
/* THIS SPACE INTENTIONALLY LEFT BLANK */
}
break;
case 'G':
case 'E':
if (!(pObjIndex = get_obj_index(pReset->arg1)))
{
bug("Reset_room: 'E' or 'G': bad vnum %d.", pReset->arg1);
continue;
}
if (!last)
break;
if (!LastMob)
{
bug("Reset_room: 'E' or 'G': null mob for vnum %d.", pReset->arg1);
last = FALSE;
break;
}
pObj = create_object(pObjIndex, number_fuzzy(level));
obj_to_char(pObj, LastMob);
if (pReset->command == 'E')
equip_char(LastMob, pObj, pReset->arg3);
last = TRUE;
break;
case 'D':
break;
case 'R':
/* OLC 1.1b
if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) )
{
bug( "Reset_room: 'R': bad vnum %d.", pReset->arg1 );
continue;
}
{
EXIT_DATA *pExit;
int d0;
int d1;
for ( d0 = 0; d0 < pReset->arg2 - 1; d0++ )
{
d1 = number_range( d0, pReset->arg2-1 );
pExit = pRoomIndex->exit[d0];
pRoomIndex->exit[d0] = pRoomIndex->exit[d1];
pRoomIndex->exit[d1] = pExit;
}
}
*/
break;
}
}
return;
}
if (pMobIndex->count >= pReset->arg2)
if (pReset->arg1 == 5101) // Is this a guardian guard?
{
if (pMobIndex->count >= fortress[1].guard) // Yes it is! Have we already loaded as many guards as they're allowed to have?
{
last = FALSE; // Yes we have! So we won't load more.
break;
}
}
else if (pMobIndex->count >= pReset->arg2) // No it isn't! So have we reached the reset's limit for this mob?
{
last = FALSE; // Yes we have! So we won't load more.
break;
}
i have 6 guilds on my mud.
im trying to let players buy protectors and soldiers for their guild forts.
i want to set the max reset to 50,
but not let anymore load than are in the array.
the array only has guards and soldiers for each guild.
if a guard dies or a soldier dies it takes one away from the txt file.
if (pReset->arg1 == 5101)
{
if (fortress[1].guard >= pReset->arg2)
{
return;
}
}
this is in create_mobile and load_mobile
this is the vnum of the guardian guild guard but there keep loading 5 when only allowed one. (there are 5 restets atm)
any help would be appreciated
edit: this is on a Godwars:dystopia 1.4 mud btw