#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <strings.h> #include <string.h> #include "include/structs.h" #include "include/main.h" #include "include/utils.h" #include "include/parse_wiley.h" #define _DUMP_ISLES_C #include "include/dump_isles.h" const int isles_convertsectors[] = { ISLES_SECT_INSIDE, ISLES_SECT_INSIDE, ISLES_SECT_CITY, ISLES_SECT_FIELD, ISLES_SECT_FOREST, ISLES_SECT_HILLS, ISLES_SECT_MOUNTAIN, ISLES_SECT_WATER_SWIM, ISLES_SECT_WATER_NOSWIM, ISLES_SECT_AIR, ISLES_SECT_UNDERWATER }; const int *isles_convertsector = &isles_convertsectors[1]; extern const char terrains[]; extern const char *terrain; extern const int exit_dir_to_bit[]; int isles_qcmp_zone_vnum(const void *a, const void *b) { return (((const pair *)b)->y - ((const pair *)a)->y); } void dump_as_isles(zones *Zones, rooms *Rooms, shops *Shops) { FILE *ofp, *listfp; char filename[256], tmpstr[256]; int i, j, k, x; /* * int LastMob, LastLoc; */ int LowRoom, HighRoom; pair *ZoneSort; ZoneSort = (pair *)get_mem(Zones->Count, sizeof(pair)); bzero(ZoneSort, sizeof(pair) * Zones->Count); for (i = 0; i < Zones->Count; i++) { sprintf(filename, "%s/%s/%s_%d.zone", OutputDir, ISLES_SUBDIR, remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); ofp = open_file(filename, "w"); if (Verbose) fprintf(stderr, "Dump of Zone \"%s\"[#%d]...\n", remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); else if (!Quiet) { sprintf(tmpstr, "#%d Dump of Zone \"%s\"[#%d]...", i + 1, remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); fprintf(stderr, "%s", tmpstr); for (x = strlen(tmpstr); x < 79; x++) fprintf(stderr, " "); for (x = strlen(tmpstr); x < 79; x++) fprintf(stderr, "\b"); fflush(stderr); } LowRoom = INT_MAX; HighRoom = INT_MIN; for (j = 0; j < Rooms->Count; j++) { if ((remap_zone_vnum(Zones, Rooms->Room[j].Zone) == i) || ((Rooms->Room[j].Number >= (!i ? 0 : Zones->Zone[i - 1].Top + 1))&& (Rooms->Room[j].Number <= Zones->Zone[i].Top) )) { LowRoom = min(LowRoom, Rooms->Room[j].Number); HighRoom = max(HighRoom, Rooms->Room[j].Number); } } ZoneSort[i].x = i; ZoneSort[i].y = LowRoom; /* ZONE */ fprintf(ofp, "#ZONEDATA\n"); fprintf(ofp, "Name\t%s~\n", Zones->Zone[i].Name); fprintf(ofp, "Author\tThe Wiley Gang~\n"); fprintf(ofp, "VNUMs\t%d %d\n", LowRoom, HighRoom); fprintf(ofp, "Time\t%d\n", Zones->Zone[i].Time); fprintf(ofp, "Mode\t%d\n", Zones->Zone[i].Mode); fprintf(ofp, "End\n\n"); fprintf(ofp, "#MOBDATA\n#0\n\n"); fprintf(ofp, "#OBJDATA\n#0\n\n"); fprintf(ofp, "#ROOMDATA\n"); for (j = 0; j < Rooms->Count; j++) { if ((remap_zone_vnum(Zones, Rooms->Room[j].Zone) == i) || ((Rooms->Room[j].Number >= (!i ? 0 : Zones->Zone[i - 1].Top + 1))&& (Rooms->Room[j].Number <= Zones->Zone[i].Top) )) { long OldValue = 0, NewValue = 0; if (Verbose) fprintf(stderr, " (%d) Writing \"%s\"[#%d]\n", i, Rooms->Room[i].Name, Rooms->Room[i].Number); else if (!Quiet) spin(stderr); fprintf(ofp, "#%d\n", Rooms->Room[j].Number); fprintf(ofp, "Name\t%s~\n", Rooms->Room[j].Name); fprintf(ofp, "Descr\n%s~\n", Rooms->Room[j].Description); /* * flag and sectors need translation * a nice routine should be written... I'm lazy... this is cheap and cheezy! */ OldValue = Rooms->Room[j]. Flags; if (OldValue & ROOM_DARK) NewValue |= ISLES_ROOM_DARK; if (OldValue & ROOM_DEATH) NewValue |= ISLES_ROOM_IMMORTAL; if (OldValue & ROOM_NOMOB) NewValue |= ISLES_ROOM_NO_MOB; if (OldValue & ROOM_INDOORS) NewValue |= ISLES_ROOM_INDOORS; if (OldValue & ROOM_NOATTACK) NewValue |= ISLES_ROOM_SAFE; /* * if(OldValue & ROOM_NOSTEAL) NewValue |= */ if (OldValue & ROOM_NOSUMMON) NewValue |= ISLES_ROOM_NO_RECALL; /* * if(OldValue & ROOM_NOMAGIC) NewValue |= */ if (OldValue & ROOM_PRIVATE) NewValue |= ISLES_ROOM_PRIVATE; /* * if(OldValue & ROOM_SOUND) NewValue |= */ fprintf(ofp, "Flags\t%ld\n", NewValue); fprintf(ofp, "Sector\t%d\n", isles_convertsector[Rooms->Room[j].Sector]); for (k = 0; k < Rooms->Room[j].ExtraCount; k++) { fprintf(ofp, "ExtraDescr\t"); if (Rooms->Room[j].Extra[k].Keyword->Count > 0) { fprintf(ofp, "%s", Rooms->Room[j].Extra[k].Keyword->Word[0]); for (x = 0; x < Rooms->Room[j].Extra[k].Keyword->Count; x++) { fprintf(ofp, " %s", Rooms->Room[j].Extra[k].Keyword->Word[x]); } } fprintf(ofp, "~\n%s~\n", Rooms->Room[j].Extra[k].Description); } /* Resets need to be done here.... later... */ for (k = 0; k < Rooms->Room[j].ExitCount; k++) { switch (Rooms->Room[j].Exit[k].Error) { case EXIT_OK: case EXIT_NON_EUCLIDEAN: case EXIT_ONE_WAY: fprintf(ofp, "Door\t%d %d %d %d\n%s~\n", Rooms->Room[j].Exit[k].Direction, 0, /* reset * flags... * later... */ Rooms->Room[j].Exit[k].KeyNumber, Rooms->Room[j].Exit[k].Room, Rooms->Room[j].Exit[k].Description); if (Rooms->Room[j].Exit[k].Keyword->Count > 0) { fprintf(ofp, "%s", Rooms->Room[j].Exit[k].Keyword->Word[0]); for (x = 0; x < Rooms->Room[j].Exit[k].Keyword->Count; x++) { fprintf(ofp, " %s", Rooms->Room[j].Exit[k].Keyword->Word[x]); } } fprintf(ofp, "~\n"); } } fprintf(ofp, "End\n\n"); } } fprintf(ofp, "#0\n\n"); fprintf(ofp, "#$\n"); fclose(ofp); if (Verbose) fprintf(stderr, "done.\n"); else if (!Quiet) { fprintf(stderr, "done.\r"); fflush(stderr); } } if (!Quiet) fprintf(stderr, "\n"); if (!Quiet) fprintf(stderr, "Generating zone list..."); qsort(ZoneSort, Zones->Count, sizeof(pair), isles_qcmp_zone_vnum); sprintf(filename, "%s/%s/zone.list", OutputDir, ISLES_SUBDIR); listfp = open_file(filename, "w"); for (i = Zones->Count - 1; i >= 0; i--) { if (!Quiet) spin(stderr); sprintf(filename, "%s_%d.zone", remap_name(Zones->Zone[ZoneSort[i].x].Name), Zones->Zone[i].Number); fprintf(listfp, "%s\n", filename); } fprintf(listfp, "$\n"); fclose(listfp); if (!Quiet) fprintf(stderr, "done.\n"); }