grendel-1.0.0a7/backup/
grendel-1.0.0a7/bin/
grendel-1.0.0a7/boards/
grendel-1.0.0a7/clans/
grendel-1.0.0a7/documentation/todo/
grendel-1.0.0a7/help/
grendel-1.0.0a7/logs/
grendel-1.0.0a7/players/
grendel-1.0.0a7/progs/
grendel-1.0.0a7/races/
grendel-1.0.0a7/src/contrib/
grendel-1.0.0a7/src/modules/speller/
grendel-1.0.0a7/src/modules/status/
grendel-1.0.0a7/src/tests/
grendel-1.0.0a7/src/tests/dunit/
{
	Summary:
		SMAUG area convertor
	
	## $Id: convert.dpr,v 1.2 2004/04/21 21:44:34 druid Exp $
}
program convert;
{$APPTYPE CONSOLE}
uses
	SysUtils,
	DateUtils,
	strip,
	util,
	debug,
	console,
	dtypes,
	constants,
	fsys,
	area;


// smaug defines
const 
	SMAUG_ACT_NPC = BV00;
	SMAUG_ACT_SENTINEL = BV01;
	SMAUG_ACT_SCAVENGER = BV02;
	SMAUG_ACT_AGGRESSIVE = BV05;
	SMAUG_ACT_STAY_AREA = BV06;
	SMAUG_ACT_WIMPY = BV07;
	SMAUG_ACT_PET = BV08;
	SMAUG_ACT_TRAIN = BV09;
	SMAUG_ACT_PRACTICE = BV10;
	SMAUG_ACT_IMMORTAL = BV11;
	SMAUG_ACT_DEADLY = BV12;
	SMAUG_ACT_POLYSELF = BV13;
	SMAUG_ACT_META_AGGR = BV14;
	SMAUG_ACT_GUARDIAN = BV15;
	SMAUG_ACT_RUNNING = BV16;
	SMAUG_ACT_NOWANDER = BV17;
	SMAUG_ACT_MOUNTABLE = BV18;
	SMAUG_ACT_MOUNTED = BV19;
	SMAUG_ACT_SCHOLAR = BV20;
	SMAUG_ACT_SECRETIVE = BV21;
	SMAUG_ACT_HARDHAT = BV22;
	SMAUG_ACT_MOBINVIS = BV23;
	SMAUG_ACT_NOASSIST = BV24;
	SMAUG_ACT_AUTONOMOUS = BV25;
	SMAUG_ACT_PACIFIST = BV26;
	SMAUG_ACT_NOATTACK = BV27;
	SMAUG_ACT_ANNOYING = BV28;
	SMAUG_ACT_STATSHIELD = BV29;
	SMAUG_ACT_PROTOTYPE = BV30;

	SMAUG_ROOM_DARK = BV00;
	SMAUG_ROOM_DEATH = BV01;
	SMAUG_ROOM_NO_MOB = BV02;
	SMAUG_ROOM_INDOORS = BV03;
	SMAUG_ROOM_LAWFUL = BV04;
	SMAUG_ROOM_NEUTRAL = BV05;
	SMAUG_ROOM_CHAOTIC = BV06;
	SMAUG_ROOM_NO_MAGIC = BV07;
	SMAUG_ROOM_TUNNEL = BV08;
	SMAUG_ROOM_PRIVATE = BV09;
	SMAUG_ROOM_SAFE = BV10;
	SMAUG_ROOM_SOLITARY = BV11;
	SMAUG_ROOM_PET_SHOP = BV12;
	SMAUG_ROOM_NO_RECALL = BV13;
	SMAUG_ROOM_DONATION = BV14;
	SMAUG_ROOM_NODROPALL = BV15;
	SMAUG_ROOM_SILENCE = BV16;
	SMAUG_ROOM_LOGSPEECH = BV17;
	SMAUG_ROOM_NODROP = BV18;
	SMAUG_ROOM_CLANSTOREROOM = BV19;
	SMAUG_ROOM_NO_SUMMON = BV20;
	SMAUG_ROOM_NO_ASTRAL = BV21;
	SMAUG_ROOM_TELEPORT = BV22;
	SMAUG_ROOM_TELESHOWDESC = BV23;
	SMAUG_ROOM_NOFLOOR = BV24;
	SMAUG_ROOM_NOSUPPLICATE = BV25;
	SMAUG_ROOM_ARENA = BV26;
	SMAUG_ROOM_NOMISSILE = BV27;
	SMAUG_ROOM_PROTOTYPE = BV30;
	SMAUG_ROOM_DND = BV31;

	SMAUG_SECT_INSIDE = 0;
	SMAUG_SECT_CITY = 1;
	SMAUG_SECT_FIELD = 2;
	SMAUG_SECT_FOREST = 3;
	SMAUG_SECT_HILLS = 4;
	SMAUG_SECT_MOUNTAIN = 5;
	SMAUG_SECT_WATER_SWIM = 6;
	SMAUG_SECT_WATER_NOSWIM = 7;
	SMAUG_SECT_UNDERWATER = 8;
	SMAUG_SECT_AIR = 9;
	SMAUG_SECT_DESERT = 10;
	SMAUG_SECT_DUNNO = 11;
	SMAUG_SECT_OCEANFLOOR = 12;
	SMAUG_SECT_UNDERGROUND = 13;
	SMAUG_SECT_LAVA = 14;
	SMAUG_SECT_SWAMP = 15;
	SMAUG_SECT_MAX = 16;

	SMAUG_EX_ISDOOR = BV00;
	SMAUG_EX_CLOSED = BV01;
	SMAUG_EX_LOCKED = BV02;
	SMAUG_EX_SECRET = BV03;
	SMAUG_EX_SWIM = BV04;
	SMAUG_EX_PICKPROOF = BV05;
	SMAUG_EX_FLY = BV06;
	SMAUG_EX_CLIMB = BV07;
	SMAUG_EX_DIG = BV08;
	SMAUG_EX_EATKEY = BV09;
	SMAUG_EX_NOPASSDOOR = BV10;
	SMAUG_EX_HIDDEN = BV11;
	SMAUG_EX_PASSAGE = BV12;
	SMAUG_EX_PORTAL = BV13;
	SMAUG_EX_RES1 = BV14;
	SMAUG_EX_RES2 = BV15;
	SMAUG_EX_xCLIMB = BV16;
	SMAUG_EX_xENTER = BV17;
	SMAUG_EX_xLEAVE = BV18;
	SMAUG_EX_xAUTO = BV19;
	SMAUG_EX_NOFLEE = BV20;
	SMAUG_EX_xSEARCHABLE = BV21;
	SMAUG_EX_BASHED = BV22;
	SMAUG_EX_BASHPROOF = BV23;
	SMAUG_EX_NOMOB = BV24;
	SMAUG_EX_WINDOW = BV25;
	SMAUG_EX_xLOOK = BV26;
	SMAUG_EX_ISBOLT = BV27;
	SMAUG_EX_BOLTED = BV28;


type
  	GConsoleConvert = class(GConsoleWriter)
  	public
		procedure write(timestamp : integer; const text : string; debugLevel : integer = 0); override;
  	end;
  	
procedure GConsoleConvert.write(timestamp : integer; const text : string; debugLevel : integer = 0);
begin
	writeln('[' + FormatDateTime('hh:nn:ss', UnixToDateTime(timestamp)) + '] ', text);
end;	



var
   are : GArea;
   af : GFileReader;
   typ, s, g : string;
   npcindex : GNPCIndex;
   room : GRoom;
   ex : GExit;
   reset : GReset;
   act_flags : cardinal;
   tmp, arg1, arg2, arg3 : integer;
   f : textfile;
   node, node_ex : GListNode;
   cons : GConsole;

begin
	cons := GConsole.Create();
	cons.attachWriter(GConsoleConvert.Create());
	cons.Free();

  	writeConsole('Convert 1.0 - converts Smaug .are to Grendel .area');
  
  	if (paramcount < 2) then
    	begin
    	writeConsole('usage:  convert <.are input file> <.area output file>');
    	exit;
    	end;

	initDebug();
	initAreas();

	are := GArea.Create();

	try
		af := GFileReader.Create(ParamStr(1));
	except
		writeConsole('Could not open ' + ParamStr(1) + '!');
		exit;
	end;

	writeConsole('Loading: ' + ParamStr(1));

	while (not af.eof) do
		begin
		s := af.readLine;

		if (pos('#AREA',s) > 0) then
			are.name := trim(left(right(s, ' '), '~'))
		else
		if (pos('#AUTHOR',s) > 0) then
			are.author := trim(left(right(s, ' '), '~'))
		else
		if (s = '#ROOMS') then
			repeat
			s := af.readLine;

			if (s <> '#0') then
			begin
			// vnum
			act_flags := strtoint(right(s, '#'));

			room := GRoom.Create(act_flags, are);
			room_list.put(act_flags, room);

			// name
			s := af.readLine;
			room.name := left(s, '~');

			// description
			room.description := '';
			repeat
				s := af.readLine;

				if (s <> '~') then
				room.description := room.description + s + #13#10;
			until (s = '~');

			// delete the last #13#10
			room.description := copy(room.description, 1, length(room.description) - 2);

			// area room-flags sector-type (teledelay televnum)
			s := af.readToken();
			act_flags := af.readCardinal();
			act_flags := af.readInteger();

			if (not af.eol()) then
				begin
				room.teledelay := af.readInteger();
				room.televnum := af.readInteger();
				end;

				repeat
				s := af.readLine;

				if (pos('D', s) > 0) then
					begin
					ex := GExit.Create;
					room.exits.insertLast(ex);

					// direction
					ex.direction := strtoint(right(s, 'D')) + 1;

					// description
					repeat
						s := af.readLine();
					until (s = '~');

					// keyword(s)
					s := af.readLine();
					ex.keywords := hash_string(left(s, '~'));

					// exit_flags key to_room
					act_flags := af.readCardinal();
					ex.flags := 0;

					if (IS_SET(act_flags, SMAUG_EX_ISDOOR)) then
						SET_BIT(ex.flags, EX_ISDOOR);

					if (IS_SET(act_flags, SMAUG_EX_CLOSED)) then
						SET_BIT(ex.flags, EX_CLOSED);

					if (IS_SET(act_flags, SMAUG_EX_LOCKED)) then
						SET_BIT(ex.flags, EX_LOCKED);

					if (IS_SET(act_flags, SMAUG_EX_SECRET)) then
						SET_BIT(ex.flags, EX_SECRET);

					if (IS_SET(act_flags, SMAUG_EX_SWIM)) then
						SET_BIT(ex.flags, EX_SWIM);

					if (IS_SET(act_flags, SMAUG_EX_PICKPROOF)) then
						SET_BIT(ex.flags, EX_PICKPROOF);

					if (IS_SET(act_flags, SMAUG_EX_FLY)) then
						SET_BIT(ex.flags, EX_FLY);

					if (IS_SET(act_flags, SMAUG_EX_CLIMB)) then
						SET_BIT(ex.flags, EX_CLIMB);

					if (IS_SET(act_flags, SMAUG_EX_PORTAL)) then
						SET_BIT(ex.flags, EX_PORTAL);

					if (IS_SET(act_flags, SMAUG_EX_BASHPROOF)) then
						SET_BIT(ex.flags, EX_NOBREAK);

					if (IS_SET(act_flags, SMAUG_EX_NOMOB)) then
						SET_BIT(ex.flags, EX_NOMOB);

					tmp := af.readInteger();
					ex.vnum := af.readInteger();
					end
				else
				if (s = 'E') then
					begin
					// keyword(s)
					s := af.readLine();

					// description
					repeat
						s := af.readLine();
					until (s = '~');
					end;
				until (s = 'S');
				end;
			until (s = '#0')
		else
		if (s = '#MOBILES') then
			repeat
			s := af.readLine();

			if (s <> '#0') then
				begin
				npcindex := GNPCIndex.Create;
				npc_list.insertLast(npcindex);

				// vnum
				npcindex.vnum := strtoint(right(s, '#'));

				// name and short name
				s := af.readLine();
				s := af.readLine();

				npcindex.name := hash_string(left(s, '~'));
				npcindex.short := npcindex.name;

				// long name
				g := '';
				repeat
					s := af.readLine();

					if (s <> '~') then
						g := g + s + #13#10;
				until (s = '~');

				if (g[length(g) - 2] = '.') then
					delete(g, length(g), 1);

				npcindex.long := hash_string(g);

				// description
				repeat
					s := af.readLine();
				until (s = '~');

				// act_flags aff_flags alignment type
				act_flags := af.readCardinal();
				npcindex.act_flags := 0;

				if (IS_SET(act_flags, SMAUG_ACT_SENTINEL) or IS_SET(act_flags, SMAUG_ACT_NOWANDER)) then
					SET_BIT(npcindex.act_flags, ACT_SENTINEL);

				if (IS_SET(act_flags, SMAUG_ACT_SCAVENGER)) then
					SET_BIT(npcindex.act_flags, ACT_SCAVENGER);

				if (IS_SET(act_flags, SMAUG_ACT_AGGRESSIVE)) then
					SET_BIT(npcindex.act_flags, ACT_AGGRESSIVE);

				if (IS_SET(act_flags, SMAUG_ACT_STAY_AREA)) then
					SET_BIT(npcindex.act_flags, ACT_STAY_AREA);

				if (IS_SET(act_flags, SMAUG_ACT_TRAIN) or IS_SET(act_flags, SMAUG_ACT_PRACTICE)) then
					SET_BIT(npcindex.act_flags, ACT_TEACHER);

				if (IS_SET(act_flags, SMAUG_ACT_IMMORTAL)) then
					SET_BIT(npcindex.act_flags, ACT_IMMORTAL);

				if (IS_SET(act_flags, SMAUG_ACT_RUNNING)) then
					SET_BIT(npcindex.act_flags, ACT_FASTHUNT);

				if (IS_SET(act_flags, SMAUG_ACT_MOBINVIS)) then
					SET_BIT(npcindex.act_flags, ACT_MOBINVIS);

				if (IS_SET(act_flags, SMAUG_ACT_NOATTACK)) then
					SET_BIT(npcindex.act_flags, ACT_SPIRIT);

				if (IS_SET(act_flags, SMAUG_ACT_PROTOTYPE)) then
					SET_BIT(npcindex.act_flags, ACT_PROTO);

				act_flags := af.readCardinal();
				npcindex.alignment := af.readInteger();
				typ := af.readToken();

				// level hitroll armor hitdie damdie
				npcindex.level := af.readInteger();
				npcindex.hitroll := af.readInteger();
				npcindex.natural_ac := af.readInteger();
				s := af.readToken();
				s := af.readToken();

				// gold xp
				npcindex.gold := af.readInteger();
				act_flags := af.readInteger();

				// position position sex
				act_flags := af.readInteger();
				act_flags := af.readInteger();
				npcindex.sex := af.readInteger();

				if (typ = 'C') then
					begin
					// str int wis dex con cha lck
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();

					// sav1 sav2 sav3 sav4 sav5
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();
					act_flags := af.readInteger();

					// race class height weight speaks speaking numattacks
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					npcindex.height := af.readInteger;
					npcindex.weight := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;

					// hitroll damroll xflas res imm sus attacks defenses
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					act_flags := af.readInteger;
					end;
				end;
			until (s = '#0')
		else
		if (s = '#RANGES') then
			begin
			are.r_lo := af.readInteger();
			are.r_hi := af.readInteger();
			are.m_lo := af.readInteger();
			are.m_hi := af.readInteger();
			s := af.readLine;
			end
		else   
		if (s = '#RESETS') then
			repeat
				s := af.readLine;

				if (s <> 'S') then
					begin
					reset := GReset.Create;
					//reset.area := are;
					are.resets.insertLast(reset);

					reset.reset_type := left(s, ' ')[1];
					s := right(s, ' ');

					s := right(s, ' ');
					arg1 := strtointdef(left(s, ' '), 0);

					s := right(s, ' ');
					arg2 := strtointdef(left(s, ' '), 0);

					s := right(s, ' ');
					arg3 := strtointdef(left(s, ' '), 0);

					case reset.reset_type of
					'M' : begin
					reset.arg1 := arg1;
					reset.arg2 := arg3;
					reset.arg3 := arg2;
					end;
					'D' : begin
					reset.arg1 := arg1;
					reset.arg2 := arg2 + 1;
					reset.arg3 := arg3;
					end;
					else
						begin
						reset.arg1 := arg1;
						reset.arg2 := arg2;
						reset.arg3 := arg3;
						end;
					end;
					end;
			until (s = 'S');
		end;

	af.Free;
	
	writeConsole('Saving to: ' + ParamStr(2));

	are.save(ParamStr(2));

	writeConsole('All done.');
	
	cleanupAreas();
	cleanupDebug();
end.