From dca72dc916d3dddb0f6d7e47c2e40bc8bba8b684 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 2 Jun 2014 20:25:06 +0200 Subject: [PATCH 01/36] Fix Tachyon detector and TTV not being deleted if inside something --- code/game/objects/items/weapons/tanks/tanks.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 74393eafbe3..1cd70a97fe7 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -205,13 +205,16 @@ air_contents.react() pressure = air_contents.return_pressure() var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE - range = min(range, MAX_EX_LIGHT_RANGE) + //range = min(range, MAX_EX_LIGHT_RANGE) --- handled in explosion.dm and prevented tachyon detectors fromstating true blast var/turf/epicenter = get_turf(loc) //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]" explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - qdel(src) + if(istype(src.loc,/obj/item/device/transfer_valve)) + qdel(src.loc) + else + qdel(src) else if(pressure > TANK_RUPTURE_PRESSURE) //world << "\blue[x],[y] tank is rupturing: [pressure] kPa, integrity [integrity]" @@ -237,4 +240,4 @@ integrity-- else if(integrity < 3) - integrity++ \ No newline at end of file + integrity++ From b5b5735631e4cfe9362f2b827f933d27192e32d8 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Mon, 9 Jun 2014 19:56:25 -0500 Subject: [PATCH 02/36] Refactoring of match code, makes it a little neater Refactoring of rolling paper packs to a storage item. Improves Rolling Paper and Packs sprites. Cigarettes/Matches can be lit by fires now. --- code/game/machinery/vending.dm | 2 +- .../objects/items/weapons/cigs_lighters.dm | 90 ++++++++---------- .../objects/items/weapons/storage/boxes.dm | 26 ++--- .../objects/items/weapons/storage/fancy.dm | 25 +++++ icons/obj/cigarettes.dmi | Bin 2454 -> 4673 bytes 5 files changed, 75 insertions(+), 68 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index e02188a5fb3..50da8e4965b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -646,7 +646,7 @@ product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." vend_delay = 34 icon_state = "cigs" - products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/rollingpaperpack = 5) + products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/lighter/random = 4,/obj/item/weapon/storage/fancy/rollingpapers = 5) contraband = list(/obj/item/weapon/lighter/zippo = 4) premium = list(/obj/item/clothing/mask/cigarette/cigar/havana = 2) refill_canister = /obj/item/weapon/vending_refill/cigarette diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 35f0eadaa47..8fb56e71196 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -30,21 +30,31 @@ CIGARETTE PACKETS ARE IN FANCY.DM var/turf/location = get_turf(src) smoketime-- if(smoketime < 1) - lit = -1 - damtype = "brute" - force = 0 - icon_state = "match_burnt" - item_state = "cigoff" - name = "burnt match" - desc = "A match. This one has seen better days." - attack_verb = null - processing_objects.Remove(src) + matchburnout() return if(location) location.hotspot_expose(700, 5) return -/obj/item/weapon/match/dropped(mob/user as mob) +/obj/item/weapon/match/fire_act() + matchignite() + +/obj/item/weapon/match/proc/matchignite() + if(lit == 0) + lit = 1 + icon_state = "match_lit" + damtype = "fire" + force = 3 + hitsound = 'sound/items/welder.ogg' + item_state = "cigon" + name = "lit match" + desc = "A match. This one is lit." + attack_verb = list("burnt","singed") + processing_objects.Add(src) + update_icon() + return + +/obj/item/weapon/match/proc/matchburnout() if(lit == 1) lit = -1 damtype = "brute" @@ -53,6 +63,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "burnt match" desc = "A match. This one has seen better days." attack_verb = null + processing_objects.Remove(src) + +/obj/item/weapon/match/dropped(mob/user as mob) + matchburnout() return ..() ////////////////// @@ -78,7 +92,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/New() ..() flags |= NOREACT // so it doesn't react until you light it - create_reagents(chem_volume) // making the cigarrete a chemical holder with a maximum volume of 15 + create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15 /obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -120,7 +134,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM light("[user] lights their [name] with [W].") return - /obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob, proximity) if(!proximity) return if(istype(glass)) //you can dip cigarettes into beakers @@ -134,15 +147,14 @@ CIGARETTE PACKETS ARE IN FANCY.DM user << "[src] is full." -/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].") +/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = null) if(!src.lit) src.lit = 1 name = "lit [name]" - if(!istype(src, /obj/item/clothing/mask/cigarette/pipe)) //can't burn people with pipes - attack_verb = list("burnt", "singed") - hitsound = 'sound/items/welder.ogg' - damtype = "fire" - force = 4 + attack_verb = list("burnt", "singed") + hitsound = 'sound/items/welder.ogg' + damtype = "fire" + force = 4 if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire var/datum/effect/effect/system/reagents_explosion/e = new() e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) @@ -165,8 +177,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM reagents.handle_reactions() icon_state = icon_on item_state = icon_on - var/turf/T = get_turf(src) - T.visible_message(flavor_text) + if(flavor_text) + var/turf/T = get_turf(src) + T.visible_message(flavor_text) processing_objects.Add(src) //can't think of any other way to update the overlays :< @@ -176,6 +189,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM M.update_inv_l_hand(0) M.update_inv_r_hand(0) + /obj/item/clothing/mask/cigarette/proc/handle_reagents() if(iscarbon(loc)) var/mob/living/carbon/C = loc @@ -183,10 +197,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(prob(15)) // so it's not an instarape in case of acid reagents.reaction(C, INGEST) reagents.trans_to(C, REAGENTS_METABOLISM) - else - reagents.remove_any(REAGENTS_METABOLISM) - else - reagents.remove_any(REAGENTS_METABOLISM) + return + reagents.remove_any(REAGENTS_METABOLISM) + /obj/item/clothing/mask/cigarette/process() var/turf/location = get_turf(src) @@ -231,6 +244,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM else return ..() +/obj/item/clothing/mask/cigarette/fire_act() + light() + /obj/item/clothing/mask/cigarette/rollie name = "rollie" desc = "A roll of dried plant matter wrapped in thin paper." @@ -535,28 +551,4 @@ CIGARETTE PACKETS ARE IN FANCY.DM else user << "You need to dry this first." else - ..() - -/obj/item/weapon/rollingpaperpack - name = "rolling paper pack" - desc = "A pack of NanoTrasen brand rolling papers." - icon = 'icons/obj/cigarettes.dmi' - icon_state = "cig_paper_pack" - w_class = 1 - var/papers = 25 - -/obj/item/weapon/rollingpaperpack/attack_self(mob/user) - if(papers > 1) - var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper(user.loc) - user.put_in_inactive_hand(P) - user << "You take a paper out of the pack." - papers -- - else - var/obj/item/weapon/rollingpaper/P = new /obj/item/weapon/rollingpaper(user.loc) - user.put_in_inactive_hand(P) - user << "You take the last paper out of the pack, and throw the pack away." - qdel(src) - -/obj/item/weapon/rollingpaperpack/examine() - ..() - usr << "There are [src.papers] left" \ No newline at end of file + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index b51af2ded03..6aeff9dee4a 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -455,25 +455,15 @@ w_class = 1 slot_flags = SLOT_BELT - New() - ..() - for(var/i=1; i <= storage_slots; i++) - new /obj/item/weapon/match(src) +/obj/item/weapon/storage/box/matches/New() + ..() + for(var/i=1; i <= storage_slots; i++) + new /obj/item/weapon/match(src) - attackby(obj/item/weapon/match/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/match) && W.lit == 0) - W.lit = 1 - W.icon_state = "match_lit" - W.damtype = "fire" - W.force = 3 - W.hitsound = 'sound/items/welder.ogg' - W.item_state = "cigon" - W.name = "lit match" - W.desc = "A match. This one is lit." - W.attack_verb = list("burnt","singed") - processing_objects.Add(W) - W.update_icon() - return +/obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/match/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/match) && W.lit == 0) + W.matchignite() + return /obj/item/weapon/storage/box/lights name = "box of replacement bulbs" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index b959c652871..303850c14dd 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -192,3 +192,28 @@ desc = "A packet of six imported DromedaryCo cancer sticks. A label on the packaging reads, \"Wouldn't a slow death make a change?\"" icon_state = "Dpacket" item_state = "Dpacket" + + +/obj/item/weapon/storage/fancy/rollingpapers + name = "rolling paper pack" + desc = "A pack of NanoTrasen brand rolling papers." + w_class = 1 + icon = 'icons/obj/cigarettes.dmi' + icon_state = "cig_paper_pack" + storage_slots = 10 + icon_type = "rolling papers" + can_hold = list(/obj/item/weapon/rollingpaper) + +/obj/item/weapon/storage/fancy/rollingpapers/update_icon() + if(!contents.len) + icon_state = "[initial(icon_state)]0" + else + icon_state = initial(icon_state) + + desc = "There are [contents.len] papers\s left!" + return + +/obj/item/weapon/storage/fancy/rollingpapers/New() + ..() + for(var/i = 1 to storage_slots) + new /obj/item/weapon/rollingpaper(src) diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index d254c6c843d70d4f402eb298c4a5c901a6187925..2ce3ce877fa0e56aba0a8193db9e4e5c27f99c3c 100644 GIT binary patch literal 4673 zcmaJ_XH-+$y4@ipK@y4t#Lz($P*e!Lha!Sf1XPMN0g)!eBcYejks``DN)w}?B5(ku zNUsqoQbPxUAOfL-^bo>}Z;boiyYJome(d$_HOF4xH@>~+nq%(u_=d?yqed?-nhDcl=9S^ak?39gyW(~hJn!ijo9JX-x;r2}G)=OC5t2Uq0w=eC^imwWs z(VQh{OzjzZw-YTp&Jsk&VkLolAA|J^@0SPaC*Cjj*Y~_%j?=$>e3W&*no1RSP!BVX zLn4K*AAx!6-K%9fpn(8z5^AWYeKX+YYId+MawNO0QLfa5*7O3Z6K(D+QP=X#+j=S1j-}@nXB|HY$>qn- zG@+R8l5Ol||7jD9`1(n^^x4JbyWNvoE-H%c+9esw{WQ%5ib3YH?fM3K=z`{ak5BZO zt55JE+X?Np0CO`E4ZQJe2cnBb!JIX*2n>bqAAsSE9o{Wqz^u3BLHNz{Tn2<~XKgv? zZ$L9}=f-HL;Dw&Di!o;t=tu)Cm7QF4Q%~Z098LuAs=N0thi9XsFmA*DThlN^;Eq99e_2Ufn=#qqg=$K4{Pyi*R2zGH<;w`*fw4R0C!9gs{L+33ITqb->t9ggI z$1_y@EX>l9*A{l6YH7ktacFtQCbVK%^kqZ0D=`r^TL=>+wPIspVpfDRJxV6%WoMWB zr^Z>YIuLT~UhnSu?XC-6EuNrT*~@y}zFs zT@@dU%h!$WpL?l$$%^#e=@C5_z~4_<*BRSBH2l5D2`oP)n!=8sFj1KO9J8gr$K!91 zPzk{DvhTf5k^=A%0~+nNGS0r!zk2he!kER5eh#MW>se*ol`@}pYpx3trvLB|V%%yk z@n4jblTN;( zz<~F|n>X5<6(SiZRF@ZfxY$ZdYvNl|s_e;6AQmyyo4LM!!IS?(oc{;FL#0$LRcBfa zJuC(_0z0|jE&!W3q4o~>LF5hc$Q}Q}RFsWWJD_(nnrZrIW=F-m!r*3_-me}Gtqe(3 z%g&`o2LeYr?8h(uoISZVK+p#kfau;++$aXyYf0wn zdsB_f)ACN+2cPPkylnQd0$2J(>cD+9cO=hC-}7d^??g(ozDamubh#X#rwNoxSHq9T zrlZ&%()7PXIZhqSNbp}-(6<3?!0~by^G*ZbHT^{iV;|PccYTVlc~dWHn9T20eZ&q+ z&#iME)Xaq6{bhP${+LY3xApf3s{Wcd93oXUj)Von<~-I1DX@sM_pYtgTvv{RG6N zLOQV;l*Cw*t_->LufjCeoKAMT+qX~o9WF-+zmYZ$*Cz`Cnk6sUmU*FPa$`$ye&3{?P>M=bR4eiD#3MQIi)fo|06vN9y_ zQRUc-HajwF4bkD`LpQ}F^2Xp$d$0fg8}Utx5X(@OmVBfHSxBHok9UdlOLE_LJF$9Q zU8BV;G?J<rp7R%0ALjk+`_6Nh+04R%xVu&a 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 literal 2454 zcmV;H32F9;P)xwWmqy|l%_xHAAVbx$g?va*F#b(NKslarH!Q**Vo zwR=-6l$3s*orG#bAF-~dy}7W}(a7D|&`L^5d{Zi#nwpoFmxxq(l9G~!RCk9|cZyVb zuCA_mQ!JR6fpt(VhR4)yjnUa~7kFKkvc~B{rBqW?BCY~lHpC%@tB_*FF zC7mTDoFyf7P%w2+FLqEca7`|EQ80>!fRm7kpPZFhSy^;VD48WCkRv0KBO{k1BbFp2 zm?R{bBqVQ3E^tjPb51U8OD%_leRFejY(^n+MI3WR8+AwsadAsHIHp-yIV&swzyK&79`(2Y>#+dhssPoX z0N$qn&6)tklmNiMzyJVdGc(L90IJNWc-;U100DGTPE!Ct=GbNc008oOR9JLGWpiV4 zX>fFDZ*Bkpc$}4#O^d=X5QfjquL$)jQd`}dmt|z}pnsvHb!vm@2kF#Z|NUkaJSfF? z$z?J;ZvvBt%=G8>Yj@DJ->D1x!FH|Q=+z=o(YHNH9X462qMGfgmiuN9BOJ=Ow5Q&b zXO>t+N9%{sTdJt?rr~@2N-l9U#nB8$S2()H(GMI=-lC0>vd*2I7;6@~?94Tk={&6G z;Mh(^UoI&|--2w>{lH*uT+(>nL^aUH8U1(29Gn*1h)%h}D!n(f`78 zP7?8{oc9g)=H}k$`*|MvLqF-s_nUK)+`K$b${0Zq1VI!=g~YucqoPt$m@%WFL4Abk8iT>cMqRmp)1Dt832=lYz!p2}(O030kVN?iIPK8_O<{?00jGWb z2r2zW%@Wsof*=TjAP9mW2!b$;)%m;A;PZEvBj@kc9`*d)?a2AN*JtMrMDd%%%&(rE zzXxnRLQ%w9h+n|`y$D1>8)Ge27Dwmr1rWtFa)Uw+nG$sVUIK0{XiE$DN{M+kYqr{< z^Z6#$R99C4zEh(CT3bQQVu;^lQ`kc^hnpgLXfya~uXS^HkuA2g=I3k$dx++6V3zsFjfEyu>B6!{Ej=p9)cIZcK{2p^DfqW+pe&O5JyPYkpftN z-7Nau_kcY}tzH|ht%5%9m=!-zY3byHNR7k zu<`^r@SuYaIrOl@k2vzEqmMbZyL&+?y>Z;}U0tFwysr}8j+zNV;Z;JokxNX_M z?TeQ7qxrKx|K^T6@4EY*d+)pdfd?OYcyMs=k?!v0CH2gB^s!}+4`2sq((IBahMs(C z#nZ#X!_Pds;<@Kvc=4s>rS-hQ%dfnOJ^@}+n%CcW^R2hv85&x-YUQeT-+TXqb=SAs z^8z0ha1r{E(tP~Mr=NZP#g|`w{mr-EegDIcKb6{x255Z7elFlPuEy?PAP@vW5ClQ| zM@dPX^HxcXNJgFVIHOrqdZhXn!HC*>Fkg*%58zR Date: Mon, 9 Jun 2014 20:00:38 -0500 Subject: [PATCH 03/36] Update boxes.dm Removes necessary check from matchbox attackby. --- code/game/objects/items/weapons/storage/boxes.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 6aeff9dee4a..fe97efbfbad 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -461,7 +461,7 @@ new /obj/item/weapon/match(src) /obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/match/W as obj, mob/user as mob) - if(istype(W, /obj/item/weapon/match) && W.lit == 0) + if(istype(W, /obj/item/weapon/match)) W.matchignite() return @@ -500,4 +500,4 @@ for(var/i = 0; i < 14; i++) new /obj/item/weapon/light/tube(src) for(var/i = 0; i < 7; i++) - new /obj/item/weapon/light/bulb(src) \ No newline at end of file + new /obj/item/weapon/light/bulb(src) From 4facf4aa4759ba468141d5e201c18ef3474f2207 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Mon, 9 Jun 2014 21:30:57 -0500 Subject: [PATCH 04/36] Update cigs_lighters.dm burnt matches get weak again --- code/game/objects/items/weapons/cigs_lighters.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 8fb56e71196..3b2c2381328 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -58,6 +58,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(lit == 1) lit = -1 damtype = "brute" + force = initial(force) icon_state = "match_burnt" item_state = "cigoff" name = "burnt match" @@ -551,4 +552,4 @@ CIGARETTE PACKETS ARE IN FANCY.DM else user << "You need to dry this first." else - ..() \ No newline at end of file + ..() From fff8858e0479a56373910375f09a671efa34c603 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Mon, 9 Jun 2014 22:02:56 -0600 Subject: [PATCH 05/36] Mechas deal brute organ damage to mobs Instead of calling ex_act(2) on everything, it checks for mobs before dealing brute damage to the chest. This means people will actually look like they've been drilled through now! --- code/game/mecha/equipment/tools/tools.dm | 30 +++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 5e4fc703326..4a9261d2d8e 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -112,10 +112,10 @@ ore.Move(ore_box) else if(target.loc == C) log_message("Drilled through [target]") - if(ismob(target)) - var/mob/M = target - add_logs(chassis.occupant, M, "attacked", object="[name]", addition="(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") - target.ex_act(2) + if(isliving(target)) + drill_mob(target, chassis.occupant) + else + target.ex_act(2) return 1 can_attach(obj/mecha/M as obj) @@ -124,6 +124,20 @@ return 1 return 0 +/obj/item/mecha_parts/mecha_equipment/tool/drill/proc/drill_mob(mob/living/target, mob/user, var/drill_damage=80) + target.visible_message("[chassis] drills [target] with the [src].\ + [chassis] drills [target] with the [src].") + add_logs(user, target, "attacked", object="[name]", addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/limb/affecting = H.get_organ("chest") + affecting.take_damage(drill_damage) + H.update_damage_overlays(0) + else + target.take_organ_damage(drill_damage) + target.Paralyse(10) + target.updatehealth() + /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill name = "diamond-tipped exosuit drill" desc = "Equipment for engineering and combat exosuits. This is an upgraded version of the drill that'll pierce the heavens!" @@ -172,10 +186,10 @@ ore.Move(ore_box) else if(target.loc == C) log_message("Drilled through [target]") - if(ismob(target)) - var/mob/M = target - add_logs(chassis.occupant, M, "attacked", object="[name]", addition="(INTENT: [uppertext(chassis.occupant.a_intent)]) (DAMTYE: [uppertext(damtype)])") - target.ex_act(2) + if(isliving(target)) + drill_mob(target, chassis.occupant, 120) + else + target.ex_act(2) return 1 can_attach(obj/mecha/M as obj) From b80e9eda57636396a168210d1658b2469c11de61 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Wed, 11 Jun 2014 14:19:58 -0500 Subject: [PATCH 06/36] Nar-Sie update --- code/datums/mind.dm | 15 +-- code/datums/spell.dm | 5 + code/datums/spells/construct_spells.dm | 17 ++++ code/game/gamemodes/wizard/soulstone.dm | 69 +++++--------- code/game/objects/effects/effect_system.dm | 5 +- .../mob/living/simple_animal/constructs.dm | 92 +++++++------------ code/modules/mob/transform_procs.dm | 16 +--- code/modules/power/singularity/singularity.dm | 57 ++++++------ 8 files changed, 111 insertions(+), 165 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 9b004722c96..1e2f7d20e0e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1172,19 +1172,8 @@ datum/mind ..() mind.assigned_role = "Shade" -/mob/living/simple_animal/construct/builder/mind_initialize() +/mob/living/simple_animal/construct/mind_initialize() ..() - mind.assigned_role = "Artificer" + mind.assigned_role = "[initial(name)]" mind.special_role = "Cultist" -/mob/living/simple_animal/construct/wraith/mind_initialize() - ..() - mind.assigned_role = "Wraith" - mind.special_role = "Cultist" - -/mob/living/simple_animal/construct/armoured/mind_initialize() - ..() - mind.assigned_role = "Juggernaut" - mind.special_role = "Cultist" - - diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 06bedadbd4d..1b3228133b0 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -191,6 +191,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread() smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here smoke.start() + else if(smoke_spread == 3) + var/datum/effect/effect/system/sleep_smoke_spread/smoke = new /datum/effect/effect/system/sleep_smoke_spread() + smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here + smoke.start() + /obj/effect/proc_holder/spell/proc/cast(list/targets) return diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm index ed3248d776a..3f1512bb4f5 100644 --- a/code/datums/spells/construct_spells.dm +++ b/code/datums/spells/construct_spells.dm @@ -110,3 +110,20 @@ invocation_type = "none" proj_lifespan = 10 max_targets = 6 + + +/obj/effect/proc_holder/spell/targeted/smoke/disable + name = "Disabling Smoke" + desc = "This spell spawns a cloud of disabling smoke." + + school = "conjuration" + charge_max = 200 + clothes_req = 0 + invocation = "none" + invocation_type = "none" + range = -1 + include_user = 1 + cooldown_min = 20 //25 deciseconds reduction per rank + + smoke_spread = 3 + smoke_amt = 10 \ No newline at end of file diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 2e7d0f8d0f2..3f40d34b6de 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -22,13 +22,6 @@ transfer_soul("VICTIM", M, user) return -/*/obj/item/device/soulstone/attack(mob/living/simple_animal/shade/M as mob, mob/user as mob)//APPARENTLY THEY NEED THEIR OWN SPECIAL SNOWFLAKE CODE IN THE LIVING ANIMAL DEFINES - if(!istype(M, /mob/living/simple_animal/shade))//If target is not a shade - return ..() - user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to capture the soul of [M.name] ([M.ckey])") - - transfer_soul("SHADE", M, user) - return*/ ///////////////////Options for using captured souls/////////////////////////////////////// /obj/item/device/soulstone/attack_self(mob/user) @@ -46,8 +39,6 @@ return - - /obj/item/device/soulstone/Topic(href, href_list) var/mob/U = usr if (!in_range(src, U)||U.machine!=src) @@ -160,53 +151,35 @@ var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer") switch(construct_class) if("Juggernaut") - var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) - else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) - qdel(T) - Z << "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, create shield walls and even deflect energy weapons, and rip apart enemies and walls alike." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) + makeNewConstruct(/mob/living/simple_animal/construct/armoured, T, U) if("Wraith") - var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) - else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) - qdel(T) - Z << "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) + makeNewConstruct(/mob/living/simple_animal/construct/wraith, T, U) if("Artificer") - var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc)) - Z.key = A.key - if(iscultist(U)) - if(ticker.mode.name == "cult") - ticker.mode:add_cultist(Z.mind) - else - ticker.mode.cult+=Z.mind - ticker.mode.update_cult_icons_added(Z.mind) - qdel(T) - Z << "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, use magic missile, repair allied constructs (by clicking on them), and most important of all create new constructs (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone)." - Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." - Z.cancel_camera() - qdel(C) + makeNewConstruct(/mob/living/simple_animal/construct/builder, T, U) + + qdel(T) + qdel(C) else U << "Creation failed!: The soul stone is empty! Go kill someone!" return + +proc/makeNewConstruct(var/mob/living/simple_animal/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0) + var/mob/living/simple_animal/construct/newstruct = new ctype(get_turf(target)) + newstruct.key = target.key + if(stoner && iscultist(stoner) || cultoverride) + if(ticker.mode.name == "cult") + ticker.mode:add_cultist(newstruct.mind) + else + ticker.mode.cult+=newstruct.mind + ticker.mode.update_cult_icons_added(newstruct.mind) + newstruct << newstruct.playstyle_string + newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + newstruct.cancel_camera() + + /obj/item/device/soulstone/proc/init_shade(var/obj/item/device/soulstone/C, var/mob/living/carbon/human/T, var/mob/U as mob, var/vic = 0) new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton T.invisibility = 101 diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index b5b4b4f7f5a..8dd8ad4263b 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -582,6 +582,7 @@ steam.start() -- spawns the effect icon = 'icons/effects/96x96.dmi' pixel_x = -32 pixel_y = -32 + color = "#9C3636" /obj/effect/effect/sleep_smoke/New() ..() @@ -596,7 +597,7 @@ steam.start() -- spawns the effect // if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later else M.drop_item() - M:sleeping += 1 + M:sleeping += 5 if (M.coughedtime != 1) M.coughedtime = 1 M.emote("cough") @@ -612,7 +613,7 @@ steam.start() -- spawns the effect return else M.drop_item() - M:sleeping += 1 + M:sleeping += 5 if (M.coughedtime != 1) M.coughedtime = 1 M.emote("cough") diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 2ab4636438a..9506df68555 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -9,6 +9,7 @@ response_disarm = "flails at" response_harm = "punches" icon_dead = "shade_dead" + icon = 'icons/mob/mob.dmi' speed = 0 a_intent = "harm" stop_automated_movement = 1 @@ -25,6 +26,7 @@ minbodytemp = 0 faction = "cult" var/list/construct_spells = list() + var/playstyle_string = "You are a generic construct! Your job is to not exist." /mob/living/simple_animal/construct/New() ..() @@ -118,8 +120,7 @@ /mob/living/simple_animal/construct/armoured name = "Juggernaut" real_name = "Juggernaut" - desc = "A possessed suit of armour driven by the will of the restless dead" - icon = 'icons/mob/mob.dmi' + desc = "A possessed suit of armour driven by the will of the restless dead." icon_state = "behemoth" icon_living = "behemoth" maxHealth = 250 @@ -135,7 +136,8 @@ status_flags = 0 force_threshold = 11 construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall) - + playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \ + create shield walls and even deflect energy weapons, and rip apart enemies and walls alike." /mob/living/simple_animal/construct/armoured/bullet_act(var/obj/item/projectile/P) if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -174,7 +176,6 @@ name = "Wraith" real_name = "Wraith" desc = "A wicked bladed shell contraption piloted by a bound spirit" - icon = 'icons/mob/mob.dmi' icon_state = "floating" icon_living = "floating" maxHealth = 75 @@ -186,18 +187,16 @@ see_in_dark = 7 attack_sound = 'sound/weapons/bladeslice.ogg' construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift) + playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." /////////////////////////////Artificer///////////////////////// - - /mob/living/simple_animal/construct/builder name = "Artificer" real_name = "Artificer" desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" - icon = 'icons/mob/mob.dmi' icon_state = "artificer" icon_living = "artificer" maxHealth = 50 @@ -215,60 +214,31 @@ /obj/effect/proc_holder/spell/aoe_turf/conjure/floor, /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone, /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser) + playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \ + use magic missile, repair allied constructs (by clicking on them), \ + and most important of all create new constructs \ + (Use your Artificer spell to summon a new construct shell and Summon Soulstone to create a new soulstone)." +/////////////////////////////Harvester///////////////////////// -/////////////////////////////Behemoth///////////////////////// +/mob/living/simple_animal/construct/harvester + name = "Harvester" + real_name = "Harvester" + desc = "A harbinger of Nar-Sie's enlightenment. It'll be all over soon." + icon_state = "harvester" + icon_living = "harvester" + maxHealth = 60 + health = 60 + melee_damage_lower = 1 + melee_damage_upper = 5 + attacktext = "prods" + speed = 0 + environment_smash = 1 + see_in_dark = 7 + attack_sound = 'sound/weapons/tap.ogg' + construct_spells = list(/obj/effect/proc_holder/spell/targeted/smoke/disable) + playstyle_string = "You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \ + Bring those who still cling to this world of illusion back to the Geometer so they may know Truth." - -/mob/living/simple_animal/construct/behemoth - name = "Behemoth" - real_name = "Behemoth" - desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." - icon = 'icons/mob/mob.dmi' - icon_state = "behemoth" - icon_living = "behemoth" - maxHealth = 750 - health = 750 - speak_emote = list("rumbles") - response_harm = "harmlessly punches" - harm_intent_damage = 0 - melee_damage_lower = 50 - melee_damage_upper = 50 - attacktext = "brutally crushes" - speed = 5 - environment_smash = 2 - attack_sound = 'sound/weapons/punch4.ogg' - force_threshold = 11 - var/energy = 0 - var/max_energy = 1000 - - -////////////////Powers////////////////// - - -/* -/client/proc/summon_cultist() - set category = "Behemoth" - set name = "Summon Cultist (300)" - set desc = "Teleport a cultist to your location" - if (istype(usr,/mob/living/simple_animal/constructbehemoth)) - - if(usr.energy<300) - usr << "\red You do not have enough power stored!" - return - - if(usr.stat) - return - - usr.energy -= 300 - var/list/mob/living/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if (istype(H.current,/mob/living)) - cultists+=H.current - var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr) - if(!cultist) - return - if (cultist == usr) //just to be sure. - return - cultist.loc = usr.loc - usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/ +/mob/living/simple_animal/construct/harvester/Process_Spacemove(var/check_drift = 0) + return 1 \ No newline at end of file diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 03fb40fb3a9..087480c786c 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -473,20 +473,8 @@ if(!MP) return 0 //Sanity, this should never happen. -// if(ispath(MP, /mob/living/simple_animal/space_worm)) //Goodbye Space Worms 2014 -// return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning. - - if(ispath(MP, /mob/living/simple_animal/construct/behemoth)) - return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/armoured)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/wraith)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype - - if(ispath(MP, /mob/living/simple_animal/construct/builder)) - return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype + if(ispath(MP, /mob/living/simple_animal/construct)) + return 0 //Verbs do not appear for players. //Good mobs! if(ispath(MP, /mob/living/simple_animal/cat)) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index a0725f79ee5..ef84ff36073 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -1,10 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 -var/global/list/uneatable = list( - /turf/space, - /obj/effect/overlay - ) - /obj/machinery/singularity name = "gravitational singularity" desc = "A gravitational singularity." @@ -32,6 +27,7 @@ var/global/list/uneatable = list( var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing var/teleport_del = 0 var/last_warning + var/list/uneatable = list(/turf/space, /obj/effect/overlay) /obj/machinery/singularity/New(loc, var/starting_energy = 50, var/temp = 0) //CARN: admin-alert for chuckle-fuckery. @@ -477,6 +473,7 @@ var/global/list/uneatable = list( move_self = 1 //Do we move on our own? grav_pull = 5 //How many tiles out do we pull? consume_range = 6 //How many tiles out do we eat + uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/construct) /obj/machinery/singularity/narsie/large name = "Nar-Sie" @@ -496,6 +493,11 @@ var/global/list/uneatable = list( if(emergency_shuttle) emergency_shuttle.incall(0.3) // Cannot recall + +/obj/machinery/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) + makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) + + /obj/machinery/singularity/narsie/process() eat() if(!target || prob(5)) @@ -538,8 +540,11 @@ var/global/list/uneatable = list( if(istype(A,/mob/living/)) var/mob/living/C = A + if(C.client) + makeNewConstruct(/mob/living/simple_animal/construct/harvester, C, null, 1) C.spawn_dust() C.gib() + return if(isturf(A)) var/turf/T = A @@ -550,35 +555,33 @@ var/global/list/uneatable = list( if(prob(20)) T.ChangeTurf(/turf/simulated/wall/cult) return + /obj/machinery/singularity/narsie/ex_act() //No throwing bombs at it either. --NEO return + /obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO var/list/cultists = list() - for(var/datum/mind/cult_nh_mind in ticker.mode.cult) - if(!cult_nh_mind.current) - continue - if(cult_nh_mind.current.stat) - continue - var/turf/pos = get_turf(cult_nh_mind.current) - if(pos.z != src.z) - continue - cultists += cult_nh_mind.current - if(cultists.len) - acquire(pick(cultists)) - return - //If there was living cultists, it picks one to follow. - for(var/mob/living/carbon/human/food in living_mob_list) - if(food.stat) - continue + var/list/noncultists = list() + for(var/mob/living/carbon/food in living_mob_list) //we don't care about constructs or cult-Ians or whatever. cult-monkeys are fair game i guess var/turf/pos = get_turf(food) if(pos.z != src.z) continue - cultists += food - if(cultists.len) - acquire(pick(cultists)) - return - //no living cultists, pick a living human instead. + + if(iscultist(food)) + cultists += food + else + noncultists += food + + if(cultists.len) //cultists get higher priority + acquire(pick(cultists)) + return + + if(noncultists.len) + acquire(pick(noncultists)) + return + + //no living humans, follow a ghost instead. for(var/mob/dead/observer/ghost in player_list) if(!ghost.client) continue @@ -589,7 +592,7 @@ var/global/list/uneatable = list( if(cultists.len) acquire(pick(cultists)) return - //no living humans, follow a ghost instead. + /obj/machinery/singularity/narsie/proc/acquire(var/mob/food) target << "\blue NAR-SIE HAS LOST INTEREST IN YOU" From d46a7831ce6e28760b7bbfa99ef0edd2257691a6 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Wed, 11 Jun 2014 15:04:21 -0500 Subject: [PATCH 07/36] Update construct_spells.dm updated spell name/description --- code/datums/spells/construct_spells.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm index 3f1512bb4f5..7e4221f9a03 100644 --- a/code/datums/spells/construct_spells.dm +++ b/code/datums/spells/construct_spells.dm @@ -113,8 +113,8 @@ /obj/effect/proc_holder/spell/targeted/smoke/disable - name = "Disabling Smoke" - desc = "This spell spawns a cloud of disabling smoke." + name = "Paralysing Smoke" + desc = "This spell spawns a cloud of paralysing smoke." school = "conjuration" charge_max = 200 @@ -126,4 +126,4 @@ cooldown_min = 20 //25 deciseconds reduction per rank smoke_spread = 3 - smoke_amt = 10 \ No newline at end of file + smoke_amt = 10 From 9107668cec503ccb40bce192f5a59fe3281c4ace Mon Sep 17 00:00:00 2001 From: Giacomand Date: Wed, 11 Jun 2014 21:18:08 +0100 Subject: [PATCH 08/36] New configuration option for how many objectives traitors get, on top of their escape/hijack objective. Defaults to 2. --- code/controllers/configuration.dm | 3 +++ code/game/gamemodes/traitor/traitor.dm | 21 +++++++++++---------- config/game_options.txt | 4 ++++ 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index a4c1fac1f53..b029d0b7390 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -77,6 +77,7 @@ var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors var/changeling_scaling_coeff = 7 //how much does the amount of players get divided by to determine changelings + var/traitor_objectives_amount = 2 var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. @@ -344,6 +345,8 @@ config.traitor_scaling_coeff = text2num(value) if("changeling_scaling_coeff") config.changeling_scaling_coeff = text2num(value) + if("traitor_objectives_amount") + config.traitor_objectives_amount = text2num(value) if("probability") var/prob_pos = findtext(value, " ") var/prob_name = null diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 42d1fa7d398..2849e97d70b 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -116,16 +116,17 @@ assign_exchange_role(exchange_red,"red") assign_exchange_role(exchange_blue,"blue") else - if(prob(50)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective + for(var/i = 0, i < config.traitor_objectives_amount, i++) + if(prob(50)) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = traitor + kill_objective.find_target() + traitor.objectives += kill_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = traitor + steal_objective.find_target() + traitor.objectives += steal_objective if(prob(90)) if (!(locate(/datum/objective/escape) in traitor.objectives)) diff --git a/config/game_options.txt b/config/game_options.txt index b9ca7e763ca..d01a6f3a8a9 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -114,6 +114,10 @@ SHUTTLE_REFUEL_DELAY 12000 TRAITOR_SCALING_COEFF 6 CHANGELING_SCALING_COEFF 7 +# The number of objectives traitors get. +# Not including escaping/hijacking. +TRAITOR_OBJECTIVES_AMOUNT 2 + ## Uncomment to prohibit jobs that start with loyalty ## implants from being most antagonists. #PROTECT_ROLES_FROM_ANTAGONIST From 2f03f0fabd602cf19121de0e2748b3229b1ecf0d Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 12 Jun 2014 23:06:42 +0200 Subject: [PATCH 09/36] Door Assembly exploit fix --- code/game/objects/structures/door_assembly.dm | 61 +++++++++++-------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 553122c43fb..f447bc1f405 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -318,8 +318,10 @@ obj/structure/door_assembly /obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen)) var/t = copytext(stripped_input(user, "Enter the name for the door.", src.name, src.created_name),1,MAX_NAME_LEN) - if(!t) return - if(!in_range(src, usr) && src.loc != usr) return + if(!t) + return + if(!in_range(src, usr) && src.loc != usr) + return created_name = t return @@ -343,7 +345,8 @@ obj/structure/door_assembly icontype = input(user, "Please select a paintjob for this airlock.") in optionlist - if((!in_range(src, usr) && src.loc != usr) || !WT.use(user)) return + if((!in_range(src, usr) && src.loc != usr) || !WT.use(user)) + return var/has_solid = 0 var/has_glass = 0 switch(icontype) @@ -414,7 +417,7 @@ obj/structure/door_assembly if(mineral && mineral != "glass") mineral = null //I know this is stupid, but until we change glass to a boolean it's how this code works. - user << "\blue You change the paintjob on the airlock assembly." + user << " You change the paintjob on the airlock assembly." else if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) var/obj/item/weapon/weldingtool/WT = W @@ -423,8 +426,9 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) - if(!src || !WT.isOn()) return - user << "\blue You've dissasembled the airlock assembly." + if(!src || !WT.isOn()) + return + user << " You've disassembled the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) if (mineral) if (mineral == "glass") @@ -435,7 +439,7 @@ obj/structure/door_assembly new M(get_turf(src)) qdel(src) else - user << "\blue You need more welding fuel to dissassemble the airlock assembly." + user << " You need more welding fuel to dissassemble the airlock assembly." return else if(istype(W, /obj/item/weapon/wrench) && !anchored ) @@ -443,8 +447,9 @@ obj/structure/door_assembly user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.") if(do_after(user, 40)) - if(!src) return - user << "\blue You've secured the airlock assembly." + if(!src || src.anchored ) + return + user << " You've secured the airlock assembly." src.name = "secured airlock assembly" src.anchored = 1 @@ -452,8 +457,9 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.") if(do_after(user, 40)) - if(!src) return - user << "\blue You've unsecured the airlock assembly." + if(!src || !src.anchored ) + return + user << " You've unsecured the airlock assembly." src.name = "airlock assembly" src.anchored = 0 @@ -461,10 +467,11 @@ obj/structure/door_assembly var/obj/item/stack/cable_coil/coil = W user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.") if(do_after(user, 40)) - if(!src) return + if(!src) + return coil.use(1) src.state = 1 - user << "\blue You've wired the airlock assembly." + user << " You've wired the airlock assembly." src.name = "wired airlock assembly" else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 ) @@ -472,8 +479,9 @@ obj/structure/door_assembly user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") if(do_after(user, 40)) - if(!src) return - user << "\blue You've cut the wires from the airlock assembly." + if(!src || src.state != 1 ) + return + user << " You've cut the wires from the airlock assembly." new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = 0 src.name = "secured airlock assembly" @@ -485,8 +493,9 @@ obj/structure/door_assembly W.loc = src if(do_after(user, 40)) - if(!src) return - user << "\blue You've installed the airlock electronics." + if(!src || src.state != 1 ) + return + user << " You've installed the airlock electronics." src.state = 2 src.name = "near finished airlock assembly" src.electronics = W @@ -500,8 +509,9 @@ obj/structure/door_assembly user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove the electronics from the airlock assembly.") if(do_after(user, 40)) - if(!src) return - user << "\blue You've removed the airlock electronics." + if( !src || src.state != 2 ) + return + user << " You've removed the airlock electronics." src.state = 1 src.name = "wired airlock assembly" var/obj/item/weapon/airlock_electronics/ae @@ -519,7 +529,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.") if(do_after(user, 40)) - user << "\blue You've installed reinforced glass windows into the airlock assembly." + user << " You've installed reinforced glass windows into the airlock assembly." G.use(1) mineral = "glass" name = "near finished window airlock assembly" @@ -541,7 +551,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] adds [G.name] to the airlock assembly.", "You start to install [G.name] into the airlock assembly.") if(do_after(user, 40)) - user << "\blue You've installed [M] plating into the airlock assembly." + user << " You've installed [M] plating into the airlock assembly." G.use(2) mineral = "[M]" name = "near finished [M] airlock assembly" @@ -552,11 +562,12 @@ obj/structure/door_assembly else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 ) playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << "\blue You start finishing the airlock." + user.visible_message("[user] finishes the airlock.", "You start finishing the airlock.") if(do_after(user, 40)) - if(!src) return - user << "\blue You've finished the airlock." + if(!src) + return + user << " You've finished the airlock." var/obj/machinery/door/airlock/door if(mineral == "glass") door = new src.glass_type( src.loc ) @@ -580,4 +591,4 @@ obj/structure/door_assembly icon_state = "[base_icon_state][state]" //This updates the icon_state. They are named as "door_as1_eng" where the 1 in that example //represents what state it's in. So the most generic algorithm for the correct updating of - //this is simply to change the number. \ No newline at end of file + //this is simply to change the number. From 0b4387f031e647c2ce599a6f21c236f63928df7d Mon Sep 17 00:00:00 2001 From: Hornygranny Date: Thu, 12 Jun 2014 14:52:53 -0700 Subject: [PATCH 10/36] removes gravity failure event placeholder --- code/modules/admin/admin.dm | 1 - code/modules/admin/topic.dm | 7 ------- 2 files changed, 8 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f08e6bffef1..7a7d7c45166 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -434,7 +434,6 @@ var/global/floorIsLava = 0 dat += {" 'Random' Events

- Trigger a gravity-failure event
Spawn a wave of meteors (aka lagocolyptic shower)
Spawn a vortex anomaly
Spawn a gravitational anomaly
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index f9fcfb99bf8..25510344edc 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1584,13 +1584,6 @@ usr.client.triple_ai() feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","TriAI") - if("gravity") - alert("WIP - event unavailable") -/* E = new /datum/round_event/weightless() - log_admin("[key_name(usr)] triggered a gravity-failure event.", 1) - message_admins("\blue [key_name_admin(usr)] triggered a gravity-failure event.", 1) - feedback_inc("admin_secrets_fun_used",1) - feedback_add_details("admin_secrets_fun_used","Grav") */ if("power") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","P") From 8796e6e914ef6d7317d14f36a26dc14adc69aa25 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Fri, 13 Jun 2014 08:48:14 -0500 Subject: [PATCH 11/36] Update singularity.dm smoke effect when ghosts arise as harvesters --- code/modules/power/singularity/singularity.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index ef84ff36073..3d2c161a28f 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -496,6 +496,7 @@ /obj/machinery/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob) makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1) + new /obj/effect/effect/sleep_smoke(user.loc) /obj/machinery/singularity/narsie/process() From 6d1bfb9244fbf43aa6ff018040d5484bc2f43b76 Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 19:38:15 +0200 Subject: [PATCH 12/36] removing !src checks --- code/game/objects/structures/door_assembly.dm | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index f447bc1f405..e6518e44186 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -426,7 +426,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) - if(!src || !WT.isOn()) + if( !WT.isOn() ) return user << " You've disassembled the airlock assembly." new /obj/item/stack/sheet/metal(get_turf(src), 4) @@ -447,7 +447,7 @@ obj/structure/door_assembly user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.") if(do_after(user, 40)) - if(!src || src.anchored ) + if( src.anchored ) return user << " You've secured the airlock assembly." src.name = "secured airlock assembly" @@ -457,7 +457,7 @@ obj/structure/door_assembly playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.") if(do_after(user, 40)) - if(!src || !src.anchored ) + if( !src.anchored ) return user << " You've unsecured the airlock assembly." src.name = "airlock assembly" @@ -467,8 +467,6 @@ obj/structure/door_assembly var/obj/item/stack/cable_coil/coil = W user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.") if(do_after(user, 40)) - if(!src) - return coil.use(1) src.state = 1 user << " You've wired the airlock assembly." @@ -479,7 +477,7 @@ obj/structure/door_assembly user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.") if(do_after(user, 40)) - if(!src || src.state != 1 ) + if( src.state != 1 ) return user << " You've cut the wires from the airlock assembly." new/obj/item/stack/cable_coil(get_turf(user), 1) @@ -493,7 +491,7 @@ obj/structure/door_assembly W.loc = src if(do_after(user, 40)) - if(!src || src.state != 1 ) + if( src.state != 1 ) return user << " You've installed the airlock electronics." src.state = 2 @@ -509,7 +507,7 @@ obj/structure/door_assembly user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove the electronics from the airlock assembly.") if(do_after(user, 40)) - if( !src || src.state != 2 ) + if( src.state != 2 ) return user << " You've removed the airlock electronics." src.state = 1 @@ -565,8 +563,6 @@ obj/structure/door_assembly user.visible_message("[user] finishes the airlock.", "You start finishing the airlock.") if(do_after(user, 40)) - if(!src) - return user << " You've finished the airlock." var/obj/machinery/door/airlock/door if(mineral == "glass") From 1152a5b0993ffb22a7c356e5cd97c97a1d27c7de Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:03:59 +0200 Subject: [PATCH 13/36] attack message simple animals --- .../mob/living/simple_animal/simple_animal.dm | 48 ++++++++----------- 1 file changed, 19 insertions(+), 29 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bf2a8a17afd..38916358259 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -245,8 +245,7 @@ return if(act) if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P - for (var/mob/O in viewers(src, null)) - O.show_message("[src] [act].") + visible_message("[src] [act].") /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob) @@ -255,8 +254,8 @@ else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("\red \The [M] [M.attacktext] [src]!", 1) + visible_message("\The [M] [M.attacktext] [src]!", \ + "\The [M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) @@ -276,9 +275,7 @@ if("help") if (health > 0) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\blue [M] [response_help] [src].") + visible_message(" [M] [response_help] [src].") if("grab") if (M == src || anchored) @@ -294,15 +291,11 @@ LAssailant = M - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) + visible_message("[M] has grabbed [src] passively!") if("harm", "disarm") adjustBruteLoss(harm_intent_damage) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\red [M] [response_harm] [src]!") + visible_message("[M] [response_harm] [src]!") return @@ -312,9 +305,7 @@ if ("help") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1) + visible_message("[M] caresses [src] with its scythe like arm.") if ("grab") if(M == src || anchored) return @@ -329,13 +320,12 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) + visible_message("[M] has grabbed [src] passively!") if("harm", "disarm") var/damage = rand(15, 30) - visible_message("\red [M] has slashed at [src]!") + visible_message("[M] has slashed at [src]!", \ + "[M] has slashed at [src]!") adjustBruteLoss(damage) return @@ -344,13 +334,14 @@ switch(L.a_intent) if("help") - visible_message("\blue [L] rubs it's head against [src]") + visible_message("[L] rubs its head against [src].") else var/damage = rand(5, 10) - visible_message("\red [L] bites [src]!") + visible_message("[L] bites [src]!", \ + "[L] bites [src]!") if(stat != DEAD) L.amount_grown = min(L.amount_grown + damage, L.max_grown) @@ -364,7 +355,8 @@ if(M.Victim) return // can't attack while eating! - visible_message("\red [M.name] glomps [src]!") + visible_message("[M.name] glomps [src]!", \ + "[M.name] glomps [src]!") var/damage = rand(1, 3) @@ -391,18 +383,16 @@ MED.amount -= 1 if(MED.amount <= 0) qdel(MED) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\blue [user] applies [MED] on [src]") + visible_message(" [user] applies [MED] on [src].") return else - user << "\blue [MED] won't help at all." + user << " [MED] won't help at all." return else - user << "\blue [src] is at full health." + user << " [src] is at full health." return else - user << "\blue [src] is dead, medical items won't bring it back to life." + user << " [src] is dead, medical items won't bring it back to life." return else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead. if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch)) From 6817e93aebc44bb515783385eeaef3881e193981 Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:05:05 +0200 Subject: [PATCH 14/36] attack message monkey --- .../mob/living/carbon/monkey/monkey.dm | 83 ++++++++----------- 1 file changed, 35 insertions(+), 48 deletions(-) diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d1f94f76d29..e7492ba5f1c 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -77,8 +77,8 @@ if ((M.a_intent == "harm" && !( istype(wear_mask, /obj/item/clothing/mask/muzzle) ))) if ((prob(75) && health > 0)) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message("[M.name] bites [name]!", 1) + visible_message("[M.name] bites [name]!", \ + "[M.name] bites [name]!") var/damage = rand(1, 5) adjustBruteLoss(damage) health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() @@ -86,8 +86,8 @@ if(istype(D, /datum/disease/jungle_fever)) contract_disease(D,1,0) else - for(var/mob/O in viewers(src, null)) - O.show_message("[M.name] has attempted to bite [name]!", 1) + visible_message("[M.name] has attempted to bite [name]!", \ + "[M.name] has attempted to bite [name]!") return /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob) @@ -108,9 +108,8 @@ else if (M.a_intent == "harm") if (prob(75)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has punched [name]!", M), 1) + visible_message("[M] has punched [name]!", \ + "[M] has punched [name]!") playsound(loc, "punch", 25, 1, -1) var/damage = rand(5, 10) @@ -119,17 +118,15 @@ if ( (paralysis < 5) && (health > 0) ) Paralyse(rand(10, 15)) spawn( 0 ) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has knocked out [name]!", M), 1) + visible_message("[M] has knocked out [name]!", \ + "[M] has knocked out [name]!") return adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has attempted to punch [name]!", M), 1) + visible_message("[M] has attempted to punch [name]!", \ + "[M] has attempted to punch [name]!") else if (M.a_intent == "grab") if (M == src || anchored) @@ -144,22 +141,19 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [name] passively!", M), 1) + visible_message("[M] has grabbed [name] passively!") else if (!( paralysis )) if (prob(25)) Paralyse(2) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has pushed down [name]!", M), 1) + visible_message("[M] has pushed down [src]!", \ + "[M] has pushed down [src]!") else if(drop_item()) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has disarmed [name]!", M), 1) + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed [src]!") return /mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M as mob) @@ -173,9 +167,7 @@ switch(M.a_intent) if ("help") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1) + visible_message(" [M] caresses [src] with its scythe like arm.") if ("harm") if ((prob(95) && health > 0)) @@ -185,20 +177,17 @@ damage = rand(20, 40) if (paralysis < 15) Paralyse(rand(10, 15)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has wounded [name]!", M), 1) + visible_message("[M] has wounded [name]!", \ + "[M] has wounded [name]!") else - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has slashed [name]!", M), 1) + visible_message("[M] has slashed [name]!", \ + "[M] has slashed [name]!") adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has attempted to lunge at [name]!", M), 1) + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!") if ("grab") if (M == src || anchored) @@ -212,22 +201,19 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text("\red [] has grabbed [name] passively!", M), 1) + visible_message("[M] has grabbed [name] passively!") if ("disarm") playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) var/damage = 5 if(prob(95)) Weaken(10) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has tackled down [name]!", M), 1) + visible_message("[M] has tackled down [name]!", \ + "[M] has tackled down [name]!") else if(drop_item()) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[] has disarmed [name]!", M), 1) + visible_message("[M] has disarmed [name]!", \ + "[M] has disarmed [name]!") adjustBruteLoss(damage) updatehealth() return @@ -238,8 +224,8 @@ else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("[M] [M.attacktext] [src]!", 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) @@ -255,9 +241,8 @@ if (health > -100) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("The [M.name] glomps []!", src), 1) + visible_message("The [M.name] glomps [src]!", \ + "The [M.name] glomps [src]!") var/damage = rand(1, 3) @@ -285,7 +270,8 @@ if(M.powerlevel < 0) M.powerlevel = 0 - visible_message("[M] shocked [src]!", "[M] shocked [src]!") + visible_message("[M] shocked [src]!", \ + "[M] shocked [src]!") Weaken(power) if (stuttering < power) @@ -343,6 +329,7 @@ /mob/living/carbon/monkey/blob_act() if (stat != 2) + show_message("The blob attacks you!") adjustFireLoss(60) health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() if (prob(50)) @@ -360,4 +347,4 @@ return 0 /mob/living/carbon/monkey/canBeHandcuffed() - return 1 + return 1 From 19a9bab445d16deede19ebd0f148fa9b3767af8e Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:06:03 +0200 Subject: [PATCH 15/36] attack message slime --- .../mob/living/carbon/metroid/metroid.dm | 88 +++++++------------ 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index 3d1c6f8c70c..599f790d6b8 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -225,7 +225,7 @@ //paralysis += 1 - show_message(" The blob attacks you!") + show_message(" The blob attacks you!") adjustFireLoss(damage) @@ -237,7 +237,7 @@ return /mob/living/carbon/slime/attack_ui(slot) - return + return /mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob) if (!ticker) @@ -248,10 +248,8 @@ if (health > -100) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" The [M.name] has glomped []!", src), 1) - + visible_message(" The [M.name] has glomped [src]!", \ + " The [M.name] has glomped [src]!") var/damage = rand(1, 3) attacked += 5 @@ -271,8 +269,8 @@ else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message(" [M] [M.attacktext] [src]!", 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) attacked += 10 @@ -303,9 +301,8 @@ if (health > 0) attacked += 10 //playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [M.name] has attacked [src]!"), 1) + visible_message("[M.name] has attacked [src]!", \ + "[M.name] has attacked [src]!") adjustBruteLoss(rand(1, 3)) updatehealth() return @@ -325,15 +322,11 @@ if(Victim) if(Victim == M) if(prob(60)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(" [M] attempts to wrestle \the [name] off!", 1) + visible_message("[M] attempts to wrestle \the [name] off!") playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) else - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(" [M] manages to wrestle \the [name] off!", 1) + visible_message(" [M] manages to wrestle \the [name] off!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(prob(90) && !client) @@ -353,15 +346,11 @@ else if(prob(30)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(" [M] attempts to wrestle \the [name] off of [Victim]!", 1) + visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) else - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(" [M] manages to wrestle \the [name] off of [Victim]!", 1) + visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) if(prob(80) && !client) @@ -400,9 +389,7 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has grabbed [] passively!", M, src), 1) + visible_message("[M] has grabbed [src] passively!") else @@ -426,17 +413,14 @@ playsound(loc, "punch", 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has punched []!", M, src), 1) + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!") adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has attempted to punch []!", M, src), 1) + visible_message("[M] has attempted to punch [src]!") return @@ -452,9 +436,7 @@ switch(M.a_intent) if ("help") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1) + visible_message("[M] caresses [src] with its scythe like arm.") if ("harm") @@ -464,20 +446,17 @@ var/damage = rand(15, 30) if (damage >= 25) damage = rand(20, 40) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has attacked [name]!", M), 1) + visible_message("[M] has attacked [name]!", \ + "[M] has attacked [name]!") else - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has wounded [name]!", M), 1) + visible_message("[M] has wounded [name]!", \ + ")[M] has wounded [name]!") adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has attempted to lunge at [name]!", M), 1) + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!") if ("grab") if (M == src || anchored) @@ -491,8 +470,7 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - O.show_message(text(" [] has grabbed [name] passively!", M), 1) + visible_message(" [M] has grabbed [name] passively!") if ("disarm") playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) @@ -500,9 +478,8 @@ attacked += 10 if(prob(95)) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has tackled [name]!", M), 1) + visible_message("[M] has tackled [name]!", \ + "[M] has tackled [name]!") if(Victim || Target) Victim = null @@ -527,9 +504,8 @@ else drop_item() - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text(" [] has disarmed [name]!", M), 1) + visible_message("[M] has disarmed [name]!", + "[M] has disarmed [name]!") adjustBruteLoss(damage) updatehealth() return @@ -538,7 +514,7 @@ if(W.force > 0) attacked += 10 if(prob(25)) - user << "\red [W] passes right through [src]!" + user << "[W] passes right through [src]!" return if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? Discipline = 0 @@ -1047,9 +1023,9 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 /obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch() processing_objects.Remove(src) var/turf/T = get_turf(src) - src.visible_message("\blue The [name] pulsates and quivers!") + src.visible_message(" The [name] pulsates and quivers!") spawn(rand(50,100)) - src.visible_message("\blue The [name] bursts open!") + src.visible_message(" The [name] bursts open!") new/mob/living/carbon/slime(T) qdel(src) @@ -1065,4 +1041,4 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75 return else ..() -*/ \ No newline at end of file +*/ From d825ae0f92e08c5343bf8cabdd68ea7279122e9b Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:07:28 +0200 Subject: [PATCH 16/36] attack message alien larva --- .../mob/living/carbon/alien/larva/larva.dm | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 12b3713d6df..303f19e9b45 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -101,7 +101,7 @@ //paralysis += 1 - show_message("\red The blob attacks you!") + show_message("The blob attacks you!") adjustFireLoss(damage) @@ -117,8 +117,8 @@ if(M.melee_damage_upper == 0) M.emote("[M.friendly] [src]") else - for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) add_logs(M, src, "attacked", admin=0) @@ -146,9 +146,8 @@ return if (health > 0) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[M.name] bites [src]!"), 1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") adjustBruteLoss(rand(1, 3)) updatehealth() return @@ -163,9 +162,8 @@ if (health > -100) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] glomps []!", src), 1) + visible_message("The [M.name] glomps [src]!", \ + "The [M.name] glomps [src]!") var/damage = rand(1, 3) @@ -209,9 +207,7 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) + visible_message("[M] has grabbed [src] passively!") else var/damage = rand(1, 9) @@ -224,21 +220,19 @@ sleep(3) step_away(src,M,15) playsound(loc, "punch", 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has kicked []!", M, src), 1) + visible_message("[M] has kicked [src]!", \ + "[M] has kicked [src]!") if ((stat != DEAD) && (damage > 4.9)) Weaken(rand(5,10)) - for(var/mob/O in viewers(M, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has weakened []!", M, src), 1, "\red You hear someone fall.", 2) + visible_message("[M] has weakened [src]!", \ + "[M] has weakened [src]!", \ + "You hear someone fall.") adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has attempted to kick []!", M, src), 1) + visible_message("[M] has attempted to kick [src]!", \ + "[M] has attempted to kick [src]!") return /mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob) @@ -260,21 +254,18 @@ AdjustParalysis(-3) AdjustStunned(-3) AdjustWeakened(-3) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M.name] nuzzles [] trying to wake it up!", src), 1) + visible_message("[M.name] nuzzles [src] trying to wake it up!") else if (health > 0) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) var/damage = rand(1, 3) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[M.name] bites []!", src), 1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") adjustBruteLoss(damage) updatehealth() else - M << "\green [name] is too injured for that." + M << "[name] is too injured for that." return /mob/living/carbon/alien/larva/restrained() From 10ef6bf1b171f21863b470003e3210ed9e1f765e Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:08:27 +0200 Subject: [PATCH 17/36] attack message alien humanoid --- .../living/carbon/alien/humanoid/humanoid.dm | 67 +++++++------------ 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index ebe2a488d4f..b92d4c01cfd 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -94,7 +94,7 @@ if(shielded) damage /= 4 - show_message("\red The blob attacks!") + show_message("The blob attacks!") adjustFireLoss(damage) return @@ -120,9 +120,8 @@ return if (health > 0) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[M.name] bites [src]!"), 1) + visible_message("[M.name] bites [src]!", \ + "[M.name] bites [src]!") adjustBruteLoss(rand(1, 3)) updatehealth() return @@ -137,10 +136,8 @@ if (health > -100) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] glomps []!", src), 1) - + visible_message("The [M.name] glomps [src]!", \ + "The [M.name] glomps [src]!") var/damage = rand(1, 3) if(M.is_adult) @@ -167,9 +164,8 @@ if(M.powerlevel < 0) M.powerlevel = 0 - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] has shocked []!", src), 1) + visible_message("The [M.name] has shocked [src]!", \ + "The [M.name] has shocked [src]!") Weaken(power) if (stuttering < power) @@ -194,8 +190,8 @@ else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext] [src]!") var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) adjustBruteLoss(damage) updatehealth() @@ -229,9 +225,7 @@ LAssailant = M playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) + visible_message("[M] has grabbed [src] passively!") if ("harm") var/damage = rand(1, 9) @@ -244,42 +238,35 @@ sleep(3) step_away(src,M,15) playsound(loc, "punch", 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has punched []!", M, src), 1) + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!") if ((stat != DEAD) && (damage > 9||prob(5)))//Regular humans have a very small chance of weakening an alien. Weaken(1,5) - for(var/mob/O in viewers(M, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has weakened []!", M, src), 1, "\red You hear someone fall.", 2) + visible_message("[M] has weakened [src]!", \ + "[M] has weakened [src]!", \ + "You hear someone fall.") adjustBruteLoss(damage) updatehealth() else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has attempted to punch []!", M, src), 1) + visible_message("[M] has attempted to punch [src]!") if ("disarm") if (!lying) if (prob(5))//Very small chance to push an alien down. Weaken(2) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has pushed down []!", M, src), 1) + visible_message("[M] has pushed down [src]!", \ + "[M] has pushed down [src]!") else if (prob(50)) drop_item() playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has disarmed []!", M, src), 1) + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed [src]!") else playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has attempted to disarm []!", M, src), 1) + visible_message("[M] has attempted to disarm [src]!") return /*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. @@ -306,21 +293,19 @@ In all, this is a lot like the monkey code. /N AdjustParalysis(-3) AdjustStunned(-3) AdjustWeakened(-3) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\blue [M.name] nuzzles [] trying to wake it up!", src), 1) + visible_message("[M.name] nuzzles [src] trying to wake it up!") else if (health > 0) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) var/damage = rand(1, 3) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[M.name] bites []!", src), 1) + visible_message("[M.name] bites [src]!!", \ + "[M.name] bites [src]!!") + adjustBruteLoss(damage) updatehealth() else - M << "\green [name] is too injured for that." + M << "[name] is too injured for that." return From 04d37171934712de9a3838f06d8e7f4924409d3c Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 20:12:16 +0200 Subject: [PATCH 18/36] attack message Human --- code/modules/mob/living/carbon/human/human.dm | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7030742e370..765d8689bfd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -51,12 +51,12 @@ for(var/mob/M in range(tmob, 1)) if( ((M.pulling == tmob && ( tmob.restrained() && !( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, tmob.grabbed_by.len)) ) if ( !(world.time % 5) ) - src << "\red [tmob] is restrained, you cannot push past" + src << "[tmob] is restrained, you cannot push past." now_pushing = 0 return if( tmob.pulling == M && ( M.restrained() && !( tmob.restrained() ) && tmob.stat == 0) ) if ( !(world.time % 5) ) - src << "\red [tmob] is restraining [M], you cannot push past" + src << "[tmob] is restraining [M], you cannot push past." now_pushing = 0 return @@ -198,7 +198,7 @@ /mob/living/carbon/human/blob_act() if(stat == 2) return - show_message("\red The blob attacks you!") + show_message(" The blob attacks you!") var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone)) apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee")) @@ -211,8 +211,8 @@ else if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) - for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) + visible_message("[M] [M.attacktext] [src]!", \ + "[M] [M.attacktext]!") add_logs(M, src, "attacked", admin=0) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") @@ -227,9 +227,8 @@ if (health > -100) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] glomps []!", src), 1) + visible_message("The [M.name] glomps [src]!", \ + "The [M.name] glomps [src]!") var/damage = rand(1, 3) @@ -262,10 +261,8 @@ M.powerlevel -= 3 if(M.powerlevel < 0) M.powerlevel = 0 - - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red The [M.name] has shocked []!", src), 1) + visible_message("The [M.name] has shocked [src]!", \ + "The [M.name] has shocked [src]!") Weaken(power) if (stuttering < power) @@ -467,7 +464,7 @@ H.handle_regular_hud_updates() if(!modified) - usr << "\red Unable to locate a data core entry for this person." + usr << "Unable to locate a data core entry for this person." /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) @@ -516,4 +513,4 @@ if(obscured.len > 0) return obscured else - return null + return null From bc945b6c92d31718abdba120f8ee7ccff097dff6 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 13 Jun 2014 20:17:11 +0100 Subject: [PATCH 19/36] Fixes the gravity generator not updating your gravity status, so you stop floating. --- code/modules/power/gravitygenerator.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 95bb4dec398..e49459293f1 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -350,11 +350,13 @@ var/const/GRAV_NEEDS_WRENCH = 3 // Shake everyone on the z level to let them know that gravity was enagaged/disenagaged. /obj/machinery/gravity_generator/main/proc/shake_everyone() var/turf/our_turf = get_turf(src) - for(var/mob/M in player_list) + for(var/mob/M in mob_list) var/turf/their_turf = get_turf(M) - if(M.client && their_turf.z == our_turf.z) - shake_camera(M, 15, 1) - M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) + if(their_turf.z == our_turf.z) + M.update_gravity(M.mob_has_gravity()) + if(M.client) + shake_camera(M, 15, 1) + M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5) /obj/machinery/gravity_generator/main/proc/gravity_in_level() var/turf/T = get_turf(src) From 67ee39541b24575b0405e000c679146436c0dd46 Mon Sep 17 00:00:00 2001 From: Giacomand Date: Fri, 13 Jun 2014 21:04:54 +0100 Subject: [PATCH 20/36] Stops the objectives automatically giving you two of the same target. --- code/game/gamemodes/objective.dm | 36 +++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f29f7b9d1d2..5007a845681 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -13,10 +13,19 @@ datum/objective/New(var/text) datum/objective/proc/check_completion() return completed +datum/objective/proc/is_unique_objective(possible_target) + for(var/datum/objective/assassinate/O in owner.objectives) + if(O.get_target() == possible_target) + return 0 + return 1 + +datum/objective/proc/get_target() + return target + datum/objective/proc/find_target() var/list/possible_targets = list() for(var/datum/mind/possible_target in ticker.minds) - if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2)) + if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target)) possible_targets += possible_target if(possible_targets.len > 0) target = pick(possible_targets) @@ -255,21 +264,32 @@ datum/objective/steal var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives. +datum/objective/steal/get_target() + return steal_target + datum/objective/steal/New() ..() if(!possible_items.len)//Only need to fill the list when it's needed. init_subtypes(/datum/objective_item/steal,possible_items) datum/objective/steal/find_target() - return set_target(pick(possible_items)) + var/approved_targets = list() + for(var/datum/objective_item/possible_item in possible_items) + if(is_unique_objective(possible_item.targetitem)) + approved_targets += possible_item + return set_target(safepick(possible_items)) datum/objective/steal/proc/set_target(var/datum/objective_item/item) - targetinfo = item + if(item) + targetinfo = item - steal_target = targetinfo.targetitem - explanation_text = "Steal [targetinfo.name]." - dangerrating = targetinfo.difficulty - return steal_target + steal_target = targetinfo.targetitem + explanation_text = "Steal [targetinfo.name]." + dangerrating = targetinfo.difficulty + return steal_target + else + explanation_text = "Free objective" + return datum/objective/steal/proc/select_target() //For admins setting objectives manually. var/list/possible_items_all = possible_items+"custom" @@ -292,7 +312,7 @@ datum/objective/steal/proc/select_target() //For admins setting objectives manua return steal_target datum/objective/steal/check_completion() - if(!steal_target || !owner.current) return 0 + if(!steal_target) return 1 if(!isliving(owner.current)) return 0 var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. From 71c71367fe53c033bca3a57bb4485c70a86d44e5 Mon Sep 17 00:00:00 2001 From: Menshin Date: Fri, 13 Jun 2014 22:17:30 +0200 Subject: [PATCH 21/36] Fixes energy weapons drawing charges on click even when no shot was fired (fixes #3910). --- code/modules/projectiles/guns/energy.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 988d947a13e..fd063141789 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -33,20 +33,24 @@ /obj/item/weapon/gun/energy/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) - newshot() + newshot() //prepare a new shot ..() /obj/item/weapon/gun/energy/proc/newshot() - if (!ammo_type || !power_supply) return + if (!ammo_type || !power_supply) + return var/obj/item/ammo_casing/energy/shot = ammo_type[select] - if (!power_supply.use(shot.e_cost)) return - chambered = shot - chambered.newshot() + if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell... + chambered = shot //...prepare a new shot based on the current ammo type selected + chambered.newshot() return /obj/item/weapon/gun/energy/process_chamber() - chambered = null + if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired... + var/obj/item/ammo_casing/energy/shot = chambered + power_supply.use(shot.e_cost)//... drain the power_supply cell + chambered = null //either way, released the prepared shot return /obj/item/weapon/gun/energy/proc/select_fire(mob/living/user as mob) From c84f26a96d6d3f3e9a0ee3c5608c4606293ccd6b Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 22:36:36 +0200 Subject: [PATCH 22/36] Scanners messages fix --- code/game/objects/items/devices/scanners.dm | 98 ++++++++++----------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 996ce6ff0b1..d96eee665fe 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -78,16 +78,16 @@ MASS SPECTROMETER // 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 << "You stupidly try to analyze the floor's vitals!" + user.visible_message("[user] has analyzed the floor's vitals!") + user.show_message("Analyzing Results for The floor:\n\t Overall Status: Healthy", 1) + user.show_message("\t Damage Specifics: 0-0-0-0", 1) user.show_message("Key: Suffocation/Toxin/Burn/Brute", 1) user.show_message("Body Temperature: ???", 1) return - user.visible_message(text("[] has analyzed []'s vitals!", user, M)) + user.visible_message("[user] has analyzed [M]'s vitals.") healthscan(user, M, mode) @@ -102,21 +102,21 @@ MASS SPECTROMETER 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)) + var/mob_status = (M.stat > 1 ? "Deceased" : "[M.health]% healthy") if(M.status_flags & FAKEDEATH) 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("Analyzing Results for [M]:\n\t Overall Status: [mob_status]", 1) + user.show_message("\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("Time of Death: [M.tod]") + user.show_message("Time of Death: [M.tod]", 1) // Organ damage report if(istype(M, /mob/living/carbon/human) && mode == 1) @@ -131,26 +131,26 @@ MASS SPECTROMETER // 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) + user.show_message(text("[] | [] | [] | []", oxy_loss > 50 ? " Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal", tox_loss > 50 ? " Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal", fire_loss > 50 ? " Severe burn damage detected" : "Subject burn injury status O.K", brute_loss > 50 ? " Severe anatomical damage detected" : "Subject brute-force injury status O.K"), 1) if(M.getStaminaLoss()) - user.show_message(text("Subject appears to be suffering from fatigue."), 1) + user.show_message("Subject appears to be suffering from fatigue.", 1) if (M.getCloneLoss()) - user.show_message(text("Subject appears to have been imperfectly cloned."), 1) + user.show_message("Subject appears to have been imperfectly cloned.", 1) for(var/datum/disease/D in M.viruses) if(!D.hidden[SCANNER]) - user.show_message(text("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]")) + user.show_message("Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]", 1) if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) - user.show_message(text("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals."), 1) + user.show_message("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.", 1) if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain)) - user.show_message(text("Subject brain function is non-existant."), 1) + user.show_message("Subject brain function is non-existant.", 1) else if (M.getBrainLoss() >= 60) - user.show_message(text("Severe brain damage detected. Subject likely to have mental retardation."), 1) + user.show_message("Severe brain damage detected. Subject likely to have mental retardation.", 1) else if (M.getBrainLoss() >= 10) - user.show_message(text("Significant brain damage detected. Subject may have had a concussion."), 1) + user.show_message("Significant brain damage detected. Subject may have had a concussion.", 1) /obj/item/device/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -193,11 +193,11 @@ MASS SPECTROMETER var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() - user.show_message("\blue Results:", 1) + user.show_message(" Results:", 1) if(abs(pressure - ONE_ATMOSPHERE) < 10) - user.show_message("\blue Pressure: [round(pressure,0.1)] kPa", 1) + user.show_message(" Pressure: [round(pressure,0.1)] kPa", 1) else - user.show_message("\red Pressure: [round(pressure,0.1)] kPa", 1) + user.show_message(" Pressure: [round(pressure,0.1)] kPa", 1) if(total_moles) var/o2_concentration = environment.oxygen/total_moles var/n2_concentration = environment.nitrogen/total_moles @@ -206,27 +206,27 @@ MASS SPECTROMETER var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) if(abs(n2_concentration - N2STANDARD) < 20) - user.show_message("\blue Nitrogen: [round(n2_concentration*100)]%", 1) + user.show_message(" Nitrogen: [round(n2_concentration*100)]%", 1) else - user.show_message("\red Nitrogen: [round(n2_concentration*100)]%", 1) + user.show_message(" Nitrogen: [round(n2_concentration*100)]%", 1) if(abs(o2_concentration - O2STANDARD) < 2) - user.show_message("\blue Oxygen: [round(o2_concentration*100)]%", 1) + user.show_message(" Oxygen: [round(o2_concentration*100)]%", 1) else - user.show_message("\red Oxygen: [round(o2_concentration*100)]%", 1) + user.show_message(" Oxygen: [round(o2_concentration*100)]%", 1) if(co2_concentration > 0.01) - user.show_message("\red CO2: [round(co2_concentration*100)]%", 1) + user.show_message(" CO2: [round(co2_concentration*100)]%", 1) else - user.show_message("\blue CO2: [round(co2_concentration*100)]%", 1) + user.show_message(" CO2: [round(co2_concentration*100)]%", 1) if(plasma_concentration > 0.01) - user.show_message("\red Plasma: [round(plasma_concentration*100)]%", 1) + user.show_message(" Plasma: [round(plasma_concentration*100)]%", 1) if(unknown_concentration > 0.01) - user.show_message("\red Unknown: [round(unknown_concentration*100)]%", 1) + user.show_message(" Unknown: [round(unknown_concentration*100)]%", 1) - user.show_message("\blue Temperature: [round(environment.temperature-T0C)]°C", 1) + user.show_message(" Temperature: [round(environment.temperature-T0C)]°C", 1) src.add_fingerprint(user) return @@ -262,17 +262,17 @@ MASS SPECTROMETER if (user.stat) return if (crit_fail) - user << "\red This device has critically failed and is no longer functional!" + user << " This device has critically failed and is no longer functional!" return if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - user << "\red You don't have the dexterity to do this!" + user << " You don't have the dexterity to do this!" return if(reagents.total_volume) var/list/blood_traces = list() for(var/datum/reagent/R in reagents.reagent_list) if(R.id != "blood") reagents.clear_reagents() - user << "\red The sample was contaminated! Please insert another sample" + user.show_message(" The sample was contaminated! Please insert another sample.", 1) return else blood_traces = params2list(R.data["trace_chem"]) @@ -317,31 +317,31 @@ MASS SPECTROMETER /obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) if (!isslime(M)) - user << "This device can only scan slimes!" + user.show_message("This device can only scan slimes!", 1) return var/mob/living/carbon/slime/T = M - user.show_message("Slime scan results:") - user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby")) - user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition())) + user.show_message("Slime scan results:", 1) + user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1) + user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1) if (T.nutrition < T.get_starve_nutrition()) - user.show_message("Warning: slime is starving!") + user.show_message("Warning: slime is starving!", 1) else if (T.nutrition < T.get_hunger_nutrition()) - user.show_message("Warning: slime is hungry") - user.show_message("Electric change strength: [T.powerlevel]") - user.show_message("Health: [T.health]") + user.show_message("Warning: slime is hungry", 1) + user.show_message("Electric change strength: [T.powerlevel]", 1) + user.show_message("Health: [T.health]", 1) if (T.slime_mutation[4] == T.colour) - user.show_message("This slime does not evolve any further") + user.show_message("This slime does not evolve any further.", 1) else if (T.slime_mutation[3] == T.slime_mutation[4]) if (T.slime_mutation[2] == T.slime_mutation[1]) - user.show_message(text("Possible mutation: []", T.slime_mutation[3])) - user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting") + user.show_message("Possible mutation: [T.slime_mutation[3]]", 1) + user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting", 1) else - user.show_message(text("Possible mutations: [], [], [] (x2)", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3])) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting") + user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1) + user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) else - user.show_message(text("Possible mutations: [], [], [], []", T.slime_mutation[1], T.slime_mutation[2], T.slime_mutation[3], T.slime_mutation[4])) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting") + user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1) + user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) if (T.cores > 1) - user.show_message("Anomalious slime core amount detected") - user.show_message("Growth progress: [T.amount_grown]/10") \ No newline at end of file + user.show_message("Anomalious slime core amount detected", 1) + user.show_message("Growth progress: [T.amount_grown]/10", 1) From 920975dd68fe64a08bce2804572277e1819afca9 Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 13 Jun 2014 22:55:51 +0200 Subject: [PATCH 23/36] notice -> warning --- code/modules/reagents/reagent_containers.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index e23270bafc3..0f630190c1a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -62,9 +62,9 @@ var/who = (isnull(user) || eater == user) ? "your" : "their" if(istype(cover, /obj/item/clothing/mask/)) - user << "You have to remove [who] mask first!" + user << "You have to remove [who] mask first!" else - user << "You have to remove [who] helmet first!" + user << "You have to remove [who] helmet first!" return 0 - return 1 \ No newline at end of file + return 1 From 3f1837d21df183212dce63b91dae5ac560075e00 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Fri, 13 Jun 2014 23:01:28 -0500 Subject: [PATCH 24/36] Gives spells tablepass hurhurrrrhrurhurh lets make these things that act like projectiles but aren't at all hgluhbglbuhglbuhgbluhguhlgubhgblhhblgbh --- code/datums/spell.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 06bedadbd4d..f68552d77f6 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -8,6 +8,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin desc = "A wizard spell" panel = "Spells" anchored = 1 // Crap like fireball projectiles are proc_holders, this is needed so fireballs don't get blown back into your face via atmos etc. + pass_flags = PASSTABLE density = 0 opacity = 0 From f691c84983545e2abd837011df13d70ffa90bce7 Mon Sep 17 00:00:00 2001 From: Menshin Date: Sat, 14 Jun 2014 22:29:37 +0200 Subject: [PATCH 25/36] Span class. --- code/modules/projectiles/guns/energy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index fd063141789..f1ee2f12a74 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -60,7 +60,7 @@ var/obj/item/ammo_casing/energy/shot = ammo_type[select] fire_sound = shot.fire_sound if (shot.select_name) - user << "\red [src] is now set to [shot.select_name]." + user << "[src] is now set to [shot.select_name]." update_icon() return From fa98cdcad487e21647ff58ddd594f1c516f78dd2 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 16:32:26 -0600 Subject: [PATCH 26/36] Improved wording on the shuttle tracing announcement To help remove some ambiguity of what it means. --- code/controllers/shuttle_controller.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 0858a70f7f1..6e1c9a0a078 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -73,7 +73,7 @@ datum/shuttle_controller last_call_loc = null if(recall_count == 2) - priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace any further signals to their source. Results may be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') + priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results can be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') else priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") setdirection(-1) From 49b7ca26050444eb2a403c4ec1c73146c20a1b32 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 16:51:45 -0600 Subject: [PATCH 27/36] Updated the message on comms consoles --- code/game/machinery/computer/communications.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 4c5148c3dc8..7ab878e4c54 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -355,9 +355,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if (src.authenticated) if(emergency_shuttle.recall_count > 1) if(emergency_shuttle.last_call_loc) - dat += "
Latest emergency signal trace attempt successful.
Last signal origin: [format_text(emergency_shuttle.last_call_loc.name)].
" + dat += "
Last emergency shuttle call/recall traced to: [format_text(emergency_shuttle.last_call_loc.name)].
" else - dat += "
Latest emergency signal trace attempt failed.
" + dat += "
Last emergency shuttle call/recall trace failed.
" dat += "Logged in as: [auth_id]" dat += "
\[ Log Out \]
" dat += "
General Functions" From 46a60140c3610dc41c79ae85608faf7912427160 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 19:34:18 -0600 Subject: [PATCH 28/36] Resisting out of handcuffs should not update your icon properly The icon was being updated before the cuffs were removed --- code/modules/mob/living/living.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 707e55f0602..d952a5be3f9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -431,11 +431,11 @@ qdel(I) if(C.handcuffed) - C.update_inv_handcuffed(0) C.handcuffed = null + C.update_inv_handcuffed(0) else - C.update_inv_legcuffed(0) C.legcuffed = null + C.update_inv_legcuffed(0) /mob/living/proc/cuff_resist(obj/item/I, mob/living/carbon/C) From 9da454ed5766915fd51764cfaf9417b92bdc2dad Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 20:35:44 -0600 Subject: [PATCH 29/36] Changed Supply Status Display text from SUPPLY to CARGO So it fits inside the icon instead of clipping out of it --- code/game/machinery/status_display.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 9f85aa337b6..ed0b5bf6e4a 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -109,7 +109,7 @@ index2 -= message2_len update_display(line1, line2) if(4) // supply shuttle timer - var/line1 = "SUPPLY" + var/line1 = "CARGO" var/line2 if(supply_shuttle.moving) line2 = get_supply_shuttle_timer() From 49390f9e4d26eef81cdc6fefb8ee95faaef0bb5f Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 22:30:26 -0600 Subject: [PATCH 30/36] AIs are declared to world at round start -Roundstart and admin-transformed AIs are declared in the same way that Captains are when they sign up, after they rename themselves -IC built and admin-renamed AIs do not declare -Admin-renamed AIs will update their Eye name and PDAs properly -Flavoured up Captain declaration text --- code/__HELPERS/unsorted.dm | 14 +++++++++++++- code/game/jobs/job/captain.dm | 2 +- code/modules/mob/transform_procs.dm | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 5e8ceba95ba..82171d503bf 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -252,6 +252,15 @@ Turf and target are seperate in case you want to teleport some distance from a t if(isAI(src)) var/mob/living/silicon/ai/AI = src if(oldname != real_name) + if(AI.eyeobj) + AI.eyeobj.name = "[newname] (AI Eye)" + + // Set ai pda name + if(AI.aiPDA) + AI.aiPDA.owner = newname + AI.aiPDA.name = newname + " (" + AI.aiPDA.ownjob + ")" + + // Notify Cyborgs for(var/mob/living/silicon/robot/Slave in AI.connected_robots) Slave.show_laws() @@ -302,7 +311,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() //Last modified by Carn -/mob/proc/rename_self(var/role, var/allow_numbers=0) +/mob/proc/rename_self(var/role, var/allow_numbers=0, var/announce_ai=0) spawn(0) var/oldname = real_name @@ -347,6 +356,9 @@ Turf and target are seperate in case you want to teleport some distance from a t for(var/mob/living/silicon/robot/Slave in A.connected_robots) Slave.show_laws() + if(announce_ai) + world << "AI unit [newname] online." + if(cmptext("cyborg",role)) if(isrobot(src)) var/mob/living/silicon/robot/A = src diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 62b93744f17..bfa0a915c94 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -43,7 +43,7 @@ Captain L.imp_in = H L.implanted = 1 - world << "[H.real_name] is the captain!" + world << "Captain [H.real_name] on deck!" /datum/job/captain/get_access() return get_all_accesses() diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 03fb40fb3a9..d35b29060dc 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -257,7 +257,7 @@ O.job = "AI" - O.rename_self("ai",1) + O.rename_self("ai",1, 1) . = O qdel(src) return From 01407620db06871af94dbadb92ce114e3694a8ab Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sat, 14 Jun 2014 22:35:15 -0600 Subject: [PATCH 31/36] Forgot a hunk --- code/__HELPERS/unsorted.dm | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 82171d503bf..eaa4359ef74 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -339,23 +339,7 @@ Turf and target are seperate in case you want to teleport some distance from a t if(cmptext("ai",role)) if(isAI(src)) - var/mob/living/silicon/ai/A = src oldname = null//don't bother with the records update crap - //world << "[newname] is the AI!" - //world << sound('sound/AI/newAI.ogg') - // Set eyeobj name - if(A.eyeobj) - A.eyeobj.name = "[newname] (AI Eye)" - - // Set ai pda name - if(A.aiPDA) - A.aiPDA.owner = newname - A.aiPDA.name = newname + " (" + A.aiPDA.ownjob + ")" - - // Notify Cyborgs - for(var/mob/living/silicon/robot/Slave in A.connected_robots) - Slave.show_laws() - if(announce_ai) world << "AI unit [newname] online." From f491080ae2e6ab8c7be4bb30b9657060170d33b3 Mon Sep 17 00:00:00 2001 From: phil235 Date: Sun, 15 Jun 2014 21:46:38 +0200 Subject: [PATCH 32/36] Adding return 1 to atoms_movable.dm --- code/game/atoms_movable.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6d60e1c7835..22a06b41da6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -127,7 +127,10 @@ //done throwing, either because it hit something or it finished moving src.throwing = 0 - if(isobj(src)) src.throw_impact(get_turf(src)) + if(isobj(src)) + src.throw_impact(get_turf(src)) + + return 1 //Overlays @@ -152,4 +155,4 @@ /atom/movable/overlay/attack_hand(a, b, c) if (src.master) return src.master.attack_hand(a, b, c) - return \ No newline at end of file + return From c7c16f9ac77623231e8d27a2608e66ebd39df534 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sun, 15 Jun 2014 18:24:47 -0600 Subject: [PATCH 33/36] New sound for forcing airlocks to open/close sound/machines/airlockforced.ogg --- code/game/machinery/doors/airlock.dm | 5 +++++ sound/machines/airlockforced.ogg | Bin 0 -> 22214 bytes 2 files changed, 5 insertions(+) create mode 100644 sound/machines/airlockforced.ogg diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index fe8e972b78a..e8d184b4b88 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1024,6 +1024,8 @@ About the new airlock wires panel: playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density) src.closeOther.close() + else + playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1) if(autoclose && normalspeed) spawn(150) @@ -1060,6 +1062,9 @@ About the new airlock wires panel: playsound(src.loc, 'sound/items/bikehorn.ogg', 30, 1) else playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1) + else + playsound(src.loc, 'sound/machines/airlockforced.ogg', 30, 1) + var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) if(killthis) killthis.ex_act(2)//Smashin windows diff --git a/sound/machines/airlockforced.ogg b/sound/machines/airlockforced.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c249fb21e70faee2cc121701c3ac3f104df5359b GIT binary patch literal 22214 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±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
q1{#pJdg&=d-;0pQdkI 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 Date: Sun, 15 Jun 2014 18:38:14 -0600 Subject: [PATCH 34/36] Removed AI declarations --- code/__HELPERS/unsorted.dm | 4 +--- code/modules/mob/transform_procs.dm | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index eaa4359ef74..979f8042173 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -311,7 +311,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() //Last modified by Carn -/mob/proc/rename_self(var/role, var/allow_numbers=0, var/announce_ai=0) +/mob/proc/rename_self(var/role, var/allow_numbers=0) spawn(0) var/oldname = real_name @@ -340,8 +340,6 @@ Turf and target are seperate in case you want to teleport some distance from a t if(cmptext("ai",role)) if(isAI(src)) oldname = null//don't bother with the records update crap - if(announce_ai) - world << "AI unit [newname] online." if(cmptext("cyborg",role)) if(isrobot(src)) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index d35b29060dc..03fb40fb3a9 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -257,7 +257,7 @@ O.job = "AI" - O.rename_self("ai",1, 1) + O.rename_self("ai",1) . = O qdel(src) return From 041ae1a015e9312188505248d3edf0e5536369d3 Mon Sep 17 00:00:00 2001 From: ikarrus Date: Sun, 15 Jun 2014 18:48:50 -0600 Subject: [PATCH 35/36] Trimmed the end a little bit --- sound/machines/airlockforced.ogg | Bin 22214 -> 16204 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/sound/machines/airlockforced.ogg b/sound/machines/airlockforced.ogg index c249fb21e70faee2cc121701c3ac3f104df5359b..8f46a89fe3202b2c04ce11d30a6829876838c021 100644 GIT binary patch delta 12180 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 Date: Wed, 18 Jun 2014 20:59:03 +0200 Subject: [PATCH 36/36] removing the commented part --- code/game/objects/items/weapons/tanks/tanks.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 1cd70a97fe7..9c1e150c3e2 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -205,7 +205,6 @@ air_contents.react() pressure = air_contents.return_pressure() var/range = (pressure-TANK_FRAGMENT_PRESSURE)/TANK_FRAGMENT_SCALE - //range = min(range, MAX_EX_LIGHT_RANGE) --- handled in explosion.dm and prevented tachyon detectors fromstating true blast var/turf/epicenter = get_turf(loc) //world << "\blue Exploding Pressure: [pressure] kPa, intensity: [range]"