-
Notifications
You must be signed in to change notification settings - Fork 4.1k
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
[RDY] Adds weapon chemical launcher and new fungicidal gas type as ammo #12765
Changes from 6 commits
3780b1a
415cbf0
faebdbc
61a0b72
28c5b0c
401c156
aec4e01
09d4f44
39770ce
0dfd529
efbf03a
c77226d
cfd851c
7324aef
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5428,5 +5428,32 @@ | |
"built_in_mods": ["m203", "rifle_scope", "muzzle_brake"], | ||
"default_mods": ["pistol_grip", "rail_laser_sight"], | ||
"valid_mod_locations": [[ "accessories", 10 ],[ "barrel", 10 ],[ "bore", 10 ],[ "conversion", 10 ],[ "grip", 10 ],[ "magazine", 10 ],[ "mechanism", 10 ],[ "muzzle", 10 ],[ "rail", 10 ],[ "sights", 10 ],[ "stock", 10 ],[ "underbarrel", 10 ]] | ||
}, | ||
{ | ||
"id": "chemical_thrower", | ||
"type": "GUN", | ||
"symbol": "(", | ||
"color": "dark_gray", | ||
"name": "chemical thrower", | ||
"name_plural": "chemical throwers", | ||
"description": "A bulky, self-made chemical sprayer with an internal conversion mechanism that allows all sorts of chemicals to be dispersed to your surroundings.", | ||
"price": 15000, | ||
"material": ["steel", "plastic"], | ||
"flags": ["FIRE_100", "NEVER_JAMS"], | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fire 100 is quite a lot. With flamethrowers you can acquire the ammo easily by siphoning it from cars. Here you've got to craft every shot. Fire 20 or 50 should be fine, unless you intend to make the gas very powerful. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I thought that one canister filling of 2000 units (so 20 uses) should be enough to eradicate one large patch of fungus. I can't really tell how the gas will spread by only looking at the code though, so I don't know when it would be considered overpowered. This thing shouldn't be the end-all anti-fungus tool. |
||
"skill": "launcher", | ||
"ammo": "gas_fungicidal", | ||
"weight": 1150, | ||
"volume": 25, | ||
"bashing": 9, | ||
"cutting": 0, | ||
"to_hit": -1, | ||
"ranged_damage": -5, | ||
"dispersion": 300, | ||
"sight_dispersion": 150, | ||
"aim_speed" : 0, | ||
"recoil": 0, | ||
"durability": 6, | ||
"clip_size": 2000, | ||
"reload": 900 | ||
} | ||
] |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -323,6 +323,13 @@ void game::init_fields() | |
{"", "", ""}, '&', -1, | ||
{c_white, c_yellow, c_red}, {true, true, true}, {false, false, false}, MINUTES(50), | ||
{0,0,0} | ||
}, | ||
|
||
{ | ||
"fd_fungicidal_gas", | ||
{_("hazy cloud"),_("fungicidal gas"),_("thick fungicidal gas")}, '8', 8, | ||
{c_white, c_ltgray, c_dkgray}, {true, true, false}, {false, true, true}, MINUTES(30), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could also alter the time here. The |
||
{0,0,0} | ||
} | ||
|
||
}; | ||
|
@@ -753,7 +760,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
// because the only trap we're checking for is brazier | ||
const auto &ter = map_tile.get_ter_t(); | ||
const auto &frn = map_tile.get_furn_t(); | ||
|
||
const auto &trp = map_tile.get_trap(); | ||
// We've got ter/furn cached, so let's use that | ||
const bool is_sealed = ter_furn_has_flag( ter, frn, TFLAG_SEALED ) && | ||
|
@@ -1004,7 +1011,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
// The fire feeds on the ground itself until max density. | ||
time_added += 4 - cur->getFieldDensity(); | ||
smoke += 2; | ||
if( cur->getFieldDensity() > 1 && | ||
if( cur->getFieldDensity() > 1 && | ||
one_in( 200 - cur->getFieldDensity() * 50 ) ) { | ||
destroy( p, true ); | ||
} | ||
|
@@ -1013,7 +1020,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
// The fire feeds on the ground itself until max density. | ||
time_added += 5 - cur->getFieldDensity(); | ||
smoke += 2; | ||
if( cur->getFieldDensity() > 1 && | ||
if( cur->getFieldDensity() > 1 && | ||
one_in( 200 - cur->getFieldDensity() * 50 ) ) { | ||
ter_set( p, t_dirt ); | ||
furn_set( p, f_ash ); | ||
|
@@ -1030,7 +1037,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
} else { | ||
// Don't fuel raging fires or they'll burn forever | ||
// as they can produce small fires above themselves | ||
int new_density = std::max( cur->getFieldDensity(), | ||
int new_density = std::max( cur->getFieldDensity(), | ||
fire_there->getFieldDensity() ); | ||
// Allow smaller fires to combine | ||
if( new_density < 3 && | ||
|
@@ -1162,7 +1169,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
// Our iterator will start at end_i + 1 and increment from there and then wrap around. | ||
// This guarantees it will check all neighbors, starting from a random one | ||
const size_t end_i = (size_t)rng( 0, neighs.size() - 1 ); | ||
for( size_t i = ( end_i + 1 ) % neighs.size(); | ||
for( size_t i = ( end_i + 1 ) % neighs.size(); | ||
i != end_i; i = ( i + 1 ) % neighs.size() ) { | ||
if( one_in( cur->getFieldDensity() * 2 ) ) { | ||
// Skip some processing to save on CPU | ||
|
@@ -1595,6 +1602,7 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
curfield.findField( fd_relax_gas ) || | ||
curfield.findField( fd_nuke_gas ) || | ||
curfield.findField( fd_gas_vent ) || | ||
curfield.findField( fd_fungicidal_gas ) || | ||
curfield.findField( fd_fire_vent ) || | ||
curfield.findField( fd_flame_burst ) || | ||
curfield.findField( fd_electricity ) || | ||
|
@@ -1661,6 +1669,20 @@ bool map::process_fields_in_submap( submap *const current_submap, | |
make_rubble( p ); | ||
break; | ||
|
||
case fd_fungicidal_gas: | ||
{ | ||
dirty_transparency_cache = true; | ||
//spread the chemical agent as fast as smoke would | ||
spread_gas( cur, p, curtype, 80, 40 ); | ||
//check the terrain and replace it accordingly to simulate the fungus dieing off | ||
const auto &ter = map_tile.get_ter_t(); | ||
if( ter.has_flag( "FUNGUS" ) ) { | ||
ter_set( p, t_dirt ); | ||
furn_set( p, f_null ); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You need to have separate check for furniture. Otherwise when a fungal terrain has a non-fungal furniture, it will be destroyed too. |
||
} | ||
} | ||
break; | ||
|
||
default: | ||
//Suppress warnings | ||
break; | ||
|
@@ -2071,6 +2093,23 @@ void map::player_in_field( player &u ) | |
} | ||
break; | ||
|
||
case fd_fungicidal_gas: | ||
// Fungicidal gas makes you cough. | ||
// Thick fungicidal gas has a chance to poison you. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What if you've crossed a fungal threshold like mycus or marloss? Shouldn't it be doing extra damage/poison to you? |
||
{ | ||
bool inhaled = false; | ||
if( cur->getFieldDensity() == 3 && !inside ) { | ||
inhaled = u.add_env_effect("poison", bp_mouth, 5, 30); | ||
} else if( cur->getFieldDensity() == 2 && !inside ) { | ||
inhaled = u.add_env_effect("smoke", bp_mouth, 2, 7); | ||
} | ||
if( inhaled ) { | ||
// player does not know how the npc feels, so no message. | ||
u.add_msg_if_player(m_bad, _("You feel sick from inhaling the %s"), cur->name().c_str()); | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You don't do anything with the |
||
break; | ||
|
||
default: | ||
//Suppress warnings | ||
break; | ||
|
@@ -2366,7 +2405,14 @@ void map::monster_in_field( monster &z ) | |
z.moves -= rng( 10 * density, 30 * density ); | ||
dam += rng( 0, 10 * density ); | ||
} | ||
break; | ||
|
||
case fd_fungicidal_gas: | ||
if( z.type->in_species("FUNGUS") ) { | ||
const int density = cur->getFieldDensity(); | ||
z.moves -= rng( 10 * density, 30 * density ); | ||
dam += rng( 10, 15 * density ); | ||
} | ||
break; | ||
|
||
default: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -86,6 +86,7 @@ enum field_id : int { | |
fd_hot_air2, | ||
fd_hot_air3, | ||
fd_hot_air4, | ||
fd_fungicidal_gas, | ||
num_fields | ||
}; | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was having trouble with assigning a more general chemical_spray ammo-type. I wanted something like this:
{
"type" : "ammunition_type",
"id" : "chemical_spray",
"name" : "sprayable chemical",
"default" : "gas_fungicidal"
}
But it throws a debug-message, saying gas_fungicidal is not a valid ammo.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds like you only changed it in ammo_types, but not in ammo.json: "gas_fungicidal" had the old "ammo_type" field.
"ammo" field refers to the ammo type id. So if you're changing ammo id to "chemical_spray", the fungicidal gas needs
"ammo_type": "chemical_spray"
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah I did that ;) Still did not work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh forgot: the same in the thrower.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's it! Also, it makes much more sense, now that I think about it.