unit mainform;
interface
uses
WSDLIGrendelWebService,
WSDLISOAPAuthenticator,
SysUtils, Types, Classes, Variants, QTypes, QGraphics, QControls, QForms,
QDialogs, QStdCtrls, QGrids, QComCtrls, QMenus,
area, InvokeRegistry, Rio, SOAPHTTPClient, QExtCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
DrawGrid1: TDrawGrid;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
Label4: TLabel;
Label5: TLabel;
Edit5: TEdit;
Label6: TLabel;
Edit6: TEdit;
Label7: TLabel;
Edit7: TEdit;
GroupBox3: TGroupBox;
Edit8: TEdit;
Button2: TButton;
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Button3: TButton;
Button4: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
GroupBox4: TGroupBox;
Label9: TLabel;
Label10: TLabel;
GroupBox5: TGroupBox;
Edit9: TEdit;
Label11: TLabel;
Memo1: TMemo;
GroupBox6: TGroupBox;
DebugMemo: TMemo;
Label8: TLabel;
Label12: TLabel;
Edit10: TEdit;
Edit11: TEdit;
Label13: TLabel;
Label14: TLabel;
Edit12: TEdit;
Timer1: TTimer;
GroupBox7: TGroupBox;
Button5: TButton;
TrackBar1: TTrackBar;
Label15: TLabel;
CheckBox1: TCheckBox;
procedure Exit1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure DrawGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button2Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure connect();
procedure disconnect();
function getSOAPAuthenticator() : ISOAPAuthenticator;
function getGrendelWebService() : IGrendelWebService;
procedure updateConsole();
procedure updateFromArea(area : GArea);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.xfm}
uses
skills,
console,
conns,
chars,
constants,
dtypes,
progs,
race;
var
extents_lo, extents_hi : GCoords;
cells : array[0..100,0..100] of GRoom;
procedure createCoordinates(startroom : GRoom);
var
iterator : GIterator;
room : GRoom;
ex : GExit;
begin
if (startroom.areacoords.x < extents_lo.x) then
extents_lo.x := startroom.areacoords.x;
if (startroom.areacoords.y < extents_lo.y) then
extents_lo.y := startroom.areacoords.y;
if (startroom.areacoords.z < extents_lo.z) then
extents_lo.z := startroom.areacoords.z;
if (startroom.areacoords.x > extents_hi.x) then
extents_hi.x := startroom.areacoords.x;
if (startroom.areacoords.y > extents_hi.y) then
extents_hi.y := startroom.areacoords.y;
if (startroom.areacoords.z > extents_hi.z) then
extents_hi.z := startroom.areacoords.z;
cells[startroom.areacoords.x,startroom.areacoords.y] := startroom;
iterator := startroom.exits.iterator();
while (iterator.hasNext()) do
begin
ex := GExit(iterator.next());
room := GRoom(room_list[ex.vnum]);
if (room = nil) then
continue;
if (room.areacoords = nil) then
begin
room.areacoords := GCoords.Create(startroom.areacoords);
case ex.direction of
DIR_NORTH:
begin
dec(room.areacoords.y);
end;
DIR_EAST:
begin
dec(room.areacoords.x);
end;
DIR_SOUTH:
begin
inc(room.areacoords.y);
end;
DIR_WEST:
begin
inc(room.areacoords.x);
end;
DIR_DOWN:
begin
inc(room.areacoords.z);
end;
DIR_UP:
begin
dec(room.areacoords.z);
end;
end;
createCoordinates(room);
end;
end;
iterator.Free();
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close();
end;
procedure TForm1.updateFromArea(area : GArea);
var
room : GRoom;
begin
Edit1.Text := area.name;
Edit2.Text := area.author;
Edit3.Text := area.resetmsg;
Edit4.Text := IntToStr(area.flags.value);
Edit5.Text := IntToStr(area.maxage);
Edit6.Text := IntToStr(area.weather.temp_avg);
Edit7.Text := IntToStr(area.weather.temp_mult);
room := GRoom(area.rooms.head.element);
room.areacoords := GCoords.Create();
room.areacoords.x := 15;
room.areacoords.y := 15;
room.areacoords.z := 0;
extents_lo := GCoords.Create(room.areacoords);
extents_hi := GCoords.Create(room.areacoords);
createCoordinates(room);
Label10.Caption := IntToStr(extents_lo.x) + ',' + IntToStr(extents_lo.y) + ',' + IntToStr(extents_lo.z) + ' - ' +
IntToStr(extents_hi.x) + ',' + IntToStr(extents_hi.y) + ',' + IntToStr(extents_hi.z);
DrawGrid1.Col := (extents_lo.x + extents_hi.x) div 2;
DrawGrid1.Row := (extents_lo.y + extents_hi.y) div 2;
DrawGrid1.Invalidate();
end;
procedure TForm1.Button3Click(Sender: TObject);
var
area : GArea;
begin
if (OpenDialog1.Execute()) then
begin
area := GArea.Create();
area.load(OpenDialog1.FileName);
processAreas();
updateFromArea(area);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
initAreas();
initRaces();
initSkills();
initConns();
initChars();
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
cleanupSkills();
cleanupRaces();
cleanupAreas();
{ cleanupChars(); }
cleanupConns();
end;
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
room : GRoom;
begin
room := cells[ACol, ARow];
if (room <> nil) then
begin
case room.sector of
SECT_INSIDE: DrawGrid1.Canvas.Brush.Color := clBlack;
SECT_CITY: DrawGrid1.Canvas.Brush.Color := clMaroon;
SECT_FIELD: DrawGrid1.Canvas.Brush.Color := clGreen;
SECT_WATER_NOSWIM,
SECT_WATER_SWIM: DrawGrid1.Canvas.Brush.Color := clNavy;
else
DrawGrid1.Canvas.Brush.Color := clRed;
end;
DrawGrid1.Canvas.FillRect(Rect);
end;
{ if (State.Contains(gdFocused))
DrawGrid1->Canvas->DrawFocusRect(Rect); }
end;
procedure TForm1.DrawGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
Column, Row: Longint;
room : GRoom;
begin
DrawGrid1.MouseToCell(X, Y, Column, Row);
room := cells[Column, Row];
if (room <> nil) then
begin
Edit9.Text := IntToStr(room.vnum);
Memo1.Lines.Clear;
Memo1.Lines.Add(room.description);
GroupBox5.Visible := true;
end
else
begin
GroupBox5.Visible := false;
end;
end;
var
connected : boolean = false;
sessionHandle : WideString;
timestamp : integer;
function TForm1.getSOAPAuthenticator() : ISOAPAuthenticator;
begin
Result := getISOAPAuthenticator(False, 'http://' + Edit8.Text + ':' + Edit12.Text + '/soap/ISOAPAuthenticator')
end;
function TForm1.getGrendelWebService() : IGrendelWebService;
begin
Result := getIGrendelWebService(False, 'http://' + Edit8.Text + ':' + Edit12.Text + '/soap/IGrendelWebService')
end;
procedure TForm1.connect();
var
svc : ISOAPAuthenticator;
begin
try
if (not connected) then
begin
svc := getSOAPAuthenticator();;
connected := svc.login(Edit10.Text, Edit11.Text, sessionHandle);
if (connected) then
begin
Button2.Caption := 'Disconnect';
DebugMemo.Lines.Add('Login succesful (' + sessionHandle + '), connected');
end
else
DebugMemo.Lines.Add('Login unsuccesful');
end;
except
on E : Exception do
DebugMemo.Lines.Add(E.Message);
end;
end;
procedure TForm1.disconnect();
var
svc : ISOAPAuthenticator;
begin
try
svc := getSOAPAuthenticator();
if (connected) then
begin
svc.logout(sessionHandle);
connected := false;
end;
Button2.Caption := 'Connect';
except
on E : Exception do
DebugMemo.Lines.Add(E.Message);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if (connected) then
disconnect()
else
connect();
end;
procedure TForm1.updateConsole();
var
svc : IGrendelWebService;
strings : TStringArray;
idx : integer;
begin
try
svc := getGrendelWebService();
strings := svc.getConsoleHistory(sessionHandle, timestamp);
for idx := Low(strings) to High(strings) do
DebugMemo.Lines.Add(strings[idx]);
except
on E : Exception do
begin
disconnect();
DebugMemo.Lines.Add(E.Message);
end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if (connected) then
updateConsole();
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
Timer1.Enabled := CheckBox1.Checked;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (connected) then
updateConsole();
end;
end.