char *msgscanstring(void) { static char instring[80],byte='x'; int i=0; instring[0]=0; byte = mgetc(); while (byte != '\n') { if ((byte == 8) || (byte == 127)) { /* ^h or delete */ if (i>0){ i--; dobackspace(); } instring[i] = 0; } else { instring[i] = byte; waddch(Msgw,byte); wrefresh(Msgw); i++; instring[i] = 0; } byte = mgetc(); } return(instring); }
uint16_t mgeti(char **fp) { uint16_t a, b; a = mgetc(fp); b = mgetc(fp); return (b << 8) | a; }
uint32_t mgetl(char **fp) { uint32_t a, b, c, d; a = mgetc(fp); b = mgetc(fp); c = mgetc(fp); d = mgetc(fp); return (d<<24)|(c<<16)|(b<<8)|(a); }
void omegan_character_stats(void) { int share1,share2,i=0; print1("To reroll hit ESCAPE; hit any other key to accept these stats."); do { i++; #if REROLLS == -1 sprintf(Str1, "Generated character # %d", i ); #else sprintf(Str1, "You have only %d chance%s to reroll... ", REROLLS - i, (i == (REROLLS-1) ) ? "":"s"); #endif print2(Str1); Player.iq = Player.maxiq = 4 + random_range(5)+ (share1 = random_range(6)) + (share2 = random_range(6)); Player.pow = Player.maxpow = 4 + random_range(5) + share1 +share2; Player.dex = Player.maxdex = 4 + random_range(5)+ (share1 = random_range(6)) + (share2 = random_range(6)); Player.agi = Player.maxagi = 4 + random_range(5) + share1 +share2; Player.str = Player.maxstr = 4 + random_range(5)+ (share1 = random_range(6)) + (share2 = random_range(6)); Player.con = Player.maxcon = 4 + random_range(5) + share1 +share2; Player.cash = random_range(100)+random_range(100)+ random_range(100)+random_range(100)+random_range(100); Player.hp=Player.maxhp=Player.con; Player.mana=Player.maxmana = calcmana(); calc_melee(); dataprint(); #if REROLLS == -1 } while (mgetc() == ESCAPE); #else }
void bufferprint(void) { int i = bufferpos - 1, c, finished = 0; clearmsg(); #ifndef MSDOS_SUPPORTED_ANTIQUE wprintw(Msg1w,"^p for previous message, ^n for next, anything else to quit."); #else wprintw(Msg1w,"^o for last message, ^n for next, anything else to quit."); #endif wrefresh(Msg1w); do { if (i >= STRING_BUFFER_SIZE) i = 0; if (i < 0) i = STRING_BUFFER_SIZE - 1; wclear(Msg2w); wprintw(Msg2w,Stringbuffer[i]); wrefresh(Msg2w); c = mgetc(); #ifndef MSDOS_SUPPORTED_ANTIQUE if (c == 16) /* ^p */ #else if (c == 15) /* ^o */ #endif i--; else if (c == 14) /* ^n */ i++; else finished = 1; } while (!finished); clearmsg(); omshowcursor(Player.x,Player.y); }
/* get a direction: return index into Dirs array corresponding to direction */ int getdir(void) { while (1) { mprint("Select direction [hjklyubn, ESCAPE to quit]: "); switch (mgetc()) { case '4': case 'h': case 'H': return(5); case '2': case 'j': case 'J': return(6); case '8': case 'k': case 'K': return(7); case '6': case 'l': case 'L': return(4); case '7': case 'y': case 'Y': return(3); case '9': case 'u': case 'U': return(1); case '1': case 'b': case 'B': return(2); case '3': case 'n': case 'N': return(0); case ESCAPE: clearmsg(); return(ABORT); default: print3("That's not a direction! "); } } }
/* nya ha ha ha ha haaaa.... */ void deathprint(void) { mgetc(); waddch(Msgw,'D'); wrefresh(Msgw); mgetc(); waddch(Msgw,'e'); wrefresh(Msgw); mgetc(); waddch(Msgw,'a'); wrefresh(Msgw); mgetc(); waddch(Msgw,'t'); wrefresh(Msgw); mgetc(); waddch(Msgw,'h'); wrefresh(Msgw); mgetc(); }
/* gain for an item */ void acquire(int blessing) { char otype; int index,id = ABORT; pob newthing; if (blessing < 0) { index = random_item(); if (index == ABORT) mprint("You feel fortunate."); else { print1("Smoke drifts out of your pack.... "); print2("Destroyed: "); nprint2(itemid(Player.possessions[index])); morewait(); dispose_lost_objects(1,Player.possessions[index]); } } else { newthing = ((pob) checkmalloc(sizeof(objtype))); /* DAG this assignment looks unneccessary */ newthing->id = -1; if (gamestatusp(CHEATED)) print1("Acquire which kind of item: !?][}{)/=%%\\& "); else print1("Acquire which kind of item: !?][}{)/=%%\\ "); otype = mgetc(); switch (otype) { case (POTION&0xff): if (blessing > 0) id = itemlist(POTIONID,NUMPOTIONS); else id = random_range(NUMPOTIONS); if (id < 0) print2("You feel stupid."); else make_potion(newthing,id); break; case (SCROLL&0xff): if (blessing > 0) id = itemlist(SCROLLID,NUMSCROLLS); else id = random_range(NUMSCROLLS); if (id < 0) print2("You feel stupid."); else make_scroll(newthing,id); break; case (RING&0xff): if (blessing > 0) id = itemlist(RINGID,NUMRINGS); else id = random_range(NUMRINGS); if (id < 0) print2("You feel stupid."); else make_ring(newthing,id); break; case (STICK&0xff): if (blessing > 0) id = itemlist(STICKID,NUMSTICKS); else id = random_range(NUMSTICKS); if (id < 0) print2("You feel stupid."); else make_stick(newthing,id); break; case (ARMOR&0xff): if (blessing > 0) id = itemlist(ARMORID,NUMARMOR); else id = random_range(NUMARMOR); if (id < 0) print2("You feel stupid."); else make_armor(newthing,id); break; case (SHIELD&0xff): if (blessing > 0) id = itemlist(SHIELDID,NUMSHIELDS); else id = random_range(NUMSHIELDS); if (id < 0) print2("You feel stupid."); else make_shield(newthing,id); break; case (WEAPON&0xff): if (blessing > 0) id = itemlist(WEAPONID,NUMWEAPONS); else id = random_range(NUMWEAPONS); if (id < 0) print2("You feel stupid."); else make_weapon(newthing,id); break; case (BOOTS&0xff): if (blessing > 0) id = itemlist(BOOTID,NUMBOOTS); else id = random_range(NUMBOOTS); if (id < 0) print2("You feel stupid."); else make_boots(newthing,id); break; case (CLOAK&0xff): if (blessing > 0) id = itemlist(CLOAKID,NUMCLOAKS); else id = random_range(NUMCLOAKS); if (id < 0) print2("You feel stupid."); else make_cloak(newthing,id); break; case (FOOD&0xff): if (blessing > 0) id = itemlist(FOODID,NUMFOODS); else id = random_range(NUMFOODS); if (id < 0) print2("You feel stupid."); else make_food(newthing,id); break; case (THING&0xff): if (blessing > 0) id = itemlist(THINGID,NUMTHINGS); else id = random_range(NUMTHINGS); if (id < 0) print2("You feel stupid."); else make_thing(newthing,id); break; case (ARTIFACT&0xff): if (gamestatusp(CHEATED)) id = itemlist(ARTIFACTID,NUMARTIFACTS); else id = -1; if (id < 0) print2("You feel stupid."); else make_artifact(newthing,id); break; default: print2("You feel stupid."); } xredraw(); if (id != ABORT) { if (blessing > 0) { newthing->known = 2; Objects[id].known = 1; } newthing->used = FALSE; gain_item(newthing); } else { /* DAG newthing allocated but was not freed... was YA memory leak */ /* use free() rather than free_obj() since newthing not initialized */ free( (char *) newthing ); } } }
void l_sorcerors(void) { char action; int done=FALSE,fee; long total; print1("The Circle of Sorcerors."); if (Player.rank[CIRCLE] == -1) { print2("Fool! Didn't we tell you to go away?"); Player.mana = 0; dataprint(); } else while (! done) { if ((Player.rank[CIRCLE]==HIGHSORCEROR) && (Player.level > Primelevel) && find_and_remove_item(CORPSEID,LAWBRINGER)) { print2("You obtained the Crown of the Lawgiver!"); morewait(); print1("The Crown is ritually sacrificed to the Lords of Chaos."); print2("You are now the Prime Sorceror of the Inner Circle!"); strcpy(Prime,Player.name); Primelevel = Player.level; morewait(); Primebehavior = fixnpc(4); save_hiscore_npc(10); clearmsg(); print1("You learn the Spell of Disintegration!"); morewait(); clearmsg(); Spells[S_DISINTEGRATE].known = TRUE; Player.rank[CIRCLE] = PRIME; Player.maxpow += 10; Player.pow += 10; } menuclear(); menuprint("May we help you?\n\n"); menuprint("a: Become an Initiate of the Circle.\n"); menuprint("b: Raise your rank in the Circle.\n"); menuprint("c: Restore mana points\n"); menuprint("ESCAPE: Leave these Chambers of Power.\n"); showmenu(); action = mgetc(); if (action == ESCAPE) done = TRUE; else if (action == 'a') { if (Player.rank[CIRCLE] > 0) print2("You are already an initiate!"); else if (Player.alignment > 0) print2("You may not join -- you reek of Law!"); else if (Player.rank[COLLEGE] > 0) print2("Foolish Mage! You don't have the right attitude to Power!"); #ifdef INCLUDE_MONKS else if (Player.rank[MONKS] > 0) print2("Stupid monk. Go Meditate on this!"); #endif else { fee = 3000; fee += Player.alignment*100; fee += fee*(12 - Player.pow)/9; fee = max(100,fee); clearmsg(); mprint("For you, there is an initiation fee of"); mnumprint(fee); mprint(" Au."); print2("Pay it? [yn] "); if (ynq2() =='y') { if (Player.cash < fee) print3("Try again when you have the cash!"); else { print1("Prime Sorceror "); nprint1(Prime); print2("conducts your initiation into the circle of novices."); morewait(); clearmsg(); print1("You learn the Spell of Magic Missiles."); Spells[S_MISSILE].known = TRUE; Player.cash -= fee; dataprint(); Player.rank[CIRCLE] = INITIATE; Player.guildxp[CIRCLE] = 1; Player.maxpow++; Player.pow++; } } } } else if (action == 'b') { if (Player.rank[CIRCLE] == 0) print2("You have not even been initiated, yet!"); else if (Player.alignment > -1) { print1("Ahh! You have grown too lawful!!!"); print2("You are hereby blackballed from the Circle!"); Player.rank[CIRCLE] = -1; morewait(); clearmsg(); print1("A pox upon thee!"); if (! Player.immunity[INFECTION]) Player.status[DISEASED]+=100; print2("And a curse on your possessions!"); morewait(); clearmsg(); acquire(-1); clearmsg(); enchant(-1); bless(-1); print3("Die, false sorceror!"); p_damage(25,UNSTOPPABLE,"a sorceror's curse"); done = TRUE; } else if (Player.rank[CIRCLE]==PRIME) print2("You are at the pinnacle of mastery in the Circle."); else if (Player.rank[CIRCLE]==HIGHSORCEROR) { if (Player.level <= Primelevel) print2("You are not experienced enough to advance."); else print2("You must return with the Crown of the LawBringer!"); } else if (Player.rank[CIRCLE]==SORCEROR) { if (Player.guildxp[CIRCLE] < 4000) print2("You are not experienced enough to advance."); else { print1("You are now a High Sorceror of the Inner Circle!"); print2("You learn the Spell of Disruption!"); morewait(); clearmsg(); print1("To advance you must return with the LawBringer's Crown!"); print2("The LawBringer resides on Star Peak."); Spells[S_DISRUPT].known = TRUE; Player.rank[CIRCLE] = HIGHSORCEROR; Player.maxpow += 5; Player.pow += 5; } } else if (Player.rank[CIRCLE]==ENCHANTER) { if (Player.guildxp[CIRCLE] < 1500) print2("You are not experienced enough to advance."); else { print1("You are now a member of the Circle of Sorcerors!"); print2("You learn the Spell of Ball Lightning!"); Spells[S_LBALL].known = TRUE; Player.rank[CIRCLE] = SORCEROR; Player.maxpow += 2; Player.pow+=2; } } else if (Player.rank[CIRCLE]==INITIATE) { if (Player.guildxp[CIRCLE] < 400) print2("You are not experienced enough to advance."); else { print1("You are now a member of the Circle of Enchanters!"); print2("You learn the Spell of Firebolts."); Spells[S_FIREBOLT].known = TRUE; Player.rank[CIRCLE] = ENCHANTER; Player.maxpow+=2; Player.pow+=2; } } } else if (action == 'c') { done = TRUE; fee = Player.level*100; if (Player.rank[CIRCLE]) fee = fee / 2; clearmsg(); print1("That will be: "); mnumprint(fee); nprint1("Au. Pay it? [yn] "); if (ynq1()=='y') { if (Player.cash < fee) print2("Begone, deadbeat, or face the wrath of the Circle!"); else { Player.cash -= fee; total = calcmana(); while (Player.mana < total) { Player.mana++; dataprint(); } print2("Have a sorcerous day, now!"); } } else print2("Be seeing you!"); } } xredraw(); }
void l_monastery(void) { char action; int done=FALSE,enrolled = FALSE; print1("Tholian Monastery of Rampart. Founded 12031, AOF."); print2("Welcome to our humble hovel."); if (nighttime()) print2("The monastery doors are sealed until dawn."); else { while (! done) { menuclear(); menuprint("Find your True Course:\n\n"); menuprint("a: Discover the Way.\n"); menuprint("b: Meditate on the Path.\n"); menuprint("c: Meditate on Knowledge.\n"); menuprint("d: Take an extended Meditation.\n"); menuprint("ESCAPE: Re-enter the World.\n"); showmenu(); action = mgetc(); if (action == ESCAPE) { done = TRUE; calc_melee(); } else if (action == 'a') { if (Player.rank[MONKS] > 0) print2("You are already initiated, Brother."); else if (Player.con < 13) print2("Your body is too fragile to walk the Path, child."); else if (Player.pow < 13) print2("Your mind is too fragile to follow the Path, child."); else if (Player.rank[COLLEGE] > 0) print2("The Collegium has corruputed your spirit, child."); else if (Player.rank[CIRCLE] > 0) print2("The Circle has corruputed your spirit, child."); else { if (Player.pow > 17) { print2("Your spirit is strong. You may study the Path with us."); morewait(); enrolled=TRUE; } else { print1("A substantial cash sacrifice will cleanse your spirit.. "); print2("Donate your worldly goods? [yn] "); if (ynq1() =='y') { if (Player.cash < 1000) { /* WDT HACK! I'd rather the monks have some other * criteria for joining. */ print2("You have not much to give."); } else { Player.cash = 0; enrolled = TRUE; dataprint(); } } } if (enrolled) { print1("Grandmaster "); nprint1(Grandmaster); nprint1(" welcomes you to the Brotherhood."); print2("You are now a Tholian Monk trainee!"); morewait(); print2("You may study the Way with us."); Studiesleft = 1; Player.rank[MONKS] = MONK_TRAINEE; Player.guildxp[MONKS] = 1; Player.maxpow += 1; Player.pow += 1; } } } else if (action == 'b') { if (Player.rank[MONKS] == 0) print2("You are not yet initiated, child."); else if (Player.rank[MONKS]==MONK_GRANDMASTER) print2("Your advancement lies within, Grandmaster."); else if (Player.rank[MONKS]==MONK_MASTER_TEARS) { if (Player.level <= Grandmasterlevel) print2("Seek more experience, Master."); else if ((Player.rank[MONKS]==MONK_MASTER_TEARS) && (Player.level > Grandmasterlevel) && find_and_remove_item(CORPSEID,EATER)) { print1("You brought back the heart of the Eater of Magic!"); morewait(); print1("The Heart is sent to the placed in the kitchen cauldron."); print2("The Grandmaster steps down. You are the new Grandmaster."); morewait(); clearmsg(); strcpy(Grandmaster,Player.name); Grandmasterlevel = Player.level; Player.rank[MONKS] = MONK_GRANDMASTER; Player.maxhp += (Player.maxpow * 3); Player.maxiq += 5; Player.iq+= 5; Player.maxpow += 3; Player.pow += 3; Player.maxstr += 3; Player.str += 3; morewait(); Grandmasterbehavior = fixnpc(4); save_hiscore_npc(16); } else print2("You must return with the heart of the Eater of Magic!"); } else if (Player.rank[MONKS]==MONK_MASTER_PAINS) { if (Player.guildxp[MONKS] < 40000) print2("Seek more experience, Master."); else { print1("You have travelled far, Master."); print2("You are now Master of Tears."); Studiesleft += 6; morewait(); print1("To become Grandmaster, you must return with the"); print2("heart of the Eater of Magic"); morewait(); clearmsg(); print1("The Eater may be found on a desert isle somewhere."); Spells[S_REGENERATE].known = TRUE; Player.rank[MONKS] = MONK_MASTER_TEARS; Player.maxhp += (Player.maxpow * 2); Player.maxpow += 2; Player.pow += 2; Player.maxstr += 2; Player.str += 2; Player.maxagi += 2; Player.agi += 2; } } else if (Player.rank[MONKS]==MONK_MASTER_SIGHS) { if (Player.guildxp[MONKS] < 15000) print2("Seek more experience, Master."); else { print1("The Path is long, Master."); print2("You are now Master of Pain."); morewait(); print1("You feel enlightened."); morewait(); clearmsg(); Studiesleft +=4; Spells[S_RITUAL].known = TRUE; Spells[S_RESTORE].known = TRUE; Player.status[ILLUMINATION] = 1500; /* enlightened */ Player.rank[MONKS] = MONK_MASTER_PAINS; Player.maxhp += Player.maxpow; Player.maxcon += 1; Player.con += 1; Player.maxdex += 2; Player.dex += 2; } } else if (Player.rank[MONKS]==MONK_MASTER) { if (Player.guildxp[MONKS] < 9000) print2("Seek more experience, Master."); else { print1("Drink, weary Master."); print2("You are now Master of Sighs."); morewait(); clearmsg(); Studiesleft +=2; Spells[S_HASTE].known = TRUE; Player.rank[MONKS] = MONK_MASTER_SIGHS; Player.maxhp += Player.maxpow; Player.maxcon += 1; Player.con += 1; Player.maxiq += 2; Player.iq += 2; } } else if (Player.rank[MONKS]==MONK_MONK) { if (Player.guildxp[MONKS] < 3000) print2("Seek more experience, Brother."); else { print1("A thousand steps on the path, Brother."); print2("You are now a Master."); morewait(); clearmsg(); Studiesleft +=2; Spells[S_HEAL].known = TRUE; Player.rank[MONKS] = MONK_MASTER; Player.maxhp += Player.maxpow; Player.maxcon += 1; Player.con += 1; Player.maxpow += 2; Player.pow += 5; /* [sic] */ } } else if (Player.rank[MONKS]==MONK_TRAINEE) { if (Player.guildxp[MONKS] < 1500) print2("Seek more experience, Brother."); else { print1("You have sought wisdom, Brother."); print2("You are now a Tholian Monk."); morewait(); clearmsg(); Studiesleft +=2; Spells[S_CURE].known = TRUE; Player.rank[MONKS] = MONK_MONK; Player.maxhp += Player.maxpow; Player.maxcon += 1; Player.con += 1; Player.maxpow += 1; Player.pow += 1; } } } else if (action == 'c') { clearmsg(); if (Studiesleft > 0) { print1("Studies permitted: "); mnumprint(Studiesleft); nprint1(" Studies."); morewait(); } if (Studiesleft < 1) { print1("Sacrifice clears a cluttered heart. "); nprint1("Donate your worldly cash? [yn] "); if (ynq1()=='y') { if (Player.cash < 2000) { if ( Player.rank[MONKS] >= MONK_GRANDMASTER ) print2("You have not much to give, Grandmaster."); else if ( Player.rank[MONKS] >= MONK_MASTER ) print2("You have not much to give, Master."); else print2("You have not much to give, Brother."); } else { Player.cash = 0; dataprint(); Studiesleft = 1; } } } if (Studiesleft > 0) { learnspell(0); Studiesleft--; } } else if (action == 'd') { if (Player.rank[MONKS] < MONK_MASTER) { clearmsg(); print1("Only Masters can achieve extended meditation, child."); print2(" "); } else { int i = 0; clearmsg(); print1("Seeking inner truth..."); morewait(); clearmsg(); morewait(); toggle_item_use(TRUE); Player.cash = 0; Player.hp = Player.maxhp; Player.str = Player.maxstr; Player.agi = Player.maxagi; Player.con = Player.maxcon; Player.dex = Player.maxdex; Player.iq = Player.maxiq; Player.pow = Player.maxpow; for (i=0;i<NUMSTATI;i++) if (Player.status[i]<1000) Player.status[i]=0; toggle_item_use(FALSE); Player.food = 43; print2("Your body and mind are whole."); if (random_range(2) == 1) { morewait(); print1("Extra whole!"); Player.maxhp += 1; } } Time += 60*24*7; Date += 7; moon_check(); timeprint(); } } } xredraw(); }
void l_college(void) { char action; int done=FALSE,enrolled = FALSE; print1("The Collegium Magii. Founded 16937, AOF."); if (nighttime()) print2("The Registration desk is closed at night...."); else { while (! done) { if ((Player.rank[COLLEGE]==MAGE) && (Player.level > Archmagelevel) && find_and_remove_item(CORPSEID,EATER)) { print1("You brought back the heart of the Eater of Magic!"); morewait(); print1("The Heart is sent to the labs for analysis."); print2("The Board of Trustees appoints you Archmage!"); morewait(); clearmsg(); strcpy(Archmage,Player.name); Archmagelevel = Player.level; Player.rank[COLLEGE] = ARCHMAGE; Player.maxiq += 5; Player.iq += 5; Player.maxpow += 5; Player.pow += 5; morewait(); Archmagebehavior = fixnpc(4); save_hiscore_npc(9); } menuclear(); menuprint("May we help you?\n\n"); menuprint("a: Enroll in the College.\n"); menuprint("b: Raise your College rank.\n"); menuprint("c: Do spell research.\n"); menuprint("ESCAPE: Leave these hallowed halls.\n"); showmenu(); action = mgetc(); if (action == ESCAPE) done = TRUE; else if (action == 'a') { if (Player.rank[COLLEGE] > 0) print2("You are already enrolled!"); else if (Player.iq < 13) print2("Your low IQ renders you incapable of being educated."); else if (Player.rank[CIRCLE] > 0) print2("Sorcery and our Magic are rather incompatible, no?"); #ifdef INCLUDE_MONKS else if (Player.rank[MONKS] > 0) print2("Meditation will not leave you enough time for studies."); #endif else { if (Player.iq > 17) { print2("You are given a scholarship!"); morewait(); enrolled=TRUE; } else { print1("Tuition is 1000Au. "); nprint1("Pay it? [yn] "); if (ynq1() =='y') { if (Player.cash < 1000) print2("You don't have the funds!"); else { Player.cash -= 1000; enrolled = TRUE; dataprint(); } } } if (enrolled) { print1("Archmage "); nprint1(Archmage); nprint1(" greets you and congratulates you on your acceptance."); print2("You are now enrolled in the Collegium Magii!"); morewait(); print1("You are now a Novice."); print2("You may research 1 spell, for your intro class."); Spellsleft = 1; Player.rank[COLLEGE] = INITIATE; Player.guildxp[COLLEGE] = 1; Player.maxiq += 1; Player.iq += 1; Player.maxpow += 1; Player.pow += 1; } } } else if (action == 'b') { if (Player.rank[COLLEGE] == 0) print2("You have not even been initiated, yet!"); else if (Player.rank[COLLEGE]==ARCHMAGE) print2("You are at the pinnacle of mastery in the Collegium."); else if (Player.rank[COLLEGE]==MAGE) { if (Player.level <= Archmagelevel) print2("You are not experienced enough to advance."); else print2("You must return with the heart of the Eater of Magic!"); } else if (Player.rank[COLLEGE]==PRECEPTOR) { if (Player.guildxp[COLLEGE] < 4000) print2("You are not experienced enough to advance."); else { print1("You are now a Mage of the Collegium Magii!"); print2("You may research 6 spells for postdoctoral research."); Spellsleft += 6; morewait(); print1("To become Archmage, you must return with the"); print2("heart of the Eater of Magic"); morewait(); clearmsg(); print1("The Eater may be found on a desert isle somewhere."); Player.rank[COLLEGE] = MAGE; Player.maxiq += 2; Player.iq += 2; Player.maxpow += 2; Player.pow += 2; } } else if (Player.rank[COLLEGE]==STUDENT) { if (Player.guildxp[COLLEGE] < 1500) print2("You are not experienced enough to advance."); else { print1("You are now a Preceptor of the Collegium Magii!"); print2("You are taught the basics of ritual magic."); morewait(); clearmsg(); print1("Your position allows you to research 4 spells."); Spellsleft +=4; Spells[S_RITUAL].known = TRUE; Player.rank[COLLEGE] = PRECEPTOR; Player.maxiq += 1; Player.iq += 1; Player.maxpow += 1; Player.pow += 1; } } else if (Player.rank[COLLEGE]==NOVICE) { if (Player.guildxp[COLLEGE] < 400) print2("You are not experienced enough to advance."); else { print1("You are now a Student at the Collegium Magii!"); print2("You are taught the spell of identification."); morewait(); clearmsg(); print1("Thesis research credit is 2 spells."); Spellsleft+=2; Spells[S_IDENTIFY].known = TRUE; Player.rank[COLLEGE] = STUDENT; Player.maxiq += 1; Player.iq += 1; Player.maxpow += 1; Player.pow += 1; } } } else if (action == 'c') { clearmsg(); if (Spellsleft > 0) { print1("Research permitted: "); mnumprint(Spellsleft); nprint1(" Spells."); morewait(); } if (Spellsleft < 1) { print1("Extracurricular Lab fee: 2000 Au. "); nprint1("Pay it? [yn] "); if (ynq1()=='y') { if (Player.cash < 2000) print1("Try again when you have the cash."); else { Player.cash -= 2000; dataprint(); Spellsleft = 1; } } } if (Spellsleft > 0) { learnspell(0); Spellsleft--; } } } } xredraw(); }
/* deal with a new player command in countryside mode */ void p_country_process(void) { int no_op; drawvision(Player.x,Player.y); do { no_op = FALSE; Cmd = mgetc(); clear_if_necessary(); switch (Cmd) { case ' ': case 13: no_op = TRUE; break; case 7: wizard(); break; /* ^g */ case 12: xredraw(); no_op = TRUE; break; /* ^l */ #if !defined(WIN32) case 16: bufferprint(); no_op = TRUE; break; /* ^p */ #else case 15: bufferprint(); no_op = TRUE; break; /* ^o */ #endif case 18: redraw(); no_op = TRUE; break; /* ^r */ case 23: if (gamestatusp(CHEATED)) drawscreen(); break; /* ^w */ case 24: if (gamestatusp(CHEATED) || Player.rank[ADEPT]) wish(1); break; /* ^x */ case 'd': drop(); break; case 'e': eat(); break; case 'i': do_inventory_control(); break; case 's': countrysearch(); break; case 'x': examine(); break; case 'E': dismount_steed(); break; case 'H': hunt(Country[Player.x][Player.y].current_terrain_type); break; case 'I': if (! optionp(TOPINV)) top_inventory_control(); else { menuclear(); display_possessions(); inventory_control(); } break; case 'O': setoptions(); break; case 'P': show_license(); break; /* actually show_license is in file.c */ case 'Q': quit(); break; case 'R': rename_player(); break; case 'S': save(FALSE); break; case 'V': version(); break; case '>': enter_site(Country[Player.x][Player.y].base_terrain_type); break; case '#': if (gamestatusp(CHEATED)) editstats(); break; /* RAC - char editor */ case '/': charid(); no_op = TRUE; break; case '?': help(); no_op = TRUE; break; case '4': case 'h': movepincountry(-1,0); break; case '2': case 'j': movepincountry(0,1); break; case '8': case 'k': movepincountry(0,-1); break; case '6': case 'l': movepincountry(1,0); break; case '1': case 'b': movepincountry(-1,1); break; case '3': case 'n': movepincountry(1,1); break; case '7': case 'y': movepincountry(-1,-1); break; case '9': case 'u': movepincountry(1,-1); break; default: commanderror(); no_op = TRUE; break; } } while (no_op); screencheck(Player.x,Player.y); }
/* deal with a new player command in dungeon or city mode*/ void p_process(void) { static int searchval=0; if (Player.status[BERSERK]) if (goberserk()) { setgamestatus(SKIP_PLAYER); drawvision(Player.x,Player.y); } if (! gamestatusp(SKIP_PLAYER)) { if (searchval > 0) { searchval--; if (searchval == 0) resetgamestatus(FAST_MOVE); } drawvision(Player.x,Player.y); if (! gamestatusp(FAST_MOVE)) { searchval = 0; Cmd = mgetc(); clear_if_necessary(); } Command_Duration = 0; switch (Cmd) { case ' ': case 13: setgamestatus(SKIP_MONSTERS); break; /*no op on space or return*/ case 6: abortshadowform(); break; /* ^f */ case 7: wizard(); break; /* ^g */ case 4: player_dump(); break; /* ^d */ case 9: display_pack(); morewait(); xredraw(); break; /* ^i */ case 11: if (gamestatusp(CHEATED)) frobgamestatus(); break; case 12: xredraw(); setgamestatus(SKIP_MONSTERS); break; /* ^l */ #if !defined(WIN32) case 16: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^p */ #else case 15: bufferprint(); setgamestatus(SKIP_MONSTERS); break; /* ^o */ #endif case 18: redraw(); setgamestatus(SKIP_MONSTERS); break; /* ^r */ case 23: if (gamestatusp(CHEATED)) drawscreen(); break; /* ^w */ case 24: /* ^x */ if (gamestatusp(CHEATED) || Player.rank[ADEPT]) wish(1); Command_Duration = 5; break; case 'a': zapwand(); Command_Duration = Player.speed*8/5; break; case 'c': closedoor(); Command_Duration = Player.speed*2/5; break; case 'd': drop(); Command_Duration = Player.speed*5/5; break; case 'e': eat(); Command_Duration = 30; break; case 'f': fire(); Command_Duration = Player.speed*5/5; break; case 'g': pickup(); Command_Duration = Player.speed*10/5; break; case 'i': do_inventory_control(); break; case 'm': magic(); Command_Duration = 12; break; case 'o': opendoor(); Command_Duration = Player.speed*5/5; break; case 'p': pickpocket(); Command_Duration = Player.speed*20/5; break; case 'q': quaff(); Command_Duration = 10; break; case 'r': peruse(); Command_Duration = 20; break; case 's': search(&searchval); Command_Duration = 20; break; case 't': talk(); Command_Duration = 10; break; case 'v': vault(); Command_Duration = Player.speed*10/5; break; case 'x': examine(); Command_Duration = 1; break; case 'z': bash_location(); Command_Duration = Player.speed*10/5; break; case 'A': activate(); Command_Duration = 10; break; case 'C': callitem(); break; case 'D': disarm(); Command_Duration = 30; break; case 'E': dismount_steed(); Command_Duration = Player.speed*10/5; break; case 'F': tacoptions(); break; case 'G': give(); Command_Duration = 10; break; case 'I': if (! optionp(TOPINV)) top_inventory_control(); else { display_possessions(); inventory_control(); } break; case 'M': city_move(); Command_Duration = 10; break; case 'O': setoptions(); #if defined(WIN32) show_screen(); xredraw(); #endif break; case 'P': show_license(); break; /* actually show_license is in file.c */ case 'Q': quit(); break; case 'R': rename_player(); break; case 'S': save(FALSE); break; case 'T': tunnel(); Command_Duration = Player.speed*30/5; break; case 'V': version(); break; case 'Z': bash_item(); Command_Duration = Player.speed*10/5; break; case '.': rest(); Command_Duration = 10; break; case ',': Command_Duration = 10; nap(); break; case '>': downstairs(); break; case '<': upstairs(); break; case '@': p_movefunction(Level->site[Player.x][Player.y].p_locf); Command_Duration = 5; break; case '#': if (gamestatusp(CHEATED)) editstats(); break; /* RAC - char editor */ case '/': charid(); setgamestatus(SKIP_MONSTERS); break; case '?': help(); setgamestatus(SKIP_MONSTERS); break; case '4': case 'h': moveplayer(-1,0); Command_Duration = Player.speed*5/5; break; case '2': case 'j': moveplayer(0,1); Command_Duration = Player.speed*5/5; break; case '8': case 'k': moveplayer(0,-1); Command_Duration = Player.speed*5/5; break; case '6': case 'l': moveplayer(1,0); Command_Duration = Player.speed*5/5; break; case '1': case 'b': moveplayer(-1,1); Command_Duration = Player.speed*5/5; break; case '3': case 'n': moveplayer(1,1); Command_Duration = Player.speed*5/5; break; case '7': case 'y': moveplayer(-1,-1); Command_Duration = Player.speed*5/5; break; case '9': case 'u': moveplayer(1,-1); Command_Duration = Player.speed*5/5; break; case '5': setgamestatus(SKIP_MONSTERS); /* don't do anything; a dummy turn */ Cmd = mgetc(); while ((Cmd != ESCAPE) && ((Cmd < '1') || (Cmd > '9') || (Cmd=='5'))) { print3("Run in keypad direction [ESCAPE to abort]: "); Cmd = mgetc(); } if (Cmd != ESCAPE) setgamestatus(FAST_MOVE); else clearmsg3(); break; case 'H': setgamestatus(FAST_MOVE); Cmd = 'h'; moveplayer(-1,0); Command_Duration = Player.speed*4/5; break; case 'J': setgamestatus(FAST_MOVE); Cmd = 'j'; moveplayer(0,1); Command_Duration = Player.speed*4/5; break; case 'K': setgamestatus(FAST_MOVE); Cmd = 'k'; moveplayer(0,-1); Command_Duration = Player.speed*4/5; break; case 'L': setgamestatus(FAST_MOVE); Cmd = 'l'; moveplayer(1,0); Command_Duration = Player.speed*4/5; break; case 'B': setgamestatus(FAST_MOVE); Cmd = 'b'; moveplayer(-1,1); Command_Duration = Player.speed*4/5; break; case 'N': setgamestatus(FAST_MOVE); Cmd = 'n'; moveplayer(1,1); Command_Duration = Player.speed*4/5; break; case 'Y': setgamestatus(FAST_MOVE); Cmd = 'y'; moveplayer(-1,-1); Command_Duration = Player.speed*4/5; break; case 'U': setgamestatus(FAST_MOVE); Cmd = 'u'; moveplayer(1,-1); Command_Duration = Player.speed*4/5; break; default: commanderror(); setgamestatus(SKIP_MONSTERS); break; } } if (Current_Environment != E_COUNTRYSIDE) roomcheck(); screencheck(Player.x,Player.y); }
char org_load(int songno) { static const char *magic = "Org-02"; char buf[8]; char *f; char **fp; int i, j; f = org_data[songno]; fp = &f; if (!fp) { NX_WARN("org_load: no such file: '%d'\n", songno); return 1; } for(i=0;i<6;i++) { buf[i] = mgetc(fp); } buf[i] = 0; if (strcmp(buf, magic)) { NX_WARN("org-load: not an org file (got '%s')\n", buf); //fclose(fp); return 1; } NX_LOG("%d: %s detected\n", songno, magic); //fseek(fp, 0x06, SEEK_SET); song.ms_per_beat = mgeti(fp); song.steps_per_bar = mgetc(fp); song.beats_per_step = mgetc(fp); song.loop_start = mgetl(fp); song.loop_end = mgetl(fp); //song.ms_per_beat = 500; //song.loop_start = 64; if (song.loop_end < song.loop_start) { visible_warning("org_load: loop end is before loop start"); //fclose(fp); return 1; } // compute how long the last beat of a note should be (it should not use up the whole beat) song.ms_of_last_beat_of_note = song.ms_per_beat - (int)((double)song.ms_per_beat * 0.1); // not actually used in this module, but the larger program might want to know this song.beats_per_bar = (song.beats_per_step * song.steps_per_bar); /*lprintf("tempo: %d ms/beat\n", song.ms_per_beat); lprintf("beats_per_step: %d\n", song.beats_per_step); lprintf("steps_per_bar: %d\n", song.steps_per_bar); lprintf("loop begins on beat %d\n", song.loop_start); lprintf("loop ends on beat %d\n", song.loop_end);*/ for(i=0;i<16;i++) { song.instrument[i].pitch = mgeti(fp); song.instrument[i].wave = mgetc(fp); song.instrument[i].pi = mgetc(fp); song.instrument[i].nnotes = mgeti(fp); if (song.instrument[i].nnotes >= MAX_SONG_LENGTH) { visible_warning(" * org_load: instrument %d has too many notes! (has %d, max %d)", i, song.instrument[i].nnotes, MAX_SONG_LENGTH); //fclose(fp); return 1; } /*if (song.instrument[i].nnotes) { lprintf("Instrument %d: ", i); lprintf(" Pitch: %d, ", song.instrument[i].pitch); lprintf(" Wave: %d, ", song.instrument[i].wave); lprintf(" Pi: %d, ", song.instrument[i].pi); lprintf(" Nnotes: %d\n", song.instrument[i].nnotes); }*/ // substitute unavailable drums // credits track for one, has Per02 set which CS didn't actually have, I don't think if (i >= 8) { switch(song.instrument[i].wave) { case 9: song.instrument[i].wave = 8; break; } } } for(i=0;i<16;i++) { for(j=0;j<song.instrument[i].nnotes;j++) song.instrument[i].note[j].beat = mgetl(fp); for(j=0;j<song.instrument[i].nnotes;j++) song.instrument[i].note[j].note = mgetc(fp); for(j=0;j<song.instrument[i].nnotes;j++) song.instrument[i].note[j].length = mgetc(fp); for(j=0;j<song.instrument[i].nnotes;j++) song.instrument[i].note[j].volume = mgetc(fp); for(j=0;j<song.instrument[i].nnotes;j++) song.instrument[i].note[j].panning = mgetc(fp); } //fclose(fp); return init_buffers(); }
// Adjust configuration parameters before initialisation // sequence. void PreMemInit( MRCParams_t *mrc_params) { const DRAMParams_t *dram_params; uint8_t dram_width; uint32_t dram_cfg_index; uint32_t channel_i; ENTERFN(); #ifdef MRC_SV { uint8_t ch; myloop: DPF(D_INFO, "- c - continue\n"); DPF(D_INFO, "- f - boot mode [%d]\n", mrc_params->boot_mode); DPF(D_INFO, "- r - rank enable [%d]\n", mrc_params->rank_enables); DPF(D_INFO, "- e - ecc switch [%d]\n", mrc_params->ecc_enables); DPF(D_INFO, "- b - scrambling switch [%d]\n", mrc_params->scrambling_enables); DPF(D_INFO, "- a - adr mode [%d]\n", mrc_params->address_mode); DPF(D_INFO, "- m - menu after mrc [%d]\n", mrc_params->menu_after_mrc); DPF(D_INFO, "- t - tune to rcvn [%d]\n", mrc_params->tune_rcvn); DPF(D_INFO, "- o - odt switch [%d]\n", mrc_params->rd_odt_value); DPF(D_INFO, "- d - dram density [%d]\n", mrc_params->params.DENSITY); DPF(D_INFO, "- p - power down disable [%d]\n", mrc_params->power_down_disable); DPF(D_INFO, "- l - log switch 0x%x\n", DpfPrintMask); ch = mgetc(); switch (ch) { case 'f': mrc_params->boot_mode >>= 1; if(mrc_params->boot_mode == bmUnknown) { mrc_params->boot_mode = bmWarm; } DPF(D_INFO, "Boot mode %d\n", mrc_params->boot_mode); break; case 'p': mrc_params->power_down_disable ^= 1; DPF(D_INFO, "Power down disable %d\n", mrc_params->power_down_disable); break; case 'r': mrc_params->rank_enables ^= 2; DPF(D_INFO, "Rank enable %d\n", mrc_params->rank_enables); break; case 'e': mrc_params->ecc_enables ^= 1; DPF(D_INFO, "Ecc enable %d\n", mrc_params->ecc_enables); break; case 'b': mrc_params->scrambling_enables ^= 1; DPF(D_INFO, "Scrambler enable %d\n", mrc_params->scrambling_enables); break; case 'a': mrc_params->address_mode = (mrc_params->address_mode + 1) % 3; DPF(D_INFO, "Adr mode %d\n", mrc_params->address_mode); break; case 'm': mrc_params->menu_after_mrc ^= 1; DPF(D_INFO, "Menu after mrc %d\n", mrc_params->menu_after_mrc); break; case 't': mrc_params->tune_rcvn ^= 1; DPF(D_INFO, "Tune to rcvn %d\n", mrc_params->tune_rcvn); break; case 'o': mrc_params->rd_odt_value = (mrc_params->rd_odt_value + 1) % 4; DPF(D_INFO, "Rd_odt_value %d\n", mrc_params->rd_odt_value); break; case 'd': mrc_params->params.DENSITY = (mrc_params->params.DENSITY + 1) % 4; DPF(D_INFO, "Dram density %d\n", mrc_params->params.DENSITY); break; case 'l': DpfPrintMask ^= 0x30; DPF(D_INFO, "Log mask %x\n", DpfPrintMask); break; default: break; } if (ch != 'c') goto myloop; } #endif // initially expect success mrc_params->status = MRC_SUCCESS; // todo!!! Setup board layout (must be reviewed as is selecting static timings) // 0 == R0 (DDR3 x16), 1 == R1 (DDR3 x16), 2 == DV (DDR3 x8), 3 == SV (DDR3 x8) if (mrc_params->dram_width == x8) { mrc_params->board_id = 2; // select x8 layout } else { mrc_params->board_id = 0; // select x16 layout } // initially no memory mrc_params->mem_size = 0; channel_i = 0; // begin of channel settings dram_width = mrc_params->dram_width; dram_params = &mrc_params->params; dram_cfg_index = 0; // Determine Column & Row Bits: // Column: // 11 for 8Gbx8, else 10 mrc_params->column_bits[channel_i] = ((dram_params[dram_cfg_index].DENSITY == 4) && (dram_width == x8)) ? (11) : (10); // Row: // 512Mbx16=12 512Mbx8=13 // 1Gbx16=13 1Gbx8=14 // 2Gbx16=14 2Gbx8=15 // 4Gbx16=15 4Gbx8=16 // 8Gbx16=16 8Gbx8=16 mrc_params->row_bits[channel_i] = 12 + (dram_params[dram_cfg_index].DENSITY) + (((dram_params[dram_cfg_index].DENSITY < 4) && (dram_width == x8)) ? (1) : (0)); // Determine Per Channel Memory Size: // (For 2 RANKs, multiply by 2) // (For 16 bit data bus, divide by 2) // DENSITY WIDTH MEM_AVAILABLE // 512Mb x16 0x008000000 ( 128MB) // 512Mb x8 0x010000000 ( 256MB) // 1Gb x16 0x010000000 ( 256MB) // 1Gb x8 0x020000000 ( 512MB) // 2Gb x16 0x020000000 ( 512MB) // 2Gb x8 0x040000000 (1024MB) // 4Gb x16 0x040000000 (1024MB) // 4Gb x8 0x080000000 (2048MB) mrc_params->channel_size[channel_i] = (1 << dram_params[dram_cfg_index].DENSITY); mrc_params->channel_size[channel_i] *= ((dram_width == x8) ? (2) : (1)); mrc_params->channel_size[channel_i] *= (mrc_params->rank_enables == 0x3) ? (2) : (1); mrc_params->channel_size[channel_i] *= (mrc_params->channel_width == x16) ? (1) : (2); // Determine memory size (convert number of 64MB/512Mb units) mrc_params->mem_size += mrc_params->channel_size[channel_i] << 26; // end of channel settings LEAVEFN(); return; }
int spellparse(void) { int first, last, pos; char byte, prefix[80]; int found = 0; int f, l; first = 0; while (first < NUMSPELLS && !Spells[spell_ids[first]].known) first++; if (first == NUMSPELLS) { print1("You don't know any spells!"); return ABORT; } last = NUMSPELLS - 1; pos = 0; print2(""); do { byte = mgetc(); if (byte == BACKSPACE || byte == DELETE_CHAR) { if (pos > 0) { prefix[--pos] = '\0'; byte = prefix[pos - 1]; f = first; while (f >= 0 && !strncmp(prefix, spell_names[f], pos)) { if (Spells[spell_ids[f]].known) first = f; f--; } l = last; while (l < NUMSPELLS && !strncmp(prefix, spell_names[l], pos)) { if (Spells[spell_ids[l]].known) last = l; l++; } if (found) found = 0; print2(prefix); } if (pos == 0) { first = 0; last = NUMSPELLS - 1; found = 0; print2(""); } } else if (byte == ESCAPE) { xredraw(); return ABORT; } else if (byte == '?') showknownspells(first, last); else if (byte != '\n') { if (byte >= 'A' && byte <= 'Z') byte += 'a' - 'A'; if (found) continue; f = first; l = last; while (f < NUMSPELLS && (!Spells[spell_ids[f]].known || strlen(spell_names[f]) < pos || spell_names[f][pos] < byte)) f++; while (l >= 0 && (!Spells[spell_ids[l]].known || strlen(spell_names[l]) < pos || spell_names[l][pos] > byte)) l--; if (l < f) continue; prefix[pos++] = byte; prefix[pos] = '\0'; nprint2(prefix + pos - 1); first = f; last = l; if (first == last && !found) { /* unique name */ found = 1; nprint2(spell_names[first] + pos); } } } while (byte != '\n'); xredraw(); if (found) return spell_ids[first]; else { print3("That is an ambiguous abbreviation!"); return ABORT; } }
void l_thieves_guild(void) { int fee,count,i,number,done=FALSE,dues=1000; char c,action; pob lockpick; print1("You have penetrated to the Lair of the Thieves' Guild."); if (! nighttime()) print2("There aren't any thieves around in the daytime."); else { if ((Player.rank[THIEVES]==TMASTER) && (Player.level > Shadowlordlevel) && find_and_remove_item(OB_JUSTICIAR_BADGE,-1)) { print2("You nicked the Justiciar's Badge!"); morewait(); print1("The Badge is put in a place of honor in the Guild Hall."); print2("You are now the Shadowlord of the Thieves' Guild!"); morewait(); print1("Who says there's no honor among thieves?"); strcpy(Shadowlord,Player.name); Shadowlordlevel = Player.level; morewait(); Shadowlordbehavior = fixnpc(4); save_hiscore_npc(7); clearmsg(); print1("You learn the Spell of Shadowform."); Spells[S_SHADOWFORM].known = TRUE; morewait(); clearmsg(); Player.rank[THIEVES]=SHADOWLORD; Player.maxagi += 2; Player.maxdex += 2; Player.agi += 2; Player.dex += 2; } while (! done) { menuclear(); if (Player.rank[THIEVES] == 0) menuprint("a: Join the Thieves' Guild.\n"); else menuprint("b: Raise your Guild rank.\n"); menuprint("c: Get an item identified.\n"); if (Player.rank[THIEVES] > 0) menuprint("d: Fence an item.\n"); menuprint("ESCAPE: Leave this Den of Iniquity."); showmenu(); action = mgetc(); if (action == ESCAPE) done = TRUE; else if (action == 'a') { done = TRUE; if (Player.rank[THIEVES]> 0) print2("You are already a member!"); else if (Player.alignment > 10) print2("You are too lawful to be a thief!"); else { dues += dues*(12-Player.dex)/9; dues += Player.alignment*5; dues = max(100,dues); clearmsg(); mprint("Dues are"); mnumprint(dues); mprint(" Au. Pay it? [yn] "); if (ynq1() =='y') { if (Player.cash < dues) { print1("You can't cheat the Thieves' Guild!"); print2("... but the Thieves' Guild can cheat you...."); Player.cash = 0; } else { print1("Shadowlord "); nprint1(Shadowlord); print2("enters your name into the roll of the Guild."); morewait(); clearmsg(); print1("As a special bonus, you get a free lockpick."); print2("You are taught the spell of Object Detection."); morewait(); Spells[S_OBJ_DET].known = TRUE; lockpick = ((pob) checkmalloc(sizeof(objtype))); *lockpick = Objects[OB_LOCK_PICK]; /* lock pick */ gain_item(lockpick); Player.cash -= dues; dataprint(); Player.guildxp[THIEVES]=1; Player.rank[THIEVES]=TMEMBER; Player.maxdex++;Player.dex++;Player.agi++;Player.maxagi++; } } } } else if (action == 'b') { if (Player.rank[THIEVES]==0) print2("You are not even a member!"); else if (Player.rank[THIEVES]==SHADOWLORD) print2("You can't get any higher than this!"); else if (Player.rank[THIEVES]==TMASTER) { if (Player.level <= Shadowlordlevel) print2("You are not experienced enough to advance."); else print2("You must bring back the Justiciar's Badge!"); } else if (Player.rank[THIEVES]==THIEF) { if (Player.guildxp[THIEVES] < 4000) print2("You are not experienced enough to advance."); else { print1("You are now a Master Thief of the Guild!"); print2("You are taught the Spell of Apportation."); morewait(); print1("To advance to the next level you must return with"); print2("the badge of the Justiciar (cursed be his name)."); morewait(); clearmsg(); print1("The Justiciar's office is just south of the gaol."); Spells[S_APPORT].known = TRUE; Player.rank[THIEVES]=TMASTER; Player.maxagi++; Player.maxdex++; Player.agi++; Player.dex++; } } else if (Player.rank[THIEVES]==ATHIEF) { if (Player.guildxp[THIEVES] < 1500) print2("You are not experienced enough to advance."); else { print1("You are now a ranking Thief of the Guild!"); print2("You learn the Spell of Invisibility."); Spells[S_INVISIBLE].known = TRUE; Player.rank[THIEVES]=THIEF; Player.agi++; Player.maxagi++; } } else if (Player.rank[THIEVES]==TMEMBER) { if (Player.guildxp[THIEVES] < 400) print2("You are not experienced enough to advance."); else { print1("You are now an Apprentice Thief!"); print2("You are taught the Spell of Levitation."); Spells[S_LEVITATE].known = TRUE; Player.rank[THIEVES]=ATHIEF; Player.dex++; Player.maxdex++; } } } else if (action == 'c') { if (Player.rank[THIEVES]==0) { print1("RTG, Inc, Appraisers. Identification Fee: 50Au/item."); fee = 50; } else { fee = 5; print1("The fee is 5Au per item."); } print2("Identify one item, or all possessions? [ip] "); if ((char) mcigetc()=='i') { if (Player.cash < fee) print2("Try again when you have the cash."); else { Player.cash -= fee; dataprint(); identify(0); } } else { count = 0; for(i=1;i<MAXITEMS;i++) if (Player.possessions[i] != NULL) if (Player.possessions[i]->known < 2) count++; for(i=0;i<Player.packptr;i++) if (Player.pack[i] != NULL) if (Player.pack[i]->known < 2) count++; clearmsg(); print1("The fee will be: "); mnumprint(max(count*fee,fee)); nprint1("Au. Pay it? [yn] "); if (ynq1()=='y') { if (Player.cash < max(count*fee,fee)) print2("Try again when you have the cash."); else { Player.cash -= max(count*fee,fee); dataprint(); identify(1); } } } } else if (action == 'd') { if (Player.rank[THIEVES]==0) print2("Fence? Who said anything about a fence?"); else { print1("Fence one item or go through pack? [ip] "); if ((char) mcigetc()=='i') { i = getitem(NULL_ITEM); if ((i==ABORT) || (Player.possessions[i] == NULL)) print2("Huh, Is this some kind of set-up?"); else if (Player.possessions[i]->blessing < 0) print2("I don't want to buy a cursed item!"); else { clearmsg(); print1("I'll give you "); mlongprint(2 * item_value(Player.possessions[i]) / 3); nprint1("Au each. OK? [yn] "); if (ynq1() == 'y') { number = getnumber(Player.possessions[i]->number); if ((number >= Player.possessions[i]->number) && Player.possessions[i]->used) { Player.possessions[i]->used = FALSE; item_use(Player.possessions[i]); } Player.cash += number*2*item_value(Player.possessions[i])/3; /* Fenced artifacts could turn up anywhere, really... */ if (Objects[Player.possessions[i]->id].uniqueness > UNIQUE_UNMADE) Objects[Player.possessions[i]->id].uniqueness = UNIQUE_UNMADE; dispose_lost_objects(number,Player.possessions[i]); dataprint(); } else print2("Hey, gimme a break, it was a fair price!"); } } else { for(i=0;i<Player.packptr;i++) { if (Player.pack[i]->blessing > -1) { clearmsg(); print1("Sell "); nprint1(itemid(Player.pack[i])); nprint1(" for "); mlongprint(2*item_value(Player.pack[i])/3); nprint1("Au each? [ynq] "); if ((c=ynq1())=='y') { number = getnumber(Player.pack[i]->number); Player.cash += 2*number * item_value(Player.pack[i]) / 3; Player.pack[i]->number -= number; if (Player.pack[i]->number < 1) { /* Fenced an artifact? You just might see it again. */ if (Objects[Player.pack[i]->id].uniqueness > UNIQUE_UNMADE) Objects[Player.pack[i]->id].uniqueness = UNIQUE_UNMADE; free((char *)Player.pack[i]); Player.pack[i] = NULL; } dataprint(); } else if (c=='q') break; } } fixpack(); } } } } } xredraw(); }