From 2e0513bb502d3e8452e5e1544745a3351dfd2e9a Mon Sep 17 00:00:00 2001 From: oranges Date: Sun, 1 Oct 2017 18:51:53 +1300 Subject: [PATCH 01/54] Fixes master --- code/game/gamemodes/cult/cult_structures.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index c1ccf9a368..ef51a2e01a 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -107,8 +107,19 @@ pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield if("Flagellant's Robe") pickedtype = /obj/item/clothing/suit/hooded/cultrobes/berserker +<<<<<<< HEAD if("Nar-Sien Hardsuit") pickedtype = /obj/item/clothing/suit/space/hardsuit/cult +======= + if("Bastard Sword") + if((world.time - SSticker.round_start_time) >= 12000) + pickedtype = /obj/item/twohanded/required/cult_bastard + else + cooldowntime = 12000 - (world.time - SSticker.round_start_time) + to_chat(user, "The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].") + cooldowntime = 0 + return +>>>>>>> e997bc4... Merge pull request #31198 from Jordie0608/apparentlythisbuildcompletedthefirsttimeidkhow if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time) cooldowntime = world.time + 2400 var/obj/item/N = new pickedtype(get_turf(src)) From 4e648765db9f674127f1546037f14d71df28ed41 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Tue, 3 Oct 2017 18:10:39 -0500 Subject: [PATCH 02/54] Ports dash weapons to the dash datum --- code/datums/action.dm | 4 + code/datums/dash_weapon.dm | 50 ++++++ code/game/gamemodes/cult/cult_items.dm | 167 ++++++++++++++++++ code/modules/mining/equipment/survival_pod.dm | 2 +- code/modules/ninja/energy_katana.dm | 100 ++++------- code/modules/ninja/outfit.dm | 2 +- code/modules/ninja/suit/suit.dm | 2 +- tgstation.dme | 1 + 8 files changed, 257 insertions(+), 71 deletions(-) create mode 100644 code/datums/dash_weapon.dm diff --git a/code/datums/action.dm b/code/datums/action.dm index a65294fa40..b0ee243978 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -591,3 +591,7 @@ var/mob/M = owner var/datum/language_holder/H = M.get_language_holder() H.open_language_menu(usr) +<<<<<<< HEAD +======= + +>>>>>>> 380413f... Ports dash weapons to the dash datum (#31222) diff --git a/code/datums/dash_weapon.dm b/code/datums/dash_weapon.dm new file mode 100644 index 0000000000..1637655d18 --- /dev/null +++ b/code/datums/dash_weapon.dm @@ -0,0 +1,50 @@ +/datum/action/innate/dash + name = "Dash" + desc = "Teleport to the targeted location." + icon_icon = 'icons/mob/actions/actions_items.dmi' + button_icon_state = "jetboot" + var/current_charges = 1 + var/max_charges = 1 + var/charge_rate = 250 + var/mob/living/carbon/human/holder + var/obj/item/dashing_item + var/dash_sound = 'sound/magic/blink.ogg' + var/recharge_sound = 'sound/magic/charge.ogg' + var/beam_effect = "blur" + var/phasein = /obj/effect/temp_visual/dir_setting/ninja/phase + var/phaseout = /obj/effect/temp_visual/dir_setting/ninja/phase/out + +/datum/action/innate/dash/Grant(mob/user, obj/dasher) + . = ..() + dashing_item = dasher + holder = user + +/datum/action/innate/dash/IsAvailable() + if(current_charges > 0) + return TRUE + else + return FALSE + +/datum/action/innate/dash/Activate() + dashing_item.attack_self(holder) //Used to toggle dash behavior in the dashing item + +/datum/action/innate/dash/proc/Teleport(mob/user, atom/target) + if(!IsAvailable()) + return + var/turf/T = get_turf(target) + if(target in view(user.client.view, get_turf(user))) + var/obj/spot1 = new phaseout(get_turf(user), user.dir) + user.forceMove(T) + playsound(T, dash_sound, 25, 1) + var/obj/spot2 = new phasein(get_turf(user), user.dir) + spot1.Beam(spot2,beam_effect,time=20) + current_charges-- + holder.update_action_buttons_icon() + addtimer(CALLBACK(src, .proc/charge), charge_rate) + +/datum/action/innate/dash/proc/charge() + current_charges = Clamp(current_charges + 1, 0, max_charges) + holder.update_action_buttons_icon() + if(recharge_sound) + playsound(dashing_item, recharge_sound, 50, 1) + to_chat(holder, "[src] now has [current_charges]/[max_charges] charges.") \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 55f8ece5e6..b6f25fc746 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -72,6 +72,173 @@ if(is_servant_of_ratvar(C) && C.reagents) C.reagents.add_reagent("heparin", 1) +<<<<<<< HEAD +======= +/obj/item/twohanded/required/cult_bastard + name = "bloody bastard sword" + desc = "An enormous sword used by Nar-Sien cultists to rapidly harvest the souls of non-believers." + w_class = WEIGHT_CLASS_HUGE + block_chance = 50 + throwforce = 20 + force = 35 + armour_penetration = 45 + throw_speed = 1 + throw_range = 3 + sharpness = IS_SHARP + light_color = "#ff0000" + attack_verb = list("cleaved", "slashed", "torn", "hacked", "ripped", "diced", "carved") + icon_state = "cultbastard" + item_state = "cultbastard" + hitsound = 'sound/weapons/bladeslice.ogg' + lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' + righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' + inhand_x_dimension = 64 + inhand_y_dimension = 64 + actions_types = list() + flags_2 = SLOWS_WHILE_IN_HAND_2 + var/datum/action/innate/dash/cult/jaunt + var/datum/action/innate/cult/spin2win/linked_action + var/spinning = FALSE + var/spin_cooldown = 250 + var/list/shards = list() + var/dash_toggled = TRUE + +/obj/item/twohanded/required/cult_bastard/Initialize() + . = ..() + set_light(4) + jaunt = new(src) + linked_action = new(src) + +/obj/item/twohanded/required/cult_bastard/can_be_pulled(user) + return FALSE + +/obj/item/twohanded/required/cult_bastard/attack_self(mob/user) + dash_toggled = !dash_toggled + if(dash_toggled) + to_chat(loc, "You raise the [src] and prepare to jaunt with it.") + else + to_chat(loc, "You lower the [src] and prepare to swing it normally.") + +/obj/item/twohanded/required/cult_bastard/pickup(mob/living/user) + . = ..() + if(!iscultist(user)) + if(!is_servant_of_ratvar(user)) + to_chat(user, "\"I wouldn't advise that.\"") + to_chat(user, "An overwhelming sense of nausea overpowers you!") + user.Dizzy(80) + user.Knockdown(30) + return + else + to_chat(user, "\"One of Ratvar's toys is trying to play with things [user.p_they()] shouldn't. Cute.\"") + to_chat(user, "A horrible force yanks at your arm!") + user.emote("scream") + user.apply_damage(30, BRUTE, pick("l_arm", "r_arm")) + user.Knockdown(50) + return + jaunt.Grant(user, src) + linked_action.Grant(user, src) + user.update_icons() + +/obj/item/twohanded/required/cult_bastard/dropped(mob/user) + . = ..() + linked_action.Remove(user) + jaunt.Remove(user) + user.update_icons() + +/obj/item/twohanded/required/cult_bastard/IsReflect() + if(spinning) + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) + return TRUE + else + ..() + +/obj/item/twohanded/required/cult_bastard/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(prob(final_block_chance)) + if(attack_type == PROJECTILE_ATTACK) + owner.visible_message("[owner] deflects [attack_text] with [src]!") + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 100, 1) + return TRUE + else + playsound(src, 'sound/weapons/parry.ogg', 75, 1) + owner.visible_message("[owner] parries [attack_text] with [src]!") + return TRUE + return FALSE + +/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) + . = ..() + if(dash_toggled) + jaunt.Teleport(user, target) + return + if(!proximity) + return + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.stat != CONSCIOUS) + var/obj/item/device/soulstone/SS = new /obj/item/device/soulstone(src) + SS.attack(H, user) + shards += SS + return + if(istype(target, /obj/structure/constructshell) && contents.len) + var/obj/item/device/soulstone/SS = contents[1] + if(istype(SS) && SS.transfer_soul("CONSTRUCT",target,user)) + qdel(SS) + +/datum/action/innate/dash/cult + name = "Rend the Veil" + desc = "Use the sword to shear open the flimsy fabric of this reality and teleport to your target." + icon_icon = 'icons/mob/actions/actions_cult.dmi' + button_icon_state = "phaseshift" + dash_sound = 'sound/magic/enter_blood.ogg' + recharge_sound = 'sound/magic/exit_blood.ogg' + beam_effect = "sendbeam" + phasein = /obj/effect/temp_visual/dir_setting/cult/phase + phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out + +/datum/action/innate/dash/cult/IsAvailable() + if(iscultist(holder) && current_charges) + return TRUE + else + return FALSE + + + +/datum/action/innate/cult/spin2win + name = "Geometer's Fury" + desc = "You draw on the power of the sword's ancient runes, spinning it wildly around you as you become immune to most attacks." + background_icon_state = "bg_demon" + button_icon_state = "sintouch" + var/cooldown = 0 + var/mob/living/carbon/human/holder + var/obj/item/twohanded/required/cult_bastard/sword + +/datum/action/innate/cult/spin2win/Grant(mob/user, obj/bastard) + . = ..() + sword = bastard + holder = user + +/datum/action/innate/cult/spin2win/IsAvailable() + if(iscultist(holder) && cooldown <= world.time) + return TRUE + else + return FALSE + +/datum/action/innate/cult/spin2win/Activate() + cooldown = world.time + sword.spin_cooldown + holder.changeNext_move(50) + holder.apply_status_effect(/datum/status_effect/sword_spin) + sword.spinning = TRUE + sword.block_chance = 100 + sword.slowdown += 1.5 + addtimer(CALLBACK(src, .proc/stop_spinning), 50) + holder.update_action_buttons_icon() + +/datum/action/innate/cult/spin2win/proc/stop_spinning() + sword.spinning = FALSE + sword.block_chance = 50 + sword.slowdown -= 1.5 + sleep(sword.spin_cooldown) + holder.update_action_buttons_icon() +>>>>>>> 380413f... Ports dash weapons to the dash datum (#31222) /obj/item/restraints/legcuffs/bola/cult name = "nar'sien bola" diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 5b8c40a976..bb44f22752 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -307,7 +307,7 @@ /obj/item/melee/supermatter_sword, /obj/item/shield/changeling, /obj/item/lava_staff, - /obj/item/dash/energy_katana, + /obj/item/energy_katana, /obj/item/hierophant_club, /obj/item/his_grace, /obj/item/gun/ballistic/minigun, diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 8901c1b9fa..33283db352 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -1,60 +1,4 @@ -/obj/item/dash - name = "abstract dash weapon" - var/max_charges = 3 - var/current_charges = 3 - var/charge_rate = 30 //In deciseconds - var/dash_toggled = TRUE - - var/bypass_density = FALSE //Can we beam past windows/airlocks/etc - - var/start_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase/out - var/end_effect_type = /obj/effect/temp_visual/dir_setting/ninja/phase - var/beam_icon_state = "blur" - var/dash_beam_type = /obj/effect/ebeam - -/obj/item/dash/proc/charge() - current_charges = Clamp(current_charges + 1, 0, max_charges) - if(istype(loc, /mob/living)) - to_chat(loc, "[src] now has [current_charges]/[max_charges] charges.") - -/obj/item/dash/attack_self(mob/user) - dash_toggled = !dash_toggled - to_chat(user, "You [dash_toggled ? "enable" : "disable"] the dash function on [src].") - -/obj/item/dash/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(dash_toggled) - dash(user, target) - return - -/obj/item/dash/proc/dash(mob/user, atom/target) - if(!current_charges) - return - - if(Adjacent(target)) - return - - if(target.density) - return - - var/turf/T = get_turf(target) - - if(!bypass_density) - for(var/turf/turf in getline(get_turf(user),T)) - for(var/atom/A in turf) - if(A.density) - return - - if(target in view(user.client.view, get_turf(user))) - var/obj/spot1 = new start_effect_type(T, user.dir) - user.forceMove(T) - playsound(T, 'sound/magic/blink.ogg', 25, 1) - playsound(T, "sparks", 50, 1) - var/obj/spot2 = new end_effect_type(get_turf(user), user.dir) - spot1.Beam(spot2, beam_icon_state,time = 2, maxdistance = 20, beam_type = dash_beam_type) - current_charges-- - addtimer(CALLBACK(src, .proc/charge), charge_rate) - -/obj/item/dash/energy_katana +/obj/item/energy_katana name = "energy katana" desc = "A katana infused with strong energy." icon_state = "energy_katana" @@ -73,23 +17,40 @@ sharpness = IS_SHARP max_integrity = 200 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - bypass_density = TRUE var/datum/effect_system/spark_spread/spark_system + var/datum/action/innate/dash/ninja/jaunt + var/dash_toggled = TRUE -/obj/item/dash/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters) +/obj/item/energy_katana/Initialize() + . = ..() + jaunt = new(src) + spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/item/energy_katana/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(dash_toggled) - return ..() + jaunt.Teleport(user, target) if(proximity_flag && (isobj(target) || issilicon(target))) spark_system.start() playsound(user, "sparks", 50, 1) playsound(user, 'sound/weapons/blade1.ogg', 50, 1) target.emag_act(user) +/obj/item/energy_katana/pickup(mob/living/user) + . = ..() + jaunt.Grant(user, src) + user.update_icons() + +/obj/item/energy_katana/dropped(mob/user) + . = ..() + jaunt.Remove(user) + user.update_icons() //If we hit the Ninja who owns this Katana, they catch it. //Works for if the Ninja throws it or it throws itself or someone tries //To throw it at the ninja -/obj/item/dash/energy_katana/throw_impact(atom/hit_atom) +/obj/item/energy_katana/throw_impact(atom/hit_atom) if(ishuman(hit_atom)) var/mob/living/carbon/human/H = hit_atom if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja)) @@ -100,7 +61,7 @@ ..() -/obj/item/dash/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0) +/obj/item/energy_katana/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0) if(!istype(user)) return forceMove(get_turf(user)) @@ -127,12 +88,15 @@ if(msg) to_chat(user, "[msg]") -/obj/item/dash/energy_katana/Initialize() - . = ..() - spark_system = new /datum/effect_system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) -/obj/item/dash/energy_katana/Destroy() +/obj/item/energy_katana/Destroy() QDEL_NULL(spark_system) return ..() + +/datum/action/innate/dash/ninja + current_charges = 3 + max_charges = 3 + charge_rate = 30 + recharge_sound = null + + diff --git a/code/modules/ninja/outfit.dm b/code/modules/ninja/outfit.dm index 4ec9cde23c..2fd732f0ce 100644 --- a/code/modules/ninja/outfit.dm +++ b/code/modules/ninja/outfit.dm @@ -12,7 +12,7 @@ l_pocket = /obj/item/grenade/plastic/x4 r_pocket = /obj/item/tank/internals/emergency_oxygen internals_slot = slot_r_store - belt = /obj/item/dash/energy_katana + belt = /obj/item/energy_katana implants = list(/obj/item/implant/explosive) diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 40d18951e6..1dcfed99c0 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -30,7 +30,7 @@ Contents: var/datum/effect_system/spark_spread/spark_system var/list/stored_research = list()//For stealing station research. var/obj/item/disk/tech_disk/t_disk//To copy design onto disk. - var/obj/item/dash/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability) + var/obj/item/energy_katana/energyKatana //For teleporting the katana back to the ninja (It's an ability) //Other articles of ninja gear worn together, used to easily reference them after initializing. var/obj/item/clothing/head/helmet/space/space_ninja/n_hood diff --git a/tgstation.dme b/tgstation.dme index 1d878fc78b..2dba779e78 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -257,6 +257,7 @@ #include "code\datums\browser.dm" #include "code\datums\callback.dm" #include "code\datums\cinematic.dm" +#include "code\datums\dash_weapon.dm" #include "code\datums\datacore.dm" #include "code\datums\datum.dm" #include "code\datums\datumvars.dm" From 460fea66c86b0277bf2e5f3e805fcbd987cbad7f Mon Sep 17 00:00:00 2001 From: bawhoppen Date: Wed, 4 Oct 2017 11:59:27 -0500 Subject: [PATCH 03/54] Moves all stack object sprites from items_and_weapons.dmi to their own file --- code/game/objects/items/stacks/medical.dm | 2 +- .../game/objects/items/stacks/sheets/mineral.dm | 2 +- code/game/objects/items/stacks/stack.dm | 1 + icons/obj/stack_objects.dmi | Bin 0 -> 27430 bytes 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 icons/obj/stack_objects.dmi diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 02d835da16..6c073f4b69 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -1,7 +1,7 @@ /obj/item/stack/medical name = "medical pack" singular_name = "medical pack" - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/stack_objects.dmi' amount = 6 max_amount = 6 w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 8056674074..2bb5d110fc 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -63,7 +63,7 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ /obj/item/stack/sheet/mineral/sandbags name = "sandbags" - icon = 'icons/obj/items_and_weapons.dmi' + icon = 'icons/obj/stack_objects.dmi' icon_state = "sandbags" singular_name = "sandbag" layer = LOW_ITEM_LAYER diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 3a79ce23db..6e7ffddeb3 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -8,6 +8,7 @@ * Stacks */ /obj/item/stack + icon = 'icons/obj/stack_objects.dmi' origin_tech = "materials=1" gender = PLURAL var/list/datum/stack_recipe/recipes diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f21c6c75797bf7f4c9307f0715e384c1fb8c849a GIT binary patch literal 27430 zcmb5VRajh2(=I%?!{7u75(qBAgIjP9?h**@7TjHe2X}XO1}A|exH}VqyA3eFKRnO- zetUlh``|x-t5^40y{fBfRo!=WPn4>%3>G>mIsgE`l9QEE2LRy2V1HDo$grN_PnBn| zi+OJi9XBZpS92F@CpT+H2LQk;J2h?GVTA+uVPRSu_@k9=TPSUr02`eh?+;FFB7bV6 zD$Tp%!e!&UFd)5s%>j0IVvy_b;M5#=8R`Y?2;l81^Sc{KG9Xd3I00>>4F9n^fwdgQ z3(XfizC0y!TJWZJ$WyqkUuFNGJgFTU5Rfb7Txo>R&0hNYCic!vQjrOl{EV&2MkxO! z0~pd*VeIGSimPnSRfpG|ii-R##m%I)kC)1+_8H7*v9N~@CN(rRK$vc^ddoFaF2@>O zq57%+vqU0N9_k086iuxUO9a&ncr3{FuQ`rh56*kC_Lu&;cc5ErUMjr3;IB6{X|ph0 znwir0yY+YFX2Vz)RmGt`U0Eos-fbN;6^-{VW?ut-bufjlXof$0mp`i$b!dVI{^ z_lmi>em9T1dEmo=^OrCBcsO`AHcHoiMm-eMqfeVw@ORuo*7x?n` zQSQx-AlLRP)ydzt8UO$lKu$_r!z=r!$GV<;;Y;aVcCxfv9lS20%_Lt_q5ek+P0F&#Ff(Y zw3X8DM09GT^6qwf(pVO8-SvYK{@A5-C);Nw3&W~)vkv7mWK>CXfZg8!E=K?%YOs1(nj!wY(@O~eONo#XkQE@IoL$NV<0u395HE@W)9;F z=fM23HB5XrC<+~9{!8_9Tk7mQAz)SLtPjD@{$bHPVFySad~$cejB>NqNL<7-0)YQ? zu*tPNn-Jrb@ii#~1?RjZAX(Ch#HQ_8KVbHH7?tsU{n?%(-+o1>H4X^B;Etek{TW+xWblg@&U}LVJ8QCjy z_dI)^EJf)v;jyuQ%+Bbq({e`tU^9oVTp+7cqn^#=yw|7Tcl_K6(2(cZ{Jg?D0fNx< zNR;caTpWU)4lPN5V|Zd;AEP$2HlS})<-5UkrQZX2ea zY1p=o7)TIY_I&=MN17~jr!a&GIS2@Ee_%%x%y9Nj-t|-)2L~&-0l)K$q4L#w9k~Dp zI=uiJ(6(k$zUkrbmtdDy_6oh1$ET+}$f0f=i3#(_rgE|KI%#2?z_9+#+W>ulKzs;* zh4IVNF!2v`30;KpYbg_5qWD9z5@mRK+t_!Z;$k|+MpasgF8q%QWy(1;3aCoK_!K^5 z&DO>G@1VKMKHxY$s)KkOI0>-BRtol(Jg7YzQfv#aEZ zqqU}8>0%&54a{IE60%Y1q@%5_H3Do8jp{Beep^*GucaPXRF`Vp(i6oJ{Ej5Z|_VJnRX&b5c;VR*F{i<}W zoZ-(snTJUS8%?!YHeT=P8+&33B$Fj6L*WLgFnzakH#|RLTlL@OEwJJcQjm z#mKY!({s8d-@=SdOpfDn(1l;9#bph>|E3LsxF4X z`L7ncp6ba_RvN!vPjJhdzQ>M#CuJIG7y+(_LtT<&u%#DJj{1`)5Q<2JBy{(SeofdN zb)O)#8Lo(jX&O}l`yXZLiyK_A*eR$w<-7%Gg+wNO{&-$Q8#BCjjliKsFe}CwJ0-gU zXYX|pb=u+M(2YwiW{vMELk5H=WMp9$k-N^s_H+v@#7<|Sp8XXSU-UX%1Q(V1Yg(A0 zV}fFDU5b_Y_M>V5?J;>+WB4Th$EoUKD7su*(>rdetC|3>F~5)K5^0DWi}8IpW+>$v z21TUEq4O?v3Sg@-2k@GE$Bo(RqFjuuTJPo@dc zlp}|8w~!Xn{&2MD$J%;m8jL=WGjQt{x&uVw zVX2#R6<8$-MB~8woK6@j@P5j94m?c{A1a0(RGkMfivaFYrdd!I$5LKjCq2GHx4ELZetO79Mh00TXl?+j(r`L00Wl>OdW1)F7 zxeT;cVpSzDz!25BixoE@;SSM34@!Yo73REy1&ixuB%Vo#C2hQ3zB>7=-157B>IqX4@d(i{jp z4~0KJ7YFlC4RE&_)+Id}XRm~6!3{JzN7DhF!wEIhIMgCr-$?!WctJo@-ta~F;(`vf z@N0diqGoy&3(j8ma~DGW`V3jX@wsGqGCqa2Fq*@kSSC!2KtpM@=OvdZH2^PI`Auy1P)_4PLSsJTsSgJuiVJWP@p?;xQ?9Y4$weH z&l<=)u8Lv)`R_8G!iYUTWd}bmK_UrlA|65X>ojonv(LgU2pyd3Rz%n`tUzVotlmES zO5@MR%$%TnX&n~a3_bEDf&$j`V8?Gcm*u3y%Gogcuc$Ld7kc#-&1XpbkHoU@8_%uUeO5{Y;sl>Tac(+NA_7;Frh(b~tQYbfD!u7;}ZY_TGG^p7!@@4$mUQZ2lYf{{f4p7ro?JHgT-kymZ;AGy*P ztqrzn>wsdhY~;-TAr9ro)hz#ezt_lxBF$_%ojT8oaUV0KWke+O7Q<*5$l7$oVATr~Ymbgp%{-lYvDR05T7E){TNGAz z`5B$bIt*KfQS`_UkKmT52ij(%I|x6QUIz_rg>J33#K;1k4;NWtd`L5Eb2P_te#?k) zC!)L>5u5<}RDpu(rL$jo3eWU8>bL?6vmC=}tuZWP&NNm2Un2J5Y_kd5W7dL)b^;Lt zO=U^K5yizw!ll%tNW%Swf2Q_?(j`jFf7F#TbCFtumrL%G;SL&|twSRtdI@l}S}rWK z^;7P6q`$`A@r8b(#oCru#F7u>Wqtr4ByuuXsJiP+$((vNKD+OY8V{0$9>X$TG-d&( zEJ6@`ffTsUc$%%Y=xeQH!=Hk}zzp4l0S&lu`vCX@^uEl~&*(4iKJ~A;f$%jv9>7g~ zA}v4i;&;e|A3|XgB1)MqlAv>!ds7^y+qNgAg*DTT8VhuzOQ`cU(ZMCmM?JtP;Gjt4 zWHSskXxQi|8^p^|WL?W)+`F6B9Ou7&;~bFqE}triS&?G|$VefnI-33$ZAJejaZ(CG zNvEUh1Y(#Jt{*F$6}a{o@;QX@6K=CusneMGhvCI*!motvHa0uC+QVqRxl)+BD+Ud6 z#Fl0J0K(q4*M9Kgqv}k^-V}f3PFuCmvC0`FKH#=ci7|fwBHH@<^HB)6S>+$sN&T9b zxNTmC!Az9sOBoRN^WWQm#~p-+n{_FI@Nxzl%wtZHW?or1J?oSTVrUfm54>sglvmg= z<*Suo6{wpajtptbSH}`_Gaz}35zo)Y6GXy6sbYOVhGZJPz7f~&0nI_G!w<3_qRU&K zlD%f0>asAl2yoNFz7jE^Q%9?cM`FK8BN~&%r}mAS5>QQ~sn)_Blc4E5fq_xqt0|db z6j6wHQH$l}-(MNx{|1BFYpJi82sT&23+8VTST+4NLa%@5KFpmyot#Gd)5B4Oz3q?E zVj_IHV1I7hy;dlh7CV31OZVuxdo&K%3Dk=2!$Aw7QntXdDncU+O&pL7n!lda(Sx(} zdihGp*c8cF5E6BqO~q@7jFZZ+5)U@QN>Y&<=8;8Jsq#rj7S?NLX%6$>StrkKOtiZ{ zYmbjRBNp{Hs>v6Hg(VTql)%r)V=Y_;*W;-qQ5`{o!0v0$6ezoo{gluk0Ax=_)TS}` zKY8t5>Z=%zRjjR|iIpPs&4M0Z{$m)suWA0YE2pzK{6IAoH=1&D9xtYOz_9WkNYJ!K zVoceD+0u=XwcOF4%D0SB<3aG|wDK7R66HnsNUGH8FpM|Sx;;fKZ;KgjGgrnf=)<7i z=}4TWMLKlJcWOO$->j$0&K5M%CwRX--e)oxIQ{TEu%xgU-?h-n;#L!@7Ol5r(rhMo zC)KN>Q-v2sEnZxqVG~*#Vyt`8`Mf}$lTG&zte6KU;ftq@q5tD)>QfH(d+saZ;LlhE z9?BYIXST>mrhJVR0^hHWj;Kq1_OVs3iSVCKSGfa5kYv_Ibm_oU#$H?W(4{ARl+5U= zj{?<7fsMi%toa(>BxK2LoPiWR2?cKpXc$YhvVcU~}sCp&7|{CstJ2xhvDd*<7lWp=Bo`mi^_^q6-IK!ca8(s>G2)LOh=a)V{9~>$@fM)F2ZDG{w z7U`svTw>|KCSsCy@6lMamksst2gq-R5TQVBlH>Nd6Yd+ccCCSSbhzv3hyjc)cVea@ zaJ=-?)OrKfzwG9m_&chtV&C}2jOQb^TJ%!)<(|* z`b>cjQ5+|_f{w-&C!kd)L;q*xsRSb;5wGKY^1e_FdGKq$tEt}b2O-F2$lViVu>W&V z*TeEN=w=a|KKC^7ag$BJZKANl;z>&pQTmmX%bUpNgPA}yv;jPFp&NLg=T9ExqQO;I z0|_GcXFO}~E#$Wm1 zvr?t3d4t`7FpNR;g&Jl3@2!W1Mo;Hwr{cmk^qr*$-Miy; z-Xe=lkL=+@;_K6B}Vv^1ia3G#`k=KAtprjUi-NUf72-1n)cV|1_U6zm)DdW z%BWWuru(Qy0v=9QK+-mRWpb14r+?JDEX)9ag(}Ob@Qr{?hfC2O$9O|NrE?r((Lq~` zN2O1kRsurU^viQ_>;H%B3*H_Lu@a)Cr!)Tkxv5>nA4bz+gH)zUTdl>YoXYRENe8P( zr2Bxp_xd=pO|J%u~aJ};&4IL_H!EC7?tJ!@=6L#l~$wS_J{ zCz6m5-x3a>;%;0@;I+X`7Km$dpIFAkoie$c`^=4qke4V&87K1C!=zfUc^EYH{SG*_69CQQsa z?kipqfrNa@G=J-da_%5XAfm{ydXx{yWv@?c-${YY(y}zNvfg=yCAATMgG?htpQVsy z@aGYxg{J*a*_k>6+zF~fhZas(vt(3L&!VtOYxD(yP-4RQ=Ak{*F50Qy{uRrjM~DdS zV7I8tJP=l@$qWbW*5q#SXEAB zd(!93cC$S4eJM?syv|MK#Dl+*vQlv{^=cYUQOLujktET`Sm{hG*Q3tNd7DH?W6sq> zJ+z3Oc(&;E>up*MXEy)FVk@QQ6(s2|+qrhOA` zyqHe#w1ekdYms`|{#p6_>4)Q0<3?W{Dm#=6spPNNbtPHroWmIl^SPlNWu_czst6?< z(r@fhnhP{8fCUBohJ{)fz}7h9>jwMu1DCjIjVLjGgt9^<`?IR@{7CFdjdWUp@_cv{ z{7{mj?FD~aLd>T(lUA|eo7H1Kquhg?h?EsIu{ukqc;YIp24b8AHS*PX;=-inHWr?& z9Iet}(OUk)j7^-NBE)@$fvQ=nTgrOxx4lC^(dAX=XCsX5YopU{BW(Z^C>YMJE)e(p zQD*Q0uN=twrWl){105G)myt|vl!E9V_b(%>h9q#yzSt5EzD<>CmZQludW^;k38f5Z zLXOjw?}YxrV1m2#Sg=;jY9n7A<+43ThaNRyCaQ#*rFe)*PVtjd+oBWOKyKP17tu8C z;tZaxo*CirSnJOlimt4;a1zJc#wTsYR%L3ERy7lQf24e-2JTMy%nywaX3v!jEB}Xz z$Em}WELlta!6%BA8lhKDl8`euRXf9Ka(%4{#?Fo|T`?*AN+&3F#}hd=J4VRHm^Bs* zzd~nFS?|SL+)7eSO5bjzJ0P*RY2U`>YDPgVBu$?dUXP76jiF`{f{r<5c69VOgF8S7 z`An$ANXuWRwIC%^%|gW;56ghuHmDXACxa%1ksOnuYJSVsROr5;=&Fe^Xz-YL_;(~0 zropJzf+RbmgX&j6>^?U#8YSQ>MOe8J7_Klj>@HDki?2kiw#>n`qxOx-q+@MDb&WQv z>~=vjCjzY$#Tv`WPsW;!l{Echzt^l*Mpu%d zO5@6AmI`=MTniw8fp^5=4kar>Di*Rb9SM>IiH6Wd^3qa_Sted1@oi~zItn|!z8eDr z3QA~5F|3d$B_6l0M5fll)RgtPoQ(}uRxQHZ2;^B`zEVgvJa}FOPz8gVOCr-<5PboH7z3O+qBroO_j9rB}EGLp37Hm&gr~` z*C$d(*Vr>p8L|3ce~w2o+*n~+2qbJrgDp7wp_~Se@SDc;R;w4qQBM(ql$4{2W~`2pb#L%0&bpq<9$ zC#(7S9|20JF{y-uG~gYxl$>}ah-lNQ5^JTr;j5^oG!ZfjutR^(v25Iq@?xLKYuys) z$Rh$-3=#WCV0?I_9N=g}ijPcS858M(Ri*=TpV(uQ2jqpEepUh$o$3I*_# zxM}C(7B)L{P#eOnb{2N+dX4WcE#c~mB2Aq-obb(9`OLC0_O*PL$6nF2dyn#UUV@a^;d_N0iTdJ8XrHHxnZ zcb{K&MWPC|fIuLcay&+p7MHU*asc&f=p2)TuIx}>h1Ewg8=mS4#@K4LMgEuup`&Sn z0)v5^%+e9~lhwBdqcSqPQ8teYuUSpsQ1q9aYQw&%94bt(tCi>S#LhI5 zsufP+dcY0#*L%->dC!G!uunzpZdTjr|1UR=e%lT#NOON|>d#0H#URz>35_9j?i88b zWs(b!$%!s?-x>%Tfs8shhrc^HUmV{VAtWyfSLOSUc&r%Ka`6=YSk_Cj)R9aIRwd;u zOtD(u>gE4D%rarCk>E*X%9lv*2|!YJf?i<$U&rp(E0?6nl#p?%Z1_d$X;!K=)P3*n zi&bi>S|#j4#9-a`4e`L&MX&_pby9|Yemg&u4rOHsee+ehoARiF|624mVcc(6{%SJ> zC;D0uUclz1`UaMTIg8He^~B@B!fPJ`-)(LGc`>1a{&MQ(H0gb*F8H$qf9t1Tr_cA} zC^yGFQ4GWy}0-Kco{NT`8 zUP*|dVTR5_9o^`^geNz_=_w|jzn3yO72g)+-&jSQTf>t^_K`ASNqPXU+iCm#`hA(; zy$AvwJ~1s-HX^F~bi0`*Q))vhQc@H~(vm@=d_=^))Qa^l+o0$FO>8UD($Q>q24I!7 zOI*)N>Si>{M#f!gVW%PYJ;5vS86iPd*%b z>4WMV9p=!{ogqCCh*ND9O+#fTRZZ#eM<g$iR3goEplwSK{Qdlq=0X-&U;-(lNxQtZA)%>QzWTZ=%0+)O()H(JFW ztrbk<57zYP)gCE^MxI%bJRo+bJb_+OgLHhd8+)cYtsUT)mJ(1e;_bCj|9gPz&Y1h0 zyyaTp3&|Rj|4#=Kib<_ON3Grt;DttMR*?t3P%xX8TIWFUET71=s`1(}2$HCx{K@lS zr(E)uh16o3v2S}E(nrK>4y?JKkU*k}zIkqD3DJdpuMBuj8z+yYov!Ra)GJI1^qF%}oBv@;+hl#9 zvf1_}L3JvrgGNhxGax*1Zf(8ef_=B!ggBQSJwKYV8{YC{%xkYrID|9UW~X85xnN7l z$F6zA%~MgQwvO9J!NAn60s4cR`^9k!k#lBITVx72|BJI2p^K@XB}1pP zX&%S&v##jbeKqa^+4Bn<&t)-oUF-G+?EK}g@Amu~Lnn**r)ZV&Y-<)mWXYOb@XG|C zjR3JK{Kwx50UREvDw$*_#iGw++CQ1=ddF<*dgcL&b-;GKZBLtV!&4v1nq&DYdcfPW zhlsj7UDq`jzHIr+f_peeE5@KekA8*On;c3hEn09wz&>! z$x$6T$11-a0PgAe9)>8LGCFUq?0AXBi|1_4Fe9?vLh84vkH^|DFX%9@k?>WLtpL*vnFV zi|^7}7ET;A>9kg#-g53}U@_CWav9XJ$iSvo=2jq1^B6=sDtQA;6Vn7wuz^Ua?6xC5 zyz%f}F|ES)y$|Z!Apx~ut!;a_<_a64aYlJYsbnixUG86be>>p$JGr{}&3xVsOOvO( z(IF4}`BDH{+?Scg&xPlsXQuLlL>Xx*5L|kjG8uHTfrU0TAEsLZS!X%1#Q0n^T5R+~TjA>eOI7LI${h-7jCkRkp^LngML zf}JoJMfalB)-kMG2Gh|t36iwNaFzLU{S}Vt_Hmjd}|PkqF0qEJ;yy&NTWB;EEX$<(s_#gt$Hi@#niE!4igLT0nd4C zE;IV2-lX{LP9o$Gy-mnPOTg0kV}mhi+H|Tv-FGN4g|pYQY18hAFvZMPxbz-Ok<0U8 za#K#Gakm;{VHN#`I-OVpMBl#WS0YnmiJN>?zP#nFe3H7wS^Mv+1RN&P2kg7ncYfOT zXL9w>o{<$JlNdKWeBJlB(<1`Pb1Oq?-D&okf64ft=O7F#Q7yuh|7VkL56B|Jot^t` z(Ag{s-+p%h2=Aj;XydGk|E)cs^aL@>aM3P6Fvyax`@Bqn*=YuuqLn=0`u4Zzobkw2 z9|F!d2NY;IY_+~tIHD$>oPBb!nKL%(2pwQqPW#6YQjX=P*TkXAa8?Fq$2(G!%9MA* zp4b-XwRh|S+Yo=nE;lc7aaV4f?bZu-<+GS}{)$e%lz> zM?2&gm(`4txeFolSj{EhtQVV4fCVr?`b>-aoUld@Gq8tg&N85gVkMIhu`xbRxkq2L zYwc6j;HTG-w{FB@@MYGdfje78$$%iJu6L;yu*W>gEqge*jhPx*fiA!%aw!3GRl#{Mb1R%!h|fWY{P{MYLP7s~H<4LAXd0HKS0m6)qT zqjb8uOUM_f(34G^9o1D{zz*}@DEd6RpR{n`h)MohQ}Py(n=PEIjwM|pB4W62Sve(} zUuJy+epz6|#7N%3{XM^gXxl&&0rfN0jo{Ep+CE2}O%;Dcq`Eer!?&WL;sL%dlc&B8 z*kg3U2Bq>A(nUbHwtP5wWDCT{0idoY!4#v8_I@vyFPb{|4Sz#d|J!HySWH zRitzXHMu?M-Nr!*v|W?4A-6#RF_+BHy>BYnYV+IuUFx1>@k3xx!xnmR4p#g%!B>;a zLM8)S8Gk38f1@4w`R4=*bLWNHm;1nx0c#EB-RpRwy1elaK1#t61=jOqSod>$k<4BH z$(qt3?f5)dz^3xomQ6lvRKp)<2$0Fg+pLa^SNXzFypj!l9ldR?yoXiQ<;3_6Z2zd~ z(>Nx7K?t2Zh_4cIyqV7MxL&^97Ghj@>>zi(Kug$CIKzK3eHnWi+%1S+U+@+oIq z32pSc?pDrveUnFElM8y$Os>kWi8}eXhzjn_Bm$k+qU&C@ySv&YBZC^GPIBl%K1Vv> zyX{)TDs`|a6IMGdQt!!P!^q`==doTYDb7dhK03y;U!(Cnxu9m-h5wm&!}-bze23$4 zYLrS^SJDgjZP3x3Od9t=@^-_q)p2e4rUx?w@L8|UrAUx9MK`g4q&1CV2Kjq<^HRw5eh-9E;sb-6O#Q|Ng>P<({$ya8HzVK z-jNXn+(*-lPMzk(A92n(Qo;=dkd!@R-43W=W>>y_>Fx z@FI~PWXpjs6OAeVtUfB~bppcVc;=b=+xY?vMXr+a}c;8)P(Kkl{K5JF`ol*dH0Qrcq;DOsTW z0QInTB!#VagY9_EJQns}Y0z=@e5ItPF5#VjSMzPjyAj9qo6@beT!`VnD{lN|(C=;- zOl1W%#Yb&rdK~pMOs`iu{-gtYsuK*GVvgc7)T82rAKa$kKKcq|SSk1$a;(1QzwN0Q zL=WeWBXlNaE}dFM=npJ|i|=u%bunx^_TJ|*Ci#F+M)_~t0o5Sb<*3mqpm?+lva7ie zA4bre;l_n-j#?KoO8QWT@r#$B z>i^lD0y&v5bh-s32T*kc4fQmBad%56JSozjuGRohJ|OsI`I-z83in$gJdF zW9ZM7_M6VbAJpFt<>x0IVsj72RJWmchCXZ8aXT;M&yrJU-_!rJ%^Ug55qg^UJwkQo zKo^!bcvAR913%V*<^wlq#m+Kq>yS*qBUlFAUe7mYif=OtD2TLTaHZ+#LB~w3I;Y z_2)_*TYO#(L6OpzXXCU}x&Km!q~7!k^n6&QtVawXI5`blMgIO_k^VNT%fE8+yhly! zY&=28%AupR&&7{z(qmJBT~cOIeN!eg_>FThwFa{OfVyUbY2{<}*rEN$G@kFKL#OYN zl(B0wPd&R2y$e*W^c=r2n!FC+KA+h?Ef(mnCO4@X_t`99j~*52*jV-3bvJDDf$G<_ z8Ls1yfS}()EC*A5x%FEv$C;w!k zyJ_`#KnLBE_9*#tZyF@;l~Oe~2Td{?HxT;sU`>$VdAtiZo@(OvYnWEx zT5e^o5Dy=zZ}`Ns++Z%b`a8?R&d%*SW*74NBM7YgAlET{=2N&+tN5c)`Q#I@W#l>R zjSQrU%)v^J{v}6)eE*;t+ehWWQabb@o_y=_C0{=d<8rgC2yE-VX0>no z0*>Q4w2}NgIsE%~oqI%tcKODrho$SxMc1hTSuh$T$<4Dfw}K7jnwxm0St!VO8xv!G z>{4okgpG}?)BsLL<1vlUTVuQ10K-O&%gfLfX=Eqb?3M>E0 zUv0?vQvU19$8Ypk`*~YNgmJnafmA!VS>ONQdVzEW`!YH)j*PGQF+k_EuB62v*SMC(z1jKHmv*p<5A4qbn-*!>(a7wv|>lX7541uM`e?ScXHochLF6u*E9uH!d zxLpmY2_Jv0Opd|pz6`G2#a4TTg;7`o;B`GzqM1;8au$*hITM4sVrl5G_I^B^F`Z#r z$mdfcm>6D}9Z@m0`Ymelb6as=3pa5(R;u3W*1H|_Xrt_#T>WzAUn6)QCbrc(9%|_D z&uDqR)9!eXPqiSFmi9A*%)YaZB|yb28IVW$NjrS{1Fm&Gb$U}lu-{*!#cEuz}XW=xloe#+NEwk%7n6<3yr7C$ZG1IFiUW)78k`u-L0Km!3L z7wpn`_!QQ(gjQ4WqhZ%4k0YQCwt&>z+&kg84H3F6=N$rpCZ#4k{T$8_6O_h(GSb=3 zjuJoQzHj~>RJ6<|?*E+WWF=tMphxS_|>S8e+h9GhpQ1n~dsnuo8J)m8m3D1-eV zFFmvwHGga5t5bZ7!TIC&G$C4R6yd>LA>f8XwP4(&7_ zI3V5paY+~~>w0BZbFNd#2vvRe(d8T4vR(GgBB!>=V9I#ut8_sR`@ivqSsj)iqe?Qj zC!;>R_+JI`H+L)-gY%i5iNga#x&Pp@<&Hs9#{b|w>s{=KlK(=y96|E5|DrmN6DMFC z*+23Kv}0w)5Knme*{w`=Om7@F3C;nSTLP2l8NVc5Do~H}{JJaoiZPCxM#s=e#6=fT z5j?2K=%3xIx;3=q@^QIK3yb5B^bh}b8+MN_e&Fr#hNInzL$O9pd>sXJY>uhb9%tv| ztma&w!dMUjgT7T@TNDrs3A_6qZ}RToD~k!f1832NMHnVJiR`Vz#$UrSbqicQhPG)&z*rxaI1PYC|$6N zx?DRD#`MC2a+j0$J2pQ%hNYhb)zTDB6{VT0rh4?hS$T3dV2+E*@8Vs8jOx~nUYrMk zISjcTRLV2p3>WSULOG=EiuuN$e)9%VY{4BZIN#ZX4rr%&zv=o9_N=6AiTU5SQ-)A< zil1unSU$nDdm{$6{GX2cIU^qM+Vm|7Vdh?~&)IHRN0Sn(F(8Xt7#d*~zR&ucEsZq^ z+XaRn$CFBwmS5x`H1<V)la*xBy1}SCU8VUpu`be%+jw#S0FW{bBO4mOCONMvSDkh-$QHA=g^aDz0H^G zezZ8<8}50LT|DD+sC)b8{gSg;=;-sNxuxWzO++%W*_i2JqlD6wgxG{aAKw90oWrOktsP&f7Jm|NHqZ7RTdPOe5IVZb`icXW` zv6Dr)IFqT=K_2r4DBf9J4Vo`HO)T~oU9uf%)xfd zzTp_DCWF=Tj1_7=8u`H@u~HYLXGCuXZv9^>!l1p~?N_Nmg9>l3VCbsbq5f(y?9X{q z+=dc3Q{Fb4OTyDN@Nxxl!%wZ=NB`lD1fN0}e14*@G^%IH2dfHpBByD=zcJBtv{6S` z>98nOLlAT`YhZ_bq6i>A_yJdnQ(XM{U5=T%J}>6Z%dB!C{Qdraamg2i#RWRLPkR}> zZfn9%dl%Q%h7VCa>~tULbrJ;0Ww7j$zzLGVbFf{OgVJk({_6q9Z0s|c0KdBZzZZC( z3ran9&+`FyCB4hSGWZ>z?x2DUv?E^1MLdYY*Jp-*dq8(m*!Sa#hnd(fXZ0F#y&<)& z)(&MmUeg)fxL zvVk0@J12*!{`3TA=OI8=elvOY8YTjpYh`14bd$^6;Okwg@i0&4g3h1aUIh(Mr}hN( za>&B-?(V|%traoXqkygl|0+tLJ(|Z4;;ilU2f=`E&&US?U$({ONRHL=0**TG+G>~i z{NVl(fmh}I(dxES0lAtB-3%M~d$Nt3KZ_ll&*Kpysn68X#UTj+BX+r2W-~VwDa7pC zMDkv_qa8E!aQrS8LZ|l&l;gJnl=7<@R4g}36A15gsF2rRU23&PQP$Y0dVPil9KRZx z^?A2bro+}9!=Y(t2+ zfYnD2I{VtOzf41iB4N%j_srIUdcfyuW;3>RSJc4u<#>DSQ?z`|DmFXHrvL#6Ax}t$asoo-+L{hAiV|Hs0|yE47m7F)kKSpr>(B3e3Q$%Px+)U#B<30sBdf6OfG z><*j?&e!T^9rE0+)CBK0`d?g3kp~-I-91C9q|p{>tpI1A>JunV`bPwm&J=zStjC?U zcl%TKBGzl8TEeZj%wpU8Xaqs_{7ScVj-0Vw_*X|^u2Y1(d7Jyx^(M`pP=0tiT>oZG z%}F>Rj_fZ`f`&B;%&(|2L0vNB9+M*9q|>TI5GHh81KPT(04o8HUInW7Z&6>yuOSgZ zNqnQwJ-8sGLokv7pjPr|cL#jq= zuu*H8dek|yFa7(CK_LT8`8-f!v;DQ{CO)!AYRQMOR3<(sG=QYMM|XirhC&o>T7T&B zSbNgbsq*g(dXSXD)N%H^hQkv=Y}=p(f_1FPKx5L-$6&r1xf)6T(|wR2ywjn*=h1qz z^&74xvNNGNI6+24)S#3kb!X(2bD#uOsFbWY!G~5|0=hB^vNV_|(P4lOU+eO4TA^?((#SNk^u{*TMTJw>S!@jf z6OdjKAd6#_ys?>Mnp@_a@ZF7C|G0_hD-cZ9TI=gbS_NOxv3nq64?KJ=gH`n=36-X8puJzq~t2nr$c%j~N~4z-9OTA~C6MwLBZ2VOE;t1~wimxF zB~sK5)u725AAU^-MJN5u12h1t*)-vwn|yyGEuSqL+Gd(fEVco6(eajkk=={F1pAIJ z;W^#>)O%NOH-SP>o`BI{qMzhjM(#+`*~I!am)&|JmV!KanOH}o;+HSD8+9&_)V%zb z0a(3z)O6*>_RC!fF~(}Dd+9u&1a;c>ptx{ zinv>4&6^8(is}eWD1xG3pVF|kB?gjZDfsk@{r;rh7NGsKO_bRHi7+!O9rLF22D9|+ zM6*T4X2OIhSE35I5*4r#f;ovjIN4wy!w?ONPVybm@0@0oe9pV!{eQ_Y4-ah9Dd!0M z?r185Of_wQBPRUw7*L(E;q@2`8Mgl%(tE9}1Y~;lKCqqF=Jm#OJ?$EAUV}wBC*k{Q zT+ea#;*j#_vDq$$`ai7e=wvK+@vPaq2)XmWon+R@>|2Oy_MD2C96DQRv8ddoIR8WZ zniB3_jzd- z^3*ipyuZ3X@=&wykPNOEd>52!zar&7DeGg~LaIjK^ykkPhsB1D-P3@x^NDXw8+Z6k zwhPK8NJ8=8>H{x1f_(;MzSNOxbY}|A$N(Any3=nYGSGRw4G!wB?V~S|uquu2zzu24 zCxA}E!uh{v0WQ&;`BxXLCbpa?k88!=lb^(_aNn*6_4#Z#259LZ|3)XBRJ!#aFQJnv zS)HX$_BYb;PO_(Y67<{W6Pf(@Q%jDT-}Nu~__!vz5pLb)J1*g{X4c9U(nR$4K7YB( zRC51B1wh}5`rh~;1|@(OtuXy-26B5I7Q1eFZ;pMqnwqi}TOKSuPJ2`L_p##mtJF6` zj2~1i58YNFgN{R@nU@MM9y-dnu;TEo&;WadSAa7qsqB4EebUKq?_buZwX7dun6jx> z+>-G5$n$CF=TCdY%~@M|0KaR+z;Amlz)|N8Hgu45E6!`~m-1mOEG*|YZ6JyotOy)X@I1AIJS`P#jC#ZOUi}S4QAsncFW;Iln4MOd z)@-2x1%(~$1Q!sT-%aMOLCL$eM~em~{>kG<%}S~<3|}%oCm?3)S2tMjp2V3JE&P9N zeFab)K^NxYEbdOw01+%m77OkKNrF2hxVw9BOK>MhfZ*;90fJj_mqiwLSeBdo|6Sc( z-Bs<@*39;F_v_cM`+Hw^zX@1twNJP0s!AX_WtOzln5E}_KTJHqY-urM;F�(YybZ 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 literal 0 HcmV?d00001 From 441514937e15c78bc7cc204663af25eecb67b459 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 4 Oct 2017 13:19:18 -0400 Subject: [PATCH 04/54] Moves laughter to the emote --- code/modules/mob/living/emote.dm | 347 ++++++++++++++++++ .../chemistry/reagents/drink_reagents.dm | 13 +- 2 files changed, 348 insertions(+), 12 deletions(-) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index db47d43bd5..3912f68955 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //The code execution of the emote datum is located at code/datums/emotes.dm /mob/living/emote(act, m_type = null, message = null) act = lowertext(act) @@ -326,6 +327,352 @@ /datum/emote/living/surrender key = "surrender" key_third_person = "surrenders" +======= +//The code execution of the emote datum is located at code/datums/emotes.dm +/mob/living/emote(act, m_type = null, message = null) + act = lowertext(act) + var/param = message + var/custom_param = findchar(act, " ") + if(custom_param) + param = copytext(act, custom_param + 1, length(act) + 1) + act = copytext(act, 1, custom_param) + + var/datum/emote/E + E = E.emote_list[act] + if(!E) + to_chat(src, "Unusable emote '[act]'. Say *help for a list.") + return + E.run_emote(src, param, m_type) + +/* EMOTE DATUMS */ +/datum/emote/living + mob_type_allowed_typecache = list(/mob/living) + mob_type_blacklist_typecache = list(/mob/living/simple_animal/slime, /mob/living/brain) + +/datum/emote/living/blush + key = "blush" + key_third_person = "blushes" + message = "blushes." + +/datum/emote/living/bow + key = "bow" + key_third_person = "bows" + message = "bows." + message_param = "bows to %t." + +/datum/emote/living/burp + key = "burp" + key_third_person = "burps" + message = "burps." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/choke + key = "choke" + key_third_person = "chokes" + message = "chokes!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/cross + key = "cross" + key_third_person = "crosses" + message = "crosses their arms." + restraint_check = TRUE + +/datum/emote/living/chuckle + key = "chuckle" + key_third_person = "chuckles" + message = "chuckles." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/collapse + key = "collapse" + key_third_person = "collapses" + message = "collapses!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/collapse/run_emote(mob/user, params) + . = ..() + if(. && isliving(user)) + var/mob/living/L = user + L.Unconscious(40) + +/datum/emote/living/cough + key = "cough" + key_third_person = "coughs" + message = "coughs!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/dance + key = "dance" + key_third_person = "dances" + message = "dances around happily." + restraint_check = TRUE + +/datum/emote/living/deathgasp + key = "deathgasp" + key_third_person = "deathgasps" + message = "seizes up and falls limp, their eyes dead and lifeless..." + message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." + message_AI = "lets out a flurry of sparks, its screen flickering as its systems slowly halt." + message_alien = "lets out a waning guttural screech, green blood bubbling from its maw..." + message_larva = "lets out a sickly hiss of air and falls limply to the floor..." + message_monkey = "lets out a faint chimper as it collapses and stops moving..." + message_simple = "stops moving..." + stat_allowed = UNCONSCIOUS + +/datum/emote/living/deathgasp/run_emote(mob/user, params) + var/mob/living/simple_animal/S = user + if(istype(S) && S.deathmessage) + message_simple = S.deathmessage + . = ..() + message_simple = initial(message_simple) + if(. && isalienadult(user)) + playsound(user.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) + +/datum/emote/living/drool + key = "drool" + key_third_person = "drools" + message = "drools." + +/datum/emote/living/faint + key = "faint" + key_third_person = "faints" + message = "faints." + +/datum/emote/living/faint/run_emote(mob/user, params) + . = ..() + if(. && isliving(user)) + var/mob/living/L = user + L.SetSleeping(200) + +/datum/emote/living/flap + key = "flap" + key_third_person = "flaps" + message = "flaps their wings." + var/wing_time = 20 + +/datum/emote/living/flap/run_emote(mob/user, params) + . = ..() + if(. && ishuman(user)) + var/mob/living/carbon/human/H = user + var/open = FALSE + if(H.dna.features["wings"] != "None") + if("wingsopen" in H.dna.species.mutant_bodyparts) + open = TRUE + H.CloseWings() + else + H.OpenWings() + addtimer(CALLBACK(H, open ? /mob/living/carbon/human.proc/OpenWings : /mob/living/carbon/human.proc/CloseWings), wing_time) + +/datum/emote/living/flap/aflap + key = "aflap" + key_third_person = "aflaps" + message = "flaps their wings ANGRILY!" + wing_time = 10 + +/datum/emote/living/flip + key = "flip" + key_third_person = "flips" + restraint_check = TRUE + +/datum/emote/living/flip/run_emote(mob/user, params) + . = ..() + if(!.) + user.SpinAnimation(7,1) + +/datum/emote/living/frown + key = "frown" + key_third_person = "frowns" + message = "frowns." + +/datum/emote/living/gag + key = "gag" + key_third_person = "gags" + message = "gags." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/gasp + key = "gasp" + key_third_person = "gasps" + message = "gasps!" + emote_type = EMOTE_AUDIBLE + stat_allowed = UNCONSCIOUS + +/datum/emote/living/giggle + key = "giggle" + key_third_person = "giggles" + message = "giggles." + message_mime = "giggles silently!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/glare + key = "glare" + key_third_person = "glares" + message = "glares." + message_param = "glares at %t." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/grin + key = "grin" + key_third_person = "grins" + message = "grins." + +/datum/emote/living/groan + key = "groan" + key_third_person = "groans" + message = "groans!" + message_mime = "appears to groan!" + +/datum/emote/living/grimace + key = "grimace" + key_third_person = "grimaces" + message = "grimaces." + +/datum/emote/living/jump + key = "jump" + key_third_person = "jumps" + message = "jumps!" + restraint_check = TRUE + +/datum/emote/living/kiss + key = "kiss" + key_third_person = "kisses" + message = "blows a kiss." + message_param = "blows a kiss to %t." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/laugh + key = "laugh" + key_third_person = "laughs" + message = "laughs." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/laugh/can_run_emote(mob/living/user) + . = ..() + if(. && iscarbon(user)) + var/mob/living/carbon/C = user + return !C.silent + +/datum/emote/living/laugh/run_emote(mob/user, params) + . = ..() + if(. && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.dna.species.id == "human") + if(user.gender == FEMALE) + playsound(H, 'sound/voice/human/womanlaugh.ogg', 50, 1) + else + playsound(H, pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg'), 50, 1) + +/datum/emote/living/look + key = "look" + key_third_person = "looks" + message = "looks." + message_param = "looks at %t." + +/datum/emote/living/nod + key = "nod" + key_third_person = "nods" + message = "nods." + message_param = "nods at %t." + +/datum/emote/living/point + key = "point" + key_third_person = "points" + message = "points." + message_param = "points at %t." + restraint_check = TRUE + +/datum/emote/living/pout + key = "pout" + key_third_person = "pouts" + message = "pouts." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/scream + key = "scream" + key_third_person = "screams" + message = "screams." + message_mime = "acts out a scream!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/scowl + key = "scowl" + key_third_person = "scowls" + message = "scowls." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/shake + key = "shake" + key_third_person = "shakes" + message = "shakes their head." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/shiver + key = "shiver" + key_third_person = "shiver" + message = "shivers." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/sigh + key = "sigh" + key_third_person = "sighs" + message = "sighs." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/sit + key = "sit" + key_third_person = "sits" + message = "sits down." + +/datum/emote/living/smile + key = "smile" + key_third_person = "smiles" + message = "smiles." + +/datum/emote/living/sneeze + key = "sneeze" + key_third_person = "sneezes" + message = "sneezes." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/smug + key = "smug" + key_third_person = "smugs" + message = "grins smugly." + +/datum/emote/living/sniff + key = "sniff" + key_third_person = "sniffs" + message = "sniffs." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/snore + key = "snore" + key_third_person = "snores" + message = "snores." + message_mime = "sleeps soundly." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/stare + key = "stare" + key_third_person = "stares" + message = "stares." + message_param = "stares at %t." + +/datum/emote/living/strech + key = "stretch" + key_third_person = "stretches" + message = "stretches their arms." + +/datum/emote/living/sulk + key = "sulk" + key_third_person = "sulks" + message = "sulks down sadly." + +/datum/emote/living/surrender + key = "surrender" + key_third_person = "surrenders" +>>>>>>> 32050be... Moves laughter to the emote (#31276) message = "puts their hands on their head and falls to the ground, they surrender!" emote_type = EMOTE_AUDIBLE diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index a3db8f7bc2..308fd47a16 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -169,18 +169,7 @@ /datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M) if(!iscarbon(M)) return - if(!M.silent)//cant laugh if you're mute - M.emote("laugh") - var/laughnum = rand(1,2) - if(M.gender == MALE) - if(laughnum == 1) - playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1) - if(laughnum == 2) - playsound(get_turf(M), 'sound/voice/human/manlaugh2.ogg', 50, 1) - else if(M.gender == FEMALE) - playsound(get_turf(M), 'sound/voice/human/womanlaugh.ogg', 65, 1) - else//non-binary gender just sounds like a man - playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1) + M.emote("laugh") ..() /datum/reagent/consumable/potato_juice From 77c422d01148a31f8951a901525a79c73bcc3cdf Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 16:11:24 -0500 Subject: [PATCH 05/54] Update emote.dm --- code/modules/mob/living/emote.dm | 660 ++++++++----------------------- 1 file changed, 165 insertions(+), 495 deletions(-) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 3912f68955..3e1724150a 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,333 +1,4 @@ -<<<<<<< HEAD -//The code execution of the emote datum is located at code/datums/emotes.dm -/mob/living/emote(act, m_type = null, message = null) - act = lowertext(act) - var/param = message - var/custom_param = findchar(act, " ") - if(custom_param) - param = copytext(act, custom_param + 1, length(act) + 1) - act = copytext(act, 1, custom_param) - - var/datum/emote/E - E = E.emote_list[act] - if(!E) - to_chat(src, "Unusable emote '[act]'. Say *help for a list.") - return - E.run_emote(src, param, m_type) - -/* EMOTE DATUMS */ -/datum/emote/living - mob_type_allowed_typecache = list(/mob/living) - mob_type_blacklist_typecache = list(/mob/living/simple_animal/slime, /mob/living/brain) - -/datum/emote/living/blush - key = "blush" - key_third_person = "blushes" - message = "blushes." - -/datum/emote/living/bow - key = "bow" - key_third_person = "bows" - message = "bows." - message_param = "bows to %t." - -/datum/emote/living/burp - key = "burp" - key_third_person = "burps" - message = "burps." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/choke - key = "choke" - key_third_person = "chokes" - message = "chokes!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/cross - key = "cross" - key_third_person = "crosses" - message = "crosses their arms." - restraint_check = TRUE - -/datum/emote/living/chuckle - key = "chuckle" - key_third_person = "chuckles" - message = "chuckles." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/collapse - key = "collapse" - key_third_person = "collapses" - message = "collapses!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/collapse/run_emote(mob/user, params) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.Unconscious(40) - -/datum/emote/living/cough - key = "cough" - key_third_person = "coughs" - message = "coughs!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/dance - key = "dance" - key_third_person = "dances" - message = "dances around happily." - restraint_check = TRUE - -/datum/emote/living/deathgasp - key = "deathgasp" - key_third_person = "deathgasps" - message = "seizes up and falls limp, their eyes dead and lifeless..." - message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." - message_AI = "lets out a flurry of sparks, its screen flickering as its systems slowly halt." - message_alien = "lets out a waning guttural screech, green blood bubbling from its maw..." - message_larva = "lets out a sickly hiss of air and falls limply to the floor..." - message_monkey = "lets out a faint chimper as it collapses and stops moving..." - message_simple = "stops moving..." - stat_allowed = UNCONSCIOUS - -/datum/emote/living/deathgasp/run_emote(mob/user, params) - var/mob/living/simple_animal/S = user - if(istype(S) && S.deathmessage) - message_simple = S.deathmessage - . = ..() - message_simple = initial(message_simple) - if(. && isalienadult(user)) - playsound(user.loc, 'sound/voice/hiss6.ogg', 80, 1, 1) - -/datum/emote/living/drool - key = "drool" - key_third_person = "drools" - message = "drools." - -/datum/emote/living/faint - key = "faint" - key_third_person = "faints" - message = "faints." - -/datum/emote/living/faint/run_emote(mob/user, params) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.SetSleeping(200) - -/datum/emote/living/flap - key = "flap" - key_third_person = "flaps" - message = "flaps their wings." - var/wing_time = 20 - -/datum/emote/living/flap/run_emote(mob/user, params) - . = ..() - if(. && ishuman(user)) - var/mob/living/carbon/human/H = user - var/open = FALSE - if(H.dna.features["wings"] != "None") - if("wingsopen" in H.dna.species.mutant_bodyparts) - open = TRUE - H.CloseWings() - else - H.OpenWings() - addtimer(CALLBACK(H, open ? /mob/living/carbon/human.proc/OpenWings : /mob/living/carbon/human.proc/CloseWings), wing_time) - -/datum/emote/living/flap/aflap - key = "aflap" - key_third_person = "aflaps" - message = "flaps their wings ANGRILY!" - wing_time = 10 - -/datum/emote/living/flip - key = "flip" - key_third_person = "flips" - restraint_check = TRUE - -/datum/emote/living/flip/run_emote(mob/user, params) - . = ..() - if(!.) - user.SpinAnimation(7,1) - -/datum/emote/living/frown - key = "frown" - key_third_person = "frowns" - message = "frowns." - -/datum/emote/living/gag - key = "gag" - key_third_person = "gags" - message = "gags." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/gasp - key = "gasp" - key_third_person = "gasps" - message = "gasps!" - emote_type = EMOTE_AUDIBLE - stat_allowed = UNCONSCIOUS - -/datum/emote/living/giggle - key = "giggle" - key_third_person = "giggles" - message = "giggles." - message_mime = "giggles silently!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/glare - key = "glare" - key_third_person = "glares" - message = "glares." - message_param = "glares at %t." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/grin - key = "grin" - key_third_person = "grins" - message = "grins." - -/datum/emote/living/groan - key = "groan" - key_third_person = "groans" - message = "groans!" - message_mime = "appears to groan!" - -/datum/emote/living/grimace - key = "grimace" - key_third_person = "grimaces" - message = "grimaces." - -/datum/emote/living/jump - key = "jump" - key_third_person = "jumps" - message = "jumps!" - restraint_check = TRUE - -/datum/emote/living/kiss - key = "kiss" - key_third_person = "kisses" - message = "blows a kiss." - message_param = "blows a kiss to %t." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/laugh - key = "laugh" - key_third_person = "laughs" - message = "laughs." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/look - key = "look" - key_third_person = "looks" - message = "looks." - message_param = "looks at %t." - -/datum/emote/living/nod - key = "nod" - key_third_person = "nods" - message = "nods." - message_param = "nods at %t." - -/datum/emote/living/point - key = "point" - key_third_person = "points" - message = "points." - message_param = "points at %t." - restraint_check = TRUE - -/datum/emote/living/pout - key = "pout" - key_third_person = "pouts" - message = "pouts." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/scream - key = "scream" - key_third_person = "screams" - message = "screams." - message_mime = "acts out a scream!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/scowl - key = "scowl" - key_third_person = "scowls" - message = "scowls." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/shake - key = "shake" - key_third_person = "shakes" - message = "shakes their head." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/shiver - key = "shiver" - key_third_person = "shiver" - message = "shivers." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/sigh - key = "sigh" - key_third_person = "sighs" - message = "sighs." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/sit - key = "sit" - key_third_person = "sits" - message = "sits down." - -/datum/emote/living/smile - key = "smile" - key_third_person = "smiles" - message = "smiles." - -/datum/emote/living/sneeze - key = "sneeze" - key_third_person = "sneezes" - message = "sneezes." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/smug - key = "smug" - key_third_person = "smugs" - message = "grins smugly." - -/datum/emote/living/sniff - key = "sniff" - key_third_person = "sniffs" - message = "sniffs." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/snore - key = "snore" - key_third_person = "snores" - message = "snores." - message_mime = "sleeps soundly." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/stare - key = "stare" - key_third_person = "stares" - message = "stares." - message_param = "stares at %t." - -/datum/emote/living/strech - key = "stretch" - key_third_person = "stretches" - message = "stretches their arms." - -/datum/emote/living/sulk - key = "sulk" - key_third_person = "sulks" - message = "sulks down sadly." - -/datum/emote/living/surrender - key = "surrender" - key_third_person = "surrenders" -======= +<<<<<<< HEAD //The code execution of the emote datum is located at code/datums/emotes.dm /mob/living/emote(act, m_type = null, message = null) act = lowertext(act) @@ -672,169 +343,168 @@ /datum/emote/living/surrender key = "surrender" key_third_person = "surrenders" ->>>>>>> 32050be... Moves laughter to the emote (#31276) message = "puts their hands on their head and falls to the ground, they surrender!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/surrender/run_emote(mob/user, params) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.Knockdown(200) - -/datum/emote/living/sway - key = "sway" - key_third_person = "sways" - message = "sways around dizzily." - -/datum/emote/living/tremble - key = "tremble" - key_third_person = "trembles" - message = "trembles in fear!" - -/datum/emote/living/twitch - key = "twitch" - key_third_person = "twitches" - message = "twitches violently." - -/datum/emote/living/twitch_s - key = "twitch_s" - message = "twitches." - -/datum/emote/living/wave - key = "wave" - key_third_person = "waves" - message = "waves." - -/datum/emote/living/whimper - key = "whimper" - key_third_person = "whimpers" - message = "whimpers." - message_mime = "appears hurt." - -/datum/emote/living/wsmile - key = "wsmile" - key_third_person = "wsmiles" - message = "smiles weakly." - -/datum/emote/living/yawn - key = "yawn" - key_third_person = "yawns" - message = "yawns." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/custom - key = "me" - key_third_person = "custom" - message = null - -/datum/emote/living/custom/proc/check_invalid(mob/user, input) - . = TRUE - if(copytext(input,1,5) == "says") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,9) == "exclaims") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,6) == "yells") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,5) == "asks") - to_chat(user, "Invalid emote.") - else - . = FALSE - -/datum/emote/living/custom/run_emote(mob/user, params, type_override = null) - if(jobban_isbanned(user, "emote")) - to_chat(user, "You cannot send custom emotes (banned).") - return FALSE - else if(user.client && user.client.prefs.muted & MUTE_IC) - to_chat(user, "You cannot send IC messages (muted).") - return FALSE - else if(!params) - var/custom_emote = copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) - if(custom_emote && !check_invalid(user, custom_emote)) - var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") - switch(type) - if("Visible") - emote_type = EMOTE_VISIBLE - if("Hearable") - emote_type = EMOTE_AUDIBLE - else - alert("Unable to use this emote, must be either hearable or visible.") - return - message = custom_emote - else - message = params - if(type_override) - emote_type = type_override - . = ..() - message = null - emote_type = EMOTE_VISIBLE - -/datum/emote/living/custom/replace_pronoun(mob/user, message) - return message - -/datum/emote/living/help - key = "help" - -/datum/emote/living/help/run_emote(mob/user, params) - var/list/keys = list() - var/list/message = list("Available emotes, you can use them with say \"*emote\": ") - - var/datum/emote/E - var/list/emote_list = E.emote_list - for(var/e in emote_list) - if(e in keys) - continue - E = emote_list[e] - if(E.can_run_emote(user, TRUE)) - keys += E.key - - keys = sortList(keys) - - for(var/emote in keys) - if(LAZYLEN(message) > 1) - message += ", [emote]" - else - message += "[emote]" - - message += "." - - message = jointext(message, "") - - to_chat(user, message) - -/datum/emote/sound/beep - key = "beep" - key_third_person = "beeps" - message = "beeps." - message_param = "beeps at %t." - sound = 'sound/machines/twobeep.ogg' - -/datum/emote/living/spin - key = "spin" - key_third_person = "spins" - -/datum/emote/living/spin/run_emote(mob/user) - user.spin(20, 1) - if(iscyborg(user)) - var/mob/living/silicon/robot/R = user - if(R.buckled_mobs) - for(var/mob/M in R.buckled_mobs) - if(R.riding_datum) - R.riding_datum.force_dismount(M) - else - R.unbuckle_all_mobs() - ..() - -/datum/emote/living/circle - key = "circle" - key_third_person = "circles" - restraint_check = TRUE - -/datum/emote/living/circle/run_emote(mob/user, params) - . = ..() - var/obj/item/circlegame/N = new(user) - if(user.put_in_hands(N)) - to_chat(user, "You make a circle with your hand.") - else - qdel(N) - to_chat(user, "You don't have any free hands to make a circle with.") + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/surrender/run_emote(mob/user, params) + . = ..() + if(. && isliving(user)) + var/mob/living/L = user + L.Knockdown(200) + +/datum/emote/living/sway + key = "sway" + key_third_person = "sways" + message = "sways around dizzily." + +/datum/emote/living/tremble + key = "tremble" + key_third_person = "trembles" + message = "trembles in fear!" + +/datum/emote/living/twitch + key = "twitch" + key_third_person = "twitches" + message = "twitches violently." + +/datum/emote/living/twitch_s + key = "twitch_s" + message = "twitches." + +/datum/emote/living/wave + key = "wave" + key_third_person = "waves" + message = "waves." + +/datum/emote/living/whimper + key = "whimper" + key_third_person = "whimpers" + message = "whimpers." + message_mime = "appears hurt." + +/datum/emote/living/wsmile + key = "wsmile" + key_third_person = "wsmiles" + message = "smiles weakly." + +/datum/emote/living/yawn + key = "yawn" + key_third_person = "yawns" + message = "yawns." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/custom + key = "me" + key_third_person = "custom" + message = null + +/datum/emote/living/custom/proc/check_invalid(mob/user, input) + . = TRUE + if(copytext(input,1,5) == "says") + to_chat(user, "Invalid emote.") + else if(copytext(input,1,9) == "exclaims") + to_chat(user, "Invalid emote.") + else if(copytext(input,1,6) == "yells") + to_chat(user, "Invalid emote.") + else if(copytext(input,1,5) == "asks") + to_chat(user, "Invalid emote.") + else + . = FALSE + +/datum/emote/living/custom/run_emote(mob/user, params, type_override = null) + if(jobban_isbanned(user, "emote")) + to_chat(user, "You cannot send custom emotes (banned).") + return FALSE + else if(user.client && user.client.prefs.muted & MUTE_IC) + to_chat(user, "You cannot send IC messages (muted).") + return FALSE + else if(!params) + var/custom_emote = copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) + if(custom_emote && !check_invalid(user, custom_emote)) + var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") + switch(type) + if("Visible") + emote_type = EMOTE_VISIBLE + if("Hearable") + emote_type = EMOTE_AUDIBLE + else + alert("Unable to use this emote, must be either hearable or visible.") + return + message = custom_emote + else + message = params + if(type_override) + emote_type = type_override + . = ..() + message = null + emote_type = EMOTE_VISIBLE + +/datum/emote/living/custom/replace_pronoun(mob/user, message) + return message + +/datum/emote/living/help + key = "help" + +/datum/emote/living/help/run_emote(mob/user, params) + var/list/keys = list() + var/list/message = list("Available emotes, you can use them with say \"*emote\": ") + + var/datum/emote/E + var/list/emote_list = E.emote_list + for(var/e in emote_list) + if(e in keys) + continue + E = emote_list[e] + if(E.can_run_emote(user, TRUE)) + keys += E.key + + keys = sortList(keys) + + for(var/emote in keys) + if(LAZYLEN(message) > 1) + message += ", [emote]" + else + message += "[emote]" + + message += "." + + message = jointext(message, "") + + to_chat(user, message) + +/datum/emote/sound/beep + key = "beep" + key_third_person = "beeps" + message = "beeps." + message_param = "beeps at %t." + sound = 'sound/machines/twobeep.ogg' + +/datum/emote/living/spin + key = "spin" + key_third_person = "spins" + +/datum/emote/living/spin/run_emote(mob/user) + user.spin(20, 1) + if(iscyborg(user)) + var/mob/living/silicon/robot/R = user + if(R.buckled_mobs) + for(var/mob/M in R.buckled_mobs) + if(R.riding_datum) + R.riding_datum.force_dismount(M) + else + R.unbuckle_all_mobs() + ..() + +/datum/emote/living/circle + key = "circle" + key_third_person = "circles" + restraint_check = TRUE + +/datum/emote/living/circle/run_emote(mob/user, params) + . = ..() + var/obj/item/circlegame/N = new(user) + if(user.put_in_hands(N)) + to_chat(user, "You make a circle with your hand.") + else + qdel(N) + to_chat(user, "You don't have any free hands to make a circle with.") From cfd98caf9801a875004443dd13933e7d7523034b Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 17:42:38 -0500 Subject: [PATCH 06/54] Update emote.dm --- code/modules/mob/living/emote.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 3e1724150a..9f31c5b055 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD //The code execution of the emote datum is located at code/datums/emotes.dm /mob/living/emote(act, m_type = null, message = null) act = lowertext(act) From 42c59b67b5cf203d85ffd8f5d2d9d4cc800b3182 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 11:54:45 +1300 Subject: [PATCH 07/54] Removes /datum/reagents/process(), changes cryostylane & pyrosium reaction speed --- code/modules/reagents/chemistry/holder.dm | 13 ++++++++++++- code/modules/reagents/chemistry/reagents.dm | 4 ---- .../chemistry/reagents/pyrotechnic_reagents.dm | 14 -------------- .../reagents/chemistry/recipes/pyrotechnics.dm | 17 +++++++++++++++++ 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 9bcd909faf..c383dd5a7d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -16,8 +16,11 @@ /datum/reagents/New(maximum=100) maximum_volume = maximum +<<<<<<< HEAD if(!(flags_1 & REAGENT_NOREACT)) START_PROCESSING(SSobj, src) +======= +>>>>>>> b8ea267... Merge pull request #31281 from vuonojenmustaturska/clowncult //I dislike having these here but map-objects are initialised before world/New() is called. >_> if(!GLOB.chemical_reagents_list) @@ -54,7 +57,6 @@ /datum/reagents/Destroy() . = ..() - STOP_PROCESSING(SSobj, src) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) var/datum/reagent/R = reagent @@ -288,6 +290,7 @@ C.update_stamina() update_total() +<<<<<<< HEAD /datum/reagents/process() var/list/cached_reagents = reagent_list if(flags_1 & REAGENT_NOREACT) @@ -307,6 +310,14 @@ else STOP_PROCESSING(SSobj, src) flags_1 |= REAGENT_NOREACT +======= + +/datum/reagents/proc/set_reacting(react = TRUE) + if(react) + flags &= ~(REAGENT_NOREACT) + else + flags |= REAGENT_NOREACT +>>>>>>> b8ea267... Merge pull request #31281 from vuonojenmustaturska/clowncult /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) var/list/cached_reagents = reagent_list diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 342e2154f8..5f76a87654 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -80,10 +80,6 @@ /datum/reagent/proc/on_update(atom/A) return -// Called every time reagent containers process. -/datum/reagent/proc/on_tick(data) - return - // Called when the reagent container is hit by an explosion /datum/reagent/proc/on_ex_act(severity) return diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 36320459e8..4c1965058c 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -196,13 +196,6 @@ M.bodytemperature -= 15 ..() -/datum/reagent/cryostylane/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp -= 10 - holder.handle_reactions() - ..() - /datum/reagent/cryostylane/reaction_turf(turf/T, reac_volume) if(reac_volume >= 5) for(var/mob/living/simple_animal/slime/M in T) @@ -222,13 +215,6 @@ M.bodytemperature += 15 ..() -/datum/reagent/pyrosium/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp += 10 - holder.handle_reactions() - ..() - /datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. name = "Teslium" id = "teslium" diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 8ca65a6588..aa97dd3180 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -342,6 +342,23 @@ holder.chem_temp = 20 // cools the fuck down return +/datum/chemical_reaction/cryostylane_oxygen + name = "ephemeral cryostylane reaction" + id = "cryostylane_oxygen" + results = list("cryostylane" = 1) + required_reagents = list("cryostylane" = 1, "oxygen" = 1) + +/datum/chemical_reaction/cryostylane_oxygen/on_reaction(datum/reagents/holder, created_volume) + holder.chem_temp -= 10*created_volume + +/datum/chemical_reaction/pyrosium_oxygen + name = "ephemeral pyrosium reaction" + id = "pyrosium_oxygen" + results = list("pyrosium" = 1) + required_reagents = list("pyrosium" = 1, "oxygen" = 1) + +/datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, created_volume) + holder.chem_temp += 10*created_volume /datum/chemical_reaction/pyrosium name = "pyrosium" From e5f5b427bad1792bfa3cad12eea91d0b7c98829f Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 21:24:44 -0300 Subject: [PATCH 08/54] Makes the energy katana swwwwwwish when drawn --- code/modules/ninja/energy_katana.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 8901c1b9fa..b2f01212f5 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -85,6 +85,19 @@ playsound(user, 'sound/weapons/blade1.ogg', 50, 1) target.emag_act(user) +<<<<<<< HEAD +======= +/obj/item/energy_katana/pickup(mob/living/user) + . = ..() + jaunt.Grant(user, src) + user.update_icons() + playsound(src, 'sound/items/unsheath.ogg', 25, 1) + +/obj/item/energy_katana/dropped(mob/user) + . = ..() + jaunt.Remove(user) + user.update_icons() +>>>>>>> 4ffb1cd... Merge pull request #31289 from ShizCalev/hacknslash //If we hit the Ninja who owns this Katana, they catch it. //Works for if the Ninja throws it or it throws itself or someone tries From dec28eabfc0710a4434d0d046885a0fa21e559ec Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 21:26:19 -0300 Subject: [PATCH 09/54] Merge pull request #31287 from ShizCalev/wizard-name Correctly applies wizard names --- code/game/gamemodes/wizard/wizard.dm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 8256d0aaf0..d25c7613bc 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -111,10 +111,7 @@ if (!newname) newname = randomname - wizard_mob.real_name = newname - wizard_mob.name = newname - if(wizard_mob.mind) - wizard_mob.mind.name = newname + wizard_mob.fully_replace_character_name(wizard_mob.real_name, newname) /* Wizards by nature cannot be too young. */ if(wizard_mob.age < WIZARD_AGE_MIN) From 39cf9bb7a0564ece5e43e34de33c655c880166da Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 21:25:31 -0300 Subject: [PATCH 11/54] Merge pull request #31286 from KorPhaeron/ismachinery ismachinery define --- code/__DEFINES/is_helpers.dm | 2 ++ code/game/gamemodes/blob/blob_report.dm | 2 +- code/game/objects/objs.dm | 2 +- code/modules/holodeck/area_copy.dm | 2 +- .../mob/living/simple_animal/hostile/giant_spider.dm | 2 +- code/modules/mob/living/simple_animal/hostile/mimic.dm | 2 +- code/modules/modular_computers/hardware/recharger.dm | 6 +++--- code/modules/power/singularity/containment_field.dm | 6 +++--- code/modules/power/tesla/energy_ball.dm | 2 +- 9 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 4376ba9c03..1de917d5e1 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -140,6 +140,8 @@ #define isstructure(A) (istype(A, /obj/structure)) +#define ismachinery(A) (istype(A, /obj/machinery)) + #define ismecha(A) (istype(A, /obj/mecha)) #define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index e90626485a..519fc2e296 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -85,7 +85,7 @@ src.grille += 1 else if(istype(O, /obj/machinery/door)) src.door += 1 - else if(istype(O, /obj/machinery)) + else if(ismachinery(O)) src.mach += 1 if(count_territories) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index dffa22670c..f2537945db 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -51,7 +51,7 @@ T.add_blueprints_preround(src) /obj/Destroy(force=FALSE) - if(!istype(src, /obj/machinery)) + if(!ismachinery(src)) STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists SStgui.close_uis(src) . = ..() diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index 272fb1c536..9da772eaee 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars,list("tag","area","type","loc","locs", I.damtype = STAMINA // thou shalt not N.update_icon() - if(istype(O, /obj/machinery)) + if(ismachinery(O)) var/obj/machinery/M = O M.power_change() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index e5ee4f671c..aa288e52d7 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -275,7 +275,7 @@ if(O.anchored) continue - if(isitem(O) || isstructure(O) || istype(O, /obj/machinery)) + if(isitem(O) || isstructure(O) || ismachinery(O)) cocoon_target = O busy = MOVING_TO_TARGET stop_automated_movement = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index b46000c339..edcf1a0f73 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_living = icon_state copy_overlays(O) add_overlay(googly_eyes) - if(isstructure(O) || istype(O, /obj/machinery)) + if(isstructure(O) || ismachinery(O)) health = (anchored * 50) + 50 destroy_objects = 1 if(O.density && O.anchored) diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index 08ecc6e8c8..7096233d3a 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -31,7 +31,7 @@ origin_tech = "programming=2;engineering=2;powerstorage=3" /obj/item/computer_hardware/recharger/APC/use_power(amount, charging=0) - if(istype(holder.physical, /obj/machinery)) + if(ismachinery(holder.physical)) var/obj/machinery/M = holder.physical if(M.powered()) M.use_power(amount) @@ -55,13 +55,13 @@ origin_tech = "engineering=2;powerstorage=1" /obj/item/computer_hardware/recharger/wired/can_install(obj/item/device/modular_computer/M, mob/living/user = null) - if(istype(M.physical, /obj/machinery) && M.physical.anchored) + if(ismachinery(M.physical) && M.physical.anchored) return ..() to_chat(user, "\The [src] is incompatible with portable computers!") return 0 /obj/item/computer_hardware/recharger/wired/use_power(amount, charging=0) - if(istype(holder.physical, /obj/machinery) && holder.physical.anchored) + if(ismachinery(holder.physical) && holder.physical.anchored) var/obj/machinery/M = holder.physical var/turf/T = M.loc if(!T || !istype(T)) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index f2610f97b0..f4d09167c8 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -58,7 +58,7 @@ if(isliving(mover)) shock(mover) - if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) + if(ismachinery(mover) || isstructure(mover) || ismecha(mover)) bump_field(mover) /obj/machinery/field/containment/proc/set_master(master1,master2) @@ -90,13 +90,13 @@ if(isliving(mover)) shock(mover) return - if(istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) + if(ismachinery(mover) || isstructure(mover) || ismecha(mover)) bump_field(mover) return /obj/machinery/field/CanPass(atom/movable/mover, turf/target) - if(hasShocked || isliving(mover) || istype(mover, /obj/machinery) || isstructure(mover) || ismecha(mover)) + if(hasShocked || isliving(mover) || ismachinery(mover) || isstructure(mover) || ismecha(mover)) return FALSE return ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index d8d396d311..503196aa4e 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -222,7 +222,7 @@ else if(closest_mob) continue - else if(istype(A, /obj/machinery)) + else if(ismachinery(A)) var/obj/machinery/M = A var/dist = get_dist(source, A) if(dist <= zap_range && (dist < closest_dist || !closest_machine) && !M.being_shocked) From c873c1747815e5a89044bf959d3a2bc675ddf1f9 Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 4 Oct 2017 21:26:38 -0300 Subject: [PATCH 13/54] Merge pull request #31284 from tgstation/Cyberboss-patch-1 Code cleanup in snack_meats.dm --- .../food_and_drinks/food/snacks_meat.dm | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 11426a4e04..f5a5857fea 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -25,8 +25,8 @@ tastes = list("fish" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/carpmeat/New() - ..() +/obj/item/reagent_containers/food/snacks/carpmeat/Initialize() + . = ..() eatverb = pick("bite","chew","choke down","gnaw","swallow","chomp") /obj/item/reagent_containers/food/snacks/carpmeat/imitation @@ -114,8 +114,8 @@ tastes = list("meat" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/sausage/New() - ..() +/obj/item/reagent_containers/food/snacks/sausage/Initialize() + . = ..() eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp") /obj/item/reagent_containers/food/snacks/kebab @@ -185,8 +185,8 @@ /obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand() visible_message("[src] expands!") - var/mob/spammer = get_mob_by_key(src.fingerprintslast) - var/mob/living/carbon/monkey/bananas = new(get_turf(src)) + var/mob/spammer = get_mob_by_key(fingerprintslast) + var/mob/living/carbon/monkey/bananas = new(drop_location()) bananas.log_message("Spawned via [src] at [COORD(src)], Last attached mob: [key_name(spammer)].", INDIVIDUAL_ATTACK_LOG) qdel(src) @@ -212,8 +212,8 @@ tastes = list("soy" = 1, "vegetables" = 1) foodtype = VEGETABLES -/obj/item/reagent_containers/food/snacks/stewedsoymeat/New() - ..() +/obj/item/reagent_containers/food/snacks/stewedsoymeat/Initialize() + . = ..() eatverb = pick("slurp","sip","suck","inhale","drink") /obj/item/reagent_containers/food/snacks/boiledspiderleg @@ -257,8 +257,8 @@ tastes = list("\"chicken\"" = 1) foodtype = MEAT -/obj/item/reagent_containers/food/snacks/nugget/New() - ..() +/obj/item/reagent_containers/food/snacks/nugget/Initialize() + . = ..() var/shape = pick("lump", "star", "lizard", "corgi") desc = "A 'chicken' nugget vaguely shaped like a [shape]." icon_state = "nugget_[shape]" From 63aa1c715387112b282c5eff230bf1ed1b8e1bc6 Mon Sep 17 00:00:00 2001 From: Supermichael777 Date: Wed, 4 Oct 2017 20:28:44 -0400 Subject: [PATCH 15/54] Makes the pda font a prefernce --- code/__DEFINES/misc.dm | 6 +++ code/game/objects/items/devices/PDA/PDA.dm | 52 +++++++++++++++------ code/modules/client/preferences.dm | 8 +++- code/modules/client/preferences_savefile.dm | 22 +++++++++ 4 files changed, 74 insertions(+), 14 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c5d917ece4..bdb9ad35a9 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -288,6 +288,12 @@ GLOBAL_LIST_INIT(ghost_accs_options, list(GHOST_ACCS_NONE, GHOST_ACCS_DIR, GHOST GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DEFAULT_SPRITE, GHOST_OTHERS_THEIR_SETTING)) //Same as ghost_accs_options. +//pda fonts +#define MONO "Monospaced" +#define VT "VT323" +#define ORBITRON "Orbitron" +#define SHARE "Share Tech Mono" + //Color Defines #define OOC_COLOR "#002eb8" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ccfe70e662..a5ed03919a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -27,13 +27,17 @@ GLOBAL_LIST_EMPTY(PDAs) var/mode = 0 //Controls what menu the PDA will display. 0 is hub; the rest are either built in or based on cartridge. var/icon_alert = "pda-r" //Icon to be overlayed for message alerts. Taken from the pda icon file. var/font_index = 0 //This int tells DM which font is currently selected and lets DM know when the last font has been selected so that it can cycle back to the first font when "toggle font" is pressed again. - var/font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" //The currently selected font. + var/font_mode = "font-family:monospace;" //The currently selected font. var/background_color = "#808000" //The currently selected background color. - #define FONT_VT 0 - #define FONT_SHARE 1 - #define FONT_ORBITRON 2 - #define FONT_MONO 3 + #define FONT_MONO "font-family:monospace;" + #define FONT_SHARE "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;" + #define FONT_ORBITRON "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px" + #define FONT_VT "font-family:\"VT323\", monospace;letter-spacing:1px;" + #define MODE_MONO 0 + #define MODE_SHARE 1 + #define MODE_ORBITRON 2 + #define MODE_VT 3 //Secondary variables var/scanmode = 0 //1 is medical scanner, 2 is forensics, 3 is reagent scanner. @@ -54,6 +58,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/detonatable = TRUE // Can the PDA be blown up? var/hidden = 0 // Is the PDA hidden from the PDA list? var/emped = 0 + var/equipped = FALSE //used here to determine if this is the first time its been picked up var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both. var/ownjob = null //related to above @@ -87,6 +92,27 @@ GLOBAL_LIST_EMPTY(PDAs) inserted_item = new /obj/item/pen(src) update_icon() +/obj/item/device/pda/equipped(mob/user, slot) + if(!equipped) + if(user.client) + switch(user.client.prefs.pda_style) + if(MONO) + font_index = MODE_MONO + font_mode = FONT_MONO + if(SHARE) + font_index = MODE_SHARE + font_mode = FONT_SHARE + if(ORBITRON) + font_index = MODE_ORBITRON + font_mode = FONT_ORBITRON + if(VT) + font_index = MODE_VT + font_mode = FONT_VT + else + font_index = MODE_MONO + font_mode = FONT_MONO + equipped = TRUE + /obj/item/device/pda/proc/update_label() name = "PDA-[owner] ([ownjob])" //Name generalisation @@ -335,14 +361,14 @@ GLOBAL_LIST_EMPTY(PDAs) font_index = (font_index + 1) % 4 switch(font_index) - if (FONT_VT) - font_mode = "font-family:\"VT323\", monospace;letter-spacing:1px;" - if (FONT_SHARE) - font_mode = "font-family:\"Share Tech Mono\", monospace;letter-spacing:0px;" - if (FONT_ORBITRON) - font_mode = "font-family:\"Orbitron\", monospace;letter-spacing:0px; font-size:15px" - if (FONT_MONO) - font_mode = "font-family:monospace;" + if (MODE_MONO) + font_mode = FONT_MONO + if (MODE_SHARE) + font_mode = FONT_SHARE + if (MODE_ORBITRON) + font_mode = FONT_ORBITRON + if (MODE_VT) + font_mode = FONT_VT if ("Change_Color") var/new_color = input("Please enter a color name or hex value (Default is \'#808000\').")as color background_color = new_color diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 38e0b0bd90..bcbeb55dd2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -44,7 +44,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/inquisitive_ghost = 1 var/allow_midround_antag = 1 var/preferred_map = null - + var/pda_style = MONO + var/uses_glasses_colour = 0 var/screenshake = 100 @@ -446,6 +447,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Keybindings: [(hotkeys) ? "Hotkeys" : "Default"]
" dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
" dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
" + dat += "PDA Style: [pda_style]
" dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
" dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
" dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" @@ -1449,6 +1451,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/pickedui = input(user, "Choose your UI style.", "Character Preference") as null|anything in list("Midnight", "Plasmafire", "Retro", "Slimecore", "Operative", "Clockwork") if(pickedui) UI_style = pickedui + if("PDA") + var/pickedPDA = input(user, "Choose your PDA style.", "Character Preference") as null|anything in list(MONO, SHARE, ORBITRON, VT) + if(pickedPDA) + pda_style = pickedPDA //citadel code if("cock_color") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d58d1cec77..e14b484bc3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -2,7 +2,11 @@ #define SAVEFILE_VERSION_MIN 15 //This is the current version, anything below this will attempt to update (if it's not obsolete) +<<<<<<< HEAD #define SAVEFILE_VERSION_MAX 20 +======= +#define SAVEFILE_VERSION_MAX 19 +>>>>>>> f770b69... Makes the pda font a prefernce (#31193) /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -107,6 +111,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car joblessrole = BEASSISTANT if(current_version < 17) features["legs"] = "Normal Legs" +<<<<<<< HEAD if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save. features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list) features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list) @@ -139,6 +144,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0) //womb features features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) +======= + if(current_version < 19) + pda_style = "mono" + +>>>>>>> f770b69... Makes the pda font a prefernce (#31193) /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) @@ -187,12 +197,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay +<<<<<<< HEAD S["parallax"] >> parallax S["menuoptions"] >> menuoptions //citadel code S["arousable"] >> arousable S["screenshake"] >> screenshake S["damagescreenshake"] >> damagescreenshake +======= + S["pda_style"] >> pda_style +>>>>>>> f770b69... Makes the pda font a prefernce (#31193) //try to fix any outdated data if necessary if(needs_update >= 0) @@ -217,9 +231,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) +<<<<<<< HEAD screenshake = sanitize_integer(screenshake, 0, 200, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) +======= + pda_style = sanitize_inlist(MONO, VT, SHARE, ORBITRON) +>>>>>>> f770b69... Makes the pda font a prefernce (#31193) return 1 @@ -259,10 +277,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) +<<<<<<< HEAD //citadel code WRITE_FILE(S["screenshake"], screenshake) WRITE_FILE(S["damagescreenshake"], damagescreenshake) WRITE_FILE(S["arousable"], arousable) +======= + WRITE_FILE(S["pda_style"], pda_style) +>>>>>>> f770b69... Makes the pda font a prefernce (#31193) return 1 From 4c38a8b1e2c655450fa96cb41a8008395497d818 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 20:51:37 -0500 Subject: [PATCH 16/54] Update energy_katana.dm --- code/modules/ninja/energy_katana.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index b2f01212f5..853cca2057 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -85,8 +85,6 @@ playsound(user, 'sound/weapons/blade1.ogg', 50, 1) target.emag_act(user) -<<<<<<< HEAD -======= /obj/item/energy_katana/pickup(mob/living/user) . = ..() jaunt.Grant(user, src) @@ -97,7 +95,6 @@ . = ..() jaunt.Remove(user) user.update_icons() ->>>>>>> 4ffb1cd... Merge pull request #31289 from ShizCalev/hacknslash //If we hit the Ninja who owns this Katana, they catch it. //Works for if the Ninja throws it or it throws itself or someone tries From 09f6eb615640f6066eef24a9a3d5bd840502c371 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 20:53:42 -0500 Subject: [PATCH 17/54] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e14b484bc3..999d2255ac 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -2,12 +2,8 @@ #define SAVEFILE_VERSION_MIN 15 //This is the current version, anything below this will attempt to update (if it's not obsolete) -<<<<<<< HEAD #define SAVEFILE_VERSION_MAX 20 -======= -#define SAVEFILE_VERSION_MAX 19 ->>>>>>> f770b69... Makes the pda font a prefernce (#31193) -/* + SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating It is to be used by the load_character and load_preferences procs. @@ -111,7 +107,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car joblessrole = BEASSISTANT if(current_version < 17) features["legs"] = "Normal Legs" -<<<<<<< HEAD if(current_version < 20)//Raise this to the max savefile version every time we change something so we don't sanitize this whole list every time you save. features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list) features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list) @@ -144,12 +139,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0) //womb features features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) -======= if(current_version < 19) pda_style = "mono" ->>>>>>> f770b69... Makes the pda font a prefernce (#31193) - /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -197,16 +189,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay -<<<<<<< HEAD S["parallax"] >> parallax S["menuoptions"] >> menuoptions //citadel code S["arousable"] >> arousable S["screenshake"] >> screenshake S["damagescreenshake"] >> damagescreenshake -======= S["pda_style"] >> pda_style ->>>>>>> f770b69... Makes the pda font a prefernce (#31193) //try to fix any outdated data if necessary if(needs_update >= 0) @@ -231,13 +220,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) -<<<<<<< HEAD screenshake = sanitize_integer(screenshake, 0, 200, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) - -======= pda_style = sanitize_inlist(MONO, VT, SHARE, ORBITRON) ->>>>>>> f770b69... Makes the pda font a prefernce (#31193) return 1 @@ -277,14 +262,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) -<<<<<<< HEAD //citadel code WRITE_FILE(S["screenshake"], screenshake) WRITE_FILE(S["damagescreenshake"], damagescreenshake) WRITE_FILE(S["arousable"], arousable) -======= WRITE_FILE(S["pda_style"], pda_style) ->>>>>>> f770b69... Makes the pda font a prefernce (#31193) return 1 From f57929b26c008f478a28dd9606f8c178fef3fd21 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 21:14:25 -0500 Subject: [PATCH 18/54] Update book.dm --- code/game/objects/items/storage/book.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 28856e17d8..c0c861f4c4 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -162,7 +162,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "bible", playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,1) if(do_after(user, 40, target = sword)) playsound(src,'sound/effects/pray_chaplain.ogg',60,1) - for(var/obj/item/device/soulstone/SS in sword.shards) + for(var/obj/item/device/soulstone/SS in sword.contents) SS.usability = TRUE for(var/mob/living/simple_animal/shade/EX in SS) SSticker.mode.remove_cultist(EX.mind, 1, 0) From 7c4373c1fe257c32237ecda756bc7a6241ef23f4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 21:15:11 -0500 Subject: [PATCH 19/54] Update cult_items.dm --- code/game/gamemodes/cult/cult_items.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 62fe64ecee..2780598d06 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -163,7 +163,7 @@ /obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) . = ..() - if(dash_toggled) + if(dash_toggled && jaunt.IsAvailable()) jaunt.Teleport(user, target) return if(!proximity) @@ -193,7 +193,7 @@ phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out /datum/action/innate/dash/cult/IsAvailable() - if(iscultist(holder) && current_charges) + if(iscultist(holder) && charged) return TRUE else return FALSE From c2d8f048f864a2bf1e0246f9f453bef8814f6481 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Wed, 4 Oct 2017 21:49:46 -0500 Subject: [PATCH 20/54] Update cult_items.dm --- code/game/gamemodes/cult/cult_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 2780598d06..a3da1c6cbe 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -193,7 +193,7 @@ phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out /datum/action/innate/dash/cult/IsAvailable() - if(iscultist(holder) && charged) + if(iscultist(holder) && current_charges) return TRUE else return FALSE From fb7a0d7606baf3de9f8b5d6764042313ee7dc087 Mon Sep 17 00:00:00 2001 From: RandomMarine Date: Wed, 4 Oct 2017 21:24:02 -0700 Subject: [PATCH 21/54] Experimental fix for bloom issue (#31299) --- code/modules/mob/living/simple_animal/simple_animal.dm | 7 ------- 1 file changed, 7 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 4edf7a6dcb..d4b2c8f7c6 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -101,13 +101,6 @@ init_belly() verbs |= /mob/living/proc/animal_nom - -/mob/living/simple_animal/Login() - if(src && src.client) - src.client.screen = list() - client.screen += client.void - ..() - /mob/living/simple_animal/updatehealth() ..() health = Clamp(health, 0, maxHealth) From d50c0e10f6be578d98c8e4892612af560a228bfd Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Thu, 5 Oct 2017 03:30:32 -0400 Subject: [PATCH 23/54] Makes shuttle movement a bit smoother and faster --- code/modules/shuttle/on_move.dm | 22 +++++++++++----------- code/modules/shuttle/shuttle.dm | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index b527894d0a..2359a130cb 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -203,7 +203,7 @@ All ShuttleMove procs go here if(pipe_vision_img) pipe_vision_img.loc = loc -/obj/machinery/computer/auxillary_base/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/obj/machinery/computer/auxillary_base/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) . = ..() if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery SSblackbox.add_details("colonies_dropped", "[x]|[y]|[z]") //Number of times a base has been dropped! @@ -297,24 +297,25 @@ All ShuttleMove procs go here /************************************Item move procs************************************/ -/obj/item/storage/pod/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) +/obj/item/storage/pod/afterShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) + . = ..() unlocked = TRUE // If the pod was launched, the storage will always open. - return ..() /************************************Mob move procs************************************/ /mob/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) if(!move_on_shuttle) - return 0 - . = ..() - if(!.) return - if(client) + . = ..() + +/mob/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) + . = ..() + if(client && movement_force) + var/shake_force = max(movement_force["THROW"], movement_force["KNOCKDOWN"]) if(buckled) - shake_camera(src, 2, 1) // turn it down a bit come on - else - shake_camera(src, 7, 1) + shake_force *= 0.25 + shake_camera(src, shake_force, 1) /mob/living/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) . = ..() @@ -373,7 +374,6 @@ All ShuttleMove procs go here /obj/docking_port/stationary/public_mining_dock/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) id = "mining_public" //It will not move with the base, but will become enabled as a docking point. - return 0 /obj/effect/abstract/proximity_checker/onShuttleMove(turf/newT, turf/oldT, rotation, list/movement_force, move_dir, old_dock) //timer so it only happens once diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 99d707d289..88daa3a016 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -553,6 +553,8 @@ var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved + CHECK_TICK + /****************************************All beforeShuttleMove procs*****************************************/ var/index = 0 for(var/place in old_turfs) @@ -578,6 +580,7 @@ areas_to_move[old_area] = TRUE old_turfs[place] = move_mode + CHECK_TICK /*******************************************All onShuttleMove procs******************************************/ @@ -608,17 +611,32 @@ var/turf/oldT = thing var/turf/newT = new_turfs[index] newT.afterShuttleMove(oldT) //turfs + CHECK_TICK for(var/i in 1 to moved_atoms.len) var/atom/movable/moved_object = moved_atoms[i] moved_object.afterShuttleMove(movement_force, dir, preferred_direction, movement_direction) //atoms + CHECK_TICK underlying_old_area.afterShuttleMove() for(var/thing in areas_to_move) var/area/internal_area = thing internal_area.afterShuttleMove() //areas + CHECK_TICK +<<<<<<< HEAD +======= + // Parallax handling + var/new_parallax_dir = FALSE + if(istype(new_dock, /obj/docking_port/stationary/transit)) + new_parallax_dir = preferred_direction + for(var/i in shuttle_areas) + var/area/place = i + place.parallax_movedir = new_parallax_dir + CHECK_TICK + +>>>>>>> e16fd1b... Makes shuttle movement a bit smoother and faster (#31255) check_poddoors() new_dock.last_dock_time = world.time setDir(new_dock.dir) From 0cdda0ea7c853223c9caf5c27c4715edefc67635 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 20:59:08 +1300 Subject: [PATCH 24/54] Merge pull request #31297 from ShizCalev/ninja-sword-sprite-fix Corrects ninja sword mob sprite --- icons/mob/belt.dmi | Bin 16620 -> 16627 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index f73a54ab1d17ba5acaebfc127305798897d9f613..1ae0b0a2b59233ef6f333e6c093bc4894b3e15f1 100644 GIT binary patch delta 5327 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 delta 5357 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 IeDmS|05ZG@6aWAK From 4ecc019353f408d8cfe7fb8e53aec10f761d6b36 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Thu, 5 Oct 2017 03:58:49 -0400 Subject: [PATCH 26/54] Moved admin music volume slider to its own menu (#31277) * Moved admin music volume slider to its own menu * Minor fixes to goonchat --- .../browserassets/css/browserOutput.css | 24 ++--- .../browserassets/html/browserOutput.html | 25 +++-- .../browserassets/js/browserOutput.js | 97 +++++++++++-------- 3 files changed, 84 insertions(+), 62 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index f6810d0b05..153444c0ed 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -83,7 +83,7 @@ a.popt {text-decoration: none;} #ping { position: fixed; top: 0; - right: 40px; + right: 80px; width: 45px; background: #ddd; height: 30px; @@ -96,12 +96,12 @@ a.popt {text-decoration: none;} font-size: 8pt; padding-top: 2px; } -#options { +#userBar { position: fixed; top: 0; right: 0; } -#options .optionsCell { +#userBar .subCell { background: #ddd; height: 30px; padding: 5px 0; @@ -111,23 +111,23 @@ a.popt {text-decoration: none;} line-height: 28px; border-top: 1px solid #b4b4b4; } -#options .optionsCell:hover {background: #ccc;} -#options .toggle { +#userBar .subCell:hover {background: #ccc;} +#userBar .toggle { width: 40px; background: #ccc; border-top: 0; float: right; text-align: center; } -#options .sub {clear: both; display: none; width: 160px;} -#options .sub.scroll {overflow-y: scroll;} -#options .sub.optionsCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} -#options .sub span { +#userBar .sub {clear: both; display: none; width: 160px;} +#userBar .sub.scroll {overflow-y: scroll;} +#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} +#userBar .sub span { display: block; line-height: 30px; float: left; } -#options .sub i { +#userBar .sub i { display: block; padding: 0 5px; font-size: 1.1em; @@ -136,14 +136,14 @@ a.popt {text-decoration: none;} line-height: 30px; float: right; } -#options .sub input { +#userBar .sub input { position: absolute; padding: 7px 5px; width: 121px; line-height: 30px; float: left; } -#options .decreaseFont {border-top: 0;} +#userBar .topCell {border-top: 0;} /* POPUPS */ .popup { diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html index a9e30b6b51..7b2d3ecfe0 100644 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ b/code/modules/goonchat/browserassets/html/browserOutput.html @@ -27,17 +27,22 @@ --ms +
+ +
+ +
+ Admin music volume
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index bb555982cc..f027b523aa 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -22,7 +22,7 @@ window.onerror = function(msg, url, line, col, error) { //Globals window.status = 'Output'; -var $messages, $subOptions, $contextMenu, $filterMessages; +var $messages, $subOptions, $subAudio, $selectedSub, $contextMenu, $filterMessages; var opts = { //General 'messageCount': 0, //A count...of messages... @@ -37,8 +37,8 @@ var opts = { 'restarting': false, //Is the round restarting? //Options menu - 'subOptionsLoop': null, //Contains the interval loop for closing the options menu - 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu + 'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu + 'suppressSubClose': false, //Whether or not we should be hiding the selected sub menu 'highlightTerms': [], 'highlightLimit': 5, 'highlightColor': '#FFFF00', //The color of the highlighted message @@ -483,6 +483,46 @@ function sendVolumeUpdate() { } } +function subSlideUp() { + $(this).removeClass('scroll'); + $(this).css('height', ''); +} + +function startSubLoop() { + if (opts.selectedSubLoop) { + clearInterval(opts.selectedSubLoop); + } + return setInterval(function() { + if (!opts.suppressSubClose && $selectedSub.is(':visible')) { + $selectedSub.slideUp('fast', subSlideUp); + clearInterval(opts.selectedSubLoop); + } + }, 5000); //every 5 seconds +} + +function handleToggleClick($sub, $toggle) { + if ($selectedSub !== $sub && $selectedSub.is(':visible')) { + $selectedSub.slideUp('fast', subSlideUp); + } + $selectedSub = $sub + if ($selectedSub.is(':visible')) { + $selectedSub.slideUp('fast', subSlideUp); + clearInterval(opts.selectedSubLoop); + } else { + $selectedSub.slideDown('fast', function() { + var windowHeight = $(window).height(); + var toggleHeight = $toggle.outerHeight(); + var priorSubHeight = $selectedSub.outerHeight(); + var newSubHeight = windowHeight - toggleHeight; + $(this).height(newSubHeight); + if (priorSubHeight > (windowHeight - toggleHeight)) { + $(this).addClass('scroll'); + } + }); + opts.selectedSubLoop = startSubLoop(); + } +} + /***************************************** * * DOM READY @@ -497,6 +537,8 @@ if (typeof $ === 'undefined') { $(function() { $messages = $('#messages'); $subOptions = $('#subOptions'); + $subAudio = $('#subAudio'); + $selectedSub = $subOptions; //Hey look it's a controller loop! setInterval(function() { @@ -607,12 +649,9 @@ $(function() { }); $messages.on('mousedown', function(e) { - if ($subOptions && $subOptions.is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); + if ($selectedSub && $selectedSub.is(':visible')) { + $selectedSub.slideUp('fast', subSlideUp); + clearInterval(opts.selectedSubLoop); } }); @@ -731,41 +770,19 @@ $(function() { }); $('#toggleOptions').click(function(e) { - if ($subOptions.is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); - } else { - $subOptions.slideDown('fast', function() { - var windowHeight = $(window).height(); - var toggleHeight = $('#toggleOptions').outerHeight(); - var priorSubHeight = $subOptions.outerHeight(); - var newSubHeight = windowHeight - toggleHeight; - $(this).height(newSubHeight); - if (priorSubHeight > (windowHeight - toggleHeight)) { - $(this).addClass('scroll'); - } - }); - opts.subOptionsLoop = setInterval(function() { - if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) { - $subOptions.slideUp('fast', function() { - $(this).removeClass('scroll'); - $(this).css('height', ''); - }); - clearInterval(opts.subOptionsLoop); - } - }, 5000); //Every 5 seconds - } + handleToggleClick($subOptions, $(this)); }); - $('#subOptions, #toggleOptions').mouseenter(function() { - opts.suppressOptionsClose = true; + $('#toggleAudio').click(function(e) { + handleToggleClick($subAudio, $(this)); }); - $('#subOptions, #toggleOptions').mouseleave(function() { - opts.suppressOptionsClose = false; + $('.sub, .toggle').mouseenter(function() { + opts.suppressSubClose = true; + }); + + $('.sub, .toggle').mouseleave(function() { + opts.suppressSubClose = false; }); $('#decreaseFont').click(function(e) { From 682269ab63fd800717079ddd05ed7e282cbcd40c Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Thu, 5 Oct 2017 04:00:06 -0400 Subject: [PATCH 28/54] Lizzers and plasmamen can now be servants of Ratvar (#31244) * Removes racial discrimination from Ratvar's servants * Activates plasma internals; thank you Y0SH1M4S73R! * Update clock_cult.dm --- code/game/gamemodes/clock_cult/clock_cult.dm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 7d6f9bcdd1..261a258101 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -163,7 +163,6 @@ Credit where due: if(!M || !ishuman(M)) return FALSE var/mob/living/carbon/human/L = M - L.set_species(/datum/species/human) L.equipOutfit(/datum/outfit/servant_of_ratvar) var/obj/item/clockwork/slab/S = new var/slot = "At your feet" @@ -239,6 +238,7 @@ Credit where due: //Servant of Ratvar outfit /datum/outfit/servant_of_ratvar + name = "Servant of Ratvar" uniform = /obj/item/clothing/under/chameleon/ratvar shoes = /obj/item/clothing/shoes/workboots back = /obj/item/storage/backpack @@ -248,6 +248,15 @@ Credit where due: backpack_contents = list(/obj/item/storage/box/engineer = 1, \ /obj/item/clockwork/replica_fabricator = 1, /obj/item/stack/tile/brass/fifty = 1, /obj/item/paper/servant_primer = 1) id = /obj/item/card/id + var/plasmaman //We use this to determine if we should activate internals in post_equip() + +/datum/outfit/servant_of_ratvar/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(H.dna.species.id == "plasmaman") //Plasmamen get additional equipment because of how they work + head = /obj/item/clothing/head/helmet/space/plasmaman + uniform = /obj/item/clothing/under/plasmaman //Plasmamen generally shouldn't need chameleon suits anyways, since everyone expects them to wear their fire suit + r_hand = /obj/item/tank/internals/plasmaman/belt/full + mask = /obj/item/clothing/mask/breath + plasmaman = TRUE /datum/outfit/servant_of_ratvar/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) var/obj/item/card/id/W = H.wear_id @@ -255,6 +264,9 @@ Credit where due: W.access += ACCESS_MAINT_TUNNELS W.registered_name = H.real_name W.update_label() + if(plasmaman && !visualsOnly) //If we need to breathe from the plasma tank, we should probably start doing that + H.internal = H.get_item_for_held_index(2) + H.update_internals_hud_icon(1) /obj/item/paper/servant_primer name = "The Ark And You: A Primer On Servitude" From 574e1669517a19f858e6c8182192549f92350063 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 21:01:19 +1300 Subject: [PATCH 30/54] Merge pull request #31269 from Firecage/doublehardsuitrebalance Makes the ERT and Chronosuit hardsuits and helmets have the same armor stats. --- code/modules/clothing/spacesuits/chronosuit.dm | 2 +- code/modules/clothing/spacesuits/miscellaneous.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index dfc2421add..e15f54a500 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -4,7 +4,7 @@ icon_state = "chronohelmet" item_state = "chronohelmet" slowdown = 1 - armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100) + armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90, fire = 100, acid = 100) resistance_flags = FIRE_PROOF | ACID_PROOF var/obj/item/clothing/suit/space/chronos/suit = null diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index c5af37506c..1136be711f 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -173,7 +173,7 @@ Contains: item_state = "ert_command" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list(melee = 30, bullet = 50, laser = 30, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 0, acid = 95) + armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100, fire = 80, acid = 80) slowdown = 0 strip_delay = 130 From ad08855056f538e7ffb70a079d65c1293633b4fc Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 21:03:34 +1300 Subject: [PATCH 32/54] Merge pull request #31291 from ShizCalev/shuttle-templates Cleans up non-timid shuttle templates & some dirty vars --- _maps/map_files/BoxStation/BoxStation.dmm | 1 - _maps/map_files/OmegaStation/OmegaStation.dmm | 1 - _maps/shuttles/emergency_box.dmm | 2 +- _maps/shuttles/whiteship_box.dmm | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 1ef76788eb..0562f3c77f 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2282,7 +2282,6 @@ }, /obj/docking_port/mobile/emergency{ name = "Box emergency shuttle"; - timid = 0 }, /obj/docking_port/stationary{ dir = 4; diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 14282b7ebf..2badff3bb5 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -16885,7 +16885,6 @@ dwidth = 5; height = 11; name = "Omega emergency shuttle"; - timid = 0; width = 19 }, /obj/docking_port/stationary{ diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 1645d971c2..5d09eb9614 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -224,7 +224,7 @@ }, /obj/docking_port/mobile/emergency{ name = "Box emergency shuttle"; - timid = 0 + timid = 1 }, /turf/open/floor/plating, /area/shuttle/escape) diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 338212e727..49d9d76a77 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -21,7 +21,7 @@ port_direction = 8; preferred_direction = 4; roundstart_move = "whiteship_away"; - timid = null; + timid = 1; width = 35 }, /turf/open/floor/mineral/titanium, From cedb56af1ba7856c7719f9e3a0cf4be90c10e41c Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 21:05:16 +1300 Subject: [PATCH 34/54] Merge pull request #31302 from ninjanomnom/shuttle-rotation Move shuttleRotate into the shuttle module --- code/game/turfs/simulated/minerals.dm | 4 - code/modules/awaymissions/gateway.dm | 4 - code/modules/mining/equipment/survival_pod.dm | 8 -- code/modules/mob/mob.dm | 4 - code/modules/power/cable.dm | 15 --- code/modules/power/gravitygenerator.dm | 4 - code/modules/recycling/disposal-structures.dm | 10 -- code/modules/shuttle/on_move.dm | 37 +------ code/modules/shuttle/shuttle_rotate.dm | 100 ++++++++++++++++++ code/modules/shuttle/special.dm | 4 - tgstation.dme | 1 + 11 files changed, 102 insertions(+), 89 deletions(-) create mode 100644 code/modules/shuttle/shuttle_rotate.dm diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index a597022448..1a5d0b78ec 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -38,10 +38,6 @@ if(istype(T, /turf/closed/mineral/random)) Spread(T) -/turf/closed/mineral/shuttleRotate(rotation) - setDir(angle2dir(rotation+dir2angle(dir))) - queue_smooth(src) - /turf/closed/mineral/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) if(turf_type) underlay_appearance.icon = initial(turf_type.icon) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 12f99f3c50..a46b32f853 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -60,10 +60,6 @@ GLOBAL_DATUM(the_gateway, /obj/machinery/gateway/centerstation) return icon_state = "off" -//prevents shuttles attempting to rotate this since it messes up sprites -/obj/machinery/gateway/shuttleRotate() - return - /obj/machinery/gateway/attack_hand(mob/user) if(!detect()) return diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index bb44f22752..5fe25b1d1f 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -104,10 +104,6 @@ direction = expected_dir ..() -/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation) - expected_dir = angle2dir(rotation+dir2angle(dir)) - ..() - /obj/machinery/door/airlock/survival_pod/vertical dir = EAST expected_dir = EAST @@ -127,10 +123,6 @@ direction = expected_dir ..() -/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation) - expected_dir = angle2dir(rotation+dir2angle(dir)) - ..() - /obj/structure/door_assembly/door_assembly_pod/vertical dir = EAST expected_dir = EAST diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c75e0a27fb..4165651dbd 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -743,10 +743,6 @@ mob_spell_list -= S qdel(S) -//override to avoid rotating pixel_xy on mobs -/mob/shuttleRotate(rotation) - setDir(angle2dir(rotation+dir2angle(dir))) - //You can buckle on mobs if you're next to them since most are dense /mob/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE) if(M.buckled) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 37ec831462..503eb88cd2 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -437,21 +437,6 @@ By design, d1 is the smallest direction and d2 is the highest if(!P.connect_to_network()) //can't find a node cable on a the turf to connect to P.disconnect_from_network() //remove from current network -/obj/structure/cable/shuttleRotate(rotation) - //..() is not called because wires are not supposed to have a non-default direction - //Rotate connections - if(d1) - d1 = angle2dir(rotation+dir2angle(d1)) - if(d2) - d2 = angle2dir(rotation+dir2angle(d2)) - - //d1 should be less than d2 for cable icons to work - if(d1 > d2) - var/temp = d1 - d1 = d2 - d2 = temp - update_icon() - /////////////////////////////////////////////// // The cable coil object, used for laying cable diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 346ede4eb8..3ad3f6bc13 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -48,10 +48,6 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne ..() icon_state = "[get_status()]_[sprite_number]" -//prevents shuttles attempting to rotate this since it messes up sprites -/obj/machinery/gravity_generator/shuttleRotate() - return - /obj/machinery/gravity_generator/proc/get_status() return "off" diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index acb89f4bee..2fe36972e0 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -339,16 +339,6 @@ if(current_size >= STAGE_FIVE) deconstruct() -//Fixes dpdir on shuttle rotation -/obj/structure/disposalpipe/shuttleRotate(rotation) - ..() - var/new_dpdir = 0 - for(var/D in GLOB.cardinals) - if(dpdir & D) - new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D)) - dpdir = new_dpdir - - // *** TEST verb //client/verb/dispstop() // for(var/obj/structure/disposalholder/H in world) diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index b527894d0a..5ded58450a 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -83,7 +83,7 @@ All ShuttleMove procs go here return if(rotation) - shuttleRotate(rotation) + shuttleRotate(rotation) //see shuttle_rotate.dm loc = newT if(length(client_mobs_in_contents)) update_parallax_contents() @@ -126,26 +126,6 @@ All ShuttleMove procs go here /area/proc/afterShuttleMove() return TRUE -/************************************Shuttle Rotation************************************/ - -/atom/proc/shuttleRotate(rotation) - //rotate our direction - setDir(angle2dir(rotation+dir2angle(dir))) - - //resmooth if need be. - if(smooth) - queue_smooth(src) - - //rotate the pixel offsets too. - if (pixel_x || pixel_y) - if (rotation < 0) - rotation += 360 - for (var/turntimes=rotation/90;turntimes>0;turntimes--) - var/oldPX = pixel_x - var/oldPY = pixel_y - pixel_x = oldPY - pixel_y = (oldPX*(-1)) - /************************************Turf move procs************************************/ /turf/open/afterShuttleMove(turf/oldT) //Recalculates SSair stuff for turfs on both sides @@ -223,21 +203,6 @@ All ShuttleMove procs go here . = ..() . |= MOVE_CONTENTS -//Properly updates pipes on shuttle movement -/obj/machinery/atmospherics/shuttleRotate(rotation) - var/list/real_node_connect = getNodeConnects() - for(DEVICE_TYPE_LOOP) - real_node_connect[I] = angle2dir(rotation+dir2angle(real_node_connect[I])) - - . = ..() - SetInitDirections() - var/list/supposed_node_connect = getNodeConnects() - var/list/nodes_copy = nodes.Copy() - - for(DEVICE_TYPE_LOOP) - var/new_pos = supposed_node_connect.Find(real_node_connect[I]) - nodes[new_pos] = nodes_copy[I] - /obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir) . = ..() var/missing_nodes = FALSE diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm new file mode 100644 index 0000000000..389a2406ed --- /dev/null +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -0,0 +1,100 @@ +/* +All shuttleRotate procs go here +*/ + +/************************************Base proc************************************/ + +/atom/proc/shuttleRotate(rotation) + //rotate our direction + setDir(angle2dir(rotation+dir2angle(dir))) + + //resmooth if need be. + if(smooth) + queue_smooth(src) + + //rotate the pixel offsets too. + if (pixel_x || pixel_y) + if (rotation < 0) + rotation += 360 + for (var/turntimes=rotation/90;turntimes>0;turntimes--) + var/oldPX = pixel_x + var/oldPY = pixel_y + pixel_x = oldPY + pixel_y = (oldPX*(-1)) + +/************************************Turf rotate procs************************************/ + +/turf/closed/mineral/shuttleRotate(rotation) + setDir(angle2dir(rotation+dir2angle(dir))) + queue_smooth(src) + +/************************************Mob rotate procs************************************/ + +//override to avoid rotating pixel_xy on mobs +/mob/shuttleRotate(rotation) + setDir(angle2dir(rotation+dir2angle(dir))) + +/************************************Structure rotate procs************************************/ + +/obj/structure/door_assembly/door_assembly_pod/shuttleRotate(rotation) + . = ..() + expected_dir = angle2dir(rotation+dir2angle(dir)) + +/obj/structure/cable/shuttleRotate(rotation) + //..() is not called because wires are not supposed to have a non-default direction + //Rotate connections + if(d1) + d1 = angle2dir(rotation+dir2angle(d1)) + if(d2) + d2 = angle2dir(rotation+dir2angle(d2)) + + //d1 should be less than d2 for cable icons to work + if(d1 > d2) + var/temp = d1 + d1 = d2 + d2 = temp + update_icon() + +//Fixes dpdir on shuttle rotation +/obj/structure/disposalpipe/shuttleRotate(rotation) + . = ..() + var/new_dpdir = 0 + for(var/D in GLOB.cardinals) + if(dpdir & D) + new_dpdir = new_dpdir | angle2dir(rotation+dir2angle(D)) + dpdir = new_dpdir + +/obj/structure/table/wood/bar/shuttleRotate(rotation) + . = ..() + boot_dir = angle2dir(rotation + dir2angle(boot_dir)) + +/obj/structure/alien/weeds/shuttleRotate(rotation) + return + +/************************************Machine rotate procs************************************/ + +/obj/machinery/atmospherics/shuttleRotate(rotation) + var/list/real_node_connect = getNodeConnects() + for(DEVICE_TYPE_LOOP) + real_node_connect[I] = angle2dir(rotation+dir2angle(real_node_connect[I])) + + . = ..() + SetInitDirections() + var/list/supposed_node_connect = getNodeConnects() + var/list/nodes_copy = nodes.Copy() + + for(DEVICE_TYPE_LOOP) + var/new_pos = supposed_node_connect.Find(real_node_connect[I]) + nodes[new_pos] = nodes_copy[I] + +//prevents shuttles attempting to rotate this since it messes up sprites +/obj/machinery/gateway/shuttleRotate() + return + +/obj/machinery/door/airlock/survival_pod/shuttleRotate(rotation) + expected_dir = angle2dir(rotation+dir2angle(dir)) + return ..() + +//prevents shuttles attempting to rotate this since it messes up sprites +/obj/machinery/gravity_generator/shuttleRotate() + return \ No newline at end of file diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 0373ea5b53..f2d451f6e2 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -195,10 +195,6 @@ else . = ..() -/obj/structure/table/wood/bar/shuttleRotate(rotation) - . = ..() - boot_dir = angle2dir(rotation + dir2angle(boot_dir)) - /obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user) . = FALSE if(ishuman(user)) diff --git a/tgstation.dme b/tgstation.dme index 2dba779e78..8b927cf2bb 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2154,6 +2154,7 @@ #include "code\modules\shuttle\on_move.dm" #include "code\modules\shuttle\ripple.dm" #include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\shuttle_rotate.dm" #include "code\modules\shuttle\special.dm" #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" From bb9982e772a7254a6d70ffb585c8a5e19f62cd7d Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 5 Oct 2017 21:04:20 +1300 Subject: [PATCH 36/54] Merge pull request #31296 from ShizCalev/landmark-cleanup Cleans up and fixes old landmarks --- code/datums/mind.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 10 +++------- code/modules/mob/dead/new_player/new_player.dm | 2 +- code/modules/shuttle/manipulator.dm | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 093e828452..0e1b754fc9 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1119,7 +1119,7 @@ message_admins("[key_name_admin(usr)] has nuke op'ed [current].") log_admin("[key_name(usr)] has nuke op'ed [current].") if("lair") - current.forceMove(get_turf(locate("landmark*Syndicate-Spawn"))) + current.forceMove(pick(GLOB.nukeop_start)) if("dressup") var/mob/living/carbon/human/H = current qdel(H.belt) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index e354d26ab0..e81ab011e4 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -381,13 +381,10 @@ Traitors and the like can also be revived with the previous role mostly intact. switch(new_character.mind.special_role) if("Wizard") - new_character.loc = pick(GLOB.wizardstart) - //SSticker.mode.learn_basic_spells(new_character) + new_character.forceMove(pick(GLOB.wizardstart)) SSticker.mode.equip_wizard(new_character) if("Syndicate") - var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn") - if(synd_spawn) - new_character.loc = get_turf(synd_spawn) + new_character.forceMove(pick(GLOB.nukeop_start)) call(/datum/game_mode/proc/equip_syndicate)(new_character) if("Space Ninja") var/list/ninja_spawn = list() @@ -396,8 +393,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/datum/antagonist/ninja/ninjadatum = new_character.mind.has_antag_datum(ANTAG_DATUM_NINJA) ninjadatum.equip_space_ninja() if(ninja_spawn.len) - var/obj/effect/landmark/ninja_spawn_here = pick(ninja_spawn) - new_character.loc = ninja_spawn_here.loc + new_character.forceMove(pick(ninja_spawn)) else//They may also be a cyborg or AI. switch(new_character.mind.assigned_role) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index aca1d9b63f..666fd767ba 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -273,7 +273,7 @@ observer.started_as_observer = TRUE close_spawn_windows() - var/obj/O = locate("landmark*Observer-Start") + var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list to_chat(src, "Now teleporting.") if (O) observer.loc = O.loc diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 6e2741a6d7..3da4bcc03e 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -242,7 +242,7 @@ /obj/machinery/shuttle_manipulator/proc/load_template( datum/map_template/shuttle/S) // load shuttle template, centred at shuttle import landmark, - var/turf/landmark_turf = get_turf(locate("landmark*Shuttle Import")) + var/turf/landmark_turf = get_turf(locate(/obj/effect/landmark/shuttle_import) in GLOB.landmarks_list) S.load(landmark_turf, centered = TRUE) var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE) From 08f3503a810d27e5ff23ddc929b355fc6661a7c4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 5 Oct 2017 05:14:27 -0500 Subject: [PATCH 38/54] Update holder.dm --- code/modules/reagents/chemistry/holder.dm | 29 ----------------------- 1 file changed, 29 deletions(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index c383dd5a7d..927ccb9994 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -16,12 +16,6 @@ /datum/reagents/New(maximum=100) maximum_volume = maximum -<<<<<<< HEAD - if(!(flags_1 & REAGENT_NOREACT)) - START_PROCESSING(SSobj, src) -======= ->>>>>>> b8ea267... Merge pull request #31281 from vuonojenmustaturska/clowncult - //I dislike having these here but map-objects are initialised before world/New() is called. >_> if(!GLOB.chemical_reagents_list) //Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id @@ -290,34 +284,11 @@ C.update_stamina() update_total() -<<<<<<< HEAD -/datum/reagents/process() - var/list/cached_reagents = reagent_list - if(flags_1 & REAGENT_NOREACT) - STOP_PROCESSING(SSobj, src) - return - - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - R.on_tick() - -/datum/reagents/proc/set_reacting(react = TRUE) - if(react) - // Order is important, process() can remove from processing if - // the flag is present - flags_1 &= ~(REAGENT_NOREACT) - START_PROCESSING(SSobj, src) - else - STOP_PROCESSING(SSobj, src) - flags_1 |= REAGENT_NOREACT -======= - /datum/reagents/proc/set_reacting(react = TRUE) if(react) flags &= ~(REAGENT_NOREACT) else flags |= REAGENT_NOREACT ->>>>>>> b8ea267... Merge pull request #31281 from vuonojenmustaturska/clowncult /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) var/list/cached_reagents = reagent_list From abeb003465cc9bbb15d7a32d9b66a3fc90684358 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 5 Oct 2017 05:18:04 -0500 Subject: [PATCH 39/54] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 999d2255ac..dddac1e506 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -3,7 +3,7 @@ //This is the current version, anything below this will attempt to update (if it's not obsolete) #define SAVEFILE_VERSION_MAX 20 - +/* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating It is to be used by the load_character and load_preferences procs. From 47b72055cde3a7213e2b2b0bf0a8695783da539c Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 5 Oct 2017 05:19:49 -0500 Subject: [PATCH 40/54] Update shuttle.dm --- code/modules/shuttle/shuttle.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 88daa3a016..22368c92fb 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -625,8 +625,6 @@ internal_area.afterShuttleMove() //areas CHECK_TICK -<<<<<<< HEAD -======= // Parallax handling var/new_parallax_dir = FALSE if(istype(new_dock, /obj/docking_port/stationary/transit)) @@ -635,8 +633,6 @@ var/area/place = i place.parallax_movedir = new_parallax_dir CHECK_TICK - ->>>>>>> e16fd1b... Makes shuttle movement a bit smoother and faster (#31255) check_poddoors() new_dock.last_dock_time = world.time setDir(new_dock.dir) From ced865f76dbca281bbeb7b1df9dff9aef59aa4a7 Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 5 Oct 2017 08:47:31 -0300 Subject: [PATCH 41/54] Merge pull request #31290 from YPOQ/jaunterfix Fixes jaunters chasm-saving feature --- code/modules/mining/equipment/wormhole_jaunter.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index d72d0e5f73..28a946a56b 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -17,7 +17,7 @@ /obj/item/device/wormhole_jaunter/attack_self(mob/user) user.visible_message("[user.name] activates the [src.name]!") SSblackbox.add_details("jaunter", "User") // user activated - activate(user) + activate(user, TRUE) /obj/item/device/wormhole_jaunter/proc/turf_check(mob/user) var/turf/device_turf = get_turf(user) @@ -46,7 +46,7 @@ return destinations -/obj/item/device/wormhole_jaunter/proc/activate(mob/user) +/obj/item/device/wormhole_jaunter/proc/activate(mob/user, adjacent) if(!turf_check(user)) return @@ -56,7 +56,8 @@ return var/chosen_beacon = pick(L) var/obj/effect/portal/wormhole/jaunt_tunnel/J = new (get_turf(src), src, 100, null, FALSE, get_turf(chosen_beacon)) - try_move_adjacent(J) + if(adjacent) + try_move_adjacent(J) playsound(src,'sound/effects/sparks4.ogg',50,1) qdel(src) @@ -78,7 +79,7 @@ if(user.get_item_by_slot(slot_belt) == src) to_chat(user, "Your [src] activates, saving you from the chasm!") SSblackbox.add_details("jaunter","Chasm") // chasm automatic activation - activate(user) + activate(user, FALSE) else to_chat(user, "The [src] is not attached to your belt, preventing it from saving you from the chasm. RIP.") From 5a0d1e5aebec607b51c619d01430103bdcfc630a Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 5 Oct 2017 08:49:00 -0300 Subject: [PATCH 43/54] Merge pull request #31294 from YPOQ/sciencetoolfix Fix abductor scientist being unable to use science tool --- code/datums/antagonists/datum_abductor.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/datums/antagonists/datum_abductor.dm b/code/datums/antagonists/datum_abductor.dm index 6d08d61b8a..81329928b3 100644 --- a/code/datums/antagonists/datum_abductor.dm +++ b/code/datums/antagonists/datum_abductor.dm @@ -58,3 +58,9 @@ break SSticker.mode.update_abductor_icons_added(owner) + +/datum/antagonist/abductor/scientist/finalize_abductor() + ..() + var/mob/living/carbon/human/H = owner.current + var/datum/species/abductor/A = H.dna.species + A.scientist = TRUE From 8e1a31c8af16a6ab92450f907e629733566ed736 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 5 Oct 2017 06:51:59 -0500 Subject: [PATCH 45/54] Update holder.dm --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 927ccb9994..42980f4f4d 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -11,7 +11,7 @@ var/last_tick = 1 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() - var/flags_1 + var/flags /datum/reagents/New(maximum=100) maximum_volume = maximum From 3d364f08f22274c79bb12bf8e4f5a4abdaba6dd2 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 5 Oct 2017 07:11:14 -0500 Subject: [PATCH 46/54] Update holder.dm --- code/modules/reagents/chemistry/holder.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 42980f4f4d..eeb5016445 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -308,7 +308,7 @@ var/list/cached_reagents = reagent_list var/list/cached_reactions = GLOB.chemical_reactions_list var/datum/cached_my_atom = my_atom - if(flags_1 & REAGENT_NOREACT) + if(flags & REAGENT_NOREACT) return //Yup, no reactions here. No siree. var/reaction_occurred = 0 From ab44b9fb625b2893da9a890b60b595a5abf9b51b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 07:31:24 -0500 Subject: [PATCH 47/54] Automatic changelog generation for PR #3135 [ci skip] --- html/changelogs/AutoChangeLog-pr-3135.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3135.yml diff --git a/html/changelogs/AutoChangeLog-pr-3135.yml b/html/changelogs/AutoChangeLog-pr-3135.yml new file mode 100644 index 0000000000..faef26ffd8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3135.yml @@ -0,0 +1,4 @@ +author: "Naksu" +delete-after: True +changes: + - balance: "Pyrosium and cryostylane now react at ludicrous speeds." From fcad8c077a1a1185caf2709fa9e5081b32be8416 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 07:31:43 -0500 Subject: [PATCH 48/54] Automatic changelog generation for PR #3138 [ci skip] --- html/changelogs/AutoChangeLog-pr-3138.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3138.yml diff --git a/html/changelogs/AutoChangeLog-pr-3138.yml b/html/changelogs/AutoChangeLog-pr-3138.yml new file mode 100644 index 0000000000..3fdfa942c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3138.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - soundadd: "Space ninja energy katanas now make a swish when drawn!" From 20f88b815a54e2f9e9ed0492c57a42a4e11ad48d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 07:31:58 -0500 Subject: [PATCH 49/54] Automatic changelog generation for PR #3139 [ci skip] --- html/changelogs/AutoChangeLog-pr-3139.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3139.yml diff --git a/html/changelogs/AutoChangeLog-pr-3139.yml b/html/changelogs/AutoChangeLog-pr-3139.yml new file mode 100644 index 0000000000..88cb158819 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3139.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "Wizards will now have the correct name when attacked with Envy's knife!" From 28f5c31a72fc97c49529521f41007971ecd70de7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 07:38:21 -0500 Subject: [PATCH 50/54] Automatic changelog generation for PR #3142 [ci skip] --- html/changelogs/AutoChangeLog-pr-3142.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3142.yml diff --git a/html/changelogs/AutoChangeLog-pr-3142.yml b/html/changelogs/AutoChangeLog-pr-3142.yml new file mode 100644 index 0000000000..e502707a59 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3142.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "The PDA default font has been switched from \"eye bleed\" to old-style monospace. Check your preference." From 986e06d721a07c63241b3a356de7ff83ed97cbe7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 07:45:57 -0500 Subject: [PATCH 51/54] Automatic changelog generation for PR #3144 [ci skip] --- html/changelogs/AutoChangeLog-pr-3144.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3144.yml diff --git a/html/changelogs/AutoChangeLog-pr-3144.yml b/html/changelogs/AutoChangeLog-pr-3144.yml new file mode 100644 index 0000000000..bf65dca23d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3144.yml @@ -0,0 +1,4 @@ +author: "RandomMarine" +delete-after: True +changes: + - bugfix: "Simple mobs should no longer experience severe hud/lighting glitches when reconnecting." From 905e1806a1f8b18049249c6f0fbf7a406ad74d2b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 08:10:49 -0500 Subject: [PATCH 52/54] Automatic changelog generation for PR #3147 [ci skip] --- html/changelogs/AutoChangeLog-pr-3147.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3147.yml diff --git a/html/changelogs/AutoChangeLog-pr-3147.yml b/html/changelogs/AutoChangeLog-pr-3147.yml new file mode 100644 index 0000000000..556149df01 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3147.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - tweak: "Admin volume slider moved to its own menu for better visibility." From e84b7a7af6e5354ad90014c52d56ef5188b8803a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 08:11:39 -0500 Subject: [PATCH 53/54] Automatic changelog generation for PR #3148 [ci skip] --- html/changelogs/AutoChangeLog-pr-3148.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3148.yml diff --git a/html/changelogs/AutoChangeLog-pr-3148.yml b/html/changelogs/AutoChangeLog-pr-3148.yml new file mode 100644 index 0000000000..c9662ac387 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3148.yml @@ -0,0 +1,4 @@ +author: "Xhuis and Y0SH1_M4S73R" +delete-after: True +changes: + - bugfix: "Servants of Ratvar now spawn in as the actual race set on their preferences, with plasmamen getting the gear they need to not immediately die." From 18465adc90788b82e829a447dc935652bc00f44a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 5 Oct 2017 08:12:46 -0500 Subject: [PATCH 54/54] Automatic changelog generation for PR #3153 [ci skip] --- html/changelogs/AutoChangeLog-pr-3153.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3153.yml diff --git a/html/changelogs/AutoChangeLog-pr-3153.yml b/html/changelogs/AutoChangeLog-pr-3153.yml new file mode 100644 index 0000000000..a79a3982ca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3153.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Jaunters equipped on the belt slot will save you from chasms again."