/* vi: set ts=4 sw=4 ai: */
/*
* transport.c
*
* Lotos v1.2.3 : (c) 1999-2003 Pavol Hluchy (Lopo)
* last update : 30.1.2003
* email : lotos@losys.sk
* homepage : lotos.losys.sk
*/
#ifndef __TRANSPORT_C__
#define __TRANSPORT_C__ 1
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include "define.h"
#include "prototypes.h"
#include "obj_ur.h"
#include "obj_rm.h"
#include "obj_tr.h"
#ifdef NETLINKS
#include "obj_nl.h"
#endif
#include "obj_sys.h"
#include "transport.h"
#include "comvals.h"
TR_OBJECT create_transport(void)
{
TR_OBJECT tr;
set_crash();
if ((tr=(TR_OBJECT)malloc(sizeof(struct transport_struct)))==NULL) {
fprintf(stderr, "Lotos: Memory allocation failure in create_transport().\n");
boot_exit(1);
}
if (transport_first==NULL) {
transport_first=tr;
tr->prev=NULL;
}
else {
transport_last->next=tr;
tr->prev=transport_last;
}
tr->next=NULL;
transport_last=tr;
tr->place=tr->route=0;
tr->out=tr->go=tr->smer=0;
tr->time=0;
tr->room=NULL;
return tr;
}
void destruct_transport(TR_OBJECT tr)
{
set_crash();
if (tr==transport_first) {
transport_first=tr->next;
if (tr==transport_last) transport_last=NULL;
else transport_first->prev=NULL;
}
else {
tr->prev->next=tr->next;
if (tr==transport_last) {
transport_last=tr->prev;
transport_last->next=NULL;
}
else tr->next->prev=tr->prev;
}
free(tr);
}
void transport_plane(UR_OBJECT user)
{
RM_OBJECT rm;
TR_OBJECT tr=user->room->transp;
int i;
set_crash();
if (word_count<2){
if (tr==NULL) {
write_usage(user,"tplan <name>/all");
return;
}
vwrite_user(user, "Transport name: %s\n", tr->room->name);
vwrite_user(user, "na zastavke stoji: %d sek.\n", tr->place);
vwrite_user(user, "cas trvania cesty: %d sek.\n", tr->route);
write_user(user, "akt. stav:\n");
if (tr->go) {
write_user(user, "~FRna ceste\n");
vwrite_user(user, "zastavi za %d sek. v roome %s\n",
((tr->route-tr->time)>=0) ? (tr->route-tr->time) : 0,
((tr->room->link[tr->out+tr->smer])!=NULL) ? tr->room->link[tr->out+tr->smer]->name : tr->room->link[tr->out-tr->smer]->name
);
}
else {
vwrite_user(user, "stoji na zastavke %s este %d sek.\n",
tr->room->link[tr->out]->name,
((tr->place-tr->time)>=0) ? (tr->place-tr->time) : 0
);
}
return;
}
if (strcmp(word[1], "all")) {
if ((rm=get_room(word[1]))==NULL) {
write_user(user, nosuchtr);
return;
}
tr=rm->transp;
if (tr==NULL) {
write_user(user, nosuchtr);
return;
}
vwrite_user(user, "Transport name: %s\n", tr->room->name);
vwrite_user(user, "na zastavke stoji: %d sek.\n", tr->place);
vwrite_user(user, "cas trvania cesty: %d sek.\n", tr->route);
write_user(user, "akt. stav:\n");
if (tr->go) {
write_user(user, "~FRna ceste\n");
vwrite_user(user, "zastavi za %d sek. v roome %s\n",
((tr->route-tr->time)>=0) ? (tr->route-tr->time) : 0,
((tr->room->link[tr->out+tr->smer])!=NULL) ? tr->room->link[tr->out+tr->smer]->name : tr->room->link[tr->out-tr->smer]->name
);
}
else {
vwrite_user(user, "stoji na zastavke %s este %d sek.\n",
tr->room->link[tr->out]->name,
((tr->place-tr->time)>=0) ? (tr->place-tr->time) : 0
);
}
}
else {
write_user(user, "Transport name : place route zastavky\n");
for (tr=transport_first; tr!=NULL; tr=tr->next) {
vwrite_user(user, "%-20s : %3d %3d ", tr->room->name, tr->place, tr->route);
for (i=0; tr->room->link[i]!=NULL; i++) {
if (tr->room->link[i]==NULL) break;
if (!tr->go && tr->out==i)
vwrite_user(user, " ~OL~FG%s~RS", tr->room->link[i]->label);
else
vwrite_user(user, " %s", tr->room->link[i]->label);
}
write_user(user, "\n");
}
write_user(user, "\n");
}
}
void write_transport_except(TR_OBJECT tr, char *str, UR_OBJECT user)
{
UR_OBJECT u;
set_crash();
for (u=user_first; u!=NULL; u=u->next) {
if (u->room) if (u->room->transp==NULL) continue;
if (u->login
|| u->room!=tr->room
|| (u->ignore.all && !force_listen)
|| u->ignore.transp
|| u->misc_op
|| u->set_op
|| u->type==CLONE_TYPE
|| u==user)
continue;
if (u->type==CLONE_TYPE) {
if (u->clone_hear==CLONE_HEAR_NOTHING || u->owner->ignore.all) continue;
/* Ignore anything not in clones room, eg shouts,
system messages and semotes since the clones owner
will hear them anyway. */
if (u->clone_hear==CLONE_HEAR_SWEARS && !contains_swearing(str)) continue;
vwrite_user(user->owner, "~FT[ %s ]:~RS %s",u->room->name,str);
}
else write_user(u,str);
} /* end for */
}
void write_transport(TR_OBJECT tr, char *str)
{
set_crash();
write_transport_except(tr, str, NULL);
}
void transport(void)
{
UR_OBJECT u;
TR_OBJECT tr=transport_first;
int tmp;
set_crash();
for (tr=transport_first; tr!=NULL; tr=tr->next) {
tr->time+=amsys->heartbeat;
if ((tr->time>=tr->route && tr->go) || (tr->time>=tr->place && !tr->go)) {
tr->go=!tr->go;
tr->time=0;
}
else continue;
if (!tr->go) {
if (tr->out+tr->smer>MAX_LINKS
|| tr->out+tr->smer<0)
tr->smer*=(-1);
else if (tr->room->link[tr->out+tr->smer]==NULL)
tr->smer*=(-1);
tr->out+=tr->smer;
for (u=user_first; u!=NULL; u=u->next) {
if (u->ignore.all
|| u->ignore.transp
|| u->misc_op
|| u->set_op
|| u->login
|| u->type==CLONE_TYPE
|| u->room!=tr->room->link[tr->out]) continue;
else vwrite_user(u, "~OLPrisiel transport '%s', mozes nastupit.\n", tr->room->name);
}
sprintf(text, "~OLTransport sa zastavil na zastavke '%s', mozes vystupit\n", tr->room->link[tr->out]->name);
write_transport(tr, text);
}
else {
for (u=user_first; u!=NULL; u=u->next) {
if (!u->ignore.all
&& !u->ignore.transp
&& !u->login
&& !u->misc_op
&& !u->set_op
&& u->type!=CLONE_TYPE
&& u->room==tr->room->link[tr->out]
) {
vwrite_user(u, "~OLTransport '%s' odisiel\n", tr->room->name);
}
}
if (tr->out+tr->smer>MAX_LINKS
|| tr->out+tr->smer<0)
tmp=tr->out-tr->smer;
else if (tr->room->link[tmp=tr->out+tr->smer]==NULL)
tmp=tr->out-tr->smer;
else tmp=tr->out+tr->smer;
sprintf(text, "~OLTransport sa pohol, nasledujuca zastavka je '%s'\n", tr->room->link[tmp]->name);
write_transport(tr, text);
} /* end else go */
} /* end for tr */
}
#endif /* __TRANSPORT_C__ */