Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Monster rebalance and lots of new animals #3837

Merged
merged 15 commits into from Oct 26, 2013

Conversation

Projects
None yet
@StrangerState
Copy link
Contributor

commented Oct 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:

  • Bat (Vespertilionidae)
  • Beaver (Castor canadensis)
  • Bobcat (Lynx rufus)
  • Bullfrog (Rana catesbeiana)
  • Black Rat (Rattus rattus)
  • Chicken (Gallus gallus domesticus)
  • Cow (Bos primigenius)
  • Deer Mouse (Peromyscus leucopus)
  • Gray Fox (Urocyon cinereoargenteus)
  • Red Fox (Vulpes vulpes)
  • Groundhog (Marmota monax)
  • Hare (Lepus americanus)
  • Horse (Equus ferus caballus)
  • Lemming (Synaptomys borealis)
  • Mink (Neovison vison)
  • Mole (Scalopus aquaticus)
  • Muskrat (Ondatra zibethicus)
  • Pig (Sus scrofa domesticus)
  • River Otter (Lontra canadensis)
  • Red Squirrel (Tamiasciurus hudsonicus)
  • Sheep (Ovis aries)
  • Shrew (Blarina brevicauda)
  • Weasel (Mustela frenata)

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.

@Nickboom1

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

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.

@i2amroy

This comment has been minimized.

Copy link
Member

commented Oct 24, 2013

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.

  1. I'm seeing a lot of places where you are adding FEAR triggers that already exist due to species. Case-in-point, squirrels now have the "HURT" and "FIRE" fear triggers when they already had them due to being a MAMMAL.
  2. You are using some new species but haven't added the appropriate ones to species.json
  3. There any particular reason normal squirrels now have an aggression of -89 instead of -99?
  4. Why are moose now the letter 'Q'?
  5. Why do crows have a difficulty of 10?
  6. Why do electric zombies do cutting damage? It's not like they have claws.
  7. I'm not that big of a fan for the necro/master speed decreases
  8. Fungal fighters are supposed to run away before dying. This doesn't happen if you increase their aggression to 100.
  9. Vinebeasts are supposed to be difficult to dodge. With a melee skill of 8 this isn't so much the case (any "average" dodger will have a fairly good success rate against them.
  10. Fungaloids are supposed to have weak attacks. Their main offense is in their spores, not their attacks.
  11. Young fungaloids, on the other hand, are supposed to attack, and therefore should have a higher melee skill than adults.
  12. How do wolf spiders "grab" you?
  13. The gracken is a reference to a starcraft player. I'm not sure why you decided to give it mouths instead of eyes.
  14. Hazmat bots are supposed to be one of the dangerous things about waste sarcophagi. They should be able to fight the player unless you are replacing them with something else.
  15. The tankbot is a tank. How is it hitting you without firing it's weapons? Running over you?

That's all I see in the first pass, though there might be a few things I missed.

@VampyreLord

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

I like idea of zombies being tougher.

@StrangerState

This comment has been minimized.

Copy link
Contributor Author

commented Oct 24, 2013

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.

@i2amroy,

Thanks for checking it out so fast. I've tried to address everything.

  1. Redundant triggers are removed. I wasn't sure if/what changes to species were going to be involved when I did up the flags, so I set up each trigger set specific to each creature.

  2. Added the missing species entries. That was just a dumb oversight.

  3. I wanted to acknowledge the gray squirrel as more aggressive than the red one. Anyway, it's back to -99.

  4. AA moose is a 'Q'uadruped the way a squirrel is a 'r'odent and a giant centipede is an 'a'rthropod, it's the Nethack style of creature symbolism by category and it's pretty well established in the game already, it just hasn't been very strictly enforced. I chose 'Q'uadruped for large non-equine ungulates, where q is for smaller creatures like deer, sheep, and pigs. Nethack uses 'q' for critters as large as a Mumak, but it seemed a natural thing to have the larger Q represent the largest deer, a lowercase q does a moose too little justice.

  5. The crow's difficulty is now 1. The zero was supposed to be typed over, but it was being uncooperative.

  6. I had the notion of long sharp clawed shocker zombies, but I can live without. Their melee cut is back to 0.

  7. I reraised necro/master speeds to 105, which is 5 more than the original value.

  8. Reduced fungal fighter aggression to 50.

  9. Raised Vinebeast melee skill to 16.

  10. Fungaloid melee skill is now 4, rolls 1d4+0.

  11. Young fungaloid has melee skill 8, rolls 2d4+2.

  12. In real life, all wolf spider species use their legs and pedipalps to grapple, drag down and restrain their prey before fully employing their venom. They're extremely aggressive, and skilled ambush hunters. As designed, even the giant version has venom too weak to immediately incapacitate a healthy person, but a big enough wolf spider would still try to eat people, and its effective and instinctive hunting methods would have little reason to alter. Having tested it, the "GRAB" flag's effect seems pretty appropriate.

  13. No real reason for the gracken's extra mouths, only whimsy. I just got rid of them.

  14. I'd be happy to work on some hostile new mutants or something along those lines to serve as a replacement threat. Perhaps Sludge Crawlers and Giant Cockroaches (two meters long should do, none of that rad roach stuff) could make for a suitable group of enemies for the time being.

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.

  1. I took out the tankbot's melee attack. If it's supposed to be more like a traditional barreled tank, then a straightforward melee roll does seem pretty out of place. I'd envisioned a sort of Dalek type thing, and just figured it should have some nasty array of close range implements to supplement its other weapons and let it exterminate better.
@The13thRonin

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

This sounds like a good idea... I get sick of murdering x999 squirrels outside my base.

Variation is great.

@Zireael07

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

@The13thRonin: Agreed.

@RadaRadaRada

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

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:
* Skunk;
* Porcupine;
* Star-nosed mole;
* Flying squirrel;
* Some sort of woodland and urban mouse.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Oct 24, 2013

I've only read the description so far, but I like the way you're going with this.
This one maybe squeaks by since it's almost all new content and code restyling, but please submit smaller chunks of changes. It makes the whole process of reviewing and merging easier for everyone involved.

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.

Copy link
@kevingranade

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.

Copy link
@StrangerState

StrangerState Oct 25, 2013

Author Contributor

Yeah, it was missing, and this is fixed now. Feels pretty silly.

@@ -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.

Copy link
@kevingranade

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.

dying = false;
diffuse = false;
}
bool is_safe() {

This comment has been minimized.

Copy link
@kevingranade

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.

Copy link
@StrangerState

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.

Copy link
@kevingranade

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.

mongroup.h Outdated
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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

Super minor nit, alignment.

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.

Copy link
@kevingranade

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;

@@ -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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

commenting out, nothing?

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

Good catch, I much prefer neutral tone.

This comment has been minimized.

Copy link
@i2amroy

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.

Copy link
@kevingranade

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.

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

Does it in fact leave a puddle?

This comment has been minimized.

Copy link
@i2amroy

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.

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

OMG, vermin blobs!

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

I like the way you think. Everybody else taking notes?

This comment has been minimized.

Copy link
@i2amroy

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

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

Yea, we could stand to have a bit more drama around guilt-like stuff in general.

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

I think you want monSize >= (int)MS_MEDIUM here.

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.

Copy link
@kevingranade

kevingranade Oct 24, 2013

Member

Minor nit, you can hoist this out of the loop.

mapgen.cpp Outdated

} 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.

Copy link
@kevingranade

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.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Oct 24, 2013

All the code looks great modulo my comments.
The implications of the stat changes will take longer, and I might not even be the best person to comment on those.

EDIT: Something I thought about later, diluting the swamp creatures with innocuous wildlife may well be a good thing.

@Nickboom1

This comment has been minimized.

Copy link
Contributor

commented Oct 24, 2013

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).

@i2amroy

This comment has been minimized.

Copy link
Member

commented Oct 24, 2013

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.

@KA101

This comment has been minimized.

Copy link
Contributor

commented Oct 25, 2013

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?

@i2amroy

This comment has been minimized.

Copy link
Member

commented Oct 25, 2013

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?

Just operate it on a species basis and it should automatically apply to all animals of that species.

@atomicdryad

This comment has been minimized.

Copy link
Contributor

commented Oct 25, 2013

The only thing I find unacceptably irksome is the boost you gave to shambler speed. These are zombies.
As far as making them harder; The melee stats require rebalances elsewhere , and are debatably good or bad. If you feel the game isn't hard enough, have you considered raising the spawn factor?

Otherwise, this would be good if zed changes are taken out and put into another commit.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Oct 25, 2013

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.

@dwarfkoala

This comment has been minimized.

Copy link

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

This comment has been minimized.

Copy link
Contributor Author

commented Oct 25, 2013

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.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Oct 25, 2013

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.

@KA101

This comment has been minimized.

Copy link
Contributor

commented Oct 26, 2013

@i2amroy: Last I knew, Mammal wasn't broken out into Beast and Cattle, but I'll improvise.

@StrangerState

This comment has been minimized.

Copy link
Contributor Author

commented Oct 26, 2013

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.

@kevingranade

This comment has been minimized.

Copy link
Member

commented Oct 26, 2013

looks good to go, I'm testing for pull now.

@kevingranade kevingranade merged commit 7bcf900 into CleverRaven:master Oct 26, 2013

1 check passed

default Build finished.
Details
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.