/**************************************************************
* FFTacticsMUD : update.cpp *
**************************************************************
* (c) 2002 Damien Dailidenas (Trenton). All rights reserved. *
**************************************************************/
#include "main.h"
void idle_update args(());
void logout_update args(());
void battle_update() {
CH *ch, *ch_next;
STATUS *status, *status_next;
for(BATTLE *battle = battle_list, *battle_next; battle; battle = battle_next) {
battle_next = battle->next;
if(battle->turn)
continue;
for(ch = battle->people; ch; ch = ch->next_in_battle)
if(ch->CT >= 100)
goto CR_phase;
/****************
* <do> *
* S+ phase *
* SR phase *
* C+ phase *
* CR phase *
* Status Check *
* <loop> *
****************/
/************
* S+ phase *
************/
for(ch = battle->people; ch; ch = ch->next_in_battle)
if(ch->action.ctr)
--ch->action.ctr;
/************
* SR phase *
************/
for(ch = battle->people; ch; ch = ch_next) {
ch_next = ch->next_in_battle;
if(ch->action.action && !ch->action.ctr) {
ch->resolve_action();
if(!battle)
return;
}
}
/**********************
* Status Check phase *
**********************/
for(ch = battle->people; ch; ch = ch->next_in_battle) {
for(status = ch->status_list; status; status = status_next) {
status_next = status->next;
if(!--status->ctr)
ch->remove(status, true);
}
}
/************
* C+ phase *
************/
for(ch = battle->people; ch; ch = ch->next_in_battle)
ch->CT += ch->Sp;
/************
* CR phase *
************/
CR_phase:
for(ch = battle->people; ch; ch = ch->next_in_battle) {
if(ch->CT >= 100) {
if(ch->status(status_dead)) {
ch->CT = 0;
ch->status_update();
continue;
}
battle->turn = ch;
battle->echo(ch->name + "'s turn.\n\r");
ch->cancel(status_defending, false);
if(ch->npc)
ch->npc_turn();
else {
ch->commands = "move act wait";
ch->printf("{^MOVE, ACT, or WAIT?{0\n\r");
}
break;
}
}
if(!battle)
continue;
}
return;
}
void update_handler() {
static int pulse_point;
static int pulse_battle;
if(--pulse_point <= 0) {
pulse_point = PULSE_TICK;
idle_update();
logout_update();
}
if(--pulse_battle <= 0) {
pulse_battle = PULSE_BATTLE;
battle_update();
}
return;
}
void idle_update() {
for(CH *ch = ch_list; ch; ch = ch->next) {
if(ch->npc)
continue;
++ch->timer, ++ch->mins_total, ++ch->mins_login;
if(ch->mins_login % 10 == 0)
ch->save();
}
return;
}
void logout_update() {
for(CH *ch = ch_list, *ch_next = NULL; ch; ch = ch_next) {
ch_next = ch->next;
if((!ch->npc && !ch->desc) || (!ch->npc && !ch->admin && ch->timer > 10))
do_quit(ch);
}
for(DESC *d = desc_list, *d_next = NULL; d; d = d_next) {
d_next = d->next;
if(d->connected == CON_GET_NAME && ++d->timer > 1)
d->close_socket();
}
return;
}