From 7d04c9c1696eb8b2af99d6144e9bf89644870221 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Mon, 23 Apr 2012 21:07:55 +0100 Subject: [PATCH] TG: 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. Revision: r3128 Author: elly1...@rocketmail.com --- baystation12.dme | 1 + code/game/events/EventProcs/miniblob.dm | 2 +- .../EventProcs/{kudzu.dm => spacevines.dm} | 129 ++++++++++++------ code/game/objects/items/robot_parts.dm | 2 +- code/modules/admin/admin.dm | 6 + code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/machine_stacking.dm | 2 +- code/modules/mining/machine_unloading.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 65 ++++++++- code/modules/power/singularity/collector.dm | 28 ++-- code/modules/power/singularity/emitter.dm | 5 +- .../power/singularity/field_generator.dm | 13 +- code/modules/power/singularity/singularity.dm | 9 ++ code/modules/projectiles/projectile/beams.dm | 4 + icons/effects/kudzu.dmi | Bin 4210 -> 0 bytes icons/effects/spacevines.dmi | Bin 0 -> 5154 bytes 16 files changed, 208 insertions(+), 62 deletions(-) rename code/game/events/EventProcs/{kudzu.dm => spacevines.dm} (51%) delete mode 100644 icons/effects/kudzu.dmi create mode 100644 icons/effects/spacevines.dmi 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 5d00a913f38d818d299fb8d9674617cfea57763b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4210 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