Failing In So Many Ways

Icon

Liang Nuren – Failing In So Many Ways

The Community Disadvantages of Classes

A while back Taugrim made a post on his blog here [taugrim.com] which pointed out the potential for population imbalance on PVP servers in SWTOR.  In it, he makes this statement:

The three things that I have seen kill World PVP in other games have been:

  1. Crappy class balance, which causes individuals to quit (so far, not a significant issue in SWTOR, although the JK/SW’s should get their CCs earlier)
  2. Crappy world PVP implementation (can’t comment on this, haven’t experienced Ilum yet)
  3. Population imbalance, which causes different issues on both side: boredom for the zergy faction, frustration for the gets-zerged faction (there is significant risk here for SWTOR, given that it’s a 2-faction game)

His first point about crappy class balance got me thinking along a track that I’d been kicking around since before I quit Rift.  Taugrim touches on this with his comment about “crappy class balance”, but I think the problem goes much deeper than simply killing world PVP.

Basically, one of the most destructive forces in modern MMOs is the class system itself, because the difficulty and foolishness in providing a perfectly balanced game combined with class communities simply rip the game’s community apart.  That it isn’t because class systems are worse for actual game play than classless systems (because they generally aren’t), but rather because of the fact that they are Massively Multiplayer Online Games.

Its the human element that ruins it, and that’s important because the human element of community is what keeps people playing (and paying for) the game.

Character Investment

Lets first agree that a player creates an extension of themselves when creating a character in a MMO, and they often pour hundreds of hours of blood, sweat, and tears into their characters.  While its not legally true, in a very real sense the character’s successes, failures, reputation, and even in game wealth belong to the player.  All of this effort provides an attachment to their character – and thus to the game itself.

However, a class based MMO forces special restrictions on the character (and thus the player).  For instance, class based systems frequently prevent a player from fully reacting to metagame shifts and game balance changes.  The player is almost certain to resent negative changes, even if the changes are required for the good of the game.  Rightly or wrongly, this resentment often makes people feel like they’re playing a losing hand.

In the worst cases (sometimes via self inflicted Fad Of The Month chasing), people re-roll alts to play while their main character is on ice.  On the positive side, this behavior allows the player  to “experience” (read: blitz) the intro parts of the game from a new perspective.  However, much more importantly it deprives them of access to all of the advantages and prestige of their main character – from their level and equipment to their in game skill/muscle memory and even reputation.

This deprivation – caused because the class system forcibly prevents the player from adapting their character to the new environment – breaks the player’s attachment to their character and thus the game itself.  The ability for players to adapt around broken and inefficient areas of the game means that players in a classless MMO can often slip around issues that become absolutely critical to a classed MMO’s long term health.

Class Imbalances Affect the Game – and Community

Its pretty obvious that class imbalances legitimately affect the game in a variety of ways – ranging from the way that the game is played to the way that the metagame is played.  For instance, a class that’s perceived as not performing isn’t as likely to be accepted on raids – effectively providing a barrier to participating in group content (either PVE or PVP).  This has several knock-on effects that tend to create feedback loops exacerbating game balance problems – whether large, small, or merely imagined:

  • An underperforming class is played less often, if for no other reason than its less fun to play a game where you frequently lose “unfairly”.  On the other hand, overperforming classes are frequently played because winning is fun.
  • Class scarcity can make abilities which rely on a certain “critical mass” for optimal performance can become nearly impossible to pull off.  But class overpopulation can make it trivially easy to execute certain mechanics that are impossible to counter for all intents and purposes.
  • Classes which rely on or play off of the over or underperforming class’ abilities are similarly affected – and this propagates even further between other classes
  • Under performing classes frequently lack the population “critical mass” to create active communities, and what community does exist tends to be bitter and angry.  On the other hand, over performing classes often have vibrant, active, and helpful communities.

The interesting thing here is that a classless MMO simply sidesteps most of these problems.  That’s not because there can’t be role imbalances, but  by virtue of allowing any character to fulfill any role.  The barrier to entry for participation in group content simply evaporates as the players adapt their characters to the new game environment.

Class Communities

Sub communities almost always spring up in a properly functioning MMO community of any size – and in class based games these communities tend to revolve around classes.  The existence of these communities make tons of sense too, because people who like the same parts and roles within the game are likely to want to talk to each other about it.  Invariably these communities will also spawn their own community leaders, because some people just have a lot of time to post and are just as good at communicating and teaching as they (hopefully) are at the game.

Two of the more obvious examples I can think of are Taugrim [taugrim.com] and Dissb [dissb.com].  Both of these guys are great guys, both sharp as a whip, and provide great value to their respective communities.  Furthermore, they provide great value to their game community as a whole because they try so hard to learn the minutiae of every class.

However for every Taugrim and Dissb we see in a community, there are countless other people that cover spectrum in temperament and skill – each having wildly different expectations for what they are wanting to give to the community and get back out of it.  Most want to be constructive by engaging in general dialogue and sharing experiences with people who share similar interests.  Others want to be a pain in the rear and be generally disruptive… and really that’s to be expected in any online community.

However, the real problems with class communities don’t start until there’s a perceived game imbalance – and there will always be a perceived game imbalance.  Sometimes, its because there’s a real imbalance, sometimes its because of a disadvantaged situation and a Rock / Paper / Scissors / Lizard / Spock [wikipedia] balancing approach.  And sometimes its because the skill differential between your highly visible elite players and the average can be so high.

Class Balance Suggestions – and the Metagame

No matter how or why it starts, class communities are organized and prepared to wage bitter forum wars against every other class.  When there’s a widely perceived class imbalance, these communities assault and flood every forum from general to the class specific to ensure the problem has high visibility.  The quality of posting is highly variable – from objective comparisons and concrete examples of how and where the class balance is less than optimal to :raeg: poasting, ultimatums of unsubbing, and outright trolling.  And, of course, there’s also going to be countless ideas for how to fix the perceived game imbalance.

Some of these ideas are going to be made by reasonably smart people with solid understandings of that part of the game.  These ideas range from extremely insightful and balanced to subtly imbalanced – either because the author’s experience is too narrow and they’re “in the weeds” with the problem or because the author is out to meta game the dev staff into shifting the game imbalance to favor their class and play style.  The result is extremely predictable regardless of whether the poster is operating in good faith: people from every side rush to defend their own positions.  These forum fights are the ones that I’ve seen the most energy and anger poured into – hundreds and even thousands of player-hours poured into individual threads chock full of fanaticism and borderline hatred.

In the end, if there’s a real imbalance the company is going to have to fix it – either to fix the community or to keep their game afloat.  Afterall, nobody likes playing a loser.  Inevitably, the devs are going to be influenced by the community floated ideas and general community atmosphere.  The situation frequently deteriorates to the point that by the time the devs have come up with a solution on the testing server that there’s active efforts on the player base’s part to sabotage and misrepresent beta testing results.  In many ways this is the source of “knee-jerk” balancing and the creation of the FOTM cycle.

Its simply undeniable that these kinds of fights create animosity and divide the community.  Furthermore, these forum brawls and dirty tactics are inevitable because of the high stakes being played for – losing an argument can result in your character or play style being buffed to godhood or nerfed into obsolescence.  In a class based game this can mean months at a time of sacrificing the reputation, gear, and wealth that you’ve spent literally years building.

Really, it makes no sense to forcibly create these anger filled subdivisions within your community by introducing a class system.

Filed under: Eve, Game Design, Gaming, Rift, SWTOR, , , , , ,

Amamake Fun IV

Amamake Fun IV: http://vimeo.com/37092811 (UPDATE: This video is currently not online. Its too long to go on youtube and has been taken down from Vimeo)

I fraps most fights that I get into these days (thanks Rift!), and as a result I found myself with a pretty substantial collection of mostly solo frig fights in Amamake.  I thought about including some non-Amamake fights but decided it would violate the spirit of my mostly ignored Amamake Fun series.  The fights in question come mostly from arranged 1v1s, though some of it obviously wasn’t.  I salute every single person that I fought in these videos, and I thank you for the fight.  Good fights, again. :)

As with all of the videos I’m trying something different with the soundtracks.  I thought about starting with Nuttin but Stringz and sticking strictly to the modern classical style, but I just didn’t have enough of it to complete the video without feeling relying too heavily one 1-2 artists.  In the end I decided to roll with a mostly Electronica soundtrack, and I’m not totally convinced this is the right way to do this particular video.  I’m not really sure where I ended up with Ming and Fs but I have it and it sounded ok and fit with the original style I wanted to use.  I highly recommend picking up Beats Antique and Nuttin but Stringz though – both are excellent and I enjoyed the full albums.

This is the fight order:

  • Harpy vs Cyclone
  • Harpy vs Rupture
  • Taranis vs 2 Rifters (They came in staggered and appear as two separate fights)
  • Taranis vs 2 Rifters
  • Taranis vs Taranis
  • Vengeance vs Ishkur
  • Taranis vs Wolf
  • Harpy vs Wolf
  • Harpy vs Taranis

This is the soundtrack:

  • Beats Antique
  • Nuttin but Stringz
  • Ming and Fs
  • Daft Punk

Filed under: Eve, Gaming, , ,

MMO PCUs

Rift

According to the Rift Forums Community Ambassador (01-26-2012 01:48 PM):

Anyone know the state of rift?

The question is very hard to answer meaningfully. Right now, we have 16 servers in NA, population caps are about 2k concurrent players (could be a little more, but I don’t think so). A couple-few are filling up at peak hours, peak hours are usually 5-10% of player base (outside of launch, where it’s quite a bit higher)… so I’d guess rough order of 300k-350k players active in NA plus players elsewhere who are on NA servers.

Participation levels are way down since launch, but that’s a mix of population shifts and changes in hours people play.

We can’t get good info on rising or falling populations right now because of recent effective-mergers of shards; the 16 NA shards we see now are still getting people coming in from 11 shards recently repurposed for “trial” purposes.

In practice, I certainly do see a lot of people in the game who want to know what a soul is, or whether they have to reroll if they don’t like their build, or what it means then there’s a horn sound and a statement like “The heat of the forest begins to increase.” So basically newbies who haven’t played before.

I have read that there are at least 32,000 concurrent users.

16 servers with caps of 2k would be 32,000 if they were all full — but they aren’t, I’ve not seen more than 2-3 with queues in the last month or so. So a lot are a bit under.

It is worth remembering at this point that he’s a Community Ambassador, not a dev.  He’s got the inside track on information but its by no means authoritative.  But lets run with it.

According to Massively, Rift launched by adding 31 new servers for a total of 58 US and 41 EU servers.  Thus, the most peak concurrent users Rift has ever been capable of supporting was ~198k (assuming the same PCU max per server since launch).  According to Riftstatus there are currently 23 total active servers (16 US,  7 EU) for a maximum of 46k players online at any given time.  If the servers were always full during their respective timezones, we could expect 32k concurrent players in the US prime time and 14k in the EU prime time.

However, also according to Riftstatus, most servers cycle between low and medium population throughout the day.  Thus, it is not reasonable to assume that Rift has hit 46k PCU recently (even if we neglect timezone differences between US and EU TZ).  I don’t feel comfortable making arguments relating to the exact ranges that “high”, “medium”, and “low” represent but I’d be surprised if we’re looking at more than 20-25k players during any given US TZ prime time.

SWTOR

On the other hand, SWTOR is just a few months old and has many servers (124 US, 91 EU for a total of 215).  According to Eurogamer, SWTOR’s current vital stats include 1.7M subs and 350k peak concurrent users over 215 servers.  It doesn’t really tell us anything about the per server numbers though, so its hard to compare to Rift, except as perhaps “overall game health”.  But, it does give us some overall numbers to poke at, and those numbers are quite substantial indeed!

According to this thread from the SWTOR forums, someone doing a “personal audit” of the game population using map instance populations found 1400 people on his server.  Dividing the PCU evenly over all the servers worldwide would yield 1628 people per server.  Cramming all the players onto the US TZ servers would result in ~2800 people per server – but of course this simply provides an upper boundary because we know it isn’t happening.  Eve Online’s daily PCU is right as the EU TZ logs off and the US TZ logs on, so dividing across SWTOR’s East/EU servers yields 2023 per server – which is very similar to Rift’s 2k PCU/server.

According to Simutronics (the maker of HeroEngine – the engine used by Bioware to create SWTOR), a single HeroEngine server shard can theoretically support up to 100k concurrent users.  The HeroEngine Wiki provides an example of up to ~300 people per area map, and this is consistent with the observed player thread (and what I personally saw when I had time for SWTOR).  The engine developers go to some lengths to explain that proper game design has a strong effect on your hardware requirements and total scalability.  At some point, the suggested solution is to make the map smaller or instance it.  SWTOR went for instancing, so we can reasonably expect 150-200 people to be about as many people as could be involved in a major PVP engagement.  According to Taugrim the largest engagement he’s been in was 60-70 people with what he termed as “high lag”.

Eve Online

Eve Online has well published concurrent users by way of eve-offline.  I’ve gone over the rolling average for concurrent users in several other posts, but I’ll belabor the point once more since most of my previous posts focused on the rolling average for concurrent users.  Obviously the health metrics of the game itself is improving after the disaster that was Incarna.  But that doesn’t have much to do with today’s topic of conversation: PCU.  The peak concurrent users for Eve Online by Eve-Offline during February was 51748, and its all-time PCU was 60453 during Alliance Tournament 8.

Here’s Eve Online’s PCU for the last several months:

  • “2011-06-05 17:34:00″ 49232
  • “2011-07-31 19:32:00″ 48813
  • “2011-08-07 18:47:00″ 49281
  • “2011-09-05 19:10:00″ 48074
  • “2011-10-16 20:11:00″ 45487
  • “2011-11-06 20:15:00″ 44527
  • “2011-12-11 20:13:00″ 48759
  • “2012-01-29 18:59:00″ 50356

According to CCP Veritas (dev blog) there were > 1350 players in a single PVP engagement and Time Dilation kept the module response time for under one second.  Of course, just because module response time was low doesn’t mean that things were proceeding quickly, and Time Dilation scaled apparent time down to somewhere between 10-30% for a couple hours while the battle raged.  Jita (the primary market hub) regularly houses more than 1700 active players and I’ve put in a request for CCP Diagoras to see if he can give us Jita PCU numbers for the last several months.

As to the architecture of the game, I think its reasonably well known that each system (area) runs on a single thread on a server.  On the flip side, the server operates in a 1 Hz cycle which would be absolutely unacceptable in games like Rift and SWTOR.  Furthermore, players are assumed to continue moving in Eve Online as opposed to other MMOs where players have to hold a key to continue moving.

These kinds of design differences really emphasize what the HeroEngine wiki was trying to tell us: game design matters for scalability.

Filed under: Eve, Game Design, Gaming, Rift, SWTOR, , , , , , , ,

Eve Is Dying?

The perpetual thread is back on Eve-O tonight.  Eve Online is dying.  Its going to have to go Free To Play just to keep the doors open.  The hard nosed attitude vets have towards carebears is going to destroy the game.  The game only has 39,000 people online right now!  Oh noes!!

So I decided to do a little bit of digging [eve-online.com]:

According to these articles[1][2] your average SWTOR server can expect to have somewhere between 1400 and 2700 people. This includes both the shards and the “sharded zones” that have different people running on the same map. Thus, we could say (for example) that 39k people online is the equivalent of 14 and 27 servers. Split the difference and call it 21.

So lets assume that SWTOR is representative of all sharded MMOs and note that Rift has 16 US TZ servers and 18 EU TZ servers[3]. Noting that only one of those server sets really comes into play at a time, we can safely say that on average that Eve has ~15% more people playing than Rift does.

Now, one might argue that its terrible if Eve is merely as popular as Rift – afterall, Rift just went half free to play! However, the situations are quite distinct. Consider:
- Eve has long since been turning a profit, and is continuing to turn quite a pretty penny in profit. Enough to outright pay for the development of at least one extra game.
- Eve’s sub graph doesn’t look like Rift’s[4].
- Eve’s sub graph has a high correlation to its population graph. Consider the server metrics [5][6] as well.

Basically: while 39k seems like its “really low”… its actually not.

-Liang

[1] http://www.eurogamer.net/articles/2012-01-03-swtor-has-350-000-peak-concurrent-users-report
[2] http://www.swtor.com/community/showthread.php?t=240117
[3] http://www.riftstatus.com/
[4] http://users.telenet.be/mmodata/Charts/Subs-2.png
[5] http://wp.me/p1WQ0O-4i
[6] http://blog.beyondreality.se/Population-patches

Filed under: Eve, Gaming, Rift, SWTOR, , , ,

Bomber Roam

I’ve pretty well stopped blogging about my roams, because well frankly they’re every night.  But, tonight’s roam was interesting because it was smacky.  So tonight is my third recent bomber roam. In the first, I solo killed a Harbinger with my Manticore. In the second, we killed a whole bunch of stuff.  Tonight, we started off moved from Amamake to Ardar without finding our first kill.  There Tomin found a flashy Amarr Empire Hurricane in Hadozeko on the Ardar gate.  The Hurricane jumped through and Tomin nailed the tackle – we jumped into Ardar from Frerstorn and warped to the Hado gate.  Hurricane down.  Just after that (we hadn’t even had time to scoop loot yet), Late Night Alliance (Minnie FW) jumped in with a flashy Hurricane (Manos Kdo) which we obviously engaged.  Then they jumped in a whole bunch of stuff.  Being the good pirates we are, we disengaged.  This is the conversation that followed in local:

[06:25:02] EVE System > Channel changed to Local : Ardar
[06:31:32] Liang Nuren > gf
[06:31:36] Tomin Highborn > gf
[06:31:41] SaB0TaG3 > gf
[06:31:43] Hahbahdahishboo > gf
[06:32:36] Manos Kdo > gf
[06:32:48] Liang Nuren > huh
[06:32:50] Liang Nuren > big enough blob?
[06:32:59] Manos Kdo > yes we formed it up for you
[06:33:00] Tyrolen > RUN FORREST
[06:33:04] Tyrolen > FUCKIN RUUUUUUUUN
[06:33:15] Hilda B9 > was the cane your scout?
[06:33:18] Tyrolen > Then qq about roaming blobs specifically meant to kill you. Hint: you’re not that special, cupcake.
[06:33:20] Manos Kdo > yes
[06:33:28] Liang Nuren > I didn’t say you formed up to kill us, you moron
[06:33:29] Manos Kdo > the cane is me MEEEEE
[06:33:39] Liang Nuren > I asked if you had a big enough blob
[06:33:40] Hilda B9 > nah the one we just killed
[06:33:46] Manos Kdo > moron thats so hurtful try retard or fuckwit
[06:33:51] Liang Nuren > I do like fuckwit
[06:33:57] Liang Nuren > its not even censored on Eve-O
[06:33:58] Manos Kdo > :)
[06:34:05] Tyrolen > Dock in orcas more you worthless fuckin tic
[06:34:14] Liang Nuren > lol
[06:34:18] Liang Nuren > look how stupid you are

Of course, I don’t ever make use of the Orca or even camp the Ossogur gate – for a lot of reasons, really.  The biggest reason is that its really lame.  That’s why you find me fighting outnumbered and outshipped most of the time (which is quite distinct from saying I won’t take the random free kill where we outnumber or outship the enemy).  At any rate, he immediately jumped out of local and then sent me this evemail:

Stupid
From: Tyrolen
Sent: 2012.02.11 06:35
To: Liang Nuren,

As the douchebags who dock in orcas at the first sign of trouble. You fucking pussy. Shut the fuck up.

And then, of course, he blocked me.  LOL.

Filed under: Eve, Gaming, , , ,

Crucible: Mission Accomplished?

I think its important to take a look at whether or not Crucible is really making inroads into the players lost during the massive clusterfuck that was Incarna. Afterall, it wasn’t very long ago that blogs like this were being written.  I think this is an interesting comment in it:

One last thing: this chart seems to prove what a stagnant state EVE is in at the moment: other than the +60D peak after Incursion, the 30 day rolling average number of players logged into EVE has not changed from 30,000 in 27 months.

I took the liberty of poking the eve-offline data and putting it into a more useful form.  There’s some massaging of the data – namely I filtered out any row with less than 10,000 players and duplicated the previous day for any missing days.  The goal here was to eliminate momentary “blips” in the chart because Chribba’s site went down, or because Eve had a particularly long patch.  Those simply aren’t interesting data points for me here.

I’m also notoriously terrible at Excel wizardry, so I did most of this in a database – Oracle in particular.  Mostly because it was handy, but also because it gave me the opportunity to learn more about Oracle’s analytic functions.  I came from a PostgreSQL background, and so far at this job I haven’t really had a lot of reason to play with them.  Maybe its not having to do a ton of manual BI requests, or maybe its just because people want the raw data to work their own Excel Wizardry.  Dunno, but at least some small hole in my knowledge is filled.

For what its worth, this is the basic form of the query:

select
    to_char(logtime, 'YYYY-MM-DD HH24:MI:SS')                                           AS "date",
    raw_pl                                                                              AS "raw_max_players",
    pl                                                                                  AS "adjusted_max_players",
    trunc(avg(pl) over (order by logtime rows between 7-1 preceding and current row))   AS "7 day",
    trunc(avg(pl) over (order by logtime rows between 30-1 preceding and current row))  AS "30 day",
    trunc(avg(pl) over (order by logtime rows between 60-1 preceding and current row))  AS "60 day",
    trunc(avg(pl) over (order by logtime rows between 90-1 preceding and current row))  AS "90 day",
    trunc(avg(pl) over (order by logtime rows between 120-1 preceding and current row)) AS "120 day",
    trunc(avg(pl) over (order by logtime rows between 180-1 preceding and current row)) AS "180 day",
    trunc(avg(pl) over (order by logtime rows between 365-1 preceding and current row)) AS "365 day"
from (
    select
        t.day                                                  AS logtime,
        max(pl)                                                AS raw_pl,
        last_value(max(pl) ignore nulls) over (order by t.day) AS pl
    from days_table t
        left outer join all_tz p on t.day = p.logtime
    where t.day between (select min(logtime) from all_tz) and (select max(logtime) from all_tz)
    group by
        t.day
    ) x 
order by
    to_char(logtime, 'YYYY-MM-DD HH24:MI:SS')

These are the basic forms of the other tables and views:

create table pl (
    logtime date,
    pl number 
);

create or replace view all_tz as
select trunc(logtime) as logtime, max(pl) as pl
from pl
where pl >= 10000
group by trunc(logtime)
;   

create or replace view us_tz as
select trunc(logtime) as logtime, max(pl) as pl
from pl
where pl >= 10000 
    and to_char(logtime, 'HH24:MI:SS') != '00:00:00'
    and cast(to_char(logtime, 'HH24') as number) between 0 and 6
group by trunc(logtime)
;

I remembered one of the things I wanted done the first time around was to split the data and see just how Eve fared in any given timezone.  Now, I admit that I’m mostly interested in this because I play at a slightly odd hour and I find it frustrating to not find anyone to shoot at.  So I took the time to filter the data based on Swearte’s suggestion on Twitter:

  • US TZ: 00:00 to 06:00 Eve Time
  • AUS TZ: 10:00 to 15:00 Eve Time
  • EU TZ: 15:00 to 00:00 Eve Time

If you look carefully at the example timezone view, you can see some peculiar 00:00:00 filtering. I filtered out rows taken exactly at midnight because so much of the data set had the time portion stripped off – and thus I don’t feel that it was directly attributable to any particular timezone. Though looking at the way the EU TZ converges so heavily with the 60 day moving average, I could be persuaded to call it EU TZ.

Here’s the a graph of what I found (courtesy of Google Docs save chart image) – and its very encouraging for my timezone.  From this perspective, it seems that Incarna was a total disaster and Crucible was a smashing success.  There are some fascnating things in the numbers – like for example the US and EU TZ appear to be growing at a very similar rate, but the AUS TZ is taking off like a house afire.

The EU TZ had its all time 60 day rolling average high of 45.5k in Feb 2011, and by Dec 2011 it had dropped to 37.6k – down a hair over 17%.  However, its been rising steadily and is back up to 41.8k – either an 11% improvement over the recent slump or only 8% down from the all time high.

The US TZ had its all time high of 33.1k in Feb 2011, and by October it plunged to 25.3k where it stayed until December.  Since then, its been taking off fairly well and is back up to 29.6k.  This means that the US TZ was down almost 24%, but has grown 17% since December for a net loss of 10.5%.

The AUS TZ had its all time high of 29.3k in May 2011 and was down to 22.7k by October – a 23.5% loss.  By Dec 18th, the AUS TZ was hitting record highs and is now at 32.8.  Crucible has seen almost 45% growth of the AUS TZ since the Incarna Slump – which is over 10% more than its ever been.  This is fantastic news for me, because it means I will soon have more people to shoot when I’m awake.

So I guess at this point there’s nothing to do but congratulate CCP on their hit expansion.

The raw data is available on my blog here:

Filed under: Databases, Eve, Gaming, Software Development, , , , , , ,

Follow

Get every new post delivered to your Inbox.