diff --git a/code/controllers/_DynamicAreaLighting_TG.dm b/code/controllers/_DynamicAreaLighting_TG.dm index 63a7398b7bc..09f6b60d191 100644 --- a/code/controllers/_DynamicAreaLighting_TG.dm +++ b/code/controllers/_DynamicAreaLighting_TG.dm @@ -252,6 +252,12 @@ area overlays += lighting_overlay + proc/SetDynamicLighting() + + src.lighting_use_dynamic = 1 + for(var/turf/T in src.contents) + T.update_lumcount(0) + proc/InitializeLighting() //TODO: could probably improve this bit ~Carn if(!tag) tag = "[type]" if(!lighting_use_dynamic) diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 6d6f8b0c904..d4e02804fac 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -9,7 +9,7 @@ #define ui_inventory "1:6,1:5" //changeling chem indicator -#define ui_lingchemdisplay "1,7:15"//1,7 +#define ui_lingchemdisplay "1,7:15" //Lower center, persistant menu #define ui_sstore1 "3:10,1:5" @@ -170,6 +170,8 @@ var/datum/global_hud/global_hud = new() var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/lingchemdisplay + var/obj/screen/blobpwrdisplay + var/obj/screen/blobhealthdisplay var/obj/screen/r_hand_hud_object var/obj/screen/l_hand_hud_object var/obj/screen/action_intent @@ -179,7 +181,7 @@ var/datum/global_hud/global_hud = new() var/list/other var/list/obj/screen/hotkeybuttons - var/list/obj/screen/item_action/item_action_list //Used for the item action ui buttons. + var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. datum/hud/New(mob/owner) @@ -261,4 +263,6 @@ datum/hud/New(mob/owner) else if(isrobot(mymob)) robot_hud() else if(isobserver(mymob)) - ghost_hud() \ No newline at end of file + ghost_hud() + else if(isovermind(mymob)) + blob_hud() diff --git a/code/datums/limbs.dm b/code/datums/limbs.dm index 39b9881aceb..ef73eec5ece 100644 --- a/code/datums/limbs.dm +++ b/code/datums/limbs.dm @@ -12,13 +12,13 @@ /datum/limb/chest name = "chest" icon_name = "chest" - max_damage = 150 + max_damage = 200 body_part = CHEST /datum/limb/head name = "head" icon_name = "head" - max_damage = 125 + max_damage = 200 body_part = HEAD /datum/limb/l_arm diff --git a/code/datums/mind.dm b/code/datums/mind.dm index c271a972378..7dbf2e2f9df 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -830,25 +830,22 @@ datum/mind ticker.mode.malf_ai -= src special_role = null - current.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, + var/mob/living/silicon/ai/A = current + + A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules, /datum/game_mode/malfunction/proc/takeover, - /datum/game_mode/malfunction/proc/ai_win, - /client/proc/fireproof_core, - /client/proc/upgrade_turrets, - /client/proc/disable_rcd, - /client/proc/overload_machine, - /client/proc/blackout, - /client/proc/interhack, - /client/proc/reactivate_camera) + /datum/game_mode/malfunction/proc/ai_win) - current:laws = new /datum/ai_laws/asimov - del(current:malf_picker) - current:show_laws() - current.icon_state = "ai" + A.malf_picker.remove_verbs(A) - current << "\red You have been patched! You are no longer malfunctioning!" - message_admins("[key_name_admin(usr)] has de-malf'ed [current].") - log_admin("[key_name_admin(usr)] has de-malf'ed [current].") + A.laws = new /datum/ai_laws/asimov + del(A.malf_picker) + A.show_laws() + A.icon_state = "ai" + + A << "\red You have been patched! You are no longer malfunctioning!" + message_admins("[key_name_admin(usr)] has de-malf'ed [A].") + log_admin("[key_name_admin(usr)] has de-malf'ed [A].") if("malf") make_AI_Malf() @@ -977,7 +974,7 @@ datum/mind current.verbs += /mob/living/silicon/ai/proc/choose_modules current.verbs += /datum/game_mode/malfunction/proc/takeover - current:malf_picker = new /datum/AI_Module/module_picker + current:malf_picker = new /datum/module_picker current:laws = new /datum/ai_laws/malfunction current:show_laws() current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..." diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm new file mode 100644 index 00000000000..2c826e6d527 --- /dev/null +++ b/code/datums/wires/alarm.dm @@ -0,0 +1,94 @@ + +/datum/wires/alarm + holder_type = /obj/machinery/alarm + wire_count = 5 + +var/const/AALARM_WIRE_IDSCAN = 1 +var/const/AALARM_WIRE_POWER = 2 +var/const/AALARM_WIRE_SYPHON = 4 +var/const/AALARM_WIRE_AI_CONTROL = 8 +var/const/AALARM_WIRE_AALARM = 16 + + +/datum/wires/alarm/CanUse(var/mob/living/L) + var/obj/machinery/alarm/A = holder + if(A.wiresexposed) + return 1 + return 0 + +/datum/wires/alarm/GetInteractWindow() + var/obj/machinery/alarm/A = holder + . += ..() + . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") + +/datum/wires/alarm/UpdateCut(var/index, var/mended) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + if(!mended) + A.locked = 1 + //world << "Idscan wire cut" + + if(AALARM_WIRE_POWER) + A.shock(usr, 50) + A.shorted = !mended + A.update_icon() + //world << "Power wire cut" + + if (AALARM_WIRE_AI_CONTROL) + if (A.aidisabled == !mended) + A.aidisabled = mended + //world << "AI Control Wire Cut" + + if(AALARM_WIRE_SYPHON) + if(!mended) + A.mode = 3 // AALARM_MODE_PANIC + A.apply_mode() + //world << "Syphon Wire Cut" + + if(AALARM_WIRE_AALARM) + if (A.alarm_area.atmosalert(2)) + A.post_alert(2) + A.update_icon() + +/datum/wires/alarm/UpdatePulsed(var/index) + var/obj/machinery/alarm/A = holder + switch(index) + if(AALARM_WIRE_IDSCAN) + A.locked = !A.locked + // world << "Idscan wire pulsed" + + if (AALARM_WIRE_POWER) + // world << "Power wire pulsed" + if(A.shorted == 0) + A.shorted = 1 + A.update_icon() + + spawn(12000) + if(A.shorted == 1) + A.shorted = 0 + A.update_icon() + + + if (AALARM_WIRE_AI_CONTROL) + // world << "AI Control wire pulsed" + if (A.aidisabled == 0) + A.aidisabled = 1 + A.updateDialog() + spawn(100) + if (A.aidisabled == 1) + A.aidisabled = 0 + + if(AALARM_WIRE_SYPHON) + // world << "Syphon wire pulsed" + if(A.mode == 1) // AALARM_MODE_SCRUB + A.mode = 3 // AALARM_MODE_PANIC + else + A.mode = 1 // AALARM_MODE_SCRUB + A.apply_mode() + + if(AALARM_WIRE_AALARM) + // world << "Aalarm wire pulsed" + if (A.alarm_area.atmosalert(0)) + A.post_alert(0) + A.update_icon() diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 46bdb150325..8e172bca70d 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -10,8 +10,7 @@ var/list/blob_nodes = list() name = "blob" config_tag = "blob" - required_players = 0 - required_enemies = 0 + required_players = 15 restricted_jobs = list("Cyborg", "AI") @@ -21,11 +20,10 @@ var/list/blob_nodes = list() var/declared = 0 var/cores_to_spawn = 1 - var/players_per_core = 26 + var/players_per_core = 30 var/blob_count = 0 - var/blobnukecount = 300//Might be a bit low - var/blobwincount = 600//Still needs testing + var/blobwincount = 500 var/list/infected_crew = list() @@ -39,7 +37,6 @@ var/list/blob_nodes = list() cores_to_spawn = max(round(num_players()/players_per_core, 1), 1) - blobnukecount = initial(blobnukecount) * cores_to_spawn blobwincount = initial(blobwincount) * cores_to_spawn @@ -80,6 +77,14 @@ var/list/blob_nodes = list() if(emergency_shuttle) emergency_shuttle.always_fake_recall = 1 + // Disable the blob event for this round. + if(events) + var/datum/round_event_control/blob/B = locate() in events.control + if(B) + B.max_occurrences = 0 // disable the event + else + error("Events variable is null in blob gamemode post setup.") + spawn(10) start_state = new /datum/station_state() start_state.count() @@ -114,7 +119,7 @@ var/list/blob_nodes = list() if(blob_client && location) - new /obj/effect/blob/core(location, 200, blob_client) + new /obj/effect/blob/core(location, 200, blob_client, 2) // Stage 0 sleep(40) diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm index 2d2c8a41e6e..29c82fe66d4 100644 --- a/code/game/gamemodes/blob/blobs/core.dm +++ b/code/game/gamemodes/blob/blobs/core.dm @@ -3,17 +3,18 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_core" health = 200 - brute_resist = 2 fire_resist = 2 var/mob/camera/blob/overmind = null // the blob core's overmind var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds var/resource_delay = 0 + var/point_rate = 1 - New(loc, var/h = 200, var/client/new_overmind = null) + New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 1) blob_cores += src processing_objects.Add(src) if(!overmind) create_overmind(new_overmind) + point_rate = new_rate ..(loc, h) @@ -41,12 +42,12 @@ else if(resource_delay <= world.time) resource_delay = world.time + 10 // 1 second - overmind.add_points(2) + overmind.add_points(point_rate) health = min(initial(health), health + 1) for(var/i = 1; i < 8; i += i) Pulse(0, i) for(var/b_dir in alldirs) - if(!prob(10)) + if(!prob(5)) continue var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir) if(B) diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm index 6ba4bd026cb..d379146f265 100644 --- a/code/game/gamemodes/blob/blobs/factory.dm +++ b/code/game/gamemodes/blob/blobs/factory.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_factory" health = 100 - brute_resist = 1 fire_resist = 2 var/list/spores = list() var/max_spores = 3 @@ -34,8 +33,8 @@ icon_state = "blobpod" icon_living = "blobpod" pass_flags = PASSBLOB - health = 15 - maxHealth = 15 + health = 40 + maxHealth = 40 melee_damage_lower = 2 melee_damage_upper = 4 attacktext = "hits" @@ -57,6 +56,9 @@ ..() adjustBruteLoss(Clamp(0.01 * exposed_temperature, 1, 5)) + blob_act() + return + New(loc, var/obj/effect/blob/factory/linked_node) if(istype(linked_node)) factory = linked_node @@ -66,4 +68,4 @@ Die() if(factory) factory.spores -= src - ..() + del(src) diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm index 2e22668d4b6..6057b0d701f 100644 --- a/code/game/gamemodes/blob/blobs/node.dm +++ b/code/game/gamemodes/blob/blobs/node.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_node" health = 100 - brute_resist = 1 fire_resist = 2 diff --git a/code/game/gamemodes/blob/blobs/resource.dm b/code/game/gamemodes/blob/blobs/resource.dm index a0f5722282d..1ecf63aa80d 100644 --- a/code/game/gamemodes/blob/blobs/resource.dm +++ b/code/game/gamemodes/blob/blobs/resource.dm @@ -3,7 +3,6 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_resource" health = 30 - brute_resist = 1 fire_resist = 2 var/mob/camera/blob/overmind = null var/resource_delay = 0 diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm index 3eb6f03e126..b9b13d61871 100644 --- a/code/game/gamemodes/blob/blobs/shield.dm +++ b/code/game/gamemodes/blob/blobs/shield.dm @@ -3,11 +3,7 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_idle" desc = "Some blob creature thingy" - density = 1 - opacity = 0 - anchored = 1 - health = 100 - brute_resist = 1 + health = 75 fire_resist = 2 diff --git a/code/game/gamemodes/blob/hud.dm b/code/game/gamemodes/blob/hud.dm new file mode 100644 index 00000000000..e4d459888bd --- /dev/null +++ b/code/game/gamemodes/blob/hud.dm @@ -0,0 +1,17 @@ +/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen_midnight.dmi') + + blobpwrdisplay = new /obj/screen() + blobpwrdisplay.name = "blob power" + blobpwrdisplay.icon_state = "block" + blobpwrdisplay.screen_loc = ui_health + blobpwrdisplay.layer = 20 + + blobhealthdisplay = new /obj/screen() + blobhealthdisplay.name = "blob health" + blobhealthdisplay.icon_state = "block" + blobhealthdisplay.screen_loc = ui_internal + blobhealthdisplay.layer = 20 + + mymob.client.screen = null + + mymob.client.screen += list(blobpwrdisplay, blobhealthdisplay) \ No newline at end of file diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index dcfc59e1e72..6f7312e629b 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -21,6 +21,11 @@ real_name = new_name ..() +mob/camera/blob/Life() + hud_used.blobpwrdisplay.maptext = "
[src.blob_points]
" + hud_used.blobhealthdisplay.maptext = "
[blob_core.health]
" + return + /mob/camera/blob/say(var/message) return//No talking for you diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index b0b86cfacee..3528dde7668 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -15,7 +15,7 @@ /mob/camera/blob/verb/transport_core() set category = "Blob" - set name = "Return to Core" + set name = "Jump to Core" set desc = "Transport back to your core." if(blob_core) @@ -24,7 +24,7 @@ /mob/camera/blob/verb/jump_to_node() set category = "Blob" set name = "Jump to Node" - set desc = "Transport back to your core." + set desc = "Transport back to a selected node." if(blob_nodes.len) var/list/nodes = list() @@ -66,7 +66,7 @@ /mob/camera/blob/verb/create_resource() set category = "Blob" - set name = "Create Resource Blob (40)" + set name = "Create Resource Blob (50)" set desc = "Create a resource tower which will generate points for you." @@ -89,12 +89,12 @@ src << "There is a resource blob nearby, move more than 3 tiles away from it!" return - if(!can_buy(40)) + if(!can_buy(50)) return B.change_to(/obj/effect/blob/resource) - var/obj/effect/blob/resource/R = locate(/obj/effect/blob/resource) + var/obj/effect/blob/resource/R = locate() in T if(R) R.overmind = src @@ -121,8 +121,8 @@ src << "Unable to use this blob, find a normal one." return - for(var/obj/effect/blob/node/blob in orange(4)) - src << "There is another node nearby, move more than 4 tiles away from it!" + for(var/obj/effect/blob/node/blob in orange(5)) + src << "There is another node nearby, move more than 5 tiles away from it!" return if(!can_buy(60)) @@ -153,8 +153,8 @@ src << "Unable to use this blob, find a normal one." return - for(var/obj/effect/blob/factory/blob in orange(6)) - src << "There is a factory blob nearby, move more than 6 tiles away from it!" + for(var/obj/effect/blob/factory/blob in orange(7)) + src << "There is a factory blob nearby, move more than 7 tiles away from it!" return if(!can_buy(60)) @@ -166,7 +166,7 @@ /mob/camera/blob/verb/revert() set category = "Blob" - set name = "Remove Blob (0)" + set name = "Remove Blob" set desc = "Removes a blob." var/turf/T = get_turf(src) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index d52ba53d6d7..0c257095560 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -7,7 +7,6 @@ density = 0 opacity = 0 anchored = 1 - var/active = 1 var/health = 30 var/brute_resist = 4 var/fire_resist = 1 @@ -81,7 +80,7 @@ proc/expand(var/turf/T = null, var/prob = 1) if(prob && !prob(health)) return - if(istype(T, /turf/space)) return + if(istype(T, /turf/space) && prob(75)) return if(!T) var/list/dirs = list(1,2,4,8) for(var/i = 1 to 4) @@ -107,16 +106,8 @@ ex_act(severity) - var/damage = 50 - switch(severity) - if(1) - src.health -= rand(100,120) - if(2) - src.health -= rand(60,100) - if(3) - src.health -= rand(20,60) - - health -= (damage/brute_resist) + var/damage = 150 + health -= ((damage/brute_resist) - (severity * 5)) update_icon() return @@ -162,6 +153,7 @@ /obj/effect/blob/normal icon_state = "blob" luminosity = 0 + health = 20 Delete() src.loc = null diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index ef39b96db8d..f2d3aa05399 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -20,6 +20,10 @@ rcd light flash thingy on matter drain var/mod_pick_name var/description = "" var/engaged = 0 + var/cost = 5 + var/one_time = 0 + + var/power_type /datum/AI_Module/large/ @@ -32,54 +36,72 @@ rcd light flash thingy on matter drain /datum/AI_Module/large/fireproof_core module_name = "Core upgrade" mod_pick_name = "coreup" + description = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent." + cost = 50 + one_time = 1 -/client/proc/fireproof_core() + power_type = /mob/living/silicon/ai/proc/fireproof_core + +/mob/living/silicon/ai/proc/fireproof_core() set category = "Malfunction" set name = "Fireproof Core" for(var/mob/living/silicon/ai/ai in player_list) ai.fire_res_on_core = 1 - usr.verbs -= /client/proc/fireproof_core - usr << "\red Core fireproofed." + src.verbs -= /mob/living/silicon/ai/proc/fireproof_core + src << "\red Core fireproofed." /datum/AI_Module/large/upgrade_turrets module_name = "AI Turret upgrade" mod_pick_name = "turret" + description = "Improves the firing speed and health of all AI turrets. This effect is permanent." + cost = 50 + one_time = 1 -/client/proc/upgrade_turrets() + power_type = /mob/living/silicon/ai/proc/upgrade_turrets + +/mob/living/silicon/ai/proc/upgrade_turrets() set category = "Malfunction" set name = "Upgrade Turrets" - usr.verbs -= /client/proc/upgrade_turrets - for(var/obj/machinery/turret/turret in player_list) + src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets + for(var/obj/machinery/turret/turret in machines) turret.health += 30 turret.shot_delay = 20 /datum/AI_Module/large/disable_rcd module_name = "RCD disable" mod_pick_name = "rcd" + description = "Send a specialised pulse to break all RCD devices on the station." + cost = 50 -/client/proc/disable_rcd() + power_type = /mob/living/silicon/ai/proc/disable_rcd + +/mob/living/silicon/ai/proc/disable_rcd() set category = "Malfunction" set name = "Disable RCDs" - for(var/datum/AI_Module/large/disable_rcd/rcdmod in usr:current_modules) + for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules) if(rcdmod.uses > 0) rcdmod.uses -- for(var/obj/item/weapon/rcd/rcd in world) rcd.disabled = 1 for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world) rcd.disabled = 1 - usr << "RCD-disabling pulse emitted." - else usr << "Out of uses." + src << "RCD-disabling pulse emitted." + else src << "Out of uses." /datum/AI_Module/small/overload_machine module_name = "Machine overload" mod_pick_name = "overload" + description = "Overloads an electrical machine, causing a small explosion. 2 uses." uses = 2 + cost = 15 -/client/proc/overload_machine(obj/machinery/M as obj in world) + power_type = /mob/living/silicon/ai/proc/overload_machine + +/mob/living/silicon/ai/proc/overload_machine(obj/machinery/M as obj in world) set name = "Overload Machine" set category = "Malfunction" if (istype(M, /obj/machinery)) - for(var/datum/AI_Module/small/overload_machine/overload in usr:current_modules) + for(var/datum/AI_Module/small/overload_machine/overload in current_modules) if(overload.uses > 0) overload.uses -- for(var/mob/V in hearers(M, null)) @@ -87,67 +109,141 @@ rcd light flash thingy on matter drain spawn(50) explosion(get_turf(M), 0,1,1,0) del(M) - else usr << "Out of uses." - else usr << "That's not a machine." + else src << "Out of uses." + else src << "That's not a machine." + +/* + +/datum/AI_Module/large/place_cyborg_transformer + module_name = "Robotic Factory (Removes Shunting)" + mod_pick_name = "cyborgtransformer" + description = "Build a machine anywhere, using expensive nanomachines, that can convert a living human into a loyal cyborg slave when placed inside." + cost = 100 + + power_type = /mob/living/silicon/ai/proc/place_transformer + +/mob/living/silicon/ai/proc/place_transformer() + set name = "Place Robotic Factory" + set category = "Malfunction" + + if(!eyeobj) + return + + if(!isturf(src.loc)) // AI must be in it's core. + return + + var/datum/AI_Module/large/place_cyborg_transformer/PCT = locate() in src.current_modules + if(!PCT) + return + + if(PCT.uses < 1) + src << "Out of uses." + return + + var/sure = alert(src, "Make sure the room it is in is big enough and that there is a 1x3 area for the machine. Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No") + if(sure != "Yes") + return + + // Make sure there is enough room. + var/turf/middle = get_turf(eyeobj.loc) + var/list/turfs = list(middle, locate(middle.x - 1, middle.y, middle.z), locate(middle.x + 1, middle.y, middle.z)) + + var/alert_msg = "There isn't enough room. Make sure you are placing the machine in a clear area and on a floor." + + for(var/T in turfs) + + // Make sure the turfs are clear and the correct type. + if(!istype(T, /turf/simulated/floor)) + alert(src, alert_msg) + return + + var/turf/simulated/floor/F = T + for(var/atom/movable/AM in F.contents) + if(AM.density) + alert(src, alert_msg) + return + + // All clear, place the transformer + new /obj/machinery/transformer/conveyor(middle) + src.can_shunt = 0 + PCT.uses -= 1 + src << "You cannot shunt anymore." + +*/ /datum/AI_Module/small/blackout module_name = "Blackout" mod_pick_name = "blackout" + description = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses." uses = 3 + cost = 15 -/client/proc/blackout() + power_type = /mob/living/silicon/ai/proc/blackout + +/mob/living/silicon/ai/proc/blackout() set category = "Malfunction" set name = "Blackout" - for(var/datum/AI_Module/small/blackout/blackout in usr:current_modules) + for(var/datum/AI_Module/small/blackout/blackout in current_modules) if(blackout.uses > 0) blackout.uses -- for(var/obj/machinery/power/apc/apc in world) if(prob(30*apc.overload)) apc.overload_lighting() else apc.overload++ - else usr << "Out of uses." + else src << "Out of uses." /datum/AI_Module/small/interhack module_name = "Hack intercept" mod_pick_name = "interhack" + description = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems." + cost = 15 + one_time = 1 -/client/proc/interhack() + power_type = /mob/living/silicon/ai/proc/interhack + +/mob/living/silicon/ai/proc/interhack() set category = "Malfunction" set name = "Hack intercept" - usr.verbs -= /client/proc/interhack + src.verbs -= /mob/living/silicon/ai/proc/interhack ticker.mode:hack_intercept() /datum/AI_Module/small/reactivate_camera module_name = "Reactivate camera" mod_pick_name = "recam" + description = "Reactivates a currently disabled camera. 10 uses." uses = 10 + cost = 15 -/client/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras) + power_type = /mob/living/silicon/ai/proc/reactivate_camera + +/mob/living/silicon/ai/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Reactivate Camera" set category = "Malfunction" if (istype (C, /obj/machinery/camera)) - for(var/datum/AI_Module/small/reactivate_camera/camera in usr:current_modules) + for(var/datum/AI_Module/small/reactivate_camera/camera in current_modules) if(camera.uses > 0) if(!C.status) - C.status = !C.status + C.deactivate(src) camera.uses -- - for(var/mob/V in viewers(src, null)) - V.show_message(text("\blue You hear a quiet click.")) else - usr << "This camera is either active, or not repairable." - else usr << "Out of uses." - else usr << "That's not a camera." + src << "This camera is either active, or not repairable." + else src << "Out of uses." + else src << "That's not a camera." /datum/AI_Module/small/upgrade_camera module_name = "Upgrade Camera" mod_pick_name = "upgradecam" + description = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses." uses = 10 + cost = 15 -/client/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras) + power_type = /mob/living/silicon/ai/proc/upgrade_camera + +/mob/living/silicon/ai/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras) set name = "Upgrade Camera" set category = "Malfunction" if(istype(C)) - var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in usr:current_modules + var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in current_modules if(UC) if(UC.uses > 0) if(C.assembly) @@ -156,7 +252,7 @@ rcd light flash thingy on matter drain if(!C.isXRay()) C.upgradeXRay() //Update what it can see. - cameranet.updateVisibility(C) + cameranet.updateVisibility(C, 0) upgraded = 1 if(!C.isEmpProof()) @@ -172,154 +268,80 @@ rcd light flash thingy on matter drain if(upgraded) UC.uses -- C.visible_message("\icon[C] *beep*") - usr << "Camera successully upgraded!" + src << "Camera successully upgraded!" else - usr << "This camera is already upgraded!" + src << "This camera is already upgraded!" else - usr << "Out of uses." + src << "Out of uses." -/datum/AI_Module/module_picker +/datum/module_picker var/temp = null var/processing_time = 100 var/list/possible_modules = list() -/datum/AI_Module/module_picker/New() - src.possible_modules += new /datum/AI_Module/large/fireproof_core - src.possible_modules += new /datum/AI_Module/large/upgrade_turrets - src.possible_modules += new /datum/AI_Module/large/disable_rcd - src.possible_modules += new /datum/AI_Module/small/overload_machine - src.possible_modules += new /datum/AI_Module/small/interhack - src.possible_modules += new /datum/AI_Module/small/blackout - src.possible_modules += new /datum/AI_Module/small/reactivate_camera - src.possible_modules += new /datum/AI_Module/small/upgrade_camera +/datum/module_picker/New() + for(var/type in typesof(/datum/AI_Module)) + var/datum/AI_Module/AM = new type + if(AM.power_type != null) + src.possible_modules += AM -/datum/AI_Module/module_picker/proc/use(user as mob) +/datum/module_picker/proc/remove_verbs(var/mob/living/silicon/ai/A) + + for(var/datum/AI_Module/AM in possible_modules) + A.verbs.Remove(AM.power_type) + + +/datum/module_picker/proc/use(user as mob) var/dat + dat = "Select use of processing time: (currently #[src.processing_time] left.)
" + dat += "
" + dat += "Install Module:
" + dat += "The number afterwards is the amount of processing time it consumes.
" + for(var/datum/AI_Module/large/module in src.possible_modules) + dat += "[module.module_name] ([module.cost])
" + for(var/datum/AI_Module/small/module in src.possible_modules) + dat += "[module.module_name] ([module.cost])
" + dat += "
" if (src.temp) - dat = "[src.temp]

Clear" - else if(src.processing_time <= 0) - dat = " No processing time is left available. No more modules are able to be chosen at this time." - else - dat = "Select use of processing time: (currently [src.processing_time] left.)
" - dat += "
" - dat += "Install Module:
" - dat += "The number afterwards is the amount of processing time it consumes.
" - for(var/datum/AI_Module/large/module in src.possible_modules) - dat += "[module.module_name] (50)
" - for(var/datum/AI_Module/small/module in src.possible_modules) - dat += "[module.module_name] (15)
" - dat += "
" - - user << browse(dat, "window=modpicker") - onclose(user, "modpicker") + dat += "[src.temp]" + var/datum/browser/popup = new(user, "modpicker", "Malf Module Menu") + popup.set_content(dat) + popup.open() return -/datum/AI_Module/module_picker/Topic(href, href_list) +/datum/module_picker/Topic(href, href_list) ..() - if (href_list["coreup"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/fireproof_core)) - already = 1 - if (!already) - usr.verbs += /client/proc/fireproof_core - usr:current_modules += new /datum/AI_Module/large/fireproof_core - src.temp = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent." - src.processing_time -= 50 - else src.temp = "This module is only needed once." - else if (href_list["turret"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/upgrade_turrets)) - already = 1 - if (!already) - usr.verbs += /client/proc/upgrade_turrets - usr:current_modules += new /datum/AI_Module/large/upgrade_turrets - src.temp = "Improves the firing speed and health of all AI turrets. This effect is permanent." - src.processing_time -= 50 - else src.temp = "This module is only needed once." + if(!isAI(usr)) + return + var/mob/living/silicon/ai/A = usr - else if (href_list["rcd"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/large/disable_rcd)) - mod:uses += 1 - already = 1 - if (!already) - usr:current_modules += new /datum/AI_Module/large/disable_rcd - usr.verbs += /client/proc/disable_rcd - src.temp = "Send a specialised pulse to break all RCD devices on the station." - else src.temp = "Additional use added to RCD disabler." - src.processing_time -= 50 + for(var/datum/AI_Module/AM in possible_modules) + if (href_list[AM.mod_pick_name]) - else if (href_list["overload"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/overload_machine)) - mod:uses += 2 - already = 1 - if (!already) - usr.verbs += /client/proc/overload_machine - usr:current_modules += new /datum/AI_Module/small/overload_machine - src.temp = "Overloads an electrical machine, causing a small explosion. 2 uses." - else src.temp = "Two additional uses added to Overload module." - src.processing_time -= 15 + // Cost check + if(AM.cost > src.processing_time) + temp = "You cannot afford this module." + break - else if (href_list["blackout"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/blackout)) - mod:uses += 3 - already = 1 - if (!already) - usr.verbs += /client/proc/blackout - src.temp = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses." - usr:current_modules += new /datum/AI_Module/small/blackout - else src.temp = "Three additional uses added to Blackout module." - src.processing_time -= 15 + // Add new uses if we can, and it is allowed. + var/datum/AI_Module/already_AM = locate(AM.type) in A.current_modules + if(already_AM) + if(!AM.one_time) + already_AM.uses += AM.uses + src.processing_time -= AM.cost + temp = "Additional use added to [already_AM.module_name]" + break + else + temp = "This module is only needed once." + break - else if (href_list["interhack"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/interhack)) - already = 1 - if (!already) - usr.verbs += /client/proc/interhack - src.temp = "Hacks the status upgrade from Cent. Com, removing any information about malfunctioning electrical systems." - usr:current_modules += new /datum/AI_Module/small/interhack - src.processing_time -= 15 - else src.temp = "This module is only needed once." + // Give the power and take away the money. + A.verbs += AM.power_type + A.current_modules += new AM.type + temp = AM.description + src.processing_time -= AM.cost - else if (href_list["recam"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/reactivate_camera)) - mod:uses += 10 - already = 1 - if (!already) - usr.verbs += /client/proc/reactivate_camera - src.temp = "Reactivates a currently disabled camera. 10 uses." - usr:current_modules += new /datum/AI_Module/small/reactivate_camera - else src.temp = "Ten additional uses added to ReCam module." - src.processing_time -= 15 - - else if(href_list["upgradecam"]) - var/already - for (var/datum/AI_Module/mod in usr:current_modules) - if(istype(mod, /datum/AI_Module/small/upgrade_camera)) - mod:uses += 10 - already = 1 - if (!already) - usr.verbs += /client/proc/upgrade_camera - src.temp = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses." - usr:current_modules += new /datum/AI_Module/small/upgrade_camera - else src.temp = "Ten additional uses added to ReCam module." - src.processing_time -= 15 - - else - if (href_list["temp"]) - src.temp = null src.use(usr) return diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 3a19021f250..31cf3537816 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -4,9 +4,9 @@ /datum/game_mode/malfunction name = "AI malfunction" config_tag = "malfunction" - required_players = 20 - required_enemies = 1 - recommended_enemies = 1 + required_players = 0//20 + required_enemies = 0//1 + recommended_enemies = 0//1 uplink_welcome = "Crazy AI Uplink Console:" uplink_uses = 10 @@ -52,7 +52,7 @@ return AI_mind.current.verbs += /mob/living/silicon/ai/proc/choose_modules AI_mind.current:laws = new /datum/ai_laws/malfunction - AI_mind.current:malf_picker = new /datum/AI_Module/module_picker + AI_mind.current:malf_picker = new /datum/module_picker AI_mind.current:show_laws() greet_malf(AI_mind) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index e3c63e3d4f6..21ba2762c75 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -6,7 +6,7 @@ var/bomb_set icon = 'icons/obj/stationobjs.dmi' icon_state = "nuclearbomb0" density = 1 - var/deployable = 0.0 + var/extended = 0.0 var/timeleft = 60.0 var/timing = 0.0 @@ -28,19 +28,23 @@ var/bomb_set src.timeleft-- if (src.timeleft <= 0) explode() + else + playsound(loc, 'sound/items/timer.ogg', 5, 0) for(var/mob/M in viewers(1, src)) if ((M.client && M.machine == src)) src.attack_hand(M) return /obj/machinery/nuclearbomb/attackby(obj/item/weapon/I as obj, mob/user as mob) - if (src.extended) - if (istype(I, /obj/item/weapon/disk/nuclear)) - usr.drop_item() - I.loc = src - src.auth = I - src.add_fingerprint(user) + if (istype(I, /obj/item/weapon/disk/nuclear)) + if (!src.extended) + user << "You have to deploy the bomb first." return + usr.drop_item() + I.loc = src + src.auth = I + src.add_fingerprint(user) + return ..() /obj/machinery/nuclearbomb/attack_paw(mob/user as mob) @@ -68,22 +72,20 @@ var/bomb_set dat += text("
\n>[]
\n1-2-3
\n4-5-6
\n7-8-9
\nR-0-E
\n", message, src, src, src, src, src, src, src, src, src, src, src, src) user << browse(dat, "window=nuclearbomb;size=300x400") onclose(user, "nuclearbomb") - else if (src.deployable) - src.anchored = 1 - flick("nuclearbombc", src) - src.icon_state = "nuclearbomb1" - src.extended = 1 + else + user << "You have to deploy the bomb first." return /obj/machinery/nuclearbomb/verb/make_deployable() set category = "Object" - set name = "Make Deployable" + set name = "Deploy Bomb" set src in oview(1) - if (src.deployable) - src.deployable = 0 - else - src.deployable = 1 + if (!src.extended) + src.anchored = 1 + flick("nuclearbombc", src) + src.icon_state = "nuclearbomb1" + src.extended = 1 /obj/machinery/nuclearbomb/Topic(href, href_list) ..() diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index a6211b5ba3e..eb069bc7abd 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -93,6 +93,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store) + H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index dccfb930f63..cb70435fd00 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1,28 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - - -/proc/RandomAAlarmWires() - //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/AAlarmwires = list(0, 0, 0, 0, 0) - AAlarmIndexToFlag = list(0, 0, 0, 0, 0) - AAlarmIndexToWireColor = list(0, 0, 0, 0, 0) - AAlarmWireColorToIndex = list(0, 0, 0, 0, 0) - var/flagIndex = 1 - for (var/flag=1, flag<32, flag+=flag) - var/valid = 0 - while (!valid) - var/colorIndex = rand(1, 5) - if (AAlarmwires[colorIndex]==0) - valid = 1 - AAlarmwires[colorIndex] = flag - AAlarmIndexToFlag[flagIndex] = flag - AAlarmIndexToWireColor[flagIndex] = colorIndex - AAlarmWireColorToIndex[colorIndex] = flagIndex - flagIndex+=1 - return AAlarmwires - - - // A datum for dealing with threshold limit values // used in /obj/machinery/alarm /datum/tlv @@ -51,6 +27,20 @@ max1 = other.max1 max2 = other.max2 +#define AALARM_MODE_SCRUBBING 1 +#define AALARM_MODE_VENTING 2 //makes draught +#define AALARM_MODE_PANIC 3 //constantly sucks all air +#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing +#define AALARM_MODE_OFF 5 + +#define AALARM_SCREEN_MAIN 1 +#define AALARM_SCREEN_VENT 2 +#define AALARM_SCREEN_SCRUB 3 +#define AALARM_SCREEN_MODE 4 +#define AALARM_SCREEN_SENSORS 5 + +#define AALARM_REPORT_TIMEOUT 100 + /obj/machinery/alarm name = "alarm" icon = 'icons/obj/monitors.dmi' @@ -64,36 +54,19 @@ var/frequency = 1439 //var/skipprocess = 0 //Experimenting var/alarm_frequency = 1437 -#define AALARM_REPORT_TIMEOUT 100 + var/datum/radio_frequency/radio_connection var/locked = 1 + var/datum/wires/alarm/wires = null var/wiresexposed = 0 // If it's been screwdrivered open. var/aidisabled = 0 var/AAlarmwires = 31 var/shorted = 0 var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone - // Uses code from apc.dm -#define AALARM_WIRE_IDSCAN 1 //Added wires -#define AALARM_WIRE_POWER 2 -#define AALARM_WIRE_SYPHON 3 -#define AALARM_WIRE_AI_CONTROL 4 -#define AALARM_WIRE_AALARM 5 - - -#define AALARM_MODE_SCRUBBING 1 -#define AALARM_MODE_VENTING 2 //makes draught -#define AALARM_MODE_PANIC 3 //constantly sucks all air -#define AALARM_MODE_REPLACEMENT 4 //sucks off all air, then refill and swithes to scrubbing -#define AALARM_MODE_OFF 5 var/mode = AALARM_MODE_SCRUBBING -#define AALARM_SCREEN_MAIN 1 -#define AALARM_SCREEN_VENT 2 -#define AALARM_SCREEN_SCRUB 3 -#define AALARM_SCREEN_MODE 4 -#define AALARM_SCREEN_SENSORS 5 var/screen = AALARM_SCREEN_MAIN var/area_uid var/area/alarm_area @@ -145,6 +118,7 @@ /obj/machinery/alarm/New(nloc, ndir, nbuild) ..() + wires = new(src) if(nloc) loc = nloc @@ -201,31 +175,6 @@ user << browse(null, "window=air_alarm") return - if(wiresexposed && (!istype(user, /mob/living/silicon))) - var/t1 = text("Access Panel
\n") - var/list/AAlarmwires = list( - "Orange" = 1, - "Dark red" = 2, - "White" = 3, - "Yellow" = 4, - "Black" = 5, - ) - for(var/wiredesc in AAlarmwires) - var/is_uncut = src.AAlarmwires & AAlarmWireColorToFlag[AAlarmwires[wiredesc]] - t1 += "[wiredesc] wire: " - if(!is_uncut) - t1 += "Mend" - - else - t1 += "Cut " - t1 += "Pulse " - - t1 += "
" - t1 += text("
\n[(src.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((src.shorted || (stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(src.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]") - t1 += text("

Close

") - user << browse(t1, "window=AAlarmwires") - onclose(user, "AAlarmwires") - if(!shorted) //user << browse(return_text(),"window=air_alarm") //onclose(user, "air_alarm") @@ -235,135 +184,11 @@ popup.open() refresh_all() - return - - -/obj/machinery/alarm/proc/isWireColorCut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - return ((src.AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/isWireCut(var/wireIndex) - var/wireFlag = AAlarmIndexToFlag[wireIndex] - return ((src.AAlarmwires & wireFlag) == 0) - -/obj/machinery/alarm/proc/cut(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] - AAlarmwires &= ~wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - src.locked = 1 - //world << "Idscan wire cut" - - if(AALARM_WIRE_POWER) - src.shock(usr, 50) - src.shorted = 1 - update_icon() - //world << "Power wire cut" - - if (AALARM_WIRE_AI_CONTROL) - if (src.aidisabled == 0) - src.aidisabled = 1 - //world << "AI Control Wire Cut" - - if(AALARM_WIRE_SYPHON) - mode = AALARM_MODE_PANIC - apply_mode() - //world << "Syphon Wire Cut" - - if(AALARM_WIRE_AALARM) - - if (alarm_area.atmosalert(2)) - post_alert(2) - spawn(1) - src.updateUsrDialog() - update_icon() - - //world << "AAlarm Wire Cut" - - src.updateDialog() - update_icon() + if(wiresexposed && (!istype(user, /mob/living/silicon))) + wires.Interact(user) return -/obj/machinery/alarm/proc/mend(var/wireColor) - var/wireFlag = AAlarmWireColorToFlag[wireColor] - var/wireIndex = AAlarmWireColorToIndex[wireColor] //not used in this function - AAlarmwires |= wireFlag - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) - //world << "Idscan wire mended" - - if(AALARM_WIRE_POWER) - src.shorted = 0 - src.shock(usr, 50) - update_icon() - //world << "Power wire mended" - - if(AALARM_WIRE_AI_CONTROL) - if (src.aidisabled == 1) - src.aidisabled = 0 - //world << "AI Cont. wire mended" - - - // if(AALARM_WIRE_SYPHON) - // world << "Syphon Wire mended" - - - // if(AALARM_WIRE_AALARM) - //world << "AAlarm Wire mended" - - update_icon() - src.updateDialog() - return - -/obj/machinery/alarm/proc/pulse(var/wireColor) - //var/wireFlag = AAlarmWireColorToFlag[wireColor] //not used in this function - var/wireIndex = AAlarmWireColorToIndex[wireColor] - switch(wireIndex) - if(AALARM_WIRE_IDSCAN) //unlocks for 30 seconds, if you have a better way to hack I'm all ears - src.locked = 0 - spawn(300) - src.locked = 1 - //world << "Idscan wire pulsed" - - if (AALARM_WIRE_POWER) - // world << "Power wire pulsed" - if(shorted == 0) - shorted = 1 - update_icon() - - spawn(1200) - if(shorted == 1) - shorted = 0 - update_icon() - - - if (AALARM_WIRE_AI_CONTROL) - // world << "AI Control wire pulsed" - if (src.aidisabled == 0) - src.aidisabled = 1 - src.updateDialog() - spawn(10) - if (src.aidisabled == 1) - src.aidisabled = 0 - src.updateDialog() - - if(AALARM_WIRE_SYPHON) - // world << "Syphon wire pulsed" - mode = AALARM_MODE_REPLACEMENT - apply_mode() - - if(AALARM_WIRE_AALARM) - // world << "Aalarm wire pulsed" - if (alarm_area.atmosalert(0)) - post_alert(0) - spawn(1) - src.updateUsrDialog() - update_icon() - - src.updateDialog() - return /obj/machinery/alarm/proc/shock(mob/user, prb) if((stat & (NOPOWER))) // unpowered, no shock @@ -702,33 +527,8 @@ table tr:first-child th:first-child { border: none;} if (!istype(usr, /mob/living/silicon)) usr.unset_machine() usr << browse(null, "window=air_alarm") - usr << browse(null, "window=AAlarmwires") return - if (href_list["AAlarmwires"]) - var/t1 = text2num(href_list["AAlarmwires"]) - if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) )) - usr << "You need wirecutters!" - return - if (src.isWireColorCut(t1)) - src.mend(t1) - else - src.cut(t1) - spawn(1) - src.updateUsrDialog() - else if (href_list["pulse"]) - var/t1 = text2num(href_list["pulse"]) - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) - usr << "You need a multitool!" - return - if (src.isWireColorCut(t1)) - usr << "You can't pulse a cut wire." - return - else - src.pulse(t1) - spawn(1) - src.updateUsrDialog() - if(href_list["command"]) @@ -988,7 +788,7 @@ table tr:first-child th:first-child { border: none;} if(stat & (NOPOWER|BROKEN)) user << "It does nothing" else - if(src.allowed(usr) && !isWireCut(AALARM_WIRE_IDSCAN)) + if(src.allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN)) locked = !locked user << "\blue You [ locked ? "lock" : "unlock"] the Air Alarm interface." src.updateUsrDialog() @@ -1055,8 +855,8 @@ Just a object used in constructing air alarms */ /obj/item/weapon/airalarm_electronics name = "air alarm electronics" - icon = 'icons/obj/doors/door_assembly.dmi' - icon_state = "door_electronics" + icon = 'icons/obj/module.dmi' + icon_state = "airalarm_electronics" desc = "Looks like a circuit. Probably is." w_class = 2.0 m_amt = 50 diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index a98d0ba9c0b..3795baf0fcd 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -7,6 +7,7 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/device/flashlight(), \ new /obj/item/weapon/extinguisher(), \ new /obj/item/device/multitool(), \ + new /obj/item/device/analyzer(), \ new /obj/item/device/t_scanner(), \ new /obj/item/weapon/weldingtool(), \ new /obj/item/weapon/screwdriver(), \ diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 32e37245ce1..4c61a95ea25 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -84,7 +84,7 @@ if (M.timeofdeath + 6000 < world.time) continue var/turf/T = get_turf(M) - if(T) continue + if(!T) continue if(T.z == 2) continue var/tmpname = M.real_name if(areaindex[tmpname]) @@ -368,4 +368,4 @@ if(com) com.icon_state = "tele0" else - icon_state = "controller" + icon_state = "controller" diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index f25f835c691..85cd6f75d13 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -1,6 +1,6 @@ /turf/simulated/floor/mech_bay_recharge_floor name = "Mech Bay Recharge Station" - icon = 'icons/mecha/mech_bay.dmi' + icon = 'icons/turf/floors.dmi' icon_state = "recharge_floor" var/obj/machinery/mech_bay_recharge_port/recharge_port var/obj/machinery/computer/mech_bay_power_console/recharge_console diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index d5349ceae69..57c68b7a714 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -237,7 +237,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "ripley10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley8" @@ -260,7 +260,7 @@ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "ripley13" else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "ripley11" @@ -519,7 +519,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "gygax16" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "gygax14" @@ -543,7 +543,7 @@ user.visible_message("[user] secures Gygax Armour Plates.", "You secure Gygax Armour Plates.") holder.icon_state = "gygax19" else - user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You prie Gygax Armour Plates from [holder].") + user.visible_message("[user] pries Gygax Armour Plates from [holder].", "You pry Gygax Armour Plates from [holder].") new /obj/item/mecha_parts/part/gygax_armour(get_turf(holder)) holder.icon_state = "gygax17" if(1) @@ -733,7 +733,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "fireripley10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley8" @@ -765,7 +765,7 @@ user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "fireripley14" else - user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].") + user.visible_message("[user] pries external armor layer from [holder].", "You pry external armor layer from [holder].") var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 holder.icon_state = "fireripley12" @@ -1101,7 +1101,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "durand16" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "durand14" @@ -1125,7 +1125,7 @@ user.visible_message("[user] secures Durand Armour Plates.", "You secure Durand Armour Plates.") holder.icon_state = "durand19" else - user.visible_message("[user] pries Durand Armour Plates from [holder].", "You prie Durand Armour Plates from [holder].") + user.visible_message("[user] pries Durand Armour Plates from [holder].", "You pry Durand Armour Plates from [holder].") new /obj/item/mecha_parts/part/durand_armour(get_turf(holder)) holder.icon_state = "durand17" if(1) @@ -1332,7 +1332,7 @@ user.visible_message("[user] secures internal armor layer.", "You secure internal armor layer.") holder.icon_state = "odysseus10" else - user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].") + user.visible_message("[user] pries internal armor layer from [holder].", "You pry internal armor layer from [holder].") var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder)) MS.amount = 5 holder.icon_state = "odysseus8" @@ -1351,13 +1351,14 @@ else user.visible_message("[user] cuts internal armor layer from [holder].", "You cut the internal armor layer from [holder].") holder.icon_state = "odysseus10" + if(2) if(diff==FORWARD) user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.") holder.icon_state = "odysseus13" else var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder)) MS.amount = 5 - user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].") + user.visible_message("[user] pries [MS] from [holder].", "You pry [MS] from [holder].") holder.icon_state = "odysseus11" if(1) if(diff==FORWARD) diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index d8479d11d99..cfd082ceadf 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -131,6 +131,8 @@ move an amendment to the drawing.

A.power_environ = 0 A.always_unpowered = 0 move_turfs_to_area(turfs, A) + A.SetDynamicLighting() + spawn(5) //ma = A.master ? "[A.master]" : "(null)" //world << "DEBUG: create_area(5):
A.name=[A.name]
A.tag=[A.tag]
A.master=[ma]" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 9228b425b8c..7cb46a33d89 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -887,49 +887,14 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/attack(mob/living/carbon/C, mob/living/user as mob) if(istype(C)) switch(scanmode) + if(1) - - for (var/mob/O in viewers(C, null)) - O.show_message("\red [user] has analyzed [C]'s vitals!", 1) - - user.show_message("\blue Analyzing Results for [C]:") - user.show_message("\blue \t Overall Status: [C.stat > 1 ? "dead" : "[C.health - C.halloss]% healthy"]", 1) - user.show_message("\blue \t Damage Specifics: [C.getOxyLoss() > 50 ? "\red" : "\blue"][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "\red" : "\blue"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "\red" : "\blue"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "\red" : "\blue"][C.getBruteLoss()]", 1) - user.show_message("\blue \t Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue \t Body Temperature: [C.bodytemperature-T0C]°C ([C.bodytemperature*1.8-459.67]°F)", 1) - if(C.tod && (C.stat == DEAD || (C.status_flags & FAKEDEATH))) - user.show_message("\blue \t Time of Death: [C.tod]") - if(istype(C, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = C - var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) - if(length(damaged)>0) - for(var/datum/limb/org in damaged) - user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) - else - user.show_message("\blue \t Limbs are OK.",1) - - for(var/datum/disease/D in C.viruses) - if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.visible_message(text("[] has analyzed []'s vitals!", user, C)) + healthscan(user, C, 1) + src.add_fingerprint(user) if(2) - if(!istype(C.dna)) - user << "\blue No fingerprints found on [C]" - else if(!istype(C, /mob/living/carbon/monkey)) - if(!isnull(C:gloves)) - user << "\blue No fingerprints found on [C]" - else - user << text("\blue [C]'s Fingerprints: [md5(C.dna.uni_identity)]") - if ( !(C:blood_DNA) ) - user << "\blue No blood found on [C]" - if(C:blood_DNA) - del(C:blood_DNA) - else - user << "\blue Blood found on [C]. Analysing..." - spawn(15) - for(var/blood in C:blood_DNA) - user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]" + // Unused if(4) for (var/mob/O in viewers(C, null)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 52ce6f0ce7b..1a0ffa821f6 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -55,6 +55,13 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use initialize() +/obj/item/device/radio/MouseDrop(obj/over_object as obj, src_location, over_location) + var/mob/M = usr + if((!istype(over_object, /obj/screen)) && src.loc == M) + return attack_self(M) + return + + /obj/item/device/radio/initialize() if(freerange) @@ -797,4 +804,4 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /obj/item/device/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag. - listening = 0 // And it's nice to have a subtype too for future features. + listening = 0 // And it's nice to have a subtype too for future features. diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index e753d4f51bc..d1bab674f31 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -76,61 +76,79 @@ MASS SPECTROMETER var/mode = 1; /obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob) - if (( (CLUMSY in user.mutations) || user.getBrainLoss() >= 60) && prob(50)) - user << text("\red You try to analyze the floor's vitals!") - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [user] has analyzed the floor's vitals!"), 1) - user.show_message(text("\blue Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) - user.show_message(text("\blue \t Damage Specifics: [0]-[0]-[0]-[0]"), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue Body Temperature: ???", 1) + + // Clumsiness/brain damage check + if ((CLUMSY in user.mutations || user.getBrainLoss() >= 60) && prob(50)) + user << text("You stupidly try to analyze the floor's vitals!") + user.visible_message(text("[user] has analyzed the floor's vitals!")) + user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) + user.show_message(text("\t Damage Specifics: 0-0-0-0"), 1) + user.show_message("Key: Suffocation/Toxin/Burn/Brute", 1) + user.show_message("Body Temperature: ???", 1) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return - for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [] has analyzed []'s vitals!", user, M), 1) - //Foreach goto(67) - var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) + + + user.visible_message(text("[] has analyzed []'s vitals!", user, M)) + + healthscan(user, M, mode) + + src.add_fingerprint(user) + return + +// Used by the PDA medical scanner too +/proc/healthscan(var/mob/living/user, var/mob/living/M, var/mode = 1) + + //Damage specifics + var/oxy_loss = M.getOxyLoss() + var/tox_loss = M.getToxLoss() + var/fire_loss = M.getFireLoss() + var/brute_loss = M.getBruteLoss() + var/mob_status = (M.stat > 1 ? "Deceased" : text("[]% healthy", M.health - M.halloss)) + if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, "dead"), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", fake_oxy < 50 ? "\red [fake_oxy]" : fake_oxy , M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) - else - user.show_message(text("\blue Analyzing Results for []:\n\t Overall Status: []", M, (M.stat > 1 ? "dead" : text("[]% healthy", M.health - M.halloss))), 1) - user.show_message(text("\blue \t Damage Specifics: []-[]-[]-[]", M.getOxyLoss() > 50 ? "\red [M.getOxyLoss()]" : M.getOxyLoss(), M.getToxLoss() > 50 ? "\red [M.getToxLoss()]" : M.getToxLoss(), M.getFireLoss() > 50 ? "\red[M.getFireLoss()]" : M.getFireLoss(), M.getBruteLoss() > 50 ? "\red[M.getBruteLoss()]" : M.getBruteLoss()), 1) - user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("\blue Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + mob_status = "Deceased" + oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss + + user.show_message(text("Analyzing Results for []:\n\t Overall Status: []", M, mob_status), 1) + user.show_message(text("\t Damage Specifics: []-[]-[]-[]", oxy_loss, tox_loss, fire_loss, brute_loss), 1) + + user.show_message("Key: Suffocation/Toxin/Burn/Brute", 1) + user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + + // Time of death if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - user.show_message("\blue Time of Death: [M.tod]") + user.show_message("Time of Death: [M.tod]") + + // Organ damage report if(istype(M, /mob/living/carbon/human) && mode == 1) var/mob/living/carbon/human/H = M var/list/damaged = H.get_damaged_organs(1,1) - user.show_message("\blue Localized Damage, Brute/Burn:",1) + user.show_message("Localized Damage, Burn/Brute:",1) if(length(damaged)>0) for(var/datum/limb/org in damaged) - user.show_message(text("\blue \t []: []\blue-[]",capitalize(org.getDisplayName()),(org.brute_dam > 0)?"\red [org.brute_dam]":0,(org.burn_dam > 0)?"\red [org.burn_dam]":0),1) + user.show_message(text("\t []: []-[]", capitalize(org.getDisplayName()), (org.burn_dam > 0) ? "[org.burn_dam]" : 0, (org.brute_dam > 0) ? "[org.brute_dam]" : 0), 1) else - user.show_message("\blue \t Limbs are OK.",1) + user.show_message("\t Limbs are OK.",1) + + // Damage descriptions + + user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", brute_loss > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) - if(M.status_flags & FAKEDEATH) - user.show_message(text("\blue [] | [] | [] | []", fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) - else - user.show_message(text("\blue [] | [] | [] | []", M.getOxyLoss() > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal", M.getToxLoss() > 50 ? "\red Dangerous amount of toxins detected\blue" : "Subject bloodstream toxin level minimal", M.getFireLoss() > 50 ? "\red Severe burn damage detected\blue" : "Subject burn injury status O.K", M.getBruteLoss() > 50 ? "\red Severe anatomical damage detected\blue" : "Subject brute-force injury status O.K"), 1) if (M.getCloneLoss()) - user.show_message(text("\red Subject appears to have been imperfectly cloned."), 1) + user.show_message(text("Subject appears to have been imperfectly cloned."), 1) + for(var/datum/disease/D in M.viruses) if(!D.hidden[SCANNER]) - user.show_message(text("\red Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.show_message(text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) - user.show_message(text("\blue Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) + user.show_message(text("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) if (M.getBrainLoss() >= 100 || !getbrain(M)) - user.show_message(text("\red Subject is brain dead."), 1) + user.show_message(text("Subject brain function is non-existant."), 1) else if (M.getBrainLoss() >= 60) - user.show_message(text("\red Severe brain damage detected. Subject likely to have mental retardation."), 1) + user.show_message(text("Severe brain damage detected. Subject likely to have mental retardation."), 1) else if (M.getBrainLoss() >= 10) - user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1) - src.add_fingerprint(user) - return + user.show_message(text("Significant brain damage detected. Subject may have had a concussion."), 1) /obj/item/device/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -163,9 +181,6 @@ MASS SPECTROMETER if (user.stat) return - if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - usr << "\red You don't have the dexterity to do this!" - return var/turf/location = user.loc if (!( istype(location, /turf) )) diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm index 501cd781fdb..d6733dce656 100644 --- a/code/game/objects/items/weapons/dice.dm +++ b/code/game/objects/items/weapons/dice.dm @@ -1,21 +1,64 @@ /obj/item/weapon/dice name = "d6" - desc = "A dice with six sides." + desc = "A die with six sides. Basic and servicable." icon = 'icons/obj/dice.dmi' icon_state = "d6" w_class = 1 var/sides = 6 /obj/item/weapon/dice/New() - icon_state = "[initial(icon_state)][rand(sides)]" + icon_state = "[initial(icon_state)][rand(1, sides)]" + +/obj/item/weapon/dice/d2 + name = "d2" + desc = "A die with two sides. Coins are undignified!" + icon_state = "d2" + sides = 2 + +/obj/item/weapon/dice/d4 + name = "d4" + desc = "A die with four sides. The nerd's caltrop." + icon_state = "d4" + sides = 4 + +/obj/item/weapon/dice/d8 + name = "d8" + desc = "A die with eight sides. It feels... lucky." + icon_state = "d8" + sides = 8 + +/obj/item/weapon/dice/d10 + name = "d10" + desc = "A die with ten sides. Useful for percentages." + icon_state = "d10" + sides = 10 + +/obj/item/weapon/dice/d00 + name = "d00" + desc = "A die with ten sides. Works better for d100 rolls than a golfball." + icon_state = "d00" + sides = 10 + +/obj/item/weapon/dice/d12 + name = "d12" + desc = "A die with twelve sides. There's an air of neglect about it." + icon_state = "d12" + sides = 12 /obj/item/weapon/dice/d20 name = "d20" - desc = "A dice with twenty sides." + desc = "A die with twenty sides. The prefered die to throw at the GM." icon_state = "d20" sides = 20 /obj/item/weapon/dice/attack_self(mob/user as mob) + diceroll(user) + +/obj/item/weapon/dice/throw_at(atom/target, range, speed, mob/user as mob) + ..() + diceroll(user) + +/obj/item/weapon/dice/proc/diceroll(mob/user as mob) var/result = rand(1, sides) var/comment = "" if(sides == 20 && result == 20) @@ -23,6 +66,11 @@ else if(sides == 20 && result == 1) comment = "Ouch, bad luck." icon_state = "[initial(icon_state)][result]" - user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ - "You throw [src]. It lands on a [result]. [comment]", \ - "You hear [src] landing on a [result]. [comment]") \ No newline at end of file + if(initial(icon_state) == "d00") + result = (result - 1)*10 + if(user != null) //Dice was rolled in someone's hand + user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \ + "You throw [src]. It lands on [result]. [comment]", \ + "You hear [src] landing on [result]. [comment]") + else if(src.throwing == 0) //Dice was thrown and is coming to rest + src.loc.visible_message("[src] rolls to a stop, landing on [result]. [comment]") \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 2abf087a824..516aeb52008 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -157,6 +157,8 @@ playsound(loc, 'sound/effects/bamf.ogg', 50, 1) + update_mob() + for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to(src, G.reagents.total_volume) @@ -208,6 +210,8 @@ playsound(loc, 'sound/effects/bamf.ogg', 50, 1) + update_mob() + if(valid_core) for(var/obj/item/weapon/reagent_containers/glass/G in beakers) G.reagents.trans_to(valid_core, G.reagents.total_volume) diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm index 9edf68a60ac..77ca1d65bea 100644 --- a/code/game/objects/items/weapons/grenades/emgrenade.dm +++ b/code/game/objects/items/weapons/grenades/emgrenade.dm @@ -4,9 +4,8 @@ item_state = "emp" origin_tech = "materials=2;magnets=3" - prime() - ..() - if(empulse(src, 4, 10)) - del(src) - return +/obj/item/weapon/grenade/empgrenade/prime() + update_mob() + empulse(src, 4, 10) + del(src) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 2ff047a7465..36ea6b5521e 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -5,98 +5,97 @@ origin_tech = "materials=2;combat=1" var/banglet = 0 - prime() - ..() - for(var/obj/structure/closet/L in view(get_turf(src), null)) - if(locate(/mob/living/carbon/, L)) - for(var/mob/living/carbon/M in L) - bang(get_turf(src), M) +/obj/item/weapon/grenade/flashbang/prime() + update_mob() + for(var/obj/structure/closet/L in view(get_turf(src), null)) + if(locate(/mob/living/carbon/, L)) + for(var/mob/living/carbon/M in L) + bang(get_turf(src), M) - for(var/mob/living/carbon/M in viewers(get_turf(src), null)) - bang(get_turf(src), M) + for(var/mob/living/carbon/M in viewers(get_turf(src), null)) + bang(get_turf(src), M) - for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here - var/damage = round(30/(get_dist(B,get_turf(src))+1)) - B.health -= damage - B.update_icon() - del(src) - return + for(var/obj/effect/blob/B in view(8,get_turf(src))) //Blob damage here + var/damage = round(30/(get_dist(B,get_turf(src))+1)) + B.health -= damage + B.update_icon() + del(src) - proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. - if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging - for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. - S.active = 0 // -- Polymorph - S.icon_state = "shield0" +/obj/item/weapon/grenade/flashbang/proc/bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. + if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging + for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. + S.active = 0 // -- Polymorph + S.icon_state = "shield0" - M << "\red BANG" - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + M << "\red BANG" + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) //Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 - if(iscarbon(M)) - eye_safety = M.eyecheck() - if(ishuman(M)) - if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) - ear_safety += 2 - if(HULK in M.mutations) - ear_safety += 1 - if(istype(M:head, /obj/item/clothing/head/helmet)) - ear_safety += 1 + var/eye_safety = 0 + var/ear_safety = 0 + if(iscarbon(M)) + eye_safety = M.eyecheck() + if(ishuman(M)) + if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) + ear_safety += 2 + if(HULK in M.mutations) + ear_safety += 1 + if(istype(M:head, /obj/item/clothing/head/helmet)) + ear_safety += 1 //Flashing everyone - if(eye_safety < 1) - flick("e_flash", M.flash) - M.eye_stat += rand(1, 3) - M.Stun(2) - M.Weaken(10) + if(eye_safety < 1) + flick("e_flash", M.flash) + M.eye_stat += rand(1, 3) + M.Stun(2) + M.Weaken(10) //Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) - if(ear_safety > 0) - M.Stun(2) - M.Weaken(1) + if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) + if(ear_safety > 0) + M.Stun(2) + M.Weaken(1) + else + M.Stun(10) + M.Weaken(3) + if ((prob(14) || (M == src.loc && prob(70)))) + M.ear_damage += rand(1, 10) else - M.Stun(10) - M.Weaken(3) - if ((prob(14) || (M == src.loc && prob(70)))) - M.ear_damage += rand(1, 10) - else - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) + M.ear_damage += rand(0, 5) + M.ear_deaf = max(M.ear_deaf,15) - else if(get_dist(M, T) <= 5) - if(!ear_safety) - M.Stun(8) - M.ear_damage += rand(0, 3) - M.ear_deaf = max(M.ear_deaf,10) + else if(get_dist(M, T) <= 5) + if(!ear_safety) + M.Stun(8) + M.ear_damage += rand(0, 3) + M.ear_deaf = max(M.ear_deaf,10) - else if(!ear_safety) - M.Stun(4) - M.ear_damage += rand(0, 1) - M.ear_deaf = max(M.ear_deaf,5) + else if(!ear_safety) + M.Stun(4) + M.ear_damage += rand(0, 1) + M.ear_deaf = max(M.ear_deaf,5) //This really should be in mob not every check - if (M.eye_stat >= 20) - M << "\red Your eyes start to burn badly!" - M.disabilities |= NEARSIGHTED - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.eye_stat - 20 + 1)) - M << "\red You can't see anything!" - M.sdisabilities |= BLIND - if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" - if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) - if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" - M.sdisabilities |= DEAF - else - if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" - M.update_icons() + if (M.eye_stat >= 20) + M << "\red Your eyes start to burn badly!" + M.disabilities |= NEARSIGHTED + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if (prob(M.eye_stat - 20 + 1)) + M << "\red You can't see anything!" + M.sdisabilities |= BLIND + if (M.ear_damage >= 15) + M << "\red Your ears start to ring badly!" + if(!banglet && !(istype(src , /obj/item/weapon/grenade/flashbang/clusterbang))) + if (prob(M.ear_damage - 10 + 5)) + M << "\red You can't hear anything!" + M.sdisabilities |= DEAF + else + if (M.ear_damage >= 5) + M << "\red Your ears start to ring!" + M.update_icons() /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve @@ -106,6 +105,7 @@ icon_state = "clusterbang" /obj/item/weapon/grenade/flashbang/clusterbang/prime() + update_mob() var/numspawned = rand(4,8) var/again = 0 for(var/more = numspawned,more > 0,more--) @@ -124,7 +124,6 @@ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) spawn(0) del(src) - return /obj/item/weapon/grenade/flashbang/clusterbang/segment desc = "A smaller segment of a clusterbang. Better run." @@ -135,7 +134,6 @@ /obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode icon_state = "clusterbang_segment_active" active = 1 - banglet = 1 var/stepdist = rand(1,4)//How far to step var/temploc = src.loc//Saves the current location to know where to step away from walk_away(src,temploc,stepdist)//I must go, my people need me @@ -145,6 +143,7 @@ ..() /obj/item/weapon/grenade/flashbang/clusterbang/segment/prime() + update_mob() var/numspawned = rand(4,8) for(var/more = numspawned,more > 0,more--) if(prob(35)) @@ -156,17 +155,15 @@ playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) spawn(0) del(src) - return /obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang - spawn(0) - icon_state = "flashbang_active" - active = 1 - banglet = 1 - var/stepdist = rand(1,3) - var/temploc = src.loc - walk_away(src,temploc,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - prime() - ..() \ No newline at end of file + ..() + icon_state = "flashbang_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,3) + var/temploc = src.loc + walk_away(src,temploc,stepdist) + var/dettime = rand(15,60) + spawn(dettime) + prime() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index eeaf7ada8ca..7619df49775 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -69,18 +69,15 @@ var/mob/living/carbon/C = user C.throw_mode_on() spawn(det_time) - if(user) - user.drop_item() prime() - return - return /obj/item/weapon/grenade/proc/prime() -// playsound(loc, 'sound/items/Welder2.ogg', 25, 1) - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) + +/obj/item/weapon/grenade/proc/update_mob() + if(ismob(loc)) + var/mob/M = loc + M.drop_from_inventory(src) /obj/item/weapon/grenade/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -100,12 +97,10 @@ user << "You set the [name] for instant detonation." add_fingerprint(user) ..() - return /obj/item/weapon/grenade/attack_hand() walk(src, null, null) ..() - return /obj/item/weapon/grenade/attack_paw(mob/user as mob) return attack_hand(user) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index ea6ab037bc4..da5c22b8177 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -9,27 +9,27 @@ slot_flags = SLOT_BELT var/datum/effect/effect/system/bad_smoke_spread/smoke - New() - ..() - src.smoke = new /datum/effect/effect/system/bad_smoke_spread - src.smoke.attach(src) +/obj/item/weapon/grenade/smokebomb/New() + ..() + src.smoke = new /datum/effect/effect/system/bad_smoke_spread + src.smoke.attach(src) - prime() - playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - src.smoke.set_up(10, 0, usr.loc) - spawn(0) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() - sleep(10) - src.smoke.start() +/obj/item/weapon/grenade/smokebomb/prime() + update_mob() + playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + src.smoke.set_up(10, 0, usr.loc) + spawn(0) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() + sleep(10) + src.smoke.start() - for(var/obj/effect/blob/B in view(8,src)) - var/damage = round(30/(get_dist(B,src)+1)) - B.health -= damage - B.update_icon() - sleep(80) - del(src) - return + for(var/obj/effect/blob/B in view(8,src)) + var/damage = round(30/(get_dist(B,src)+1)) + B.health -= damage + B.update_icon() + sleep(80) + del(src) diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index efb6ac1e755..9546c9c166b 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -9,27 +9,26 @@ var/spawner_type = null // must be an object path var/deliveryamt = 1 // amount of type to deliver - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. +/obj/item/weapon/grenade/spawnergrenade/prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. + update_mob() + if(spawner_type && deliveryamt) + // Make a quick flash + var/turf/T = get_turf(src) + playsound(T, 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/carbon/human/M in viewers(T, null)) + if(M:eyecheck() <= 0) + flick("e_flash", M.flash) // flash dose faggots - if(spawner_type && deliveryamt) - // Make a quick flash - var/turf/T = get_turf(src) - playsound(T, 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots + for(var/i=1, i<=deliveryamt, i++) + var/atom/movable/x = new spawner_type + x.loc = T + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(x, pick(NORTH,SOUTH,EAST,WEST)) - for(var/i=1, i<=deliveryamt, i++) - var/atom/movable/x = new spawner_type - x.loc = T - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(x, pick(NORTH,SOUTH,EAST,WEST)) + // Spawn some hostile syndicate critters - // Spawn some hostile syndicate critters - - del(src) - return + del(src) /obj/item/weapon/grenade/spawnergrenade/manhacks name = "manhack delivery grenade" diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index f6328964dfe..7dbb3431e62 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -6,8 +6,7 @@ item_state = "flashbang" origin_tech = "materials=3;magnets=4;syndicate=4" - prime() - explosion(src.loc,1,2,4) - del(src) - - return \ No newline at end of file +/obj/item/weapon/grenade/syndieminibomb/prime() + update_mob() + explosion(src.loc,1,2,4) + del(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index d98f79aa097..fd3f2e8c7f2 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -19,12 +19,13 @@ obj/item/weapon/mop/proc/clean(turf/simulated/A) + if(reagents.has_reagent("water", 1)) + A.clean_blood() + for(var/obj/effect/O in A) + if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) + del(O) reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. reagents.remove_any(1) //reaction() doesn't use up the reagents - A.clean_blood() - for(var/obj/effect/O in A) - if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) /obj/item/weapon/mop/afterattack(atom/A, mob/user) diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index a5874f09855..e51deddd3ce 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -174,11 +174,18 @@ /obj/item/weapon/storage/pill_bottle/dice - name = "pack of dice" - desc = "It's a small container with dice inside." + name = "bag of dice" + desc = "Contains all the luck you'll ever need." + icon = 'icons/obj/dice.dmi' + icon_state = "dicebag" New() ..() + new /obj/item/weapon/dice/d4( src ) new /obj/item/weapon/dice( src ) + new /obj/item/weapon/dice/d8( src ) + new /obj/item/weapon/dice/d10( src ) + new /obj/item/weapon/dice/d00( src ) + new /obj/item/weapon/dice/d12( src ) new /obj/item/weapon/dice/d20( src ) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 7b6042ae299..d03ab1a6d8d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -218,7 +218,7 @@ return 0 if(!isturf(O.loc)) return 0 - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis) + if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.lying) return 0 if((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1)) return 0 diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index ab3c89365cd..f123d0a9fa0 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -142,6 +142,9 @@ new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) new /obj/item/clothing/under/rank/atmospheric_technician(src) + new /obj/item/device/analyzer(src) + new /obj/item/device/analyzer(src) + new /obj/item/device/analyzer(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/shoes/black(src) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 5adf36e57e9..3801eafcd69 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -284,6 +284,9 @@ /obj/structure/table/attackby(obj/item/weapon/W, mob/user) if (istype(W, /obj/item/weapon/grab) && get_dist(src, user) < 2) var/obj/item/weapon/grab/G = W + if(G.affecting.buckled) + user << "[G.affecting] is buckled to [G.affecting.buckled]!" + return if(G.state < GRAB_AGGRESSIVE) user << "You need a better grip to do that!" return @@ -322,8 +325,7 @@ return user.drop_item(src) - //if(W && W.loc) W.loc = src.loc // Unnecessary - see: mob/proc/drop_item(atom) - Doohl - return + return 1 /* @@ -339,6 +341,9 @@ if (istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W + if(G.affecting.buckled) + user << "[G.affecting] is buckled to [G.affecting.buckled]!" + return if(G.state < GRAB_AGGRESSIVE) user << "You need a better grip to do that!" return @@ -357,6 +362,7 @@ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) del(src) return + if(isrobot(user)) return if(istype(W, /obj/item/weapon/melee/energy/blade)) @@ -373,7 +379,7 @@ user.drop_item(src) //if(W && W.loc) W.loc = src.loc - return + return 1 /* @@ -390,6 +396,9 @@ if (istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W + if(G.affecting.buckled) + user << "[G.affecting] is buckled to [G.affecting.buckled]!" + return if(G.state < GRAB_AGGRESSIVE) user << "You need a better grip to do that!" return @@ -451,7 +460,7 @@ user.drop_item(src) //if(W && W.loc) W.loc = src.loc - return + return 1 /* @@ -514,11 +523,12 @@ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) del(src) return + if(isrobot(user)) return user.drop_item() if(W && W.loc) W.loc = src.loc - return + return 1 /obj/structure/rack/meteorhit(obj/O as obj) del(src) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5fa32b1e03a..61e863bd604 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -98,6 +98,8 @@ /obj/structure/window/attack_hand(mob/user as mob) + if(!can_be_reached(user)) + return if(HULK in user.mutations) user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!")) user.visible_message("[user] smashes through [src]!") @@ -114,6 +116,8 @@ /obj/structure/window/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_alien, attack_animal, and attack_slime + if(!can_be_reached(user)) + return health -= damage if(health <= 0) user.visible_message("[user] smashes through [src]!") @@ -142,6 +146,8 @@ /obj/structure/window/attackby(obj/item/I, mob/user) + if(!can_be_reached(user)) + return 1 //returning 1 will skip the afterattack() if(istype(I, /obj/item/weapon/screwdriver)) if(reinf && state >= 1) state = 3 - state @@ -173,6 +179,14 @@ ..() return +/obj/structure/window/proc/can_be_reached(mob/user) + if(!is_fulltile()) + if(get_dir(user,src) & dir) + for(var/obj/O in loc) + if(!O.CanPass(user, user.loc, 1, 0)) + return 0 + return 1 + /obj/structure/window/proc/hit(var/damage, var/sound_effect = 1) if(reinf) damage *= 0.5 health = max(0, health - damage) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 275d35e4da1..d2498752e81 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -530,4 +530,4 @@ turf/simulated/floor/proc/update_icon() burnt = 0 broken = 0 else - user << "\blue You need more welding fuel to complete this task." \ No newline at end of file + user << "\blue You need more welding fuel to complete this task." diff --git a/code/global.dm b/code/global.dm index 0b5af7d9149..e75a8d4e468 100644 --- a/code/global.dm +++ b/code/global.dm @@ -134,15 +134,6 @@ var/shuttlecoming = 0 var/join_motd = null var/forceblob = 0 - //airlockWireColorToIndex takes a number representing the wire color, e.g. the orange wire is always 1, the dark red wire is always 2, etc. It returns the index for whatever that wire does. - //airlockIndexToWireColor does the opposite thing - it takes the index for what the wire does, for example AIRLOCK_WIRE_IDSCAN is 1, AIRLOCK_WIRE_POWER1 is 2, etc. It returns the wire color number. - //airlockWireColorToFlag takes the wire color number and returns the flag for it (1, 2, 4, 8, 16, etc) - -var/list/AAlarmWireColorToFlag = RandomAAlarmWires() -var/list/AAlarmIndexToFlag -var/list/AAlarmIndexToWireColor -var/list/AAlarmWireColorToIndex - //This was a define, but I changed it to a variable so it can be changed in-game.(kept the all-caps definition because... code...) -Errorage var/MAX_EX_DEVESTATION_RANGE = 3 var/MAX_EX_HEAVY_RANGE = 7 diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index e154b5b8f09..860766ddeb4 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -1,6 +1,7 @@ #define MAX_ADMIN_BANS_PER_ADMIN 1 -datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null) +//Either pass the mob you wish to ban in the 'banned_mob' attribute, or the banckey, banip and bancid variables. If both are passed, the mob takes priority! If a mob is not passed, banckey is the minimum that needs to be passed! banip and bancid are optional. +datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = -1, var/reason, var/job = "", var/rounds = 0, var/banckey = null, var/banip = null, var/bancid = null) if(!check_rights(R_BAN)) return @@ -71,6 +72,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration = ip = banned_mob.lastKnownIP else if(banckey) ckey = ckey(banckey) + computerid = bancid + ip = banip var/DBQuery/query = dbcon.NewQuery("SELECT id FROM erro_player WHERE ckey = '[ckey]'") query.Execute() @@ -353,6 +356,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id) output += "" output += "" output += "Ckey: " + output += "IP: " + output += "Computer id: " output += "Duration: " output += "Job: