Project Perfect Mod Forums
:: Home :: Get Hosted :: PPM FAQ :: Forum FAQ :: Privacy Policy :: Search :: Memberlist :: Usergroups :: Register :: Profile :: Log in to check your private messages :: Log in ::


The time now is Thu Mar 28, 2024 4:28 pm
All times are UTC + 0
SHP, RLE and coding discussion (Split from Image Shaper)
Moderators: Community Tools Developpers
Post new topic   Reply to topic Page 1 of 1 [20 Posts] Mark the topic unread ::  View previous topic :: View next topic
Author Message
Nyerguds
General


Joined: 24 May 2004
Location: Flanders (Be) Posts:300000001

PostPosted: Sun Feb 11, 2018 4:06 pm    Post subject:   Reply with quote  Mark this post and the followings unread

Well, I haven't looked into SHP yet. I'll probably do that soon though; it's currently a bit of a gap in my converter.

The RLE encoder was originally written to compress fonts and other graphics from Sierra-Dynamix games, and it works fine on Westwood CPS as well (with adapted code reading/writing), but it is a general RLE; while the output into codes can be specified by overriding classes, its basic compression and decompression method are fixed, so it has no support for strange things like only compressing specific byte values.

_________________

Back to top
View user's profile Send private message Visit poster's website Skype Account
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Wed Feb 14, 2018 5:58 pm    Post subject: Reply with quote  Mark this post and the followings unread

There is a simple reason why SHP Builder takes a long time. Its because its code was crappy coded (And i would know as i wrote the first version of SHP Builder alone). Afaik Banshee never really touched the inner guts.

Basically SHP Builder uses Arrays for everything (Rather than pointers) so the code is far more complex and far slower than it needed. As such even adding new frames and filling them with data takes longer than it should.

SHP Toolz code for would be easier to read (And its faster). Though there is no code for converting PNG to SHP.

https://pastebin.com/kVeFWjq7

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Thu Feb 15, 2018 3:42 am    Post subject: Reply with quote  Mark this post and the followings unread

Quote:
There is a simple reason why SHP Builder takes a long time. Its because its code was crappy coded (And i would know as i wrote the first version of SHP Builder alone). Afaik Banshee never really touched the inner guts.


I've touched SHP (TS)'s RLE code to fix some access violation bug or something like that and also made a pointer version to load and save things faster. What I did not do was to properly reorganize the inner guts, but I did touch it for many things already. I trully hate OS SHP Builder's code organization. It is a mess and you have to recode the same thing countless times to do basic things with the SHP document. So, yes, it is horrribly coded and I've kept it being horribly coded. I am not proud of it.


Quote:
Basically SHP Builder uses Arrays for everything (Rather than pointers) so the code is far more complex and far slower than it needed. As such even adding new frames and filling them with data takes longer than it should.


Using arrays instead of pointers isn't a bad thing. It helps to organize the memory. And dynamic arrays implementation on pascal is actually well done. The bad thing is how pascal is not as resourceful as C/C++ in order to fill the elements of these arrays with a single value using a single command or proper memory copy commands with one instruction. Regardless, that kind of operation is still done so fast that users won't notice a slowdown at all, to be honest.

Note however that using arrays of arrays is not a good idea at all and it may slow down the performance of the program. OS SHP Builder uses a lot of these things which certainly causes it to slows down.

Quote:
SHP Toolz code for would be easier to read (And its faster). Though there is no code for converting PNG to SHP.

https://pastebin.com/kVeFWjq7


Sorry to be boring, but your code is still horribly organized and horribly indented as usual. It will not motivate contributions from other programmers.

But, I'll make some constructive comments for once. In terms of organization, if I were you, I'd:
- make one file per class;
- split model, view and controller;
- do not use TSHP class as your document model.. it is just a file type;
- based on the model, view and controller split, put record types in a single separate file for each of these things, as well as those functions that do not deserve to be in a class and constants.

Regarding coding guidelines and indentation:

- make sure you use tabs with 2 or 3 spaces (I personally prefer 3 for code readability) to emphasize the scope of the instruction;
- write one instruction per line only;
- reserved words such as begin, end, else and case should have its own separate line;
- if an instruction is too big, do not split it into separate lines. Instead, write a short comment explaining it above it if you feel uncomfortable with it;
- use variable names where those who read your code will have a chance to understand (s, t, u, i, v, etc doesn't necessarily help, unless they are counters);
- make sure you have standards for variable names that allows other programmers to distinguish procedure/function/method parameters and class internal variables when reading the code;
- if possible explain the objective of each function/method/procedure (specially the ones that are more complex) and, in some cases, the parameters if the names aren't obvious.


And I will probably have much more suggestions for you, but right now I'm tired and it is too late here.

Back to top
View user's profile Send private message Visit poster's website Skype Account
Blade
Cyborg Commando


Joined: 23 Dec 2003

PostPosted: Thu Feb 15, 2018 11:35 am    Post subject: Reply with quote  Mark this post and the followings unread

Suggesting none power of 2 indent sizes? The horror! 2 or 4 I get, but 3? *shudder*.

Back to top
View user's profile Send private message
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 15, 2018 12:26 pm    Post subject: Reply with quote  Mark this post and the followings unread

Arrays are far slower and i mean FAR slower. The reason why is that when you do Bla[5] := 6 it has to do Integer(Pointer(Cardinal(Bla)+4*5)^) := 6 . Which means that when you walk through large amounts of data its doing far more work. BuildFrameRGB is a perfect example of a situation where you walk through large amounts of data and its faster than SHP builders Array based code would be as there is less overheads. When talking about large amounts of data overheads are what kills the speed.

Pointers are faster because while you may do similar to get the start of a line you are just increasing by 1 to the next bit of data. That is far less work than working out the full position every time.

Quote:
The bad thing is how pascal is not as resourceful as C/C++ in order to fill the elements of these arrays with a single value using a single command or proper memory copy commands with one instruction

What are you talking about? You have the FillChar and ZeroMemory. FillChar(Bla[0],500,0); You can also copy memory.... With CopyMemory(). CopyMemory(@Bla[4],@Bla[100],5*SizeOf(Integer))...... These are basic things.....

------------------

Seriously Banshee... Having 1 class per file is dumb. Seriously dumb. If you have 1 class per file you then have WAY too many files to look through. All relevant code to a single thing should be in a SINGLE file so everything is grouped there. If you follow what you state is the law of organisation then you make your code far worse. Look at how the delphi units are done (As in Borland/Embarcadero), they contain multiple classes per unit where the classes are grouped together, thats common sense.

Note that my code actually only has 1 class in the file, everything else is types. And before you state that types should be in its own file then no. The unit was designed to have everything relating to SHP's be in a single file. Its one single file to contain everything related to SHP's.

When i look at VXLSE III (Latest code) the organisation is bad. There is too many files. Its a nightmare. Its abstracted to hell.

Indentation is a PERSONAL choice, one that can easily be changed by applications which exist on the web. Some use a space, some use 2 spaces some use 3 spaces, some use 1 tab, some use 2 tabs, etc. The only people who won't contribute due to indentation are complete stuck up idiots. I have a personal preference like everyone but i can easily read/write code irrespective of indentation as its not an issue to any sensible programmer.

You sound as if you have read something at Uni and think its the word of God. You sound like one of those people who do the Object Orientated vs non-Object Orientated debates where they never understand that being too Object Orientated (Going crazy with the amount of class inheritance) is actually just as bad as doing pure non-Object Orientated.

Its insulting to get the BS "here is how to be a programmer" crap. I have been programming for at least 18 years. I know how to write code. The whole "I have read some book at uni that said do it this way" speeches are always BS as they only apply to single case rules. In general they are BS.

The "don't use TSHP as thats a filetype not a document".... seriously.... If you want to have an app that loads multiple file formats using a single document class then what you would do is make the TSHP a class of your "document". You would still be using the TSHP class as the main class for SHP files the only difference is you would treat it like a TDocument by the main app. The code i wrote was never intended to be loaded by an app that loads multiple formats, it was simply designed LIKE MOST PROGRAMMERS DO to be a single class to contain a SHP file (100% contained to a single file).

When it comes to comments, i only use them when its appropriate. Anyone who is a actual programmer should be able to easily follow the code. If you look at BuildFrameRGB for example it has variables like SP. But if you look at the code it has SP := ShadowPal[FGame];. So SP holds the ShadowPal colour. there is no need for a comment to mention SP = ShadowPal as you can see how its used. What parts of the file actually need comments? Comments for the sake of comments are pointless when they are irrelevant.

P.S I happily take constructive criticism but not the High Horse "iv read some book" criticism. When people do the "no one will contribute" thats when you know its all BS. True programmers don't care what indentation the code is in, etc.

P.S 2 The thing to learn is that everything depends on the situation and the intent behind the code. Too much of one thing is just as bad as too much of another, there is no perfect method where too much is a good thing. Also my code works better than SHP Builder, its alot faster.

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
Blade
Cyborg Commando


Joined: 23 Dec 2003

PostPosted: Thu Feb 15, 2018 1:03 pm    Post subject: Reply with quote  Mark this post and the followings unread

One class per file is an ideal, but even with closely related classes you might want to split them out into separate files if they have more than a handful of methods (beyond simple getters and setters that is), even a couple of large methods IMO make multiple classes in a single file unwieldy.

Regarding formatting, that is why utilities like clang-format are a godsend, you can write code however you want, apply the format for the project before you commit and you are good.

As for comments, if your justification is "well any REAL programmer should be able to follow it", that is a pretty weak justification for not commenting things well, it may well be obvious to you now, but will it be when you come back to the code months or years later? Probably not in many cases and if its not obvious to the person who wrote it, what chance have even "real" programmers got?

Back to top
View user's profile Send private message
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Thu Feb 15, 2018 1:36 pm    Post subject: Reply with quote  Mark this post and the followings unread

Blade wrote:
Suggesting none power of 2 indent sizes? The horror! 2 or 4 I get, but 3? *shudder*.


Laughing I really did not took power of two into consideration here, but mostly tried to minimize the amount of spaces required to be quickly able to distinguish blocks of code. Two might be enough for most situations although if you have many blocks of if, while or for etc together, I'm not sure that two is clear enough. Two is fine for most IDEs, but 3 is much more visually clear for me. If we make spaces too big, we'll have more big lines unnecessarily.


stucuk wrote:
P.S I happily take constructive criticism but not the High Horse "iv read some book" criticism. When people do the "no one will contribute" thats when you know its all BS. True programmers don't care what indentation the code is in, etc.


This is not a "High Horse I have read some book" criticism. This is a set of suggestions to make your code easier to read even if you haven't touched on it in the last 20 years. Besides, I am not telling things that I've read in any book. I am telling things that helped me to understand my own code and the code of the programs in companies that I have programmed and how it was quick for me to re-adapt into it.

If I look at your code now, without having a clue of what is it about, I'll take some time to find things in files, because your files are a way too huge and to understand the whole code. Ok, I know that ctrl + f helps to speed things up a bit, but if you still want to understand the whole process, you'll suffer a lot with your code in the way you write and organize it. Furthermore, if you also applies some of the suggestions I wrote, it becomes quicker to understand the objective of the variables used, their origin, what kind of data they can receive, what is their scope, the position of the instruction in a flux, etc...

It is not a matter of a book. It is a matter of reading code without having to consult things in an endless way to understand complex code in your program.

True programmers who work in group wants their code to be legible. If they leave the program, someone else will be able to quickly adapt into it and take it over.

stucuk wrote:
Its insulting to get the BS "here is how to be a programmer" crap. I have been programming for at least 18 years. I know how to write code. The whole "I have read some book at uni that said do it this way" speeches are always BS as they only apply to single case rules. In general they are BS.


Oh, and you can spend countless years working on something in a non-ideal way and it doesn't mean you are necessarily good at it. I am not underestimating what you've learned so far, but regardless of how long you work on something, you always have a lot to learn.


stucuk wrote:
Seriously Banshee... Having 1 class per file is dumb. Seriously dumb. If you have 1 class per file you then have WAY too many files to look through. All relevant code to a single thing should be in a SINGLE file so everything is grouped there. If you follow what you state is the law of organisation then you make your code far worse. Look at how the delphi units are done (As in Borland/Embarcadero), they contain multiple classes per unit where the classes are grouped together, thats common sense.


Having too much files is not a bad thing at all, depending on how you name these files and on what kind of standards you use.

You don't need to use a single file per subject, but it is better to use a paste for it instead, if the subject is very relevant.

stucuk wrote:
You sound as if you have read something at Uni and think its the word of God. You sound like one of those people who do the Object Orientated vs non-Object Orientated debates where they never understand that being too Object Orientated (Going crazy with the amount of class inheritance) is actually just as bad as doing pure non-Object Orientated.


Bull crap regarding the word of God or university or whatever.

Anyway, if you exaggerate on anything in your life it will certainly be a bad thing... and you can misuse any tool that you want... so, object oriented programming can be misused. But it is a very useful tool to re-use code. Take that in mind.

stucuk wrote:
The "don't use TSHP as thats a filetype not a document".... seriously.... If you want to have an app that loads multiple file formats using a single document class then what you would do is make the TSHP a class of your "document". You would still be using the TSHP class as the main class for SHP files the only difference is you would treat it like a TDocument by the main app. The code i wrote was never intended to be loaded by an app that loads multiple formats, it was simply designed LIKE MOST PROGRAMMERS DO to be a single class to contain a SHP file (100% contained to a single file).


You can even start working on your SHP program planning to do something for SHP (TS) only, but it will eventually grow into other SHP files (i.e.: the ones from TD and RA1) and it could potentially edit other files. Design wise and documentation wise, it is better to split your document from any file format. They are different things. And, if you want to extend your program to support other files, it will be easier to do it if you split those entities in first place. This was one of the many design issues from SHP Builder.


stucuk wrote:
What are you talking about? You have the FillChar and ZeroMemory. FillChar(Bla[0],500,0); You can also copy memory.... With CopyMemory(). CopyMemory(@Bla[4],@Bla[100],5*SizeOf(Integer))...... These are basic things.....


FillChar doesn't seem to work well for floats. That's one of my points regarding filling elements of arrays with single instructions. Regarding CopyMemory, you are right.

stucuk wrote:
Arrays are far slower and i mean FAR slower. The reason why is that when you do Bla[5] := 6 it has to do Integer(Pointer(Cardinal(Bla)+4*5)^) := 6 . Which means that when you walk through large amounts of data its doing far more work. BuildFrameRGB is a perfect example of a situation where you walk through large amounts of data and its faster than SHP builders Array based code would be as there is less overheads. When talking about large amounts of data overheads are what kills the speed.

Pointers are faster because while you may do similar to get the start of a line you are just increasing by 1 to the next bit of data. That is far less work than working out the full position every time.


Honestly, arithmetic operations are one of the fastest things done in CPU. These hardly costs anything at all.

Back to top
View user's profile Send private message Visit poster's website Skype Account
Lin Kuei Ominae
Seth


Joined: 16 Aug 2006
Location: Germany

PostPosted: Thu Feb 15, 2018 2:05 pm    Post subject: Reply with quote  Mark this post and the followings unread

um, split into separate topic up to Nyerguds post?

_________________
SHP Artist of Twisted Insurrection:  Nod buildings

Public SHPs
X-Mech Calendar (28 Mechs for GDI and Nod)
5 GDI, 5 Nod, 1 Mutant, 1 Scrin unit, 1 GDI building

Tools
Image Shaper______TMP Shop______C&C Executable Modifier

Back to top
View user's profile Send private message
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 15, 2018 2:54 pm    Post subject: Reply with quote  Mark this post and the followings unread

Banshee wrote:
If I look at your code now, without having a clue of what is it about, I'll take some time to find things in files, because your files are a way too huge and to understand the whole code. Ok, I know that ctrl + f helps to speed things up a bit, but if you still want to understand the whole process, you'll suffer a lot with your code in the way you write and organize it. Furthermore, if you also applies some of the suggestions I wrote, it becomes quicker to understand the objective of the variables used, their origin, what kind of data they can receive, what is their scope, the position of the instruction in a flux, etc...


If i look at your code, because its split into millions of files it takes a long time to work anything out. Thats the issue with abstraction hell.


Banshee wrote:
It is not a matter of a book. It is a matter of reading code without having to consult things in an endless way to understand complex code in your program.

What part of the code is complex? What are you having to constantly consult to read the SHP code?

Banshee wrote:
True programmers who work in group wants their code to be legible. If they leave the program, someone else will be able to quickly adapt into it and take it over.


If your working in a group (Which i never did with the SELF CONTAINED SHP CODE) then you write a document detailing the format you want to use. What indentation, comments, etc. You uniform everything. But guess what. No one other than myself was in the Team that designed the SHP.pas file i posted.

So as a result i chose to used my own uniform formatting which every member of my team followed to the letter, you will never see any code written by my team which is using a different style as we wanted it to be uniform.

Banshee wrote:
Oh, and you can spend countless years working on something in a non-ideal way and it doesn't mean you are necessarily good at it. I am not underestimating what you've learned so far, but regardless of how long you work on something, you always have a lot to learn.


Yeh and i have been there and done that. For years i did abstraction hell like you seem to love. And what i realised is that its a bad way to work. It involves alot more work, splits the code way to far which makes it harder to maintain.

I have found that for example if your writing an app which supports multiple formats that its actually better(Simpler and easier) to create a new "format" for the app to use (Either internally or as an actual file format) which is streamlined for the editor and which is able to handle everything any of the formats you open need. You then have units which load/save each format and you convert them into your apps format. Rather than having one base class which each of your file formats inherit, each having effectively duplicate code (as your using virtual;abstract;) for each format.

With GM Factory (Which replaces GM Editor which used SHP Builder as a base) i created GMF file format which can handle any of the OW files and which is optimised for editing rather than being used by a game. When a GMZ/etc is loaded its converted to a GMF (Which doesn't take any real time) and the reverse is true when saving.


Banshee wrote:
Having too much files is not a bad thing at all, depending on how you name these files and on what kind of standards you use.

You don't need to use a single file per subject, but it is better to use a paste for it instead, if the subject is very relevant.


It is a bad thing because its easier to work when everything is grouped together. Everything relating to SHP files for example should be in a single file unless its a generic thing which could be placed in a generic unit (I.E If you had two things using a TPalette and they were identical then it should be in a separate generic unit which both use).


Banshee wrote:
You can even start working on your SHP program planning to do something for SHP (TS) only, but it will eventually grow into other SHP files (i.e.: the ones from TD and RA1) and it could potentially edit other files. Design wise and documentation wise, it is better to split your document from any file format. They are different things. And, if you want to extend your program to support other files, it will be easier to do it if you split those entities in first place. This was one of the many design issues from SHP Builder.


Thats why you want a format for the editor its self and convert to it. With GM Factory for example its a generic format (GMF) where each frame's RGB is stored in a Pointer as 16Bit RGB. GMZ for example has a palette, but GMF doesn't. GMF can be converted into any file format OW uses (They are all 16bit colour).

If i added an import for SHP files (Which technically there is though its not a standard import but one where you can choose where the frames go) to GM Factory all i would need to do is include the SHP unit i made and write a small amount of code to convert between the SHP and GMF. Same with exporting. I don't need to convert the code to my own abstracted "Document" class, i can use anyone elses code easily without any modification to their code. Its far more flexible.

GM Factory doesn't need to care about the TSHP class, as its using GMF to do everything.


Banshee wrote:
FillChar doesn't seem to work well for floats.

Fillchar just goes through the pointer(Internally it uses the pointer of what you send it) setting it all to 0. You could easily make one for Floats if you want to. There is no easyer way to set data to a value other than literally setting its value.

Here is some code i just wrote which should work (It works similar to how fillchar works except its not in ASM as i don't know ASM):
Code:
procedure FillFloat(var Dest; Count: Integer; Value: Single);
var
 P : PSingle;
 I : Integer;
begin
 P := PSingle(@Dest);
 for I := 0 to Count-1 do
 begin
  P^ := Value;
  Inc(Cardinal(P),4);
 end;
end;


Banshee wrote:
Honestly, arithmetic operations are one of the fastest things done in CPU. These hardly costs anything at all.

No Honestly Arrays are slower and it Honestly makes a difference. When doing a single operation it may not be noticeable but if your doing a 100x100 image setting each value one at a time using an array its alot slower than using pointers where you increase them each operation.

There is a reason that people who write code in delphi for things like Images always use pointers. The TBitmap class for example uses Scanlines which are pointers. They are not arrays. You will not find alot of people using Arrays to store data, instead they use raw pointers as they are faster.

Lets say that doing Bla[5] := 6; costs 3 operations and Bla^ := 6; Inc(Cardinal(Bla),4); costs 2 operations. With a 100x100 image you have 100,000 pixels which means pointers would save you 100,000 operations. Little overheads soon add up.

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Thu Feb 15, 2018 4:25 pm    Post subject: Reply with quote  Mark this post and the followings unread

First of all, this is a split from Image Shaper topic, as requested by LKO.


stucuk wrote:
If i look at your code, because its split into millions of files it takes a long time to work anything out. Thats the issue with abstraction hell.


stucuk wrote:
Yeh and i have been there and done that. For years i did abstraction hell like you seem to love. And what i realised is that its a bad way to work. It involves alot more work, splits the code way to far which makes it harder to maintain.


Not really. Of course you need to get acquainted with the organization in first place, but once you do it, it is quite quick to change existing things and add new things in a long term. And I don't think abstraction is the correct term for what you meant.

And finally, it is worth mentioning that, as everything, it can be misused. You need to know good ways to organize your files. VXLSE III is not also a sample of a proper work on this point of view, since it is still a mix of my organization with yours. I did not finish to organize it.

stucuk wrote:
What part of the code is complex? What are you having to constantly consult to read the SHP code?


Try learning from scratch how a SHP TD file is loaded, step by step.... every step. And this is just one of the inumerous sample. It is not hard to figure out where to start by looking at your code, but learning and understanding the whole process is awful.

stucuk wrote:
If your working in a group (Which i never did with the SELF CONTAINED SHP CODE) then you write a document detailing the format you want to use. What indentation, comments, etc. You uniform everything. But guess what. No one other than myself was in the Team that designed the SHP.pas file i posted.

So as a result i chose to used my own uniform formatting which every member of my team followed to the letter, you will never see any code written by my team which is using a different style as we wanted it to be uniform.


Even if you are working on a group of one person (yea, yourself),  you should always consider the possibility of growth of this development group. Of course that, in this case, you'll be the one setting the standards, which was clearly exactly what I meant in my first post with the suggestions above.

But you need to have standards and follow these standards. Regarding your standards for this new SHP program, I disagreed with the indentation spaces and several other things and exposed my reasons in that first post and the following ones. I think it could be more legible.


stucuk wrote:
I have found that for example if your writing an app which supports multiple formats that its actually better(Simpler and easier) to create a new "format" for the app to use (Either internally or as an actual file format) which is streamlined for the editor and which is able to handle everything any of the formats you open need. You then have units which load/save each format and you convert them into your apps format. Rather than having one base class which each of your file formats inherit, each having effectively duplicate code (as your using virtual;abstract;) for each format.

With GM Factory (Which replaces GM Editor which used SHP Builder as a base) i created GMF file format which can handle any of the OW files and which is optimised for editing rather than being used by a game. When a GMZ/etc is loaded its converted to a GMF (Which doesn't take any real time) and the reverse is true when saving.


Congratulations... this is very close to what I was trying to tell you by not using TSHP as your document. I just did not mentioned to have your own file format for your own document, but that is a good thing to do as well. Why didn't you do that with your new SHP editor?


stuck wrote:
Fillchar just goes through the pointer(Internally it uses the pointer of what you send it) setting it all to 0. You could easily make one for Floats if you want to. There is no easyer way to set data to a value other than literally setting its value.

Here is some code i just wrote which should work (It works similar to how fillchar works except its not in ASM as i don't know ASM):

*** .... code ... ***


And guess what? This is pretty much what I was trying to avoid in first place when I said "using a single command or proper memory copy commands with one instruction".

stucuk wrote:
No Honestly Arrays are slower and it Honestly makes a difference. When doing a single operation it may not be noticeable but if your doing a 100x100 image setting each value one at a time using an array its alot slower than using pointers where you increase them each operation.

There is a reason that people who write code in delphi for things like Images always use pointers. The TBitmap class for example uses Scanlines which are pointers. They are not arrays. You will not find alot of people using Arrays to store data, instead they use raw pointers as they are faster.

Lets say that doing Bla[5] := 6; costs 3 operations and Bla^ := 6; Inc(Cardinal(Bla),4); costs 2 operations. With a 100x100 image you have 100,000 pixels which means pointers would save you 100,000 operations. Little overheads soon add up.


It doesn't work like that, Stu. Hard disk is much slower than RAM, which is much slower than Cache which is slower than registers/CPU alu. The operation that you are arguing to be slow to determine the location of the memory address in an array can be done on register level in a proper implementation or by a proper compiler. When you do inc(Cardinal(Bla),4), Bla is in RAM level (maybe on cache). But a typical for/while clause would do the same thing if you work with arrays.

Back to top
View user's profile Send private message Visit poster's website Skype Account
tomsons26lv
Cyborg Artillery


Joined: 30 Dec 2009
Location: Latvia

PostPosted: Thu Feb 15, 2018 5:31 pm    Post subject: Reply with quote  Mark this post and the followings unread

Banshee wrote:
Sorry to be boring, but your code is still horribly organized and horribly indented as usual. It will not motivate contributions from other programmers.


Indentation isn't what will not motivate other programmers, since neither of you get the big picture let me spell some of it out for you.

Delphi
is
not
free.

Only
two
people
(you
two)
in
the
entire
C&C
community
understand
and
know
how
to
work
with
this
langauge.

Apparently
half
of
SHP
Builder
codebase
is
ASM
ripped
from
the
game
and
other
half
of
it
is
from
XCC
which
is
worse.

These are tools for the community, not scientific experiments that no one outside the lab.
Sometimes there comes a point where burning it down and starting anew is the only solution, no matter how you organize the source code it will still be fundamentally the same old mess.
If you keep proceeding like its been for now i guarantee you a similar argument will start next year and the year after that.

Starting anew is especially relevant since it does seem M$ is proceeding with axing x86 support with next version of Windows replacing it with a remote Azure virtualization(which i'm sure knowing M$ will be useless for anything than calc.exe), making any changes you could do this year irrelevant next year cause the app won't even run.

Instead of bickering about apparent lack of access to basic memory functions in Delphi you two should work out together how to rebuild the toolsets in something like C#, unlike Delphi, there are people in the community that work with C# and im sure would gladly help figuring how to implament things.

Furthermore when it comes to LCW instead of a gigantic assembly mess you two don't even understand, Nyerguds already ported our(RAPP team) LCW C++ reimplamentation to C#, both compression and decompression, i managed to get TS RLE re'd from TS itself working, test case was plugging it back into TS itself, i gave the code to Nyerguds too, well try to sort out how to do a C# implamentation of it at some point if you can't figure the C++ code i can post out.

And before you start attacking me with Delphi Master Race walls of text at least try at least a proof of concept in C# of something, actually evaluate can this work and how would this work.


And for the love of God, Satan, every deity in existence, Cthulhu, use Git with Github or GitLab, no one knows what a SVN is anymore let alone tools for it exist that don't make you pluck out your hair.

_________________
Tiberian Dawn, Red Alert, Tiberian Sun ,Red Alert 2,Renegade, Command & Conquer 3,Tiberium and Tiberium Wars and Westwood related image & video archive
https://picasaweb.google.com/113361105083292812413?noredirect=1

Skype live:tomsons26
Don't forget to state who are you otherwise i'll ignore the invite

Back to top
View user's profile Send private message Visit poster's website
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Thu Feb 15, 2018 5:46 pm    Post subject: Reply with quote  Mark this post and the followings unread

I'm actually trying to run away from Delphi to Lazarus (Free Pascal). And Lazarus is free. Pascal itself is an english friendly language. It is easy to learn and to understand. And it allows you to reuse code written on other languages as well.

Back to top
View user's profile Send private message Visit poster's website Skype Account
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 15, 2018 6:06 pm    Post subject: Reply with quote  Mark this post and the followings unread

Banshee wrote:
And finally, it is worth mentioning that, as everything, it can be misused. You need to know good ways to organize your files. VXLSE III is not also a sample of a proper work on this point of view, since it is still a mix of my organization with yours. I did not finish to organize it.


The code i contributed is VERY old and is not a representation of my code today. VXLSE is a horrid mess.

Banshee wrote:
Try learning from scratch how a SHP TD file is loaded, step by step.... every step. And this is just one of the inumerous sample. It is not hard to figure out where to start by looking at your code, but learning and understanding the whole process is awful.


How is it hard? LoadTDRASHPFromStream is where 99% of the code is. Seriously all you had to do was look through the TSHP decleration. Even if you look at the LoadFromStream it has:

Code:
 case FSHPFileType of
  sftNone : Exit;
  sftTD   : LoadTDRASHPFromStream(Stream);
  sftTS   : LoadTSSHPFromStream(Stream);
 end;


How is that hard? Unless your blind anyone can easily find it out.

Rule 1 when your wanting to work out to to load something is to look at the LOADFROMSTREAM or LOADFROMFILE, as hard as it is to believe they are the start of loading a file. Then you just follow the code. Which again isn't hard.

Banshee wrote:
Even if you are working on a group of one person (yea, yourself),  you should always consider the possibility of growth of this development group. Of course that, in this case, you'll be the one setting the standards, which was clearly exactly what I meant in my first post with the suggestions above.

But you need to have standards and follow these standards. Regarding your standards for this new SHP program, I disagreed with the indentation spaces and several other things and exposed my reasons in that first post and the following ones. I think it could be more legible.


You don't seem to understand the fact that not everyone uses your exacting standards. Different programmers and different teams use different code standards. You can not code to everyones exacting standards. I can read code EASILY which is in different indentations. The whole argument about indentations is one of the biggest bits of BS there is. It makes no difference to how readable the code is. If you have to have a certain level of indentation you can as i have already stated use an application to "fix" the indentation to your exacting standards.

Your problem is that you think the world should use your exacting standards because you do. The word doesn't.


Banshee wrote:
Congratulations... this is very close to what I was trying to tell you by not using TSHP as your document. I just did not mentioned to have your own file format for your own document, but that is a good thing to do as well. Why didn't you do that with your new SHP editor?


What SHP editor. SHP Toolz never had any editing tools. Also when i decided to try and add layers (Which i never actually completed) i was working on a format for the Editor. As it would then be an editor. Before that point there was no reason to as the whole concept of the project was to create a SHP class which can load and save SHP files faster and better (As in better coding like using TStream) not writing an editor.

I also fail to understand why it matters. The code i was sharing was for a SELF CONTAINED SHP UNIT not an editor.

FYI: GM Factory was made after i worked on SHP Toolz. I made a layer based editor. If i shared the GM_File.pas which loads/saves the GM* files you would have said the same BS about not having the TGM_File as the document rubbish. Even though again its a SELF CONTAINED unit.

The reason why SELF CONTAINED units are best is because you can easily use them in ANY project as they are not designed for anything specific. You can easily then incorporate them into anything.

Banshee wrote:
And guess what? This is pretty much what I was trying to avoid in first place when I said "using a single command or proper memory copy commands with one instruction".

You can't avoid it. You do realise that every high level language code is converted into multiple lines of ASM code? There is no such thing as a single instruction when it comes to a CPU, you have to do multiple instructions to do a simple sum.

The CopyMemory is a windows function. It internally will do multiple commands. Everything is like that. The idea isn't to have one single thing but to do it as fast as possible.

Banshee wrote:
It doesn't work like that, Stu. Hard disk is much slower than RAM, which is much slower than Cache which is slower than registers/CPU alu. The operation that you are arguing to be slow to determine the location of the memory address in an array can be done on register level in a proper implementation or by a proper compiler. When you do inc(Cardinal(Bla),4), Bla is in RAM level (maybe on cache). But a typical for/while clause would do the same thing if you work with arrays.


Then why does every other programmer state that arrays are slower?

http://wiki.freepascal.org/Fast_direct_pixel_access#Basic_line_algorithm

Look at the 2 methods. and the line "With use of pointers we can eliminate much of pixel address addition and multiplication by Pixels property access. Only fast increment operation is performed."

Delphi's Inc() is faster than working out the address location each time. Its a simple fact. You can ignore the facts and reasons why every other programmer uses pointers if you want, but it doesn't change the fact.

tomsons26lv wrote:
<Text>

SHP Builder doesn't rip anything from the game. SHP Builder was based on me looking at XCC documents on the file format and working out how to do it in Delphi (I can't garentee i didn't look at XCC code but i would never blatantly copy and paste code). There is no ASM code in SHP Builder (Unless Banshee added some but afaik he doesn't know ASM).

FreePascal Exists. Lazarus uses FreePascal which can compile to multiple platforms. Modern Delphi can also do x64. If Windows stops running x86 then no one will upgrade. Most apps are still x86 not x64.

The C#/Delphi argument has nothing to do with anything. I posted code that people could reference as to how to load stuff. The language the code is in has nothing to do with anything. Banshee is the only one going on about people contributing to my SHP.pas file which is actually completed (In my eyes anyway).

The Argument is mainly about readability and coding practices not language. Language means nothing in this context.

P.S What language a person uses is meaningless. Granted if there are more people using C++/C# then its a good idea to start a project with that language.

Though i haven't seen any real Open Source apps which have reached the OS Tools level of feature set. Alot of people go on about making tools to replace them but they always abandon the project or they make their tool closed source (And then abandon it). The argument of C++/C# is irrelevent when there isn't really an Open Source CNC community which uses it. The whole "If you convert to C++/C# then we will all rush and help you" is just rubbish. People won't magically come, if they wanted to they can easily get Lazarus and contribute to the OS Tools. Its not hard to learn the Pascal Syntax (Its not hard to learn any programming language tbh).

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
tomsons26lv
Cyborg Artillery


Joined: 30 Dec 2009
Location: Latvia

PostPosted: Thu Feb 15, 2018 6:27 pm    Post subject: Reply with quote  Mark this post and the followings unread

whats in http://svn.ppmsite.com/filedetails.php?repname=OS+SHP+Builder&path=%2FOS+SHP+Builder+3.3x%2FSHP_RA_Code.pas tho? #Tongue
and what does the comment in http://svn.ppmsite.com/filedetails.php?repname=OS+SHP+Builder&path=%2FOS+SHP+Builder+3.3x%2FShp_File.pas say? #Tongue

Banshee wrote:
I'm actually trying to run away from Delphi to Lazarus (Free Pascal). And Lazarus is free.

Converting to Lazarus at least is one big burden of needing to buy a IDE out of the way, would actually be a big step towards attracting more interest, its at least a step in some direction.
Have you looked at how viable it is? From what i just googled it has a automated converter that more or less does the dirty work leaving dependency resolving and slight cleanup.

_________________
Tiberian Dawn, Red Alert, Tiberian Sun ,Red Alert 2,Renegade, Command & Conquer 3,Tiberium and Tiberium Wars and Westwood related image & video archive
https://picasaweb.google.com/113361105083292812413?noredirect=1

Skype live:tomsons26
Don't forget to state who are you otherwise i'll ignore the invite

Back to top
View user's profile Send private message Visit poster's website
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 15, 2018 7:48 pm    Post subject: Reply with quote  Mark this post and the followings unread


Code:
 // Based on the purpose of the function above, this is the
 // Delphi version for OS SHP Builder written by Banshee
 // Special thanks for Olaf Van Der Spek for explaining the
 // purpose of his function above, but I'm not fully following
 // his logic.

 // Olaf van der Spek says:
 // The input is s <= r < s_end, output is p and cb_p
 // It searches for the longest string that starts < r that
 // matches the string that starts at r (and ends before s_end)


The important part is the name "Banshee". RA/TD implementation was nothing to do with me. As i said before i never used any ASM.



It doesn't say "We copy and pasted everything from XCC". As i said, when i originally wrote SHP Builder v1.0 i used the Documentation on XCC and i may have used XCC as a reference for how to load the file format. That is not the same as copying and pasting code.

One thing you have to remember is that there is only one way to load the data. You can't generate the same image without using the same algorithm and the same data.

tomsons26lv wrote:
Converting to Lazarus at least is one big burden of needing to buy a IDE out of the way, would actually be a big step towards attracting more interest, its at least a step in some direction.
Have you looked at how viable it is? From what i just googled it has a automated converter that more or less does the dirty work leaving dependency resolving and slight cleanup.


It has an automatic converter for the Forms/Etc but with a project like SHP Builder it would likely be best to start from scratch using SELF CONTAINED units like the SHP.pas i wrote. SHP Builder is too bloated and full of bad design.

In a very short period of time i created the SHP Toolz which just basically loaded/saved SHP files (See this thread).

Wed Aug 17, 2016:

Mon Aug 22, 2016 (5 days later):


It had no editing ability, but it did have the basics for building upon. If you start from scratch with a decent design then you can implement things alot faster than converting SHP Builders badly designed code. It was the reason i was able to get it to that point quickly, because from the start it was designed decently.



GM Factory (Pictured above) was made months after for OW. I used what i learned with SHP Toolz and made an editor which had Layers. Designed around its GMF file format. It has editing abilities but only basic (As no one is actually using it for proper editing, most use it to import pngs/etc). The point i am making is that you can rapidly make a Basic editing tool in a short period of time if you design it correctly from the start.

The main issue with Lazarus is that you have to re-compile Lazarus with the components you need. So unlike delphi where you can easily add a component (Like a new button) to Delphi with Lazarus you literally have to recompile the IDE to have it in the IDE.

P.S One of the bad design decisions was to change SHP Builder from editing a single SHP to having the Multiple Window form thing to edit more than one(Which i pointed out at the time). That made SHP Builder FAR more bloated and complicated than it needed to be. ** Looks at Banshee **

----------------------

If people were willing to contribute i would be willing to contribute to a new project in Lazarus, but i wouldn't be up for doing it all by myself with the "hope" that others would actually bother to contribute in the end.

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Wed Feb 21, 2018 11:35 pm    Post subject: Reply with quote  Mark this post and the followings unread

stucuk wrote:
How is it hard? LoadTDRASHPFromStream is where 99% of the code is. Seriously all you had to do was look through the TSHP decleration. Even if you look at the LoadFromStream it has:


Errrr... I am taking it to account the decode functions and absolutely every function that it calls in this process. As I said, it is easy to find out where it starts. But the difficulty lies on understanding the whole process.

stucuk wrote:
You don't seem to understand the fact that not everyone uses your exacting standards. Different programmers and different teams use different code standards. You can not code to everyones exacting standards. I can read code EASILY which is in different indentations. The whole argument about indentations is one of the biggest bits of BS there is. It makes no difference to how readable the code is. If you have to have a certain level of indentation you can as i have already stated use an application to "fix" the indentation to your exacting standards.

Your problem is that you think the world should use your exacting standards because you do. The word doesn't.


It starts to become boring to argue with a person that misunderstands everything that I say. Ok, I am not a native english speaker, but my english is not that bad, buddy.

I did not mean that everyone must use my coding standards and I do not expect that to happen. I was just criticizing your coding standards and posting some suggestions on how to make it more legible.



stucuk wrote:
What SHP editor. SHP Toolz never had any editing tools.


I was misinformed. I have forgot about the real purpose of SHP Toolz. I just looked at your SHP.pas code and since you can load and save SHP files with it, my first expectation is to see it used in an editor (since it saves). But it doesn't mean that it must be used in an editor, as you are simply reusing that portion of code.



stucuk wrote:
The reason why SELF CONTAINED units are best is because you can easily use them in ANY project as they are not designed for anything specific. You can easily then incorporate them into anything.


If you organize your project into smaller libraries, you can also use it on any project. And you can have a much more organized code. So, no, your argument is not valid here.




SHP_RA_Code.pas was a conversion of XCC Utilities code by me. The asm code is a copy and paste from Olaf. I do have programmed few things a very long time in asm, but it is not a language that I dominate and I don't have any pleasure to deal with it. Also, I don't think Stucuk has ever touched it SHP_RA_Code.pas.

Regarding the rest of the Stucuk's reply for you, I agree with most of the things he says. Programming language is usually irrelevant, as long as there are tools available to code it and compile it properly and that it is compatible with the operational systems used by the users. I disagree with him when he says about having not seen a real Open Source app which has reached the OS Tools level of feature set.... honestly, XCC Utilities has... and it is probably not the only one. But it is indeed rare to find C&C related tools with that level of feature set. Most people start a tool and give up after some time. So, it relies much more on the dedication of the development team of the tool, the quality and legibility of the code, rather than on the programming language itself.


tomsons26lv wrote:
Converting to Lazarus at least is one big burden of needing to buy a IDE out of the way, would actually be a big step towards attracting more interest, its at least a step in some direction.
Have you looked at how viable it is? From what i just googled it has a automated converter that more or less does the dirty work leaving dependency resolving and slight cleanup.


stucuk wrote:
The main issue with Lazarus is that you have to re-compile Lazarus with the components you need. So unlike delphi where you can easily add a component (Like a new button) to Delphi with Lazarus you literally have to recompile the IDE to have it in the IDE.


Depending on the code of your program, I am not sure if what stucuk says is true. I have converted portions of non-interface related code so far, and I didn't have much problems with it... except for the TPNGImage Library that OS SHP Builder uses, I could use everything else with minor changes. But Lazarus has a PNG support by default, which, unfortunately, is worse than the TPNGImage.

Lazarus has matured a lot from version 1.0 to the current 1.8. However, I did not test its conversion tools with the recent version. The previous versions had problems to convert certain dialogs and spin edits, however Lazarus currently support these objects by default. Anyway, I'm currently using it for my doctorate thesis and I am enjoying it a lot.

Back to top
View user's profile Send private message Visit poster's website Skype Account
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 22, 2018 5:17 pm    Post subject: Reply with quote  Mark this post and the followings unread

Banshee wrote:
Errrr... I am taking it to account the decode functions and absolutely every function that it calls in this process. As I said, it is easy to find out where it starts. But the difficulty lies on understanding the whole process.


Doesn't sound like you looked at the SHP.pas and tried before you commented.

LoadTDRASHPFromStream is easy to read. Its the main chunk of code to read them. TDRA1Decode and FindOffset are located directly above the LoadTDRASHPFromStream which makes them easy to find (You can also ctrl + click the code to jump to where it is or do what everyone else does and use the search feature)

The bottom line is that its broken up into a few functions which are easy to find and follow.

banshee wrote:
It starts to become boring to argue with a person that misunderstands everything that I say. Ok, I am not a native english speaker, but my english is not that bad, buddy.

I did not mean that everyone must use my coding standards and I do not expect that to happen. I was just criticizing your coding standards and posting some suggestions on how to make it more legible.


You literally state that unless my code has different spacing, more comments (Which arn't needed when the code is obvious. I mean having a comment like "This bit of code reads the colour" and then having something like Stream.Read(Colour,4) is a bit stupid as it literally has the words "Read" and "Colour" in the code.), etc that no one will be able to understand it or contribute to it. That is saying that your standards are the baseline that everyone has to have.

My code is perfectly legible. I just use 1 space indentations and only put in comments where its needed (Where the code is confusing or where it may not be obvious why something was done).


banshee wrote:
If you organize your project into smaller libraries, you can also use it on any project. And you can have a much more organized code. So, no, your argument is not valid here.

My argument is fine. Self contained means one single file to distribute, 1 single file to include. You don't need to include lots of files into a project to make it work, and since its all self contained you only deal with 1 single class. Libraries only make sense when you have a large amount of stuff. Having a library for a small thing such as SHP's doesn't make any sense.


banshee wrote:
I disagree with him when he says about having not seen a real Open Source app which has reached the OS Tools level of feature set.... honestly, XCC Utilities has... and it is probably not the only one. But it is indeed rare to find C&C related tools with that level of feature set. Most people start a tool and give up after some time. So, it relies much more on the dedication of the development team of the tool, the quality and legibility of the code, rather than on the programming language itself.

XCC doesn't edit SHP's or VXL's. Its very useful (XCC Mixer) for converting files/etc. But its not an actual editor for the file types. Its a low level tool. So no not even XCC would count as a C++ project which has all the bells and whistles as SHP Builder or VXLSE III. Given we have been talking about SHP's i was mainly on about a comparison between SHP Builder and any other SHP Editor project done in C++/C# .


banshee wrote:
Depending on the code of your program, I am not sure if what stucuk says is true. I have converted portions of non-interface related code so far, and I didn't have much problems with it... except for the TPNGImage Library that OS SHP Builder uses, I could use everything else with minor changes. But Lazarus has a PNG support by default, which, unfortunately, is worse than the TPNGImage.


I stated that components you want in the IDE (As in placed on a form) have to be compiled into Lazarus. Why would i lie? Its literally what you have to do. Buttons/etc added at runtime are different, but to have it on a form you have to have the component compiled into Lazarus its self.

http://wiki.freepascal.org/Install_Packages

Its literally on their wiki. The way Lazarus is designed is that components used in "Design Time" have to be compiled into Lazarus. So if you use any custom components they have to be compiled into the IDE which is an additional step for everyone who wants to contribute as they both have to have the custom components and go through the process of compiling it into the IDE.

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
Banshee
Supreme Banshee


Also Known As: banshee_revora (Steam)
Joined: 15 Aug 2002
Location: Brazil

PostPosted: Thu Feb 22, 2018 8:29 pm    Post subject: Reply with quote  Mark this post and the followings unread

Sorry, but arguing with you is a complete waste of time as you do not pay proper attention to what I say or distort it absurdly. I am done here.

Back to top
View user's profile Send private message Visit poster's website Skype Account
stucuk
Geek


Joined: 27 Aug 2002

PostPosted: Thu Feb 22, 2018 9:23 pm    Post subject: Reply with quote  Mark this post and the followings unread

This all started when you stated my code is crap and my methods are crap after i shared some code which may have helped someone (I was trying to be nice and i just get "Your code sucks no one will ever use it" as a thanks). Most of the stuff you mention in your list is just your personal preferences or just plan wrong (Like people not being able to find TD loading code.... seriously).

Banshee wrote:
Sorry to be boring, but your code is still horribly organized and horribly indented as usual. It will not motivate contributions from other programmers.


How the hell am i distorting anything.

P.S I never wanted any argument i just wanted to try and help people out.

_________________
Free Map Editor - Game Requirements - Stucuk.Net

Back to top
View user's profile Send private message Visit poster's website
tomsons26lv
Cyborg Artillery


Joined: 30 Dec 2009
Location: Latvia

PostPosted: Thu Apr 19, 2018 6:45 pm    Post subject: Reply with quote  Mark this post and the followings unread

Time for a bump on the format subject as i mapped out ShapeSets writing function last night.
RGB
{
unsigned char Red;
unsigned char Green;
unsigned char Blue;
}

struct ShapeHeaderStruct
{
 short Unknown0; // confirmed to be a WORD, so far only thing i found is ShapeSet writes 0 to it
 short Width;
 short Height;
 short FrameCount;
};

struct ShapeFrameHeader
{
 short OffsetX;
 short OffsetY;
 short CX;
 short CY;
 short Flags; //confirmed WORD, has two flags Bit 1 is enabled on some transparency condition, Bit 2 is enabled if its RLE compressed
 char padding[2];  // padding made by default MSVC alignment of 0x4
 RGB RadarColor; // The game loads the color from the SHP, then reads it from ini if available and overwrites this value All colors except the transparent color averaged together
 char arrayof5[5];  //ShapeSet writes a array of 5 setting it to 0, possible space for future data if format extended.
 unsigned int FileOffset;
};

_________________
Tiberian Dawn, Red Alert, Tiberian Sun ,Red Alert 2,Renegade, Command & Conquer 3,Tiberium and Tiberium Wars and Westwood related image & video archive
https://picasaweb.google.com/113361105083292812413?noredirect=1

Skype live:tomsons26
Don't forget to state who are you otherwise i'll ignore the invite

Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic Page 1 of 1 [20 Posts] Mark the topic unread ::  View previous topic :: View next topic
 
Share on TwitterShare on FacebookShare on Google+Share on DiggShare on RedditShare on PInterestShare on Del.icio.usShare on Stumble Upon
Quick Reply
Username:


If you are visually impaired or cannot otherwise answer the challenges below please contact the Administrator for help.


Write only two of the following words separated by a sharp: Brotherhood, unity, peace! 

 
You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © phpBB Group

[ Time: 0.2083s ][ Queries: 11 (0.0110s) ][ Debug on ]