Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Scoss
Aug 17, 2015
Is it even useful to follow a PBR workflow if your ultimate graphical target is a PS2 game with hand painted texturing anyway?

Adbot
ADBOT LOVES YOU

Omi no Kami
Feb 19, 2014


al-azad posted:

I'd say use SP or Quixel if you're hand scanning your own textures for a AAA quality product or something. For the rest of us poor slobs 15 seconds in Gimp using the high pass filter and tweaking some levels is all that's needed.

https://www.youtube.com/watch?v=ihOwGUR3igI

And there are other videos for properly calibrating specular, metal, AO, and so on.

Rad, thanks!!

And I'd call my graphical target more PS2-inspired. Like, I'm not trying to hit anything close to AAA-quality textures, that's crazy nonsense, but I'm screwing around with everything to find small touches that help, and I've found that even cludgy gimp/materialized PBR stuff looks a heck of a lot snazzier than the flat diff map and doesn't take that much longer to make. Heck, I've even had some pretty fun results generating normal and displacement stuff for handpainted textures.

al-azad
May 28, 2009



Scoss posted:

Is it even useful to follow a PBR workflow if your ultimate graphical target is a PS2 game with hand painted texturing anyway?

I would definitely make an argument for normals and there's some merit to AO especially if you want models that rely on the same details but have different albedo (Japanese games use this approach frequently).

Everything else is definitely overkill at a low fidelity.

Navaash
Aug 15, 2001

FEED ME


megane posted:

Nuclear Throne is amazing; if you haven't played it you absolutely should.

I do really wish it ran at 60FPS, though.

Download Nuclear Throne Together build 9940, install, then on character select press T, paste this, and press enter:

/gml q=60 room_speed=q current_time_scale=30/q

It absolutely owns at 60. There are a couple of things though that as someone who's put a couple hundred hours into the base game though that I've noticed are slightly off:

- explosion patterns are different - explosions that were safe to stand near at 30 change to the point where you WILL have some dumb YASD explosion deaths until you adjust
- weapons are more likely than not to get stuck spinning in place if they contact a wall while being pulled towards an exit portal
- some projectile bounces are slightly different

Nebalebadingdong
Jun 30, 2005

i made a video game.
why not give it a try!?
finishing up the last tileset for my game :toot:




Macichne Leainig
Jul 26, 2012

by VG
Looks really nice and that guy who I’m assuming is the PC is very cute!

Nebalebadingdong
Jun 30, 2005

i made a video game.
why not give it a try!?

Protocol7 posted:

Looks really nice and that guy who I’m assuming is the PC is very cute!

Thanks! Been a long time working on this game and its good to see signs I'm almost done finally

Nebalebadingdong
Jun 30, 2005

i made a video game.
why not give it a try!?
om nom nom nom

A LOVELY LAD
Feb 8, 2006

Hey man, wanna hear a secret?



College Slice

Nebalebadingdong posted:

om nom nom nom



Thats adorable, also chiming in to say the animated tiles look neat!

TooMuchAbstraction
Oct 14, 2012

I spent four years making
Waves of Steel
Hell yes I'm going to turn my avatar into an ad for it.
Fun Shoe
https://twitter.com/byobattleship/status/1246551394191986688

Spent the last 8 hours working on this. Maybe in the future I should pick something that's a little further along in development for my Screenshot Saturday features.

Your Computer
Oct 3, 2008




Grimey Drawer
I apologize that this is another pretty uninteresting update, but the good news is that I've now completely rewritten all of the code and re-implemented everything I had previously and more! Got completely new ground checking code that's far more robust and can theoretically be used to give different properties to different types of terrain, proper handling of slopes, sliding is fully implemented and animated, plus the new architecture makes all of the code so much more tidy and readable, and as a result I've squashed all manner of bugs/quirks that were in the previous code.

https://i.imgur.com/7N4e8eW.mp4

it's not very flashy but it's a tremendous milestone for me. For the first time I feel like I would be comfortable letting other people run around with the character without fear that it will implode in some weird way :toot:

TooMuchAbstraction
Oct 14, 2012

I spent four years making
Waves of Steel
Hell yes I'm going to turn my avatar into an ad for it.
Fun Shoe
That's looking fantastic, nice work!

Spatial
Nov 15, 2007

It looks really fun. :)

kaffo
Jun 20, 2017

If it's broken, it's probably my fault

Your Computer posted:

I apologize that this is another pretty uninteresting update, but the good news is that I've now completely rewritten all of the code and re-implemented everything I had previously and more! Got completely new ground checking code that's far more robust and can theoretically be used to give different properties to different types of terrain, proper handling of slopes, sliding is fully implemented and animated, plus the new architecture makes all of the code so much more tidy and readable, and as a result I've squashed all manner of bugs/quirks that were in the previous code.

https://i.imgur.com/7N4e8eW.mp4

it's not very flashy but it's a tremendous milestone for me. For the first time I feel like I would be comfortable letting other people run around with the character without fear that it will implode in some weird way :toot:
I'm glad you got it sorted in the end, it looks solid!

taqueso
Mar 8, 2004


:911:
:wookie: :thermidor: :wookie:
:dehumanize:

:pirate::hf::tinfoil:

Your Computer posted:

it's not very flashy but it's a tremendous milestone for me. For the first time I feel like I would be comfortable letting other people run around with the character without fear that it will implode in some weird way :toot:
that slide at the end feels incredibly N64 tomb raider, this is really coming together

Good Dumplings
Mar 30, 2011

Excuse my worthless shitposting because all I can ever hope to accomplish in life is to rot away the braincells of strangers on the internet with my irredeemable brainworms.

Your Computer posted:

I apologize that this is another pretty uninteresting update, but the good news is that I've now completely rewritten all of the code and re-implemented everything I had previously and more! Got completely new ground checking code that's far more robust and can theoretically be used to give different properties to different types of terrain, proper handling of slopes, sliding is fully implemented and animated, plus the new architecture makes all of the code so much more tidy and readable, and as a result I've squashed all manner of bugs/quirks that were in the previous code.

https://i.imgur.com/7N4e8eW.mp4

it's not very flashy but it's a tremendous milestone for me. For the first time I feel like I would be comfortable letting other people run around with the character without fear that it will implode in some weird way :toot:

Huge huge congratulations! There is nothing "uninteresting" about that wonderful moment of sublime release where a project's math just works.

TooMuchAbstraction posted:

https://twitter.com/byobattleship/status/1246551394191986688

Spent the last 8 hours working on this. Maybe in the future I should pick something that's a little further along in development for my Screenshot Saturday features.

And again congratulations here, because UI code is so critical despite how unglamourous it can feel to implement. I'm not clear on how these would be done in Unity, are the placement of assets data-driven or are they each hand-made scenes?

Good Dumplings fucked around with this message at 18:37 on Apr 7, 2020

TooMuchAbstraction
Oct 14, 2012

I spent four years making
Waves of Steel
Hell yes I'm going to turn my avatar into an ad for it.
Fun Shoe

Good Dumplings posted:

And again congratulations here, because UI code is so critical despite how unglamourous it can feel to implement. I'm not clear on how these would be done in Unity, are the placement of assets data-driven or are they each hand-made scenes?

Thank you! You could do both (hand-made scenes vs. data-driven). I went with data-driven because I felt like with the amount of different missions I want to do, hand-made would create a ton of repetition. But it's certainly true that hand-made would let you start creating content sooner; there's no need to write all the infrastructure to turn the data into stuff you see.

Each mission has two files: one that declares where all of the various components (ships, buildings, terrain, weather...) are, what the objectives are, which trigger volumes there are, etc. And one that contains all of the cutscene/dialog data. The video I posted above is all driven by the latter file, which I call a "mission flow" file. It looks like this:

code:
[MISSION title="Blockade Run"]

[MISSION globe pos="[690,370,0]" name="Bab al-Mandab Strait"]

[MISSION tacticalmap="RedSeaExit_20200323"]

[PC/demo] Pretty simple stuff on this one, just get out of the Red Sea and into the Gulf of Aden.

[MISSION briefing-label name="cruiser" pos="[500,500,0]" color="[1,1,0]"]
[MISSION briefing-label name="cruiser" pos="[450,450,0]" color="[1,1,0]"]
[MISSION briefing-label name="cruiser" pos="[550,400,0]" color="[1,1,0]"]

[PC/demo] There's a bunch of ships that way, but they look nice. I'm sure they'll let us by.

[MISSION briefing-label name="cruiser" pos="[375,750,0]" color="[0,.5,1]"]
[MISSION briefing-arrow pos="[425,675,0]" pos2="[450,600,0]" color="[0,.5,1]"]

[COMM/demo] Your optimism is your most endearing trait.

[MISSION start]

[MISSION trigger="enter volume" volume="Safety"]

[COMM/demo] Hey hey hey we made it!
[PC/demo] Man those guys weren't nice at all!

[MISSION complete]
I have a really hacky parser that can turn these files into sequences of UI animations and script activations, using a ton of callbacks and conditional execution. So e.g. the globe directive invokes the GlobeFlowAction script, which shows the world map, animates a crosshair falling onto this particular location, and types out this text for the location name. Then it waits for input from the user; when the user hits select or cancel, the script invokes its callback, which resumes processing of the flow file from where it left off. Similarly, all of the trigger directives work by subscribing to events that fire when stuff happens during combat, like the player destroying something, taking a certain amount of damage, or in this case touching a trigger volume. They then play until they reach the next MISSION tag.

There is almost certainly a better way to handle this stuff -- at the very least I should probably have given some thought to writing a proper grammar and parser instead of this silly tag-based thing. But now that I have it up and running, I can churn out mission dialog pretty quickly, since the flow files have a very simple syntax and mostly read like movie/theater scripts.

The other file, the one that has all of the "this is what you actually do in the mission" stuff, I make using an editor script. In other words, I basically lay out everything in the editor in a dummy scene, then I have a script examine the scene hierarchy and convert it to JSON. At runtime my mission master script uses that JSON to load and place mission elements. Here the advantage of being data-driven is less clear, since I'm not directly writing the data, but it's an approach I'm personally more comfortable with so I did it anyway. :shrug:

TooMuchAbstraction fucked around with this message at 19:15 on Apr 7, 2020

Stick100
Mar 18, 2003

TooMuchAbstraction posted:

Thank you! You could do both (hand-made scenes vs. data-driven). I went with data-driven because I felt like with the amount of different missions I want to do, hand-made would create a ton of repetition. But it's certainly true that hand-made would let you start creating content sooner; there's no need to write all the infrastructure to turn the data into stuff you see.

Each mission has two files: one that declares where all of the various components (ships, buildings, terrain, weather...) are, what the objectives are, which trigger volumes there are, etc. And one that contains all of the cutscene/dialog data. The video I posted above is all driven by the latter file, which I call a "mission flow" file. It looks like this:

code:
[MISSION title="Blockade Run"]

[MISSION globe pos="[690,370,0]" name="Bab al-Mandab Strait"]

[MISSION tacticalmap="RedSeaExit_20200323"]

[PC/demo] Pretty simple stuff on this one, just get out of the Red Sea and into the Gulf of Aden.

[MISSION briefing-label name="cruiser" pos="[500,500,0]" color="[1,1,0]"]
[MISSION briefing-label name="cruiser" pos="[450,450,0]" color="[1,1,0]"]
[MISSION briefing-label name="cruiser" pos="[550,400,0]" color="[1,1,0]"]

[PC/demo] There's a bunch of ships that way, but they look nice. I'm sure they'll let us by.

[MISSION briefing-label name="cruiser" pos="[375,750,0]" color="[0,.5,1]"]
[MISSION briefing-arrow pos="[425,675,0]" pos2="[450,600,0]" color="[0,.5,1]"]

[COMM/demo] Your optimism is your most endearing trait.

[MISSION start]

[MISSION trigger="enter volume" volume="Safety"]

[COMM/demo] Hey hey hey we made it!
[PC/demo] Man those guys weren't nice at all!

[MISSION complete]
I have a really hacky parser that can turn these files into sequences of UI animations and script activations, using a ton of callbacks and conditional execution. So e.g. the globe directive invokes the GlobeFlowAction script, which shows the world map, animates a crosshair falling onto this particular location, and types out this text for the location name. Then it waits for input from the user; when the user hits select or cancel, the script invokes its callback, which resumes processing of the flow file from where it left off. Similarly, all of the trigger directives work by subscribing to events that fire when stuff happens during combat, like the player destroying something, taking a certain amount of damage, or in this case touching a trigger volume. They then play until they reach the next MISSION tag.

There is almost certainly a better way to handle this stuff -- at the very least I should probably have given some thought to writing a proper grammar and parser instead of this silly tag-based thing. But now that I have it up and running, I can churn out mission dialog pretty quickly, since the flow files have a very simple syntax and mostly read like movie/theater scripts.

The other file, the one that has all of the "this is what you actually do in the mission" stuff, I make using an editor script. In other words, I basically lay out everything in the editor in a dummy scene, then I have a script examine the scene hierarchy and convert it to JSON. At runtime my mission master script uses that JSON to load and place mission elements. Here the advantage of being data-driven is less clear, since I'm not directly writing the data, but it's an approach I'm personally more comfortable with so I did it anyway. :shrug:

I think your solution is perfect and to my understanding is basically the industry standard even at big shops with dedicated tools developers. The solution you made would make it easy for a dedicated designer to make missions.

a cyberpunk goose
May 21, 2007

Your Computer posted:

I apologize that this is another pretty uninteresting update, but the good news is that I've now completely rewritten all of the code and re-implemented everything I had previously and more! Got completely new ground checking code that's far more robust and can theoretically be used to give different properties to different types of terrain, proper handling of slopes, sliding is fully implemented and animated, plus the new architecture makes all of the code so much more tidy and readable, and as a result I've squashed all manner of bugs/quirks that were in the previous code.

https://i.imgur.com/7N4e8eW.mp4

it's not very flashy but it's a tremendous milestone for me. For the first time I feel like I would be comfortable letting other people run around with the character without fear that it will implode in some weird way :toot:

this isn't boring!! in fact, you're now required to enable all your debugging gizmos and show us more running around :getin:

xzzy
Mar 5, 2009

At that big slide at the end, is that you aligning him with the slope or does that happen automatically? Because it's awesome if it's automatic, saves the annoyance of the player grinding against a wall as they struggle with the controls.

Onimwad
Mar 14, 2019

I Love Making Games!
Still working on Grabbus!
Last week I got the control prompt graphics done, so this week I overhauled the scene editor.
Now instead of being a wall of text and codes, it uses a node timeline that contains moveable text/code chunks instead. That way the whole scene can be manipulated muuuuch easier.

https://twitter.com/Grabbus_Game/status/1247662087473713153?s=20

I also made it easier to add new commands and functionality with a multi-purpose dropdown menu for selecting multiple options.
The next thing to do is add more effects that can be inserted to the timeline, and more character portraits to play with!

Macichne Leainig
Jul 26, 2012

by VG
Your Computer, if you make slides like that recur throughout your game, that’s a day 1 buy from me. Looks like a great character controller. Also the skeleton is cute as hell but I’m sure many people have said that.

TooMuchAbstraction
Oct 14, 2012

I spent four years making
Waves of Steel
Hell yes I'm going to turn my avatar into an ad for it.
Fun Shoe

Stick100 posted:

I think your solution is perfect and to my understanding is basically the industry standard even at big shops with dedicated tools developers. The solution you made would make it easy for a dedicated designer to make missions.

Oh sure, I'm happy with the capabilities, and even with the extensibility. This is more just me griping that my implementation is ugly. But if it's ugly and it works...!

Your Computer
Oct 3, 2008




Grimey Drawer
thank you so much for the kind words everyone :blush:

xzzy posted:

At that big slide at the end, is that you aligning him with the slope or does that happen automatically? Because it's awesome if it's automatic, saves the annoyance of the player grinding against a wall as they struggle with the controls.
the sliding code tries to always slide the player in the direction of the slope, but it also takes input from the player to nudge the character a bit left and right. Haven't tested it in a more robust scenario than that slide though, it's gonna be interesting to test it against more devilish slides :v:

a cyberpunk goose posted:

this isn't boring!! in fact, you're now required to enable all your debugging gizmos and show us more running around :getin:
your wish is my command, but I don't actually have that many interesting gizmos. To mix things up a bit I'm on the map I showed off earlier
https://i.imgur.com/PnoiKFr.mp4

- the magenta line is the movement direction (self-explanatory)
- the cyan sphere is for the ground checking which basically considers the character grounded if there's ground within that area (meaning bumps and changes in elevation won't knock you out of being grounded)
- the rig in front of the player is the ledge checking code which first does an OverlapSphere check to see if the point of casting is clear, then does a spherecast in the direction of the line to find an edge, which determines multiple things such as whether the player should begin sliding or falling (since the collider can't tell the difference between a steep ledge and a steep slope) and whether to start teetering, which I didn't show here but showed off earlier!
because of how I've segmented the code into different states this stuff is only handled while actually on the ground which is why the gizmos disappear when I jump, if that wasn't clear :v: Anyway I've still got a tremendous amount of work to do and things I wanna try out, but this is a very exciting time for sure!

As an aside I remember asking if anyone could elaborate on why the built-in CharacterController was considered bad and I've also tried searching around for an answer, but now that I've spent as much time as I have using it (and I'm still using it!) I have some thoughts on my own. It's a very simple component. Very simple. At this point the only thing I'm using it for is collision resolution because the other functionality it has is too limited to be of use. I can see it working decent out of the box for a game with very basic movement requirements like an oldschool Doom-style FPS or something but it certainly doesn't cut it for a third person platformer. The smart thing to do at this point would be to go over to something like the Kinematic Character Controller from the Asset Store but I don't have $60 to throw around right now and besides, I'm learning a whole lot doing this the hard way! The upside to using so little of the CharacterController's functionality is that I could replace it with any other collision resolution code with minimal rewriting, since all I'm really doing with it is calling Move().

a cyberpunk goose
May 21, 2007

Your Computer posted:

your wish is my command, but I don't actually have that many interesting gizmos. To mix things up a bit I'm on the map I showed off earlier
https://i.imgur.com/PnoiKFr.mp4

Ohhhh yeah, that’s the stuff!!

Re: CharacterController: I’ve had a similar experience where I only use it for Move() and have mostly been fine for simple things

Omi no Kami
Feb 19, 2014


Have you guys ever run into performance problems with the default controller's collision detection? I'm confident enough in my math to write the movement solver and everything, but the main reason I still use the controller is because I don't want to deal with figuring out how to keep the darn thing from falling through the floor without doing a zillion spherecasts every tick.

imhotep
Nov 16, 2009

REDBAR INTENSIFIES
Can I plz QA test for Bonejo Kazooie?? For free?? or I'll pay you even!

Lork
Oct 15, 2007
Sticks to clorf
Getting a new feature in is nice, but I've found that the best feeling is when you get something fundamental just right. I've spent more time than I'd like to admit just running around or using a basic menu or something over and over again, going "holy poo poo it actually works the way it's supposed to, isn't that amazing!?"

I've been working on a bunch of not quite fundamental but still important miscellaneous features: different objectives, a new spawning system (before, all enemies would stream into the levels in waves, now some or all of them populate the level from the start depending on the objective type), an aggro system to go along with that, locked doors/force fields and keys to go with them, and some decorative tree-like things.

https://i.imgur.com/bgoZECL.mp4

Aneurexorcyst
Feb 11, 2004

There is a great disturbance in the monarchy...
Thought this was worth sharing with the group :)

https://twitter.com/SeanNoonan/status/1247988645551800320
I also just pushed an update (Linux is now supported!): https://sean-noonan.itch.io/super/devlog/135791/v102-update

Anyone here using UE4 have any luck exporting for Mac from Windows? There didn't seem to be any way to do it...

Aneurexorcyst fucked around with this message at 22:40 on Apr 8, 2020

Stick100
Mar 18, 2003

Aneurexorcyst posted:

Anyone here using UE4 have any luck exporting for Mac from Windows? There didn't seem to be any way to do it...

I don't know in this case but it's pretty common for PC builds (Mac/Windows/Linux) that you have to be on the platform to build for the platform since it needs to call stuff in the OS to make a build happen.

Surprise T Rex
Apr 9, 2008

Dinosaur Gum
I remember at least for iOS that you need to be running a Mac to build and sign the app file so I wouldn't be entirely surprised if the same applied for Mac software too.

al-azad
May 28, 2009



So there's a "haunted hunting jam" going on and I decided nothing is scarier than bad controls. So here's a shotgun that fires 225 individual pellets with a relatively accurate size, mass, drag, spread, and velocity. Left/right click to fire left/right barrel. R to open the breech, Q/E to load/unload left/right shell, R to close the breech, middle click to "ready" the gun. Soon to be implemented: an adjustable choke for each barrel.

https://i.imgur.com/yzUCO5g.mp4

e: turn the audio on

al-azad fucked around with this message at 23:11 on Apr 8, 2020

kaffo
Jun 20, 2017

If it's broken, it's probably my fault

al-azad posted:

So there's a "haunted hunting jam" going on and I decided nothing is scarier than bad controls. So here's a shotgun that fires 225 individual pellets with a relatively accurate size, mass, drag, spread, and velocity. Left/right click to fire left/right barrel. R to open the breech, Q/E to load/unload left/right shell, R to close the breech, middle click to "ready" the gun. Soon to be implemented: an adjustable choke for each barrel.

https://i.imgur.com/yzUCO5g.mp4

e: turn the audio on
I love this. I'm such a nerd for simulations. I played hours of Reciever even though it was awful to use the pistols.
It needs crazy recoil, and it needs to be randomised each time so you can't muscle memory the shotgun back into position.

DaveKap
Feb 5, 2006

Pickle: Inspected.



Aneurexorcyst posted:

Thought this was worth sharing with the group :)
But are the clouds also the bushes? ;)

Omi no Kami
Feb 19, 2014


I got really bored after working on some random props and a cow, so I banged together cow cannibalism simulator just to see how quickly I could get it working:

https://i.imgur.com/Z7Qp2Gh.mp4

asmasm
Nov 26, 2013
We are finally closing in on finishing this wrench update which we intended to have ready for the end of December. Game dev with small teams is so hard to schedule. Related to that, I love that users think we are being cagey when they ask "when is feature X going to be ready" and it's something we haven't even started working on yet :)

Wrench finally has something like a gameplay loop with progression where player earn money and have some goals. One part of the progression is having performance parts players can buy to prep their cars for a faster racing class:

Carbon fiber extractor hood ducting:


Tubular steel control arms:



CFR body panels + a wing blockout in the new showroom environments:

anatomi
Jan 31, 2015

I'm not a car guy, but that poo poo is simply beautiful.

anothergod
Apr 11, 2016

Does anyone have opinions on HLAPIs for multiplayer in unity? I'm having a hard time deciding between Photon PUN, Photon Bolt, and Mirror

kaffo
Jun 20, 2017

If it's broken, it's probably my fault

anothergod posted:

Does anyone have opinions on HLAPIs for multiplayer in unity? I'm having a hard time deciding between Photon PUN, Photon Bolt, and Mirror

I've used PUN and Mirror.
I never much liked PUN, I found it personally a bit of a pain in the rear end in my project just because of the way it's built. An open source project I used to help out with ditched PUN too at some point a year or two ago for scaling reasons IIRC.

Mirror is pretty solid, I use it whenever I want to throw together some multiplayer prototypes. It's simple and I like what the guys have changed to the original Unity HLAPI stuff, it's just a little nicer and simpler.
On the negative, it's much like unity itself, you've got to do it their way or you're fighting against it.
For example Mirror expects you to only have a single network identifier script somewhere in a game object tree, which makes sense architecturally. But it means you can't create little individual networked prefabs to slap on a networked parent. I ended up with a solution personally, but it was a little annoying.
Also, it scales fine, which is fine if you're doing like 10 players or prototyping. But I'd be weary if you ever wanted to scale up.

You can swap out the network low level transport layer with mirror, personally I use ignorance because I love the E Net reliable UDP stuff.

Mirror is also client/server, which is what I personally want 95% of the time. I'm not a fan of peer to peer or match making unless I have a very specific purpose for it.

I've done some digging into network crap for Unity (when I tried to make an MMO) so if you have any questions I might be able to help out

Adbot
ADBOT LOVES YOU

anothergod
Apr 11, 2016

Is Mirror suitable for low latency games? Or just RPG type stuff?

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply