Join GitHub today
GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.
Sign upMonster rebalance and lots of new animals #3837
Conversation
StrangerState
added some commits
Oct 23, 2013
This comment has been minimized.
This comment has been minimized.
|
I like most of this stuff however I would advise against making zombies tougher they are perfectly fine the way they are just a large amount of cannon fodder that isnt dangerous alone but bad in a group. |
This comment has been minimized.
This comment has been minimized.
|
Woah, lots of monster changes. Since their all in a single commit it'll take a while to look through them, but I'll post anything I don't like here as I find it.
That's all I see in the first pass, though there might be a few things I missed. |
This comment has been minimized.
This comment has been minimized.
|
I like idea of zombies being tougher. |
This comment has been minimized.
This comment has been minimized.
|
The slightly tougher zombies aren't a major problem when you're dealing with them one on one, even if you are a total scrub when it comes to melee. A zombie is no match for a healthy person in an even fight, being half-decayed and ravaged by disease and all that. Personally, I think the difference is harder to notice until you fight a group of them at once, or try fighting them on their own terms. That they are all a little stronger raises the stakes of confronting them, and it has a cumulative effect of badness when you start dealing with more than one at a time. There are lots of ways to deal with zombies besides throwing yourself at them when you don't know how to fight properly. Standing there trading hits with them without good armor is a bad idea. Using your superior wits and speed to stay out of reach should be key to defeating them without taking serious damage. Using difficult terrain to your advantage is still very sound. Traps are great too. Thanks for checking it out so fast. I've tried to address everything.
I'd generally like to have some more variation in the kinds of monsters that can appear in various locations. It would be fun to see an occasional town overrun by nether creatures or fungus instead of zombies, or a supermarket infested by giant ants or wasps, or even just a giant horde of cats inside a house. Little surprises give the player an extra reason to explore. The newer spawn systems make this sort of stuff pretty easy to implement, and it'll be fun to see what comes out of it. With enough variation, you'd never know what to expect, which is a better deal than walking into a new area and knowing exactly what can show up there.
|
This comment has been minimized.
This comment has been minimized.
|
This sounds like a good idea... I get sick of murdering x999 squirrels outside my base. Variation is great. |
This comment has been minimized.
This comment has been minimized.
|
@The13thRonin: Agreed. |
This comment has been minimized.
This comment has been minimized.
|
Edit: I am not sure how to feel about the general strength increase of monsters, only time will tell. But I really like the introduced variety of animal life. I see you added non-mutant versions of insects. This automatically begs for a method to manually goo-iffy them, into their giant versions ;p. May I suggest more mammals for consideration: |
This comment has been minimized.
This comment has been minimized.
|
I've only read the description so far, but I like the way you're going with this. |
kevingranade
reviewed
Oct 24, 2013
| const char* strip_positional_formatting(const char* msgid); | ||
|
|
||
| #if defined _WIN32 || defined __CYGWIN__ | ||
| /* Temporary fix - defining this so it will actually compile on Windows. |
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
Yea, this is definitely wrong, strip_positional_formatting() is supposed to be defined on all platforms.
Its possible your project file is missing translations.cpp
This comment has been minimized.
This comment has been minimized.
StrangerState
Oct 25, 2013
Author
Contributor
Yeah, it was missing, and this is fixed now. Feels pretty silly.
kevingranade
reviewed
Oct 24, 2013
| @@ -115,70 +127,73 @@ enum monster_trigger { | |||
| #define mfb(n) static_cast <unsigned long> (1 << (n)) | |||
| #endif | |||
| enum m_flag { | |||
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
Not your problem, but we have GOT to get rid of this thing. We're nearly out of bits for one thing, and all this redundant translation code can just go away once we do for another.
kevingranade
reviewed
Oct 24, 2013
| dying = false; | ||
| diffuse = false; | ||
| } | ||
| bool is_safe() { |
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
Whoops, not your fault, but this is broken, bears and moose are definitely not "safe", and zombears... yea. I guess we need a heuristic or something, maybe aggression level?
This comment has been minimized.
This comment has been minimized.
StrangerState
Oct 25, 2013
Author
Contributor
An easy one could be checking that aggression + morale < n, where n is whatever we want to count as dangerous. For the time being, I added a "GROUP_SAFE" and filled it with animals that hopefully shouldn't prove threatening.
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 25, 2013
Member
I think GROUP_SAFE is a good solution, it's nice and explicit, and has false positives (for them being dangerous) rather than false negatives, which can get people killed.
kevingranade
reviewed
Oct 24, 2013
| bool dying; | ||
| bool diffuse; // group size ind. of dist. from center and radius invariant | ||
| mongroup(std::string ptype, int pposx, int pposy, int pposz, | ||
| unsigned char prad, unsigned int ppop) { |
This comment has been minimized.
This comment has been minimized.
kevingranade
reviewed
Oct 24, 2013
| void mdeath::kill_breathers(game *g, monster *z) { | ||
| std::string monID; | ||
| for (int i = 0; i < g->num_zombies(); i++) { | ||
| monID = g->zombie(i).type->id; |
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
Slightly better to just declare the string inline right here, like:
const std::string monID = g->zombie(i).type->id;
kevingranade
reviewed
Oct 24, 2013
| @@ -497,28 +482,28 @@ void mdeath::zombie(game *g, monster *z) | |||
| default: | |||
| g->m.put_items_from("pants", 1, z->posx(), z->posy(), g->turn, 0, 0, rng(1,4)); | |||
| g->m.put_items_from("shirts", 1, z->posx(), z->posy(), g->turn, 0, 0, rng(1,4)); | |||
| if (one_in(6)) | |||
| { | |||
| // | |||
This comment has been minimized.
This comment has been minimized.
kevingranade
reviewed
Oct 24, 2013
| g->u.rem_disease("rat"); | ||
| if (g->u_see(z)) { | ||
| g->add_msg(_("Rats swarm from nowhere to avenge the %s."), z->name().c_str()); | ||
| g->add_msg(_("Swarming rats converge on you.")); |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
i2amroy
Oct 24, 2013
Member
That said we might not want to use the term "you", considering this could be triggered by an NPC killing it as well.
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
I was looking at this last night, mattack and mdeath are lousy with this issue.
That having been said, what's actually happening is a swarm of rats appearing.
kevingranade
reviewed
Oct 24, 2013
| g->add_msg(_("The %s melts away!"), z->name().c_str()); | ||
| void mdeath::melt(game *g, monster *z) { | ||
| if (g->u_see(z)) { | ||
| g->add_msg(_("The %s melts into a puddle."), z->name().c_str()); |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
i2amroy
Oct 24, 2013
Member
They shouldn't be. This is used for shadow creatures IIRC, so you might use "melts into nothing" if you were going that route.
kevingranade
reviewed
Oct 24, 2013
| int speed = z->speed - rng(30, 50); | ||
| if (speed <= 0) { | ||
| if (g->u_see(z)) | ||
| g->add_msg(_("The %s splatters apart."), z->name().c_str()); |
This comment has been minimized.
This comment has been minimized.
kevingranade
reviewed
Oct 24, 2013
| bool moveOK = (g->m.move_cost(z->posx()+i, z->posy()+j) > 0); | ||
| bool monOK = g->mon_at(z->posx()+i, z->posy()+j) == -1; | ||
| bool posOK = (g->u.posx != z->posx()+i || g->u.posy != z->posy() + j); | ||
| if (moveOK && monOK && posOK) { |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
i2amroy
Oct 24, 2013
Member
These are common enough that we might want to consider just moving them into their own functions.
i.e.
if (g->move_ok(i,j) && g->mon_ok(i,j) && g->pos_ok(i,j))Also this check could probably be shortened a little more by iterating from z->posx() - 1 to z->posx() + 1 and then just using g->m.move_cost(i,j) > 0
kevingranade
reviewed
Oct 24, 2013
| void mdeath::guilt(game *g, monster *z) { | ||
| const int MAX_GUILT_DISTANCE = 5; | ||
|
|
||
| /* TODO: Replace default cannibal checks with more elaborate conditions, |
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
Yea, we could stand to have a bit more drama around guilt-like stuff in general.
kevingranade
reviewed
Oct 24, 2013
| if (z->made_of("flesh") || z->made_of("hflesh")) | ||
| { | ||
| g->m.add_field(g, rand_posx, rand_posy, fd_gibs_flesh, rand_density); | ||
| if (!isFleshy && (overflowDamage < maxHP * 2) && (monSize < (int)MS_MEDIUM)) { |
This comment has been minimized.
This comment has been minimized.
kevingranade
reviewed
Oct 24, 2013
| const int gibX = z->posx() + rng(1,6) - 3; | ||
| const int gibY = z->posy() + rng(1,6) - 3; | ||
| const int gibDensity = rng(1, 3); | ||
| const field_id gibType = (z->made_of("veggy") ? fd_gibs_veggy : fd_gibs_flesh); |
This comment has been minimized.
This comment has been minimized.
kevingranade
reviewed
Oct 24, 2013
|
|
||
| } else { // We're above ground! | ||
| square(this, t_slope_up, SEEX - 1, SEEY - 1, SEEX, SEEY); | ||
| if (one_in(5)) { |
This comment has been minimized.
This comment has been minimized.
kevingranade
Oct 24, 2013
Member
If you want finer-grained distribution, I think a better structure is:
switch(rng(1, 10)) {
case1: case 2:
//Some Ant food.
break;
case 3: case 4:
// Lots of Ant food.
break;
case 5:
// Hermit cave.
break;
default:
// 50% chance of bupkis.
break;
}
Especially since the hermit cave isn't actually 1/10, stacking the checks skews the probability such that "none" is a good bit less than 50%, but it's not intuitive that that's the case.
This comment has been minimized.
This comment has been minimized.
|
All the code looks great modulo my comments. EDIT: Something I thought about later, diluting the swamp creatures with innocuous wildlife may well be a good thing. |
This comment has been minimized.
This comment has been minimized.
|
Yes but the problem with "tactics" is that we have very little of them. Tactics comes down to get on slow moving terrain or be so speedy that they cant hit you (and if they do your fucked). Zombies are suppose to be the weak enemies of game with the different classes of zombie making up the tougher rank zombies are pretty much only a threat in groups which they are going to get more group related things to make them more powerful with out changing their stats (moaning to alert other zombies). |
This comment has been minimized.
This comment has been minimized.
|
I'm actually good with the rebalance of normal zombies, since their melee skill (which both determines your dodge penalty and their chance of "missing") goes down. I would suggest one further thing to normal zombies though, the removal of their cut damage. I'm not exactly sure why their normal attack cuts, but it probably shouldn't. Other then that normal zombies seem pretty well balanced, though we'll need more testing time to verify overall. |
This comment has been minimized.
This comment has been minimized.
|
You can break skin with bash damage, as I found out when climbing over a dog gate the other day. Not thrilled about zeds being made tougher. There should be actual fights--squirrels, etc do not count--that a beginning character/player has a good chance of winning. Not many, and not in every critter type, biome, etc. Keep in mind that we have people complaining about how terrain-use is "abusing an exploit", "cheating", "needs nerfed", and so on. I like that as one plan, but making it closer to mandatory might not be a good idea. Little worried about the massive critter-influx. In particular, how will this work with Zombie Critters, and (once I get the mutagen project going) meat-tracking? Would we have to individual-case each and every species that qualifies for Beast, Bird, etc? |
This comment has been minimized.
This comment has been minimized.
Just operate it on a species basis and it should automatically apply to all animals of that species. |
StrangerState
added some commits
Oct 25, 2013
This comment has been minimized.
This comment has been minimized.
|
The only thing I find unacceptably irksome is the boost you gave to shambler speed. These are zombies. Otherwise, this would be good if zed changes are taken out and put into another commit. |
This comment has been minimized.
This comment has been minimized.
|
I have to agree about speed boosts, I haven't had a chance to go over the monster stat changes, but that sounds like a dangerous thing to mess with. We already have mechanics (mostly pain, also dogs and other faster zombies) that hamper your ability to escape from a horde, making regular zombies better able to keep up sounds problematic. |
This comment has been minimized.
This comment has been minimized.
dwarfkoala
commented
Oct 25, 2013
|
I'm with the others on this. I don't think that zombies should have increased speed, as that makes an involuntary difficulty ramp. If you want a harder game, spawn rate is the way to go. I personally have had wonderful times on size 7 cities and starting with 2x spawn density, and increasing it as I get more stuff and skills. |
StrangerState
added some commits
Oct 25, 2013
This comment has been minimized.
This comment has been minimized.
|
Okay, I set the zombie speeds back down to their previous values, and dropped all the zombie type creatures at large into a separate commit. Some special zombies are still a little slower than before. The spawn density modifier is a nice knob to have, but it doesn't have much to do with the consistency of individual creatures and their attributes. If you're too strong for an average zombie to harm, then it doesn't matter how many of them spawn, you'll just be chopping through that many more when the danger they pose becomes insignificant. The power curve in the game has always been extremely steep, and one reason is that while the player gets stronger over time, there seem to be tiers with many creatures of comparable strength, and many of them can be defeated by an unskilled player at the start of the game. That isn't necessarily a bad thing, but it wouldn't hurt to have some stronger mutants and nether beings, or suitably rare Jabberwock-tier creatures to give the epic cyborg ninja characters something new to serve as a challenge. |
This comment has been minimized.
This comment has been minimized.
|
I don't disagree that we need some higher level challenges, we definitely do. Also I'm not saying I disagree with your changes per se, I haven't looked at those yet, but I'm cautious about changing zombie speed in particular. |
StrangerState
added some commits
Oct 25, 2013
This comment has been minimized.
This comment has been minimized.
|
@i2amroy: Last I knew, Mammal wasn't broken out into Beast and Cattle, but I'll improvise. |
This comment has been minimized.
This comment has been minimized.
|
Added the Hunter Zombie, which is a running, leaping, sharp clawed zombie, slightly rarer than a Grabber Zombie. I also did a new run of testing and adjusted some zombie combat attributes. Fighting a hunter. They're not a great threat, sort of a go-between for zombie dogs and regular zombies. Thing is, they don't ever seem to leap around like they're supposed to, and I haven't figured out why. |
This comment has been minimized.
This comment has been minimized.
|
looks good to go, I'm testing for pull now. |
StrangerState commentedOct 23, 2013
This is the first of some updates I've been working on for DDA's flora and fauna.
Existing creatures are generally rebalanced for difficulty. Zombies are a little stronger, but not extremely so. They'll still fall by the thousands against a powerful combatant, but completely untalented fighters will need to be more careful in the beginning than they might have been before.
Later-game enemies were made stronger, substantially so in some cases. Animals were given more behavior triggers to simulate more realistic wild animal behavior (most non-mutant animals will try to avoid the player if possible, but tougher ones will fight if pursued). More predatory animals will be interesting in attacking a weak player. This should help regulate the cliff racer style, suicidal annoyance attacks of certain kinds of wildlife.
I know that there's been some adjustment made in these areas already, and unless I missed something, the recent changes to monster groups and the like should be present and accounted for.
Some new creature symbols were assigned to maintain the kind of "symbol by type" consistency that most of the creatures adhere to. This means deer now show up as a Nethack-style "q" for quadruped, because "d" is reserved for canids. This is in line with how we were already displaying "r"odents and "R"obots and other things. The "q" deer was a little jarring at first, but it's grown on me.
Some monster types that were previously classed as "UNKNOWN" have a new species ID assigned. Most of the creature descriptions are rewritten, and a few creature names were changed, although the previous identifiers were left alone for sanity's sake.
The list of new animals for this PR:
Monster group raws were modified as well, the forest group most of all. Cave populations are less hard-coded, and farm animals will sometimes spawn at abandoned farms, if there are no zombies spawned there.
Also included are normal-sized versions of the giant arthropods. There's a new VERMIN flag that denotes a creature as too insignificant a size to participate in normal combat or leave behind a corpse. Vermin are currently always displaced if they player moves into them. They don't show up on the main screen's list of monsters, and many of them blend in with the ground (at least when using ASCII), so they might not be noticed unless one is actively looking or waiting around in one spot.
The plan for them is to have vermin sometimes spawn when you pick up rocks and sticks, and to allow the player to eat them by 'e'xamining. Eating bugs is a very viable survival strategy if you avoid the poisonous ones. There are also SMALL_BITES and HUNTS_VERMIN flags, but these aren't yet functional.