anchor.diff: +/**
  + * A gun that consumes a TTV to shoot an projectile with equivalent power.
  + *
  + * It's basically an immovable rod launcher.
  + */
   /obj/item/gun/blastcannon
   	name = "pipe gun"
   	desc = "A pipe welded onto a gun stock, with a mechanical trigger. The pipe has an opening near the top, and there seems to be a spring loaded wheel in the hole."
   	icon_state = "empty_blastcannon"
  -	var/icon_state_loaded = "loaded_blastcannon"
   	inhand_icon_state = "blastcannon_empty"
   	w_class = WEIGHT_CLASS_NORMAL
   	force = 10
  
positive.code: 	item_flags = NONE
  	clumsy_check = FALSE
  	randomspread = FALSE
  
  	var/hugbox = TRUE
  	var/max_power = INFINITY
  	var/reaction_volume_mod = 0
  	var/reaction_cycles = 3				//How many times gases react() before calculation. Very finnicky value, do not mess with without good reason.
  	var/prereaction = TRUE
  
  	var/bombcheck = TRUE
  	var/debug_power = 0
  
  	var/obj/item/transfer_valve/bomb
  
  /obj/item/gun/blastcannon/debug
  	debug_power = 80
  
negative.code: 	return ..()
  
  /obj/item/gun/blastcannon/update_icon_state()
  	. = ..()
  	icon_state = bomb ? icon_state_loaded : initial(icon_state)
  
  /obj/item/gun/blastcannon/attackby(obj/item/transfer_valve/bomb_to_attach, mob/user)
  	if(!istype(bomb_to_attach))
  		return ..()
  
  	if(!bomb_to_attach.tank_one || !bomb_to_attach.tank_two)
  		to_chat(user, "<span class='warning'>What good would an incomplete bomb do?</span>")
  		return FALSE
  	if(!user.transferItemToLoc(bomb_to_attach, src))
  		to_chat(user, "<span class='warning'>[bomb_to_attach] seems to be stuck to your hand!</span>")
  		return FALSE
  
  	user.visible_message("<span class='warning'>[user] attaches [bomb_to_attach] to [src]!</span>")
  	bomb = bomb_to_attach
  	name = "blast cannon"
  	desc = "A makeshift device used to concentrate a bomb's blast energy to a narrow wave."
  	update_icon()
  	return TRUE
  
  /// Handles the bomb power calculations
  /obj/item/gun/blastcannon/proc/calculate_bomb()
  	if(!istype(bomb) || !istype(bomb.tank_one) || !istype(bomb.tank_two))
  		return 0
  
  	var/datum/gas_mixture/temp = new(max(reaction_volume_mod, 0))
  	bomb.merge_gases(temp)
  
  	if(prereaction)
  		temp.react(src)
  		var/prereaction_pressure = temp.return_pressure()
  