/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ABERED (AberMUD Dirt3 editor) * * * * The file contains all the commands directly to do with mobiles, * * displaying their statistics, listing them, editing them but not putting * * them in their rooms, since lookin() is a loc.c function. * * * * Copyright (C) 1993 James Willie. All rights reseved. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include <stdio.h> #include <ctype.h> #include "types.h" #include "macros.h" #include "extern.h" #include "prototyp.h" extern char *Mob_tab[]; /* ** Lists the mobiles in the editor */ void list_mob() { PMOB m = mob; PLOC l; int i = 0; printf("Name Title(Pname) Location\n"); while (m != NULL) { l = (PLOC)m->loc; printf("%-16s%-24s",m->name, m->pname); if (l == NULL) printf("%s*\n",m->locname); else printf("%s\n",l->name); m = m->next; i++; } printf("\nTotal = %d\n", i); nummob = i; return; } /* ** Find mobiles by name, and by title ** Unlike aber mud, it does NOT match the last word of the pname(title) */ PMOB fmobile(s) char *s; { PMOB m = mob, t = NULL; while (m != NULL) { if (EQ(m->name, s)) return m; if (EQ(m->pname, s)) { if (myloc == m->loc) return m; else if (t == NULL) t = m; } m = m->next; } return t; } /* ** mstat will show a mobiles stats if it exists. */ void mstat(s) char *s; { PMOB m; m = fmobile(s); if (m == NULL) { printf("Don't know that mobile\n"); return; } write_dirt_mob(m,stdout); return; } /* ** Fix location of mobiles after all things have been read in. */ void fix_mobs() { PMOB m = mob; while (m != NULL) { if (m->locname == NULL) { printf("Error: mobile %s does not have a location?\n", m->pname); } else { m->loc = flbname(m->locname); } m = m->next; } return; } /* ** Set/Show the mflags, pflags or slfags on a mobile */ void mob_flags(n) int n; { int k, Num; PMOB m = NULL; char **tab; Bool *flg; if (EMPTY(arg[0])) { printf("flags for what mobile?\n"); return; } if ((m = fmobile(arg[0])) == NULL) { printf("No such mobile, sorry.\n"); return; } switch(n) { case 1: tab = s_flags; Num = NUM_SFLAGS; flg = m->sflags; break; case 2: tab = m_flags; Num = NUM_MFLAGS; flg = m->mflags; break; case 3: tab = p_flags; Num = NUM_PFLAGS; flg = m->pflags; break; default: printf("Unknown flags\n"); return; break; } if (EMPTY(arg[1])) { for (k = 0; k < Num; k++) { if (flg[k] == TRUE) { printf("%s ",tab[k]); } } printf("\n"); return; } k = lookup(tab, arg[1]); if (k < 0) { printf("No such flag\n"); return; } if (EMPTY(arg[2])) { printf("%s:Flag %s",arg[0], tab[k]); if (flg[k] == TRUE) printf(" is true.\n"); else printf(" is false.\n"); } else if (ABREV_EQ("TRUE",arg[2])) { flg[k] = TRUE; modified = TRUE; } else if (ABREV_EQ("FALSE",arg[2])) { flg[k] = FALSE; modified = TRUE; } else printf("Set it TRUE or FALSE?\n"); return; } /* ** The main function involved with editing mobiles */ void mset() { PMOB m; int v = 0, i, status, q = 0; char s[MAX_COM+1]; char *t = NULL, *p = NULL; if (EMPTY(arg[0]) || EMPTY(arg[1])) { printf("medit what?\n"); return; } m = fmobile(arg[0]); if (m == NULL) { printf("No mobile called %s.\n",arg[0]); return; } if (verbose) write_dirt_mob(m,stdout); i = lookup(Mob_tab, arg[1]); if (EMPTY(arg[2])) { switch(i) { case MOB_NAME: printf("Enter the new name(One word):"); get_word(s,stdin); NEWLINE(stdin); t = COPY(s); break; case MOB_LOC: printf("Enter the new location(One word):"); get_word(s,stdin); NEWLINE(stdin); t = COPY(s); break; case MOB_PNAME: printf("Enter the new title on one line.\n"); t = get_text(stdin, '\n'); break; case MOB_DESC: printf("Enter the new description. Hit return when done.\n"); t = get_text(stdin, '\n'); break; #ifdef IBM_MLJ_EDIT case MOB_EXAM: set_header("Mobile examine text editor."); t = edit_string(m->exam, 1); break; #else case MOB_EXAM: printf("\nEnter the text and finish with ^<CR>\n"); t = get_text(stdin,'^'); NEWLINE(stdin); break; #endif case MOB_DAM: q = m->damage; p = Mob_tab[i]; break; case MOB_ARMOR: q = m->armor; p = Mob_tab[i]; break; case MOB_AGG: q = m->agg; p = Mob_tab[i]; break; case MOB_SPEED: q = m->speed; p = Mob_tab[i]; break; case MOB_STR: q = m->hp; p = Mob_tab[i]; break; default: break; } if (p != NULL) { printf("Enter new %s->%s[%d]:", m->name, p, q); v = get_int(stdin, &status); printf("\n"); NEWLINE(stdin); if (status > 0) { printf("Value unchanged\n"); return; } } } else { t = COPY(arg[2]); v = atoi(arg[2]); } fix_string(t); switch(i) { case MOB_NAME: if (EMPTY(t)) { printf("No Change.\n"); return; } free(m->name); m->name = t; break; case MOB_PNAME: if (EMPTY(t)) { printf("No Change.\n"); return; } free(m->pname); m->pname = t; break; case MOB_STR: m->hp = v; printf("Strength changed\n"); break; case MOB_SPEED: m->speed = v; printf("Speed changed\n"); break; case MOB_AGG: if ((v < 0) || (v > 100)) { printf("Outside range for aggression[0 - 100]\n"); return; } m->agg = v; printf("Aggression changed\n"); break; case MOB_DAM: m->damage = v; printf("Damage changed\n"); break; case MOB_ARMOR: m->armor = v; printf("Armor changed\n"); break; case MOB_DESC: if (EMPTY(t)) { printf("No Change.\n"); return; } free(m->desc); m->desc = COPY(t); /* Just copy it again, incase we deleted the end */ free(t); printf("Description changed\n"); break; case MOB_EXAM: free(m->exam); if (EMPTY(t)) printf("Examine text deleted\n"); else { m->exam = COPY(t); printf("Examine text changed\n"); } free(t); break; case MOB_LOC: if (EMPTY(t)) { printf("No Change.\n"); return; } m->loc = flbname(t); free(m->locname); m->locname = t; printf("Location changed\n"); if (m->loc == NULL) printf("Warning, location %s does not exist\n", t); break; default: printf("Sorry I do not know how to change a %s.\n",arg[1]); return; } modified = TRUE; return; } /* ** Create a new mobile and pop it into the list */ void mcreate(s) char *s; { PMOB m = NULL; if (EMPTY(s)) { printf("Create nothing, ok all done, I made nothing\n"); return; } m = NEW(MOB); init_mob(m,s); if (myloc != NULL) { m->loc = myloc; m->locname = COPY(myloc->name); } m->next = mob; mob = m; printf("You magically create a new mobile.\n%s forms before your eyes.\n", m->pname); modified = TRUE; nummob++; return; } /* ** clone a mobile s, and call it t */ void clone_mob(s, t) char *s; char *t; { PMOB m, m1; int j; m1 = fmobile(s); if (m1 == NULL) { m1 = fmobile(t); if (m1 == NULL) { printf("Sorry I can't clone %s because it doesn't exist.\n", s); return; } t = s; } m = fmobile(t); if (m != NULL) { printf("Sorry, the destination must be a unique mobile name.\n"); return; } m = NEW(MOB); /* Lets duplicate m1 and give it a new name */ m->name = COPY(t); m->pname = COPY(m1->pname); m->level = m1->level; if (EMPTY(m1->locname)) m->locname = NULL; else m->locname = COPY(m1->locname); m->loc = m1->loc; m->hp = m1->hp; m->armor = m1->armor; m->damage = m1->damage; m->agg = m1->agg; m->speed = m1->speed; for(j = 0; j < NUM_SFLAGS; j++) m->sflags[j] = m1->sflags[j]; for(j = 0; j < NUM_MFLAGS; j++) m->mflags[j] = m1->mflags[j]; for(j = 0; j < NUM_PFLAGS; j++) m->pflags[j] = m1->pflags[j]; if (EMPTY(m1->desc)) m->desc = NULL; else m->desc = COPY(m1->desc); if (EMPTY(m1->exam)) m->exam = NULL; else m->exam = COPY(m1->exam); /* Insert new mobile in list */ m->next = m1->next; m1->next = m; printf("Time freezes for an instant and %s duplicates itself.\n", m->pname); printf("%s -> %s.\n", m1->name, m->name); modified = TRUE; nummob++; return; } void mzap(s,tg) char *s; Bool tg; { PMOB m = mob, p = NULL; POBJ o = obj; if (EMPTY(s) || ((p = fmobile(s)) == NULL)) { printf("Zap what monster??\n"); return; } if (p == mob) { mob = mob->next; } else { while((m != NULL) && (m->next != p)) m = m->next; if (m == NULL) { printf("Error, I lost something in mobile search :(\n"); return; } m->next = p->next; } if (tg == TRUE) { printf("A huge bolt of lightning streams from your finger tips toward %s\n", p->pname); printf("%s just looks horrified for a moment, then there is a flash of\n", p->name); printf("white flame, a loud but short screach, and a pile of ashes\n"); } else { printf("You charge at %s, who gasps at you looking stunned\n",p->pname); printf("You hack and chop %s up into little bits, blood flying all\n", p->name); printf("over the place.\n"); } nummob--; /* Drop all the objects */ for (o = obj; o != NULL; o = o->next) { if ((o->ltype == CARRIED_BY) || (o->ltype == WORN_BY) || (o->ltype == BOTH_BY) || (o->ltype == WIELDED_BY)) { if (p == (PMOB)o->location) { if (p->loc != NULL) o->ltype = IN_ROOM; else o->ltype = UNKNOWN; o->location = p->loc; } } } FREE(p->name); FREE(p->pname); FREE(p->locname); FREE(p->desc); FREE(p->exam); free(p); modified = TRUE; return; }