/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project. All
................................................ contributions are welcome.
....Copyright(C).1995.Melvin.Smith.............. Enjoy.
------------------------------------------------------------------------------
Melvin Smith (aka Fusion) msmith@falcon.mercer.peachnet.edu
MUD++ development mailing list mudpp-list@spice.com
------------------------------------------------------------------------------
pulse.cc
*/
#include "string.h"
#include "llist.h"
#include "room.h"
#include "indexable.h"
#include "area.h"
#include "pc.h"
#include "npc.h"
#include "object.h"
#include "env.h"
#include "global.h"
Environment envir;
const int PULSE_NPC = 8;
const int PULSE_OBJ = 8;
const int PULSE_PC = 8;
const int PULSE_COMBAT = 3;
const int PULSE_UPDATE = 45;
void pulseArea();
void pulsePC();
void pulseNPC();
void pulseObj();
void pulseCombat();
// Heartbeat of the game.
// This is what makes the MUD run.
void heartbeat()
{
static int combat_timer = PULSE_COMBAT;
static int npc_timer = PULSE_NPC;
static int obj_timer = PULSE_OBJ;
static int pc_timer = PULSE_PC;
static int update_timer = PULSE_UPDATE;
if( ! combat_timer-- )
{
pulseCombat();
combat_timer = PULSE_COMBAT;
}
if( ! npc_timer-- )
{
pulseNPC();
npc_timer = PULSE_NPC;
}
if( ! obj_timer-- )
{
pulseObj();
obj_timer = PULSE_OBJ;
}
if( ! pc_timer-- )
{
pulsePC();
pc_timer = PULSE_PC;
}
if( ! update_timer-- )
{
envir.update();
pulseArea();
update_timer = PULSE_UPDATE;
}
}
void pulseArea()
{
Area * area;
areas.reset();
while( ( area = areas.peek() ) )
{
areas.next();
area->tick();
}
}
void pulsePC()
{
PC *pc;
LList<PC> tlist = pcs;
tlist.reset();
while( ( pc = tlist.peek() ) )
{
pc->pulse();
tlist.next();
}
}
void pulseNPC()
{
NPC *npc;
LList<NPC> tlist = npcs;
tlist.reset();
while( ( npc = tlist.peek() ) )
{
tlist.next();
if( randgen.get( 0, 4 ) )
continue;
npc->moveDir( randgen.get( 0, 5 ) );
}
}
void pulseObj()
{
Object *obj;
objects.reset();
while( ( obj = objects.peek() ) )
{
if( obj->getTimer() )
{
if( obj->tick() )
{
objects.next();
continue;
}
if( obj->inRoom() )
{
obj->inRoom()->out( obj->getShort() );
obj->inRoom()->out( " decays into dust.\n\r" );
if( obj->getType() == ITEM_CORPSE )
{
obj->setName( "pile bones" );
obj->setShort( "a pile of old bones" );
obj->setLong( "A pile of old bones is here." );
objects.next();
continue;
}
obj->fromRoom();
}
else if( obj->carriedBy() )
{
obj->carriedBy()->out( obj->getShort() );
obj->carriedBy()->out( " crumbles in your hands.\n\r" );
obj->fromChar();
}
// call to remove expects obj to be current.
// after remove current points to the next node so no ++
objects.remove();
delete obj;
}
else
{
objects.next();
}
}
}
void pulseCombat()
{
Char *ch;
Char *vict;
// Run through npc list first
npcs.reset();
while( ( ch = npcs.peek() ) )
{
npcs.next();
vict = ch->getFighting();
if( !vict )
continue;
ch->attack( vict, -1 );
}
pcs.reset();
while( ( ch = pcs.peek() ) )
{
pcs.next();
vict = ch->getFighting();
if( !vict )
continue;
ch->attack( vict, -1 );
}
}