AwakeMUD-0.8.18B/
AwakeMUD-0.8.18B/doc/
AwakeMUD-0.8.18B/lib/
AwakeMUD-0.8.18B/lib/etc/
AwakeMUD-0.8.18B/lib/etc/pfiles/
AwakeMUD-0.8.18B/lib/misc/
AwakeMUD-0.8.18B/lib/text/
AwakeMUD-0.8.18B/lib/text/help/
AwakeMUD-0.8.18B/lib/text/wizhelp/
AwakeMUD-0.8.18B/lib/veh/
AwakeMUD-0.8.18B/lib/world/
AwakeMUD-0.8.18B/lib/world/mob/
AwakeMUD-0.8.18B/lib/world/mtx/
AwakeMUD-0.8.18B/lib/world/qst/
AwakeMUD-0.8.18B/lib/world/shp/
AwakeMUD-0.8.18B/lib/world/veh/
#include "structs.h"
#include "awake.h"
#include "db.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "utils.h"
#include "screen.h"
#include "constants.h"
#include "olc.h"
#include "mail.h"
#include "newdb.h"

#define CH d->character
#define SEC d->edit_obj
#define SEC_MENU		0
#define SEC_INIT		1
#define SEC_MAILMENU		2
#define SEC_READMAIL		3
#define SEC_DELMAIL		4
#define SEC_SENDMAIL		5
#define SEC_READMAIL2		6
#define SEC_BANKMENU		7
#define SEC_WIRE1		8
#define SEC_WIRE2		9
#define SEC_PHONEMENU		10
#define SEC_PHONEADD1		11
#define SEC_PHONEADD2		12
#define SEC_PHONECALL		13
#define SEC_PHONEDEL		14
#define SEC_NOTEMENU		15
#define SEC_NOTEREAD		16
#define SEC_NOTEREAD2		17
#define SEC_NOTEADD1		18
#define SEC_NOTEADD2		19
#define SEC_NOTEDEL		20

ACMD(do_phone);

void wire_nuyen(struct char_data *ch, struct char_data *targ, int amount, bool isfile)
{
  GET_BANK(ch) -= amount;
  GET_BANK(targ) += amount;
  sprintf(buf, "%s has wired %d nuyen to your account.\r\n", GET_CHAR_NAME(ch), amount);
  store_mail(GET_IDNUM(targ), GET_IDNUM(ch), buf);
  sprintf(buf, "%s wired %d nuyen to %s.", GET_CHAR_NAME(ch), amount, GET_CHAR_NAME(targ));
  mudlog(buf, ch, LOG_GRIDLOG, TRUE);
  if (isfile) {
    playerDB.Update(targ);
    playerDB.StoreChar(targ, TRUE);
  }
}

void pocketsec_phonemenu(struct descriptor_data *d)
{
  struct obj_data *data = NULL, *folder = SEC->contains;
  int i = 0;
  for (; folder; folder = folder->next_content)
    if (!strcmp(folder->restring, "Phonebook"))
      break;
  CLS(CH);
  send_to_char(CH, "^LYour Phonebook^n\r\n");
  for (data = folder->contains; data; data = data->next_content) {
    i++;
    send_to_char(CH, " %2d > %-20s - %s\r\n", i, GET_OBJ_NAME(data), GET_OBJ_DESC(data));
  }
  send_to_char("\r\n[^cC^n]^call^n     [^cA^n]^cdd Name^n     [^cD^n]^celete Name^n     [^cB^n]^cack^n\r\n", CH);
  d->edit_mode = SEC_PHONEMENU;
}

void pocketsec_notemenu(struct descriptor_data *d)
{
  struct obj_data *data = NULL, *folder = SEC->contains;
  int i = 0;
  for (; folder; folder = folder->next_content)
    if (!strcmp(folder->restring, "Notes"))
      break;
  CLS(CH);
  send_to_char(CH, "^LNotes^n\r\n");
  for (data = folder->contains; data; data = data->next_content) {
    i++;
    send_to_char(CH, " %2d > %s\r\n", i, GET_OBJ_NAME(data));
  }
  send_to_char("\r\n[^cR^n]^cead^n     [^cA^n]^cdd Note^n     [^cD^n]^celete Note^n     [^cB^n]^cack^n\r\n", CH);
  d->edit_mode = SEC_NOTEMENU;
}


void pocketsec_menu(struct descriptor_data *d)
{
  CLS(CH);
  if (!SEC->contains) {
    send_to_char("This pocket secretary has not yet been initialised. Initialise? [Y/N]\r\n", CH);
    d->edit_mode = SEC_INIT;
  } else {
    send_to_char(CH, "^cMain Menu^n\r\n" 
                 "   [^c1^n]^c%sMail^n\r\n"
                 "   [^c2^n] ^cNotes^n\r\n"
                 "   [^c3^n] ^cPhonebook^n\r\n"
                 "   [^c4^n] ^cFiles^n\r\n"
                 "   [^c5^n] ^cBanking^n\r\n"
                 "   [^c6^n] ^c%sock^n\r\n"
                 "   [^c0^n] ^cQuit^n\r\n", has_mail(GET_IDNUM(CH)) ? " ^R" : " ", GET_OBJ_VAL(SEC, 1) ? "Unl" : "L");
    d->edit_mode = SEC_MENU;
  }
}

void pocketsec_mailmenu(struct descriptor_data *d)
{
  struct obj_data *mail = NULL, *folder = SEC->contains;
  int i = 0;
  for (; folder; folder = folder->next_content)
    if (!strcmp(folder->restring, "Mail"))
      break;
  while (has_mail(GET_IDNUM(CH))) {
    mail = read_object(111, VIRTUAL);
    mail->photo = read_delete(GET_IDNUM(CH));

    if (mail->photo == NULL)
      mail->photo =
        str_dup("Mail system error - please report.  Error #11.\r\n");

    obj_to_obj(mail, folder);
  }
  CLS(CH);
  send_to_char(CH, "^LShadowland Mail Network^n\r\n");
  for (mail = folder->contains; mail; mail = mail->next_content) {
    i++;
    send_to_char(CH, " %2d >%sMail\r\n", i, !GET_OBJ_VAL(mail, 0) ? " ^R" : " ");
  }
  send_to_char("\r\n[^cR^n]^cead Mail^n     [^cD^n]^celete Mail^n     [^cS^n]^cend mail^n     [^cB^n]^cack^n\r\n", CH);
  d->edit_mode = SEC_MAILMENU;
}

void pocketsec_bankmenu(struct descriptor_data *d)
{
  CLS(CH);
  send_to_char(CH, "Current Bank Balance: ^c%d^n\r\n[^cW^n]^cire Money^n     [^cB^n]^cack^n\r\n", GET_BANK(CH));
  d->edit_mode = SEC_BANKMENU;
}

void pocketsec_parse(struct descriptor_data *d, char *arg)
{
  struct obj_data *folder = NULL, *file = NULL;
  int i;
  long x;
  switch (d->edit_mode) {
    case SEC_MENU:
      switch (atoi(arg)) {
        case 0:
          send_to_char("Good bye.\r\n", CH);
          STATE(d) = CON_PLAYING;
          act("$n looks up from $s $p.", TRUE, CH, SEC, 0, TO_ROOM);
          d->edit_obj = NULL;
          break;
        case 1:
          pocketsec_mailmenu(d);
          break;
        case 2:
          pocketsec_notemenu(d);
          break;
        case 3:
          pocketsec_phonemenu(d);
          break;
        case 5:
          pocketsec_bankmenu(d);
          break;
        case 6:
          if (!GET_OBJ_VAL(SEC, 1))
            GET_OBJ_VAL(SEC, 1) = GET_IDNUM(CH);
          else GET_OBJ_VAL(SEC, 1) = 0;
          pocketsec_menu(d);
          break;
      }
      break;
    case SEC_PHONEMENU:
      switch (LOWER(*arg)) {
        case 'c':
          send_to_char("Call which entry?\r\n", CH);
          d->edit_mode = SEC_PHONECALL;
          break;
        case 'a':
          send_to_char("Enter Name:\r\n", CH);
          d->edit_mode = SEC_PHONEADD1;
          break;
        case 'd':
          send_to_char("Delete which entry?\r\n", CH);
          d->edit_mode = SEC_PHONEDEL;
          break;
        case 'b':
          pocketsec_menu(d);
          break;
      }
      break;
    case SEC_PHONECALL:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Phonebook"))
          break;
      i = atoi(arg);
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file) {
        STATE(d) = CON_PLAYING;
        act("$n looks up from $s $p.", TRUE, CH, SEC, 0, TO_ROOM);
        d->edit_obj = NULL;
        do_phone(CH, GET_OBJ_DESC(file), 0, SCMD_RING); 
      } else {
        pocketsec_phonemenu(d);
        send_to_char("That entry does not exist.\r\n", CH);
      }
      break;
    case SEC_PHONEADD1:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Phonebook"))
          break;
      file = read_object(118, VIRTUAL);       
      obj_to_obj(file, folder);
      file->restring = str_dup(arg);
      send_to_char("Enter Number: ", CH);
      d->edit_mode = SEC_PHONEADD2;
      break;
    case SEC_PHONEADD2:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Phonebook"))
          break;
      folder->contains->photo = str_dup(arg);
      pocketsec_phonemenu(d);
      break;
    case SEC_PHONEDEL:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Phonebook"))
          break;
      i = atoi(arg);  
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file)
        extract_obj(file);
      pocketsec_phonemenu(d);
      break;

    case SEC_NOTEMENU:
      switch (LOWER(*arg)) {
        case 'r':
          send_to_char("Read Which Note?\r\n", CH);
          d->edit_mode = SEC_NOTEREAD;
          break;
        case 'a':
          send_to_char("Enter Note Title:\r\n", CH);
          d->edit_mode = SEC_NOTEADD1;
          break;
        case 'd':
          send_to_char("Delete which note?\r\n", CH);
          d->edit_mode = SEC_NOTEDEL;
          break;
        case 'b':
          pocketsec_menu(d);
          break;
      }
      break;
    case SEC_NOTEREAD:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Notes"))
          break;
      i = atoi(arg);
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file) {
        send_to_char(CH, file->photo);
        GET_OBJ_VAL(file, 0) = 1;
        d->edit_mode = SEC_NOTEREAD2;
        send_to_char("Press [^cENTER^n] to continue.\r\n", CH);
      }
      else {
        pocketsec_notemenu(d);
        send_to_char("That note does not exist.\r\n", CH);
      }
      break;
    case SEC_NOTEREAD2:
      pocketsec_notemenu(d);
      break;
    case SEC_NOTEADD1:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Notes"))
          break;
      file = read_object(118, VIRTUAL);       
      obj_to_obj(file, folder);
      file->restring = str_dup(arg);
      send_to_char("Write note body. Use @ on a new line to finish.\r\n", CH);
      d->str = new (char *);
      *(d->str) = NULL;
      d->max_str = MAX_MESSAGE_LENGTH;
      d->mail_to = 0;
      d->edit_mode = SEC_NOTEADD2;
      break;
    case SEC_NOTEDEL:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Notes"))
          break;
      i = atoi(arg);  
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file)
        extract_obj(file);
      pocketsec_notemenu(d);
      break;

    case SEC_BANKMENU:
      switch (LOWER(*arg)) {
        case 'w':
          send_to_char("Wire money to whom?\r\n", CH);
          d->edit_mode = SEC_WIRE1;
          break;
        case 'b':
          pocketsec_menu(d);
          break;
      }
      break;
    case SEC_WIRE1:
      GET_EXTRA(CH) = FALSE;      
      if (!(d->edit_mob = get_player_vis(CH, arg, FALSE))) {
        GET_EXTRA(CH) = TRUE;
        if (!(d->edit_mob = playerDB.LoadChar(arg, false))) {
          pocketsec_bankmenu(d);
          send_to_char("The bank refuses to let you wire to that account.\r\n", CH);
          break;
        }
      }
      send_to_char("How much do you wish to transfer? (@ to cancel)\r\n", CH);
      d->edit_mode = SEC_WIRE2;
      break;
    case SEC_WIRE2:
      if (*arg != '@') {
        x = atoi(arg);
        if (x < 0)
          send_to_char("How much do you wish to transfer? (@ to cancel)\r\n", CH);
        else if (x > GET_BANK(CH))
          send_to_char("You do not have that much to transfer. (@ to cancel)\r\n", CH);
        else {
          wire_nuyen(CH, d->edit_mob, x, GET_EXTRA(CH));
          pocketsec_bankmenu(d);
        }
        return;
      }
      pocketsec_bankmenu(d);
      break;

    case SEC_MAILMENU:
      switch (LOWER(*arg)) {
        case 'r':
          send_to_char("Read which message?\r\n", CH);
          d->edit_mode = SEC_READMAIL;
          break;
        case 'd':
          send_to_char("Delete which message?\r\n", CH);
          d->edit_mode = SEC_DELMAIL;
          break;
        case 's':
          send_to_char("Send message to whom?\r\n", CH);
          d->edit_mode = SEC_SENDMAIL;
          break;
        case 'b':
          pocketsec_menu(d);
          break;
      }
      break;
    case SEC_DELMAIL:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Mail"))
          break;
      i = atoi(arg);
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file)
        extract_obj(file);
      pocketsec_mailmenu(d);
      break;
    case SEC_SENDMAIL:
      if ((x = playerDB.GetID(arg)) < 0)
        pocketsec_mailmenu(d);
      else {
        send_to_char("Write your message. Use @ on a new line to finish.\r\n", CH);
        PLR_FLAGS(CH).SetBits(PLR_MAILING, PLR_WRITING, ENDBIT);
        d->mail_to = x;
        d->str = new (char *);
        if (!d->str)
        {
          mudlog("Malloc failure!", NULL, LOG_SYSLOG, TRUE);
          exit(1);
        }
        *(d->str) = NULL;
        d->max_str = MAX_MAIL_SIZE;
      }
      break;
    case SEC_READMAIL:
      for (folder = SEC->contains; folder; folder = folder->next_content)
        if (!strcmp(folder->restring, "Mail"))
          break;
      i = atoi(arg);
      for (file = folder->contains; file && i > 1; file = file->next_content)
        i--;
      if (file) {
        send_to_char(CH, file->photo);
        GET_OBJ_VAL(file, 0) = 1;
        d->edit_mode = SEC_READMAIL2;
        send_to_char("Press [^cENTER^n] to continue.\r\n", CH);
      }
      else {
        pocketsec_mailmenu(d);
        send_to_char("That mail does not exist.\r\n", CH);
      }
      break;
    case SEC_READMAIL2:
      pocketsec_mailmenu(d);
      break;
    case SEC_INIT:
      if (LOWER(*arg) == 'y') {
        folder = read_object(118, VIRTUAL);
        folder->restring = str_dup("Mail");
        obj_to_obj(folder, SEC);
        folder = read_object(118, VIRTUAL);
        folder->restring = str_dup("Notes");
        obj_to_obj(folder, SEC);
        folder = read_object(118, VIRTUAL);
        folder->restring = str_dup("Phonebook");
        obj_to_obj(folder, SEC);
        folder = read_object(118, VIRTUAL);
        folder->restring = str_dup("Files");
        obj_to_obj(folder, SEC);
        send_to_char("Pocket Secretary Initialised.\r\n", CH);
        pocketsec_menu(d);
      } else {
        STATE(d) = CON_PLAYING;
        act("$n looks up from $s $p.", TRUE, CH, SEC, 0, TO_ROOM);
        send_to_char("Okay, Terminating Session.\r\n", CH);
        d->edit_obj = NULL;
      }
      break;
  }
}