/* ******************************************************************** * * FILE : assedit.c Copyright (C) 1999 Del Minturn * * USAGE: Olc for assembly engine by Geoff Davis. * * Oasis OLC by George Greer. * -------------------------------------------------------------------- * * 1999 July 25 caminturn@earthlink.net * * ******************************************************************** */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "db.h" #include "comm.h" #include "handler.h" #include "interpreter.h" /* #include "olc.h" */ #include "oasis.h" #include "assemblies.h" /*-------------------------------------------------------------------* * External data structures. *-------------------------------------------------------------------*/ extern struct descriptor_data *descriptor_list; extern struct obj_data *obj_proto; extern const char *AssemblyTypes[]; /*-------------------------------------------------------------------* * Function prototypes. *-------------------------------------------------------------------*/ void assedit_setup(struct descriptor_data *d, int number); void assedit_disp_menu(struct descriptor_data *d); void assedit_delete(struct descriptor_data *d); void assedit_edit_extract(struct descriptor_data *d); void assedit_edit_inroom(struct descriptor_data *d); void nodigit(struct descriptor_data *d); /*-------------------------------------------------------------------* * Nasty internal macros to clean up the code. *-------------------------------------------------------------------*/ long lRnum = 0; /*-------------------------------------------------------------------* * Assedit command *-------------------------------------------------------------------*/ ACMD (do_assedit) { struct descriptor_data *d = ch->desc; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; *buf = '\0'; /* If I run into problems then take this sucker out */ *buf2 = '\0'; if (IS_NPC(ch)) return; if (GET_LEVEL(ch) < LVL_IMPL) send_to_char(ch, "You do not have permission to do that.\r\n"); for (d = descriptor_list; d; d = d->next) { if (d->connected == CON_ASSEDIT) { send_to_char(ch, "Assemblies are already being editted by someone.\r\n"); return; } } two_arguments(argument, buf, buf2); d= ch->desc; if(!*buf) { nodigit(d); return; } if (!isdigit(*buf)) { if (strn_cmp("new", buf, 3) == 0) { if(!isdigit(*buf2)) nodigit(d); else { assemblyCreate(atoi(buf2), 0); send_to_char(d->character, "Assembly Created.\r\n"); assemblySaveAssemblies(); return; } } else if (strn_cmp("delete", buf, 6) == 0) { if (!isdigit(*buf2)) nodigit(d); else { assemblyDestroy(atoi(buf2)); send_to_char(d->character, "Assembly Deleted.\r\n"); assemblySaveAssemblies(); return; } } else { nodigit(d); return; } } else if (isdigit(*buf)) { d = ch->desc; CREATE (d->olc, struct oasis_olc_data, 1); assedit_setup(d, atoi(buf)); } return; } /*-------------------------------------------------------------------* * Assedit Functions *-------------------------------------------------------------------*/ void assedit_setup(struct descriptor_data *d, int number) { ASSEMBLY *pOldAssembly = NULL; CREATE(OLC_ASSEDIT(d), ASSEMBLY, 1 ); if( (pOldAssembly = assemblyGetAssemblyPtr( number )) == NULL ) { send_to_char(d->character, "That assembly does not exist\r\n"); cleanup_olc(d, CLEANUP_ALL); return; } else { /* Copy the old assembly. */ OLC_ASSEDIT(d)->lVnum = pOldAssembly->lVnum; OLC_ASSEDIT(d)->uchAssemblyType = pOldAssembly->uchAssemblyType; OLC_ASSEDIT(d)->lNumComponents = pOldAssembly->lNumComponents; if( OLC_ASSEDIT(d)->lNumComponents > 0 ) { CREATE(OLC_ASSEDIT(d)->pComponents, COMPONENT, OLC_ASSEDIT(d)->lNumComponents); memmove(OLC_ASSEDIT(d)->pComponents, pOldAssembly->pComponents, OLC_ASSEDIT(d)->lNumComponents * sizeof( COMPONENT ) ); } } /* * At this point, pNewAssembly is now the address of a freshly allocated copy of all * the data contained in the original assembly structure. */ if ( (lRnum = real_object( OLC_ASSEDIT(d)->lVnum ) ) < 0) { send_to_char(d->character, "Assembled item may not exist, check the vnum and assembles (show assemblies). \r\n"); cleanup_olc(d, CLEANUP_ALL); /* for right now we just get out! */ return; } STATE(d) = CON_ASSEDIT; act("$n starts using OLC.", TRUE, d->character, 0, 0, TO_ROOM); SET_BIT_AR(PLR_FLAGS(d->character), PLR_WRITING); assedit_disp_menu(d); } void assedit_disp_menu(struct descriptor_data *d) { int i = 0; extern const char *AssemblyTypes[]; char buf[MAX_STRING_LENGTH]; char szAssmType[MAX_INPUT_LENGTH] = { '\0' }; get_char_colors(d->character); sprinttype(OLC_ASSEDIT(d)->uchAssemblyType, AssemblyTypes, szAssmType, sizeof(szAssmType)); #if defined(CLEAR_SCREEN) sprintf(buf, "%c[H%c[J", 27, 27); send_to_char(d->character, buf); #endif sprintf(buf, "Assembly Number:%s %ld %s\r\n" "Assembly Name :%s %s %s \r\n" "Assembly Type :%s %s %s\r\n" "Components:\r\n", yel, OLC_ASSEDIT(d)->lVnum, nrm, yel, obj_proto[ real_object(OLC_ASSEDIT(d)->lVnum) ].short_description, nrm, yel, szAssmType, nrm ); send_to_char(d->character, buf); if(OLC_ASSEDIT(d)->lNumComponents <= 0) send_to_char(d->character, " < NONE > \r\n"); else { for( i = 0; i < OLC_ASSEDIT(d)->lNumComponents; i++ ) { if ( (lRnum = real_object(OLC_ASSEDIT(d)->pComponents[i].lVnum)) < 0) { sprintf(buf, "%s %d%s) %s ERROR --- Contact an Implimentor %s\r\n ", grn, i+1, nrm, yel, nrm ); } else { sprintf(buf, "%s %d%s) [%5ld] %-20.20s In room:%s %-3.3s %s Extract:%s %-3.3s%s \r\n", grn, i+1, nrm, OLC_ASSEDIT(d)->pComponents[i].lVnum, obj_proto[ lRnum ].short_description, yel, (OLC_ASSEDIT(d)->pComponents[ i ].bInRoom ? "Yes" : "No"), nrm, yel, (OLC_ASSEDIT(d)->pComponents[ i ].bExtract ? "Yes" : "No"), nrm ); } send_to_char(d->character, buf); } } sprintf(buf, "%sA%s) Add a new component.\r\n" "%sE%s) Edit a component.\r\n" "%sD%s) Delete a component.\r\n" "%sT%s) Change Assembly Type.\r\n" "%sQ%s) Quit.\r\n" "\r\nEnter your choice : ", grn, nrm, grn, nrm, grn, nrm, grn, nrm, grn, nrm ); send_to_char(d->character, buf); OLC_MODE(d) = ASSEDIT_MAIN_MENU; return; } /*************************************************** Command Parse ***************************************************/ void assedit_parse(struct descriptor_data *d, char *arg) { int pos = 0, i = 0, counter, columns = 0; char buf[MAX_STRING_LENGTH]; COMPONENT *pTComponents = NULL; switch (OLC_MODE(d)) { case ASSEDIT_MAIN_MENU: switch (*arg) { case 'q': case 'Q': /* do the quit stuff */ /* Ok, Time to save it back to the original stuff and get out */ /* due to the infrequent use of this code and restricted use */ /* I decided to copy over changes regarless. */ assemblyDestroy(OLC_ASSEDIT(d)->lVnum); assemblyCreate(OLC_ASSEDIT(d)->lVnum, OLC_ASSEDIT(d)->uchAssemblyType); for( i = 0; i < OLC_ASSEDIT(d)->lNumComponents; i++) { assemblyAddComponent(OLC_ASSEDIT(d)->lVnum, OLC_ASSEDIT(d)->pComponents[i].lVnum, OLC_ASSEDIT(d)->pComponents[i].bExtract, OLC_ASSEDIT(d)->pComponents[i].bInRoom ); } send_to_char(d->character, "\r\nSaving all assemblies\r\n"); assemblySaveAssemblies(); /* free(pTComponents); free(OLC_ASSEDIT(d)); */ cleanup_olc(d, CLEANUP_ALL); /* for right now we just get out! */ break; case 't': case 'T': get_char_colors(d->character); #if defined(CLEAR_SCREEN) sprintf(buf, "%c[H%c[J", 27, 27); send_to_char(d->character, buf); #endif for (counter = 0; counter < MAX_ASSM; counter++) { sprintf(buf, "%s%2d%s) %-20.20s %s", grn, counter + 1, nrm, AssemblyTypes[counter], !(++columns % 2) ? "\r\n" : ""); send_to_char(d->character, buf); } send_to_char(d->character, "Enter the assembly type : "); OLC_MODE(d) = ASSEDIT_EDIT_TYPES; break; case 'a': case 'A': /* add a new component */ send_to_char(d->character, "\r\nWhat is the vnum of the new component?"); OLC_MODE(d) = ASSEDIT_ADD_COMPONENT; break; case 'e': case 'E': /* edit a component */ send_to_char(d->character, "\r\nEdit which component? "); OLC_MODE(d) = ASSEDIT_EDIT_COMPONENT; break; case 'd': case 'D': /* delete a component */ if ((pos < 0) || pos > OLC_ASSEDIT(d)->lNumComponents) { send_to_char(d->character, "\r\nWhich component do you wish to remove?"); assedit_disp_menu(d); } else { send_to_char(d->character, "\r\nWhich component do you wish to remove?"); OLC_MODE(d) = ASSEDIT_DELETE_COMPONENT; } break; default: assedit_disp_menu(d); } break; case ASSEDIT_EDIT_TYPES: if (isdigit(*arg)){ pos = atoi(arg) - 1; if( (pos >= 0) || (pos < MAX_ASSM)) { OLC_ASSEDIT(d)->uchAssemblyType = pos; assedit_disp_menu(d); break; } } else assedit_disp_menu(d); break; case ASSEDIT_ADD_COMPONENT: /* add a new component */ if (isdigit(*arg)){ pos = atoi(arg); if ((real_object(pos)) < 0) /* does the object exist? */ break; for ( i = 0; i < OLC_ASSEDIT(d)->lNumComponents; i++) { if(OLC_ASSEDIT(d)->pComponents[i].lVnum == pos) break; } CREATE( pTComponents, COMPONENT, OLC_ASSEDIT(d)->lNumComponents + 1); if(OLC_ASSEDIT(d)->pComponents != NULL) { /* Copy from olc to temp */ memmove(pTComponents, OLC_ASSEDIT(d)->pComponents, OLC_ASSEDIT(d)->lNumComponents * sizeof(COMPONENT) ); /* free(OLC_ASSEDIT(d)->pComponents); */ } OLC_ASSEDIT(d)->pComponents = pTComponents; OLC_ASSEDIT(d)->pComponents[ OLC_ASSEDIT(d)->lNumComponents ].lVnum = pos; OLC_ASSEDIT(d)->pComponents[ OLC_ASSEDIT(d)->lNumComponents ].bExtract = YES; OLC_ASSEDIT(d)->pComponents[ OLC_ASSEDIT(d)->lNumComponents ].bInRoom = NO; OLC_ASSEDIT(d)->lNumComponents += 1; assedit_disp_menu(d); } else { send_to_char(d->character, "That object does not exist. Please try again\r\n"); assedit_disp_menu(d); } break; case ASSEDIT_EDIT_COMPONENT: pos = atoi(arg); if (isdigit(*arg)) { pos--; OLC_VAL(d) = pos; assedit_edit_extract(d); break; } else assedit_disp_menu(d); break; case ASSEDIT_DELETE_COMPONENT: if (isdigit(*arg)) { pos = atoi(arg); pos -= 1; CREATE( pTComponents, COMPONENT, OLC_ASSEDIT(d)->lNumComponents -1); if( pos > 0 ) memmove( pTComponents, OLC_ASSEDIT(d)->pComponents, pos * sizeof( COMPONENT ) ); if( pos < OLC_ASSEDIT(d)->lNumComponents - 1 ) memmove( pTComponents + pos, OLC_ASSEDIT(d)->pComponents + pos + 1, (OLC_ASSEDIT(d)->lNumComponents - pos - 1) * sizeof(COMPONENT) ); free(OLC_ASSEDIT(d)->pComponents ); OLC_ASSEDIT(d)->pComponents = pTComponents; OLC_ASSEDIT(d)->lNumComponents -= 1; assedit_disp_menu(d); break; } else assedit_disp_menu(d); break; case ASSEDIT_EDIT_EXTRACT: switch (*arg) { case 'y': case 'Y': OLC_ASSEDIT(d)->pComponents[ OLC_VAL(d) ].bExtract = TRUE; assedit_edit_inroom(d); break; case 'n': case 'N': OLC_ASSEDIT(d)->pComponents[ OLC_VAL(d) ].bExtract = FALSE; assedit_edit_inroom(d); break; default: send_to_char(d->character, "Is the item to be extracted when the assembly is created? (Y/N)"); break; } break; case ASSEDIT_EDIT_INROOM: switch (*arg) { case 'y': case 'Y': OLC_ASSEDIT(d)->pComponents[ OLC_VAL(d) ].bInRoom = TRUE; assedit_disp_menu(d); break; case 'n': case 'N': OLC_ASSEDIT(d)->pComponents[ OLC_VAL(d) ].bInRoom = FALSE; assedit_disp_menu(d); break; default: send_to_char(d->character, "Object in the room when assembly is created? (n = in inventory):"); break; } break; default: /* default for whole assedit parse function */ /* we should never get here */ mudlog(BRF, LVL_GOD, TRUE, "SYSERR: OLC assedit_parse(): Reached default case!"); send_to_char(d->character, "Opps...\r\n"); STATE(d) = CON_PLAYING; break; } } /* End of Assedit Parse */ void assedit_delete(struct descriptor_data *d) { send_to_char(d->character, "Which item number do you wish to delete from this assembly?"); OLC_MODE(d) = ASSEDIT_DELETE_COMPONENT; return; } void assedit_edit_extract(struct descriptor_data *d) { send_to_char(d->character, "Is the item to be extracted when the assembly is created? (Y/N):"); OLC_MODE(d) = ASSEDIT_EDIT_EXTRACT; return; } void assedit_edit_inroom(struct descriptor_data *d) { send_to_char(d->character, "Should the object be in the room when assembly is created (n = in inventory)?"); OLC_MODE(d) = ASSEDIT_EDIT_INROOM; return; } void nodigit(struct descriptor_data *d) { send_to_char(d->character, "Usage: assedit <vnum>\r\n"); send_to_char(d->character, " : assedit new <vnum>\r\n"); send_to_char(d->character, " : assedit delete <vnum>\r\n"); return; }