#include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> #include "include/structs.h" #include "include/main.h" #include "include/utils.h" #include "include/parse_wiley.h" #define _DUMP_FR_C #include "include/dump_fr.h" char *WelcomeMsg = "Welcome to the WileyMUD III conversion project!\n" "\n" " The easiest way to get your old WileyMUD area into the Final-Realms mudlib\n" "is to log into your FR mud with a lord and use the new_domain command to add\n" "the wileymud zones. You can either create a single mega-domain like /d/wiley,\n" "and then place each zone's output into its own subdirectory, or keep each zone\n" "seperate as a domain in itself.\n" "\n" " Once your domains have been added, you can safely copy over the directories\n" "into their new hierarchy.\n" "\n" "Good Luck! -Dread Quixadhal, Dark Lord of VI.\n" "\n"; char *ZoneDataMsg = "Original Zone Information:\n" "#ZONEDATA\n" "Name\t%s~\n" "Author\tThe Wiley Gang~\n" "VNUMs\t%d %d\n" "Time\t%d\n" "Mode\t%d\n" "End\n\n"; char *ArmourMsg = "%s/\n" "\n" "This is the directory where all armour objects are defined for the\n" "%s domain. Only armour should go in here!\n"; char *MiscMsg = "%s/\n" "\n" "This is the directory where things that don't have anywhere else to live\n" "in the %s domain. Especially objects...\n"; char *MonsterMsg = "%s/\n" "\n" "This is the directory where all NPC's are defined for the\n" "%s domain. I would suggest you group your\n" "mobs by areas they roam in and/or activity cycles. I may code something\n" "for random mob generation by time of day, season, and environment...\n" "more on this later.\n"; char *RoomMsg = "%s/\n" "\n" "This is the directory where all rooms are defined for the\n" "%s domain. You should try to layout your\n" "rooms logically, rooms that belong together should be in subdirectories\n" "IE: a long street, the interior of a multi-room building, a park, a level\n" "of catacombs...\n"; char *WeaponMsg = "%s/\n" "\n" "This is the directory where all weapon objects are defined for the\n" "%s domain. Only weapons should go in here!\n"; #define sub_dir(x) { \ if(!strcmp("",x)) \ sprintf(muddir, "%s%s%s%s", FR_DOMAIN, OneBigDomain?MEGA_DOMAIN:"", \ OneBigDomain?"":"/", OneBigDomain?"":domainname); \ else \ sprintf(muddir, "%s%s%s%s%s%s", FR_DOMAIN, OneBigDomain?MEGA_DOMAIN:"", \ OneBigDomain?"/"x:"", *domainname?"/":"", domainname, OneBigDomain?"":"/"x); \ sprintf(filename, "mkdir -p %s/%s%s", OutputDir, FR_SUBDIR, muddir); \ system(filename); \ } void setup_dirs(zones *Zones, rooms *Rooms) { register int i, j; FILE *ofp; char domainname[256], muddir[256], filename[256]; int LowRoom, HighRoom; if (!Quiet) { fprintf(stderr, "Setting up directory layout..."); fflush(stderr); } bzero(domainname, 256); bzero(muddir, 256); bzero(filename, 256); if (OneBigDomain) { if (!Quiet) spin(stderr); sub_dir(""); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, "%s", WelcomeMsg); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("armours"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, ArmourMsg, muddir, "wiley"); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("misc"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, MiscMsg, muddir, "wiley"); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("monsters"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, MonsterMsg, muddir, "wiley"); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("rooms"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, RoomMsg, muddir, "wiley"); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("weapons"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, WeaponMsg, muddir, "wiley"); fclose(ofp); } else for (i = 0; i < Zones->Count; i++) { sprintf(domainname, "%s_%d", remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); if (!Quiet) spin(stderr); sub_dir(""); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, "%s", WelcomeMsg); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("armours"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, ArmourMsg, muddir, domainname); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("misc"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, MiscMsg, muddir, domainname); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("monsters"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, MonsterMsg, muddir, domainname); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("rooms"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, RoomMsg, muddir, domainname); fclose(ofp); if (!Quiet) spin(stderr); sub_dir("weapons"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "w"); fprintf(ofp, WeaponMsg, muddir, domainname); fclose(ofp); } for (i = 0; i < Zones->Count; i++) { 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); } } sprintf(domainname, "%s_%d", remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); if (!Quiet) spin(stderr); sub_dir("rooms"); sprintf(filename, "%s/%s%s/README", OutputDir, FR_SUBDIR, muddir); ofp = open_file(filename, "a"); fprintf(ofp, ZoneDataMsg, Zones->Zone[i].Name, LowRoom, HighRoom, Zones->Zone[i].Time, Zones->Zone[i].Mode); fclose(ofp); } if (!Quiet) fprintf(stderr, "done.\n"); } void dump_as_final_realms(zones *Zones, rooms *Rooms, shops *Shops) { FILE *ofp = NULL; char filename[256], domainname[256], muddir[256]; char roomname[256], outpath[256], tmpstr[256]; int i, j, k, x, y; /* * int LastMob, LastLoc; */ char *TmpDesc, *HackDesc, *BigHack; setup_dirs(Zones, Rooms); for (i = 0; i < Zones->Count; i++) { sprintf(domainname, "%s_%d", remap_name(Zones->Zone[i].Name), Zones->Zone[i].Number); if (Verbose) fprintf(stderr, "Dump of Domain \"%s\"...\n", domainname); else if (!Quiet) { sprintf(tmpstr, "#%d Dump of Domain \"%s\"...", i + 1, domainname); 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); } sub_dir("rooms"); 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; */ sprintf(roomname, "%s_%d.c", remap_name(Rooms->Room[j].Name), Rooms->Room[j].Number); sprintf(filename, "%s/%s%s/%s", OutputDir, FR_SUBDIR, muddir, roomname); ofp = open_file(filename, "w"); if (Verbose) fprintf(stderr, "Dumping %s\n", filename); else if (!Quiet) spin(stderr); fprintf(ofp, "// Automated conversion of WileyMUD by Quixadhal\n"); fprintf(ofp, "// Original: WileyMUD III, Room [#%d]\n", Rooms->Room[j].Number); fprintf(ofp, "// Target: Final Realms 2.1b4, %s/%s\n", muddir, roomname); fprintf(ofp, "// Performed: %s\n", timestamp()); fprintf(ofp, "\n"); /* * Now we are ready to do the actual converstion.... rooms only for now. */ if ((Rooms->Room[j].Flags & ROOM_INDOORS)|| (Rooms->Room[j].Sector == SECT_INDOORS)) fprintf(ofp, "inherit \"/std/room\";\n"); else fprintf(ofp, "inherit \"/std/outside\";\n"); fprintf(ofp, "\n"); /* * This needs work..... /std/not_allowed is a start... * * if(Rooms->Room[j].Flags & (ROOM_NOATTACK|ROOM_NOSTEAL|ROOM_NOSUMMON|ROOM_NOMAGIC)) { * fprintf(ofp, "void init() {\n"); * fprintf(ofp, " ::init();\n"); * if(Rooms->Room[j].Flags & ROOM_NOATTACK) * fprintf(ofp, " add_static_property(\"no attack\", 1);\n"); * if(Rooms->Room[j].Flags & ROOM_NOSTEAL) * fprintf(ofp, " add_static_property(\"no steal\", 1);\n"); * if(Rooms->Room[j].Flags & ROOM_NOSUMMON) * fprintf(ofp, " add_static_property(\"no teleport\", 1);\n"); * if(Rooms->Room[j].Flags & ROOM_NOMAGIC) * fprintf(ofp, " add_static_property(\"no magic\", 1);\n"); * fprintf(ofp, "}\n"); * fprintf(ofp, "\n"); * } */ fprintf(ofp, "void setup() {\n"); fprintf(ofp, " set_zone(\"%s\");\n", domainname); fprintf(ofp, " set_short(\"%s\");\n", Rooms->Room[j].Name); /* * ARGH! We have to escape all " characters inside our descriptions because * we're now using LPC.... HACK ALERT! */ BigHack = my_strdup(Rooms->Room[j].Description); for (x = y = 0; x < strlen(BigHack); x++) if (BigHack[x] == '\"') y++; TmpDesc = get_mem(strlen(BigHack) + y + 1, sizeof(char)); bzero(TmpDesc, strlen(BigHack) + y + 1); for (x = y = 0; x < strlen(BigHack); x++, y++) { if (BigHack[x] == '\"') TmpDesc[y++] = '\\'; TmpDesc[y] = BigHack[x]; } free(BigHack); fprintf(ofp, " set_long("); if (IncludeShortInLong) { fprintf(ofp, " \"%s\\n\"\n ", Rooms->Room[j].Name); } if (!(HackDesc = (char *)strtok(TmpDesc, "\n"))) fprintf(ofp, " \"%s\\n\");\n", TmpDesc); else { fprintf(ofp, " \"%s\"\n", HackDesc); while ((HackDesc = (char *)strtok(NULL, "\n"))) if (HackDesc) { if (*HackDesc == ' ') fprintf(ofp, " \"\\n%s\"\n", HackDesc); else fprintf(ofp, " \" %s\"\n", HackDesc); } } fprintf(ofp, " \"\\n\" );\n"); free(TmpDesc); fprintf(ofp, "\n"); if (Rooms->Room[j].Flags & ROOM_DARK) fprintf(ofp, " set_light(%d); // Normally dark. If really PITCH BLACK, use 0.\n", PitchBlack ? 0 : 5); else if (Rooms->Room[j].Flags & ROOM_INDOORS) fprintf(ofp, " set_light(80);\n"); else switch (Rooms->Room[j].Sector) { case SECT_INDOORS: case SECT_CITY: fprintf(ofp, " set_light(80);\n"); break; case SECT_FOREST: fprintf(ofp, " set_light(60);\n"); break; case SECT_AIR: fprintf(ofp, " set_light(120);\n"); break; case SECT_UNDERWATER: fprintf(ofp, " set_light(20);\n"); break; default: fprintf(ofp, " set_light(100);\n"); break; } for (k = 0; k < Rooms->Room[j].ExtraCount; k++) { if (Rooms->Room[j].Extra[k].Keyword->Count > 0) { fprintf(ofp, " add_item( "); if (Rooms->Room[j].Extra[k].Keyword->Count > 1) fprintf(ofp, "({ \"%s\"", Rooms->Room[j].Extra[k].Keyword->Word[0]); else fprintf(ofp, "\"%s\"", Rooms->Room[j].Extra[k].Keyword->Word[0]); for (x = 1; x < Rooms->Room[j].Extra[k].Keyword->Count; x++) fprintf(ofp, ", \"%s\"", Rooms->Room[j].Extra[k].Keyword->Word[x]); if (Rooms->Room[j].Extra[k].Keyword->Count > 1) fprintf(ofp, " }),\n"); else fprintf(ofp, " ,\n"); /* * ARGH! We have to escape all " characters inside our descriptions because * we're now using LPC.... HACK ALERT! */ BigHack = my_strdup(Rooms->Room[j].Extra[k].Description); for (x = y = 0; x < strlen(BigHack); x++) if (BigHack[x] == '\"') y++; TmpDesc = get_mem(strlen(BigHack) + y + 1, sizeof(char)); bzero(TmpDesc, strlen(BigHack) + y + 1); for (x = y = 0; x < strlen(BigHack); x++, y++) { if (BigHack[x] == '\"') TmpDesc[y++] = '\\'; TmpDesc[y] = BigHack[x]; } free(BigHack); if (!(HackDesc = (char *)strtok(TmpDesc, "\n"))) fprintf(ofp, " \"%s\"\n", TmpDesc); else { fprintf(ofp, " \"%s\"\n", HackDesc); while ((HackDesc = (char *)strtok(NULL, "\n"))) if (HackDesc) { if (*HackDesc == ' ') fprintf(ofp, " \"\\n%s\"\n", HackDesc); else fprintf(ofp, " \" %s\"\n", HackDesc); } } fprintf(ofp, " \"\\n\" );\n"); free(TmpDesc); } } fprintf(ofp, "\n"); for (k = 0; k < Rooms->Room[j].ExitCount; k++) { /* * Unlike extra descriptions, exits have an implied keyword of their direction. * Thus, even if Count < 1, the exit will still be valid. */ switch (Rooms->Room[j].Exit[k].Error) { case EXIT_OK: case EXIT_NON_EUCLIDEAN: case EXIT_ONE_WAY: fprintf(ofp, " add_exit( \"%s\", ", exit_name_lower(Rooms->Room[j].Exit[k].Direction)); sprintf(outpath, "%s%s%s/%s_%d%s", FR_DOMAIN, OneBigDomain ? MEGA_DOMAIN : "", OneBigDomain ? "/rooms" : "", remap_name(Zones->Zone[remap_zone_vnum (Zones, Rooms->Room[remap_room_vnum (Rooms, Rooms->Room[j].Exit[k]. Room)].Zone)].Name), Rooms-> Room[remap_room_vnum(Rooms, Rooms->Room[j].Exit[k].Room)]. Zone, OneBigDomain ? "" : "/rooms"); fprintf(ofp, "\"%s/%s_%d\", ", outpath, remap_name(room_name(Rooms, Rooms->Room[j].Exit[k].Room)), Rooms->Room[j].Exit[k].Room); switch (Rooms->Room[j].Exit[k].Type) { case EXIT_OPEN: case EXIT_OPEN_ALIAS: switch (Rooms->Room[j].Sector) { case SECT_INDOORS: if (Rooms->Room[j].Exit[k].Direction == EXIT_UP || Rooms->Room[j].Exit[k].Direction == EXIT_DOWN) fprintf(ofp, "\"stairs\" );\n"); else fprintf(ofp, "\"corridor\" );\n"); break; case SECT_CITY: if (Rooms->Room[j].Exit[k].Direction == EXIT_UP || Rooms->Room[j].Exit[k].Direction == EXIT_DOWN) fprintf(ofp, "\"stairs\" );\n"); else fprintf(ofp, "\"road\" );\n"); break; case SECT_FOREST: case SECT_HILLS: case SECT_MOUNTAIN: fprintf(ofp, "\"standard\" );\n"); break; default: fprintf(ofp, "\"plain\" );\n"); break; } break; case EXIT_DOOR: case EXIT_DOOR_ALIAS: case EXIT_NOPICK: case EXIT_NOPICK_ALIAS: fprintf(ofp, "\"door\" );\n"); break; case EXIT_SECRET: case EXIT_SECRET_ALIAS: case EXIT_SECRET_NOPICK: case EXIT_SECRET_NOPICK_ALIAS: fprintf(ofp, "\"secret\" );\n"); break; default: fprintf(ofp, "\"standard\" );\n"); break; } if (!ObviousExits) { fprintf(ofp, " modify_exit( \"%s\", ({ \"obvious\", 0 }) );\n", exit_name_lower(Rooms->Room[j].Exit[k].Direction)); } if (Rooms->Room[j].Exit[k].Keyword->Count > 1) { fprintf(ofp, " add_alias( \"%s\", ({ \"%s\"", exit_name_lower(Rooms->Room[j].Exit[k].Direction), Rooms->Room[j].Exit[k].Keyword->Word[0]); for (x = 1; x < Rooms->Room[j].Exit[k].Keyword->Count; x++) fprintf(ofp, ", \"%s\"", Rooms->Room[j].Exit[k].Keyword->Word[x]); fprintf(ofp, " }) );\n"); } else if (Rooms->Room[j].Exit[k].Keyword->Count > 0) { fprintf(ofp, " add_alias( \"%s\", \"%s\" );\n", exit_name_lower(Rooms->Room[j].Exit[k].Direction), Rooms->Room[j].Exit[k].Keyword->Word[0]); } if (Rooms->Room[j].Exit[k].Description && Rooms->Room[j].Exit[k].Description[0]) { fprintf(ofp, " add_item( "); if (Rooms->Room[j].Exit[k].Keyword->Count > 0) fprintf(ofp, "({ \"%s\"", exit_name_lower(Rooms->Room[j].Exit[k].Direction)); else fprintf(ofp, "\"%s\"", exit_name_lower(Rooms->Room[j].Exit[k].Direction)); for (x = 0; x < Rooms->Room[j].Exit[k].Keyword->Count; x++) fprintf(ofp, ", \"%s\"", Rooms->Room[j].Exit[k].Keyword->Word[x]); if (Rooms->Room[j].Exit[k].Keyword->Count > 0) fprintf(ofp, " }),\n"); else fprintf(ofp, " ,\n"); /* * ARGH! We have to escape all " characters inside our descriptions because * we're now using LPC.... HACK ALERT! */ BigHack = my_strdup(Rooms->Room[j].Exit[k].Description); for (x = y = 0; x < strlen(BigHack); x++) if (BigHack[x] == '\"') y++; TmpDesc = get_mem(strlen(BigHack) + y + 1, sizeof(char)); bzero(TmpDesc, strlen(BigHack) + y + 1); for (x = y = 0; x < strlen(BigHack); x++, y++) { if (BigHack[x] == '\"') TmpDesc[y++] = '\\'; TmpDesc[y] = BigHack[x]; } free(BigHack); if (!(HackDesc = (char *)strtok(TmpDesc, "\n"))) fprintf(ofp, " \"%s\"\n", TmpDesc); else { fprintf(ofp, " \"%s\"\n", HackDesc); while ((HackDesc = (char *)strtok(NULL, "\n"))) if (HackDesc) { if (*HackDesc == ' ') fprintf(ofp, " \"\\n%s\"\n", HackDesc); else fprintf(ofp, " \" %s\"\n", HackDesc); } } fprintf(ofp, " \"\\n\" );\n"); free(TmpDesc); } break; } /* * Keys would require that objects be done... ignore. */ } 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"); }