diff --git a/baystation12.dme b/baystation12.dme index 039c82f9d38..f4ec3ef49a1 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -395,6 +395,7 @@ #include "code\game\events\EventProcs\ninja_abilities.dm" #include "code\game\events\EventProcs\ninja_equipment.dm" #include "code\game\events\EventProcs\space_ninja.dm" +#include "code\game\events\EventProcs\spacevines.dm" #include "code\game\events\Events\AlienInfestation.dm" #include "code\game\events\Events\Appendicitis.dm" #include "code\game\events\Events\ElectricalStorm.dm" diff --git a/code/game/events/EventProcs/miniblob.dm b/code/game/events/EventProcs/miniblob.dm index ed390a2148f..f81fda88197 100644 --- a/code/game/events/EventProcs/miniblob.dm +++ b/code/game/events/EventProcs/miniblob.dm @@ -6,7 +6,7 @@ for(var/atom/A in T) if(A.density) del(A) - 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/events/EventProcs/kudzu.dm b/code/game/events/EventProcs/spacevines.dm similarity index 51% rename from code/game/events/EventProcs/kudzu.dm rename to code/game/events/EventProcs/spacevines.dm index 17d2215eb85..8f279d51f04 100644 --- a/code/game/events/EventProcs/kudzu.dm +++ b/code/game/events/EventProcs/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,65 @@ ..() 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 +// if(/obj/item/weapon/hatchet) del src + if(/obj/item/weapon/melee/energy) 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 +86,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 +114,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 +203,23 @@ 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/areapath in typesof(/area/hallway)) + var/area/hallway/A = locate(areapath) + 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/objects/items/robot_parts.dm b/code/game/objects/items/robot_parts.dm index d8862fd976a..c392932ff22 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")) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 769dd0d59f3..163ca0e9dd1 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1724,6 +1724,11 @@ var/global/BSACooldown = 0 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) @@ -2260,6 +2265,7 @@ var/global/BSACooldown = 0 Spawn an Immovable Rod
Toggle a "lights out" event
Spawn an Ion Storm
+Spawn Space-Vines

Fun Secrets

diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 03bda28715b..41425cf2c04 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -190,7 +190,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 a6522dc2a14..0f65c3a370a 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -133,7 +133,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 6efbd7c08ef..149218e5720 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/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 469395cd2b6..f9785682fd9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -56,6 +56,7 @@ mmi.brainmob.key = key else//If the brain does have a mind. Also shouldn't happen but who knows. mmi.brainmob.key = key + mmi = null ..() @@ -67,13 +68,16 @@ return switch(mod) if("Standard") + updatename() module = new /obj/item/weapon/robot_module/standard(src) hands.icon_state = "standard" icon_state = "robot" modtype = "Stand" + //feedback_inc("cyborg_standard",1) channels = list() if("Service") + updatename(mod) 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") @@ -88,17 +92,21 @@ else icon_state = "Service2" modtype = "Butler" + //feedback_inc("cyborg_service",1) channels = list() if("Miner") + updatename(mod) module = new /obj/item/weapon/robot_module/miner(src) hands.icon_state = "miner" icon_state = "Miner" modtype = "Miner" + //feedback_inc("cyborg_miner",1) channels = list("Mining" = 1) if("Medical") var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") + updatename(mod) module = new /obj/item/weapon/robot_module/medical(src) hands.icon_state = "medical" if (sprite == "Humanoid") @@ -107,10 +115,12 @@ src.icon_state = "surgeon" modtype = "Med" nopush = 1 + //feedback_inc("cyborg_medical",1) channels = list("Medical" = 1) if("Security") var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") + updatename(mod) module = new /obj/item/weapon/robot_module/security(src) hands.icon_state = "security" if (sprite == "Humanoid") @@ -119,8 +129,10 @@ src.icon_state = "bloodhound" modtype = "Sec" channels = list("Security" = 1) + //feedback_inc("cyborg_security",1) if("Engineering") + updatename(mod) var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") module = new /obj/item/weapon/robot_module/engineering(src) hands.icon_state = "engineer" @@ -129,9 +141,11 @@ if (sprite == "Non-Humanoid") src.icon_state = "landmate" modtype = "Eng" + //feedback_inc("cyborg_engineering",1) channels = list("Engineering" = 1) if("Janitor") + updatename(mod) var/sprite = input(src,"Chassis Style", "Chassis Style", "Cancel") in list("Humanoid","Non-Humanoid") module = new /obj/item/weapon/robot_module/janitor(src) hands.icon_state = "janitor" @@ -140,12 +154,22 @@ if (sprite == "Non-Humanoid") src.icon_state = "mopgearrex" modtype = "Jan" + //feedback_inc("cyborg_janitor",1) channels = list() overlays -= "eyes" //Takes off the eyes that it started with radio.config(channels) updateicon() +/mob/living/silicon/robot/proc/updatename(var/prefix as text) + if( length(real_name) < 7 || !prefix ) return + //not really necessary but just to avoid annoying people with + //unique names seeming as nobody could give me a straight answer as + //to whether to remove custom borg names completely. + if(copytext(real_name, 1, 7) == "Cyborg") + real_name = "[prefix] [real_name]" + name = real_name + /mob/living/silicon/robot/verb/cmd_robot_alerts() set category = "Robot Commands" set name = "Show Alerts" @@ -352,6 +376,9 @@ /mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do + return + if (istype(W, /obj/item/weapon/weldingtool) && W:welding) if(getBruteLoss() == 0) user << "There are no dents to fix here!" @@ -492,6 +519,41 @@ spark_system.start() return ..() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob) if (!ticker) M << "You cannot attack people before the game has started." @@ -1044,5 +1106,6 @@ Frequency: del(module) /mob/living/silicon/robot/proc/self_destruct() - gib(1) + gib() + return 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 e358be33532..af29baf48f3 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]." @@ -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 diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index fa68830205f..c6acb29eb54 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -191,7 +191,6 @@ field_generator power level display src.cleanup() update_icon() - turn_on() active = 1 warming_up = 1 @@ -351,3 +350,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/singularity.dm b/code/modules/power/singularity/singularity.dm index 01f9160cec1..9c98d192c99 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -30,8 +30,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 2806c862c25..d9606bcd987 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -73,6 +73,10 @@ icon_state = "heavylaser" damage = 60 +/obj/item/projectile/beam/emitter + name = "emitter beam" + icon_state = "emitter" + diff --git a/icons/effects/kudzu.dmi b/icons/effects/kudzu.dmi deleted file mode 100644 index 5d00a913f38..00000000000 Binary files a/icons/effects/kudzu.dmi and /dev/null differ diff --git a/icons/effects/spacevines.dmi b/icons/effects/spacevines.dmi new file mode 100644 index 00000000000..7087416ae70 Binary files /dev/null and b/icons/effects/spacevines.dmi differ