/
roa/
roa/lib/boards/
roa/lib/config/
roa/lib/edits/
roa/lib/help/
roa/lib/misc/
roa/lib/plrobjs/
roa/lib/quests/
roa/lib/socials/
roa/lib/www/
roa/lib/www/LEDSign/
roa/lib/www/LEDSign/fonts/
roa/lib/www/LEDSign/scripts/
roa/src/s_inc/
roa/src/sclient/
roa/src/sclient/binary/
roa/src/sclient/text/
roa/src/util/
/************************************************************************
	Realms of Aurealis 		James Rhone aka Vall of RoA

htown.c 				Basically code related to hometown
					manipulation.

		******** 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 "lists.h"
#include "global.h"
#include "htown.h"

// global variables
struct htown_data htowns[MAX_HTOWNS];
char *menu_types[] = {
  "Hidden",
  "Visible",
  "\n"
};

// function protos
ROA_MENU(htedit_top_menu);
ROA_MENU(htedit_confirm_quit);
ROA_MENU(htedit_confirm_save);

void clear_htowns(void)
{
  memset((char *)&htowns, 0, sizeof(htowns));
}

void assign_htown(int num, char *name, int gate, int races[], BOOL on_menu)
{
  int i;

  htowns[num].name = STR_DUP(name);
  htowns[num].rvnum = gate;
  htowns[num].on_menu = on_menu;

  for (i=1; i <= NUM_RACES; i++)
    htowns[num].races[i] = races[i];
}

void use_default_htowns(void)
{
  int rc[NUM_RACES + 1];

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ELF] = 1;
  rc[RACE_HALF_ELF] = 1;
  assign_htown(0, "Mesraht", DEF_GATEWAY, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ORC] = 1;
  rc[RACE_DWARF] = 1;
  assign_htown(1, "Old Sparta", 21083, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_DROW] = 1;
  assign_htown(2, "Sshanntynlan", 5101, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_HALF_ELF] = 1;
  assign_htown(3, "Stanneg", 3700, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_ELF] = 1;
  assign_htown(4, "Sylvandell", 19000, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ELF] = 1;
  rc[RACE_HALF_ELF] = 1;
  rc[RACE_ORC] = 1;
  rc[RACE_DWARF] = 1;
  rc[RACE_PIXIE] = 1;
  rc[RACE_NIXIE] = 1;
  assign_htown(5, "Nirenoft", 11500, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HALF_ELF] = 1;
  assign_htown(6, "Yarrowshire", 1457, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_DRAGON] = 1;
  assign_htown(7, "Triumveraal", 12779, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_OGRE] = 1;
  assign_htown(8, "Uk'Rusht", 18086, rc, 1);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ELF] = 1;
  rc[RACE_HALF_ELF] = 1;
  rc[RACE_ORC] = 1;
  rc[RACE_OGRE] = 1;
  rc[RACE_DROW] = 1;
  rc[RACE_DWARF] = 1;
  rc[RACE_PIXIE] = 1;
  rc[RACE_NIXIE] = 1;
  rc[RACE_DRAGON] = 1;
  assign_htown(9, "Aria", 12100, rc, 0);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ELF] = 1;
  rc[RACE_HALF_ELF] = 1;
  rc[RACE_ORC] = 1;
  rc[RACE_OGRE] = 1;
  rc[RACE_DROW] = 1;
  rc[RACE_DWARF] = 1;
  rc[RACE_PIXIE] = 1;
  rc[RACE_NIXIE] = 1;
  rc[RACE_DRAGON] = 1;
  assign_htown(10,"New Kerofk", 8044, rc, 0);

  memset((char*)&rc, 0, sizeof(rc));
  rc[RACE_HUMAN] = 1;
  rc[RACE_ELF] = 1;
  rc[RACE_HALF_ELF] = 1;
  rc[RACE_DWARF] = 1;
  rc[RACE_PIXIE] = 1;
  rc[RACE_NIXIE] = 1;
  rc[RACE_DRAGON] = 1;
  assign_htown(11,"Twin Towns", 1300, rc, 0);
}

ACMD(do_htlist)
{
  int i;

  strcpy(buf, "%B%6Current Hometown Table%0:\n\r");
  for (i = 0; i < MAX_HTOWNS && htowns[i].name; i++)
    sprintf(buf+strlen(buf), "%2d) %%5%-20.20s%%0    %%5Gateway%%0: %d\n\r",i, htowns[i].name, htowns[i].rvnum);

  page_string(ch->desc, buf, 1);
}

ACMD(do_htstat)
{
  int i, j;

  one_argument(argument, arg);

  if (!*arg || !is_number(arg))
  {
    send_to_char("Usage: htstat <hometown index #>.\n\r",ch);
    return;
  }

  i = atoi(arg);
  if (i < 0 || i >= MAX_HTOWNS)
  {
    sprintf(buf, "Homwtown index must be between 0 and %d.\n\r",MAX_HTOWNS-1);
    S2C();
    return;
  }  

  if (!htowns[i].name)
  {
    send_to_char("Invalid index.  See htlist.\n\r",ch);
    return;
  }

  // ok, show the stats of a particular hometown
  sprintf(buf, "%%B%%6Hometown Statistics%%0: %%5%%B%s%%0\n\r", htowns[i].name);
  sprintf(buf+strlen(buf),"%%6Gateway vnum%%0: %d, ", htowns[i].rvnum);
  sprintf(buf+strlen(buf),"%%6On Selection Menu%%0: %s", YESNO(htowns[i].on_menu));
  sprintf(buf+strlen(buf),"\n\r%%6Races allowed%%0:\n\r");
  for (j = 1; j <= NUM_RACES; j++)
    sprintf(buf+strlen(buf), "  %%6%-15.15s%%0: %s\n\r", rcarray[j].race_name, YESNO(htowns[i].races[j]));

  strcat(buf, "\n\r");
  page_string(ch->desc, buf, 1); 
}

void save_htowns(void)
{
  FILE *fp;
  int i, j;

  if (!(fp = fopen(HTOWNS_FILE, "wt")))
  {
    mudlog("SYSERR: Unable to open HTOWNS_FILE for writing.", BRF, LEV_IMM, TRUE);
    return;
  }

  for (i = 0; i < MAX_HTOWNS && htowns[i].name; i++)
  {
    fprintf(fp, "%d %d ", htowns[i].rvnum, htowns[i].on_menu);
    for (j = 1; j <= NUM_RACES; j++)
      fprintf(fp, "%d ", htowns[i].races[j]);
    fprintf(fp, "%s\n", htowns[i].name);
  }
  fprintf(fp, "$~\n");
  fclose(fp);
}

ACMD(do_htsave)
{
  if (IS_NPC(ch)) return;

  save_htowns();
  send_to_char("Ok.\n\r",ch);

  mudlog("SYSUPD: Hometown configuration saved.", BUG, LEV_IMM, TRUE);
}

BOOL load_htowns(void)
{
  FILE *fp;
  int i, j;
  char letter = '\0';
  int rc[NUM_RACES+1];
  int rvnum, onmenu;

  if (!(fp = fopen(HTOWNS_FILE, "rt")))
    return FALSE;
  
  i = 0;
  while (TRUE)
  {
    letter=fread_letter(fp);
    ungetc(letter, fp);

    if (i >= MAX_HTOWNS || letter == '$' || letter == '~')
      break;

    fscanf(fp, "%d %d ", &rvnum, &onmenu);
    for (j = 1; j <= NUM_RACES; j++)
      fscanf(fp, "%d ", &rc[j]);
    fgets(buf, 80, fp);
    
    // get rid of the newline...
    buf[strlen(buf)-1] = '\0';
    
    // now assign it...
    assign_htown(i, buf, rvnum, rc, onmenu);
    i++;
  }
  fclose(fp);

  mudlog("SYSUPD: Hometown configuration read from file.",BUG, LEV_IMM, TRUE); 
  return TRUE;
}

void init_htowns(void)
{
  clear_htowns();

  if (!load_htowns())
  {
    use_default_htowns();
    mudlog("SYSUPD: Default hometown configuration used.",BUG, LEV_IMM, TRUE); 
  }
}

//==================================================================
//
// RoA OLHTC (OnLine Hometown Creation)
//
// Started 01/12/98 
//
//==================================================================

// scan list for first empty slot...
int get_available_htown_slot(void)
{
  int i;

  for (i = 0; i < MAX_HTOWNS && htowns[i].name; i++)
    ;

  if (i < MAX_HTOWNS && !htowns[i].name)
    return i;
  else
    return -1;
}

void wax_htown(htdata *h)
{
  FREENULL(h->name);
  FREENULL(h);
}

void dupe_htowns_over(htdata *src, htdata *dest)
{
  FREENULL(dest->name);
  *dest = *src;
  dest->name = STR_DUP(src->name);
}

// immortal ability to allocate new htown slot, 
ACMD(do_htcreate)
{
  htdata *ptr;
  int id;

  if (IS_NPC(ch))  return;

  id = get_available_htown_slot();
  if (id < 0)
  {
    mudlog("SYSERR: Unable to get available htown slot.", BRF, LEV_IMM, TRUE);
    return;
  }

  // ok allocate, assign, insert...
  CREATE(ptr, htdata, 1);

  // now send them into the menu...
  HTOWN_EDITTED(ch) = ptr;
  HTOWN_SLOT(ch)    = id;

  SET_BIT(PLR_FLAGS(ch), PLR_BUILDING);
  MENU_DEPTH(ch) = 0;
  ch->pc_specials->field_changed = FALSE;
  menu_jump(ch, htedit_top_menu);
}

ACMD(do_htedit)
{
  char *argu = argument;
  int id;
  htdata *ptr;

  if (IS_NPC(ch))  return;

  skip_spaces(&argu);
  if (!*argu || !is_number(argu))
  {
    send_to_char("Usage: htedit <hometown slot#>.\n\r",ch);
    return;
  }

  id = atoi(argu);
  if (id < 0 || id > MAX_HTOWNS || !htowns[id].name)
  {
    send_to_char("Unable to locate a hometown in that slot.\n\r",ch);
    return;
  }

  CREATE(ptr, htdata, 1);
  dupe_htowns_over(&htowns[id], ptr);
  HTOWN_EDITTED(ch) = ptr;
  HTOWN_SLOT(ch)    = id;

  SET_BIT(PLR_FLAGS(ch), PLR_BUILDING);
  MENU_DEPTH(ch) = 0;
  ch->pc_specials->field_changed = FALSE;

  menu_jump(ch, htedit_top_menu);
}

ROA_MENU(htedit_top_menu)
{
  char *p;
  int field, i;
  htdata *h = HTOWN_EDITTED(ch);

  if (!input_str)
  {
    menu_title_send("HometownEdit Main Menu", ch);
    sprintf(buf, " X.) %%6Slot#%%0: %d\n\r", HTOWN_SLOT(ch)); S2C();

    sprintf(buf, " 1.) %%6Name%%0: %s\n\r", h->name); S2C();
    sprintf(buf, " 2.) %%6Gateway Vnum%%0: %d\n\r", h->rvnum); S2C();

    sprinttype(h->on_menu, menu_types, buf2);
    sprintf(buf, " 3.) %%6Menu Mode%%0: %%5%s%%0\n\r", buf2); S2C();

    for (i = 1; i <= NUM_RACES; i++)
    {
      sprintf(buf, "%2d.) %%6Allow %s%%0: %%5%s%%0\n\r", i+3, rcarray[i].race_name, YESNO(h->races[i])); 
      S2C();
    }

    send_to_char("\n\r", ch);
    MENU_PROMPT(ch) = "Enter field number to change or 0 to end: ";
    return;
  }

  strcpy(buf, input_str);
  p = strtok(buf, "   \n\r");
  if (p)
    field = atoi(p);
  else
    field = 0;

  // if they hit a race toggle
  if (field > 3 && field < (4 + NUM_RACES))
  {
    h->races[field - 3] = !h->races[field - 3];
    menu_jump(ch, htedit_top_menu);
  }
  else
  switch (field)
  {
    case 0:
      menu_jump(ch, htedit_confirm_quit);
      break;

    case 1:
      do_string_arg(ch, "Enter hometown name: ", &h->name, "");
      break;

    case 2:
      GET_INTEGER_ARG(ch, "Enter gateway vnum: ", h->rvnum, 0, 99999);
      break;

    case 3:
      get_integer_list(ch, "Enter number of the desired menu mode: ",
                       &h->on_menu, sizeof(h->on_menu), menu_types);
      break;

    default:
      send_to_char("That field cannot be changed.\n\r", ch);
      break;
  }

  ch->pc_specials->field_changed = TRUE;

}

ROA_MENU(htedit_confirm_quit)
{
  char buf[MAX_STRING_LENGTH];
  char *p;

  if (!input_str)
  {
    MENU_PROMPT(ch) = "Quit editting hometown (yes/NO)? ";
    return;
  }

  strcpy(buf, input_str);
  p = strtok(buf, "   \n\r");
  if (p && strncasecmp("yes", p, strlen(p)) == 0)
    menu_jump(ch, htedit_confirm_save);
  else
    menu_jump(ch, htedit_top_menu);
}

ROA_MENU(htedit_confirm_save)
{
  char buf[MAX_STRING_LENGTH];
  char *p;
  htdata *h = HTOWN_EDITTED(ch);

  if (!input_str)
  {
    MENU_PROMPT(ch) = "Save editted hometown (YES/no)? ";
    return;
  }

  strcpy(buf, input_str);
  p = strtok(buf, "   \n\r");
  if (!p || strncasecmp("no", p, strlen(p)) != 0)
  {
    sprintf(buf, "PLRUPD: %s has editted hometown #%d", GET_NAME(ch), HTOWN_SLOT(ch));
    mudlog(buf, NRM, GET_LEVEL(ch), TRUE);

    dupe_htowns_over(h, &htowns[HTOWN_SLOT(ch)]);
    save_htowns();
  }

  wax_htown(HTOWN_EDITTED(ch));
  HTOWN_EDITTED(ch) = NULL;
  HTOWN_SLOT(ch)    = 0;
  MENU_PROMPT(ch)  = NULL;
  MENU_HANDLER(ch) = NULL;
  MENU_DEPTH(ch)   = 0;
  REMOVE_BIT(PLR_FLAGS(ch), PLR_BUILDING);
}