Jump to content
  • Advertisement


  • Content count

  • Joined

  • Last visited

Community Reputation

13061 Excellent


About JTippetts

  • Rank

Personal Information

  • Role
    3D Artist
  • Interests


  • Github

Recent Profile Visitors

60069 profile views
  1. JTippetts

    Resistances and Defenses

    I've just come off a several-months-long jag of playing Path of Exile. PoE has influenced the (sporadic) development I've done through that time on Goblinson Crusoe by a great deal. While GC is turn-based, it shares a lot of the same DNA as PoE, specifically in the influence of Diablo and Diablo 2, so a lot of ideas and mechanics from those games have been seeded throughout GC. Like Diablo 2, Path of Exile implements a system of resistances for elemental damage (fire, ice, lightning). Resistance stat values are obtained primarily through gear, and are obtained as percentage values that accumulate up to a maximum value. For example, you could get a belt with +35% lightning resistance. Resistance amounts from gear and other sources are accumulated, then capped to a maximum value (75% by default), with the option of obtaining small increases to this maximum value via other sources. Resistance either reduces or increases (it is possible to have negative resistances that actually boost the damage the player takes) the incoming damage by the given percentage. As one progresses through the game, at certain checkpoints the player's resistance value has imposed upon it a penalty. In the beginning, this penalty was imposed in smaller stages as one progressed through the difficulty levels. (Difficulty levels simply repeat the story of the game, with higher-level monsters as well as the resistance penalty coming into play.) In current PoE, the penalties are imposed at two checkpoints within the story: the first after completing Act 5 (character level approximately L45) and the second after completing Act 10 (around 67 to 70 character level). The first checkpoint applies a -30% reduction to resistances, and the second checkpoint another -30%, for a total of -60%. I understand the thinking behind this design. The game is balanced around having maximum resistances. That is, any given encounter will be damage-tuned with the assumption that the player is at resistance cap, and thus not having the resistance value at cap can bring extra punishment and pain. This provides a constant pressure for equipment improvement as one progresses to end-game; gear that was fine before the checkpoint now is suddenly deficient, pressuring the player to seek upgrades. At a certain point, though, the player can obtain enough +res% to overcome the penalties and still raise their resistance to 75%, meaning they are effectively "done" with upgrading their resistances. (Further equipment upgrades for other stats must be chose to maintain these resistance caps, but that is usually not too difficult.) Typical players are encouraged to obtain these caps as soon as possible to ease the leveling and progression process. While I understand the design, I've always been bothered by the implementation. Having gear that was "fine" at one point suddenly become "totally deficient" in one instant after beating a single specific boss feels too abrupt. Also, I kinda don't like that at a certain point the pressure to maintain resistances eases up. So in GC, I am exploring ideas for putting this resistance penalty system on a smooth curve, rather than having the abrupt steps. The current iteration of this system uses a logistic function, which is a type of sigmoid function. Instead of collecting gear that provides +X% resistance to a given damage type, you collect gear that gives +Y resistance rating. This resistance rating is plugged into a logistic function to obtain the actual amount of resistance % to apply against incoming damage. The logistic function is structured like this: function res(rating, levelbase, levelslope) return (1.0 / (1.0 + math.pow(e, -levelslope * (rating - levelbase)))) *2.0 -1.0 end The function operates using the rating (granted by equipment and other buffs) as well as a base rating for a given level, levelbase. At level M, if the player's rating is equal to level base, then the granted resistance value will be 0%. Rating less than levelbase results in a negative resistance, while greater than levelbase grants a positive resistance. The factor levelslope is used to affect the spread of the function at a given level; ie, how quickly the resistance approaches 1.0 or -1.0. For example, if you use a levelslope of 1, that means that the resistance value will be very close to -1.0 at a rating that is 6 points below base, and will be very close to 1.0 at a rating that is 6 points above base. This slope value determines the slope of the curve where it passes through the origin of the graph. By making the slope shallower as the character level increases, that spread can be made wider, granting a larger window within which the rating will grant a resistance value somewhere between -1 and 1. This way, as resistance ratings grow larger, the absolute difference between the rating and the levelbase has a more gradual effect on the value. These graphs show how this works: At a levelslope of 1, you can see here that around 6 points below the levelbase, the curve approaches -1, and at around 6 points above, it approaches 1. So if the base resistance rating for that level were, say, 10 then if you had a rating of 4, you would have a resistance value of -100% (or close to), meaning you would effectively take double damage, whereas if you had a rating of 16, you would have a resistance of 100%, meaning you would take no damage. Now, at a higher level, you might have a levelslope of, say, 1/3: Here you can see that the spread is now approximately -16 to +16 from level base. If the levelbase rating for that level were, say, 100 then if you had 84 rating or below you would take double damage, whereas if you had 116 or higher you would take no damage. Of course, the base and slope ratings would be a candidate for a great deal of tuning in the final game. The constant increase of levelbase applies constant pressure for the player to upgrade resistance, not simply at 1 or 2 main checkpoints, but all throughout the game, with that pressure growing larger the longer one plays and levels up without changing equipment. And this also doesn't account for having a resistance cap. In PoE, the default cap is 75%, which can be raised only through rare and special means, which is a sensible design decision in my opinion. A simple solution for this would be to multiply the output of the resistance function by the value of the cap if the output is positive (leaving the negative resistance value uncapped). Doing it this way, the positive side of the curve approaches the resistance cap, rather than 1.0, while the negative side is untouched. I could even implement a negative resistance cap, if so desired, to allow the player to build a stat to reduce the amount of damage taken from having a negative resistance. In my preliminary tests (which include no playtesting so far by anyone but myself) it seems to work fairly well, but this is one of those kinds of systems that I will need to tinker with and explore more fully in the final testing phases. Just because it works well now, doesn't mean it won't be massively exploitable in the future. I have also been tweaking and experimenting with damage types. At the moment, I have a system of damage types somewhat similar to PoE, though with quite a few differences. In my system, any given attack or spell can deal a certain combination of damage types selected from the set {Crush, Slash, Burn, Poison, Bleed, Void, Shock}. These damage types can additionally be tagged with modifiers drawn from the set {Projectile, Melee, Attack, Spell, Area, DoT, Siege} which can be used to apply damage increases or reductions. So as an example, a basic fireball of some sort might deal 2 damages. The first would be tagged {Crush | Area | Spell} and the second would be tagged {Burn | DoT | Area | Spell}. Player stats exist that can amplify or reduce damage dealt by any of these various tags. So, for example, it might be possible to have a stat that increases Spell damage by 13%, meaning both damage rolls from this fireball spell will be boosted by 13%. Primary damage types all come with a secondary debuff effect. Crush causes a stun/slow effect, slowing the target by some amount for some period of time. Slash damage causes a Bleed debuff that causes damage over time (this damage bearing the {Bleed | DoT} tags). Poison damage also applies a stacking debuff to poison and burn damage resistance rating, meaning that poison and burn damages become more potent the more poison stacks there are. Void causes an increased chance to take a critical strike, and Shock increases all damage taken by a certain %. These effects are all subject to change as the game develops further. The idea, though, is that each damage type should be differentiated by a mechanic, and not just by a type. I've played games where there was no mechanical difference between, ie, Fire and Lightning, merely cosmetic differences and the necessity of maintaining resistances against two types instead of just one. If a damage type doesn't lend itself to some mechanical difference from the others, then it will be altered or removed. At the moment, all damage types are mitigated in a similar manner, using the damage resistance calculations describe earlier. That is, 'physical' types such as Crush and Slash are not mitigated using any kind of armor rating, but instead are mitigated by Crush or Slash resistance rating granted by certain equipment. Homogenizing the various damage mitigation strategies in this manner vastly simplifies the design of the character combat back-end and balancing, though again it is subject to change in the future.
  2. JTippetts

    Introducing the Blockchain Tycoon

    Better make your tutorials comprehensive. I, for one, still have only the barest idea of how blockchain even works or what it's for, and I am certainly not alone.
  3. JTippetts

    Path finding for most simple path?

    A* I know, I know, A* is typically used as a shortest path algorithm. But that's not really what A* actually is. It's an 'optimal' path algorithm, where optimal is defined by the implementation. A* uses a cost-calculation function to calculate the cost of a given path up to the node being considered, and a cost-estimation function to estimate the cost of the path at completion. The typical use case is cost-calculation=how far to get here and cost-estimation=how far to the destination, but these are not requirements. If you can come up with a calculation function and heuristic function that estimates 'logicalness/reasonableness' of a path, then you can drop them right into an A* implementation and it should work. The trick, of course, is ironing out your calculation and heuristic.
  4. JTippetts

    Thinking about it, if I have time.

    Turns out, I didn't have time. Not even close.
  5. JTippetts

    A Few Farewells

    I feel ya on a lot of this. I too have pulled back on a lot of the online communities I once took active part in, gdnet as well as others. In my case, a lot of it is driven by personal life. I have kids now, a mortgage with all the attendant home-owning responsibilities, other hobbies that don't include games, etc.... Stuff that wasn't an issue 10 or 15 years ago or more. By necessity I've had to spend a lot less time online. Then, too, is the fact that I don't feel like I have as much to say around here as I did years ago. Technologies have moved on into realms I don't care about (mobiles, consoles, VR, etc....) Frameworks and APIs are born and die long before I even get a chance to look at them, even assuming I'd be interested in them in the first place. I read the forums, and 99% of the questions I either have zero interest in even attempting to participate in answering, or simply can't answer because it's a thing I have no experience with. Most of the questions I have personally had about game development have long since been asked and answered, and people just don't talk about the stuff I was interested in very much anymore. I don't play a lot of new games, so my personal view of games in general isn't really evolving these days. I still enjoy programming, but it's not a thing I feel a whole lot of need to share with people now. I never really got involved with Twitter. I have a twitter, and I think I tweeted some screenshots once, but I've never really liked the format and feel of Twitter, or social media in general. If I'm going to spend time reading stuff online, I'd rather read someone's long-form, thoughtful and well-edited essay on a topic that interests me than 140 characters of poorly formatted brain vomit that leads into an endless pile on of stupidity. So much of the so-called 'social media' seems to be actively engineered to discourage people from actually thinking about stuff, and instead encourage them to engage in full-on tribalist partisan bullshit and demonization of the other people. It's stomach turning, and I just don't think it's a productive use of ANYONE's time, much less my own. Sad to see you go, just as I've been sad to see so many other folks I've known around here over the years go.
  6. JTippetts

    retopology help

    Lately, I've been using this for retopo: https://github.com/wjakob/instant-meshes Works pretty nicely, and it's free. That being said, in Blender the chief tool for retopo is probably going to be a Remesh modifier, which is quite simple to use and you should be able to figure it out fairly quickly.
  7. JTippetts

    Lost Art Studios

    If the industry has ignored them, it's because the players have ignored them. SFB has a 300 page rule book, and that's not counting charts and tables. You honestly think that kind of thing has mass market appeal? You think the industry should toss out their action shooters, their FPSes, their clicker ARPGs (all of which do have mass market appeal) in favor of extremely dense and fiddly simulations? Get real, dude. Those kinds of games are the very definition of niche, so of course the mainstream industry isn't going to value them as highly as you do. You seem to think that "our industry" as you put it has for some reason decided to, in lockstep, single out rules-heavy simulation developers for exclusion. For what reason? To what end? Just to be assholes or something? Naw, bro. It's because you don't sell 30 million copies of a game by throwing a 300-page rule book at some fifteen year old kid. If you spent your life working on that kind of stuff, and you now find that it hasn't granted you any marketable skills, then how is that anybody's fault but your own? You bet on the wrong horse. Sometimes it happens. Maybe in your next life you'll create Doom instead, and get the Romero-like rockstar life you've always dreamed of.
  8. JTippetts

    Lost Art Studios

  9. Thinking about doing the latest gamedev challenge, assuming I can find the time. PacTank will rise. Maybe.
  10. JTippetts

    Lost Art Studios

    Let's just go with that then, if it'll make you feel better, and call this argument finished.
  11. Try to determine the absolute maximum number of items that might realistically occur in the typical game session (be generous), then increase it by 10%. Benchmark for that number of items, and if it performs acceptably then move on. Don't worry about optimizing for the "crazy extremes" cases. (I have a hard time believing that 100000 items is anywhere in the neighborhood of realistic; no player has time to sort through that amount of stuff.)
  12. JTippetts

    Goblinson Crusoe

    Goblinson Crusoe is the working name for a hex-based, turn-based RPG. Guide the adventures of Goblinson Crusoe, a young apprentice goblin wizard, as you work to pass the tests required to become a Master Wizard. Adrift in the Archipelago, lost among the islands where your master banished you, you must gather resources, construct artifacts, master spells, build siege machinery, and summon units or minions to help you fight or to defend your base. Gameplay ranges from dungeon crawls through monster-infested caves, to assaults upon fortified bases, and to defense of a base against waves of attackers. The game even features that long-time favorite of RPG players the world over: ESCORT QUESTS!
  13. Looks like mainly satellite imagery. Probably not feasible to reconstruct height data from those images.
  14. The basic building block of competency is strong familiarity with the language. You only get that with practice and experience, just like with any other skill. With skill and competency comes the ability to solve ever more complex problems. (And an RPG of any significant scale and scope is a quite complex problem.) A child doesn't start out running marathons; she starts out crawling first, then walking a few steps. Similarly, you won't be building that Dark Souls or Witcher 3-like RPG anytime soon, not until you've learned to run. Tutorials can only get you so far, are very frequently of poor quality, and are a very poor substitute for basic competency. A tutorial is tantamount to that child using a chair to hold herself up in a standing position. In order to build the RPG you envision, you MUST get past the "I need a tutorial to teach me this" stage. You have to be able to reason about and design and construct solutions on your own, and there just aren't any tutorials for that.
  15. Nothing in your list of stuff is impossible to do as a single developer. Similar things have been done before by solo devs. However, relying upon finding tutorials to help you accomplish all of the tasks probably isn't feasible. Your immediate goal should be to learn enough about design, development, patterns and techniques that you can reason your way to solutions on your own, rather than rely on tutorials to hold your hand the whole way through it. The best way to learn those patterns and techniques is to build smaller games. Even if they are not games that you ever release, they will still teach you a lot of the things you need to know to build larger projects.
  • Advertisement

Important Information

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

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!