I saw someone the other day who had the same pair of shoes I do -- a pair of Sketchers with bright orange shoelaces. I was going to comment on how he had nice shoes in a sort of mock-sounding tone, but I stopped myself when I realized I was currently wearing a different pair of shoes. I didn't want to actually sound condescending, but I hoped making such a comment would immediately lead to realizing we have the same pair of shoes.
I'd never noticed someone else wearing a pair of shoes I own. It felt like a missed opportunity. Maybe another time...
Programmer. Gamer. Writer.
54 72 65 76 6F 72 4A 6F 68 6E 73 6F 6E
02 June 2017
29 October 2016
Open World Woes
You know, I'm really not a fan of this whole open world thing. This by no means is as simple as "I hate this sub-genre just because," yet this following spiel is going to amount to largely an opinion piece.
Size vs. Interaction
If we compare the Ubisoft or GTA/GTA clone games with Bethesda open world games, there's a bit of a difference with the depth of the world we can explore and how we can interact with it.
Let's take Assassin's Creed or a GTA-like -- say Saints Row. Here, we have a large world that is purely aesthetic, with zero interaction outside of "points of interest" which are few and far between. Everything else is fluff. We can see an endless amount of NPCs roaming the areas, but generally speaking these are all nobody characters. Any important NPC to plot exists in an alternate reality until you're in an active plot section.
Bethesda games, the fluff is there but is different. A large amount of NPCs can be interacted with outside of quests and most every item is now likewise able to be picked up. Except most of the items are fluff. I feel as though this detracts from the importance of items that aren't quest items and makes it less appealing to explore new areas. Oh look, it's another random house I can enter -- right, it's just filled with paper, produce, and other miscellaneous items every other house has. I guess I'll wait to explore until a quest wants me to go there.
On both accounts, I feel as though I'm a slave to the maps in every open world game. I don't want to explore a world of fluff to find the content with actual substance. I want to find the points of interest and have the game tell me what it is I should be doing to have fun.
"Fluff"?
When I'm saying fluff, I'm referring to something that isn't enhancing the game in any way that's meaningful to gameplay. Yes, you can make a game where the distance between a quest's end to the next quest's beginning is a 20-hour trek through an empty wilderness, but you've just exceeded the definition of padding gameplay to an absurd degree. Even if the world is beautiful to explore, who exactly is this game supposed to be marketed to if there's very little to interact with in this world?
My interaction with an open world game always seems too shallow if I'm actually trying to explore. There may be 10,000 hidden collectibles in the world, but behind every back alley or rooftop with a collectible are countless more with nothing. And the collectathon portions usually amount to just getting an achievement or an item you get so late in the game that it's not even helpful for the actual plot of the game. It makes collectibles feel like a completionist's goal that otherwise has no purpose.
Looking Up
This isn't to say there's no hope of an open world game actually feeling immersive and not just full of "here's a lot of space between actual content." I also don't know that the feelings of others as a whole suggest my vision of a good open world game is what people want -- at least, I haven't seen this as a big talking point of disappointment for others. Ok, maybe that's rude. It's not that it's "not what people want," but developers don't have a reason to improve if the current norm has been seen as passable.
I do enjoy some of these games when I actually play them, but I feel as though I play them differently than intended because I don't enjoy the fluff. I rush between points of interest for the actual gameplay/minigames and plot progression. Everything else I ignore. This also makes me skeptical of games that haven't come out yet that are banking on "open world" being a point of interest.
My biggest skeptical upcoming game is the next Zelda. Boasting the world is huge has deterred my interest. I suspect a world of fluff filled with enemies.
I could keep talking about this for a while, but it's getting late. Maybe a topic to revisit in the future on ideas I'd have for actually improving the genre. For now, I'll just say I do want to be proven wrong. But only time will tell if I'll ever see a game that boasts having a huge world where this means "huge world that isn't just aesthetically huge for the sake of being huge."
13 July 2016
Data, Data, Data
Working on a D&D 5th Edition character creator-type thing in Javascript, and at least in the initial phase it's difficult to visualize progress from the webpage itself. As implied by the previous blog post, I'm not actually making the page live until more progress is made.
That said, my progress thus far has been on data collection. Lots and lots of data, and there's still more to collect.
Feats Sampler |
Basic Bonuses
There's a common structure I'm working on here for everything, but that sample above shows the gist. If something gives a set-in-stone bonus, such as Alert giving a +5 to Initiative, then the Feats.Alert object will simply have a variable with the name of the thing getting the bonus, and a value equal to that bonus.
Player Choice Bonuses
More complicated things, such as Athlete, have a choice: You choose 1 Ability Score to give one bonus to, and there's a restriction for which Ability Score you can choose.
In this case, parsing Feats.Athlete has a variable AbilityScore1, which tells me the player will get to choose 1 Ability Score to increase. Feats.Athlete.AbilityScore1.Bonus tells me the selected score will be increased by 1, and Feats.Athlete.AbilityScore1.Restriction is an array containing the Ability Scores the player can choose to raise. If something does not have a Restriction variable (such as the Resilient feat), then I'll know the player can choose any score to increase.
Complicated Descriptions
More, um... complicated things, I'm just storing as an array in Anon, like pretty much all of the feats (Feats.Alert.Anon). This is stuff that I won't bother parsing for the moment, other than just to put in an additional information section on the character sheet.
Races
The only other thing of note for data is info on races. It's actually pretty much the same, minus 1 little extra thing about sub-races.
Races["RaceName"] and Races["RaceName"].Sub["SubRace"] |
I'm not really bothering with any flavor text here, either; just the bonuses are good enough. Partly because I don't want to use any of the actual names of places or whatnot if they happen to be there, since that's a copyright no-no, I think.
But things are actually coming along nicely. I have the stat bonuses for the Races. All the feat info is pulled (just from the core). Next I want to pull all the Background bonuses.
Honestly, the only super tough thing I'm suspecting to have difficulties with will be when I get to Classes. My thought process is to tackle each class one at a time, and the structure will probably be based on level bonuses. So a sample Class might look something like:
var Classes = {
Barbarian: {
1: {
(Level 1 Player Choices/Bonuses Here)
},
2: {
(Level 2 Player Choices/Bonuses Here)
},
(You get the idea)
},
(Other classes)
}
Onward and upward. Progress is slow, but it's still being made. Whee!
26 June 2016
Beginning Website Updates
I've had a personal website for a while now, but I haven't really done much with it -- mostly just placeholder pages for where I'd eventually put projects. But that's not much drive to get any actual content.
I think the main thing holding me back was just layout and design that I'd never been too happy with. I knew some tricks, but unless I was working with a design team on the job then I didn't feel capable of doing those sorts of things myself.
Important Side Note!
Trevor has a new job! (well, new as of three weeks ago. I don't want to make promises, but I should be updating this blog more recently) It's primarily front-end web development, and it's a very different atmosphere than I've been used to. It's also my first experience with Responsive web design, so styles changing as the browser window shrinks. They aren't using things like bootstrap, either -- it's just straight css @media queries.
Anyway, that was allowing me to pick up on new concepts really quickly and really boost my confidence with wanting to build up my personal website again.
Redesign
Hey, it's blog posts from here! |
Since I don't really have images to put on my blog, I'm trying to keep with a 'simple is better' approach now. Just a few different styles for the text and only a few colors. Blue is probably overdone (Facebook, Twitter... probably others), but it's my favorite.
Also, instead of placeholder pages, I'm just showing the pages that are functional. In the future, this won't necessarily mean 'functionally complete,' but it means there will have to be more than 'this page will contain something in the future' to be visible.
Honestly really liking it so far, though I'll want to be updating the navigation soon -- it's the only thing I'm iffy about. Plus, it's not really scale-able.
Front-End Sample
Pretty tiny and clean |
The homepage is laid out the same, except it's just a title and a few paragraph blocks. I just have a header file that I can inject into the page, so I don't need to duplicate any of the code appearing across multiple pages. The div 'blog-entries' is just a placeholder div for the javascript logic, so it has a place to add the blog entries pulled.
Back-End Sample
blog.js contents |
And there we go. When the page initializes, this tiny function just makes an ajax request to a feed service. I'm just getting back some basic RSS data from my blog here -- it doesn't really even include sample text (though I'm sure this is possible if I tweak the RSS settings or something -- the properties are there in the return, but they just didn't have any data in them).
No big problem, though. I loop through the results and add a link to each blog post on the page -- including the title of the post and the published date. Since it's RSS, the results are in order from latest to earliest. At least for now, I'm also only pulling the latest 10 entries, which is just fine.
To the Future!
I have a few different ideas floating around for what I'd like to add to my website. The next project is a bit daunting, so it may take a bit of time before it appears live, but I'll be trying to tackle some blog posts as the process moves forward.
And so it begins... |
17 May 2015
Quick Thoughts on RNG - Part I
My desktop has been out of commission (or at least making unusual noises that spawn distrust in its use), so I've wanted to tackle some smaller logical problems on my laptop while I await replacement parts. One of my serious side projects involves a portion with randomly-generated content. It's something I haven't actually gotten around to yet more out of RNG reluctance than lack of time.
The Thought on My Mind
"Does the default "Random" behavior of a language such as C# give enough random for use in a game engine?"
Honestly, this is more ingrained as a "problem" from looking into the concept of random, and how we can only simulate random. My first assessment is really just to see how "Random" the default C# RNG is.
Quick Sample
So I created a program to enter a max number (so 6 would give a random number between 1-6) and the number of times to roll a random number. If I just output the results, they don't always look that promising:
Max number: 10. Rolled 100 times. |
Look at that cluster of 10s! If I were actually rolling a d10, that would seem pretty unusual.
On the Other Hand...
Now if I output both the Individual Results and Distribution of those results, it looks a bit different:
Much better when you can see Distribution. |
Ignore the 6 milliseconds taken -- I was curious to see if it would take any time to generate more random numbers, but it seems the only reason it adds time is outputting the results.
In Closing
I suppose it's difficult to tell on a quick pass whether the default RNG is useful. Depending on what, specifically, you're using it for, then sure. The distribution in the long run is actually not terrible. It's just in a short window of time where it doesn't look so good.
For practical purposes, you'll probably be using a RNG with weighted results rather than a straight 1-to-1 distribution (if you're calculating loot in a game, for instance, then a "Common" drop would ideally count for 50%+ of the total possible random numbers rolled). That could have more of an impact on results, but that will also take more thoughts and testing than this quick run-through.
22 September 2014
GRamer Society Episode 2: Behind the Episode
This time around had a lot more programming involved. And I even made 2 games for it. Here's the video:
With Processing, draw is a function reserved to be a loop. I specify 'noLoop' at the end of the draw function so I don't have to handle frame-rate or the fact that it would call draw whenever it can. I use the default mouseReleased function to trigger a change of game state and manually call 'loop' again, so it will trigger a redraw.
Light Switch
For the previous episode, I made my life easier by rushing with C# .NET. This time around, I chose Processing. It's a language wrapped around Java that makes it easy to do visual things. The only trick to this "game" was with the images -- I used Photoshop to create a 'switchOn_img' and 'switchOff_img.'
The meat of the game |
Deathsweeper
What can I say about Deathsweeper? It's a bit more complicated than its predecessor. I actually spent most of a Friday night and Saturday morning programming this one. There are 3 game states -- I called them TILE, REVEAL, and GAMEOVER. I treat the draw and mouseReleased functions differently based on which state it's in.
TILE draw function -- all of the squares! |
Yes, yes -- absolute positioning and all. Bite me for bad practices.
TILE mouseReleased function - which tile did you click? |
That's... awkward-looking, isn't it? Loop through the x-coordinates of the squares and compare with the mouseX position. If it's within range, do the same for the y-coordinates.
REVEAL draw function -- should be straightforward |
revealedFile is the name of the text file that has the scenario's text (without the extension).
revealedText is the scenario's text (the content within the text file).
goodResult is my boolean for whether it was a good or bad result.
revealedText is the scenario's text (the content within the text file).
goodResult is my boolean for whether it was a good or bad result.
REVEAL mouseReleased function - state is success or fail |
The REVEAL state's mouseReleased event only moves back to the TILE state or forward to GAMEOVER.
GAMEOVER mouseReleased - Exit or re-initialize the game! |
The GAMEOVER draw function should be pretty self-explanatory -- just text and a rectangle. The mouseReleased checks if you click in the rectangle to exit, or it starts the game over.
Now, the tricky part of the game was loading the success/failure states.
Find all the files! |
I find all the files within the failures/successes folders and pull their file names. Then, each tile will be either a success or failure. What a tile is gets loaded as part of the initialize step:
Randomize good/bad, and choose a random good/bad result in getRandomFile |
When the state gets changed to REVEAL, that's when the content of a success/failure is loaded:
Pull the text from that file for the REVEAL draw function |
That's... just about it. I'd also made my own Tile class to store whether a tile is a good/bad result, the file name of it's revealed scenario, and whether the tile has already been revealed.
My main regret here? That Processing doesn't do Enums. It felt cheap to use a String to store the current game state -- technically could have stored it as a number, but I'm not yet at a stage where performance is an issue.
The logic for making the scenarios dynamic was actually quite fun. All things considered, it's interesting to think that I created 16 scenarios for the game when the video showcased very little.
GRamer Society Episode 1: Behind the Episode
So I began a silly YouTube project. I'm making ridiculous/stupid games and pretending to submit them to a fictional society. Because my fictional persona wants to join the elite of the game designers. Here's the first episode:
I was able to whip out the code for "Live or Die?" in just a few minutes. It may be a little simplistic, but for this project it may be a good thing.
Straightforward and simple. I'd enjoy getting into much more complex games, but for the sake of free time it's more difficult. And this way I can play advancement off as character development until these warm-up games help boost my confidence for more complex ideas.
I was able to whip out the code for "Live or Die?" in just a few minutes. It may be a little simplistic, but for this project it may be a good thing.
The meat of the program |
Subscribe to:
Posts (Atom)