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 <stdio.h>
#include <string.h>

#include "structs.h"
#include "awake.h"
#include "interpreter.h"
#include "comm.h"
#include "constants.h"
#include "utils.h"
#include "db.h"
#include <stdlib.h>
#include "screen.h"
#include "olc.h"
#include "newmatrix.h"
#include "memory.h"

#define IC d->edit_icon
#define NUM_OF_IC_TYPES 13
extern char *cleanup(char *dest, const char *src);

const char *crippler[4] =
  {
    "Bod",
    "Evasion",
    "Sensors",
    "Masking"
  };

const char *tarbaby[4] =
  {
    "Operational",
    "Offensive",
    "Defensive",
    "Special"
  };

#define ICON ic_proto[realcounter]
void write_ic_to_disk(int vnum)
{
  long realcounter, counter;
  int zone = real_zone(vnum);
  FILE *fl;

  sprintf(buf, "%s/%d.ic", MTX_PREFIX, vnum);
  fl = fopen(buf, "w+");
  for (counter = zone_table[zone].number * 100;
       counter <= zone_table[zone].top;
       counter++) {
    realcounter = real_ic(counter);
    if (realcounter >= 0) {
      if (!strcmp("An unfinished IC", ICON.name))
        continue;
      fprintf(fl, "#%ld\n", ic_index[ICON.number].vnum);
      fprintf(fl, "Name:\t%s\n", ICON.name);
      fprintf(fl, "LongDesc:\t%s\n", ICON.look_desc);
      fprintf(fl, "Description:$\n%s~\n", cleanup(buf2, ICON.long_desc));
      fprintf(fl, "Rating:\t%d\n", ICON.ic.rating);
      fprintf(fl, "Type:\t%s\n", ic_type[ICON.ic.type]);
      fprintf(fl, "Subtype:\t%d\n", ICON.ic.subtype);
      fprintf(fl, "Flags:\t%s\n", ICON.ic.options.ToString());
      if (real_ic(ICON.ic.trap) > 0 && ICON.ic.options.IsSet(IC_TRAP))
        fprintf(fl, "Trap:\t%ld\n", ICON.ic.trap);
      if (ICON.ic.options.AreAnySet(IC_EX_OFFENSE, IC_EX_DEFENSE, ENDBIT))
        fprintf(fl, "Expert:\t%d\n", ICON.ic.expert);
      fprintf(fl, "BREAK\n");
    }
  }

  fprintf(fl, "END\n");
  fclose(fl);
  write_index_file("ic");
}
void icedit_disp_option_menu(struct descriptor_data *d)
{
  CLS(CH);
  for (int x = 1; x <= IC_TRAP; x += 2)
    send_to_char(CH, "%2d) %-20s %2d) %-20s\r\n",
                 x, ic_option[x], x + 1, x + 1 <= IC_TRAP ? ic_option[x + 1] : "");
  IC->ic.options.PrintBits(buf1, MAX_STRING_LENGTH, ic_option, IC_TRAP + 1);
  send_to_char(CH, "IC Options: ^c%s^n\r\nEnter IC Option, 0 to quit: ", buf1);
  d->edit_mode = ICEDIT_OPTION_MENU;
}

void icedit_disp_menu(struct descriptor_data *d)
{
  CLS(CH);
  send_to_char(CH, "^WIC: ^c%d^n\r\n", d->edit_number);
  send_to_char(CH, "^G1^Y) ^WName: ^c%s^n\r\n", IC->name);
  send_to_char(CH, "^G2^Y) ^WRoomDesc: ^c%s^n\r\n", IC->look_desc);
  send_to_char(CH, "^G3^Y) ^WDescription: ^c%s^n\r\n", IC->long_desc);
  send_to_char(CH, "^G4^Y) ^WType: ^c%s-%d^n\r\n", ic_type[IC->ic.type], IC->ic.rating);
  switch(IC->ic.type)
  {
  case 4:
  case 10:
    send_to_char(CH, "^G5^Y) ^WSubType: ^c%s^n\r\n", tarbaby[IC->ic.subtype]);
    break;
  case 0:
  case 8:
    send_to_char(CH, "^G5^Y) ^WSubType: ^c%s^n\r\n", crippler[IC->ic.subtype]);
    break;
  }
  IC->ic.options.PrintBits(buf1, MAX_STRING_LENGTH, ic_option, IC_TRAP + 1);
  send_to_char(CH, "^G6^Y) ^WOptions: ^c%s^n\r\n", buf1);
  if (IC->ic.options.IsSet(IC_TRAP))
    send_to_char(CH, "^G7^Y) ^WTrap IC: ^c%s (%ld)^n\r\n", real_ic(IC->ic.trap) > 0 ? ic_proto[real_ic(IC->ic.trap)].name : "Nothing", IC->ic.trap);
  if (IC->ic.options.AreAnySet(IC_EX_OFFENSE, IC_EX_DEFENSE, ENDBIT))
    send_to_char(CH, "^G8^Y) ^WExpert Rating: ^c%d^n\r\n", IC->ic.expert);
  send_to_char("^Gq^Y) ^WQuit\r\n^Gx^Y) ^WQuit without saving\r\n^wEnter selection: ", CH);
  d->edit_mode = ICEDIT_MAIN_MENU;
}

void icedit_parse(struct descriptor_data *d, char *arg)
{
  long number, ic_num;
  int i = 0;
  switch (d->edit_mode)
  {
  case ICEDIT_CONFIRM_EDIT:
    switch (*arg) {
    case 'y':
    case 'Y':
      icedit_disp_menu(d);
      break;
    case 'n':
    case 'N':
      STATE(d) = CON_PLAYING;
      if (d->edit_icon)
        Mem->DeleteIcon(d->edit_icon);
      d->edit_icon = NULL;
      PLR_FLAGS(CH).RemoveBit(PLR_EDITING);
      break;
    default:
      send_to_char("That's not a valid choice!\r\n", CH);
      send_to_char("Do you wish to edit it?\r\n", CH);
      break;
    }
    break;
  case ICEDIT_CONFIRM_SAVESTRING:
    switch (*arg) {
    case 'y':
    case 'Y': {
        ic_num = real_ic(d->edit_number);
        if (ic_num > 0) {
          struct matrix_icon *i, *temp;
          for (i = icon_list; i; i = i->next)
            if (i->number == ic_num) {
              temp = Mem->GetIcon();
              *temp = *i;
              *i = *d->edit_icon;
              i->in_host = temp->in_host;
              i->next = temp->next;
              i->next_in_host = temp->next_in_host;
              Mem->ClearIcon(temp);
            }
          if (ic_proto[ic_num].name)
            delete [] ic_proto[ic_num].name;
          if (ic_proto[ic_num].look_desc)
            delete [] ic_proto[ic_num].look_desc;
          if (ic_proto[ic_num].long_desc)
            delete [] ic_proto[ic_num].long_desc;
          ic_proto[ic_num] = *d->edit_icon;
        } else {
          int             counter;
          int             found = 0;
          struct index_data *new_ic_index;
          struct matrix_icon *new_ic_proto;
          new_ic_index = new struct index_data[top_of_ic + 2];
          new_ic_proto = new struct matrix_icon[top_of_ic + 2];

          sprintf(buf,"%s wrote new IC #%ld", GET_CHAR_NAME(CH), d->edit_number);
          mudlog(buf, CH, LOG_WIZLOG, TRUE);
          for (counter = 0; counter < top_of_ic + 1; counter++) {
            if (!found) {
              if (ic_index[counter].vnum > d->edit_number) {
                new_ic_index[counter].vnum = d->edit_number;
                new_ic_index[counter].number = 0;
                new_ic_index[counter].func = NULL;
                new_ic_proto[counter] = *(d->edit_icon);
                new_ic_proto[counter].in_host = NOWHERE;
                d->edit_icon->number = counter;
                new_ic_proto[counter].number = counter;
                found = TRUE;
                new_ic_index[counter + 1] = ic_index[counter];
                new_ic_proto[counter + 1] = ic_proto[counter];
                new_ic_proto[counter + 1].number = counter + 1;
              } else {
                new_ic_proto[counter] = ic_proto[counter];
                new_ic_index[counter] = ic_index[counter];
              }
            } else {
              new_ic_index[counter + 1] = ic_index[counter];
              new_ic_proto[counter + 1] = ic_proto[counter];
              new_ic_proto[counter + 1].number = counter + 1;
            }
          }

          if (!found) {
            new_ic_index[top_of_ic + 1].vnum = d->edit_number;
            new_ic_index[top_of_ic + 1].number = 0;
            new_ic_index[top_of_ic + 1].func = NULL;

            clear_icon(new_ic_proto + top_of_ic + 1);
            new_ic_proto[top_of_ic + 1] = *(d->edit_icon);
            new_ic_proto[top_of_ic + 1].in_host = NOWHERE;
            new_ic_proto[top_of_ic + 1].number = top_of_ic + 1;
            d->edit_icon->number = top_of_ic + 1;
          }
          top_of_ic++;
          delete [] ic_proto;
          delete [] ic_index;
          ic_proto = new_ic_proto;
          ic_index = new_ic_index;
        }
        send_to_char("Writing IC to disk.\r\n", CH);
        write_ic_to_disk(CH->player_specials->saved.zonenum);
        send_to_char("Saved.\r\n", CH);
        Mem->ClearIcon(d->edit_icon);
        d->edit_icon = NULL;
        PLR_FLAGS(CH).RemoveBit(PLR_EDITING);
        STATE(d) = CON_PLAYING;
        send_to_char("Done.\r\n", CH);
        break;
      }
    case 'n':
    case 'N':
      send_to_char("Icon not saved, aborting.\r\n", CH);
      STATE(d) = CON_PLAYING;
      PLR_FLAGS(CH).RemoveBit(PLR_EDITING);
      /* free everything up, including strings etc */
      if (d->edit_icon)
        Mem->DeleteIcon(d->edit_icon);
      d->edit_icon = NULL;
      d->edit_number = 0;
      break;
    default:
      send_to_char("Invalid choice!\r\n", CH);
      send_to_char("Do you wish to save this icon internally?", CH);
      break;
    }
    break;
  case ICEDIT_MAIN_MENU:
    switch (LOWER(*arg)) {
    case 'q':
      d->edit_mode = ICEDIT_CONFIRM_SAVESTRING;
      icedit_parse(d, "y");
      break;
    case 'x':
      d->edit_mode = ICEDIT_CONFIRM_SAVESTRING;
      icedit_parse(d, "n");
      break;
    case '1':
      send_to_char("Enter IC name:", CH);
      d->edit_mode = ICEDIT_NAME;
      break;
    case '2':
      send_to_char("Enter Room Desc:", CH);
      d->edit_mode = ICEDIT_ROOM;
      break;
    case '3':
      send_to_char("Enter IC description:\r\n", CH);
      d->edit_mode = ICEDIT_DESC;
      d->str = new (char *);
      if (!d->str) {
        mudlog("Malloc failed!", NULL, LOG_SYSLOG, TRUE);
        shutdown();
      }
      *(d->str) = NULL;
      d->max_str = MAX_MESSAGE_LENGTH;
      d->mail_to = 0;
      break;
    case '4':
      CLS(CH);
      for (i = 0; i < NUM_OF_IC_TYPES; i++)
        send_to_char(CH, "%d) %s\r\n", i + 1, ic_type[i]);
      send_to_char(CH, "Enter IC type: ");
      d->edit_mode =  ICEDIT_TYPE;
      break;
    case '5':
      CLS(CH);
      if (d->edit_icon->ic.type != 0 && d->edit_icon->ic.type != 4 && d->edit_icon->ic.type != 8
          && d->edit_icon->ic.type != 10) {
        send_to_char("Invalid choice!", CH);
        icedit_disp_menu(d);
      } else {
        for (i = 0; i < 4; i++)
          if (d->edit_icon->ic.type == 0 || d->edit_icon->ic.type == 8)
            send_to_char(CH, "%d) %s\r\n", i + 1, crippler[i]);
          else
            send_to_char(CH, "%d) %s\r\n", i + 1, tarbaby[i]);
        send_to_char(CH, "Enter IC Sub-Type: ");
        d->edit_mode = ICEDIT_SUBTYPE;
        break;
      }
      break;
    case '6':
      icedit_disp_option_menu(d);
      break;
    case '7':
      send_to_char(CH, "Enter IC to call with trap option: ");
      d->edit_mode = ICEDIT_TRAP;
      break;
    case '8':
      send_to_char(CH, "Enter Expert rating: ");
      d->edit_mode = ICEDIT_EXPERT;
      break;
    default:
      send_to_char("Invalid choice!", CH);
      icedit_disp_menu(d);
      break;
    }
    break;
  case ICEDIT_EXPERT:
    IC->ic.expert = MIN(3, atoi(arg));
    icedit_disp_menu(d);
    break;
  case ICEDIT_OPTION_MENU:
    number = atoi(arg);
    if (number < 0 || number > IC_TRAP)
      icedit_disp_option_menu(d);
    else if (number == 0)
      icedit_disp_menu(d);
    else {
      IC->ic.options.ToggleBit(number);
      icedit_disp_option_menu(d);
    }
    break;
  case ICEDIT_TRAP:
    d->edit_icon->ic.trap = atoi(arg);
    icedit_disp_menu(d);
    break;
  case ICEDIT_NAME:
    if (d->edit_icon->name)
      delete [] d->edit_icon->name;
    d->edit_icon->name = str_dup(arg);
    icedit_disp_menu(d);
    break;
  case ICEDIT_ROOM:
    if (d->edit_icon->look_desc)
      delete [] d->edit_icon->look_desc;
    d->edit_icon->look_desc = str_dup(arg);
    icedit_disp_menu(d);
    break;
  case ICEDIT_TYPE:
    number = atoi(arg);
    if (number <= 0 || number > NUM_OF_IC_TYPES) {
      send_to_char("Invalid choice!\r\n", CH);
      send_to_char("Enter IC Type: ", CH);
    } else {
      d->edit_icon->ic.type = --number;
      send_to_char("Enter IC Rating: ", CH);
      d->edit_mode = ICEDIT_RATING;
    }
    break;
  case ICEDIT_RATING:
    number = atoi(arg);
    if (number <= 0) {
      send_to_char("Invalid choice!\r\n", CH);
      send_to_char("Enter IC Rating: ", CH);
    } else {
      d->edit_icon->ic.rating = number;
      icedit_disp_menu(d);
    }
    break;
  case ICEDIT_SUBTYPE:
    number = atoi(arg);
    if (number <= 0 || number > 4) {
      send_to_char("Invalid choice!\r\n", CH);
      send_to_char("Enter IC SubType: ", CH);
    } else {
      d->edit_icon->ic.subtype = --number;
      icedit_disp_menu(d);
    }
    break;
  }
}