diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index cbaeb3bf9c9..0f0d7095fa8 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -383,7 +383,6 @@ user << "You are too far away to read the gauge." if(welded) user << "It seems welded shut." - ..() /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 8d88ad4db42..63a0549acc8 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -277,7 +277,6 @@ user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W" else user << "You are too far away to read the gauge." - ..() /obj/machinery/atmospherics/unary/vent_scrubber/Del() if(initial_loc) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index bb81eabbc55..7f287a5b54b 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -91,9 +91,11 @@ /obj/item/weapon/cane/concealed/New() ..() - concealed_blade = new/obj/item/weapon/butterfly/switchblade(src) + var/obj/item/weapon/butterfly/switchblade/temp_blade = new(src) + concealed_blade = temp_blade + temp_blade.attack_self() -/obj/item/weapon/cane/concealed/attack_self(mob/user) +/obj/item/weapon/cane/concealed/attack_self(var/mob/user) if(concealed_blade) user.visible_message("[user] has unsheathed \a [concealed_blade] from \his [src]!", "You unsheathe \the [concealed_blade] from \the [src].") // Calling drop/put in hands to properly call item drop/pickup procs @@ -101,8 +103,9 @@ user.drop_from_inventory(src) user.put_in_hands(concealed_blade) user.put_in_hands(src) + user.update_inv_l_hand(0) + user.update_inv_r_hand() concealed_blade = null - update_icon() else ..() diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm index 2bfb8b94364..1ae066d640f 100644 --- a/code/defines/procs/admin.dm +++ b/code/defines/procs/admin.dm @@ -2,12 +2,30 @@ proc/log_and_message_admins(var/message as text) log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]") message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]") +proc/log_and_message_admins_many(var/list/mob/users, var/message) + if(!users || !users.len) + return + + var/list/user_keys = list() + for(var/mob/user in users) + user_keys += key_name(user) + + log_admin("[english_list(user_keys)] [message]") + message_admins("[english_list(user_keys)] [message]") + proc/admin_log_and_message_admins(var/message as text) log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]") message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1) proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message) - victim.attack_log += text("\[[time_stamp()]\] [victim_message] [key_name(attacker)]") - attacker.attack_log += text("\[[time_stamp()]\] [attacker_message] [key_name(victim)]") + victim.attack_log += text("\[[time_stamp()]\] [key_name(attacker)] - [victim_message]") + attacker.attack_log += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message]") msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (JMP)") + +proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message) + if(!victims || !victims.len) + return + + for(var/mob/victim in victims) + admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 0fd706059e9..7f5b1802bdf 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -457,6 +457,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage if(do_after(user, 50)) + var/area/A = get_area(user) + log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") if(usr.get_active_hand() != src) return var/mob/living/carbon/human/H = user @@ -514,6 +516,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/mob/living/carbon/human/H = user R.blood_DNA = list() R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type + var/area/A = get_area(user) + log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].") switch(r) if("teleport") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 9230436a056..21a06ec8b89 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -99,6 +99,7 @@ var/list/sacrificed = list() /////////////////////////////////////////THIRD RUNE convert() + var/mob/attacker = usr var/mob/living/carbon/target = null for(var/mob/living/carbon/M in src.loc) if(!iscultist(M) && M.stat < DEAD && !(M in converting)) @@ -123,10 +124,10 @@ var/list/sacrificed = list() if(target.getFireLoss() < 100) target.hallucination = min(target.hallucination, 500) return 0 - target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects // Resist messages go! if(initial_message) //don't do this stuff right away, only if they resist or hesitate. + admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on") switch(target.getFireLoss()) if(0 to 25) target << "Your blood boils as you force yourself to resist the corruption invading every corner of your mind." @@ -176,12 +177,13 @@ var/list/sacrificed = list() /////////////////////////////////////////FOURTH RUNE tearreality() - var/cultist_count = 0 + var/list/cultists = new() for(var/mob/M in range(1,src)) if(iscultist(M) && !M.stat) M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") - cultist_count += 1 - if(cultist_count >= 9) + cultists += 1 + if(cultists.len >= 9) + log_and_message_admins_many(cultists, "summoned Nar-sie.") new /obj/machinery/singularity/narsie/large(src.loc) return else @@ -190,6 +192,7 @@ var/list/sacrificed = list() /////////////////////////////////////////FIFTH RUNE emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist + log_and_message_admins("activated an EMP rune.") if(istype(src,/obj/effect/rune)) usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") else @@ -211,6 +214,7 @@ var/list/sacrificed = list() if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) for(var/mob/living/carbon/D in R.loc) if(D.stat!=2) + admin_attack_log(usr, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on") var/bdrain = rand(1,25) D << "\red You feel weakened." D.take_overall_damage(bdrain, 0) @@ -443,6 +447,7 @@ var/list/sacrificed = list() D.real_name += " " D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith") + log_and_message_admins("used a manifest rune.") var/mob/living/user = usr while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) user.take_organ_damage(1, 0) @@ -657,6 +662,7 @@ var/list/sacrificed = list() usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." else if(prob(40)) + usr << "\red The Geometer of blood accepts this sacrifice." cult.grant_runeword(usr) else @@ -853,7 +859,7 @@ var/list/sacrificed = list() deafen() if(istype(src,/obj/effect/rune)) - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in range(7,src)) if (iscultist(C)) continue @@ -862,17 +868,18 @@ var/list/sacrificed = list() continue C.ear_deaf += 50 C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ + affected += C if(prob(1)) C.sdisabilities |= DEAF - if(affected) + if(affected.len) usr.say("Sti[pick("'","`")] kaliedir!") usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." + admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on") del(src) else return fizzle() else - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in range(7,usr)) if (iscultist(C)) continue @@ -882,10 +889,11 @@ var/list/sacrificed = list() C.ear_deaf += 30 //talismans is weaker. C.show_message("\red The world around you suddenly becomes quiet.", 3) - affected++ - if(affected) + affected += C + if(affected.len) usr.whisper("Sti[pick("'","`")] kaliedir!") usr << "\red Your talisman turns into gray dust, deafening everyone around." + admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on") for (var/mob/V in orange(1,src)) if(!(iscultist(V))) V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) @@ -893,7 +901,7 @@ var/list/sacrificed = list() blind() if(istype(src,/obj/effect/rune)) - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in viewers(src)) if (iscultist(C)) continue @@ -907,15 +915,16 @@ var/list/sacrificed = list() if(prob(10)) C.sdisabilities |= BLIND C.show_message("\red Suddenly you see red flash that blinds you.", 3) - affected++ - if(affected) + affected += C + if(affected.len) usr.say("Sti[pick("'","`")] kaliesin!") usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." + admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on") del(src) else return fizzle() else - var/affected = 0 + var/list/affected = new() for(var/mob/living/carbon/C in view(2,usr)) if (iscultist(C)) continue @@ -925,11 +934,12 @@ var/list/sacrificed = list() C.eye_blurry += 30 C.eye_blind += 10 //talismans is weaker. - affected++ + affected += C C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) - if(affected) + if(affected.len) usr.whisper("Sti[pick("'","`")] kaliesin!") usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." + admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on") return @@ -940,12 +950,13 @@ var/list/sacrificed = list() if (istype(H.current,/mob/living/carbon)) cultists+=H.current */ - var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood. + var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood. + var/list/victims = new // var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) - culcount++ - if(culcount>=3) + cultists+=C + if(cultists.len>=3) for(var/mob/living/carbon/M in viewers(usr)) if(iscultist(M)) continue @@ -954,6 +965,7 @@ var/list/sacrificed = list() continue M.take_overall_damage(51,51) M << "\red Your blood boils!" + victims += M if(prob(5)) spawn(5) M.gib() @@ -964,6 +976,8 @@ var/list/sacrificed = list() if(iscultist(C) && !C.stat) C.say("Dedo ol[pick("'","`")]btoh!") C.take_overall_damage(15, 0) + admin_attacker_log_many_victims(usr, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on") + log_and_message_admins_many(cultists - usr, "assisted activating a blood boil rune.") del(src) else return fizzle() @@ -1003,7 +1017,6 @@ var/list/sacrificed = list() if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. usr.say("Fuu ma[pick("'","`")]jin!") for(var/mob/living/L in viewers(src)) - if(iscarbon(L)) var/mob/living/carbon/C = L flick("e_flash", C.flash) @@ -1012,11 +1025,13 @@ var/list/sacrificed = list() C.Weaken(1) C.Stun(1) C.show_message("\red The rune explodes in a bright flash.", 3) + admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(issilicon(L)) var/mob/living/silicon/S = L S.Weaken(5) S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) + admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") del(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") @@ -1030,7 +1045,7 @@ var/list/sacrificed = list() if(issilicon(T)) T.Weaken(15) - + admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") else if(iscarbon(T)) var/mob/living/carbon/C = T flick("e_flash", C.flash) @@ -1038,6 +1053,7 @@ var/list/sacrificed = list() C.silent += 15 C.Weaken(25) C.Stun(25) + admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on") return /////////////////////////////////////////TWENTY-FIFTH RUNE diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2e497d14a5a..639609cb91a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -304,6 +304,17 @@ update_icon() return + +/obj/machinery/door/examine(mob/user) + ..() + if(src.health < src.maxhealth / 4) + user << "\The [src] looks like it's about to break!" + else if(src.health < src.maxhealth / 2) + user << "\The [src] looks seriously damaged!" + else if(src.health < src.maxhealth * 3/4) + user << "\The [src] shows signs of damage!" + + /obj/machinery/door/proc/set_broken() stat |= BROKEN for (var/mob/O in viewers(src, null)) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 6f941674f24..5357d45870a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -179,12 +179,15 @@ return /obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) + + var/obj/item/weapon/card/id/I = W.GetID() + if (currently_vending && vendor_account && !vendor_account.suspended) var/paid = 0 var/handled = 0 - if(istype(W, /obj/item/weapon/card/id)) - var/obj/item/weapon/card/id/C = W - paid = pay_with_card(C) + + if (I) //for IDs and PDAs and wallets with IDs + paid = pay_with_card(I,W) handled = 1 else if (istype(W, /obj/item/weapon/spacecash/ewallet)) var/obj/item/weapon/spacecash/ewallet/C = W @@ -202,9 +205,12 @@ nanomanager.update_uis(src) return // don't smack that machine with your 2 thalers - if (istype(W, /obj/item/weapon/card/emag)) + if (I || istype(W, /obj/item/weapon/spacecash)) + attack_hand(user) + return + else if (istype(W, /obj/item/weapon/card/emag)) src.emagged = 1 - user << "You short out the product lock on [src]" + user << "You short out the product lock on \the [src]" return else if(istype(W, /obj/item/weapon/screwdriver)) src.panel_open = !src.panel_open @@ -224,7 +230,7 @@ W.loc = src coin = W categories |= CAT_COIN - user << "\blue You insert the [W] into the [src]" + user << "\blue You insert \the [W] into \the [src]" nanomanager.update_uis(src) return else if(istype(W, /obj/item/weapon/wrench)) @@ -234,9 +240,9 @@ switch (anchored) if (0) anchored = 1 - user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") if (1) - user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") anchored = 0 return @@ -266,7 +272,7 @@ if(istype(cashmoney, /obj/item/weapon/spacecash/bundle)) // Bundles can just have money subtracted, and will work - visible_message("[usr] inserts some cash into [src].") + visible_message("\The [usr] inserts some cash into \the [src].") var/obj/item/weapon/spacecash/bundle/cashmoney_bundle = cashmoney cashmoney_bundle.worth -= currently_vending.price @@ -281,7 +287,7 @@ // This is really dirty, but there's no superclass for all bills, so we // just assume that all spacecash that's not something else is a bill - visible_message("[usr] inserts a bill into [src].") + visible_message("\The [usr] inserts a bill into \the [src].") var/left = cashmoney.worth - currently_vending.price usr.drop_from_inventory(cashmoney) del(cashmoney) @@ -300,7 +306,7 @@ * successful, 0 if failed. */ /obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet) - visible_message("[usr] swipes a card through [src].") + visible_message("\The [usr] swipes \the [wallet] through \the [src].") if(currently_vending.price > wallet.worth) src.status_message = "Insufficient funds on chargecard." src.status_error = 1 @@ -316,8 +322,11 @@ * Takes payment for whatever is the currently_vending item. Returns 1 if * successful, 0 if failed */ -/obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I) - visible_message("[usr] swipes a card through [src].") +/obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container) + if(I==ID_container || ID_container == null) + visible_message("\The [usr] swipes \the [I] through \the [src].") + else + visible_message("\The [usr] swipes \the [ID_container] through \the [src].") var/datum/money_account/customer_account = get_account(I.associated_account_number) if (!customer_account) src.status_message = "Error: Unable to access account. Please contact technical support if problem persists." @@ -529,7 +538,7 @@ return if(coin.string_attached) if(prob(50)) - user << "\blue You successfully pull the coin out before the [src] could swallow it." + user << "\blue You successfully pull the coin out before \the [src] could swallow it." else user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." del(coin) @@ -558,7 +567,7 @@ /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) if(src.panel_open) - user << "\blue You stock the [src] with \a [R.product_name]" + user << "\blue You stock \the [src] with \a [R.product_name]" R.amount++ nanomanager.update_uis(src) @@ -592,7 +601,7 @@ return for(var/mob/O in hearers(src, null)) - O.show_message("[src] beeps, \"[message]\"",2) + O.show_message("\The [src] beeps, \"[message]\"",2) return /obj/machinery/vending/power_change() diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index f026313034a..a9ee95db524 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -98,7 +98,7 @@

OPERATING PRINCIPLES


-
  • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and plasma. As oxygen accelerates the reaction, and plasma carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.
  • +
  • The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.

  • Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.

  • @@ -106,7 +106,7 @@
  • The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.

  • -
  • The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.
  • +
  • The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km radius. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.

  • SUPERMATTER HANDLING

  • Do not expose supermatter to oxygen.
  • @@ -125,7 +125,7 @@
    1. Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.
    2. Ensure that reactor and radiator loops are undamaged and unobstructed.
    3. -
    4. Ensure that plasma and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.
    5. +
    6. Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.
    7. Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.
    8. Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.
    9. In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.
    10. diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b4da2f8542e..59e40e2a444 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -296,7 +296,7 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SERVER) verbs += admin_verbs_server if(holder.rights & R_DEBUG) verbs += admin_verbs_debug - if(config.debugparanoid && !check_rights(R_ADMIN)) + if(config.debugparanoid && !(holder.rights & R_ADMIN)) verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. if(holder.rights & R_POSSESS) verbs += admin_verbs_possess if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 5ac54a04984..dae2c09cbd2 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -661,6 +661,12 @@ var/global/list/gear_datums = list() cost = 2 slot = slot_shoes +/datum/gear/toeless_jackboots + display_name = "toe-less jackboots" + path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran //permisson of owner of custom item was granted + cost = 2 + slot = slot_shoes + /datum/gear/sandal display_name = "sandals" path = /obj/item/clothing/shoes/sandal diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 3d7b36124b7..5c02fc11f73 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -105,7 +105,14 @@ // Okay, it wasn't a terminal being touched, check for all the simple insertions. if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain)) - integrate_ai(input_device,user) + if(integrated_ai) + integrated_ai.attackby(input_device,user) + // If the transfer was successful, we can clear out our vars. + if(integrated_ai.loc != src) + integrated_ai = null + eject_ai() + else + integrate_ai(input_device,user) return 1 return 0 diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 844ea3efac3..eed1e40ab20 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -1,5 +1,5 @@ /obj/item/device/eftpos - name = "EFTPOS scanner" + name = "\improper EFTPOS scanner" desc = "Swipe your ID card to make purchases electronically." icon = 'icons/obj/device.dmi' icon_state = "eftpos" @@ -110,11 +110,13 @@ else user << browse(null,"window=eftpos") -/obj/item/device/eftpos/attackby(O as obj, user as mob) - if(istype(O, /obj/item/weapon/card)) +/obj/item/device/eftpos/attackby(obj/item/O as obj, user as mob) + + var/obj/item/weapon/card/id/I = O.GetID() + + if(I) if(linked_account) - var/obj/item/weapon/card/I = O - scan_card(I) + scan_card(I, O) else usr << "\icon[src]Unable to connect to linked account." else if (istype(O, /obj/item/weapon/spacecash/ewallet)) @@ -124,7 +126,7 @@ if(transaction_locked && !transaction_paid) if(transaction_amount <= E.worth) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -141,7 +143,7 @@ T.time = worldtime2text() linked_account.transaction_log.Add(T) else - usr << "\icon[src]The charge card doesn't have that much money!" + usr << "\icon[src]\The [O] doesn't have that much money!" else usr << "\icon[src]Connected account has been suspended." else @@ -225,10 +227,13 @@ src.attack_self(usr) -/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I) +/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I, var/obj/item/ID_container) if (istype(I, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/C = I - visible_message("[usr] swipes a card through [src].") + if(I==ID_container || ID_container == null) + usr.visible_message("\The [usr] swipes a card through \the [src].") + else + usr.visible_message("\The [usr] swipes \the [ID_container] through \the [src].") if(transaction_locked && !transaction_paid) if(linked_account) if(!linked_account.suspended) @@ -242,7 +247,7 @@ if(!D.suspended) if(transaction_amount <= D.money) playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 //transfer the money @@ -283,13 +288,13 @@ else if (istype(I, /obj/item/weapon/card/emag)) if(transaction_locked) if(transaction_paid) - usr << "\icon[src]You stealthily swipe [I] through [src]." + usr << "\icon[src]You stealthily swipe \the [I] through \the [src]." transaction_locked = 0 transaction_paid = 0 else - visible_message("[usr] swipes a card through [src].") + usr.visible_message("\The [usr] swipes a card through \the [src].") playsound(src, 'sound/machines/chime.ogg', 50, 1) - src.visible_message("\icon[src] The [src] chimes.") + src.visible_message("\icon[src] \The [src] chimes.") transaction_paid = 1 else ..() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 698815d0a91..f616d57ac44 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -62,7 +62,7 @@ matter = list("metal" = 3750) var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = "materials=1;engineering=1" - attack_verb = list("hit", "pierced", "sliced", "attacked", "drilled") + attack_verb = list("hit", "pierced", "sliced", "attacked") var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_verb = "drilling" sharp = 1 @@ -107,6 +107,7 @@ digspeed = 20 origin_tech = "materials=4" desc = "This makes no metallurgic sense." + drill_verb = "picking" /obj/item/weapon/pickaxe/plasmacutter name = "plasma cutter" @@ -127,7 +128,8 @@ item_state = "dpickaxe" digspeed = 10 origin_tech = "materials=6;engineering=4" - desc = "A pickaxe with a diamond pick head, this is just like minecraft." + desc = "A pickaxe with a diamond pick head." + drill_verb = "picking" /obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! name = "diamond mining drill" diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 338b265a4fe..1a9ae03d513 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -74,7 +74,7 @@ mutations.Add(HUSK) status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools - update_body(0) + update_body(1) return /mob/living/carbon/human/proc/Drain() diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index a61009b836c..f2ec86193bc 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -220,14 +220,14 @@ if (istype(l_hand,/obj/item/weapon/gun)) W = l_hand - chance = hand ? 40 : 20 + chance += hand ? 40 : 20 - if (istype(r_hand,/obj/item/weapon/gun)) + else if (istype(r_hand,/obj/item/weapon/gun)) W = r_hand - chance = !hand ? 40 : 20 + chance += !hand ? 40 : 20 if (prob(chance)) - visible_message("[src]'s [W] goes off during struggle!") + visible_message("[src]'s [W.name] goes off during struggle!") var/list/turfs = list() for(var/turf/T in view()) turfs += T diff --git a/code/modules/mob/living/carbon/human/unarmed_attack.dm b/code/modules/mob/living/carbon/human/unarmed_attack.dm index 148baf66187..155a1f23b78 100644 --- a/code/modules/mob/living/carbon/human/unarmed_attack.dm +++ b/code/modules/mob/living/carbon/human/unarmed_attack.dm @@ -41,12 +41,12 @@ if (target.l_hand) // Disarm left hand //Urist McAssistant dropped the macguffin with a scream just sounds odd. Plus it doesn't work with NO_PAIN - target.visible_message("\The [target.l_hand] was knocked right out of [src]'s grasp!") + target.visible_message("\The [target.l_hand] was knocked right out of [target]'s grasp!") target.drop_l_hand() if("r_arm", "r_hand") if (target.r_hand) // Disarm right hand - target.visible_message("\The [target.r_hand] was knocked right out of [src]'s grasp!") + target.visible_message("\The [target.r_hand] was knocked right out of [target]'s grasp!") target.drop_r_hand() if("chest") if(!target.lying) diff --git a/code/modules/mob/living/carbon/metroid/death.dm b/code/modules/mob/living/carbon/metroid/death.dm index 022726b00ac..d5510ac509c 100644 --- a/code/modules/mob/living/carbon/metroid/death.dm +++ b/code/modules/mob/living/carbon/metroid/death.dm @@ -10,14 +10,13 @@ is_adult = 0 maxHealth = 150 revive() - regenerate_icons() if (!client) rabid = 1 number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" return . = ..(gibbed, "seizes up and falls limp...") - + mood = null regenerate_icons() return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 0e2a237372a..e7e545fb30e 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -71,6 +71,7 @@ mutation_chance = rand(25, 35) var/sanitizedcolour = replacetext(colour, " ", "") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + regenerate_icons() ..(location) /mob/living/carbon/slime/movement_delay() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 758cd78f200..b436d9f571f 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -194,7 +194,7 @@ update_icon() /obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob) - if(P) + if(P && istype(P, /obj/item/weapon/pen)) return P.get_signature(user) return (user && user.real_name) ? user.real_name : "Anonymous" @@ -351,6 +351,11 @@ t = replacetext(t, "\n", "
      ") t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html + + if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() + usr << "Too many fields. Sorry, you can't do this." + return + if(id!="end") addtofield(text2num(id), t) // He wants to edit a field, let him. else diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index b29f2f3e420..2c116901ec3 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,7 +8,7 @@ load_method = MAGAZINE /obj/item/weapon/gun/projectile/colt/detective - desc = "A cheap Martian knock-off of a Colt M1911. Uses less-than-lethal .45 rounds." + desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." magazine_type = /obj/item/ammo_magazine/c45m/rubber /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() @@ -30,7 +30,7 @@ return 1 /obj/item/weapon/gun/projectile/sec - desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses less-than-lethal .45 rounds." + desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds." name = "\improper NT Mk58" icon_state = "secguncomp" magazine_type = /obj/item/ammo_magazine/c45m/rubber @@ -40,11 +40,10 @@ /obj/item/weapon/gun/projectile/sec/flash name = "\improper NT Mk58 signal pistol" - desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 signal flash rounds." magazine_type = /obj/item/ammo_magazine/c45m/flash /obj/item/weapon/gun/projectile/sec/wood - desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses less-than-lethal .45 rounds." + desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds." name = "\improper Custom NT Mk58" icon_state = "secgundark" @@ -118,7 +117,7 @@ /obj/item/weapon/gun/projectile/pistol/flash name = "\improper Stechtkin signal pistol" - desc = "A small, easily concealable gun. Uses 9mm signal flash rounds." + desc = "A small, easily concealable gun. Uses 9mm rounds." magazine_type = /obj/item/ammo_magazine/mc9mm/flash /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 89b2ee6f5b6..ed595a344af 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -149,11 +149,13 @@ //Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying. /obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) + if(!istype(target_mob)) + return //accuracy bonus from aiming if (istype(shot_from, /obj/item/weapon/gun)) var/obj/item/weapon/gun/daddy = shot_from miss_modifier -= round(15*daddy.accuracy) - + //If you aim at someone beforehead, it'll hit more often. //Kinda balanced by fact you need like 2 seconds to aim //As opposed to no-delay pew pew @@ -197,7 +199,7 @@ /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced=0) if(A == src) return 0 //no - + if(A == firer) loc = A.loc return 0 //cannot shoot yourself @@ -218,7 +220,7 @@ visible_message("\The [M] uses [G.affecting] as a shield!") if(Bump(G.affecting, forced=1)) return //If Bump() returns 0 (keep going) then we continue on to attack M. - + passthrough = !attack_mob(M, distance) else passthrough = 1 //so ghosts don't stop bullets @@ -227,7 +229,7 @@ if(isturf(A)) for(var/obj/O in A) O.bullet_act(src) - for(var/mob/M in A) + for(var/mob/living/M in A) attack_mob(M, distance) //penetrating projectiles can pass through things that otherwise would not let them @@ -250,7 +252,7 @@ //stop flying on_impact(A) - + density = 0 invisibility = 101 diff --git a/code/modules/spells/mind_transfer.dm b/code/modules/spells/mind_transfer.dm index a4f8258ff75..1fd8dc34987 100644 --- a/code/modules/spells/mind_transfer.dm +++ b/code/modules/spells/mind_transfer.dm @@ -57,7 +57,7 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/caster = user//The wizard/whomever doing the body transferring. //SPELL LOSS BEGIN - admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on") + admin_attack_log(caster, victim, "Used mind transfer", "Was the victim of mind transfer", "used mind transfer on") //NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost. var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly. diff --git a/html/changelog.html b/html/changelog.html index 11ccdbedceb..22483bd7090 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,15 @@ should be listed in the changelog upon commit though. Thanks. --> +
      +

      7 April 2015

      +

      RavingManiac updated:

      +
        +
      • You can now pay vending machines and EFTPOS scanners without removing your ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash also brings up the menu now instead of attacking the vending machine.
      • +
      +
      + +

      24 February 2015

      Zuhayr updated:

      diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index b731ec3c675..9b33a5ba8b3 100644 Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index ab6cd5a97de..4ec3da1adc2 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ