mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-04 14:01:22 +00:00
Speeds up gas movement significantly Documents the intent and finer details of the atmos system (Thanks dunc) Fixes excited groups constantly rebuilding, this broke 4 years ago Fixes superconductors just straight up not working Allows turfs to sleep while inside an excited group Adds a new subprocess to SSAir to support rebuilding in this state Most heat based behavior no longer relies on being inside a fire Adds a new element to support doing this cleanly Adds a new subprocess to SSAir to support doing this while a turf is asleep Refactors air_update_turf to allow for finer control Makes apcs take damage in heat to prevent infinite plasma fire diffs Cleans up immutable gas mixtures to make them work properly when the mix has gas in it Planetary turfs no longer create a new copy of themselves each time they process. We instead use a global immutable mix Cleans up a typed for loop in reactions Canisters will take damage from outside heat now Speeds up excited group dismantle Increases the superconductor threshold by 200k Cleans up some roundstart ATs on some ruins Uses /turf/open/var/excited to track if a turf is actively processing, preventing a |= Prevents openspace from trying to melt Tweaks a canister examine line Makes planetary turfs reset to base when broken down as part of an excited group Makes it impossible for planetary turfs to rebuild, just like space tiles Fixes closed turfs not activating their replacement when destroyed by moving closed -> open turf activation to the adjacent air subsystem. They were activating and then going back to sleep before adjacent air got a chance to tick. Fire alarms will trigger when the area gets too cold for humans
211 lines
6.4 KiB
Plaintext
211 lines
6.4 KiB
Plaintext
/obj/item/onetankbomb
|
|
name = "bomb"
|
|
icon = 'icons/obj/tank.dmi'
|
|
inhand_icon_state = "assembly"
|
|
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
|
throwforce = 5
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
throw_speed = 2
|
|
throw_range = 4
|
|
flags_1 = CONDUCT_1
|
|
var/status = FALSE //0 - not readied //1 - bomb finished with welder
|
|
var/obj/item/assembly_holder/bombassembly = null //The first part of the bomb is an assembly holder, holding an igniter+some device
|
|
var/obj/item/tank/bombtank = null //the second part of the bomb is a plasma tank
|
|
|
|
/obj/item/onetankbomb/IsSpecialAssembly()
|
|
return TRUE
|
|
|
|
/obj/item/onetankbomb/examine(mob/user)
|
|
return bombtank.examine(user)
|
|
|
|
/obj/item/onetankbomb/update_icon_state()
|
|
if(bombtank)
|
|
icon = bombtank.icon
|
|
icon_state = bombtank.icon_state
|
|
|
|
/obj/item/onetankbomb/update_overlays()
|
|
. = ..()
|
|
if(bombassembly)
|
|
. += bombassembly.icon_state
|
|
. += bombassembly.overlays
|
|
. += "bomb_assembly"
|
|
|
|
/obj/item/onetankbomb/wrench_act(mob/living/user, obj/item/I)
|
|
..()
|
|
to_chat(user, "<span class='notice'>You disassemble [src]!</span>")
|
|
if(bombassembly)
|
|
bombassembly.forceMove(drop_location())
|
|
bombassembly.master = null
|
|
bombassembly = null
|
|
if(bombtank)
|
|
bombtank.forceMove(drop_location())
|
|
bombtank.master = null
|
|
bombtank = null
|
|
qdel(src)
|
|
return TRUE
|
|
|
|
/obj/item/onetankbomb/welder_act(mob/living/user, obj/item/I)
|
|
..()
|
|
. = FALSE
|
|
if(status)
|
|
to_chat(user, "<span class='warning'>[bombtank] already has a pressure hole!</span>")
|
|
return
|
|
if(!I.tool_start_check(user, amount=0))
|
|
return
|
|
if(I.use_tool(src, user, 0, volume=40))
|
|
status = TRUE
|
|
log_bomber(user, "welded a single tank bomb,", src, "| Temp: [bombtank.air_contents.temperature-T0C]")
|
|
to_chat(user, "<span class='notice'>A pressure hole has been bored to [bombtank] valve. \The [bombtank] can now be ignited.</span>")
|
|
add_fingerprint(user)
|
|
return TRUE
|
|
|
|
/obj/item/onetankbomb/attack_self(mob/user) //pressing the bomb accesses its assembly
|
|
bombassembly.attack_self(user, TRUE)
|
|
add_fingerprint(user)
|
|
return
|
|
|
|
/obj/item/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
|
|
audible_message("[icon2html(src, hearers(src))] *beep* *beep* *beep*")
|
|
playsound(src, 'sound/machines/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
|
|
sleep(10)
|
|
if(QDELETED(src))
|
|
return
|
|
if(status)
|
|
bombtank.ignite() //if its not a dud, boom (or not boom if you made shitty mix) the ignite proc is below, in this file
|
|
else
|
|
bombtank.release()
|
|
|
|
//Assembly / attached device memes
|
|
|
|
/obj/item/onetankbomb/Crossed(atom/movable/AM as mob|obj) //for mousetraps
|
|
. = ..()
|
|
if(bombassembly)
|
|
bombassembly.Crossed(AM)
|
|
|
|
/obj/item/onetankbomb/on_found(mob/finder) //for mousetraps
|
|
if(bombassembly)
|
|
bombassembly.on_found(finder)
|
|
|
|
/obj/item/onetankbomb/attack_hand() //also for mousetraps
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if(bombassembly)
|
|
bombassembly.attack_hand()
|
|
|
|
/obj/item/onetankbomb/Move()
|
|
. = ..()
|
|
if(bombassembly)
|
|
bombassembly.setDir(dir)
|
|
bombassembly.Move()
|
|
|
|
/obj/item/onetankbomb/dropped()
|
|
. = ..()
|
|
if(bombassembly)
|
|
bombassembly.dropped()
|
|
|
|
|
|
|
|
|
|
// ---------- Procs below are for tanks that are used exclusively in 1-tank bombs ----------
|
|
|
|
//Bomb assembly proc. This turns assembly+tank into a bomb
|
|
/obj/item/tank/proc/bomb_assemble(obj/item/assembly_holder/assembly, mob/living/user)
|
|
//Check if either part of the assembly has an igniter, but if both parts are igniters, then fuck it
|
|
if(isigniter(assembly.a_left) == isigniter(assembly.a_right))
|
|
return
|
|
|
|
if((src in user.get_equipped_items(TRUE)) && !user.canUnEquip(src))
|
|
to_chat(user, "<span class='warning'>[src] is stuck to you!</span>")
|
|
return
|
|
|
|
if(!user.canUnEquip(assembly))
|
|
to_chat(user, "<span class='warning'>[assembly] is stuck to your hand!</span>")
|
|
return
|
|
|
|
var/obj/item/onetankbomb/bomb = new
|
|
user.transferItemToLoc(src, bomb)
|
|
user.transferItemToLoc(assembly, bomb)
|
|
|
|
bomb.bombassembly = assembly //Tell the bomb about its assembly part
|
|
assembly.master = bomb //Tell the assembly about its new owner
|
|
|
|
bomb.bombtank = src //Same for tank
|
|
master = bomb
|
|
|
|
forceMove(bomb)
|
|
bomb.update_icon()
|
|
|
|
user.put_in_hands(bomb) //Equips the bomb if possible, or puts it on the floor.
|
|
to_chat(user, "<span class='notice'>You attach [assembly] to [src].</span>")
|
|
return
|
|
|
|
/obj/item/tank/proc/ignite() //This happens when a bomb is told to explode
|
|
air_contents.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
|
|
var/fuel_moles = air_contents.gases[/datum/gas/plasma][MOLES] + air_contents.gases[/datum/gas/oxygen][MOLES]/6
|
|
air_contents.garbage_collect()
|
|
var/datum/gas_mixture/bomb_mixture = air_contents.copy()
|
|
var/strength = 1
|
|
|
|
var/turf/ground_zero = get_turf(loc)
|
|
|
|
if(master)
|
|
qdel(master)
|
|
qdel(src)
|
|
|
|
if(bomb_mixture.temperature > (T0C + 400))
|
|
strength = (fuel_moles/15)
|
|
|
|
if(strength >=2)
|
|
explosion(ground_zero, round(strength,1), round(strength*2,1), round(strength*3,1), round(strength*4,1))
|
|
else if(strength >=1)
|
|
explosion(ground_zero, round(strength,1), round(strength*2,1), round(strength*2,1), round(strength*3,1))
|
|
else if(strength >=0.5)
|
|
explosion(ground_zero, 0, 1, 2, 4)
|
|
else if(strength >=0.2)
|
|
explosion(ground_zero, -1, 0, 1, 2)
|
|
else
|
|
ground_zero.assume_air(bomb_mixture)
|
|
ground_zero.hotspot_expose(1000, 125)
|
|
|
|
else if(bomb_mixture.temperature > (T0C + 250))
|
|
strength = (fuel_moles/20)
|
|
|
|
if(strength >=1)
|
|
explosion(ground_zero, 0, round(strength,1), round(strength*2,1), round(strength*3,1))
|
|
else if(strength >=0.5)
|
|
explosion(ground_zero, -1, 0, 1, 2)
|
|
else
|
|
ground_zero.assume_air(bomb_mixture)
|
|
ground_zero.hotspot_expose(1000, 125)
|
|
|
|
else if(bomb_mixture.temperature > (T0C + 100))
|
|
strength = (fuel_moles/25)
|
|
|
|
if(strength >=1)
|
|
explosion(ground_zero, -1, 0, round(strength,1), round(strength*3,1))
|
|
else
|
|
ground_zero.assume_air(bomb_mixture)
|
|
ground_zero.hotspot_expose(1000, 125)
|
|
|
|
else
|
|
ground_zero.assume_air(bomb_mixture)
|
|
ground_zero.hotspot_expose(1000, 125)
|
|
|
|
ground_zero.air_update_turf(FALSE, FALSE)
|
|
|
|
/obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out.
|
|
var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles())
|
|
var/turf/T = get_turf(src)
|
|
if(!T)
|
|
return
|
|
T.assume_air(removed)
|
|
air_update_turf(FALSE, FALSE)
|
|
|
|
/obj/item/onetankbomb/return_analyzable_air()
|
|
if(bombtank)
|
|
return bombtank.return_analyzable_air()
|
|
else
|
|
return null
|