• Advertisement

# Blogs

## Featured Entries

• ### Components and Messages in Unity

By nbrosz

Up to now, I have had a tendency toward monolithic classes when developing in Unity. My experience has always been with the typical object-oriented approach (with the exception of when I was developing using batari Basic), but I’ve been trying to train myself toward small, reusable components with focused purposes. I’ve had some good success lately, breaking larger scripts into smaller ones and using interfaces as a means of communicating between components where possible. public class ReportAttack : MonoBehaviour, IDamageable { public Team team; void Start () { team = GetComponent<Team>(); } void IDamageable.TakeDamage(MonoBehaviour from, DamageType type, float amount) { var attackerTeam = from.GetComponent<Team>(); if (team && attackerTeam && team.team != attackerTeam.team) Debug.Log(gameObject.name + " says: I've Been Attacked by " + from.gameObject + " on team " + (attackerTeam ? attackerTeam.team.ToString() : "no team") + " with " + System.Enum.GetName(typeof(DamageType), (DamageType)((int)type << 1)) + " (" + (int)type + ")"); } } While I’ve been fairly satisfied with the use of interfaces for calls to multiple or unknown components, I recall fondly the rapid development and flexible approach provided by utilizing messages in my 2017 Global Game Jam submission, Metalmancer. However, since Unity’s message passing uses reflection (or at least probably does, given that it takes the string name of the event to call), it does not perform particularly well. With that in mind, I hoped to make my own, alternative messaging system which is used much like the existing messaging system, but uses delegates and event handlers under the hood. This was the result. While I felt that I succeeded in my goal of providing a useful interface that hid the reflection-based old messaging system, I was crestfallen once I began running tests. On average, I see a performance increase of about 33% over Unity’s built in SendMessage, with the complication that all components using the new system must inherit from the new MessagingBehavior abstract class, rather than directly from MonoBehavior. Still, given that a direct call (as would be the case using an interface) is still about ten times faster, I wasn’t particularly encouraged by these results. On the other hand, as tomvds said in the Unity forums: Still, stubborn as I am, it’ll be hard to convince myself to use even my own message passing architecture in lieu of more efficient interfaces. Or maybe I should just use an adaptation of wmiller’s Events system. Or I should just stop worrying about it.
View the full article
• 1 comment
• 511 views
• ### Games Look Bad, Part 1: HDR and Tone Mapping

By Promit

This is Part 1 of a series examining techniques used in game graphics and how those techniques fail to deliver a visually appealing end result. See Part 0 for a more thorough explanation of the idea behind it. High dynamic range. First experienced by most consumers in late 2005, with Valve’s Half Life 2: Lost Coast demo. Largely faked at the time due to technical limitations, but it laid the groundwork for something we take for granted in nearly every blockbuster title. The contemporaneous reviews were nothing short of gushing. We’ve been busy making a complete god awful mess of it ever since. Let’s review, very quickly. In the real world, the total contrast ratio between the brightest highlights and darkest shadows during a sunny day is on the order of 1,000,000:1. We would need 20 bits of just luminance to represent those illumination ranges, before even including color in the mix. A typical DSLR can record 12-14 bits (16,000:1 in ideal conditions). A typical screen can show 8 (curved to 600:1 or so). Your eyes… well, it’s complicated. Wikipedia claims 6.5 (100:1) static. Others disagree. Graphics programmers came up with HDR and tone mapping to solve the problem. Both film and digital cameras have this same issue, after all. They have to take enormous contrast ratios at the input, and generate sensible images at the output. So we use HDR to store the giant range for lighting computations, and tone maps to collapse the range to screen. The tone map acts as our virtual “film”, and our virtual camera is loaded with virtual film to make our virtual image. Oh, and we also throw in some eye-related effects that make no sense in cameras and don’t appear in film for good measure. Of course we do. And now, let’s marvel in the ways it goes spectacularly wrong. In order: Battlefield 1, Uncharted: Lost Legacy, Call of Duty: Infinite Warfare, and Horizon Zero Dawn. HZD is a particular offender in the “terrible tone map” category and it’s one I could point to all day long. And so we run head first into the problem that plagues games today and will drive this series throughout: at first glance, these are all very pretty 2017 games and there is nothing obviously wrong with the screenshots. But all of them feel videogamey and none of them would pass for a film or a photograph. Or even a reasonably good offline render. Or a painting. They are instantly recognizable as video games, because only video games try to pass off these trashy contrast curves as aesthetically pleasing. These images look like a kid was playing around in Photoshop and maxed the Contrast slider. Or maybe that kid was just dragging the Curves control around at random. The funny thing is, this actually has happened to movies before. Hahaha. Look at that Smaug. He looks terrible. Not terrifying. This could be an in-game screenshot any day. Is it easy to pick on Peter Jackson’s The Hobbit? Yes, it absolutely is. But I think it serves to highlight that while technical limitations are something we absolutely struggle with in games, there is a fundamental artistic component here that is actually not that easy to get right even for film industry professionals with nearly unlimited budgets. Allow me an aside here into the world of film production. In 2006, the founder of Oakley sunglasses decided the movie world was disingenuous in their claims of what digital cameras could and could not do, and set out to produce a new class of cinema camera with higher resolution, higher dynamic range, higher everything than the industry had and would exceed the technical capabilities of film in every regard. The RED One 4K was born, largely accomplishing its stated goals and being adopted almost immediately by one Peter Jackson. Meanwhile, a cine supply company founded in 1917 called Arri decided they don’t give a damn about resolution, and shipped the 2K Arri Alexa camera in 2010. How did it go? 2015 Oscars: Four of the five nominees in the cinematography category were photographed using the ARRI Alexa. Happy belated 100th birthday, Arri. So what gives? Well, in the days of film there was a lot of energy expended on developing the look of a particular film stock. It’s not just chemistry; color science and artistic qualities played heavily into designing film stocks, and good directors/cinematographers would (and still do) choose particular films to get the right feel for their productions. RED focused on exceeding the technical capabilities of film, leaving the actual color rendering largely in the hands of the studio. But Arri? Arri focused on achieving the distinctive feel and visual appeal of high quality films. They better understood that even in the big budget world of motion pictures, color rendering and luminance curves are extraordinarily difficult to nail. They perfected that piece of the puzzle and it paid off for them. Let’s bring it back to games. The reality is, the tone maps we use in games are janky, partly due to technical limitations. We’re limited to a 1D luminance response where real film produces both hue and saturation shifts. The RGB color space is a bad choice to be doing this in the first place. And because nobody in the game industry has an understanding of film chemistry, we’ve all largely settled on blindly using the same function that somebody somewhere came up with. It was Reinhard in years past, then it was Hable, now it’s ACES RRT. And it’s stop #1 on the train of Why does every game this year look exactly the goddamn same? The craziest part is we’re now at the point of real HDR televisions showing game renders with wider input ranges. Take this NVIDIA article which sees the real problem and walks right past it. The ACES tone map is destructive to chroma. Then they post a Nikon DSLR photo of a TV in HDR mode as a proxy for how much true HDR improves the viewing experience. Which is absolutely true – but then why does the LDR photo of your TV look so much better than the LDR tone map image? There’s another tone map in this chain which nobody thought to examine: Nikon’s. They have decades of expertise in doing this. Lo and behold, their curve makes a mockery of the ACES curve used in the reference render. Wanna know why that is? It’s because the ACES RRT was never designed to be an output curve in the first place. Its primary design goal is to massage differences between cameras and lenses used in set so they match better. You’re not supposed to send it to screen! It’s a preview/baseline curve which is supposed to receive a film LUT and color grading over top of it. “Oh, but real games do use a post process LUT color grade!” Yeah, and we screwed that up too. We don’t have the technical capability to run real film industry LUTs in the correct color spaces, we don’t have good tools to tune ours, they’re stuck doing double duty for both “filmic look” as well as color grading, the person doing it doesn’t have the training background, and it’s extraordinary what an actual trained human can do after the fact to fix these garbage colors. Is he cheating by doing per-shot color tuning that a dynamic scene can’t possibly accomplish? Yes, obviously. But are you really going to tell me that any of these scenes from any of these games look like they are well balanced in color, contrast, and overall feel? Of course while we’re all running left, Nintendo has always had a fascinating habit of running right. I can show any number of their games for this, but Zelda: Breath of the Wild probably exemplifies it best when it comes to HDR.  No HDR. No tone map. The bloom and volumetrics are being done entirely in LDR space. (Or possibly in 10 bit. Not sure.) Because in Nintendo’s eyes, if you can’t control the final outputs of the tone mapped render in the first place, why bother? There’s none of that awful heavy handed contrast. No crushed blacks. No randomly saturated whites in the sunset, and saturation overall stays where it belongs across the luminance range. The game doesn’t do that dynamic exposure adjustment effect that nobody actually likes. Does stylized rendering help? Sure. But you know what? Somebody would paint this. It’s artistic. It’s aesthetically pleasing. It’s balanced in its transition from light to dark tones, and the over-brightness is used tastefully without annihilating half the sky in the process. Now I don’t think that everybody should walk away from HDR entirely. (Probably.) There’s too much other stuff we’ve committed to which requires it. But for god’s sake, we need to fix our tone maps. We need to find curves that are not so aggressively desaturating. We need curves that transition contrast better from crushed blacks to mid-tones to blown highlights. LUTs are garbage in, garbage out and they cannot be used to fix bad tone maps. We also need to switch to industry standard tools for authoring and using LUTs, so that artists have better control over what’s going on and can verify those LUTs outside of the rendering engine. In the meantime, the industry’s heavy hitters are just going to keep releasing this kind of over-contrasty garbage. Before I finish up, I do want to take a moment to highlight some games that I think actually handle HDR very well. First up is Resident Evil 7, which benefits from a heavily stylized look that over-emphasizes contrast by design. That’s far too much contrast for any normal image, but because we’re dealing with a horror game it’s effective in giving the whole thing an unsettling feel that fits the setting wonderfully. The player should be uncomfortable with how the light and shadows collide. This particular scene places the jarring transition right in your face, and it’s powerful. Next, at risk of seeming hypocritical I’m going to say Deus Ex: Mankind Divided (as well as its predecessor). The big caveat with DX is that some scenes work really well. The daytime outdoors scenes do not. The night time or indoor scenes that fully embrace the surrealistic feeling of the world, though, are just fantastic. Somehow the weird mix of harsh blacks and glowing highlights serves to reinforce the differences between the bright and dark spots that the game is playing with thematically throughout. It’s not a coincidence that Blade Runner 2049 has many similarities. Still too much contrast though. Lastly, I’m going to give props to Forza Horizon 3.   Let’s be honest: cars are “easy mode” for HDR. They love it. But there is a specific reason this image works so well. It is low contrast. Nearly all of it lives in the mid-tones, with only a few places wandering into deep shadow (notably the trees) and almost nothing in the bright highlights. But the image is low contrast because cars themselves tend to use a lot of black accents and dark regions which are simply not visible when you crush the blacks as we’ve seen in other games. Thus the toe section of the curve is lifted much more than we normally see. Similarly, overblown highlights mean whiting out the car in the specular reflections, which are big and pretty much always image based lighting for cars. It does no good to lose all of that detail, but the entire scene benefits from the requisite decrease in contrast. The exposure level is also noticeably lower, which actually leaves room for better mid-tone saturation. (This is also a trick used by Canon cameras, whose images you see every single day.) The whole image ends up with a much softer and more pleasant look that doesn’t carry the inherent stress we find in the images I criticized at the top. If we’re looking for an exemplar for how to HDR correctly in a non-stylized context, this is the model to go by. Where does all this leave us? With a bunch of terrible looking games, mostly. There are a few technical changes we need to make right up front, from basic decreases in contrast to simple tweaks to the tone map to improved tools for LUT authoring. But as the Zelda and Forza screenshots demonstrate, and as the Hobbit screenshot warns us, this is not just a technical problem. Bad aesthetic choices are being made in the output stages of the engine that are then forced on the rest of the creative process. Engine devs are telling art directors that their choices in tone maps are one of three and two are legacy options. Is it bad art direction or bad graphics engineering? It’s both, and I suspect both departments are blaming the other for it. The tone map may be at the end of graphics pipeline, but in film production it’s the first choice you make. You can’t make a movie without loading film stock in the camera, and you only get to make that choice once (digital notwithstanding). Don’t treat your tone map as something to tweak around the edges when balancing the final output LUT. Don’t just take someone else’s conveniently packaged function. The tone map’s role exists at the beginning of the visual development process and it should be treated as part of the foundation for how the game will look and feel. Pay attention to the aesthetics and visual quality of the map upfront. In today’s games these qualities are an afterthought, and it shows. UPDATE: User “vinistois” on HackerNews shared a screenshot from GTA 5 and I looked up a few others. It’s very nicely done tone mapping. Good use of mid-tones and contrast throughout with great transitions into both extremes. You won’t quite mistake it for film, I don’t think, but it’s excellent for something that is barely even a current gen product. This is proof that we can do much better from an aesthetic perspective within current technical and stylistic constraints. Heck, this screenshot isn’t even from a PC – it’s the PS4 version.

View the full article
• 0 comments
• 972 views
• ### Day 33 of 100 Days of VR: Implementing the High Score System

By Josh Chang

Side Note: I've been feeling sick recently and progress have been slow, but I'm feeling better and ready to get back to it! Welcome back to day 33! Yesterday, we looked at 3 ways we can save and load data in Unity: with PlayerPrefs, Data Serialization, and saving our data to a server. Today we’re going to use what we learned the previous day to save our score in our simple FPS. Here’s the goal for today: Implement our SaveManager to help us save score Update our UI to show our high score when the game is over So, let’s get started! Step 1: Saving our Data Of the methods we’ve talked about, I’m going to use the PlayerPrefs to help us save our data. While we can technically use our PlayerPrefs anywhere we want between our scripts, it’s better for us to create a manager where we will centralize everything all our Saving/Loading work so that when we need to make changes, we don’t have to comb through all our Script to fix things. Step 1.1: Creating our SaveManager The first step to saving our score is to create our ScoreManager script and attach it to our GameManager game object. Select our GameManager game object in our hierarchy. In the Inspector, click Add Component and create a new ScoreManager In our SaveManager, we want to be able to save and load our high score. Here’s what we’ll have: using UnityEngine; public class SaveManager : MonoBehaviour { private string _highScoreKey = "highscore"; public void SaveHighScore(float score) { PlayerPrefs.SetFloat(_highScoreKey, score); } public float LoadHighScore() { if (PlayerPrefs.HasKey(_highScoreKey)) { return PlayerPrefs.GetFloat(_highScoreKey); } return 99999999999; } } Variables Used For our SaveManager, we only create a string _highScoreKey that we use to store the text that we want to use for our score. We never want to manually type our key in as that might lead to us mistyping and many hours spent debugging over a single spelling mistake. Walking Through the Code Our SaveManager script is only used to help us access our PlayerPrefs in one centralized location. The beauty of this system is that if one day we decide that we don’t want to use PlayerPrefs and use DataSerialization instead, we can just change SaveManager, but everything else that’s using it can stay the same. Here’s the code flow: In SaveHighScore() we save the score that we’re given to our high score. In LoadHighScore() we return the high score that we saved. It’s important to note that if we don’t have a value in our Prefab, we would return 0, however, in our case, a lower score is better, instead we return a very high score. Step 1.2: Modifying our ScoreManager to Expose Our Score Previously, we had our ScoreManager change the text of the score in our page, however, if we want to be able to show our high score at the end of the game. To do that, we need to use the Victory and GameOver panels that we made in the past. Luckily for us, in our GameManager, we already have some code that uses them. Now, for our GameManager to access our time (and save it with our SaveManager), we need to expose the score for other scripts to access them. Here are our changes to ScoreManager: using System; using UnityEngine; using UnityEngine.UI; public class ScoreManager : MonoBehaviour { public Text Score; private string _time; private bool _gameOver; private float _score; void Start () { _time = ""; _gameOver = false; _score = 9999999999; } void Update() { if (!_gameOver) { UpdateTime(); } } private void UpdateTime() { _score = Time.time; _time = ScoreManager.GetScoreFormatting(Time.time); Score.text = _time; } public void GameOver() { _gameOver = true; } public float GetScore() { return _score; } // we can call this function anywhere we want, we don't need to have an instance of this class public static string GetScoreFormatting(float time) { int minutes = Mathf.FloorToInt(time / 60); int seconds = Mathf.FloorToInt(time % 60); float miliseconds = time * 100; miliseconds = miliseconds % 100; return string.Format("{0:0}:{1:00}:{2:00}", minutes, seconds, miliseconds); } }  New Variables Used We create a new float _score that we’ll use to keep track of the time that passed for the player. Walking Through the Code Most of the code is the same. We just wrote some new functions, here’s what we did: In Start() we set _score to have a starting value In UpdateTime() we update _score to be the current time in the game. I also moved the code that gave us the time in a nice: minutes:seconds:milliseconds format to a static function called GetScoreFormatting() where we used to set our _time. Notice how I use GetScoreFormatting()? GetScoreFormatting() can be used just like this anywhere else in our game now, even if we don’t have an instance to ScoreManager. GetScoreFormatting() is just a copy and paste of what we originally had in UpdateTime(). Finally, we create a public function GetScore() to get the score the player earned in GameManager when they win That’s it! Now let’s combine everything we’ve worked on to create our high score system. Step 1.3: Use Everything in Our GameManager Now that we have everything we want, let’s use it in our GameManager script! Now we’re going to write some code that allows us to save our when the player wins. Here’s what we’ll have: using UnityEngine; public class GameManager : MonoBehaviour { public Animator GameOverAnimator; public Animator VictoryAnimator; private GameObject _player; private SpawnManager _spawnManager; private ScoreManager _scoreManager; private SaveManager _saveManager; void Start() { _player = GameObject.FindGameObjectWithTag("Player"); _spawnManager = GetComponentInChildren<SpawnManager>(); _scoreManager = GetComponent<ScoreManager>(); _saveManager = GetComponent<SaveManager>(); } public void GameOver() { GameOverAnimator.SetBool("IsGameOver", true); DisableGame(); _spawnManager.DisableAllEnemies(); } public void Victory() { VictoryAnimator.SetBool("IsGameOver", true); DisableGame(); if (_scoreManager.GetScore() < _saveManager.LoadHighScore()) { _saveManager.SaveHighScore(_scoreManager.GetScore()); } } private void DisableGame() { _player.GetComponent<PlayerController>().enabled = false; _player.GetComponentInChildren<MouseCameraContoller>().enabled = false; PlayerShootingController shootingController = _player.GetComponentInChildren<PlayerShootingController>(); shootingController.GameOver(); shootingController.enabled = false; Cursor.lockState = CursorLockMode.None; _scoreManager.GameOver(); } } New Variables Used The first thing we did was we got ourselves an instance of SaveManager: _saveManager. Now with our SaveManager in GameManager, we can save and load scores. Walking Through the Changes The code that we’re adding uses our SaveManager to save our score. In Start() we instantiate our SaveManager which is also attached to the GameManager game object. When Victory() is called, we check their current score and then compare it with our high score from our SaveManager if our time is lower than the high score, than we set our score as the new high score With our changes to the GameManager, we now have a working high score system. Now the problem? We have no way of seeing if any of this works! Worry not, that’s going to be the next step of our work! Step 2: Update the Game Over Panels to Show Our Score Now that we have the code to change our high score, we’re going to work on displaying our high score in our UI. To do this, we’re going to make a couple of changes to our script, we’re going to: Change our GameOverUIManager to change the Text that we show. Change our GameManager to get our GameOverUIManager from our game over panels and then set the high score to show when the game is over. Step 2.1: Making Changes to GameOverUIManager If you recall, our GameOverUIManager was created to help us detect when the player clicks on the start over a button in our panel. We’re going to make some changes to change the text in our Panel to also say what our high score is. Let’s get to it! Here are the changes that were made: using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class GameOverUIManager : MonoBehaviour { private Button _button; private Text _text; void Start () { _button = GetComponentInChildren<Button>(); _button.onClick.AddListener(ClickPlayAgain); _text = GetComponentInChildren<Text>(); } public void ClickPlayAgain() { SceneManager.LoadScene("Main"); } public void SetHighScoreText(string score, bool didWin) { print(_text.text); if (didWin) { _text.text = "You Win! \n" + "High Score: " + score; } else { _text.text = "Game Over! \n" + "High Score: " + score; } print(_text.text); } } New Variables Used The only new variable that we used is a Text UI that we call _text. Specifically, this is the UI element that we use to tell the player that they won (or lost) the game. Walking Through the Changes The only changes we did was: Instantiate our Text UI in Start(). In the case of our panel, the Text was a child the panel that GameOverUIManager was attached to, so we have to look for the component in our child. Once we have an instance of our text, I created a new SetHighScoreText() that, depending on if we won or loss, change our text to show the high score. One important thing I want to mention. Do you notice the “\n”? \n is an escape character for new line. Which means that in our UI, we’ll see something like: Game Over High Score: 1:21:12 Step 2.2: Calling our GameOverUIManager from GameManager Next up, we want to be able to set the score from our GameOverUIManager from our GameManager. We must make some pretty big changes to our Game Panels that we use. Before we just grabbed the animator component, now, we need that and the GameOverUIManager. Besides that, we just need to call our GameOverUIManager script and set the text with our high score. Here’s what we’ve done: using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { public GameObject GameOverPanel; public GameObject VictoryPanel; private GameObject _player; private SpawnManager _spawnManager; private ScoreManager _scoreManager; private SaveManager _saveManager; void Start() { _player = GameObject.FindGameObjectWithTag("Player"); _spawnManager = GetComponentInChildren<SpawnManager>(); _scoreManager = GetComponent<ScoreManager>(); _saveManager = GetComponent<SaveManager>(); } public void GameOver() { DisableGame(); _spawnManager.DisableAllEnemies(); ShowPanel(GameOverPanel, false); } public void Victory() { DisableGame(); if (_scoreManager.GetScore() < _saveManager.LoadHighScore()) { _saveManager.SaveHighScore(_scoreManager.GetScore()); } ShowPanel(VictoryPanel, true); } private void ShowPanel(GameObject panel, bool didWin) { panel.GetComponent<Animator>().SetBool("IsGameOver", true); panel.GetComponent<GameOverUIManager>().SetHighScoreText(ScoreManager.GetScoreFormatting(_saveManager.LoadHighScore()), didWin); } private void DisableGame() { _player.GetComponent<PlayerController>().enabled = false; _player.GetComponentInChildren<MouseCameraContoller>().enabled = false; PlayerShootingController shootingController = _player.GetComponentInChildren<PlayerShootingController>(); shootingController.GameOver(); shootingController.enabled = false; Cursor.lockState = CursorLockMode.None; _scoreManager.GameOver(); } } New Variables Used The biggest change is with the GameOverPanel and VictoryPanel. Before these were Animators that we used to show our panel, now we have the game objects themselves because we need to access more than just the animator. New Functions Created We created a new function: ShowPanel(), which takes in the GamePanel that we’re changing the text to and whether or not we won the game. From this information, we play our animator and get the GameOverUIManager and call SetHighScoreText() to change the text. Walking Through the Code Here’s how our new code gets used: Whenever the game is over, either the player lost or won, we would call GameOver() and Victory(). From there, we would disable our game and then call our new function ShowPanel() Depending on whether we won or not, we would pass in the correct Panel and state we’re into ShowPanel() Finally, in ShowPanel(), we would play the animation to show our Panel and call setHighScoreText() from our GameOverUIManager to change the text to display our high score. Step 2.3: Attaching our Panels back into GameManager Now with everything in place, we need to add our GameOverPanel and VictoryPanel, because when we changed them, we got rid of any reference to our previous models. Here’s what to do: Select our GameManager game object from the hierarchy. Look for the GameManager script component, drag our Panels (Victory and GameOver) from HUD in our game hierarchy, and put them in the appropriate slots. With that done, we should have something like this: Step 2.4: Fixing our Text UI Display Now with all of this implemented, we can finally play our game! After winning (or losing) in our game, we’ll get our BRAND-NEW panel: New… right? Wrong! It looks the same as what we had! What happened? It turns out, the text is still there, however, we didn’t have enough space in our Text UI to show the remaining text! This problem can be solved easily. We just need to increase the size of our Text UI in our GameOver and Victory Panel in our hierarchy. The first thing we need to do is reveal our Panels that we hid. In our Panels, find the CanvasGroup component, we previously set our alpha to be 0 to hide our panel. Let’s change that back to 1 so we can see our panel again. Just don’t forget to change it back to 0. In the same Panel, select its child game object, Text. We want to try playing around with the Width and Height field in our Rect Transform component. I ended up with: Width: 300 Height: 80 I also added some new Text for a demo of what to expect. Here’s what we have now: Make sure that you make this change to both our GameOver Panel and our Victory Panel in the hierarchy. Now if we were to play the game, here’s what we’ll have when we win: And when we lose: Don’t ask how I won in 2 seconds. I modified our scripts a bit, okay? Conclusion With all of this, we’re done with day 33! Which means we’re officially 1/3 of the way through the 100 days of VR challenge! Not only that, now that we have this high score system, I’m going to officially call our simple FPS finished! Tomorrow, I’m finally going to start looking more into how to do VR development! Until then, I’ll see you all on day 34! Day 32 | 100 Days of VR | Day 34 Side topic: Choosing a phone and platform to develop VR in Home
• 0 comments
• 475 views
• ### Ludum Dare 40

By Vilem Otte

Since Ludum Dare 35 I'm regularly participating in every one of them and this one wasn't exception. My release thoughts are positive - this time I've again worked with one friend (with whom we've worked also in the past on Ludum Dare), and I enjoyed it a lot. As this is not a post mortem yet, I will not go into details what went right or wrong - meanwhile I'll just show the results and put out few notes... Yes, that's one of the screenshots from the game (without UI). I'm using this one as a "cover" screenshot - so it should also be included here. Anyways this was my another experience with Unity and maybe one of the last Ludum Dare experiences with it. While I do like it, if I can think about suitable game for my own game engine for the theme next time, it's possible that I won't use Unity next time. Ludum Dare Each 4 months or so, this large game jam happens. It's a sort of competition, well... there are no prizes, and I honestly do it just for fun (and to force myself to do some "real" game development from time to time). It takes 48 or 72 hours to create your game (depending on whether you go for compo or jam category), and there are just few basic rules (which you can read on site - https://ldjam.com/). Then for few weeks you play and rate other games, and the more you play, the more people will play and rate your game. While ratings aren't in my opinion that important, you get some feedback through comments. Actually I was wrong about no prizes - you have your game and feedback of other people who participate in Ludum Dare as a prize. Unity... I've used Unity for quite long time - and I have 2 things to complain about this time, majority of all used shaders in Air Pressure (yes, that is the game's name) are actually custom - and I might bump into some of them in post mortem. Unity and custom shaders combination is actually quite a pain, especially compared to my own engine (while it isn't as generic as Unity is - actually my engine is far less complex, and maybe due to that shader editing and workflow is actually a lot more pleasant ... although these are my own subjective feelings, impacted by knowing whole internal structure of my own engine in detail). Second thing is particularly annoying, related to Visual Studio. Unity extension for Visual Studio is broken (although I believe that recent patch that was released during the Ludum Dare fixed it - yet there was no time for update during the work), each time a C# file is created, the project gets broken (Intellisense works weird, Visual Studio reports errors everywhere, etc.), the only work around was to delete the project files (solution and vcxproj) and re-open Visual Studio from Unity (which re-created solution and vcxproj file). Unity! On the other hand, it was good for the task - we finished it using Unity, and it was fun. Apart from Visual Studio struggles, we didn't hit any other problem (and it crashed on us just once - during whole 72 hours for jam - once for both of us). So I'm actually quite looking forward to using it next time for some project. Anyways, I did enjoy it this time a lot, time to get back into work (not really game development related). Oh, and before I forget, here they are - first gameplay video and link to the game on Ludum Dare site: https://ldjam.com/events/ludum-dare/40/air-pressure PS: And yes I've been actually tweeting progress during the jam, which ended up in a feeling, that I've probably surpassed number of Tweets generated by Donald Trump in past 3 days.
• 0 comments
• 740 views
• ### GameDev Challenges - January 2018 (Missile Command)

By GoliathForge

This challenge was a good run because of Implementing coroutine with IEnumerator and yield return Simple Dictionary based texture manager Basic Particle Engine Ripped GameStateMachine from previous monogame project (joust) had fun making flare particles Did I mention, it's not cool unless it has lightning bolts browsed current scifi google images...nice...inspired. Source : MarkK_LightningCommand.zip
• 5 comments
• 688 views

## Our community blogs

• 27
entries
• 53
comments
• 17597
views

#### Recent Entries

Latest Entry

Three weeks have passed, a few new people have installed the game. I had the chance to deploy the game also to juniors x86 tablet, where it currently crashes. The tablet does have a gyro sensor, which I thought worked fine when using it on Windows Phone, but apparently the code isn't crash proof enough.

I've been looking mostly for crashes now, and a handful (well, two in the last 3 days) did appear. The crash info is all over the place. Some have a really great stack trace, other nothing. Some seem to be in between. I reckon this is heavily affected by fiddling with telemetry settings.

What I'm also missing on a first glance is the configuration of the crashed app. Since the compile builds executables for x86, x64 and ARM it'd be nice to know which of these were the cause. What's always there is the name, IP, Windows build version and device type of the device that was running the game.

While the stack traces sometimes help they are only that. You don't get a full dump or local watch info. So you can get lucky and the location of the problem is clear, or you're out of luck. In these last two crashes the stack traces hints on a null pointer on a method that is used throughout the game (GUI displaying a texture section). I suspect that it happens during startup and the code path went inside a function when it wasn't ready. In these cases I can only add a safety check and cleanly jump out of the function. Build, upload, re-certify and next try in 1 to 3 days.

Currently I'm struggling getting remote debugging done on the tablet. I can deploy the app via enabled web portal, but the remote debugger is not properly recognized by Visual Studio. I was hoping for USB debugging as that works nicely on the phone, but had no luck with it.

Well, here's to the next version hoping to get those crashes fixed!

• 1
entry
• 0
comments
• 38
views

#### Recent Entries

Latest Entry

Here goes my game.

This challenge is sooooo convenient to me for I have no ability of drawing... :(

By finishing it I learned lots of Cocos Creator, which is good at UI effects.

Thanks a lot for the Challenge!

Download (Windows only):

Source code:

Screenshot:

Spoiler

title

gameplay

• 2
entries
• 0
comments
• 80
views

#### Recent Entries

Latest Entry

For QLMesh (and some other projects), I am running my own fork of Asset Import Library.  The difference: it is amalgamated build - all sources are merged into one file (including dependencies). Since Assimp recently switched to miniz, I have replaced remaining references to zlib with miniz - so zlib is not required too.

drwxr-xr-x  85 piecuchp  staff     2890 Jan 17 23:34 assimp
-rw-r--r--   1 piecuchp  staff  4921627 Jan 17 23:34 assimp.cpp
-rw-r--r--   1 piecuchp  staff  2893785 Jan 17 23:34 private\assimp.h

Everything you need to buid the assimp is:

g++ -c -std=c++11 code-portable/assimp.cpp


or just add assimp.cpp to your project/IDE (you can find code-portable directory in my repo.

One disclaimer: I have only tested this amalgamation under OSX with QLMesh). Main reason for this amalgamation is that it makes compilation/recompilation on different platforms with different configurations rather easier.

Side-effect is that single-file assimp.cpp compiles really fast (like 10x faster on my MacBook).

• 1
entry
• 7
comments
• 40
views

#### Recent Entries

Latest Entry

I have released my first free prototype!

How terrifying!

It is strange that I have been working to the moment of releasing something to the public for all of my adult life, and now I have I find it pretty scary.

I have been a developer now for over 20 years and in that time I have released a grand total of 0 products.

The Engine

The engine is designed to be flexible with its components, but so far it uses

Opengl, OpenAL, Python (scripting), CG, everything else is built in

The Games

When I started developing a game I had a pretty grand vision, a 3D exploration game. It was called Cavian, image attached. and yep it was far to complex for my first release. Maybe I will go back to it one day.

I took a year off after that, I had to sell most of my stuff anyway as not releasing games isn't great for your financial situation.

THE RELEASE

When I came back I was determined to actually release something! I lowered my sights to a car game, it is basically finished but unfortunately my laptop is too old to handle the deferred lighting (Thinkpad x220 intel graphics)  so I can't test it really, going to wait until I can afford a better computer before releasing it.

Still determined to release something I decided to focus more on the gameplay than graphics.

# Is This A Game?

Now I have created an Experimental prototype. Its released and everything: https://yesindiedee.itch.io/is-this-a-game

So far I don't know if it even runs on another computer. Any feedback would be greatly appreciated!

If you have any questions about any process in the creation of this game design - coding - scripting - graphics - deployment just ask, I will try to make a post on it.

Have a nice day, I have been lurking on here for ages but never really said anything.....

# I like my cave

• 2
entries
• 0
comments
• 110
views

#### Recent Entries

Latest Entry

Last week we made a draft design document to visualize the global structure of the game.

Because the levels are linear with a lot of verticality and the camera free, we are trying to find a good solution for the boundaries. Of course it will be heavily filled with environments deco but we want don't want to spend a lot of time making sure there are no holes! And we don't want invisible walls which are not obvious. So I tried with a depth-faded (using depth fade for the intersection between the wall and the other objects, and a camera depth fade) magic wall like this:

Now the chantilly path automatically conform to the ground:

As much as possible we try to save time by creating tools like this:

• 20
entries
• 58
comments
• 36651
views

#### Recent Entries

Latest Entry

This will be a short technical one for anyone else facing the same problem. I can't pretend to have a clue what I was doing here, only the procedure I followed in the hope it will help others, I found little information online on this subject.

I am writing an Android game and want to put in gamepad support, for analogue controllers. This had proved incredibly difficult, because the Android Studio emulator has no built in support for trying out gamepad functionality. So I had bought a Tronsmart Mars G02 wireless gamepad (comes with a usb wireless dongle). It also supports bluetooth.

The problem I faced was that the gamepad worked fine on my Android tv box device, but wasn't working under Linux Mint, let alone in the emulator, and wasn't working via bluetooth on my tablet and phone. I needed it working in the emulator ideally to be able to debug (as the Android tv box was too far).

Here is how I solved it, for anyone else facing the same problem. Firstly the problem of getting the gamepad working and seen under linux, and then the separate problem of getting it seen under the Android emulator (this may work under Windows too).

## Under Linux

Unfortunately I couldn't get the bluetooth working as I didn't have up to date bluetooth, and none of my devices were seeing the gamepad. I plugged in the usb wireless dongle but no joy.

It turns out the way to find out what is going on with usb devices is to use the command:

lsusb

This gives a list of devices attached, along with a vendor id and device id (takes the form 20bc:5500).

It was identifying my dongle as an Xbox 360 controller. Yay! That was something at least, so I installed an xbox 360 gamepad driver by using:

sudo apt-get install xboxdrv

sudo xboxdrv --detach-kernel-driver

It still didn't seem to do anything, but I needed to test whether it worked so I installed a joystick test app, 'jstest-gtk' using apt-get.

The xbox gamepad showed up but didn't respond.

Then I realised I had read in the gamepad manual I might have to switch the controller mode for PC from D-input mode to X-input. I did this and it appeared as a PS3 controller (with a different USB id), and it was working in the jstest app!!

## Under Android Emulator

Next stage was to get it working in the Emulator. I gather the emulator used with Android Studio is qemu and I found this article:

I followed the instructions here, basically:

Navigate to emulator directory in the android sdk.

Then to run it from command line:

./emulator -avd YOUR_VM -qemu -usb -usbdevice host:1234:abcd

where the host is your usb vendor and id from lsusb command.

This doesn't work straight off, you need to give it a udev rule to be able to talk to the usb port. I think this gives it permission, I'm not sure.

Navigate to etc/udev/rules.d folder

You will need to create a file in there with your rules. You will need root privileges for this (choose to open the folder as root in Nemo or use the appropriate method for your OS).

I created a file called '10-local.rules' following the article.

In this I inserted the udev rule suggested in the stackoverflow article:

SUBSYSTEM!="usb", GOTO="end_skip_usb"
ATTRS{idVendor}=="2563", ATTRS{idProduct}=="0575", TAG+="uaccess"
LABEL="end_skip_usb"
SUBSYSTEM!="usb", GOTO="end_skip_usb"
ATTRS{idVendor}=="20bc", ATTRS{idProduct}=="5500", TAG+="uaccess"
LABEL="end_skip_usb"

Note that I actually put in two sets of rules because the usb vendor ID seemed to change once I had the emulator running, it originally gave me an UNKNOWN USB DEVICE error or some such in the emulator, so watch that the usb ID has not changed. I suspect only the latter one was needed in the end.

To get the udev rules 'refreshed', I unplugged and replugged the usb dongle. This may be necessary.

Once all this was done, and the emulator was 'cold booted' (you may need to wipe the data first for it to work) the emulator started, connected to the usb gamepad, and it worked!

This whole procedure was a bit daunting for me as a linux newbie, but if at first you don't succeed keep trying and googling. Because the usb device is simply passed to the emulator, the first step getting it recognised by linux itself may not be necessary, I'm not sure. And a modified version of the technique may work for getting a gamepad working under windows.

• 1
entry
• 0
comments
• 52
views

#### Recent Entries

Latest Entry

NeutrinoParticles is a Real-time Particles Effect Editor and it is a new extraordinary editor on the market.www.neutrinoparticles.com

What makes this editor recognisably different than other editors is, it allows you to export the effects to the source code in JavaScript or C# which makes them extremely compact and fast, and it is absolutely FREE.

MacOS and Linux users may use WINE to run the editor for now. Native packages will be available soon.

Particles Effect Editor, JavaScript, C#, Unity, PIXI Engine, Generic HTML

The software has some renderers for JavaScript (PIXI Engine, Generic HTML) and for C# (Unity, C# Generic).

For example, if you use PIXI on your projects, you only need to copy/paste several lines of code to make it work.

• 2
entries
• 1
comment
• 55
views

#### Recent Entries

Latest Entry

We've uploaded a video to our Dailymotion account that is a full length recording of the intro text scene we've been working on for the game.  This was interesting to do because we've never done animations that are timed and sequenced.  The intro quickly details the lore a bit, who you are (good), who's the bad guy, and some history behind your powers and training.  This is one of the first things we've made for the game that is actually a playable part (not a test level, or rigging to get controls right).  Follow for more updates on the game, hope to show the tutorial section of the game quite soon.

• 1
entry
• 2
comments
• 50
views

Latest Entry

# Game Programming Resources

Rodrigo Monteiro, who has been making games for twenty years now, started a thread on Twitter for sharing his favorite game programming resources. I then collected those and a few responses and indexed them into a Twitter moment here:

Here’s what was in the thread:

Game Networking: https://gafferongames.com/categories/game-networking/

Development and Deployment of Multiplayer Online Games by IT Hare / No Bugs’ Hare is a multiplayer game programming resource split into nine volumes; the first of which is available here on Amazon.

Linear Algebra:

Geometry – Separating Axis Theorem (for collision detection): http://www.metanetsoftware.com/technique/tutorialA.html

How to implement 2D platformer games: http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/

OpenGL Tutorial: https://learnopengl.com/

Audio Programming: https://jackschaedler.github.io/circles-sines-signals/index.html

OpenAL Effects Extension Guide (for game audio): http://kcat.strangesoft.net/misc-downloads/Effects%20Extension%20Guide.pdf

Entity Component Systems provide an alternative to object-oriented programming.

Entity Systems are the future of MMOG development: http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

What is an entity system framework for game development? http://www.richardlord.net/blog/ecs/what-is-an-entity-framework.html

Understanding Component-Entity-Systems: https://www.gamedev.net/articles/programming/general-and-gameplay-programming/understanding-component-entity-systems-r3013/

Alan Zucconi blogs about shaders and game math for developers on his site: https://www.alanzucconi.com/tutorials/

AI Steering Behaviours: http://www.red3d.com/cwr/boids/

Bartosz Olszewski blogs about game programming here: gamesarchitecture.com

How to write a shader to scale pixel art: https://colececil.io/blog/2017/scaling-pixel-art-without-destroying-it/

Here’s podcast on C++ programming: http://cppcast.com/archives/

Note: This post was originally published on my blog as game programming resources.

• 3
entries
• 2
comments
• 215
views

Latest Entry

# Main character : Zoile.

First shared concept art ! Please give me your tough about him (comment below, share and subscribe). My first intention was to reveal the plot, but I felt like the blog was missing some more visual support. 10 followers and we will unlock a new character next week

### Today's question: who was your favorite game, cartoon or comic book heroes and why ?

Zoile is the main character of a group of three. In our game, you will have the chance to control 3 main character, each having individual weakness and strength. You will be able to control them all at the same time and all the time ! How you will control them will be covered in an upcoming post, but promise to be a fun and unique way of handling different skill set. I remember one of my old time favorite arcade game 1989 Teenage Mutant Ninja Turtle. My favorite character was Michelangelo, but Donatello had this long stick that could reach enemy from a much further distance making him the best choice to fight the first boss Rocksteady which I felt was the strongest of the game beside Shredder. It was always annoying to have the choice between the one I liked and the one that was most capable to handle that situation. I felt the same thing playing many RPG like Diablo, II and WoW where you just can't invest enough time in all classes and you always dreamed to mix and match class skill to get the best possible character you could build that would match your play-style. How we approach that problem will be reveal soon.

Quote

At this point in time, you may feel that ETs are old-dated, unrefreshing and filled with "cliché", think again. I swear that our anti-heroes are different and that the plot and the phylosophical humorous twist that will be explored in this universe is very different and refreshing from what you have in mind.

Zoile is the self-proclaimed leader of our squad. He is particularly strong physically for his race and possesses a quick wit, few have dared to challenge him. His descent gave him a high level of  self-confidence and Zoile quickly became imbued of himself. Afraid of none, he sees himself as one of the best fighters of his race and has an unwavering pride of his homeland. He was born from a war hero and has always dreamed of becoming a full member of the prestigious flying squad of the 452b Pekler Interplanetary Army. After several failures in the admissions exam, Zoile became very mean and bitter towards others. After 4 years of attempts, he finally was accepted as a low rank recruit. It is said that his father intervened with the council so he could have the chance to demonstrate his value. Unfortunately, many disciplinary problems and conflict with other members have confined him in low rank function. After several difficult years with the squad, the high council allowed him to create a small squadron with two members of his choice for his first mission. He, unsurprisingly selected the only two members with whom a sincere friendship was developed. The two members accepted the honor after a convincing patriotic speach from Zoile and since then he has taken his role with the great honor. Despite is strong wrong and frequent fight with his two friend, he is willing to give everything to show to everyone that his team is the best, because he is the best leader and a good leader can bring weak soldier to great honor.

You can see Zoile with and without his armor set and a typical ray-gun weapon. The Zarin are a humanoid skinny race from a nearby planet.

Zarin, as a race, are mostly peaceful, minding their own business and seeking knowledge. They have an equivalent length of evolution compared to human, but they took a different path. They are scared about a recent discovery they made that put their world at risk of what they call the "multicolored tall people invasion". More info about the Zarin will be shared in an upcoming post !

Thanks, please share your opinion, it's very valuable. 5 comments and we publish a video tutorial on how to draw it.

• 196
entries
• 58
comments
• 29851
views

#### Recent Entries

Latest Entry

I'm a man on a Mobile Gaming Quest (MGQ) to play a new mobile game every day, and document my first impressions here and on YouTube. Below is the latest episode.

Run, swipe, die. Rinse and repeat. Seriously, Glitch Dash looks gorgeous but might just be the most difficult arcade game I've played on mobile (well, apart from Flappy Bird). Avoiding the swinging hammers and laser beams is pure torture, but extremely satisfying when you finally complete each level.

The game's currently in beta, but I decided to include it as I was having a lot of fun with it, and I figured some of you might want to signup for the beta.

## 1) Localization will be key

To make your game connect its audience in different parts of the world your game needs to speak the language of your audience in different local markets. There are many markets that are far from dominated by any single language, and often these markets offer the bigger untapped potential for new game apps. While localising the game language is crucial, there are other considerations as well.

Localisation should also be offered through a selection of payment methods. The selection of payment methods should be made available as per the penetration of such methods in respective markets. For instance, markets having lower credit card penetration should be given other methods of payment for the game players. In some markets, third-party payment solution or third party publishing rights may be good solutions while in others they may not.

## 5) Game ads rewarding players

Mobile game players are more habituated with promotional contents compared to other app users. With the traction and engagement for in-app ads to garner any substantial revenue often a game needs a huge audience or players to earn a substantial value. This is why game ads need to be thought in a completely new light. Rewarding game players for watching game ads have come up with a really effective strategy. Around 80% of game players prefer watching video ads for game rewards.

## 6) In-game sponsorship

Sponsored contents within mobile games continued to remain another popular aspect of many mobile games in the recent years. It started way back in 2015 when Angry Birds players were allowed to kill the awful pigs by Honey Nut Cheerios as long as for 2 whole weeks and thus promoting another game app. Soon, several other games followed this trend which incorporated elements of other game apps in the gaming actions for the purpose of sponsorship. It works great specially for developers who have multiple game apps with a few successful ones across the board. In the present year, we can see mobile game developers to reduce dependence on the in-app purchase by embracing these rewarded and sponsored ads.

## 7) Merchandising game products

Merchandising your game-related products to the game players is still effective for too many mobile games. But it needs at least a certain level of commercial success for the game app. Only when your game has a widespread following and enjoys a niche branding, you can come up with the marketing of in-game characters shaped into real life products like t-shirts, stuffed toys, game-inspired cars, and even notebooks or coffee mugs.

## In conclusion

All these strategies and avenues seem to have one thing in common, and it is more about connecting audience more specifically and in a targeted manner. In 2018, we can expect these strategies evolve further.

• 1
entry
• 0
comments
• 1190
views

#### Recent Entries

Latest Entry

It's been awhile since I've been on this site.  Been busy at work, but as with all contracting, sometimes work gets light, which is the case as of the new year.  So I saw this challenge, and thought it might be fun to brush up on my skills.  I've been working mainly with embedded systems and C#, so I haven't touched C++ in awhile, and when I have, it's been with an old compiler, that's not even C++11 compliant.  So, I installed Visual Studio 2017, and decided to make the best use of this.

Time is short, and I don't exactly have media to use, so I decided to just go out and start to learn Direct2D.  I have little experience with any modern form of C++, and zero experience with Direct2D and XAudio.  Whereas I didn't mind learning Direct2D, I fully admit XAudio presented a bit of problems.  In the end, I blatantly stole Microsoft's tutorial and have a barebones sound system working.  And unlike the Direct2D part, I didn't bother to spend much time learning what it does, so it's still a mystery to me.  I'm not entirely sure I released everything correctly.  The documentation said releasing IXAudio2 would release objects, and when I tried to manually delete buffers, things blew up, so I just let it be.  There are most likely memory leaks there.

As you can plainly tell, this is by far the worst entry in the challenge.  This is as much of a learning experience as an attempt to get something out the door.  I figured, if I couldn't be anything close to modern, at least be efficient.  And I failed at that miserably.  Originally I wrote this in C.  Excluding the audio files, it came out to a whopping 16 KB in size, and memory usage was roughly 6 MB.  And then I decided to start to clean up my spaghetti code (I said start, never said I finished), and every time I thought I was getting more clever, the program grew in size and memory usage.  As of right now, it's 99 KB and takes up roughly 30 MB RAM on 720p resolution.  I haven't really checked for memory leaks yet, and I'm sure they exist (beyond just the audio).  In reality, I'd prefer to clean up a lot of the code.  (And I found a few errors with memory management, so I need to track down where I went wrong.  I removed allocating memory for the time being and pushed everything onto the stack.)

The other thing is, this code is ugly.  Towards the end, I just started taking a patchwork approach rather than keeping it clean.  I was originally hoping for modularity, but that got destroyed later on.  And I'd love to replace the pointers that are thrown liberally throughout the code with smart pointers.

Unlike the other entries, I only have missiles for the gameplay.  I didn't include UFOs, airplanes, smart bombs, nor warheads.  I just don't feel I had enough time.  Yes, there's still a couple weeks to go, but I'd prefer to cleanup what I have than add new features.  And unfortunately, I was a bit shortsighted, which caused problems later on.  There are multiple places where the code is far more verbose than it needs to be, because I wasn't properly focused on the correct areas.  I wanted to make it scalable, and I focused making the game a 1:1 ratio internally, yet displayed 16:9 to the user, which caused massive problems later on.  I ended up having to do math on pretty much every piece of graphics and game logic whereas if I had just displayed it as 1:1, or handled the internals in 16:9, I could have shaved off a thousand lines of code.  And it also caused problems with hit detection, which is another reason I didn't bother adding in anything but missiles.

The hit detection was a mess.  I had everything mapped out.  The game was going to work whether a missile went 1 pixel a second, or 1000 pixels a nanosecond.  Calculating moving objects and collision with circles or boxes is easy.  Unfortunately, I was using ellipses.  And while there are formulas for that, I'll admit my eyes started to glaze over at the amount of math that would be required.  In the end, I decided to leave it buggy, and only detect if it was currently in a static ellipse, which is easy and fast enough to calculate.  I mean, I guess if the program freezes up, the user was going to lose a city/silo anyway, or lose it if the missile was traveling at light speed, but it's still a bug, and still annoys me, especially since everything else was calculated regardless of what the user sees. (*EDIT* Thinking about this more, the solution was right in front of me the entire time.  Just squish the world back to 1:1 and do the hit detection that way).

Controls:

1,2, and 3 control the missiles, and the arrow keys control the cursor.  Escape for the menu, and Enter for selection.  I've only tested this on Windows 10, as I'm pretty sure it requires those libraries.  It's a 64-bit executable.

• 3
entries
• 0
comments
• 248
views

#### Recent Entries

Latest Entry

Hi guys and gals! :3

Here's my third blog entry for Forest Strike. This week I was designing the AI, which give me more struggles than expected. So, there's not much graphical stuff to show this time. That's why I am going a little bit more into detail and explain the game a bit.

# Project Idea

Forest strike is a 2D round-based strategy game in pixel-art style featuring animals as characters. Each round is divided into multiple phases, such as:

• Pre Phase
• Dice Phase
• Move Phase
• Action Phase
• Post Phase

Pre phase is resetting and initializing needed variables each round.

After the pre phase (which is handled within a single step), the dice phase randomly picks the number of steps you can move.

Now, after we got the number, we finally will be able to move the characters. Moving the characters is limited to an amount of steps (dice phase). During the Move Phase, you can move your characters and use items, such as the simple bomb.

Items are split into two groups: "active" and "passive". Active items will be shown in the inventory and can be used during the Move Phase, while passive ones will influence different values of the game.

The active items are not handled instantly, they get a sequence number and will be handled in the next phase, the Action Phase. If there are items placed (like a bomb), the action phase handles every item sequentially (by their sequence number). This way, the game provides a great variety regarding building your own strategy.

Lastly, the Post Phase checks some stuff and jumps to the Pre Phase.

# So, what is planned:

• a bunch of items, characters and maps
• different game modes
• local multiplayer
• local singleplayer (with AI opponents)

## Optional features:

• online multiplayer
• story mode
• boss battles

# Technology

The game is running in Game Maker 2 in order to deploy the game to multiple platforms. Additionally, I really love working with Game Maker, because of its simple, yet powerful, UI and features. The software I use to draw the resources is Aesprite. Also, I am learning how to use Pyxel Edit to create awesome tilesets.

Regarding platforms, I want to cover at least Windows, Linux and Mac. Eventually, a mobile export will be done as well with slight modifications.

Currently, no music or sound is included in the game. In future, I will compose a few tracks in Cubase with a few external VSTs (depending on the genre). I'll keep you up to date as soon as I have a few tracks.

Creating sounds has never been one of my strengths, so I’ll have to buy a bundle or hire a composer. Eventually, I’ll try creating a few sounds on my own.

# Key Features

## New explosion animation

I changed the explosion quite a bit. Instead of blowing up the things in one way, I added a small delay to the single explosion.

## Random starting player

If you start a game, the starting player is now randomly chosen. Should be a general thing... and this week I implemented it.

## New character

Here we go with another character. I was thinking about a mouse, which reminded me a little bit of forests. Currently, I only did the "idle"-animation.

Thank you for reading!

If you have questions or any kind of feedback feel free to post a comment or contact me directly.

• 10
entries
• 97
comments
• 13448
views

#### Recent Entries

Latest Entry

I am looking for a programmer who is interested in making an indie game called Space Hockey. The design document can be downloaded from my blog on GameDev.Net. There are also over 600 pages of material relating too my 14-game Pirate Dawn Universe on this blog.

For now I am only looking for a programmer who is capable of making Space Hockey, and together we can assemble the rest of the team from there. I am looking for someone who is at least near 30 years old and has finished at least one game before. I don't want to distract younger people from establishing themselves in a career with the lure of making games, and I want someone who has made at least one game before so that they understand going into it how much work that entails even for a simple game like Space Hockey. It doesn't have to be a game that was published, the whole point is just that you understand how much work it is to actually finish it.

I am not looking to just make something to post on an indie site somewhere, the goal here is to eventually have Space Hockey for sale on Steam. As can be seen in the design document, once that has been achieved there is a lot of expansion of this that could take place resulting in half-a-dozen or so DLC expansions. This would begin as a hobby/indie project but will, hopefully, someday become a commercial game company. Assuming that Space Hockey and its DLC expansions were successful, the goal would be to transition into a commercial game company and begin work on the 14 games of my Pirate Dawn Universe.

I have been designing games and simulations since before the computer game industry existed, for about 40 years now. I don't say this out of arrogance. It is simply a fact of time that today, in 2018, I am one of the most experienced and knowledgeable game and simulation designers in the world. Although the very simple Space Hockey does not use it, a physical construct that I call “Rube” is the fundamental basis of what you know as “The Matrix”. Rube is also the fundamental basis of cyberspace, an insubstantial holodeck, and a self-programming computer with omniscient communication. The later games of the Pirate Dawn Universe such as Territories, Mission, Clash of the Titans, and the Struggle of the Ancients games are all based on Rube.

The Pirate Dawn Universe is a sci-fi universe focused on space ship games. Lost Art Studios games are based on the 300 years of game design that came before computer games. They are not, for the most part, based on past computer games. This is only one of the things that makes these games unlike any computer games that have ever existed before. As a former member of the SFB Staff, there is no competition out there for Lost Art Studios when it comes to making space ship games for the computer. If LAS can get off the ground, competing within this genre in the modern game industry would be like hunting rabbits with a 120mm cannon.

This will begin as a hobby/indie project to create Space Hockey, and we can establish a typical deal where those who contribute to the creation of the game receive some form of payment if and when the game actually makes money. I really don't care about the money very much and am open to anything that works. The true goal, however, is to get Lost Art Studios off the ground as a commercial game company that will very easily dominate the space ship game genre with its 40 years of accumulated knowledge of the Star Fleet Universe community. And, of course, Rube... which also partly comes from the SFU. Even if Lost Art Studios manages to get off the ground, we would not attempt to develop a truly large or complex game at first. Part of the plan within the design of the games of the PDU is that the first three games are smaller and more simple games to make.

Territories is a prequel, that “Civilization scale war game” is first chronologically but can be made at any point during the telling of the PDU story. The actual first three games are intentionally simple to make. As an MMO Pirate Dawn is “massive” from the player's perspective, but it it is actually a fairly small and simple game too make. The “massiveness” of Pirate Dawn is an illusion too the player. The game itself isn't actually “massive”, the simple arcade game maps are. Manifest Destiny and The Trade Wars, what would be the second and third games, are both smaller and easier to produce than Pirate Dawn is. They are both intentionally minimalist strategy economic war game “scenario generators” where the focus is heavily on the tactical combat resolution (which is not 3D). Lost Art Studios would not even attempt to make a “big game” until we were on our fourth release.

If you are interested in helping to create Space Hockey, with a plan already place to keep going from there, you can contact me through my blog on GameDev.Net or my e-mail address:

From Astral Invasion...

• 437
entries
• 1182
comments
• 764912
views

#### Recent Entries

Latest Entry

I've created a project page for the U3DTerrainEditor I have been working on. Project now includes a downloadable Windows binary so you can try it out. Warning: rough code ahead. It's still a pretty unpolished project, but you can do some cool stuff with it regardless.

Your first terrain:

1) Download the archive, unpack, and execute either run_opengl.bat or run_d3d11.bat. Alternatively, you can execute TEdit.exe or TEdit_D3D11.exe directly, passing arguments on the commandline; ie,

TEdit.exe LuaScripts/terraineditor.lua -w

to run windowed instead of borderless. The batch scripts execute in borderless windowed mode.

2) Click on the NodeGraph button in the toolbar, represented by 3 boxes linked by lines. A window will popup in the lower right. Click new to create a new Node Group, then click Edit to edit the new node group. An overlay window will popup with a + button to create nodes, and an output widget.

3) Click on +, navigate to library, then click on ridged. A node for a Ridged fractal should appear. Change the value of the Frequency input to 3. Click and drag on the output link of the node, and drag the link to the input of the output widget. When the link is established, click the Preview button. The preview pane should fill with a preview image of the node function.

4) At the bottom of the output widget, ensure that Terrain is selected as the Output Target, then click Execute. After a brief processing pause, you should see the terrain change in the background. Press 'm' to close the node window.

5) Click on the Filters button. (It looks like a magic wand). From the list of filters, select Erosion. In the Power box, enter an erosion power (or just stay with 0.3, which is a decent choice). Power values can range from 0 to 0.5. Click Execute. After a brief prcoessing delay, the terrain should change again showing the results of the erosion applied.

6) From filters, select the Cliffify filter. In the dropdown box for Layer, select Layer 7. Press execute. After processing, the terrain should change so that steep areas show a cliff-like texture.

7) Select the Cavity Map to Layer filter. In the Layer dropdown box, select Layer 2, then press execute. The terrain should change again, showing sandy texture in the bottom of hollows and depressions.

8) Press the Terrain Options button (represented as a gear wheel). Select the Save button next to the Terrain: label, enter a filename, and hit Save to save the terrain heightmap to a PNG file. Heightmap will be saved as a standard RGB PNG, with height stored in the Red and Green channels. Red is the coarse height, and Green is finer detail data, allowing the heightmap to represent more than just 256 levels of elevation and making a smoother heightmap. Height can be extracted as Red + Green/255.0f.

Of course, there is a lot more you can do with it. There are brushes for manually editing terrain, texture layers and masks. You can use masks to protect areas from being edited or modified. You can create a spline (use 'q' and 'e' to remove and create knots) then use the Road filter or River filter to create areas of road and river. You can export the texture blend layers as well as a normal map. Some stuff still might not be hooked up right, and as always this is a work in progress.

If you have any feedback or suggestions, let me know.

• 51
entries
• 92
comments
• 50633
views

#### Recent Entries

Latest Entry

Hi everyone!

It has been more than two months since I released I Am Overburdened and since I wrote a devlog entry. Please accept my apology for this, I was super busy with the release and support of the game. But now I’m back with an in-depth analysis how the overall production and final numbers turned out .

## Summary

I want to do a fully detailed breakdown of the development and business results, but I don’t want break it up into a typical postmortem format (good, bad, ugly). I’ve drawn my conclusions, I know what I have to improve for my upcoming projects, but I don’t want to dissect the I Am Overburdened story this way, I want emphasize how much work goes into a game project and focus more on how a journey like this actually looks and feels like. If you really want know my takeaways, here it goes in a super short format: I consider the game a success from a development perspective (good), but I failed from a marketing and sales standpoint (bad and ugly).

Now I go into the details, but will focus more on the objective “what happened, how it went, what it took” parts.

## Development

The game started out as a simple idea with a simple goal in mind. I partially abandoned my previous project, because it ballooned into a huge ball of feature creep, so I wanted to finish a more humble concept in a much shorter time period. The original plan was to create a fun game in 4 months. I really liked the more casual and puzzle-y take on the roguelike genre like the classic Tower of the sorcerer game, or the more recent Desktop dungeons and the Enchanted cave games so I set out to create my own take. I designed the whole game around one core idea: strip out every “unnecessary” RPG element/trope and keep only the items/loot, but try to make it just as deep as many other roguelikes regardless of its simplicity. From this approach the “differentiating factor” was born, a foolishly big inventory, which helped me to define and present what I Am Overburdened really is.

A silly roguelike full of crazy artifacts and a “hero” who has 20 inventory slots.

Most of the prototyping and alpha phases of the development (first two months) went smoothly, then I had to shift gears heavily…

### Reality check

After 3 months of development, when all of the core systems were in place and when I deemed big parts of the content non-placeholder, the time came to show the game to others. I realized something at that point, forcing me to make a huge decision about the project. The game was not fun . The idea was solid, the presentation was kind-of ok, but overall it was simply mediocre and a month of polishing and extra content in no way could change that!

Back than I was super stressed out due to this and I thought about this as my hardest decision as a game maker, but looking back I think I made the right choice (now I feel like I actually only had this one). I decided to postpone release, explore the idea further even if it doubles!!! the originally planned development time (and it happened ) and most importantly I decided to not make or release a “shovelware”, because the world really isn’t interested in another one and I’m not interested in making/publishing one…

### Final scope

So after 4 months of development, feeling a bit glum, but also feeling reinvigorated to really make the most out of I Am Overburdened I extended the scope of the design & content and I also planned to polish the hell out of the game . This took another 4 months and almost a dozen private beta showings, but it resulted in a game I’m so proud of, that I always speak of it as a worthy addition to the roguelike genre and as a game that proudly stands on its own!

Some numbers about the end result:

It takes “only” around 30 to 40 minutes to complete the game on normal mode in one sitting, but due to its nature (somewhat puzzle-y, randomized dungeons & monster/loot placements + lots of items, unlocks and multiple game modes), the full content cannot be experienced with one play-through. I suspect it takes around 6 to 12 full runs (depending on skill and luck) to see most of what the game has to offer so it lends quite a few hours of fun . There are 10 different dungeon sets and they are built from multiple dozens of hand authored templates, so that no level looks even similar to the other ones in one session. They are populated by 18 different monsters each having their own skill and archetype (not just the same enemy re-skinned multiple times). And the pinnacle, the artifacts. The game has more than 120 unique items, all of them having a unique sprite and almost all of them having unique bonuses, skills (not just +attributes, but reactive and passive spells) and sound effects. This makes each try feel really different and item pickup/buy choices feel important and determinative. The game was also localized to Hungarian before release, because that is my native language so I could do a good job with the translation relatively fast and this also made sure, that the game is prepared to be easily localized to multiple languages if demand turns out to be high.

### Production numbers

How much code I had to write and content I had to produce all in all to make this game? It is hard to describe the volume/magnitude with exact numbers, because the following charts may mean a totally different thing for a different game or in case of using different underlaying technologies, but a summary of all the asset files and the code lines can still give a vague idea of the work involved.

Writing and localization may not sound like a big deal, but the game had close to 5000 words to translate ! I know it may be less than the tenth of the dialogue of a big adventure or RPG game, but it is still way larger than the text in any of my projects before…

I’ll go into the detailed time requirements of the full project too after I painted the whole picture, because no game is complete without appropriate marketing work, a super stressful release period and post-release support with updates and community management work .

## Marketing

If you try to do game development (or anything for that matter) as a business, you try to be smart about it, look up what needs to be done, how it has to be approached etc… I did my homework too and having published a game on Steam before I knew I had to invest a lot into marketing to succeed, otherwise simply no one will know about my game. As I said this is the “bad” part and I’ll be honest. I think I could have done a much better job, not just based on the results, but based on the hours and effort I put in, but let’s take it apart just like the development phase.

• Development blog/vlog
I started writing entries about the progress of the game really early on. I hoped to gather a small following who are interested in the game. I read that the effectiveness of these blogs are minimal, so I tried to maximize the results by syncing the posts to at least a dozen online communities. I also decided to produce a video version because it is preferred over text these days + I could show game-play footage too every now and then. I really enjoyed writing my thoughts down and liked making the videos so I will continue to do so for future projects, but they never really reached many people despite my efforts to share them here and there…
• Social media
I’ve tried to be active on Twitter during development, posting GIFs, screen-shots and progress reports multiple times a week. Later on I joined other big sites like Facebook and Reddit too to promote the game. In hindsight I should have been more active and should have joined Reddit way earlier. Reddit has a lot of rules and takes a lot more effort than Twitter or Facebook, but even with my small post count it drove 10 times more traffic to my store page, than any other social media site. Since the game features some comedy/satire and I produced a hell of a lot of GIFs, I tried less conventional routes too like 9gag, imgur, GIPHY and tumblr, but nothing really caught on.
• Wishlist campaign
I prepared a bunch of pictures up-front featuring some items and their humorous texts from the game. I posted one of these images every day starting from when the game could be wishlisted on Steam. I got a lot of love and a lot of hate too , but overall the effectiveness was questionable. It only achieved a few hundred wishlists up until the release day.
• Youtube & Twitch
For my previous Steam game I sent out keys on release day to a 100 or so Youtubers who played any kind-of co-op game before, resulting in nearly 0 coverage.
This time I gathered the contact info of a lot of Youtubers and Twitch streamers upfront. Many were hand collected + I got help from scripts, developer friends and big marketing lists ! I categorized them based on the games they play and tried talking to a few of those who played roguelikes way before release to peak their interest. Finally I tried to make a funny press release mail, hoping that they will continue reading after the first glance.
I sent out 300 keys the day before release and continued the following weeks, sending out 900 keys total.
And the results?! Mixed, could be worse, but it could be much better too. 130 keys were activated and around 40 channels covered the game, many already on release day and I’m really thankful for these people as their work helped me to reach more players.
Why is it mixed then? First, the videos did generate external traffic, but not a huge one. Second, I failed to capture the interest of big names. I also feel like I could have reached marginally better results by communicating lot a more and a lot earlier.
• Keymailer
I payed for some extra features and for a small promotion on this service for the release month. It did result in a tiny extra Youtube coverage, but based on both the results and the service itself all in all it wasn’t money well spent for me (even if it wasn’t a big cost).
• Press
This was a really successful marketing endeavor considering the efforts and the resulting coverage. I sent out 121 Steam keys with press release mails starting from the day before release. Both Rock Paper Shotgun and PC Gamer wrote a short review about it in their weekly unknown Steam gems series and the game got a lovely review from Indiegames.com. Also a lot of smaller sites covered it many praising it for being a well executed “chill” tongue-in-cheek roguelike . The traffic generated by these sites was moderate, but visible + I could read some comforting write-ups about the quality of the game.
• Ads
I tried Facebook ads during and a bit after the release week + in the middle of the winter sale. Since their efficiency can not be tracked too well I can only give a big guesstimate based on the analytics, sales reports and the comparison of the ad performances. I think they payed back their price in additional sales, but did not have much more extra effect. I believe they could work in a bigger scale too with more preparation and with testing out various formats, but I only payed a few bucks and tried two variants, so I wouldn’t say I have a good understanding of the topic yet.

Some lifetime traffic results:

So much effort and so many people reached! Why is it “bad”, were the results such a mixed bag? Well, when it comes to development and design I’m really organized, but when it comes to marketing and pr I’m not at all. As I stated I never were really “active” on social media and I have a lot to learn about communication. Also the whole thing was not well prepared and the execution especially right at the release was a mess. The release itself was a mess . I think this greatly effected the efficiency! Just to be more specific I neglected and did not respond in time to a lot of mails and inquiries and the marketing tasks planned for the launch and for the week after took more than twice as much time to be completed as it should have. I think the things I did do were well thought out and creative, but my next releases and accompanying campaigns should be much more organized and better executed.

## Time & effort

I don’t think of myself as a super-fast super-productive human being. I know I’m a pretty confident and reliable programmer and also somewhat as a designer, but I’m a slowpoke when it comes art, audio and marketing/pr. For following my progress and for aiding estimations I always track my time down to the hour level. This also gives me confidence in my ability to deliver and allows me to post charts about the time it took to finish my projects .

Important thing to note before looking at the numbers: they are not 100% accurate and missing a portion of the work which were hard to track. To clarify, I collected the hours when I used my primary tools on my main PC (e.g.: Visual Studio, GIMP), but it was close to impossible to track all the tasks, like talking about the game on forums & social media, writing and replying-to my emails, browsing for solutions to specific problems and for collecting press contact information, you get the idea… All in all these charts still show a close enough summary.

288 days passed between writing down the first line in the design doc and releasing the game on Steam. I “logged” in 190 full-time days. Of course more days were spent working on the game, but these were the ones when I spent a whole day working and could track significant portion of it + note that in the first 4 months of the project I spent only 4 days each week working on I Am Overburdened (a day weekly were spent on other projects).

## Release

So how the release went? It was bad, not just bad, “ugly”. After I started my wishlist campaign, close to the originally planned date (2017. Oct. 23.) I had to postpone the release by a week due still having bugs in the build and not having time to fix them (went to a long ago planned and payed for vacation). I know this is amateurish, but the build was simply not “gold” two weeks prior to release . Even with the extra week I had to rush some fixes and of course there were technical issues on launch day. Fortunately I could fix every major problem in the first day after going live and there were no angry letters from the initial buyers, but having to fight fires (even though being a common thing in the software/game industry) was super tiring while I had to complete my marketing campaign and interact with the community at the same time. The game finally went live on Steam and itch.io on 2017. Nov. 2 ! I did not crunch at all during development, but I don’t remember sleeping too much during the week before and after launching the game. Big lesson for sure .

I saw some pictures about the game making it to the new and trending list on Steam, but it most probably spent only a few hours there. I never saw it even though I checked Steam almost every hour. I did saw it on the front-page though, next to the new and trending section in the under 5$list . It spent a day or two there if I remember correctly. On the other hand, itch.io featured it on their front page and it’s been there for around a whole week ! With all the coverage and good reviews did it at least sale well, did it make back it’s development costs, if not in the first weeks at least in the last two months? Nope and it is not close to it yet… ## Sales In the last two months a bit more than 650 copies of I Am Overburdened were sold. Just to give an overview, 200 copies in the first week and reached 400 by the end of November, the remaining during the winter sale. This is not a devastating result, it is actually way better than my first Steam game, but I would be happier and optimistic about my future as game developer with reaching around 3 to 4 times the copies by now. To continue as a business for another year in a stable manner around 7 to 8 times the copies total (with price discounts in mind) during 2018 would have to be reached. I’m not sure if the game will ever reach those numbers though . If you do the math, that is still not “big money”, but it could still work for me because I live in eastern Europe (low living costs) + I’m not a big spender. Of course this is an outcome to be prepared for and to be expected when someone starts a high-risk business, so I’m not at all “shocked” by the results. I knew this (or even a worse one) had a high chance. No matter how much effort one puts into avoiding failure, most of the game projects don’t reach monetary success. I’m just feeling a bit down, because I enjoyed every minute of making this game, a.k.a. “dream job” , maybe except for the release , but most probably I won’t be able to continue my journey to make another “bigger” commercial game. I may try to build tiny ones, but certainly will not jump into a 6+ months long project again. ## Closing words It is a bit early to fully dismiss I Am Overburdened and my results. It turned out to be an awesome game. I love it and I’m super proud of it. I’m still looking for possibilities to make money with it (e.g.: ports) + over a longer time period with taking part in several discount events the income generated by it may cover at least a bigger portion of my investment. No one buys games for full price on PC these days, even AAA games are discounted by 50% a few months after release , so who knows… If you have taken a liking to play the game based on the pictures/story you can buy it (or wishlist it ) at Steam or at itch.io for 4.99$ (may vary based on region).

As an extra for getting all the way here in the post, I recorded a “Gource” video of the I Am Overburdened repository right before Christmas. I usually check all the files into version control, even marketing materials, so you can watch all the output of almost a year of work condensed into 3 minutes. Enjoy !

Thank you very much for following my journey and thanks for reading.
Take care!

• 1
entry
• 2
comments
• 98
views

#### Recent Entries

Latest Entry

I've always loved video games.  As a child, I spent hours playing on my Atari 2600, on our home PC, or at a friend's house on his Nintendo and Super Nintendo.  As time went on, I discovered QBasic and started to learn to make simple programs.  It clicked - this is how the creators of the games were doing it!

From there, I became very interested in learning about the creation process.  I experimented, read articles in magazines, and as the World Wide Web took off I ventured online to learn more.  Games got bigger and fancier, and some of them in special editions with documentaries about the creation, and I loved all of it.

Well funded teams of hundreds of people were now working to create fantastic games with hours of gameplay and breathtaking visuals.  I read articles and watched "making of" documentaries which described how developers would work long hours, forgoing days off, working late nights, and sometimes even sleeping in the office to meet deadlines.  I was so impressed with the effort and dedication they put in.

How much must you love a product to give up your nights and weekends, and spend time away from your family to finish it off?  This was how great games were made, and I was in awe of the industry and the process.  This was what I idolized.  This was what I aspired to.

## I was wrong.

The process I have described above is not necessary, and it is not cool.

Developers do not need to sacrifice their free time, their sleep, and their health to create great games.  The science is in.  Numerous studies have shown that well-rested people are more productive and less prone to mistakes.  The stress of this schedule and lack of sleep is profoundly damaging to people's health, causes burnout, and drives talented developers away from our industry.

Just think about a cool feature that you loved in a AAA game.  If the team went through a period of crunch, the developer who created that feature may have burned out and left the industry - they might not be creating awesome things for gamers anymore.

We should not idolize a process that is harmful to developers.  When we hear about crunch, the overwhelming reaction should be that this is not ok.  Crunch is not cool, and developers still using this process should work towards a better way.

Happier, healthier developers will produce better work, and in the long run, they will produce it more efficiently.  Happier, healthier developers are more likely to stay in our industry rather than seeking greener pastures, resulting in more people with extensive experience who can then work on more advanced tasks and ideas, and push the industry forward.

Thankfully, a growing number of developers have moved on or are moving on from this toxic culture of overtime and crunch, and a growing number of people are willing to speak up.  Unfortunately, it's far from everyone, and there are many developers still exploiting workers.

I'm putting my foot forward to say that I do not support a culture of overtime and crunch.  We can do better, and we need to do better.  I'm not the first person to share these sentiments, and I'm not an influential person, but I hope I won't be the last, and if I can convince even one more developer to stand up for better treatment of workers, then hopefully I've made some small difference.

If you agree with me, next time you hear someone discussing crunch as if it's just a normal part of the process, let them know that there's a better way and that you don't support crunch and overtime.  Let them know that crunch isn't cool.

• 6
entries
• 6
comments
• 691
views

#### Recent Entries

Latest Entry

Here is the beta gameplay video with more weapons.

Please condider following me if you like it : @bombjackm

• Advertisement
• Advertisement
• ### Popular Blogs

• Advertisement
• ### Blog Comments

• Since I've been revealing a lots of aspects of the Astral Invasion story towards the end here, I thought I'd cap it off with a little more variety. In all of the games of the PDU the story is told by the music as much as the text, and the story is always originally derived from the song lyrics. There is a format too it, as well, where the primary story arc is always one band and is always based on an entire album from that band using songs from other albums from that band that also fit the story. Major side story arcs are thematically separated from the primary story arc (and each other), by being other bands. So story arcs always also have a unique sound and atmosphere based on the band that is telling that story arc. Obviously, in Astral Invasion, Yes is the sound and inspiration of the primary story arc of the sun exploding. The Yes Album is the core of it, and several songs from Fragile and 90125 are also used for the primary story arc. Here's one song from each of the major side story arcs of the Astral Invasion story, and the three bands that are telling them. This one is related to the story of a space marine general named Gloria Grace, who you would have seen in Armageddon Chess if you read that. If you were really paying attention, you might have also noticed the line “God gave us grace to save this place”;-) General Grace is the last of the pantheon ascendants of the first time through the broken time loop, she is Artemis. Yes, there are a lot of female heroes in the PDU, because there are a lot more Greek goddesses than there are gods and they all need to do some great thing and ascend at some point during the story.   Another big thing going on in Astral Invasion, besides Artemis ascending and the sun exploding, is that Andrea “Death Stalker” Takahashi's big moment happens during this game. Andrea hasn't made it into this blog much because the focus was on Cindy, but she was inspired by a line from Babylon 5 and Andrea (she's actually been called “Suzi” since she was a child, only the authorities and the media use her legal name Andrea) is Cindy McAllen's “equal but opposite”. This is partly about Andrea having just made a fundamental change in her philosophy.   And, this one... I will just cryptically post without further comment;-)
• Thanks! I will totally do that.
• If it's a free game, consider uploading to the Projects section as well. Might be more straightforward for people already on GameDev.net, plus you can provide updates integrated with your blog, gallery, profile, etc. (i.e. no bothersome itch.io stuff)
• No problem, thanks again for the info. I haven't tested with wine, but the app actually was largely developed on Linux, I will be aiming to release a proper linux version after I get my head around this one. Yeah I really hate installers at this point! Having these visual studio runtimes is annoying to deal with. First I had them statically linked as you said, but was told that was a bad idea as they wont update. I will probably end up getting rid of all visual studio stuff to just get rid of it all together, there is nothing the code needs windows stuff for anyway. I'm glad you mentioned the itch app though as I just tried it through their client and it didn't run anyway. Urgh, releasing stuff is such a pain
• Yeah my mistake with so little sleep and little info, I clicked on the thing saying 'download app', I thought your game was called 'itch'! If is any help I tried the installer on linux on wine, it seemed to install but not the visual studio redistributable runtime for some reason (maybe it doesn't like wine). So when I ran it it failed missing mostly those runtimes. OpenAL did seem to install though. Then I tried it on my win7 laptop and it failed installing the visual studio runtimes, with an 'unspecified error'. I always find those extra downloads are a pain, especially for test versions, so I usually statically link / include dlls rather than rely on some third party installer especially for a test app. MS installers are practically guaranteed to screw up. Usually you can get your test 'install' down to one .exe file, if you are cunning (you can even pack data into the exe as a resource for example). It would also be helpful for people to know what are the min specs for your test program, versions of OS, opengl / direct x etc, shader version.
• Advertisement
• Advertisement