/* 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__ */