diff --git a/baystation12.dme b/baystation12.dme index 2202d4f384..00d0da2404 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -633,8 +633,9 @@ #include "code\game\objects\items\weapons\swords_axes_etc.dm" #include "code\game\objects\items\weapons\tape.dm" #include "code\game\objects\items\weapons\teleportation.dm" -#include "code\game\objects\items\weapons\tools.dm" +#include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\trays.dm" +#include "code\game\objects\items\weapons\traps.dm" #include "code\game\objects\items\weapons\weaponry.dm" #include "code\game\objects\items\weapons\weldbackpack.dm" #include "code\game\objects\items\weapons\wires.dm" @@ -890,6 +891,7 @@ #include "code\modules\clothing\masks\miscellaneous.dm" #include "code\modules\clothing\masks\voice.dm" #include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\jobs.dm" #include "code\modules\clothing\shoes\magboots.dm" #include "code\modules\clothing\shoes\miscellaneous.dm" #include "code\modules\clothing\spacesuits\alien.dm" @@ -1324,6 +1326,7 @@ #include "code\modules\nano\interaction\contained.dm" #include "code\modules\nano\interaction\default.dm" #include "code\modules\nano\interaction\inventory.dm" +#include "code\modules\nano\interaction\inventory_deep.dm" #include "code\modules\nano\interaction\physical.dm" #include "code\modules\nano\interaction\self.dm" #include "code\modules\nano\interaction\zlevel.dm" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 914beba108..0b4f91fb9c 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -175,93 +175,6 @@ origin_tech = list(TECH_MATERIAL = 1) var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute -/obj/item/weapon/beartrap - name = "bear trap" - throw_speed = 2 - throw_range = 1 - gender = PLURAL - icon = 'icons/obj/items.dmi' - icon_state = "beartrap0" - desc = "A trap used to catch bears and other legged creatures." - throwforce = 0 - w_class = 3.0 - origin_tech = "materials=1" - var/deployed = 0 - - suicide_act(mob/user) - viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." - return (BRUTELOSS) - -/obj/item/weapon/beartrap/attack_self(mob/user as mob) - ..() - if(ishuman(user) && !user.stat && !user.restrained()) - if(deployed==0) - user.visible_message("[user] is deploying \the [src]", "You are deploying \the [src]!") - if (do_after(user, 60)) - user.visible_message("[user] has deployed \the [src]", "You have deployed \the [src]!") - deployed = 1 - user.drop_from_inventory(src, user.loc) - update_icon() - anchored = 1 - -/obj/item/weapon/beartrap/attack_hand(mob/user as mob) - if(ishuman(user) && !user.stat && !user.restrained()) - if(deployed==1) - user.visible_message("[user] is disarming \the [src]", "You are disarming \the [src]!") - if (do_after(user, 60)) - user.visible_message("[user] has disarmed \the [src]", "You have disarmed \the [src]!") - deployed = 0 - anchored = 0 - update_icon() - - if(deployed==0) - ..() - -/obj/item/weapon/beartrap/Crossed(AM as mob|obj) - if(deployed) - if(ishuman(AM)) - if(isturf(src.loc)) - var/mob/living/carbon/human/H = AM - if(H.m_intent == "run") - deployed = 0 - update_icon() - H << "You step on \the [src]!" - for(var/mob/O in viewers(H, null)) - if(O == H) - continue - O.show_message("[H] steps on \the [src].", 1) - if(H.lying) - var/obj/item/organ/external/affecting = pick(H.organs) - if(affecting.take_damage(30, 0)) - H.UpdateDamageIcon() - affecting.embed(src) - else - var/list/potentialorgans = list() - for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot")) - var/obj/item/organ/external/R = H.get_organ(organ) - if(R && !(R.status & ORGAN_DESTROYED)) - potentialorgans += R - var/obj/item/organ/external/affecting = pick(potentialorgans) - if(affecting.take_damage(30, 0)) - H.UpdateDamageIcon() - affecting.embed(src) - - - if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator)) - deployed = 0 - var/mob/living/simple_animal/SA = AM - SA.health -= 20 - ..() - -/obj/item/weapon/beartrap/update_icon() - ..() - - if(deployed == 0) - icon_state = "beartrap0" - else - icon_state = "beartrap1" - - /obj/item/weapon/caution desc = "Caution! Wet Floor!" name = "wet floor sign" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index a0e6e6dd13..93168d7877 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -121,7 +121,7 @@ var/global/list/additional_antag_types = list() new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI") ), "Medical" = list( - new/datum/uplink_item(/obj/item/weapon/storage/box/donkpockets, 1, "Box of Sin-Pockets", "DP"), + new/datum/uplink_item(/obj/item/weapon/storage/box/sinpockets, 1, "Box of Sin-Pockets", "DP"), new/datum/uplink_item(/obj/item/weapon/storage/firstaid/surgery, 5, "Surgery kit", "SK"), new/datum/uplink_item(/obj/item/weapon/storage/firstaid/combat, 5, "Combat medical kit", "CM") ), diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index c3368f9aff..5eab97b11a 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -31,7 +31,7 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves) @@ -62,7 +62,7 @@ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store) @@ -93,7 +93,7 @@ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) 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/clothing/shoes/workboots(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/weapon/storage/belt/utility/atmostech/(H), slot_belt) return 1 diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 4418ceff30..58830cf9fa 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -30,6 +30,9 @@ var/hasShocked = 0 //Prevents multiple shocks from happening var/secured_wires = 0 var/datum/wires/airlock/wires = null + + var/open_sound_powered = 'sound/machines/airlock.ogg' + var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg' /obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage) if(stat & (BROKEN|NOPOWER)) @@ -79,6 +82,7 @@ name = "Glass Airlock" icon = 'icons/obj/doors/Doorglass.dmi' hitsound = 'sound/effects/Glasshit.ogg' + open_sound_powered = 'sound/machines/windowdoor.ogg' maxhealth = 300 explosion_resistance = 5 opacity = 0 @@ -851,10 +855,13 @@ About the new airlock wires panel: if(!can_open(forced)) return 0 use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people - if(istype(src, /obj/machinery/door/airlock/glass)) - playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) + + //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator + if(arePowerSystemsOn()) + playsound(src.loc, open_sound_powered, 100, 1) else - playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + playsound(src.loc, open_sound_unpowered, 100, 1) + if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) src.closeOther.close() return ..() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 12b92b8154..6ca1e79863 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -18,93 +18,70 @@ user << "ERROR ERROR ERROR" /obj/item/device/aicard/attack_self(mob/user) - if (!in_range(src, user)) - return - user.set_machine(src) - var/dat = "Intelicard
" - var/laws - for(var/mob/living/silicon/ai/A in src) - dat += "Stored AI: [A.name]
System integrity: [A.system_integrity()]%
" + ui_interact(user) - for (var/datum/ai_law/law in A.laws.all_laws()) - laws += "[law.get_index()]: [law.law]
" +/obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state) + var/data[0] + data["has_ai"] = carded_ai != null + if(carded_ai) + data["name"] = carded_ai.name + data["integrity"] = carded_ai.system_integrity() + data["radio"] = !carded_ai.aiRadio.disabledAi + data["wireless"] = !carded_ai.control_disabled + data["operational"] = carded_ai.stat != DEAD + data["flushing"] = flush - dat += "Laws:
[laws]
" + var/laws[0] + for(var/datum/ai_law/AL in carded_ai.laws.all_laws()) + laws[++laws.len] = list("index" = AL.get_index(), "law" = sanitize(AL.law)) + data["laws"] = laws + data["has_laws"] = laws.len - if (A.stat == 2) - dat += "AI nonfunctional" - else - if (!src.flush) - dat += {"Wipe AI"} - else - dat += "Wipe in progress" - dat += "
" - dat += {"[A.control_disabled ? "Enable" : "Disable"] Wireless Activity"} - dat += "
" - dat += {"[A.aiRadio.disabledAi ? "Enable" : "Disable"] Subspace Transceiver"} - dat += "
" - dat += {" Close"} - user << browse(dat, "window=aicard") - onclose(user, "aicard") - return + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) -/obj/item/device/aicard/Topic(href, href_list) +/obj/item/device/aicard/Topic(href, href_list, nowindow, state) + if(..()) + return 1 - var/mob/U = usr - if (get_dist(get_turf(U),get_turf(src)) > 1 || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else). - U << browse(null, "window=aicard") - U.unset_machine() - return + if(!carded_ai) + return 1 - add_fingerprint(U) - U.set_machine(src) + var/user = usr + if (href_list["wipe"]) + var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No") + if(confirm == "Yes" && (CanUseTopic(user, state) == STATUS_INTERACTIVE)) + admin_attack_log(user, carded_ai, "Wiped using \the [src.name]", "Was wiped with \the [src.name]", "used \the [src.name] to wipe") + flush = 1 + carded_ai.suiciding = 1 + carded_ai << "Your core files are being wiped!" + while (carded_ai && carded_ai.stat != 2) + carded_ai.adjustOxyLoss(2) + carded_ai.updatehealth() + sleep(10) + flush = 0 + if (href_list["radio"]) + carded_ai.aiRadio.disabledAi = text2num(href_list["radio"]) + carded_ai << "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!" + user << "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver." + if (href_list["wireless"]) + carded_ai.control_disabled = text2num(href_list["wireless"]) + carded_ai << "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!" + user << "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface." + update_icon() - switch(href_list["choice"])//Now we switch based on choice. - if ("Close") - U << browse(null, "window=aicard") - U.unset_machine() - return - - if ("Radio") - for(var/mob/living/silicon/ai/A in src) - A.aiRadio.disabledAi = !A.aiRadio.disabledAi - A << "Your Subspace Transceiver has been: [A.aiRadio.disabledAi ? "disabled" : "enabled"]" - U << "You [A.aiRadio.disabledAi ? "Disable" : "Enable"] the AI's Subspace Transceiver" - - if ("Wipe") - var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No") - if(confirm == "Yes") - if(isnull(src)||!in_range(src, U)||U.machine!=src) - U << browse(null, "window=aicard") - U.unset_machine() - return - else - flush = 1 - for(var/mob/living/silicon/ai/A in src) - A.suiciding = 1 - A << "Your core files are being wiped!" - while (A.stat != 2) - A.adjustOxyLoss(2) - A.updatehealth() - sleep(10) - flush = 0 - - if ("Wireless") - for(var/mob/living/silicon/ai/A in src) - A.control_disabled = !A.control_disabled - A << "The intelicard's wireless port has been [A.control_disabled ? "disabled" : "enabled"]!" - update_icon() - attack_self(U) + return 1 /obj/item/device/aicard/update_icon() - var/mob/living/silicon/ai/occupant = locate() in src overlays.Cut() - if(occupant) - if (occupant.control_disabled) - overlays -= image('icons/obj/pda.dmi', "aicard-on") - else + if(carded_ai) + if (!carded_ai.control_disabled) overlays += image('icons/obj/pda.dmi', "aicard-on") - if(occupant.stat) + if(carded_ai.stat) icon_state = "aicard-404" else icon_state = "aicard-full" @@ -112,23 +89,23 @@ icon_state = "aicard" /obj/item/device/aicard/proc/grab_ai(var/mob/living/silicon/ai/ai, var/mob/living/user) - if(!ai.client) - user << "\red ERROR: \black [name] data core is offline. Unable to download." + user << "ERROR: [name] data core is offline. Unable to download." return 0 - if(locate(/mob/living/silicon/ai) in src) - user << "\red Transfer failed: \black Existing AI found on remote terminal. Remove existing AI to install a new one." + if(carded_ai) + user << "Transfer failed: Existing AI found on remote terminal. Remove existing AI to install a new one." return 0 if(ai.is_malf()) - user << "\red ERROR: \black Remote transfer interface disabled." + user << "ERROR: Remote transfer interface disabled." return 0 if(istype(ai.loc, /turf/)) new /obj/structure/AIcore/deactivated(get_turf(ai)) - src.name = "inteliCard - [ai.name]" + admin_attack_log(user, ai, "Carded with [src.name]", "Was carded with [src.name]", "used the [src.name] to card") + src.name = "[initial(name)] - [ai.name]" ai.loc = src ai.cancel_camera() @@ -137,11 +114,6 @@ ai.aiRadio.disabledAi = 1 carded_ai = ai - - ai.attack_log += text("\[[time_stamp()]\] Has been carded with [src.name] by [user.name] ([user.ckey])") - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to card [ai.name] ([ai.ckey])") - msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to card [ai.name] ([ai.ckey]) (JMP)") - if(ai.client) ai << "You have been downloaded to a mobile storage device. Remote access lost." if(user.client) @@ -151,7 +123,7 @@ return 1 /obj/item/device/aicard/proc/clear() - name = "inteliCard" + name = initial(name) carded_ai = null update_icon() diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm new file mode 100644 index 0000000000..f6af73843c --- /dev/null +++ b/code/game/objects/items/weapons/traps.dm @@ -0,0 +1,114 @@ +/obj/item/weapon/beartrap + name = "mechanical trap" + throw_speed = 2 + throw_range = 1 + gender = PLURAL + icon = 'icons/obj/items.dmi' + icon_state = "beartrap0" + desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." + throwforce = 0 + w_class = 3 + origin_tech = "materials=1" + var/deployed = 0 + +/obj/item/weapon/beartrap/suicide_act(mob/user) + viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide." + return (BRUTELOSS) + +/obj/item/weapon/beartrap/proc/can_use(mob/user) + return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) + +/obj/item/weapon/beartrap/attack_self(mob/user as mob) + ..() + if(deployed && can_use(user)) + user.visible_message( + "[user] starts to deploy \the [src].", + "You begin deploying \the [src]!", + "You hear the slow creaking of a spring." + ) + + if (do_after(user, 60)) + user.visible_message( + "[user] has deployed \the [src].", + "You have deployed \the [src]!", + "You hear a latch click loudly." + ) + + deployed = 1 + user.drop_from_inventory(src) + update_icon() + anchored = 1 + +/obj/item/weapon/beartrap/attack_hand(mob/user as mob) + if(buckled_mob && can_use(user)) + user.visible_message( + "[user] begins freeing [buckled_mob] from \the [src].", + "You carefully begin to free [buckled_mob] from \the [src].", + ) + if(do_after(user, 60)) + user.visible_message("[buckled_mob] has been freed from \the [src] by [user].") + unbuckle_mob() + anchored = 0 + else if(deployed && can_use(user)) + user.visible_message( + "[user] starts to disarm \the [src].", + "You begin disarming \the [src]!", + "You hear a latch click followed by the slow creaking of a spring." + ) + if(do_after(user, 60)) + user.visible_message( + "[user] has disarmed \the [src].", + "You have disarmed \the [src]!" + ) + deployed = 0 + anchored = 0 + update_icon() + else + ..() + +/obj/item/weapon/beartrap/proc/attack_mob(mob/living/L) + + var/target_zone + if(L.lying) + target_zone = ran_zone() + else + target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg") + + //armour + var/blocked = L.run_armor_check(target_zone, "melee") + + if(blocked >= 2) + return + + if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src)) + return 0 + + //trap the victim in place + if(!blocked) + set_dir(L.dir) + buckle_mob(L) + L << "The steel jaws of \the [src] bite into you, trapping you in place!" + +/obj/item/weapon/beartrap/Crossed(AM as mob|obj) + if(isliving(AM)) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps on \the [src].", + "You step on \the [src]!", + "You hear a loud metallic snap!" + ) + attack_mob(L) + if(!buckled_mob) + anchored = 0 + deployed = 0 + update_icon() + ..() + +/obj/item/weapon/beartrap/update_icon() + ..() + + if(!deployed) + icon_state = "beartrap0" + else + icon_state = "beartrap1" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 01e3eb4ce0..e66d5c488a 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -37,10 +37,7 @@ /obj/structure/closet/examine(mob/user) - if(get_dist(src, user) > 1) - return ..(user) - - if(opened) + if(..(user, 1) && !opened) var/content_size = 0 for(var/obj/item/I in src.contents) if(!I.anchored) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index caf2c11fca..253d96174d 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -123,9 +123,6 @@ var/list/mechtoys = list( var/comment = null /datum/controller/supply - var/processing = 1 - var/processing_interval = 300 - var/iteration = 0 //supply points var/points = 50 var/points_per_process = 1 @@ -145,20 +142,14 @@ var/list/mechtoys = list( New() ordernum = rand(1,9000) - //Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcomm and the station - proc/process() for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) var/datum/supply_packs/P = new typepath() supply_packs[P.name] = P - spawn(0) - set background = 1 - while(1) - if(processing) - iteration++ - points += points_per_process - - sleep(processing_interval) + // Supply shuttle ticker - handles supply point regeneration + // This is called by the process scheduler every thirty seconds + proc/process() + points += points_per_process //To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types. proc/forbidden_atoms_check(atom/A) @@ -251,23 +242,30 @@ var/list/mechtoys = list( var/datum/supply_order/SO = S var/datum/supply_packs/SP = SO.object - var/atom/A = new SP.containertype(pickedloc) + var/obj/A = new SP.containertype(pickedloc) A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A) - slip.is_copy = 0 - slip.info = "

[command_name()] Shipping Manifest



" - slip.info +="Order #[SO.ordernum]
" - slip.info +="Destination: [station_name]
" - slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
" - slip.info +="CONTENTS:

" + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
" shoppinglist.Cut() return diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index a3c9f3560d..25e1da639f 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -897,6 +897,12 @@ var/global/list/gear_datums = list() cost = 1 slot = slot_shoes +/datum/gear/workboots + display_name = "workboots" + path = /obj/item/clothing/shoes/workboots + cost = 1 + slot = slot_shoes + /datum/gear/sandal display_name = "sandals" path = /obj/item/clothing/shoes/sandal diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm new file mode 100644 index 0000000000..001634b96e --- /dev/null +++ b/code/modules/clothing/shoes/jobs.dm @@ -0,0 +1,32 @@ +/obj/item/clothing/shoes/galoshes + desc = "Rubber boots" + name = "galoshes" + icon_state = "galoshes" + permeability_coefficient = 0.05 + flags = NOSLIP + slowdown = SHOES_SLOWDOWN+1 + species_restricted = null + +/obj/item/clothing/shoes/jackboots + name = "jackboots" + desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." + icon_state = "jackboots" + item_state = "jackboots" + force = 3 + armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) + siemens_coefficient = 0.7 + +/obj/item/clothing/shoes/jackboots/unathi + name = "toe-less jackboots" + desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." + item_state = "digiboots" + icon_state = "digiboots" + species_restricted = null + +/obj/item/clothing/shoes/workboots + name = "workboots" + desc = "A pair of steel-toed work boots designed for use in industrial settings. Safety first." + icon_state = "workboots" + item_state = "workboots" + armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) + siemens_coefficient = 0.7 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 78ec142eba..22526a208c 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -52,15 +52,6 @@ icon_state = "black" body_parts_covered = FEET -/obj/item/clothing/shoes/galoshes - desc = "Rubber boots" - name = "galoshes" - icon_state = "galoshes" - permeability_coefficient = 0.05 - flags = NOSLIP - slowdown = SHOES_SLOWDOWN+1 - species_restricted = null - /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn they're huge!" name = "clown shoes" @@ -81,21 +72,6 @@ else playsound(src, "clownstep", 20, 1) -/obj/item/clothing/shoes/jackboots - name = "jackboots" - desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time." - icon_state = "jackboots" - item_state = "jackboots" - force = 3 - siemens_coefficient = 0.7 - -/obj/item/clothing/shoes/jackboots/unathi - name = "toe-less jackboots" - desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws." - item_state = "digiboots" - icon_state = "digiboots" - species_restricted = null - /obj/item/clothing/shoes/cult name = "boots" desc = "A pair of boots worn by the followers of Nar-Sie." diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index a04a0f4c20..b035678e74 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -131,7 +131,7 @@ if(!target) if(ai_card) if(istype(ai_card,/obj/item/device/aicard)) - ai_card.attack_self(H) + ai_card.ui_interact(H, state = deep_inventory_state) else eject_ai(H) update_verb_holder() diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 3eaf324709..9db0fbdb73 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -234,7 +234,7 @@ SetupStat(R) /mob/proc/SetupStat(var/obj/item/weapon/rig/R) - if(R && !R.canremove && R.installed_modules.len && statpanel("Hardsuit Modules")) + if(src == usr && R && !R.canremove && R.installed_modules.len && statpanel("Hardsuit Modules")) var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR" statpanel("Hardsuit Modules", "Suit charge", cell_status) for(var/obj/item/rig_module/module in R.installed_modules) diff --git a/code/modules/nano/interaction/inventory_deep.dm b/code/modules/nano/interaction/inventory_deep.dm new file mode 100644 index 0000000000..9637c4df75 --- /dev/null +++ b/code/modules/nano/interaction/inventory_deep.dm @@ -0,0 +1,10 @@ +/* + This state checks if src_object is contained anywhere in the user's inventory, including bags, etc. +*/ +/var/global/datum/topic_state/deep_inventory_state/deep_inventory_state = new() + +/datum/topic_state/deep_inventory_state/can_use_topic(var/src_object, var/mob/user) + if(!user.contains(src_object)) + return STATUS_CLOSE + + return user.shared_nano_interaction() diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm index 45e9ac8702..b413242fa4 100644 --- a/code/modules/reagents/dispenser/supply.dm +++ b/code/modules/reagents/dispenser/supply.dm @@ -143,7 +143,7 @@ _tname {\ name = _name ;\ containername = _cname ;\ - containertype = /obj/structure/closet/crate/secure;\ + containertype = /obj/structure/closet/crate;\ cost = _cost ;\ contains = list( _type , _type );\ group = "Reagent Cartridges"\ diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 47240eeb22..b7e7f948d5 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -2558,7 +2558,7 @@ slices_num = 6 New() ..() - reagents.add_reagent("protein", 50) + reagents.add_reagent("protein", 44) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2596,7 +2596,7 @@ slices_num = 6 New() ..() - reagents.add_reagent("nutriment", 30) + reagents.add_reagent("nutriment", 25) reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("imidazoline", 12) diff --git a/html/changelog.html b/html/changelog.html index 0aadb8c879..214e77d9ba 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,54 @@ -->
+

26 May 2015

+

Atlantis updated:

+ +

Chinsky updated:

+ +

PsiOmegaDelta updated:

+ +

RavingManiac updated:

+ +

Techhead updated:

+ +

Zuhayr updated:

+ +

22 May 2015

Ccomp5950 updated: