From e1f0d0fec785f64d36eb0d3131f40ae2217dfa96 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 19:47:04 +0100 Subject: [PATCH 01/11] Bug fixes, add atmos watertank --- code/_onclick/hud/screen_objects.dm | 4 +- code/game/gamemodes/xenos/xenos.dm | 71 +--- code/game/objects/effects/effect_system.dm | 11 + .../objects/items/weapons/extinguisher.dm | 156 +++------ .../objects/items/weapons/tanks/watertank.dm | 302 +++++++++++++++--- .../crates_lockers/closets/job_closets.dm | 1 + .../closets/secure/engineering.dm | 1 + .../mob/living/carbon/human/update_icons.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 101 ++++-- code/modules/mob/living/silicon/ai/laws.dm | 2 +- code/modules/mob/living/silicon/robot/laws.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 112 ++++--- code/modules/mob/living/silicon/silicon.dm | 1 + code/modules/mob/mob.dm | 2 + code/modules/mob/mob_defines.dm | 1 + code/modules/mob/transform_procs.dm | 66 ++-- code/modules/reagents/Chemistry-Reagents.dm | 6 +- icons/obj/watertank.dmi | Bin 0 -> 5260 bytes 18 files changed, 488 insertions(+), 353 deletions(-) create mode 100644 icons/obj/watertank.dmi diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8f8058aa9e3..88894fa8b9c 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -404,7 +404,7 @@ if("Toggle Sensor Augmentation") if(isrobot(usr)) var/mob/living/silicon/robot/R = usr - R.control_hud() + R.sensor_mode() if("module1") if(istype(usr, /mob/living/silicon/robot)) @@ -551,7 +551,7 @@ if("Set Sensor Augmentation") if(isAI(usr)) var/mob/living/silicon/ai/AI = usr - AI.control_hud() + AI.sensor_mode() // Alien if("night vision") diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index de841595de5..b8f57122a7c 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -18,8 +18,6 @@ var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) - var/xenoai = 0 //Should the Xenos have their own AI? - var/xenoborg = 0 //Should the Xenos have their own borg? var/gammaratio = 4 //At what alien to human ratio will the Gamma security level be called and the nuke be made available? /datum/game_mode/xenos/announce() @@ -70,48 +68,12 @@ del(A) continue - var/xenoai_selected = 0 - var/xenoborg_selected = 0 var/xenoqueen_selected = 0 var/spawnpos = 1 for(var/datum/mind/xeno_mind in xenos) if(spawnpos > xenos_spawn.len) spawnpos = 1 - //XenoAI selection - if(xenoai && !xenoai_selected) - var/mob/living/silicon/ai/O = new(xenos_spawn[spawnpos],,,1)//No MMI but safety is in effect. - O.invisibility = 0 - O.aiRestorePowerRoutine = 0 - - if(xeno_mind.current) - xeno_mind.transfer_to(O) - O.mind.original = O - else - O.key = xeno_mind.current.key - - //del(xeno_mind) - var/obj/loc_landmark - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name == "XenoAI") - loc_landmark = sloc - O.loc = loc_landmark.loc - O.icon_state = "ai-alien" - O.verbs.Remove(,/mob/living/silicon/ai/proc/ai_call_shuttle,/mob/living/silicon/ai/proc/ai_camera_track, \ - /mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \ - /mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \ - /mob/living/silicon/ai/proc/toggle_camera_light,/mob/living/silicon/ai/verb/pick_icon) - O.laws = new /datum/ai_laws/alienmov - O.name = "Alien AI" - O.real_name = name - xeno_mind.name = O.name - O.alienAI = 1 - O.network = list("SS13","Xeno") - O.holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3")) - O.alien_talk_understand = 1 - xenoai_selected = 1 - spawnpos++ - continue //XenoQueen Selection if(!xenoqueen_selected) var/mob/living/carbon/alien/humanoid/queen/O = new(xenos_spawn[spawnpos]) @@ -124,37 +86,6 @@ xenoqueen_selected = 1 spawnpos++ continue - //XenoBorg Selection - if(xenoborg && !xenoborg_selected) - var/mob/living/silicon/robot/O = new(xenos_spawn[spawnpos],0,0,1) - O.mmi = new /obj/item/device/mmi(O) - O.mmi.alien = 1 - O.mmi.transfer_identity(xeno_mind.current)//Does not transfer key/client. - O.cell = new(O) - O.cell.maxcharge = 25000 - O.cell.charge = 25000 - O.gender = xeno_mind.current.gender - O.invisibility = 0 - O.key = xeno_mind.current.key - //del(xeno_mind) - O.job = "Alien Cyborg" - O.name = "Alien Cyborg" - O.real_name = name - xeno_mind.name = O.name - O.module = new /obj/item/weapon/robot_module/alien/hunter(src) - O.hands.icon_state = "standard" - O.icon = 'icons/mob/alien.dmi' - O.icon_state = "xenoborg-state-a" - O.modtype = "Xeno-Hu" - O.connected_ai = select_active_alien_ai() - O.laws = new /datum/ai_laws/alienmov() - O.scrambledcodes = 1 - O.hiddenborg = 1 - O.alien_talk_understand = 1 - feedback_inc("xeborg_hunter",1) - xenoborg_selected = 1 - spawnpos++ - continue //Additional larvas if playercount > 20 else var/mob/living/carbon/alien/larva/O = new(xenos_spawn[spawnpos]) @@ -230,7 +161,7 @@ var/list/livingxenos = list() for(var/datum/mind/xeno in xenos) if((xeno) && (xeno.current) && (xeno.current.stat != 2) && (xeno.current.client)) - if(istype(xeno.current,/mob/living/carbon/alien) || (xenoborg && isrobot(xeno.current)) || (xenoai && isAI(xeno.current))) + if(istype(xeno.current,/mob/living/carbon/alien)) livingxenos += xeno return livingxenos.len diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 4cb89d01ea5..73ccbd3aab3 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -11,6 +11,17 @@ would spawn and follow the beaker, even if it is carried or thrown. icon = 'icons/effects/effects.dmi' mouse_opacity = 0 unacidable = 1//So effect are not targeted by alien acid. + +/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16) + if(A.alpha == 0) //Handle already transparent case + return + if(frames == 0) + frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame". + var/step = A.alpha / frames + for(var/i = 0, i < frames, i++) + A.alpha -= step + sleep(world.tick_lag) + return /obj/effect/effect/water name = "water" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 8896e9a77d2..b242397b251 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -1,4 +1,3 @@ - /obj/item/weapon/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." @@ -18,19 +17,17 @@ var/last_use = 1.0 var/safety = 1 var/sprite_name = "fire_extinguisher" - - reagents_to_log=list( - "plasma"= "plasma", - "pacid" = "polytrinic acid", - "sacid" = "sulphuric acid" - ) + var/power = 5 //Maximum distance launched water will travel + var/precision = 0 //By default, turfs picked from a spray are random, set to 1 to make it always have at least one water effect per row + var/cooling_power = 2 //Sets the cooling_temperature of the water reagent datum inside of the extinguisher when it is refilled /obj/item/weapon/extinguisher/mini - name = "fire extinguisher" + name = "pocket fire extinguisher" desc = "A light and compact fibreglass-framed model fire extinguisher." icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. + flags = null //doesn't CONDUCT throwforce = 2 w_class = 2.0 force = 3.0 @@ -39,22 +36,8 @@ sprite_name = "miniFE" /obj/item/weapon/extinguisher/New() - var/datum/reagents/R = new/datum/reagents(max_water) - reagents = R - R.my_atom = src - R.add_reagent("water", max_water) - -/obj/item/weapon/extinguisher/examine() - set src in usr - - usr << "\icon[src] [src.name] contains:" - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - usr << "\blue [R.volume] units of [R.name]" - for(var/thing in src) - usr << "\red \A [thing] is jammed into the nozzle!" - ..() - return + create_reagents(max_water) + reagents.add_reagent("water", max_water) /obj/item/weapon/extinguisher/attack_self(mob/user as mob) safety = !safety @@ -63,81 +46,43 @@ user << "The safety is [safety ? "on" : "off"]." return -/* -/obj/item/weapon/extinguisher/attackby(obj/item/W, mob/user, params) - if(user.stat || user.restrained() || user.lying) return - - if (istype(W, /obj/item/weapon/wrench)) - if(!is_open_container()) - user.visible_message("[user] begins to unwrench the fill cap on \the [src].","\blue You begin to unwrench the fill cap on \the [src].") - if(do_after(user, 25)) - user.visible_message("[user] removes the fill cap on \the [src].","\blue You remove the fill cap on \the [src].") - playsound(get_turf(src),'sound/items/Ratchet.ogg', 100, 1) - flags |= OPENCONTAINER +/obj/item/weapon/extinguisher/proc/AttemptRefill(atom/target, mob/user) + if(istype(target, /obj/structure/reagent_dispensers/watertank) && target.Adjacent(user)) + var/safety_save = safety + safety = 1 + if(reagents.total_volume == reagents.maximum_volume) + user << "\The [src] is already full!" + safety = safety_save + return 1 + var/obj/structure/reagent_dispensers/watertank/W = target + var/transferred = W.reagents.trans_to(src, max_water) + if(transferred > 0) + user << "\The [src] has been refilled by [transferred] units" + playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) + for(var/datum/reagent/water/R in reagents.reagent_list) + R.cooling_temperature = cooling_power else - user.visible_message("[user] begins to seal the fill cap on \the [src].","\blue You begin to seal the fill cap on \the [src].") - if(do_after(user, 25)) - user.visible_message("[user] fastens the fill cap on \the [src].","\blue You fasten the fill cap on \the [src].") - playsound(get_turf(src),'sound/items/Ratchet.ogg', 100, 1) - flags &= ~OPENCONTAINER - return - - if (istype(W, /obj/item) && !is_open_container()) - if(W.w_class>1) - user << "\The [W] won't fit into the nozzle!" - return - if(locate(/obj) in src) - user << "There's already something crammed into the nozzle." - return - user.drop_item() - W.loc=src - user << "You cram \the [W] into the nozzle of \the [src]." - msg_admin_attack("[user]/[user.ckey] has crammed \a [W] into a [src].") - */ - + user << "\The [W] is empty!" + safety = safety_save + return 1 + else + return 0 /obj/item/weapon/extinguisher/afterattack(atom/target, mob/user , flag) - if(get_dist(src,target) <= 1) - if((istype(target, /obj/structure/reagent_dispensers))) - var/obj/o = target - var/list/badshit=list() - for(var/bad_reagent in src.reagents_to_log) - if(o.reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) filled \a [src] with [o.reagents.get_reagent_ids()] [hl]. (JMP)") - log_game("[user.name] ([user.ckey]) filled \a [src] with [o.reagents.get_reagent_ids()] [hl]. (JMP)") - o.reagents.trans_to(src, 50) - user << "\blue \The [src] is now refilled" - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - return - - if(is_open_container() && reagents.total_volume) - user << "\blue You empty \the [src] onto [target]." - if(reagents.has_reagent("fuel")) - message_admins("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (JMP)") - log_game("[user.name] ([user.ckey]) poured Welder Fuel onto [target]. (JMP)") - src.reagents.reaction(target, TOUCH) - spawn(5) src.reagents.clear_reagents() - return - if (!safety && !is_open_container()) + //TODO; Add support for reagents in water. + if(target.loc == user)//No more spraying yourself when putting your extinguisher away + return + var/Refill = AttemptRefill(target, user) + if(Refill) + return + if (!safety) if (src.reagents.total_volume < 1) - usr << "\red \The [src] is empty." + usr << "\The [src] is empty." return if (world.time < src.last_use + 20) return - var/list/badshit=list() - for(var/bad_reagent in src.reagents_to_log) - if(reagents.has_reagent(bad_reagent)) - badshit += reagents_to_log[bad_reagent] - if(badshit.len) - var/hl="\red ([english_list(badshit)]) \black" - message_admins("[user.name] ([user.ckey]) used \a [src] filled with [reagents.get_reagent_ids(1)] [hl]. (JMP)") - log_game("[user.name] ([user.ckey]) used \a [src] filled with [reagents.get_reagent_ids(1)] [hl]. (JMP)") - src.last_use = world.time playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3) @@ -146,27 +91,19 @@ if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored ) spawn(0) - var/obj/structure/stool/bed/chair/C = null - if(istype(usr.buckled, /obj/structure/stool/bed/chair)) - C = usr.buckled var/obj/B = usr.buckled var/movementdirection = turn(direction,180) - if(C) C.propelled = 4 B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) - if(C) C.propelled = 3 sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) - if(C) C.propelled = 2 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) - if(C) C.propelled = 1 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) - if(C) C.propelled = 0 sleep(3) B.Move(get_step(usr,movementdirection), movementdirection) sleep(3) @@ -174,16 +111,6 @@ sleep(3) B.Move(get_step(usr,movementdirection), movementdirection) - if(locate(/obj) in src) - for(var/obj/thing in src) - thing.loc = get_turf(src) - thing.throw_at(target,thing.throw_range*2,throw_speed*2) - user.visible_message( - "[user] fires [src] and launches [thing] at [target]!", - "You fire [src] and launch [thing] at [target]!") - break - - var/turf/T = get_turf(target) var/turf/T1 = get_step(T,turn(direction, 90)) var/turf/T2 = get_step(T,turn(direction, -90)) @@ -202,21 +129,20 @@ src.reagents.trans_to(W,1) for(var/b=0, b<5, b++) step_towards(W,my_target) - if(!W) return - if(!W.reagents) return + if(!W || !W.reagents) return W.reagents.reaction(get_turf(W)) for(var/atom/atm in get_turf(W)) if(!W) return - W.reagents.reaction(atm, TOUCH) // Touch, since we sprayed it. - if(isliving(atm) && W.reagents.has_reagent("water")) // For extinguishing mobs on fire - var/mob/living/M = atm // Why isn't this handled by the reagent? - N3X + W.reagents.reaction(atm) + if(isliving(atm)) //For extinguishing mobs on fire + var/mob/living/M = atm M.ExtinguishMob() if(W.loc == my_target) break sleep(2) - if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0)) + if(!has_gravity(user)) user.inertia_dir = get_dir(target, user) step(user, user.inertia_dir) else return ..() - return + \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index e721c2ab283..d6cf9a59171 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -2,7 +2,7 @@ /obj/item/weapon/watertank name = "backpack water tank" desc = "A S.U.N.S.H.I.N.E. brand watertank backpack with nozzle to water plants." - icon = 'icons/obj/hydroponics.dmi' + icon = 'icons/obj/watertank.dmi' icon_state = "waterbackpack" item_state = "waterbackpack" w_class = 4.0 @@ -18,39 +18,34 @@ ..() create_reagents(volume) noz = make_noz() - return - -/obj/item/weapon/watertank/examine() - set src in usr - ..() - for(var/datum/reagent/R in reagents.reagent_list) - usr << "[round(R.volume)] units of [R.name] left." - return /obj/item/weapon/watertank/ui_action_click() - if (usr.get_item_by_slot(slot_back) == src) - toggle_mister() - else - usr << "The watertank needs to be on your back to use!" - return + toggle_mister() /obj/item/weapon/watertank/verb/toggle_mister() set name = "Toggle Mister" set category = "Object" + if (usr.get_item_by_slot(slot_back) != src) + usr << "The watertank needs to be on your back to use." + return + if(usr.stat || !usr.canmove || usr.restrained()) + return on = !on var/mob/living/carbon/human/user = usr if(on) + if(noz == null) + noz = make_noz() + //Detach the nozzle into the user's hands - var/list/L = list("left hand" = slot_l_hand,"right hand" = slot_r_hand) - if(!user.equip_in_one_of_slots(noz, L)) + if(!user.put_in_hands(noz)) on = 0 - user << "You need a free hand to hold the mister!" + user << "You need a free hand to hold the mister." return noz.loc = user else //Remove from their hands and put back "into" the tank - remove_noz(user) + remove_noz() return /obj/item/weapon/watertank/proc/make_noz() @@ -58,21 +53,52 @@ /obj/item/weapon/watertank/equipped(mob/user, slot) if (slot != slot_back) - remove_noz(user) + remove_noz() -/obj/item/weapon/watertank/proc/remove_noz(mob/user) - var/mob/living/carbon/human/M = user - if(noz in get_both_hands(M)) - M.unEquip(noz) +/obj/item/weapon/watertank/proc/remove_noz() + if(ismob(noz.loc)) + var/mob/M = noz.loc + M.unEquip(noz, 1) return /obj/item/weapon/watertank/Destroy() if (on) - var/M = get(noz, /mob) - remove_noz(M) + remove_noz() + qdel(noz) + noz = null ..() return +/obj/item/weapon/watertank/attack_hand(mob/user as mob) + if(src.loc == user) + ui_action_click() + return + ..() + +/obj/item/weapon/watertank/MouseDrop(obj/over_object) + if(ishuman(src.loc)) + var/mob/living/carbon/human/H = src.loc + switch(over_object.name) + if("r_hand") + if(H.r_hand) + return + if(!H.unEquip(src)) + return + H.put_in_r_hand(src) + if("l_hand") + if(H.l_hand) + return + if(!H.unEquip(src)) + return + H.put_in_l_hand(src) + return + +/obj/item/weapon/watertank/attackby(obj/item/W, mob/user, params) + if(W == noz) + remove_noz() + return + ..() + // This mister item is intended as an extension of the watertank and always attached to it. // Therefore, it's designed to be "locked" to the player's hands or extended back onto // the watertank backpack. Allowing it to be placed elsewhere or created without a parent @@ -80,13 +106,14 @@ /obj/item/weapon/reagent_containers/spray/mister name = "water mister" desc = "A mister nozzle attached to a water tank." - icon = 'icons/obj/hydroponics.dmi' + icon = 'icons/obj/watertank.dmi' icon_state = "mister" item_state = "mister" w_class = 4.0 amount_per_transfer_from_this = 50 possible_transfer_amounts = list(25,50,100) volume = 500 + flags = NODROP | OPENCONTAINER | NOBLUDGEON var/obj/item/weapon/watertank/tank @@ -99,7 +126,7 @@ return /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) - user << "The mister snaps back onto the watertank!" + user << "The mister snaps back onto the watertank." tank.on = 0 loc = tank @@ -114,6 +141,16 @@ else return 1 +/obj/item/weapon/reagent_containers/spray/mister/Move() + ..() + if(loc != tank.loc) + loc = tank.loc + +/obj/item/weapon/reagent_containers/spray/mister/afterattack(obj/target, mob/user, proximity) + if(target.loc == loc || target == tank) //Safety check so you don't fill your mister with mutagen or something and then blast yourself in the face with it putting it away + return + ..() + //Janitor tank /obj/item/weapon/watertank/janitor name = "backpack water tank" @@ -123,13 +160,12 @@ /obj/item/weapon/watertank/janitor/New() ..() - reagents.add_reagent("cleaner", 250) - + reagents.add_reagent("cleaner", 500) /obj/item/weapon/reagent_containers/spray/mister/janitor name = "janitor spray nozzle" desc = "A janitorial spray nozzle attached to a watertank, designed to clean up large messes." - icon = 'icons/obj/hydroponics.dmi' + icon = 'icons/obj/watertank.dmi' icon_state = "misterjani" item_state = "misterjani" amount_per_transfer_from_this = 5 @@ -142,25 +178,45 @@ amount_per_transfer_from_this = (amount_per_transfer_from_this == 10 ? 5 : 10) user << "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray." -//Atmos tank +//ATMOS FIRE FIGHTING BACKPACK + +#define EXTINGUISHER 0 +#define NANOFROST 1 +#define METAL_FOAM 2 + /obj/item/weapon/watertank/atmos - name = "backpack water tank" - desc = "A backpack watertank with fire extinguisher nozzle, intended to fight fires. Shouldn't toxins have one of these?" + name = "backpack firefighter tank" + desc = "A refridgerated and pressurized backpack tank with extinguisher nozzle, intended to fight fires. Swaps between extinguisher, nanofrost launcher, and metal foam dispenser for breaches. Nanofrost converts plasma in the air to nitrogen, but only if it is combusting at the time." icon_state = "waterbackpackatmos" item_state = "waterbackpackatmos" - volume = 100 + volume = 200 /obj/item/weapon/watertank/atmos/make_noz() return new /obj/item/weapon/extinguisher/mini/nozzle(src) +/obj/item/weapon/watertank/atmos/dropped(mob/user as mob) + icon_state = "waterbackpackatmos" + if(istype(noz, /obj/item/weapon/extinguisher/mini/nozzle)) + var/obj/item/weapon/extinguisher/mini/nozzle/N = noz + N.nozzle_mode = 0 + /obj/item/weapon/extinguisher/mini/nozzle - name = "fire extinguisher nozzle" - desc = "A fire extinguisher nozzle attached to a water tank." - icon = 'icons/obj/hydroponics.dmi' - icon_state = "misteratmos" - item_state = "misteratmos" + name = "extinguisher nozzle" + desc = "A heavy duty nozzle attached to a firefighter's backpack tank." + icon = 'icons/obj/watertank.dmi' + icon_state = "atmos_nozzle" + item_state = "nozzleatmos" safety = 0 + max_water = 200 + power = 8 + precision = 1 + cooling_power = 5 + w_class = 5 + flags = NODROP //Necessary to ensure that the nozzle and tank never seperate var/obj/item/weapon/watertank/tank + var/nozzle_mode = 0 + var/metal_synthesis_cooldown = 0 + var/nanofrost_cooldown = 0 /obj/item/weapon/extinguisher/mini/nozzle/New(parent_tank) if(check_tank_exists(parent_tank, src)) @@ -170,10 +226,174 @@ loc = tank return +/obj/item/weapon/extinguisher/mini/nozzle/Move() + ..() + if(tank && loc != tank.loc) + loc = tank + return + +/obj/item/weapon/extinguisher/mini/nozzle/attack_self(mob/user as mob) + switch(nozzle_mode) + if(EXTINGUISHER) + nozzle_mode = NANOFROST + tank.icon_state = "waterbackpackatmos_1" + user << "Swapped to nanofrost launcher" + return + if(NANOFROST) + nozzle_mode = METAL_FOAM + tank.icon_state = "waterbackpackatmos_2" + user << "Swapped to metal foam synthesizer" + return + if(METAL_FOAM) + nozzle_mode = EXTINGUISHER + tank.icon_state = "waterbackpackatmos_0" + user << "Swapped to water extinguisher" + return + return + /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) - user << "The nozzle snaps back onto the watertank!" + user << "The nozzle snaps back onto the tank!" tank.on = 0 loc = tank -/obj/item/weapon/extinguisher/mini/nozzle/attack_self() +/obj/item/weapon/extinguisher/mini/nozzle/afterattack(atom/target, mob/user) + if(nozzle_mode == EXTINGUISHER) + ..() + return + var/Adj = user.Adjacent(target) + if(Adj) + AttemptRefill(target, user) + if(nozzle_mode == NANOFROST) + if(Adj) + return //Safety check so you don't blast yourself trying to refill your tank + var/datum/reagents/R = reagents + if(R.total_volume < 100) + user << "You need at least 100 units of water to use the nanofrost launcher!" + return + if(nanofrost_cooldown) + user << "Nanofrost launcher is still recharging" + return + nanofrost_cooldown = 1 + R.remove_any(100) + var/obj/effect/nanofrost_container/A = new /obj/effect/nanofrost_container(get_turf(src)) + log_game("[user.ckey] ([user.name]) used Nanofrost at [get_area(user)] ([user.x], [user.y], [user.z]).") + playsound(src,'sound/items/syringeproj.ogg',40,1) + for(var/a=0, a<5, a++) + step_towards(A, target) + sleep(2) + A.Smoke() + spawn(100) + if(src) + nanofrost_cooldown = 0 + return + if(nozzle_mode == METAL_FOAM) + if(!Adj|| !istype(target, /turf)) + return + if(metal_synthesis_cooldown < 5) + var/obj/effect/effect/foam/F = new /obj/effect/effect/foam(get_turf(target), 1) + F.amount = 0 + metal_synthesis_cooldown++ + spawn(100) + if(src) + metal_synthesis_cooldown-- + else + user << "Metal foam mix is still being synthesized." + return + +/obj/effect/nanofrost_container + name = "nanofrost container" + desc = "A frozen shell of ice containing nanofrost that freezes the surrounding area after activation." + icon = 'icons/effects/effects.dmi' + icon_state = "frozen_smoke_capsule" + mouse_opacity = 0 + pass_flags = PASSTABLE + +/obj/effect/nanofrost_container/proc/Smoke() + new /obj/effect/effect/freezing_smoke(src.loc, 6, 1) + var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc) + F.color = "#B2FFFF" + F.name = "nanofrost residue" + F.desc = "Residue left behind from a nanofrost detonation. Perhaps there was a fire here?" + playsound(src,'sound/effects/bamf.ogg',100,1) + qdel(src) + +/obj/effect/effect/freezing_smoke + name = "nanofrost smoke" + icon_state = "smoke" + opacity = 0 + anchored = 0.0 + mouse_opacity = 0 + icon = 'icons/effects/96x96.dmi' + pixel_x = -32 + pixel_y = -32 + color = "#B2FFFF" + var/amount = 0 + +/obj/effect/effect/freezing_smoke/New(loc, var/amt, var/blast) + ..() + spawn(100+rand(10,30)) + delete() + amount = amt + if(amount) + var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread + F.set_up(amount, 0, src.loc) + F.start() + if(blast) + for(var/turf/T in trange(2, src.loc)) + Chilled(T) return + +/obj/effect/effect/freezing_smoke/proc/Chilled(atom/A) + if(istype(A, /turf/simulated)) + var/turf/simulated/T = A + if(T.air) + var/datum/gas_mixture/G = T.air + if(get_dist(T, src) < 2) // Otherwise we'll get silliness like people using Nanofrost to kill people through walls with cold air + G.temperature = 2 + update_nearby_tiles() + var/hotspot = (locate(/obj/fire) in T) + if(hotspot && !istype(T, /turf/space)) + var/CT = 10 + var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) + lowertemp.temperature = max( min(lowertemp.temperature-(CT*1000),lowertemp.temperature / CT) ,0) + lowertemp.react() + T.assume_air(lowertemp) + qdel(hotspot) + if(G.toxins) + G.nitrogen += (G.toxins) + G.toxins = 0 + for(var/obj/machinery/atmospherics/unary/vent_pump/V in T) + V.welded = 1 + V.update_icon() + V.visible_message("[V] was frozen shut!") + for(var/mob/living/L in T) + L.ExtinguishMob() + return + +/datum/effect/effect/system/freezing_smoke_spread + +/datum/effect/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca) + number = n + if(istype(loca, /turf/)) + location = loca + else + location = get_turf(loca) + +/datum/effect/effect/system/freezing_smoke_spread/start() + var/i = 0 + for(i=0, iYou are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." - src << "To look at other parts of the station, click on yourself to get a camera menu." - src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." - src << "To use something, simply click on it." - src << "Use say :b to speak to your cyborgs through binary." - if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai))) - show_laws() - src << "These laws may be changed by other players, or by you being the traitor." - - job = "AI" + on_mob_init() spawn(5) new /obj/machinery/ai_powersupply(src) @@ -178,6 +187,30 @@ var/list/ai_list = list() ..() return +/mob/living/silicon/ai/proc/on_mob_init() + src << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." + src << "To look at other parts of the station, click on yourself to get a camera menu." + src << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." + src << "To use something, simply click on it." + src << "Use say :b to speak to your cyborgs through binary. Use say :h to speak from an active holopad." + src << "For department channels, use the following say commands:" + + var/radio_text = "" + for(var/i = 1 to common_radio.channels.len) + var/channel = common_radio.channels[i] + var/key = get_radio_key_from_channel(channel) + radio_text += "[key] - [channel]" + if(i != common_radio.channels.len) + radio_text += ", " + + src << radio_text + + if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai))) + show_laws() + src << "These laws may be changed by other players, or by you being the traitor." + + job = "AI" + /mob/living/silicon/ai/proc/SetName(pickedName as text) real_name = pickedName name = pickedName @@ -226,7 +259,7 @@ var/list/ai_list = list() if(powered_ai.anchored) use_power = 2 -/mob/living/silicon/ai/verb/pick_icon() +/mob/living/silicon/ai/proc/pick_icon() set category = "AI Commands" set name = "Set AI Core Display" if(stat || aiRestorePowerRoutine) @@ -290,6 +323,9 @@ var/list/ai_list = list() /mob/living/silicon/ai/proc/ai_alerts() + set name = "Show Alerts" + set category = "AI Commands" + var/dat = "Current Station Alerts\n" dat += "Close

" for (var/cat in alarms) @@ -324,9 +360,14 @@ var/list/ai_list = list() // this verb lets the ai see the stations manifest /mob/living/silicon/ai/proc/ai_roster() + set name = "Show Crew Manifest" + set category = "AI Commands" show_station_manifest() /mob/living/silicon/ai/proc/ai_call_shuttle() + set name = "Call Emergency Shuttle" + set category = "AI Commands" + if(src.stat == 2) src << "You can't call the shuttle because you are dead!" return @@ -906,7 +947,7 @@ var/list/ai_list = list() else lightNearbyCamera() -/mob/living/silicon/ai/proc/control_hud() +/mob/living/silicon/ai/proc/sensor_mode() set name = "Set Sensor Augmentation" set desc = "Augment visual feed with internal sensor overlays." set category = "AI Commands" diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm index 9d30afc6e4d..8e8ceb33c3f 100755 --- a/code/modules/mob/living/silicon/ai/laws.dm +++ b/code/modules/mob/living/silicon/ai/laws.dm @@ -112,7 +112,7 @@ number++ -/mob/living/silicon/ai/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite +/mob/living/silicon/ai/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite set category = "AI Commands" set name = "State Laws" diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 38267256f4b..e0d7859a398 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -156,7 +156,7 @@ number++ -/mob/living/silicon/robot/verb/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite +/mob/living/silicon/robot/proc/checklaws() //Gives you a link-driven interface for deciding what laws the statelaws() proc will share with the crew. --NeoFite set category = "Robot Commands" set name = "State Laws" var/list = "Which laws do you want to include when stating them for the crew?

" diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e9b9c58dd1e..df291cc4738 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1,3 +1,8 @@ +var/list/robot_verbs_default = list( + /mob/living/silicon/robot/proc/sensor_mode, + /mob/living/silicon/robot/proc/checklaws +) + /mob/living/silicon/robot name = "Cyborg" real_name = "Cyborg" @@ -71,8 +76,7 @@ var/braintype = "Cyborg" var/base_icon = "" var/crisis = 0 - var/hiddenborg = 0 - + var/obj/item/borg/sight/hud/sec/sechud = null var/obj/item/borg/sight/hud/med/healthhud = null @@ -82,34 +86,21 @@ spark_system.attach(src) add_language("Robot Talk", 1) + + wires = new(src) robot_modules_background = new() robot_modules_background.icon_state = "block" robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. - - wires = new(src) - ident = rand(1, 999) updatename("Default") updateicon() - if(mmi == null) - mmi = new /obj/item/device/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works) - mmi.icon_state="posibrain-occupied" - if(syndie) - if(!cell) - cell = new /obj/item/weapon/stock_parts/cell(src) - laws = new /datum/ai_laws/antimov() - lawupdate = 0 - scrambledcodes = 1 - cell.maxcharge = 25000 - cell.charge = 25000 - module = new /obj/item/weapon/robot_module/syndicate(src) - hands.icon_state = "standard" - icon_state = "secborg" - modtype = "Security" - init(alien) radio = new /obj/item/device/radio/borg(src) + common_radio = radio + + init() + if(!scrambledcodes && !camera) camera = new /obj/machinery/camera(src) camera.c_tag = real_name @@ -117,6 +108,10 @@ if(wires.IsCameraCut()) // 5 = BORG CAMERA camera.status = 0 + if(mmi == null) + mmi = new /obj/item/device/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works) + mmi.icon_state="posibrain-occupied" + initialize_components() //if(!unfinished) // Create all the robot parts. @@ -131,6 +126,8 @@ cell.charge = 7500 ..() + + add_robot_verbs() if(cell) var/datum/robot_component/cell_component = components["power cell"] @@ -148,17 +145,9 @@ hud_list[NATIONS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") /mob/living/silicon/robot/proc/init(var/alien=0) - if(hiddenborg) - playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) - return aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) - if(mmi.alien || alien) - laws = new /datum/ai_laws/alienmov() - connected_ai = select_active_alien_ai() - scrambledcodes = 1 - else - make_laws() - connected_ai = select_active_ai_with_fewest_borgs() + make_laws() + connected_ai = select_active_ai_with_fewest_borgs() if(connected_ai) connected_ai.connected_robots += src lawsync() @@ -174,7 +163,7 @@ if (!rbPDA) rbPDA = new/obj/item/device/pda/ai(src) rbPDA.set_name_and_job(custom_name,braintype) - if(hiddenborg) + if(scrambledcodes) rbPDA.hidden = 1 /mob/living/silicon/robot/binarycheck() @@ -451,11 +440,17 @@ C.toggled = 1 src << "\red You enable [C.name]." -/mob/living/silicon/robot/verb/control_hud() +/mob/living/silicon/robot/proc/sensor_mode() set name = "Set Sensor Augmentation" set desc = "Augment visual feed with internal sensor overlays." set category = "Robot Commands" toggle_sensor_mode() + +/mob/living/silicon/robot/proc/add_robot_verbs() + src.verbs |= robot_verbs_default + +/mob/living/silicon/robot/proc/remove_robot_verbs() + src.verbs -= robot_verbs_default /mob/living/silicon/robot/blob_act() if (stat != 2) @@ -1395,21 +1390,29 @@ icon_state = "nano_bloodhound" lawupdate = 0 scrambledcodes = 1 - hiddenborg = 1 modtype = "Commando" faction = list("nanotrasen") designation = "NT Combat Cyborg" req_access = list(access_cent_specops) - + /mob/living/silicon/robot/deathsquad/New(loc) - ..() - cell.maxcharge = 50000 - cell.charge = 50000 - radio = new /obj/item/device/radio/borg/deathsquad(src) - module = new /obj/item/weapon/robot_module/deathsquad(src) - laws = new /datum/ai_laws/deathsquad() + if(!cell) + cell = new /obj/item/weapon/stock_parts/cell(src) + cell.maxcharge = 25000 + cell.charge = 25000 - Namepick() + ..() + +/mob/living/silicon/robot/syndicate/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + laws = new /datum/ai_laws/deathsquad + module = new /obj/item/weapon/robot_module/deathsquad(src) + + radio = new /obj/item/device/radio/borg/deathsquad(src) + radio.recalculateChannels() + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) /mob/living/silicon/robot/deathsquad/attack_hand(mob/user) if((ckey == null) && searching_for_ckey == 0) @@ -1453,12 +1456,10 @@ get_borg_occupant(user, possiblecandidates) return - /mob/living/silicon/robot/syndicate icon_state = "syndie_bloodhound" lawupdate = 0 scrambledcodes = 1 - hiddenborg = 1 modtype = "Synd" faction = list("syndicate") designation = "Syndicate" @@ -1466,14 +1467,23 @@ req_access = list(access_syndicate) /mob/living/silicon/robot/syndicate/New(loc) - ..() - cell.maxcharge = 25000 - cell.charge = 25000 - radio = new /obj/item/device/radio/borg/syndicate(src) - module = new /obj/item/weapon/robot_module/syndicate(src) - laws = new /datum/ai_laws/syndicate_override() + if(!cell) + cell = new /obj/item/weapon/stock_parts/cell(src) + cell.maxcharge = 25000 + cell.charge = 25000 - Namepick() + ..() + +/mob/living/silicon/robot/syndicate/init() + aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) + + laws = new /datum/ai_laws/syndicate_override + module = new /obj/item/weapon/robot_module/syndicate(src) + + radio = new /obj/item/device/radio/borg/syndicate(src) + radio.recalculateChannels() + + playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0) /mob/living/silicon/robot/syndicate/canUseTopic(atom/movable/M) if(stat || lockcharge || stunned || weakened) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 9b46dbba82f..1c8e7b71d65 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -22,6 +22,7 @@ #define SEC_HUD 1 //Security HUD mode #define MED_HUD 2 //Medical HUD mode var/local_transmit //If set, can only speak to others of the same type within a short range. + var/obj/item/device/radio/common_radio /mob/living/silicon/proc/cancelAlarm() return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7082e7fa656..703b54cc7b4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -960,6 +960,8 @@ var/list/slot_equipment_priority = list( \ for(var/atom/A in listed_turf) if(A.invisibility > see_invisible) continue + if(is_type_in_list(A, shouldnt_see)) + continue statpanel(listed_turf.name, null, A) if(mind && mind.changeling) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index b91583758af..9f259326a08 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -220,6 +220,7 @@ var/immune_to_ssd = 0 var/turf/listed_turf = null //the current turf being examined in the stat panel + var/list/shouldnt_see = list() //list of objects that this mob shouldn't see in the stat panel. this silliness is needed because of AI alt+click and cult blood runes var/kills=0 diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index ce0591f6bd9..c90ebae7328 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -80,7 +80,7 @@ invisibility = 101 return ..() -/mob/proc/AIize(move=1) +/mob/proc/AIize() if(client) src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jams for AIs var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect. @@ -93,52 +93,40 @@ else O.key = key - if(move) - var/obj/loc_landmark + var/obj/loc_landmark + for(var/obj/effect/landmark/start/sloc in landmarks_list) + if (sloc.name != "AI") + continue + if (locate(/mob/living) in sloc.loc) + continue + loc_landmark = sloc + if (!loc_landmark) + for(var/obj/effect/landmark/tripai in landmarks_list) + if (tripai.name == "tripai") + if(locate(/mob/living) in tripai.loc) + continue + loc_landmark = tripai + if (!loc_landmark) + O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name != "AI") - continue - if ((locate(/mob/living) in sloc.loc) || (locate(/obj/structure/AIcore) in sloc.loc)) - continue - loc_landmark = sloc - if (!loc_landmark) - for(var/obj/effect/landmark/tripai in landmarks_list) - if (tripai.name == "tripai") - if((locate(/mob/living) in tripai.loc) || (locate(/obj/structure/AIcore) in tripai.loc)) - continue - loc_landmark = tripai - if (!loc_landmark) - O << "Oh god sorry we can't find an unoccupied AI spawn location, so we're spawning you on top of someone." - for(var/obj/effect/landmark/start/sloc in landmarks_list) - if (sloc.name == "AI") - loc_landmark = sloc + if (sloc.name == "AI") + loc_landmark = sloc - O.loc = loc_landmark.loc - for (var/obj/item/device/radio/intercom/comm in O.loc) - comm.ai += O + O.loc = loc_landmark.loc + for (var/obj/item/device/radio/intercom/comm in O.loc) + comm.ai += O - O << "You are playing the station's AI. The AI cannot move, but can interact with many objects while viewing them (through cameras)." - O << "To look at other parts of the station, click on yourself to get a camera menu." - O << "While observing through a camera, you can use most (networked) devices which you can see, such as computers, APCs, intercoms, doors, etc." - O << "To use something, simply click on it." - O << {"Use say ":b to speak to your cyborgs through binary."} - if (!(ticker && ticker.mode && (O.mind in ticker.mode.malf_ai))) - O.show_laws() - O << "These laws may be changed by other players, or by you being the traitor." + O.on_mob_init() - O.verbs += /mob/living/silicon/ai/proc/show_laws_verb - O.verbs += /mob/living/silicon/ai/proc/ai_statuschange - - O.job = "AI" + O.add_ai_verbs() O.rename_self("ai",1) - spawn(0) - del(src) - return O - + . = O + qdel(src) + /mob/living/carbon/human/make_into_mask(var/should_gib = 0) for(var/t in organs) - del(t) + qdel(t) return ..(should_gib) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 2663bc9e485..5e44e68bfac 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -210,6 +210,7 @@ datum description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." reagent_state = LIQUID color = "#0064C8" // rgb: 0, 100, 200 + var/cooling_temperature = 2 reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) if(!istype(M, /mob/living)) @@ -224,6 +225,7 @@ datum reaction_turf(var/turf/simulated/T, var/volume) if (!istype(T)) return + var/CT = cooling_temperature src = null if(volume >= 3) if(T.wet >= 1) return @@ -248,10 +250,10 @@ datum var/hotspot = (locate(/obj/fire) in T) if(hotspot && !istype(T, /turf/space)) var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() ) - lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) + lowertemp.temperature = max( min(lowertemp.temperature-(CT*1000),lowertemp.temperature / CT) ,0) lowertemp.react() T.assume_air(lowertemp) - del(hotspot) + qdel(hotspot) return reaction_obj(var/obj/O, var/volume) diff --git a/icons/obj/watertank.dmi b/icons/obj/watertank.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fb9778719e41534390e97cc38508ea7ae9f41218 GIT binary patch literal 5260 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 SOnl-10000 Date: Wed, 25 Feb 2015 19:56:24 +0100 Subject: [PATCH 02/11] Extinguisher wheelchair update, deathsquad robot fix --- .../objects/items/weapons/extinguisher.dm | 22 +++++++++++++++++-- .../modules/mob/living/silicon/robot/robot.dm | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index b242397b251..475e816a897 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -34,6 +34,16 @@ m_amt = 0 max_water = 30 sprite_name = "miniFE" + +/obj/item/weapon/extinguisher/examine() + set src in usr + + usr << "\icon[src] [src.name] contains:" + if(reagents && reagents.reagent_list.len) + for(var/datum/reagent/R in reagents.reagent_list) + usr << "\blue [R.volume] units of [R.name]" + ..() + return /obj/item/weapon/extinguisher/New() create_reagents(max_water) @@ -91,19 +101,27 @@ if(usr.buckled && isobj(usr.buckled) && !usr.buckled.anchored ) spawn(0) + var/obj/structure/stool/bed/chair/C = null + if(istype(usr.buckled, /obj/structure/stool/bed/chair)) + C = usr.buckled var/obj/B = usr.buckled var/movementdirection = turn(direction,180) + if(C) C.propelled = 4 B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 3 + sleep(1) + B.Move(get_step(usr,movementdirection), movementdirection) sleep(1) B.Move(get_step(usr,movementdirection), movementdirection) - sleep(1) - B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 2 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 1 sleep(2) B.Move(get_step(usr,movementdirection), movementdirection) + if(C) C.propelled = 0 sleep(3) B.Move(get_step(usr,movementdirection), movementdirection) sleep(3) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index df291cc4738..3775adfba20 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1403,7 +1403,7 @@ var/list/robot_verbs_default = list( ..() -/mob/living/silicon/robot/syndicate/init() +/mob/living/silicon/robot/deathsquad/init() aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src) laws = new /datum/ai_laws/deathsquad From 6efa3bcdaa1be208dd1ab3c90d7f3b83b1b3d107 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 20:42:43 +0100 Subject: [PATCH 03/11] Fix trays (now bags) --- code/datums/cargoprofile.dm | 4 +- code/game/machinery/vending.dm | 2 +- code/game/objects/items/weapons/kitchen.dm | 234 +----------------- .../objects/items/weapons/storage/bags.dm | 104 ++++++++ .../objects/items/weapons/storage/storage.dm | 13 - .../mob/living/silicon/robot/robot_items.dm | 90 +------ .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../reagent_containers/food/snacks.dm | 2 +- 8 files changed, 112 insertions(+), 341 deletions(-) diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm index c2a5ed8bea1..36d4748cfc8 100644 --- a/code/datums/cargoprofile.dm +++ b/code/datums/cargoprofile.dm @@ -103,7 +103,7 @@ id = "boxes" blacklist = null whitelist = list(/obj/item/weapon/storage, /obj/item/weapon/moneybag, /obj/item/weapon/evidencebag, - /obj/item/weapon/tray, /obj/item/pizzabox, /obj/item/weapon/clipboard, + /obj/item/weapon/storage/bag/tray, /obj/item/pizzabox, /obj/item/weapon/clipboard, /obj/item/smallDelivery, /obj/structure/bigDelivery) /datum/cargoprofile/cargo @@ -270,7 +270,7 @@ /obj/item/weapon/hand_labeler,/obj/item/weapon/hemostat,/obj/item/weapon/mop,/obj/item/weapon/locator,/obj/item/weapon/minihoe, /obj/item/stack/packageWrap,/obj/item/weapon/pen,/obj/item/weapon/pickaxe,/obj/item/weapon/pinpointer, /obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/retractor,/obj/item/weapon/rsf,/obj/item/weapon/rsp,/obj/item/weapon/scalpel, - /obj/item/weapon/screwdriver,/obj/item/weapon/shovel,/obj/item/weapon/soap,/obj/item/weapon/stamp,/obj/item/weapon/tray,/obj/item/weapon/weldingtool, + /obj/item/weapon/screwdriver,/obj/item/weapon/shovel,/obj/item/weapon/soap,/obj/item/weapon/stamp,/obj/item/weapon/storage/bag/tray,/obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters,/obj/item/weapon/wrench,/obj/item/weapon/extinguisher) /datum/cargoprofile/finished diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a74d7ad5bde..1885645ca37 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1053,7 +1053,7 @@ desc = "A kitchen and restaurant equipment vendor" product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..." icon_state = "dinnerware" - products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5) + products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5) contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2) /obj/machinery/vending/sovietsoda diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 2ed20f0e535..7661322945b 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -7,7 +7,6 @@ * Kitchen knives * Butcher's cleaver * Rolling Pins - * Trays */ /obj/item/weapon/kitchen @@ -253,235 +252,4 @@ H.eye_blurry += 3 return ..() -/* - * Trays - Agouri - */ -/obj/item/weapon/tray - name = "tray" - icon = 'icons/obj/food.dmi' - icon_state = "tray" - desc = "A metal tray to lay food on." - throwforce = 5.0 - throwforce = 10.0 - throw_speed = 3 - throw_range = 5 - w_class = 4.0 - flags = CONDUCT - m_amt = 3000 - /* // NOPE - var/food_total= 0 - var/burger_amt = 0 - var/cheese_amt = 0 - var/fries_amt = 0 - var/classyalcdrink_amt = 0 - var/alcdrink_amt = 0 - var/bottle_amt = 0 - var/soda_amt = 0 - var/carton_amt = 0 - var/pie_amt = 0 - var/meatbreadslice_amt = 0 - var/salad_amt = 0 - var/miscfood_amt = 0 - */ - var/list/carrying = list() // List of things on the tray. - Doohl - var/max_carry = 10 // w_class = 1 -- takes up 1 - // w_class = 2 -- takes up 3 - // w_class = 3 -- takes up 5 - -/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - - // Drop all the things. All of them. - overlays.Cut() - for(var/obj/item/I in carrying) - I.loc = M.loc - carrying.Remove(I) - if(isturf(I.loc)) - spawn() - for(var/i = 1, i <= rand(1,2), i++) - if(I) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) - - - if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown? - M << "\red You accidentally slam yourself with the [src]!" - M.Weaken(1) - user.take_organ_damage(2) - if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) - return - else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' - return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3 - - var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later. - - - if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes - if(prob(33)) - src.add_blood(H) - var/turf/location = H.loc - if (istype(location, /turf/simulated)) - location.add_blood(H) ///Plik plik, the sound of blood - - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") - - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - if(prob(15)) - M.Weaken(3) - M.take_organ_damage(3) - else - M.take_organ_damage(5) - if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) - return - else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) - return - - - - - if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))) - M << "\red You get slammed in the face with the tray, against your mask!" - if(prob(33)) - src.add_blood(H) - if (H.wear_mask) - H.wear_mask.add_blood(H) - if (H.head) - H.head.add_blood(H) - if (H.glasses && prob(33)) - H.glasses.add_blood(H) - var/turf/location = H.loc - if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v - location.add_blood(H) - - if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) - else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] with the tray!", user, M), 1) - if(prob(10)) - M.Stun(rand(1,3)) - M.take_organ_damage(3) - return - else - M.take_organ_damage(5) - return - - else //No eye or head protection, tough luck! - M << "\red You get slammed in the face with the tray!" - if(prob(33)) - src.add_blood(M) - var/turf/location = H.loc - if (istype(location, /turf/simulated)) - location.add_blood(H) - - if(prob(50)) - playsound(M, 'sound/items/trayhit1.ogg', 50, 1) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) - else - playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1) - if(prob(30)) - M.Stun(rand(2,4)) - M.take_organ_damage(4) - return - else - M.take_organ_damage(8) - if(prob(30)) - M.Weaken(2) - return - return - -/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time - -/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/weapon/kitchen/rollingpin)) - if(cooldown < world.time - 25) - user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) - cooldown = world.time - else - ..() - -/* -===============~~~~~================================~~~~~==================== -= = -= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ = -= = -===============~~~~~================================~~~~~==================== -*/ -/obj/item/weapon/tray/proc/calc_carry() - // calculate the weight of the items on the tray - var/val = 0 // value to return - - for(var/obj/item/I in carrying) - if(I.w_class == 1.0) - val ++ - else if(I.w_class == 2.0) - val += 3 - else - val += 5 - - return val - -/obj/item/weapon/tray/pickup(mob/user) - - if(!isturf(loc)) - return - - for(var/obj/item/I in loc) - if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) ) - var/add = 0 - if(I.w_class == 1.0) - add = 1 - else if(I.w_class == 2.0) - add = 3 - else - add = 5 - if(calc_carry() + add >= max_carry) - break - - I.loc = src - carrying.Add(I) - overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer) - -/obj/item/weapon/tray/dropped(mob/user) - - var/mob/living/M - for(M in src.loc) //to handle hand switching - return - - var/foundtable = 0 - for(var/obj/structure/table/T in loc) - foundtable = 1 - break - - overlays.Cut() - - for(var/obj/item/I in carrying) - I.loc = loc - carrying.Remove(I) - if(!foundtable && isturf(loc)) - // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere! - spawn() - for(var/i = 1, i <= rand(1,2), i++) - if(I) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) +/* Trays moved to /obj/item/weapon/storage/bag */ \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index c78906a6639..ff1b025a2ee 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -10,6 +10,7 @@ * Plant Bag * Sheet Snatcher * Book Bag + * Tray * * -Sayu */ @@ -37,6 +38,11 @@ storage_slots = 30 can_hold = list() // any cant_hold = list("/obj/item/weapon/disk/nuclear","/obj/item/flag/nation") + +/obj/item/weapon/storage/bag/trash/suicide_act(mob/user) + user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!") + playsound(loc, 'sound/items/eatfood.ogg', 50, 1, -1) + return (TOXLOSS) /obj/item/weapon/storage/bag/trash/update_icon() if(contents.len == 0) @@ -47,10 +53,15 @@ icon_state = "trashbag2" else icon_state = "trashbag3" +/obj/item/weapon/storage/bag/trash/cyborg + /obj/item/weapon/storage/bag/trash/proc/janicart_insert(mob/user, obj/structure/janitorialcart/J) J.put_in_cart(src, user) J.mybag=src J.update_icon() + +/obj/item/weapon/storage/bag/trash/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J) + return // ----------------------------- @@ -323,3 +334,96 @@ max_w_class = 3 w_class = 4 //Bigger than a book because physics can_hold = list(/obj/item/weapon/book, /obj/item/weapon/spellbook) //No bibles, consistent with bookcase + +/* + * Trays - Agouri + */ +/obj/item/weapon/storage/bag/tray + name = "tray" + icon = 'icons/obj/food.dmi' + icon_state = "tray" + desc = "A metal tray to lay food on." + force = 5 + throwforce = 10.0 + throw_speed = 3 + throw_range = 5 + w_class = 4.0 + flags = CONDUCT + m_amt = 3000 + +/obj/item/weapon/storage/bag/tray/attack(mob/living/M as mob, mob/living/user as mob) + ..() + // Drop all the things. All of them. + var/list/obj/item/oldContents = contents.Copy() + quick_empty() + + // Make each item scatter a bit + for(var/obj/item/I in oldContents) + spawn() + for(var/i = 1, i <= rand(1,2), i++) + if(I) + step(I, pick(NORTH,SOUTH,EAST,WEST)) + sleep(rand(2,4)) + + if(prob(50)) + playsound(M, 'sound/items/trayhit1.ogg', 50, 1) + else + playsound(M, 'sound/items/trayhit2.ogg', 50, 1) + + if(ishuman(M) || ismonkey(M)) + if(prob(10)) + M.Weaken(2) + +/obj/item/weapon/storage/bag/tray/proc/rebuild_overlays() + overlays.Cut() + for(var/obj/item/I in contents) + overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1) + +/obj/item/weapon/storage/bag/tray/remove_from_storage(obj/item/W as obj, atom/new_location) + ..() + rebuild_overlays() + +/obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) + overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1) + ..() + +/obj/item/weapon/storage/bag/tray/cyborg + +/obj/item/weapon/storage/bag/tray/cyborg/afterattack(atom/target, mob/user as mob) + if ( isturf(target) || istype(target,/obj/structure/table) ) + var foundtable = istype(target,/obj/structure/table/) + if ( !foundtable ) //it must be a turf! + for(var/obj/structure/table/T in target) + foundtable = 1 + break + + var turf/dropspot + if ( !foundtable ) // don't unload things onto walls or other silly places. + dropspot = user.loc + else if ( isturf(target) ) // they clicked on a turf with a table in it + dropspot = target + else // they clicked on a table + dropspot = target.loc + + overlays = null + + var droppedSomething = 0 + + for(var/obj/item/I in contents) + I.loc = dropspot + contents.Remove(I) + droppedSomething = 1 + if(!foundtable && isturf(dropspot)) + // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere! + spawn() + for(var/i = 1, i <= rand(1,2), i++) + if(I) + step(I, pick(NORTH,SOUTH,EAST,WEST)) + sleep(rand(2,4)) + if ( droppedSomething ) + if ( foundtable ) + user.visible_message("\blue [user] unloads their service tray.") + else + user.visible_message("\blue [user] drops all the items on their tray.") + + return ..() diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index bbe4a083468..899b16cf2ef 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -336,19 +336,6 @@ if(!can_be_inserted(W)) return 0 - if(istype(W, /obj/item/weapon/tray)) - var/obj/item/weapon/tray/T = W - if(T.calc_carry() > 0) - if(prob(85)) - user << "\red The tray won't fit in [src]." - return 1 - else - W.loc = user.loc - if ((user.client && user.s_active != src)) - user.client.screen -= W - W.dropped(user) - user << "\red God damnit!" - handle_item_insertion(W) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 931cb0556be..dbfcf15caa8 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -1,92 +1,4 @@ -// A special tray for the service droid. Allow droid to pick up and drop items as if they were using the tray normally -// Click on table to unload, click on item to load. Otherwise works identically to a tray. -// Unlike the base item "tray", robotrays ONLY pick up food, drinks and condiments. - -/obj/item/weapon/tray/robotray - name = "RoboTray" - desc = "An autoloading tray specialized for carrying refreshments." - -/obj/item/weapon/tray/robotray/afterattack(atom/target, mob/user as mob) - if ( !target ) - return - // pick up items, mostly copied from base tray pickup proc - // see code\game\objects\items\weapons\kitchen.dm line 241 - if ( istype(target,/obj/item)) - if ( !isturf(target.loc) ) // Don't load up stuff if it's inside a container or mob! - return - var turf/pickup = target.loc - - var addedSomething = 0 - - for(var/obj/item/weapon/reagent_containers/food/I in pickup) - - - if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) ) - var/add = 0 - if(I.w_class == 1.0) - add = 1 - else if(I.w_class == 2.0) - add = 3 - else - add = 5 - if(calc_carry() + add >= max_carry) - break - - I.loc = src - carrying.Add(I) - overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer) - addedSomething = 1 - if ( addedSomething ) - user.visible_message("\blue [user] load some items onto their service tray.") - - return - - // Unloads the tray, copied from base item's proc dropped() and altered - // see code\game\objects\items\weapons\kitchen.dm line 263 - - if ( isturf(target) || istype(target,/obj/structure/table) ) - var foundtable = istype(target,/obj/structure/table/) - if ( !foundtable ) //it must be a turf! - for(var/obj/structure/table/T in target) - foundtable = 1 - break - - var turf/dropspot - if ( !foundtable ) // don't unload things onto walls or other silly places. - dropspot = user.loc - else if ( isturf(target) ) // they clicked on a turf with a table in it - dropspot = target - else // they clicked on a table - dropspot = target.loc - - - overlays = null - - var droppedSomething = 0 - - for(var/obj/item/I in carrying) - I.loc = dropspot - carrying.Remove(I) - droppedSomething = 1 - if(!foundtable && isturf(dropspot)) - // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere! - spawn() - for(var/i = 1, i <= rand(1,2), i++) - if(I) - step(I, pick(NORTH,SOUTH,EAST,WEST)) - sleep(rand(2,4)) - if ( droppedSomething ) - if ( foundtable ) - user.visible_message("\blue [user] unloads their service tray.") - else - user.visible_message("\blue [user] drops all the items on their tray.") - - return ..() - - - - -// A special pen for service droids. Can be toggled to switch between normal writting mode, and paper rename mode +// A special pen for service droids. Can be toggled to switch between normal writing mode, and paper rename mode // Allows service droids to rename paper items. /obj/item/weapon/pen/robopen diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 223f09daaa0..3666e7f8a71 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -217,7 +217,7 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash/cyborg(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) - src.modules += new /obj/item/weapon/storage/bag/trash(src) + src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src) src.modules += new /obj/item/weapon/mop(src) src.modules += new /obj/item/device/lightreplacer(src) src.modules += new /obj/item/weapon/holosign_creator(src) @@ -248,7 +248,7 @@ src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) src.modules += new /obj/item/weapon/lighter/zippo(src) - src.modules += new /obj/item/weapon/tray/robotray(src) + src.modules += new /obj/item/weapon/storage/bag/tray/cyborg(src) src.modules += new /obj/item/weapon/reagent_containers/food/drinks/shaker(src) src.emag = new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index ce7af28cad7..6405b6ec3b6 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -207,7 +207,7 @@ !isturf(src.loc) || \ !(locate(/obj/structure/table) in src.loc) && \ !(locate(/obj/machinery/optable) in src.loc) && \ - !(locate(/obj/item/weapon/tray) in src.loc) \ + !(locate(/obj/item/weapon/storage/bag/tray) in src.loc) \ ) user << "\red You cannot slice [src] here! You need a table or at least a tray to do it." return 1 From 91878efbdca7c7cd64a6e6a715beadcb1e0ebe24 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 20:47:03 +0100 Subject: [PATCH 04/11] Fix position of robotic talk follow --- code/modules/mob/language.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 172d52ac98c..177d189cb2c 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -412,7 +412,7 @@ for (var/mob/M in dead_mob_list) if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) - var/message_start_dead = "[name] (follow), [speaker.name]" + var/message_start_dead = "[name], [speaker.name] (follow)" M.show_message("[message_start_dead] [message_body]", 2) for (var/mob/living/S in living_mob_list) From fe5dabaff30d07f70f2f49b02e5cac78443519f4 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 20:52:52 +0100 Subject: [PATCH 05/11] Fix DME --- paradise.dme | 2 ++ 1 file changed, 2 insertions(+) diff --git a/paradise.dme b/paradise.dme index a60078bd76c..40cb30de985 100644 --- a/paradise.dme +++ b/paradise.dme @@ -181,6 +181,7 @@ #include "code\controllers\Processes\disease.dm" #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" +#include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" #include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\machinery.dm" @@ -1300,6 +1301,7 @@ #include "code\modules\mob\living\carbon\monkey\login.dm" #include "code\modules\mob\living\carbon\monkey\monkey.dm" #include "code\modules\mob\living\carbon\monkey\powers.dm" +#include "code\modules\mob\living\carbon\monkey\say.dm" #include "code\modules\mob\living\carbon\monkey\update_icons.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\login.dm" From 8e159c51b31c925c367bd3e1e6a56342d3513e4b Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 21:33:34 +0100 Subject: [PATCH 06/11] Ensure extinguisher precision works --- code/game/objects/items/weapons/extinguisher.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 475e816a897..4b009aef988 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -132,13 +132,18 @@ var/turf/T = get_turf(target) var/turf/T1 = get_step(T,turn(direction, 90)) var/turf/T2 = get_step(T,turn(direction, -90)) - var/list/the_targets = list(T,T1,T2) + if(precision) + var/turf/T3 = get_step(T1, turn(direction, 90)) + var/turf/T4 = get_step(T2,turn(direction, -90)) + the_targets = list(T,T1,T2,T3,T4) for(var/a=0, a<5, a++) spawn(0) var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) var/turf/my_target = pick(the_targets) + if(precision) + the_targets -= my_target var/datum/reagents/R = new/datum/reagents(5) if(!W) return W.reagents = R From 5d529c8086ad95752beba8cb3e6006eea5d7057a Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 22:07:23 +0100 Subject: [PATCH 07/11] Plant-B-Gone now affects Diona nymphs. Dionas now heal toxin/fire damage. --- code/modules/mob/living/carbon/human/life.dm | 10 ++++++---- code/modules/reagents/Chemistry-Reagents.dm | 7 +++++++ icons/mob/human_races/r_diona.dmi | Bin 2650 -> 2836 bytes 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c25fa8e0e25..6fa2497139d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -914,10 +914,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc traumatic_shock -= light_amount if(species.flags & IS_PLANT) - if(nutrition > 500) - nutrition = 500 - if(light_amount >= 5) //if there's enough light, heal - adjustBruteLoss(-(light_amount)) + if(nutrition > 450) + nutrition = 450 + if(light_amount >= 3) //if there's enough light, heal + adjustBruteLoss(-(light_amount/2)) + adjustFireLoss(-(light_amount/2)) + adjustToxLoss(-(light_amount)) adjustOxyLoss(-(light_amount)) //TODO: heal wounds, heal broken limbs. diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 9af338ba608..11d79cf5fa8 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1435,6 +1435,13 @@ datum H.adjustToxLoss(50) ..() return + if(ismonkey(M)) + var/mob/living/carbon/monkey/MO = M + if(MO.dna) + if(MO.dna.mutantrace == "plant") //plantmen monkeys (diona) take EVEN MORE damage + MO.adjustToxLoss(100) + ..() + return plasma name = "Plasma" diff --git a/icons/mob/human_races/r_diona.dmi b/icons/mob/human_races/r_diona.dmi index c09acaa953844bf97d494e0d1005a9477ab9c8a8..f83948951ea2a9d7076e606c76fd4751fdbc7378 100644 GIT binary patch delta 2770 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 delta 2583 zcmV+y3h4Ee7TOe$77GC22m=5B0NbBPVv!+Cf3kX1Sad{Xb7OL8aCB*JZU6vyoQ={u z3d1lA2H@E~g-Q0(*V?5dlnl)kjKNRpL?F8@y?vcz=v1stf=|Cds1?`#HjJXX5By~? z1(?M}oOgT9-a%(yn$wXpZ-VoAYf@I(l(IpoaB4Wy0n;+XnMF03r9S*rBq@|$&6*HK ze_{?H%!HlMIKoPbLTLdqA&kT_U;n#n0*=vQ(6iLyD2~^B!*4}U<_F)43=F+2P+_c9R-kk zhiHRTqyh|TINQ*%LN!9zhytAxLlgz)n*DRa9xd z6^#et7=VO3Eszmu8F&;BSphrk1E`|HB0~bMEB3cgmMirHS25=&fQ5d6CV-uK7q!#% zYgUmZteL=3>MxXY-ldenP6(8Nf4d&aNoXfr-NU5RKts28H)R6L%HmGbD{r)=J=K~i z&>-$LP?s~zUOD4llj-;KvITb>$8j9TaU92S9LI4S$8lbd!#z|+m!DTy{txh?TP6Pp zV2y2V;otJj@{a&k*iJz(9Y4^KQCOtulHX@P>_`;9+E3#e1wb_21UeiMe`NXX0(AK& z^f*Fnv(IBNlS12o{H**g|AY?t8}0KLt#Uxylk6$^{DU6PKq)fSgkiOnY+zC@E*{ z{{ARDfB(7058(PM{sB-TYe2cbKL!9)gG<()PJHniH9v$JKOkL_<{tnlAU&4u?~ej? z;0)=i^#E$S2#LC|)JMWSegHjJ`~x6G4i7Wm-yd?Nfshf4Za*dke*_xnii^d&eIAz% zKJU<@`Tl+or^zaReX$<}H04{r=C%DF{p@aFi%ah7x0=3!F=c z0PP(TZPbl@WNMA#Q8yqAZxh?zh?pz|&^~0tD)15@4!n{64&439aU92S9LI4S$8j9T zahz`i!#{AayoKr?&`7gWp!)N$O!U=1p!IvhKy3R5i~$zIf4a*40WAe^7g2polI|Zc z45;<;$o>Jj8OfoVr{xxAAE|J9K%53q4*>!hJ3b^-6(A1-R)FooaX!%q0>d4+t$>nL zF9*sXu?_zi1J_QO>Kz~g4dC_^Z`kWKjFfAc>70Lzs**39j~bwp#LNm_M6O0jDM=<*E*o<9EoO96Ok#SyaPe`b@^ z-Ck-q+D%;l^z2RulIi^Lj^ZB>t7`0@(*oDl0OUzu>5u$K5Af{Rp@Dg$vMfhvdQQ*` ze!0qD3hd^%ZEnQ+wb>2+RPgHM=+(qPr*?MIt*T0&KTKlXVN}f!*aLdoL znB2f6UsA#l)!Xe6fp4bkp{w~~E8lR35tjkve~Axic=I|S_i&ot3mcY{5ikY5y3VIw zD1P4{@}X(H`7F+{rvtnNh#_(O00JJ9;pSd z+ARO_@eBA=bBaG|_=+$>InR#B;pk-A04H=>&U0R`$;yT@b~{9f(%*fQUTYJk^$Z01DNmo`R>avVpa zF}sXB`BXslvt`0$1iPv~i(u_x=wbXwIv_y%q-azCYYlWy!@?_!;VZ|-EtI5;x&}jr z9E_b5Cde@uZ_AfbtEe1z@an_rDVISHgsPivF}%s?(J$VlXg{BW$${#uOl=Qif4i&m zn{fW6mk;Zyss4M2HJY9}!b3GYJ%3^2c>6pC_0W5&=iV?MmniZfAT*-M(MDbK20!0E z&j*4DRSiY9`|&u?Ysm8TE)c4HT=n-p-9G;=U&+17pBkO4N51mY^X>B=@|6;HeJ`~w z-}vd-_W2L_Y8iX5Lj`q?f3e?}&*e7#{?G2gznhapLpl4rZXCmJZk|8&U+wuHeqGj{ zSDN}68S0(4iB({w**43Mt$?mM%-P1!`t2*+#wxtL2DVmUXa(2|y@G!Wdo1B2cYyA) tJzt5DtH0(vr?J_4Rc`wfeqAPi0qgiX&KfGLh5!Hn07*qoM6N<$0fO-P4o?68 From d118e026fab0d7d1132276c3f94fc9bdd772dbb9 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 22:14:14 +0100 Subject: [PATCH 08/11] Re-apply kitchen code --- code/game/objects/items/weapons/kitchen.dm | 42 ++-------------------- 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 7661322945b..b4288c7033c 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -177,7 +177,7 @@ desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." flags = CONDUCT force = 15.0 - w_class = 2.0 + w_class = 3.0 throwforce = 8.0 throw_speed = 3 throw_range = 6 @@ -212,44 +212,6 @@ throw_speed = 3 throw_range = 7 w_class = 3.0 - attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway. - -/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red The [src] slips out of your hand and hits your head." - user.take_organ_damage(10) - user.Paralyse(2) - return - - M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)") - - if(!iscarbon(user)) - M.LAssailant = null - else - M.LAssailant = user - - var/t = user:zone_sel.selecting - if (t == "head") - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if (H.stat < 2 && H.health < 50 && prob(90)) - // ******* Check - if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80)) - H << "\red The helmet protects you from being hit hard in the head!" - return - var/time = rand(2, 6) - if (prob(75)) - H.Paralyse(time) - else - H.Stun(time) - if(H.stat != 2) H.stat = 1 - user.visible_message("\red [H] has been knocked unconscious!", "\red You knock [H] unconscious!") - return - else - H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!") - H.eye_blurry += 3 - return ..() + attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") /* Trays moved to /obj/item/weapon/storage/bag */ \ No newline at end of file From d9f083c39c366f28982f13e73da75dd828da154d Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 22:25:22 +0100 Subject: [PATCH 09/11] Fix nanites --- code/modules/reagents/Chemistry-Reagents.dm | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 11d79cf5fa8..43946ad6862 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1435,13 +1435,6 @@ datum H.adjustToxLoss(50) ..() return - if(ismonkey(M)) - var/mob/living/carbon/monkey/MO = M - if(MO.dna) - if(MO.dna.mutantrace == "plant") //plantmen monkeys (diona) take EVEN MORE damage - MO.adjustToxLoss(100) - ..() - return plasma name = "Plasma" @@ -1722,7 +1715,7 @@ datum nanites name = "Nanites" - id = "nanities" + id = "nanites" description = "Nanomachines that aid in rapid cellular regeneration." From e9e4437e91ed71fb33f4f3e2d7799e0a0b029103 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 22:26:38 +0100 Subject: [PATCH 10/11] Re-add nymph code --- code/modules/reagents/Chemistry-Reagents.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 43946ad6862..4165c43e475 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1435,6 +1435,13 @@ datum H.adjustToxLoss(50) ..() return + if(ismonkey(M)) + var/mob/living/carbon/monkey/MO = M + if(MO.dna) + if(MO.dna.mutantrace == "plant") //plantmen monkeys (diona) take EVEN MORE damage + MO.adjustToxLoss(100) + ..() + return plasma name = "Plasma" From a63ce564fd27eaa6796d222042c073d0dbaf4b17 Mon Sep 17 00:00:00 2001 From: Markolie Date: Wed, 25 Feb 2015 22:45:06 +0100 Subject: [PATCH 11/11] Reduce Diona healing --- code/modules/mob/living/carbon/human/life.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6fa2497139d..94f533ebf9d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -916,10 +916,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(species.flags & IS_PLANT) if(nutrition > 450) nutrition = 450 - if(light_amount >= 3) //if there's enough light, heal + if(light_amount >= 5) //if there's enough light, heal adjustBruteLoss(-(light_amount/2)) - adjustFireLoss(-(light_amount/2)) - adjustToxLoss(-(light_amount)) + adjustFireLoss(-(light_amount/4)) + //adjustToxLoss(-(light_amount)) adjustOxyLoss(-(light_amount)) //TODO: heal wounds, heal broken limbs.