Fractal Softworks Forum

Please login or register.

Login with username, password and session length
Advanced search  

News:

Starsector 0.97a is out! (02/02/24); New blog post: Anubis-class Cruiser (12/20/24)

Pages: [1] 2 3 ... 5

Author Topic: [0.97a] Ship Editor v0.7.6  (Read 26601 times)

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
[0.97a] Ship Editor v0.7.6
« on: October 29, 2023, 11:15:16 AM »


By Ontheheavens & Xenoargh


Requires Java Runtime 21.
For Windows, Linux and Mac.

This is just another Ship Editor. Feedback and bug reports welcome.

Important: consider leaving a star for the repo if you appreciate this project.

Content preview
[close]

Implemented functionality:
  • Hull data loading/creating/editing/saving.
  • Variant data loading/creating/editing/saving.

Not currently implemented:
  • Skin creating/editing/saving.
  • Weapon creating/editing/saving.

Notable features:
  • Layers system: edit many ships at once or keep your references right next to the selected ship.
  • Game data widgets: load all ships, weapons, hullmods and more, then browse and quickly fetch needed entries or open their files.
  • GUI logging: instantly see whether something went wrong with your workflow.
  • Built-in help library system: write your own help articles and share them in the forum thread for others to use in their editor.
  • Robust visibility options: manipulate opacity and visibility of specific data of ship entries with fine-grained painter options.
  • Quality of life functions: load images as new layers via dragging to editor, print viewer screenstate to image file, control mirroring precision and point snap options.

Installation notes
  • Ship Editor requires Java Runtime 21 to be present. Folder with said runtime should be named "jre", and should be located in the root directory of the application. Naming mismatch will cause startup to fail.
  • On the Github releases page you can download either Light (without Java Runtime, about 10MB) or Full (ready to be launched, about 200MB) version.
  • Download button on the forum thread page is set to Light version.
  • In case you downloaded release without a bundled Java Runtime, it is available at https://jdk.java.net/21/.
[close]
Installation for Linux & Mac

Instructions contributed by Nathan67003:
  • download the correct jdk/jre (the one supplied in the Full 0.7 release is full of .dlls... which cued me in that I wasn't even using the right one lol); this time I'm not installing the JDK so the tarball is what's appropriate
  • Unball the tar.gz
  • Go into the newly-unpacked folder, then into Contents, then into Home and move everything that lives in there into the jre folder of the Ship Editor (so in my case, jdk-21.0.1.sdk --> Contents --> Home --> move everything from here to Ship\ Editor/jre/)
  • Open Terminal, navigate to where the Ship Editor lives (cd <path>) (<path> can be obtained by click-dragging a folder onto the terminal window as well iirc, but not quite certain)
  • Use the following magical command: jre/bin/java -jar ship_editor.jar
  • When prompted to specify the install folder, specify Starsector.app as the install folder
  • It. Just.WORKS.
[close]
Usage notes
 UI considerations
Thoughout the editor, there are interactions that might at first not be apparent. Context menus and tooltips were used liberally; try hovering and right-clicking on various elements to see whether there are any additional possibilities. If a certain text label changes background on hover, it is bound to have a context menu. Entries in list and tree structures also usually have context menus.

Leftside (game data area) and rightside (editor instruments area) both have draggable borders through which they can be resized; note that dragging is active only when areas are maximized. Click on any tab in the area will maximize/minimize it.
[close]

Layer system basics
Before jumping in the workflow, it will be beneficial to get a rough idea of how the data is structured in the editor.

Main editing unit in this project is a layer. Layer consists of graphical (sprite) and functional (points and features) information, contained together as many sub-entities in one big layer entity.

For example, ship layer starts with a sprite file. Without sprite file already present, no hull or skin files can be loaded onto layer. The sprite file serves as a visual base for functional data from hull file - namely, bounds, weapon and engine slots, etc.

Next slice is a skin file, which acts as a data mutator for hull file and also can override sprite itself.

Final slice of data for ship layer is variant. It behaves a bit differently from sprite and hull files - variant selection is loaded continually from game data panel each time layer is selected. In other words, provided you did load respective game data to the leftside data panels, all existing variants for hull ID will be automatically available for any layer with matching hull ID.

This effectively means that "Remove" button in the "Variant: Data" tab will altogether remove only variants that were created in the current session; variants loaded from files will be only reset to their state at load.

At this point a curious reader might inquire: why such a seemingly overcomplicated system of integrated data was chosen? Long story short, this achieves immediate visual cohesion: in one layer, you can see and access all of the needed data of ship without having to jump between different modes (you might jump between editing tabs, but there are options for visual data to stay visible) just to see where exactly this or that point actually was. Such a design also attempts to mimic the data handling process of the game itself.
[close]

Game data panel
Start your workflow by right-clicking "Game data" panel and selecting "Reload game data". This should launch a walker that will inspect game's core folder and each mod folder, then fetch all data of interest to the game panel itself. Alternatively, you can fetch individual data types by selecting data tab and pressing "Reload data" button located on the top panel.

Data of interest includes ships, weapons, hullmods, wings, shipsystems, hull styles and engine styles. Of those ship data entries are of note - they are comprised of hull file, skin and variant files and CSV row data. You can switch any ship entry between base hull and skin, if those exist for a ship.

For majority of entries, there's info about their files displayed on the right panel. For example, hover on "Hull file" label to see the full path to it; right-click and select "Open source file" to immediately open this hull file. There are also options to open folder that contains the file, and option to open the parent package of file.

Ship and weapon entries also can be immediately loaded from game data panel to main viewer: right-click entry in the tree panel and select "Load entry to layer". This should automatically initialize sprite, hull file, and all existing skin files (which you can later select from "Skin: Data" editor tab) to the new layer.

There is an even faster option for ship entries - simply double-clicking on entry will launch the same layer loading process outlined above.

Info about the files that are currently loaded to layer can be found in the tooltip to layer tab; this is sprite, hull and skin files for ship layer, and sprite and spec files for weapon layers. Note that weapon sprite files usually have 2 versions, hardpoint and turret.
[close]

Viewer area basics
When handling layers in main viewer, you can pan the viewport by mousewheel-click and drag; alternatively, mousewheel zooms to the position of your cursor, which can also be used for viewer traversal.

You can hold Control and mousewheel in order to rotate the viewer; alternatively, Shift and mouse move will rotate the selected layer. Note that these rotations are purely visual, unlike weapon and engine angle rotations.

You also can hold Shift and drag to move the selected layer around; note that points of the layer might change their displayed position in that case, which brings us to coordinate systems.

Viewer area has 4 different coordinate systems to choose from, selectable in context menu of bottom panel's mouse position widget.

 - World coordinates have their 0,0 at coordinate axes guides (those are toggled in view menu). These coordinates are absolute and shared between all layers, they do not have any binding on point positions in result data that is saved to files.

 - Sprite center coordinates have their 0,0, exactly at the middle of selected layer sprite. This is determined by sprite dimensions and is independent for each layer.

 - Ship center anchor coordinates have their 0,0 at the bottom left corner of selected layer sprite. This is primarily used to work with a position of ship center point (said center is saved with these coordinates to result file), and is not much useful beyond that.

 - Ship center coordinates have their 0,0 at the designated ship center point. This is the default, and primary coordinate system you will be working with when editing bounds, weapon slots, engines and other data points of the ship. These coordinates are independent for each layer and are the ones that are saved to result file.

Relevant to this info is the fact that serialized ship coordinates appear in the files as they are rotated 90 degrees rightwise. Preceding editors took this for granted, but, in order to achieve visual consisency with the game itself, this editor rotates the hull data coordinates back to where it should be when the layer loads.
[close]

Ship editing workflow
Whether you loaded existing ship entry from the game data or simply created new hull data (such an option is located in "Layers" section of menubar) on a sprite you opened, you'll notice that various widgets in editing tabs are now enabled.

Usually, hull creation starts with ship center point and collision radius - this is important, because designated ship center point also serves as mirroring axis anchor for other points such as bounds and slots.

For example, if your center sits right on the left boundary of the sprite, mirroring mode will put counterparts to the created points well outside of sprite itself.

Center and shield points are moved via simple mouse drag, while their radius is adjusted with hotkey press and mouse move.

After the center, collision and shield are configured, pay attention to bounds editing. This has 2 creation options: insert and append. Insertion places bounds between two closest points, while appending connects created points to the last ones in the bound list.

It is important to remember that bound points are linked via an ordered list; the last bound is linked to the first one. Relatedly, you can directly manipulate bounds order by dragging entries in the list, if the reorder checkbox is selected.

For creating brand new bounds polygon, prefer append with mirroring turned on - insert will not work if there are no bounds to insert between. Should any unfortunate inconsistency with bound linkage arise, turn mirroring mode off and adjust points, then wiggle them up with maximum point linkage value to achieve perfect mirroring again.

If working with points that are closer than 5 pixels to center mirroring axis, setting automatic linkage distance to 0 might prevent unintended snapping.

To be continued...
[close]
[close]

Editor tools overview
  • Redbull's Ship/Variant Editor (2011):

    • Written in Javascript, hosted online.
    • Notable features included a database of ship and weapon entries.

  • Trylobot's Starfarer Ship & Weapon Editor (2011):

    • Written in Blitzmax, downloadable to desktop.
    • Improvements over Redbull's editor included proper zooming/point adjusting and a broader set of editing functions.

  • Billi999's Starfarer Hull Editor (2012):

    • Written in C# with a proper Windows-style GUI editing suite.
    • Scrapped by the author after a couple of months due to a lack of programming skill and the will to compete with Trylobot's editor.

  • Deathfly's Fork of Trylobot's Ship & Weapon Editor (2016):

    • A continuation of the Blitzmax codebase of the original Trylobot work.
    • Notable workflow improvement with better zoom, weapon slots, render order tweaks, and other fixes.

  • Cataphract22's Starsector Forge (2017):

    • Written with GameMaker Studio 2, downloadable to desktop.
    • Was supposed to have the widest range of editing functions, including star system and mission editing.
    • Improvements included a working implementation of skin editing.
    • The author vanished without an update after a couple of months.

  • Present Work: Ontheheavens' Ship Editor (2023):

    • Written in Java 19 (with update to 21), downloadable to desktop.
    • Assessment of the current state of the project and its virtues and faults is left to the reader of these words.

[close]
Credits
Ontheheavens: programming.
Xenoargh: design and testing.
Banano of Doom: game-mechanics clarifications.
Jaghaimo: systems design and UI ideas.
Nathan67003: Shell files contributions.
[close]
Changelog

v0.7.6
  • Options for quick module-to-layer loading: both selective from module list right-click option and bulk loading through button widget.
  • Fast layer selection, handy when working with dozens of layers: hold ALT and move mouse to select closest layer to mouse point (compared by layer sprite center point).
  • Performance tweaks.

v0.7.5
  • Weapon animations system.
  • File chooser folder caching tweaks.
  • Rendering optimizations.
  • Executables for MacOS and Linux (PR from Nathan67003).

v0.7.4
  • Drag-and-drop for all major entries: ships, variants, modules, weapons, hullmods, wings.
  • Option to flip ship points coordinates and angles.
  • Internal refactor of editor instrument panels.
  • More parsing fixes.
  • Mismatched weapon sprite coordinates fix.
  • Event bus optimization.
  • Visual polish of numerous components.
  • Support for serialization of built-in modules.
  • Dedicated weapon groups rearranging widget.
  • Many more small tweaks, fixes and polish.

v0.7.3
  • Themes system and dark mode.
  • Layer loading via ship entry drag-and-drop.
  • Automatic skin and variant selection when dragging variant to viewer.
  • Module install via drag-and-drop.
  • Better widgets for status panel and some editor tabs.
  • Now can remove weapon groups.
  • Auto-select of respective data tab when changing editor tabs.
  • Window dimensions persist between sessions.
  • Data walker should support symlinks now.
  • Smooth zooming.
  • Big internal refactors.
  • Many more small tweaks and bugfixes.

v0.7.2
  • Angle snapping fixes.
  • File loading error pop-up can now be disabled.
  • Improved invalid JSON correction: now should handle almost all quirks.
  • Added sprite file name field in addition to sprite path.
  • Game package system: can now pin and disable packages, persists between sessions.
  • Checkerboard background image, Photoshop-style.

v0.7.1
  • Now can print ship layers with a transparent background, available from right-click layer tab menu.
  • Rolling file logging, GUI logger now auto-scrolls to bottom.
  • Fixed some deserialization errors with skins, variants and projectiles.
[close]
« Last Edit: March 11, 2024, 05:26:11 AM by Ontheheavens »
Logged
   

Kingofchebureki

  • Ensign
  • *
  • Posts: 18
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #1 on: October 29, 2023, 01:10:11 PM »

Is this for making new ships? got way too many SBY blueprints and a need to make ships
Logged

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #2 on: October 30, 2023, 07:08:26 AM »

Is this for making new ships? got way too many SBY blueprints and a need to make ships

Yes. Specifically, you can create finished hull and variant files - I've implemented editing functionality for each field that might be present in these file types.
Logged
   

SirHartley

  • Global Moderator
  • Admiral
  • *****
  • Posts: 915
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #3 on: October 30, 2023, 09:23:05 AM »

Took the chance to move this to ressources - great job on the overhaul!
Logged

nathan67003

  • Commander
  • ***
  • Posts: 223
  • Excellent imagination, mediocre implementation.
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #4 on: October 30, 2023, 10:11:09 AM »

Hmmmm... is this universal? I'm on Mac and tried launching it via the .jar, doesn't work. Full 0.7 version.
Logged
I have some ideas but can't sprite worth a damn and the ideas imply really involved stuff which I've no clue how to even tackle.

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #5 on: October 30, 2023, 10:17:46 AM »

Hmmmm... is this universal? I'm on Mac and tried launching it via the .jar, doesn't work. Full 0.7 version.

My bad not mentioning this - currently this editor is Windows-only. Theoretically, it should be quite possible to support both Linux and Mac, but since I'm on Windows, even figuring out what should be done to ensure compatibility is quite a task itself.
Logged
   

nathan67003

  • Commander
  • ***
  • Posts: 223
  • Excellent imagination, mediocre implementation.
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #6 on: October 30, 2023, 01:00:01 PM »

Well, I have hope someone'll be able to make it work on unix systems - since the entire thing is Java making it start with a .jar should be a fair bit easier than the previously available tool and shouldn't need to be wineBottled or anything
Logged
I have some ideas but can't sprite worth a damn and the ideas imply really involved stuff which I've no clue how to even tackle.

V_KJ

  • Ensign
  • *
  • Posts: 31
  • Coffee tastes great, wdym?
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #7 on: October 30, 2023, 01:39:05 PM »

Gonna watch this thread, hope to see it available on MAC whenever.
Logged
"How do you code in a Macbook?"

glywnok

  • Ensign
  • *
  • Posts: 6
    • View Profile
Re: [0.96a] Ship Editor v0.7
« Reply #8 on: October 31, 2023, 11:38:27 AM »

Very cool!

I was thinking that the old one had some errors, but this one also has some. So first things first, it appears it can't read executor.skin, and also the list(I mean the game data list) which you have shown appears to not appear at all, or is there something you have to do to redo, the game data having all ships?
If you need the config then here
Spoiler
{
    "backgroundColor": [
        128,
        128,
        128,
        255
    ],
    "gameFolderPath": "C:\\Program Files (x86)\\Fractal Softworks\\Starsector 0.96", #main game folder
    "coreFolderPath": "C:\\Program Files (x86)\\Fractal Softworks\\Starsector 0.96\\starsector-core", #core folder
    "modFolderPath": "C:\\Program Files (x86)\\Fractal Softworks\\Starsector 0.96\\mods", #mods folder
    "loadDataAtStart": true,
    "loadTestFiles": false
}
[close]
Logged

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
Re: [0.96a] Ship Editor v0.7.1
« Reply #9 on: October 31, 2023, 12:40:49 PM »

v0.7.1
  • Now can print ship layers with a transparent background, available from right-click layer tab menu.
  • Rolling file logging, GUI logger now auto-scrolls to bottom.
  • Fixed some deserialization errors with skins, variants and projectiles.

While I've sorted out file path differences between operating systems, it's still unclear to me how to configure the .sh script properly to get the JAR to launch on Mac. Any help is appreciated.

it appears it can't read executor.skin, and also the list(I mean the game data list) which you have shown appears to not appear at all, or is there something you have to do to redo, the game data having all ships?

This should be fixed now.

From now one there should be text log files in a dedicated "log" folder - you can post stack traces from those if the GUI logger window is not convenient.
« Last Edit: October 31, 2023, 12:47:40 PM by Ontheheavens »
Logged
   

glywnok

  • Ensign
  • *
  • Posts: 6
    • View Profile
Re: [0.96a] Ship Editor v0.7.1
« Reply #10 on: November 01, 2023, 03:35:38 AM »

v0.7.1
  • Now can print ship layers with a transparent background, available from right-click layer tab menu.
  • Rolling file logging, GUI logger now auto-scrolls to bottom.
  • Fixed some deserialization errors with skins, variants and projectiles.

Very nice, but I decided to make a ship from scratch, and at first I was very confused. After some time I found about the guide, and here is some feedback:

  • It would have been nice to see the name of the sprite, since not all people will have remembered it, or is it already in Ship editor?(found it, but it displays the entire path, try seperating them, in other words diffirent line for path and name)
  • The collision setup is very strange, try making it a click based, or is there a way to setup collission with a click, not the micromanagment on the table? Found that you can just do it by pressing a button on the keyboard.
  • The bounds are kinda strange, to star doing bounds you have to do Z+LMB while it is located on 2nd line, so for example I tried starting bounds by pressing X+LMB which did not work for me
  • The scrollwheel way of changin variables does not work properly, it changes value once, and no more, it also changes it based on something? Since it did not change it by 1 but by 3 for me
  • The micromanagment is kinda bad, you have to right click and then click on a pop up to change the value, instead of making them click and change
  • Would have been nice if you could drag hullmods, instead of right clicking them, to make them builtin or on variants
  • When trying to save the ship, it saves it with the wrong path, and also it saves them with new_hull stuff, I tried to change em, but was unable to
  • It also appears to unable to read new .ship files, which you save via it

I will post more feedback in the future after I figure out how to work with it more, and try doing more stuff, as of now it's usable partly, but not good.
« Last Edit: November 01, 2023, 04:01:13 AM by glywnok »
Logged

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
Re: [0.96a] Ship Editor v0.7.1
« Reply #11 on: November 01, 2023, 08:50:45 AM »

  • It would have been nice to see the name of the sprite, since not all people will have remembered it, or is it already in Ship editor?(found it, but it displays the entire path, try seperating them, in other words diffirent line for path and name)

There is a list of all files loaded to layer in the layer tab tooltip. Is that what you meant or did you have something else in mind?
Spoiler
[close]

  • The collision setup is very strange, try making it a click based, or is there a way to setup collission with a click, not the micromanagment on the table? Found that you can just do it by pressing a button on the keyboard.

Yes, generally the primary way to do point editing is via mouse and hotkeys. Editor panel label widgets are a supplementary method.

  • The bounds are kinda strange, to star doing bounds you have to do Z+LMB while it is located on 2nd line, so for example I tried starting bounds by pressing X+LMB which did not work for me

Noted and tweaked accordingly in my build: insert will now act as append when there is no bounds, and "Add bound" hint is now first as it is the preferred way to create bounds.

  • The scrollwheel way of changin variables does not work properly, it changes value once, and no more, it also changes it based on something? Since it did not change it by 1 but by 3 for me

I'm not sure which exact spinner you are talking about; for example, spinners in weapon slot tab have a step of 1 and are mousewheeled freely. Could you give me steps to reproduce?

  • The micromanagment is kinda bad, you have to right click and then click on a pop up to change the value, instead of making them click and change

Yes, those label widgets with context menu (in layer, center and shield tabs) are super bad indeed; they are obsolete and should be replaced with mousewheeled spinners when I have the time to do it. Luckily, you do not need these old widgets at all - as noted, the intended way of interacting with points is through mouse and keyboard.

  • Would have been nice if you could drag hullmods, instead of right clicking them, to make them builtin or on variants

Good idea, if a bit tricky to implement. Noted!

  • When trying to save the ship, it saves it with the wrong path, and also it saves them with new_hull stuff, I tried to change em, but was unable to
  • It also appears to unable to read new .ship files, which you save via it

I'm pretty sure your troubles with the "new_hull" part are due to not pressing Enter after typing your text. There's a tooltip on the text field with that info. There was indeed a bug with the hull saving - if hullstyles weren't loaded, saving routine failed with a null pointer. Fixed that.

As for reading saved ships - I'll need steps to reproduce for that as well, since for me it's working.

I will post more feedback in the future after I figure out how to work with it more, and try doing more stuff, as of now it's usable partly, but not good.

Haha, thanks. It's nice to see people appreciating my effort.  ;D

Edit: just updated the main post with some usage notes, that would perhaps be beneficial for getting started with the editor.
« Last Edit: November 01, 2023, 09:03:44 AM by Ontheheavens »
Logged
   

glywnok

  • Ensign
  • *
  • Posts: 6
    • View Profile
Re: [0.96a] Ship Editor v0.7.1
« Reply #12 on: November 01, 2023, 10:34:04 AM »

Quote
       It would have been nice to see the name of the sprite, since not all people will have remembered it, or is it already in Ship editor?(found it, but it displays the entire path, try seperating them, in other words diffirent line for path and name)

There is a list of all files loaded to layer in the layer tab tooltip. Is that what you meant or did you have something else in mind?

I mean this place here


it would have been nice if you made 2 lines here:
1. Sprite folder
2. Sprite name


I'm not sure which exact spinner you are talking about; for example, spinners in weapon slot tab have a step of 1 and are mousewheeled freely. Could you give me steps to reproduce?
For example try to go and edit engines, it did not work for me a few hours ago, it might be just a strange bug. But when I checked the weapon slot, it turns out the slot angle changed from 0 to 21 and then to 354, don't know if it's just me but ok.
Logged

Ontheheavens

  • Commander
  • ***
  • Posts: 141
    • View Profile
Re: [0.96a] Ship Editor v0.7.2
« Reply #13 on: November 04, 2023, 02:26:43 AM »

Updated to v0.7.2
  • Angle snapping fixes.
  • File loading error pop-up can now be disabled.
  • Improved invalid JSON correction: now should handle almost all quirks.
  • Added sprite file name field in addition to sprite path.
  • Game package system: can now pin and disable packages, persists between sessions.
  • Checkerboard background image, Photoshop-style.

There are still some parsing offenders that, unfortunately, I might not be able to fix. Those include CSV table from Diable Avionics (numerous commas in totally wrong places), certain weapon file from Machina Void Shipyards (trailing dot in the offset field), and a deco weapon file from Goathead (boolean value spelt wrong).
However, now you can disable the error popups or just disable individual mod packages you don't want to load (while still having them in your mod folder).

As always, don't hesitate to put those stars on the Github repo.
« Last Edit: November 04, 2023, 02:32:41 AM by Ontheheavens »
Logged
   

glywnok

  • Ensign
  • *
  • Posts: 6
    • View Profile
Re: [0.96a] Ship Editor v0.7.2
« Reply #14 on: November 04, 2023, 02:01:31 PM »

Updated to v0.7.2
  • Angle snapping fixes.
  • File loading error pop-up can now be disabled.
  • Improved invalid JSON correction: now should handle almost all quirks.
  • Added sprite file name field in addition to sprite path.
  • Game package system: can now pin and disable packages, persists between sessions.
  • Checkerboard background image, Photoshop-style.

Nice, also the builtin weapons tab is kinda confusing, you have to choose the weapon, and then ctrl+lmb the empty slot.

Also, there is a strange bug with variant:data, I was teaching a guy how to use it, and it somehow didn't create at first, when we did change to old one, all of the ones he did create appeared as ghost ones, you can't also add hullmods at all to the variant? The Variant: Weapons is confusing and appears it doesn't work with builtins? And what is the deal with Variant: Modules?

I am also listing both .log files, in here
« Last Edit: November 04, 2023, 02:04:02 PM by glywnok »
Logged
Pages: [1] 2 3 ... 5