/
githubmirror
/
vgstation13
Обзор
Документация
Войти
/
githubmirror
/
vgstation13
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
Bleeding-Edge
code/modules/fissionreactor/objects_internal.dm
385 строк
17 KB
CrazyAmphibian
just one more fission pr bro (slimmed down version) (#37612)
02 июн 2025, 23:06
Не верифицирован
02 июн 2025, 23:06
e4f02de
Код
Авторство
О чём код?
/* IN THIS FILE: objects that make up the interior (inside) of the reactor. included: control rods fuel rods (machine) */ /obj/machinery/fissionreactor anchored=1 density=1 var/datum/fission_reactor_holder/associated_reactor=null name="fission reactor part" /obj/machinery/fissionreactor/New() //update surrounding so that they are colored ..() for(var/obj/machinery/fissionreactor/part in range(src,1) ) part.update_icon() /obj/machinery/fissionreactor/Destroy() for(var/obj/machinery/fissionreactor/part in range(src,1) ) loc=null part.update_icon() if(associated_reactor) associated_reactor.handledestruction(src) ..() //commented out while a better sound solution is added, since this is buggy. here because pushing a hotfix. /* /obj/machinery/fissionreactor/process() ..() if(associated_reactor && associated_reactor.considered_on()) var/volume=30*(1-associated_reactor.control_rod_insertion)+10 //volume ranges 10-40 depending on the rod level playsound(src,'sound/machines/fission/reactor_hum.ogg',volume,1,5) //very low variance. some extra range */ /obj/machinery/fissionreactor/fissionreactor_controlrod name="fission reactor control rod assembly" desc="Monitors a nuclear reactor and can slow or halt the fission process if needed." icon='icons/obj/fissionreactor/controlrod.dmi' icon_state="controlrod_off" /obj/machinery/fissionreactor/fissionreactor_controlrod/examine() ..() if(associated_reactor) to_chat(usr,"The lights indicate that there are [overlays.len] adjacent fuel rod assemblies") switch(icon_state) if("controlrod_0") to_chat(usr,"The rod is hardly inserted.") //haha that's what she said if("controlrod_1") to_chat(usr,"The rod is partially inserted.") if("controlrod_2") to_chat(usr,"The rod is just under halfway inserted.") if("controlrod_3") to_chat(usr,"The rod is just over halfway inserted.") if("controlrod_4") to_chat(usr,"The rod is mostly inserted.") if("controlrod_5") to_chat(usr,"The rod is nearly fully inserted.") to_chat(usr,"The structure is held together firmly, it'll have to be cut in order to part it.") /obj/machinery/fissionreactor/fissionreactor_controlrod/New() for(var/datum/fission_reactor_holder/r in fissionreactorlist) if(r.turf_in_reactor(src.loc)) if(r.adopt_part(src)) break ..() /obj/machinery/fissionreactor/fissionreactor_controlrod/attackby(var/obj/item/O,var/mob/user) if(iswelder(O)) if(associated_reactor && associated_reactor.considered_on()) if(user.a_intent==I_HELP) to_chat(usr,"<span class='danger'>this seems like a really bad idea.</span>") return user.visible_message("<span class='notice'>[user] starts welding \the [src]'s external plating off its frame.</span>", "<span class='notice'>You start welding \the [src]'s external plating off its frame.</span>") var/obj/item/tool/weldingtool/WT = O if(WT.do_weld(user,src,60,0)) var/obj/machinery/constructable_frame/machine_frame/reinforced/newframe= new /obj/machinery/constructable_frame/machine_frame/reinforced(loc) newframe.forceMove(loc) newframe.set_build_state(3) newframe.circuit= new /obj/item/weapon/circuitboard/fission_control_rod newframe.components=list() newframe.components+= new /obj/item/stack/rods(null,2) newframe.components+=new /obj/item/weapon/stock_parts/manipulator newframe.components+=new /obj/item/weapon/stock_parts/matter_bin qdel(src) /obj/machinery/fissionreactor/fissionreactor_controlrod/update_icon() icon_state="controlrod_off" if(associated_reactor) var/statetouse=floor(associated_reactor.control_rod_insertion*5+0.5) icon_state="controlrod_[statetouse]" overlays=null if(!associated_reactor) return if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTH) ) overlays+=image(icon, src,"cr_overlay_N-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTH) ) overlays+=image(icon, src,"cr_overlay_S-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, EAST) ) overlays+=image(icon, src,"cr_overlay_E-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, WEST) ) overlays+=image(icon, src,"cr_overlay_W-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTHEAST) ) overlays+=image(icon, src,"cr_overlay_NE-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTHEAST) ) overlays+=image(icon, src,"cr_overlay_SE-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTHWEST) ) overlays+=image(icon, src,"cr_overlay_NW-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTHWEST) ) overlays+=image(icon, src,"cr_overlay_SW-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, NORTH) ) overlays+=image(icon, src,"cr_overlay_N") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, SOUTH) ) overlays+=image(icon, src,"cr_overlay_S") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, EAST) ) overlays+=image(icon, src,"cr_overlay_E") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, WEST) ) overlays+=image(icon, src,"cr_overlay_W") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, NORTHEAST) ) overlays+=image(icon, src,"cr_overlay_NE") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, SOUTHEAST) ) overlays+=image(icon, src,"cr_overlay_SE") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, NORTHWEST) ) overlays+=image(icon, src,"cr_overlay_NW") if( locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, SOUTHWEST) ) overlays+=image(icon, src,"cr_overlay_SW") /obj/machinery/fissionreactor/fissionreactor_controlrod/ex_act(var/severity, var/child=null, var/mob/whodunnit) switch(severity) if(1) //dev if(rand()>0.1) //90% chance to destroy qdel(src) if(2) //heavy if(rand()<0.25) //25% chance to destroy qdel(src) if(3) //light return /obj/machinery/fissionreactor/fissionreactor_fuelrod icon='icons/obj/fissionreactor/fuelrod.dmi' desc="Monitors and stores a fuel rod for nuclear reactions." icon_state="fuelrod_off" name="fission reactor fuel rod assembly" var/adjacencybonus=1.0 var/hatchopen=FALSE /obj/machinery/fissionreactor/fissionreactor_fuelrod/process() ..() var/lightpow=0 if(associated_reactor?.considered_on()) lightpow=associated_reactor.fuel.wattage*(1-associated_reactor.control_rod_insertion)/250000 set_light(3,lightpow , "77ffffff") /obj/machinery/fissionreactor/fissionreactor_fuelrod/New() for(var/datum/fission_reactor_holder/r in fissionreactorlist) if(r.turf_in_reactor(src.loc)) if(r.adopt_part(src)) break ..() set_light(3,0 , "77ffffff") /obj/machinery/fissionreactor/fissionreactor_fuelrod/examine() ..() if(associated_reactor) to_chat(usr,"The lights indicate that there are [overlays.len] adjacent fuel rod assemblies.") if(icon_state=="fuelrod_active") to_chat(usr,"The center is emitting a blue glow.") to_chat(usr,"The structure is held together firmly, it'll have to be cut in order to part it.") to_chat(usr,"There is a maintenance hatch at the top, it is [hatchopen?"open":"screwed shut"].") /obj/machinery/fissionreactor/fissionreactor_fuelrod/update_icon() icon_state="fuelrod_off" if(associated_reactor) icon_state="fuelrod[associated_reactor.considered_on() ?"_active" : ""]" overlays=null if(!associated_reactor) return if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTH) ) overlays+=image(icon, src,"fuelrod_overlay_N-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTH) ) overlays+=image(icon, src,"fuelrod_overlay_S-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, EAST) ) overlays+=image(icon, src,"fuelrod_overlay_E-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, WEST) ) overlays+=image(icon, src,"fuelrod_overlay_W-off") var/obj/machinery/fissionreactor/fissionreactor_fuelrod/CFR= locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, NORTH) if( CFR ) overlays+=image(icon, src,"fuelrod_overlay_N[ (CFR.adjacencybonus<=0 || adjacencybonus<=0) ? "-off" : "" ]") CFR= locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, SOUTH) if( CFR ) overlays+=image(icon, src,"fuelrod_overlay_S[ (CFR.adjacencybonus<=0 || adjacencybonus<=0) ? "-off" : "" ]") CFR= locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, EAST) if( CFR ) overlays+=image(icon, src,"fuelrod_overlay_E[ (CFR.adjacencybonus<=0 || adjacencybonus<=0) ? "-off" : "" ]") CFR= locate(/obj/machinery/fissionreactor/fissionreactor_fuelrod) in get_step(src, WEST) if( CFR ) overlays+=image(icon, src,"fuelrod_overlay_W[ (CFR.adjacencybonus<=0 || adjacencybonus<=0) ? "-off" : "" ]") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTHEAST) ) overlays+=image(icon, src,"fuelrod_overlay_NE-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTHEAST) ) overlays+=image(icon, src,"fuelrod_overlay_SE-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, NORTHWEST) ) overlays+=image(icon, src,"fuelrod_overlay_NW-off") if( locate(/obj/machinery/fissionreactor/fissionreactor_controlrod) in get_step(src, SOUTHWEST) ) overlays+=image(icon, src,"fuelrod_overlay_SW-off") /obj/machinery/fissionreactor/fissionreactor_fuelrod/proc/get_reactivity() var/currentbonus=0.0 var/list/lofrds=associated_reactor.fuel_rods for (var/obj/machinery/fissionreactor/fissionreactor_fuelrod/fuel_rod in lofrds) //probably not the most efficent way... but it works well enough if (fuel_rod.loc.y==src.loc.y) if (fuel_rod.loc.x==src.loc.x+1 || fuel_rod.loc.x==src.loc.x-1) currentbonus+=fuel_rod.adjacencybonus if (fuel_rod.loc.x==src.loc.x) if (fuel_rod.loc.y==src.loc.y+1 || fuel_rod.loc.y==src.loc.y-1) currentbonus+=fuel_rod.adjacencybonus return 1.0+currentbonus /obj/machinery/fissionreactor/fissionreactor_fuelrod/proc/get_iscontrolled() var/list/lofrds=associated_reactor.control_rods for (var/obj/machinery/fissionreactor/fissionreactor_controlrod/control_rod in lofrds) if ((control_rod.loc.x-src.loc.x)**2<=1 && (control_rod.loc.y-src.loc.y)**2<=1 ) //ensure it's within 1 tile return TRUE return FALSE /obj/machinery/fissionreactor/fissionreactor_fuelrod/attackby(var/obj/item/O,var/mob/user) if(iswelder(O)) if(associated_reactor && associated_reactor.considered_on()) if(user.a_intent==I_HELP) to_chat(usr,"<span class='danger'>this seems like a really bad idea.</span>") return user.visible_message("<span class='notice'>[user] starts welding \the [src]'s external plating off its frame.</span>", "<span class='notice'>You start welding \the [src]'s external plating off its frame.</span>") var/obj/item/tool/weldingtool/WT = O if(WT.do_weld(user,src,60,0)) var/obj/machinery/constructable_frame/machine_frame/reinforced/newframe= new /obj/machinery/constructable_frame/machine_frame/reinforced(loc) newframe.forceMove(loc) newframe.set_build_state(3) newframe.circuit= new /obj/item/weapon/circuitboard/fission_fuel_rod newframe.components=list() newframe.components+= new /obj/item/stack/rods(null,2) newframe.components+=new /obj/item/weapon/stock_parts/scanning_module newframe.components+=new /obj/item/weapon/stock_parts/matter_bin qdel(src) if(O.is_screwdriver(user)) O.playtoolsound(src, 100) user.visible_message("<span class='notice'>[user] [hatchopen ? "closes" : "opens"] the maintenance hatch of the [src].</span>", "<span class='notice'>You [hatchopen ? "close" : "open"] the maintenance hatch of the [src].</span>") hatchopen=!hatchopen if(hatchopen && istype(O, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/mmmmmetal=O if(mmmmmetal.amount<4) to_chat(usr,"you don't have enough sheets to do this!") return mmmmmetal.use(4) var/obj/machinery/fissionreactor/fissionreactor_fuelrod/inert/newfrd=new /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert(src.loc) playsound(src,'sound/items/crowbar.ogg',50) newfrd.hatchopen=TRUE qdel(src) /obj/machinery/fissionreactor/fissionreactor_fuelrod/proc/boom(var/mob/whodunnit) if(!associated_reactor) return if(!associated_reactor.fuel) return var/expow= sqrt(associated_reactor.fuel.wattage/100000) message_admins("An explosion [whodunnit? "caused by [whodunnit]" : ""] caused a fuel rod with [expow] power to explode [src.loc.name] ([formatJumpTo(src,"JMP")])") explosion(src.loc,floor(expow*0.5),floor(expow*0.75),floor(expow)) /obj/machinery/fissionreactor/fissionreactor_fuelrod/ex_act(var/severity, var/child=null, var/mob/whodunnit) switch(severity) if(1) //dev if(rand()>0.1) //90% chance to destroy boom(whodunnit) qdel(src) if(2) //heavy if(rand()<0.25) //25% chance to destroy boom(whodunnit) qdel(src) if(3) //light return /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert name = "shielded fission reactor fuel rod assembly" adjacencybonus=0.0 desc="Monitors and stores a fuel rod for nuclear reactions. This unit has been modified with metal plating to remove the influence of nearby fuel rods." icon_state="fuelrod-inert_off" /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert/examine() to_chat(usr,"The adjacency lights are covered up.") if(icon_state=="fuelrod_active") to_chat(usr,"The center emits a blue glow.") to_chat(usr,"The structure is held together firmly, it'll have to be cut in order to part it.") to_chat(usr,"There is a maitinance hatch at the top, it is [hatchopen?"open":"screwed shut"].") /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert/update_icon() ..() icon_state="fuelrod-inert_off" if(associated_reactor) icon_state="fuelrod-inert[associated_reactor.considered_on() ? "_active" : ""]" /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert/attackby(var/obj/item/O,var/mob/user) if(iswelder(O)) if(associated_reactor && associated_reactor.considered_on()) if(user.a_intent==I_HELP) to_chat(usr,"<span class='danger'>this seems like a really bad idea.</span>") return user.visible_message("<span class='notice'>[user] starts welding \the [src]'s external plating off its frame.</span>", "<span class='notice'>You start welding \the [src]'s external plating off its frame.</span>") var/obj/item/tool/weldingtool/WT = O if(WT.do_weld(user,src,60,0)) var/obj/machinery/constructable_frame/machine_frame/reinforced/newframe= new /obj/machinery/constructable_frame/machine_frame/reinforced(loc) newframe.forceMove(loc) newframe.set_build_state(3) newframe.circuit= new /obj/item/weapon/circuitboard/fission_fuel_rod newframe.components=list() newframe.components+= new /obj/item/stack/rods(null,2) newframe.components+=new /obj/item/weapon/stock_parts/scanning_module newframe.components+=new /obj/item/weapon/stock_parts/matter_bin new /obj/item/stack/sheet/metal(src.loc,4) qdel(src) if(O.is_screwdriver(user)) O.playtoolsound(src, 100) user.visible_message("<span class='notice'>[user] [hatchopen ? "closes" : "opens"] the maintenance hatch of the [src].</span>", "<span class='notice'>You [hatchopen ? "close" : "open"] the maintenance hatch of the [src].</span>") hatchopen=!hatchopen if(hatchopen && iscrowbar(O)) new /obj/item/stack/sheet/metal(src.loc,4) var/obj/machinery/fissionreactor/fissionreactor_fuelrod/newfrd=new /obj/machinery/fissionreactor/fissionreactor_fuelrod(src.loc) playsound(src,'sound/items/crowbar.ogg',50) newfrd.hatchopen=TRUE qdel(src) /obj/machinery/fissionreactor/fissionreactor_fuelrod/inert/get_reactivity() return 1.0 /obj/item/weapon/circuitboard/fission_control_rod name = "Circuit board (Control Rod)" desc = "A circuit board used in control rods for safer fission reactors." build_path = /obj/machinery/fissionreactor/fissionreactor_controlrod board_type = MACHINE_REINFORCED origin_tech = Tc_ENGINEERING + "=4;" + Tc_PROGRAMMING + "=2;" + Tc_POWERSTORAGE + "=3" req_components = list( /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/stack/rods = 2, ) /obj/item/weapon/circuitboard/fission_fuel_rod name = "Circuit board (Fuel Rod)" desc = "A circuit board used in fuel rod assemblies for heat generation in fission reactors." build_path = /obj/machinery/fissionreactor/fissionreactor_fuelrod board_type = MACHINE_REINFORCED origin_tech = Tc_ENGINEERING + "=4;" + Tc_PROGRAMMING + "=2;" + Tc_POWERSTORAGE + "=3" req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/stack/rods = 2, )