/* vi: set ts=4 sw=4 ai: */ /* * ct_clone.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 __CT_CLONE_C__ #define __CT_CLONE_C__ 1 #include <time.h> #include <string.h> #include "define.h" #include "prototypes.h" #include "obj_ur.h" #include "obj_rm.h" #include "obj_sys.h" #include "ct_clone.h" /*** Clone a user in another room ***/ void create_clone(UR_OBJECT user) { UR_OBJECT u; RM_OBJECT rm; char *name; int cnt; set_crash(); if (user->restrict[RESTRICT_CLON]==restrict_string[RESTRICT_CLON]) { write_user(user,">>>You have no right to use this command! Sorry...\n"); return; } /* Check room */ if (word_count<2) rm=user->room; else { if ((rm=get_room(word[1]))==NULL) { write_user(user,nosuchroom); return; } } /* If room is private then nocando */ if (!has_room_access(user,rm)) { write_user(user,"That room is currently private, you cannot create a clone there.\n"); return; } if (rm->transp!=NULL && user->level<ARCH) { write_user(user, "Nemozes si robit klony v transportoch !\n"); return; } /* Count clones and see if user already has a copy there , no point having 2 in the same room */ cnt=0; for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->owner==user) { if (u->room==rm) { vwrite_user(user,"You already have a clone in the %s.\n",rm->name); return; } if ((++cnt==amsys->max_clones) && (user->level<GOD)) { write_user(user,"You already have the maximum number of clones allowed.\n"); return; } } } /* Create clone */ if ((u=create_user())==NULL) { vwrite_user(user,"%s: Unable to create copy.\n",syserror); write_syslog(ERRLOG,1,"Unable to create user copy in clone().\n"); return; } u->type=CLONE_TYPE; u->socket=user->socket; u->room=rm; u->owner=user; u->vis=1; strcpy(u->name,user->name); strcpy(u->recap,u->name); strcpy(u->bw_recap,colour_com_strip(u->recap)); strcpy(u->desc, clone_desc); if (rm==user->room) write_user(user, clone_here_prompt); else vwrite_user(user, clone_prompt, rm->name); if (user->vis) name=user->name; else name=invisname; vwrite_room_except(user->room, user, "~FB~OL%s waves their hands...\n",name); vwrite_room_except(rm, user, "~FB~OLA clone of %s appears in a swirling magical mist!\n",user->bw_recap); } /*** Destroy user clone ***/ void destroy_clone(UR_OBJECT user) { UR_OBJECT u,u2; RM_OBJECT rm; char *name; set_crash(); /* Check room and user */ if (word_count<2) rm=user->room; else { if (!(rm=get_room(word[1]))) { write_user(user,nosuchroom); return; } } if (word_count>2) { if (!(u2=get_user_name(user, word[2]))) { write_user(user,notloggedon); return; } if (u2->level>=user->level) { write_user(user,"You cannot destroy the clone of a user of an equal or higher level.\n"); return; } } else u2=user; for (u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->room==rm && u->owner==u2) { destruct_user(u); reset_access(rm); write_user(user, clone_user_destroy); if (user->vis) name=user->bw_recap; else name=invisname; vwrite_room_except(user->room,user,clone_room_destroy1, name); vwrite_room(rm, clone_room_destroy2, u2->bw_recap); if (u2!=user) vwrite_user(u2,"~OLSYSTEM: ~FR%s has destroyed your clone in the %s.\n",user->bw_recap,rm->name); destructed=0; return; } } if (u2==user) vwrite_user(user,"You do not have a clone in the %s.\n",rm->name); else vwrite_user(user,"%s~RS does not have a clone the %s.\n",u2->recap,rm->name); } /*** Show users own clones ***/ void myclones(UR_OBJECT user) { UR_OBJECT u; int cnt=0; set_crash(); if (user->restrict[RESTRICT_CLON]==restrict_string[RESTRICT_CLON]) { write_user(user,">>>You have no right to use this command! Sorry...\n"); return; } for (u=user_first;u!=NULL;u=u->next) { if (u->type!=CLONE_TYPE || u->owner!=user) continue; if (++cnt==1) write_user(user,"\n~BB*** Rooms you have clones in ***\n\n"); vwrite_user(user," %s\n",u->room->name); } if (!cnt) write_user(user,"You have no clones.\n"); else vwrite_user(user,"\nTotal of ~OL%d~RS clone%s.\n\n",cnt,PLTEXT_S(cnt)); } /*** Show all clones on the system ***/ void allclones(UR_OBJECT user) { UR_OBJECT u; int cnt=0; set_crash(); if (user->restrict[RESTRICT_CLON]==restrict_string[RESTRICT_CLON]) { write_user(user,">>>You have no right to use this command! Sorry...\n"); return; } for(u=user_first;u!=NULL;u=u->next) { if (u->type!=CLONE_TYPE) continue; if (++cnt==1) vwrite_user(user,"\n~BB*** Current clones %s ***\n\n",long_date(1)); vwrite_user(user, all_clone_style,u->name,u->room->name); } if (!cnt) write_user(user,"There are no clones on the system.\n"); else vwrite_user(user,"\nTotal of ~OL%d~RS clone%s.\n\n",cnt,PLTEXT_S(cnt)); } /*** User swaps places with his own clone. All we do is swap the rooms the objects are in. ***/ void clone_switch(UR_OBJECT user) { UR_OBJECT u,tu=NULL; RM_OBJECT rm=NULL; int cnt=0; set_crash(); /* if no room was given then check to see how many clones user has. If 1, then move the user to that clone, else give an error */ if (word_count<2) { for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->owner==user) { if (++cnt>1) { write_user(user,"You have more than one clone active. Please specify a room to switch to.\n"); return; } rm=u->room; tu=u; } } if (!cnt) { write_user(user,"You do not currently have any active clones.\n"); return; } write_user(user, clone_switch_prompt); tu->room=user->room; user->room=rm; vwrite_room_except(user->room,user,"The clone of %s~RS comes alive!\n",user->recap); vwrite_room_except(tu->room,tu,"%s~RS turns into a clone!\n",tu->recap); look(user); return; } /* if a room name was given then try to switch to a clone there */ if ((rm=get_room(word[1]))==NULL) { write_user(user,nosuchroom); return; } for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->room==rm && u->owner==user) { write_user(user, clone_switch_prompt); u->room=user->room; user->room=rm; vwrite_room_except(user->room,user,"The clone of %s comes alive!\n",u->name); vwrite_room_except(u->room,u,"%s~RS turns into a clone!\n",u->recap); look(user); return; } } write_user(user,"You do not have a clone in that room.\n"); } /*** Make a clone speak ***/ void clone_say(UR_OBJECT user, char *inpstr) { RM_OBJECT rm; UR_OBJECT u; set_crash(); if (user->muzzled) { write_user(user,"You are muzzled, your clone cannot speak.\n"); return; } if (word_count<3) { write_usage(user,"csay <room clone is in> <message>"); return; } if ((rm=get_room(word[1]))==NULL) { write_user(user,nosuchroom); return; } for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->room==rm && u->owner==user) { say(u,remove_first(inpstr)); return; } } write_user(user,"You do not have a clone in that room.\n"); } /*** Set what a clone will hear, either all speach , just bad language or nothing. ***/ void clone_hear(UR_OBJECT user) { RM_OBJECT rm; UR_OBJECT u; set_crash(); if (word_count<3 || (strcmp(word[2],"all") && strcmp(word[2],"swears") && strcmp(word[2],"nothing"))) { write_usage(user,"chear <room clone is in> all/swears/nothing"); return; } if ((rm=get_room(word[1]))==NULL) { write_user(user,nosuchroom); return; } for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->room==rm && u->owner==user) break; } if (u==NULL) { write_user(user,"You do not have a clone in that room.\n"); return; } strtolower(word[2]); if (!strcmp(word[2],"all")) { u->clone_hear=CLONE_HEAR_ALL; write_user(user,"Clone will now hear everything.\n"); return; } if (!strcmp(word[2],"swears")) { u->clone_hear=CLONE_HEAR_SWEARS; write_user(user,"Clone will now only hear swearing.\n"); return; } u->clone_hear=CLONE_HEAR_NOTHING; write_user(user,"Clone will now hear nothing.\n"); } /*** Make a clone emote ***/ void clone_emote(UR_OBJECT user,char *inpstr) { RM_OBJECT rm; UR_OBJECT u; set_crash(); if (user->muzzled>1) { write_user(user,"You are muzzled, your clone cannot emote.\n"); return; } if (word_count<3) { write_usage(user,"cemote <room clone is in> <message>"); return; } if ((rm=get_room(word[1]))==NULL) { write_user(user,nosuchroom); return; } for(u=user_first;u!=NULL;u=u->next) { if (u->type==CLONE_TYPE && u->room==rm && u->owner==user) { emote(u,remove_first(inpstr)); return; } } write_user(user,"You do not have a clone in that room.\n"); } #endif /* __CT_CLONE_C__ */