diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index af4549efa7..a2d308e16f 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -223,13 +223,14 @@ var/list/cached_scan_results = air.analyzer_results var/old_heat_capacity = air.heat_capacity() var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions. - var/initial_plasma = cached_gases[/datum/gas/plasma][MOLES] - var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide][MOLES] + var/initial_plasma = cached_gases[/datum/gas/plasma] + var/initial_carbon = cached_gases[/datum/gas/carbon_dioxide] var/scale_factor = (air.volume)/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions. var/toroidal_size = (2*PI)+TORADIANS(arctan((air.volume-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus var/gas_power = 0 + var/list/gas_fusion_powers = GLOB.meta_gas_fusions for (var/gas_id in cached_gases) - gas_power += (cached_gases[gas_id][GAS_META][META_GAS_FUSION_POWER]*cached_gases[gas_id][MOLES]) + gas_power += (gas_fusion_powers[gas_id]*cached_gases[gas_id]) var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is cached_scan_results[id] = instability//used for analyzer feedback @@ -241,9 +242,9 @@ carbon = MODULUS(carbon - plasma, toroidal_size) - cached_gases[/datum/gas/plasma][MOLES] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up - cached_gases[/datum/gas/carbon_dioxide][MOLES] = carbon*scale_factor + FUSION_MOLE_THRESHOLD - var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma][MOLES] + cached_gases[/datum/gas/plasma] = plasma*scale_factor + FUSION_MOLE_THRESHOLD //Scales the gases back up + cached_gases[/datum/gas/carbon_dioxide] = carbon*scale_factor + FUSION_MOLE_THRESHOLD + var/delta_plasma = initial_plasma - cached_gases[/datum/gas/plasma] reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass. if(instability < FUSION_INSTABILITY_ENDOTHERMALITY) @@ -252,19 +253,17 @@ reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5 if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist. - cached_gases[/datum/gas/plasma][MOLES] = initial_plasma - cached_gases[/datum/gas/carbon_dioxide][MOLES] = initial_carbon + cached_gases[/datum/gas/plasma] = initial_plasma + cached_gases[/datum/gas/carbon_dioxide] = initial_carbon return NO_REACTION - cached_gases[/datum/gas/tritium][MOLES] -= FUSION_TRITIUM_MOLES_USED + cached_gases[/datum/gas/tritium] -= FUSION_TRITIUM_MOLES_USED //The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic if(reaction_energy > 0) - air.assert_gases(/datum/gas/oxygen,/datum/gas/nitrous_oxide) - cached_gases[/datum/gas/oxygen][MOLES] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT) - cached_gases[/datum/gas/nitrous_oxide][MOLES] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT) + cached_gases[/datum/gas/oxygen] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT) + cached_gases[/datum/gas/nitrous_oxide] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT) else - air.assert_gases(/datum/gas/bz,/datum/gas/nitryl) - cached_gases[/datum/gas/bz][MOLES] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT) - cached_gases[/datum/gas/nitryl][MOLES] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT) + cached_gases[/datum/gas/bz] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT) + cached_gases[/datum/gas/nitryl] += FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT) if(reaction_energy) if(location) diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 1753587ad3..e08f806fe5 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -3,10 +3,9 @@ name = "nuclear particle" icon_state = "nuclear_particle" pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 20 - damage_type = TOX - irradiate = 2500 //enough to knockdown and induce vomiting - speed = 0.4 + flag = "rad" + irradiate = 5000 + speed = 0.4 hitsound = 'sound/weapons/emitter2.ogg' impact_type = /obj/effect/projectile/impact/xray var/static/list/particle_colors = list( @@ -25,22 +24,6 @@ add_atom_colour(particle_colors[our_color], FIXED_COLOUR_PRIORITY) set_light(4, 3, particle_colors[our_color]) //Range of 4, brightness of 3 - Same range as a flashlight -/atom/proc/fire_nuclear_particles(power_ratio) //used by fusion to fire random # of nuclear particles - power ratio determines about how many are fired - var/random_particles = rand(3,6) - var/particles_to_fire - var/particles_fired - switch(power_ratio) //multiply random_particles * factor for whatever tier - if(0 to FUSION_MID_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_LOW - if(FUSION_MID_TIER_THRESHOLD to FUSION_HIGH_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_MID - if(FUSION_HIGH_TIER_THRESHOLD to FUSION_SUPER_TIER_THRESHOLD) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_HIGH - if(FUSION_SUPER_TIER_THRESHOLD to INFINITY) - particles_to_fire = random_particles * FUSION_PARTICLE_FACTOR_SUPER - while(particles_to_fire) - particles_fired++ - var/angle = rand(0,360) - var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) - addtimer(CALLBACK(P, /obj/item/projectile.proc/fire, angle), particles_fired) //multiply particles fired * delay so the particles end up stagnated (once every decisecond) - particles_to_fire-- \ No newline at end of file +/atom/proc/fire_nuclear_particle(angle = rand(0,360)) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. + var/obj/item/projectile/energy/nuclear_particle/P = new /obj/item/projectile/energy/nuclear_particle(src) + P.fire(angle)