/************************************************************************
Realms of Aurealis James Rhone aka Vall of RoA
madept.c Code relating to the Madept class
******** 100% Completely Original Code ********
*** BE AWARE OF ALL RIGHTS AND RESERVATIONS ***
******** 100% Completely Original Code ********
All rights reserved henceforth.
Please note that no guarantees are associated with any code from
Realms of Aurealis. All code which has been released to the general
public has been done so with an 'as is' pretense. RoA is based on both
Diku and CircleMUD and ALL licenses from both *MUST* be adhered to as well
as the RoA license. *** Read, Learn, Understand, Improve ***
*************************************************************************/
#include "conf.h"
#include "sysdep.h"
#include "structures.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "acmd.h"
#include "handler.h"
#include "db.h"
#include "roaolc.h"
#include "magic.h"
#include "madept.h"
#include "affect.h"
#include "fight.h"
#include "global.h"
// internal functions...
ROA_MENU(madedit_top_menu);
ROA_MENU(madedit_circle_menu);
ROA_MENU(madedit_confirm_quit);
ROA_MENU(madedit_confirm_quit_final);
// assign initial creation points, send intro, etc
void init_madept(chdata *ch)
{
// determine CP based on INT and WIS
CP(ch) = (GET_INT(ch) + GET_WIS(ch)) * 15;
// ok allocate && assign
CREATE(ch->tmp_skills, skl_info, MAX_SKILLS);
memcpy(ch->tmp_skills, ch->skills, sizeof(skl_info) * MAX_SKILLS);
// set this flag... won't be able to choose
SET_BIT(PLR_FLAGS(ch), PLR_BUILDING);
MENU_DEPTH(ch) = 0;
ch->pc_specials->field_changed = FALSE;
menu_jump(ch, madedit_top_menu);
}
ACMD(do_madept)
{
if (IS_IMMORTAL(ch))
init_madept(ch);
else
if (IS_NAT_MADEPT(ch) && GET_LEVEL(ch) <= 1 && !PRF2_FLAGGED(ch, PRF2_CHOSEN))
init_madept(ch);
else
send_to_char("You are unable to do such.\n\r",ch);
}
// how much CP do spells in this circle cost?
int madept_cost(int circle)
{
return circle * 10;
}
ROA_MENU(madedit_top_menu)
{
char *p;
int field, i;
if (!input_str)
{
if (PLR_FLAGGED(ch, PLR_REFRESH))
clrscr(ch);
send_to_char("\n\r %B%5Madept Main Menu%0\n\n\r",ch);
sprintf(buf, "%%B%%5Creation Points%%0: %d\n\n\r", CP(ch));
S2C();
for (i = 1; i < 8; i++)
{
sprintf(buf, "%d.) %%6Circle %d%%0: levels %d - %d, %d pts per spell.\n\r",
i, i, (i*10)-9, (i*10), madept_cost(i));
S2C();
}
send_to_char("\n\r", ch);
CIRCLE_NUM(ch) = 0;
MENU_PROMPT(ch) = "Enter your choice: ";
return;
}
strcpy(buf, input_str);
p = strtok(buf, " \n\r");
if (p)
field = atoi(p);
else
field = 0;
if (!field)
menu_jump(ch, madedit_confirm_quit);
else
if (field < 1 || field > 7)
send_to_char("That field cannot be changed.\n\r", ch);
else
{
CIRCLE_NUM(ch) = field;
menu_push_jump(ch, madedit_circle_menu);
}
}
ROA_MENU(madedit_circle_menu)
{
char *p;
int field, i, j, k, low, high;
int top;
// each circle / range is 10 levels
low = CIRCLE_NUM(ch) * 10 - 9;
high= CIRCLE_NUM(ch) * 10;
if (!input_str)
{
if (PLR_FLAGGED(ch, PLR_REFRESH))
clrscr(ch);
send_to_char("\n\r %B%5Madept Spell Choice Menu%0\n\n\r",ch);
sprintf(buf, "%%B%%5Creation Points%%0: %d\n\n\r", CP(ch));
S2C();
for (i = k = 0, j = 1; i < MAX_SKILLS; i++)
if (clarray[CLASS_MADEPT].skills[i].minlevel >= low && clarray[CLASS_MADEPT].skills[i].minlevel <= high)
{
sprintf(buf, "%d.) %%B%s%%0%%5%-20.20s%%0", j, ch->tmp_skills[i].learned ? "* ":"", skill_names[i]);
if ( (k = !k) )
strcat(buf, "\t");
else
strcat(buf, "\n\r");
S2C();
j++;
}
send_to_char("\n\r", ch);
MENU_PROMPT(ch) = "Enter your choice: ";
return;
}
// get choice bounds...
for (i = 0, top = 1; i < MAX_SKILLS; i++)
if (clarray[CLASS_MADEPT].skills[i].minlevel >= low && clarray[CLASS_MADEPT].skills[i].minlevel <= high)
top++;
strcpy(buf, input_str);
p = strtok(buf, " \n\r");
if (p)
field = atoi(p);
else
field = 0;
if (!field)
{
menu_back(ch);
return;
}
else
if (field < 1 || field >= top)
send_to_char("That field cannot be changed.\n\r", ch);
else
{
for (i = 0, k = 1; i < MAX_SKILLS; i++)
if (clarray[CLASS_MADEPT].skills[i].minlevel >= low && clarray[CLASS_MADEPT].skills[i].minlevel <= high)
{
if (k == field)
break;
else
k++;
}
if (k != field) return;
if (!ch->tmp_skills[i].learned)
{
if (CP(ch) >= madept_cost(CIRCLE_NUM(ch)))
{
ch->tmp_skills[i].learned = TRUE;
CP(ch) -= madept_cost(CIRCLE_NUM(ch));
}
}
else
{
ch->tmp_skills[i].learned = FALSE;
CP(ch) += madept_cost(CIRCLE_NUM(ch));
}
}
menu_jump(ch, madedit_circle_menu);
}
ROA_MENU(madedit_confirm_quit_final)
{
char buf[MAX_STRING_LENGTH];
char *p;
if (!input_str)
{
MENU_PROMPT(ch) = "Are you ABSOLUTELY sure (yes/NO)? ";
return;
}
strcpy(buf, input_str);
p = strtok(buf, " \n\r");
if (p && strncasecmp("yes", p, strlen(p)) == 0)
{
// copy back now... and free the temps
if (ch->tmp_skills)
memcpy(ch->skills, ch->tmp_skills, sizeof(skl_info) * MAX_SKILLS);
FREENULL(ch->tmp_skills);
MENU_PROMPT(ch) = NULL;
MENU_HANDLER(ch) = NULL;
MENU_DEPTH(ch) = 0;
REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING);
SET_BIT(PRF2_FLAGS(ch), PRF2_CHOSEN);
}
else
menu_jump(ch, madedit_top_menu);
}
// first quit called...
ROA_MENU(madedit_confirm_quit)
{
char buf[MAX_STRING_LENGTH];
char *p;
if (!input_str)
{
MENU_PROMPT(ch) = "Are you finished (yes/NO)? ";
return;
}
strcpy(buf, input_str);
p = strtok(buf, " \n\r");
if (p && strncasecmp("yes", p, strlen(p)) == 0)
menu_jump(ch, madedit_confirm_quit_final);
else
menu_jump(ch, madedit_top_menu);
}