Hi All,
I am running Linux Ubuntu 10.10 LTS with Lazarus latest version updated
2 days ago
And WINE running Delphi 5 Enterprise Update 2 and 7 Enterprise (not sure
what update) (c) 2002
After installing D5E and D7E I used CCleaner 2.2 (in WINE) to fix the
missing file errors & registry problems.
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="7"/>
<General>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<Title Value="island_maker"/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
<Language Value=""/>
<CharSet Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|
xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T
'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh
$(TargetCmdLine)"/>
</local>
</RunParams>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="1">
<Unit0>
<Filename Value="island_maker.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="island_maker"/>
<CursorPos X="20" Y="5"/>
<TopLine Value="1"/>
<UsageCount Value="20"/>
<SyntaxHighlighter Value="Delphi"/>
</Unit0>
</Units>
<JumpHistory Count="0" HistoryIndex="-1"/>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>
Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Free Pascal Compiler version 2.4.0-2 [2010/03/06] for i386
Copyright (c) 1993-2009 by Florian Klaempfl
Target OS: Linux for i386
Compiling island_maker1.lpr
island_maker1.lpr(12,1) Fatal: Syntax error, "identifier" expected but
"BEGIN" found
--
Love and Friendship, Peter Eric Williams
+61 3 6236-9675 (home or leave a message) Mobile 044-99-256-50
Proudly created in Australia. Quality Cross-Platform Games since 1970
with a Commodore PET 4016 with 16 Kilobytes of RAM (not Megabytes).
program island_maker;
uses
Forms,
Unit1 in 'set_max.pas' {Form1},
Unit2 in 'main_island.pas' {Form2},
{$R *.res}
begin
Application.Initialize;
Application.Title := 'PEWs Digital Terrain Island Maker';
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
initialization
{$I main_island.lrs}
object main_island: TForm1
Left = 77
Height = 588
Top = 100
Width = 792
Caption = 'Here is your random island. It was started at * and finished at @.'
ClientHeight = 554
ClientWidth = 792
Font.Height = -11
Font.Name = 'MS Sans Serif'
Menu = MainMenu1
OnCreate = FormCreate
ParentFont = False
LCLVersion = '0.9.26'
object Memo1: TMemo
Height = 554
Width = 792
Align = alClient
Alignment = taCenter
Font.CharSet = ANSI_CHARSET
Font.Height = -11
Font.Name = 'Times New Roman'
ParentFont = False
ScrollBars = ssBoth
TabOrder = 0
end
object MainMenu1: TMainMenu
left = 120
top = 16
object File1: TMenuItem
Caption = '&File'
object CreateaNewIsland1: TMenuItem
Caption = '&Create a New Island'
OnClick = CreateaNewIsland1Click
end
object SaveIslandtoFile1: TMenuItem
Caption = '&Save Island to File'
OnClick = SaveIslandtoFile1Click
end
end
object Options1: TMenuItem
Caption = '&Options'
object SetHorizontalMaxSize1: TMenuItem
Caption = 'Set &Maximum Size'
OnClick = SetHorizontalMaxSize1Click
end
end
end
object SaveDialog1: TSaveDialog
DefaultExt = '.txt'
Filter = 'Text Files|*.txt'
left = 168
top = 16
end
end
unit main_island;
{$MODE Delphi}
{ Digital Terrain Model Maker - Island Maker1
Language: Lazarus for Linux
Author: Peter E. Williams
Date: 22 May 2010
Version: 2.5 alpha
Ported from:
Language: Delphi 5.0 Std
Author: Peter E. Williams
Date: 2 June 2000
Version: 0.01 beta
Description: The original idea for this program was to write a random
island DTM generator which goes on a random walk defining the
_outline_ of the island. Therefore, it was my original intention
that areas of "sea" which are land-locked should in some later process
be marked as land (since the program is really only defining a
coast-line).
Island map is generated starting with a "*" and ending with a "@".
All points in between go in the sequence A..Z..1..9 and repeat. This
is simply to show the sequence in which the points were generated.
Next steps would required an expanded "map_detail" record.
The classical next steps would be to:
(a) mark land-locked water as land,
(b) randomly pick a point of land then go on a "short" random
walk to define the top of a mountain range,
(c) do same as (b) but for a valley,
(d) run an algorithm to graduate the elevation levels of land
between mountain range and valley.
(e) generate a few number of random spots and define them
as towns.
(f) do a series of "short" random walks (similar to (b)) to
define vegetation types, roads, railroads, rivers, etc.
Obviously river flows would be determined by elevation
levels. Logically roads and railroads would connect towns
[placed in (e)] so would be logical to _start_
roads/railroads random walks at these points.
I have had a good book which discusses these types of algorithms
which I bought many years ago... it's called "Games Programming".
If anyone's interested I'll be happy to post the details of it
when I get home - or I'll bring it along to the next SIG I go to.
}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus, LResources;
const
array_max_x = 1000;
array_max_y = 1000;
default_max_x = 90; // horizontal
default_max_y = 35; // vertical
type
TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
File1: TMenuItem;
CreateaNewIsland1: TMenuItem;
SaveIslandtoFile1: TMenuItem;
SaveDialog1: TSaveDialog;
Options1: TMenuItem;
SetHorizontalMaxSize1: TMenuItem;
procedure show_island;
procedure make_an_island;
procedure FormCreate(Sender: TObject);
procedure CreateaNewIsland1Click(Sender: TObject);
procedure SaveIslandtoFile1Click(Sender: TObject);
procedure SetHorizontalMaxSize1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Terrain_type = (Land, Sea);
map_detail = record
Terrain : Terrain_type;
Terrain_char : char;
end;
island_type = array[ 1..array_max_x, 1..array_max_y ] of
map_detail;
var
Form1: TForm1;
island : island_type;
max_x, max_y : integer;
implementation
uses set_max;
{--------------------------------------------------------------------}
procedure blank_island;
var
j,k : integer;
begin
for j := 1 to max_x do
for k := 1 to max_y do
begin
island[ j,k ].Terrain := Sea;
island[ j,k ].Terrain_char := '.';
end;
end; { blank_island }
{--------------------------------------------------------------------}
{ N
3 4 5
W 2 6 E
1 8 7
S
}
procedure define_island_outline;
var
got_good_dir : boolean;
current_x, current_y,
old_direction, new_direction,
j : integer;
max_loop : longint;
char1 : char;
begin
current_x := random( max_x ) + 1;
current_y := random( max_y ) + 1;
old_direction := 4; // north
char1 := '9'; // this will mean that the sequence starts with an "A"
island[ current_x, current_y ].Terrain := Land;
island[ current_x, current_y ].Terrain_char := '*';
max_loop := trunc( max_x * max_y / 1.575 ); // gives 2000 for 35 x 90
for j := 1 to max_loop do
begin
repeat
new_direction := random( 8 ) + 1;
got_good_dir := true;
// we don't want to go straight back where we came from
if abs(new_direction - old_direction) = 4 then
got_good_dir := false;
// next 4 tests are to keep from going outside the bounds of the map.
if (new_direction in [ 5..7 ]) and (current_x >= max_x) then
got_good_dir := false;
if (new_direction in [ 3..5 ]) and (current_y <= 1) then
got_good_dir := false;
if (new_direction in [ 1..3 ]) and (current_x <= 1) then
got_good_dir := false;
if (new_direction in [ 1,7,8 ]) and (current_y >= max_y) then
got_good_dir := false;
until got_good_dir;
case new_direction of
1..3 : current_x := current_x - 1;
5..7 : current_x := current_x + 1;
end;
case new_direction of
3..5 : current_y := current_y - 1;
1,7,8 : current_y := current_y + 1;
end;
if not ((current_x in [ 1..max_x ]) and (current_y in [ 1..max_y ])) then
begin
showmessage( 'Error [index(es) out of range]:' + #13 +
'current_x = ' + inttostr( current_x ) + #13 +
'current_y = ' + inttostr( current_y ) + #13 +
'new_direction = ' + inttostr( new_direction) + #13 +
'old_direction = ' + inttostr( old_direction) );
if current_x < 1 then
current_x := 1;
if current_x > max_x then
current_x := max_x;
if current_y < 1 then
current_y := 1;
if current_y > max_y then
current_y := max_y;
end
else
begin
// first land_char is '*', last is '@'
if j = max_loop then
island[ current_x, current_y ].Terrain_char := '@'
else
begin
if island[ current_x, current_y ].Terrain = Sea then
begin
island[ current_x, current_y ].Terrain := Land;
// land_char will be A..Z..1..9 then repeat
if char1 = '9' then
char1 := 'A'
else
char1 := chr( ord( char1 ) + 1 );
if char1 > 'Z' then
char1 := '1';
island[ current_x, current_y ].Terrain_char := char1;
old_direction := new_direction;
end; // then
end; // else
end; // else
end; // for j
end; { define_island_outline }
{--------------------------------------------------------------------}
procedure tform1.show_island;
var
temp_str1 : string;
j, k : integer;
begin
memo1.lines.clear;
for j := 1 to max_y do
begin
temp_str1 := '';
for k := 1 to max_x do
{ case island[ j, k ].Terrain of
Land : temp_str1 := temp_str1 + '*';
Sea : temp_str1 := temp_str1 + '.';
end; }
temp_str1 := temp_str1 + island[ k,j ].Terrain_char;
memo1.lines.add( temp_str1 );
end;
end; { show_island }
{--------------------------------------------------------------------}
procedure tform1.make_an_island;
begin
blank_island;
define_island_outline;
show_island;
end; { make_an_island }
{--------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
memo1.font.Name := 'Courier New';
memo1.font.Size := 8;
max_x := default_max_x; // horizontal
max_y := default_max_y; // vertical
make_an_island;
end; { FormCreate }
{--------------------------------------------------------------------}
procedure TForm1.CreateaNewIsland1Click(Sender: TObject);
begin
make_an_island;
end; { CreateaNewIsland1Click }
{--------------------------------------------------------------------}
procedure TForm1.SaveIslandtoFile1Click(Sender: TObject);
begin
if savedialog1.execute then
memo1.Lines.SaveToFile( savedialog1.filename );
end; { SaveIslandtoFile1Click }
{--------------------------------------------------------------------}
procedure TForm1.SetHorizontalMaxSize1Click(Sender: TObject);
begin
form2 := tform2.create( nil );
try
form2.max_x.text := inttostr( max_x );
form2.max_y.text := inttostr( max_y );
if form2.showmodal = mrOK then
begin
try
max_x := strtoint( form2.max_x.text );
except
showmessage( 'Error: Value for Max_x is not a valid number.');
end;
try
max_y := strtoint( form2.max_y.text );
except
showmessage( 'Error: Value for Max_y is not a valid number.');
end;
if (max_x < 1) or (max_x > array_max_x) then
begin
max_x := default_max_x;
showmessage( 'Error: Max_x out of range.' );
end;
if (max_y < 1) or (max_y > array_max_y) then
begin
max_y := default_max_y;
showmessage( 'Error: Max_y out of range.' );
end;
end;
finally
end;
end; { SetHorizontalMaxSize1Click }
{--------------------------------------------------------------------}
initialization
{$i main_island.lrs}
end.
unit set_max;
{$MODE Delphi}
interface
uses
{Windows,} {Messages,} SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, LResources;
type
{ TForm2 }
TForm2 = class(TForm)
max_x: TEdit;
max_y: TEdit;
Label1: TLabel;
Label2: TLabel;
Cancel_button: TButton;
OK_button: TButton;
Label3: TLabel;
Label4: TLabel;
procedure OK_buttonClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
Uses Unit1;
{ TForm2 }
procedure TForm2.OK_buttonClick(Sender: TObject);
begin
CreateaNewIsland1Click(Sender);
end;
initialization
{$i set_max.lrs}
end.
--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus