Jump to content
  • Advertisement


  • Content Count

  • Joined

  • Last visited

Community Reputation

775 Good

About DemonDar

  • Rank

Personal Information

  • Interests
  1. I wanted to share my eleven weeks work experience at VGWB (VideoGames Without Borders). During these weeks I developed a whole section of the game "Antura wa al huruf" (Antura and The Letters) under the supervision of Francesco Cavallari (founder of VGWB), and of Davide Barbieri (Lead programmer from GhostShark Games). Background: In September of 2016, a Norwegian Agency, Norad, started a contest to realize an educational game to provide a way for Syrian children to learn while having fun. An estimated 2.8 million Syrian children are out of school due to war. Since most of these children have access to a smartphone, a mobile App was a viable way to ship that goal. The project timeline was roughly as follows: The project had initially 78 different project proposals (Phase 0). 5 Projects were selected as semi-finalists (Phase 1). 3 Projects were choosen as finalists (Phase 2). Feedback provided and request for improvements before winner election ( Phase 3). I Joined the project during Phase2, at time of writing the article we are in Phase3 and waiting to hear who is the winning project My role: I joined the project after the beginning and started working on a new section. My assignment was the development of the Assessments section: Antura's is structured in a series of worlds/maps each one with a travel line: during travel, you play minigames to learn Arabic, and after some minigames sessions the player is required to do an Assessment. It is not an exam at all, its purpose is to reinforce learning by doing a series of exercises that uses the concepts learned in previous mini-games, it is possible to answer by trial and error, and the goal is to not stress the children too much. How Antura looked after the first development rush. As a newcomer I spent the first few days looking over and learning from the documentation and the existing code; I did a quick draft of code to get an idea of the amount of work required and potential problems. The most important part (as always) is to understand the requirements, so I read the documentation several times, and printed my own copy and annotated it. Even if dependencies on preexisting code are minimal, understanding a pre-existing codebase helps a lot. Requirements: There was a total of 9 assessments types (later evolved to 13 assessments). Assessments had to look similar and have similar behavior, but at the implementation level, there? are differences in how the logic is implemented. The graphics needed to be simple on purpose to not distract too many children from the assessment. The first playable prototype was ready in one week, and I used it to get feedback from my supervisor. The key factor to development on the project was continuous feedback: this was a truly Agile experience, we had a development cycle that consisted in four days of rush programming and one day of testing/revisioning/bug-fixing. Requirements changed every two-three days (due to feedback from testers or from field testing). Journey map Things I got right. Wrap the content provided by the Question Provider, the IQuestionProvider interface is a bit controversial: it was first enforced to be a ?EURoeunique?EUR? interface among all games, but it was not sufficient to fulfill all different game logic; the workaround (used everywhere in the game) is to ?EURoedecode?EUR? the content of the IQuestionBuilder. That piece was designed with a goal in mind, but testing and improvements later required different behavior. At that point in development, it was no longer possible change that without breaking stuff, so we delayed that issue to a future refactoring. In the Assessments the decoding of IQuestionProvider is done by IQuestionGenerator, so the IQuestionProvider is free to change without breaking Assessments, in fact even though there are a couple of different implementations for the IQuestionGenerator, the interface is used in the same way by all Assessments (no decoding). The Assessments?EUR(TM) game loop is a Coroutine since the game is divided into well-defined phases, putting stuff inside a IEnumerator proved very useful. This is especially useful because it allows us to put animations where needed and wait for them to end without having to resort to state machines or complex flag systems. There were two major changes in the game flow, and I was able to seamlessly implement them without breaking stuff because of the usage of Coroutines.? Certain behaviors are just much more simple to implement using Coroutines. private IEnumerator RoundsCoroutine( KoreCallback gameEndedCallback) { for (int round = 0; round < Configuration.NumberOfRounds; round++) { InitRound(); yield return Koroutine.Nested( RoundBegin()); yield return Koroutine.Nested( PlaceAnswers()); if (round == 0) Koroutine.Run( DescriptionAudio()); yield return Koroutine.Nested( GamePlay()); yield return Koroutine.Nested( ClearRound()); } gameEndedCallback(); } Use my own sound manager. All audio is loaded into a global audio manager (implemented by DeAudio by other developers). While it was a real pleasure just to call one method for playing a sound file (and have each single sound effect tweaked by an audio engineer), I had specific issues to be addressed for assessments (some clips were allowed to overlap, while other clips were not). The easiest way to ensure the correct playback for audio files was just to add another audio manager (on top of the old one). That allowed me to keep the correct behavior of each sound, without adding extra complexity (I still call one method to play each sound). And for certain sounds, I now have a meaningful name public void PlayPlaceSlot() { audioManager.PlaySound( Sfx.StarFlower); } Things I got wrong Use of a time manager. Since all games had to implement at least two IState interfaces (one initial game state and one final game state) and there was an ?EURoeUpdate( float delta)?EUR? method to implement, I assumed that time scale was custom and I had to use that ?EURoedelta?EUR? also for Tweens and Coroutines. I was wrong! The game was in reality setting Time.timeScale to 0 to pause the game, while the UI was animated with a unscaled delta time. It would have only taken a minute to check that myself. While in theory, the time manager idea is nice, because it decouples the time flow from Unity?EUR(TM)s time scale, in reality, it was not used in other minigames, so it was pointless keeping it around. In fact, I later removed it during the polishing phase of the game. A bit overengineered overall. I can understand the short deadline, but there are a few things that I would like to have written in slightly different ways (well code works, so no reason to change it now), also rethinking later to the game I think? Assessments section was a good candidate for using an ECS pattern (which I learned recently, and I?EUR(TM)m still experimenting with it) however since I was not too confident with ECS I decided to not take risky roads. During the development, I thought more than once ?EURoeif I had used the ECS pattern, that would have solved that problem for me?EUR?. As a result of the extra complexity, I was able to cut a lot of code during polishing phase (For example, there were several Answers related classes that resolved a communication problem, later I merged them in just one Answer class. ) I?EUR(TM)m still very happy with the rhythm I was able to keep and with the result. Also, I think I did pretty well since I joined the project in progress and did not have the time I wished to have. Things I liked I worked with talented people, I had the chance to work with people I was following, and I continued to work together with some people I already knew. I learned a lot, and this was only my second team work experience (This time I had to collaborate tightly with some coders also). It is very surprising when you need stuff, and you find it was already implemented by someone else. I also really liked participating in some design decisions and helping refining some logic. It was a short but intense experience. Things I didn?EUR(TM)t like It was a relatively short experience, and I had a lot of fun, so it is a pity that has already ended. The game is already published on Play Store and AppStore, there are no major things to fix, and at least in my section (Assessments) there?EUR(TM)s no more work to be done. I?EUR(TM)d like to work on this project a bit more. Antura current look and feel of the assessments section. How did I get the job? I have to thank guys in GhostShark Games for that. I already worked with them for one year developing a couple of games, and I can?EUR(TM)t wait to see what the next project will be. In the meanwhile, we worked together on Antura. I use the free time between each project to develop personal stuff and to refine my skills. Does the game work? Yeah, it works! In reality the game is aimed to teach Arabic to children that already speak and understand it, however I was able to learn most of the Arabic alphabet and dozen of words (even though I didn?EUR(TM)t understand a single word of Arabic when I joined the project). Also, field testing showed children genuinely learned new things. As a personal note: I?EUR(TM)m surprised by how elegant Arabic writing is! Original version This article has been reblogged from my new developer's blog. Editorial note: some formatting and grammar changes have been made with permission of the original author to aid in reading of the article.
  2. I would have preferred tips coming from years of unity experience, and not general tips, but those are good reminder for newcomers to Unity so nice article :).
  3. DemonDar

    What Languages to Localize Your Steam Game Into?

    This is true, as Italian programmer I'm disappointed by the number of very good games that receive poor reviews from my people because those games lack the "IT" lang option. ?Almost 1 game out of 2 in play store has some Italian review like "good game, but miss italian". :/ ?Also it is true that developers usually avoid to translate to italian, our gaming industry is infamous for many AAA titles translated with automated tools with poor results (Oblivion was really infamous because all dialogues were referring to "male" interlocutors), or not translated at all (Morrowind). ?There was also a Group of volunteers that started a localization project (ITP: Italian Tranlsation Project) which localization quality is probably better than any dedicated localization team we have seen so far. ?It is thanks to ITP guys we had finally Morrowind, Planescape Torment, Fallout 1&2 and other cool titles translated into italian. ?We have the market: when Planescape was  sold (plus the translation patch) in newsstands it was a sold out! ?But game industry don't feed that market very well (If only Oblivion had a good translation... I switched to english version because of low quality translation). ?I can understand there are no big industries here in italy (because of high taxes, most of italian developers I know just went making games in Spain, US, or UK). And I understand we have a bad internet connection. But we have a lot of gamers. In example me and my friends spend ours into Play Store trying to find good games, without finding any (well we found few cools titles like DISTRAINT Pocket Pixel horror, which had a very well done translation by the way). ?I also understand that most italians just want few titles, but this culture is slowly trending to indie games (in example most people just want the last PES or GTA), but there is also people (like me) that only want to buy indie titles.  
  4. Thanks I needed something half-way between those 2. ?Actually giving some randomization to the factor that gets added to entropy seems to do the job and get the best of both worlds.. Still struggling to tweak that value but I'm more close to the solution :).  
  5. A pool of numbers is not a good solution. I should use a different pool for each different enemy and skill, and to tweak the % in a really fine way I should use a really big pool (10.000 numbers di per se is not a problem, but 10.000*enemies*skills it is). ?The entropy counter seems very interesting concept, I will check now it it alters also the chance and not only the frequency (actually I tried something similiar and don't worked very well). thanks :) I already played PathOFExile, very nice game. ?The way the etropy counter works generates a fixed sequence, I may tweak it a bit but actually it is not good (to me, in my opinion XD). In example assume that chance of hitting is 50. ?the counter is initialized to 64 ?First shot:  64+50 => hit Counter : 14 Second shot: 14+50 => miss Counter : 64 Thirdshot:  64+40 => hit Counter: 14 ?In this case the sequence will Always be 1 hit, 1 miss, ?And i fear that changing: ?This:   float hittingChance = CalculateHittingChance(); entropy += hittingChance; if(hittingChance > 100.0f) { Hit(); hittingChance -= 100.0f; } else Miss(); To this one:   float hittingChance = CalculateHittingChance()* Random(0.5f,1.5f); entropy += hittingChance; if(hittingChance > 100.0f) {     Hit();     hittingChance -= 100.0f; } else     Miss(); Will alter the final chance.
  6. You will not find easy learn ECS from that site, it is explained really bad (I'm not even sure whoever wrote it actually ever used ECS seriously). Basically ECS makes easier to create some "function" that works on specific sets of data, but makes harder specific game flow. ?If you want a HackNSlash game, it is enough to know that you need ?- Enemies damage hero (your method) ?- hero damage enemies (possibly another method, but could be the same as well)   ANd you know the only data you need is HP,Damage,Target. ?In regular programming you have   - either 1 parent class, all enemies and hero inherit that class ?- you compose your class by keeping inside a "Attacked" object, but you have to expose for every class a method that just delegates the job to attack class ?In regular ECS you have much less duplicated code ?- You just spawn something with that component (data) - ?however now the boring part is actually triggering the attack (flow) Of course if actually you change only stats in your enemies, then you just need 1 Enemy class that load a different graphics and use different stats (And you no longer need multiple classes and/OR ECS). ?ECS comes into play when you have many small stuff that clutter you class, I doubt you will use utility of ECS until you try to make a game that ends up being a tightly coupled mess, when you do that you realize that is the moment you should really start using ECS, also it is easier to do ECS if you have already a code/clear gameplay into mind. Actually if you start needed more damageable stuff (destroyable objects, immortal NPCS etc. it is just much more convenient using ECS than polluting 1 class with Switch statements)
  7. I've been reading somewhere (though I cannot find anymore the article) that some MMO games "cheat" when it comes to use "random chance", basically those games make sure that random skills do not get activated too often or to rarely by tweaking the real outcome chance according to how many times the skill failed to activate. This is to prevent players frustration. ?I would be glad to find again that article, actually I tried to do the same, but since I'm rusty in statistics I failed to do that.   (well in reality it is irrelevant that the game is server-based). I just want to know how to tweak the frequency of success without altering the chance (so if you know that without citing an article you are wellcome :) ).  
  8. I speak for experience, do not use delayed messages (unless of  course you are using something like "callbacks at the end of an animation"). ?delayed messages just add another layer of complexity, also you should not do the anti-pattern that most ECS systems enforce, updating everything is just an antipattern.   Only certain stuff should be updated, for the rest the messages should be dispatched istantly, to do that you could store call back in Components. ?Basically you set as data, the method of 1 system, and another system call that callback. This is so far the best and most maintainable solution and is used in a C# framework (SveltoECS). ?You do not need to serialize callback in components, since callback are setup in a deterministic way by systems. (otherwise you could create a Event System that one System will call, and another system will register in it). ?In all cases it is better you roll your own solution, forget about early optimization and try to keep it as simple and functional as possible.
  9. Can't help with "class looks like something", if possible try to post the real offending code (of course reduce to minimum necessary to reproduce the issue) . It could be a compiler bug, but maybe there's a little change that will hint the compiler to proper unrolling. Are you sure actually your profiling is correct? A few times happened I was guessing why a optimization was not used and then it resulted that it was not really an optimization but actually reduced performance (by not so much).. but 10 times slowing down, well.. seems mostly a compiler bug. Still there may be a simple line of code that would allow it to correctly hint for unrolling the loop. ?In example seems your working data type is 16 x floating point numbers (since T wrap a SIMD), but I can't be sure because the code is incomplete.   Maybe are you missing a align directive? As far as I know GCC do a lot of align on its own, but I don't know if VS do that too (I don't know VS enough)
  10. If I want to do a game with some animated characters, how much would cost to me each animated character? ?Note I'm searching something with this look (I still have no funds to pay, I just want to know the average price).     But I'm mostly interested in cute animals, not in brute warriors. I could guess this takes a week of work, so depending on skill may be between 300 -500€/$ but I'm not a modeler/animator, so I really don't know ^^. ?Of course, I don't want an aSset store Item  (otherwise I would buy directly one at a cheaper price), but I want characters exclusive for my game.
  11. Ah thanks I not cured very much LinkedIn because I did not have time during my job. (1 year not updating it XD) ?I'm looking for remote work (possibly) or for short periods of relocation (if remote work is not possible) s Game Programmer (sorry thought was obvious on GameDev.Net), and yes I have something to show as portoflio (which is something like the 10% of what I really did, mostly because I lost some code projects in the time and because I still cannot publish some games.   I had some non-game dev contracts, but most work I've done is as Game developer.  
  12. Hi, I worked remotely for a company for over a year, now they are in financial crysis (Actually I'm collaborating with them on a project for another game company, but they are no longer my "Employers", still happy to working with them XD).   I completed 4 games titles (Games Store ready, not just titles with placeholder graphics). Unluckily I can showcase only 1 title (going to become opensource soon), and maybe I will be able to show another 2 titles in next months (If the publisher I was working for finally decides to publish the games and ending the testing). The 4th title (in reality it was the first to be realized in temporal order), will never be showcased: it was a demo my company was using to show to potential customers, I can show videos of it, but I was explicitly forbidden to release the APK file, nor to let anyone play with it on my phone.   How do I find more contract works? I have 3 years in Unity3D experience (more than 1 year as paid freelance), 6 years in C++/OpenGL (mostly contributions to opensource projects, and personal projects most of which are lost anyway since I can't retrieve the code)   I have good math knowledge and experience in shader writing, unluckily seems I'm only suitable for big companies (I've had just 1 job interview with a big company in UK they offered to help with relocation but I had to decline). That was 2 years ago for a unity related job.   So, what to do now (1 game almost ready to be showed, And I can actually show my code since it will become opensource), and what to do when I can show also my other 2 games? Thanks.
  13. I would like having a tool for resolving coding dependencies. In example today I was able to merge 4  classes into 1 class that is even simpler than any of the before classes: the reason is that with requirements changes and evolving code base each of the 4 classes changed slightly until they become basically reciprocal referencing, just a big blob of linked classes. A depdency graph could have helped to spot that immediatly, instead I spent a pair of hours narrowing down that and refactoring the code to simplfy it. I know already of static analizer and I would just run them periodically as long as my boss provide the license to them :D useful tools for a small set o problems. But I would like also tools for solving totally different sets of problems.
  14. DemonDar

    ECS design

    What is an Entity?  A list of components, but you do not deduce systems on components, you deduce components on systems! ?A entity should just not be more than a bunch of systems working togheter on some data // spawn wall for a 2D tile-based RPG void SpawnWall(int x, int y){ Entity wall; wall.RegisterInSystem( renderSystem).Default( "wall.png"); wall.RegisterInSystem( positionSystem).Default( x, y); wall.RegisterInSystem( tileSystem).Default( false); //not passable } This is similiar to what I'm doing. Basically I'm looping this way: ?For each Entity type (a different spawn function)  For each System in Entity Type   For each Entity     UpdateSystem on that entity   we do not have fastest possible iteration because each entity have more components so we skip several bytes each time we want to access the next component. we do not have fastest possible code cache because it is possible each system is called more than once in different entity types.   But we avoid most bottlenecks (no lookup cost of hashmaps, no huge BUS usage for iterating each time again  over Whole RAM memory) while keeping flexibility (and no need to filter entities into groups for fast search which is just an API complication), as a side note, if components for a particular entity type are independent, we can layout the entities like struct of arrays instead of array of structs to improve cache locality (in theory we could partially arrange the layout internally according to some euristic, but that add much more complexity for almost no benefit), but that would be an auotmatic check of easy implementation and without any additional effort from the user. ?Oh and to detect entity type, I just have a order over systems. It is pretty fast finding if another entity with same systems (!= entiy with same components) exist and we will allocate it there. It is nothing more than checking if a string is in a dictionary, if yes increase the count for that word. Using a dictionary lookup when spawning something, and just once and only for entities, is zillion times faster than doing dictionary lookup for all components every frame. ?Note that I do not used any particular complex cache or Group system. Just dead simple and yet effective code. ?Assign each system a letter of the alphabet A,B,C,D,E,F ?then a entity will have some systems ?AB DE ABD   Entity update order will be the same of the string sorted alphabetically so: ?AB ABD DE But we are really doing no sorting, the entity is added in the right bucket just right after spawning.
  15. Packagin correctly art assets for the Unity Asset Store can be a great task. Programmers and Game designers expect stuff to be packaged in a certain way, and often you find assets on the Unity Asset Store that have great art inside, but have some usability problems because one of the following reasons:   Who made the package is not a programmer. Who made the package do not use Unity very often. These usability problems leads to bad reviews on the first days the asset is uploaded, even when the art inside can be fixed with small effort, usually users expect maximum usability for something they paid for, and this kills your downloads in the beginning.   While I'm not an artist, and as such I cannot change your art (and even if I was, I think we should respect everyone's else art style). I can fix a tons of little problems that arises when importing assets into unity, some option here and there, organize assets to be programmer friendly, a simple script to show how that asset can be really used for great value into your game. ?Also I will meticulously check each asset in your package to see if there are problems with it:   ?polycount problems size problems tileability/seams problems animations problems atlases compatibility problems missing stuff unreferenced stuff performance problems mobile optimization naming conventions problems I can help to support multiple Unity3D versions seamlessy While I can fix lot of problems and makes everything fit togheter much better, there's stuff that I cannot fix: I cannot remodel your 3D model/ repaint your textures / resample your sounds. In the end you are the artist.     About me:? I've been using Unity3D for over 4 years, and I've been working (on a contract basis) as freelance for over a year. In one of my last jobs I just spent 2 months fixing problems with assets that my boss bought on the asset store. Note that those assets were already top rated, so users was happy with them, nonethless I found and fixed several problems saving some performance and fixing few graphics glitches for the game I was working on at the moment. It was also a fun task because that gave me a break from heavy programming related stuff. In most games I Always have to fix some asset first or later and I'm becoming more and more proficient with that task.   Now I'm offering this service for a cheap price, if you really want to invest into your assets I can save you a lot of time and troubles: I will also help to start on the right foot.   Contacts: Twitter: https://twitter.com/oliveridario89 ( I will send my email on a private message channel to avoid spam). PM me in this forum   Note that: ?I usually reply within 1 day during the week, I'm not available during weekend (usually because of resting, but sometimes I also do overtime job on weekend). I do not accept the package itself as payment or discount, afterall I need to make a living out of that. If I need some assets I will buy what I need from the AssetStore (or hire a artist ^^). ?Conflict of interests disclosure: I'm also an assets developer, but I'm a programmer, so the assets I release are coding related stuff. Also I will not review your packages for money (that's against Asset store rules). Of course there's no rule preventing me to tweet about your arts ^^. And I will be happy to tweet about your art (if you like I do so).   ?About the banner I attached: ?It is a screenshot of one of the games I worked on, all the art inside the game was bought on the AssetStore.
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!