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

move no spawn condition #49

Merged
merged 2 commits into from
Jan 27, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 20 additions & 19 deletions src/mapgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,8 +1127,8 @@ class jmapgen_monster_group : public jmapgen_piece
}
};
/**
* Place spawn points for a specific monster (not a group).
* "monster": id of the monster.
* Place spawn points for a specific monster.
* "monster": id of the monster. or "group": id of the monster group.
* "friendly": whether the new monster is friendly to the player character.
* "name": the name of the monster (if it has one).
* "chance": the percentage chance of a monster, affected by spawn density
Expand Down Expand Up @@ -1197,37 +1197,38 @@ class jmapgen_monster : public jmapgen_piece
// Instead, apply a multipler to the number of monsters for really high densities.
// For example, a 50% chance at spawn density 4 becomes a 75% chance of ~2.7 monsters.
int odds_after_density = raw_odds * get_option<float>( "SPAWN_DENSITY" ) ;
int max_odds = 100 - ( 100 - raw_odds ) / 2;
int max_odds = ( 100 + raw_odds ) / 2;
float density_multiplier = 1;
if( odds_after_density > max_odds ) {
density_multiplier = 1.0f * odds_after_density / max_odds;
odds_after_density = max_odds;
}

if( !x_in_y( odds_after_density, 100 ) ) {
return;
}

int mission_id = -1;
if( dat.mission() && target ) {
mission_id = dat.mission()->get_id();
}

if( m_id != mongroup_id::NULL_ID() ) {
// Spawn single monster from a group
dat.m.place_spawns( m_id, 1, point( x.get(), y.get() ), point( x.get(), y.get() ), 1.0f, true,
false,
name, mission_id );
} else {
int spawn_count = roll_remainder( density_multiplier );

if( one_or_none ) { // don't let high spawn density alone cause more than 1 to spawn.
spawn_count = std::min( spawn_count, 1 );
}
if( raw_odds == 100 ) { // don't spawn less than 1 if odds were 100%, even with low spawn density.
spawn_count = std::max( spawn_count, 1 );

int spawn_count = roll_remainder( density_multiplier );

if( one_or_none ) { // don't let high spawn density alone cause more than 1 to spawn.
spawn_count = std::min( spawn_count, 1 );
}
if( raw_odds == 100 ) { // don't spawn less than 1 if odds were 100%, even with low spawn density.
spawn_count = std::max( spawn_count, 1 );
} else {
if( !x_in_y( odds_after_density, 100 ) ) {
return;
}
}

if( m_id != mongroup_id::NULL_ID() ) {
MonsterGroupResult spawn_details = MonsterGroupManager::GetResultFromGroup( m_id );
dat.m.add_spawn( spawn_details.name, spawn_count * pack_size.get(), point( x.get(), y.get() ),
friendly, -1, mission_id, name );
} else {
dat.m.add_spawn( *( ids.pick() ), spawn_count * pack_size.get(), point( x.get(), y.get() ),
friendly, -1, mission_id, name );
}
Expand Down