From 15dacd50b1c32525d163e431086b3b9c06900882 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 21 Feb 2015 19:36:57 +0000 Subject: [PATCH 001/312] Replaces cancable var with two new procs. Clean up. --- code/game/objects/structures/lattice.dm | 9 --------- code/game/turfs/simulated.dm | 2 +- code/game/turfs/simulated/floor.dm | 5 ++++- code/game/turfs/simulated/floor/plating.dm | 1 - code/game/turfs/space/space.dm | 5 +++++ code/game/turfs/turf.dm | 10 +++++++--- code/game/turfs/unsimulated/floor.dm | 1 - code/modules/power/cable.dm | 8 ++------ code/modules/power/power.dm | 4 ++-- 9 files changed, 21 insertions(+), 24 deletions(-) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 76e9135128b..9e53eda4403 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -95,28 +95,20 @@ desc = "A catwalk for easier EVA manuevering and cable placement." icon_state = "catwalkfull" -/obj/structure/lattice/catwalk/New() - var/turf/T = loc - T.cancable = 1 - ..() - /obj/structure/lattice/catwalk/Move() var/turf/T = loc - T.cancable = 0 for(var/obj/structure/cable/C in T) C.Deconstruct() ..() /obj/structure/lattice/catwalk/Destroy() var/turf/T = loc - T.cancable = 0 for(var/obj/structure/cable/C in T) C.Destroy() ..() /obj/structure/lattice/catwalk/Deconstruct() var/turf/T = loc - T.cancable = 0 for(var/obj/structure/cable/C in T) C.Deconstruct() ..() @@ -126,7 +118,6 @@ if(istype(C, /obj/item/stack/cable_coil)) var/turf/T = get_turf(src) T.attackby(C, user) //catwalks 'enable' coil laying on space tiles, not the catwalks themselves - return /obj/structure/lattice/catwalk/updateOverlays() overlays.Cut() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index df7601e52d2..fef4bbef000 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -45,4 +45,4 @@ M.inertia_dir = 0 return if(2) //lube - M.slip(0, 7, null, (STEP|SLIDE|GALOSHES_DONT_HELP)) \ No newline at end of file + M.slip(0, 7, null, (STEP|SLIDE|GALOSHES_DONT_HELP)) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 2ef4066499b..67aacd7049a 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -182,4 +182,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," dirtoverlay = new/obj/effect/decal/cleanable/dirt(src) dirtoverlay.alpha = 10 else if(dirt > 100) - dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200) \ No newline at end of file + dirtoverlay.alpha = min(dirtoverlay.alpha+10, 200) + +/turf/simulated/floor/can_have_cabling() + return !burnt & !broken & !lava diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index c0c65f4d039..363f1c40239 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -12,7 +12,6 @@ name = "plating" icon_state = "plating" intact = 0 - cancable = 1 broken_states = list("platingdmg1", "platingdmg2", "platingdmg3") burnt_states = list("panelscorched") diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 31f898eca1d..e1bed23a282 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -221,3 +221,8 @@ proc/setup_map_transitions() //listamania /turf/space/singularity_act() return + +/turf/space/can_have_cabling() + if(locate(/obj/structure/lattice/catwalk, src)) + return 1 + return 0 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b2b510e5457..80aeaeafc3b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -3,7 +3,6 @@ level = 1.0 var/intact = 1 - var/cancable = 0 //Properties for open tiles (/floor) var/oxygen = 0 @@ -43,7 +42,7 @@ user.Move_Pulled(src) /turf/attackby(obj/item/C, mob/user) - if(cancable && istype(C, /obj/item/stack/cable_coil)) + if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = C for(var/obj/structure/cable/LC in src) if((LC.d1==0)||(LC.d2==0)) @@ -187,7 +186,6 @@ /turf/proc/ReplaceWithCatwalk() src.ChangeTurf(/turf/space) - src.cancable = 1//so cables can be laid new /obj/structure/lattice/catwalk(locate(src.x, src.y, src.z) ) /turf/proc/phase_damage_creatures(damage,mob/U = null)//>Ninja Code. Hurts and knocks out creatures on this turf @@ -343,3 +341,9 @@ O.singularity_act() ChangeTurf(/turf/space) return(2) + +/turf/proc/can_have_cabling() + return !density + +/turf/proc/can_lay_cable() + return can_have_cabling() & !intact \ No newline at end of file diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index 1a4507dfd1f..3403d69ba30 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -7,7 +7,6 @@ name = "plating" icon_state = "plating" intact = 0 - cancable = 1 /turf/unsimulated/floor/bluegrid icon = 'icons/turf/floors.dmi' diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index c03819fdd88..9d02b64858a 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -627,7 +627,7 @@ obj/structure/cable/proc/avail() if(!isturf(user.loc)) return - if(!T.cancable) + if(!T.can_have_cabling()) user << "You can only lay cables on catwalks and plating!" return @@ -639,10 +639,6 @@ obj/structure/cable/proc/avail() user << "You can't lay cable at a place that far away." return - if(T.intact) // Ff floor is intact, complain - user << "You can't lay cable there unless the floor tiles are removed." - return - else var/dirn @@ -706,7 +702,7 @@ obj/structure/cable/proc/avail() // one end of the clicked cable is pointing towards us if(C.d1 == dirn || C.d2 == dirn) - if(!U.cancable) //checking if it's a plating or catwalk + if(!U.can_have_cabling()) //checking if it's a plating or catwalk user << "You can only lay cables on catwalks and plating!" return if(U.intact) //can't place a cable if it's a plating with a tile on it diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 68c82ec197a..bdaa16b22ac 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -464,7 +464,7 @@ // return a knot cable (O-X) if one is present in the turf // null if there's none /turf/proc/get_cable_node() - if(!src.cancable) + if(!can_have_cabling()) return null for(var/obj/structure/cable/C in src) if(C.d1 == 0) @@ -475,4 +475,4 @@ for(var/area/RA in src.related) var/obj/machinery/power/apc/FINDME = locate() in RA if (FINDME) - return FINDME \ No newline at end of file + return FINDME From 6a4b912d3e3fa6deff7660ef830c085cdf307fc4 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Fri, 27 Feb 2015 20:38:04 -0800 Subject: [PATCH 002/312] Pyrotechnics changes --- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 165 ++++++++++++++---- code/modules/reagents/Chemistry-Recipes.dm | 71 -------- 2 files changed, 134 insertions(+), 102 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index 0f20253e345..e5670eebbfc 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -42,7 +42,7 @@ F.ChangeTurf(/turf/space) if(istype(T, /turf/simulated/floor/)) var/turf/simulated/floor/F = T - if(prob(volume/10)) + if(prob(volume/5)) F.make_plating() if(istype(F, /turf/simulated/floor/)) new /obj/effect/hotspot(F) @@ -72,20 +72,15 @@ result = "sorium" required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) result_amount = 4 + +/datum/chemical_reaction/sorium_vortex + name = "sorium_vortex" + id = "sorium_vortex" + result = null + required_reagents = list("sorium" = 1) required_temp = 474 -/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/)) - goonchem_vortex(T, 1, 5, 3) -/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 1, 5, 3) - - -/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 1, 5, 6) @@ -101,21 +96,16 @@ id = "liquid_dark_matter" result = "liquid_dark_matter" required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) - result_amount = null + result_amount = 3 + +/datum/chemical_reaction/ldm_vortex + name = "LDM Vortex" + id = "ldm_vortex" + result = null + required_reagents = list("liquid_dark_matter" = 1) required_temp = 474 -/*/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/)) - goonchem_vortex(T, 0, 5, 3) - return -/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(!istype(M, /mob/living)) - return - if(method == TOUCH) - var/turf/simulated/T = get_turf(M) - goonchem_vortex(T, 0, 5, 3) - return*/ //o god what the fuck goof -/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) +/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, 5, 6) return @@ -160,9 +150,122 @@ /datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) sleep(rand(50,100)) var/turf/simulated/T = get_turf(holder.my_atom) - var/ex_severe = round(created_volume / 10) - var/ex_heavy = round(created_volume / 8) - var/ex_light = round(created_volume / 6) - var/ex_flash = round(created_volume / 4) + var/ex_severe = round(created_volume / 100) + var/ex_heavy = round(created_volume / 42) + var/ex_light = round(created_volume / 21) + var/ex_flash = round(created_volume / 8) explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) - return \ No newline at end of file + return + +/datum/reagent/flash_powder + name = "Flash Powder" + id = "flash_powder" + description = "Makes a very bright flash." + reagent_state = LIQUID + color = "#000000" //rgb: 96, 165, 132 + +/datum/chemical_reaction/flash_powder + name = "Flash powder" + id = "flash_powder" + result = "flash_powder" + required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) + result_amount = 3 + +/datum/chemical_reaction/flash_powder_flash + name = "Flash powder activation" + id = "flash_powder_flash" + result = null + required_reagents = list("flash_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) + if(C.eyecheck()) + continue + flick("e_flash", C.flash) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + +/datum/reagent/smoke_powder + name = "Smoke Powder" + id = "smoke_powder" + description = "Makes a large cloud of smoke that can carry reagents." + reagent_state = LIQUID + color = "#000000" //rgb: 96, 165, 132 + +/datum/chemical_reaction/smoke_powder + name = "smoke_powder" + id = "smoke_powder" + result = "smoke_powder" + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/smoke_powder_smoke + name = "smoke_powder_smoke" + id = "smoke_powder_smoke" + result = null + required_reagents = list("smoke_powder" = 1) + required_temp = 374 + secondary = 1 + mob_react = 1 + +/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + if(S) + S.set_up(holder, 10, 0, location) + S.start() + sleep(10) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + return + +/datum/reagent/sonic_powder + name = "Sonic Powder" + id = "sonic_powder" + description = "Makes a deafening noise." + reagent_state = LIQUID + color = "#000000" //rgb: 96, 165, 132 + +/datum/chemical_reaction/sonic_powder + name = "sonic_powder" + id = "sonic_powder" + result = "sonic_powder" + required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/sonic_powder_deafen + name = "sonic_powder_deafen" + id = "sonic_powder_deafen" + result = null + required_reagents = list("sonic_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + continue + C.show_message("BANG", 2) + C.Stun(5) + C.Weaken(5) + C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) + if(C.ear_damage >= 15) + C << "Your ears start to ring badly!" + else if(C.ear_damage >= 5) + C << "Your ears start to ring!" \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 2e52dc0ba70..2f2d58b2553 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -186,26 +186,6 @@ silicate required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) result_amount = 3 -/datum/chemical_reaction/flash_powder - name = "Flash powder" - id = "flash_powder" - result = null - required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) - result_amount = null -/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) - if(C.eyecheck()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - /datum/chemical_reaction/napalm name = "Napalm" id = "napalm" @@ -219,57 +199,6 @@ silicate holder.del_reagent(id) return -/* -/datum/chemical_reaction/smoke - name = "Smoke" - id = "smoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1 ) - result_amount = null - secondary = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/system/bad_smoke_spread/S = new /datum/effect/system/bad_smoke_spread - S.attach(location) - S.set_up(10, 0, location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - sleep(10) - S.start() - holder.clear_reagents() - return */ - -/datum/chemical_reaction/chemsmoke - name = "Chemsmoke" - id = "chemsmoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) - result_amount = null - secondary = 1 - mob_react = 1 - -/datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return - /datum/chemical_reaction/chloralhydrate name = "Chloral Hydrate" id = "chloralhydrate" From b95f44f235e608c6d1867faabfd4e6229403d1ed Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Fri, 27 Feb 2015 21:16:10 -0800 Subject: [PATCH 003/312] Loads of pyrotechnics changes --- code/datums/diseases/transformation.dm | 2 +- .../gamemodes/changeling/powers/tiny_prick.dm | 2 +- code/modules/food&drinks/food/condiment.dm | 4 +- .../modules/food&drinks/food/snacks_pastry.dm | 2 +- code/modules/food&drinks/food/snacks_soup.dm | 2 +- .../recipes/tablecraft/recipes_pastry.dm | 2 +- code/modules/hydroponics/grown.dm | 4 +- code/modules/mob/living/carbon/slime/slime.dm | 2 +- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 105 +++++++++++++++++- .../Drink-Reagents/Drinks.dm | 4 +- .../Consumable-Reagents/Food-Reagents.dm | 40 +------ code/modules/reagents/Chemistry-Recipes.dm | 6 +- .../reagents/reagent_containers/bottle.dm | 4 +- code/modules/research/experimentor.dm | 8 +- 14 files changed, 126 insertions(+), 61 deletions(-) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 2aaea111eb1..28dfa579d04 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -178,7 +178,7 @@ /datum/disease/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" - cures = list("frostoil") + cures = list("cryostylane") cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 2309d3ed850..39f4ffb9fe3 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -173,6 +173,6 @@ obj/effect/proc_holder/changeling/sting/cryo /obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) add_logs(user, target, "stung", object="cryo sting") if(target.reagents) - target.reagents.add_reagent("frostoil", 30) + target.reagents.add_reagent("cryostylane", 30) feedback_add_details("changeling_powers","CS") return 1 \ No newline at end of file diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index 774ab4fa801..e0312212374 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -19,7 +19,7 @@ "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), - "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), + "cryostylane" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("pepermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), @@ -186,7 +186,7 @@ volume = 10 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(10) - possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) + possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "cryostylane" = list("condi_cryostylane", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. /obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm index 20171e5e471..d1bac1e49d8 100644 --- a/code/modules/food&drinks/food/snacks_pastry.dm +++ b/code/modules/food&drinks/food/snacks_pastry.dm @@ -24,7 +24,7 @@ /obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() ..() - extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") + extra_reagent = pick("nutriment", "capsaicin", "cryostylane", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") reagents.add_reagent("[extra_reagent]", 3) if(prob(30)) icon_state = "donut2" diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food&drinks/food/snacks_soup.dm index 742f6f0d9b5..f8a18dedd98 100644 --- a/code/modules/food&drinks/food/snacks_soup.dm +++ b/code/modules/food&drinks/food/snacks_soup.dm @@ -67,7 +67,7 @@ /obj/item/weapon/reagent_containers/food/snacks/soup/mystery/New() ..() - extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") + extra_reagent = pick("capsaicin", "cryostylane", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") reagents.add_reagent("[extra_reagent]", 5) /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm index aba37404d2f..c0a50e49ad2 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm @@ -6,7 +6,7 @@ /datum/table_recipe/chaosdonut name = "Chaos donut" reqs = list( - /datum/reagent/consumable/frostoil = 5, + /datum/reagent/cryostylane = 5, /datum/reagent/consumable/capsaicin = 5, /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 3606153be97..cc62397b419 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -545,13 +545,13 @@ ..() reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) reagents.add_reagent("vitamin", 1 + round((potency / 50), 1)) - reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) + reagents.add_reagent("cryostylane", 3+round(potency / 5, 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob, params) . = ..() if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- Frostoil: [reagents.get_reagent_amount("frostoil")]%" + user << "- cryostylane: [reagents.get_reagent_amount("cryostylane")]%" /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index c148d07213c..27401409768 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -90,7 +90,7 @@ if(reagents.has_reagent("morphine")) // morphine slows slimes down tally *= 2 - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + if(reagents.has_reagent("cryostylane")) // cryostylane also makes them move VEEERRYYYYY slow tally *= 5 if(health <= 0) // if damaged, the slime moves twice as slow diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index e5670eebbfc..d06df6b93a2 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -23,7 +23,6 @@ /datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjust_fire_stacks(5) - M.IgniteMob() M.adjustFireLoss(5*REM) ..() return @@ -268,4 +267,106 @@ if(C.ear_damage >= 15) C << "Your ears start to ring badly!" else if(C.ear_damage >= 5) - C << "Your ears start to ring!" \ No newline at end of file + C << "Your ears start to ring!" + +/datum/reagent/phlogiston + name = "Phlogiston" + id = "phlogiston" + description = "+1 BURN, +1 BURNING and sets you alight. Don't be deceived by that meager +1, having phlogiston in the bloodstream can be very dangerous without a fire extinguisher or firebot. Even then, they can't prevent you from spontaneously igniting every cycle." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +/datum/chemical_reaction/phlogiston + name = "phlogiston" + id = "phlogiston" + result = "phlogiston" + required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) + result_amount = 3 + +/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjust_fire_stacks(1) + M.IgniteMob() + M.adjustFireLoss(1*REM) + ..() + return + +datum/reagent/cryostylane + name = "Cryostylane" + id = "cryostylane" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, cryostylane slowly cools all other reagents in the mob down to 0K." + color = "#B31008" // rgb: 139, 166, 233 + +/datum/chemical_reaction/cryostylane + name = "cryostylane" + id = "cryostylane" + result = "cryostylane" + required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume) + holder.chem_temp = 20 // cools the fuck down + return + + +datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature -= 30 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return + +datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) + if(volume >= 5) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +datum/reagent/pyrosium + name = "Pyrosium" + id = "pyrosium" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, cryostylane slowly cools all other reagents in the mob down to 0K." + color = "#B31008" // rgb: 139, 166, 233 + +/datum/chemical_reaction/pyrosium + name = "pyrosium" + id = "pyrosium" + result = "pyrosium" + required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1) + result_amount = 3 + +/datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume) + holder.chem_temp = 20 // also cools the fuck down + return + +datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 1) + M.bodytemperature += 30 * TEMPERATURE_DAMAGE_COEFFICIENT + ..() + return + +/datum/reagent/argine + name = "Argine" + id = "argine" + description = "Explodes when lowered to freezing temperatures." + reagent_state = LIQUID + color = "#000000" //rgb: 96, 165, 132 + +/datum/chemical_reaction/argine_explosion + name = "Argine Kaboom" + id = "argine_explosion" + result = null + required_reagents = list("argine" = 1) + result_amount = 1 + required_temp = 474 + mix_message = "Sparks start flying around the argine!" + +/datum/chemical_reaction/argine_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + sleep(rand(50,100)) + var/turf/simulated/T = get_turf(holder.my_atom) + var/ex_severe = round(created_volume / 100) + var/ex_heavy = round(created_volume / 42) + var/ex_light = round(created_volume / 21) + var/ex_flash = round(created_volume / 8) + explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm index d7ae0aa1ab9..9ba906699cc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm @@ -174,8 +174,8 @@ datum/reagent/consumable/coffee/on_mob_life(var/mob/living/M as mob) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) M.Jitter(5) - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) + if(holder.has_reagent("cryostylane")) + holder.remove_reagent("cryostylane", 5) ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index 966bcd00c57..aeaeab2cd60 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -106,8 +106,8 @@ datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) switch(data) if(1 to 15) M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("frostoil")) - holder.remove_reagent("frostoil", 5) + if(holder.has_reagent("cryostylane")) + holder.remove_reagent("cryostylane", 5) if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(5,20) if(15 to 25) @@ -196,42 +196,6 @@ datum/reagent/consumable/condensedcapsaicin/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/consumable/frostoil - name = "Frost Oil" - id = "frostoil" - description = "A special oil that noticably chills the body. Extraced from Icepeppers." - color = "#B31008" // rgb: 139, 166, 233 - -datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob) - if(!data) data = 1 - switch(data) - if(1 to 15) - M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT - if(holder.has_reagent("capsaicin")) - holder.remove_reagent("capsaicin", 5) - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(5,20) - if(15 to 25) - M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(10,20) - if(25 to INFINITY) - M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT - if(prob(1)) - M.emote("shiver") - if(istype(M, /mob/living/carbon/slime)) - M.bodytemperature -= rand(15,20) - data++ - ..() - return - -datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume) - if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) - //if(istype(T)) - // T.atmos_spawn_air(SPAWN_COLD) - datum/reagent/consumable/sodiumchloride name = "Table Salt" id = "sodiumchloride" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 2f2d58b2553..c658a734704 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -245,7 +245,7 @@ silicate name = "Solid Plasma" id = "solidplasma" result = null - required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) + required_reagents = list("iron" = 5, "cryostylane" = 5, "plasma" = 20) result_amount = 1 mob_react = 1 @@ -616,8 +616,8 @@ datum/chemical_reaction/pestkiller //Blue /datum/chemical_reaction/slimefrost name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" + id = "m_cryostylane" + result = "cryostylane" required_reagents = list("plasma" = 1) result_amount = 10 required_container = /obj/item/slime_extract/blue diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 239782e0faa..8107c7586a2 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -99,11 +99,11 @@ icon_state = "bottle3" list_reagents = list("capsaicin" = 30) -/obj/item/weapon/reagent_containers/glass/bottle/frostoil +/obj/item/weapon/reagent_containers/glass/bottle/cryostylane name = "Frost Oil Bottle" desc = "A small bottle. Contains cold sauce." icon_state = "bottle17" - list_reagents = list("frostoil" = 30) + list_reagents = list("cryostylane" = 30) /obj/item/weapon/reagent_containers/glass/bottle/traitor name = "syndicate bottle" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 4a800fff702..799edd3e7c0 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -408,7 +408,7 @@ visible_message("[src]'s emergency coolant system gives off a small ding!") var/obj/machinery/vending/coffee/C = new /obj/machinery/vending/coffee(get_turf(pick(oview(1,src)))) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready! - chosenchem = pick("uranium","frostoil","ephedrine") + chosenchem = pick("uranium","cryostylane","ephedrine") C.reagents.remove_any(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" @@ -418,8 +418,8 @@ visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src - R.add_reagent("frostoil" , 50) - investigate_log("Experimentor has released frostoil gas.", "experimentor") + R.add_reagent("cryostylane" , 50) + investigate_log("Experimentor has released cryostylane gas.", "experimentor") var/datum/effect/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) @@ -720,4 +720,4 @@ /obj/item/weapon/relic/proc/warn_admins(var/mob/user, var/RelicType) var/turf/T = get_turf(src) message_admins("[RelicType] relic activated by [key_name(user, user.client)](?) in ([T.x],[T.y],[T.z] - JMP)",0,1) - log_game("[RelicType] relic used by [user.ckey]([user]) in ([T.x],[T.y],[T.z])") + log_game("[RelicType] relic used by [user.ckey]([user]) in ([T.x],[T.y],[T.z])") From 3b2963dcab24a69645fd1c41f9ade87f9d8efd2d Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 28 Feb 2015 10:19:52 -0800 Subject: [PATCH 004/312] More changes, more bugs --- .../effects/effect_system/effects_smoke.dm | 15 ++- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 97 +++++++++++++++++-- 2 files changed, 98 insertions(+), 14 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index efca03256f6..4fc5cf2dee1 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -207,19 +207,18 @@ /obj/effect/effect/chem_smoke/Move() ..() - for(var/atom/A in view(1, src)) - if(reagents.has_reagent("radium")||reagents.has_reagent("uranium")||reagents.has_reagent("carbon")||reagents.has_reagent("thermite"))//Prevents unholy radium spam by reducing the number of 'greenglows' down to something reasonable -Sieve - if(prob(5)) - reagents.reaction(A) - else - reagents.reaction(A) + for(var/mob/living/carbon/human/A in view(1, src)) + if(reagents.total_volume >= 1) + reagents.reaction(A, INGEST) + reagents.trans_to(A.reagents, 10) return /obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob ) ..() - reagents.reaction(M) - + if(reagents.total_volume >= 1) + reagents.reaction(M, INGEST) + reagents.trans_to(M.reagents, 10) /datum/effect/effect/system/chem_smoke_spread var/total_smoke = 0 // To stop it being spammed and lagging! diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index d06df6b93a2..aa52e461ad1 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -4,6 +4,20 @@ #define REM REAGENTS_EFFECT_MULTIPLIER +/datum/reagent/stabilizing_agent + name = "Stabilizing Agent" + id = "stabilizing_agent" + description = "Keeps unstable chemicals stable. This does not work on everything." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + +/datum/chemical_reaction/stabilizing_agent + name = "stabilizing_agent" + id = "stabilizing_agent" + result = "stabilizing_agent" + required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) + result_amount = 3 + /datum/reagent/clf3 name = "Chlorine Trifluoride" id = "clf3" @@ -22,14 +36,16 @@ /datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjust_fire_stacks(5) - M.adjustFireLoss(5*REM) + M.adjust_fire_stacks(4) + M.adjustFireLoss(0.35*M.fire_stacks) ..() return /datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) var/turf/simulated/T = get_turf(holder.my_atom) for(var/turf/simulated/turf in range(1,T)) + if(istype(turf, /turf/simulated/wall)) + continue new /obj/effect/hotspot(turf) holder.chem_temp = 1000 // hot as shit return @@ -83,6 +99,13 @@ var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 1, 5, 6) +/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sorium", created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 1, 5, 6) + /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" @@ -108,6 +131,13 @@ var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, 5, 6) return +/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("liquid_dark_matter", created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 0, 5, 6) + return /proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) for(var/atom/movable/X in orange(range, T)) @@ -191,6 +221,23 @@ continue C.Stun(5) +/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) + if(C.eyecheck()) + continue + flick("e_flash", C.flash) + if(get_dist(C, location) < 4) + C.Weaken(5) + continue + C.Stun(5) + holder.remove_reagent("flash_powder", created_volume) + /datum/reagent/smoke_powder name = "Smoke Powder" id = "smoke_powder" @@ -230,6 +277,24 @@ holder.clear_reagents() return +/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("smoke_powder", created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + if(S) + S.set_up(holder, 10, 0, location) + S.start() + sleep(10) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + return + /datum/reagent/sonic_powder name = "Sonic Powder" id = "sonic_powder" @@ -269,6 +334,26 @@ else if(C.ear_damage >= 5) C << "Your ears start to ring!" +/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sonic_powder", created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/carbon/C in get_hearers_in_view(5, location)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + continue + C.show_message("BANG", 2) + C.Stun(5) + C.Weaken(5) + C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) + if(C.ear_damage >= 15) + C << "Your ears start to ring badly!" + else if(C.ear_damage >= 5) + C << "Your ears start to ring!" + /datum/reagent/phlogiston name = "Phlogiston" id = "phlogiston" @@ -287,14 +372,14 @@ if(!M) M = holder.my_atom M.adjust_fire_stacks(1) M.IgniteMob() - M.adjustFireLoss(1*REM) + M.adjustFireLoss(0.2*M.fire_stacks) ..() return datum/reagent/cryostylane name = "Cryostylane" id = "cryostylane" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, cryostylane slowly cools all other reagents in the mob down to 0K." + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." color = "#B31008" // rgb: 139, 166, 233 /datum/chemical_reaction/cryostylane @@ -324,7 +409,7 @@ datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) datum/reagent/pyrosium name = "Pyrosium" id = "pyrosium" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, cryostylane slowly cools all other reagents in the mob down to 0K." + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." color = "#B31008" // rgb: 139, 166, 233 /datum/chemical_reaction/pyrosium @@ -358,7 +443,7 @@ datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) result = null required_reagents = list("argine" = 1) result_amount = 1 - required_temp = 474 + required_temp = 174 mix_message = "Sparks start flying around the argine!" /datum/chemical_reaction/argine_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) From b1f60a61145da0055c3ab54bf1b91a0637a40fc2 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 28 Feb 2015 12:26:34 -0800 Subject: [PATCH 005/312] GOONCHEM 5.5: MORE TOXINS --- .../gamemodes/changeling/powers/tiny_prick.dm | 1 + code/game/machinery/bots/medbot.dm | 11 + .../items/weapons/storage/uplink_kits.dm | 6 + code/modules/hydroponics/grown.dm | 3 +- code/modules/hydroponics/seeds.dm | 6 +- .../modules/reagents/Chemistry-Goon-Toxins.dm | 196 +++++++++++++++++- code/modules/reagents/Chemistry-Holder.dm | 3 + .../Chemistry-Reagents/Chemistry-Reagents.dm | 3 + .../reagents/reagent_containers/bottle.dm | 36 ++++ 9 files changed, 259 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index 39f4ffb9fe3..fa9b0cb240c 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -174,5 +174,6 @@ obj/effect/proc_holder/changeling/sting/cryo add_logs(user, target, "stung", object="cryo sting") if(target.reagents) target.reagents.add_reagent("cryostylane", 30) + target.reagents.add_reagent("oxygen", 30) feedback_add_details("changeling_powers","CS") return 1 \ No newline at end of file diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm index 2dafe5746f3..ff900f4d1cf 100644 --- a/code/game/machinery/bots/medbot.dm +++ b/code/game/machinery/bots/medbot.dm @@ -51,6 +51,17 @@ treatment_fire = "omnizine" treatment_tox = "omnizine" +/obj/machinery/bot/medbot/derelict + name = "\improper Old Medibot" + desc = "Looks like it hasn't been modified since the late 2080s." + skin = "bezerk" + heal_threshold = 0 + declare_crit = 0 + treatment_oxy = "pancuronium" + treatment_brute = "pancuronium" + treatment_fire = "sodium_thiopental" + treatment_tox = "sodium_thiopental" + /obj/item/weapon/firstaid_arm_assembly name = "incomplete medibot assembly." desc = "A first aid kit with a robot arm permanently grafted to it." diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 89b613af2e3..77c76f1ac9e 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -178,4 +178,10 @@ new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/regadenoson(src) + new /obj/item/weapon/reagent_containers/glass/bottle/pancuronium(src) + new /obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental(src) + new /obj/item/weapon/reagent_containers/glass/bottle/coniine(src) + new /obj/item/weapon/reagent_containers/glass/bottle/curare(src) + new /obj/item/weapon/reagent_containers/glass/bottle/amanitin(src) return diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index cc62397b419..6a9b225d6ab 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -536,7 +536,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper seed = /obj/item/seeds/icepepperseed - name = "ice-pepper" + name = "chilly pepper" desc = "It's a mutant strain of chili" icon_state = "icepepper" filling_color = "#0000CD" @@ -546,6 +546,7 @@ reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) reagents.add_reagent("vitamin", 1 + round((potency / 50), 1)) reagents.add_reagent("cryostylane", 3+round(potency / 5, 1)) + reagents.add_reagent("oxygen", 3+round(potency / 5, 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob, params) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index d0f5597cea8..a821083c60f 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -386,11 +386,11 @@ growthstages = 4 /obj/item/seeds/icepepperseed - name = "pack of ice-pepper seeds" - desc = "These seeds grow into ice-pepper plants." + name = "pack of chilly pepper seeds" + desc = "These seeds grow into chilly pepper plants." icon_state = "seed-icepepper" species = "chiliice" - plantname = "Ice-Pepper Plants" + plantname = "Chilly Pepper Plants" product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper lifespan = 25 endurance = 15 diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index d7066b8abd1..377f9683daa 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -117,7 +117,7 @@ datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) result = "neurotoxin2" required_reagents = list("space_drugs" = 1) result_amount = 1 - required_temp = 370 + required_temp = 674 datum/reagent/cyanide name = "Cyanide" @@ -204,4 +204,196 @@ datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) result = "facid" required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) result_amount = 4 - required_temp = 380 \ No newline at end of file + required_temp = 380 + +datum/reagent/regadenoson + name = "Regadenoson" + id = "regadenoson" + description = "Major stamina regeneration buff. 33% chance to hit with 5-25 TOX. 5-10% chances to stun and cause suffocation or immediate heart failure." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.4 + +datum/reagent/regadenoson/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustStaminaLoss(-5) + if(prob(33)) + M.adjustToxLoss(rand(5,25)) + if(prob(rand(5,10))) + var/picked_option = rand(1,3) + switch(picked_option) + if(1) + M.Stun(3) + M.Weaken(3) + if(2) + M.losebreath += 10 + M.adjustOxyLoss(rand(5,25)) + if(3) + M.visible_message("[M] clutches at their chest as if their heart stopped!") + M.adjustBruteLoss(100) // rip in pepperoni + ..() + return + +datum/reagent/pancuronium + name = "Pancuronium" + id = "pancuronium" + description = "10 cycles to paralysis, 7% chance to cause 3-5 LOSEBREATH." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.2 + var/current_cycle = 0 + +datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + current_cycle++ + if(current_cycle == 10) + M.SetParalysis(10) + if(prob(7)) + M.losebreath += rand(3,5) + ..() + return + +datum/reagent/sodium_thiopental + name = "Sodium Thiopental" + id = "sodium_thiopental" + description = "KOs in ten cycles. Major total stamina penalty." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.7 + var/current_cycle = 0 + +datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + current_cycle++ + if(current_cycle == 10) + M.sleeping += 20 + M.adjustStaminaLoss(10) + ..() + return + +datum/reagent/sulfonal + name = "Sulfonal" + id = "sulfonal" + description = "+1 TOX, KOs in 22 cycles." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.1 + var/current_cycle = 0 + +/datum/chemical_reaction/sulfonal + name = "sulfonal" + id = "sulfonal" + result = "sulfonal" + required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + result_amount = 3 + +datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + current_cycle++ + if(current_cycle == 22) + M.sleeping += 20 + M.adjustToxLoss(1) + ..() + return + +datum/reagent/amanitin + name = "Amanitin" + id = "amanitin" + description = "On the last cycle that it's in you, it hits you with a stack of TOX damage based on elapsed cycles * rand(2,4). The more you use, the longer it takes before anything happens, but the harder it hits when it does." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + var/cycles = 0 + +datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + cycles++ + ..() + return + +datum/reagent/amanitin/reagent_deleted(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(cycles*rand(2,4)) + ..() + return + +datum/reagent/lipolicide + name = "Lipolicide" + id = "lipolicide" + description = "+1 TOX unless they keep eating food." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + +/datum/chemical_reaction/lipolicide + name = "lipolicide" + id = "lipolicide" + result = "lipolicide" + required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + result_amount = 3 + +datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(!holder.has_reagent("nutriment")) + M.adjustToxLoss(1) + ..() + return + +datum/reagent/coniine + name = "Coniine" + id = "coniine" + description = "+2 TOX, +5 LOSEBREATH." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.05 + +datum/reagent/coniine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.losebreath += 5 + M.adjustToxLoss(2) + ..() + return + +datum/reagent/curare + name = "Curare" + id = "curare" + description = "+1 TOX, +1 OXY, paralyzes after 11 cycles." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + metabolization_rate = 0.1 + var/current_cycle = 0 + +datum/reagent/curare/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + current_cycle++ + if(current_cycle == 11) + M.SetParalysis(20) + M.adjustToxLoss(1) + M.adjustOxyLoss(1) + ..() + return + +datum/reagent/capulettium + name = "Capulettium" + id = "capulettium" + description = "Makes living things appear dead. This essentially lets you play possum. Know someone is hunting you? Inject yourself with this and Rest just before they find you, and they'll mistake you for dead!" + reagent_state = SOLID + color = "#669900" // rgb: 102, 153, 0 + +datum/reagent/capulettium/on_mob_life(var/mob/living/carbon/M as mob) + M.status_flags |= CAPDEATH + M.tod = worldtime2text() + ..() + return + +datum/reagent/capulettium/reagent_deleted() + if(holder && ismob(holder.my_atom)) + var/mob/M = holder.my_atom + M.status_flags &= ~CAPDEATH + ..() + return + +/datum/chemical_reaction/capulettium + name = "capulettium" + id = "capulettium" + result = "capulettium" + required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 6041066d737..8e81916226d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -359,6 +359,9 @@ datum/reagents/proc/del_reagent(var/reagent) for(var/A in reagent_list) var/datum/reagent/R = A if (R.id == reagent) + if(istype(my_atom, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = my_atom + R.reagent_deleted(H) reagent_list -= A del(A) update_total() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index b70fe6ad8df..5c048f62074 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -120,6 +120,9 @@ datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) M << "You're not feeling good at all! You really need some [name]." return +/datum/reagent/proc/reagent_deleted() + return + datum/reagent/blood data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) name = "Blood" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 8107c7586a2..5d6414d0a75 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -141,6 +141,42 @@ icon_state = "bottle16" list_reagents = list("formaldehyde" = 30) +/obj/item/weapon/reagent_containers/glass/bottle/regadenoson + name = "regadenoson bottle" + desc = "A small bottle. Contains regadenoson." + icon_state = "bottle16" + list_reagents = list("regadenoson" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/pancuronium + name = "pancuronium bottle" + desc = "A small bottle. Contains pancuronium." + icon_state = "bottle16" + list_reagents = list("pancuronium" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental + name = "sodium_thiopental bottle" + desc = "A small bottle. Contains sodium thiopental." + icon_state = "bottle16" + list_reagents = list("formaldehyde" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/coniine + name = "coniine bottle" + desc = "A small bottle. Contains coniine." + icon_state = "bottle16" + list_reagents = list("coniine" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/curare + name = "curare bottle" + desc = "A small bottle. Contains curare." + icon_state = "bottle16" + list_reagents = list("curare" = 30) + +/obj/item/weapon/reagent_containers/glass/bottle/amanitin + name = "amanitin bottle" + desc = "A small bottle. Contains amanitin." + icon_state = "bottle16" + list_reagents = list("amanitin" = 30) + /obj/item/weapon/reagent_containers/glass/bottle/histamine name = "histamine bottle" desc = "A small bottle. Contains Histamine." From 4bf99e2f0a3248ccd608a115224713b6a6c1f6b3 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 28 Feb 2015 14:08:25 -0800 Subject: [PATCH 006/312] cap. doesn't work, rip --- .../modules/reagents/Chemistry-Goon-Toxins.dm | 29 +------------------ 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index 377f9683daa..a3abfc5e349 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -369,31 +369,4 @@ datum/reagent/curare/on_mob_life(var/mob/living/M as mob) M.adjustToxLoss(1) M.adjustOxyLoss(1) ..() - return - -datum/reagent/capulettium - name = "Capulettium" - id = "capulettium" - description = "Makes living things appear dead. This essentially lets you play possum. Know someone is hunting you? Inject yourself with this and Rest just before they find you, and they'll mistake you for dead!" - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - -datum/reagent/capulettium/on_mob_life(var/mob/living/carbon/M as mob) - M.status_flags |= CAPDEATH - M.tod = worldtime2text() - ..() - return - -datum/reagent/capulettium/reagent_deleted() - if(holder && ismob(holder.my_atom)) - var/mob/M = holder.my_atom - M.status_flags &= ~CAPDEATH - ..() - return - -/datum/chemical_reaction/capulettium - name = "capulettium" - id = "capulettium" - result = "capulettium" - required_reagents = list("neurotoxin2" = 1, "chlorine" = 1, "hydrogen" = 1) - result_amount = 3 \ No newline at end of file + return \ No newline at end of file From 67554242972affe5d5b61fc93d1d069dd85e07ff Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 28 Feb 2015 15:07:51 -0800 Subject: [PATCH 007/312] Adds changelog --- html/changelogs/Iamgoofball-Goonchem5.yml | 58 +++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 html/changelogs/Iamgoofball-Goonchem5.yml diff --git a/html/changelogs/Iamgoofball-Goonchem5.yml b/html/changelogs/Iamgoofball-Goonchem5.yml new file mode 100644 index 00000000000..a2328f04dd1 --- /dev/null +++ b/html/changelogs/Iamgoofball-Goonchem5.yml @@ -0,0 +1,58 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Iamgoofball + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. Fuck you N3X15, should have made this work with tabs +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in single (') or double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds Stabilizing Agent. This chemical will prevent the effects of certain reactions from taking place in the container it is in, such as Smoke Powder and Flash Powder, allowing you to get the raw forms of the powders for heating up later." + - rscadd: "Smoke Powder and Flash Powder can now be mixed along with Stabilizing Agent in order to produce a powder version of the effects. You can then heat these powders to 374K to get the effects." + - rscadd: "Mixing them without Stabilizing Agent gives the default effects." + - rscadd: "Adds Sonic Powder, a chemical that deafens and stuns within 5 tiles of the reaction. It also follows the reaction rules of the other 2 powders." + - rscadd: "Liquid Dark Matter and Sorium also now work like the powders do." + - rscadd: "CLF3 now has a higher chance of making plating tiles, and the burn damage caused by it scales based on your fire stacks." + - rscadd: "Adds Pyrosium. This reagent heats up mobs by 30 degrees every 3 seconds if it has oxygen to react with. Useful for when you want a delayed mix inside of someone." + - rscadd: "Replaces Frost Oil with Cryostylane. This reagent does the opposite of Pyrosium, but it still requires oxygen to react with." + - rscadd: "Adds Phlogiston. This reagent ignites you and gives you a single fire stack every 3 seconds. Burn damage from this chemical scales up with the fire stacks you have. Counter this with literally any chemical that purges other chems." + - rscadd: "Adds Argine. This reagent explodes when super cooled, inject it into a cryomix when no one's looking for fun times, or throw someone out into space with this in them." + - rscadd: "Smoke now transfers reagents to the mob, and applies ingest reactions on them. This means smoke can run out of reagents, no more infinite acid smoke. It also only works on mobs, use the new Reagent Foam(tm) for your hellfoam needs. I suggest a CLF3 Fluoroacid Black Powder mix." + - rscadd: "Added a derelict medibot to the code, will place a few on the derelict when this PR is merged as to prevent mapping conflicts." + - rscadd: "Renames ice peppers to chilly peppers." + - rscadd: "Adds Regadenoson. Gives you a stamina buff, with a 33% chance to hit with 5-25 TOX damage a cycle, and a 5-10% chance to either stun, cause lots of oxygen damage, or cause your heart to stop. Get it from the traitor Poison Kit." + - rscadd: "Adds Pancuronium. Paralyses you after 10 cycles, with a 7% chance to cause 3-5 LOSEBREATH. Get it from the traitor Poison Kit." + - rscadd: "Adds Sodium Thiopental. Knocks you out after 10 cycles, and destroys your stamina. Get it from the traitor Poison Kit." + - rscadd: "Adds Sulfonal. +1 TOX per cycle, knocks you out in 22 cycles. Mix it with Acetone, Diethylamine, and Sulfur." + - rscadd: "Adds Amantin. On the last cycle it is in you, it hits you with a stack of TOX damage based on elapsed cycles * rand(2,4). Get it from the traitor Poison Kit." + - rscadd: "Adds Lipolicide. +1 TOX unless you have nutriment in you. Mix it with Mercury, Diethylamine, and Ephedrine." + - rscadd: "Adds Coiine. +2 TOX and +5 LOSEBREATH every cycle. Get it from the traitor Poison Kit." + - rscadd: "Adds Curare. +1 TOX, +1 OXY, paralyzes after 11 cycles. Get it from the traitor Poison Kit." + - rscadd: "Adds a reagent_deleted() proc to reagents for effects upon the last cycle, like with Amantin." + - rscadd: "Neurotoxin required temperature for mixing has been set to 674, it was 370 for some reason." \ No newline at end of file From 01b733b2a259370a78f81fb387276fa6fc1beb6f Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 28 Feb 2015 22:13:11 -0800 Subject: [PATCH 008/312] changes and tweaks --- .../items/weapons/storage/uplink_kits.dm | 2 +- .../modules/reagents/Chemistry-Goon-Toxins.dm | 40 +++++++---------- .../Chemistry-Reagents/Chemistry-Reagents.dm | 2 + .../Drink-Reagents/Alcohols.dm | 10 ++--- .../Drink-Reagents/Drinks.dm | 44 +++++++------------ .../Consumable-Reagents/Food-Reagents.dm | 12 ++--- .../Chemistry-Reagents/Medicine-Reagents.dm | 20 +-------- .../Chemistry-Reagents/Toxin-Reagents.dm | 16 +++---- code/modules/reagents/Chemistry-Recipes.dm | 7 --- .../reagents/reagent_containers/bottle.dm | 8 ++-- 10 files changed, 57 insertions(+), 104 deletions(-) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 77c76f1ac9e..f9b6eecd4cc 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -178,7 +178,7 @@ new /obj/item/weapon/reagent_containers/glass/bottle/formaldehyde(src) new /obj/item/weapon/reagent_containers/glass/bottle/cyanide(src) new /obj/item/weapon/reagent_containers/glass/bottle/histamine(src) - new /obj/item/weapon/reagent_containers/glass/bottle/regadenoson(src) + new /obj/item/weapon/reagent_containers/glass/bottle/initropidril(src) new /obj/item/weapon/reagent_containers/glass/bottle/pancuronium(src) new /obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental(src) new /obj/item/weapon/reagent_containers/glass/bottle/coniine(src) diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index a3abfc5e349..e8514ab09ea 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -206,15 +206,15 @@ datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) result_amount = 4 required_temp = 380 -datum/reagent/regadenoson - name = "Regadenoson" - id = "regadenoson" +datum/reagent/initropidril + name = "Initropidril" + id = "initropidril" description = "Major stamina regeneration buff. 33% chance to hit with 5-25 TOX. 5-10% chances to stun and cause suffocation or immediate heart failure." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.4 -datum/reagent/regadenoson/on_mob_life(var/mob/living/M as mob) +datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustStaminaLoss(-5) if(prob(33)) @@ -241,13 +241,11 @@ datum/reagent/pancuronium reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.2 - var/current_cycle = 0 datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - current_cycle++ - if(current_cycle == 10) - M.SetParalysis(10) + if(current_cycle >= 10) + M.SetParalysis(3) if(prob(7)) M.losebreath += rand(3,5) ..() @@ -260,13 +258,11 @@ datum/reagent/sodium_thiopental reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.7 - var/current_cycle = 0 datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - current_cycle++ - if(current_cycle == 10) - M.sleeping += 20 + if(current_cycle >= 10) + M.sleeping += 3 M.adjustStaminaLoss(10) ..() return @@ -278,7 +274,6 @@ datum/reagent/sulfonal reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 - var/current_cycle = 0 /datum/chemical_reaction/sulfonal name = "sulfonal" @@ -289,9 +284,8 @@ datum/reagent/sulfonal datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - current_cycle++ - if(current_cycle == 22) - M.sleeping += 20 + if(current_cycle >= 22) + M.sleeping += 3 M.adjustToxLoss(1) ..() return @@ -302,17 +296,15 @@ datum/reagent/amanitin description = "On the last cycle that it's in you, it hits you with a stack of TOX damage based on elapsed cycles * rand(2,4). The more you use, the longer it takes before anything happens, but the harder it hits when it does." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 - var/cycles = 0 datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - cycles++ ..() return datum/reagent/amanitin/reagent_deleted(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjustToxLoss(cycles*rand(2,4)) + M.adjustToxLoss(current_cycle*rand(2,4)) ..() return @@ -334,6 +326,10 @@ datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!holder.has_reagent("nutriment")) M.adjustToxLoss(1) + M.nutrition -= 10 * REAGENTS_METABOLISM + M.overeatduration = 0 + if(M.nutrition < 0)//Prevent from going into negatives. + M.nutrition = 0 ..() return @@ -359,13 +355,11 @@ datum/reagent/curare reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 - var/current_cycle = 0 datum/reagent/curare/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - current_cycle++ - if(current_cycle == 11) - M.SetParalysis(20) + if(current_cycle >= 11) + M.Weaken(3) M.adjustToxLoss(1) M.adjustOxyLoss(1) ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index 5c048f62074..88a264522ca 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -19,6 +19,7 @@ datum/reagent var/datum/reagents/holder = null var/reagent_state = LIQUID var/list/data + var/current_cycle = 0 var/volume = 0 //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) @@ -74,6 +75,7 @@ datum/reagent/proc/reaction_turf(var/turf/T, var/volume) return datum/reagent/proc/on_mob_life(var/mob/living/M as mob) + current_cycle++ if(!istype(M, /mob/living)) return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm index 2b55896d7b0..638bf624ac2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm @@ -22,18 +22,16 @@ datum/reagent/consumable/ethanol var/boozepwr = 10 //lower numbers mean the booze will have an effect faster. datum/reagent/consumable/ethanol/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ + current_cycle++ M.jitteriness = max(M.jitteriness-5,0) - if(data >= boozepwr) + if(current_cycle >= boozepwr) if (!M.slurring) M.slurring = 1 M.slurring += 4 M.Dizzy(5) - if(data >= boozepwr*2.5 && prob(33)) + if(current_cycle >= boozepwr*2.5 && prob(33)) if (!M.confused) M.confused = 1 M.confused += 3 - if(data >= boozepwr*10 && prob(33)) + if(current_cycle >= boozepwr*10 && prob(33)) M.adjustToxLoss(2) ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm index 9ba906699cc..e1cc1116565 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm @@ -53,15 +53,13 @@ datum/reagent/consumable/carrotjuice datum/reagent/consumable/carrotjuice/on_mob_life(var/mob/living/M as mob) M.eye_blurry = max(M.eye_blurry-1 , 0) M.eye_blind = max(M.eye_blind-1 , 0) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 20) //nothing if(21 to INFINITY) - if (prob(data-10)) + if (prob(current_cycle-10)) M.disabilities &= ~NEARSIGHT - data++ + current_cycle++ ..() return @@ -415,10 +413,8 @@ datum/reagent/consumable/atomicbomb/on_mob_life(var/mob/living/M as mob) if (!M.slurring) M.slurring = 1 M.slurring += 3 - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(51 to 200) M.sleeping += 1 if(201 to INFINITY) @@ -434,19 +430,17 @@ datum/reagent/consumable/gargle_blaster color = "#664300" // rgb: 102, 67, 0 datum/reagent/consumable/gargle_blaster/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ + current_cycle++ M.dizziness +=6 - if(data >= 15 && data <45) + if(current_cycle >= 15 && current_cycle <45) if (!M.slurring) M.slurring = 1 M.slurring += 3 - else if(data >= 45 && prob(50) && data <55) + else if(current_cycle >= 45 && prob(50) && current_cycle <55) M.confused = max(M.confused+3,0) - else if(data >=55) + else if(current_cycle >=55) M.druggy = max(M.druggy, 55) - else if(data >=200) + else if(current_cycle >=200) M.adjustToxLoss(2) ..() return @@ -459,19 +453,17 @@ datum/reagent/consumable/neurotoxin datum/reagent/consumable/neurotoxin/on_mob_life(var/mob/living/carbon/M as mob) M.weakened = max(M.weakened, 3) - if(!data) - data = 1 - data++ + current_cycle++ M.dizziness +=6 - if(data >= 15 && data <45) + if(current_cycle >= 15 && current_cycle <45) if (!M.slurring) M.slurring = 1 M.slurring += 3 - else if(data >= 45 && prob(50) && data <55) + else if(current_cycle >= 45 && prob(50) && current_cycle <55) M.confused = max(M.confused+3,0) - else if(data >=55) + else if(current_cycle >=55) M.druggy = max(M.druggy, 55) - else if(data >=200) + else if(current_cycle >=200) M.adjustToxLoss(2) ..() return @@ -486,10 +478,8 @@ datum/reagent/consumable/hippies_delight datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 50) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 5) if (!M.slurring) M.slurring = 1 M.Dizzy(10) diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index aeaeab2cd60..3255304610f 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -101,9 +101,7 @@ datum/reagent/consumable/capsaicin color = "#B31008" // rgb: 179, 16, 8 datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 15) M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT if(holder.has_reagent("cryostylane")) @@ -118,7 +116,7 @@ datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(15,20) - data++ + current_cycle++ ..() return @@ -240,9 +238,7 @@ datum/reagent/mushroomhallucinogen datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 30) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 5) if (!M.slurring) M.slurring = 1 @@ -265,7 +261,7 @@ datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob) M.druggy = max(M.druggy, 40) if(prob(30)) M.emote(pick("twitch","giggle")) - data++ + current_cycle++ ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 2fc73900f9a..1765a0929af 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -14,20 +14,6 @@ datum/reagent/medicine datum/reagent/medicine/on_mob_life(var/mob/living/M as mob) holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism -datum/reagent/medicine/lipozine - name = "Lipozine" // The anti-nutriment. - id = "lipozine" - description = "A chemical compound that causes a powerful fat-burning reaction." - color = "#BBEDA4" // rgb: 187, 237, 164 - -datum/reagent/medicine/lipozine/on_mob_life(var/mob/living/M as mob) - M.nutrition -= 10 * REAGENTS_METABOLISM - M.overeatduration = 0 - if(M.nutrition < 0)//Prevent from going into negatives. - M.nutrition = 0 - ..() - return - datum/reagent/medicine/leporazine name = "Leporazine" id = "leporazine" @@ -141,10 +127,8 @@ datum/reagent/medicine/rezadone color = "#669900" // rgb: 102, 153, 0 datum/reagent/medicine/rezadone/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 15) M.adjustCloneLoss(-1) M.heal_organ_damage(1,1) diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 79e7cb5308b..371e6b7ec83 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -258,10 +258,8 @@ datum/reagent/toxin/chloralhydrate metabolization_rate = 1.5 * REAGENTS_METABOLISM datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - data++ - switch(data) + current_cycle++ + switch(current_cycle) if(1 to 10) M.confused += 2 M.drowsyness += 2 @@ -269,7 +267,7 @@ datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob) M.sleeping += 1 if(51 to INFINITY) M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) + M.adjustToxLoss((current_cycle - 50)*REM) ..() return @@ -281,15 +279,13 @@ datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots metabolization_rate = 1.5 * REAGENTS_METABOLISM datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob) - if(!data) - data = 1 - switch(data) + switch(current_cycle) if(1 to 50) M.sleeping += 1 if(51 to INFINITY) M.sleeping += 1 - M.adjustToxLoss((data - 50)*REM) - data++ + M.adjustToxLoss((current_cycle - 50)*REM) + current_cycle++ ..() return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index c658a734704..ae369effd9d 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -234,13 +234,6 @@ silicate required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) result_amount = 5 -/datum/chemical_reaction/lipozine - name = "Lipozine" - id = "Lipozine" - result = "lipozine" - required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1) - result_amount = 3 - /datum/chemical_reaction/plasmasolidification name = "Solid Plasma" id = "solidplasma" diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 5d6414d0a75..a96d7e942bf 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -141,11 +141,11 @@ icon_state = "bottle16" list_reagents = list("formaldehyde" = 30) -/obj/item/weapon/reagent_containers/glass/bottle/regadenoson - name = "regadenoson bottle" - desc = "A small bottle. Contains regadenoson." +/obj/item/weapon/reagent_containers/glass/bottle/initropidril + name = "initropidril bottle" + desc = "A small bottle. Contains initropidril." icon_state = "bottle16" - list_reagents = list("regadenoson" = 30) + list_reagents = list("initropidril" = 30) /obj/item/weapon/reagent_containers/glass/bottle/pancuronium name = "pancuronium bottle" From 3964cb3126530b027eca6c99e0625ef5472b71c8 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Mon, 2 Mar 2015 20:50:48 -0800 Subject: [PATCH 009/312] Adds heart attacks properly. --- .../effects/effect_system/effects_foam.dm | 9 +++++---- code/game/objects/items/weapons/defib.dm | 2 ++ .../items/weapons/grenades/chem_grenade.dm | 19 +++++++++++++++++++ code/modules/mob/living/carbon/carbon.dm | 8 ++++++++ .../mob/living/carbon/carbon_defines.dm | 1 + code/modules/mob/living/carbon/human/life.dm | 9 +++++++++ code/modules/mob/living/carbon/life.dm | 6 ++++++ .../reagents/Chemistry-Goon-420BlazeIt.dm | 7 ++++--- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 18 +++++++++--------- .../modules/reagents/Chemistry-Goon-Toxins.dm | 9 +++++++-- 10 files changed, 70 insertions(+), 18 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index d00614174e9..a4a5dcad577 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -102,10 +102,11 @@ /////////////////////////////////////////////// //FOAM EFFECT DATUM /datum/effect/effect/system/foam_spread - var/amount = 5 // the size of the foam spread. + var/amount = 10 // the size of the foam spread. var/obj/chemholder var/obj/effect/effect/foam/foamtype = /obj/effect/effect/foam var/metal = 0 + var/foam_color /datum/effect/effect/system/foam_spread/metal @@ -126,8 +127,9 @@ else location = get_turf(loca) - amount = round(sqrt(amt / 3), 1) + amount = round(sqrt(amt / 2), 1) carry.copy_to(chemholder, carry.total_volume) + foam_color = mix_color_from_reagents(carry.reagent_list) /datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype) @@ -140,9 +142,8 @@ foundfoam.amount += amount else var/obj/effect/effect/foam/F = new foamtype(src.location) - var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list) chemholder.reagents.copy_to(F, chemholder.reagents.total_volume) - F.color = foamcolor + F.color = foam_color F.amount = amount F.metal = metal diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index ad5cb815cfa..2a738e2ba8c 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -381,6 +381,8 @@ busy = 0 update_icon() return + if(H.heart_attack) + H.heart_attack = 0 if(H.stat == 2) var/health = H.health M.visible_message("[M]'s body convulses a bit.") diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index bda6191104b..5826fe552f9 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -388,6 +388,25 @@ beakers += B1 beakers += B2 +/obj/item/weapon/grenade/chem_grenade/clf3 + name = "clf3 grenade" + desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas." + stage = READY + +/obj/item/weapon/grenade/chem_grenade/clf3/New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src) + + B1.reagents.add_reagent("fluorosurfactant", 290) + B1.reagents.add_reagent("clf3", 10) + B2.reagents.add_reagent("water", 290) + B2.reagents.add_reagent("clf3", 10) + + beakers += B1 + beakers += B2 + + #undef EMPTY #undef WIRED #undef READY diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2be2571ea3e..91ec145e815 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -86,6 +86,8 @@ "You feel a powerful shock coursing through your body!", \ "You hear a heavy electrical crack." \ ) + if(prob(25) && heart_attack) + heart_attack = 0 jitteriness += 1000 //High numbers for violent convulsions do_jitter_animation(jitteriness) stuttering += 2 @@ -377,3 +379,9 @@ var/const/GALOSHES_DONT_HELP = 8 /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + + +/mob/living/carbon/revive() + heart_attack = 0 + ..() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index a1237ccd8c8..65ebbcff2d0 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -15,3 +15,4 @@ var/obj/item/weapon/tank/internal = null var/datum/dna/dna = null//Carbon + var/heart_attack = 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a32591f9d52..9c1d78fe973 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -622,4 +622,13 @@ I.loc = get_turf(src) visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]!","\the [I] falls out of your [L.getDisplayName()]!") +/mob/living/carbon/human/handle_heart() + if(!heart_attack) + return + else + losebreath += 5 + adjustOxyLoss(5) + adjustBrainLoss(10) + return + #undef HUMAN_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 006aa7f31f9..5c8bc237d7b 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -48,6 +48,9 @@ //Random events (vomiting etc) handle_random_events() + //Heart Attacks, etc. + handle_heart() + . = 1 handle_fire() @@ -97,6 +100,9 @@ /mob/living/carbon/proc/handle_blood() return +/mob/living/carbon/proc/handle_heart() + return + /mob/living/carbon/proc/handle_random_events() return diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index 2a0a1f7f700..0b9b14272da 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -502,8 +502,9 @@ datum/reagent/hotline/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,30)) M.hallucination += 30 M.druggy = max(M.druggy, 30) - if(prob(1)) - M.visible_message("[M] clutches at their chest! It looks like they're having a heart attack!") - M.adjustBruteLoss(80) // don't do drugs kids + var/mob/living/carbon/human/H = M + if(prob(1) && !H.heart_attack) + H.visible_message("[H] clutches at their chest! It looks like they're having a heart attack!") + H.heart_attack = 1 // don't do drugs kids ..() return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index aa52e461ad1..508f6629298 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -9,7 +9,7 @@ id = "stabilizing_agent" description = "Keeps unstable chemicals stable. This does not work on everything." reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + color = "#FF0000" // rgb: 96, 165, 132 /datum/chemical_reaction/stabilizing_agent name = "stabilizing_agent" @@ -23,7 +23,7 @@ id = "clf3" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + color = "#FFFFFF" // rgb: 96, 165, 132 metabolization_rate = 4 /datum/chemical_reaction/clf3 @@ -57,7 +57,7 @@ F.ChangeTurf(/turf/space) if(istype(T, /turf/simulated/floor/)) var/turf/simulated/floor/F = T - if(prob(volume/5)) + if(prob(volume/10)) F.make_plating() if(istype(F, /turf/simulated/floor/)) new /obj/effect/hotspot(F) @@ -79,7 +79,7 @@ id = "sorium" description = "Sends everything flying from the detonation point." reagent_state = LIQUID - color = "#60A584" //rgb: 96, 165, 132 + color = "#FFA500" //rgb: 96, 165, 132 /datum/chemical_reaction/sorium name = "Sorium" @@ -111,7 +111,7 @@ id = "liquid_dark_matter" description = "Sucks everything into the detonation point." reagent_state = LIQUID - color = "#60A584" //rgb: 96, 165, 132 + color = "#800080" //rgb: 96, 165, 132 /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" @@ -359,7 +359,7 @@ id = "phlogiston" description = "+1 BURN, +1 BURNING and sets you alight. Don't be deceived by that meager +1, having phlogiston in the bloodstream can be very dangerous without a fire extinguisher or firebot. Even then, they can't prevent you from spontaneously igniting every cycle." reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 + color = "#FF9999" // rgb: 96, 165, 132 /datum/chemical_reaction/phlogiston name = "phlogiston" @@ -380,7 +380,7 @@ datum/reagent/cryostylane name = "Cryostylane" id = "cryostylane" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." - color = "#B31008" // rgb: 139, 166, 233 + color = "#B2B2FF" // rgb: 139, 166, 233 /datum/chemical_reaction/cryostylane name = "cryostylane" @@ -410,7 +410,7 @@ datum/reagent/pyrosium name = "Pyrosium" id = "pyrosium" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." - color = "#B31008" // rgb: 139, 166, 233 + color = "#B20000" // rgb: 139, 166, 233 /datum/chemical_reaction/pyrosium name = "pyrosium" @@ -435,7 +435,7 @@ datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) id = "argine" description = "Explodes when lowered to freezing temperatures." reagent_state = LIQUID - color = "#000000" //rgb: 96, 165, 132 + color = "#FFFFFF" //rgb: 96, 165, 132 /datum/chemical_reaction/argine_explosion name = "Argine Kaboom" diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index e8514ab09ea..dd3adf14ba4 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -229,8 +229,13 @@ datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) M.losebreath += 10 M.adjustOxyLoss(rand(5,25)) if(3) - M.visible_message("[M] clutches at their chest as if their heart stopped!") - M.adjustBruteLoss(100) // rip in pepperoni + var/mob/living/carbon/human/H = M + if(!H.heart_attack) + H.visible_message("[H] clutches at their chest as if their heart stopped!") + H.heart_attack = 1 // rip in pepperoni + else + H.losebreath += 10 + H.adjustOxyLoss(rand(5,25)) ..() return From b98c5584df35346fcacb434c314036cea0a49564 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 3 Mar 2015 21:35:30 -0800 Subject: [PATCH 010/312] NEWCRIT + other changes --- code/modules/mob/living/carbon/human/life.dm | 86 +++++++++++++++++-- .../mob/living/carbon/human/species.dm | 3 - .../mob/living/carbon/human/species_types.dm | 6 ++ code/modules/mob/living/carbon/life.dm | 6 ++ code/modules/mob/mob_helpers.dm | 7 ++ .../reagents/Chemistry-Goon-420BlazeIt.dm | 6 +- .../reagents/Chemistry-Goon-Medicine.dm | 6 +- 7 files changed, 107 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 9c1d78fe973..0148f4e31b8 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -371,11 +371,6 @@ silent = 0 return 1 - - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - Paralyse(3) - if(hallucination) spawn handle_hallucinations() @@ -631,4 +626,85 @@ adjustBrainLoss(10) return +/mob/living/carbon/human/handle_crit() + if(!is_incrit(src)) + return + else + var/paralyse_amount = 1 + var/losebreath_amount = 1 + var/cardiac_arrest_chance = 0 + var/brain_damage_from_crit = 5 + switch(health) + if(-20 to -10) + paralyse_amount = 1 + losebreath_amount = 2 + cardiac_arrest_chance = 0 + brain_damage_from_crit = 5 + if(-30 to -20) + paralyse_amount = 1 + losebreath_amount = 5 + cardiac_arrest_chance = 1 + brain_damage_from_crit = 5 + if(-40 to -30) + paralyse_amount = 2 + losebreath_amount = 8 + cardiac_arrest_chance = 2 + brain_damage_from_crit = 5 + if(-50 to -40) + paralyse_amount = 2 + losebreath_amount = 8 + cardiac_arrest_chance = 3 + brain_damage_from_crit = 8 + if(-60 to -50) + paralyse_amount = 2 + losebreath_amount = 8 + cardiac_arrest_chance = 4 + brain_damage_from_crit = 8 + if(-70 to -60) + paralyse_amount = 3 + losebreath_amount = 8 + cardiac_arrest_chance = 5 + brain_damage_from_crit = 8 + if(-80 to -70) + paralyse_amount = 3 + losebreath_amount = 8 + cardiac_arrest_chance = 6 + brain_damage_from_crit = 8 + if(-90 to -80) + paralyse_amount = 3 + losebreath_amount = 8 + cardiac_arrest_chance = 7 + brain_damage_from_crit = 10 + if(-95 to -90) + paralyse_amount = 4 + losebreath_amount = 8 + cardiac_arrest_chance = 8 + brain_damage_from_crit = 10 + if(-INFINITY to -95) + paralyse_amount = 4 + losebreath_amount = 8 + cardiac_arrest_chance = 9 + brain_damage_from_crit = 10 + var/picked_effect = rand(1,4) + switch(picked_effect) + if(1) + Paralyse(paralyse_amount) + if(2) + if(!reagents.has_reagent("epinephrine")) + losebreath += losebreath_amount + if(3) + if(prob(cardiac_arrest_chance)) + if(!heart_attack) + heart_attack = 1 + else + if(!reagents.has_reagent("epinephrine")) + losebreath += losebreath_amount + if(4) + Paralyse(paralyse_amount) + adjustBrainLoss(brain_damage_from_crit) + stuttering += 5 + if(!reagents.has_reagent("epinephrine")) + adjustOxyLoss(1) + return + #undef HUMAN_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 40dce166fc3..d7342c7843b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1077,9 +1077,6 @@ var/datum/gas_mixture/environment = H.loc.return_air() var/datum/gas_mixture/breath - // HACK NEED CHANGING LATER - if(H.health <= config.health_threshold_crit) - H.losebreath++ if(H.losebreath>0) //Suffocating so do not take a breath H.losebreath-- diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index b6d4e39b313..43e597937a5 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -310,3 +310,9 @@ message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...") return list2text(message_list, " ") + +/datum/species/cosmetic_zombie + name = "Human" + id = "zombie" + sexes = 0 + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie \ No newline at end of file diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 5c8bc237d7b..1bd8938d2a1 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -51,6 +51,9 @@ //Heart Attacks, etc. handle_heart() + //Critical condition handling + handle_crit() + . = 1 handle_fire() @@ -103,6 +106,9 @@ /mob/living/carbon/proc/handle_heart() return +/mob/living/carbon/proc/handle_crit() + return + /mob/living/carbon/proc/handle_random_events() return diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 6db29529209..026590cdda1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -136,6 +136,13 @@ proc/isorgan(A) return 1 return 0 +/proc/is_incrit(A) + if(istype(A, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = A + if(config.health_threshold_crit >= H.health) + return 1 + return 0 + /proc/check_zone(zone) if(!zone) return "chest" switch(zone) diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index 0b9b14272da..c4fb5f4f28e 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -127,10 +127,10 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return /datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - if(!istype(M.dna.species, /datum/species/skeleton)) - M << "Your skin falls off! Holy shit!" + if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) + M << "Your skin falls off easily!" M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF - hardset_dna(M, null, null, null, null, /datum/species/skeleton) + hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) else M.adjustBruteLoss(5*REM) ..() diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 9ccbf1fd622..e9a3a54d043 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -571,8 +571,10 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) M.adjustFireLoss(-1*REM) if(M.oxyloss > 35) M.setOxyLoss(35) - if(M.losebreath >= 10) - M.losebreath = max(10, M.losebreath-5) + if(M.losebreath >= 4) + M.losebreath -= 4 + if(M.losebreath < 0) + M.losebreath = 0 M.adjustStaminaLoss(-1*REM) if(prob(30)) M.AdjustParalysis(-1) From 15bc4760a7795cf15086b93e154ebfd68a8dfb88 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 3 Mar 2015 21:46:38 -0800 Subject: [PATCH 011/312] fixes --- code/modules/mob/living/carbon/human/life.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0148f4e31b8..ccce7f74c00 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -635,6 +635,11 @@ var/cardiac_arrest_chance = 0 var/brain_damage_from_crit = 5 switch(health) + if(config.health_threshold_crit to -9) + paralyse_amount = 1 + losebreath_amount = 1 + cardiac_arrest_chance = 0 + brain_damage_from_crit = 1 if(-20 to -10) paralyse_amount = 1 losebreath_amount = 2 From 27c0ea067f0792c59dc3fc840c0aa201e94158cd Mon Sep 17 00:00:00 2001 From: AnturK Date: Thu, 5 Mar 2015 21:35:33 +0100 Subject: [PATCH 012/312] Fixes pref flags --- code/modules/client/preferences.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 523bdb74165..95ebc258057 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -14,8 +14,9 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set "pAI", //7 "cultist" = /datum/game_mode/cult, //8 "blob" = /datum/game_mode/blob, //9 - "monkey" = /datum/game_mode/monkey, //10 - "gangster" = /datum/game_mode/gang //11 + "ninja", //10 + "monkey" = /datum/game_mode/monkey, //11 + "gangster" = /datum/game_mode/gang //12 ) From 38bae6325160bbd36141cc8ae2b964bea4018b34 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Fri, 6 Mar 2015 18:52:04 +0000 Subject: [PATCH 013/312] Added cybernetic implants and surgery. --- code/datums/hud.dm | 2 + code/modules/mob/mob_defines.dm | 3 +- .../modules/surgery/eye_cybernetic_implant.dm | 31 +++++++++++ .../surgery/organs/cybernetic_implants.dm | 51 ++++++++++++++++++ icons/obj/surgery.dmi | Bin 13681 -> 11902 bytes tgstation.dme | 2 + 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 code/modules/surgery/eye_cybernetic_implant.dm create mode 100644 code/modules/surgery/organs/cybernetic_implants.dm diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 39d63400ddb..14e79c51f35 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -20,6 +20,8 @@ var/datum/atom_hud/huds = list( \ var/list/hud_icons = list() //these will be the indexes for the atom's hud_list /datum/atom_hud/proc/remove_hud_from(var/mob/M) + if(locate(src,M.permanent_huds)) + return for(var/atom/A in hudatoms) remove_from_single_hud(M, A) hudusers -= M diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6a4aa3f319f..ab645c61223 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -161,4 +161,5 @@ var/atom/movable/remote_control //Calls relaymove() to whatever it is var/turf/listed_turf = null //the current turf being examined in the stat panel - var/last_movement = 0 // Last world.time the mob actually moved of its own accord. \ No newline at end of file + var/last_movement = 0 // Last world.time the mob actually moved of its own accord. + var/permanent_huds = new /list() \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm new file mode 100644 index 00000000000..31f5e74c552 --- /dev/null +++ b/code/modules/surgery/eye_cybernetic_implant.dm @@ -0,0 +1,31 @@ +/datum/surgery/eye_cybernetic_implant + name = "eye cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + location = "eyes" + +/datum/surgery_step/cybernetic_implant + accept_any_item = 1 + time = 32 + +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool,/obj/item/organ/cybernetic_implant)) + user.visible_message("[user] begins to implant [target] with [tool].") + +/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(tool) + if(!istype(tool, /obj/item/organ/cybernetic_implant/eyes)) + user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") + return 0 + else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) + user.visible_message("[user] can't seem to add any more implants into [target].") + return 0 + else + user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") + user.drop_item() + target.internal_organs += tool + tool.loc = target + + var/obj/item/organ/cybernetic_implant/implant = tool + implant.owner = target + implant.function() + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm new file mode 100644 index 00000000000..eee16eaac1e --- /dev/null +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -0,0 +1,51 @@ +/obj/item/organ/cybernetic_implant + name = "cybernetic implant" + desc = "a state-of-the-art implant that improves a baseline's functionality" + var/mob/owner = null + +/obj/item/organ/cybernetic_implant/proc/function() + return + +/obj/item/organ/cybernetic_implant/eyes + name = "cybernetic eyes" + desc = "artificial photoreceptors with specialized functionality" + icon_state = "hudeye" + var/eye_color = "fff" + +/obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() + if(istype(owner,/mob/living/carbon/human)) + var/mob/living/carbon/human/HMN = owner + HMN.eye_color = eye_color + HMN.regenerate_icons() + +/obj/item/organ/cybernetic_implant/eyes/medical_hud + name = "medical hud implant" + desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." + icon_state = "hudeye" + eye_color = "0ff" + +/obj/item/organ/cybernetic_implant/eyes/medical_hud/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/security_hud + name = "security hud implant" + desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." + icon_state = "hudeye" + eye_color = "b00" + +/obj/item/organ/cybernetic_implant/eyes/security_hud/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + + update_eye_color() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 28390abff25c460ed6fd3a953c3d46ccdbd18091..ac54bf1759a06717efd82da9f162e47f5f532d26 100644 GIT binary patch literal 11902 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 OASp3<(Q;wK@BbGNY#u@Y diff --git a/tgstation.dme b/tgstation.dme index 89df2df7e99..d6acffeeab7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1382,6 +1382,7 @@ #include "code\modules\surgery\brain_removal.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\eye_cybernetic_implant.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gender_reassignment.dm" #include "code\modules\surgery\generic_steps.dm" @@ -1396,6 +1397,7 @@ #include "code\modules\surgery\tools.dm" #include "code\modules\surgery\xenomorph_removal.dm" #include "code\modules\surgery\organs\augments.dm" +#include "code\modules\surgery\organs\cybernetic_implants.dm" #include "code\modules\surgery\organs\helpers.dm" #include "code\modules\surgery\organs\organ.dm" #include "code\modules\telesci\bscrystal.dm" From 50f5951115439e6515c8664982398c9357a73480 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 7 Mar 2015 09:51:01 -0800 Subject: [PATCH 014/312] Nerfs acid blob again goddamn acid blob --- code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index 0e8e44ee1ed..922a76da569 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -81,10 +81,11 @@ datum/reagent/blob/acid datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) if(method == TOUCH) - M.acid_act(10,1,5) + if(prob(50)) + M.acid_act(5,1,5) + if(show_message) + M << "The blob's tendrils melt though your equipment!" M.apply_damage(10, BRUTE) - if(show_message) - M << "The blob's tendrils melt though your equipment!" datum/reagent/blob/radioactive_liquid name = "Radioactive Liquid" From 643de0c922473f9ee721be207a024676121294de Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sat, 7 Mar 2015 18:46:02 +0000 Subject: [PATCH 015/312] Hostile mobs no longer run all their hostile targeting/hunting code if there is nobody (or item, for those that hunt items) near them, they simply move to a simpler loop that decides whether to let the main loop continue. --- code/__DEFINES/combat.dm | 7 ++++ .../living/simple_animal/hostile/hostile.dm | 38 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index e9b5c883731..bee34b9d2c9 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -44,12 +44,19 @@ #define GRAB_UPGRADING 4 #define GRAB_KILL 5 + +//Hostile Mob Stances #define HOSTILE_STANCE_IDLE 1 //#define HOSTILE_STANCE_ALERT 2 //Was only used by bears #define HOSTILE_STANCE_ATTACK 3 #define HOSTILE_STANCE_ATTACKING 4 //#define HOSTILE_STANCE_TIRED 5 //Was also only used by bears +//Hostile Mob AI Status +#define AI_ON 1 +#define AI_SLEEP 2 +#define AI_OFF 3 + //Embedded objects #define EMBEDDED_PAIN_CHANCE 15 //Chance for embedded objects to cause pain (damage user) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 3828dbdce6c..7d1b74fe07a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,6 +30,8 @@ var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction + var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_SLEEP (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever) + /mob/living/simple_animal/hostile/Life() . = ..() @@ -40,6 +42,8 @@ ranged_cooldown-- if(client) return 0 + if(!AICanContinue()) + return 0 if(!stat) switch(stance) if(HOSTILE_STANCE_IDLE) @@ -56,6 +60,9 @@ AttackTarget() DestroySurroundings() + if(AIShouldSleep()) + AIStatus = AI_SLEEP + //////////////HOSTILE MOB TARGETTING AND AGGRESSION//////////// @@ -313,4 +320,33 @@ if(ranged && ranged_cooldown <= 0) target = A OpenFire(A) - ..() \ No newline at end of file + ..() + + + +////// AI Status /////// +/mob/living/simple_animal/hostile/proc/AICanContinue() + switch(AIStatus) + if(AI_ON) + . = 1 + if(AI_SLEEP) + if(AIShouldWake()) + . = 1 + AIStatus = AI_ON //Wake up for more than one Life() cycle. + else + . = 0 + if(AI_OFF) + . = 0 + + +//Returns 1 if the AI should wake up +//Returns 0 if the AI should remain asleep +/mob/living/simple_animal/hostile/proc/AIShouldWake() + . = 0 + if(FindTarget()) + . = 1 + + +//Convenience +/mob/living/simple_animal/hostile/proc/AIShouldSleep() + . = !(AIShouldWake()) \ No newline at end of file From 768a6f73050e094ba9c8c46ab6235d6dba5239f2 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 7 Mar 2015 15:35:53 -0800 Subject: [PATCH 016/312] Update Blob-Reagents.dm --- code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index 922a76da569..0ddd41ef092 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -84,7 +84,7 @@ datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, if(prob(50)) M.acid_act(5,1,5) if(show_message) - M << "The blob's tendrils melt though your equipment!" + M << "The blob's tendrils melt through your equipment!" M.apply_damage(10, BRUTE) datum/reagent/blob/radioactive_liquid From 9384d44ee5a125d72465f034a5e34bff2fd56f7d Mon Sep 17 00:00:00 2001 From: Incoming Date: Sun, 8 Mar 2015 04:24:04 -0400 Subject: [PATCH 017/312] Adds a magic mirror to the wizards shuttle. The magic mirror has greatly expanded functionality compared to the normal one, and can additionally change a wizards name, gender, race, hair color and eye color. Additionally this fixes up some rogue simulated airless tiles on the wizards shuttle (these tiles were why the creature would always end up dead) --- _maps/map_files/generic/z2.dmm | 33 +++++---- code/game/objects/structures/mirror.dm | 93 +++++++++++++++++++++++++- 2 files changed, 108 insertions(+), 18 deletions(-) diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index a209cde1838..7453230b960 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -354,13 +354,21 @@ "gP" = (/obj/structure/optable,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "gQ" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/cautery,/obj/item/weapon/surgicaldrill,/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "gR" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/surgical_drapes,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) +"gS" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station) "gT" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; travelDir = 180; width = 5},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_away"; name = "unknown"; turf_type = /turf/unsimulated/floor; width = 5},/turf/simulated/shuttle/floor,/area/space) "gU" = (/obj/machinery/door/airlock/external{name = "Ferry Airlock"; req_access_txt = "0"},/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry) "gV" = (/turf/unsimulated/floor{icon_state = "engine"},/area/centcom/ferry) "gW" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 4},/area/centcom/ferry) "gX" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/unsimulated/wall,/area/centcom/evac) +"gY" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/unsimulated/floor/plating,/area/wizard_station) +"gZ" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor/plating,/area/wizard_station) "ha" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 5},/area/centcom/ferry) +"hb" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/obj/structure/mirror/magic{pixel_y = 28},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "hc" = (/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) +"hd" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor/plating,/area/wizard_station) +"he" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/unsimulated/floor/plating,/area/wizard_station) +"hf" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "medium"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/unsimulated/floor/plating,/area/wizard_station) +"hg" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor/plating,/area/wizard_station) "hi" = (/turf/unsimulated/floor{name = "plating"},/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space) "hj" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/ferry) "hk" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/evac) @@ -445,7 +453,6 @@ "iX" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/evac) "iY" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) "iZ" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/evac) -"ja" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "small"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating/airless,/area/wizard_station) "jb" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 8; icon_state = "fakewindows2"},/area/wizard_station) "jc" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 4; icon_state = "fakewindows"},/area/wizard_station) "jd" = (/turf/unsimulated/wall/normal{tag = "icon-uranium2"; icon_state = "uranium2"},/area/wizard_station) @@ -527,7 +534,6 @@ "kQ" = (/turf/space,/area/tdome/tdomeobserve) "kR" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{tag = "icon-cultdamage6"; icon_state = "cultdamage6"},/area/wizard_station) "kS" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) -"kT" = (/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "kU" = (/obj/machinery/suit_storage_unit/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "kV" = (/obj/effect/landmark{name = "Syndicate-Uplink"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "kW" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership) @@ -557,10 +563,8 @@ "lz" = (/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) "lA" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) "lB" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space/transit,/area/wizard_station) -"lC" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/wizard_station) "lD" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station) "lE" = (/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station) -"lF" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/airless,/area/wizard_station) "lG" = (/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) "lH" = (/obj/effect/forcefield,/turf/unsimulated/floor{tag = "icon-cultdamage7"; icon_state = "cultdamage7"},/area/wizard_station) "lI" = (/obj/effect/forcefield,/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) @@ -613,7 +617,6 @@ "mF" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mG" = (/obj/structure/table/wood,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mH" = (/obj/structure/table/wood,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) -"mI" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mJ" = (/obj/structure/table/wood,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mK" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "mL" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station) @@ -655,10 +658,8 @@ "nx" = (/obj/structure/cult/talisman{desc = "A altar dedicated to the Wizard's Federation"},/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "ny" = (/obj/item/clothing/shoes/sandal/marisa,/obj/item/clothing/suit/wizrobe/marisa,/obj/item/clothing/head/wizard/marisa,/obj/item/weapon/staff/broom,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "nz" = (/obj/effect/decal/cleanable/blood/splatter,/mob/living/simple_animal/hostile/creature{name = "Experiment 35b"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) -"nA" = (/obj/machinery/door/poddoor/preopen,/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/airless,/area/wizard_station) "nB" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/remains/human,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station) "nC" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/floor{icon_state = "floor"},/area/wizard_station) -"nD" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/wizard_station) "nE" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space/transit,/area/wizard_station) "nF" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) "nG" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/space) @@ -668,7 +669,6 @@ "nK" = (/obj/machinery/flasher{id = "tdomeflash"; name = "Thunderdome Flash"},/turf/simulated/floor/bluegrid,/area/tdome/arena) "nL" = (/obj/machinery/camera{pixel_x = 12; pixel_y = -10; network = list("thunder"); c_tag = "Green Team"},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1) "nM" = (/turf/unsimulated/wall/fakeglass{color = "#008000"},/area/wizard_station) -"nN" = (/obj/item/weapon/shard{color = "#008000"; icon_state = "medium"},/obj/structure/grille{color = "#008000"; density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/wizard_station) "nO" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{tag = "icon-cultdamage5"; icon_state = "cultdamage5"},/area/wizard_station) "nP" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "nQ" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/wizard_station) @@ -738,7 +738,6 @@ "ph" = (/turf/unsimulated/wall/fakedoor{name = "Squad 2 Pod"},/area/wizard_station) "pi" = (/turf/unsimulated/wall/normal{tag = "icon-uranium13"; icon_state = "uranium13"},/area/wizard_station) "pj" = (/turf/simulated/shuttle/wall,/area/wizard_station) -"pk" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/wizard_station) "pl" = (/obj/structure/table/wood,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "pm" = (/obj/structure/table/wood,/obj/item/weapon/gun/magic/wand{desc = "Used in emergency's to reignite magma engines. This one appears spent."; name = "wand of emergency engine ignition"},/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station) "pn" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/wizard_station) @@ -951,31 +950,31 @@ ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhMhNhOhOhOhOhOhNhPgIgIgIgIhcgIhygJhygJgIgKgIgKgzabababababababababababababababababababababababababababababababfhhUhUhUhUfDhUfDhUhUhUhUhUhUisfhhZhZiaibicidiehZhZekgigigigjfxfyfzdGhJhJhJhJdGfqfqfqifdGabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNigihiiijikililhNimgIgIhygzgziniogzgzhyipiqhygzabababababababababababababababababababababababababababababababfhiJhUhUiKiKiKiKfRhUhUhUhUhUiLfhitiuiviwixiyiviuiuekgiiziAiBekababdGiCiCiDiDdGfrfqfqhLezabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNiEihihiFihihihhNimgIiGgzgziHiIiIiHgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababfhiMhUfTiKiNiOiKhUhUhUhUhUhUiPfhiuiUiViwixiyiViWiuekgiiXiYiZekababebfeedededededededfeeeabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajajbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiRfhjriujriwixiyjriujrekgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagSjbjcjdaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIhNjeihihihjfihjghNimhciGgzjhjijijijijjjkjljmjnjojpgzabababababababababababababababababababababababababababababfhiQhUhUiKiKiKiKfRhUhUhUhUhUiRfhjriujriwixiyjriujrekgigigigiekabababebegegegegegegegeeababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsaajtjujvjwjxaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIjyhNhNhNjzhNhNhNjAgIgIjBgzjCjijDjDjEjijijijFjGjGjGgzabababababababababababababababababababababababababababababfhiShUhUgnhUgnhUhUhUhUhUhUhUiTfhjPiuiuiwixiyiuiujQekjRjSjSjTekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsjUjVjWjvjXjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNjZihkahNkbhyhyhykcgzjijDkdkejDjikfkgjmkhkigzgzabababababababababababababababababababababababababababababfhjqhUhUhUhUhUhUhUjHjJjIgpiTjLfhklkmkmiwixiyknknkoekekkpekekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajYkqlGjXksktjYaaaaaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIhNkuihkvhNkwkxkxkxiogzjijDkykzjDjikfkAgzgzgzgzababababababababababababababababababababababababababababababfhfhfhfhfhgBfhfhfhfhfhfhfhfhfhfhhZhZhZhZixhZhZhZhZekeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajwjxkIkJkIkKkLaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhMhNhNhNhNhNkuihkvhNkMkNkNkNkNkOjijijijijijikfkAgzgzgzgzabababababababababababababababababababababababababababababababababababababababababababababababababhZixhZkQkQkQeoeoeoeoeoekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSkTjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababababababababababababababababababababababababababababababkQhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjskLkRkSjvjwaaaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihkVhNkuihkvhNkWkXinkxiogzkYjDjDjDjijikfkZgzlalbgzgzabababababababababababababababababababababababababababababababababababababababababkQhZhZhZhZhZhZhZichZhZhZhZhZhZhZhZekekababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaalhliljlklllmjvlnjsaaaaaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihlolphNkuihkvhNhNnrlrhPlsgzltlulvlulujijijilwlxlxlygzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaalBlClDlElFlljvlGlHlIjsjsaaaaaaaaaaaaaaaaababababababgzlJgIhNkUihihlKhNihihihhNihihihhNjBgzlLlMlLlLlNjijijigzlOlPlygzababababababababababababababababababababababababababababababababababababababababablQlzlzlzlRlzlzlzlzlzlzlzlRlzlzlzlQababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaalBgYlDlEgZlljvlGlHlIjsjsaaaaaaaaaaaaaaaaababababababgzlJgIhNkUihihlKhNihihihhNihihihhNjBgzlLlMlLlLlNjijijigzlOlPlygzababababababababababababababababababababababababababababababababababababababababablQlzlzlzlRlzlzlzlzlzlzlzlRlzlzlzlQababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaajsaaljlSlSlTlljvlUlGlIaalVlWaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihlXihihihlYihihihhNiGgzgzkglZmambgzmcjigzgzgzgzgzabababababababababababababababababababababababababababababababababababababababababhZlzlAlAlAlAlAlzlzlzlAlAlAlAlAlzhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaalnjsaaaajsmdmejWmfjWlnjsjsaaaaaaaaaaaaaaaaababababababgzgIgIhNkUihihihmgihihihmhihihmihNmjmjlsgzgzgzgzgzgNgCmlmmmnmogzabababababababababababababababababababababababababababababababababababababababababhZidmpmpmpmpmpmpmpmpmpmpmpmpmpibhZababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaakKmqmrmsmtmumtmtmqmvmsmtmtmumtmtaajsaaaaaaaaaaababababababgzgIhMhNhNhNhNhNhNmwihihhNhNhNhNhNhNhPmxmxmxmylsgzmzmzmzmzmzmzgzabababababababababababababababababababababababababababababababababmBmBmBmBmBmBmBmBmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBmBmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaamEmFjvjvmFmEmGmHjvjvjvmImJmEmKmLlnmMjsjsaaaaaaababababababgzgIhNmNmNmOmPmQhNihihihhNmRmSmTmUmVhNgIgJgIgIgLjmmzmzmzmzmzmWgzabababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaamEmFjvjvmFmEmGmHjvjvjvhbmJmEmKmLlnmMjsjsaaaaaaababababababgzgIhNmNmNmOmPmQhNihihihhNmRmSmTmUmVhNgIgJgIgIgLjmmzmzmzmzmzmWgzabababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaanhnijvjvninhmMmMjvjvjvjvnjnhnknllSlSnmaaaaaaaaababababababgzgIhNihihihloihnnihihihnoihloihlonphNgIhcgKgJhcgznqnqnqnqnqlqgzabababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaanunvjvlGjvnwlUlGjvnxjvjvnynunznAnBnCnDnEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaanMnijvjWlUnNjWjvjvnOjvjvjvnMnPnQnmnRlhaaaaaaaaababababababgzgIhNnFihihnSnThNnUnVnUhNnWnXihihihhNgIgKgIhciGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDnJnYnJmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaanunvjvlGjvnwlUlGjvnxjvjvnynunzhdnBnChenEaaaaaaababababababgzgIhNnFihihihihnGihihihnHihihihihihhNgIgIgIgKiGgzgzgzgzgzgzgzgzabababababababababababababababababababababababababababababababababmBmZnanbnbnInbnbncndmDmDmDmDmDnJnKnJmDmDmDmDmDnencnfnfnLnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaanMnijvjWlUhfjWjvjvnOjvjvjvnMnPnQnmnRlhaaaaaaaaababababababgzgIhNnFihihnSnThNnUnVnUhNnWnXihihihhNgIgKgIhciGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDnJnYnJmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaajdnZjvjvnZjdoajvlGjWjvjvoajdobocodoeaaaaaaaaaaababababababgzgIhNihihgOhNhNhNofogihhNhNhNihihihhNgIgIgJgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnsnbnsnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfntnfntnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaajwmqojmsmtokmtmqkIolkImsmtokmtmqjsjsjsaaaaaaaaababababababgzgIhNgQgPgRhNgIhNopopophNgIhNiloqorhNgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababmBmZnanbnbnbnbnbncndmDmDmDmDmDmDmDmDmDmDmDmDmDnencnfnfnfnfnfnangmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaamdlGaajsaajsoslmmdaaaajsaaaaaaaajsaaaaaaaaababababababgzgIhNopopophNgIjyotegoujAgIhNopopophNgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababmBmBmBovovovovovmBmCmDmDmDmDmDmDmDmDmDmDmDmDmDmCmBovovovovovmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaajsjsaaowlGaaoxoymdjsaalUaaaaaaaaaaaaaaaaaaababababababgzgIjyotegoujAgIgIgIgIgIgIgIjyotegoujAgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababababmBozozozozozmBoAoBoBoBoBoBoBoBoBoBoBoBoBoBoCmBoDoDoDoDoDmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsjsaaoElGoFaaaaaajsaaaaaaaaaaaaaaaaababababababgzgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIiGgzababababababababababababababababababababababababababababababababababababababababababmBmBmBmBmBmBmBoGoHoHoHoHoHoIoJoKoHoHoHoHoHoGmBmBmBmBmBmBmBababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaajsmumqoLmsmujsaajsjsaaaaaaaaaaaaaaababababababgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzababababababababababababababababababababababababababababababababababababababababababababababababoMoGoGoGoNoGoOoOoOoOoOoGoNoGoGoGoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaamEoPoQoRmEownllFoSoTjsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababoMoMoUoMoMoMoMoVoWoXoMoMoMoMoUoMoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaamEoPoQoRmEownlgZoSoTjsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababoMoMoUoMoMoMoMoVoWoXoMoMoMoMoUoMoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaakIoYoZpakIpbpclEpdjvjYaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababoMoMoMoMoMababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaalmjsjdpepfpgjdjWphlEpdaajsaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsmupimqkImspimupjpkpdaajsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhshshshshshshshshshshshshshshshshshshsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsmupimqkImspimupjhgpdaajsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhshshshshshshshshshshshshshshshshshshsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaaaajsmEjvplpmpljvmEaapnaaaajsaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppqprprpppsptpupvpwpxpypxpxpxpzhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaaaaaajslGpAjvjvjvjvjvpAaaaaaaaalGaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppppppppppBpwpwpwpCpxpxpxpDpxpxhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababaaaaaaaaaaaaaaaaaajsjslmjvjdpEjvjvjvpEjdaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababhspopppFpopGpHpIpwpwpwpwpxpxpJpxpKpyhsababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 87809a71d38..562fc159cd9 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -100,4 +100,95 @@ playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1) return user.visible_message("[user] smashes [src]!") - shatter() \ No newline at end of file + shatter() + +/obj/structure/mirror/magic + name = "magic mirror" + desc = "Turn and face the strange... face." + + +/obj/structure/mirror/magic/attack_hand(mob/user as mob) + if(!ishuman(user)) + return + + var/mob/living/carbon/human/H = user + + var/choice = input(user, "Something to change?", "Magical Grooming") as null|anything in list("name", "race", "gender", "hair", "eyes") + + switch(choice) + if("name") + var/newname = copytext(sanitize(input(H, "Who are we again?", "Name change", H.name) as null|text),1,MAX_NAME_LEN) + + if(!newname) + return + + H.real_name = newname + H.name = newname + if(H.mind) + H.mind.name = newname + + if("race") + var/newrace + var/racechoice = input(H, "What are we again?", "Race change") as null|anything in species_list + newrace = species_list[racechoice] + + if(!newrace || !H.dna) + return + + H.dna.species = new newrace + + if(H.dna.species.use_skintones) + var/new_s_tone = input(user, "What are we again?", "Race change") as null|anything in skin_tones + + if(new_s_tone) + H.skin_tone = new_s_tone + + if(MUTCOLORS in H.dna.species.specflags) + var/new_mutantcolor = input(user, "Choose your skin color:", "Race change") as color|null + if(new_mutantcolor) + var/temp_hsv = RGBtoHSV(new_mutantcolor) + + if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright + H.dna.mutant_color = sanitize_hexcolor(new_mutantcolor) + + else + H << "Invalid color. Your color is not bright enough." + + H.regenerate_icons() + + if("gender") + if(!(H.gender in list("male", "female"))) //blame the patriarchy + return + + if(H.gender == "male") + if(alert(H, "Become a Witch?", "Confirmation", "Yes", "No") == "Yes") + H.gender = "female" + H << "Man, you feel like a woman!" + H.regenerate_icons() + else + if(alert(H, "Become a Warlock?", "Confirmation", "Yes", "No") == "Yes") + H.gender = "male" + H << "Whoa man, you feel like a man!" + H.regenerate_icons() + + if("hair") + var/hairchoice = alert(H, "Hair style or hair color?", "Change Hair", "Style", "Color") + + if(hairchoice == "Style") //So you just want to use a mirror then? + ..() + else + var/new_hair_color = input(H, "Choose your hair color", "Hair Color") as null|color + if(new_hair_color) + H.hair_color = sanitize_hexcolor(new_hair_color) + if(H.gender == "male") + var/new_face_color = input(H, "Choose your facial hair color", "Hair Color") as null|color + if(new_face_color) + H.facial_hair_color = sanitize_hexcolor(new_face_color) + + H.update_hair() + + if("eyes") + var/new_eye_color = input(H, "Choose your eye color", "Eye Color") as null|color + if(new_eye_color) + H.eye_color = sanitize_hexcolor(new_eye_color) + H.update_body() \ No newline at end of file From b669f363d3e1565826e55d36710deb024826ba27 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 8 Mar 2015 13:53:23 +0100 Subject: [PATCH 018/312] Fixes mimana not dropping mimanapeel when eaten. Fixes typo in oat stalks Fixes Reagent metabolization only calling the reagents on_mob_life procs once every two life(). Moving dizziness, drowsiness and jitteriness natural decreases all inside carbon/handle_regular_status_updates() Drowzyness now drops faster when resting. Slight adjustment to mutetoxin effect on mob. --- code/modules/hydroponics/grown.dm | 1 + code/modules/hydroponics/seeds.dm | 4 +- code/modules/mob/living/carbon/life.dm | 39 +++++---- code/modules/reagents/Chemistry-Holder.dm | 43 +++++----- .../Chemistry-Reagents/Toxin-Reagents.dm | 80 +++++++++---------- 5 files changed, 82 insertions(+), 85 deletions(-) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 66ff37b9a56..bc3cfd1c5d7 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -619,6 +619,7 @@ name = "mimana" desc = "It's an excellent prop for a mime." icon_state = "mimana" + trash = /obj/item/weapon/grown/bananapeel/mimanapeel filling_color = "#FFFFEE" /obj/item/weapon/reagent_containers/food/snacks/grown/mimana/add_juice() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 287a8e398e2..b31a0e07ad8 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -548,7 +548,7 @@ desc = "These may, or may not, grow into oat." icon_state = "seed-oat" species = "oat" - plantname = "oat Stalks" + plantname = "Oat Stalks" product = /obj/item/weapon/reagent_containers/food/snacks/grown/oat lifespan = 25 endurance = 15 @@ -565,7 +565,7 @@ desc = "These may, or may not, grow into rice." icon_state = "seed-rice" species = "rice" - plantname = "rice Stalks" + plantname = "Rice Stalks" product = /obj/item/weapon/reagent_containers/food/snacks/grown/rice lifespan = 25 endurance = 15 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b4181b590a0..e6e607955d9 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -285,22 +285,6 @@ if(reagents) reagents.metabolize(src) - if(drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if(prob(5)) - sleeping += 1 - Paralyse(5) - - confused = max(0, confused - 1) - // decrement dizziness counter, clamped to 0 - if(resting) - dizziness = max(0, dizziness - 5) - jitteriness = max(0, jitteriness - 5) - else - dizziness = max(0, dizziness - 1) - jitteriness = max(0, jitteriness - 1) - updatehealth() return @@ -366,6 +350,10 @@ handle_disabilities() + var/restingpwr = 1 //used to decrease jitteriness, drowsyness and dizziness + if(resting) + restingpwr = 5 + //Dizziness if(dizziness) var/client/C = client @@ -373,7 +361,6 @@ var/pixel_y_diff = 0 var/temp var/saved_dizz = dizziness - dizziness = max(dizziness-1, 0) if(C) var/oldsrc = src var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength @@ -399,14 +386,26 @@ C.pixel_x -= pixel_x_diff C.pixel_y -= pixel_y_diff src = oldsrc + dizziness = max(0, dizziness - restingpwr) - //Jitteryness + //Drowsyness + if(drowsyness) + drowsyness = max(drowsyness-restingpwr, 0) + eye_blurry = max(2, eye_blurry) + if(prob(5)) + sleeping += 1 + Paralyse(5) + + //Jitteriness if(jitteriness) do_jitter_animation(jitteriness) - jitteriness = max(jitteriness-1, 0) + jitteriness = max(0, jitteriness-restingpwr) //Other + if(confused) + confused = max(0, confused - 1) + if(stuttering) stuttering = max(stuttering-1, 0) @@ -462,7 +461,7 @@ adjustEarDamage(-0.05,-1) -//this handles hud updates. Calles update_vision() and handle_hud_icons() +//this handles hud updates. Calls update_vision() and handle_hud_icons() /mob/living/carbon/proc/handle_regular_hud_updates() if(!client) return 0 diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 6041066d737..d849d74af5d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -11,7 +11,6 @@ datum/reagents var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = 150 - var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -205,26 +204,27 @@ datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature handle_reactions() - if(last_tick == 3) - last_tick = 1 - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - if(M.reagent_check(R) != 1) - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) - R.overdosed = 1 - M << "You feel like you took too much of [R.name]!" - R.overdose_start(M) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) - var/datum/reagent/new_reagent = new R.type() - addiction_list.Add(new_reagent) - if(R.overdosed) - R.overdose_process(M) - if(is_type_in_list(R,addiction_list)) - for(var/datum/reagent/addicted_reagent in addiction_list) - if(istype(R, addicted_reagent)) - addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. - R.on_mob_life(M) + + for(var/A in reagent_list) + var/datum/reagent/R = A + if(M && R) + if(M.reagent_check(R) != 1) + R.on_mob_life(M) + + if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + M << "You feel like you took too much of [R.name]!" + R.overdose_start(M) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + var/datum/reagent/new_reagent = new R.type() + addiction_list.Add(new_reagent) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + if(addiction_tick == 6) addiction_tick = 1 for(var/A in addiction_list) @@ -248,7 +248,6 @@ datum/reagents/proc/metabolize(var/mob/M) M << "You feel like you've gotten over your need for [R.name]." addiction_list.Remove(R) addiction_tick++ - last_tick++ update_total() datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0) diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 79e7cb5308b..bd4c63e55d2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -293,6 +293,45 @@ datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob) ..() return +datum/reagent/toxin/coffeepowder + name = "Coffee Grounds" + id = "coffeepowder" + description = "Finely ground coffee beans, used to make coffee." + reagent_state = SOLID + color = "#5B2E0D" // rgb: 91, 46, 13 + toxpwr = 0.5 + +datum/reagent/toxin/teapowder + name = "Ground Tea Leaves" + id = "teapowder" + description = "Finely shredded tea leaves, used for making tea." + reagent_state = SOLID + color = "#7F8400" // rgb: 127, 132, 0 + toxpwr = 0.5 + +datum/reagent/toxin/mutetoxin //the new zombie powder. + name = "Mute Toxin" + id = "mutetoxin" + description = "A toxin that temporarily paralyzes the vocal cords." + color = "#F0F8FF" // rgb: 240, 248, 255 + toxpwr = 0 + +datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) + M.silent = max(M.silent, 2) + ..() + +datum/reagent/toxin/staminatoxin + name = "Tirizene" + id = "tirizene" + description = "A toxin that affects the stamina of a person when injected into the bloodstream." + color = "#6E2828" + data = 13 + toxpwr = 0 + +datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) + M.adjustStaminaLoss(REM * data) + data = max(data - 1, 3) + ..() //ACID @@ -329,46 +368,5 @@ datum/reagent/toxin/acid/fluacid toxpwr = 2 acidpwr = 20 -datum/reagent/toxin/coffeepowder - name = "Coffee Grounds" - id = "coffeepowder" - description = "Finely ground coffee beans, used to make coffee." - reagent_state = SOLID - color = "#5B2E0D" // rgb: 91, 46, 13 - toxpwr = 0.5 - -datum/reagent/toxin/teapowder - name = "Ground Tea Leaves" - id = "teapowder" - description = "Finely shredded tea leaves, used for making tea." - reagent_state = SOLID - color = "#7F8400" // rgb: 127, 132, 0 - toxpwr = 0.5 - -datum/reagent/toxin/mutetoxin //the new zombie powder. - name = "Mute Toxin" - id = "mutetoxin" - description = "A toxin that temporarily paralyzes the vocal cords." - color = "#F0F8FF" // rgb: 240, 248, 255 - toxpwr = 0 - -datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) - M.silent += REM + 1 //If this var is increased by one or less, it will have no effect since silent is decreased right after reagents are handled in Life(). Hence the + 1. - ..() - -datum/reagent/toxin/staminatoxin - name = "Tirizene" - id = "tirizene" - description = "A toxin that affects the stamina of a person when injected into the bloodstream." - color = "#6E2828" - data = 13 - toxpwr = 0 - -datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) - M.adjustStaminaLoss(REM * data) - data = max(data - 1, 3) - ..() - - // Undefine the alias for REAGENTS_EFFECT_MULTIPLER #undef REM \ No newline at end of file From 282d0231e0766bd924d5381fd2d6d6eb7a16bbac Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 8 Mar 2015 16:22:41 +0100 Subject: [PATCH 019/312] WIP moving carbon/life to living/life() --- code/game/gamemodes/blob/blobs/blob_mobs.dm | 6 +- code/modules/mining/equipment_locker.dm | 2 +- code/modules/mob/living/carbon/death.dm | 2 + code/modules/mob/living/carbon/life.dm | 87 ++----- code/modules/mob/living/life.dm | 228 ++++++++++++++++++ code/modules/mob/living/living.dm | 1 - code/modules/mob/living/silicon/robot/life.dm | 4 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../living/simple_animal/friendly/corgi.dm | 4 +- .../simple_animal/friendly/drone/_drone.dm | 4 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../living/simple_animal/friendly/mouse.dm | 6 +- .../living/simple_animal/friendly/slime.dm | 2 +- .../mob/living/simple_animal/hostile/alien.dm | 4 +- .../mob/living/simple_animal/hostile/bees.dm | 4 +- .../mob/living/simple_animal/hostile/carp.dm | 2 +- .../living/simple_animal/hostile/eyeballs.dm | 2 +- .../living/simple_animal/hostile/hivebot.dm | 4 +- .../living/simple_animal/hostile/hostile.dm | 4 +- .../mob/living/simple_animal/hostile/mimic.dm | 14 +- .../simple_animal/hostile/mining_mobs.dm | 22 +- .../living/simple_animal/hostile/mushroom.dm | 4 +- .../living/simple_animal/hostile/pirate.dm | 4 +- .../living/simple_animal/hostile/russian.dm | 4 +- .../living/simple_animal/hostile/syndicate.dm | 8 +- .../mob/living/simple_animal/hostile/tree.dm | 8 +- .../mob/living/simple_animal/parrot.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 38 +-- tgstation.dme | 1 + 29 files changed, 325 insertions(+), 154 deletions(-) create mode 100644 code/modules/mob/living/life.dm diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm index d3a367e5e64..2df7b07445a 100644 --- a/code/game/gamemodes/blob/blobs/blob_mobs.dm +++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm @@ -92,7 +92,7 @@ H.loc = src loc.visible_message(" The corpse of [H.name] suddenly rises!") -/mob/living/simple_animal/hostile/blob/blobspore/Die() +/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // On death, create a small smoke of harmful gas (s-Acid) var/datum/effect/effect/system/chem_smoke_spread/S = new var/turf/location = get_turf(src) @@ -165,6 +165,6 @@ /mob/living/simple_animal/hostile/blob/blobbernaut/blob_act() return -/mob/living/simple_animal/hostile/blob/blobbernaut/Die() - ..() +/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed) + ..(gibbed) flick("blobbernaut_death", src) \ No newline at end of file diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 4ce35c8a06e..402fa8f956a 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -628,7 +628,7 @@ return ..() -/mob/living/simple_animal/hostile/mining_drone/Die() +/mob/living/simple_animal/hostile/mining_drone/death() ..() visible_message("[src] is destroyed!") new /obj/effect/decal/cleanable/robot_debris(src.loc) diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index deca15ff0f7..7994f95978a 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -1,4 +1,6 @@ /mob/living/carbon/death(gibbed) + eye_blind = max(eye_blind, 1) + silent = 0 med_hud_set_health() med_hud_set_status() ..(gibbed) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b4181b590a0..29bf40ef11a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -67,7 +67,7 @@ /////////////// //Start of a breath chain, calls breathe() -/mob/living/carbon/proc/handle_breathing() +/mob/living/carbon/handle_breathing() if(SSmob.times_fired%4==2 || failed_last_breath) breathe() //Breathe per 4 ticks, unless suffocating else @@ -253,10 +253,10 @@ return -/mob/living/carbon/proc/handle_changeling() +/mob/living/carbon/handle_changeling() return -/mob/living/carbon/proc/handle_mutations_and_radiation() +/mob/living/carbon/handle_mutations_and_radiation() if(radiation) switch(radiation) @@ -281,7 +281,7 @@ radiation = Clamp(radiation, 0, 100) -/mob/living/carbon/proc/handle_chemicals_in_body() +/mob/living/carbon/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) @@ -304,16 +304,16 @@ updatehealth() return -/mob/living/carbon/proc/handle_blood() +/mob/living/carbon/handle_blood() return -/mob/living/carbon/proc/handle_random_events() +/mob/living/carbon/handle_random_events() return -/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment) +/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment) return -/mob/living/carbon/proc/handle_stomach() +/mob/living/carbon/handle_stomach() spawn(0) for(var/mob/living/M in stomach_contents) if(M.loc != src) @@ -330,26 +330,21 @@ M.adjustBruteLoss(5) nutrition += 10 -/mob/living/carbon/proc/handle_regular_status_updates() +/mob/living/carbon/handle_regular_status_updates() - if(stat == DEAD) - eye_blind = max(eye_blind, 1) - silent = 0 - else - updatehealth() - if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - eye_blind = max(eye_blind, 1) - silent = 0 - return 1 + updatehealth() + if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) + death() + return - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + if(stat != DEAD) + + if(getOxyLoss() > 50 || health <= config.health_threshold_crit) Paralyse(3) - if(paralysis) - AdjustParalysis(-1) - stat = UNCONSCIOUS - else if(sleeping) + ..() + + if(sleeping && !paralysis) handle_dreams() adjustStaminaLoss(-10) sleeping = max(sleeping-1, 0) @@ -358,14 +353,6 @@ spawn(0) emote("snore") - else if (status_flags & FAKEDEATH) - stat = UNCONSCIOUS - - else - stat = CONSCIOUS - - handle_disabilities() - //Dizziness if(dizziness) var/client/C = client @@ -419,16 +406,6 @@ if(druggy) druggy = max(druggy-1, 0) - if(stunned) - AdjustStunned(-1) - if(!stunned) - update_icons() - - if(weakened) - weakened = max(weakened-1,0) - if(!weakened) - update_icons() - if(hallucination) spawn handle_hallucinations() @@ -442,28 +419,10 @@ qdel(a) CheckStamina() - return 1 - -/mob/living/carbon/proc/handle_disabilities() - //Eyes - if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own - eye_blind = max(eye_blind, 1) - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) - else - // deafness heals slowly over time, unless ear_damage is over 100 - if(ear_damage < 100) - adjustEarDamage(-0.05,-1) - + return 1 //this handles hud updates. Calles update_vision() and handle_hud_icons() -/mob/living/carbon/proc/handle_regular_hud_updates() +/mob/living/carbon/handle_regular_hud_updates() if(!client) return 0 update_action_buttons() @@ -550,7 +509,7 @@ return 1 -/mob/living/carbon/proc/handle_vision() +/mob/living/carbon/handle_vision() client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) @@ -597,7 +556,7 @@ if(!client.adminobs) reset_view(null) -/mob/living/carbon/proc/handle_hud_icons() +/mob/living/carbon/handle_hud_icons() return /mob/living/carbon/proc/handle_hud_icons_health() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm new file mode 100644 index 00000000000..effe89bda3e --- /dev/null +++ b/code/modules/mob/living/life.dm @@ -0,0 +1,228 @@ +/mob/living/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + + if (notransform) + return + if(!loc) + return + var/datum/gas_mixture/environment = loc.return_air() + + if(stat != DEAD) + + //Breathing, if applicable + handle_breathing() + + //Updates the number of stored chemicals for powers + handle_changeling() + + //Mutations and radiation + handle_mutations_and_radiation() + + //Chemicals in the body + handle_chemicals_in_body() + + //Blud + handle_blood() + + //Random events (vomiting etc) + handle_random_events() + + . = 1 + + //Handle temperature/pressure differences between body and environment + handle_environment(environment) + + handle_fire() + + //stuff in the stomach + handle_stomach() + + update_canmove() + + update_gravity(mob_has_gravity()) + + for(var/obj/item/weapon/grab/G in src) + G.process() + + handle_regular_status_updates() // Status updates, death etc. + + if(client) + handle_regular_hud_updates() + + return . + + + +/mob/living/proc/handle_breathing() + +/mob/living/proc/handle_changeling() + return + +/mob/living/proc/handle_mutations_and_radiation() + if(radiation) + + switch(radiation) + if(0 to 50) + radiation-- + if(prob(25)) + adjustToxLoss(1) + updatehealth() + + if(50 to 75) + radiation -= 2 + adjustToxLoss(1) + if(prob(5)) + radiation -= 5 + updatehealth() + + if(75 to 100) + radiation -= 3 + adjustToxLoss(3) + updatehealth() + + radiation = Clamp(radiation, 0, 100) + + +/mob/living/proc/handle_chemicals_in_body() + if(reagents) + reagents.metabolize(src) + + if(drowsyness) + drowsyness-- + eye_blurry = max(2, eye_blurry) + if(prob(5)) + sleeping += 1 + Paralyse(5) + + confused = max(0, confused - 1) + // decrement dizziness counter, clamped to 0 + if(resting) + dizziness = max(0, dizziness - 5) + jitteriness = max(0, jitteriness - 5) + else + dizziness = max(0, dizziness - 1) + jitteriness = max(0, jitteriness - 1) + + updatehealth() + return + +/mob/living/proc/handle_blood() + return + +/mob/living/proc/handle_random_events() + return + +/mob/living/proc/handle_environment(var/datum/gas_mixture/environment) + return + +/mob/living/proc/handle_stomach() + return + +/mob/living/proc/handle_regular_status_updates() + + if(stat != DEAD) + updatehealth() + + if(paralysis) + AdjustParalysis(-1) + stat = UNCONSCIOUS + + else if (status_flags & FAKEDEATH) + stat = UNCONSCIOUS + + else + stat = CONSCIOUS + + handle_disabilities() + + if(stunned) + AdjustStunned(-1) + if(!stunned) + update_icons() + + if(weakened) + weakened = max(weakened-1,0) + if(!weakened) + update_icons() + + return 1 + +/mob/living/proc/handle_disabilities() + //Eyes + if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own + eye_blind = max(eye_blind, 1) + else if(eye_blind) //blindness, heals slowly over time + eye_blind = max(eye_blind-1,0) + else if(eye_blurry) //blurry eyes heal slowly + eye_blurry = max(eye_blurry-1, 0) + + //Ears + if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own + setEarDamage(-1, max(ear_deaf, 1)) + else + // deafness heals slowly over time, unless ear_damage is over 100 + if(ear_damage < 100) + adjustEarDamage(-0.05,-1) + + +//this handles hud updates. Calles update_vision() and handle_hud_icons() +/mob/living/proc/handle_regular_hud_updates() + if(!client) return 0 + + handle_vision() + handle_hud_icons() + + return 1 + +/mob/living/proc/handle_vision() + + client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) + + if(stat == DEAD) + sight |= SEE_TURFS + sight |= SEE_MOBS + sight |= SEE_OBJS + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_LEVEL_TWO + else + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 + see_invisible = SEE_INVISIBLE_LIVING + if(see_override) + see_invisible = see_override + + if(blind) + if(eye_blind) + blind.layer = 18 + else + blind.layer = 0 + + if (disabilities & NEARSIGHT) + client.screen += global_hud.vimpaired + + if (eye_blurry) + client.screen += global_hud.blurry + + if (druggy) + client.screen += global_hud.druggy + + if(eye_stat > 20) + if(eye_stat > 30) + client.screen += global_hud.darkMask + else + client.screen += global_hud.vimpaired + + if(machine) + if (!( machine.check_eye(src) )) + reset_view(null) + else + if(!client.adminobs) + reset_view(null) + +/mob/living/proc/handle_hud_icons() + return + + diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9dc994a1bad..66350b14641 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -8,7 +8,6 @@ Sorry Giacom. Please don't be mad :( push_mob_back(src, A.push_dir) */ - /mob/living/New() . = ..() generateStaticOverlay() diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index d90e464cee2..5fbf63a2a70 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -58,7 +58,7 @@ src.stat = 1 -/mob/living/silicon/robot/proc/handle_regular_status_updates() +/mob/living/silicon/robot/handle_regular_status_updates() if(src.camera && !scrambledcodes) if(src.stat == 2 || wires.IsCameraCut()) @@ -129,7 +129,7 @@ return 1 -/mob/living/silicon/robot/proc/handle_regular_hud_updates() +/mob/living/silicon/robot/handle_regular_hud_updates() if (src.stat == 2 || src.sight_mode & BORGXRAY) src.sight |= SEE_TURFS diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 2f515596d37..336ca05e96a 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -34,7 +34,7 @@ for(var/spell in construct_spells) mob_spell_list += new spell(src) -/mob/living/simple_animal/construct/Die() +/mob/living/simple_animal/construct/death() ..() new /obj/item/weapon/ectoplasm (src.loc) visible_message("[src] collapses in a shattered heap.") diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 6cfff764b88..da97a78c75d 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -29,8 +29,8 @@ ..() regenerate_icons() -/mob/living/simple_animal/corgi/Die() - ..() +/mob/living/simple_animal/corgi/death(gibbed) + ..(gibbed) regenerate_icons() /mob/living/simple_animal/corgi/revive() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 4a003c9a72f..704338b87b9 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -94,8 +94,8 @@ pickVisualAppearence() -/mob/living/simple_animal/drone/Die() - ..() +/mob/living/simple_animal/drone/death(gibbed) + ..(gibbed) drop_l_hand() drop_r_hand() if(internal_storage) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index d976a50bf86..48349474c2d 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -223,8 +223,8 @@ var/global/chicken_count = 0 pixel_y = rand(0, 10) chicken_count += 1 -/mob/living/simple_animal/chicken/Die() - ..() +/mob/living/simple_animal/chicken/death(gibbed) + ..(gibbed) chicken_count -= 1 /mob/living/simple_animal/chicken/attackby(var/obj/item/O as obj, var/mob/user as mob, params) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index ae67489e9e0..a20a7801d3b 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -36,10 +36,10 @@ /mob/living/simple_animal/mouse/proc/splat() src.health = 0 src.icon_dead = "mouse_[body_color]_splat" - Die() + death() -/mob/living/simple_animal/mouse/Die() - ..() +/mob/living/simple_animal/mouse/death(gibbed) + ..(gibbed) if(!ckey) var/obj/item/trash/deadmouse/M = new(src.loc) M.icon_state = src.icon_dead diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index 85405278096..eed4bc24848 100644 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ b/code/modules/mob/living/simple_animal/friendly/slime.dm @@ -25,7 +25,7 @@ ..() overlays += "aslime-:33" -/mob/living/simple_animal/slime/adult/Die() +/mob/living/simple_animal/slime/adult/death(gibbed) for(var/i = 0, i<=1, i++) var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc) S1.icon_state = "[colour] baby slime" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index e08f84a93fd..909e17a36e6 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -92,7 +92,7 @@ damage = 30 icon_state = "toxin" -/mob/living/simple_animal/hostile/alien/Die() - ..() +/mob/living/simple_animal/hostile/alien/death(gibbed) + ..(gibbed) visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") playsound(src, 'sound/voice/hiss6.ogg', 100, 1) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 66707ccf069..9a07fae29f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -40,8 +40,8 @@ ..() update_bees() -/mob/living/simple_animal/hostile/poison/bees/Die() - ..() +/mob/living/simple_animal/hostile/poison/bees/death(gibbed) + ..(gibbed) qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index a7683dd7847..2c4fe2f9de8 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -57,7 +57,7 @@ icon_living = "holocarp" maxbodytemp = INFINITY -/mob/living/simple_animal/hostile/carp/holocarp/Die() +/mob/living/simple_animal/hostile/carp/holocarp/death() qdel(src) return diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 46f2e679e22..4bebf1eaa72 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -29,6 +29,6 @@ if(.) emote("me", 1, "glares at [.]") -/mob/living/simple_animal/hostile/carp/eyeball/Die() +/mob/living/simple_animal/hostile/carp/eyeball/death() qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 11bbfa8a561..f6b7bfbf731 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -46,8 +46,8 @@ health = 80 ranged = 1 -/mob/living/simple_animal/hostile/hivebot/Die() - ..() +/mob/living/simple_animal/hostile/hivebot/death(gibbed) + ..(gibbed) visible_message("[src] blows apart!") new /obj/effect/decal/cleanable/robot_debris(src.loc) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 3828dbdce6c..31a27c5246d 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -229,9 +229,9 @@ //////////////END HOSTILE MOB TARGETTING AND AGGRESSION//////////// -/mob/living/simple_animal/hostile/Die() +/mob/living/simple_animal/hostile/death(gibbed) LoseAggro() - ..() + ..(gibbed) walk(src, 0) /mob/living/simple_animal/hostile/proc/OpenFire(var/the_target) diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index e6f77f15489..4003bda143b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -41,8 +41,8 @@ if(.) emote("me", 1, "[Attackemote] [.].") -/mob/living/simple_animal/hostile/mimic/Die() - ..() +/mob/living/simple_animal/hostile/mimic/death(gibbed) + ..(gibbed) visible_message("[src] stops moving!") qdel(src) @@ -107,13 +107,13 @@ ..() icon_state = initial(icon_state) -/mob/living/simple_animal/hostile/mimic/crate/Die() +/mob/living/simple_animal/hostile/mimic/crate/death(gibbed) var/obj/structure/closet/crate/C = new(get_turf(src)) // Put loot in crate for(var/obj/O in src) O.loc = C - ..() + ..(gibbed) /mob/living/simple_animal/hostile/mimic/crate/AttackingTarget() . =..() @@ -144,13 +144,13 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca /mob/living/simple_animal/hostile/mimic/copy/Life() ..() for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell - Die() + death() -/mob/living/simple_animal/hostile/mimic/copy/Die() +/mob/living/simple_animal/hostile/mimic/copy/death(gibbed) for(var/atom/movable/M in src) M.loc = get_turf(src) - ..() + ..(gibbed) /mob/living/simple_animal/hostile/mimic/copy/ListTargets() // Return a list of targets that isn't the creator diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 0e62f7f61b7..8bbfc2e7c7e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -108,12 +108,12 @@ if(3.0) adjustBruteLoss(110) -/mob/living/simple_animal/hostile/asteroid/basilisk/Die() +/mob/living/simple_animal/hostile/asteroid/basilisk/death(gibbed) var/counter for(counter=0, counter<2, counter++) var/obj/item/weapon/ore/diamond/D = new /obj/item/weapon/ore/diamond(src.loc) D.layer = 4.1 - ..() + ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goldgrub name = "goldgrub" @@ -204,10 +204,10 @@ visible_message("The [P.name] was repelled by [src.name]'s girth!") return -/mob/living/simple_animal/hostile/asteroid/goldgrub/Die() +/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed) alerted = 0 Reward() - ..() + ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goldgrub/adjustBruteLoss(var/damage) idle_vision_range = 9 @@ -253,10 +253,10 @@ /mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget() OpenFire() -/mob/living/simple_animal/hostile/asteroid/hivelord/Die() +/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) new /obj/item/asteroid/hivelord_core(src.loc) mouse_opacity = 1 - ..() + ..(gibbed) /obj/item/asteroid/hivelord_core name = "hivelord remains" @@ -318,7 +318,7 @@ spawn(100) qdel(src) -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/Die() +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death() qdel(src) /mob/living/simple_animal/hostile/asteroid/goliath @@ -367,9 +367,9 @@ anchored = 1 ..() -/mob/living/simple_animal/hostile/asteroid/goliath/Die() +/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) anchored = 0 - ..() + ..(gibbed) /mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() var/tturf = get_turf(target) @@ -434,10 +434,10 @@ spawn(50) qdel(src) -/mob/living/simple_animal/hostile/asteroid/goliath/Die() +/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) var/obj/item/asteroid/goliath_hide/G = new /obj/item/asteroid/goliath_hide(src.loc) G.layer = 4.1 - ..() + ..(gibbed) /obj/item/asteroid/goliath_hide name = "goliath hide plates" diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index c93b394050e..f06f3d4c28c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -87,9 +87,9 @@ icon_state = "mushroom_color" UpdateMushroomCap() -/mob/living/simple_animal/hostile/mushroom/Die() +/mob/living/simple_animal/hostile/mushroom/death(gibbed) visible_message("[src] fainted.") - ..() + ..(gibbed) UpdateMushroomCap() /mob/living/simple_animal/hostile/mushroom/proc/UpdateMushroomCap() diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index aae825a6538..71dde5bdd9a 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -49,8 +49,8 @@ weapon1 = /obj/item/weapon/gun/energy/laser -/mob/living/simple_animal/hostile/pirate/Die() - ..() +/mob/living/simple_animal/hostile/pirate/death(gibbed) + ..(gibbed) if(corpse) new corpse (src.loc) if(weapon1) diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 3f143ea19fe..568d89794e4 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -51,8 +51,8 @@ weapon1 = /obj/item/weapon/gun/projectile/shotgun/boltaction casingtype = /obj/item/ammo_casing/a762 -/mob/living/simple_animal/hostile/russian/Die() - ..() +/mob/living/simple_animal/hostile/russian/death(gibbed) + ..(gibbed) if(corpse) new corpse (src.loc) if(weapon1) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 72b30675077..cfa97043bfd 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -34,8 +34,8 @@ faction = list("syndicate") status_flags = CANPUSH -/mob/living/simple_animal/hostile/syndicate/Die() - ..() +/mob/living/simple_animal/hostile/syndicate/death(gibbed) + ..(gibbed) if(corpse) new corpse (src.loc) if(weapon1) @@ -160,8 +160,8 @@ minbodytemp = 0 mob_size = 0 -/mob/living/simple_animal/hostile/viscerator/Die() - ..() +/mob/living/simple_animal/hostile/viscerator/death(gibbed) + ..(gibbed) visible_message("[src] is smashed into pieces!") qdel(src) return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 43ee23cf49b..c4ed28b8e18 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -50,8 +50,8 @@ L.Weaken(3) L.visible_message("\The [src] knocks down \the [L]!") -/mob/living/simple_animal/hostile/tree/Die() - ..() +/mob/living/simple_animal/hostile/tree/death(gibbed) + ..(gibbed) visible_message("[src] is hacked into pieces!") new /obj/item/stack/sheet/mineral/wood(loc) qdel(src) @@ -64,8 +64,8 @@ icon_dead = "festivus_pole" icon_gib = "festivus_pole" -/mob/living/simple_animal/hostile/tree/festivus/Die() - ..() +/mob/living/simple_animal/hostile/tree/festivus/death(gibbed) + ..(gibbed) visible_message("[src] is hacked into pieces!") new /obj/item/stack/rods(loc) qdel(src) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d49855fc02f..27549fcbfbc 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -113,12 +113,12 @@ /mob/living/simple_animal/parrot/proc/toggle_mode) -/mob/living/simple_animal/parrot/Die() +/mob/living/simple_animal/parrot/death(gibbed) if(held_item) held_item.loc = src.loc held_item = null walk(src,0) - ..() + ..(gibbed) /mob/living/simple_animal/parrot/Stat() ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 0570e89ff65..b6bb2e9d2aa 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -81,13 +81,12 @@ ..() /mob/living/simple_animal/updatehealth() + if(health > maxHealth) + health = maxHealth return /mob/living/simple_animal/Life() - update_gravity(mob_has_gravity()) - - //Health if(stat == DEAD) if(health > 0) icon_state = icon_living @@ -98,21 +97,12 @@ update_canmove() return 0 + updatehealth() - if(health < 1 && stat != DEAD) - Die() - - if(health > maxHealth) - health = maxHealth - - if(stunned) - AdjustStunned(-1) - if(weakened) - AdjustWeakened(-1) - if(paralysis) - AdjustParalysis(-1) - - adjustEarDamage((ear_damage < 25 ? -0.05 : 0), -1) + if(health < 1) + death() + else + handle_regular_status_updates() //Movement if(!client && !stop_automated_movement && wander) @@ -392,22 +382,14 @@ if(statpanel("Status")) stat(null, "Health: [round((health / maxHealth) * 100)]%") -/mob/living/simple_animal/proc/Die() +/mob/living/simple_animal/death(gibbed) health = 0 // so /mob/living/simple_animal/Life() doesn't magically revive them - dead_mob_list += src icon_state = icon_dead stat = DEAD density = 0 - return - -/mob/living/simple_animal/death(gibbed) - if(stat == DEAD) - return - if(!gibbed) visible_message("\the [src] stops moving...") - - Die() + ..() /mob/living/simple_animal/ex_act(severity, target) ..() @@ -426,7 +408,7 @@ /mob/living/simple_animal/adjustBruteLoss(damage) health = Clamp(health - damage, 0, maxHealth) if(health < 1 && stat != DEAD) - Die() + death() /mob/living/simple_animal/proc/CanAttack(var/atom/the_target) if(see_invisible < the_target.invisibility) diff --git a/tgstation.dme b/tgstation.dme index a74a3ce7694..a923cd4885f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1045,6 +1045,7 @@ #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\emote.dm" +#include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defines.dm" From 93c982ea5cca0a34b28b9b22ca1c537ad0c8536e Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 8 Mar 2015 16:38:44 +0100 Subject: [PATCH 020/312] Fixes hulks not losing their mutation when low on health. Fixes carbon mobs resistant to paralysis not going unconscious when in crit. --- code/modules/mob/living/carbon/human/life.dm | 5 ++++- code/modules/mob/living/carbon/life.dm | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 11d0dbc0995..cc448dba36d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -38,6 +38,9 @@ tinttotal = tintcheck() //here as both hud updates and status updates call it if(..()) + if(dna) + for(var/datum/mutation/human/HM in dna.mutations) + HM.on_life(src) //Stuff jammed in your limbs hurts handle_embedded_objects() @@ -356,4 +359,4 @@ I.loc = get_turf(src) visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]!","\the [I] falls out of your [L.getDisplayName()]!") -#undef HUMAN_MAX_OXYLOSS +#undef HUMAN_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b4181b590a0..e9a2c026479 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -343,12 +343,12 @@ silent = 0 return 1 - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + if(getOxyLoss() > 50 || health <= config.health_threshold_crit) Paralyse(3) + stat = UNCONSCIOUS if(paralysis) AdjustParalysis(-1) - stat = UNCONSCIOUS else if(sleeping) handle_dreams() adjustStaminaLoss(-10) From 3796f32394ea6d2a9f23fa8ac849895b54a6e9e7 Mon Sep 17 00:00:00 2001 From: norill Date: Sun, 8 Mar 2015 18:23:34 +0100 Subject: [PATCH 021/312] fixed improper req_tech "power" -> "powerstorage" in several research designs --- code/modules/research/designs/machine_designs.dm | 8 ++++---- code/modules/research/designs/mechfabricator_designs.dm | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index ff5e33b0ef3..120963be22c 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -6,7 +6,7 @@ name = "Machine Design (SMES Board)" desc = "The circuit board for a SMES." id = "smes" - req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) + req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) build_type = IMPRINTER materials = list("$glass" = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/smes @@ -16,7 +16,7 @@ name = "Computer Design (Power Turbine Console Board)" desc = "The circuit board for a power turbine console." id = "power_turbine_console" - req_tech = list("programming" = 4, "power" = 4, "engineering" = 4) + req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 4) build_type = IMPRINTER materials = list("$glass" = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/turbine_computer @@ -26,7 +26,7 @@ name = "Machine Design (Power Compressor Board)" desc = "The circuit board for a power compressor." id = "power_compressor" - req_tech = list("programming" = 4, "power" = 5, "engineering" = 4) + req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 4) build_type = IMPRINTER materials = list("$glass" = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/power_compressor @@ -36,7 +36,7 @@ name = "Machine Design (Power Turbine Board)" desc = "The circuit board for a power turbine." id = "power_turbine" - req_tech = list("programming" = 4, "power" = 4, "engineering" = 5) + req_tech = list("programming" = 4, "powerstorage" = 4, "engineering" = 5) build_type = IMPRINTER materials = list("$glass" = 1000, "sacid" = 20) build_path = /obj/item/weapon/circuitboard/power_turbine diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index b04f53bdff7..6c08a097ce2 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -640,7 +640,7 @@ id = "borg_upgrade_disablercooler" build_type = MECHFAB build_path = /obj/item/borg/upgrade/disablercooler - req_tech = list("combat" = 5, "power" = 4) + req_tech = list("combat" = 5, "powerstorage" = 4) materials = list("$metal"=80000 , "$glass"=6000 , "$gold"= 2000, "$diamond" = 500) construction_time = 120 category = list("Cyborg Upgrade Modules") @@ -650,7 +650,7 @@ id = "borg_upgrade_jetpack" build_type = MECHFAB build_path = /obj/item/borg/upgrade/jetpack - req_tech = list("engineering" = 4, "power" = 4) + req_tech = list("engineering" = 4, "powerstorage" = 4) materials = list("$metal"=10000, "$plasma"=5000, "$uranium" = 6000) construction_time = 120 category = list("Cyborg Upgrade Modules") From b1e340b19b801e37cc4a85a1659df4431f79051c Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sun, 8 Mar 2015 17:25:05 +0000 Subject: [PATCH 022/312] Added X-ray implant, implant icon, touched up surgery. --- code/datums/mutations.dm | 2 + .../mob/living/carbon/human/species.dm | 5 ++- code/modules/mob/living/carbon/life.dm | 9 ++-- code/modules/mob/mob_defines.dm | 3 +- .../modules/surgery/eye_cybernetic_implant.dm | 16 +++---- .../surgery/organs/cybernetic_implants.dm | 39 ++++++++++++++++-- icons/obj/surgery.dmi | Bin 11902 -> 11977 bytes 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 566adcedc03..0b17f8d3e21 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,6 +179,8 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return + if(locate(SEE_MOBS|SEE_OBJS|SEE_TURFS,owner.permanent_sight_flags)) + return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 61746a85d4e..edfe06f353c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,10 +510,11 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,H.permanent_sight_flags)) + H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + H.see_in_dark = darksight var/see_temp = H.see_invisible H.see_invisible = invis_sight - H.see_in_dark = darksight if(H.seer) H.see_invisible = SEE_INVISIBLE_OBSERVER diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b4181b590a0..852eee42628 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,10 +561,11 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 + if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,permanent_sight_flags)) + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING if(see_override) see_invisible = see_override diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index fc400cc87f6..39bced45333 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -157,4 +157,5 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/last_movement = 0 // Last world.time the mob actually moved of its own accord. - var/permanent_huds = new /list() + var/permanent_huds = new /list() //any HUDs in this list will be ignored by HUD removing procs + var/permanent_sight_flags = new /list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm index 31f5e74c552..f9d1367753a 100644 --- a/code/modules/surgery/eye_cybernetic_implant.dm +++ b/code/modules/surgery/eye_cybernetic_implant.dm @@ -8,8 +8,7 @@ time = 32 /datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool,/obj/item/organ/cybernetic_implant)) - user.visible_message("[user] begins to implant [target] with [tool].") + user.visible_message("[user] begins to implant [target] with [tool].") /datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(tool) @@ -17,15 +16,16 @@ user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") return 0 else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) - user.visible_message("[user] can't seem to add any more implants into [target].") - return 0 + user.visible_message("[user] can't seem to implant anything else into [target]'s eyes.") + return 1 else user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") - user.drop_item() - target.internal_organs += tool - tool.loc = target - var/obj/item/organ/cybernetic_implant/implant = tool + var/obj/item/organ/cybernetic_implant/eyes/implant = tool implant.owner = target implant.function() + target.internal_organs |= implant + user.drop_item() + implant.loc = target + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index eee16eaac1e..79d07c5350b 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -3,14 +3,26 @@ desc = "a state-of-the-art implant that improves a baseline's functionality" var/mob/owner = null +/obj/item/organ/cybernetic_implant/New(var/mob/M = null) + if(M) + owner = M + return ..() + /obj/item/organ/cybernetic_implant/proc/function() return /obj/item/organ/cybernetic_implant/eyes name = "cybernetic eyes" desc = "artificial photoreceptors with specialized functionality" - icon_state = "hudeye" + icon_state = "eye_implant" var/eye_color = "fff" + var/implant_color = "#FFFFFF" + +/obj/item/organ/cybernetic_implant/eyes/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() /obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() if(istype(owner,/mob/living/carbon/human)) @@ -21,8 +33,9 @@ /obj/item/organ/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." - icon_state = "hudeye" + icon_state = "eye_implant" eye_color = "0ff" + implant_color = "#00FFFF" /obj/item/organ/cybernetic_implant/eyes/medical_hud/function() if(!owner) @@ -37,8 +50,9 @@ /obj/item/organ/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." - icon_state = "hudeye" - eye_color = "b00" + icon_state = "eye_implant" + eye_color = "d00" + implant_color = "#CC0000" /obj/item/organ/cybernetic_implant/eyes/security_hud/function() if(!owner) @@ -48,4 +62,21 @@ H.add_hud_to(owner) owner.permanent_huds |= H + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/xray + name = "xray implant" + desc = "These cybernetic eyes will enhance your vision with X-Ray. Blinking is futile." + icon_state = "eye_implant" + eye_color = "000" + implant_color = "#000000" + +/obj/item/organ/cybernetic_implant/eyes/xray/function() + if(!owner) + return + + owner.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS + owner.see_in_dark = 8 + owner.permanent_sight_flags |= SEE_MOBS|SEE_OBJS|SEE_TURFS + update_eye_color() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index ac54bf1759a06717efd82da9f162e47f5f532d26..40cbe114df7855e28d4aada8805e483a2c11f556 100644 GIT binary patch literal 11977 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 AKmY&$ literal 11902 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 Date: Sun, 8 Mar 2015 10:44:43 -0700 Subject: [PATCH 023/312] Cyborgs no longer have flesh to knit. --- .../reagents/Chemistry-Goon-Medicine.dm | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index ab16118b87f..df1c02a394a 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -13,15 +13,16 @@ datum/reagent/silver_sulfadiazine metabolization_rate = 2 datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(method == TOUCH) - M.adjustFireLoss(-volume) - if(show_message) - M << "You feel your burns healing!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + if(ishuman(M)) + if(method == TOUCH) + M.adjustFireLoss(-volume) + if(show_message) + M << "You feel your burns healing!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" ..() return @@ -40,15 +41,16 @@ datum/reagent/styptic_powder metabolization_rate = 2 datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(method == TOUCH) - M.adjustBruteLoss(-volume) - if(show_message) - M << "You feel your wounds knitting back together!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + if(ishuman(M)) + if(method == TOUCH) + M.adjustBruteLoss(-volume) + if(show_message) + M << "You feel your wounds knitting back together!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" ..() return @@ -83,11 +85,12 @@ datum/reagent/synthflesh datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) if(!M) M = holder.my_atom - if(method == TOUCH) - M.adjustBruteLoss(-1.5*volume) - M.adjustFireLoss(-1.5*volume) - if(show_message) - M << "You feel your burns healing and your flesh knitting together!" + if(ishuman(M)) + if(method == TOUCH) + M.adjustBruteLoss(-1.5*volume) + M.adjustFireLoss(-1.5*volume) + if(show_message) + M << "You feel your burns healing and your flesh knitting together!" ..() return From 61e1abafc6ae6902bb1ce29f610b8ad86e0ab623 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 10:45:25 -0700 Subject: [PATCH 024/312] Meth no longer breaks the space time continuum. --- .../reagents/Chemistry-Goon-420BlazeIt.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index 130cf6a2675..75b356857c3 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -169,7 +169,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) if(prob(20)) @@ -199,7 +199,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return /datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) M.Jitter(15) @@ -209,7 +209,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return /datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(20) @@ -317,7 +317,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(1) M.adjustToxLoss(0.1) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) step(M, pick(cardinal)) step(M, pick(cardinal)) ..() @@ -333,7 +333,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) if(prob(20)) @@ -347,7 +347,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) /datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) M.hallucination += 10 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(5) @@ -358,7 +358,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) M.hallucination += 20 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) M.Jitter(10) @@ -370,7 +370,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) M.hallucination += 30 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 12, i++) step(M, pick(cardinal)) M.Jitter(15) @@ -382,7 +382,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return /datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.hallucination += 40 - if(M.canmove && !istype(M.loc, /turf/space)) + if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 16, i++) step(M, pick(cardinal)) M.Jitter(50) From f602408aef24e2230cc351e5156e668383caee85 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 13:12:29 -0700 Subject: [PATCH 025/312] Update Chemistry-Goon-Medicine.dm --- code/modules/reagents/Chemistry-Goon-Medicine.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index df1c02a394a..3169bea4dc0 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -13,7 +13,7 @@ datum/reagent/silver_sulfadiazine metabolization_rate = 2 datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(ishuman(M)) + if(iscarbon(M)) if(method == TOUCH) M.adjustFireLoss(-volume) if(show_message) @@ -41,7 +41,7 @@ datum/reagent/styptic_powder metabolization_rate = 2 datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(ishuman(M)) + if(iscarbon(M)) if(method == TOUCH) M.adjustBruteLoss(-volume) if(show_message) @@ -85,7 +85,7 @@ datum/reagent/synthflesh datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) if(!M) M = holder.my_atom - if(ishuman(M)) + if(iscarbon(M)) if(method == TOUCH) M.adjustBruteLoss(-1.5*volume) M.adjustFireLoss(-1.5*volume) From fc81daee07ded5b8b314a52f8d41240bfa7e4bf7 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sun, 8 Mar 2015 20:19:02 +0000 Subject: [PATCH 026/312] Added Thermals and emp_act(). Tweaked some related code. --- code/datums/mutations.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/examine.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../mob/living/carbon/human/species.dm | 11 +++-- code/modules/mob/living/carbon/life.dm | 7 ++- .../surgery/organs/cybernetic_implants.dm | 42 +++++++++++++----- icons/obj/surgery.dmi | Bin 11977 -> 12003 bytes 8 files changed, 49 insertions(+), 19 deletions(-) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 0b17f8d3e21..07999b41ed1 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,7 +179,7 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return - if(locate(SEE_MOBS|SEE_OBJS|SEE_TURFS,owner.permanent_sight_flags)) + if(locate(SEE_MOBS,owner.permanent_sight_flags) && locate(SEE_OBJS,owner.permanent_sight_flags) && locate(SEE_TURFS,owner.permanent_sight_flags)) //Xray flag combo return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a9b1f519542..8371b8386aa 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -156,7 +156,7 @@ /mob/living/carbon/proc/eyecheck() - return 0 + return locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 /mob/living/carbon/proc/tintcheck() return 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 71327284c39..2b626f600f8 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -284,7 +284,7 @@ if(R) msg += "\[Medical evaluation\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(H.internal_organs,/obj/item/organ/cybernetic_implant/eyes/security_hud)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index ccdc5aa956c..b4b04f5a5bf 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -78,7 +78,7 @@ ///eyecheck() ///Returns a number between -1 to 2 /mob/living/carbon/human/eyecheck() - var/number = 0 + var/number = locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item number += HFP.flash_protect diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index edfe06f353c..897583a2104 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,9 +510,14 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,H.permanent_sight_flags)) - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) - H.see_in_dark = darksight + if(!locate(SEE_TURFS,H.permanent_sight_flags)) + H.sight &= ~SEE_TURFS + if(!locate(SEE_MOBS,H.permanent_sight_flags)) + H.sight &= ~SEE_MOBS + if(!locate(SEE_OBJS,H.permanent_sight_flags)) + H.sight &= ~SEE_OBJS + + H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight var/see_temp = H.see_invisible H.see_invisible = invis_sight diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 852eee42628..8120504ca89 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,11 +561,14 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,permanent_sight_flags)) + if(!locate(SEE_TURFS,permanent_sight_flags)) sight &= ~SEE_TURFS + if(!locate(SEE_MOBS,permanent_sight_flags)) sight &= ~SEE_MOBS + if(!locate(SEE_OBJS,permanent_sight_flags)) sight &= ~SEE_OBJS - see_in_dark = 2 + + see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo see_invisible = SEE_INVISIBLE_LIVING if(see_override) see_invisible = see_override diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 79d07c5350b..218542fa203 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -33,7 +33,6 @@ /obj/item/organ/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." - icon_state = "eye_implant" eye_color = "0ff" implant_color = "#00FFFF" @@ -44,13 +43,11 @@ var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() /obj/item/organ/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." - icon_state = "eye_implant" eye_color = "d00" implant_color = "#CC0000" @@ -61,13 +58,11 @@ var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() /obj/item/organ/cybernetic_implant/eyes/xray name = "xray implant" - desc = "These cybernetic eyes will enhance your vision with X-Ray. Blinking is futile." - icon_state = "eye_implant" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" implant_color = "#000000" @@ -75,8 +70,35 @@ if(!owner) return - owner.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS - owner.see_in_dark = 8 - owner.permanent_sight_flags |= SEE_MOBS|SEE_OBJS|SEE_TURFS + owner.sight |= SEE_MOBS + owner.sight |= SEE_OBJS + owner.sight |= SEE_TURFS + owner.permanent_sight_flags |= SEE_MOBS + owner.permanent_sight_flags |= SEE_OBJS + owner.permanent_sight_flags |= SEE_TURFS + update_eye_color() - update_eye_color() \ No newline at end of file +/obj/item/organ/cybernetic_implant/eyes/thermals + name = "thermals implant" + desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." + eye_color = "FC0" + implant_color = "#FFCC00" + +/obj/item/organ/cybernetic_implant/eyes/thermals/function() + if(!owner) + return + + owner.sight |= SEE_MOBS + owner.permanent_sight_flags |= SEE_MOBS + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/emp_act(severity) + if(severity > 1) + if(prob(5)) + return + var/save_sight = owner.sight + owner.sight &= 0 + owner.disabilities |= BLIND + spawn(50) + owner.sight |= save_sight + owner.disabilities &= ~BLIND \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 40cbe114df7855e28d4aada8805e483a2c11f556..da2b249866dd245d44c3318954975d93dc450ef2 100644 GIT binary patch literal 12003 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

LO&_%4Pr<%xHs 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 literal 11977 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 AKmY&$ From dd2fe28678543b30dba83b9589392e05e6f82ad0 Mon Sep 17 00:00:00 2001 From: Incoming Date: Sun, 8 Mar 2015 16:35:46 -0400 Subject: [PATCH 027/312] Fixes cavity implant surgery not respecting NODROP --- code/modules/surgery/cavity_implant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm index 72223b4716f..289dadeec2d 100644 --- a/code/modules/surgery/cavity_implant.dm +++ b/code/modules/surgery/cavity_implant.dm @@ -25,7 +25,7 @@ /datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(tool) - if(IC || tool.w_class > 3 || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ)) + if(IC || tool.w_class > 3 || NODROP in tool.flags || tool.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/weapon/disk/nuclear) || istype(tool, /obj/item/organ)) user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") return 0 else From 1a092e0edef2cca0e0f131bacd1dcfa8d1702be3 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 8 Mar 2015 22:15:55 +0100 Subject: [PATCH 028/312] Changes how doughs are made. 10water+15flour chem reaction for dough. 15flour+15eggyolk+5sugar for cake batter (or alternatively for vegans 15 soymilk instead of the eggyolk). Introduce egg yolk reagent You can break eggs in open reagent containers or blend them to get egg yolk. Fixes breadslices sprites and other merge conflict bugs in food.dmi. Change customizable snack max volume to 60. Buff nutriment amount in doughs. --- code/game/objects/items/weapons/manuals.dm | 5 +- .../modules/food&drinks/food/customizables.dm | 4 +- code/modules/food&drinks/food/snacks/dough.dm | 11 +-- code/modules/food&drinks/food/snacks_egg.dm | 15 ++++ .../food&drinks/recipes/food_mixtures.dm | 72 ++++++------------ .../recipes/tablecraft/recipes_dough.dm | 53 ------------- code/modules/reagents/Chemistry-Machinery.dm | 1 + .../Consumable-Reagents/Food-Reagents.dm | 6 ++ code/modules/reagents/reagent_containers.dm | 18 ----- html/changelogs/phil235-DoughChange.yml | 6 ++ icons/obj/food.dmi | Bin 96731 -> 94626 bytes tgstation.dme | 1 - 12 files changed, 62 insertions(+), 130 deletions(-) delete mode 100644 code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm create mode 100644 html/changelogs/phil235-DoughChange.yml diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index b7d25927991..94a1afa043c 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -680,7 +680,10 @@

Basic ingredients preparation:

- Dough: Add an egg to 15 flour. Dough can be transformed by using your knife and rolling pin or by adding milk. All doughs can be microwaved.
+ Dough: 10u water + 15u flour for simple dough.
+ 15u egg yolk + 15u flour + 5u sugar for cake batter.
+ Doughs can be transformed by using a knife and rolling pin.
+ All doughs can be microwaved.
Bowl: Add water to it for soup preparation.
Meat: Microwave it, process it, slice it into microwavable cutlets with your knife, or use it raw.
Cheese: Add 5u universal enzyme (catalyst) to milk and soy milk to prepare cheese (sliceable) and tofu. diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food&drinks/food/customizables.dm index 46c1f0dace6..168210ad21f 100644 --- a/code/modules/food&drinks/food/customizables.dm +++ b/code/modules/food&drinks/food/customizables.dm @@ -15,6 +15,7 @@ /obj/item/weapon/reagent_containers/food/snacks/customizable bitesize = 4 w_class = 3 + volume = 60 var/ingMax = 12 var/list/ingredients = list() @@ -67,9 +68,8 @@ return name = "[customname] [initial(name)]" - else . = ..() - return + /obj/item/weapon/reagent_containers/food/snacks/customizable/proc/update_name(obj/item/weapon/reagent_containers/food/snacks/S) for(var/obj/item/I in ingredients) diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food&drinks/food/snacks/dough.dm index aca417a2473..d03339809cd 100644 --- a/code/modules/food&drinks/food/snacks/dough.dm +++ b/code/modules/food&drinks/food/snacks/dough.dm @@ -8,9 +8,8 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "dough" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain - list_reagents = list("nutriment" = 3) + list_reagents = list("nutriment" = 6) w_class = 3 - flags = OPENCONTAINER // Dough + rolling pin = flat dough @@ -35,9 +34,8 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 cooked_type = /obj/item/weapon/reagent_containers/food/snacks/pizzabread - list_reagents = list("nutriment" = 3) + list_reagents = list("nutriment" = 6) w_class = 3 - flags = OPENCONTAINER /obj/item/weapon/reagent_containers/food/snacks/pizzabread name = "pizza bread" @@ -56,7 +54,6 @@ icon_state = "doughslice" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/bun filling_color = "#CD853F" - flags = OPENCONTAINER /obj/item/weapon/reagent_containers/food/snacks/bun @@ -74,7 +71,7 @@ icon = 'icons/obj/food_ingredients.dmi' icon_state = "cakebatter" cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain - list_reagents = list("nutriment" = 3) + list_reagents = list("nutriment" = 9) w_class = 3 // Cake batter + rolling pin = pie dough @@ -97,7 +94,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase slices_num = 3 cooked_type = /obj/item/weapon/reagent_containers/food/snacks/pie/plain - list_reagents = list("nutriment" = 3) + list_reagents = list("nutriment" = 9) w_class = 3 /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index 8d9a585c2f8..c86118a5462 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -16,6 +16,21 @@ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledegg filling_color = "#F0E68C" +/obj/item/weapon/reagent_containers/food/snacks/egg/afterattack(obj/target, mob/user, proximity) + if(!proximity) + return + + if(istype(target, /obj/item/weapon/reagent_containers)) + if(target.is_open_container() && target.reagents) + + if(target.reagents.total_volume >= target.reagents.maximum_volume) + user << "[target] is full." + else + user << "You break [src] in [target]." + target.reagents.add_reagent("eggyolk", 5) + qdel(src) + return + /obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food&drinks/recipes/food_mixtures.dm index d468f33dfde..f038a3b3fb1 100644 --- a/code/modules/food&drinks/recipes/food_mixtures.dm +++ b/code/modules/food&drinks/recipes/food_mixtures.dm @@ -111,43 +111,6 @@ required_reagents = list("capsaicin" = 1, "hot_ramen" = 6) result_amount = 6 -/datum/chemical_reaction/cakebatter - name = "Cake Batter" - id = "cakebatter" - result = null - required_reagents = list("milk" = 5) - result_amount = 1 - required_container = /obj/item/weapon/reagent_containers/food/snacks/dough - mix_message = "The dough forms a cake batter." - -/datum/chemical_reaction/cakebatter/on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/cakebatter - S.loc = get_turf(holder.my_atom) - if(holder && holder.my_atom) - qdel(holder.my_atom) - -/datum/chemical_reaction/piedough - name = "Pie Dough" - id = "piedough" - result = null - required_reagents = list("milk" = 5) - result_amount = 1 - required_container = /obj/item/weapon/reagent_containers/food/snacks/flatdough - mix_message = "The dough forms a pie dough." - -/datum/chemical_reaction/piedough/on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/piedough - S.loc = get_turf(holder.my_atom) - if(holder && holder.my_atom) - qdel(holder.my_atom) - -/datum/chemical_reaction/cakebatter/alt - id = "cakebatteralt" - required_reagents = list("soymilk" = 5) - -/datum/chemical_reaction/piedough/alt - id = "piedoughalt" - required_reagents = list("soymilk" = 5) /datum/chemical_reaction/imitationcarpmeat name = "Imitation Carpmeat" @@ -164,22 +127,35 @@ if(holder && holder.my_atom) qdel(holder.my_atom) -/datum/chemical_reaction/rawpastrybase - name = "Raw Pastry Base" - id = "rawpastrybase" +/datum/chemical_reaction/dough + name = "Dough" + id = "dough" result = null - required_reagents = list("milk" = 5) + required_reagents = list("water" = 10, "flour" = 15) result_amount = 1 - required_container = /obj/item/weapon/reagent_containers/food/snacks/doughslice - mix_message = "The doughslice forms a raw pastry base" + mix_message = "The ingredients form a dough." -/datum/chemical_reaction/rawpastrybase/on_reaction(var/datum/reagents/holder) - var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase +/datum/chemical_reaction/cakebatter/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/cakebatter S.loc = get_turf(holder.my_atom) if(holder && holder.my_atom) qdel(holder.my_atom) -/datum/chemical_reaction/rawpastrybase/alt - id = "rawpastrybasealt" - required_reagents = list("soymilk" = 5) +/datum/chemical_reaction/cakebatter + name = "Cake Batter" + id = "cakebatter" + result = null + required_reagents = list("eggyolk" = 15, "flour" = 15, "sugar" = 5) + result_amount = 1 + mix_message = "The ingredients form a cake batter." + +/datum/chemical_reaction/cakebatter/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/cakebatter + S.loc = get_turf(holder.my_atom) + if(holder && holder.my_atom) + qdel(holder.my_atom) + +/datum/chemical_reaction/cakebatter/vegan + id = "vegancakebatter" + required_reagents = list("soymilk" = 15, "flour" = 15, "sugar" = 5) diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm deleted file mode 100644 index a81fee36e52..00000000000 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm +++ /dev/null @@ -1,53 +0,0 @@ - - -// see code/module/crafting/table.dm - -////////////////////////////////////////////////DOUGH//////////////////////////////////////////////// - -//these recipes can also be done with attackby. - -/datum/table_recipe/cakebatter - name = "Cake Batter" - reqs = list( - /datum/reagent/consumable/milk = 5, - /obj/item/weapon/reagent_containers/food/snacks/dough = 1 - ) - result = /obj/item/weapon/reagent_containers/food/snacks/cakebatter - -/datum/table_recipe/cakebatter/alt - reqs = list( - /datum/reagent/consumable/soymilk = 5, - /obj/item/weapon/reagent_containers/food/snacks/dough = 1 - ) - -/datum/table_recipe/piedough - name = "Pie Dough" - reqs = list( - /datum/reagent/consumable/milk = 5, - /obj/item/weapon/reagent_containers/food/snacks/flatdough = 1 - ) - result = /obj/item/weapon/reagent_containers/food/snacks/piedough - -/datum/table_recipe/piedough/alt - reqs = list( - /datum/reagent/consumable/soymilk = 5, - /obj/item/weapon/reagent_containers/food/snacks/flatdough = 1 - ) - -/datum/table_recipe/rawpastrybase - name = "Raw Pastry Base" - reqs = list( - /datum/reagent/consumable/milk = 5, - /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1 - ) - result = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase - -/datum/table_recipe/rawpastrybase/alt - reqs = list( - /datum/reagent/consumable/soymilk = 5, - /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1 - ) - - - - diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index a23de90b69c..496b6467887 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -922,6 +922,7 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime) /obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5), /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0), + /obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5), //Grinder stuff, but only if dry /obj/item/weapon/reagent_containers/food/snacks/grown/coffee/arabica = list("coffeepowder" = 0), diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index 994ef10178d..03da7a121b3 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -404,3 +404,9 @@ datum/reagent/consumable/vanilla reagent_state = SOLID nutriment_factor = 5 * REAGENTS_METABOLISM color = "#FFFACD" + +datum/reagent/consumable/eggyolk + name = "Egg Yolk" + id = "eggyolk" + description = "It's full of protein." + color = "#FFB500" \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index c0051eb3b8a..4803a311e33 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -77,21 +77,3 @@ return 0 return 1 - -/obj/item/weapon/reagent_containers/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/egg)) //making dough - var/obj/item/weapon/reagent_containers/food/snacks/egg/E = W - if(flags & OPENCONTAINER) - if(reagents) - if(reagents.has_reagent("flour")) - if(reagents.get_reagent_amount("flour") >= 15) - var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/dough(get_turf(src)) - user << "You mix egg and flour to make some dough." - reagents.remove_reagent("flour", 15) - if(E.reagents) - E.reagents.trans_to(S,E.reagents.total_volume) - qdel(E) - else - user << "Not enough flour to make dough." - return - ..() \ No newline at end of file diff --git a/html/changelogs/phil235-DoughChange.yml b/html/changelogs/phil235-DoughChange.yml new file mode 100644 index 00000000000..db83d37a729 --- /dev/null +++ b/html/changelogs/phil235-DoughChange.yml @@ -0,0 +1,6 @@ +author: phil235 +delete-after: True +changes: + - rscadd: "Adds egg yolk reagent. You can break eggs in open reagent containers or blend them to get egg yolk." + - tweak: "Changes how doughs are made. 10water+15flour chem reaction for dough. 15flour+15eggyolk+5sugar for cake batter (or alternatively soymilk instead of the eggyolk for vegans)." + - tweak: "Change customizable snack max volume to 60 and buffs nutriment amount in doughs." \ No newline at end of file diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 9b05ea1d2cef02a26be61bf76125696cdce59a78..a8ee5a9eeada7d5246d77177171ccebf7d13ea3e 100644 GIT binary patch delta 56939 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 delta 59061 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 Date: Sun, 8 Mar 2015 22:44:47 +0100 Subject: [PATCH 029/312] Readd the last_tick var and buff mutetoxin effect to solve the issue with 'silent' in a simpler way. --- code/modules/reagents/Chemistry-Holder.dm | 43 ++++++++++--------- .../Chemistry-Reagents/Toxin-Reagents.dm | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index d849d74af5d..6041066d737 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -11,6 +11,7 @@ datum/reagents var/maximum_volume = 100 var/atom/my_atom = null var/chem_temp = 150 + var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() @@ -204,27 +205,26 @@ datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature handle_reactions() - - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - if(M.reagent_check(R) != 1) - R.on_mob_life(M) - - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) - R.overdosed = 1 - M << "You feel like you took too much of [R.name]!" - R.overdose_start(M) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) - var/datum/reagent/new_reagent = new R.type() - addiction_list.Add(new_reagent) - if(R.overdosed) - R.overdose_process(M) - if(is_type_in_list(R,addiction_list)) - for(var/datum/reagent/addicted_reagent in addiction_list) - if(istype(R, addicted_reagent)) - addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. - + if(last_tick == 3) + last_tick = 1 + for(var/A in reagent_list) + var/datum/reagent/R = A + if(M && R) + if(M.reagent_check(R) != 1) + if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + M << "You feel like you took too much of [R.name]!" + R.overdose_start(M) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + var/datum/reagent/new_reagent = new R.type() + addiction_list.Add(new_reagent) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + R.on_mob_life(M) if(addiction_tick == 6) addiction_tick = 1 for(var/A in addiction_list) @@ -248,6 +248,7 @@ datum/reagents/proc/metabolize(var/mob/M) M << "You feel like you've gotten over your need for [R.name]." addiction_list.Remove(R) addiction_tick++ + last_tick++ update_total() datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0) diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index bd4c63e55d2..f4cf3ebde66 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -317,7 +317,7 @@ datum/reagent/toxin/mutetoxin //the new zombie powder. toxpwr = 0 datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) - M.silent = max(M.silent, 2) + M.silent = max(M.silent, 3) ..() datum/reagent/toxin/staminatoxin From 193372b407bbb52946eac8cf232e34ab7a307877 Mon Sep 17 00:00:00 2001 From: GunHog Date: Sun, 8 Mar 2015 16:46:41 -0500 Subject: [PATCH 030/312] Loyalty Implant Firing Pins - Allows the construction of Loyalty Pins at Combat tech 5, instead of 10. --- code/modules/research/designs/weapon_designs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 62aca6fca2a..38615c9f359 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -16,7 +16,7 @@ name = "loyalty firing pin" desc = "This is a security firing pin which only authorizes users who are loyalty-implanted." id = "pin_loyalty" - req_tech = list("combat" = 10, "materials" = 3, "powerstorage" = 3) + req_tech = list("combat" = 5, "materials" = 3, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$silver" = 600, "$diamond" = 600, "$uranium" = 200) build_path = /obj/item/device/firing_pin/implant/loyalty From 831f0dee6306dfd65594d5ebaac6b5dbfbff7293 Mon Sep 17 00:00:00 2001 From: GunHog Date: Sun, 8 Mar 2015 16:54:10 -0500 Subject: [PATCH 031/312] Changelog Mandatory sacrifice to Jordie! --- html/changelogs/Gun_Hog-LoyaltyPins.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/Gun_Hog-LoyaltyPins.yml diff --git a/html/changelogs/Gun_Hog-LoyaltyPins.yml b/html/changelogs/Gun_Hog-LoyaltyPins.yml new file mode 100644 index 00000000000..1d310521b39 --- /dev/null +++ b/html/changelogs/Gun_Hog-LoyaltyPins.yml @@ -0,0 +1,7 @@ + +author: Gun Hog + +delete-after: True + +changes: + - rscadd: "Nanotrasen has approved distribution of Loyalty Implant Firing Pin designs. They can be fabricated with sufficient research into weapons technology. If inserted into a firearm, it will only fire upon successful interface with a user's Loyalty Implant." From 573aea927bbd7a27cd78fbf6f98da88fd975c01e Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 16:43:57 -0700 Subject: [PATCH 032/312] Removes newcrit, fixes, changes, old chems now process every tick as per usual, only goonchems process every 3 ticks now. --- .../game/objects/effects/spawners/lootdrop.dm | 3 - .../recipes/tablecraft/recipes_pastry.dm | 2 +- code/modules/hydroponics/grown.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 91 +------- .../mob/living/carbon/human/species.dm | 3 +- code/modules/mob/living/carbon/life.dm | 8 +- .../reagents/Chemistry-Goon-420BlazeIt.dm | 215 ++++-------------- .../reagents/Chemistry-Goon-Medicine.dm | 188 +++++++-------- code/modules/reagents/Chemistry-Goon-Other.dm | 69 +++--- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 39 ++-- .../modules/reagents/Chemistry-Goon-Toxins.dm | 98 ++++---- code/modules/reagents/Chemistry-Holder.dm | 61 +++-- .../Chemistry-Reagents/Chemistry-Reagents.dm | 2 +- 13 files changed, 282 insertions(+), 499 deletions(-) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index aa9c969d34f..538e98cb003 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -116,8 +116,5 @@ /obj/item/weapon/wirecutters = 1, /obj/item/weapon/wrench = 4, /obj/item/weapon/relic = 3, - /obj/item/weapon/reagent_containers/food/drinks/muriatic_acid = 3, - /obj/item/weapon/reagent_containers/food/drinks/caustic_soda = 3, - /obj/item/weapon/reagent_containers/food/drinks/hydrogen_chloride = 3, "" = 11 ) diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm index c0a50e49ad2..4dd16325583 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm @@ -6,7 +6,7 @@ /datum/table_recipe/chaosdonut name = "Chaos donut" reqs = list( - /datum/reagent/cryostylane = 5, + /datum/reagent/goonchem/cryostylane = 5, /datum/reagent/consumable/capsaicin = 5, /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 77e26b97cf5..0bfa44cc9ea 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -148,7 +148,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/poppy/add_juice() if(..()) reagents.add_reagent("nutriment", 1 + round((potency / 20), 1)) - reagents.add_reagent("hotline", 3 + round((potency / 10), 1)) + reagents.add_reagent("salglu_solution", 1 + round((potency / 20), 1)) bitesize = 1 + round(reagents.total_volume / 3, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/poppy/lily diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 28870b142f0..0f36d61af57 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -295,7 +295,9 @@ death() silent = 0 return 1 - + //UNCONSCIOUS. NO-ONE IS HOME + if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) + Paralyse(3) if(hallucination) spawn handle_hallucinations() @@ -307,7 +309,6 @@ else for(var/atom/a in hallucinations) qdel(a) - if(paralysis) AdjustParalysis(-1) stat = UNCONSCIOUS @@ -482,90 +483,4 @@ adjustBrainLoss(10) return -/mob/living/carbon/human/handle_crit() - if(!is_incrit(src)) - return - else - var/paralyse_amount = 1 - var/losebreath_amount = 1 - var/cardiac_arrest_chance = 0 - var/brain_damage_from_crit = 5 - switch(health) - if(config.health_threshold_crit to -9) - paralyse_amount = 1 - losebreath_amount = 1 - cardiac_arrest_chance = 0 - brain_damage_from_crit = 1 - if(-20 to -10) - paralyse_amount = 1 - losebreath_amount = 2 - cardiac_arrest_chance = 0 - brain_damage_from_crit = 5 - if(-30 to -20) - paralyse_amount = 1 - losebreath_amount = 5 - cardiac_arrest_chance = 1 - brain_damage_from_crit = 5 - if(-40 to -30) - paralyse_amount = 2 - losebreath_amount = 8 - cardiac_arrest_chance = 2 - brain_damage_from_crit = 5 - if(-50 to -40) - paralyse_amount = 2 - losebreath_amount = 8 - cardiac_arrest_chance = 3 - brain_damage_from_crit = 8 - if(-60 to -50) - paralyse_amount = 2 - losebreath_amount = 8 - cardiac_arrest_chance = 4 - brain_damage_from_crit = 8 - if(-70 to -60) - paralyse_amount = 3 - losebreath_amount = 8 - cardiac_arrest_chance = 5 - brain_damage_from_crit = 8 - if(-80 to -70) - paralyse_amount = 3 - losebreath_amount = 8 - cardiac_arrest_chance = 6 - brain_damage_from_crit = 8 - if(-90 to -80) - paralyse_amount = 3 - losebreath_amount = 8 - cardiac_arrest_chance = 7 - brain_damage_from_crit = 10 - if(-95 to -90) - paralyse_amount = 4 - losebreath_amount = 8 - cardiac_arrest_chance = 8 - brain_damage_from_crit = 10 - if(-INFINITY to -95) - paralyse_amount = 4 - losebreath_amount = 8 - cardiac_arrest_chance = 9 - brain_damage_from_crit = 10 - var/picked_effect = rand(1,4) - switch(picked_effect) - if(1) - Paralyse(paralyse_amount) - if(2) - if(!reagents.has_reagent("epinephrine")) - losebreath += losebreath_amount - if(3) - if(prob(cardiac_arrest_chance)) - if(!heart_attack) - heart_attack = 1 - else - if(!reagents.has_reagent("epinephrine")) - losebreath += losebreath_amount - if(4) - Paralyse(paralyse_amount) - adjustBrainLoss(brain_damage_from_crit) - stuttering += 5 - if(!reagents.has_reagent("epinephrine")) - adjustOxyLoss(1) - return - #undef HUMAN_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 28a4bd30768..124d77b23db 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1007,7 +1007,8 @@ var/datum/gas_mixture/environment = H.loc.return_air() var/datum/gas_mixture/breath - + if(H.health <= config.health_threshold_crit) + H.losebreath++ if(H.losebreath>0) //Suffocating so do not take a breath H.losebreath-- if (prob(10)) //Gasp per 10 ticks? Sounds about right. diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index f54a6004086..d683811948d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -39,9 +39,6 @@ //Heart Attacks, etc. handle_heart() - //Critical condition handling - handle_crit() - . = 1 //Handle temperature/pressure differences between body and environment @@ -316,9 +313,6 @@ /mob/living/carbon/proc/handle_heart() return -/mob/living/carbon/proc/handle_crit() - return - /mob/living/carbon/proc/handle_random_events() return @@ -631,4 +625,4 @@ else healths.icon_state = "health6" else - healths.icon_state = "health7" + healths.icon_state = "health7" diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index 320625f8b3f..aea166a66c0 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -4,16 +4,16 @@ #define REM REAGENTS_EFFECT_MULTIPLIER -datum/reagent/nicotine +datum/reagent/goonchem/nicotine name = "Nicotine" id = "nicotine" - description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly." + description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 35 addiction_threshold = 30 -datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/nicotine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") if(prob(5)) @@ -23,7 +23,7 @@ datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/nicotine/overdose_process(var/mob/living/M as mob) if(prob(20)) M << "You feel like you smoked too much." M.adjustToxLoss(1*REM) @@ -31,16 +31,16 @@ datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) ..() return -datum/reagent/crank +datum/reagent/goonchem/crank name = "Crank" id = "crank" - description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell." + description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 addiction_threshold = 10 -datum/reagent/crank/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/crank/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") if(prob(5)) @@ -50,26 +50,26 @@ datum/reagent/crank/on_mob_life(var/mob/living/M as mob) M.AdjustWeakened(-2) ..() return -datum/reagent/crank/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/crank/overdose_process(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,10)*REM) M.adjustToxLoss(rand(1,10)*REM) M.adjustBruteLoss(rand(1,10)*REM) ..() return -datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob) +datum/reagent/goonchem/crank/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,10)*REM) ..() return -datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob) +datum/reagent/goonchem/crank/addiction_act_stage2(var/mob/living/M as mob) M.adjustToxLoss(rand(1,10)*REM) ..() return -datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob) +datum/reagent/goonchem/crank/addiction_act_stage3(var/mob/living/M as mob) M.adjustBruteLoss(rand(1,10)*REM) ..() return -datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) +datum/reagent/goonchem/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,10)*REM) M.adjustToxLoss(rand(1,10)*REM) M.adjustBruteLoss(rand(1,10)*REM) @@ -84,17 +84,17 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." required_temp = 390 -/datum/reagent/krokodil +/datum/reagent/goonchem/krokodil name = "Krokodil" id = "krokodil" - description = "Cools and calms you down, occasional BRAIN and TOX damage." + description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 addiction_threshold = 15 -/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/krokodil/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") if(prob(5)) @@ -102,7 +102,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob) +/datum/reagent/goonchem/krokodil/overdose_process(var/mob/living/M as mob) if(prob(10)) M.adjustBrainLoss(rand(1,5)*REM) M.adjustToxLoss(rand(1,5)*REM) @@ -110,23 +110,23 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) return -/datum/reagent/krokodil/addiction_act_stage1(var/mob/living/M as mob) +/datum/reagent/goonchem/krokodil/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,5)*REM) M.adjustToxLoss(rand(1,5)*REM) ..() return -/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob) +/datum/reagent/goonchem/krokodil/addiction_act_stage2(var/mob/living/M as mob) if(prob(25)) M << "Your skin feels loose..." ..() return -/datum/reagent/krokodil/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/goonchem/krokodil/addiction_act_stage3(var/mob/living/M as mob) if(prob(25)) M << "Your skin starts to peel away..." M.adjustBruteLoss(3*REM) ..() return -/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/goonchem/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M << "Your skin sloughs off!" M.adjustBruteLoss(rand(50,80)*REM) ..() @@ -141,17 +141,17 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) mix_message = "The mixture dries into a pale blue powder." required_temp = 380 -/datum/reagent/methamphetamine +/datum/reagent/goonchem/methamphetamine name = "Methamphetamine" id = "methamphetamine" - description = "3x stun reduction per cycle, significant stamina regeneration buff, makes you really jittery, dramatically increases movement speed." + description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 addiction_threshold = 10 metabolization_rate = 0.6 -/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/methamphetamine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(prob(5)) @@ -168,7 +168,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) +/datum/reagent/goonchem/methamphetamine/overdose_process(var/mob/living/M as mob) if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) @@ -185,20 +185,20 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) return -/datum/reagent/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) +/datum/reagent/goonchem/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) M.Jitter(5) if(prob(20)) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) +/datum/reagent/goonchem/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) M.Jitter(10) M.Dizzy(10) if(prob(30)) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/goonchem/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) @@ -208,7 +208,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/goonchem/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) @@ -228,59 +228,6 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) result_amount = 4 required_temp = 374 -/datum/chemical_reaction/methamphetamine_two - name = "methamphetamine_two" - id = "methamphetamine_two" - result = "methamphetamine" - required_reagents = list("muriatic_acid" = 1, "caustic_soda" = 1, "hydrogen_chloride" = 1) - result_amount = 3 - required_temp = 374 - -/datum/reagent/muriatic_acid - name = "Muriatic Acid" - id = "muriatic_acid" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/caustic_soda - name = "Caustic Soda" - id = "caustic_soda" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/hydrogen_chloride - name = "Hydrogen Chloride" - id = "hydrogen_chloride" - description = "A chemical compound." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/chemical_reaction/muriatic_acid - name = "muriatic_acid" - id = "muriatic_acid" - result = "muriatic_acid" - required_reagents = list("mutadone" = 1, "sacid" = 1) - result_amount = 2 - required_temp = 500 - -/datum/chemical_reaction/caustic_soda - name = "caustic_soda" - id = "caustic_soda" - result = "caustic_soda" - required_reagents = list("sacid" = 1, "cola" = 1) - result_amount = 2 - required_temp = 500 - -/datum/chemical_reaction/hydrogen_chloride - name = "hydrogen_chloride" - id = "hydrogen_chloride" - result = "hydrogen_chloride" - required_reagents = list("hydrogen" = 1, "chlorine" = 1) - result_amount = 2 - required_temp = 500 - /datum/chemical_reaction/saltpetre name = "saltpetre" id = "saltpetre" @@ -288,14 +235,14 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) result_amount = 3 -/datum/reagent/saltpetre +/datum/reagent/goonchem/saltpetre name = "Saltpetre" id = "saltpetre" description = "Volatile." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 -/datum/reagent/bath_salts +/datum/reagent/goonchem/bath_salts name = "Bath Salts" id = "bath_salts" description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." @@ -305,7 +252,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) addiction_threshold = 10 -/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/bath_salts/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) @@ -331,7 +278,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) result_amount = 7 required_temp = 374 -/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) +/datum/reagent/goonchem/bath_salts/overdose_process(var/mob/living/M as mob) M.hallucination += 10 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 8, i++) @@ -345,7 +292,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) +/datum/reagent/goonchem/bath_salts/addiction_act_stage1(var/mob/living/M as mob) M.hallucination += 10 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 8, i++) @@ -356,7 +303,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) +/datum/reagent/goonchem/bath_salts/addiction_act_stage2(var/mob/living/M as mob) M.hallucination += 20 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 8, i++) @@ -368,7 +315,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/goonchem/bath_salts/addiction_act_stage3(var/mob/living/M as mob) M.hallucination += 30 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 12, i++) @@ -380,7 +327,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/goonchem/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.hallucination += 40 if(M.canmove && !istype(M.loc, /turf/space)) for(var/i = 0, i < 16, i++) @@ -401,14 +348,14 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) result_amount = 3 -/datum/reagent/aranesp +/datum/reagent/goonchem/aranesp name = "Aranesp" id = "aranesp" - description = "Volatile." + description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 -/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/aranesp/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) @@ -420,87 +367,3 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustOxyLoss(20) ..() return - -/obj/item/weapon/reagent_containers/food/drinks/muriatic_acid - name = "jug of muriatic acid" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("muriatic_acid" = 50) - -/obj/item/weapon/reagent_containers/food/drinks/caustic_soda - name = "jug of caustic soda" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("caustic_soda" = 50) - -/obj/item/weapon/reagent_containers/food/drinks/hydrogen_chloride - name = "jug of hydrogen chloride" - desc = "We needed those cooks." - icon_state = "chem_jug" - item_state = "carton" - list_reagents = list("hydrogen_chloride" = 50) - -datum/reagent/hotline - name = "Hotline" - id = "hotline" - description = "It isn't just wrong. It's dead wrong." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose_threshold = 15 - addiction_threshold = 10 - -datum/reagent/hotline/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - var/high_message = pick("You feel alert.", "You feel like you can see everything more clearly.", "You feel like you need to relax and examine your surroundings.") - if(prob(5)) - M << "[high_message]" - M.druggy = max(M.druggy, 15) - M.hallucination += 10 - M.adjustBrainLoss(0.2) - M.adjustBruteLoss(-0.2) - M.adjustFireLoss(-0.2) - M.status_flags |= GOTTAGOFAST - M.adjustStaminaLoss(-3) - ..() - return -datum/reagent/hotline/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,20)*REM) - M.adjustToxLoss(rand(1,20)*REM) - M.adjustBruteLoss(rand(1,20)*REM) - M.druggy = max(M.druggy, 30) - M.hallucination += 30 - if(prob(5)) - M << pick("Your head feels like it's ripping apart!","You wonder why the fuck did you decide to take [src.name].","It hurts so bad!","Please, end it now!","Dear [ticker.Bible_deity_name] please no it hurts!") - ..() - return - -datum/reagent/hotline/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage2(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,20)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage3(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,30)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - ..() - return -datum/reagent/hotline/addiction_act_stage4(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,30)) - M.hallucination += 30 - M.druggy = max(M.druggy, 30) - var/mob/living/carbon/human/H = M - if(prob(1) && !H.heart_attack) - H.visible_message("[H] clutches at their chest! It looks like they're having a heart attack!") - H.heart_attack = 1 // don't do drugs kids - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 0deb593d462..8bb186814e2 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -4,15 +4,15 @@ #define REM REAGENTS_EFFECT_MULTIPLIER -datum/reagent/silver_sulfadiazine +datum/reagent/goonchem/silver_sulfadiazine name = "Silver Sulfadiazine" id = "silver_sulfadiazine" - description = "100% chance per cycle of healing 2 points of BURN damage." + description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 2 -datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +datum/reagent/goonchem/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) if(method == TOUCH) M.adjustFireLoss(-volume) if(show_message) @@ -25,21 +25,21 @@ datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/meth ..() return -datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustFireLoss(-2*REM) ..() return -datum/reagent/styptic_powder +datum/reagent/goonchem/styptic_powder name = "Styptic Powder" id = "styptic_powder" - description = "100% chance per cycle of healing 2 points of BRUTE damage." + description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 2 -datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) +datum/reagent/goonchem/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) if(method == TOUCH) M.adjustBruteLoss(-volume) if(show_message) @@ -52,21 +52,21 @@ datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TO ..() return -datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/styptic_powder/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(55)) M.adjustBruteLoss(-8*REM) ..() return -datum/reagent/salglu_solution +datum/reagent/goonchem/salglu_solution name = "Saline-Glucose Solution" id = "salglu_solution" - description = "33% chance per cycle of healing 1 point each of BRUTE and BURN damage." + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/salglu_solution/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(33)) M.adjustBruteLoss(-1*REM) @@ -74,14 +74,14 @@ datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/synthflesh +datum/reagent/goonchem/synthflesh name = "Synthflesh" id = "synthflesh" - description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage." + description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) +datum/reagent/goonchem/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) if(!M) M = holder.my_atom if(method == TOUCH) M.adjustBruteLoss(-1.5*volume) @@ -91,17 +91,17 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo ..() return -datum/reagent/charcoal +datum/reagent/goonchem/charcoal name = "Charcoal" id = "charcoal" - description = "Heals 3 TOX damage per cycle and purges other chemicals slowly." + description = "Heals toxin damage, and will also slowly remove any other chemicals." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/charcoal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(-3*REM) - for(var/datum/reagent/R in M.reagents.reagent_list) + for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,1) ..() @@ -145,16 +145,16 @@ datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) result_amount = 4 mix_message = "The solution yields an astringent powder." -datum/reagent/omnizine +datum/reagent/goonchem/omnizine name = "Omnizine" id = "omnizine" - description = "Heals one each of OXY, TOX, BRUTE and BURN per cycle." + description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 overdose_threshold = 30 -datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/omnizine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(-1*REM) M.adjustOxyLoss(-1*REM) @@ -163,7 +163,7 @@ datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/omnizine/overdose_process(var/mob/living/M as mob) M.adjustToxLoss(3*REM) M.adjustOxyLoss(3*REM) M.adjustBruteLoss(3*REM) @@ -171,16 +171,16 @@ datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) ..() return -datum/reagent/calomel +datum/reagent/goonchem/calomel name = "Calomel" id = "calomel" - description = "Increases all depletion rates by 5. +5 TOX damage while health > 20." + description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/calomel/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - for(var/datum/reagent/R in M.reagents.reagent_list) + for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,5) if(M.health > 20) @@ -196,14 +196,14 @@ datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) result_amount = 2 required_temp = 374 -datum/reagent/potass_iodide +datum/reagent/goonchem/potass_iodide name = "Potassium Iodide" id = "potass_iodide" - description = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn." + description = "Reduces low radiation damage very effectively." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/potass_iodide/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.radiation > 0) if(prob(80)) @@ -220,14 +220,14 @@ datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) required_reagents = list("potassium" = 1, "iodine" = 1) result_amount = 2 -datum/reagent/pen_acid +datum/reagent/goonchem/pen_acid name = "Pentetic Acid" id = "pen_acid" - description = "Reduces 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage" + description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/pen_acid/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.radiation > 0) M.radiation -= 7 @@ -236,7 +236,7 @@ datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(1*REM) if(M.radiation < 0) M.radiation = 0 - for(var/datum/reagent/R in M.reagents.reagent_list) + for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,4) ..() @@ -249,15 +249,15 @@ datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) result_amount = 6 -datum/reagent/sal_acid +datum/reagent/goonchem/sal_acid name = "Salicyclic Acid" id = "sal_acid" - description = "If BRUTE damage is under 50, 50% chance to heal one unit." + description = "If you have less than 50 brute damage, there is a 50% chance to heal one unit. If overdosed it will have a 50% chance to deal 2 brute damage if the patient has less than 50 brute damage already." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 overdose_threshold = 25 -datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/sal_acid/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.getBruteLoss() < 50) if(prob(50)) @@ -265,7 +265,7 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/sal_acid/overdose_process(var/mob/living/M as mob) if(M.getBruteLoss() < 50) if(prob(50)) M.adjustBruteLoss(2*REM) @@ -279,15 +279,15 @@ datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) result_amount = 5 -datum/reagent/salbutamol +datum/reagent/goonchem/salbutamol name = "Salbutamol" id = "salbutamol" - description = "Heals 6 OXY damage, reduces LOSEBREATH by 4." + description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 -datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/salbutamol/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustOxyLoss(-6*REM) if(M.losebreath >= 4) @@ -302,15 +302,15 @@ datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) result_amount = 5 -datum/reagent/perfluorodecalin +datum/reagent/goonchem/perfluorodecalin name = "Perfluorodecalin" id = "perfluorodecalin" - description = "Heals 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN." + description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 -datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) +datum/reagent/goonchem/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) if(!M) M = holder.my_atom M.adjustOxyLoss(-25*REM) M.silent = max(M.silent, 5) @@ -329,17 +329,17 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) required_temp = 370 mix_message = "The mixture rapidly turns into a dense pink liquid." -datum/reagent/ephedrine +datum/reagent/goonchem/ephedrine name = "Ephedrine" id = "ephedrine" - description = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit." + description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.3 overdose_threshold = 45 addiction_threshold = 30 -datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.status_flags |= IGNORESLOWDOWN M.AdjustParalysis(-1) @@ -349,32 +349,32 @@ datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/overdose_process(var/mob/living/M as mob) if(prob(33)) M.adjustToxLoss(1*REM) M.losebreath++ ..() return -datum/reagent/ephedrine/addiction_act_stage1(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/addiction_act_stage1(var/mob/living/M as mob) if(prob(33)) M.adjustToxLoss(2*REM) M.losebreath += 2 ..() return -datum/reagent/ephedrine/addiction_act_stage2(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/addiction_act_stage2(var/mob/living/M as mob) if(prob(33)) M.adjustToxLoss(3*REM) M.losebreath += 3 ..() return -datum/reagent/ephedrine/addiction_act_stage3(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/addiction_act_stage3(var/mob/living/M as mob) if(prob(33)) M.adjustToxLoss(4*REM) M.losebreath += 4 ..() return -datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob) +datum/reagent/goonchem/ephedrine/addiction_act_stage4(var/mob/living/M as mob) if(prob(33)) M.adjustToxLoss(5*REM) M.losebreath += 5 @@ -389,13 +389,13 @@ datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob) result_amount = 4 mix_message = "The solution fizzes and gives off toxic fumes." -datum/reagent/diphenhydramine +datum/reagent/goonchem/diphenhydramine name = "Diphenhydramine" id = "diphenhydramine" - description = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3" + description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/diphenhydramine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.drowsyness += 1 M.jitteriness -= 1 @@ -411,10 +411,10 @@ datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) result_amount = 4 mix_message = "The mixture dries into a pale blue powder." -datum/reagent/morphine +datum/reagent/goonchem/morphine name = "Morphine" id = "morphine" - description = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you." + description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 var/cycle_count = 0 @@ -422,7 +422,7 @@ datum/reagent/morphine addiction_threshold = 25 -datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.status_flags |= IGNORESLOWDOWN if(cycle_count == 36) @@ -431,7 +431,7 @@ datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/morphine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/overdose_process(var/mob/living/M as mob) if(prob(33)) var/obj/item/I = M.get_active_hand() if(I) @@ -441,7 +441,7 @@ datum/reagent/morphine/overdose_process(var/mob/living/M as mob) ..() return -datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/addiction_act_stage1(var/mob/living/M as mob) if(prob(33)) var/obj/item/I = M.get_active_hand() if(I) @@ -450,7 +450,7 @@ datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob) M.Jitter(2) ..() return -datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/addiction_act_stage2(var/mob/living/M as mob) if(prob(33)) var/obj/item/I = M.get_active_hand() if(I) @@ -460,7 +460,7 @@ datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob) M.Jitter(3) ..() return -datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/addiction_act_stage3(var/mob/living/M as mob) if(prob(33)) var/obj/item/I = M.get_active_hand() if(I) @@ -470,7 +470,7 @@ datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob) M.Jitter(4) ..() return -datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob) +datum/reagent/goonchem/morphine/addiction_act_stage4(var/mob/living/M as mob) if(prob(33)) var/obj/item/I = M.get_active_hand() if(I) @@ -481,7 +481,7 @@ datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob) ..() return -datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/oculine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom cycle_amount++ if(M.eye_blind > 0 && cycle_amount > 20) @@ -504,25 +504,25 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) result_amount = 3 mix_message = "The mixture sputters loudly and becomes a pale pink color." -datum/reagent/oculine +datum/reagent/goonchem/oculine name = "Oculine" id = "oculine" - description = "30% chance to remove blindness, 80% chance to slightly reduce eye damage." + description = "Cures blindness and heals eye damage over time." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.4 var/cycle_amount = 0 -datum/reagent/atropine +datum/reagent/goonchem/atropine name = "Atropine" id = "atropine" - description = "1 TOX damage if used over -60 health. Causes dizziness and confusion. If under -25 health, heals 3 BRUTE + 3 BURN. Attempts to cap OXY damage at 65 and LOSEBREATH at 5." + description = "If patients health is below -25 it will heal 3 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 overdose_threshold = 35 -datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/atropine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.health > -60) M.adjustToxLoss(1*REM) @@ -539,7 +539,7 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/atropine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/atropine/overdose_process(var/mob/living/M as mob) if(prob(50)) M.adjustToxLoss(2*REM) M.Dizzy(1) @@ -554,16 +554,16 @@ datum/reagent/atropine/overdose_process(var/mob/living/M as mob) required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) result_amount = 5 -datum/reagent/epinephrine +datum/reagent/goonchem/epinephrine name = "Epinephrine" id = "epinephrine" - description = "Reduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to cap OXY damage at 35 and LOSEBREATH at 10. If health is between -10 to -65, heals 1 TOX, 1 BRUTE, 1 BURN." + description = "mReduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage" reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 overdose_threshold = 30 -datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/epinephrine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.health < -10 && M.health > -65) M.adjustToxLoss(-1*REM) @@ -583,7 +583,7 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/epinephrine/overdose_process(var/mob/living/M as mob) if(prob(33)) M.adjustStaminaLoss(5*REM) M.adjustToxLoss(2*REM) @@ -598,14 +598,14 @@ datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) result_amount = 6 -datum/reagent/strange_reagent +datum/reagent/goonchem/strange_reagent name = "Strange Reagent" id = "strange_reagent" - description = "A miracle medical chem, this little beauty can bring the dead back to life!" + description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) +datum/reagent/goonchem/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) if(M.stat == DEAD) if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) M.visible_message("[M]'s body convulses a bit, and then falls still once more.") @@ -622,7 +622,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, add_logs(M, M, "revived", object="strange reagent") ..() return -datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/strange_reagent/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(rand(1,100))) M.adjustBruteLoss(2*REM) @@ -637,10 +637,10 @@ datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) result_amount = 3 -datum/reagent/life +datum/reagent/goonchem/life name = "Life" id = "life" - description = "" + description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.2 @@ -711,7 +711,7 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac for(var/j = 1, j <= rand(1, 3), j++) step(C, pick(NORTH,SOUTH,EAST,WEST)) -/datum/reagent/mannitol/on_mob_life(mob/living/M as mob) +/datum/reagent/goonchem/mannitol/on_mob_life(mob/living/M as mob) M.adjustBrainLoss(-3) ..() return @@ -724,13 +724,13 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac result_amount = 3 mix_message = "The solution slightly bubbles, becoming thicker." -/datum/reagent/mannitol +/datum/reagent/goonchem/mannitol name = "Mannitol" id = "mannitol" - description = "Heals 3 BRAIN damage." + description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." color = "#C8A5DC" // rgb: 200, 165, 220 -/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) +/datum/reagent/goonchem/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) M.jitteriness = 0 if(istype(M) && M.dna) M.dna.remove_all_mutations() @@ -745,19 +745,19 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac result_amount = 3 -/datum/reagent/mutadone +/datum/reagent/goonchem/mutadone name = "Mutadone" id = "mutadone" - description = "Chance to remove genetic disabilities." + description = "Heals your genetic defects." color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/antihol +datum/reagent/goonchem/antihol name = "Antihol" id = "antihol" - description = "A powerful oxidizer that reacts with ethanol." + description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/antihol/on_mob_life(var/mob/living/M as mob) M.dizziness = 0 M.drowsyness = 0 M.slurring = 0 @@ -780,15 +780,15 @@ datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) result_amount = 3 -/datum/reagent/stimulants +/datum/reagent/goonchem/stimulants name = "Stimulants" id = "stimulants" - description = "Sets all stun-related vars to zero, gets you running really fast. Heals 5 OXY, TOX, BRUTE, and BURN damage if health is below 50. Reduces all stuns." + description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." color = "#C8A5DC" // rgb: 200, 165, 220 metabolization_rate = 0.4 overdose_threshold = 60 -datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/stimulants/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.status_flags |= IGNORESLOWDOWN if(M.health < 50 && M.health > 0) @@ -804,7 +804,7 @@ datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob) M.adjustStaminaLoss(-3*REM) ..() -datum/reagent/stimulants/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/stimulants/overdose_process(var/mob/living/M as mob) if(prob(33)) M.adjustStaminaLoss(5*REM) M.adjustToxLoss(2*REM) @@ -812,13 +812,13 @@ datum/reagent/stimulants/overdose_process(var/mob/living/M as mob) ..() return -datum/reagent/insulin +datum/reagent/goonchem/insulin name = "Insulin" id = "insulin" description = "Increases sugar depletion rates." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/insulin/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/insulin/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.sleeping) M.sleeping-- diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm index 13bb4cabef6..96a98deb55e 100644 --- a/code/modules/reagents/Chemistry-Goon-Other.dm +++ b/code/modules/reagents/Chemistry-Goon-Other.dm @@ -5,74 +5,69 @@ var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") -datum/reagent/oil +datum/reagent/goonchem + three_tick = 1 + +datum/reagent/goonchem/oil name = "Oil" id = "oil" - description = "A slippery solution." + description = "Burns in a small smoky fire, mostly used to get Ash." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/stable_plasma +datum/reagent/goonchem/stable_plasma name = "Stable Plasma" id = "stable_plasma" description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/iodine +datum/reagent/goonchem/iodine name = "Iodine" id = "iodine" description = "A slippery solution." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/fluorine +datum/reagent/goonchem/fluorine name = "Fluorine" id = "fluorine" description = "A slippery solution." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/carpet +datum/reagent/goonchem/carpet name = "Carpet" id = "carpet" description = "A slippery solution." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel)) - var/turf/simulated/floor/F = T - F.visible_message("[T] gets a layer of carpeting applied!") - F.ChangeTurf(/turf/simulated/floor/fancy/carpet) - ..() - return - -datum/reagent/bromine +datum/reagent/goonchem/bromine name = "Bromine" id = "bromine" description = "A slippery solution." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/phenol +datum/reagent/goonchem/phenol name = "Phenol" id = "phenol" - description = "A slippery solution." + description = "Used for certain medical recipes." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/ash +datum/reagent/goonchem/ash name = "Ash" id = "ash" - description = "A burnt solution." + description = "Basic ingredient in a couple of recipes." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/acetone +datum/reagent/goonchem/acetone name = "Acetone" id = "acetone" - description = "A solution." + description = "Common ingredient in other recipes." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 @@ -113,7 +108,7 @@ datum/reagent/acetone result_amount = 1 required_temp = 480 -datum/reagent/colorful_reagent +datum/reagent/goonchem/colorful_reagent name = "Colorful Reagent" id = "colorful_reagent" description = "A solution." @@ -127,30 +122,30 @@ datum/reagent/colorful_reagent required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) result_amount = 5 -datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/colorful_reagent/on_mob_life(var/mob/living/M as mob) if(M && isliving(M)) M.color = pick(random_color_list) ..() return -datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) +datum/reagent/goonchem/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) if(M && isliving(M)) M.color = pick(random_color_list) ..() return -datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume) +datum/reagent/goonchem/colorful_reagent/reaction_obj(var/obj/O, var/volume) if(O) O.color = pick(random_color_list) ..() return -datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume) +datum/reagent/goonchem/colorful_reagent/reaction_turf(var/turf/T, var/volume) if(T) T.color = pick(random_color_list) ..() return -datum/reagent/triple_citrus +datum/reagent/goonchem/triple_citrus name = "Triple Citrus" id = "triple_citrus" description = "A solution." @@ -164,7 +159,7 @@ datum/reagent/triple_citrus required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) result_amount = 5 -datum/reagent/corn_starch +datum/reagent/goonchem/corn_starch name = "Corn Starch" id = "corn_starch" description = "A slippery solution." @@ -179,14 +174,14 @@ datum/reagent/corn_starch result_amount = 5 required_temp = 374 -datum/reagent/corn_syrup +datum/reagent/goonchem/corn_syrup name = "Corn Syrup" id = "corn_syrup" description = "Decays into sugar." reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/corn_syrup/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.reagents.add_reagent("sugar", 3) M.reagents.remove_reagent("corn_syrup", 1) @@ -201,7 +196,7 @@ datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob) result_amount = 3 required_temp = 374 -datum/reagent/corgium +datum/reagent/goonchem/corgium name = "Corgium" id = "corgium" description = "Creates a corgi at the reaction location." @@ -214,7 +209,7 @@ datum/reagent/corgium ..() return -datum/reagent/hair_dye +datum/reagent/goonchem/hair_dye name = "Quantum Hair Dye" id = "hair_dye" description = "A solution." @@ -229,7 +224,7 @@ datum/reagent/hair_dye required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) result_amount = 5 -datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) +datum/reagent/goonchem/hair_dye/reaction_mob(var/mob/living/M, var/volume) if(M && ishuman(M)) var/mob/living/carbon/human/H = M H.hair_color = pick(potential_colors) @@ -238,7 +233,7 @@ datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) ..() return -datum/reagent/barbers_aid +datum/reagent/goonchem/barbers_aid name = "Barber's Aid" id = "barbers_aid" description = "A solution to hair loss across the world." @@ -252,7 +247,7 @@ datum/reagent/barbers_aid required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) result_amount = 5 -datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) +datum/reagent/goonchem/barbers_aid/reaction_mob(var/mob/living/M, var/volume) if(M && ishuman(M)) var/mob/living/carbon/human/H = M var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list) @@ -263,7 +258,7 @@ datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) ..() return -datum/reagent/concentrated_barbers_aid +datum/reagent/goonchem/concentrated_barbers_aid name = "Concentrated Barber's Aid" id = "concentrated_barbers_aid" description = "A concentrated solution to hair loss across the world." @@ -277,7 +272,7 @@ datum/reagent/concentrated_barbers_aid required_reagents = list("barbers_aid" = 1, "mutagen" = 1) result_amount = 2 -datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) +datum/reagent/goonchem/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) if(M && ishuman(M)) var/mob/living/carbon/human/H = M H.hair_style = "Very Long Hair" diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index 2b1f8d10c35..4c23803e8f6 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -4,7 +4,7 @@ #define REM REAGENTS_EFFECT_MULTIPLIER -/datum/reagent/stabilizing_agent +/datum/reagent/goonchem/stabilizing_agent name = "Stabilizing Agent" id = "stabilizing_agent" description = "Keeps unstable chemicals stable. This does not work on everything." @@ -18,7 +18,7 @@ required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) result_amount = 3 -/datum/reagent/clf3 +/datum/reagent/goonchem/clf3 name = "Chlorine Trifluoride" id = "clf3" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." @@ -34,7 +34,7 @@ result_amount = 4 required_temp = 424 -/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/clf3/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjust_fire_stacks(4) M.adjustFireLoss(0.35*M.fire_stacks) @@ -50,7 +50,7 @@ holder.chem_temp = 1000 // hot as shit return -/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) +/datum/reagent/goonchem/clf3/reaction_turf(var/turf/simulated/T, var/volume) if(istype(T, /turf/simulated/floor/plating)) var/turf/simulated/floor/plating/F = T if(prob(1)) @@ -67,14 +67,14 @@ W.ChangeTurf(/turf/simulated/floor) return -/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) +/datum/reagent/goonchem/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if(method == TOUCH && ishuman(M)) M.adjust_fire_stacks(5) M.IgniteMob() new /obj/effect/hotspot(M.loc) return -/datum/reagent/sorium +/datum/reagent/goonchem/sorium name = "Sorium" id = "sorium" description = "Sends everything flying from the detonation point." @@ -106,7 +106,7 @@ var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 1, 5, 6) -/datum/reagent/liquid_dark_matter +/datum/reagent/goonchem/liquid_dark_matter name = "Liquid Dark Matter" id = "liquid_dark_matter" description = "Sucks everything into the detonation point." @@ -152,7 +152,7 @@ for(var/i = 0, i < pull_times, i++) step_towards(X,T) -/datum/reagent/blackpowder +/datum/reagent/goonchem/blackpowder name = "Black Powder" id = "blackpowder" description = "Explodes. Violently." @@ -183,11 +183,10 @@ var/ex_heavy = round(created_volume / 42) var/ex_light = round(created_volume / 21) var/ex_flash = round(created_volume / 8) -<<<<<<< HEAD explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) return -/datum/reagent/flash_powder +/datum/reagent/goonchem/flash_powder name = "Flash Powder" id = "flash_powder" description = "Makes a very bright flash." @@ -239,7 +238,7 @@ C.Stun(5) holder.remove_reagent("flash_powder", created_volume) -/datum/reagent/smoke_powder +/datum/reagent/goonchem/smoke_powder name = "Smoke Powder" id = "smoke_powder" description = "Makes a large cloud of smoke that can carry reagents." @@ -296,7 +295,7 @@ holder.clear_reagents() return -/datum/reagent/sonic_powder +/datum/reagent/goonchem/sonic_powder name = "Sonic Powder" id = "sonic_powder" description = "Makes a deafening noise." @@ -355,7 +354,7 @@ else if(C.ear_damage >= 5) C << "Your ears start to ring!" -/datum/reagent/phlogiston +/datum/reagent/goonchem/phlogiston name = "Phlogiston" id = "phlogiston" description = "+1 BURN, +1 BURNING and sets you alight. Don't be deceived by that meager +1, having phlogiston in the bloodstream can be very dangerous without a fire extinguisher or firebot. Even then, they can't prevent you from spontaneously igniting every cycle." @@ -369,7 +368,7 @@ required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) result_amount = 3 -/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) +/datum/reagent/goonchem/phlogiston/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjust_fire_stacks(1) M.IgniteMob() @@ -377,7 +376,7 @@ ..() return -datum/reagent/cryostylane +datum/reagent/goonchem/cryostylane name = "Cryostylane" id = "cryostylane" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." @@ -395,19 +394,19 @@ datum/reagent/cryostylane return -datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube +datum/reagent/goonchem/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube if(M.reagents.has_reagent("oxygen")) M.reagents.remove_reagent("oxygen", 1) M.bodytemperature -= 30 * TEMPERATURE_DAMAGE_COEFFICIENT ..() return -datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) +datum/reagent/goonchem/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) if(volume >= 5) for(var/mob/living/carbon/slime/M in T) M.adjustToxLoss(rand(15,30)) -datum/reagent/pyrosium +datum/reagent/goonchem/pyrosium name = "Pyrosium" id = "pyrosium" description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." @@ -424,14 +423,14 @@ datum/reagent/pyrosium holder.chem_temp = 20 // also cools the fuck down return -datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/pyrosium/on_mob_life(var/mob/living/M as mob) if(M.reagents.has_reagent("oxygen")) M.reagents.remove_reagent("oxygen", 1) M.bodytemperature += 30 * TEMPERATURE_DAMAGE_COEFFICIENT ..() return -/datum/reagent/argine +/datum/reagent/goonchem/argine name = "Argine" id = "argine" description = "Explodes when lowered to freezing temperatures." diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm index dd3adf14ba4..00f10a987f7 100644 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm @@ -4,22 +4,22 @@ #define REM REAGENTS_EFFECT_MULTIPLIER -datum/reagent/polonium +datum/reagent/goonchem/polonium name = "Polonium" id = "polonium" - description = "+8 RAD." + description = "Cause significant Radiation damage over time." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 -datum/reagent/polonium/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/polonium/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.radiation += 8 ..() return -datum/reagent/histamine +datum/reagent/goonchem/histamine name = "Histamine" id = "histamine" description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." @@ -28,7 +28,7 @@ datum/reagent/histamine metabolization_rate = 0.2 overdose_threshold = 30 -datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/histamine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom switch(pick(1, 2, 3, 4)) if(1) @@ -44,21 +44,21 @@ datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(2*REM) ..() return -datum/reagent/histamine/overdose_process(var/mob/living/M as mob) +datum/reagent/goonchem/histamine/overdose_process(var/mob/living/M as mob) M.adjustOxyLoss(pick(1,3)*REM) M.adjustBruteLoss(pick(1,3)*REM) M.adjustToxLoss(pick(1,3)*REM) ..() return -datum/reagent/formaldehyde +datum/reagent/goonchem/formaldehyde name = "Formaldehyde" id = "formaldehyde" - description = "+1 TOX, 10% chance to decay into 5-15 units of histamine." + description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 -datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/formaldehyde/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(1*REM) if(prob(10)) @@ -75,14 +75,14 @@ datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) result_amount = 3 required_temp = 420 -datum/reagent/venom +datum/reagent/goonchem/venom name = "Venom" id = "venom" - description = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine." + description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.2 -datum/reagent/venom/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/venom/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss((0.1*volume)*REM) M.adjustBruteLoss((0.1*volume)*REM) @@ -92,16 +92,16 @@ datum/reagent/venom/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/neurotoxin2 +datum/reagent/goonchem/neurotoxin2 name = "Neurotoxin" id = "neurotoxin2" - description = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles." + description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 17 elapsed cycles." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 var/cycle_count = 0 metabolization_rate = 1 -datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/neurotoxin2/on_mob_life(var/mob/living/M as mob) cycle_count++ if(M.brainloss + M.toxloss <= 60) M.adjustBrainLoss(1*REM) @@ -119,15 +119,15 @@ datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) result_amount = 1 required_temp = 674 -datum/reagent/cyanide +datum/reagent/goonchem/cyanide name = "Cyanide" id = "cyanide" - description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX." + description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 -datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/cyanide/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(1.5*REM) if(prob(10)) @@ -147,7 +147,7 @@ datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) result_amount = 3 required_temp = 380 -/datum/reagent/questionmark // food poisoning +/datum/reagent/goonchem/questionmark // food poisoning name = "Bad Food" id = "????" description = "????" @@ -155,26 +155,26 @@ datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.2 -datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/questionmark/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(1*REM) ..() return -datum/reagent/itching_powder +datum/reagent/goonchem/itching_powder name = "Itching Powder" id = "itching_powder" - description = "Lots of annoying random effects, chances to do BRUTE damage from scratching. 6% chance to decay into 1-3 units of histamine." + description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.3 -/datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) +/datum/reagent/goonchem/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if(method == TOUCH) M.reagents.add_reagent("itching_powder", volume) return -datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/itching_powder/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(prob(rand(5,50))) M << "You scratch at your head." @@ -206,15 +206,15 @@ datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) result_amount = 4 required_temp = 380 -datum/reagent/initropidril +datum/reagent/goonchem/initropidril name = "Initropidril" id = "initropidril" - description = "Major stamina regeneration buff. 33% chance to hit with 5-25 TOX. 5-10% chances to stun and cause suffocation or immediate heart failure." + description = "Major stamina regeneration buff. 33% chance to hit with a random amount of toxin damage, 5-10% chances to cause stunning, suffocation, or immediate heart failure." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.4 -datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/initropidril/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustStaminaLoss(-5) if(prob(33)) @@ -239,15 +239,15 @@ datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/pancuronium +datum/reagent/goonchem/pancuronium name = "Pancuronium" id = "pancuronium" - description = "10 cycles to paralysis, 7% chance to cause 3-5 LOSEBREATH." + description = "Knocks you out after 10 cycles, 7% chance to cause some oxygen loss." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.2 -datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/pancuronium/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(current_cycle >= 10) M.SetParalysis(3) @@ -256,15 +256,15 @@ datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/sodium_thiopental +datum/reagent/goonchem/sodium_thiopental name = "Sodium Thiopental" id = "sodium_thiopental" - description = "KOs in ten cycles. Major total stamina penalty." + description = "Puts you to sleep after 10 cycles, along with some major stamina loss." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.7 -datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/sodium_thiopental/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(current_cycle >= 10) M.sleeping += 3 @@ -272,10 +272,10 @@ datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/sulfonal +datum/reagent/goonchem/sulfonal name = "Sulfonal" id = "sulfonal" - description = "+1 TOX, KOs in 22 cycles." + description = "Deals some toxin damage, and puts you to sleep after 22 cycles." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 @@ -287,7 +287,7 @@ datum/reagent/sulfonal required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) result_amount = 3 -datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/sulfonal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(current_cycle >= 22) M.sleeping += 3 @@ -295,28 +295,28 @@ datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/amanitin +datum/reagent/goonchem/amanitin name = "Amanitin" id = "amanitin" - description = "On the last cycle that it's in you, it hits you with a stack of TOX damage based on elapsed cycles * rand(2,4). The more you use, the longer it takes before anything happens, but the harder it hits when it does." + description = "On the last cycle that it's in you, it hits you with a stack of toxin damage based on the cycles elapsed. The more you use, the longer it takes before anything happens, but the harder it hits when it does." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 -datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/amanitin/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom ..() return -datum/reagent/amanitin/reagent_deleted(var/mob/living/M as mob) +datum/reagent/goonchem/amanitin/reagent_deleted(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(current_cycle*rand(2,4)) ..() return -datum/reagent/lipolicide +datum/reagent/goonchem/lipolicide name = "Lipolicide" id = "lipolicide" - description = "+1 TOX unless they keep eating food." + description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 @@ -327,7 +327,7 @@ datum/reagent/lipolicide required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) result_amount = 3 -datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/lipolicide/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(!holder.has_reagent("nutriment")) M.adjustToxLoss(1) @@ -338,30 +338,30 @@ datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) ..() return -datum/reagent/coniine +datum/reagent/goonchem/coniine name = "Coniine" id = "coniine" - description = "+2 TOX, +5 LOSEBREATH." + description = "Does moderate toxin damage and oxygen loss." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.05 -datum/reagent/coniine/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/coniine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.losebreath += 5 M.adjustToxLoss(2) ..() return -datum/reagent/curare +datum/reagent/goonchem/curare name = "Curare" id = "curare" - description = "+1 TOX, +1 OXY, paralyzes after 11 cycles." + description = "Does some oxygen and toxin damage, weakens you after 11 cycles.." reagent_state = LIQUID color = "#CF3600" // rgb: 207, 54, 0 metabolization_rate = 0.1 -datum/reagent/curare/on_mob_life(var/mob/living/M as mob) +datum/reagent/goonchem/curare/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(current_cycle >= 11) M.Weaken(3) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 8e81916226d..c01f1223126 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -205,26 +205,43 @@ datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature handle_reactions() - if(last_tick == 3) - last_tick = 1 - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - if(M.reagent_check(R) != 1) - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) - R.overdosed = 1 - M << "You feel like you took too much of [R.name]!" - R.overdose_start(M) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) - var/datum/reagent/new_reagent = new R.type() - addiction_list.Add(new_reagent) - if(R.overdosed) - R.overdose_process(M) - if(is_type_in_list(R,addiction_list)) - for(var/datum/reagent/addicted_reagent in addiction_list) - if(istype(R, addicted_reagent)) - addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. - R.on_mob_life(M) + for(var/reagent in reagent_list) + var/datum/reagent/R = reagent + if(!R.three_tick) + if(M.reagent_check(R) != 1) + if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + M << "You feel like you took too much of [R.name]!" + R.overdose_start(M) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + var/datum/reagent/new_reagent = new R.type() + addiction_list.Add(new_reagent) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + R.on_mob_life(M) + else + if(last_tick == 3) + if(M && R) + if(M.reagent_check(R) != 1) + if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + M << "You feel like you took too much of [R.name]!" + R.overdose_start(M) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + var/datum/reagent/new_reagent = new R.type() + addiction_list.Add(new_reagent) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + R.on_mob_life(M) + if(addiction_tick == 6) addiction_tick = 1 for(var/A in addiction_list) @@ -247,6 +264,8 @@ datum/reagents/proc/metabolize(var/mob/M) if(R.addiction_stage > 40) M << "You feel like you've gotten over your need for [R.name]." addiction_list.Remove(R) + if(last_tick == 3) + last_tick = 1 addiction_tick++ last_tick++ update_total() @@ -383,7 +402,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M) datum/reagents/proc/check_gofast(var/mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("hotline")) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("cocaine")) return 1 else M.status_flags &= ~GOTTAGOFAST diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index ce3ce0a7ad5..7c6edf65ddb 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -30,7 +30,7 @@ datum/reagent var/addiction_threshold = 0 var/addiction_stage = 0 var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. - + var/three_tick = 0 // set to 1 if you want this reagent to process every 3 ticks instead of every tick datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some if(!istype(M, /mob/living)) return 0 From 2cee886f04e577e2b9251da852f0dd130332d79f Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 17:02:38 -0700 Subject: [PATCH 033/312] whoops and shit --- code/datums/diseases/transformation.dm | 2 +- .../gamemodes/changeling/powers/tiny_prick.dm | 3 +- code/modules/food&drinks/food/condiment.dm | 4 +- .../modules/food&drinks/food/snacks_pastry.dm | 2 +- code/modules/food&drinks/food/snacks_soup.dm | 2 +- .../recipes/tablecraft/recipes_pastry.dm | 2 +- code/modules/hydroponics/grown.dm | 7 +- code/modules/hydroponics/seeds.dm | 6 +- code/modules/mob/living/carbon/human/life.dm | 118 ------------------ code/modules/mob/living/carbon/slime/slime.dm | 2 +- code/modules/mob/mob_helpers.dm | 7 -- .../reagents/Chemistry-Goon-Medicine.dm | 7 +- code/modules/reagents/Chemistry-Holder.dm | 2 +- .../Drink-Reagents/Drinks.dm | 4 +- .../Consumable-Reagents/Food-Reagents.dm | 35 +++++- code/modules/reagents/Chemistry-Recipes.dm | 6 +- .../reagents/reagent_containers/bottle.dm | 4 +- code/modules/research/experimentor.dm | 6 +- 18 files changed, 62 insertions(+), 157 deletions(-) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 28dfa579d04..2aaea111eb1 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -178,7 +178,7 @@ /datum/disease/transformation/slime name = "Advanced Mutation Transformation" cure_text = "frost oil" - cures = list("cryostylane") + cures = list("frostoil") cure_chance = 80 agent = "Advanced Mutation Toxin" desc = "This highly concentrated extract converts anything into more of itself." diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm index fa9b0cb240c..2309d3ed850 100644 --- a/code/game/gamemodes/changeling/powers/tiny_prick.dm +++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm @@ -173,7 +173,6 @@ obj/effect/proc_holder/changeling/sting/cryo /obj/effect/proc_holder/changeling/sting/cryo/sting_action(var/mob/user, var/mob/target) add_logs(user, target, "stung", object="cryo sting") if(target.reagents) - target.reagents.add_reagent("cryostylane", 30) - target.reagents.add_reagent("oxygen", 30) + target.reagents.add_reagent("frostoil", 30) feedback_add_details("changeling_powers","CS") return 1 \ No newline at end of file diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm index 63010138089..02419159876 100644 --- a/code/modules/food&drinks/food/condiment.dm +++ b/code/modules/food&drinks/food/condiment.dm @@ -19,7 +19,7 @@ "capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"), "enzyme" = list("enzyme", "universal enzyme bottle", "Used in cooking various dishes"), "soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"), - "cryostylane" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), + "frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("pepermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"), @@ -183,7 +183,7 @@ volume = 10 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(10) - possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "cryostylane" = list("condi_cryostylane", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) + possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!")) var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters. /obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm index d1bac1e49d8..20171e5e471 100644 --- a/code/modules/food&drinks/food/snacks_pastry.dm +++ b/code/modules/food&drinks/food/snacks_pastry.dm @@ -24,7 +24,7 @@ /obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() ..() - extra_reagent = pick("nutriment", "capsaicin", "cryostylane", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") + extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine") reagents.add_reagent("[extra_reagent]", 3) if(prob(30)) icon_state = "donut2" diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food&drinks/food/snacks_soup.dm index f8a18dedd98..742f6f0d9b5 100644 --- a/code/modules/food&drinks/food/snacks_soup.dm +++ b/code/modules/food&drinks/food/snacks_soup.dm @@ -67,7 +67,7 @@ /obj/item/weapon/reagent_containers/food/snacks/soup/mystery/New() ..() - extra_reagent = pick("capsaicin", "cryostylane", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") + extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine") reagents.add_reagent("[extra_reagent]", 5) /obj/item/weapon/reagent_containers/food/snacks/soup/hotchili diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm index 4dd16325583..aba37404d2f 100644 --- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm @@ -6,7 +6,7 @@ /datum/table_recipe/chaosdonut name = "Chaos donut" reqs = list( - /datum/reagent/goonchem/cryostylane = 5, + /datum/reagent/consumable/frostoil = 5, /datum/reagent/consumable/capsaicin = 5, /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1 ) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 0bfa44cc9ea..71154e737c3 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -650,7 +650,7 @@ /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper seed = /obj/item/seeds/icepepperseed - name = "chilly pepper" + name = "ice pepper" desc = "It's a mutant strain of chili" icon_state = "icepepper" filling_color = "#0000CD" @@ -659,14 +659,13 @@ ..() reagents.add_reagent("nutriment", 1 + round((potency / 50), 1)) reagents.add_reagent("vitamin", 1 + round((potency / 50), 1)) - reagents.add_reagent("cryostylane", 3+round(potency / 5, 1)) - reagents.add_reagent("oxygen", 3+round(potency / 5, 1)) + reagents.add_reagent("frostoil", 3+round(potency / 5, 1)) bitesize = 1 + round(reagents.total_volume / 2, 1) /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob, params) . = ..() if (istype(O, /obj/item/device/analyzer/plant_analyzer)) - user << "- cryostylane: [reagents.get_reagent_amount("cryostylane")]%" + user << "- Frost Oil: [reagents.get_reagent_amount("frostoil")]%" /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 219a9fa7b18..8765e6d2c67 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -475,11 +475,11 @@ growthstages = 4 /obj/item/seeds/icepepperseed - name = "pack of chilly pepper seeds" - desc = "These seeds grow into chilly pepper plants." + name = "pack of ice pepper seeds" + desc = "These seeds grow into ice pepper plants." icon_state = "seed-icepepper" species = "chiliice" - plantname = "Chilly Pepper Plants" + plantname = "Ice Pepper Plants" product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper lifespan = 25 endurance = 15 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 0f36d61af57..8738f4da1f0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -286,124 +286,6 @@ return //TODO: DEFERRED -/mob/living/carbon/human/handle_regular_status_updates() - if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP - silent = 0 - else //ALIVE. LIGHTS ARE ON - updatehealth() //TODO - if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain)) - death() - silent = 0 - return 1 - //UNCONSCIOUS. NO-ONE IS HOME - if( (getOxyLoss() > 50) || (config.health_threshold_crit >= health) ) - Paralyse(3) - if(hallucination) - spawn handle_hallucinations() - - if(hallucination<=2) - hallucination = 0 - else - hallucination -= 2 - - else - for(var/atom/a in hallucinations) - qdel(a) - if(paralysis) - AdjustParalysis(-1) - stat = UNCONSCIOUS - else if(sleeping) - handle_dreams() - adjustStaminaLoss(-10) - sleeping = max(sleeping-1, 0) - stat = UNCONSCIOUS - if( prob(10) && health && !hal_crit ) - spawn(0) - emote("snore") - else if (status_flags & FAKEDEATH) - stat = UNCONSCIOUS - //CONSCIOUS - else - stat = CONSCIOUS - - //Eyes - if(disabilities & BLIND || stat) //disabled-blind, doesn't get better on its own - eye_blind = max(eye_blind, 1) - else if(eye_blind) //blindness, heals slowly over time - eye_blind = max(eye_blind-1,0) - else if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster - eye_blurry = max(eye_blurry-3, 0) - else if(eye_blurry) //blurry eyes heal slowly - eye_blurry = max(eye_blurry-1, 0) - - //Ears - if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own - setEarDamage(-1, max(ear_deaf, 1)) - else if (ear_damage < 100) // deafness heals slowly over time, unless ear_damage is over 100 - if(istype(ears, /obj/item/clothing/ears/earmuffs)) // earmuffs rest your ears, healing 3x faster, but keeping you deaf. - setEarDamage(max(ear_damage-0.15, 0), max(ear_deaf - 1, 1)) - else - adjustEarDamage(-0.05, -1) - - //Dizziness - if(dizziness) - var/client/C = client - var/pixel_x_diff = 0 - var/pixel_y_diff = 0 - var/temp - var/saved_dizz = dizziness - dizziness = max(dizziness-1, 0) - if(C) - var/oldsrc = src - var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength - src = null - spawn(0) - if(C) - temp = amplitude * sin(0.008 * saved_dizz * world.time) - pixel_x_diff += temp - C.pixel_x += temp - temp = amplitude * cos(0.008 * saved_dizz * world.time) - pixel_y_diff += temp - C.pixel_y += temp - sleep(3) - if(C) - temp = amplitude * sin(0.008 * saved_dizz * world.time) - pixel_x_diff += temp - C.pixel_x += temp - temp = amplitude * cos(0.008 * saved_dizz * world.time) - pixel_y_diff += temp - C.pixel_y += temp - sleep(3) - if(C) - C.pixel_x -= pixel_x_diff - C.pixel_y -= pixel_y_diff - src = oldsrc - - //Jitteryness - if(jitteriness) - do_jitter_animation(jitteriness) - jitteriness = max(jitteriness-1, 0) - - //Other - if(stunned) - AdjustStunned(-1) - - if(weakened) - weakened = max(weakened-1,0) - - if(stuttering) - stuttering = max(stuttering-1, 0) - - if(slurring) - slurring = max(slurring-1,0) - - if(silent) - silent = max(silent-1, 0) - - if(druggy) - druggy = max(druggy-1, 0) - - CheckStamina() /mob/living/carbon/human/handle_vision() client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) if(machine) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 2bbec31b006..2cce3590566 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -90,7 +90,7 @@ if(reagents.has_reagent("morphine")) // morphine slows slimes down tally *= 2 - if(reagents.has_reagent("cryostylane")) // cryostylane also makes them move VEEERRYYYYY slow + if(reagents.has_reagent("frostoil")) // frostoil also makes them move VEEERRYYYYY slow tally *= 5 if(health <= 0) // if damaged, the slime moves twice as slow diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 026590cdda1..6db29529209 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -136,13 +136,6 @@ proc/isorgan(A) return 1 return 0 -/proc/is_incrit(A) - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = A - if(config.health_threshold_crit >= H.health) - return 1 - return 0 - /proc/check_zone(zone) if(!zone) return "chest" switch(zone) diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 8bb186814e2..88ff74cd6f1 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -17,7 +17,6 @@ datum/reagent/goonchem/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, M.adjustFireLoss(-volume) if(show_message) M << "You feel your burns healing!" - M.emote("scream") if(method == INGEST) M.adjustToxLoss(0.5*volume) if(show_message) @@ -101,7 +100,7 @@ datum/reagent/goonchem/charcoal datum/reagent/goonchem/charcoal/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(-3*REM) - for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) + for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,1) ..() @@ -180,7 +179,7 @@ datum/reagent/goonchem/calomel datum/reagent/goonchem/calomel/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) + for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,5) if(M.health > 20) @@ -236,7 +235,7 @@ datum/reagent/goonchem/pen_acid/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(1*REM) if(M.radiation < 0) M.radiation = 0 - for(var/datum/reagent/goonchem/R in M.reagents.reagent_list) + for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) M.reagents.remove_reagent(R.id,4) ..() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index c01f1223126..2ecbcadda3e 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -402,7 +402,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M) datum/reagents/proc/check_gofast(var/mob/M) if(istype(M, /mob)) - if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("cocaine")) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")) return 1 else M.status_flags &= ~GOTTAGOFAST diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm index e1cc1116565..1afce1eda78 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm @@ -172,8 +172,8 @@ datum/reagent/consumable/coffee/on_mob_life(var/mob/living/M as mob) if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055 M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT)) M.Jitter(5) - if(holder.has_reagent("cryostylane")) - holder.remove_reagent("cryostylane", 5) + if(holder.has_reagent("frostoil")) + holder.remove_reagent("frostoil", 5) ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index 64d09a674ef..af9142cc216 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -110,10 +110,43 @@ datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob) M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT if(istype(M, /mob/living/carbon/slime)) M.bodytemperature += rand(15,20) - current_cycle++ ..() return +datum/reagent/consumable/frostoil + name = "Frost Oil" + id = "frostoil" + description = "A special oil that noticably chills the body. Extraced from Icepeppers." + color = "#B31008" // rgb: 139, 166, 233 + +datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob) + switch(current_cycle) + if(1 to 15) + M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT + if(holder.has_reagent("capsaicin")) + holder.remove_reagent("capsaicin", 5) + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(5,20) + if(15 to 25) + M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(10,20) + if(25 to INFINITY) + M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT + if(prob(1)) + M.emote("shiver") + if(istype(M, /mob/living/carbon/slime)) + M.bodytemperature -= rand(15,20) + ..() + return + +datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume) + if(volume >= 5) + for(var/mob/living/carbon/slime/M in T) + M.adjustToxLoss(rand(15,30)) + //if(istype(T)) + // T.atmos_spawn_air(SPAWN_COLD) + datum/reagent/consumable/condensedcapsaicin name = "Condensed Capsaicin" id = "condensedcapsaicin" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index ae369effd9d..bc28f3954f1 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -238,7 +238,7 @@ silicate name = "Solid Plasma" id = "solidplasma" result = null - required_reagents = list("iron" = 5, "cryostylane" = 5, "plasma" = 20) + required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) result_amount = 1 mob_react = 1 @@ -609,8 +609,8 @@ datum/chemical_reaction/pestkiller //Blue /datum/chemical_reaction/slimefrost name = "Slime Frost Oil" - id = "m_cryostylane" - result = "cryostylane" + id = "m_frostoil" + result = "frostoil" required_reagents = list("plasma" = 1) result_amount = 10 required_container = /obj/item/slime_extract/blue diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index a96d7e942bf..9532a1a95b1 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -99,11 +99,11 @@ icon_state = "bottle3" list_reagents = list("capsaicin" = 30) -/obj/item/weapon/reagent_containers/glass/bottle/cryostylane +/obj/item/weapon/reagent_containers/glass/bottle/frostoil name = "Frost Oil Bottle" desc = "A small bottle. Contains cold sauce." icon_state = "bottle17" - list_reagents = list("cryostylane" = 30) + list_reagents = list("frostoil" = 30) /obj/item/weapon/reagent_containers/glass/bottle/traitor name = "syndicate bottle" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index a313899237a..f61f7a59e99 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -408,7 +408,7 @@ visible_message("[src]'s emergency coolant system gives off a small ding!") var/obj/machinery/vending/coffee/C = new /obj/machinery/vending/coffee(get_turf(pick(oview(1,src)))) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //Ding! Your death coffee is ready! - chosenchem = pick("uranium","cryostylane","ephedrine") + chosenchem = pick("uranium","frostoil","ephedrine") C.reagents.remove_any(25) C.reagents.add_reagent(chosenchem , 50) C.name = "Cup of Suspicious Liquid" @@ -418,8 +418,8 @@ visible_message("[src] malfunctions, shattering [exp_on] and releasing a dangerous cloud of coolant!") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = src - R.add_reagent("cryostylane" , 50) - investigate_log("Experimentor has released cryostylane gas.", "experimentor") + R.add_reagent("frostoil" , 50) + investigate_log("Experimentor has released frostoil gas.", "experimentor") var/datum/effect/effect/system/chem_smoke_spread/smoke = new smoke.set_up(R, 1, 0, src, 0, silent = 1) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) From 8dfcbd8b24d98fb184b6877fc05eb7270905c7f1 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 17:04:45 -0700 Subject: [PATCH 034/312] Changes smoke back to TOUCH reaction. --- code/game/objects/effects/effect_system/effects_smoke.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 4fc5cf2dee1..83463f44a6e 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -209,7 +209,7 @@ ..() for(var/mob/living/carbon/human/A in view(1, src)) if(reagents.total_volume >= 1) - reagents.reaction(A, INGEST) + reagents.reaction(A, TOUCH) reagents.trans_to(A.reagents, 10) return @@ -217,7 +217,7 @@ /obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob ) ..() if(reagents.total_volume >= 1) - reagents.reaction(M, INGEST) + reagents.reaction(M, TOUCH) reagents.trans_to(M.reagents, 10) /datum/effect/effect/system/chem_smoke_spread From 4338a3f4ca4e4e074147ca56fbb13a8ac4d58651 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 17:15:06 -0700 Subject: [PATCH 035/312] forgot to make krok work right --- code/modules/reagents/Chemistry-Goon-420BlazeIt.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm index aea166a66c0..5ec8f8a75de 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm @@ -126,12 +126,16 @@ datum/reagent/goonchem/crank/addiction_act_stage4(var/mob/living/M as mob) M.adjustBruteLoss(3*REM) ..() return -/datum/reagent/goonchem/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) - M << "Your skin sloughs off!" - M.adjustBruteLoss(rand(50,80)*REM) + +/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) + M << "Your skin falls off easily!" + M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF + hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) + else + M.adjustBruteLoss(5*REM) ..() return - /datum/chemical_reaction/krokodil name = "Krokodil" id = "krokodil" From c9cc003c650248d6f44ebde37f1ba23eac4197c0 Mon Sep 17 00:00:00 2001 From: Incoming Date: Sun, 8 Mar 2015 20:55:36 -0400 Subject: [PATCH 036/312] Explicitly passes a mobs mutant_color in blood samples --- code/modules/hydroponics/hydroponics.dm | 4 +++- code/modules/hydroponics/seeds.dm | 2 ++ code/modules/mob/living/carbon/human/blood.dm | 3 ++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index dc57adaae27..0192476e487 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -842,7 +842,9 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob, p podman.ckey = ckey_holder podman.gender = blood_gender podman.faction |= factions - hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman + if(!mutant_color) + mutant_color = "#59CE00" + hardset_dna(podman,null,null,podman.real_name,blood_type,/datum/species/plant/pod,mutant_color)//Discard SE's and UI's, podman cloning is inaccurate, and always make them a podman podman.set_cloned_appearance() else //else, one packet of seeds. maybe two diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 287a8e398e2..1258ec006ae 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -90,6 +90,7 @@ var/datum/mind/mind = null var/blood_gender = null var/blood_type = null + var/mutant_color = null var/factions = null var/contains_sample = 0 @@ -103,6 +104,7 @@ realName = bloodSample.data["real_name"] blood_gender = bloodSample.data["gender"] blood_type = bloodSample.data["blood_type"] + mutant_color = bloodSample.data["mutant_color"] factions = bloodSample.data["factions"] W.reagents.clear_reagents() user << "You inject the contents of the syringe into the seeds." diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm index e8c04f0444b..48da639f97e 100644 --- a/code/modules/mob/living/carbon/human/blood.dm +++ b/code/modules/mob/living/carbon/human/blood.dm @@ -30,7 +30,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 /mob/living/carbon/human/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) if(B.id == "blood") - B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) + B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.blood_type,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"mutant_color"=null, "factions"=null) /mob/living/carbon/human/proc/suppress_bloodloss(var/amount) if(bleedsuppress) @@ -171,6 +171,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 B.data["blood_type"] = copytext(src.dna.blood_type,1,0) B.data["gender"] = src.gender B.data["real_name"] = src.real_name + B.data["mutant_color"] = src.dna.mutant_color B.data["factions"] = src.faction return B From e5a3694c0f990fbedf8f5e17dcb642e62ecd5fac Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 19:43:17 -0700 Subject: [PATCH 037/312] Adds Napalm as a reagent and merges old napalm into Phlog. Fixes some foam stuff. --- .../effects/effect_system/effects_foam.dm | 5 ++- .../reagents/Chemistry-Goon-Pyrotechnics.dm | 33 +++++++++++++++++++ .../Chemistry-Reagents/Chemistry-Reagents.dm | 6 ++-- code/modules/reagents/Chemistry-Recipes.dm | 13 -------- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index a4a5dcad577..dd4270ece3f 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -106,7 +106,6 @@ var/obj/chemholder var/obj/effect/effect/foam/foamtype = /obj/effect/effect/foam var/metal = 0 - var/foam_color /datum/effect/effect/system/foam_spread/metal @@ -129,7 +128,6 @@ amount = round(sqrt(amt / 2), 1) carry.copy_to(chemholder, carry.total_volume) - foam_color = mix_color_from_reagents(carry.reagent_list) /datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype) @@ -142,8 +140,9 @@ foundfoam.amount += amount else var/obj/effect/effect/foam/F = new foamtype(src.location) + var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list) chemholder.reagents.copy_to(F, chemholder.reagents.total_volume) - F.color = foam_color + F.color = foamcolor F.amount = amount F.metal = metal diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm index 4c23803e8f6..d80b815c51f 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm @@ -368,6 +368,14 @@ required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1) result_amount = 3 +/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) + return + /datum/reagent/goonchem/phlogiston/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjust_fire_stacks(1) @@ -376,6 +384,31 @@ ..() return +/datum/reagent/goonchem/napalm + name = "Napalm" + id = "napalm" + description = "Very flammable." + reagent_state = LIQUID + color = "#FF9999" // rgb: 96, 165, 132 + +/datum/reagent/goonchem/napalm/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjust_fire_stacks(1) + ..() + return + +/datum/reagent/goonchem/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && ishuman(M)) + M.adjust_fire_stacks(7) + return + +/datum/chemical_reaction/napalm + name = "Napalm" + id = "napalm" + result = null + required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) + result_amount = 1 + datum/reagent/goonchem/cryostylane name = "Cryostylane" id = "cryostylane" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm index 7c6edf65ddb..9c58cc50270 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm @@ -271,7 +271,8 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume) datum/reagent/water/reaction_obj(var/obj/O, var/volume) src = null - O.color = initial(O.color) + if(!istype(O, /obj/effect)) + O.color = initial(O.color) if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O if(!cube.wrapped) @@ -681,7 +682,8 @@ datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume) else if(O) O.clean_blood() - O.color = initial(O.color) + if(!istype(O, /obj/effect)) + O.color = initial(O.color) datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume) if(volume >= 1) diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index bc28f3954f1..1ee9283e34b 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -186,19 +186,6 @@ silicate required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) result_amount = 3 -/datum/chemical_reaction/napalm - name = "Napalm" - id = "napalm" - result = null - required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) - result_amount = 1 -/datum/chemical_reaction/napalm/on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) - holder.del_reagent(id) - return - /datum/chemical_reaction/chloralhydrate name = "Chloral Hydrate" id = "chloralhydrate" From 855cf7c6b5c00888a9d458e4df2ba4f03fffa726 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sun, 8 Mar 2015 20:50:09 -0700 Subject: [PATCH 038/312] Fixes morphine to actually knock you out. --- code/modules/reagents/Chemistry-Goon-Medicine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm index 88ff74cd6f1..347451b4972 100644 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm @@ -424,8 +424,8 @@ datum/reagent/goonchem/morphine datum/reagent/goonchem/morphine/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.status_flags |= IGNORESLOWDOWN - if(cycle_count == 36) - M.drowsyness += 1 + if(cycle_count >= 36) + M.sleeping += 3 cycle_count++ ..() return From 6f318417fec866a3c1bd997c174f5b1c60a2d65f Mon Sep 17 00:00:00 2001 From: Jordie0608 Date: Mon, 9 Mar 2015 19:28:22 +1100 Subject: [PATCH 039/312] unhardcodes brig timers --- .../MetaStation/MetaStation.v40D.dmm | 8 ++-- _maps/map_files/MiniStation/MiniStation.dmm | 16 +++---- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 10 ++--- code/game/machinery/doors/brigdoors.dm | 42 ------------------- 4 files changed, 17 insertions(+), 59 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.v40D.dmm b/_maps/map_files/MetaStation/MetaStation.v40D.dmm index 4a87c6eefcd..16cb900b63b 100644 --- a/_maps/map_files/MetaStation/MetaStation.v40D.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v40D.dmm @@ -1230,12 +1230,12 @@ "axH" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig) "axI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig) "axJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/brig) -"axK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light,/obj/machinery/door_timer/cell_1,/obj/machinery/camera{c_tag = "Brig - Hallway - Port"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"axK" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light,/obj/machinery/camera{c_tag = "Brig - Hallway - Port"; dir = 1; network = list("SS13")},/obj/machinery/door_timer{id = "Cell 1"; name = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "axL" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig) "axM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/security/brig) -"axN" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door_timer/cell_2,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"axN" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/obj/machinery/door_timer{id = "Cell 3"; name = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/brig) "axO" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) -"axP" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 2; initialize_directions = 11},/obj/machinery/door_timer/cell_3,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/brig) +"axP" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door_timer{id = "Cell 2"; name = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "axQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/brig) "axR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig) "axS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 1; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig) @@ -7953,7 +7953,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJaahatJatJaahcrMatJatJaahaahaahaahalWalWatKalWalWatLatMatMatMatMatMatNalWalWalWalWatOavbatPatPatPatPatQatRaheatSavcatUatVatWatXatYatZauaaubaucaudaheangaavaavaavanmahAaukaulansaumavdavgajSauoadRadRanBanyanoakjadRautanBahJahJajQanCauwauxanCajQaodanZajQaoiaqtaqtauBauBauBajQajQauCaheaiYauDauEarWauFauGauHauIauJauKauLauMauNauOauParWauQaocaxqauSauTauUaocauVaocaocaocauWaocaocauXauYauZajoajoajoajoauVapwapxavaazvatHaBwaBjaveatHaobatHaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahatJatJatJatJatJatJatJatJatJatJatJavfatJaahcrMalWalWalWaBFavhalWaahaahaahaahaahaahaahaahaahaahaahalWankaviaotalOavjalOavkavlavmavnavoavpaheaheaheaokaojaojaojaolaheaheaoAaoOaoMaoPaoAahAahAagKavzavAameavBavBavCavDavBavEavBavDavBavFavBavEavGavHavIavDavJavKavBavBavBavDavBavLahCavMavNavNavNavNagKaquaheauEaiYaiYarWarWarWarWarWavOavPavQavRavSarWarWarWavTaocapwavUatyapxaocapxaocavVaocavWavXavYavZawaawbawcawdaweawfawgawhaweawiapxapxavUapxawjatIawkatIabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaahatJaraatJatJatJatJawlaahatJatJatJatJatJatJawmawnawmawoawpalWalWaahaaaaaaaaaaaaaaaaaaaaaaaaaahalWalWalWapRalOawqalOawrawsawtawuawvawwaheaaaaahaaaaaaaaaaaaaaaaahaaaaoUapyapvapCapzawCavNapDawEawFawGawHawHawIawGawHawJawKawGawLawMawHawNawOawPawHawQawRawSawTawTawUawVawWawXawYawZaxaaxbaxcaxdagKaquaheaxeahfaxfarWaxgaxhaxiatratsattaxjarWaxkatpaxlarWaxmaocaocaocauWaocaocapxaocaqKaocaxnatHatHatAaxoajoatHatHatHatHatHatHatHatHatHaoaatHatHatHatHatHaxpatHaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJatJatJatJatJatJatJaahatJatJatJaahalWalWalWaBHawwaotalWaaaangadoaavadoanmaahaahaahaahalWapFalWaxwasvasvasvaxxaxyalWaxzaxAaxBaheaaaaxCaxCaxCaxCaxCaxCaxCaaaaoAapLapGaqbaoAahAahAagKaxHaxIaxJaxKaxLaxMaxJaxNaxLaxIaxOaxPaxQaxRaxSaxTaxUaxVaxWaxXaxYaxZayaaxYaybaycaydayeayfaygayhayiayjagKaquaykaykaykaykaykauPaylaymaynayoaypauLayqayraysauFarWaqhaytayuayvaywayvayxayvayyayvayvayzayAayBayCayDayEayFayGayFayHayIayJayIayKatHatHatHayHayIayKayLayLayFaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatJatJatJatJatJatJatJatJatJatJatJaahatJatJatJaahalWalWalWaBHawwaotalWaaaangadoaavadoanmaahaahaahaahalWapFalWaxwasvasvasvaxxaxyalWaxzaxAaxBaheaaaaxCaxCaxCaxCaxCaxCaxCaaaaoAapLapGaqbaoAahAahAagKaxHaxIaxJaxKaxLaxMaxJaxPaxLaxIaxOaxNaxQaxRaxSaxTaxUaxVaxWaxXaxYaxZayaaxYaybaycaydayeayfaygayhayiayjagKaquaykaykaykaykaykauPaylaymaynayoaypauLayqayraysauFarWaqhaytayuayvaywayvayxayvayyayvayvayzayAayBayCayDayEayFayGayFayHayIayJayIayKatHatHatHayHayIayKayLayLayFaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahatJatJatJatJatJatJatJayMatJaahaahaahaahalWalOawwaouagAaaaaoAarlaqQarlaoAarCarCarCayUayUayUayUaxFayUayUayWayWayWayWayTayWayYaheaahaxCayXayVazaayZazbaxCaaaaoAasJasJaueaoAaaaaaaazgaufaziaugagKaufazlaugagKaufazoaugagKavyahAawxagKahAauhazuahAahAazxazxauiazzaujazxazxazBagKagKagKagKagKaquaykazCazDazEaykarWarWarWarWazFazGazHavRavSarWarWarWaocazIapwaoaapxapwazJapxatHatHatHatHatHazKazLazMazNazOazPazOazQazRazSazRazTayIazUayIazVazRazSazRayLazWazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahaahaahatJatJatJatJaraatJatJatJazYatJatJatJatJaahaaaaahagAaviawwanfalWaaaaavasJaupasJaavarCaAcaAdayUaAeaAfaAgaAhaAiayUaAjaAkaAlaAmaAnayWayYaheaaaaxCazdazcaAoazeaApaxCaaaaoUauqasJauraoAausausaboaAxaAyaAzagKaAAaAyaAzagKaABaAyaAzagKaACaADaAEagKaAFaAGaAHaAIawyazxaAKaALaAMaANaAOaAPazBaAQaARaARaASaARaATaykaAUaAVaAWaykaAXaAYaAXarWaAZaBaaBbaBcaBdaBeaBfaBgayvaBhatHatHatHatHatHatHatHaBiaBIauuaBkaBlaBmaBnaBoayFayFayFaahaahaJzaBqazRazRazRazRazRaBraJzazRaBsayFayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahatJatJatJatJatJatJatJaahatJaahaahatJatJaahaahalWalWardawwalWalWaaaaoAasJasJasJaBLaBuaBvaBvaCTaBxaByaBzaBAaBBaBCaBDaBEaCVaBGaDHayWayYaheaaaaxCaAraAqaBJaAsaBKaxCaaaaoAauyasJasJauzaBOauAaboaBQaAyaBRagKaBQaAyaBSagKaBQaAyaBTagKaBUaBVaBWagKaBXaBYaBZaCaaCbazxaCcaCdaCeaCfaCgaChazBaCiapjapjapjaCjaCkaykaClaCmaCnaykaCoaCpaCpaCqaCraCsaCtarWarWarWarWarWaocaCuatHavqaCwaCxaCyavraCAaCBaCCaCCaCCaCCaCDaCEaCFavsaCHayFaCIaahaahaaaaaaaaaaahaahaaaaaaaahaaaatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm index d63590ecb3c..ba976b45402 100644 --- a/_maps/map_files/MiniStation/MiniStation.dmm +++ b/_maps/map_files/MiniStation/MiniStation.dmm @@ -252,7 +252,7 @@ "eR" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/security/brig) "eS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig) "eT" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/brig) -"eU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_timer/cell_2{dir = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) +"eU" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door_timer{id = "Cell 2"; name = "Cell 2"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) "eV" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/medical/research{name = "Research Division"}) "eW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"}) "eX" = (/turf/simulated/wall,/area/space) @@ -345,7 +345,7 @@ "gG" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig) "gH" = (/obj/structure/table,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/turf/simulated/floor/plasteel,/area/security/brig) "gI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/security/brig) -"gJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door_timer/cell_3{dir = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) +"gJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/door_timer{id = "Cell 1"; name = "Cell 1"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) "gK" = (/obj/machinery/computer/security/wooden_tv,/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig) "gL" = (/obj/item/weapon/storage/secure/safe{pixel_x = 4; pixel_y = 26},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/fancy/carpet,/area/security/brig) "gM" = (/obj/structure/table/wood,/obj/item/device/camera{desc = "A one use - polaroid camera. 30 photos left."; name = "detectives camera"; pictures_left = 30},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/camera/autoname,/obj/item/weapon/folder/yellow,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/fancy/carpet,/area/security/brig) @@ -396,7 +396,7 @@ "hF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/brig) "hG" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/security/brig) "hH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/brig) -"hI" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 3"; name = "Cell 3"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) +"hI" = (/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/machinery/door/firedoor/border_only{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) "hJ" = (/obj/machinery/flasher{id = "Cell 3"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/brig) "hK" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/brig) "hL" = (/turf/simulated/floor/fancy/carpet,/area/security/brig) @@ -1703,7 +1703,7 @@ "GM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/computer) "GN" = (/obj/structure/closet/radiation,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/tcommsat/computer) "GO" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 12; id = "ferry_home"; name = "station"; turf_type = /turf/space; width = 5},/turf/simulated/floor/plating,/area/space) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1825,13 +1825,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambqcMcNcOcOcPcOcQcRcSbqbNbNbNcTcUcVcUcWcXcYcZcWdadbcUdccjdddedfdgdhdidjckamamamamamambUcscscsdkdlcpcpdmdncmcmdobUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamambqdpcScScScScSdqcSdrdsbNdtdudvdwdxdydwdzdAdBdCdDdEcjcjcjdFdedGdHdedIdJckaaaaaaaaaaambUbUbUbUdKbUdLdMbUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamamamamamambqdNcSdOcScSdPcSdOdQbqbqbqdRdSdTdUdVdWdXdYdZeaebecedeeefdeegeheiejekelckaaaaaaaaaaaabUclcmcmemencpcpeoepeqeresetaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeSeSeTeUckckckckckaaaaaaaaaaambUcFcGcseVcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeuamamamamamamambqevewexeyezezezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQeReSeSeSeTgJckckckckckaaaaaaaaaaambUcFcGcseVcIcpcpcpcpcpcpcpeWamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXamaaaaaaaaaaambJeZfafbfccScScSfdfebqffcSfbfgfheIfieKeLfjfkflebfmedfndedefofpfqfrfsckamamamamamamambUcscscsftfucpcpcpcpfvcpcpfwamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfKfLcjfMfNckdededefofOfPdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfRfSfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqfxcSfyfzfAfAfAfAfBfCfDfAfEfFfGfHfIfJeLfKfLcjfMfNckdededefofOhIdefQckamaaaaaaaaaaambUbUbUbUbUbUcpcpfRfSfTfUbUbUbUbUbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaabqcScSfbfccScScScSdrfVcScSfafWbIfXfXfXfYfZgacjgbgcgdgegfggghgigjgegkcjckckckckglgmgngogpgqgrgsbUgtgugvbUbUgwbUgxgygzbUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcSdrfVcScScSdrgDfXfXfXeLfjgacjgEgFgFgGgHgIdegJckckckcjgKgLgMckgNgOgPgogQcpcpcpcpcpgRgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagAgBcSfbfccScSgCcSdrfVcScScSdrgDfXfXfXeLfjgacjgEgFgFgGgHgIdeeUckckckcjgKgLgMckgNgOgPgogQcpcpcpcpcpgRgSgTgUgVbUgWgXgYbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaagZhacShbhchdbqbqbqbqbqbqbqbqbqbqbxbxbxeLfjhecjcjhfdehghhhigFhjfqfrhkcjhlhmhnckhofXhphqhrcpcpcphshthuhvhththwbUhxhyhxbUbUamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaaeHhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHhIdehJcjhKhLhMckhNfXhOgohPhQhRhShThUhVhWcpcphXbUgRhYhZiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaaeHhAcSfbfccSbqbNbNbNbNbNbNbNbNbNbNbxhBeLfjgahCcjhDhEhFdehGgehHfPdehJcjhKhLhMckhNfXhOgohPhQhRhShThUhVhWcpcphXbUgRhYhZiabUamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaaibcScShbhcicbqbNbxbxbxbxbxbxbxbxidbxieeLfjgaifcjigihiiijikilimgjgegkcjinioipckiqfXfXgoirhQisitiuiviwixiyiziAbUcpiBiCbUbUbUbUbUamamamamamamamamamamamamamamamamamiDiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaaafhgBcSfbfccSbqiEdwiFiGbxiHiIiJiKiLbxbxiMiNiOiPcjcjcjcjcjcjcjcjcjcjcjcjiQiRiSckiTfXiUgobUbUbUbUbUgviVbUbUbUbUbUcpiWcpiXbUiYiZjabLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajbjcjdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeXaaaaaaaaaaaaxJgZhaewjehcjfbqbOjgjhjijjjkjljljljmjnjofYdAjpjpjqjqjqjqjqjqjqjqjrjqjqjqjsjtjujqdzjqjvjwjxjyjzjAjBjCjDjEjFjEjGjHcpjIjJjKjLjMjLbUamamamamamamamamamamamamamamamamamiDiDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index d54c10c66f8..be76146f855 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -502,13 +502,13 @@ "ajH" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig) "ajI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig) "ajJ" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/brig) -"ajK" = (/obj/machinery/door_timer/cell_1,/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"ajK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door_timer{id = "Cell 2"; name = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "ajL" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig) -"ajM" = (/obj/machinery/door_timer/cell_2,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) -"ajN" = (/obj/machinery/door_timer/cell_3,/obj/machinery/camera{c_tag = "Brig Central"; dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"ajM" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/obj/machinery/door_timer{id = "Cell 1"; name = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"ajN" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door_timer{id = "Cell 4"; name = "Cell 4"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "ajO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "ajP" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/brig) -"ajQ" = (/obj/machinery/door_timer/cell_4,/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) +"ajQ" = (/obj/machinery/camera{c_tag = "Brig Central"; dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door_timer{id = "Cell 3"; name = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig) "ajR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/brig) "ajS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/security/brig) "ajT" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/brig) @@ -6556,7 +6556,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfacfafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaiaieagWaigafRaihaiiaiiaijahcafRaikailafUaimainaioaipaipaiqairafUafUaisaitaduaduaduabmabmabmabmabmabmabmabmaiuaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadwadxadxadxadxadyadzadAadBadBadBadBadCaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaaaaafaaaaaaaaaafdaaaaaaaaaaafaaaaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaixaiyaixaizaiAafRafRafRafRafRafRaiBaiCafRaiDaiEaiFaiFaiFaiFaiFaiFaiFaiFaiGaiHaiIaiJaiFailaiAaiKaiLaiMaiNaiOaiPaiQaiRaiuaivaiwaidaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaemaemaemaemaemaaaadzaaaaemaemaemaemaemaiSabqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafaenaenaenaenaenaaaafdaaaaenaenaenaenaenaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaixaiTaiUaiVaiWaiXaiYaiZajaajbajcajdajeajfajgajhajiajjajkajjajjajjajjajjajjajlajjajiajmajkajnajoajpajqajrajsajtajuajvajwaiuaivaiwacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaadzaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaeZaeZaeZaelaaaaafaizajyajzajAajBajCajDajEajFajGajHajIajJajKajLajIajJajMajLajIajJajNajOajOajOajPahCajQajRajSajTajUajVajWajVajVajVajXajYaiPaiuaivaiwaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafaafadzaafaafaafaafaafabfabfabfaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaafaafbafbafbafbafcafdafeaffaffaffaffafgaaaabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajxaeZaeZaeZaelaaaaafaizajyajzajAajBajCajDajEajFajGajHajIajJajMajLajIajJajKajLajIajJajQajOajOajOajPahCajNajRajSajTajUajVajWajVajVajVajXajYaiPaiuaivaiwaidaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafaafadzaafaafaafaafaafabfabfabfaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaiSafPafPafPafPafPaaaafdaaaafPafPafPafPafPaafabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZakaakbakcajZaiyaiyakdakeakfakgakhaiAafRakiafRafRakjakkaklakmaknakoaklakmaknakpakqakmakraksakmaktakuakmakvakwakxaiAakyakzaiPakAaiPakBakCaiPaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaafaaaaaaakDaaaaaaaafaaaaaaaafaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaaaaafaaaaafaaaaaaakEaaaaaaaafaaaaafaaaaaaabfaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaakFakGakHakIakJakKakLakKakeakMakNakOaiAakPakQakPafRakRakSakTafRakUakSakTafRakUakSakTafRakVakWakXakYailafRakZalaalbaiAalcaldalealfalealgalhaliaiuaivaiwaidaafaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaafaaaaaaaljaaaaaaaafaaaaaaaafaaaaaaaaaaafaafaaaaaaaaaaaaaaaallalmallaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfaafaafaafaafalnaloalnaafaafaafaafabfabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajZalpalqalrajZaiyaiyaiyalsaltalualvaiAakPakQakPafRalwakSalxafRalyakSalzafRalAakSalBafRalCalDalEakYalFafRalGakSalHaiAalIalJalIalKalIalIalLalIaiuaivaiwacAacAaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaaaalMalNalMaaaaafaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaallalOallaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index f3bee16d85f..f91fb5a6ddf 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -251,48 +251,6 @@ if(maptext != new_text) maptext = new_text - -/obj/machinery/door_timer/cell_1 - name = "Cell 1" - id = "Cell 1" - dir = 2 - pixel_y = -32 - - -/obj/machinery/door_timer/cell_2 - name = "Cell 2" - id = "Cell 2" - dir = 2 - pixel_y = -32 - - -/obj/machinery/door_timer/cell_3 - name = "Cell 3" - id = "Cell 3" - dir = 2 - pixel_y = -32 - - -/obj/machinery/door_timer/cell_4 - name = "Cell 4" - id = "Cell 4" - dir = 2 - pixel_y = -32 - - -/obj/machinery/door_timer/cell_5 - name = "Cell 5" - id = "Cell 5" - dir = 2 - pixel_y = -32 - - -/obj/machinery/door_timer/cell_6 - name = "Cell 6" - id = "Cell 6" - dir = 4 - pixel_x = 32 - #undef FONT_SIZE #undef FONT_COLOR #undef FONT_STYLE From 4071f25270cb817cbb72af322e94ad833f1f5bf6 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 12:28:35 +0100 Subject: [PATCH 040/312] Simplifies laser reflection code, no more reflect_chance var at the obj/item level. --- code/game/gamemodes/changeling/powers/mutations.dm | 3 --- code/game/objects/items.dm | 4 +--- code/game/objects/items/weapons/shields.dm | 2 -- code/game/objects/items/weapons/twohanded.dm | 3 +-- code/modules/clothing/suits/armor.dm | 3 +-- code/modules/mob/living/carbon/human/human_defense.dm | 2 +- 6 files changed, 4 insertions(+), 13 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 98d0a0f18c6..eb77d14ef3d 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -224,9 +224,6 @@ remaining_uses-- return 1 -/obj/item/weapon/shield/changeling/IsReflect() - return 0 - /***************************************\ |*********SPACE SUIT + HELMET***********| diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 876faef69b0..33928ac82a2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -33,7 +33,6 @@ var/list/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) var/list/allowed = null //suit storage stuff. var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. - var/reflect_chance = 0 //This var dictates what % of a time an object will reflect an energy based weapon's shot var/strip_delay = 40 var/put_on_delay = 20 var/m_amt = 0 // metal @@ -311,8 +310,7 @@ return 0 /obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit - if(prob(reflect_chance)) - return 1 + return 0 /obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index 2a9a15c156c..a8875117ade 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -70,7 +70,6 @@ w_class = 4 playsound(user, 'sound/weapons/saberon.ogg', 35, 1) user << "[src] is now active." - reflect_chance = 40 else force = 3 throwforce = 3 @@ -78,7 +77,6 @@ w_class = 1 playsound(user, 'sound/weapons/saberoff.ogg', 35, 1) user << "[src] can now be concealed." - reflect_chance = 0 add_fingerprint(user) /obj/item/weapon/shield/riot/tele diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index e72ac3aa40a..32349ddb581 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -192,7 +192,6 @@ obj/item/weapon/twohanded/ item_color = "green" attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/hacked = 0 - reflect_chance = 0 /obj/item/weapon/twohanded/dualsaber/New() item_color = pick("red", "blue", "green", "purple") @@ -234,7 +233,7 @@ obj/item/weapon/twohanded/ user << "You cant pick up such dangerous item with your meaty hands without losing fingers, better not to." return 1 -/obj/item/weapon/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflect_chance var for balance issues and switches hitsounds. +/obj/item/weapon/twohanded/dualsaber/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds. if(istype(M)) if(M.dna.check_mutation(HULK)) M << "You lack the grace to wield this." diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ff4daf648d0..d5ee7e59bcc 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -91,10 +91,9 @@ item_state = "armor_reflec" blood_overlay_type = "armor" armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0) - reflect_chance = 40 + var/hit_reflect_chance = 40 /obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone) - var/hit_reflect_chance = reflect_chance if(!(def_zone in list("chest", "groin"))) //If not shot where ablative is covering you, you don't get the reflection bonus! hit_reflect_chance = 0 if (prob(hit_reflect_chance)) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0748e9d3747..108d680a734 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -67,7 +67,7 @@ emp_act return 2 return (..(P , def_zone)) -/mob/living/carbon/human/proc/check_reflect(var/def_zone) //Reflection checks for anything in your l_hand, r_hand, or wear_suit based on reflect_chance var of the object +/mob/living/carbon/human/proc/check_reflect(var/def_zone) //Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object if(wear_suit && istype(wear_suit, /obj/item/)) var/obj/item/I = wear_suit if(I.IsReflect(def_zone) == 1) From 97962ba59b8c5724d8e68d4b6037f5779965557d Mon Sep 17 00:00:00 2001 From: GunHog Date: Mon, 9 Mar 2015 08:47:38 -0500 Subject: [PATCH 041/312] Fixes "Sensor Augmentation" showing in silicon verbs - Fixes #8167 --- code/modules/mob/living/silicon/silicon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 461456ff887..68eeaf670d7 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -338,7 +338,7 @@ var/datum/atom_hud/medsensor = huds[med_hud] medsensor.add_hud_to(src) -/mob/living/silicon/verb/sensor_mode() +/mob/living/silicon/proc/sensor_mode() set name = "Set Sensor Augmentation" var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Disable") remove_med_sec_hud() From 8a1a5ff832c72d97e5b5f5a9deb20693f41c0ae8 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 16:49:31 +0100 Subject: [PATCH 042/312] Fixes Strangeness mutation gain text not appearing. --- code/datums/mutations.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 566adcedc03..8e3b2a80fe6 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -215,6 +215,7 @@ text_gain_indication = "You feel strange." /datum/mutation/human/bad_dna/on_acquiring(var/mob/living/carbon/human/owner) + owner << text_gain_indication var/mob/new_mob if(prob(95)) if(prob(50)) From 1cb7674ebd4121392e2fee309ababe239a426ddb Mon Sep 17 00:00:00 2001 From: Incoming Date: Mon, 9 Mar 2015 12:42:41 -0400 Subject: [PATCH 043/312] Adds a cheap looking pulse animation for magic mirrors so wizards notice they are actually more than normal mirrors Adds a changelog --- code/game/objects/structures/mirror.dm | 1 + html/changelogs/Incoming5643-magicmirror.yml | 9 +++++++++ icons/obj/watercloset.dmi | Bin 16366 -> 15003 bytes 3 files changed, 10 insertions(+) create mode 100644 html/changelogs/Incoming5643-magicmirror.yml diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 562fc159cd9..050f225a6b4 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -105,6 +105,7 @@ /obj/structure/mirror/magic name = "magic mirror" desc = "Turn and face the strange... face." + icon_state = "magic_mirror" /obj/structure/mirror/magic/attack_hand(mob/user as mob) diff --git a/html/changelogs/Incoming5643-magicmirror.yml b/html/changelogs/Incoming5643-magicmirror.yml new file mode 100644 index 00000000000..aad4ce79883 --- /dev/null +++ b/html/changelogs/Incoming5643-magicmirror.yml @@ -0,0 +1,9 @@ +################################ + + +author: Incoming5643 + +delete-after: True + +changes: + - rscadd: "Utilizing a new magic mirror found in the den, wizards can now customize their appearance to a high degree before descending upon the station." diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 2b0a66d9ac5249da4f247103c64cfe91949b7263..e31bb79d2474249dd2d161f76d69219e54f38c68 100644 GIT binary patch literal 15003 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 literal 16366 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 From 71d560bd3af6102b808f984cfefc67f474398566 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 19:09:52 +0100 Subject: [PATCH 044/312] Fixes a runtime with buckling screen alert Fixes being able to buckle to janicart while crit and when there's a dense object on the janicart's turf. Fixes alien nest not buckling and being wrongly pixel shifted, and fixed a runtime. Fixes golems being super easy to weaken by punch and not doing more damage themselves via punch. Fixes some typos. --- code/_onclick/hud/alert.dm | 2 +- code/game/objects/buckling.dm | 1 + code/game/objects/structures/janicart.dm | 13 +++++++++---- .../stool_bed_chair_nest/alien_nests.dm | 15 +++++---------- code/modules/mob/living/carbon/human/species.dm | 3 ++- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 5dffc0127b2..fbde37f1d94 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -76,7 +76,7 @@ alerts -= category if(client && hud_used) hud_used.reorganize_alerts() - client.screen -= alert + client.screen -= alert qdel(alert) // Make sure any alerts you throw have a path that matches /obj/screen/alert/[id] or /obj/screen/alert/[category] diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 78933650b03..d4235047a97 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -82,6 +82,7 @@ "[M.name] is buckled to [src] by [user.name]!",\ "You are buckled to [src] by [user.name]!",\ "You heat metal clanking.") + return 1 /obj/proc/user_unbuckle_mob(mob/user) var/mob/living/M = unbuckle_mob() diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 34a68cee94c..8cab07a87e5 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -250,11 +250,16 @@ else user << "You'll need the keys in one of your hands to drive this [callme]." - /obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user) - M.loc = loc - ..() - update_mob() + if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated + return + for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf. + if(A.density) + if(A != src && A != M) + return + M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. + if(..()) + update_mob() /obj/structure/stool/bed/chair/janicart/unbuckle_mob() if(buckled_mob) diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 974a5a9af5e..594ce58d2d4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -26,7 +26,7 @@ */ /obj/structure/stool/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob) - if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) + if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.stat || M.buckled || istype(user, /mob/living/silicon/pai) ) return if(istype(M,/mob/living/carbon/alien)) @@ -36,27 +36,22 @@ unbuckle_mob() - if(M == usr) - return - else + if(buckle_mob(M)) M.visible_message(\ "[user.name] secretes a thick vile goo, securing [M.name] into [src]!",\ "[user.name] drenches you in a foul-smelling resin, trapping you in [src]!",\ "You hear squelching...") - return /obj/structure/stool/bed/nest/post_buckle_mob(mob/living/M) if(M == buckled_mob) - M.pixel_y += 1 + M.pixel_y += 6 M.pixel_x += 2 overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6) else - buckled_mob.pixel_y -= 1 - buckled_mob.pixel_x -= 2 + M.pixel_x -= 2 + M.pixel_y = initial(M.pixel_y) overlays.Cut() - - /obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob, params) var/aforce = W.force health = max(0, health - aforce) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 61746a85d4e..ed4242776fc 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -757,7 +757,8 @@ atk_verb = M.dna.species.attack_verb var/damage = rand(0, 9) - damage += punchmod + if(M.dna) + damage += M.dna.species.punchmod if(!damage) if(M.dna) From 79a20bd57bf5cd09c8a6a7d2a4fddd74764c8405 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 19:19:17 +0100 Subject: [PATCH 045/312] slight fix --- code/game/objects/buckling.dm | 1 - code/game/objects/structures/janicart.dm | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index d4235047a97..78933650b03 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -82,7 +82,6 @@ "[M.name] is buckled to [src] by [user.name]!",\ "You are buckled to [src] by [user.name]!",\ "You heat metal clanking.") - return 1 /obj/proc/user_unbuckle_mob(mob/user) var/mob/living/M = unbuckle_mob() diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 8cab07a87e5..3de876924ca 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -258,8 +258,8 @@ if(A != src && A != M) return M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle. - if(..()) - update_mob() + ..() + update_mob() /obj/structure/stool/bed/chair/janicart/unbuckle_mob() if(buckled_mob) From bc091234eebaee6a33172131fd1ab1f127825b67 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 19:43:39 +0100 Subject: [PATCH 046/312] Changes egg breaking to use reagent_containers/glass/attackby() (fix issue with custom egg salad) You can only break eggs on glass containers (beaker,bucket,bowl,etc) --- code/modules/food&drinks/food/snacks_egg.dm | 15 --------------- code/modules/reagents/reagent_containers/glass.dm | 11 +++++++++++ 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm index c86118a5462..8d9a585c2f8 100644 --- a/code/modules/food&drinks/food/snacks_egg.dm +++ b/code/modules/food&drinks/food/snacks_egg.dm @@ -16,21 +16,6 @@ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledegg filling_color = "#F0E68C" -/obj/item/weapon/reagent_containers/food/snacks/egg/afterattack(obj/target, mob/user, proximity) - if(!proximity) - return - - if(istype(target, /obj/item/weapon/reagent_containers)) - if(target.is_open_container() && target.reagents) - - if(target.reagents.total_volume >= target.reagents.maximum_volume) - user << "[target] is full." - else - user << "You break [src] in [target]." - target.reagents.add_reagent("eggyolk", 5) - qdel(src) - return - /obj/item/weapon/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom) ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 7079ae6bf26..e8cb2865b49 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -101,6 +101,17 @@ reagents.handle_reactions() else user << "[src] is already hotter than [I]." + + if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs + var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I + if(reagents) + if(reagents.total_volume >= reagents.maximum_volume) + user << "[src] is full." + else + user << "You break [E] in [src]." + reagents.add_reagent("eggyolk", 5) + qdel(E) + return ..() From 4f6c96235b49326a3467fc1917718b35709ee1e3 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 9 Mar 2015 21:13:01 +0100 Subject: [PATCH 047/312] Fixes book bags not being able to hold bibles. Changes the book bag sprite so it looks more like a briefcase and isn't confused with a backpack. --- .../objects/items/weapons/storage/bags.dm | 2 +- icons/obj/library.dmi | Bin 22396 -> 22315 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index fa45ef40477..04f6af6e312 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -277,7 +277,7 @@ max_combined_w_class = 21 max_w_class = 3 w_class = 4 //Bigger than a book because physics - can_hold = list(/obj/item/weapon/book, /obj/item/weapon/spellbook) //No bibles, consistent with bookcase + can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook) /* * Trays - Agouri diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index a1610b9e284f996ee000a38675cb9ba061d4fd08..e15935f6ff36d97831196179572eb042dcae3a55 100644 GIT binary patch delta 2731 zcmV;c3RLy{t^upA0kG>q0V}iYLAnZm>S5$IuJHGUKf8O9&L>4y?5Gi77>Euj639Uc z!*CHGg%P+5ASl)uYEq@LiXeq6r?HK|g;k{qWFwXVcZt)eQedbEkONW}QXx1p&O#7F zr@P#3?)HzINip-tA(wm0U6RX%jvrv(?r^w|yW)I&^X7eTY;7D9NfxBi1T#s0w&FVR zxwd`B6mbjX`0lZs!eHC?9GkGRzke2pF!9=#2~0j$|Mtt7&;9t-Kb3wxPaASi!Saxa zjl6`#QVBqp)DVKAzg4#{%Fa>trBoP736}_-HG=aDO(}Ja65B@Fjt%a|6$N$=brAVP z%SmLTS7m>!{!)RBApzizmoJZhUFNk+>?KNTOa$qFbQ8dOI-86I($ z@+Y5^OG2B7pCq%)&l)69h=7Wc51@6@6BCv2k0r3c;_$F3LdmLKlgs8NJZdcKE zJHnyFXGrs!2NS7(m}u&@512aEQehIXo_+g8ov$bp!-! zzry4Sm*)uV_XDhUTunGc(I%1e+IKUKlSurexeChxG5G{JVn^I(C?)>7vx769hn-Q0 zbq_Y73CDJMUn=k8j~nJDpx58MfV*Ej08p%0yLQ#}jmX7+U zDiBIYu+oB z%q3cFyKn`;7X-h8O##^Z8HOqwq*Hdrdm zMLCq$*~i?TD#e#dj7g8H5y91H{au7hC^!gu3kc|M;| ztSCRncjUaArl5m|aZXjz?70J`Cl5LhMYlZx_@D^sXTKy@$PiU?m=E zGMcw2zf^>9sQYXmXyI$y$~zi`I&0ezx(2uJ7T**g>-&XDVRgo3{!!{PjslZSM+kh^ z_i@;e&r)NiJHaNOmtT1icqKme?Uy?D=iYDi`^VecxjysxXIc}FIf5d$-_Dw44*~#u zN4xcZ{Itz#pEu*SPWx3A<+s5e%!=vvV5AqYj=Wo2BestGRg!_ko zhq$=1k{}nGjO_NWdOf`G)?3(l?>(GvwJ<6n<9Z^d5KrFw|G1+N0kQW}WGQ}gYd?`< zoRBZrFY<%{*ey===jKfCa#UUR7mW4iPGb9D7_IOzq*-O!{ARDxO#x;>UrK!M+BMw2 zc@sVnUg&fHjC(p?^?Dd8g=gP<6WtqsHxkDxBcUb_s1y_;prYgh0HC<$jKa8X2uSAS z9Mw){P^Cj8YC`{|u%8pQa{Z|D)6*hXkX|M?2V9{`df0KD{wTzX@0i@4c=`nBRWsWY zDr$cg{P69!@%a7saq;?fY;SMl{>_^J0N*ms#B=uSS#)pQz_3cM$3~L}R0;}zeBfuE3KB*=uu`g04{^l^n9aE=oR?V$IpQjDUyvV$-LKKu|ZB3!(F9RRRx1$dcw zy3k})YP{ztObJ5gz5kCp<|d$j!k&)-C#p%MFGdP8BeH^;1VAaB+{dHF8ruLU_F~My zavVVMptbE;QUM^ohw8F#A76wNBamA2#;atEVGzf5mPLy3&v)Lzny1q=hDt@#tCJQB zb~*ETQJxRu5}F`%37Cn1W>vc9x&V{fugDB`sYkFPy#x+3wTX9gQ6Nx%B=QWU?jvB% zH|I!cwvnNDKoEcsh#uF%B8WQe1B;Vle7ir0rc|tgkBN$wQi>6IHI9>*elfBDG5ZTT>-9RBok3=h2W5abc7yY z=EH@VOS!3dgy&GL_7kgrM+=Z*Fwzb~C>466aH*siS8m;+c}r|O?DeA8zy9pA{BG9- zG&O#zL8aw5rqzQ6fD30YX(7Riti{HmkN~t0<+vJ zBPoOf358HeKqbqL3Ibe9Dp801_JXAtfF>V%QG8^U%N4M6QjDs9DjY5XO+D!8m`Xr- zNTdjCDF(+;JQ7jhcMwptQtmrKyX~Yf2(@=XP;iBap0ooi-^3HKY#<0Fl$k!cti^ID zAt9*4K7fTvG1{I3qHJ||U^2ItO^Q(`8WO1%wciOW#pw7)r_K9{GVYjxSL|#r liAAxaf?3NN4I0df{{v7{boR?QsZ#&|002ovPDHLkV1nCVKp_AC delta 2812 zcmVq0erLULAnZmYC_~VuJHG&y5~od*ODVEwsa8~L$b*spoAQZ z@gb0d2|gGELP2YE$ths44DN8e_4TV)@4fP4m~mk% zflT`P@}*7U7OR81$Fd89FF%w%VdYmWER3Yj3`V%PaOY#;e+=6^F`sd zT|4Nqab1kM%GtJ2x134xg;${}@Q%!r&t?0=2;Fvom3DyLL6quuyc?o7h|nLHHg(A7 z@BTHH#RnHIXrFYl->bs8DcWvSE&MUYRCn6y>I)Ow+`M^XsuS4wdMA~CT4OB8xSIgp z)7d5+;{#}&e74m%Fyry>eeSnl`SZl3ADzL!cL%Ad6l*4{&m6 zhUP?>e9Fp~6-}>vFtPmP#EG$O_Lah)?wgDUpI*GEFMRSzV+3AelqR58-Z_gu{_3mQ zPrzn243MNwO_@F^bJN>_&DIh}4oFDDrTd}G`1X&bjT~W|lou+0pNnFhPct=$&+N7`B{S$N(G~qB_F^fotMH6 zOuNbw*mp_hCCHS21zctah!ELwbF&MWRURpmdLak`$@kE{mO;KCLLdb~yJ{u9#QR*v z;H3PLGS`rkte?x3((d?xSvvO(&Y=|8-H+VyC6U`Ca#s0y^}g1{$0&kpYis(Y|IkeN1- z<_P@7$=CiEl!P|SbSdlRQ&m#_z<$>{?Mt-M2@nWEOAuN$Yzn~I&oI_5+1xbB&`_zd zgte~}`byz{^PL^^l|olajI>5yDV#oinqIwfMc1YYH7JFd2#Cq&{-4Y56!HAiM-L>E zmx2%qQEU0URT>n;RR5Mw zJ}`DXcTBr4Nav*dH<&YeR2-n)J~ z^}SRJlTO1g#AcCd4rdK z4_Viy0C_>J{ZWkHUdsIma?w{RR|E1fH~Y^7;wgInA9j=?Al81$EX8kZ?xtLfQ{fB# zha&42tQKe5b8#+sIcibz=Zw{7j$vzW=vMd`$}VSbe7#farU27oXbELIif|$boXrO? zgp@b^nhP2~ph{5652!5p001aa<=v8hZf0<3m?v=d;g&6D9%1J|e(6UYXVLNtf+N%? z_2+tS6J-2&0%1~m_;wxMtdV_^e7`4Ob`|o=qHm{Nc~h^sLTBC^%!HWLR_3X$kPHSB`Ji2%8m$*Ee;k+uVEZ$FF%ad4 zL-6sG*6x)YE9vjIXM*IMK7k;wfBIaemCtP=rAryH0pQDr4*?i0h&3Mn^FRB2Jom;M zxqa{6y{rH5`s=9N2Z%E785F($4?AX_f|b^MEZ9*^X>&44SWUt+Y8uBmj7e2Ht-kZ6ZfROgudpLv^h_KWK9N)P-8zMknQi27t3q9dR!F1na^t2_Xq6A}G6W zmI5G2Ah3hLJfStTN>YU?0FhnpRW1}lLO~rL0LeC1Hr1{ih|0#$jAM|8QB%mTBQU-n~2HR0W z64t(=F^I^ml((cXYCCBRVxwIUGy);qlXl?wn}i|>8;D{BZKqEG$6`rJg%B)4K7hG~ zVst_Yq9hfEkH~s|ZZA_P2E%DMQX;g+%hP;DnXR&D@s_1sGS(HVCDQ$*EI+J^-wA3<2)$S7*z}3&ps8 z>;BmG1k@gi!Phwr>Pj@9!yNqm>KTDBSq-J2l%Ec7&9k}P#~@NBKsGa+{T(r` z-@1<*|Jr_Qr2M?l3zna~{wUVi8%B_5bEP8XRIQoPd_e?f)>~JEx99hGu%j zmY`v*Fo=y2e)B;e_iVb31`X;)sZfjt|9{{WJ6}uUpx9BJq3aDA Date: Mon, 9 Mar 2015 20:29:28 +0000 Subject: [PATCH 048/312] Reworked suggested code, added brain implants, misc additions. Fix missing ')'. DELETE THIS --- code/datums/hud.dm | 2 +- code/datums/mutations.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 6 +- .../mob/living/carbon/human/examine.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 7 +- .../mob/living/carbon/human/species.dm | 6 +- code/modules/mob/living/carbon/life.dm | 6 +- code/modules/mob/mob_defines.dm | 4 +- code/modules/surgery/cybernetic_implants.dm | 44 +++++++ .../modules/surgery/eye_cybernetic_implant.dm | 31 ----- .../surgery/organs/cybernetic_implants.dm | 112 ++++++++++++++---- icons/obj/surgery.dmi | Bin 12003 -> 12582 bytes tgstation.dme | 2 +- 13 files changed, 158 insertions(+), 66 deletions(-) create mode 100644 code/modules/surgery/cybernetic_implants.dm delete mode 100644 code/modules/surgery/eye_cybernetic_implant.dm diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 14e79c51f35..f3315d1cfd6 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -20,7 +20,7 @@ var/datum/atom_hud/huds = list( \ var/list/hud_icons = list() //these will be the indexes for the atom's hud_list /datum/atom_hud/proc/remove_hud_from(var/mob/M) - if(locate(src,M.permanent_huds)) + if(src in M.permanent_huds) return for(var/atom/A in hudatoms) remove_from_single_hud(M, A) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 07999b41ed1..a9576525c13 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,7 +179,7 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return - if(locate(SEE_MOBS,owner.permanent_sight_flags) && locate(SEE_OBJS,owner.permanent_sight_flags) && locate(SEE_TURFS,owner.permanent_sight_flags)) //Xray flag combo + if((SEE_MOBS in owner.permanent_sight_flags) && (SEE_OBJS in owner.permanent_sight_flags) && (SEE_TURFS in owner.permanent_sight_flags)) //Xray flag combo return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8371b8386aa..bdd77498ee3 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -156,7 +156,11 @@ /mob/living/carbon/proc/eyecheck() - return locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 + for(var/obj/item/I in contents) + if(istype(I,/obj/item/cybernetic_implant/eyes)) + var/obj/item/cybernetic_implant/eyes/EFP = I + return EFP.flash_protect + return 0 /mob/living/carbon/proc/tintcheck() return 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2b626f600f8..f83425b4a26 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -284,7 +284,7 @@ if(R) msg += "\[Medical evaluation\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(H.internal_organs,/obj/item/organ/cybernetic_implant/eyes/security_hud)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(/obj/item/cybernetic_implant/eyes/security_hud,H.internal_organs)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b4b04f5a5bf..2d84986f081 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -78,7 +78,7 @@ ///eyecheck() ///Returns a number between -1 to 2 /mob/living/carbon/human/eyecheck() - var/number = locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 + var/number = 0 if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item number += HFP.flash_protect @@ -88,6 +88,11 @@ if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask var/obj/item/clothing/mask/MFP = src.wear_mask number += MFP.flash_protect + for(var/obj/item/I in contents) + if(istype(I,/obj/item/cybernetic_implant/eyes)) + var/obj/item/cybernetic_implant/eyes/EFP = I + number += EFP.flash_protect + break return number ///tintcheck() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 897583a2104..1f0c0254608 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,11 +510,11 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS,H.permanent_sight_flags)) + if(!(SEE_TURFS in H.permanent_sight_flags)) H.sight &= ~SEE_TURFS - if(!locate(SEE_MOBS,H.permanent_sight_flags)) + if(!(SEE_MOBS in H.permanent_sight_flags)) H.sight &= ~SEE_MOBS - if(!locate(SEE_OBJS,H.permanent_sight_flags)) + if(!(SEE_OBJS in H.permanent_sight_flags)) H.sight &= ~SEE_OBJS H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8120504ca89..763b5f68938 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,11 +561,11 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS,permanent_sight_flags)) + if(!(SEE_TURFS in permanent_sight_flags)) sight &= ~SEE_TURFS - if(!locate(SEE_MOBS,permanent_sight_flags)) + if(!(SEE_MOBS in permanent_sight_flags)) sight &= ~SEE_MOBS - if(!locate(SEE_OBJS,permanent_sight_flags)) + if(!(SEE_OBJS in permanent_sight_flags)) sight &= ~SEE_OBJS see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 39bced45333..5604b19e880 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -157,5 +157,5 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/last_movement = 0 // Last world.time the mob actually moved of its own accord. - var/permanent_huds = new /list() //any HUDs in this list will be ignored by HUD removing procs - var/permanent_sight_flags = new /list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file + var/permanent_huds = list() //any HUDs in this list will be ignored by HUD removing procs + var/permanent_sight_flags = list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm new file mode 100644 index 00000000000..35245dfc9ff --- /dev/null +++ b/code/modules/surgery/cybernetic_implants.dm @@ -0,0 +1,44 @@ +#define MAX_BRAIN_IMPLANT 2 + +/datum/surgery/eye_cybernetic_implant/eyes + name = "eye cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + location = "eyes" + +/datum/surgery/eye_cybernetic_implant/brain + name = "brain cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/close) + location = "head" + +/datum/surgery_step/cybernetic_implant + implements = list(/obj/item/cybernetic_implant = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + user.visible_message("[user] begins to implant [target] with [implant].") + +/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + switch(target_zone) + if("eyes") + if(locate(/obj/item/cybernetic_implant/eyes,target.contents)) + full = 1 + if("head") + var/count = 0 + for(var/obj/item/I in target.contents) + if(istype(I,/obj/item/cybernetic_implant/brain)) + count++ + if(count >= MAX_BRAIN_IMPLANT) + full = 1 + + if(full) + user.visible_message("[user] can't seem to implant anything else into the [target]'s [target_zone].") + return 1 + else + user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!") + implant.owner = target + implant.function() + user.drop_item() + implant.loc = target + return 1 \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm deleted file mode 100644 index f9d1367753a..00000000000 --- a/code/modules/surgery/eye_cybernetic_implant.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/surgery/eye_cybernetic_implant - name = "eye cybernetic implant" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) - location = "eyes" - -/datum/surgery_step/cybernetic_implant - accept_any_item = 1 - time = 32 - -/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to implant [target] with [tool].") - -/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(tool) - if(!istype(tool, /obj/item/organ/cybernetic_implant/eyes)) - user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") - return 0 - else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) - user.visible_message("[user] can't seem to implant anything else into [target]'s eyes.") - return 1 - else - user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") - - var/obj/item/organ/cybernetic_implant/eyes/implant = tool - implant.owner = target - implant.function() - target.internal_organs |= implant - user.drop_item() - implant.loc = target - - return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 218542fa203..de2f514f941 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -1,72 +1,78 @@ -/obj/item/organ/cybernetic_implant +/obj/item/cybernetic_implant name = "cybernetic implant" desc = "a state-of-the-art implant that improves a baseline's functionality" + icon = 'icons/obj/surgery.dmi' var/mob/owner = null + var/implant_color = "#FFFFFF" -/obj/item/organ/cybernetic_implant/New(var/mob/M = null) +/obj/item/cybernetic_implant/New(var/mob/M = null) if(M) owner = M return ..() -/obj/item/organ/cybernetic_implant/proc/function() +/obj/item/cybernetic_implant/proc/function() return -/obj/item/organ/cybernetic_implant/eyes +//[[[[EYES]]]] +/obj/item/cybernetic_implant/eyes name = "cybernetic eyes" desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" var/eye_color = "fff" - var/implant_color = "#FFFFFF" -/obj/item/organ/cybernetic_implant/eyes/New() + var/flash_protect = 0 + +/obj/item/cybernetic_implant/eyes/New() var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay") overlay.ColorTone(implant_color) overlays |= overlay ..() -/obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() +/obj/item/cybernetic_implant/eyes/proc/update_eye_color(fluff_message) if(istype(owner,/mob/living/carbon/human)) var/mob/living/carbon/human/HMN = owner HMN.eye_color = eye_color HMN.regenerate_icons() + if(fluff_message) + owner << "[fluff_message]" -/obj/item/organ/cybernetic_implant/eyes/medical_hud +/obj/item/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." eye_color = "0ff" implant_color = "#00FFFF" -/obj/item/organ/cybernetic_implant/eyes/medical_hud/function() +/obj/item/cybernetic_implant/eyes/medical_hud/function() if(!owner) return var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() + update_eye_color("You suddenly see health bars floating above people's heads...") -/obj/item/organ/cybernetic_implant/eyes/security_hud +/obj/item/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." eye_color = "d00" implant_color = "#CC0000" -/obj/item/organ/cybernetic_implant/eyes/security_hud/function() +/obj/item/cybernetic_implant/eyes/security_hud/function() if(!owner) return var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() + update_eye_color("Job indicator icons pop up in your vision. That is not a certified surgeon...") -/obj/item/organ/cybernetic_implant/eyes/xray +/obj/item/cybernetic_implant/eyes/xray name = "xray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" implant_color = "#000000" -/obj/item/organ/cybernetic_implant/eyes/xray/function() +/obj/item/cybernetic_implant/eyes/xray/function() if(!owner) return @@ -76,23 +82,24 @@ owner.permanent_sight_flags |= SEE_MOBS owner.permanent_sight_flags |= SEE_OBJS owner.permanent_sight_flags |= SEE_TURFS - update_eye_color() + update_eye_color("Your vision is augmented!") -/obj/item/organ/cybernetic_implant/eyes/thermals +/obj/item/cybernetic_implant/eyes/thermals name = "thermals implant" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." eye_color = "FC0" implant_color = "#FFCC00" + flash_protect = -1 -/obj/item/organ/cybernetic_implant/eyes/thermals/function() +/obj/item/cybernetic_implant/eyes/thermals/function() if(!owner) return owner.sight |= SEE_MOBS owner.permanent_sight_flags |= SEE_MOBS - update_eye_color() + update_eye_color("You see prey everywhere you look...") -/obj/item/organ/cybernetic_implant/eyes/emp_act(severity) +/obj/item/cybernetic_implant/eyes/emp_act(severity) if(severity > 1) if(prob(5)) return @@ -101,4 +108,67 @@ owner.disabilities |= BLIND spawn(50) owner.sight |= save_sight - owner.disabilities &= ~BLIND \ No newline at end of file + owner.disabilities &= ~BLIND + + +//[[[[BRAIN]]]] + +/obj/item/cybernetic_implant/brain + name = "cybernetic brain implant" + desc = "injectors of extra sub-routines for the brain" + icon_state = "brain_implant" + +/obj/item/cybernetic_implant/brain/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"brain_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() + +/obj/item/cybernetic_implant/brain/anti_drop + name = "anti-drop implant" + desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + var/active = 0 + var/l_hand_ignore = 0 + var/r_hand_ignore = 0 + implant_color = "#DE7E00" + +/obj/item/cybernetic_implant/brain/anti_drop/function() + action_button_name = "Toggle Anti-Drop" + +/obj/item/cybernetic_implant/brain/anti_drop/ui_action_click() + active = !active + if(active) + if(owner.l_hand) + if(NODROP in owner.l_hand.flags) + l_hand_ignore = 1 + else + owner.l_hand.flags |= NODROP + l_hand_ignore = 0 + + if(owner.r_hand) + if(NODROP in owner.r_hand.flags) + r_hand_ignore = 1 + else + owner.r_hand.flags |= NODROP + r_hand_ignore = 0 + + if(!owner.r_hand && !owner.l_hand) + owner << "You are not holding any items, your hands relax..." + active = 0 + else + var/noodles = 0 + noodles += !l_hand_ignore && owner.l_hand ? 1 : 0 + noodles += !r_hand_ignore && owner.r_hand ? 2 : 0 + switch(noodles) + if(1) + owner << "Your left hand's grip tightens." + if(2) + owner << "Your right hand's grip tightens." + if(3) + owner << "Both of your hand's grips tighten." + else + if(!l_hand_ignore && owner.l_hand) + owner.l_hand.flags &= ~NODROP + if(!r_hand_ignore && owner.r_hand) + owner.r_hand.flags &= ~NODROP + owner << "Your hands relax..." diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index da2b249866dd245d44c3318954975d93dc450ef2..93ebade829d8b8b54225500b975b4fa4965b54ef 100644 GIT binary patch literal 12582 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 literal 12003 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

LO&_%4Pr<%xHs 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 diff --git a/tgstation.dme b/tgstation.dme index cb1378c51aa..4792eef8e46 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1390,7 +1390,7 @@ #include "code\modules\surgery\brain_removal.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" -#include "code\modules\surgery\eye_cybernetic_implant.dm" +#include "code\modules\surgery\cybernetic_implants.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gender_reassignment.dm" #include "code\modules\surgery\generic_steps.dm" From f6e4c1518d9594da6d90477a3b23dadf79351f7b Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Mon, 9 Mar 2015 20:43:56 +0000 Subject: [PATCH 049/312] A restructure/removal/cleanup of Ninja Code --- code/game/gamemodes/objective.dm | 25 +- code/game/machinery/camera/tracking.dm | 17 +- code/game/machinery/doors/windowdoor.dm | 16 - code/game/turfs/turf.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/clothing/clothing.dm | 1 + code/modules/clothing/gloves/ninja.dm | 104 - code/modules/clothing/masks/gasmask.dm | 29 - code/modules/clothing/spacesuits/ninja.dm | 65 - code/modules/events/ninja.dm | 2436 ----------------- code/modules/mob/living/carbon/human/human.dm | 8 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/ninja/Ninja_Readme.dm | 10 + code/modules/ninja/__ninjaDefines.dm | 13 + code/modules/ninja/admin_ninja_verbs.dm | 61 + code/modules/ninja/energy_katana.dm | 10 + code/modules/ninja/ninja_event.dm | 214 ++ code/modules/ninja/suit/SpiderOS.dm | 277 ++ code/modules/ninja/suit/gloves.dm | 343 +++ code/modules/ninja/suit/head.dm | 11 + code/modules/ninja/suit/mask.dm | 137 + .../suit/n_suit_verbs/energy_net_nets.dm | 174 ++ .../suit/n_suit_verbs/ninja_adrenaline.dm | 26 + .../suit/n_suit_verbs/ninja_cost_check.dm | 29 + .../ninja/suit/n_suit_verbs/ninja_empulse.dm | 15 + .../ninja/suit/n_suit_verbs/ninja_net.dm | 32 + .../ninja/suit/n_suit_verbs/ninja_smoke.dm | 19 + .../ninja/suit/n_suit_verbs/ninja_stars.dm | 33 + .../ninja/suit/n_suit_verbs/ninja_stealth.dm | 78 + .../suit/n_suit_verbs/ninja_teleporting.dm | 89 + code/modules/ninja/suit/suit.dm | 172 ++ code/modules/ninja/suit/suit_attackby.dm | 61 + .../modules/ninja/suit/suit_initialisation.dm | 102 + code/modules/ninja/suit/suit_process.dm | 28 + .../modules/ninja/suit/suit_verbs_handlers.dm | 52 + code/modules/power/cell.dm | 9 - .../reagents/reagent_containers/glass.dm | 1 + icons/mob/belt.dmi | Bin 10854 -> 11183 bytes icons/mob/inhands/items_lefthand.dmi | Bin 91047 -> 91333 bytes icons/mob/inhands/items_righthand.dmi | Bin 89377 -> 89645 bytes icons/obj/weapons.dmi | Bin 30727 -> 30904 bytes tgstation.dme | 26 +- 42 files changed, 2048 insertions(+), 2681 deletions(-) delete mode 100644 code/modules/clothing/gloves/ninja.dm delete mode 100644 code/modules/clothing/spacesuits/ninja.dm delete mode 100644 code/modules/events/ninja.dm create mode 100644 code/modules/ninja/Ninja_Readme.dm create mode 100644 code/modules/ninja/__ninjaDefines.dm create mode 100644 code/modules/ninja/admin_ninja_verbs.dm create mode 100644 code/modules/ninja/energy_katana.dm create mode 100644 code/modules/ninja/ninja_event.dm create mode 100644 code/modules/ninja/suit/SpiderOS.dm create mode 100644 code/modules/ninja/suit/gloves.dm create mode 100644 code/modules/ninja/suit/head.dm create mode 100644 code/modules/ninja/suit/mask.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_cost_check.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_empulse.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_net.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm create mode 100644 code/modules/ninja/suit/n_suit_verbs/ninja_teleporting.dm create mode 100644 code/modules/ninja/suit/suit.dm create mode 100644 code/modules/ninja/suit/suit_attackby.dm create mode 100644 code/modules/ninja/suit/suit_initialisation.dm create mode 100644 code/modules/ninja/suit/suit_process.dm create mode 100644 code/modules/ninja/suit/suit_verbs_handlers.dm diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 730462ddfff..23d485f84a2 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -426,21 +426,30 @@ datum/objective/download/proc/gen_amount_goal() explanation_text = "Download [target_amount] research level\s." return target_amount -datum/objective/download/check_completion() +datum/objective/download/check_completion()//NINJACODE if(!ishuman(owner.current)) return 0 - if(!owner.current || owner.current.stat == 2) + + var/mob/living/carbon/human/H = owner.current + if(!H || H.stat == DEAD) return 0 - if(!(istype(owner.current:wear_suit, /obj/item/clothing/suit/space/space_ninja)&&owner.current:wear_suit:s_initialized)) + + if(!istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) return 0 + + var/obj/item/clothing/suit/space/space_ninja/SN = H.wear_suit + if(!SN.s_initialized) + return 0 + var/current_amount - var/obj/item/clothing/suit/space/space_ninja/S = owner.current:wear_suit - if(!S.stored_research.len) + if(!SN.stored_research.len) return 0 else - for(var/datum/tech/current_data in S.stored_research) - if(current_data.level>1) current_amount+=(current_data.level-1) - if(current_amount The glass door was sliced open by [user]!") - open(2) - emagged = 1 - return 1 - if(istype(I, /obj/item/weapon/screwdriver)) if(src.density || src.operating) user << "You need to open the door to access the maintenance panel." diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e2f23e70f0b..70ec86b079b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -193,7 +193,7 @@ src.cancable = 1//so cables can be laid new /obj/structure/lattice/catwalk(locate(src.x, src.y, src.z) ) -/turf/proc/phase_damage_creatures(damage,mob/U = null)//>Ninja Code. Hurts and knocks out creatures on this turf +/turf/proc/phase_damage_creatures(damage,mob/U = null)//>Ninja Code. Hurts and knocks out creatures on this turf //NINJACODE for(var/mob/living/M in src) if(M==U) continue//Will not harm U. Since null != M, can be excluded to kill everyone. diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d3275f9cf76..64e70411bff 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -327,7 +327,7 @@ Traitors and the like can also be revived with the previous role mostly intact. new_character.loc = get_turf(synd_spawn) call(/datum/game_mode/proc/equip_syndicate)(new_character) if("Space Ninja") - var/ninja_spawn[] = list() + var/list/ninja_spawn = list() for(var/obj/effect/landmark/L in landmarks_list) if(L.name=="carpspawn") ninja_spawn += L diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c84fd4b7916..8f80cee31da 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -76,6 +76,7 @@ BLIND // can't see anything icon = 'icons/obj/clothing/hats.dmi' body_parts_covered = HEAD slot_flags = SLOT_HEAD + var/blockTracking = 0 //For AI tracking //Mask /obj/item/clothing/mask diff --git a/code/modules/clothing/gloves/ninja.dm b/code/modules/clothing/gloves/ninja.dm deleted file mode 100644 index 0b05f32fb8d..00000000000 --- a/code/modules/clothing/gloves/ninja.dm +++ /dev/null @@ -1,104 +0,0 @@ -/* - Dear ninja gloves - - This isn't because I like you - this is because your father is a bastard - - ... - I guess you're a little cool. - -Sayu -*/ - -/obj/item/clothing/gloves/space_ninja - desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance." - name = "ninja gloves" - icon_state = "s-ninja" - item_state = "s-ninja" - siemens_coefficient = 0 - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - strip_delay = 120 - var/draining = 0 - var/candrain = 0 - var/mindrain = 200 - var/maxdrain = 400 - -/* - This runs the gamut of what ninja gloves can do - The other option would be a dedicated ninja touch bullshit proc on everything - which would probably more efficient, but ninjas are pretty rare. - This was mostly introduced to keep ninja code from contaminating other code; - with this in place it would be easier to untangle the rest of it. - - For the drain proc, see events/ninja.dm -*/ -/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity) - if(!candrain || draining) return 0 - - var/mob/living/carbon/human/H = loc - if(!istype(H)) return 0 // what - var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit - if(!istype(suit)) return 0 - if(isturf(A)) return 0 - - if(!proximity) // todo: you could add ninja stars or computer hacking here - return 0 - - A.add_fingerprint(H) - - // steal energy from powered things - if(istype(A,/mob/living/silicon/robot)) - drain("CYBORG",A,suit) - return 1 - - if(istype(A,/obj/machinery/power/apc)) - drain("APC",A,suit) - return 1 - - if(istype(A,/obj/structure/cable)) - drain("WIRE",A,suit) - return 1 - - if(istype(A,/obj/structure/grille)) - var/obj/structure/cable/C = locate() in A.loc - if(C) - drain("WIRE",C,suit) - return 1 - - if(istype(A,/obj/machinery/power/smes)) - drain("SMES",A,suit) - return 1 - - if(istype(A,/obj/mecha)) - drain("MECHA",A,suit) - return 1 - - if(istype(A,/obj/machinery/computer/rdconsole)) // download research - drain("RESEARCH",A,suit) - return 1 - - if(istype(A,/obj/machinery/r_n_d/server)) - A.add_fingerprint(H) - var/obj/machinery/r_n_d/server/S = A - if(S.disabled) - return 1 - if(S.shocked) - S.shock(H,50) - return 1 - drain("RESEARCH",A,suit) - return 1 - - //do AI transfers - if(istype(A,/mob/living/silicon/ai)) - suit.NAI.transfer_ai("AICORE", "AICARD", A, H) - return 1 - - if(istype(A,/obj/structure/AIcore/deactivated)) - suit.NAI.transfer_ai("INACTIVE","AICARD",A, H) - return 1 - - if(istype(A,/obj/machinery/computer/aifixer)) - suit.NAI.transfer_ai("AIFIXER","AICARD",A, H) - return 1 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 2366d9f3877..c38e52f1736 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -219,35 +219,6 @@ vchange = !vchange user << "The voice changer is now [vchange ? "on" : "off"]!" -/obj/item/clothing/mask/gas/voice/space_ninja - name = "ninja mask" - desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement." - icon_state = "s-ninja" - item_state = "s-ninja_mask" - vchange = 1 - strip_delay = 120 - -/obj/item/clothing/mask/gas/voice/space_ninja/speechModification(message) - if(voice == "Unknown") - if(copytext(message, 1, 2) != "*") - var/list/temp_message = text2list(message, " ") - var/list/pick_list = list() - for(var/i = 1, i <= temp_message.len, i++) - pick_list += i - for(var/i=1, i <= abs(temp_message.len/3), i++) - var/H = pick(pick_list) - if(findtext(temp_message[H], "*") || findtext(temp_message[H], ";") || findtext(temp_message[H], ":")) continue - temp_message[H] = ninjaspeak(temp_message[H]) - pick_list -= H - message = list2text(temp_message, " ") - message = replacetext(message, "o", "?") - message = replacetext(message, "p", "?") - message = replacetext(message, "l", "?") - message = replacetext(message, "s", "?") - message = replacetext(message, "u", "?") - message = replacetext(message, "b", "?") - return message - /obj/item/clothing/mask/gas/clown_hat name = "clown wig and mask" diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm deleted file mode 100644 index 9c6c98d6396..00000000000 --- a/code/modules/clothing/spacesuits/ninja.dm +++ /dev/null @@ -1,65 +0,0 @@ -/obj/item/clothing/head/helmet/space/space_ninja - desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear." - name = "ninja hood" - icon_state = "s-ninja" - item_state = "s-ninja_mask" - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25) - strip_delay = 12 - unacidable = 1 - - -/obj/item/clothing/suit/space/space_ninja - name = "ninja suit" - desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins." - icon_state = "s-ninja" - item_state = "s-ninja_suit" - allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell) - slowdown = 0 - unacidable = 1 - armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) - strip_delay = 12 - - //Important parts of the suit. - var/mob/living/carbon/affecting = null//The wearer. - var/obj/item/weapon/stock_parts/cell/cell//Starts out with a high-capacity cell using New(). - var/datum/effect/effect/system/spark_spread/spark_system//To create sparks. - var/reagent_list[] = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New(). - var/stored_research[]//For stealing station research. - var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk. - - //Other articles of ninja gear worn together, used to easily reference them after initializing. - var/obj/item/clothing/head/helmet/space/space_ninja/n_hood - var/obj/item/clothing/shoes/space_ninja/n_shoes - var/obj/item/clothing/gloves/space_ninja/n_gloves - - //Main function variables. - var/s_initialized = 0//Suit starts off. - var/s_coold = 0//If the suit is on cooldown. Can be used to attach different cooldowns to abilities. Ticks down every second based on suit ntick(). - var/s_cost = 5.0//Base energy cost each ntick. - var/s_acost = 25.0//Additional cost for additional powers active. - var/k_cost = 200.0//Kamikaze energy cost each ntick. - var/k_damage = 1.0//Brute damage potentially done by Kamikaze each ntick. - var/s_delay = 40.0//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability. - var/a_transfer = 20.0//How much reagent is transferred when injecting. - var/r_maxamount = 80.0//How much reagent in total there is. - - //Support function variables. - var/spideros = 0//Mode of SpiderOS. This can change so I won't bother listing the modes here (0 is hub). Check ninja_equipment.dm for how it all works. - var/s_active = 0//Stealth off. - var/s_busy = 0//Is the suit busy with a process? Like AI hacking. Used for safety functions. - var/kamikaze = 0//Kamikaze on or off. - var/k_unlock = 0//To unlock Kamikaze. - - //Ability function variables. - var/s_bombs = 10.0//Number of starting ninja smoke bombs. - var/a_boost = 3.0//Number of adrenaline boosters. - - //Onboard AI related variables. - - var/obj/item/device/aicard/NAI //Integrated intellicard. - - var/obj/item/device/paicard/pai//A slot for a pAI device - - var/obj/effect/overlay/hologram//Is the AI hologram on or off? Visible only to the wearer of the suit. This works by attaching an image to a blank overlay. - - var/s_control = 1//If user in control of the suit. diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm deleted file mode 100644 index fba9d8a692c..00000000000 --- a/code/modules/events/ninja.dm +++ /dev/null @@ -1,2436 +0,0 @@ -//Note to future generations: I didn't write this god-awful code I just ported it to the event system and tried to make it less moon-speaky. -//Don't judge me D; ~Carn - -/datum/round_event_control/ninja - name = "Space Ninja" - typepath = /datum/round_event/ninja - max_occurrences = 1 - earliest_start = 30000 // 1 hour - -/datum/round_event/ninja - var/success_spawn = 0 - - var/helping_station - var/key - var/spawn_loc - var/mission - - var/mob/living/carbon/human/Ninja - -/datum/round_event/ninja/setup() - helping_station = rand(0,1) - -/datum/round_event/ninja/kill() - if(!success_spawn && control) - control.occurrences-- - return ..() - -/datum/round_event/ninja/start() - //selecting a spawn_loc - if(!spawn_loc) - var/list/spawn_locs = list() - for(var/obj/effect/landmark/L in landmarks_list) - if(isturf(L.loc)) - switch(L.name) - if("ninjaspawn","carpspawn") - spawn_locs += L.loc - if(!spawn_locs.len) - return kill() - spawn_loc = pick(spawn_locs) - if(!spawn_loc) - return kill() - - //selecting a candidate player - if(!key) - var/list/candidates = get_candidates(BE_NINJA) - if(!candidates.len) - return kill() - var/client/C = pick(candidates) - key = C.key - if(!key) - return kill() - - //We prepare the mind before we spawn the ninja mob, so we cannot simply do mob.key = key then modify the mind. - //instead we make the mind and modify it, then make sure it is active and mind.transfer_to(mob) - //alternatively we could do mob.mind = mind;mob.key=key - var/datum/mind/Mind = create_ninja_mind(key) - Mind.active = 1 - - //generate objectives - You'll generally get 6 objectives (Ninja is meant to be hardmode!) - if(mission) - var/datum/objective/O = new /datum/objective(mission) - O.owner = Mind - Mind.objectives += O - else - if(helping_station) //DS are the highest priority (if we're a helpful ninja) - for(var/datum/mind/M in ticker.minds) - if(M.current && M.current.stat != DEAD) - if(M.special_role == "Death Commando") - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = Mind - O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the Death Commando." - Mind.objectives += O - - else //Xenos are the highest priority (if we're not so helpful) Although this makes zero sense at all... - for(var/mob/living/carbon/alien/humanoid/queen/Q in player_list) - if(Q.mind && Q.stat != DEAD) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = Mind - O.target = Q.mind - O.explanation_text = "Slay \the [Q.real_name]." - Mind.objectives += O - - if(Mind.objectives.len < 4) //not enough objectives still! - var/list/possible_targets = list() - for(var/datum/mind/M in ticker.minds) - if(M.current && M.current.stat != DEAD) - if(istype(M.current,/mob/living/carbon/human)) - if(M.special_role) - possible_targets[M] = 0 //bad-guy - else if(M.assigned_role in command_positions) - possible_targets[M] = 1 //good-guy - - var/list/objectives = list(1,2,3,4) - while(Mind.objectives.len < 4) //still not enough objectives! - switch(pick_n_take(objectives)) - if(1) //research - var/datum/objective/download/O = new /datum/objective/download() - O.owner = Mind - O.gen_amount_goal() - Mind.objectives += O - - if(2) //steal - var/datum/objective/steal/special/O = new /datum/objective/steal/special() - O.owner = Mind - Mind.objectives += O - - if(3) //protect/kill - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/assassinate/O = new /datum/objective/assassinate() - O.owner = Mind - O.target = M - O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]." - Mind.objectives += O - else //protect - var/datum/objective/protect/O = new /datum/objective/protect() - O.owner = Mind - O.target = M - O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm." - Mind.objectives += O - if(4) //debrain/capture - if(!possible_targets.len) continue - var/selected = rand(1,possible_targets.len) - var/datum/mind/M = possible_targets[selected] - var/is_bad_guy = possible_targets[M] - possible_targets.Cut(selected,selected+1) - - if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy) - var/datum/objective/debrain/O = new /datum/objective/debrain() - O.owner = Mind - O.target = M - O.explanation_text = "Steal the brain of [M.current.real_name]." - Mind.objectives += O - else //capture - var/datum/objective/capture/O = new /datum/objective/capture() - O.owner = Mind - O.gen_amount_goal() - Mind.objectives += O - else - break - - //Add a survival objective since it's usually broad enough for any round type. - var/datum/objective/O = new /datum/objective/survive() - O.owner = Mind - Mind.objectives += O - - //Finally, add their RP-directive - var/directive = generate_ninja_directive() - O = new /datum/objective(directive) //making it an objective so admins can reward the for completion - O.owner = Mind - Mind.objectives += O - - //add some RP-fluff - Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") - Mind.store_memory("Suprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") - Mind.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") - - //spawn the ninja and assign the candidate - Ninja = create_space_ninja(spawn_loc) - Mind.transfer_to(Ninja) - - //initialise equipment - Ninja.wear_suit:randomize_param() - Ninja.internal = Ninja.s_store - if(Ninja.internals) - Ninja.internals.icon_state = "internal1" - - if(Ninja.mind != Mind) //something has gone wrong! - ERROR("The ninja wasn't assigned the right mind. ;ç;") - - Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one - - success_spawn = 1 - -/* -This proc will give the ninja a directive to follow. They are not obligated to do so but it's a fun roleplay reminder. -Making this random or semi-random will probably not work without it also being incredibly silly. -As such, it's hard-coded for now. No reason for it not to be, really. -*/ -/datum/round_event/ninja/proc/generate_ninja_directive() - switch(rand(1,13)) - if(1) return "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible." - if(2) return "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible." - if(3) return "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible." - if(4) return "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice." - if(5) return "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them." - if(6) return "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter." - if(7) return "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation." - if(8) return "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter." - if(9) return "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation." - if(10) return "Our reputation is on the line. Harm as few civilians or innocents as possible." - if(11) return "Our honor is on the line. Utilize only honorable tactics when dealing with opponents." - if(12) return "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause." - else return "There are no special supplemental instructions at this time." - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+++++++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++ -======================================SPACE NINJA SETUP==================================== -___________________________________________________________________________________________ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -/* - README: - - Data: - - >> space_ninja.dm << is this file. It contains a variety of procs related to either spawning space ninjas, - modifying their verbs, various help procs, testing debug-related content, or storing unused procs for later. - Similar functions should go into this file, along with anything else that may not have an explicit category. - IMPORTANT: actual ninja suit, gloves, etc, are stored under the appropriate clothing files. If you need to change - variables or look them up, look there. Easiest way is through the map file browser. - - >> ninja_abilities.dm << contains all the ninja-related powers. Spawning energy swords, teleporting, and the like. - If more powers are added, or perhaps something related to powers, it should go there. Make sure to describe - what an ability/power does so it's easier to reference later without looking at the code. - IMPORTANT: verbs are still somewhat funky to work with. If an argument is specified but is not referenced in a way - BYOND likes, in the code content, the verb will fail to trigger. Nothing will happen, literally, when clicked. - This can be bypassed by either referencing the argument properly, or linking to another proc with the argument - attached. The latter is what I like to do for certain cases--sometimes it's necessary to do that regardless. - - >> ninja_equipment.dm << deals with all the equipment-related procs for a ninja. Primarily it has the suit, gloves, - and mask. The suit is by far the largest section of code out of the three and includes a lot of code that ties in - to other functions. This file has gotten kind of large so breaking it up may be in order. I use section hearders. - IMPORTANT: not much to say here. Follow along with the comments and adding new functions should be a breeze. Also - know that certain equipment pieces are linked in other files. The energy blade, for example, has special - functions defined in the appropriate files (airlock, securestorage, etc). - - General Notes: - - I created space ninjas with the expressed purpose of spicing up boring rounds. That is, ninjas are to xenos as marauders are to - death squads. Ninjas are stealthy, tech-savvy, and powerful. Not to say marauders are all of those things, but a clever ninja - should have little problem murderampaging their way through just about anything. Short of admin wizards maybe. - HOWEVER! - Ninjas also have a fairly great weakness as they require energy to use abilities. If, theoretically, there is a game - mode based around space ninjas, make sure to account for their energy needs. - - Admin Notes: - - Ninjas are not admin PCs--please do not use them for that purpose. They are another way to participate in the game post-death, - like pais, xenos, death squads, and cyborgs. - I'm currently looking for feedback from regular players since beta testing is largely done. I would appreciate if - you spawned regular players as ninjas when rounds are boring. Or exciting, it's all good as long as there is feedback. - You can also spawn ninja gear manually if you want to. - - How to do that: - Make sure your character has a mind. - Change their assigned_role to "MODE", no quotes. Otherwise, the suit won't initialize. - Change their special_role to "Space Ninja", no quotes. Otherwise, the character will be gibbed. - Spawn ninja gear, put it on, hit initialize. Let the suit do the rest. You are now a space ninja. - I don't recommend messing with suit variables unless you really know what you're doing. - - Miscellaneous Notes: - - Potential Upgrade Tree: - Energy Shield: - Extra Ability - Syndicate Shield device? - Works like the force wall spell, except can be kept indefinitely as long as energy remains. Toggled on or off. - Would block bullets and the like. - Phase Shift - Extra Ability - Advanced Sensors? - Instead of being unlocked at the start, Phase Shieft would become available once requirements are met. - Uranium-based Recharger: - Suit Upgrade - Unsure - Instead of losing energy each second, the suit would regain the same amount of energy. - This would not count in activating stealth and similar. - Extended Battery Life: - Suit Upgrade - Battery of higher capacity - Already implemented. Replace current battery with one of higher capacity. - Advanced Cloak-Tech device. - Suit Upgrade - Syndicate Cloaking Device? - Remove cloak failure rate. -*/ - - -//=======//CURRENT PLAYER VERB//=======// - -/client/proc/cmd_admin_ninjafy(var/mob/living/carbon/human/H in player_list) - set category = null - set name = "Make Space Ninja" - - if(!ticker) - alert("Wait until the game starts") - return - - if(!istype(H)) - return - - if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") - return - - log_admin("[key_name(src)] turned [H.key] into a Space Ninja.") - H.mind = create_ninja_mind(H.key) - H.mind_initialize() - H.equip_space_ninja(1) - if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - H.wear_suit:randomize_param() - spawn(0) - H.wear_suit:ninitialize(10,H) - -//=======//CURRENT GHOST VERB//=======// - -/client/proc/send_space_ninja() - set category = "Fun" - set name = "Spawn Space Ninja" - set desc = "Spawns a space ninja for when you need a teenager with attitude." - set popup_menu = 0 - - if(!holder) - src << "Only administrators may use this command." - return - if(!ticker.mode) - alert("The game hasn't started yet!") - return - if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No") - return - - var/mission = copytext(sanitize(input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", null) as text|null),1,MAX_MESSAGE_LEN) - - var/client/C = input("Pick character to spawn as the Space Ninja", "Key", "") as null|anything in clients - if(!C) - return - - var/datum/round_event/ninja/E = new /datum/round_event/ninja() - E.key=C.key - E.mission=mission - - message_admins("[key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.") - log_admin("[key] used Spawn Space Ninja.") - - return - -//=======//NINJA CREATION PROCS//=======// - -/proc/create_space_ninja(spawn_loc) - var/mob/living/carbon/human/new_ninja = new(spawn_loc) - if(prob(50)) new_ninja.gender = "female" - var/datum/preferences/A = new()//Randomize appearance for the ninja. - A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]" - A.copy_to(new_ninja) - ready_dna(new_ninja) - new_ninja.equip_space_ninja() - return new_ninja - -/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters. - if(safety) - qdel(w_uniform) - qdel(wear_suit) - qdel(wear_mask) - qdel(head) - qdel(shoes) - qdel(gloves) - - var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src) - equip_to_slot_or_del(R, slot_ears) - equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform) - equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes) - equip_to_slot_or_del(new /obj/item/clothing/suit/space/space_ninja(src), slot_wear_suit) - equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves) - equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head) - equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask) - equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses) - equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt) - equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_r_store) - equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store) - equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store) - equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back) - - var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src) - E.imp_in = src - E.implanted = 1 - E.implanted(src) - return 1 - -//=======//HELPER PROCS//=======// - -//Randomizes suit parameters. -/obj/item/clothing/suit/space/space_ninja/proc/randomize_param() - s_cost = rand(1,20) - s_acost = rand(20,100) - k_cost = rand(100,500) - k_damage = rand(1,20) - s_delay = rand(10,100) - s_bombs = rand(5,20) - a_boost = rand(1,7) - -//This proc prevents the suit from being taken off. -/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/U, X = 0) - if(X)//If you want to check for icons. - icon_state = U.gender==FEMALE ? "s-ninjanf" : "s-ninjan" - U:gloves.icon_state = "s-ninjan" - U:gloves.item_state = "s-ninjan" - else - if(U.mind.special_role!="Space Ninja") - U << "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR..." - U.gib() - return 0 - if(!istype(U:head, /obj/item/clothing/head/helmet/space/space_ninja)) - U << "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING..." - return 0 - if(!istype(U:shoes, /obj/item/clothing/shoes/space_ninja)) - U << "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING..." - return 0 - if(!istype(U:gloves, /obj/item/clothing/gloves/space_ninja)) - U << "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING..." - return 0 - - affecting = U - flags |= NODROP //colons make me go all |= - slowdown = 0 - n_hood = U:head - n_hood.flags |= NODROP - n_shoes = U:shoes - n_shoes.flags |= NODROP - n_shoes.slowdown-- - n_gloves = U:gloves - n_gloves.flags |= NODROP - - return 1 - -//This proc allows the suit to be taken off. -/obj/item/clothing/suit/space/space_ninja/proc/unlock_suit() - affecting = null - flags &= ~NODROP - slowdown = 1 - icon_state = "s-ninja" - if(n_hood)//Should be attached, might not be attached. - n_hood.flags &= ~NODROP - if(n_shoes) - n_shoes.flags &= ~NODROP - n_shoes.slowdown++ - if(n_gloves) - n_gloves.icon_state = "s-ninja" - n_gloves.item_state = "s-ninja" - n_gloves.flags &= ~NODROP - n_gloves.candrain=0 - n_gloves.draining=0 - -//Allows the mob to grab a stealth icon. -/mob/proc/NinjaStealthActive(atom/A)//A is the atom which we are using as the overlay. - invisibility = INVISIBILITY_LEVEL_TWO//Set ninja invis to 2. - var/icon/opacity_icon = new(A.icon, A.icon_state) - var/icon/alpha_mask = getIconMask(src) - var/icon/alpha_mask_2 = new('icons/effects/effects.dmi', "at_shield1") - alpha_mask.AddAlphaMask(alpha_mask_2) - opacity_icon.AddAlphaMask(alpha_mask) - for(var/i=0,i<5,i++)//And now we add it as overlays. It's faster than creating an icon and then merging it. - var/image/I = image("icon" = opacity_icon, "icon_state" = A.icon_state, "layer" = layer+0.8)//So it's above other stuff but below weapons and the like. - switch(i)//Now to determine offset so the result is somewhat blurred. - if(1) - I.pixel_x -= 1 - if(2) - I.pixel_x += 1 - if(3) - I.pixel_y -= 1 - if(4) - I.pixel_y += 1 - - overlays += I//And finally add the overlay. - overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9) - -//When ninja steal malfunctions. -/mob/proc/NinjaStealthMalf() - invisibility = 0//Set ninja invis to 0. - overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9) - playsound(loc, 'sound/effects/stealthoff.ogg', 75, 1) - -//=======//GENERIC VERB MODIFIERS//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs() - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init - verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit - verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros - verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth - n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled - - s_initialized = 1 - -/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/init - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth - if(n_gloves) - n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled - - s_initialized = 0 - -/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjablade - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet - - s_initialized=1 - slowdown=0 - -/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs() - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet - -//=======//KAMIKAZE VERBS//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U) - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet - - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage - - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth - - kamikaze = 1 - - icon_state = U.gender==FEMALE ? "s-ninjakf" : "s-ninjak" - if(n_gloves) - n_gloves.icon_state = "s-ninjak" - n_gloves.item_state = "s-ninjak" - n_gloves.candrain = 0 - n_gloves.draining = 0 - n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled - - cancel_stealth() - - U << browse(null, "window=spideros") - U << "Do or Die, LET'S ROCK!!" - -/obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U) - if(kamikaze) - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet - - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage - - verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth - if(n_gloves) - n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled - - U.incorporeal_move = 0 - kamikaze = 0 - k_unlock = 0 - U << "Disengaging mode...\nCODE NAME: KAMIKAZE" - -//=======//AI VERBS//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control - - s_busy = 0 - s_control = 0 - -/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs() - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja - verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control - - s_control = 1 - - -//Alternate ninja speech replacement. -/*This text is hilarious but also absolutely retarded. -message = replacetext(message, "l", "r") -message = replacetext(message, "rr", "ru") -message = replacetext(message, "v", "b") -message = replacetext(message, "f", "hu") -message = replacetext(message, "'t", "") -message = replacetext(message, "t ", "to ") -message = replacetext(message, " I ", " ai ") -message = replacetext(message, "th", "z") -message = replacetext(message, "ish", "isu") -message = replacetext(message, "is", "izu") -message = replacetext(message, "ziz", "zis") -message = replacetext(message, "se", "su") -message = replacetext(message, "br", "bur") -message = replacetext(message, "ry", "ri") -message = replacetext(message, "you", "yuu") -message = replacetext(message, "ck", "cku") -message = replacetext(message, "eu", "uu") -message = replacetext(message, "ow", "au") -message = replacetext(message, "are", "aa") -message = replacetext(message, "ay", "ayu") -message = replacetext(message, "ea", "ii") -message = replacetext(message, "ch", "chi") -message = replacetext(message, "than", "sen") -message = replacetext(message, ".", "") -message = lowertext(message) -*/ - - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++ -==================================SPACE NINJA ABILITIES==================================== -___________________________________________________________________________________________ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -//=======//SAFETY CHECK//=======// -/* -X is optional, tells the proc to check for specific stuff. C is also optional. -All the procs here assume that the character is wearing the ninja suit if they are using the procs. -They should, as I have made every effort for that to be the case. -In the case that they are not, I imagine the game will run-time error like crazy. -s_cooldown ticks off each second based on the suit recharge proc, in seconds. Default of 1 seconds. Some abilities have no cool down. -*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(C = 0,X = 0) - var/mob/living/carbon/human/U = affecting - if( (U.stat||U.incorporeal_move)&&X!=3 )//Will not return if user is using an adrenaline booster since you can use them when stat==1. - U << "You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die. - return 1 - else if(C&&cell.chargeNot enough energy." - return 1 - switch(X) - if(1) - cancel_stealth()//Get rid of it. - if(2) - if(s_bombs<=0) - U << "There are no more smoke bombs remaining." - return 1 - if(3) - if(a_boost<=0) - U << "You do not have any more adrenaline boosters." - return 1 - return (s_coold)//Returns the value of the variable which counts down to zero. - -//=======//TELEPORT GRAB CHECK//=======// -/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/U) - if(istype(U.get_active_hand(),/obj/item/weapon/grab))//Handles grabbed persons. - var/obj/item/weapon/grab/G = U.get_active_hand() - G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position. - if(istype(U.get_inactive_hand(),/obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = U.get_inactive_hand() - G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position. - return - -//=======//SMOKE//=======// -/*Summons smoke in radius of user. -Not sure why this would be useful (it's not) but whatever. Ninjas need their smoke bombs.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke() - set name = "Smoke Bomb" - set desc = "Blind your enemies momentarily with a well-placed smoke bomb." - set category = "Ninja Ability" - set popup_menu = 0//Will not see it when right clicking. - - if(!ninjacost(,2)) - var/mob/living/carbon/human/U = affecting - U << "There are [s_bombs] smoke bombs remaining." - var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() - smoke.set_up(10, 0, U.loc) - smoke.start() - playsound(U.loc, 'sound/effects/bamf.ogg', 50, 2) - s_bombs-- - s_coold = 1 - return - -//=======//9-8 TILE TELEPORT//=======// -//Click to to teleport 9-10 tiles in direction facing. -/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt() - set name = "Phase Jaunt (10E)" - set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 100 - if(!ninjacost(C,1)) - var/mob/living/carbon/human/U = affecting - var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1) - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc. - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - handle_teleport_grab(destination, U) - U.loc = destination - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - spawn(0) - destination.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf - s_coold = 1 - cell.charge-=(C*10) - else - U << "The VOID-shift device is malfunctioning, teleportation failed." - return - -//=======//RIGHT CLICK TELEPORT//=======// -//Right click to teleport somewhere, almost exactly like admin jump to turf. -/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview()) - set name = "Phase Shift (20E)" - set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view." - set category = null//So it does not show up on the panel but can still be right-clicked. - set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide! - - var/C = 200 - if(!ninjacost(C,1)) - var/mob/living/carbon/human/U = affecting - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - if((!T.density)&&istype(mobloc, /turf)) - spawn(0) - playsound(U.loc, 'sound/effects/sparks4.ogg', 50, 1) - anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - handle_teleport_grab(T, U) - U.loc = T - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - spawn(0)//Any living mobs in teleport area are gibbed. - T.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf - s_coold = 1 - cell.charge-=(C*10) - else - U << "You cannot teleport into solid walls or from solid matter" - return - -//=======//EM PULSE//=======// -//Disables nearby tech equipment. -/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse() - set name = "EM Burst (25E)" - set desc = "Disable any nearby technology with a electro-magnetic pulse." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 250 - if(!ninjacost(C,1)) - var/mob/living/carbon/human/U = affecting - playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2) - empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch. - s_coold = 2 - cell.charge-=(C*10) - return - -//=======//ENERGY BLADE//=======// -//Summons a blade of energy in active hand. -/obj/item/clothing/suit/space/space_ninja/proc/ninjablade() - set name = "Energy Blade (5E)" - set desc = "Create a focused beam of energy in your active hand." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 50 - if(!ninjacost(C)) - var/mob/living/carbon/human/U = affecting - if(!kamikaze) - if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade)) - var/obj/item/weapon/melee/energy/blade/W = new() - spark_system.start() - playsound(U.loc, "sparks", 50, 1) - U.put_in_hands(W) - cell.charge-=(C*10) - else - U << "You can only summon one blade. Try dropping an item first." - else//Else you can run around with TWO energy blades. I don't know why you'd want to but cool factor remains. - if(!U.get_active_hand()) - var/obj/item/weapon/melee/energy/blade/W = new() - U.put_in_hands(W) - if(!U.get_inactive_hand()) - var/obj/item/weapon/melee/energy/blade/W = new() - U.put_in_inactive_hand(W) - spark_system.start() - playsound(U.loc, "sparks", 50, 1) - s_coold = 1 - return - -//=======//NINJA STARS//=======// -/*Shoots ninja stars at random people. -This could be a lot better but I'm too tired atm.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjastar() - set name = "Energy Star (5E)" - set desc = "Launches an energy star at a random living target." - set category = "Ninja Ability" - set popup_menu = 0 - - var/C = 50 - if(!ninjacost(C)) - var/mob/living/carbon/human/U = affecting - var/targets[] = list()//So yo can shoot while yo throw dawg - for(var/mob/living/M in oview(loc)) - if(M.stat) continue//Doesn't target corpses or paralyzed persons. - targets.Add(M) - if(targets.len) - var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at. - - var/turf/curloc = U.loc - var/atom/targloc = get_turf(target) - if (!targloc || !istype(targloc, /turf) || !curloc) - return - if (targloc == curloc) - return - var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(U.loc) - A.current = curloc - A.yo = targloc.y - curloc.y - A.xo = targloc.x - curloc.x - cell.charge-=(C*10) - A.fire() - else - U << "There are no targets in view." - return - -//=======//ENERGY NET//=======// -/*Allows the ninja to capture people, I guess. -Must right click on a mob to activate.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs. - set name = "Energy Net (20E)" - set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds." - set category = null - set src = usr.contents - - var/C = 200 - if(!ninjacost(C,1)&&iscarbon(M)) - var/mob/living/carbon/human/U = affecting - if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame. - //if(M)//DEBUG - if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net. - for(var/turf/T in getline(U.loc, M.loc)) - if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy. - U << "You may not use an energy net through solid obstacles!" - return - spawn(0) - U.Beam(M,"n_beam",,15) - M.anchored = 1//Anchors them so they can't move. - U.say("Get over here!") - var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc) - E.layer = M.layer+1//To have it appear one layer above the mob. - for(var/mob/O in viewers(U, 3)) - O.show_message(text("[] caught [] with an energy net!", U, M), 1) - E.affecting = M - E.master = U - spawn(0)//Parallel processing. - E.process(M) - cell.charge-=(C*10) - else - U << "They are already trapped inside an energy net." - else - U << "They will bring no honor to your Clan!" - return - -//=======//ADRENALINE BOOST//=======// -/*Wakes the user so they are able to do their thing. Also injects a decent dose of radium. -Movement impairing would indicate drugs and the like.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost() - set name = "Adrenaline Boost" - set desc = "Inject a secret chemical that will counteract all movement-impairing effect." - set category = "Ninja Ability" - set popup_menu = 0 - - if(!ninjacost(,3))//Have to make sure stat is not counted for this ability. - var/mob/living/carbon/human/U = affecting - //Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly. - //For now, adrenaline boosters ARE the miracle injection. Well, radium, really. - U.SetParalysis(0) - U.SetStunned(0) - U.SetWeakened(0) - /* - Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat. - This lead to me and others spamming adrenaline boosters because they failed to kick in on time. - It's technically possible to come back from crit with this but it is very temporary. - Life.dm will kick the player back into unconsciosness the next process loop. - */ - U.stat = 0//At least now you should be able to teleport away or shoot ninja stars. - spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up. - U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!")) - spawn(70) - reagents.reaction(U, 2) - reagents.trans_id_to(U, "radium", a_transfer) - U << "You are beginning to feel the after-effect of the injection." - a_boost-- - s_coold = 3 - return - -/* -=================================================================================== -<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -=================================================================================== -Or otherwise known as anime mode. Which also happens to be ridiculously powerful. -*/ - -//=======//NINJA MOVEMENT//=======// -//Also makes you move like you're on crack. -/obj/item/clothing/suit/space/space_ninja/proc/ninjawalk() - set name = "Shadow Walk" - set desc = "Combines the VOID-shift and CLOAK-tech devices to freely move between solid matter. Toggle on or off." - set category = "Ninja Ability" - set popup_menu = 0 - - var/mob/living/carbon/human/U = affecting - if(!U.incorporeal_move) - U.incorporeal_move = 2 - U << "You will now phase through solid matter." - else - U.incorporeal_move = 0 - U << "You will no-longer phase through solid matter." - return - -//=======//5 TILE TELEPORT/GIB//=======// -//Allows to kill up to five squares in a straight line. Seriously. -/obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer() - set name = "Phase Slayer" - set desc = "Utilizes the internal VOID-shift device to kill all creatures in a straight line." - set category = "Ninja Ability" - set popup_menu = 0 - - if(!ninjacost()) - var/mob/living/carbon/human/U = affecting - var/turf/destination = get_teleport_loc(U.loc,U,5) - var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below. - if(destination&&istype(mobloc, /turf)) - U.say("Ai Satsugai!") - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - spawn(0) - for(var/turf/T in getline(mobloc, destination)) - spawn(0) - T.phase_damage_creatures(190,U) - if(T==mobloc||T==destination) continue - spawn(0) - anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - - handle_teleport_grab(destination, U) - U.loc = destination - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - s_coold = 1 - else - U << "The VOID-shift device is malfunctioning, teleportation failed." - return - -//=======//TELEPORT BEHIND MOB//=======// -/*Appear behind a randomly chosen mob while a few decoy teleports appear. -This is so anime it hurts. But that's the point.*/ -/obj/item/clothing/suit/space/space_ninja/proc/ninjamirage() - set name = "Spider Mirage" - set desc = "Utilizes the internal VOID-shift device to create decoys and teleport behind a random target." - set category = "Ninja Ability" - set popup_menu = 0 - - if(!ninjacost())//Simply checks for stat. - var/mob/living/carbon/human/U = affecting - var/targets[] - targets = new() - for(var/mob/living/M in oview(6)) - if(M.stat) continue//Doesn't target corpses or paralyzed people. - targets.Add(M) - if(targets.len) - var/mob/living/target=pick(targets) - var/locx - var/locy - var/turf/mobloc = get_turf(target.loc) - var/safety = 0 - switch(target.dir) - if(NORTH) - locx = mobloc.x - locy = (mobloc.y-1) - if(locy<1) - safety = 1 - if(SOUTH) - locx = mobloc.x - locy = (mobloc.y+1) - if(locy>world.maxy) - safety = 1 - if(EAST) - locy = mobloc.y - locx = (mobloc.x-1) - if(locx<1) - safety = 1 - if(WEST) - locy = mobloc.y - locx = (mobloc.x+1) - if(locx>world.maxx) - safety = 1 - else safety=1 - if(!safety&&istype(mobloc, /turf)) - U.say("Kumo no Shinkiro!") - var/turf/picked = locate(locx,locy,mobloc.z) - spawn(0) - playsound(U.loc, "sparks", 50, 1) - anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir) - - spawn(0) - var/limit = 4 - for(var/turf/T in oview(5)) - if(prob(20)) - spawn(0) - anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - limit-- - if(limit<=0) break - - handle_teleport_grab(picked, U) - U.loc = picked - U.dir = target.dir - - spawn(0) - spark_system.start() - playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(U.loc, "sparks", 50, 1) - anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir) - s_coold = 1 - else - U << "The VOID-shift device is malfunctioning, teleportation failed." - else - U << "There are no targets in view." - return - - -//For the love of god,space out your code! This is a nightmare to read. - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++ -===================================SPACE NINJA EQUIPMENT=================================== -___________________________________________________________________________________________ -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -/* -=================================================================================== -<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -=================================================================================== -*/ - -//=======//NEW AND DEL//=======// - -/obj/item/clothing/suit/space/space_ninja/New() - ..() - verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs - verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo - //verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work. - spark_system = new()//spark initialize - spark_system.set_up(5, 0, src) - spark_system.attach(src) - stored_research = new()//Stolen research initialize. - for(var/T in typesof(/datum/tech) - /datum/tech)//Store up on research. - stored_research += new T(src) - var/reagent_amount//reagent initialize - for(var/reagent_id in reagent_list) - reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject radium directly. - reagents = new(reagent_amount) - reagents.my_atom = src - for(var/reagent_id in reagent_list) - reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting. - cell = new/obj/item/weapon/stock_parts/cell/high//The suit should *always* have a battery because so many things rely on it. - cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging. - NAI = new(src) //ninja intellicard - -/obj/item/clothing/suit/space/space_ninja/Destroy() - if(affecting)//To make sure the window is closed. - affecting << browse(null, "window=hack spideros") - if(AI)//If there are AIs present when the ninja kicks the bucket. - killai(NAI) - if(hologram)//If there is a hologram - qdel(hologram.i_attached)//Delete it and the attached image. - qdel(hologram) - ..() - -//Simply deletes all the attachments and self, killing all related procs. -/obj/item/clothing/suit/space/space_ninja/proc/terminate() - qdel(n_hood) - qdel(n_gloves) - qdel(n_shoes) - qdel(src) - - - -/obj/item/clothing/suit/space/space_ninja/proc/killai(var/obj/item/device/aicard/NAI) - for(var/mob/living/silicon/ai/A in src) - if(A.client) - A << "Self-erase protocol dete-- *bzzzzz*" - A << browse(null, "window=hack spideros") - NAI.flush = 1 - return - - - -//=======//SUIT VERBS//=======// -//Verbs link to procs because verb-like procs have a bug which prevents their use if the arguments are not readily referenced. - -/obj/item/clothing/suit/space/space_ninja/proc/init() - set name = "Initialize Suit" - set desc = "Initializes the suit for field operation." - set category = "Ninja Equip" - - ninitialize() - return - -/obj/item/clothing/suit/space/space_ninja/proc/deinit() - set name = "De-Initialize Suit" - set desc = "Begins procedure to remove the suit." - set category = "Ninja Equip" - - if(s_control&&!s_busy) - deinitialize() - else - affecting << "The function did not trigger!" - return - -/obj/item/clothing/suit/space/space_ninja/proc/spideros() - set name = "Display SpiderOS" - set desc = "Utilize built-in computer system." - set category = "Ninja Equip" - - if(s_control&&!s_busy&&!kamikaze) - display_spideros() - else - affecting << "The interface is locked!" - return - -/obj/item/clothing/suit/space/space_ninja/proc/stealth() - set name = "Toggle Stealth" - set desc = "Utilize the internal CLOAK-tech device to activate or deactivate stealth-camo." - set category = "Ninja Equip" - - if(s_control&&!s_busy) - toggle_stealth() - else - affecting << "Stealth does not appear to work!" - return - -//=======//PROCESS PROCS//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting) - set background = BACKGROUND_ENABLED - - //Runs in the background while the suit is initialized. - spawn while(cell.charge>=0) - - //Let's check for some safeties. - if(s_initialized&&!affecting) terminate()//Kills the suit and attached objects. - if(!s_initialized) return//When turned off the proc stops. - for(var/mob/living/silicon/ai/A in NAI) - if(A&&A.stat==2)//If there is an AI and it's ded. Shouldn't happen without purging, could happen. - if(!s_control) - ai_return_control()//Return control to ninja if the AI was previously in control. - - //Now let's do the normal processing. - if(s_coold) s_coold--//Checks for ability s_cooldown first. - var/A = s_cost//s_cost is the default energy cost each ntick, usually 5. - if(!kamikaze) - if(blade_check(U))//If there is a blade held in hand. - A += s_acost - if(s_active)//If stealth is active. - A += s_acost - else - if(prob(s_delay))//Suit delay is used as probability. May change later. - U.adjustBruteLoss(k_damage)//Default damage done, usually 1. - A = k_cost//kamikaze cost. - cell.charge-=A - if(cell.charge<=0) - if(kamikaze) - U.say("I DIE TO LIVE AGAIN!") - U << browse(null, "window=spideros")//Just in case. - U.death() - return - cell.charge=0 - cancel_stealth() - sleep(10)//Checks every second. - -//=======//INITIALIZE//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc) - if(U.mind && U.mind.assigned_role=="MODE" && !s_initialized && !s_busy)//Shouldn't be busy... but anything is possible I guess. - s_busy = 1 - for(var/i,i<7,i++) - switch(i) - if(0) - U << "Now initializing..." - if(1) - if(!lock_suit(U))//To lock the suit onto wearer. - break - U << "Securing external locking mechanism...\nNeural-net established." - if(2) - U << "Extending neural-net interface...\nNow monitoring brain wave pattern..." - if(3) - if(U.stat==2||U.health<=0) - U << "FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG..." - unlock_suit() - break - lock_suit(U,1)//Check for icons. - U.regenerate_icons() - U << " Linking neural-net interface...\nPattern\green GREEN, continuing operation." - if(4) - U << "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE." - if(5) - U << "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge]." - if(6) - U << "All systems operational. Welcome to SpiderOS, [U.real_name]." - grant_ninja_verbs() - grant_equip_verbs() - ntick() - sleep(delay) - s_busy = 0 - else - if(!U.mind||U.mind.assigned_role!="MODE")//Your run of the mill persons shouldn't know what it is. Or how to turn it on. - U << "You do not understand how this suit functions. Where the heck did it even come from?" - else if(s_initialized) - U << "The suit is already functioning. Please report this bug." - else - U << "ERROR: You cannot use this function at this time." - return - -//=======//DEINITIALIZE//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay) - if(affecting==loc&&!s_busy) - var/mob/living/carbon/human/U = affecting - if(!s_initialized) - U << "The suit is not initialized. Please report this bug." - return - if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No") - return - if(s_busy || NAI.flush) - U << "ERROR: You cannot use this function at this time." - return - s_busy = 1 - for(var/i = 0,i<7,i++) - switch(i) - if(0) - U << "Now de-initializing..." - remove_kamikaze(U)//Shutdowns kamikaze. - spideros = 0//Spideros resets. - if(1) - U << "Logging off, [U:real_name]. Shutting down SpiderOS." - remove_ninja_verbs() - if(2) - U << "Primary system status: OFFLINE.\nBackup system status: OFFLINE." - if(3) - U << "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE." - cancel_stealth()//Shutdowns stealth. - if(4) - U << "Disconnecting neural-net interface...\greenSuccess." - if(5) - U << "Disengaging neural-net interface...\greenSuccess." - if(6) - U << "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED." - blade_check(U,2) - remove_equip_verbs() - unlock_suit() - U.regenerate_icons() - sleep(delay) - s_busy = 0 - return - -//=======//SPIDEROS PROC//=======// - -/obj/item/clothing/suit/space/space_ninja/proc/display_spideros() - if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable. - var/mob/living/carbon/human/U = affecting - var/mob/living/silicon/ai/A = AI - var/display_to = s_control ? U : A//Who do we want to display certain messages to? - - var/dat = "SpiderOS" - dat += " Refresh" - if(spideros) - dat += " | Return" - dat += " | Close" - dat += "
" - if(s_control) - dat += "

SpiderOS v.1.337

" - dat += "Welcome, [U.real_name].
" - else - dat += "

SpiderOS v.ERR-RR00123

" - dat += "
" - dat += " Current Time: [worldtime2text()]
" - dat += " Battery Life: [round(cell.charge/100)]%
" - dat += " Smoke Bombs: \Roman [s_bombs]
" - dat += " pai Device: " - if(pai) - dat += "Configure" - dat += " | " - dat += "Eject" - else - dat += "None Detected" - dat += "

" - - switch(spideros) - if(0) - dat += "

Available Functions:

" - dat += "" - if(3) - dat += "

Medical Report:

" - if(U.dna) - dat += "Fingerprints: [md5(U.dna.uni_identity)]
" - dat += "Unique identity: [U.dna.unique_enzymes]
" - dat += "

Overall Status: [U.stat > 1 ? "dead" : "[U.health]% healthy"]

" - dat += "

Nutrition Status: [U.nutrition]

" - dat += "Oxygen loss: [U.getOxyLoss()]" - dat += " | Toxin levels: [U.getToxLoss()]
" - dat += "Burn severity: [U.getFireLoss()]" - dat += " | Brute trauma: [U.getBruteLoss()]
" - dat += "Radiation Level: [U.radiation] rad
" - dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F)
" - - for(var/datum/disease/D in U.viruses) - dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread_text]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure_text].
" - dat += "" - if(1) - dat += "

Atmospheric Scan:

"//Headers don't need breaks. They are automatically placed. - var/turf/T = get_turf(U.loc) - if (isnull(T)) - dat += "Unable to obtain a reading." - else - var/datum/gas_mixture/environment = T.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles() - - dat += "Air Pressure: [round(pressure,0.1)] kPa" - - if (total_moles) - var/o2_level = environment.oxygen/total_moles - var/n2_level = environment.nitrogen/total_moles - var/co2_level = environment.carbon_dioxide/total_moles - var/plasma_level = environment.toxins/total_moles - var/unknown_level = 1-(o2_level+n2_level+co2_level+plasma_level) - dat += "
    " - dat += "
  • Nitrogen: [round(n2_level*100)]%
  • " - dat += "
  • Oxygen: [round(o2_level*100)]%
  • " - dat += "
  • Carbon Dioxide: [round(co2_level*100)]%
  • " - dat += "
  • Plasma: [round(plasma_level*100)]%
  • " - dat += "
" - if(unknown_level > 0.01) - dat += "OTHER: [round(unknown_level)]%
" - - dat += "Temperature: [round(environment.temperature-T0C)]°C" - if(2) - if(k_unlock==7||!s_control) - dat += " Hidden Menu" - dat += "

Anonymous Messenger:

"//Anonymous because the receiver will not know the sender's identity. - dat += "

Detected PDAs:

" - dat += "
    " - var/count = 0 - for (var/obj/item/device/pda/P in get_viewable_pdas()) - dat += "
  • [P]" - dat += "
  • " - count++ - dat += "
" - if (count == 0) - dat += "None detected.
" - if(32) - dat += "

Hidden Menu:

" - if(s_control) - dat += "Please input password: " - dat += "HERE
" - dat += "
" - dat += "Remember, you will not be able to recharge energy during this function. If energy runs out, the suit will auto self-destruct.
" - dat += "Use with caution. De-initialize the suit when energy is low." - else - //Only leaving this in for funnays. CAN'T LET YOU DO THAT STAR FOX - dat += "WARNING: Hostile runtime intrusion detected: operation locked. The Spider Clan is watching you, INTRUDER." - dat += "ERROR: TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive.
" - if(4) - dat += {" -

Ninja Manual:

-
Who they are:
- Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should.
Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims.
Whatever the case, their technology is absolutely superb. -
How they relate to other SS13 organizations:
-
    -
  • *Nanotrasen and the Syndicate are two sides of the same coin and that coin is valuable.
  • -
  • *The Space Wizard Federation is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.
  • -
  • *Changeling Hivemind: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.
  • -
  • *Xeno Hivemind: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.
  • -
-
The reason they (you) are here:
- Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business. -
Their playstyle:
- A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission.
It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others.
With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja. -
Their powers:
- There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them. - Equipment: cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled). -
    -
  • Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
  • -
  • Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
  • -
  • Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
  • -
  • On-board AI: The suit is able to download an AI much like an intellicard. Check with SpiderOS for details once downloaded.
  • -
  • SpiderOS is a specialized, PDA-like screen that allows for a small variety of functions, such as injecting healing chemicals directly from the suit. You are using it now, if that was not already obvious. You may also download AI modules directly to the OS.
  • -
- Abilities: -