From 0a80f91f2c9028a1cd1eebf913934c2711503398 Mon Sep 17 00:00:00 2001 From: "elly1989@rocketmail.com" Date: Tue, 14 Feb 2012 20:29:58 +0000 Subject: [PATCH] Added Spacevines to the random events. Added a spawn space-vines option to the secrets panel. Fixes issue 250 (borg door bug) Fixed silicon interactions with engineering equipment. Fixed access lists for radiation collectors, so locking them actually serves a purpose. Fixed using crowbars on them. Borgs can name themselves upon module selection (unless a roboticist has named them previously by using a pen) To avoid Borgs griefing and then changing their name by selecting a module, borgs are now unable to move independently until they choose a module. New sprites for spacevines are on the way. So you'll have to tolerate my crappy stand-ins for a bit until he is finished with them. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3128 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/mob/living/silicon/robot.dm | 1 + code/game/gamemodes/events.dm | 6 +- code/game/gamemodes/events/miniblob.dm | 2 +- .../events/{kudzu.dm => spacevines.dm} | 126 ++++++++++++------ code/game/machinery/doors/door.dm | 2 +- code/game/objects/items/robot_parts.dm | 6 +- code/modules/admin/admin.dm | 7 +- code/modules/mining/machine_processing.dm | 4 +- code/modules/mining/machine_stacking.dm | 4 +- code/modules/mining/machine_unloading.dm | 2 +- code/modules/mob/living/silicon/robot/life.dm | 3 +- .../modules/mob/living/silicon/robot/login.dm | 4 - .../modules/mob/living/silicon/robot/robot.dm | 22 ++- code/modules/power/singularity/collector.dm | 28 ++-- code/modules/power/singularity/emitter.dm | 27 ++-- .../power/singularity/field_generator.dm | 13 +- code/modules/power/singularity/generator.dm | 4 +- code/modules/power/singularity/singularity.dm | 9 ++ code/modules/projectiles/projectile/beams.dm | 3 + html/changelog.html | 10 ++ icons/effects/kudzu.dmi | Bin 4210 -> 0 bytes icons/effects/spacevines.dmi | Bin 0 -> 5154 bytes 22 files changed, 194 insertions(+), 89 deletions(-) rename code/game/gamemodes/events/{kudzu.dm => spacevines.dm} (51%) delete mode 100644 icons/effects/kudzu.dmi create mode 100644 icons/effects/spacevines.dmi diff --git a/code/defines/mob/living/silicon/robot.dm b/code/defines/mob/living/silicon/robot.dm index ebcf1457b69..41256bd2de6 100644 --- a/code/defines/mob/living/silicon/robot.dm +++ b/code/defines/mob/living/silicon/robot.dm @@ -3,6 +3,7 @@ icon = 'robots.dmi'// icon_state = "robot" health = 300 + canmove = 0 #define BORGMESON 1 #define BORGTHERM 2 diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 3cf33b28c45..ec058932b43 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -13,11 +13,10 @@ /proc/event() event = 1 - var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13) //so ninjas don't cause "empty" events. + var/eventNumbersToPickFrom = list(1,2,4,5,6,7,8,9,10,11,12,13,14) //so ninjas don't cause "empty" events. if((world.time/10)>=3600 && toggle_space_ninja && !sent_ninja_to_station)//If an hour has passed, relatively speaking. Also, if ninjas are allowed to spawn and if there is not already a ninja for the round. eventNumbersToPickFrom += 3 - switch(pick(eventNumbersToPickFrom)) if(1) command_alert("Meteors have been detected on collision course with the station.", "Meteor Alert") @@ -83,7 +82,8 @@ appendicitis() if(13) IonStorm() - + if(14) + spacevine_infestation() /proc/power_failure() command_alert("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Critical Power Failure") diff --git a/code/game/gamemodes/events/miniblob.dm b/code/game/gamemodes/events/miniblob.dm index 5827f9cabed..84c3598cef7 100644 --- a/code/game/gamemodes/events/miniblob.dm +++ b/code/game/gamemodes/events/miniblob.dm @@ -1,7 +1,7 @@ /proc/mini_blob_event() var/turf/T = pick(blobstart) - var/obj/effect/blob/bl = new /obj/effect/blob( T.loc, 30 ) + var/obj/effect/blob/bl = new /obj/effect/blob( T, 30 ) spawn(0) bl.Life() bl.Life() diff --git a/code/game/gamemodes/events/kudzu.dm b/code/game/gamemodes/events/spacevines.dm similarity index 51% rename from code/game/gamemodes/events/kudzu.dm rename to code/game/gamemodes/events/spacevines.dm index 5281f43cf57..85426583467 100644 --- a/code/game/gamemodes/events/kudzu.dm +++ b/code/game/gamemodes/events/spacevines.dm @@ -1,19 +1,17 @@ -// SPACE VINE OR KUDZU - +// SPACE VINES /obj/effect/spacevine - name = "Space Kudzu" + name = "space vines" desc = "An extremely expansionistic species of vine." - icon = 'kudzu.dmi' + icon = 'spacevines.dmi' icon_state = "Light1" anchored = 1 density = 0 - var/energy = 0 //Energy sounds like an arbitrary-enough variable name. + pass_flags = PASSTABLE | PASSGRILLE + var/energy = 0 var/obj/effect/spacevine_controller/master = null New() - if(istype(src.loc, /turf/space)) - del(src) - return + return Del() if(master) @@ -22,37 +20,63 @@ ..() attackby(obj/item/weapon/W as obj, mob/user as mob) - if (!W) return - if (!user) return - if (istype(W, /obj/item/weapon/circular_saw)) del src - if (istype(W, /obj/item/weapon/kitchen/utensil/knife)) del src - if (istype(W, /obj/item/weapon/scalpel)) del src - if (istype(W, /obj/item/weapon/screwdriver)) del src - if (istype(W, /obj/item/weapon/shard)) del src - if (istype(W, /obj/item/weapon/weldingtool)) del src - if (istype(W, /obj/item/weapon/wirecutters)) del src + if (!W || !user || !W.type) return + switch(W.type) + if(/obj/item/weapon/circular_saw) del src + if(/obj/item/weapon/kitchen/utensil/knife) del src + if(/obj/item/weapon/scalpel) del src + if(/obj/item/weapon/fireaxe) del src + + //less effective weapons + if(/obj/item/weapon/wirecutters) + if(prob(25)) del src + if(/obj/item/weapon/shard) + if(prob(25)) del src + + else //weapons with subtypes + if(istype(W, /obj/item/weapon/melee/energy/sword)) del src + else if(istype(W, /obj/item/weapon/weldingtool)) + if(W:welding) del src + //TODO: add plant-b-gone ..() + attack_hand(mob/user as mob) + for(var/mob/M in src.loc) + if(M.buckled == src) + if(prob(50)) + if(M == user) + user << "\red You break free from the vines!" + else + user << "\red You rip away at the vines and free [M]!" + M << "\red [user] frees you from the vines!" + M.buckled = null + else + user << "\red You rip away at the vines..." + break //only process one captured mob. + + attack_paw(mob/user as mob) + return src.attack_hand(user) + /obj/effect/spacevine_controller var/list/obj/effect/spacevine/vines = list() var/list/growth_queue = list() var/reached_collapse_size var/reached_slowdown_size //What this does is that instead of having the grow minimum of 1, required to start growing, the minimum will be 0, - //meaning if you get the kudzu's size to something less than 20 plots, it won't grow anymore. + //meaning if you get the spacevines' size to something less than 20 plots, it won't grow anymore. New() if(!istype(src.loc,/turf/simulated/floor)) del(src) - spawn_kudzu_piece(src.loc) + spawn_spacevine_piece(src.loc) processing_objects.Add(src) Del() processing_objects.Remove(src) ..() - proc/spawn_kudzu_piece(var/turf/location) + proc/spawn_spacevine_piece(var/turf/location) var/obj/effect/spacevine/SV = new(location) growth_queue += SV vines += SV @@ -60,7 +84,7 @@ process() if(!vines) - del(src) //Kudzu exterminated + del(src) //space vines exterminated. Remove the controller return if(!growth_queue) del(src) //Sanity check @@ -88,39 +112,47 @@ i++ queue_end += SV growth_queue -= SV - if(SV.energy < 2) - if(prob(10)) + if(SV.energy < 2) //If tile isn't fully grown + if(prob(20)) SV.grow() + else //If tile is fully grown + SV.grab() + //if(prob(25)) SV.spread() if(i >= length) break growth_queue = growth_queue + queue_end - //sleep(5) //src.process() /obj/effect/spacevine/proc/grow() - switch(energy) - if (0) - src.icon_state = pick("Med1", "Med2", "Med3") - energy = 1 - src.opacity = 1 - if (1) - src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") - energy = 2 - src.density = 1 + if(!energy) + src.icon_state = pick("Med1", "Med2", "Med3") + energy = 1 + src.opacity = 1 + layer = 5 + else + src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") + energy = 2 + +/obj/effect/spacevine/proc/grab() + for(var/mob/living/carbon/V in src.loc) + if((V.stat != DEAD) && (V.buckled != src)) //if mob not dead or captured + V.buckled = src + V << "\red The vines [pick("wind", "tangle")] around you!" + break //only capture one mob at a time. /obj/effect/spacevine/proc/spread() var/direction = pick(cardinal) - if(istype(get_step(src,direction),/turf/simulated/floor)) - var/turf/simulated/floor/F = get_step(src,direction) + var/step = get_step(src,direction) + if(istype(step,/turf/simulated/floor)) + var/turf/simulated/floor/F = step if(!locate(/obj/effect/spacevine,F)) if(F.Enter(src)) if(master) - master.spawn_kudzu_piece( F ) - + master.spawn_spacevine_piece( F ) /* /obj/effect/spacevine/proc/Life() @@ -169,8 +201,22 @@ if (prob(50)) del(src) return - else return -/obj/effect/spacevine/temperature_expose(null, temp, volume) - del src \ No newline at end of file +/obj/effect/spacevine/temperature_expose(null, temp, volume) //hotspots kill vines + del src + +//Carn: Spacevines random event. +/proc/spacevine_infestation() + + spawn() //to stop the secrets panel hanging + var/list/turf/simulated/floor/turfs = list() //list of all the empty floor turfs in the hallway areas + for(var/area/hallway/A) + for(var/turf/simulated/floor/F in A) + if(!F.contents.len) + turfs += F + + if(turfs.len) //Pick a turf to spawn at if we can + var/turf/simulated/floor/T = pick(turfs) + new/obj/effect/spacevine_controller(T) //spawn a controller at turf + message_admins("\blue Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])") diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 0f456ca82ca..efe8eb5b863 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -112,7 +112,7 @@ attackby(obj/item/I as obj, mob/user as mob) - if(src.operating) return + if(src.operating || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them. src.add_fingerprint(user) if(!src.requiresID()) user = null diff --git a/code/game/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm index adb586fcc59..1d4a2ab63f2 100644 --- a/code/game/objects/items/robot_parts.dm +++ b/code/game/objects/items/robot_parts.dm @@ -169,7 +169,7 @@ return if(M.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." + user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI." return if(jobban_isbanned(M.brainmob, "Cyborg")) @@ -202,8 +202,8 @@ O << "You are playing a Robot. The Robot can interact with most electronic objects in its view point." O << "You must follow the laws that the AI has. You are the AI's assistant to the station basically." - O << "To use something, simply double-click it." - O << {"Use say ":s to speak to fellow cyborgs and the AI through binary."} + O << "To use something, simply click it." + O << {"Use say ":b to speak to fellow cyborgs and the AI through binary."} O.job = "Cyborg" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f2f32357d05..9da10040d34 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1626,6 +1626,11 @@ else alert("You cannot perform this action. You must be of a higher administrative rank!") return + if("spacevines") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","K") + spacevine_infestation() + message_admins("[key_name_admin(usr)] has spawned spacevines", 1) if (usr) log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]") if (ok) @@ -2047,6 +2052,7 @@ Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
+Spawn Space-Vines

Fun Secrets

@@ -2529,7 +2535,6 @@ log_admin("[key_name(usr)] spawned [chosen] at ([usr.x],[usr.y],[usr.z])") - else alert("You cannot perform this action. You must be of a higher administrative rank!", null, null, null, null, null) return diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index ff18e6aba82..bdd520a3b95 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -1,7 +1,7 @@ /**********************Mineral processing unit console**************************/ /obj/machinery/mineral/processing_unit_console - name = "Produciton machine console" + name = "production machine console" icon = 'mining_machines.dmi' icon_state = "console" density = 1 @@ -189,7 +189,7 @@ /obj/machinery/mineral/processing_unit - name = "Furnace" + name = "furnace" icon = 'mining_machines.dmi' icon_state = "furnace" density = 1 diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 301a2264ef9..ca56bde61ae 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -1,7 +1,7 @@ /**********************Mineral stacking unit console**************************/ /obj/machinery/mineral/stacking_unit_console - name = "Stacking machine console" + name = "stacking machine console" icon = 'mining_machines.dmi' icon_state = "console" density = 1 @@ -132,7 +132,7 @@ /obj/machinery/mineral/stacking_machine - name = "Stacking machine" + name = "stacking machine" icon = 'mining_machines.dmi' icon_state = "stacker" density = 1 diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index df524dfb650..66a84db5210 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -2,7 +2,7 @@ /obj/machinery/mineral/unloading_machine - name = "Unloading machine" + name = "unloading machine" icon = 'mining_machines.dmi' icon_state = "unloader" density = 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 2ee69c5746e..783eef7b8dd 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -20,7 +20,8 @@ use_power() process_killswitch() process_locks() - update_canmove() + if(modtype != "robot") //only update canmove if we've selected a module + update_canmove() update_mind() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 428e78d6c27..2e46cec1ca5 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -8,10 +8,6 @@ src.client.perspective = EYE_PERSPECTIVE if (src.stat == 2) src.verbs += /mob/proc/ghost - if(src.real_name == "Cyborg") - src.real_name += " " - src.real_name += "-[rand(1, 999)]" - src.name = src.real_name if(!src.connected_ai) for(var/mob/living/silicon/ai/A in world) src.connected_ai = A diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a0209ededd8..61b0324a9d7 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -9,9 +9,6 @@ modtype = "robot" updateicon() // syndicate = syndie - if(real_name == "Cyborg") - real_name += " [pick(rand(1, 999))]" - name = real_name spawn (4) if (client) connected_ai = activeais() @@ -67,6 +64,7 @@ return switch(mod) if("Standard") + updatename("Cy") module = new /obj/item/weapon/robot_module/standard(src) hands.icon_state = "standard" icon_state = "robot" @@ -74,6 +72,7 @@ feedback_inc("cyborg_standard",1) if("Service") + updatename("Servi") module = new /obj/item/weapon/robot_module/butler(src) hands.icon_state = "service" var/icontype = input("Select an icon!", "Robot", null, null) in list("Waitress", "Bro", "Butler", "Kent", "Rich") @@ -91,6 +90,7 @@ feedback_inc("cyborg_service",1) if("Miner") + updatename("Digger") module = new /obj/item/weapon/robot_module/miner(src) hands.icon_state = "miner" icon_state = "Miner" @@ -98,6 +98,7 @@ feedback_inc("cyborg_miner",1) if("Medical") + updatename("Medi") module = new /obj/item/weapon/robot_module/medical(src) hands.icon_state = "medical" icon_state = "surgeon" @@ -106,6 +107,7 @@ feedback_inc("cyborg_medical",1) if("Security") + updatename("Securi") module = new /obj/item/weapon/robot_module/security(src) hands.icon_state = "security" icon_state = "bloodhound" @@ -113,6 +115,7 @@ feedback_inc("cyborg_security",1) if("Engineering") + updatename("Engi") module = new /obj/item/weapon/robot_module/engineering(src) hands.icon_state = "engineer" icon_state = "landmate" @@ -120,6 +123,7 @@ feedback_inc("cyborg_engineering",1) if("Janitor") + updatename("Jani") module = new /obj/item/weapon/robot_module/janitor(src) hands.icon_state = "janitor" icon_state = "mopgearrex" @@ -129,6 +133,18 @@ overlays -= "eyes" //Takes off the eyes that it started with updateicon() +/mob/living/silicon/robot/verb/updatename(var/prefix as text) + if(real_name == "Cyborg") + var/defaultname = "[prefix]borg -[rand(1,999)]" + var/newname = input("Please input a name", "Name selection", defaultname, null) + newname = copytext(sanitize(newname), 1, MAX_MESSAGE_LEN) //Sanitize the name + + if(!newname) + newname = "[defaultname]" + + real_name = newname + name = real_name + /mob/living/silicon/robot/verb/cmd_robot_alerts() set category = "Robot Commands" set name = "Show Alerts" diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index b729ec0e374..94b761882b4 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -7,6 +7,7 @@ anchored = 0 density = 1 directwired = 1 + req_access = list(access_engine) // use_power = 0 var obj/item/weapon/tank/plasma/P = null @@ -26,15 +27,14 @@ attack_hand(mob/user as mob) if(anchored) - if(!src.locked || istype(user, /mob/living/silicon)) + if(!src.locked) toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") return else - if(src.locked) - user << "\red The controls are locked." - return + user << "\red The controls are locked!" + return ..() @@ -44,10 +44,10 @@ return 1 else if(istype(W, /obj/item/weapon/tank/plasma)) if(!src.anchored) - user << "The [src] needs to be secured to the floor first." + user << "\red The [src] needs to be secured to the floor first." return 1 if(src.P) - user << "\red There appears to already be a plasma tank loaded!" + user << "\red There's already a plasma tank loaded." return 1 src.P = W W.loc = src @@ -56,28 +56,32 @@ user.u_equip(W) updateicon() else if(istype(W, /obj/item/weapon/crowbar)) - if(P) + if(P && !src.locked) eject() return 1 else if(istype(W, /obj/item/weapon/wrench)) if(P) - user << "\red Remove the plasma tank first." + user << "\blue Remove the plasma tank first." return 1 playsound(src.loc, 'Ratchet.ogg', 75, 1) src.anchored = !src.anchored user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \ "You [anchored? "secure":"undo"] the external bolts.", \ - "You hear ratchet") + "You hear a ratchet") if(anchored) connect_to_network() else disconnect_from_network() else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) if (src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" + if(active) + src.locked = !src.locked + user << "The controls are now [src.locked ? "locked." : "unlocked."]" + else + src.locked = 0 //just in case it somehow gets locked + user << "\red The controls can only be locked when the [src] is active" else - user << "\red Access denied." + user << "\red Access denied!" return 1 else ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index c794fcbbbee..7d69701c710 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -47,7 +47,7 @@ attack_hand(mob/user as mob) src.add_fingerprint(user) if(state == 2) - if(!src.locked || istype(user, /mob/living/silicon)) + if(!src.locked) if(src.active==1) src.active = 0 user << "You turn off the [src]." @@ -60,9 +60,9 @@ src.use_power = 2 update_icon() else - user << "The controls are locked!" + user << "\red The controls are locked!" else - user << "The [src] needs to be firmly secured to the floor first." + user << "\red The [src] needs to be firmly secured to the floor first." return 1 @@ -90,8 +90,7 @@ src.fire_delay = rand(20,100) src.shot_number = 0 use_power(1000) - var/obj/item/projectile/beam/A = new /obj/item/projectile/beam( src.loc ) - A.icon_state = "emitter" + var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) playsound(src.loc, 'emitter.ogg', 25, 1) if(prob(35)) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -128,14 +127,14 @@ playsound(src.loc, 'Ratchet.ogg', 75, 1) user.visible_message("[user.name] secures [src.name] to the floor.", \ "You secure the external reinforcing bolts to the floor.", \ - "You hear ratchet") + "You hear a ratchet") src.anchored = 1 if(1) state = 0 playsound(src.loc, 'Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \ "You undo the external reinforcing bolts.", \ - "You hear ratchet") + "You hear a ratchet") src.anchored = 0 if(2) user << "\red The [src.name] needs to be unwelded from the floor." @@ -160,7 +159,7 @@ user << "You weld the [src] to the floor." W:welding = 1 else - user << "\blue You need more welding fuel to complete this task." + user << "\red You need more welding fuel to complete this task." if(2) if (W:remove_fuel(0,user)) W:welding = 2 @@ -173,16 +172,20 @@ user << "You cut the [src] free from the floor." W:welding = 1 else - user << "\blue You need more welding fuel to complete this task." + user << "\red You need more welding fuel to complete this task." return - if(istype(W, /obj/item/weapon/card/id))//The slot is too small for PDAs + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) user << "\red The lock seems to be broken" return if(src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" + if(active) + src.locked = !src.locked + user << "The controls are now [src.locked ? "locked." : "unlocked."]" + else + src.locked = 0 //just in case it somehow gets locked + user << "\red The controls can only be locked when the [src] is online" else user << "\red Access denied." return diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 1dfb4e694e5..034269b94f3 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -190,7 +190,6 @@ field_generator power level display src.cleanup() update_icon() - turn_on() active = 1 warming_up = 1 @@ -342,3 +341,15 @@ field_generator power level display connected_gens.Remove(FG) connected_gens = list() clean_up = 0 + + //This is here to help fight the "hurr durr, release singulo cos nobody will notice before the + //singulo eats the evidence". It's not fool-proof but better than nothing. + //I want to avoid using global variables. + spawn(1) + var/temp = 1 //stops spam + for(var/obj/machinery/singularity/O in world) + if(O.last_warning && temp) + if((world.time - O.last_warning) > 50) //to stop message-spam + temp = 0 + message_admins("A singulo exists and a containment field has failed.",1) + O.last_warning = world.time diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index a88aed835c4..9cf20a8f394 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -42,11 +42,11 @@ if(anchored) user.visible_message("[user.name] secures [src.name] to the floor.", \ "You secure the [src.name] to the floor.", \ - "You hear ratchet") + "You hear a ratchet") else user.visible_message("[user.name] unsecures [src.name] from the floor.", \ "You unsecure the [src.name] from the floor.", \ - "You hear ratchet") + "You hear a ratchet") return return ..() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 8690e9fcb2c..7093fe95e68 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -29,8 +29,17 @@ var/global/list/uneatable = list( target = null //its target. moves towards the target if it has one last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing teleport_del = 0 + last_warning New(loc, var/starting_energy = 50, var/temp = 0) + //CARN: admin-alert for chuckle-fuckery. + last_warning = world.time + var/count = 0 + for(var/obj/machinery/containment_field/CF in world) + count = 1 + break + if(!count) message_admins("A singulo has been created without containment fields active ([x],[y],[z])",1) + src.energy = starting_energy if(temp) spawn(temp) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 24f24d39751..343841f0f3c 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -34,6 +34,9 @@ icon_state = "heavylaser" damage = 60 +/obj/item/projectile/beam/emitter + name = "emitter beam" + icon_state = "emitter" diff --git a/html/changelog.html b/html/changelog.html index ff7a7cb6ff3..4b77c119211 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -92,6 +92,16 @@ should be listed in the changelog upon commit tho. Thanks. --> +
+

14 February 2012

+

Carn updated:

+ +
+

13 February 2012

Khodoque updated:

diff --git a/icons/effects/kudzu.dmi b/icons/effects/kudzu.dmi deleted file mode 100644 index 5d00a913f38d818d299fb8d9674617cfea57763b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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