From 6887e948522e3d2e24acba4fc275b21b1057deea Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Fri, 21 Jun 2013 03:40:34 -0300 Subject: [PATCH 01/53] Only monkeys and humans can shove mobs into disposal units now. --- code/modules/recycling/disposal.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index bfdea52409a..dd58ecd20f0 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -143,6 +143,7 @@ V.show_message("[usr] starts climbing into the disposal.", 3) if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) if(target.anchored) return + if(!ishuman(user) && !ismonkey(user)) return V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3) if(!do_after(usr, 20)) return From c10b680a5467e3ab1ca0724e186bd0d72111e46c Mon Sep 17 00:00:00 2001 From: Incoming Date: Thu, 27 Jun 2013 15:23:58 -0400 Subject: [PATCH 02/53] Attempting to ghost while in critical will now succumb then ghost as a courtesy to streamline the ragequit experience --- code/modules/mob/dead/observer/observer.dm | 2 ++ code/modules/mob/living/living.dm | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index ae343e49f5f..6052046534f 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -71,6 +71,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Ghost" set desc = "Relinquish your life and enter the land of the dead." + if(stat != DEAD) + succumb() if(stat == DEAD) ghostize(1) else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b0955f512af..d3e7133fc63 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -12,7 +12,7 @@ src.adjustOxyLoss(src.health + 200) src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() src << "\blue You have given up life and succumbed to death." - + src.stat = DEAD /mob/living/proc/updatehealth() From 3524c23528d0bb161cdcb2e1a153c6fdea10c574 Mon Sep 17 00:00:00 2001 From: Incoming Date: Fri, 28 Jun 2013 14:10:13 -0400 Subject: [PATCH 03/53] Succumb() now calls Death() instead of modifying stat directly --- code/modules/mob/living/living.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index d3e7133fc63..574171d02c3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -12,7 +12,7 @@ src.adjustOxyLoss(src.health + 200) src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() src << "\blue You have given up life and succumbed to death." - src.stat = DEAD + death() /mob/living/proc/updatehealth() From 4fb864ed1bbea0bd5d0bafd5fb0f1fcd2177f342 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Mon, 1 Jul 2013 02:08:20 -0300 Subject: [PATCH 04/53] Made a new proc for grenades, update_mob(), it will be called in all the different prime() procs. This will drop the grenade of a mob and update his sprite, using the proper inventory proc. It will be only triggered if the loc is a mob. Standardized all the grenades files. --- .../items/weapons/grenades/chem_grenade.dm | 4 + .../items/weapons/grenades/emgrenade.dm | 9 +- .../items/weapons/grenades/flashbang.dm | 173 +++++++++--------- .../objects/items/weapons/grenades/grenade.dm | 15 +- .../items/weapons/grenades/smokebomb.dm | 44 ++--- .../items/weapons/grenades/spawnergrenade.dm | 35 ++-- .../items/weapons/grenades/syndieminibomb.dm | 9 +- 7 files changed, 141 insertions(+), 148 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 2abf087a824..516aeb52008 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -157,6 +157,8 @@ playsound(loc, 'sound/effects/bamf.ogg', 50, 1) + update_mob() + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to(src, G.reagents.total_volume) @@ -208,6 +210,8 @@ playsound(loc, 'sound/effects/bamf.ogg', 50, 1) + update_mob() + if(valid_core) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to(valid_core, G.reagents.total_volume) diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index 9edf68a60ac..77ca1d65bea 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -4,9 +4,8 @@ item_state = "emp" origin_tech = "materials=2;magnets=3" - prime() - ..() - if(empulse(src, 4, 10)) - del(src) - return +/obj/item/weapon/grenade/empgrenade/prime() + update_mob() + empulse(src, 4, 10) + del(src) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2ff047a7465..36ea6b5521e 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -5,98 +5,97 @@ origin_tech = "materials=2;combat=1" var/banglet = 0 - prime() - ..() - for(var/obj/structure/closet/L in view(get_turf(src), null)) - if(locate(/mob/living/carbon/, L)) - for(var/mob/living/carbon/M in L) - bang(get_turf(src), M) +/obj/item/weapon/grenade/flashbang/prime() + update_mob() + for(var/obj/structure/closet/L in view(get_turf(src), null)) + if(locate(/mob/living/carbon/, L)) + for(var/mob/living/carbon/M in L) + bang(get_turf(src), M) - for(var/mob/living/carbon/M in viewers(get_turf(src), null)) - bang(get_turf(src), M) + for(var/mob/living/carbon/M in viewers(get_turf(src), null)) + bang(get_turf(src), M) - for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) - B.health -= damage - B.update_icon() - del(src) - return + for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here + var/damage = round(30/(get_dist(B,get_turf(src))+1)) + B.health -= damage + B.update_icon() + del(src) - proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. - if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging - for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. - S.active = 0 // -- Polymorph - S.icon_state = "shield0" +/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. + if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging + for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. + S.active = 0 // -- Polymorph + S.icon_state = "shield0" - M << "\red BANG" - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + M << "\red BANG" + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) //Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 - if(iscarbon(M)) - eye_safety = M.eyecheck() - if(ishuman(M)) - if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) - ear_safety += 2 - if(HULK in M.mutations) - ear_safety += 1 - if(istype(M:head, /obj/item/clothing/head/helmet)) - ear_safety += 1 + var/eye_safety = 0 + var/ear_safety = 0 + if(iscarbon(M)) + eye_safety = M.eyecheck() + if(ishuman(M)) + if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) + ear_safety += 2 + if(HULK in M.mutations) + ear_safety += 1 + if(istype(M:head, /obj/item/clothing/head/helmet)) + ear_safety += 1 //Flashing everyone - if(eye_safety < 1) - flick("e_flash", M.flash) - M.eye_stat += rand(1, 3) - M.Stun(2) - M.Weaken(10) + if(eye_safety < 1) + flick("e_flash", M.flash) + M.eye_stat += rand(1, 3) + M.Stun(2) + M.Weaken(10) //Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) - if(ear_safety > 0) - M.Stun(2) - M.Weaken(1) + if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) + if(ear_safety > 0) + M.Stun(2) + M.Weaken(1) + else + M.Stun(10) + M.Weaken(3) + if ((prob(14) || (M == src.loc && prob(70)))) + M.ear_damage += rand(1, 10) else - M.Stun(10) - M.Weaken(3) - if ((prob(14) || (M == src.loc && prob(70)))) - M.ear_damage += rand(1, 10) - else - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) + M.ear_damage += rand(0, 5) + M.ear_deaf = max(M.ear_deaf,15) - else if(get_dist(M, T) <= 5) - if(!ear_safety) - M.Stun(8) - M.ear_damage += rand(0, 3) - M.ear_deaf = max(M.ear_deaf,10) + else if(get_dist(M, T) <= 5) + if(!ear_safety) + M.Stun(8) + M.ear_damage += rand(0, 3) + M.ear_deaf = max(M.ear_deaf,10) - else if(!ear_safety) - M.Stun(4) - M.ear_damage += rand(0, 1) - M.ear_deaf = max(M.ear_deaf,5) + else if(!ear_safety) + M.Stun(4) + M.ear_damage += rand(0, 1) + M.ear_deaf = max(M.ear_deaf,5) //This really should be in mob not every check - if (M.eye_stat >= 20) - M << "\red Your eyes start to burn badly!" - M.disabilities |= NEARSIGHTED - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.eye_stat - 20 + 1)) - M << "\red You can't see anything!" - M.sdisabilities |= BLIND - if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" - M.sdisabilities |= DEAF - else - if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" - M.update_icons() + if (M.eye_stat >= 20) + M << "\red Your eyes start to burn badly!" + M.disabilities |= NEARSIGHTED + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if (prob(M.eye_stat - 20 + 1)) + M << "\red You can't see anything!" + M.sdisabilities |= BLIND + if (M.ear_damage >= 15) + M << "\red Your ears start to ring badly!" + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if (prob(M.ear_damage - 10 + 5)) + M << "\red You can't hear anything!" + M.sdisabilities |= DEAF + else + if (M.ear_damage >= 5) + M << "\red Your ears start to ring!" + M.update_icons() /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve @@ -106,6 +105,7 @@ icon_state = "clusterbang" /obj/item/weapon/grenade/flashbang/clusterbang/prime() + update_mob() var/numspawned = rand(4,8) var/again = 0 for(var/more = numspawned,more > 0,more--) @@ -124,7 +124,6 @@ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) spawn(0) del(src) - return /obj/item/weapon/grenade/flashbang/clusterbang/segment desc = "A smaller segment of a clusterbang. Better run." @@ -135,7 +134,6 @@ /obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode icon_state = "clusterbang_segment_active" active = 1 - banglet = 1 var/stepdist = rand(1,4)//How far to step var/temploc = src.loc//Saves the current location to know where to step away from walk_away(src,temploc,stepdist)//I must go, my people need me @@ -145,6 +143,7 @@ ..() /obj/item/weapon/grenade/flashbang/clusterbang/segment/prime() + update_mob() var/numspawned = rand(4,8) for(var/more = numspawned,more > 0,more--) if(prob(35)) @@ -156,17 +155,15 @@ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) spawn(0) del(src) - return /obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang - spawn(0) - icon_state = "flashbang_active" - active = 1 - banglet = 1 - var/stepdist = rand(1,3) - var/temploc = src.loc - walk_away(src,temploc,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - prime() - ..() \ No newline at end of file + ..() + icon_state = "flashbang_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,3) + var/temploc = src.loc + walk_away(src,temploc,stepdist) + var/dettime = rand(15,60) + spawn(dettime) + prime() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index eeaf7ada8ca..7619df49775 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -69,18 +69,15 @@ var/mob/living/carbon/C = user C.throw_mode_on() spawn(det_time) - if(user) - user.drop_item() prime() - return - return /obj/item/weapon/grenade/proc/prime() -// playsound(loc, 'sound/items/Welder2.ogg', 25, 1) - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) + +/obj/item/weapon/grenade/proc/update_mob() + if(ismob(loc)) + var/mob/M = loc + M.drop_from_inventory(src) /obj/item/weapon/grenade/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -100,12 +97,10 @@ user << "You set the [name] for instant detonation." add_fingerprint(user) ..() - return /obj/item/weapon/grenade/attack_hand() walk(src, null, null) ..() - return /obj/item/weapon/grenade/attack_paw(mob/user as mob) return attack_hand(user) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index ea6ab037bc4..da5c22b8177 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -9,27 +9,27 @@ slot_flags = SLOT_BELT var/datum/effect/effect/system/bad_smoke_spread/smoke - New() - ..() - src.smoke = new /datum/effect/effect/system/bad_smoke_spread - src.smoke.attach(src) +/obj/item/weapon/grenade/smokebomb/New() + ..() + src.smoke = new /datum/effect/effect/system/bad_smoke_spread + src.smoke.attach(src) - prime() - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - src.smoke.set_up(10, 0, usr.loc) - spawn(0) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() +/obj/item/weapon/grenade/smokebomb/prime() + update_mob() + playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + src.smoke.set_up(10, 0, usr.loc) + spawn(0) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() - for(var/obj/effect/blob/B in view(8,src)) - var/damage = round(30/(get_dist(B,src)+1)) - B.health -= damage - B.update_icon() - sleep(80) - del(src) - return + for(var/obj/effect/blob/B in view(8,src)) + var/damage = round(30/(get_dist(B,src)+1)) + B.health -= damage + B.update_icon() + sleep(80) + del(src) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index efb6ac1e755..9546c9c166b 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -9,27 +9,26 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. +/obj/item/weapon/grenade/spawnergrenade/prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. + update_mob() + if(spawner_type && deliveryamt) + // Make a quick flash + var/turf/T = get_turf(src) + playsound(T, 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/carbon/human/M in viewers(T, null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) // flash dose faggots - if(spawner_type && deliveryamt) - // Make a quick flash - var/turf/T = get_turf(src) - playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots + for(var/i=1, i<=deliveryamt, i++) + var/atom/movable/x = new spawner_type + x.loc = T + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(x, pick(NORTH,SOUTH,EAST,WEST)) - for(var/i=1, i<=deliveryamt, i++) - var/atom/movable/x = new spawner_type - x.loc = T - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(x, pick(NORTH,SOUTH,EAST,WEST)) + // Spawn some hostile syndicate critters - // Spawn some hostile syndicate critters - - del(src) - return + del(src) /obj/item/weapon/grenade/spawnergrenade/manhacks name = "manhack delivery grenade" diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index f6328964dfe..7dbb3431e62 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -6,8 +6,7 @@ item_state = "flashbang" origin_tech = "materials=3;magnets=4;syndicate=4" - prime() - explosion(src.loc,1,2,4) - del(src) - - return \ No newline at end of file +/obj/item/weapon/grenade/syndieminibomb/prime() + update_mob() + explosion(src.loc,1,2,4) + del(src) \ No newline at end of file From bae32ad4fafd8497f30f45d35c2fb20ac4c2a885 Mon Sep 17 00:00:00 2001 From: Tenebrosity Date: Mon, 1 Jul 2013 23:47:43 +1200 Subject: [PATCH 05/53] - Fixes simple_animal attack messages, no longer will "John Donk You try to help Strong Hivebot" be a thing - Removes hivebot capitalisation so that they're referred to by the game as "the hivebot" instead of "Hivebot", which is in line with other simple animals, like aliens --- .../mob/living/simple_animal/hostile/hivebot.dm | 12 ++++++------ .../mob/living/simple_animal/simple_animal.dm | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index ccf015adcba..c8a74487949 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -3,8 +3,8 @@ damage_type = BRUTE /mob/living/simple_animal/hostile/hivebot - name = "Hivebot" - desc = "A small robot" + name = "hivebot" + desc = "A small robot." icon = 'icons/mob/hivebot.dmi' icon_state = "basic" icon_living = "basic" @@ -28,7 +28,7 @@ minbodytemp = 0 /mob/living/simple_animal/hostile/hivebot/range - name = "Hivebot" + name = "hivebot" desc = "A smallish robot, this one is armed!" ranged = 1 @@ -37,7 +37,7 @@ rapid = 1 /mob/living/simple_animal/hostile/hivebot/strong - name = "Strong Hivebot" + name = "strong hivebot" desc = "A robot, this one is armed and looks tough!" health = 80 ranged = 1 @@ -54,8 +54,8 @@ return /mob/living/simple_animal/hostile/hivebot/tele//this still needs work - name = "Beacon" - desc = "Some odd beacon thing" + name = "beacon" + desc = "Some odd beacon thing." icon = 'icons/mob/hivebot.dmi' icon_state = "def_radar-off" icon_living = "def_radar-off" diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index dd9c173010e..f2a9d1702f4 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -24,9 +24,9 @@ var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. //Interaction - var/response_help = "You try to help" - var/response_disarm = "You try to disarm" - var/response_harm = "You try to hurt" + var/response_help = "pokes" + var/response_disarm = "shoves" + var/response_harm = "hits" var/harm_intent_damage = 3 //Temperature effect From 1dacc1707067524eab5266fa06e2867a9004d28b Mon Sep 17 00:00:00 2001 From: Giacomand Date: Wed, 3 Jul 2013 21:08:50 +0100 Subject: [PATCH 06/53] Blueprint areas will now have dynamic lighting. --- code/controllers/_DynamicAreaLighting_TG.dm | 6 ++++++ code/game/objects/items/blueprints.dm | 2 ++ 2 files changed, 8 insertions(+) diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index 63a7398b7bc..09f6b60d191 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -252,6 +252,12 @@ area overlays += lighting_overlay + proc/SetDynamicLighting() + + src.lighting_use_dynamic = 1 + for(var/turf/T in src.contents) + T.update_lumcount(0) + proc/InitializeLighting() //TODO: could probably improve this bit ~Carn if(!tag) tag = "[type]" if(!lighting_use_dynamic) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index d8479d11d99..cfd082ceadf 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -131,6 +131,8 @@ move an amendment to the drawing.

A.power_environ = 0 A.always_unpowered = 0 move_turfs_to_area(turfs, A) + A.SetDynamicLighting() + spawn(5) //ma = A.master ? "[A.master]" : "(null)" //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]" From 4d6a02fd93ef2fc4b1a596de34315e8c2ab63c6f Mon Sep 17 00:00:00 2001 From: Tenebrosity Date: Thu, 4 Jul 2013 13:59:36 +1200 Subject: [PATCH 07/53] Raises the damage caps on the head and torso to 200. --- code/datums/limbs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/limbs.dm b/code/datums/limbs.dm index 39b9881aceb..ef73eec5ece 100644 --- a/code/datums/limbs.dm +++ b/code/datums/limbs.dm @@ -12,13 +12,13 @@ /datum/limb/chest name = "chest" icon_name = "chest" - max_damage = 150 + max_damage = 200 body_part = CHEST /datum/limb/head name = "head" icon_name = "head" - max_damage = 125 + max_damage = 200 body_part = HEAD /datum/limb/l_arm From ce0b115b5dba2c595aa5dd54b81cbdf1962552aa Mon Sep 17 00:00:00 2001 From: Giacomand Date: Thu, 4 Jul 2013 13:31:06 +0100 Subject: [PATCH 08/53] Updated the health analyser interface to be more usable. Cleaned up the code. Removed the copy and paste of the PDA medical scanner. Removed monkey gamemode checks. Removed the unused PDA detective scanning code. --- code/game/objects/items/devices/PDA/PDA.dm | 45 ++-------- code/game/objects/items/devices/scanners.dm | 97 ++++++++++++--------- 2 files changed, 61 insertions(+), 81 deletions(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9228b425b8c..7cb46a33d89 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -887,49 +887,14 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob) if(istype(C)) switch(scanmode) + if(1) - - for (var/mob/O in viewers(C, null)) - O.show_message("\red [user] has analyzed [C]'s vitals!", 1) - - user.show_message("\blue Analyzing Results for [C]:") - user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1) - user.show_message("\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]", 1) - user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) - if(C.tod && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) - user.show_message("\blue \t Time of Death: [C.tod]") - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) - if(length(damaged)>0) - for(var/datum/limb/org in damaged) - user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) - else - user.show_message("\blue \t Limbs are OK.",1) - - for(var/datum/disease/D in C.viruses) - if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.visible_message(text("[] has analyzed []'s vitals!", user, C)) + healthscan(user, C, 1) + src.add_fingerprint(user) if(2) - if(!istype(C.dna)) - user << "\blue No fingerprints found on [C]" - else if(!istype(C, /mob/living/carbon/monkey)) - if(!isnull(C:gloves)) - user << "\blue No fingerprints found on [C]" - else - user << text("\blue [C]'s Fingerprints: [md5(C.dna.uni_identity)]") - if ( !(C:blood_DNA) ) - user << "\blue No blood found on [C]" - if(C:blood_DNA) - del(C:blood_DNA) - else - user << "\blue Blood found on [C]. Analysing..." - spawn(15) - for(var/blood in C:blood_DNA) - user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]" + // Unused if(4) for (var/mob/O in viewers(C, null)) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e753d4f51bc..9d7401c7132 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -76,61 +76,79 @@ MASS SPECTROMETER var/mode = 1; /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) - if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) - user << text("\red You try to analyze the floor's vitals!") - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1) - user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) - user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue Body Temperature: ???", 1) + + // Clumsiness/brain damage check + if (CLUMSY in user.mutations || user.getBrainLoss() >= 60 && prob(50)) + user << text("You try to analyze the floor's vitals!") + user.visible_message(text("[user] has analyzed the floor's vitals!")) + user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) + user.show_message(text("\t Damage Specifics: 0-0-0-0"), 1) + user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("Body Temperature: ???", 1) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1) - //Foreach goto(67) - var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) + + + user.visible_message(text("[] has analyzed []'s vitals!", user, M)) + + healthscan(user, M, mode) + + src.add_fingerprint(user) + return + +// Used by the PDA medical scanner too +/proc/healthscan(var/mob/living/user, var/mob/living/M, var/mode = 1) + + //Damage specifics + var/oxy_loss = M.getOxyLoss() + var/tox_loss = M.getToxLoss() + var/fire_loss = M.getFireLoss() + var/brute_loss = M.getBruteLoss() + var/mob_status = (M.stat > 1 ? "Deceased" : text("[]% healthy", M.health - M.halloss)) + if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) - else - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + mob_status = "Deceased" + oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss + + user.show_message(text("Analyzing Results for []:\n\t Overall Status: []", M, mob_status), 1) + user.show_message(text("\t Damage Specifics: []-[]-[]-[]", oxy_loss, tox_loss, fire_loss, brute_loss), 1) + + user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + + // Time of death if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("\blue Time of Death: [M.tod]") + user.show_message("Time of Death: [M.tod]") + + // Organ damage report if(istype(M, /mob/living/carbon/human) && mode == 1) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) + user.show_message("Localized Damage, Burn/Brute:",1) if(length(damaged)>0) for(var/datum/limb/org in damaged) - user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) + user.show_message(text("\t []: []-[]", capitalize(org.getDisplayName()), (org.burn_dam > 0) ? "[org.burn_dam]" : 0, (org.brute_dam > 0) ? "[org.brute_dam]" : 0), 1) else - user.show_message("\blue \t Limbs are OK.",1) + user.show_message("\t Limbs are OK.",1) + + // Damage descriptions + + user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", brute_loss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) - if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) - else - user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) if (M.getCloneLoss()) - user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1) + user.show_message(text("Subject appears to have been imperfectly cloned."), 1) + for(var/datum/disease/D in M.viruses) if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.show_message(text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) - user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) + user.show_message(text("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) if (M.getBrainLoss() >= 100 || !getbrain(M)) - user.show_message(text("\red Subject is brain dead."), 1) + user.show_message(text("Subject brain function is non-existant."), 1) else if (M.getBrainLoss() >= 60) - user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1) + user.show_message(text("Severe brain damage detected. Subject likely to have mental retardation."), 1) else if (M.getBrainLoss() >= 10) - user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1) - src.add_fingerprint(user) - return + user.show_message(text("Significant brain damage detected. Subject may have had a concussion."), 1) /obj/item/device/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -163,9 +181,6 @@ MASS SPECTROMETER if (user.stat) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return var/turf/location = user.loc if (!( istype(location, /turf) )) From 2496684ff26843f9d2abe1a3bacf75e33af2a19f Mon Sep 17 00:00:00 2001 From: Giacomand Date: Thu, 4 Jul 2013 13:36:05 +0100 Subject: [PATCH 09/53] Burns to Burn, to be more consistent. --- code/game/objects/items/devices/scanners.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 9d7401c7132..a3c88d2038d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -83,7 +83,7 @@ MASS SPECTROMETER user.visible_message(text("[user] has analyzed the floor's vitals!")) user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) user.show_message(text("\t Damage Specifics: 0-0-0-0"), 1) - user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("Key: Suffocation/Toxin/Burn/Brute", 1) user.show_message("Body Temperature: ???", 1) return @@ -112,7 +112,7 @@ MASS SPECTROMETER user.show_message(text("Analyzing Results for []:\n\t Overall Status: []", M, mob_status), 1) user.show_message(text("\t Damage Specifics: []-[]-[]-[]", oxy_loss, tox_loss, fire_loss, brute_loss), 1) - user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) + user.show_message("Key: Suffocation/Toxin/Burn/Brute", 1) user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) // Time of death From fa5049ca856e94788c185a3f1f6d5386fde1dad3 Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 4 Jul 2013 10:33:52 -0300 Subject: [PATCH 10/53] Windows have a new proc, can_be_reached(), it will check if there's an object blocking the way on the turf if a mob clicks on the window. It will make some pretty dir checks and then use CanPass(). And before it starts, it checks if it's a full tile window too. --- code/game/objects/structures/window.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5fa32b1e03a..61e863bd604 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -98,6 +98,8 @@ /obj/structure/window/attack_hand(mob/user as mob) + if(!can_be_reached(user)) + return if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) user.visible_message("[user] smashes through [src]!") @@ -114,6 +116,8 @@ /obj/structure/window/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime + if(!can_be_reached(user)) + return health -= damage if(health <= 0) user.visible_message("[user] smashes through [src]!") @@ -142,6 +146,8 @@ /obj/structure/window/attackby(obj/item/I, mob/user) + if(!can_be_reached(user)) + return 1 //returning 1 will skip the afterattack() if(istype(I, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state @@ -173,6 +179,14 @@ ..() return +/obj/structure/window/proc/can_be_reached(mob/user) + if(!is_fulltile()) + if(get_dir(user,src) & dir) + for(var/obj/O in loc) + if(!O.CanPass(user, user.loc, 1, 0)) + return 0 + return 1 + /obj/structure/window/proc/hit(var/damage, var/sound_effect = 1) if(reinf) damage *= 0.5 health = max(0, health - damage) From 629488822211f902a2ab7b7a6c45a30f31c6f40b Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Thu, 4 Jul 2013 12:07:02 -0300 Subject: [PATCH 11/53] The mop will now check for water to clean the floor. This will stop people from cleaning the floor with fuel, avoiding the slippery floors. --- code/game/objects/items/weapons/mop.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index d98f79aa097..fd3f2e8c7f2 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -19,12 +19,13 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) + if(reagents.has_reagent("water", 1)) + A.clean_blood() + for(var/obj/effect/O in A) + if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) + del(O) reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents - A.clean_blood() - for(var/obj/effect/O in A) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) /obj/item/weapon/mop/afterattack(atom/A, mob/user) From 0a244dc7b7c79a3d1a0bd74e0a24d2a31075f3ad Mon Sep 17 00:00:00 2001 From: Aranclanos Date: Sun, 7 Jul 2013 02:03:58 -0300 Subject: [PATCH 12/53] The item_action buttons will now recycle themselves, instead of getting deleting each tick to generate new ones. These buttons are the ones top left of the human screen, usually toggling on and off certain items. I expect to reduce 50% the amount of atom/movable/Del() calls with this. --- code/datums/hud.dm | 2 +- code/modules/mob/living/carbon/human/hud.dm | 26 ++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 4d251c0cdca..047a42e31ba 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -175,7 +175,7 @@ var/datum/global_hud/global_hud = new() var/list/other var/list/obj/screen/hotkeybuttons - var/list/obj/screen/item_action/item_action_list //Used for the item action ui buttons. + var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. datum/hud/New(mob/owner) diff --git a/code/modules/mob/living/carbon/human/hud.dm b/code/modules/mob/living/carbon/human/hud.dm index 58a1d4f672b..e2514d64150 100644 --- a/code/modules/mob/living/carbon/human/hud.dm +++ b/code/modules/mob/living/carbon/human/hud.dm @@ -330,23 +330,29 @@ return client.screen -= hud_used.item_action_list - hud_used.item_action_list = list() for(var/obj/item/I in src) if(I.action_button_name) - var/obj/screen/item_action/A = new(hud_used) + if(hud_used.item_action_list.len < num) + var/obj/screen/item_action/N = new(hud_used) + hud_used.item_action_list += N + + var/obj/screen/item_action/A = hud_used.item_action_list[num] + A.icon = ui_style2icon(client.prefs.UI_style) A.icon_state = "template" - var/image/img = image(I.icon, I.icon_state) + + A.overlays = list() + var/image/img = image(I.icon, A, I.icon_state) img.pixel_x = 0 img.pixel_y = 0 A.overlays += img - if(I.action_button_name) - A.name = I.action_button_name - else - A.name = "Use [I.name]" + + A.name = I.action_button_name A.owner = I - hud_used.item_action_list += A + + client.screen += hud_used.item_action_list[num] + switch(num) if(1) A.screen_loc = ui_action_slot1 @@ -359,6 +365,4 @@ if(5) A.screen_loc = ui_action_slot5 break //5 slots available, so no more can be added. - num++ - - client.screen += hud_used.item_action_list \ No newline at end of file + num++ \ No newline at end of file From 84724a5e2b2452d0228d00647e6ee169768aeb66 Mon Sep 17 00:00:00 2001 From: Malkevin Date: Sun, 7 Jul 2013 19:30:51 +0100 Subject: [PATCH 13/53] Disabled disposals auto-routing for packages. For some reason package wrapped objects were set to auto-reroute to disposals, I can't think a good reason for this to happen but i can think of a bad one: people's mail ends up getting lost to a murder room due to someone else's neglect/incompetence - probably one of the main reasons the mail room doesn't get used very often. So what will happen now is that packages that are put on the conveyor without a destination will loop back around and come back out the mail chute until a cargo tech works out how to use a destination tagger --- code/modules/recycling/sortingmachinery.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 910e36a27aa..5edda0037b3 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -253,14 +253,14 @@ var/deliveryCheck = 0 var/obj/structure/disposalholder/H = new() // virtual holder object which actually // travels through the pipes. - for(var/obj/structure/bigDelivery/O in src) +/* for(var/obj/structure/bigDelivery/O in src) + deliveryCheck = 1 + if(O.sortTag == 0) //This auto-sorts package wrapped objects to disposals + O.sortTag = 1 //Cargo techs can do this themselves with their taggers + for(var/obj/item/smallDelivery/O in src) //With this disabled packages will loop back round and come out the mail chute deliveryCheck = 1 if(O.sortTag == 0) - O.sortTag = 1 - for(var/obj/item/smallDelivery/O in src) - deliveryCheck = 1 - if(O.sortTag == 0) - O.sortTag = 1 + O.sortTag = 1 */ if(deliveryCheck == 0) H.destinationTag = 1 From 076261336cb7786389713180bd9a84509fe8bc28 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Sun, 7 Jul 2013 23:49:45 +0100 Subject: [PATCH 14/53] You can now drag your radio to you to open the interface. --- code/game/objects/items/devices/radio/radio.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 52ce6f0ce7b..1a0ffa821f6 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -55,6 +55,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use initialize() +/obj/item/device/radio/MouseDrop(obj/over_object as obj, src_location, over_location) + var/mob/M = usr + if((!istype(over_object, /obj/screen)) && src.loc == M) + return attack_self(M) + return + + /obj/item/device/radio/initialize() if(freerange) @@ -797,4 +804,4 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /obj/item/device/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag. - listening = 0 // And it's nice to have a subtype too for future features. + listening = 0 // And it's nice to have a subtype too for future features. From 7ef7c1a55cfd09c191b054d901334362248f52cc Mon Sep 17 00:00:00 2001 From: Malkevin Date: Sun, 7 Jul 2013 23:58:16 +0100 Subject: [PATCH 15/53] Atmos Analyzers added to Atmos -Atmos Techs spawn with an analyzer in their pocket -Added 3 analyzers to the atmos tech's wardrobe -Added Analyzers to the autolathe. They're a little redundant with PDAs having in built atmos analyzers but as an atmos tech I find them clunky to use for wide areas and prefer hand analyzers due to them not taking away focus. Ironically atmospherics had none of these scanners nearby. --- code/game/jobs/job/engineering.dm | 1 + code/game/machinery/autolathe.dm | 1 + .../game/objects/structures/crates_lockers/closets/wardrobe.dm | 3 +++ 3 files changed, 5 insertions(+) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index a6211b5ba3e..eb069bc7abd 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -93,6 +93,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store) + H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index a98d0ba9c0b..72c03c8d9c5 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -7,6 +7,7 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/device/flashlight(), \ new /obj/item/weapon/extinguisher(), \ new /obj/item/device/multitool(), \ + new /obj/item/device/analyzer() \ new /obj/item/device/t_scanner(), \ new /obj/item/weapon/weldingtool(), \ new /obj/item/weapon/screwdriver(), \ diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index ab3c89365cd..f123d0a9fa0 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -142,6 +142,9 @@ new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) + new /obj/item/device/analyzer(src) + new /obj/item/device/analyzer(src) + new /obj/item/device/analyzer(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) From 28218f2a9107566bdcf45c477629fd80e698787a Mon Sep 17 00:00:00 2001 From: Malkevin Date: Mon, 8 Jul 2013 00:41:24 +0100 Subject: [PATCH 16/53] Air Alarm Electronics sprites Nothing fancy, adds some sprites for air alarm electronics so they're not using the airlock electronic sprites. It's an APC module with the circuit board flipped 90 degrees --- code/game/machinery/alarm.dm | 4 ++-- icons/obj/module.dmi | Bin 1175 -> 11198 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index dccfb930f63..cf2cfc5fb30 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1055,8 +1055,8 @@ Just a object used in constructing air alarms */ /obj/item/weapon/airalarm_electronics name = "air alarm electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - icon_state = "door_electronics" + icon = 'icons/obj/module.dmi' + icon_state = "airalarm_electronics" desc = "Looks like a circuit. Probably is." w_class = 2.0 m_amt = 50 diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi index 3290ab8f5aa8dc746365eea87ae32a0ffe9c898d..8a522bf5746f63bc601883d9a4fcb59c9238e294 100644 GIT binary patch literal 11198 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 From 278d906e6622e58d702e4ce9d16119f8c304e00f Mon Sep 17 00:00:00 2001 From: Glandouze Date: Tue, 9 Jul 2013 21:51:00 +0200 Subject: [PATCH 17/53] Fixed two exploits with the biogenerator and the condi/chemmaster --- code/modules/hydroponics/biogenerator.dm | 106 +++++++++++-------- code/modules/reagents/Chemistry-Machinery.dm | 2 + 2 files changed, 65 insertions(+), 43 deletions(-) diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index b8ddadf09e4..f39d416b9df 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -87,19 +87,19 @@ dat += "Activate Biogenerator!
" dat += "Detach Container

" dat += "Food
" - dat += "10 milk (20)
" - dat += "Slab of meat (50)
" + dat += "10 milk (20)
" + dat += "Slab of meat (50)
" dat += "Nutrient
" - dat += "E-Z-Nutrient (10) | x5
" - dat += "Left 4 Zed (20) | x5
" - dat += "Robust Harvest (25) | x5
" + dat += "E-Z-Nutrient (10) | x5
" + dat += "Left 4 Zed (20) | x5
" + dat += "Robust Harvest (25) | x5
" dat += "Leather
" - dat += "Wallet (100)
" - dat += "Botanical gloves (250)
" - dat += "Utility belt (300)
" - dat += "Leather Satchel (400)
" + dat += "Wallet (100)
" + dat += "Botanical gloves (250)
" + dat += "Utility belt (300)
" + dat += "Leather Satchel (400)
" //dat += "Other
" - //dat += "Monkey (500)
" + //dat += "Monkey (500)
" else dat += "
No beaker inside. Please insert a beaker.
" if("nopoints") @@ -146,54 +146,74 @@ menustat = "void" return -/obj/machinery/biogenerator/proc/create_product(var/item,var/cost) - if(cost > points) +/obj/machinery/biogenerator/proc/check_cost(var/cost) + if (cost > points) menustat = "nopoints" + return 1 + else + points -= cost + processing = 1 + update_icon() + updateUsrDialog() + sleep(30) return 0 - processing = 1 - update_icon() - updateUsrDialog() - points -= cost - sleep(30) + +/obj/machinery/biogenerator/proc/create_product(var/item) switch(item) if("milk") - beaker.reagents.add_reagent("milk",10) + if (check_cost(20)) return 0 + else beaker.reagents.add_reagent("milk",10) if("meat") - new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc) + if (check_cost(50)) return 0 + else new/obj/item/weapon/reagent_containers/food/snacks/meat(src.loc) if("ez") - new/obj/item/nutrient/ez(src.loc) + if (check_cost(10)) return 0 + else new/obj/item/nutrient/ez(src.loc) if("l4z") - new/obj/item/nutrient/l4z(src.loc) + if (check_cost(20)) return 0 + else new/obj/item/nutrient/l4z(src.loc) if("rh") - new/obj/item/nutrient/rh(src.loc) + if (check_cost(25)) return 0 + else new/obj/item/nutrient/rh(src.loc) if("ez5") //It's not an elegant method, but it's safe and easy. -Cheridan - new/obj/item/nutrient/ez(src.loc) - new/obj/item/nutrient/ez(src.loc) - new/obj/item/nutrient/ez(src.loc) - new/obj/item/nutrient/ez(src.loc) - new/obj/item/nutrient/ez(src.loc) + if (check_cost(50)) return 0 + else + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) + new/obj/item/nutrient/ez(src.loc) if("l4z5") - new/obj/item/nutrient/l4z(src.loc) - new/obj/item/nutrient/l4z(src.loc) - new/obj/item/nutrient/l4z(src.loc) - new/obj/item/nutrient/l4z(src.loc) - new/obj/item/nutrient/l4z(src.loc) + if (check_cost(100)) return 0 + else + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) + new/obj/item/nutrient/l4z(src.loc) if("rh5") - new/obj/item/nutrient/rh(src.loc) - new/obj/item/nutrient/rh(src.loc) - new/obj/item/nutrient/rh(src.loc) - new/obj/item/nutrient/rh(src.loc) - new/obj/item/nutrient/rh(src.loc) + if (check_cost(125)) return 0 + else + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) + new/obj/item/nutrient/rh(src.loc) if("wallet") - new/obj/item/weapon/storage/wallet(src.loc) + if (check_cost(100)) return 0 + else new/obj/item/weapon/storage/wallet(src.loc) if("gloves") - new/obj/item/clothing/gloves/botanic_leather(src.loc) + if (check_cost(250)) return 0 + else new/obj/item/clothing/gloves/botanic_leather(src.loc) if("tbelt") - new/obj/item/weapon/storage/belt/utility(src.loc) + if (check_cost(300)) return 0 + else new/obj/item/weapon/storage/belt/utility(src.loc) if("satchel") - new/obj/item/weapon/storage/backpack/satchel(src.loc) - if("monkey") - new/mob/living/carbon/monkey(src.loc) + if (check_cost(400)) return 0 + else new/obj/item/weapon/storage/backpack/satchel(src.loc) + //if("monkey") + // if (check_cost(500)) return 0 + // else new/mob/living/carbon/monkey(src.loc) processing = 0 menustat = "complete" update_icon() diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 639ff1c485b..964ff592f45 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -276,6 +276,7 @@ if(href_list["amount"]) var/id = href_list["add"] var/amount = text2num(href_list["amount"]) + if (amount < 0) return R.trans_id_to(src, id, amount) else if (href_list["addcustom"]) @@ -290,6 +291,7 @@ if(href_list["amount"]) var/id = href_list["remove"] var/amount = text2num(href_list["amount"]) + if (amount < 0) return if(mode) reagents.trans_id_to(beaker, id, amount) else From 4fe39dd49bae2f57d7eb57879bef9324b558812b Mon Sep 17 00:00:00 2001 From: Incoming Date: Tue, 9 Jul 2013 19:31:01 -0400 Subject: [PATCH 18/53] Adds additional dice! Places where the D6 and D20 spawned (the library and perma) now spawn with a dice bottle. Said dice bottles now contains a D2, D4, D8, D10, and D12 in addition to the preexisting D6 and D20 for a richer meta-roleplaying experience. This also fixes an obscure bug where dice could be generated invisible because their initial value was set to 0. Additionally this fixes the grammer of dice descriptions, which were not using the singular "die". --- code/game/objects/items/weapons/dice.dm | 36 ++++++++++++++++-- .../objects/items/weapons/storage/firstaid.dm | 5 +++ icons/obj/dice.dmi | Bin 2933 -> 6245 bytes maps/tgstation.2.1.2.dmm | 9 ++--- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 501cd781fdb..02f9bf45dd3 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -1,17 +1,47 @@ /obj/item/weapon/dice name = "d6" - desc = "A dice with six sides." + desc = "A die with six sides. Basic and servicable." icon = 'icons/obj/dice.dmi' icon_state = "d6" w_class = 1 var/sides = 6 /obj/item/weapon/dice/New() - icon_state = "[initial(icon_state)][rand(sides)]" + icon_state = "[initial(icon_state)][rand(1, sides)]" + +/obj/item/weapon/dice/d2 + name = "d2" + desc = "A die with two sides. Coins are undignified!" + icon_state = "d2" + sides = 2 + +/obj/item/weapon/dice/d4 + name = "d4" + desc = "A die with four sides. The nerd's caltrop." + icon_state = "d4" + sides = 4 + +/obj/item/weapon/dice/d8 + name = "d8" + desc = "A die with eight sides. It feels... lucky." + icon_state = "d8" + sides = 8 + +/obj/item/weapon/dice/d10 + name = "d10" + desc = "A die with ten sides. Useful for percentages." + icon_state = "d10" + sides = 10 + +/obj/item/weapon/dice/d12 + name = "d12" + desc = "A die with twelve sides. There's an air of neglect about it." + icon_state = "d12" + sides = 12 /obj/item/weapon/dice/d20 name = "d20" - desc = "A dice with twenty sides." + desc = "A die with twenty sides. The prefered die to throw at the GM." icon_state = "d20" sides = 20 diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index a5874f09855..6b74eaaff0d 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -179,6 +179,11 @@ New() ..() + new /obj/item/weapon/dice/d2( src ) + new /obj/item/weapon/dice/d4( src ) new /obj/item/weapon/dice( src ) + new /obj/item/weapon/dice/d8( src ) + new /obj/item/weapon/dice/d10( src ) + new /obj/item/weapon/dice/d12( src ) new /obj/item/weapon/dice/d20( src ) diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index 283c3d11aea46cefc0de005627da075e8e752750..fda6ab2550ca32746dbf3171565de146eca8edfe 100644 GIT binary patch literal 6245 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 WgMYpJb>GT68k{_Ciz_+m75^V}g}@R3 diff --git a/maps/tgstation.2.1.2.dmm b/maps/tgstation.2.1.2.dmm index aa723c75e21..449e71075e6 100644 --- a/maps/tgstation.2.1.2.dmm +++ b/maps/tgstation.2.1.2.dmm @@ -20,12 +20,12 @@ "aat" = (/obj/machinery/washing_machine,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/security/prison) "aau" = (/obj/machinery/librarycomp{pixel_y = 0},/obj/structure/table,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aav" = (/obj/structure/stool,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) -"aaw" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor,/area/security/prison) +"aaw" = (/obj/structure/table,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor,/area/security/prison) "aax" = (/obj/structure/table,/obj/item/weapon/pen,/turf/simulated/floor,/area/security/prison) "aay" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/security/prison) "aaz" = (/obj/machinery/computer/arcade,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) "aaA" = (/obj/structure/table,/turf/simulated/floor,/area/security/prison) -"aaB" = (/obj/structure/table,/obj/item/weapon/dice,/turf/simulated/floor,/area/security/prison) +"aaB" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/pill_bottle/dice,/turf/simulated/floor/wood,/area/library) "aaC" = (/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/security/prison) "aaD" = (/obj/machinery/washing_machine,/obj/structure/window/reinforced,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/security/prison) "aaE" = (/obj/machinery/vending/snack,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison) @@ -1338,7 +1338,6 @@ "azL" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 6; icon_state = "intact-b-f"; initialize_directions = 6; level = 1; name = "pipe"},/turf/simulated/wall,/area/library) "azM" = (/obj/machinery/atmospherics/pipe/simple{color = "blue"; dir = 9; icon_state = "intact-b-f"; level = 1; name = "pipe"},/turf/simulated/wall,/area/library) "azN" = (/obj/machinery/door/airlock/maintenance{name = "Library Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/library) -"azO" = (/obj/structure/table/woodentable,/obj/item/weapon/dice/d20,/obj/item/weapon/dice,/turf/simulated/floor/wood,/area/library) "azP" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/packageWrap,/turf/simulated/floor/wood,/area/library) "azQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/wood,/area/library) "azR" = (/obj/machinery/door/airlock/maintenance{name = "Crematorium Maintenance"; req_access_txt = "27"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/chapel/office) @@ -8065,7 +8064,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaiaaiaajaakaalaakaalaakaamaaiaaiaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaiaaiaanaaoaapaaqaaraaqaaqaasaataaiaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaauaavaaqaaqaawaaxaavaaqaasaayaaiaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaagaaiaazaaqaaqaaqaavaaAaaBaaqaaqaaCaaDaaiaaiaaiaafaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaagaaiaazaaqaaqaaqaavaaAaaAaaqaaqaaCaaDaaiaaiaaiaafaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaiaaEaaqaaFaaqaaqaaqaaqaaqaaqaaGaaqaaHaaIaaiaafaaaaaaaaaaaaaaaaafaaaaafaaaaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaiaaJaaqaaqaaKaaqaaqaaqaaLaaqaaGaaqaaMaaNaaiaafaafaafaaaaafaafaafaafaafaafaafaafaafaafaahaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaafaaiaaOaaPaaOaaQaaOaaRaaOaaSaaOaaTaaOaaOaaUaaVaaVaaVaaVaaVaaVaaVaaVaaVaaVaaWaaXaaYaaZaaWaaWaafaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8105,7 +8104,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaareaskauiaujaujaujaujaukaskareaulamjaumaunauoauoauoauoauoauoauoauoapBaupatCasrauqaurausasrautauuautautautautautautautautauvaaaatIauwauxauyauzauAatIaaaartarxaryatJauBauCauDatJaryalgafCaqAauEauFauGauHauIasNauJauKasNasNauLasNauMarMajKasPaeAarOalWapaapbauNamGanBatYasYauOauaauPauPasYatZauQaubasYauRauSauRauTauUaqhaafauVauWauWauWauWauWauXaaaaqhauYauZavaaqhaqhaaaaaaaaaaafaueavbavcavdaueaafaaaaaaaveavfavfavfavfavgavhavfavfavfavfaviavjavfavkavlavmavnavoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaavpavqavravqavqavsavtavqavqavravuavvamjaslavwavxavyavzavAavBavCavDauoapBavEanaasrasravFavGauvavHavIavJavKavLavMavNavOavPavQauvaafatIavRavSavTavUavVatIaafartarxaryavWavXavYavXavZaryalgawaaqAawbawcatQawdatQaweawfawgawhawiaqCawjaqCarMajKasPaeAasQanwanxanyanzawkanBatYasYawlauaauaauaasZawmawnawoasYawpawqawqawrauUaqhaaaaafaaaaafaaaaafaaaaafaaaaqhawsawtawuawvaqhaaaaaaaaaaafaueawwawxawyaueaqhawzawAawBawCawDawDawDawDawDawDawEawFawFawGawHawIawFawFawJawKawLaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavpavuavqawMawNawNawOawPawQawRawSawNawNawTawUaqjaslawVauoawWawXawYawZawYaxaaxbaxcaxdampaxeaxfaxgatAaxhaxiaxjaxkaxkaxkaxlaxkaxkaxmavIauvaaaatIaxnaxoaxpavUaxqatIaaaartarxaryaxraxsaxtaxuaxvaryalgaxwaqAaqAaxxaxyaxzaxyaxAaqAaqAaxBaxCaqCaxDaqCarMajKasPaeAasQaxEaxFaxFaxFaxFaxGaxHaxIaxJaxKaxLaxLaxLaxMaxLaxNaxLaxOaxPaxQaxRaxSaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaqhaxTaqhawzaxUaqhaqhaueaueaxVaxWaueasjaxXaxYaxZayaaybaybaybaybaybasjaycaydaydayeayfaygaydayhayiayjayhayhayhayhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawTaykaylaymawNaynawNaynawNaynawNaynawNayoaypatqaslayqauoayraysaytayuayvaywauoatzayxatAayyatAayzampautayAaxmaxkaxkaxkaxkaxkaxkayBayCayDayEayFayGayHayIayJayKatIaafartayLayMayNayOayPayQayRayMaySayTayUayVayWayXayYayXasMayZaqCazaazaaqCaxBaqCazbazcazdaeAazeazfazfazfazgazhaziazjazkazlazmazkaznazkazoazkazpazqazrawqazsauTaztazuazvazwazwazuazxazyazyazyazyazyazzazAazyazBazCazDazEazFazGawFazHazIazJazJazJazKazLazMazNaybazOazPazQaybaydazRaydazSazTazUazVazWazXazYazZaAaaAbaAcaAdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawTaykaylaymawNaynawNaynawNaynawNaynawNayoaypatqaslayqauoayraysaytayuayvaywauoatzayxatAayyatAayzampautayAaxmaxkaxkaxkaxkaxkaxkayBayCayDayEayFayGayHayIayJayKatIaafartayLayMayNayOayPayQayRayMaySayTayUayVayWayXayYayXasMayZaqCazaazaaqCaxBaqCazbazcazdaeAazeazfazfazfazgazhaziazjazkazlazmazkaznazkazoazkazpazqazrawqazsauTaztazuazvazwazwazuazxazyazyazyazyazyazzazAazyazBazCazDazEazFazGawFazHazIazJazJazJazKazLazMazNaybaaBazPazQaybaydazRaydazSazTazUazVazWazXazYazZaAaaAbaAcaAdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAeaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAfawNawNaAgawNaynawNaynaAhaynawNaynawNayoaypatqaslaAiauoaAjaAkaAlaAmaAlavxavxaAnaAoaAnaApaAqaApaApaAraAsaAtaAuaAuaAuaAvaAuaAuaAwaAxauvaaaaAyatIaAzaAAaAzatIatIaaaartaABaryaACaADaAEaAFaAGaAHaAIaAJaAKaALauFaxBaxBaxBaAMaANaqCaAOaAPaqCawjaqCaAQaARaASaeAaATaeAaeAaeAaAUaeAaAVaAWasYaAXauaasYaAYasYaAZasYaBaaBbaBcaBdaBeaBfaBgaBhaBiawuaBjaBkaBlaBjaBjaBmavfawuaBnawuaviaBoawuaBpaBqaBraBsaBsaBtaBuaBvaBwaBsaBxaByaBzaBAaBBaBCaBDaBEaybaBFaBGaydaBHaBIaBJaBKazWaBLaAaazZaBMayhayhayhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawTaBNaylaymawNaynawNaynawNaynawNaynawNayoaypatqaBOaBPaBQaBRaBRaBRaBRaBPaBSaBTaBUaBVaBWampaBXaobaobautaBYaBZavIaCaaCbaCcaCdaCeaCfaCgauvaaaaChaaaaCiaCjaCiaaaaafaaaartaABaryaCkaClaCmaCnaCoaryakEagAaqCaCpaCqaxBaxBaxBaCraCsaqCaaaaaaaCtaCuaCvaCwaCxaCyaCzaCAaCtaaaaaaaCBaCCaCDaCEasYaCFauaauaauaawnauaauaauaaCGauTaCHauTaCIaCJaCKaCLaCKaCKaCMaCNaCOaCKaCPaCQaCQaCRaCQaCSaCQaCTaCUaCUaCVaCUaCUaCWaCUaCUaCUaCUaCXaCYaBAaCZaDaaDbaDcaDdaybaDeaDfaDgaDhaDiaDjaBKaDkaBLaAaazZaAaaDlaDmaDnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDoaDoaDoaDoaDoaDoaDoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqavqawMawNawNawNaDrawNawNaDsawNawNawTaDtareaslargaDuaDvaDvaDvaDvaDvaDvaDvaDwaDxanaanaaDyanaanaautaDzaDAaDBaDCaDCaDCaDCaDDaDEaDFauvaDGaDHaDIaDJaDKaDLaDIaDIaDMartaDNaryaryaryaDOaDParyaryaDQakmaqCaqCaqCaDRaDSaDTaqCaqCaqCaDUaDVaDWaDXaCxaCxaCxaCxaCxaDYaDZaDVaEaaCBaEbaCDaEcasYasYasYasYasYasYasYasYasYaCGaEdaEeaEfaEgaEhaEiaEjaEkaCKaElaEmaEnaEoaEpaCQaEqaEraCQaEsaCQaEtaEuaEvaEwaExaEyaEzaEAaEBaECaCUaEDaEEaEFaCZaEGaDbaDcaEHaybaEIaEJaEKaELaEMaBKaBKaydayhaENazZaAaaEOaEPaEQaaaaaaaaaaaaaaaaaaaaaaaaaaaaDoaDoaDoaDoaDoaDoaDoaDoaDoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 3471ee8404b98a1edf1ffeb9b35f17ed0bae83ec Mon Sep 17 00:00:00 2001 From: Giacomand Date: Wed, 10 Jul 2013 07:09:05 +0100 Subject: [PATCH 19/53] Updated the message you get after trying to analyze the floor. --- code/game/objects/items/devices/scanners.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a3c88d2038d..d1bab674f31 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -78,8 +78,8 @@ MASS SPECTROMETER /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) // Clumsiness/brain damage check - if (CLUMSY in user.mutations || user.getBrainLoss() >= 60 && prob(50)) - user << text("You try to analyze the floor's vitals!") + if ((CLUMSY in user.mutations || user.getBrainLoss() >= 60) && prob(50)) + user << text("You stupidly try to analyze the floor's vitals!") user.visible_message(text("[user] has analyzed the floor's vitals!")) user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) user.show_message(text("\t Damage Specifics: 0-0-0-0"), 1) From 28d58598f6809d5c4ebbc03e834ccfd1cffb525b Mon Sep 17 00:00:00 2001 From: Giacomand Date: Wed, 10 Jul 2013 12:50:04 +0100 Subject: [PATCH 20/53] Converted the old air alarm wires to use the more structured datum wires. --- code/datums/wires/alarm.dm | 94 ++++++++++++++ code/game/machinery/alarm.dm | 240 +++-------------------------------- code/global.dm | 9 -- tgstation.dme | 1 + 4 files changed, 115 insertions(+), 229 deletions(-) create mode 100644 code/datums/wires/alarm.dm diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm new file mode 100644 index 00000000000..2c826e6d527 --- /dev/null +++ b/code/datums/wires/alarm.dm @@ -0,0 +1,94 @@ + +/datum/wires/alarm + holder_type = /obj/machinery/alarm + wire_count = 5 + +var/const/AALARM_WIRE_IDSCAN = 1 +var/const/AALARM_WIRE_POWER = 2 +var/const/AALARM_WIRE_SYPHON = 4 +var/const/AALARM_WIRE_AI_CONTROL = 8 +var/const/AALARM_WIRE_AALARM = 16 + + +/datum/wires/alarm/CanUse(var/mob/living/L) + var/obj/machinery/alarm/A = holder + if(A.wiresexposed) + return 1 + return 0 + +/datum/wires/alarm/GetInteractWindow() + var/obj/machinery/alarm/A = holder + . += ..() + . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") + +/datum/wires/alarm/UpdateCut(var/index, var/mended) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + if(!mended) + A.locked = 1 + //world << "Idscan wire cut" + + if(AALARM_WIRE_POWER) + A.shock(usr, 50) + A.shorted = !mended + A.update_icon() + //world << "Power wire cut" + + if (AALARM_WIRE_AI_CONTROL) + if (A.aidisabled == !mended) + A.aidisabled = mended + //world << "AI Control Wire Cut" + + if(AALARM_WIRE_SYPHON) + if(!mended) + A.mode = 3 // AALARM_MODE_PANIC + A.apply_mode() + //world << "Syphon Wire Cut" + + if(AALARM_WIRE_AALARM) + if (A.alarm_area.atmosalert(2)) + A.post_alert(2) + A.update_icon() + +/datum/wires/alarm/UpdatePulsed(var/index) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + A.locked = !A.locked + // world << "Idscan wire pulsed" + + if (AALARM_WIRE_POWER) + // world << "Power wire pulsed" + if(A.shorted == 0) + A.shorted = 1 + A.update_icon() + + spawn(12000) + if(A.shorted == 1) + A.shorted = 0 + A.update_icon() + + + if (AALARM_WIRE_AI_CONTROL) + // world << "AI Control wire pulsed" + if (A.aidisabled == 0) + A.aidisabled = 1 + A.updateDialog() + spawn(100) + if (A.aidisabled == 1) + A.aidisabled = 0 + + if(AALARM_WIRE_SYPHON) + // world << "Syphon wire pulsed" + if(A.mode == 1) // AALARM_MODE_SCRUB + A.mode = 3 // AALARM_MODE_PANIC + else + A.mode = 1 // AALARM_MODE_SCRUB + A.apply_mode() + + if(AALARM_WIRE_AALARM) + // world << "Aalarm wire pulsed" + if (A.alarm_area.atmosalert(0)) + A.post_alert(0) + A.update_icon() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index dccfb930f63..eb25e49cfad 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1,28 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - - -/proc/RandomAAlarmWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/AAlarmwires = list(0, 0, 0, 0, 0) - AAlarmIndexToFlag = list(0, 0, 0, 0, 0) - AAlarmIndexToWireColor = list(0, 0, 0, 0, 0) - AAlarmWireColorToIndex = list(0, 0, 0, 0, 0) - var/flagIndex = 1 - for (var/flag=1, flag<32, flag+=flag) - var/valid = 0 - while (!valid) - var/colorIndex = rand(1, 5) - if (AAlarmwires[colorIndex]==0) - valid = 1 - AAlarmwires[colorIndex] = flag - AAlarmIndexToFlag[flagIndex] = flag - AAlarmIndexToWireColor[flagIndex] = colorIndex - AAlarmWireColorToIndex[colorIndex] = flagIndex - flagIndex+=1 - return AAlarmwires - - - // A datum for dealing with threshold limit values // used in /obj/machinery/alarm /datum/tlv @@ -51,6 +27,20 @@ max1 = other.max1 max2 = other.max2 +#define AALARM_MODE_SCRUBBING 1 +#define AALARM_MODE_VENTING 2 //makes draught +#define AALARM_MODE_PANIC 3 //constantly sucks all air +#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing +#define AALARM_MODE_OFF 5 + +#define AALARM_SCREEN_MAIN 1 +#define AALARM_SCREEN_VENT 2 +#define AALARM_SCREEN_SCRUB 3 +#define AALARM_SCREEN_MODE 4 +#define AALARM_SCREEN_SENSORS 5 + +#define AALARM_REPORT_TIMEOUT 100 + /obj/machinery/alarm name = "alarm" icon = 'icons/obj/monitors.dmi' @@ -64,36 +54,19 @@ var/frequency = 1439 //var/skipprocess = 0 //Experimenting var/alarm_frequency = 1437 -#define AALARM_REPORT_TIMEOUT 100 + var/datum/radio_frequency/radio_connection var/locked = 1 + var/datum/wires/alarm/wires = null var/wiresexposed = 0 // If it's been screwdrivered open. var/aidisabled = 0 var/AAlarmwires = 31 var/shorted = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - // Uses code from apc.dm -#define AALARM_WIRE_IDSCAN 1 //Added wires -#define AALARM_WIRE_POWER 2 -#define AALARM_WIRE_SYPHON 3 -#define AALARM_WIRE_AI_CONTROL 4 -#define AALARM_WIRE_AALARM 5 - - -#define AALARM_MODE_SCRUBBING 1 -#define AALARM_MODE_VENTING 2 //makes draught -#define AALARM_MODE_PANIC 3 //constantly sucks all air -#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing -#define AALARM_MODE_OFF 5 var/mode = AALARM_MODE_SCRUBBING -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area @@ -145,6 +118,7 @@ /obj/machinery/alarm/New(nloc, ndir, nbuild) ..() + wires = new(src) if(nloc) loc = nloc @@ -201,31 +175,6 @@ user << browse(null, "window=air_alarm") return - if(wiresexposed && (!istype(user, /mob/living/silicon))) - var/t1 = text("Access Panel
\n") - var/list/AAlarmwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Black" = 5, - ) - for(var/wiredesc in AAlarmwires) - var/is_uncut = src.AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - - else - t1 += "Cut " - t1 += "Pulse " - - t1 += "
" - t1 += text("
\n[(src.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((src.shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(src.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - t1 += text("

Close

") - user << browse(t1, "window=AAlarmwires") - onclose(user, "AAlarmwires") - if(!shorted) //user << browse(return_text(),"window=air_alarm") //onclose(user, "air_alarm") @@ -235,135 +184,11 @@ popup.open() refresh_all() - return - - -/obj/machinery/alarm/proc/isWireColorCut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - return ((src.AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/isWireCut(var/wireIndex) - var/wireFlag = AAlarmIndexToFlag[wireIndex] - return ((src.AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/cut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] - AAlarmwires &= ~wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - src.locked = 1 - //world << "Idscan wire cut" - - if(AALARM_WIRE_POWER) - src.shock(usr, 50) - src.shorted = 1 - update_icon() - //world << "Power wire cut" - - if (AALARM_WIRE_AI_CONTROL) - if (src.aidisabled == 0) - src.aidisabled = 1 - //world << "AI Control Wire Cut" - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_PANIC - apply_mode() - //world << "Syphon Wire Cut" - - if(AALARM_WIRE_AALARM) - - if (alarm_area.atmosalert(2)) - post_alert(2) - spawn(1) - src.updateUsrDialog() - update_icon() - - //world << "AAlarm Wire Cut" - - src.updateDialog() - update_icon() + if(wiresexposed && (!istype(user, /mob/living/silicon))) + wires.Interact(user) return -/obj/machinery/alarm/proc/mend(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function - AAlarmwires |= wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - //world << "Idscan wire mended" - - if(AALARM_WIRE_POWER) - src.shorted = 0 - src.shock(usr, 50) - update_icon() - //world << "Power wire mended" - - if(AALARM_WIRE_AI_CONTROL) - if (src.aidisabled == 1) - src.aidisabled = 0 - //world << "AI Cont. wire mended" - - - // if(AALARM_WIRE_SYPHON) - // world << "Syphon Wire mended" - - - // if(AALARM_WIRE_AALARM) - //world << "AAlarm Wire mended" - - update_icon() - src.updateDialog() - return - -/obj/machinery/alarm/proc/pulse(var/wireColor) - //var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function - var/wireIndex = AAlarmWireColorToIndex[wireColor] - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears - src.locked = 0 - spawn(300) - src.locked = 1 - //world << "Idscan wire pulsed" - - if (AALARM_WIRE_POWER) - // world << "Power wire pulsed" - if(shorted == 0) - shorted = 1 - update_icon() - - spawn(1200) - if(shorted == 1) - shorted = 0 - update_icon() - - - if (AALARM_WIRE_AI_CONTROL) - // world << "AI Control wire pulsed" - if (src.aidisabled == 0) - src.aidisabled = 1 - src.updateDialog() - spawn(10) - if (src.aidisabled == 1) - src.aidisabled = 0 - src.updateDialog() - - if(AALARM_WIRE_SYPHON) - // world << "Syphon wire pulsed" - mode = AALARM_MODE_REPLACEMENT - apply_mode() - - if(AALARM_WIRE_AALARM) - // world << "Aalarm wire pulsed" - if (alarm_area.atmosalert(0)) - post_alert(0) - spawn(1) - src.updateUsrDialog() - update_icon() - - src.updateDialog() - return /obj/machinery/alarm/proc/shock(mob/user, prb) if((stat & (NOPOWER))) // unpowered, no shock @@ -702,33 +527,8 @@ table tr:first-child th:first-child { border: none;} if (!istype(usr, /mob/living/silicon)) usr.unset_machine() usr << browse(null, "window=air_alarm") - usr << browse(null, "window=AAlarmwires") return - if (href_list["AAlarmwires"]) - var/t1 = text2num(href_list["AAlarmwires"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - spawn(1) - src.updateUsrDialog() - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - spawn(1) - src.updateUsrDialog() - if(href_list["command"]) @@ -988,7 +788,7 @@ table tr:first-child th:first-child { border: none;} if(stat & (NOPOWER|BROKEN)) user << "It does nothing" else - if(src.allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN)) + if(src.allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." src.updateUsrDialog() diff --git a/code/global.dm b/code/global.dm index 0b5af7d9149..e75a8d4e468 100644 --- a/code/global.dm +++ b/code/global.dm @@ -134,15 +134,6 @@ var/shuttlecoming = 0 var/join_motd = null var/forceblob = 0 - //airlockWireColorToIndex takes a number representing the wire color, e.g. the orange wire is always 1, the dark red wire is always 2, etc. It returns the index for whatever that wire does. - //airlockIndexToWireColor does the opposite thing - it takes the index for what the wire does, for example AIRLOCK_WIRE_IDSCAN is 1, AIRLOCK_WIRE_POWER1 is 2, etc. It returns the wire color number. - //airlockWireColorToFlag takes the wire color number and returns the flag for it (1, 2, 4, 8, 16, etc) - -var/list/AAlarmWireColorToFlag = RandomAAlarmWires() -var/list/AAlarmIndexToFlag -var/list/AAlarmIndexToWireColor -var/list/AAlarmWireColorToIndex - //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage var/MAX_EX_DEVESTATION_RANGE = 3 var/MAX_EX_HEAVY_RANGE = 7 diff --git a/tgstation.dme b/tgstation.dme index 826d69ff1fd..d7aa93be9ca 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -152,6 +152,7 @@ #include "code\datums\spells\turf_teleport.dm" #include "code\datums\spells\wizard.dm" #include "code\datums\wires\airlock.dm" +#include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" #include "code\datums\wires\camera.dm" #include "code\datums\wires\explosive.dm" From b2906e121698d43af4c2a7d6698957c23844be9c Mon Sep 17 00:00:00 2001 From: KazeEspada Date: Thu, 11 Jul 2013 11:18:33 -0700 Subject: [PATCH 21/53] fixes issues with parrots such as not eating its own cracker and switching icon state while dead --- code/modules/mob/living/simple_animal/parrot.dm | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 3d32627a37b..3d17ffaa905 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -160,10 +160,11 @@ lines 294-301 in living/say.dm (speech buffer) switch(remove_from) if("ears") if(ears) - if(available_channels.len) - src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - else - src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") + if(!stat) + if(available_channels.len) + src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") + else + src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") ears.loc = src.loc ears = null for(var/possible_phrase in speak) @@ -264,7 +265,7 @@ lines 294-301 in living/say.dm (speech buffer) if(parrot_state == PARROT_PERCH) parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - if(M.melee_damage_upper > 0) + if(M.melee_damage_upper > 0 && !stat) parrot_interest = M parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless icon_state = "parrot_fly" @@ -704,7 +705,7 @@ lines 294-301 in living/say.dm (speech buffer) //parrots will eat crackers instead of dropping them - if(istype(held_item,/obj/item/weapon/reagent_containers/food/snacks/cracker) && (!drop_gently)) + if(istype(held_item,/obj/item/weapon/reagent_containers/food/snacks/cracker) && (drop_gently)) del(held_item) held_item = null if(health < maxHealth) From 67ee2fd661d413f7b6b99acf54d74564fc9b30f0 Mon Sep 17 00:00:00 2001 From: Incoming Date: Thu, 11 Jul 2013 17:31:59 -0400 Subject: [PATCH 22/53] tweaks to the dice: *the dice now all have different colors, to make them easy to tell the difference between them at a glance. *the d2 has been swapped out for a d00, though you can still create a d2 if someone demands it. *the generic pill bottle full of dice has been replaced with a proper dice bag. *actually throwing a die will now cause it to roll until the throw ends, at which point it will state the result of the throw. The old method still works as well. *most new dice have had their sprites edited to be smaller. *minor grammer corrections. --- code/game/objects/items/weapons/dice.dm | 24 +++++++++++++++--- .../objects/items/weapons/storage/firstaid.dm | 8 +++--- icons/obj/dice.dmi | Bin 6245 -> 2819 bytes 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 02f9bf45dd3..d6733dce656 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -33,6 +33,12 @@ icon_state = "d10" sides = 10 +/obj/item/weapon/dice/d00 + name = "d00" + desc = "A die with ten sides. Works better for d100 rolls than a golfball." + icon_state = "d00" + sides = 10 + /obj/item/weapon/dice/d12 name = "d12" desc = "A die with twelve sides. There's an air of neglect about it." @@ -46,6 +52,13 @@ sides = 20 /obj/item/weapon/dice/attack_self(mob/user as mob) + diceroll(user) + +/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user as mob) + ..() + diceroll(user) + +/obj/item/weapon/dice/proc/diceroll(mob/user as mob) var/result = rand(1, sides) var/comment = "" if(sides == 20 && result == 20) @@ -53,6 +66,11 @@ else if(sides == 20 && result == 1) comment = "Ouch, bad luck." icon_state = "[initial(icon_state)][result]" - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ - "You throw [src]. It lands on a [result]. [comment]", \ - "You hear [src] landing on a [result]. [comment]") \ No newline at end of file + if(initial(icon_state) == "d00") + result = (result - 1)*10 + if(user != null) //Dice was rolled in someone's hand + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + "You throw [src]. It lands on [result]. [comment]", \ + "You hear [src] landing on [result]. [comment]") + else if(src.throwing == 0) //Dice was thrown and is coming to rest + src.loc.visible_message("[src] rolls to a stop, landing on [result]. [comment]") \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 6b74eaaff0d..e51deddd3ce 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -174,16 +174,18 @@ /obj/item/weapon/storage/pill_bottle/dice - name = "pack of dice" - desc = "It's a small container with dice inside." + name = "bag of dice" + desc = "Contains all the luck you'll ever need." + icon = 'icons/obj/dice.dmi' + icon_state = "dicebag" New() ..() - new /obj/item/weapon/dice/d2( src ) new /obj/item/weapon/dice/d4( src ) new /obj/item/weapon/dice( src ) new /obj/item/weapon/dice/d8( src ) new /obj/item/weapon/dice/d10( src ) + new /obj/item/weapon/dice/d00( src ) new /obj/item/weapon/dice/d12( src ) new /obj/item/weapon/dice/d20( src ) diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index fda6ab2550ca32746dbf3171565de146eca8edfe..f4562b6d972d06fbd9884a0644a13b850d3ba82d 100644 GIT binary patch literal 2819 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 Date: Fri, 12 Jul 2013 07:36:27 +0100 Subject: [PATCH 23/53] Corrected text for prying off armour layers from mechs. Fixed the Odysseus external armour being secured when you install it, along with sprite change, but still requiring a wrenching with no feedback. --- code/game/mecha/mecha_construction_paths.dm | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index d5349ceae69..57c68b7a714 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -237,7 +237,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "ripley10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley8" @@ -260,7 +260,7 @@ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "ripley13" else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley11" @@ -519,7 +519,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "gygax16" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "gygax14" @@ -543,7 +543,7 @@ user.visible_message("[user] secures Gygax Armour Plates.", "You secure Gygax Armour Plates.") holder.icon_state = "gygax19" else - user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You prie Gygax Armour Plates from [holder].") + user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You pry Gygax Armour Plates from [holder].") new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder)) holder.icon_state = "gygax17" if(1) @@ -733,7 +733,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "fireripley10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley8" @@ -765,7 +765,7 @@ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "fireripley14" else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley12" @@ -1101,7 +1101,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "durand16" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "durand14" @@ -1125,7 +1125,7 @@ user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.") holder.icon_state = "durand19" else - user.visible_message("[user] pries Durand Armour Plates from [holder].", "You prie Durand Armour Plates from [holder].") + user.visible_message("[user] pries Durand Armour Plates from [holder].", "You pry Durand Armour Plates from [holder].") new /obj/item/mecha_parts/part/durand_armour(get_turf(holder)) holder.icon_state = "durand17" if(1) @@ -1332,7 +1332,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "odysseus10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "odysseus8" @@ -1351,13 +1351,14 @@ else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") holder.icon_state = "odysseus10" + if(2) if(diff==FORWARD) user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "odysseus13" else var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].") + user.visible_message("[user] pries [MS] from [holder].", "You pry [MS] from [holder].") holder.icon_state = "odysseus11" if(1) if(diff==FORWARD) From 4d3eac80ad4648cd8b694882427bbbcc4e34e916 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 12 Jul 2013 13:39:51 +0100 Subject: [PATCH 24/53] * Fixes compile errors. --- code/game/machinery/autolathe.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 72c03c8d9c5..3795baf0fcd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -7,7 +7,7 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/device/flashlight(), \ new /obj/item/weapon/extinguisher(), \ new /obj/item/device/multitool(), \ - new /obj/item/device/analyzer() \ + new /obj/item/device/analyzer(), \ new /obj/item/device/t_scanner(), \ new /obj/item/weapon/weldingtool(), \ new /obj/item/weapon/screwdriver(), \ From acde3b71df0f30e7be0a4659f321977b4cf02614 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 12 Jul 2013 17:32:15 +0100 Subject: [PATCH 25/53] * Cleaned the malf module code and made it easier to add powers. * Fixed multiple bugs with the cameras and the malf powers. All malf powers should be in working order now. * Added a new power that creates an automatic cyborg machine that will allow the AI's minions to put living humans through it to build a cyborg army. This power will cost all their malf points and will stop them from being able to shunt, to balance it. --- code/datums/mind.dm | 31 +- .../gamemodes/malfunction/Malf_Modules.dm | 336 +++++++++--------- .../game/gamemodes/malfunction/malfunction.dm | 8 +- code/modules/mob/living/silicon/ai/ai.dm | 3 +- code/modules/power/apc.dm | 3 + 5 files changed, 200 insertions(+), 181 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c271a972378..7dbf2e2f9df 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -830,25 +830,22 @@ datum/mind ticker.mode.malf_ai -= src special_role = null - current.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, + var/mob/living/silicon/ai/A = current + + A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, /datum/game_mode/malfunction/proc/takeover, - /datum/game_mode/malfunction/proc/ai_win, - /client/proc/fireproof_core, - /client/proc/upgrade_turrets, - /client/proc/disable_rcd, - /client/proc/overload_machine, - /client/proc/blackout, - /client/proc/interhack, - /client/proc/reactivate_camera) + /datum/game_mode/malfunction/proc/ai_win) - current:laws = new /datum/ai_laws/asimov - del(current:malf_picker) - current:show_laws() - current.icon_state = "ai" + A.malf_picker.remove_verbs(A) - current << "\red You have been patched! You are no longer malfunctioning!" - message_admins("[key_name_admin(usr)] has de-malf'ed [current].") - log_admin("[key_name_admin(usr)] has de-malf'ed [current].") + A.laws = new /datum/ai_laws/asimov + del(A.malf_picker) + A.show_laws() + A.icon_state = "ai" + + A << "\red You have been patched! You are no longer malfunctioning!" + message_admins("[key_name_admin(usr)] has de-malf'ed [A].") + log_admin("[key_name_admin(usr)] has de-malf'ed [A].") if("malf") make_AI_Malf() @@ -977,7 +974,7 @@ datum/mind current.verbs += /mob/living/silicon/ai/proc/choose_modules current.verbs += /datum/game_mode/malfunction/proc/takeover - current:malf_picker = new /datum/AI_Module/module_picker + current:malf_picker = new /datum/module_picker current:laws = new /datum/ai_laws/malfunction current:show_laws() current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index ef39b96db8d..fe79c77b01a 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -20,6 +20,10 @@ rcd light flash thingy on matter drain var/mod_pick_name var/description = "" var/engaged = 0 + var/cost = 5 + var/one_time = 0 + + var/power_type /datum/AI_Module/large/ @@ -32,54 +36,72 @@ rcd light flash thingy on matter drain /datum/AI_Module/large/fireproof_core module_name = "Core upgrade" mod_pick_name = "coreup" + description = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent." + cost = 50 + one_time = 1 -/client/proc/fireproof_core() + power_type = /mob/living/silicon/ai/proc/fireproof_core + +/mob/living/silicon/ai/proc/fireproof_core() set category = "Malfunction" set name = "Fireproof Core" for(var/mob/living/silicon/ai/ai in player_list) ai.fire_res_on_core = 1 - usr.verbs -= /client/proc/fireproof_core - usr << "\red Core fireproofed." + src.verbs -= /mob/living/silicon/ai/proc/fireproof_core + src << "\red Core fireproofed." /datum/AI_Module/large/upgrade_turrets module_name = "AI Turret upgrade" mod_pick_name = "turret" + description = "Improves the firing speed and health of all AI turrets. This effect is permanent." + cost = 50 + one_time = 1 -/client/proc/upgrade_turrets() + power_type = /mob/living/silicon/ai/proc/upgrade_turrets + +/mob/living/silicon/ai/proc/upgrade_turrets() set category = "Malfunction" set name = "Upgrade Turrets" - usr.verbs -= /client/proc/upgrade_turrets - for(var/obj/machinery/turret/turret in player_list) + src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets + for(var/obj/machinery/turret/turret in machines) turret.health += 30 turret.shot_delay = 20 /datum/AI_Module/large/disable_rcd module_name = "RCD disable" mod_pick_name = "rcd" + description = "Send a specialised pulse to break all RCD devices on the station." + cost = 50 -/client/proc/disable_rcd() + power_type = /mob/living/silicon/ai/proc/disable_rcd + +/mob/living/silicon/ai/proc/disable_rcd() set category = "Malfunction" set name = "Disable RCDs" - for(var/datum/AI_Module/large/disable_rcd/rcdmod in usr:current_modules) + for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules) if(rcdmod.uses > 0) rcdmod.uses -- for(var/obj/item/weapon/rcd/rcd in world) rcd.disabled = 1 for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world) rcd.disabled = 1 - usr << "RCD-disabling pulse emitted." - else usr << "Out of uses." + src << "RCD-disabling pulse emitted." + else src << "Out of uses." /datum/AI_Module/small/overload_machine module_name = "Machine overload" mod_pick_name = "overload" + description = "Overloads an electrical machine, causing a small explosion. 2 uses." uses = 2 + cost = 15 -/client/proc/overload_machine(obj/machinery/M as obj in world) + power_type = /mob/living/silicon/ai/proc/overload_machine + +/mob/living/silicon/ai/proc/overload_machine(obj/machinery/M as obj in world) set name = "Overload Machine" set category = "Malfunction" if (istype(M, /obj/machinery)) - for(var/datum/AI_Module/small/overload_machine/overload in usr:current_modules) + for(var/datum/AI_Module/small/overload_machine/overload in current_modules) if(overload.uses > 0) overload.uses -- for(var/mob/V in hearers(M, null)) @@ -87,67 +109,137 @@ rcd light flash thingy on matter drain spawn(50) explosion(get_turf(M), 0,1,1,0) del(M) - else usr << "Out of uses." - else usr << "That's not a machine." + else src << "Out of uses." + else src << "That's not a machine." + +/datum/AI_Module/large/place_cyborg_transformer + module_name = "Robotic Factory (Removes Shunting)" + mod_pick_name = "cyborgtransformer" + description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." + cost = 100 + + power_type = /mob/living/silicon/ai/proc/place_transformer + +/mob/living/silicon/ai/proc/place_transformer() + set name = "Place Robotic Factory" + set category = "Malfunction" + + if(!eyeobj) + return + + if(!isturf(src.loc)) // AI must be in it's core. + return + + var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in src.current_modules + if(!PCT) + return + + if(PCT.uses < 1) + src << "Out of uses." + return + + var/sure = alert(src, "Make sure the room it is in is big enough and that there is a 1x3 area for the machine. Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No") + if(sure != "Yes") + return + + // Make sure there is enough room. + var/turf/middle = get_turf(eyeobj.loc) + var/list/turfs = list(middle, locate(middle.x - 1, middle.y, middle.z), locate(middle.x + 1, middle.y, middle.z)) + + var/alert_msg = "There isn't enough room. Make sure you are placing the machine in a clear area and on a floor." + + for(var/T in turfs) + + // Make sure the turfs are clear and the correct type. + if(!istype(T, /turf/simulated/floor)) + alert(src, alert_msg) + return + + var/turf/simulated/floor/F = T + for(var/atom/movable/AM in F.contents) + if(AM.density) + alert(src, alert_msg) + return + + // All clear, place the transformer + new /obj/machinery/transformer/conveyor(middle) + src.can_shunt = 0 + PCT.uses -= 1 + src << "You cannot shunt anymore." /datum/AI_Module/small/blackout module_name = "Blackout" mod_pick_name = "blackout" + description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses." uses = 3 + cost = 15 -/client/proc/blackout() + power_type = /mob/living/silicon/ai/proc/blackout + +/mob/living/silicon/ai/proc/blackout() set category = "Malfunction" set name = "Blackout" - for(var/datum/AI_Module/small/blackout/blackout in usr:current_modules) + for(var/datum/AI_Module/small/blackout/blackout in current_modules) if(blackout.uses > 0) blackout.uses -- for(var/obj/machinery/power/apc/apc in world) if(prob(30*apc.overload)) apc.overload_lighting() else apc.overload++ - else usr << "Out of uses." + else src << "Out of uses." /datum/AI_Module/small/interhack module_name = "Hack intercept" mod_pick_name = "interhack" + description = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems." + cost = 15 + one_time = 1 -/client/proc/interhack() + power_type = /mob/living/silicon/ai/proc/interhack + +/mob/living/silicon/ai/proc/interhack() set category = "Malfunction" set name = "Hack intercept" - usr.verbs -= /client/proc/interhack + src.verbs -= /mob/living/silicon/ai/proc/interhack ticker.mode:hack_intercept() /datum/AI_Module/small/reactivate_camera module_name = "Reactivate camera" mod_pick_name = "recam" + description = "Reactivates a currently disabled camera. 10 uses." uses = 10 + cost = 15 -/client/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras) + power_type = /mob/living/silicon/ai/proc/reactivate_camera + +/mob/living/silicon/ai/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Reactivate Camera" set category = "Malfunction" if (istype (C, /obj/machinery/camera)) - for(var/datum/AI_Module/small/reactivate_camera/camera in usr:current_modules) + for(var/datum/AI_Module/small/reactivate_camera/camera in current_modules) if(camera.uses > 0) if(!C.status) - C.status = !C.status + C.deactivate(src) camera.uses -- - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue You hear a quiet click.")) else - usr << "This camera is either active, or not repairable." - else usr << "Out of uses." - else usr << "That's not a camera." + src << "This camera is either active, or not repairable." + else src << "Out of uses." + else src << "That's not a camera." /datum/AI_Module/small/upgrade_camera module_name = "Upgrade Camera" mod_pick_name = "upgradecam" + description = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses." uses = 10 + cost = 15 -/client/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras) + power_type = /mob/living/silicon/ai/proc/upgrade_camera + +/mob/living/silicon/ai/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Upgrade Camera" set category = "Malfunction" if(istype(C)) - var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in usr:current_modules + var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in current_modules if(UC) if(UC.uses > 0) if(C.assembly) @@ -156,7 +248,7 @@ rcd light flash thingy on matter drain if(!C.isXRay()) C.upgradeXRay() //Update what it can see. - cameranet.updateVisibility(C) + cameranet.updateVisibility(C, 0) upgraded = 1 if(!C.isEmpProof()) @@ -172,154 +264,80 @@ rcd light flash thingy on matter drain if(upgraded) UC.uses -- C.visible_message("\icon[C] *beep*") - usr << "Camera successully upgraded!" + src << "Camera successully upgraded!" else - usr << "This camera is already upgraded!" + src << "This camera is already upgraded!" else - usr << "Out of uses." + src << "Out of uses." -/datum/AI_Module/module_picker +/datum/module_picker var/temp = null var/processing_time = 100 var/list/possible_modules = list() -/datum/AI_Module/module_picker/New() - src.possible_modules += new /datum/AI_Module/large/fireproof_core - src.possible_modules += new /datum/AI_Module/large/upgrade_turrets - src.possible_modules += new /datum/AI_Module/large/disable_rcd - src.possible_modules += new /datum/AI_Module/small/overload_machine - src.possible_modules += new /datum/AI_Module/small/interhack - src.possible_modules += new /datum/AI_Module/small/blackout - src.possible_modules += new /datum/AI_Module/small/reactivate_camera - src.possible_modules += new /datum/AI_Module/small/upgrade_camera +/datum/module_picker/New() + for(var/type in typesof(/datum/AI_Module)) + var/datum/AI_Module/AM = new type + if(AM.power_type != null) + src.possible_modules += AM -/datum/AI_Module/module_picker/proc/use(user as mob) +/datum/module_picker/proc/remove_verbs(var/mob/living/silicon/ai/A) + + for(var/datum/AI_Module/AM in possible_modules) + A.verbs.Remove(AM.power_type) + + +/datum/module_picker/proc/use(user as mob) var/dat + dat = "Select use of processing time: (currently #[src.processing_time] left.)
" + dat += "
" + dat += "Install Module:
" + dat += "The number afterwards is the amount of processing time it consumes.
" + for(var/datum/AI_Module/large/module in src.possible_modules) + dat += "[module.module_name] ([module.cost])
" + for(var/datum/AI_Module/small/module in src.possible_modules) + dat += "[module.module_name] ([module.cost])
" + dat += "
" if (src.temp) - dat = "[src.temp]

Clear" - else if(src.processing_time <= 0) - dat = " No processing time is left available. No more modules are able to be chosen at this time." - else - dat = "Select use of processing time: (currently [src.processing_time] left.)
" - dat += "
" - dat += "Install Module:
" - dat += "The number afterwards is the amount of processing time it consumes.
" - for(var/datum/AI_Module/large/module in src.possible_modules) - dat += "[module.module_name] (50)
" - for(var/datum/AI_Module/small/module in src.possible_modules) - dat += "[module.module_name] (15)
" - dat += "
" - - user << browse(dat, "window=modpicker") - onclose(user, "modpicker") + dat += "[src.temp]" + var/datum/browser/popup = new(user, "modpicker", "Malf Module Menu") + popup.set_content(dat) + popup.open() return -/datum/AI_Module/module_picker/Topic(href, href_list) +/datum/module_picker/Topic(href, href_list) ..() - if (href_list["coreup"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/fireproof_core)) - already = 1 - if (!already) - usr.verbs += /client/proc/fireproof_core - usr:current_modules += new /datum/AI_Module/large/fireproof_core - src.temp = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent." - src.processing_time -= 50 - else src.temp = "This module is only needed once." - else if (href_list["turret"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/upgrade_turrets)) - already = 1 - if (!already) - usr.verbs += /client/proc/upgrade_turrets - usr:current_modules += new /datum/AI_Module/large/upgrade_turrets - src.temp = "Improves the firing speed and health of all AI turrets. This effect is permanent." - src.processing_time -= 50 - else src.temp = "This module is only needed once." + if(!isAI(usr)) + return + var/mob/living/silicon/ai/A = usr - else if (href_list["rcd"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/disable_rcd)) - mod:uses += 1 - already = 1 - if (!already) - usr:current_modules += new /datum/AI_Module/large/disable_rcd - usr.verbs += /client/proc/disable_rcd - src.temp = "Send a specialised pulse to break all RCD devices on the station." - else src.temp = "Additional use added to RCD disabler." - src.processing_time -= 50 + for(var/datum/AI_Module/AM in possible_modules) + if (href_list[AM.mod_pick_name]) - else if (href_list["overload"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/overload_machine)) - mod:uses += 2 - already = 1 - if (!already) - usr.verbs += /client/proc/overload_machine - usr:current_modules += new /datum/AI_Module/small/overload_machine - src.temp = "Overloads an electrical machine, causing a small explosion. 2 uses." - else src.temp = "Two additional uses added to Overload module." - src.processing_time -= 15 + // Cost check + if(AM.cost > src.processing_time) + temp = "You cannot afford this module." + break - else if (href_list["blackout"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/blackout)) - mod:uses += 3 - already = 1 - if (!already) - usr.verbs += /client/proc/blackout - src.temp = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses." - usr:current_modules += new /datum/AI_Module/small/blackout - else src.temp = "Three additional uses added to Blackout module." - src.processing_time -= 15 + // Add new uses if we can, and it is allowed. + var/datum/AI_Module/already_AM = locate(AM.type) in A.current_modules + if(already_AM) + if(!AM.one_time) + already_AM.uses += AM.uses + src.processing_time -= AM.cost + temp = "Additional use added to [already_AM.module_name]" + break + else + temp = "This module is only needed once." + break - else if (href_list["interhack"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/interhack)) - already = 1 - if (!already) - usr.verbs += /client/proc/interhack - src.temp = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems." - usr:current_modules += new /datum/AI_Module/small/interhack - src.processing_time -= 15 - else src.temp = "This module is only needed once." + // Give the power and take away the money. + A.verbs += AM.power_type + A.current_modules += new AM.type + temp = AM.description + src.processing_time -= AM.cost - else if (href_list["recam"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/reactivate_camera)) - mod:uses += 10 - already = 1 - if (!already) - usr.verbs += /client/proc/reactivate_camera - src.temp = "Reactivates a currently disabled camera. 10 uses." - usr:current_modules += new /datum/AI_Module/small/reactivate_camera - else src.temp = "Ten additional uses added to ReCam module." - src.processing_time -= 15 - - else if(href_list["upgradecam"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/upgrade_camera)) - mod:uses += 10 - already = 1 - if (!already) - usr.verbs += /client/proc/upgrade_camera - src.temp = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses." - usr:current_modules += new /datum/AI_Module/small/upgrade_camera - else src.temp = "Ten additional uses added to ReCam module." - src.processing_time -= 15 - - else - if (href_list["temp"]) - src.temp = null src.use(usr) return diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 3a19021f250..31cf3537816 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -4,9 +4,9 @@ /datum/game_mode/malfunction name = "AI malfunction" config_tag = "malfunction" - required_players = 20 - required_enemies = 1 - recommended_enemies = 1 + required_players = 0//20 + required_enemies = 0//1 + recommended_enemies = 0//1 uplink_welcome = "Crazy AI Uplink Console:" uplink_uses = 10 @@ -52,7 +52,7 @@ return AI_mind.current.verbs += /mob/living/silicon/ai/proc/choose_modules AI_mind.current:laws = new /datum/ai_laws/malfunction - AI_mind.current:malf_picker = new /datum/AI_Module/module_picker + AI_mind.current:malf_picker = new /datum/module_picker AI_mind.current:show_laws() greet_malf(AI_mind) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a067319596e..eb051aca74a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -31,7 +31,7 @@ var/list/ai_list = list() var/obj/item/device/multitool/aiMulti = null //MALFUNCTION - var/datum/AI_Module/module_picker/malf_picker + var/datum/module_picker/malf_picker var/processing_time = 100 var/list/datum/AI_Module/current_modules = list() var/fire_res_on_core = 0 @@ -48,6 +48,7 @@ var/list/ai_list = list() var/datum/trackable/track = null var/last_paper_seen = null + var/can_shunt = 1 /mob/living/silicon/ai/New(loc, var/datum/ai_laws/L, var/obj/item/device/mmi/B, var/safety = 0) var/list/possibleNames = ai_names diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index da28c138593..f4968a9d6c6 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -796,6 +796,9 @@ if(istype(malf.loc, /obj/machinery/power/apc)) // Already in an APC malf << "You must evacuate your current apc first." return + if(!malf.can_shunt) + malf << "You cannot shunt." + return if(src.z != 1) return src.occupant = new /mob/living/silicon/ai(src,malf.laws,null,1) From 67123b19bb35b2f239234540c5cfc96a65688f90 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 12 Jul 2013 19:43:39 +0100 Subject: [PATCH 26/53] * Added a changelog entry. --- html/changelog.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/html/changelog.html b/html/changelog.html index 6ea1d1b4eee..7082b04180f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,7 +51,17 @@ should be listed in the changelog upon commit tho. Thanks. --> - + + +
+

12 July 2013

+

Giacom updated:

+
    +
  • Malf AIs can now use processing power to make an automatic robotic factory anywhere they want, using expensive nanomachines. This power is will eat all of the AI's points and will stop the AI from shunting. The machine will convert any LIVING human into a Cyborg, meaning you can create a Cyborg army easily. Remember to protect that robotics console.
  • +
+
+ +

7 July 2013

Giacom updated:

From edfd879efdb85057efa291813308b88f588b717d Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 12 Jul 2013 20:18:16 +0100 Subject: [PATCH 27/53] * Re-named the verb "Pick Ghost Form" to "Choose Ghost Form". It was interfering with the "pick up" verb which people can easily access by typing "pi" then space. A very minor convenience thing. --- code/modules/client/preferences_toggles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 5c435640d88..1273a84028f 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -131,7 +131,7 @@ var/list/ghost_forms = list("ghost","ghostking","ghostian2") /client/verb/pick_form() - set name = "Pick Ghost Form" + set name = "Choose Ghost Form" set category = "Preferences" set desc = "Choose your preferred ghostly appearance." if(!is_content_unlocked()) return From c68e73e164fd9e13a1086b38bbcaeeef73331c0e Mon Sep 17 00:00:00 2001 From: Cheridan Date: Fri, 12 Jul 2013 17:56:54 -0500 Subject: [PATCH 28/53] Adds a UI indicator for blob overminds. This unfortunately necessitated the addition of a mob/camera/blob/Life(), but I think that the added ease-of-use is worth it. --- code/datums/hud.dm | 5 ++++- code/game/gamemodes/blob/hud.dm | 11 +++++++++++ code/game/gamemodes/blob/overmind.dm | 4 ++++ code/modules/mob/mob_helpers.dm | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 code/game/gamemodes/blob/hud.dm diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 4d251c0cdca..2114b97841c 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -166,6 +166,7 @@ var/datum/global_hud/global_hud = new() var/show_intent_icons = 0 var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + var/obj/screen/blobdisplay var/obj/screen/r_hand_hud_object var/obj/screen/l_hand_hud_object var/obj/screen/action_intent @@ -257,4 +258,6 @@ datum/hud/New(mob/owner) else if(isrobot(mymob)) robot_hud() else if(isobserver(mymob)) - ghost_hud() \ No newline at end of file + ghost_hud() + else if(isovermind(mymob)) + blob_hud() \ No newline at end of file diff --git a/code/game/gamemodes/blob/hud.dm b/code/game/gamemodes/blob/hud.dm new file mode 100644 index 00000000000..b7bf27ada69 --- /dev/null +++ b/code/game/gamemodes/blob/hud.dm @@ -0,0 +1,11 @@ +/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') + + blobdisplay = new /obj/screen() + blobdisplay.name = "blob power display" + blobdisplay.icon_state = "block" + blobdisplay.screen_loc = ui_nutrition + blobdisplay.layer = 20 + + mymob.client.screen = null + + mymob.client.screen += list(blobdisplay) \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index dcfc59e1e72..03f5d966574 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -21,6 +21,10 @@ real_name = new_name ..() +mob/camera/blob/Life() + hud_used.blobdisplay.maptext = "
[src.blob_points]
" + return + /mob/camera/blob/say(var/message) return//No talking for you diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index ec3a2e2de24..2fee0fbc86a 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -115,6 +115,11 @@ proc/isobserver(A) return 1 return 0 +proc/isovermind(A) + if(istype(A, /mob/camera/blob)) + return 1 + return 0 + proc/isorgan(A) if(istype(A, /datum/limb)) return 1 From 086cfde6be391b948a88f58498335063bec9d51f Mon Sep 17 00:00:00 2001 From: Incoming Date: Fri, 12 Jul 2013 21:42:02 -0400 Subject: [PATCH 29/53] Final Sprite Tweaks *D12 has been turned a more vibrant shade of orange *The dicebag sprite has been improved with some help from Cheridan *Let's roll --- icons/obj/dice.dmi | Bin 2819 -> 2849 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index f4562b6d972d06fbd9884a0644a13b850d3ba82d..00e3eb127d47055450e269b01e789b7d24bbc493 100644 GIT binary patch delta 2698 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 delta 2668 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 Date: Fri, 12 Jul 2013 21:50:53 -0400 Subject: [PATCH 30/53] Whoops the dicebag sprite got more awesome at the last second, this is all Cheridan's fault :0 --- icons/obj/dice.dmi | Bin 2849 -> 2842 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/dice.dmi b/icons/obj/dice.dmi index 00e3eb127d47055450e269b01e789b7d24bbc493..7801e542c3d577f84edbcad93be375c2d1ba7c79 100644 GIT binary patch delta 2366 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 Date: Sat, 13 Jul 2013 09:51:27 +0100 Subject: [PATCH 31/53] * Commented out the new power, for now. --- code/game/gamemodes/malfunction/Malf_Modules.dm | 4 ++++ html/changelog.html | 12 +----------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index fe79c77b01a..f2d3aa05399 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -112,6 +112,8 @@ rcd light flash thingy on matter drain else src << "Out of uses." else src << "That's not a machine." +/* + /datum/AI_Module/large/place_cyborg_transformer module_name = "Robotic Factory (Removes Shunting)" mod_pick_name = "cyborgtransformer" @@ -167,6 +169,8 @@ rcd light flash thingy on matter drain PCT.uses -= 1 src << "You cannot shunt anymore." +*/ + /datum/AI_Module/small/blackout module_name = "Blackout" mod_pick_name = "blackout" diff --git a/html/changelog.html b/html/changelog.html index 7082b04180f..6ea1d1b4eee 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -51,17 +51,7 @@ should be listed in the changelog upon commit tho. Thanks. --> - - -
-

12 July 2013

-

Giacom updated:

-
    -
  • Malf AIs can now use processing power to make an automatic robotic factory anywhere they want, using expensive nanomachines. This power is will eat all of the AI's points and will stop the AI from shunting. The machine will convert any LIVING human into a Cyborg, meaning you can create a Cyborg army easily. Remember to protect that robotics console.
  • -
-
- - +

7 July 2013

Giacom updated:

From 9caa5905fecc3da72ea17f21342af16b77d9cba9 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Thu, 11 Jul 2013 04:43:45 +0100 Subject: [PATCH 32/53] * Made the mining shuttle one way during blob. * Increased players per blob and decreased blob count to win. * Changed the health value of the blob spores. * Blob gamemode will give the blob core a resource rate of 2, random event blob cores will get 1. * Raised the amount of time that has to pass before the blob event occurs. * Increased the difficulty of expanding into space. * Added a player limit to the blob gamemode. * Removed density from shield and other variables which are set in the abstract blob. * Deleted spores after they die. * Reset the brute resistance. * Disabled random blobs in the blob gamemode. * Double'd the blob spore's health. * Blobs can expand into space again but it will be harder to do than on a space tile. * Dead robots will be gibbed in their blob_act() as their bodies will block the blob. * Reduced the damage the blob takes from explosions, and increased the brute resistance. Blobs main weakness is fire, not force. --- code/game/gamemodes/blob/blob.dm | 19 ++++++++++++------- code/game/gamemodes/blob/blobs/core.dm | 7 ++++--- code/game/gamemodes/blob/blobs/factory.dm | 7 +++---- code/game/gamemodes/blob/blobs/node.dm | 1 - code/game/gamemodes/blob/blobs/resource.dm | 1 - code/game/gamemodes/blob/blobs/shield.dm | 4 ---- code/game/gamemodes/blob/theblob.dm | 14 +++----------- code/modules/events/blob.dm | 2 ++ code/modules/mining/mine_items.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 3 +++ 10 files changed, 28 insertions(+), 32 deletions(-) diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 46bdb150325..8e172bca70d 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -10,8 +10,7 @@ var/list/blob_nodes = list() name = "blob" config_tag = "blob" - required_players = 0 - required_enemies = 0 + required_players = 15 restricted_jobs = list("Cyborg", "AI") @@ -21,11 +20,10 @@ var/list/blob_nodes = list() var/declared = 0 var/cores_to_spawn = 1 - var/players_per_core = 26 + var/players_per_core = 30 var/blob_count = 0 - var/blobnukecount = 300//Might be a bit low - var/blobwincount = 600//Still needs testing + var/blobwincount = 500 var/list/infected_crew = list() @@ -39,7 +37,6 @@ var/list/blob_nodes = list() cores_to_spawn = max(round(num_players()/players_per_core, 1), 1) - blobnukecount = initial(blobnukecount) * cores_to_spawn blobwincount = initial(blobwincount) * cores_to_spawn @@ -80,6 +77,14 @@ var/list/blob_nodes = list() if(emergency_shuttle) emergency_shuttle.always_fake_recall = 1 + // Disable the blob event for this round. + if(events) + var/datum/round_event_control/blob/B = locate() in events.control + if(B) + B.max_occurrences = 0 // disable the event + else + error("Events variable is null in blob gamemode post setup.") + spawn(10) start_state = new /datum/station_state() start_state.count() @@ -114,7 +119,7 @@ var/list/blob_nodes = list() if(blob_client && location) - new /obj/effect/blob/core(location, 200, blob_client) + new /obj/effect/blob/core(location, 200, blob_client, 2) // Stage 0 sleep(40) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 2d2c8a41e6e..26c30699a3f 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -3,17 +3,18 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_core" health = 200 - brute_resist = 2 fire_resist = 2 var/mob/camera/blob/overmind = null // the blob core's overmind var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds var/resource_delay = 0 + var/point_rate = 1 - New(loc, var/h = 200, var/client/new_overmind = null) + New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 1) blob_cores += src processing_objects.Add(src) if(!overmind) create_overmind(new_overmind) + point_rate = new_rate ..(loc, h) @@ -41,7 +42,7 @@ else if(resource_delay <= world.time) resource_delay = world.time + 10 // 1 second - overmind.add_points(2) + overmind.add_points(point_rate) health = min(initial(health), health + 1) for(var/i = 1; i < 8; i += i) Pulse(0, i) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 6ba4bd026cb..2c821c23c5d 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_factory" health = 100 - brute_resist = 1 fire_resist = 2 var/list/spores = list() var/max_spores = 3 @@ -34,8 +33,8 @@ icon_state = "blobpod" icon_living = "blobpod" pass_flags = PASSBLOB - health = 15 - maxHealth = 15 + health = 40 + maxHealth = 40 melee_damage_lower = 2 melee_damage_upper = 4 attacktext = "hits" @@ -66,4 +65,4 @@ Die() if(factory) factory.spores -= src - ..() + del(src) diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 2e22668d4b6..6057b0d701f 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_node" health = 100 - brute_resist = 1 fire_resist = 2 diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index a0f5722282d..1ecf63aa80d 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_resource" health = 30 - brute_resist = 1 fire_resist = 2 var/mob/camera/blob/overmind = null var/resource_delay = 0 diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 3eb6f03e126..f4854939b50 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -3,11 +3,7 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_idle" desc = "Some blob creature thingy" - density = 1 - opacity = 0 - anchored = 1 health = 100 - brute_resist = 1 fire_resist = 2 diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index d52ba53d6d7..5b10d76615f 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -9,7 +9,7 @@ anchored = 1 var/active = 1 var/health = 30 - var/brute_resist = 4 + var/brute_resist = 5 var/fire_resist = 1 @@ -81,7 +81,7 @@ proc/expand(var/turf/T = null, var/prob = 1) if(prob && !prob(health)) return - if(istype(T, /turf/space)) return + if(istype(T, /turf/space) && prob(75)) return if(!T) var/list/dirs = list(1,2,4,8) for(var/i = 1 to 4) @@ -108,15 +108,7 @@ ex_act(severity) var/damage = 50 - switch(severity) - if(1) - src.health -= rand(100,120) - if(2) - src.health -= rand(60,100) - if(3) - src.health -= rand(20,60) - - health -= (damage/brute_resist) + health -= ((damage/brute_resist) - (severity * 5)) update_icon() return diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index fe128a0f14d..e4846922a30 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -4,6 +4,8 @@ weight = 5 max_occurrences = 1 + earliest_start = 48000 // 1 hour 20 minutes + /datum/round_event/blob announceWhen = 12 endWhen = 120 diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 90dcf028fd9..4769ad663b9 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -133,7 +133,7 @@ proc/move_mining_shuttle() usr.set_machine(src) src.add_fingerprint(usr) if(href_list["move"]) - if(ticker.mode.name == "blob") + if(mining_shuttle_location == 1 && istype(ticker.mode, /datum/game_mode/blob)) // shuttle is on the station, this will mean miners can come back if(ticker.mode:declared) usr << "Under directive 7-10, [station_name()] is quarantined until further notice." return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index d8a66af4506..2b2d0009db7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -238,6 +238,9 @@ adjustBruteLoss(60) updatehealth() return 1 + else + gib() + return 1 return 0 /mob/living/silicon/robot/Stat() From 1bd58ab8ad8764a0f2c2c07d87cfb959933a2203 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Sun, 14 Jul 2013 15:21:22 +0100 Subject: [PATCH 33/53] * Disposal units will now drop their contents onto the floor when deleted, such as from a blob attack. Fixes #963 --- code/modules/recycling/disposal.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6f7a66f1e5d..db2ffb2e651 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -39,6 +39,10 @@ //gas.volume = 1.05 * CELLSTANDARD update() + Del() + for(var/atom/movable/AM in contents) + AM.loc = src.loc + ..() // attack by item places it in to disposal attackby(var/obj/item/I, var/mob/user) From 2976185e93cdecdeb4063a3315b5524959ee1d88 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Sun, 14 Jul 2013 14:24:59 -0500 Subject: [PATCH 34/53] Adds a health indicator as well. --- code/datums/hud.dm | 3 ++- code/game/gamemodes/blob/hud.dm | 18 ++++++++++++------ code/game/gamemodes/blob/overmind.dm | 3 ++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 2114b97841c..2ac13a34fc1 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -166,7 +166,8 @@ var/datum/global_hud/global_hud = new() var/show_intent_icons = 0 var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/obj/screen/blobdisplay + var/obj/screen/blobpwrdisplay + var/obj/screen/blobhealthdisplay var/obj/screen/r_hand_hud_object var/obj/screen/l_hand_hud_object var/obj/screen/action_intent diff --git a/code/game/gamemodes/blob/hud.dm b/code/game/gamemodes/blob/hud.dm index b7bf27ada69..e4d459888bd 100644 --- a/code/game/gamemodes/blob/hud.dm +++ b/code/game/gamemodes/blob/hud.dm @@ -1,11 +1,17 @@ /datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') - blobdisplay = new /obj/screen() - blobdisplay.name = "blob power display" - blobdisplay.icon_state = "block" - blobdisplay.screen_loc = ui_nutrition - blobdisplay.layer = 20 + blobpwrdisplay = new /obj/screen() + blobpwrdisplay.name = "blob power" + blobpwrdisplay.icon_state = "block" + blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.layer = 20 + + blobhealthdisplay = new /obj/screen() + blobhealthdisplay.name = "blob health" + blobhealthdisplay.icon_state = "block" + blobhealthdisplay.screen_loc = ui_internal + blobhealthdisplay.layer = 20 mymob.client.screen = null - mymob.client.screen += list(blobdisplay) \ No newline at end of file + mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index 03f5d966574..6f7312e629b 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -22,7 +22,8 @@ ..() mob/camera/blob/Life() - hud_used.blobdisplay.maptext = "
[src.blob_points]
" + hud_used.blobpwrdisplay.maptext = "
[src.blob_points]
" + hud_used.blobhealthdisplay.maptext = "
[blob_core.health]
" return /mob/camera/blob/say(var/message) From f7e6225618e735ef7e53f8767e618c19f732c586 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Sun, 14 Jul 2013 14:34:58 -0500 Subject: [PATCH 35/53] Committin dat dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 826d69ff1fd..379c81bed12 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -199,6 +199,7 @@ #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\blob_finish.dm" #include "code\game\gamemodes\blob\blob_report.dm" +#include "code\game\gamemodes\blob\hud.dm" #include "code\game\gamemodes\blob\overmind.dm" #include "code\game\gamemodes\blob\powers.dm" #include "code\game\gamemodes\blob\theblob.dm" From 3351467613af6b3958be4b0a8546cd55bc40e6d5 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Mon, 15 Jul 2013 13:15:39 +0100 Subject: [PATCH 36/53] * Fixes blob spores dying by a blob_act(). --- code/game/gamemodes/blob/blobs/factory.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 2c821c23c5d..d379146f265 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -56,6 +56,9 @@ ..() adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) + blob_act() + return + New(loc, var/obj/effect/blob/factory/linked_node) if(istype(linked_node)) factory = linked_node From d0009ee313f7e1dcdd3f550f162471334b241621 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Mon, 15 Jul 2013 14:05:53 +0100 Subject: [PATCH 37/53] * Large fix to resource nodes which weren't correctly setting their overmind variable. --- code/game/gamemodes/blob/powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index b0b86cfacee..a054514dd7c 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -94,7 +94,7 @@ B.change_to(/obj/effect/blob/resource) - var/obj/effect/blob/resource/R = locate(/obj/effect/blob/resource) + var/obj/effect/blob/resource/R = locate() in T if(R) R.overmind = src From 5925d3a8760c15708723f004e9ce91555257d1ab Mon Sep 17 00:00:00 2001 From: errorage Date: Tue, 16 Jul 2013 07:26:51 +0200 Subject: [PATCH 38/53] Added the ability to define the ip and computer id for a manual ban (in the banning panel). This is so mirroring bans or banning people who were not online during the round in progress does not require admins to spawn a mob, set their variables and then ban the mob. If however an admin attempts to add a manual ban for a player who was present during the current round, a player who still has a mob somewhere in the game world, the proc will prioritize the mob's ip and computer id variables, not the things entered in the banning panel form. --- code/modules/admin/DB ban/functions.dm | 7 ++++++- code/modules/admin/topic.dm | 13 ++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index e154b5b8f09..860766ddeb4 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -1,6 +1,7 @@ #define MAX_ADMIN_BANS_PER_ADMIN 1 -datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null) +//Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional. +datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null) if(!check_rights(R_BAN)) return @@ -71,6 +72,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = ip = banned_mob.lastKnownIP else if(banckey) ckey = ckey(banckey) + computerid = bancid + ip = banip var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_player WHERE ckey = '[ckey]'") query.Execute() @@ -353,6 +356,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "" output += "" output += "Ckey: " + output += "IP: " + output += "Computer id: " output += "Duration: " output += "Job: