#include "std.h" #include "tune.h" #undef EXTRA_RESET #define EXTRA_RESET\ if (!arg)\ move_object("obj/book", this_object()); #undef EXTRA_INIT #define EXTRA_INIT\ add_action("cost_for_level"); add_verb("cost");\ add_action("advance"); add_verb("advance");\ add_action("banish"); add_verb("banish"); ONE_EXIT("room/vill_road2", "north", "The adventurers guild", "You have to come here when you want to advance your level.\nYou can also buy points for a new level.\nCommands: cost, advance.\n", 1) int next_level; int next_exp; int level; int exp; int title; object player_ob; string banished_by; get_level() { if (level == 19) { next_exp = 1250000; next_level = 20; title = "the apprentice Wizard"; return; } if (level == 18) { next_exp = 850000; next_level = 19; title = "the greater necromancer"; return; } if (level == 17) { next_exp = 550000; next_level = 18; title = "the necromancer"; return; } if (level == 16) { next_exp = 350000; next_level = 17; title = "the master sorcerer"; return; } if (level == 15) { next_exp = 200000; next_level = 16; title = "the sorcerer"; return; } if (level == 14) { next_exp = 130000; next_level = 15; title = "the lesser sorcerer"; return; } if (level == 13) { next_exp = 100000; next_level = 14; title = "the master magician"; return; } if (level == 12) { next_exp = 80000; next_level = 13; title = "the journeyman magician"; return; } if (level == 11) { next_exp = 60000; next_level = 12; title = "the apprentice magician"; return; } if (level == 10) { next_exp = 40000; next_level = 11; title = "the great champion"; return; } if (level == 9) { next_exp = 25000; next_level = 10; title = "the champion"; return; } if (level == 8) { next_exp = 17500; next_level = 9; title = "the myrmidon"; return; } if (level == 7) { next_level = 8; next_exp = 12500; title = "the great adventurer"; return; } if (level == 6) { next_level = 7; next_exp = 7500; title = "the expert adventurer"; return; } if (level == 5) { next_level = 6; next_exp = 5000; title = "the experienced adventurer"; return; } if (level == 4) { next_level = 5; next_exp = 3500; title = "the small adventurer"; return; } if (level == 3) { next_level = 4; next_exp = 2000; title = "the medium beginner"; return; } if (level == 2) { next_level = 3; next_exp = 1000; title = "the lowrank beginner"; return; } if (level == 1) { next_level = 2; next_exp = 250; title = "the simple novice"; return; } title = "the utter novice"; next_level = 1; next_exp = 0; } /* * This routine is called by monster, to calculate how much they are worth. * This value should not depend on the tuning. */ query_cost(l) { player_ob = this_player(); level = l; if (level >= 20) return 1000000; get_level(); return next_exp; } cost_for_level() { player_ob = this_player(); level = call_other(player_ob, "query_level", 0); if (level >= 20) { write("You will have to seek other ways.\n"); return 1; } exp = call_other(player_ob, "query_exp", 0); get_level(); if (next_exp <= exp) { write("It will cost you nothing to be promoted.\n"); return 1; } write("It will cost you "); write((next_exp - exp) * 1000 / EXP_COST); write(" gold coins to advance to level "); write(next_level); write(".\n"); return 1; } advance() { string name_of_player; int cost; player_ob = this_player(); name_of_player = call_other(player_ob, "query_name", 0); level = call_other(player_ob, "query_level", 0); exp = call_other(player_ob, "query_exp", 0); title = call_other(player_ob, "query_title", 0); if (level >= 20) { write("You are still "); write(title); write("\n"); return 1; } get_level(); cost = (next_exp - exp) * 1000 / EXP_COST; if (next_exp > exp) { if (call_other(player_ob, "query_money", 0) < cost) { write("You don't have enough gold coins.\n"); return 1; } call_other(player_ob, "add_money", - cost); } say(call_other(player_ob, "query_name", 0) + " is now level " + next_level + ".\n"); call_other(player_ob, "set_level", next_level); call_other(player_ob, "set_title", title); if (exp < next_exp) call_other(player_ob, "add_exp", next_exp - exp); write("The guild secretary makes a note in the records...\nSaving character...\n"); call_other(player_ob,"save_character"); if (next_level < 7) { write("You are now " + name_of_player + " " + title + " (level " + next_level + ").\n"); return 1; } if (next_level < 14) { write("Well done, " + name_of_player + " " + title + " (level " + next_level + ").\n"); return 1; } if (next_level < 20) { write("Welcome to your new class, mighty one.\n" + "You are now " + title + " (level " + next_level + ").\n"); } if (next_level == 20) { write("A new Wizard has been born!\n"); shout("A new Wizard has been born!\n"); write("If you want a castle of your own, seek out Leo the archwizard,\n"); write("and ask him. Before you do, however, decide where you want to\n"); write("put it. You don't need to ask him for it now. Feel free to wait.\n"); return 1; } } /* * Banish a monster name from being used. */ banish(who) { level = call_other(this_player(), "query_level"); if (level < 21) return 0; if (!who) { write("Who ?\n"); return 1; } if (!call_other(this_player(), "valid_name", who)) return 1; if (restore_object("players/" + who)) { write("That name is already used.\n"); return 1; } if (restore_object("banish/" + who)) { write("That name is already banished.\n"); return 1; } banished_by = call_other(this_player(), "query_name"); title = call_other(this_player(), "query_title"); if (banished_by == "Someone") { write("You must not be invisible!\n"); return 1; } save_object("banish/" + who); return 1; } /* This function checks a person's experience, and makes sure that they are not a higher level than they should be. Useful for after death, etc. */ correct_level(player) { level = call_other(player, "query_level", 0); exp = call_other(player, "query_exp", 0); /* Shouldn't "correct" wizards. */ if (level >= 20) return; get_level(); while (exp < next_exp) { level -= 1; get_level(); } call_other(player, "set_level", next_level); call_other(player, "set_title", title); }