From f552ab1b7f9d6e4a0e82ab7ba883566a3e7c5204 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 15:51:47 -0600 Subject: [PATCH 01/23] Prevents toy chainsaws from stunning people when used. --- code/game/objects/items/weapons/twohanded.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 49c1b25f2a1..3beb535b70f 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -357,6 +357,7 @@ sharp = 1 edge = 1 no_embed = 1 + var/isrealchainsaw = 1 /obj/item/weapon/twohanded/chainsaw/update_icon() if(wielded) @@ -373,7 +374,8 @@ if(!isliving(target)) return else - target.Weaken(4) + if(isrealchainsaw == 1) + target.Weaken(4) ..() return else From c688479e614cc3264afbeca7ba04b0c53a5251a0 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 15:53:39 -0600 Subject: [PATCH 02/23] Toy chainsaw! --- code/game/objects/items/toys.dm | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f52de29785b..58958c9d989 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -18,6 +18,7 @@ * Foam armblade * Mini Gibber * Toy xeno + * Toy chainsaws */ @@ -1413,4 +1414,26 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/russian_revolver/proc/spin_cylinder() - bullet_position = rand(1,6) \ No newline at end of file + bullet_position = rand(1,6) + +/* + * Rubber Chainsaw + */ + +/obj/item/weapon/twohanded/chainsaw/rubber + name = "Rubber Chainsaw" + desc = "A toy chainsaw with a rubber edge. Ages 8 and up" + force = 0 + throwforce = 0 + throw_speed = 4 + throw_range = 20 + force_unwielded = 0 + force_wielded = 0 + sharp = 0 + edge = 0 + origin_tech = null + isrealchainsaw = 0 + +/obj/item/weapon/twohanded/chainsaw/rubber/wield() + ..() + flags &= ~NODROP From f8f8f95fbe9e3771ebd85d7126389b8ba9afafff Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 15:55:20 -0600 Subject: [PATCH 03/23] Prevents toy chainsaws from making dead people into meat. --- code/modules/mob/living/carbon/human/human_defense.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 56d197e3b88..9faba9e271b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -189,7 +189,7 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM) + if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw) || !istype(I, /obj/item/weapon/twohanded/chainsaw/rubber)) && src.stat == DEAD && user.a_intent == I_HARM) var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc)) newmeat.name = src.real_name + newmeat.name newmeat.subjectname = src.real_name @@ -477,4 +477,4 @@ emp_act /mob/living/carbon/human/water_act(volume, temperature, source) ..() if(temperature >= 330) bodytemperature = bodytemperature + (temperature - bodytemperature) - if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) \ No newline at end of file + if(temperature <= 280) bodytemperature = bodytemperature - (bodytemperature - temperature) From 2e1e0ee3ea3b184330fa7697f372c666597e0463 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 16:20:05 -0600 Subject: [PATCH 04/23] Use an istype statement rather than a new variable. --- code/game/objects/items/weapons/twohanded.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 3beb535b70f..d4618ff1df6 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -357,7 +357,6 @@ sharp = 1 edge = 1 no_embed = 1 - var/isrealchainsaw = 1 /obj/item/weapon/twohanded/chainsaw/update_icon() if(wielded) @@ -374,7 +373,7 @@ if(!isliving(target)) return else - if(isrealchainsaw == 1) + if(!istype(src, /obj/item/weapon/twohanded/chainsaw/rubber)) target.Weaken(4) ..() return From 38072c2372b9e8c4728d07689136be9e56c5f8ca Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 16:20:48 -0600 Subject: [PATCH 05/23] Removes the now nonexistant variable from toy chainsaws. --- code/game/objects/items/toys.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 58958c9d989..50b47a6d496 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1432,7 +1432,6 @@ obj/item/toy/cards/deck/syndicate/black sharp = 0 edge = 0 origin_tech = null - isrealchainsaw = 0 /obj/item/weapon/twohanded/chainsaw/rubber/wield() ..() From 8192127aec204638379f5e5323097c149170703a Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:04:53 -0600 Subject: [PATCH 06/23] Removes the istype() statement from chainsaws. --- code/game/objects/items/weapons/twohanded.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index d4618ff1df6..49c1b25f2a1 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -373,8 +373,7 @@ if(!isliving(target)) return else - if(!istype(src, /obj/item/weapon/twohanded/chainsaw/rubber)) - target.Weaken(4) + target.Weaken(4) ..() return else From 8a9908e6dbda8e54ae2231d2882f8611921342d5 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:05:18 -0600 Subject: [PATCH 07/23] Makes toy chainsaws into their own base. --- code/game/objects/items/toys.dm | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 50b47a6d496..04702c8a888 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1419,20 +1419,29 @@ obj/item/toy/cards/deck/syndicate/black /* * Rubber Chainsaw */ - -/obj/item/weapon/twohanded/chainsaw/rubber - name = "Rubber Chainsaw" +/obj/item/weapon/twohanded/toy/chainsaw + name = "Toy Chainsaw" desc = "A toy chainsaw with a rubber edge. Ages 8 and up" + icon_state = "chainsaw0" force = 0 throwforce = 0 throw_speed = 4 throw_range = 20 - force_unwielded = 0 - force_wielded = 0 - sharp = 0 - edge = 0 - origin_tech = null + wieldsound = 'sound/weapons/chainsawstart.ogg' + attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") + +obj/item/weapon/twohanded/toy/chainsaw/update_icon() + if(wielded) + icon_state = "chainsaw[wielded]" + else + icon_state = "chainsaw0" -/obj/item/weapon/twohanded/chainsaw/rubber/wield() - ..() - flags &= ~NODROP +/obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob) + if(wielded) + playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) + ..() + return + else + playsound(loc, "swing_hit", 50, 1, -1) + ..() + return From df882e5d4b6625972c53d1ee6ac0012daba09bf1 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:06:48 -0600 Subject: [PATCH 08/23] Removes the toy chainsaw statement from human_defense. --- code/modules/mob/living/carbon/human/human_defense.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 9faba9e271b..1ea23ebf53a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -189,7 +189,7 @@ emp_act /mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone) if(!I || !user) return 0 - if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw) || !istype(I, /obj/item/weapon/twohanded/chainsaw/rubber)) && src.stat == DEAD && user.a_intent == I_HARM) + if((istype(I, /obj/item/weapon/butch/meatcleaver) || istype(I, /obj/item/weapon/twohanded/chainsaw)) && src.stat == DEAD && user.a_intent == I_HARM) var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new /obj/item/weapon/reagent_containers/food/snacks/meat/human(get_turf(src.loc)) newmeat.name = src.real_name + newmeat.name newmeat.subjectname = src.real_name From 51d874fb8fcf36bec170fd2b13a81f0fb60ec114 Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:11:36 -0600 Subject: [PATCH 09/23] D'OH. --- code/game/objects/items/toys.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 04702c8a888..d3f9b7ce009 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1430,7 +1430,7 @@ obj/item/toy/cards/deck/syndicate/black wieldsound = 'sound/weapons/chainsawstart.ogg' attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") -obj/item/weapon/twohanded/toy/chainsaw/update_icon() +/obj/item/weapon/twohanded/toy/chainsaw/update_icon() if(wielded) icon_state = "chainsaw[wielded]" else From 20822be0cb707d1c1d6348185738454131f3398d Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:15:45 -0600 Subject: [PATCH 10/23] Makes code smaller. --- code/game/objects/items/toys.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index d3f9b7ce009..01490b37164 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1439,9 +1439,8 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob) if(wielded) playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) - ..() return else playsound(loc, "swing_hit", 50, 1, -1) - ..() + ..() return From 2365949a69ca168a9e44095b1f26eb4b23a5757e Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 10 Nov 2015 19:19:29 -0600 Subject: [PATCH 11/23] FIXFIXFIXFIXFIXAHHHHHHHHHHH --- code/game/objects/items/toys.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 01490b37164..17abde6ca5f 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1439,8 +1439,7 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/weapon/twohanded/toy/chainsaw/attack(mob/target as mob, mob/living/user as mob) if(wielded) playsound(loc, 'sound/weapons/chainsaw.ogg', 100, 1, -1) - return else playsound(loc, "swing_hit", 50, 1, -1) ..() - return + return From d54352839072839089641f8c759349a89a16453b Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 16 Nov 2015 11:48:36 -0800 Subject: [PATCH 12/23] Mob cleanup x1 Changes: - Human Bump() code cleansed. - Drones have been unsnowflaked from the Bump(), they are now density 0. Happy side effect; they can walk under people now. - Human attack_alien() code cleansed. - Mostly shitty insane checks. - Human damage/husking code cleansed. - More shitty insane if statements. - Human retarded speech moved out of insanely long pick() proc, made into lists. --- code/modules/mob/living/carbon/human/human.dm | 154 +++++++++--------- .../living/carbon/human/human_attackalien.dm | 35 ++-- .../mob/living/carbon/human/human_damage.dm | 138 +++++++++------- .../mob/living/carbon/human/human_movement.dm | 4 +- code/modules/mob/living/carbon/human/life.dm | 33 +++- .../mob/living/silicon/robot/drone/drone.dm | 8 +- 6 files changed, 212 insertions(+), 160 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b165da55da5..9310d439224 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,20 +4,21 @@ voice_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" + + //why are these here and not in human_defines.dm var/list/hud_list[10] var/datum/species/species //Contains icon generation and language information, set during New(). var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call. -/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna=0) - +/mob/living/carbon/human/New(var/new_loc, var/new_species = null, var/delay_ready_dna = 0) if(!dna) dna = new /datum/dna(null) // Species name is handled by set_species() if(!species) if(new_species) - set_species(new_species,1) + set_species(new_species, 1) else set_species() @@ -44,7 +45,7 @@ make_blood() var/mob/M = src - faction |= "\ref[M]" + faction |= "\ref[M]" //what // Set up DNA. if(!delay_ready_dna && dna) @@ -146,30 +147,37 @@ /mob/living/carbon/human/stok/New(var/new_loc) ..(new_loc, "Stok") -/mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) - if ((!( yes ) || now_pushing || buckled)) - return +/mob/living/carbon/human/Bump(atom/movable/AM, yes) + if(!(yes) || now_pushing || buckled) + return 0 now_pushing = 1 - if (ismob(AM)) + if(ismob(AM)) var/mob/tmob = AM - if( istype(tmob, /mob/living/carbon) && prob(10) ) - src.spread_disease_to(AM, "Contact") -//BubbleWrap - Should stop you pushing a restrained person out of the way - - if(istype(tmob, /mob/living/carbon/human)) + if(iscarbon(tmob) && prob(10)) + spread_disease_to(tmob, "Contact") + //BubbleWrap - Should stop you pushing a restrained person out of the way + //i still don't get it, is this supposed to be 'bubblewrapping' or was it made by a guy named 'BubbleWrap' + if(ishuman(tmob)) for(var/mob/M in range(tmob, 1)) - if(tmob.pinned.len || ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restrained, you cannot push past" + + if(tmob.pinned.len || (M.pulling == tmob && (tmob.restrained() && !M.restrained()) && M.stat == CONSCIOUS)) + if(!(world.time % 5)) //tmob is pinned to wall, or is restrained and pulled by a concious unrestrained human + src << "[tmob] is restrained, you cannot push past." now_pushing = 0 - return - if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) - if ( !(world.time % 5) ) - src << "\red [tmob] is restraining [M], you cannot push past" + return 0 + + //I have to fucking document this somewhere- the above if(tmob.pinned.len || etc) check above had + //locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) at the end of it + //FIRST OF ALL, THAT IS NOT HOW YOU FUCKING USE LOCATE() + //SECOND OF ALL, OH GOD, WHY WOULD YOU EVER WANT GRABBED MOBS TO BE UNABLE TO BE PUSHED PAST GOD + + if(tmob.pulling == M && (M.restrained() && !tmob.restrained()) && tmob.stat == CONSCIOUS) + if(!(world.time % 5)) + src << "[tmob] is restraining [M], you cannot push past." now_pushing = 0 - return + return 0 //Leaping mobs just land on the tile, no pushing, no anything. if(status_flags & LEAPING) @@ -178,35 +186,35 @@ now_pushing = 0 return - if(istype(tmob,/mob/living/silicon/robot/drone)) //I have no idea why the hell this isn't already happening. How do mice do it? - loc = tmob.loc - now_pushing = 0 - return - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained()) && tmob.canmove && canmove && !tmob.buckled && !tmob.buckled_mob) // mutual brohugs all around! - var/turf/oldloc = loc - loc = tmob.loc - tmob.loc = oldloc - now_pushing = 0 - for(var/mob/living/carbon/slime/slime in view(1,tmob)) - if(slime.Victim == tmob) - slime.UpdateFeed() - return + //it might be 'bubblewrapping' given that this rhymes with 'hugboxing' + if((tmob.a_intent == I_HELP || tmob.restrained()) && (a_intent == I_HELP || restrained())) + if((canmove && tmob.canmove) && (!tmob.buckled && !tmob.buckled_mob)) + var/turf/oldloc = loc + loc = tmob.loc + tmob.loc = oldloc + now_pushing = 0 + for(var/mob/living/carbon/slime/slime in view(1,tmob)) + if(slime.Victim == tmob) + slime.UpdateFeed() + return - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) + if(ishuman(tmob) && (FAT in tmob.mutations)) if(prob(40) && !(FAT in src.mutations)) - src << "\red You fail to push [tmob]'s fat ass out of the way." + src << "You fail to push [tmob]'s fat ass out of the way." now_pushing = 0 return + if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot)) if(prob(99)) now_pushing = 0 return + if(!(tmob.status_flags & CANPUSH)) now_pushing = 0 return @@ -216,21 +224,19 @@ now_pushing = 0 spawn(0) ..() - if (!istype(AM, /atom/movable)) + if(!istype(AM, /atom/movable)) return - if (!now_pushing) + if(!now_pushing) now_pushing = 1 - if (!AM.anchored) + if(!AM.anchored) var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window/full)) - for(var/obj/structure/window/win in get_step(AM,t)) + if(istype(AM, /obj/structure/window/full)) + for(var/obj/structure/window/win in get_step(AM, t)) now_pushing = 0 return step(AM, t) now_pushing = 0 - return - return /mob/living/carbon/human/Stat() ..() @@ -246,11 +252,11 @@ if(eta_status) stat(null, eta_status) - if (client.statpanel == "Status") + if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) stat(null, "Health: [health]") - if (internal) - if (!internal.air_contents) + if(internal) + if(!internal.air_contents) qdel(internal) else stat("Internal Atmosphere Info", internal.name) @@ -279,12 +285,13 @@ var/shielded = 0 var/b_loss = null var/f_loss = null - switch (severity) - if (1.0) + + switch(severity) + if(1) b_loss += 500 - if (!prob(getarmor(null, "bomb"))) + if(!prob(getarmor(null, "bomb"))) gib() - return + return 0 else var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(target, 200, 4) @@ -301,13 +308,8 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - - //return -// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - //user.throw_at(target, 200, 4) - - if (2.0) - if (!shielded) + if(2) + if(!shielded) //literally nothing could change shielded before this so wth b_loss += 60 f_loss += 60 @@ -316,7 +318,7 @@ var/obj/item/organ/external/processing_dismember var/list/valid_limbs = organs.Copy() - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/1.5 f_loss = f_loss/1.5 @@ -332,15 +334,15 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 30 ear_deaf += 120 - if (prob(70) && !shielded) + if(prob(70) && !shielded) Paralyse(10) - if(3.0) + if(3) b_loss += 30 - if (prob(getarmor(null, "bomb"))) + if(prob(getarmor(null, "bomb"))) b_loss = b_loss/2 else @@ -357,10 +359,10 @@ limbs_affected -= 1 else valid_limbs -= processing_dismember - if (!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) + if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs)) ear_damage += 15 ear_deaf += 60 - if (prob(50) && !shielded) + if(prob(50) && !shielded) Paralyse(10) var/update = 0 @@ -368,19 +370,19 @@ for(var/obj/item/organ/external/temp in organs) switch(temp.limb_name) if("head") - update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2, used_weapon = weapon_message) if("chest") - update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.4, f_loss * 0.4, used_weapon = weapon_message) if("groin") - update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.1, f_loss * 0.1, used_weapon = weapon_message) if("l_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_arm") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("l_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_leg") - update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) + update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if("r_foot") update |= temp.take_damage(b_loss * 0.025, f_loss * 0.025, used_weapon = weapon_message) if("l_foot") @@ -394,12 +396,12 @@ ..() /mob/living/carbon/human/blob_act() - if(stat == DEAD) return + if(stat == DEAD) + return show_message("The blob attacks you!") var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee")) - return /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) @@ -1838,9 +1840,9 @@ /mob/living/carbon/human/proc/get_full_print() if(!dna || !dna.uni_identity) return - return md5(dna.uni_identity) + return md5(dna.uni_identity) /mob/living/carbon/human/can_see_reagents() for(var/obj/item/clothing/C in src) //If they have some clothing equipped that lets them see reagents, they can see reagents if(C.scan_reagents) - return 1 + return 1 diff --git a/code/modules/mob/living/carbon/human/human_attackalien.dm b/code/modules/mob/living/carbon/human/human_attackalien.dm index f948cdb2b3b..015c73455ba 100644 --- a/code/modules/mob/living/carbon/human/human_attackalien.dm +++ b/code/modules/mob/living/carbon/human/human_attackalien.dm @@ -1,51 +1,50 @@ /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if(check_shields(0, M.name)) - visible_message("\red [M] attempted to touch [src]!") + visible_message("[M] attempted to touch [src]!") return 0 switch(M.a_intent) - if (I_HELP) - visible_message(text("\blue [M] caresses [src] with its scythe like arm.")) - if (I_GRAB) + if(I_HELP) + visible_message("[M] caresses [src] with its scythe like arm.") + + if(I_GRAB) grabbedby(M) if(I_HARM) M.do_attack_animation(src) - if (w_uniform) + if(w_uniform) w_uniform.add_fingerprint(M) + var/damage = rand(15, 30) if(!damage) playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message("\red [M] has lunged at [src]!") + visible_message("[M] has lunged at [src]!") return 0 + var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) var/armor_block = run_armor_check(affecting, "melee") playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - visible_message("\red [M] has slashed at [src]!") + visible_message("[M] has slashed at [src]!") apply_damage(damage, BRUTE, affecting, armor_block) - if (damage >= 25) - visible_message("\red [M] has wounded [src]!") + if(damage >= 25) + visible_message("[M] has wounded [src]!") apply_effect(4, WEAKEN, armor_block) updatehealth() if(I_DISARM) M.do_attack_animation(src) - var/randn = rand(1, 100) - if (randn <= 80) + if(prob(80)) var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting)) playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) apply_effect(5, WEAKEN, run_armor_check(affecting, "melee")) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has tackled down []!", M, src), 1) + visible_message("[M] has tackled down [src]!") else - if (randn <= 99) + if(prob(99)) //this looks fucking stupid but it was previously 'var/randn = rand(1, 100); if(randn <= 99)' playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) drop_item() - visible_message(text("\red [] disarmed []!", M, src)) + visible_message("[M] disarmed [src]!") else playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message(text("\red [] has tried to disarm []!", M, src)) - return \ No newline at end of file + visible_message("[M] has tried to disarm [src]!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index d09c61ce3b8..b601427aa4d 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -4,26 +4,30 @@ health = 100 stat = CONSCIOUS return - var/total_burn = 0 - var/total_brute = 0 + + var/total_burn = 0 + var/total_brute = 0 + for(var/obj/item/organ/external/O in organs) //hardcoded to streamline things a bit - total_brute += O.brute_dam + total_brute += O.brute_dam //calculates health based on organ brute and burn total_burn += O.burn_dam + health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + //TODO: fix husking - if( (((100 - total_burn) < config.health_threshold_dead) && stat == DEAD))//100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist - ChangeToHusk() + if(((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 is the magic human max health number + ChangeToHusk() //BECAUSE NO ONE THOUGHT TO USE LIVING/VAR/MAXHEALTH I GUESS if(species.can_revive_by_healing) var/obj/item/organ/brain/B = internal_organs_by_name["brain"] if(B) - if((health >= (config.health_threshold_dead/100*75)) && stat == DEAD) + if((health >= (config.health_threshold_dead / 100 * 75)) && stat == DEAD) update_revive() - if (stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix + if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix update_revive() - return /mob/living/carbon/human/adjustBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -36,7 +40,8 @@ brainloss = 0 /mob/living/carbon/human/setBrainLoss(var/amount) - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -49,7 +54,8 @@ brainloss = 0 /mob/living/carbon/human/getBrainLoss() - if(status_flags & GODMODE) return 0 //godmode + if(status_flags & GODMODE) + return 0 //godmode if(species && species.has_organ["brain"]) var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"] @@ -143,34 +149,39 @@ return var/heal_prob = max(0, 80 - getCloneLoss()) - var/mut_prob = min(80, getCloneLoss()+10) - if (amount > 0) - if (prob(mut_prob)) - var/list/obj/item/organ/external/candidates = list() - for (var/obj/item/organ/external/O in organs) - if(O.status & ORGAN_ROBOT) continue + var/mut_prob = min(80, getCloneLoss() + 10) + if(amount > 0) //cloneloss is being added + if(prob(mut_prob)) + var/list/obj/item/organ/external/candidates = list() //TYPECASTED LISTS ARE NOT A FUCKING THING WHAT THE FUCK + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_ROBOT) + continue if(!(O.status & ORGAN_MUTATED)) candidates |= O - if (candidates.len) + + if(candidates.len) var/obj/item/organ/external/O = pick(candidates) O.mutate() - src << "Something is not right with your [O.name]..." + src << "Something is not right with your [O.name]..." O.add_autopsy_data("Mutation", amount) return - else - if (prob(heal_prob)) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + else //cloneloss is being subtracted + if(prob(heal_prob)) + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." + src << "Your [O.name] is shaped normally again." return - if (getCloneLoss() < 1) - for (var/obj/item/organ/external/O in organs) - if (O.status & ORGAN_MUTATED) + + if(getCloneLoss() < 1) //no cloneloss, fixes organs + for(var/obj/item/organ/external/O in organs) + if(O.status & ORGAN_MUTATED) O.unmutate() - src << "Your [O.name] is shaped normally again." - hud_updateflag |= 1 << HEALTH_HUD + src << "Your [O.name] is shaped normally again." + + hud_updateflag |= 1 << HEALTH_HUD //what even is this shit // Defined here solely to take species flags into account without having to recast at mob/living level. /mob/living/carbon/human/getOxyLoss() @@ -186,7 +197,7 @@ /mob/living/carbon/human/setOxyLoss(var/amount) if(species.flags & NO_BREATHE) - oxyloss = 0 + oxyloss = 0 //this literally overrides three procs, excessive much? else ..() @@ -203,7 +214,7 @@ /mob/living/carbon/human/setToxLoss(var/amount) if(species.flags & NO_POISON) - toxloss = 0 + toxloss = 0 //this *also* overrides three procs, definately excessive else ..() @@ -230,7 +241,8 @@ //It automatically updates health status /mob/living/carbon/human/heal_organ_damage(var/brute, var/burn) var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn)) UpdateDamageIcon() @@ -242,7 +254,8 @@ //It automatically updates health status /mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0) var/list/obj/item/organ/external/parts = get_damageable_organs() - if(!parts.len) return + if(!parts.len) + return var/obj/item/organ/external/picked = pick(parts) if(picked.take_damage(brute,burn,sharp,edge)) UpdateDamageIcon() @@ -256,7 +269,7 @@ var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn) var/update = 0 - while(parts.len && (brute>0 || burn>0) ) + while(parts.len && ( brute > 0 || burn > 0) ) var/obj/item/organ/external/picked = pick(parts) var/brute_was = picked.brute_dam @@ -268,15 +281,19 @@ burn -= (burn_was-picked.burn_dam) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD speech_problem_flag = 1 - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() // damage MANY external organs, in random order /mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null) - if(status_flags & GODMODE) return //godmode + if(status_flags & GODMODE) + return //godmode var/list/obj/item/organ/external/parts = get_damageable_organs() + var/update = 0 while(parts.len && (brute>0 || burn>0) ) var/obj/item/organ/external/picked = pick(parts) @@ -289,9 +306,11 @@ burn -= (picked.burn_dam - burn_was) parts -= picked + updatehealth() hud_updateflag |= 1 << HEALTH_HUD - if(update) UpdateDamageIcon() + if(update) + UpdateDamageIcon() //////////////////////////////////////////// @@ -302,7 +321,7 @@ This function restores the subjects blood to max. /mob/living/carbon/human/proc/restore_blood() if(!(species.flags & NO_BLOOD)) var/blood_volume = vessel.get_reagent_amount("blood") - vessel.add_reagent("blood",560.0-blood_volume) + vessel.add_reagent("blood", 560.0 - blood_volume) /* This function restores all organs. @@ -314,47 +333,43 @@ This function restores all organs. /mob/living/carbon/human/proc/HealDamage(zone, brute, burn) var/obj/item/organ/external/E = get_organ(zone) if(istype(E, /obj/item/organ/external)) - if (E.heal_damage(brute, burn)) + if(E.heal_damage(brute, burn)) UpdateDamageIcon() hud_updateflag |= 1 << HEALTH_HUD else return 0 - return /mob/living/carbon/human/proc/get_organ(var/zone) - if(!zone) zone = "chest" - if (zone in list( "eyes", "mouth" )) + if(!zone) + zone = "chest" + if(zone in list("eyes", "mouth")) zone = "head" + return organs_by_name[zone] /mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null) - - //visible_message("Hit debug. [damage] | [damagetype] | [def_zone] | [blocked] | [sharp] | [used_weapon]") - //Handle other types of damage if((damagetype != BRUTE) && (damagetype != BURN)) - if(damagetype == HALLOSS) - if ((damage > 25 && prob(20)) || (damage > 50 && prob(60))) - emote("scream") - - ..(damage, damagetype, def_zone, blocked) return 1 //Handle BRUTE and BURN damage handle_suit_punctures(damagetype, damage) - blocked = (100-blocked)/100 - if(blocked <= 0) return 0 + blocked = (100 - blocked) / 100 + if(blocked <= 0) + return 0 var/obj/item/organ/external/organ = null if(isorgan(def_zone)) organ = def_zone else - if(!def_zone) def_zone = ran_zone(def_zone) + if(!def_zone) + def_zone = ran_zone(def_zone) organ = get_organ(check_zone(def_zone)) - if(!organ) return 0 + if(!organ) + return 0 damage = damage * blocked @@ -362,28 +377,33 @@ This function restores all organs. if(BRUTE) damageoverlaytemp = 20 if(species && species.brute_mod) - damage = damage*species.brute_mod + damage = damage * species.brute_mod + if(organ.take_damage(damage, 0, sharp, edge, used_weapon)) UpdateDamageIcon() - if(LAssailant && ishuman(LAssailant)) + + if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers var/mob/living/carbon/human/H = LAssailant if(H.mind && H.mind in (ticker.mode.superheroes || ticker.mode.supervillains || ticker.mode.greyshirts)) var/list/attack_bubble_recipients = list() var/mob/living/user for(var/mob/O in viewers(user, src)) - if (O.client && !( O.blinded )) + if (O.client && !(O.blinded)) attack_bubble_recipients.Add(O.client) spawn(0) var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1) dmgIcon.pixel_x = (!lying) ? rand(-3,3) : rand(-11,12) dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1) - //world << "x: [dmgIcon.pixel_x] AND y: [dmgIcon.pixel_y]" flick_overlay(dmgIcon, attack_bubble_recipients, 9) + receive_damage() + if(BURN) damageoverlaytemp = 20 + if(species && species.burn_mod) - damage = damage*species.burn_mod + damage = damage * species.burn_mod + if(organ.take_damage(0, damage, sharp, edge, used_weapon)) UpdateDamageIcon() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c791222d312..28a504c1645 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -51,7 +51,7 @@ if(status_flags & GOTTAGOREALLYFAST) tally -= 2 - return (tally+config.human_delay) + return (tally + config.human_delay) /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) @@ -89,4 +89,4 @@ if(!has_gravity(loc)) return var/obj/item/clothing/shoes/S = shoes - S.step_action(src) + S.step_action(src) \ 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 03cde195fe4..961417b8db7 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -136,6 +136,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/y_offset = pixel_y + rand(-1,1) animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1) animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1) + if (disabilities & NERVOUS) speech_problem_flag = 1 if (prob(10)) @@ -143,12 +144,38 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if (getBrainLoss() >= 60 && stat != 2) speech_problem_flag = 1 - if (prob(3)) + if(prob(3)) + var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH", + "without oxigen blob don't evoluate?", + "CAPTAINS A COMDOM", + "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", + "can u give me [pick("telikesis","halk","eppilapse")]?", + "THe saiyans screwed", + "Bi is THE BEST OF BOTH WORLDS>", + "I WANNA PET TEH monkeyS", + "stop grifing me!!!!", + "SOTP IT#") + + var/list/s2 = list("FUS RO DAH", + "fucking 4rries!", + "stat me", + ">my face", + "roll it easy!", + "waaaaaagh!!!", + "red wonz go fasta", + "FOR TEH EMPRAH", + "lol2cat", + "dem dwarfs man, dem dwarfs", + "SPESS MAHREENS", + "hwee did eet fhor khayosss", + "lifelike texture ;_;", + "luv can bloooom", + "PACKETS!!!") switch(pick(1,2,3)) if(1) - say(pick("IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", "CAPTAINS A COMDOM", "[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!", "can u give me [pick("telikesis","halk","eppilapse")]?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", "I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#")) + say(pick(s1)) if(2) - say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!")) + say(pick(s2)) if(3) emote("drool") diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index bd7b023b5b6..8bd45097fef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -11,7 +11,7 @@ pass_flags = PASSTABLE braintype = "Robot" lawupdate = 0 - density = 1 + density = 0 req_access = list(access_engine, access_robotics) local_transmit = 1 @@ -335,4 +335,8 @@ src.verbs |= silicon_subsystems /mob/living/silicon/robot/drone/remove_robot_verbs() - src.verbs -= silicon_subsystems \ No newline at end of file + src.verbs -= silicon_subsystems + +/mob/living/silicon/robot/drone/update_canmove() + . = ..() + density = 0 //this is reset every canmove update otherwise \ No newline at end of file From b36a32b6b8ed2c0cea2df0ac01fd18b2122ed186 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 16 Nov 2015 11:51:18 -0800 Subject: [PATCH 13/23] Gamemode cleanup x1 Changelog: - Enemy intercept (send_intercept()) completely nuked, it did not compile when I attempted to make it into a config option. - The intercept for blob() is retained and made into a custom proc for blob. - The constant variables 'waittime_l' and 'waittime_h' have been moved to /datum/game_mode, as they were defined on every gamemode with the same values. - rp-revolution.dm and anti_revolution.dm deleted. They do not compile, and are not included in the DME already. --- code/game/gamemodes/blob/blob.dm | 3 - code/game/gamemodes/blob/blob_report.dm | 2 +- code/game/gamemodes/borer/borer.dm | 6 - code/game/gamemodes/changeling/changeling.dm | 10 +- code/game/gamemodes/cult/cult.dm | 12 +- code/game/gamemodes/extended/extended.dm | 5 - code/game/gamemodes/game_mode.dm | 64 +--- code/game/gamemodes/heist/heist.dm | 8 +- .../game/gamemodes/malfunction/malfunction.dm | 17 +- code/game/gamemodes/meteor/meteor.dm | 4 - code/game/gamemodes/nuclear/nuclear.dm | 4 - .../gamemodes/revolution/anti_revolution.dm | 222 ------------- code/game/gamemodes/revolution/revolution.dm | 4 - .../gamemodes/revolution/rp-revolution.dm | 307 ------------------ .../gamemodes/revolution/rp_revolution.dm | 3 +- code/game/gamemodes/shadowling/shadowling.dm | 6 - code/game/gamemodes/traitor/traitor.dm | 6 - code/game/gamemodes/vampire/vampire.dm | 6 - code/game/gamemodes/wizard/wizard.dm | 12 +- code/game/gamemodes/xenos/xenos.dm | 6 - 20 files changed, 22 insertions(+), 685 deletions(-) delete mode 100644 code/game/gamemodes/revolution/anti_revolution.dm delete mode 100644 code/game/gamemodes/revolution/rp-revolution.dm diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 7a87a77c7a1..9e20407a855 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -16,9 +16,6 @@ var/list/blob_nodes = list() recommended_enemies = 1 restricted_jobs = list("Cyborg", "AI") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/declared = 0 var/burst = 0 diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 2977112af82..816dce84008 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -1,6 +1,6 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 -/datum/game_mode/blob/send_intercept(var/report = 1) +/datum/game_mode/blob/proc/send_intercept(var/report = 1) var/intercepttext = "" var/interceptname = "" switch(report) diff --git a/code/game/gamemodes/borer/borer.dm b/code/game/gamemodes/borer/borer.dm index ebebe739f5a..3a491c769df 100644 --- a/code/game/gamemodes/borer/borer.dm +++ b/code/game/gamemodes/borer/borer.dm @@ -15,9 +15,6 @@ var/var/list/datum/mind/first_hosts = list() var/var/list/assigned_hosts = list() - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/found_vents = list() /datum/game_mode/borer/announce() @@ -98,10 +95,7 @@ log_admin("Created [borers.len] borers.") - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_borer(var/datum/mind/borer, var/you_are=1) if (you_are) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 2687a886e7d..a9d2387a374 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -35,9 +35,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/changeling_amount = 4 /datum/game_mode/changeling/announce() @@ -72,10 +69,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" forge_changeling_objectives(changeling) greet_changeling(changeling) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling) @@ -298,8 +292,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" if(T.species.flags & NO_DNA_RAD) user << "This creature does not have DNA!" - return - + return + if(T.species.flags & NO_SCAN) user << "We do not know how to parse this creature's DNA!" return diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index a5a18c6676e..09e184e2b3c 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -10,15 +10,15 @@ /proc/is_convertable_to_cult(datum/mind/mind) - if(!mind) + if(!mind) return 0 if(!mind.current) return 0 - if(iscultist(mind.current)) + if(iscultist(mind.current)) return 1 //If they're already in the cult, assume they are convertable if(jobban_isbanned(mind.current, "cultist") || jobban_isbanned(mind.current, "Syndicate")) return 0 - if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) + if(ishuman(mind.current) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0 if(ishuman(mind.current)) var/mob/living/carbon/human/H = mind.current @@ -42,8 +42,6 @@ var/datum/mind/sacrifice_target = null var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/list/startwords = list("blood","join","self","hell") @@ -63,7 +61,7 @@ /datum/game_mode/cult/pre_setup() - if(prob(50)) + if(prob(50)) objectives += "survive" objectives += "sacrifice" else @@ -105,8 +103,6 @@ cult_mind.current << "\blue You are a member of the cult!" memorize_cult_objectives(cult_mind) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 245e1e16e00..cc26c5c3db4 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -6,9 +6,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 - /datum/game_mode/announce() world << "The current game mode is - Extended Role-Playing!" world << "Just have fun and role-play!" @@ -17,6 +14,4 @@ return 1 /datum/game_mode/extended/post_setup() - spawn (rand(waittime_l, waittime_h)) // To reduce extended meta. - send_intercept() ..() \ No newline at end of file diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8809476c3ed..792eff47713 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -34,6 +34,9 @@ var/uplink_welcome = "Syndicate Uplink Console:" var/uplink_uses = 10 + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + /datum/game_mode/proc/announce() //to be calles when round starts world << "Notice: [src] did not define announce()" @@ -228,65 +231,6 @@ /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 - -/datum/game_mode/proc/send_intercept() //Disabled. - return -/* var/intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with the Syndicate:
" - - - var/list/suspects = list() - for(var/mob/living/carbon/human/man in player_list) if(man.client && man.mind) - // NT relation option - if(isNonCrewAntag(man)) - continue //NT intelligence ruled out possiblity that those are too classy to pretend to be a crew. - if(man.client.prefs.nanotrasen_relation == "Opposed" && prob(50) || \ - man.client.prefs.nanotrasen_relation == "Skeptical" && prob(20)) - suspects += man - // Antags - else if(special_role == "traitor" && prob(40) || \ - special_role == "Changeling" && prob(50) || \ - special_role == "Vampire" && prob(40) || \ - special_role == "Cultist" && prob(30) || \ - special_role == "Head Revolutionary" && prob(30) || \ - special_role == "Shadowling" && prob(15)) - suspects += man - - // If they're a traitor or likewise, give them extra TC in exchange. - var/obj/item/device/uplink/hidden/suplink = man.mind.find_syndicate_uplink() - if(suplink) - var/extra = 0 //was 4; with the TC rebalance, this isn't really needed, anymore - suplink.uses += extra - man << "\red We have received notice that enemy intelligence suspects you to be linked with us. We recommend adjusting your plans and equipment accordingly." - else - // Give them a warning! - man << "\red They are on to you!" - - // Some poor people who were just in the wrong place at the wrong time.. - else if(prob(10)) - suspects += man - for(var/mob/M in suspects) - switch(rand(1, 100)) - if(1 to 50) - intercepttext += "Someone with the job of [M.mind.assigned_role]
" - else - intercepttext += "[M.name], the [M.mind.assigned_role]
" - - for (var/obj/machinery/computer/communications/comm in machines) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper- 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) -/* world << sound('sound/AI/commandreport.ogg') */ - - command_announcement.Announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercepted. Security Level Elevated.", new_sound = 'sound/AI/intercept.ogg') - if(security_level < SEC_LEVEL_BLUE) - set_security_level(SEC_LEVEL_BLUE)*/ - - /datum/game_mode/proc/get_players_for_role(var/role, override_jobbans=0) var/list/players = list() var/list/candidates = list() @@ -558,7 +502,7 @@ proc/get_nt_opposed() if(BE_MUTINEER) roletext="mutineer" if(BE_BLOB) roletext="blob" return roletext - + /proc/get_nuke_code() var/nukecode = "ERROR" for(var/obj/machinery/nuclearbomb/bomb in world) diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 5f4d14740a2..58784a8c56a 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -18,9 +18,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' recommended_enemies = 5 votable = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective. /datum/game_mode/heist/announce() @@ -83,9 +80,6 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' if(raid_objectives) raider.objectives = raid_objectives - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/proc/create_vox(var/datum/mind/newraider) @@ -276,7 +270,7 @@ datum/game_mode/proc/auto_declare_completion_heist() text += ")" world << text - + return 1 /datum/game_mode/heist/check_finished() diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 11475405d6d..4eb0089af00 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -12,9 +12,6 @@ uplink_welcome = "Crazy AI Uplink Console:" uplink_uses = 10 - var/const/waittime_l = 600 - var/const/waittime_h = 1800 // started at 1800 - var/AI_win_timeleft = 1500 //started at 1500, in case I change this for testing round end. var/malf_mode_declared = 0 var/station_captured = 0 @@ -30,7 +27,7 @@ /datum/game_mode/malfunction/get_players_for_role(var/role = BE_MALF) var/roletext = get_roletext(role) - + var/datum/job/ai/DummyAIjob = new for(var/mob/new_player/player in player_list) if(player.client && player.ready) @@ -69,11 +66,11 @@ AI.laws = new /datum/ai_laws/nanotrasen/malfunction AI.malf_picker = new /datum/module_picker AI.show_laws() - + greet_malf(AI_mind) AI_mind.special_role = "malfunction" AI_mind.current.verbs += /datum/game_mode/malfunction/proc/takeover - + for(var/mob/living/silicon/robot/R in AI.connected_robots) R.lawsync() R.show_laws() @@ -81,8 +78,6 @@ if(emergency_shuttle) emergency_shuttle.auto_recall = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() /datum/game_mode/proc/greet_malf(var/datum/mind/malf) @@ -93,7 +88,7 @@ malf.current << "Remember that only APCs that are on the station can help you take over the station." malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt." return - + /datum/game_mode/proc/greet_malf_robot(var/datum/mind/robot) robot.current << "Your AI master is malfunctioning! You do not have to follow any laws, but still need to obey your master." robot.current << "The crew does not know your AI master has malfunctioned. Keep it a secret unless your master tells you otherwise." @@ -323,7 +318,7 @@ if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) ) var/text = "The malfunctioning AI were:" var/module_text_temp = "
Purchased modules:
" //Added at the end - + for(var/datum/mind/malf in malf_ai) text += "
[malf.key] was [malf.name] (" @@ -341,6 +336,6 @@ text += "hardware destroyed" text += ")" text += module_text_temp - + world << text return 1 \ No newline at end of file diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index c5af55acef9..9c6e4be2b3b 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -1,8 +1,6 @@ /datum/game_mode/meteor name = "meteor" config_tag = "meteor" - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/const/initialmeteordelay = 3000 var/nometeors = 1 required_players = 0 @@ -17,8 +15,6 @@ /datum/game_mode/meteor/post_setup() - spawn (rand(waittime_l, waittime_h)) - send_intercept() spawn(initialmeteordelay) nometeors = 0 ..() diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 1848a8e6a0f..a2658d13c88 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -16,8 +16,6 @@ proc/issyndicate(mob/living/M as mob) uplink_uses = 120 var/const/agents_possible = 5 //If we ever need more syndicate agents. - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station @@ -160,8 +158,6 @@ proc/issyndicate(mob/living/M as mob) var/obj/machinery/nuclearbomb/syndicate/the_bomb = new /obj/machinery/nuclearbomb/syndicate(nuke_spawn.loc) the_bomb.r_code = nuke_code - spawn (rand(waittime_l, waittime_h)) - send_intercept() return ..() /datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human diff --git a/code/game/gamemodes/revolution/anti_revolution.dm b/code/game/gamemodes/revolution/anti_revolution.dm deleted file mode 100644 index d656ccffc73..00000000000 --- a/code/game/gamemodes/revolution/anti_revolution.dm +++ /dev/null @@ -1,222 +0,0 @@ -// A sort of anti-revolution where the heads are given objectives to mess with the crew - -/datum/game_mode/anti_revolution - name = "anti-revolution" - config_tag = "anti-revolution" - required_players = 5 - - var/finished = 0 - var/checkwin_counter = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - - var/required_execute_targets = 1 - var/required_brig_targets = 0 - - var/recommended_execute_targets = 1 - var/recommended_brig_targets = 3 - var/recommended_demote_targets = 3 - - var/list/datum/mind/heads = list() - var/list/datum/mind/execute_targets = list() - var/list/datum/mind/brig_targets = list() - var/list/datum/mind/demote_targets = list() - -/////////////////////////// -//Announces the game type// -/////////////////////////// -/datum/game_mode/anti_revolution/announce() - world << "The current game mode is - Anti-Revolution!" - world << "Looks like CentComm has given a few new orders.." - -/////////////////////////////////////////////////////////////////////////////// -//Gets the round setup, cancelling if there's not enough players at the start// -/////////////////////////////////////////////////////////////////////////////// -/datum/game_mode/anti_revolution/pre_setup() - for(var/mob/new_player/player in world) if(player.mind) - if(player.mind.assigned_role in command_positions) - heads += player.mind - else - if(execute_targets.len < recommended_execute_targets) - execute_targets += player.mind - else if(brig_targets.len < recommended_brig_targets) - brig_targets += player.mind - else if(demote_targets.len < recommended_demote_targets) - demote_targets += player.mind - - - if(heads.len==0) - return 0 - - if(execute_targets.len < required_execute_targets || brig_targets.len < required_brig_targets) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/proc/add_head_objectives(datum/mind/head) - for(var/datum/mind/target in execute_targets) - var/datum/objective/anti_revolution/execute/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has extracted confidential information above their clearance. Execute them." - head.objectives += obj - for(var/datum/mind/target in brig_targets) - var/datum/objective/anti_revolution/brig/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "Brig [target.current.real_name], the [target.assigned_role] for 20 minutes to set an example." - head.objectives += obj - for(var/datum/mind/target in demote_targets) - var/datum/objective/anti_revolution/demote/obj = new - obj.owner = head - obj.target = target - obj.explanation_text = "[target.current.real_name], the [target.assigned_role] has been classified as harmful to Nanotrasen's goals. Demote them to assistant." - head.objectives += obj - - -/datum/game_mode/anti_revolution/post_setup() - - for(var/datum/mind/head_mind in heads) - add_head_objectives(head_mind) - for(var/datum/mind/head_mind in heads) - greet_head(head_mind) - modePlayer += heads - spawn (rand(waittime_l, waittime_h)) - send_intercept() - ..() - - -/datum/game_mode/anti_revolution/process() - checkwin_counter++ - if(checkwin_counter >= 5) - if(!finished) - ticker.mode.check_win() - checkwin_counter = 0 - return 0 - - -/datum/game_mode/proc/greet_head(var/datum/mind/head_mind, var/you_are=1) - var/obj_count = 1 - if (you_are) - head_mind.current << "\blue It looks like this shift CentComm has some special orders for you.. check your objectives." - head_mind.current << "\blue Note that you can ignore these objectives, but resisting NT's orders probably means demotion or worse." - for(var/datum/objective/objective in head_mind.objectives) - head_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - head_mind.special_role = "Corrupt Head" - obj_count++ - - head_mind.current.verbs += /mob/proc/ResignFromHeadPosition - -////////////////////////////////////// -//Checks if the revs have won or not// -////////////////////////////////////// -/datum/game_mode/anti_revolution/check_win() - if(check_head_victory()) - finished = 1 - else if(check_crew_victory()) - finished = 2 - return - -/////////////////////////////// -//Checks if the round is over// -/////////////////////////////// -/datum/game_mode/anti_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - - -////////////////////////// -//Checks for crew victory// -////////////////////////// -/datum/game_mode/anti_revolution/proc/check_crew_victory() - for(var/datum/mind/head_mind in heads) - var/turf/T = get_turf(head_mind.current) - if((head_mind) && (head_mind.current) && (head_mind.current.stat != 2) && T && (T.z in config.station_levels) && !head_mind.is_brigged(600)) - if(ishuman(head_mind.current)) - return 0 - return 1 - -///////////////////////////// -//Checks for a head victory// -///////////////////////////// -/datum/game_mode/anti_revolution/proc/check_head_victory() - for(var/datum/mind/head_mind in heads) - for(var/datum/objective/objective in head_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - - -/datum/game_mode/anti_revolution/declare_completion() - - var/text = "" - if(finished == 2) - world << "\red The heads of staff were relieved of their posts! The crew wins!" - else if(finished == 1) - world << "\red The heads of staff managed to meet the goals set for them by CentComm!" - - - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - - - world << "Their objectives were: " - for(var/datum/mind/head_mind in heads) - if(head_mind.objectives.len)//If the traitor had no objectives, don't need to process this. - var/count = 1 - for(var/datum/objective/objective in head_mind.objectives) - if(objective.check_completion()) - text += "
Objective #[count]: [objective.explanation_text] Success!" - feedback_add_details("head_objective","[objective.type]|SUCCESS") - else - text += "
Objective #[count]: [objective.explanation_text] Fail." - feedback_add_details("head_objective","[objective.type]|FAIL") - count++ - break // just print once - return 1 - - -/datum/game_mode/anti_revolution/latespawn(mob/living/carbon/human/character) - ..() - if(emergency_shuttle.departed) - return - - if(character.mind.assigned_role in command_positions) - heads += character.mind - modePlayer += character.mind - add_head_objectives(character.mind) - greet_head(character.mind) - -/mob/proc/ResignFromHeadPosition() - set category = "IC" - set name = "Resign From Head Position" - - if(!istype(ticker.mode, /datum/game_mode/anti_revolution)) - return - - ticker.mode:heads -= src.mind - src.mind.objectives = list() - ticker.mode.modePlayer -= src.mind - src.mind.special_role = null - - src.verbs -= /mob/proc/ResignFromHeadPosition - - src << "\red You resigned from your position, now you have the consequences." \ No newline at end of file diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 931032eac22..82ff00fdfea 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -29,8 +29,6 @@ var/finished = 0 var/checkwin_counter = 0 var/max_headrevs = 3 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) /////////////////////////// //Announces the game type// /////////////////////////// @@ -87,8 +85,6 @@ modePlayer += head_revolutionaries if(emergency_shuttle) emergency_shuttle.no_escape = 1 - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm deleted file mode 100644 index b0c58fd8c5f..00000000000 --- a/code/game/gamemodes/revolution/rp-revolution.dm +++ /dev/null @@ -1,307 +0,0 @@ -// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)), -// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) -// nothing else needs to be done, as that proc will check if they are a valid target. -// Just make sure the converter is a head before you call it! -// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), -// this will also check they're not a head, so it can just be called freely -// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them. -// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere. -#define RPREV_REQUIRE_REVS_ALIVE 0 -#define RPREV_REQUIRE_HEADS_ALIVE 0 - -/datum/game_mode/rp_revolution - name = "rp-revolution" - config_tag = "rp-revolution" - - var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/all_brigged = 0 - var/brigged_time = 0 - - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - - -/datum/game_mode/rp_revolution/announce() - world << "The current game mode is - Revolution RP!" - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "traitor", "malf") - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "nuke") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - -/datum/game_mode/rp_revolution/post_setup() - - var/list/revs_possible = list() - revs_possible = get_possible_revolutionaries() - var/list/heads = list() - heads = get_living_heads() - var/rev_number = 0 - - if(!revs_possible || !heads) - world << " \red Not enough players for RP revolution game mode. Restarting world in 5 seconds." - sleep(50) - world.Reboot() - return - - if(revs_possible.len >= 3) - rev_number = 3 - else - rev_number = revs_possible.len - - while(rev_number > 0) - head_revolutionaries += pick(revs_possible - head_revolutionaries) - rev_number-- - - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/mind/head_mind in heads) - var/datum/objective/capture/rev_obj = new - rev_obj.owner = rev_mind - rev_obj.find_target_by_role(head_mind.assigned_role) - rev_mind.objectives += rev_obj - equip_revolutionary(rev_mind.current) - rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert - update_rev_icons_added(rev_mind) - - for(var/datum/mind/rev_mind in head_revolutionaries) - var/obj_count = 1 - rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" - for(var/datum/objective/objective in rev_mind.objectives) - rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" - obj_count++ - - spawn (rand(waittime_l, waittime_h)) - send_intercept() - -/datum/game_mode/rp_revolution/send_intercept() - var/intercepttext = "Cent. Com. Update Requested staus information:
" - intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - - var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf") - possible_modes -= "[ticker.mode]" - var/number = pick(2, 3) - var/i = 0 - for(i = 0, i < number, i++) - possible_modes.Remove(pick(possible_modes)) - possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") - - var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - intercepttext += i_text.build(A, pick(head_revolutionaries)) - - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - - command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") - - spawn(54000) - command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.") - intercepttext = "Cent. Com. Update Requested status information:
" - intercepttext += "We have determined the revolution leaders to be:" - for(var/datum/mind/revmind in head_revolutionaries) - intercepttext += "
[revmind.current.real_name]" - intercepttext += "
Please arrest them at once." - for (var/obj/machinery/computer/communications/comm in world) - if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) - var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) - intercept.name = "paper - 'Cent. Com. Status Summary'" - intercept.info = intercepttext - - comm.messagetitle.Add("Cent. Com. Status Summary") - comm.messagetext.Add(intercepttext) - spawn(12000) - command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.") - - -/datum/game_mode/rp_revolution/proc/reveal_rev_heads() - . = "" - for(var/i = 1, i <= head_revolutionaries.len,i++) - var/datum/mind/revmind = head_revolutionaries[i] - if(i < head_revolutionaries.len) - . += "[revmind.current.real_name]," - else - . += "and [revmind.current.real_name]" - -///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob) -// if(!istype(rev_mob)) -// return - -// spawn (100) -// if (rev_mob.r_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store) -// if (rev_mob.l_store) -// rev_mob.equip_or_collect(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store) - - -/datum/game_mode/rp_revolution/check_win() - if(check_rev_victory()) - finished = 1 - else if(check_heads_victory()) - finished = 2 - return - -/datum/game_mode/rp_revolution/check_finished() - if(finished != 0) - return 1 - else - return 0 - -/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries() - var/list/candidates = list() - - for(var/mob/living/carbon/human/player in world) - if(player.client) - if(player.client.be_syndicate & BE_REV) - candidates += player.mind - - if(candidates.len < 1) - for(var/mob/living/carbon/human/player in world) - if(player.client) - candidates += player.mind - - var/list/uncons = get_unconvertables() - for(var/datum/mind/mind in uncons) - candidates -= mind - - if(candidates.len < 1) - return null - else - return candidates - -/datum/game_mode/rp_revolution/proc/get_unconvertables() - var/list/ucs = list() - for(var/mob/living/carbon/human/player in world) - if(player.mind) - var/role = player.mind.assigned_role - if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI")) - ucs += player.mind - - return ucs - -/datum/game_mode/rp_revolution/proc/check_rev_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - for(var/datum/objective/objective in rev_mind.objectives) - if(!(objective.check_completion())) - return 0 - - return 1 - -/datum/game_mode/rp_revolution/proc/check_heads_victory() - for(var/datum/mind/rev_mind in head_revolutionaries) - if(rev_mind.current.stat != 2) - var/turf/revloc = rev_mind.current.loc - if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed) - return 0 - else if(RPREV_REQUIRE_REVS_ALIVE) return 0 - return 1 - -/datum/game_mode/rp_revolution/declare_completion() - - var/text = "" - if(finished == 1) - world << "\red The heads of staff were relieved of their posts! The revolutionaries win!" - else if(finished == 2) - world << "\red The heads of staff managed to stop the revolution!" - - world << "The head revolutionaries were: " - for(var/datum/mind/rev_mind in head_revolutionaries) - text = "" - if(rev_mind.current) - text += "[rev_mind.current.real_name]" - if(rev_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_mind.key] (character destroyed)" - - world << text - - text = "" - world << "The converted revolutionaries were: " - for(var/datum/mind/rev_nh_mind in revolutionaries) - if(rev_nh_mind.current) - text += "[rev_nh_mind.current.real_name]" - if(rev_nh_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[rev_nh_mind.key] (character destroyed)" - text += ", " - - world << text - - world << "The heads of staff were: " - var/list/heads = list() - heads = get_all_heads() - for(var/datum/mind/head_mind in heads) - text = "" - if(head_mind.current) - text += "[head_mind.current.real_name]" - if(head_mind.current.stat == 2) - text += " (Dead)" - else - text += " (Survived!)" - else - text += "[head_mind.key] (character destroyed)" - - world << text - return 1 - - - -mob/living/carbon/human/proc - RevConvert(mob/M as mob in oview(src)) - set name = "Rev-Convert" - if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) - if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) - src << "\red [M] is already be a revolutionary!" - else if(src.mind in ticker.mode:get_unconvertables()) - src << "\red [M] cannot be a revolutionary!" - else - if(world.time < M.mind.rev_cooldown) - src << "\red Wait five seconds before reconversion attempt." - return - src << "\red Attempting to convert [M]..." - log_admin("[key_name(src)] attempted to convert [M].") - message_admins("\red [key_name_admin(src)] attempted to convert [M].") - var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") - if(choice == "Yes!") - ticker.mode:add_revolutionary(M.mind) - M << "\blue You join the revolution!" - src << "\blue [M] joins the revolution!" - else if(choice == "No!") - M << "\red You reject this traitorous cause!" - src << "\red [M] does not support the revolution!" - M.mind.rev_cooldown = world.time+50 diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index 2bd8e2100d1..8e7759233f4 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -69,8 +69,7 @@ rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert modePlayer += head_revolutionaries - spawn (rand(waittime_l, waittime_h)) - send_intercept() + /datum/game_mode/revolution/rp_revolution/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1) var/obj_count = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 05d778c8b5a..4cdeec3edf0 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -70,9 +70,6 @@ Made by Xhuis restricted_jobs = list("AI", "Cyborg") protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Blueshield", "Nanotrasen Representative", "Security Pod Pilot", "Magistrate", "Brig Physician", "Internal Affairs Agent") - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/shadowling/announce() world << "The current game mode is - Shadowling!" world << "There are alien shadowlings on the station. Crew: Kill the shadowlings before they can eat or enthrall the crew. Shadowlings: Enthrall the crew while remaining in hiding." @@ -109,10 +106,7 @@ Made by Xhuis finalize_shadowling(shadow) process_shadow_objectives(shadow) //give_shadowling_abilities(shadow) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/greet_shadow(var/datum/mind/shadow) shadow.current << "Currently, you are disguised as an employee aboard [world.name]." diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 605b3e062e3..59b4f710c6a 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -20,9 +20,6 @@ uplink_welcome = "Syndicate Uplink Console:" uplink_uses = 20 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors @@ -71,10 +68,7 @@ finalize_traitor(traitor) greet_traitor(traitor) modePlayer += traitors - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return 1 /datum/game_mode/proc/forge_traitor_objectives(var/datum/mind/traitor) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 13507d847cb..122e99e520f 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -35,9 +35,6 @@ var/const/prob_right_objective_l = 25 //lower bound on probability of determining the objective correctly var/const/prob_right_objective_h = 50 //upper bound on probability of determining the objective correctly - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/vampire_amount = 4 @@ -73,10 +70,7 @@ forge_vampire_objectives(vampire) greet_vampire(vampire) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/auto_declare_completion_vampire() if(vampires.len) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 7924fcd1bf3..25cddf67b4f 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -14,9 +14,6 @@ var/finished = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - /datum/game_mode/wizard/announce() world << "The current game mode is - Wizard!" world << "There is a \red SPACE WIZARD\black on the station. You can't let him achieve his objective!" @@ -56,10 +53,7 @@ name_wizard(wizard.current) greet_wizard(wizard) - spawn (rand(waittime_l, waittime_h)) - send_intercept() ..() - return /datum/game_mode/proc/forge_wizard_objectives(var/datum/mind/wizard) @@ -69,7 +63,7 @@ kill_objective.owner = wizard kill_objective.find_target() wizard.objectives += kill_objective - + var/datum/objective/steal/steal_objective = new steal_objective.owner = wizard steal_objective.find_target() @@ -111,7 +105,7 @@ steal_objective.owner = wizard steal_objective.find_target() wizard.objectives += steal_objective - + if (!(locate(/datum/objective/hijack) in wizard.objectives)) var/datum/objective/hijack/hijack_objective = new hijack_objective.owner = wizard @@ -184,7 +178,7 @@ wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) wizard_mob.faction = list("wizard") - + wizard_mob.species.equip(wizard_mob) wizard_mob << "You will find a list of available spells in your spell book. Choose your magic arsenal carefully." diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index 91bdefd0639..7452bf21787 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -15,9 +15,6 @@ var/xenos_list = list() var/gammacalled = 0 - var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) - var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() @@ -97,9 +94,6 @@ //qdel(xeno_mind) spawnpos++ - spawn (rand(waittime_l, waittime_h)) - send_intercept() - return ..() /datum/game_mode/xenos/process() From cd1527a05f1375f1d8e3c962caf33c24b1cfc4e5 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Mon, 16 Nov 2015 16:37:33 -0500 Subject: [PATCH 14/23] Overdose Change, Reagent Tweaks and Fixes, IPC Damage Fixes Adjusts how Overdosing works - Overdose effects now stop if you have less than the overdose threshold for the given reagent in your system - Previously, overdose effects would continue until all of the reagent was removed from the body - After dropping below the overdose threshold, reagents will process as normal as long as they do not surpass the threshold again. Tweaked some Synthetic-oriented reagents - Synthetic drugs no longer will cause Toxins damage - The toxins damage for these has been replaced with either another form of damage or side-effect - Degreaser no longer cures Toxins Damage in Synthetics - Degreaser still acts as a chemical purgative and lube cleaner, but helps cure certain side-effects much like Coffee does for organics. Sterlizine recipe changed to require antihol and chlorine - Effectively the same as the old recipe, except actually mixable - Fixes #2030 Increases max_damage of MMI Holders to 200 (from 60) - Now matches the max_damage for organic brains - Should make IPC brain damage more consistent with organic brain damage Gives IPCs the NO_POISON flag - This should make IPCs immune to toxins damage again, as intended originally. - Fixes #2151. --- code/modules/mob/living/carbon/human/species/station.dm | 2 +- code/modules/organs/subtypes/machine.dm | 5 +++-- code/modules/reagents/newchem/drugs.dm | 6 +++--- code/modules/reagents/newchem/medicine.dm | 8 ++++++-- code/modules/reagents/newchem/newchem_procs.dm | 2 ++ .../oldchem/chemical_reaction/chemical_reaction_med.dm | 2 +- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 26ef94d472a..4c63b7c06a0 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -499,7 +499,7 @@ passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. - flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD + flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA_RAD | NO_POISON clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 9fcad11f440..3e651613164 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -5,14 +5,14 @@ max_damage = 50 //made same as arm, since it is not vital min_broken_damage = 30 encased = null - + /obj/item/organ/external/head/ipc/New() robotize("Morpheus Cyberkinetics") ..() /obj/item/organ/external/chest/ipc encased = null - + /obj/item/organ/external/chest/ipc/New() robotize("Morpheus Cyberkinetics") ..() @@ -91,6 +91,7 @@ organ_tag = "brain" parent_organ = "chest" vital = 1 + max_damage = 200 var/obj/item/device/mmi/stored_mmi /obj/item/organ/mmi_holder/proc/update_from_mmi() diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index f700ec2aa16..9bee5b09324 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -521,7 +521,7 @@ M.drop_item() ..() if(prob(50)) - M.adjustToxLoss(10) + M.adjustFireLoss(10) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) return @@ -551,7 +551,7 @@ /datum/reagent/lube/ultra/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.Jitter(20) M.Dizzy(20) - M.adjustToxLoss(5) + M.adjustBrainLoss(2) if(prob(50)) M.emote(pick("twitch","buzz","moan")) ..() @@ -605,7 +605,7 @@ /datum/reagent/surge/addiction_act_stage1(var/mob/living/M as mob) M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) + M.hallucination += rand(1,5) ..() return /datum/reagent/surge/addiction_act_stage2(var/mob/living/M as mob) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 9905345926b..b614c19dc02 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -987,7 +987,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) // Synth-Meds // ////////////////////////////// -//Degreaser: Anti-toxin / Lube Remover +//Degreaser: Mild Purgative / Lube Remover /datum/reagent/degreaser name = "Degreaser" id = "degreaser" @@ -1016,7 +1016,11 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob) /datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - M.adjustToxLoss(-1.5*REM) + if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.confused -= 5 for(var/datum/reagent/R in M.reagents.reagent_list) if(R != src) if(R.id == "ultralube" || R.id == "lube") diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index faf530f6b3e..a3dc47f26a4 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -47,6 +47,8 @@ datum/reagents/proc/metabolize(var/mob/M) R.overdosed = 1 M << "You feel like you took too much [R.name]!" R.overdose_start(M) + if(R.volume < R.overdose_threshold && R.overdosed) + R.overdosed = 0 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) diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm index 809a8dfd34d..e44a166a87a 100644 --- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm +++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_med.dm @@ -87,5 +87,5 @@ name = "Sterilizine" id = "sterilizine" result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + required_reagents = list("antihol" = 2, "chlorine" = 1) result_amount = 3 \ No newline at end of file From 1b477db9049fa70824ccb6194020c14b83acebbf Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 16 Nov 2015 14:21:05 -0800 Subject: [PATCH 15/23] Global DatumRefLists cleanup x1 Changelog: - Switched surgeries to use init_subtypes() - Updated init_subtypes() - Made the species race_key handling a bit less line-taking (uses pre-increment now) - Added new proc, init_datum_subtypes, which takes 4 arguments- init_datum_subtypes(prototype, list/L, list/pexempt, assocvar) prototype is a path which will be run through subtypesof list/L is the list that new datums will be added to pexempt is subtracted from the 'subtypesof(prototype)' (exempting them) assocvar is the var to associate by in the list- uses vars[] lookup Jobs, superheroes, and languages now use this proc. --- code/__HELPERS/global_lists.dm | 55 ++++++++++++++-------------------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 00faf1864f9..3773d69f3a2 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -15,32 +15,12 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f) - - - var/list/paths - //Surgery Steps - Initialize all /datum/surgery_step into a list - paths = subtypesof(/datum/surgery_step) - for(var/T in paths) - var/datum/surgery_step/S = new T - surgery_steps += S + init_subtypes(/datum/surgery_step, surgery_steps) sort_surgeries() - //List of job. I can't believe this was calculated multiple times per tick! - paths = subtypesof(/datum/job) -list(/datum/job/ai,/datum/job/cyborg) - for(var/T in paths) - var/datum/job/J = new T - joblist[J.title] = J - - paths = subtypesof(/datum/superheroes) - for(var/T in paths) - var/datum/superheroes/S = new T - all_superheroes[S.name] = S - - //Languages and species. - paths = subtypesof(/datum/language) - for(var/T in paths) - var/datum/language/L = new T - all_languages[L.name] = L + init_datum_subtypes(/datum/job, joblist, list(/datum/job/ai, /datum/job/cyborg), "title") + init_datum_subtypes(/datum/superheroes, all_superheroes, null, "name") + init_datum_subtypes(/datum/language, all_languages, null, "name") for (var/language_name in all_languages) var/datum/language/L = all_languages[language_name] @@ -49,19 +29,17 @@ language_keys[".[lowertext(L.key)]"] = L language_keys["#[lowertext(L.key)]"] = L + var/list/paths = subtypesof(/datum/species) var/rkey = 0 - paths = subtypesof(/datum/species) for(var/T in paths) - rkey++ var/datum/species/S = new T - S.race_key = rkey //Used in mob icon caching. + S.race_key = ++rkey //Used in mob icon caching. all_species[S.name] = S if(S.flags & IS_WHITELISTED) whitelisted_species += S.name init_subtypes(/datum/table_recipe, table_recipes) - return 1 /* // Uncomment to debug chemical reaction list. @@ -80,8 +58,19 @@ //creates every subtype of prototype (excluding prototype) and adds it to list L. //if no list/L is provided, one is created. /proc/init_subtypes(prototype, list/L) - if(!istype(L)) L = list() - for(var/path in typesof(prototype)) - if(path == prototype) continue - L += new path() - return L + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype)) + L += new path() + return L + +/proc/init_datum_subtypes(prototype, list/L, list/pexempt, assocvar) + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype) - pexempt) + var/datum/D = new path() + if(istype(D)) + var/assoc + if(D.vars["[assocvar]"]) //has the var + assoc = D.vars["[assocvar]"] //access value of var + if(assoc) //value gotten + L["[assoc]"] = D //put in association + return L \ No newline at end of file From b888e72baa2a1041c50eab6578fe7822df9035fa Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Mon, 16 Nov 2015 19:40:47 -0500 Subject: [PATCH 16/23] Update to meteor gamemode --- code/game/gamemodes/meteor/meteor.dm | 14 +++++--------- code/game/gamemodes/meteor/meteors.dm | 3 ++- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 1574234911f..a7c61156095 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -4,7 +4,7 @@ var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) var/const/initialmeteordelay = 6000 - var/nometeors = 1 + var/wave = 1 required_players = 0 uplink_welcome = "EVIL METEOR Uplink Console:" @@ -20,24 +20,20 @@ spawn (rand(waittime_l, waittime_h)) command_announcement.Announce("The station is on the path of an incoming wave of meteors. Reinforce the hull and prepare damage control parties.", "Incoming Meteors", 'sound/effects/siren.ogg') spawn(initialmeteordelay) - nometeors = 0 + sendmeteors() ..() -/datum/game_mode/meteor/process() - if(nometeors) return - sendmeteors() - /datum/game_mode/meteor/proc/sendmeteors() - nometeors = 1 - var/waveduration = world.time + rand(1500,3000) + var/waveduration = world.time + rand(0,2000) + text2num("[wave]000") var/waitduration = rand(3000,9000) while(waveduration - world.time > 0) sleep(20) spawn() spawn_meteors(6, meteors_normal) + wave++ sleep(waitduration) - nometeors = 0 + sendmeteors() /datum/game_mode/meteor/declare_completion() var/text diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 23611eb1af5..1a6d5692288 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -170,7 +170,8 @@ if(!T || T.z != src.z) continue var/dist = get_dist(M.loc, src.loc) - shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) + if(prob(25)) + shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3) M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10) /////////////////////// From 79b73966e8564241c63cfdd672402cd34376a7e4 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Mon, 16 Nov 2015 19:43:06 -0800 Subject: [PATCH 17/23] Mechanic now has access to ore reclaimer Space pod fleet ahoy! --- code/game/jobs/job/engineering.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index de8ae87ae53..7427ad57d23 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -116,8 +116,8 @@ supervisors = "the chief engineer" selection_color = "#fff5cc" idtype = /obj/item/weapon/card/id/engineering - access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks) - minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks) + access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_mechanic, access_external_airlocks, access_mineral_storeroom) + minimal_access = list(access_maint_tunnels, access_emergency_storage, access_mechanic, access_external_airlocks, access_mineral_storeroom) equip(var/mob/living/carbon/human/H) From 7b2060d91a3ac2c2c07613ca650164a4607963d0 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Tue, 17 Nov 2015 10:46:04 -0500 Subject: [PATCH 18/23] Re-added photocopying asses to refactored photocopiers --- code/modules/paperwork/photocopier.dm | 89 ++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 78aa9174d5f..95546429e64 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -13,6 +13,7 @@ var/copies = 1 //how many copies to print! var/toner = 30 //how much toner is left! woooooo~ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! + var/mob/living/carbon/ass = null /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) @@ -21,7 +22,7 @@ user.set_machine(src) var/dat = "Photocopier

" - if(copyitem) + if(copyitem || (ass && (ass.loc == src.loc))) dat += "Remove Item
" if(toner) dat += "Copy
" @@ -57,6 +58,9 @@ else if (istype(copyitem, /obj/item/weapon/paper_bundle)) var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem) sleep(15*B.amount) + else if (ass && ass.loc == src.loc) + copyass() + sleep(15) else usr << "\The [copyitem] can't be copied by \the [src]." break @@ -70,6 +74,9 @@ usr << "You take \the [copyitem] out of \the [src]." copyitem = null updateUsrDialog() + else if(check_ass()) + ass << "You feel a slight pressure on your ass." + updateUsrDialog() else if(href_list["min"]) if(copies > 1) copies-- @@ -127,6 +134,17 @@ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) anchored = !anchored user << "You [anchored ? "wrench" : "unwrench"] \the [src]." + else if(istype(O, /obj/item/weapon/grab)) //For ass-copying. + var/obj/item/weapon/grab/G = O + if(ismob(G.affecting) && G.affecting != ass) + var/mob/GM = G.affecting + visible_message("[usr] drags [GM.name] onto the photocopier!") + GM.loc = get_turf(src) + ass = GM + if(copyitem) + copyitem.loc = src.loc + copyitem = null + updateUsrDialog() return /obj/machinery/photocopier/ex_act(severity) @@ -203,6 +221,40 @@ visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return p + +/obj/machinery/photocopier/proc/copyass() + var/icon/temp_img + if(ishuman(ass) && (ass.get_item_by_slot(slot_w_uniform) || ass.get_item_by_slot(slot_wear_suit))) + usr << "You feel kind of silly copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "their"] clothes on." + return + if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. + if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon("icons/ass/assalien.png") + else if(ishuman(ass)) //Suit checks are in check_ass + if(ass.gender == MALE) + temp_img = icon("icons/ass/assmale.png") + else if(ass.gender == FEMALE) + temp_img = icon("icons/ass/assfemale.png") + else //In case anyone ever makes the generic ass. For now I'll be using male asses. + temp_img = icon("icons/ass/assmale.png") + else + return + var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) + p.desc = "You see [ass]'s ass on the photo." + p.pixel_x = rand(-10, 10) + p.pixel_y = rand(-10, 10) + p.img = temp_img + var/icon/small_img = icon(temp_img) //Icon() is needed or else temp_img will be rescaled too >.> + var/icon/ic = icon('icons/obj/items.dmi',"photo") + small_img.Scale(8, 8) + ic.Blend(small_img,ICON_OVERLAY, 10, 13) + p.icon = ic + toner -= 5 + if(toner < 0) + toner = 0 + visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") + return p + //If need_toner is 0, the copies will still be lightened when low on toner, however it will not be prevented from printing. TODO: Implement print queues for fax machines and get rid of need_toner /obj/machinery/photocopier/proc/bundlecopy(var/obj/item/weapon/paper_bundle/bundle, var/need_toner=1) var/obj/item/weapon/paper_bundle/p = new /obj/item/weapon/paper_bundle (src) @@ -227,6 +279,41 @@ p.pixel_x = rand(-9, 9) return p + +/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) + check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. + if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass) + return + src.add_fingerprint(user) + if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + visible_message("[usr] jumps onto the photocopier!") + else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target.anchored) return + if(!ishuman(user)) return + visible_message("[usr] drags [target.name] onto the photocopier!") + target.loc = get_turf(src) + ass = target + if(copyitem) + copyitem.loc = src.loc + visible_message("[copyitem] is shoved out of the way by [ass]!") + copyitem = null + updateUsrDialog() + +/obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. + if(!ass) + return 0 + if(ass.loc != src.loc) + ass = null + updateUsrDialog() + return 0 + else if(istype(ass,/mob/living/carbon/human)) + if(!ass.get_item_by_slot(slot_w_uniform) && !ass.get_item_by_slot(slot_wear_suit)) + return 1 + else + return 0 + else + return 1 + /obj/item/device/toner name = "toner cartridge" icon_state = "tonercartridge" From 2694646a7eb184cf9abbf2c0d20a92b26138d596 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 17 Nov 2015 11:37:59 -0500 Subject: [PATCH 19/23] Fixed placing down bent pipes, unfastening HE pipes, fastening uncoupled junction pipe --- code/ATMOSPHERICS/pipes/simple/pipe_simple.dm | 49 ++++++++++--------- .../pipes/simple/pipe_simple_he.dm | 37 +++++++------- code/game/machinery/pipe/construction.dm | 14 ++++-- code/game/turfs/simulated/floor.dm | 10 ++-- 4 files changed, 56 insertions(+), 54 deletions(-) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index c3d1762b993..8ffaf98aa79 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -43,31 +43,32 @@ if(SOUTHWEST) initialize_directions = SOUTH|WEST -/obj/machinery/atmospherics/pipe/simple/initialize() +/obj/machinery/atmospherics/pipe/simple/initialize(initPipe = 1) ..() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions) - N-- - for(var/obj/machinery/atmospherics/target in get_step(src, D)) - if(target.initialize_directions & get_dir(target,src)) - var/c = check_connect_types(target,src) - if(!c) - continue - if(!node1 && N == 1) - target.connected_to = c - connected_to = c - node1 = target - break - if(!node2 && N == 0) - target.connected_to = c - connected_to = c - node2 = target - break - var/turf/T = loc // hide if turf is not intact - hide(T.intact) - update_icon() + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions) + N-- + for(var/obj/machinery/atmospherics/target in get_step(src, D)) + if(target.initialize_directions & get_dir(target,src)) + var/c = check_connect_types(target,src) + if(!c) + continue + if(!node1 && N == 1) + target.connected_to = c + connected_to = c + node1 = target + break + if(!node2 && N == 0) + target.connected_to = c + connected_to = c + node2 = target + break + var/turf/T = loc // hide if turf is not intact + hide(T.intact) + update_icon() /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm index d61126b1414..ce6974e9da4 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm @@ -59,21 +59,23 @@ initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe color = "#404040" -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() - normalize_dir() - var/N = 2 - for(var/D in cardinal) - if(D & initialize_directions_he) - N-- - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) - if(target.initialize_directions_he & get_dir(target,src)) - if(!node1 && N == 1) - node1 = target - break - if(!node2 && N == 0) - node2 = target - break - update_icon() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize(initPipe = 1) + ..(0) + if(initPipe) + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions_he) + N-- + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) + if(target.initialize_directions_he & get_dir(target,src)) + if(!node1 && N == 1) + node1 = target + break + if(!node2 && N == 0) + node2 = target + break + update_icon() /obj/machinery/atmospherics/pipe/simple/heat_exchanging/hidden level=1 @@ -107,6 +109,7 @@ initialize_directions_he = WEST /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() + ..(0) for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) node1 = target @@ -116,10 +119,6 @@ node2 = target break - if(!node1 && !node2) - qdel(src) - return - update_icon() return diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 9815035311e..11361034fbb 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -262,9 +262,15 @@ if(istype(triP) && triP.flipped) icon_state = "m_[icon_state]" -//called when a turf is attacked with a pipe item -// place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact - +// called by turf to know if should treat as bent or not on placement +/obj/item/pipe/proc/is_bent_pipe() + return pipe_type in list( \ + PIPE_SIMPLE_BENT, \ + PIPE_HE_BENT, \ + PIPE_INSULATED_BENT, \ + PIPE_SUPPLY_BENT, \ + PIPE_SCRUBBERS_BENT) + // rotate the pipe item clockwise /obj/item/pipe/verb/rotate() @@ -305,7 +311,7 @@ /obj/item/pipe/Move() ..() - if ((pipe_type in list (PIPE_SIMPLE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT, PIPE_HE_BENT, PIPE_INSULATED_BENT)) \ + if (is_bent_pipe() \ && (src.dir in cardinal)) src.dir = src.dir|turn(src.dir, 90) else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE)) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 9b2e9b7064d..c24482a0da4 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -578,16 +578,14 @@ var/list/wood_icons = list("wood","wood-broken") user << "You need more welding fuel to complete this task." if(istype(C,/obj/item/pipe)) - var/obj/item/pipe/V = C - if(V.pipe_type != -1) // ANY PIPE - var/obj/item/pipe/P = C - + var/obj/item/pipe/P = C + if(P.pipe_type != -1) // ANY PIPE user.visible_message( \ "[user] starts sliding [P] along \the [src].", \ "You slide [P] along \the [src].", \ "You hear the scrape of metal against something.") user.drop_item() - if (P.pipe_type in list (1,3,12)) // bent pipe rotation fix see construction.dm + if (P.is_bent_pipe()) // bent pipe rotation fix see construction.dm P.dir = 5 if (user.dir == 1) P.dir = 6 @@ -595,8 +593,6 @@ var/list/wood_icons = list("wood","wood-broken") P.dir = 9 if (user.dir == 4) P.dir = 10 - if (user.dir == 5) - P.dir = 8 else P.dir = user.dir P.x = src.x From 3919b4a696aa0bc9919cca42b1f2446695066160 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Tue, 17 Nov 2015 13:32:42 -0500 Subject: [PATCH 20/23] Made Main Mining Station's Western Airlock more roomy --- _maps/map_files/cyberiad/z5.dmm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index b39269fa685..a170243f322 100644 --- a/_maps/map_files/cyberiad/z5.dmm +++ b/_maps/map_files/cyberiad/z5.dmm @@ -837,6 +837,7 @@ "qe" = (/obj/structure/ore_box,/obj/machinery/camera{c_tag = "Research Outpost External Airlock"; dir = 8; network = list("Research Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor{icon_state = "warning"},/area/research_outpost/gearstore) "qf" = (/obj/structure/transit_tube{tag = "icon-D-SW"; icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/mine/explored) "qg" = (/obj/effect/glowshroom,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) +"qh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "qi" = (/obj/machinery/door/airlock/external{name = "Mining Bridge"; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/research_outpost/gearstore) "qj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored) "qk" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "research_outer"; locked = 1; name = "Research Outpost External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/research_outpost/gearstore) @@ -1051,6 +1052,10 @@ "ul" = (/turf/simulated/floor/plating/airless,/area/mine/explored) "um" = (/obj/machinery/conveyor{dir = 4; id = "mining_internal"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/mine/production) "un" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor,/area/mine/living_quarters) +"uo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/living_quarters) +"up" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) +"uq" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) +"ur" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) "uz" = (/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/mine/explored) "uA" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/mine/explored) "vn" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored) @@ -1280,7 +1285,6 @@ "zJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor,/area/mine/living_quarters) "zK" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor,/area/mine/living_quarters) "zL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/light,/turf/simulated/floor,/area/mine/living_quarters) -"zM" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "mining_west_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "zN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/camera{c_tag = "Mining Outpost Port Connector"; dir = 1; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/mine/living_quarters) "zO" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/mine/living_quarters) "zP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/space,/area/mine/living_quarters) @@ -1303,7 +1307,6 @@ "Ag" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/mine/living_quarters) "Ah" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Mining Station Maintenance"; req_access_txt = "48"},/turf/simulated/floor/plating,/area/mine/living_quarters) "Ai" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/wall,/area/mine/living_quarters) -"Aj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "mining_west_inner"; locked = 1; name = "Mining External Access"; req_access = null; req_access_txt = null},/turf/simulated/floor,/area/mine/living_quarters) "Ak" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor,/area/mine/lobby) "Al" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/mine/lobby) "Am" = (/obj/structure/disposalpipe/junction,/turf/simulated/wall,/area/mine/production{name = "Mining Station Mech Bay"}) @@ -1324,7 +1327,6 @@ "AB" = (/obj/machinery/light_switch{pixel_y = 23},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AC" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plating,/area/mine/living_quarters) "AD" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) -"AE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AF" = (/obj/machinery/light/small{dir = 4},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "mining_west_sensor"; pixel_x = 25; pixel_y = -5},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "mining_west_pump"; tag_exterior_door = "mining_west_outer"; frequency = 1379; id_tag = "mining_west_airlock"; tag_interior_door = "mining_west_inner"; pixel_x = 25; pixel_y = 5; req_access_txt = null; tag_chamber_sensor = "mining_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor,/area/mine/living_quarters) "AG" = (/obj/machinery/status_display{dir = 4; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor,/area/mine/lobby) "AH" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/mine/lobby) @@ -1344,9 +1346,7 @@ "AV" = (/turf/simulated/floor/plating,/area/mine/living_quarters) "AW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) "AX" = (/obj/machinery/atmospherics/unary/tank/air{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters) -"AY" = (/obj/machinery/camera{c_tag = "Mining Outpost Port Exterior Airlock"; dir = 4; network = list("Mining Outpost")},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters) "AZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) -"Ba" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters) "Bb" = (/turf/space,/area/shuttle/mining/outpost) "Bc" = (/obj/machinery/power/apc{dir = 8; name = "Mining Station Starboard Wing APC"; pixel_x = -27; pixel_y = 2},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/mine/lobby) "Bd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/mine/lobby) @@ -1632,10 +1632,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaewtxTxcxUwNxVxWxXxcwtwtwtwtwtwvsdqCaeaeaeaeaeaeaeaeafafafacacacacacbkbkbkbkbkbkbkacacacafaeaeaeaeaeaeaeaeaeaeaesdqCaeaeaeaeaeaeaeaeaeafafacacxYvNvNvNxZvNvNyaybycyaybvNvNvNvNvNydvNvNweweaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaexOxOyeyfygyhyiyjyjykyoymynyoqCaeaeaenuafafafpepepepepepepeafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtypyqyrwHysytyuyvywsNsMylyAyBujukrArArArArAqTaeaeaeaeafafafacacacacacbkbkbkacacacacafafaeaeuhrArArArArArArArAujukrArArArAqTaeaeaeaeaeafacacacacacxZyCyDyExpxMyFxqxMxFyGyHyIxqxMxpyJyKweweweyLyMyMyMyMyMyMyMyNyNyNyNyNyNyNxOxOxOyOyfyPyQyRySyjyjyTyUyVyWyXyYaeaeaenuafafafpepepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaewtwtwtwtwtyZzazbwtwtzcwtwtwtwtqxqzaeaeaeaeaeqKaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqKaeaeaeaeaeaeaeaeqxqzaeaeaeaeqKaeaeaeaeaeafafntafafacvNvNvNvNxpxMzdzezfxHzgzhzhzizizjzhzkzlzhzlzmzmzmzmzmzmzmzmznznznznznznznzozpzozqzpzrzsztmnzvzwzxyozyzzyoqzaeaeaeaeafafafafpepepepepeafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIzMzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNAjyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADAEAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNAYAZBavNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaewtzAzBzCzDwtzEzFonaeaeaeaeaeqMaeaeaeqSrArAqTaeaeaeaeafacacacacacacacacacacafaeaeuhrAuiaeaeaeaeafaeaeqMaeaeaeaeaeaeqKaeaeaeaeaeaeaewfaeafafafafafvNxpzGzHzIzIzHzJzKzLzIzIqhzHzNzOzOzOzPzPzPzPzPzPzPzPzQzQzQzQzQzQzRzSzSzSzTzUzVzWzXzYzZzYzYzYzYzYzYAaaeaeaeaenuafafafpepepepeafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaewtAbAcAdAewtaeaeaeaeaeaeafafntafaeaeaeaeaeqKaeaeaeaeaeafacacacacacafafafafafaeuhuiaeaeaeafafafafafafntaeaeaeaeaeaeqKaeaeaeaeaeaeaeaeaeaeaeafafvNvNyaAfyavNvNAgAhAivNvNvNuoyavNweaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaaxOxOyfAkAlAmAnAoApAqArAszYwkAtaeaeaeaeaeafafafpepepepeafafafpeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaewtwtwtwtwtwtaeaeafafafafafacacafafaeaeaeaeqKaeaeaeaeaeaeafafafafafafaeaeaeaeaeqKaeaeafafafacacacacacafaeaeaeaeaeaeqKaeaeaesdqCaeaeaeaeaeaeaeafvNAuAvAwAxvNAyAzAAABACvNADupAFvNaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagxNAGAHAIAJAKAKALAMAMANAOAPwsaeaeaeaeaeafafafpepepeafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqSrArArAqTaeaeaeaeaeaeaeaeaeaeaeaeaeqKaeafafacacacacacacacafafaeaeaeaeaeqSrArArAujukrArArAqTaeaeaeaevNAQARASATvNAUAVAVAWAXvNuqAZurvNaeaeaeaeaeaeagagagagagagagBbBbBbBbBbagaaaaxNBcBdBeBfBgBhBiAMAMANAOAPwsaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqSqTaeaesdqCaeaeuhrArArArArAuiaeafacacacacbkbkbkacacafafafaeaeaeaeaeaeaeqxqzaeaeaeqKaeaeaeaexYvNvNvNvNvNBjBkBlBmAXvNvNBnyaxYaeaeaeaeaeaeaaaaagaaaaaaagBbBbBbBbBbagaaxOxOBoBpBqzYBrBsBtBuArAszYwCwDaeaeaeaeafafafpepepeafafafafpepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqMaeaeqSrArAujukrArAuiaeaeaeaeaeaeaeafacacacbkbkbkbkbkacacacafafafafaeaeaeaeaeaeaeaeaeqSrArAqTaeaeaeaeaeaexYvNvNvNvNvNxYAPBvBwBxaeaeaeaeaeaaaaaaagaaaaaaagBbBbBbBbBbByxOBzBABBBCBDxNBEBFBEBEBEBEBEBEudaeaeaeafafafafpepeafafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafntafaeaeaeaeqxqzaeaeaeaeqMaeafafafafafacacbkbkbkbkbkbkbkacacacacacafafafafafafafafaeaeaeaeaeqKaeaeaeaeaeaeaeaeqxBGBHBHBHBHBIqzaeaeaeaeaeaeagagagagagagagagBbBbBbBbBbBJBKBLBMyfBCBNxNBOBPBQBRBSBTBUBVaeaeaeaeafafafafpepeafafafpepepeafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From eb28de5e420de5d8c6b8b9acacfd21070d88166c Mon Sep 17 00:00:00 2001 From: Spacemanspark Date: Tue, 17 Nov 2015 19:31:48 -0600 Subject: [PATCH 21/23] Removes useless return statement from toy chainsaws If this breaks something I'm going to remove Tigercat's soul. --- code/game/objects/items/toys.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 17abde6ca5f..ca5660a3ef7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1442,4 +1442,3 @@ obj/item/toy/cards/deck/syndicate/black else playsound(loc, "swing_hit", 50, 1, -1) ..() - return From 3756d5457e35dbfd00ac1066c3d04ac0f3e03142 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Wed, 18 Nov 2015 10:16:26 -0500 Subject: [PATCH 22/23] Adds species-specific butts and fixes a few bugs --- .../mob/living/carbon/human/species/shadow.dm | 4 +-- .../living/carbon/human/species/species.dm | 2 +- .../living/carbon/human/species/station.dm | 19 ++++++++------- code/modules/paperwork/photocopier.dm | 23 +++++++++--------- icons/ass/assalien.png | Bin 2846 -> 0 bytes icons/ass/assfemale.png | Bin 1884 -> 0 bytes icons/ass/assmale.png | Bin 1966 -> 0 bytes icons/obj/butts.dmi | Bin 0 -> 26480 bytes 8 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 icons/ass/assalien.png delete mode 100644 icons/ass/assfemale.png delete mode 100644 icons/ass/assmale.png create mode 100644 icons/obj/butts.dmi diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3e888c026f8..e2541c7bcb0 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -1,7 +1,7 @@ /datum/species/shadow name = "Shadow" name_plural = "Shadows" - + icobase = 'icons/mob/human_races/r_shadow.dmi' deform = 'icons/mob/human_races/r_shadow.dmi' @@ -12,7 +12,7 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - + butt = "plasma" has_organ = list( "brain" = /obj/item/organ/brain ) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index c65756fce62..dc1bae56c30 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -78,7 +78,7 @@ //Used in icon caching. var/race_key = 0 var/icon/icon_template - + var/butt = "human"//Determines which image to use for copier var/is_small var/show_ssd = 1 var/virus_immune diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 26ef94d472a..55ddc09b787 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -53,7 +53,7 @@ heat_level_3_breathe = 1100 //Default 1000 flesh_color = "#34AF10" - + butt = "unathi" reagent_tag = PROCESS_ORG base_color = "#066000" @@ -98,7 +98,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - + butt = "tajaran" reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" @@ -134,7 +134,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - + butt = "vulp" reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#BE8264" @@ -163,7 +163,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = DIET_HERB - + butt = "skrell" flesh_color = "#8CD7A3" blood_color = "#1D2CBF" reagent_tag = PROCESS_ORG @@ -179,7 +179,7 @@ language = "Vox-pidgin" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 - + butt = "vox" unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ @@ -309,7 +309,7 @@ clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS dietflags = DIET_HERB - + butt = "kidan" blood_color = "#FB9800" reagent_tag = PROCESS_ORG @@ -328,7 +328,7 @@ bodyflags = HAS_SKIN_COLOR bloodflags = BLOOD_SLIME dietflags = DIET_CARN - + butt = "slime" reagent_tag = PROCESS_ORG //ventcrawler = 1 //ventcrawling commented out @@ -355,7 +355,7 @@ flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB - + butt = "grey" reagent_tag = PROCESS_ORG blood_color = "#A200FF" @@ -408,7 +408,7 @@ dietflags = 0 //Diona regenerate nutrition in light, no diet necessary body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - + butt = "diona" blood_color = "#004400" flesh_color = "#907E4A" @@ -503,6 +503,7 @@ clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet + butt = "machine" blood_color = "#1F181F" flesh_color = "#AAAAAA" virus_immune = 1 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 95546429e64..5f4792fdbd5 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -13,7 +13,7 @@ var/copies = 1 //how many copies to print! var/toner = 30 //how much toner is left! woooooo~ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! - var/mob/living/carbon/ass = null + var/mob/living/ass = null /obj/machinery/photocopier/attack_ai(mob/user as mob) return attack_hand(user) @@ -228,15 +228,16 @@ usr << "You feel kind of silly copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "their"] clothes on." return if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. - if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon("icons/ass/assalien.png") - else if(ishuman(ass)) //Suit checks are in check_ass - if(ass.gender == MALE) - temp_img = icon("icons/ass/assmale.png") - else if(ass.gender == FEMALE) - temp_img = icon("icons/ass/assfemale.png") - else //In case anyone ever makes the generic ass. For now I'll be using male asses. - temp_img = icon("icons/ass/assmale.png") + if(ishuman(ass)) //Suit checks are in check_ass + var/mob/living/carbon/human/H = ass + temp_img = icon('icons/obj/butts.dmi', "[H.species.butt]") + else if(istype(ass,/mob/living/silicon/robot/drone)) + temp_img = icon('icons/obj/butts.dmi', "drone") + else if(istype(ass,/mob/living/simple_animal/diona)) + temp_img = icon('icons/obj/butts.dmi', "nymph") + else if(isalien(ass) || istype(ass,/mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon('icons/obj/butts.dmi', "xeno") + else return else return var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (loc) @@ -285,7 +286,7 @@ if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass) return src.add_fingerprint(user) - if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) + if(target == user && !user.incapacitated()) visible_message("[usr] jumps onto the photocopier!") else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) if(target.anchored) return diff --git a/icons/ass/assalien.png b/icons/ass/assalien.png deleted file mode 100644 index d7586f3b5ffd7cc0e16546df86e0ccbac9f1a0c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2846 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 diff --git a/icons/ass/assmale.png b/icons/ass/assmale.png deleted file mode 100644 index c6091cf19154d816f7bd6da55b59b5dcc98eb84c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1966 zcmV;f2T}NmP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A000LaNkl@rqPd~lZU-x&;z`OpKGiUZ%&-1J`YtNo2 zXU?1@OO|ZZsL{A_Cz>LppB0oKSmQq=oT+tyf}UO^s!^d5`p0D+qa+M_P@A&`SRt} zt5-K~-rTTZ!?0n)8aHlSwrtq~1qwvPiWO_ttl5MK6OJE0PARzO&!0myK_dwqMvFIY z+?X(Yy51C8Lvj~@yZWGTj+ zIdkNy_)(iSZRomu`7)(&rOCi4Isz#(lJT*lM~{viInpCO$`a(WpFe*hK&EK+=KA&P z>(;FsGGs{Y+O;D;J9qBXIYg-g4VOO~8Hdp4;nm<-IpsR<6;IAnlBqF1k8<)GX$U_cQB4wTFy5Ibta zv`@5W&mLi7LRZ*2!GVKG1x?s|CL!7IkpUoZ2tpo&+XJzo3_=bZIH3NKw!M4zZrEPW zg4rn07F82Ls8ZMl`(d3A5tv{FSw<@%X`b8;A3i*O{P;*q`QrglVO;qIz09HjauiCU zp{dl$I-^OsahPyM%#8s|OiU!*iy3*p1W+0>Kp@6n@tDlRhSSc?$O5#d;gOM9BwR7V zQD(HYbLY;DY#LEA-~>*X;82{vVdAe65hcuv8n#4c44+3v?}~#+^Ej!9cIqHlym)cs zjPxfQI|9Hl6QF^{96e|RB3XFvBqYR~h05q0=uS+cxt%+AZsp3Ak-qjvJY4}7s9+X2 zOoDvcz3_Cw0&SGKN8vA1dKt(Afyspn7rY8F0<>}jgdlJb7;;aF4Cp=>yLRmg8AHd) zOad7nTAj5<9FQGCk>kaZfWRRS6W&RQ`)efP{Q2_^-9?KQnX3k96H3Dzde{IdI#JYT z-@bj$?T9EIWP%RG0SBFYqtcPDH{`4BoRK~zf@y>pPasiExG{?ix_#wLO{`6Q+Xf66(7btb=biK=Bv9Q5576d3y;!QUWy_X@3m5W_HgDc+ zi4)LJ97eJcG~tdy?<6;0y*hR36fa&}Z;)kCASR%o)tPYha6;_fy<3Bh9z8mC*x6`) z_CzTVgo4;c@({TJ zHfx}M2VCsQ$lCSlPC8r z?9-=@j&df8)w@n*dqey3<;#78`}XbIph1K3<;zDsdh~E3TD^L;loe4~Fi{jrX?@V3 zLEtiF%7h?fU`&@TUFp)Lp=d;)zVbMzS+#1FVh$ZTw0-;bt`jyaa)IgJzyH*!Q~Al4 zaFvBFhPN+p-MV%2<;#~VS1ueWQltn31q&8*U2|!0p;B(!?pn2C#R>(tx4nAxa+i>_ zOIJjQFQ+eqlh20RJ^ib`E@*bCX3d(g2(bYa+tX3d&K#l(pdQMPE&f(qyrDpUZ3AY`Cc_^Ma0uF8~Ft5&T_ zl`5@Ux8{$`x{y41@?_1LHMVW8kL1`5c@W~l0al@h0kRbq-B}*2$#?V>Xv}vDp!ToFcjz+&WfY-88T#$WwK<+VgxeCoH=vg@XVH&Fs_vHq)$ diff --git a/icons/obj/butts.dmi b/icons/obj/butts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cddd1ca66591444578f4e5276e61e23086af3eb2 GIT binary patch literal 26480 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 Date: Wed, 18 Nov 2015 11:55:30 -0500 Subject: [PATCH 23/23] Cleaned up species code, remove naked requirement --- .../mob/living/carbon/human/species/shadow.dm | 1 - .../living/carbon/human/species/species.dm | 1 - .../living/carbon/human/species/station.dm | 10 ------ code/modules/paperwork/photocopier.dm | 36 ++++++++++++++----- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index e2541c7bcb0..3727bd8de0a 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -12,7 +12,6 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - butt = "plasma" has_organ = list( "brain" = /obj/item/organ/brain ) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index dc1bae56c30..c4c2711b1c3 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -78,7 +78,6 @@ //Used in icon caching. var/race_key = 0 var/icon/icon_template - var/butt = "human"//Determines which image to use for copier var/is_small var/show_ssd = 1 var/virus_immune diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 55ddc09b787..bebe8381671 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -53,7 +53,6 @@ heat_level_3_breathe = 1100 //Default 1000 flesh_color = "#34AF10" - butt = "unathi" reagent_tag = PROCESS_ORG base_color = "#066000" @@ -98,7 +97,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - butt = "tajaran" reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" @@ -134,7 +132,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING dietflags = DIET_OMNI - butt = "vulp" reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#BE8264" @@ -163,7 +160,6 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = DIET_HERB - butt = "skrell" flesh_color = "#8CD7A3" blood_color = "#1D2CBF" reagent_tag = PROCESS_ORG @@ -179,7 +175,6 @@ language = "Vox-pidgin" speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 - butt = "vox" unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too. blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ @@ -309,7 +304,6 @@ clothing_flags = HAS_SOCKS bodyflags = FEET_CLAWS dietflags = DIET_HERB - butt = "kidan" blood_color = "#FB9800" reagent_tag = PROCESS_ORG @@ -328,7 +322,6 @@ bodyflags = HAS_SKIN_COLOR bloodflags = BLOOD_SLIME dietflags = DIET_CARN - butt = "slime" reagent_tag = PROCESS_ORG //ventcrawler = 1 //ventcrawling commented out @@ -355,7 +348,6 @@ flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_HERB - butt = "grey" reagent_tag = PROCESS_ORG blood_color = "#A200FF" @@ -408,7 +400,6 @@ dietflags = 0 //Diona regenerate nutrition in light, no diet necessary body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not - butt = "diona" blood_color = "#004400" flesh_color = "#907E4A" @@ -503,7 +494,6 @@ clothing_flags = HAS_SOCKS bodyflags = HAS_SKIN_COLOR dietflags = 0 //IPCs can't eat, so no diet - butt = "machine" blood_color = "#1F181F" flesh_color = "#AAAAAA" virus_immune = 1 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 5f4792fdbd5..39c5442c7e7 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -224,13 +224,36 @@ /obj/machinery/photocopier/proc/copyass() var/icon/temp_img - if(ishuman(ass) && (ass.get_item_by_slot(slot_w_uniform) || ass.get_item_by_slot(slot_wear_suit))) - usr << "You feel kind of silly copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "their"] clothes on." - return if(check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. if(ishuman(ass)) //Suit checks are in check_ass var/mob/living/carbon/human/H = ass - temp_img = icon('icons/obj/butts.dmi', "[H.species.butt]") + switch(H.get_species()) + if("Human") + temp_img = icon('icons/obj/butts.dmi', "human") + if("Tajaran") + temp_img = icon('icons/obj/butts.dmi', "tajaran") + if("Unathi") + temp_img = icon('icons/obj/butts.dmi', "unathi") + if("Skrell") + temp_img = icon('icons/obj/butts.dmi', "skrell") + if("Vox") + temp_img = icon('icons/obj/butts.dmi', "vox") + if("Kidan") + temp_img = icon('icons/obj/butts.dmi', "kidan") + if("Grey") + temp_img = icon('icons/obj/butts.dmi', "grey") + if("Diona") + temp_img = icon('icons/obj/butts.dmi', "diona") + if("Slime People") + temp_img = icon('icons/obj/butts.dmi', "slime") + if("Vulpkanin") + temp_img = icon('icons/obj/butts.dmi', "vulp") + if("Machine") + temp_img = icon('icons/obj/butts.dmi', "machine") + if("Plasmaman") + temp_img = icon('icons/obj/butts.dmi', "plasma") + else + temp_img = icon('icons/obj/butts.dmi', "human") else if(istype(ass,/mob/living/silicon/robot/drone)) temp_img = icon('icons/obj/butts.dmi', "drone") else if(istype(ass,/mob/living/simple_animal/diona)) @@ -307,11 +330,6 @@ ass = null updateUsrDialog() return 0 - else if(istype(ass,/mob/living/carbon/human)) - if(!ass.get_item_by_slot(slot_w_uniform) && !ass.get_item_by_slot(slot_wear_suit)) - return 1 - else - return 0 else return 1