/* Has all kinds of effects in different circumstances. Eventually will be more interesting */ void s_ritual(void) { pob symbol; int i,roomno; int x,y; mprint("You begin your ritual...."); mprint("You enter a deep trance. Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); if (RitualHour == hour()) mprint("Your mental fatigue prevents from completing the ritual!"); else if (random_range(100) > Player.iq+Player.pow+Player.level) mprint("Your concentration was broken -- the ritual fails!"); else { mprint("You charge the ritual with magical energy and focus your will."); mprint("Time Passes..."); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); setgamestatus(SKIP_PLAYER); time_clock(FALSE); RitualHour = hour(); /* set of random conditions for different ritual effects */ if (Current_Environment == E_CITY) { mprint("Flowing waves of mystical light congeal all around you."); mprint("'Like wow, man! Colors!'"); mprint("Appreciative citizens throw you spare change."); Player.cash +=random_range(50); } else if ( (roomno=Level->site[Player.x][Player.y].roomnumber) >= ROOMBASE ) { if (RitualRoom == roomno) mprint("For some reason the ritual doesn't work this time..."); else { RitualRoom = roomno; switch (RitualRoom) { case RS_TREASURE: /* ransacked treasure chamber */ mprint("Your spell sets off frenetic growth all around you!"); for(i=0; i<8; i++) { Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].locchar = HEDGE; Level->site[Player.x+Dirs[0][i]][Player.y+Dirs[1][i]].p_locf = L_TRIFID; lset(Player.x+Dirs[0][i], Player.y+Dirs[1][i], CHANGED); } break; case RS_HAREM: /* harem */ case RS_BOUDOIR: /* boudoir */ mprint("A secret panel opens next to the bed...."); if (random_range(2)) summon(0,INCUBUS); /* succubus/incubus */ else summon(0,SATYR); /* satyr/nymph */ break; case RS_SHRINE: /*shrine to high magic */ mprint("A storm of mana coaelesces around you."); mprint("You are buffeted by bursts of random magic."); p_damage(random_range(Player.pow),UNSTOPPABLE,"high magic"); mprint("Continue ritual? Could be dangerous.... [yn] "); if (ynq()=='y') s_wish(); else mprint("The mana fades away to nothingness."); x = Player.x; y = Player.y; while (x >= 0 && Level->site[x - 1][y].roomnumber == RS_SHRINE) x--; while (y >= 0 && Level->site[x][y - 1].roomnumber == RS_SHRINE) y--; for (i = 0; Level->site[x][y].roomnumber == RS_SHRINE;) { Level->site[x][y].roomnumber = RS_ZORCH; lset(x, y, CHANGED); x++; i++; if (Level->site[x][y].roomnumber != RS_SHRINE) { x -= i; i = 0; y++; } } break; case RS_MAGIC_LAB: /* magician's lab */ mprint("Your magical activity sets off a latent spell in the lab!"); cast_spell(random_range(NUMSPELLS)); break; case RS_PENTAGRAM: /* pentagram room */ mprint("A smoky form begins to coalesce...."); summon(-1,-1); mprint("Fortunately, it seems confined to the pentagram."); m_status_reset(Level->mlist->m,MOBILE); break; case RS_OMEGA_DAIS: /* blue omega room */ mprint("The Lords of Destiny look upon you...."); if (Player.level > 10) { mprint("A curtain of blue flames leaps up from the omega."); morewait(); l_adept(); } else { if (Player.patron == DESTINY) { mprint("Your patrons take pity on you."); if ((Player.rank[PRIESTHOOD]<SPRIEST) && (! find_item(&symbol,OB_SYMBOL_DESTINY,-1))) { symbol = ((pob) checkmalloc(sizeof(objtype))); *symbol = Objects[OB_SYMBOL_DESTINY]; symbol->known = 2; symbol->charge = 17; gain_item(symbol); mprint("You feel uplifted."); } else gain_experience(min(1000,Player.xp)); } else if (random_range(3)==1) { mprint("You feel Fated."); gain_experience(Player.level*Player.level*10); Player.hp = max(Player.hp, Player.maxhp); } else if (random_range(2)) { mprint("You feel Doomed."); Player.hp = 1; Player.mana = 0; Player.xp = 0; } else mprint("The Lords of Destiny laugh at you!"); } break; default: mprint("Well, not much effect. Chalk it up to experience."); gain_experience(Player.level*5); break; } } } else { if (RitualRoom == Level->site[Player.x][Player.y].roomnumber) mprint("The ritual fails for some unexplainable reason."); else { mprint("The ritual seems to be generating some spell effect."); RitualRoom = Level->site[Player.x][Player.y].roomnumber; switch (RitualRoom) { case RS_WALLSPACE: shadowform(); break; case RS_CORRIDOR: haste(0); break; case RS_PONDS: breathe(0); break; case RS_ADEPT: hero(1); break; default: mprint("The ritual doesn't seem to produce any tangible results..."); gain_experience(Player.level*6); } } } } }
void p_movefunction(int movef) { /* loc functs above traps should be activated whether levitating or not */ drawvision(Player.x,Player.y); sign_print(Player.x,Player.y,false); if (Player.status[SHADOWFORM]) switch(movef) { /* player in shadow form is unable to do most things */ case L_CHAOS: l_chaos(); break; case L_ABYSS: l_abyss(); break; case L_ARENA_EXIT: l_arena_exit(); break; case L_ENTER_COURT: l_enter_court(); break; case L_ESCALATOR: l_escalator(); break; case L_COLLEGE: l_college(); break; case L_SORCERORS: l_sorcerors(); break; case L_ALTAR: l_altar(); break; case L_TACTICAL_EXIT: l_tactical_exit(); break; case L_HOUSE_EXIT: l_house_exit(); break; case L_HOUSE: l_house(); break; case L_HOVEL: l_hovel(); break; case L_MANSION: l_mansion(); break; case L_COUNTRYSIDE: l_countryside(); break; case L_ORACLE: l_oracle(); break; case L_TEMPLE_WARNING: l_temple_warning(); break; case L_ENTER_CIRCLE: l_enter_circle(); break; case L_CIRCLE_LIBRARY: l_circle_library(); break; case L_TOME1: l_tome1(); break; case L_TOME2: l_tome2(); break; case L_ADEPT: l_adept(); break; case L_VOICE1: l_voice1(); break; case L_VOICE2: l_voice2(); break; case L_VOICE3: l_voice3(); break; case L_VOID: l_void(); break; case L_FIRE_STATION: l_fire_station(); break; case L_EARTH_STATION: l_earth_station(); break; case L_WATER_STATION: l_water_station(); break; case L_AIR_STATION: l_air_station(); break; case L_VOID_STATION: l_void_station(); break; } else if ((! Player.status[LEVITATING]) || State.getMounted() || (Cmd == '@') || /* @ command activates all effects under player */ (movef < LEVITATION_AVOIDANCE)) { if (movef != L_NO_OP) { State.setFastMove(false); dataprint(); } switch(movef) { /* miscellaneous */ case L_NO_OP: l_no_op(); break; case L_HEDGE: l_hedge(); break; case L_WATER: l_water(); break; case L_LIFT: l_lift(); break; case L_LAVA: l_lava(); break; case L_FIRE: l_fire(); break; case L_WHIRLWIND: l_whirlwind(); break; case L_RUBBLE: l_rubble(); break; case L_MAGIC_POOL: l_magic_pool(); break; case L_CHAOS: l_chaos(); break; case L_ABYSS: l_abyss(); break; case L_PORTCULLIS_TRAP: l_portcullis_trap(); break; case L_RAISE_PORTCULLIS: l_raise_portcullis(); break; case L_DROP_EVERY_PORTCULLIS: l_drop_every_portcullis(); break; case L_ARENA_EXIT: l_arena_exit(); break; case L_TRIFID: l_trifid(); break; case L_ENTER_COURT: l_enter_court(); break; case L_ESCALATOR: l_escalator(); break; case L_THRONE: l_throne(); break; case L_TRAP_DART: l_trap_dart(); break; case L_TRAP_SIREN: l_trap_siren(); break; case L_TRAP_PIT: l_trap_pit(); break; case L_TRAP_DOOR: l_trap_door(); break; case L_TRAP_SNARE: l_trap_snare(); break; case L_TRAP_BLADE: l_trap_blade(); break; case L_TRAP_FIRE: l_trap_fire(); break; case L_TRAP_TELEPORT: l_trap_teleport(); break; case L_TRAP_DISINTEGRATE: l_trap_disintegrate(); break; case L_TRAP_SLEEP_GAS: l_trap_sleepgas(); break; case L_TRAP_MANADRAIN: l_trap_manadrain(); break; case L_TRAP_ACID: l_trap_acid(); break; case L_TRAP_ABYSS: l_trap_abyss(); break; /*door functions */ case L_BANK: l_bank(); break; case L_ARMORER: l_armorer(); break; case L_CLUB: l_club(); break; case L_GYM: l_gym(); break; case L_BROTHEL: l_brothel(); break; case L_THIEVES_GUILD: l_thieves_guild(); break; case L_COLLEGE: l_college(); break; case L_HEALER: l_healer(); break; case L_STATUE_WAKE: l_statue_wake(); break; case L_CASINO: l_casino(); break; case L_COMMANDANT: l_commandant(); break; case L_DINER: l_diner(); break; case L_CRAP: l_crap(); break; case L_TAVERN: l_tavern(); break; case L_MERC_GUILD: l_merc_guild(); break; case L_MONASTERY: l_monastery(); break; case L_ALCHEMIST: l_alchemist(); break; case L_SORCERORS: l_sorcerors(); break; case L_CASTLE: l_castle(); break; case L_ARENA: l_arena(); break; case L_VAULT: l_vault(); break; case L_DPW: l_dpw(); break; case L_LIBRARY: l_library(); break; case L_PAWN_SHOP: l_pawn_shop(); break; case L_CONDO: l_condo(); break; case L_TOURIST: l_tourist(); break; case L_ALTAR: l_altar(); break; case L_TACTICAL_EXIT: l_tactical_exit(); break; case L_HOUSE_EXIT: l_house_exit(); break; case L_SAFE: l_safe(); break; case L_HOUSE: l_house(); break; case L_HOVEL: l_hovel(); break; case L_MANSION: l_mansion(); break; case L_COUNTRYSIDE: l_countryside(); break; case L_ORACLE: l_oracle(); break; case L_ORDER: l_order(); break; case L_CARTOGRAPHER: l_cartographer(); break; case L_TEMPLE_WARNING: l_temple_warning(); break; case L_ENTER_CIRCLE: l_enter_circle(); break; case L_CIRCLE_LIBRARY: l_circle_library(); break; case L_TOME1: l_tome1(); break; case L_TOME2: l_tome2(); break; case L_CHARITY: l_charity(); break; case L_CHAOSTONE: l_chaostone(); break; case L_VOIDSTONE: l_voidstone(); break; case L_BALANCESTONE: l_balancestone(); break; case L_LAWSTONE: l_lawstone(); break; case L_SACRIFICESTONE: l_sacrificestone(); break; case L_MINDSTONE: l_mindstone(); break; /* challenge functions */ case L_ADEPT: l_adept(); break; case L_VOICE1: l_voice1(); break; case L_VOICE2: l_voice2(); break; case L_VOICE3: l_voice3(); break; case L_VOID: l_void(); break; case L_FIRE_STATION: l_fire_station(); break; case L_EARTH_STATION: l_earth_station(); break; case L_WATER_STATION: l_water_station(); break; case L_AIR_STATION: l_air_station(); break; case L_VOID_STATION: l_void_station(); break; } } }