From f2b04be5611c8d0d961a0719299a9067c2f6936d Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 25 Jan 2020 02:16:45 +0100
Subject: [PATCH 001/224] More Runtimenator fixes.
---
.../objects/items/robot/robot_upgrades.dm | 39 +++++++------------
code/game/objects/items/toys.dm | 1 +
code/modules/games/cards.dm | 0
code/modules/hydroponics/plant_genes.dm | 2 +-
code/modules/mob/living/living.dm | 2 +-
5 files changed, 18 insertions(+), 26 deletions(-)
delete mode 100644 code/modules/games/cards.dm
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 62f36c60c0..09c2d442e8 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -203,7 +203,7 @@
var/obj/item/gun/energy/kinetic_accelerator/cyborg/KA = new (R.module)
R.module.basic_modules += KA
R.module.add_module(KA, FALSE, TRUE)
-
+
/obj/item/borg/upgrade/advcutter
name = "mining cyborg advanced plasma cutter"
@@ -335,7 +335,6 @@
var/msg_cooldown = 0
var/on = FALSE
var/powercost = 10
- var/mob/living/silicon/robot/cyborg
var/datum/action/toggle_action
/obj/item/borg/upgrade/selfrepair/action(mob/living/silicon/robot/R, user = usr)
@@ -346,7 +345,6 @@
to_chat(user, "This unit is already equipped with a self-repair module.")
return FALSE
- cyborg = R
icon_state = "selfrepair_off"
toggle_action = new /datum/action/item_action/toggle(src)
toggle_action.Grant(R)
@@ -354,34 +352,20 @@
/obj/item/borg/upgrade/selfrepair/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if (.)
- toggle_action.Remove(cyborg)
+ toggle_action.Remove(R)
QDEL_NULL(toggle_action)
- cyborg = null
- deactivate_sr()
-
-/obj/item/borg/upgrade/selfrepair/dropped()
- . = ..()
- addtimer(CALLBACK(src, .proc/check_dropped), 1)
-
-/obj/item/borg/upgrade/selfrepair/proc/check_dropped()
- if(loc != cyborg)
- toggle_action.Remove(cyborg)
- QDEL_NULL(toggle_action)
- cyborg = null
deactivate_sr()
/obj/item/borg/upgrade/selfrepair/ui_action_click()
- on = !on
if(on)
- to_chat(cyborg, "You activate the self-repair module.")
- START_PROCESSING(SSobj, src)
+ to_chat(toggle_action.owner, "You deactivate the self-repair module.")
+ deactivate_sr()
else
- to_chat(cyborg, "You deactivate the self-repair module.")
- STOP_PROCESSING(SSobj, src)
- update_icon()
+ to_chat(toggle_action.owner, "You activate the self-repair module.")
+ activate_sr()
/obj/item/borg/upgrade/selfrepair/update_icon()
- if(cyborg)
+ if(toggle_action)
icon_state = "selfrepair_[on ? "on" : "off"]"
for(var/X in actions)
var/datum/action/A = X
@@ -389,6 +373,11 @@
else
icon_state = "cyborg_upgrade5"
+/obj/item/borg/upgrade/selfrepair/proc/activate_sr()
+ START_PROCESSING(SSobj, src)
+ on = TRUE
+ update_icon()
+
/obj/item/borg/upgrade/selfrepair/proc/deactivate_sr()
STOP_PROCESSING(SSobj, src)
on = FALSE
@@ -399,7 +388,9 @@
repair_tick = 1
return
- if(cyborg && (cyborg.stat != DEAD) && on)
+ var/mob/living/silicon/robot/cyborg = toggle_action.owner
+
+ if(istype(cyborg) && (cyborg.stat != DEAD) && on)
if(!cyborg.cell)
to_chat(cyborg, "Self-repair module deactivated. Please, insert the power cell.")
deactivate_sr()
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 92798528ae..60ab7ffbdf 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1012,6 +1012,7 @@
/obj/item/toy/cards/singlecard/examine(mob/user)
+ . = ..()
if(ishuman(user))
var/mob/living/carbon/human/cardUser = user
if(cardUser.is_holding(src))
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 99fd873995..358d017caf 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -107,7 +107,7 @@
// Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate)
/datum/plant_gene/reagent
name = "Nutriment"
- var/reagent_id = "nutriment"
+ var/reagent_id = /datum/reagent/nutriment
var/rate = 0.04
/datum/plant_gene/reagent/get_name()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a2689f0b5f..0d87edbb0e 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1073,7 +1073,7 @@
stop_pulling() //CIT CHANGE - Ditto...
else if(has_legs || ignore_legs)
lying = 0
- if (pulledby)
+ if (pulledby && isliving(pulledby))
var/mob/living/L = pulledby
L.update_pull_movespeed()
if(buckled)
From 5cf7c259fa0c7d43e4b8c2f0bcf167a771ab98a2 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Sat, 25 Jan 2020 02:39:58 +0100
Subject: [PATCH 002/224] Runtimenator 2: Compile-net
---
code/modules/hydroponics/plant_genes.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 358d017caf..087cc6dca5 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -107,7 +107,7 @@
// Reagent genes store reagent ID and reagent ratio. Amount of reagent in the plant = 1 + (potency * rate)
/datum/plant_gene/reagent
name = "Nutriment"
- var/reagent_id = /datum/reagent/nutriment
+ var/reagent_id = /datum/reagent/consumable/nutriment
var/rate = 0.04
/datum/plant_gene/reagent/get_name()
From 40b6ef79fe210a383d0ff41b2af711b92677d995 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 30 Jan 2020 19:15:07 +0100
Subject: [PATCH 003/224] reagent projectiles fix.
---
code/modules/projectiles/projectile.dm | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 55a75e1688..1564fe6ee0 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -211,11 +211,8 @@
L.on_hit(src)
var/reagent_note
- if(reagents && reagents.reagent_list)
- reagent_note = " REAGENTS:"
- for(var/datum/reagent/R in reagents.reagent_list)
- reagent_note += R.type + " ("
- reagent_note += num2text(R.volume) + ") "
+ if(reagents)
+ reagent_note = reagents.log_list()
if(ismob(firer))
log_combat(firer, L, "shot", src, reagent_note)
From d2520ee5f4d2ea714040030b0fa6ed7479bfd0ef Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 30 Jan 2020 19:45:01 +0100
Subject: [PATCH 004/224] Topic_input helper removal.
---
code/datums/helper_datums/topic_input.dm | 62 ----------------
.../mecha/equipment/tools/medical_tools.dm | 32 ++++-----
code/game/mecha/mech_fabricator.dm | 17 +++--
code/game/mecha/mecha_control_console.dm | 17 +++--
code/game/mecha/mecha_topic.dm | 70 +++++++++----------
tgstation.dme | 1 -
6 files changed, 68 insertions(+), 131 deletions(-)
delete mode 100644 code/datums/helper_datums/topic_input.dm
diff --git a/code/datums/helper_datums/topic_input.dm b/code/datums/helper_datums/topic_input.dm
deleted file mode 100644
index d07aec067e..0000000000
--- a/code/datums/helper_datums/topic_input.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-/datum/topic_input
- var/href
- var/list/href_list
-
-/datum/topic_input/New(thref,list/thref_list)
- href = thref
- href_list = thref_list.Copy()
- return
-
-/datum/topic_input/proc/get(i)
- return listgetindex(href_list,i)
-
-/datum/topic_input/proc/getAndLocate(i)
- var/t = get(i)
- if(t)
- t = locate(t)
- if (istext(t))
- t = null
- return t || null
-
-/datum/topic_input/proc/getNum(i)
- var/t = get(i)
- if(t)
- t = text2num(t)
- return isnum(t) ? t : null
-
-/datum/topic_input/proc/getObj(i)
- var/t = getAndLocate(i)
- return isobj(t) ? t : null
-
-/datum/topic_input/proc/getMob(i)
- var/t = getAndLocate(i)
- return ismob(t) ? t : null
-
-/datum/topic_input/proc/getTurf(i)
- var/t = getAndLocate(i)
- return isturf(t) ? t : null
-
-/datum/topic_input/proc/getAtom(i)
- return getType(i, /atom)
-
-/datum/topic_input/proc/getArea(i)
- var/t = getAndLocate(i)
- return isarea(t) ? t : null
-
-/datum/topic_input/proc/getStr(i)//params should always be text, but...
- var/t = get(i)
- return istext(t) ? t : null
-
-/datum/topic_input/proc/getType(i,type)
- var/t = getAndLocate(i)
- return istype(t,type) ? t : null
-
-/datum/topic_input/proc/getPath(i)
- var/t = get(i)
- if(t)
- t = text2path(t)
- return ispath(t) ? t : null
-
-/datum/topic_input/proc/getList(i)
- var/t = getAndLocate(i)
- return islist(t) ? t : null
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index c850e046a6..460537ecf6 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -108,16 +108,17 @@
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/Topic(href,href_list)
..()
- var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
- if(afilter.get("eject"))
+ if(href_list["eject"])
go_out()
- if(afilter.get("view_stats"))
+ if(href_list["view_stats"])
chassis.occupant << browse(get_patient_stats(),"window=msleeper")
onclose(chassis.occupant, "msleeper")
return
- if(afilter.get("inject"))
- inject_reagent(afilter.getType("inject", /datum/reagent),afilter.getObj("source"))
- return
+ if(href_list["inject"])
+ var/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/SG = locate() in chassis
+ var/datum/reagent/R = locate(href_list["inject"]) in SG.reagents.reagent_list
+ if (istype(R))
+ inject_reagent(R, SG)
/obj/item/mecha_parts/mecha_equipment/medical/sleeper/proc/get_patient_stats()
if(!patient)
@@ -354,19 +355,18 @@
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Topic(href,href_list)
..()
- var/datum/topic_input/afilter = new (href,href_list)
- if(afilter.get("toggle_mode"))
+ if (href_list["toggle_mode"])
mode = !mode
update_equip_info()
return
- if(afilter.get("select_reagents"))
+ if (href_list["select_reagents"])
processed_reagents.len = 0
var/m = 0
var/message
for(var/i=1 to known_reagents.len)
if(m>=synth_speed)
break
- var/reagent = afilter.get("reagent_[i]")
+ var/reagent = text2path(href_list["reagent_[i]"])
if(reagent && (reagent in known_reagents))
message = "[m ? ", " : null][known_reagents[reagent]]"
processed_reagents += reagent
@@ -375,20 +375,18 @@
message += " added to production"
START_PROCESSING(SSobj, src)
occupant_message(message)
- occupant_message("Reagent processing started.")
+ occupant_message("Reagent processing started.")
log_message("Reagent processing started.")
return
- if(afilter.get("show_reagents"))
+ if (href_list["show_reagents"])
chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
- if(afilter.get("purge_reagent"))
- var/reagent = afilter.get("purge_reagent")
+ if (href_list["purge_reagent"])
+ var/reagent = href_list["purge_reagent"]
if(reagent)
reagents.del_reagent(reagent)
return
- if(afilter.get("purge_all"))
+ if (href_list["purge_all"])
reagents.clear_reagents()
- return
- return
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/proc/get_reagents_page()
var/output = {"
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 98e4eb4258..caaa11ac9c 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -317,9 +317,8 @@
/obj/machinery/mecha_part_fabricator/Topic(href, href_list)
if(..())
return
- var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
if(href_list["part_set"])
- var/tpart_set = afilter.getStr("part_set")
+ var/tpart_set = href_list["part_set"]
if(tpart_set)
if(tpart_set=="clear")
part_set = null
@@ -327,7 +326,7 @@
part_set = tpart_set
screen = "parts"
if(href_list["part"])
- var/T = afilter.getStr("part")
+ var/T = href_list["part_set"]
for(var/v in stored_research.researched_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(v)
if(D.build_type & MECHFAB)
@@ -338,7 +337,7 @@
add_to_queue(D)
break
if(href_list["add_to_queue"])
- var/T = afilter.getStr("add_to_queue")
+ var/T = href_list["part_set"]
for(var/v in stored_research.researched_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(v)
if(D.build_type & MECHFAB)
@@ -347,10 +346,10 @@
break
return update_queue_on_page()
if(href_list["remove_from_queue"])
- remove_from_queue(afilter.getNum("remove_from_queue"))
+ remove_from_queue(text2num(href_list["remove_from_queue"]))
return update_queue_on_page()
if(href_list["partset_to_queue"])
- add_part_set_to_queue(afilter.get("partset_to_queue"))
+ add_part_set_to_queue(text2num(href_list["remove_from_queue"]))
return update_queue_on_page()
if(href_list["process_queue"])
spawn(0)
@@ -364,8 +363,8 @@
if(href_list["screen"])
screen = href_list["screen"]
if(href_list["queue_move"] && href_list["index"])
- var/index = afilter.getNum("index")
- var/new_index = index + afilter.getNum("queue_move")
+ var/index = text2num(href_list["index"])
+ var/new_index = index + text2num(href_list["queue_move"])
if(isnum(index) && isnum(new_index) && ISINTEGER(index) && ISINTEGER(new_index))
if(ISINRANGE(new_index,1,queue.len))
queue.Swap(index,new_index)
@@ -376,7 +375,7 @@
if(href_list["sync"])
sync()
if(href_list["part_desc"])
- var/T = afilter.getStr("part_desc")
+ var/T = href_list["part_desc"]
for(var/v in stored_research.researched_designs)
var/datum/design/D = SSresearch.techweb_design_by_id(v)
if(D.build_type & MECHFAB)
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 0188419f0f..61e6c8e5e4 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -39,21 +39,24 @@
/obj/machinery/computer/mecha/Topic(href, href_list)
if(..())
return
- var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
if(href_list["send_message"])
- var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("send_message")
+ var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["send_message"])
+ if (!istype(MT))
+ return
var/message = stripped_input(usr,"Input message","Transmit message")
var/obj/mecha/M = MT.in_mecha()
if(trim(message) && M)
M.occupant_message(message)
return
if(href_list["shock"])
- var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("shock")
- MT.shock()
+ var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["shock"])
+ if (istype(MT))
+ MT.shock()
if(href_list["get_log"])
- var/obj/item/mecha_parts/mecha_tracking/MT = afilter.getObj("get_log")
- stored_data = MT.get_mecha_log()
- screen = 1
+ var/obj/item/mecha_parts/mecha_tracking/MT = locate(href_list["get_log"])
+ if(istype(MT))
+ stored_data = MT.get_mecha_log()
+ screen = 1
if(href_list["return"])
screen = 0
updateUsrDialog()
diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm
index f9e04990fc..0359541964 100644
--- a/code/game/mecha/mecha_topic.dm
+++ b/code/game/mecha/mecha_topic.dm
@@ -224,70 +224,70 @@
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
if(in_range(src, usr))
+ var/obj/item/card/id/id_card
+ if (href_list["id_card"])
+ id_card = locate(href_list["id_card"])
+ if (!istype(id_card))
+ return
if(href_list["req_access"] && add_req_access)
- output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
+ output_access_dialog(id_card, usr)
if(href_list["maint_access"] && maint_access)
- var/mob/user = afilter.getMob("user")
- if(user)
- if(state==0)
- state = 1
- to_chat(user, "The securing bolts are now exposed.")
- else if(state==1)
- state = 0
- to_chat(user, "The securing bolts are now hidden.")
- output_maintenance_dialog(afilter.getObj("id_card"),user)
+ if(state==0)
+ state = 1
+ to_chat(usr, "The securing bolts are now exposed.")
+ else if(state==1)
+ state = 0
+ to_chat(usr, "The securing bolts are now hidden.")
+ output_maintenance_dialog(id_card, usr)
if(href_list["set_internal_tank_valve"] && state >=1)
- var/mob/user = afilter.getMob("user")
- if(user)
- var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
- if(new_pressure)
- internal_tank_valve = new_pressure
- to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
+ var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
+ if(new_pressure)
+ internal_tank_valve = new_pressure
+ to_chat(usr, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
- if(href_list["add_req_access"] && add_req_access && afilter.getObj("id_card"))
- operation_req_access += afilter.getNum("add_req_access")
- output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
+ if(href_list["add_req_access"] && add_req_access)
+ operation_req_access += text2num(href_list["add_req_access"])
+ output_access_dialog(id_card, usr)
if(href_list["del_req_access"] && add_req_access && afilter.getObj("id_card"))
- operation_req_access -= afilter.getNum("del_req_access")
- output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
+ operation_req_access -= text2num(href_list["add_req_access"])
+ output_access_dialog(id_card, usr)
if(href_list["finish_req_access"])
add_req_access = 0
- var/mob/user = afilter.getMob("user")
- user << browse(null,"window=exosuit_add_access")
+ usr << browse(null,"window=exosuit_add_access")
if(usr != occupant)
return
if(href_list["update_content"])
- send_byjax(src.occupant,"exosuit.browser","content",src.get_stats_part())
+ send_byjax(usr,"exosuit.browser","content",src.get_stats_part())
if(href_list["select_equip"])
- var/obj/item/mecha_parts/mecha_equipment/equip = afilter.getObj("select_equip")
+ var/obj/item/mecha_parts/mecha_equipment/equip = locate(href_list["select_equip"]) in src
if(equip && equip.selectable)
- src.selected = equip
- src.occupant_message("You switch to [equip]")
- src.visible_message("[src] raises [equip]")
- send_byjax(src.occupant,"exosuit.browser","eq_list",src.get_equipment_list())
+ selected = equip
+ occupant_message("You switch to [equip]")
+ visible_message("[src] raises [equip]")
+ send_byjax(usr, "exosuit.browser","eq_list", get_equipment_list())
if(href_list["rmictoggle"])
radio.broadcasting = !radio.broadcasting
- send_byjax(src.occupant,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
+ send_byjax(usr,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
if(href_list["rspktoggle"])
radio.listening = !radio.listening
- send_byjax(src.occupant,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
+ send_byjax(usr,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
if(href_list["rfreq"])
- var/new_frequency = (radio.frequency + afilter.getNum("rfreq"))
+ var/new_frequency = (radio.frequency + text2num(href_list["rfreq"]))
if (!radio.freerange || (radio.frequency < MIN_FREE_FREQ || radio.frequency > MAX_FREE_FREQ))
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
- send_byjax(src.occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
+ send_byjax(usr,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
if (href_list["view_log"])
src.occupant << browse(src.get_log_html(), "window=exosuit_log")
@@ -302,14 +302,14 @@
if (href_list["toggle_id_upload"])
add_req_access = !add_req_access
- send_byjax(src.occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
+ send_byjax(usr,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
if(href_list["toggle_maint_access"])
if(state)
occupant_message("Maintenance protocols in effect")
return
maint_access = !maint_access
- send_byjax(src.occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
+ send_byjax(usr,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
if (href_list["toggle_port_connection"])
if(internal_tank.connected_port)
diff --git a/tgstation.dme b/tgstation.dme
index 8fda1f85cb..bc555735d0 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -483,7 +483,6 @@
#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\icon_snapshot.dm"
#include "code\datums\helper_datums\teleport.dm"
-#include "code\datums\helper_datums\topic_input.dm"
#include "code\datums\looping_sounds\_looping_sound.dm"
#include "code\datums\looping_sounds\item_sounds.dm"
#include "code\datums\looping_sounds\machinery_sounds.dm"
From d84798ff32c8c351fd7966b643810a21ebbc0f32 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 30 Jan 2020 19:47:08 +0100
Subject: [PATCH 005/224] rogue one.
---
code/game/mecha/mecha_topic.dm | 2 --
1 file changed, 2 deletions(-)
diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm
index 0359541964..51ab28b9f3 100644
--- a/code/game/mecha/mecha_topic.dm
+++ b/code/game/mecha/mecha_topic.dm
@@ -221,8 +221,6 @@
if(usr.incapacitated())
return
- var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
-
if(in_range(src, usr))
var/obj/item/card/id/id_card
if (href_list["id_card"])
From fe9f86d7c21edd36227ddc10fbcc7c951fd3eac2 Mon Sep 17 00:00:00 2001
From: Ghommie <42542238+Ghommie@users.noreply.github.com>
Date: Thu, 30 Jan 2020 20:25:37 +0100
Subject: [PATCH 006/224] A
---
code/game/mecha/mecha_topic.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/game/mecha/mecha_topic.dm b/code/game/mecha/mecha_topic.dm
index 51ab28b9f3..fed545039c 100644
--- a/code/game/mecha/mecha_topic.dm
+++ b/code/game/mecha/mecha_topic.dm
@@ -241,7 +241,7 @@
output_maintenance_dialog(id_card, usr)
if(href_list["set_internal_tank_valve"] && state >=1)
- var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
+ var/new_pressure = input(usr,"Input new output pressure","Pressure setting",internal_tank_valve) as num
if(new_pressure)
internal_tank_valve = new_pressure
to_chat(usr, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
@@ -250,7 +250,7 @@
operation_req_access += text2num(href_list["add_req_access"])
output_access_dialog(id_card, usr)
- if(href_list["del_req_access"] && add_req_access && afilter.getObj("id_card"))
+ if(href_list["del_req_access"] && add_req_access)
operation_req_access -= text2num(href_list["add_req_access"])
output_access_dialog(id_card, usr)
From 67489d62d422f78b0c0c685ca8ddd3a1741ccf36 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 5 Feb 2020 05:56:31 -0700
Subject: [PATCH 007/224] Update projectile.dm
---
code/modules/projectiles/projectile.dm | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a902c545b8..e79fe9c3a3 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -90,6 +90,10 @@
var/decayedRange //stores original range
var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever
var/is_reflectable = FALSE // Can it be reflected or not?
+
+ /// factor to multiply by for zone accuracy percent.
+ var/zone_accuracy_factor = 1
+
//Effects
var/stun = 0
var/knockdown = 0
@@ -253,7 +257,8 @@
return TRUE
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
- def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
+ if(check_zone(def_zone) != BODY_ZONE_CHEST)
+ def_zone = ran_zone(def_zone, max(100-(7*distance), 5) * zone_accuracy_factor) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
if(isturf(A) && hitsound_wall)
var/volume = CLAMP(vol_by_damage() + 20, 0, 100)
From 3d7fef76f3b2fbbd6a4a7003ce32a9ef0d0d4928 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 5 Feb 2020 05:57:16 -0700
Subject: [PATCH 008/224] Update sniper.dm
---
code/modules/projectiles/projectile/bullets/sniper.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm
index bea5dbc140..5e3ae53806 100644
--- a/code/modules/projectiles/projectile/bullets/sniper.dm
+++ b/code/modules/projectiles/projectile/bullets/sniper.dm
@@ -7,6 +7,7 @@
knockdown = 100
dismemberment = 50
armour_penetration = 50
+ zone_accuracy_factor = 100 //guarunteed 100%
var/breakthings = TRUE
/obj/item/projectile/bullet/p50/on_hit(atom/target, blocked = 0)
From e14d2caacc6e2af63942220ca9f2dd4c40755ef8 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Wed, 5 Feb 2020 21:20:49 +0100
Subject: [PATCH 009/224] Update shuttle.dm
---
code/controllers/subsystem/shuttle.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 4d9eefae5b..a36c7fccc4 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -38,7 +38,7 @@ SUBSYSTEM_DEF(shuttle)
var/points = 5000 //number of trade-points we have
var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
- var/passive_supply_points_per_minute = 500
+ var/passive_supply_points_per_minute = 200
var/list/supply_packs = list()
var/list/shoppinglist = list()
From 84f91cf665f400e8582541222206e8b820aecef8 Mon Sep 17 00:00:00 2001
From: Ghom <42542238+Ghommie@users.noreply.github.com>
Date: Wed, 5 Feb 2020 21:33:37 +0100
Subject: [PATCH 010/224] Update shuttle.dm
---
code/controllers/subsystem/shuttle.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index a36c7fccc4..7eff8b9e3c 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -38,7 +38,7 @@ SUBSYSTEM_DEF(shuttle)
var/points = 5000 //number of trade-points we have
var/centcom_message = "" //Remarks from CentCom on how well you checked the last order.
var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies
- var/passive_supply_points_per_minute = 200
+ var/passive_supply_points_per_minute = 125
var/list/supply_packs = list()
var/list/shoppinglist = list()
From 927b9d0622ee141eacddb4abdbcb0eb01eccf7db Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Wed, 5 Feb 2020 23:50:41 -0700
Subject: [PATCH 011/224] Revert "Merge pull request #10883 from
ancientpower/ghost-newscasters"
This reverts commit 3c5a3cb4d4c284381b1c8aab0587022658fe37b7, reversing
changes made to 109b15ebdde758cab20b849fa6c23dbe433530ab.
---
code/__DEFINES/interaction_flags.dm | 2 -
code/game/atoms.dm | 1 -
code/game/machinery/_machinery.dm | 2 +-
code/game/machinery/newscaster.dm | 97 ++--------------------
code/game/turfs/turf.dm | 4 +-
code/modules/library/lib_items.dm | 16 +---
code/modules/mob/dead/observer/observer.dm | 2 +-
code/modules/mob/mob_helpers.dm | 12 ---
8 files changed, 13 insertions(+), 123 deletions(-)
diff --git a/code/__DEFINES/interaction_flags.dm b/code/__DEFINES/interaction_flags.dm
index 6df5bf77fb..dc3242c910 100644
--- a/code/__DEFINES/interaction_flags.dm
+++ b/code/__DEFINES/interaction_flags.dm
@@ -20,5 +20,3 @@
#define INTERACT_MACHINE_SET_MACHINE (1<<6) //MACHINES HAVE THIS BY DEFAULT, SOMEONE SHOULD RUN THROUGH MACHINES AND REMOVE IT FROM THINGS LIKE LIGHT SWITCHES WHEN POSSIBLE!!--------------------------
//This flag determines if a machine set_machine's the user when the user uses it, making updateUsrDialog make the user re-call interact() on it.
//THIS FLAG IS ON ALL MACHINES BY DEFAULT, NEEDS TO BE RE-EVALUATED LATER!!
-
-#define INTERACT_GHOST_READ (1<<0)
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7e224080b9..83117bad64 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -6,7 +6,6 @@
var/flags_1 = NONE
var/interaction_flags_atom = NONE
- var/ghost_flags = NONE
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 44739fcbc0..a0666b3133 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -242,7 +242,7 @@ Class Procs:
else
if(interaction_flags_machine & INTERACT_MACHINE_REQUIRES_SILICON)
return FALSE
- if(!Adjacent(user) && !isobserver(user))
+ if(!Adjacent(user))
var/mob/living/carbon/H = user
if(!(istype(H) && H.has_dna() && H.dna.check_mutation(TK)))
return FALSE
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 7097de1f3b..a9b4461085 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -189,7 +189,6 @@ GLOBAL_LIST_EMPTY(allCasters)
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 30)
max_integrity = 200
integrity_failure = 50
- ghost_flags = INTERACT_GHOST_READ
var/screen = 0
var/paper_remaining = 15
var/securityCaster = 0
@@ -197,7 +196,6 @@ GLOBAL_LIST_EMPTY(allCasters)
var/alert_delay = 500
var/alert = FALSE
var/scanned_user = "Unknown"
- var/mob/active_user = null
var/msg = ""
var/datum/picture/picture
var/channel_name = ""
@@ -266,10 +264,10 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/machinery/newscaster/ui_interact(mob/user)
. = ..()
- if(ishuman(user) || issilicon(user) || isobserver(user))
- var/mob/M = user
+ if(ishuman(user) || issilicon(user))
+ var/mob/living/human_or_robot_user = user
var/dat
- scan_user(M)
+ scan_user(human_or_robot_user)
switch(screen)
if(0)
dat += "Welcome to Newscasting Unit #[unit_no].
Interface & News networks Operational."
@@ -281,7 +279,7 @@ GLOBAL_LIST_EMPTY(allCasters)
dat+= "
Submit new Feed story"
dat+= "
Print newspaper"
dat+= "
Re-scan User"
- dat+= "
Exit"
+ dat+= "
Exit"
if(securityCaster)
var/wanted_already = 0
if(GLOB.news_network.wanted_issue.active)
@@ -503,36 +501,24 @@ GLOBAL_LIST_EMPTY(allCasters)
if(21)
dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnel to refill machine storage.
"
dat+="Return"
- var/datum/browser/popup = new(M, "newscaster_main", "Newscaster Unit #[unit_no]", 400, 600)
+ var/datum/browser/popup = new(human_or_robot_user, "newscaster_main", "Newscaster Unit #[unit_no]", 400, 600)
popup.set_content(dat)
- popup.set_title_image(M.browse_rsc_icon(icon, icon_state))
+ popup.set_title_image(human_or_robot_user.browse_rsc_icon(icon, icon_state))
popup.open()
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return
- if(active_user && !isobserver(active_user) && get_dist(active_user,src)<=1 && usr!=active_user)
- to_chat(usr, "You must wait for [active_user] to finish and move away.")
- return
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || issilicon(usr) || isobserver(usr))
+ if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && isturf(loc))) || issilicon(usr))
usr.set_machine(src)
scan_user(usr)
if(href_list["set_channel_name"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"set a channel's name"))
- to_chat(usr, "You can't do that.")
- return
channel_name = stripped_input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "", MAX_NAME_LEN)
updateUsrDialog()
else if(href_list["set_channel_lock"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"locked a channel"))
- to_chat(usr, "You can't do that.")
- return
c_locked = !c_locked
updateUsrDialog()
else if(href_list["submit_new_channel"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"created a new channel"))
- to_chat(usr, "You can't do that.")
- return
var/list/existing_authors = list()
for(var/datum/newscaster/feed_channel/FC in GLOB.news_network.network_channels)
if(FC.authorCensor)
@@ -555,9 +541,6 @@ GLOBAL_LIST_EMPTY(allCasters)
screen=5
updateUsrDialog()
else if(href_list["set_channel_receiving"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to set the receiving channel"))
- to_chat(usr, "You can't do that.")
- return
var/list/available_channels = list()
for(var/datum/newscaster/feed_channel/F in GLOB.news_network.network_channels)
if( (!F.locked || F.author == scanned_user) && !F.censored)
@@ -565,23 +548,14 @@ GLOBAL_LIST_EMPTY(allCasters)
channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels
updateUsrDialog()
else if(href_list["set_new_message"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"set the message of a new feed story"))
- to_chat(usr, "You can't do that.")
- return
var/temp_message = trim(stripped_multiline_input(usr, "Write your Feed story", "Network Channel Handler", msg))
if(temp_message)
msg = temp_message
updateUsrDialog()
else if(href_list["set_attachment"])
- if(isobserver(usr))
- to_chat(usr, "You can't do that.")
- return
AttachPhoto(usr)
updateUsrDialog()
else if(href_list["submit_new_message"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"added a new story"))
- to_chat(usr, "You can't do that.")
- return
if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" )
screen=6
else
@@ -591,27 +565,15 @@ GLOBAL_LIST_EMPTY(allCasters)
msg = ""
updateUsrDialog()
else if(href_list["create_channel"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"created a channel"))
- to_chat(usr, "You can't do that.")
- return
screen=2
updateUsrDialog()
else if(href_list["create_feed_story"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"created a feed story"))
- to_chat(usr, "You can't do that.")
- return
screen=3
updateUsrDialog()
else if(href_list["menu_paper"])
- if(isobserver(usr) && !canGhostWrite(usr,src,""))
- to_chat(usr, "You can't do that.")
- return
screen=8
updateUsrDialog()
else if(href_list["print_paper"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"printed a paper"))
- to_chat(usr, "You can't do that.")
- return
if(!paper_remaining)
screen=21
else
@@ -619,21 +581,12 @@ GLOBAL_LIST_EMPTY(allCasters)
screen = 20
updateUsrDialog()
else if(href_list["menu_censor_story"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"censored a story"))
- to_chat(usr, "You can't do that.")
- return
screen=10
updateUsrDialog()
else if(href_list["menu_censor_channel"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"censored a channel"))
- to_chat(usr, "You can't do that.")
- return
screen=11
updateUsrDialog()
else if(href_list["menu_wanted"])
- if(isobserver(usr) && !canGhostWrite(usr,src,""))
- to_chat(usr, "You can't do that.")
- return
var/already_wanted = 0
if(GLOB.news_network.wanted_issue.active)
already_wanted = 1
@@ -643,21 +596,12 @@ GLOBAL_LIST_EMPTY(allCasters)
screen = 14
updateUsrDialog()
else if(href_list["set_wanted_name"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to set the name of a wanted person"))
- to_chat(usr, "You can't do that.")
- return
channel_name = stripped_input(usr, "Provide the name of the Wanted person", "Network Security Handler")
updateUsrDialog()
else if(href_list["set_wanted_desc"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to set the description of a wanted person"))
- to_chat(usr, "You can't do that.")
- return
msg = stripped_input(usr, "Provide a description of the Wanted person and any other details you deem important", "Network Security Handler")
updateUsrDialog()
else if(href_list["submit_wanted"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"submitted a wanted poster"))
- to_chat(usr, "You can't do that.")
- return
var/input_param = text2num(href_list["submit_wanted"])
if(msg == "" || channel_name == "" || scanned_user == "Unknown")
screen = 16
@@ -688,9 +632,6 @@ GLOBAL_LIST_EMPTY(allCasters)
screen=18
updateUsrDialog()
else if(href_list["censor_channel_author"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to censor an author"))
- to_chat(usr, "You can't do that.")
- return
var/datum/newscaster/feed_channel/FC = locate(href_list["censor_channel_author"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
@@ -698,9 +639,6 @@ GLOBAL_LIST_EMPTY(allCasters)
FC.toggleCensorAuthor()
updateUsrDialog()
else if(href_list["censor_channel_story_author"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to censor a story's author"))
- to_chat(usr, "You can't do that.")
- return
var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_author"])
if(MSG.is_admin_message)
alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
@@ -708,9 +646,6 @@ GLOBAL_LIST_EMPTY(allCasters)
MSG.toggleCensorAuthor()
updateUsrDialog()
else if(href_list["censor_channel_story_body"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to censor a story"))
- to_chat(usr, "You can't do that.")
- return
var/datum/newscaster/feed_message/MSG = locate(href_list["censor_channel_story_body"])
if(MSG.is_admin_message)
alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
@@ -718,17 +653,11 @@ GLOBAL_LIST_EMPTY(allCasters)
MSG.toggleCensorBody()
updateUsrDialog()
else if(href_list["pick_d_notice"])
- if(isobserver(usr) && !canGhostWrite(usr,src,""))
- to_chat(usr, "You can't do that.")
- return
var/datum/newscaster/feed_channel/FC = locate(href_list["pick_d_notice"])
viewing_channel = FC
screen=13
updateUsrDialog()
else if(href_list["toggle_d_notice"])
- if(isobserver(usr) && !canGhostWrite(usr,src,"tried to set a D-notice"))
- to_chat(usr, "You can't do that.")
- return
var/datum/newscaster/feed_channel/FC = locate(href_list["toggle_d_notice"])
if(FC.is_admin_channel)
alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
@@ -876,12 +805,6 @@ GLOBAL_LIST_EMPTY(allCasters)
picture = selection
/obj/machinery/newscaster/proc/scan_user(mob/living/user)
- if(active_user)
- if(active_user != user)
- if(get_dist(active_user,src)<=1)
- if(!isobserver(active_user))
- to_chat(user, "Wait for [active_user] to finish and move away.")
- return
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
if(human_user.wear_id)
@@ -901,14 +824,9 @@ GLOBAL_LIST_EMPTY(allCasters)
else if(issilicon(user))
var/mob/living/silicon/ai_user = user
scanned_user = "[ai_user.name] ([ai_user.job])"
- else if (IsAdminGhost(user))
- scanned_user = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]"
- else if (isobserver(user))
- scanned_user = "Space-Time Anomaly #[rand(0,9)][rand(0,9)][rand(0,9)]"
else
throw EXCEPTION("Invalid user for this proc")
return
- active_user = user
/obj/machinery/newscaster/proc/print_paper()
SSblackbox.record_feedback("amount", "newspapers_printed", 1)
@@ -941,6 +859,7 @@ GLOBAL_LIST_EMPTY(allCasters)
say("Attention! Wanted issue distributed!")
playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1)
+
/obj/item/newspaper
name = "newspaper"
desc = "An issue of The Griffon, the newspaper circulating aboard Nanotrasen Space Stations."
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 688e03def3..d8434f986c 100755
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -362,10 +362,8 @@
. = ..()
if(.)
return
- if(!user || !istype(user, /mob/living))
- return FALSE
if(length(src_object.contents()))
- to_chat(user, "You start dumping out the contents...")
+ to_chat(usr, "You start dumping out the contents...")
if(!do_after(usr,20,target=src_object.parent))
return FALSE
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index f128a76da2..5ff1cbceb1 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -129,14 +129,6 @@
choice.forceMove(drop_location())
update_icon()
-/obj/structure/bookcase/attack_ghost(mob/dead/observer/user as mob)
- if(contents.len && in_range(user, src))
- var/obj/item/book/choice = input("Which book would you like to read?") as null|obj in contents
- if(choice)
- if(!istype(choice)) //spellbook, cult tome, or the one weird bible storage
- to_chat(user,"A mysterious force is keeping you from reading that.")
- return
- choice.attack_self(user)
/obj/structure/bookcase/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/mineral/wood(loc, 4)
@@ -212,9 +204,8 @@
return
if(dat)
user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
- if(istype(user, /mob/living))
- user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
+ user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
+ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
onclose(user, "book")
else
to_chat(user, "This book is completely blank!")
@@ -320,9 +311,6 @@
else
..()
-/obj/item/book/attack_ghost(mob/user)
- attack_self(user)
-
/*
* Barcode Scanner
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 3559edc0fb..439fe491cc 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -796,7 +796,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
update_icon()
/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
- return IsAdminGhost(usr) || (M.ghost_flags & INTERACT_GHOST_READ)
+ return IsAdminGhost(usr)
/mob/dead/observer/is_literate()
return 1
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index d78d23c234..393adb68d2 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -402,18 +402,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return
return TRUE
-/proc/canGhostWrite(var/mob/A, var/obj/target, var/desc="", var/allow_all=FALSE)
- if(allow_all & TRUE)
- if(!target.GetComponent(/datum/component/anti_magic))
- return 1
- if(IsAdminGhost(A))
- if (desc != "")
- log_admin("GHOST: [key_name(A)] [desc] ([target.name] at [loc_name(target)])")
- else
- log_admin("GHOST: [key_name(A)] fucked with the [target.name] at [loc_name(target)]")
- return 1
- return 0
-
/proc/offer_control(mob/M)
to_chat(M, "Control of your mob has been offered to dead players.")
if(usr)
From 9a4432b3acbcea08d384c78793324b8754cdc013 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:03:17 -0700
Subject: [PATCH 012/224] initial commit
---
code/modules/library/lib_items.dm | 22 ++-
code/modules/newscaster/feed_channel.dm | 34 ++++
code/modules/newscaster/feed_comment.dm | 4 +
code/modules/newscaster/feed_message.dm | 47 +++++
code/modules/newscaster/feed_network.dm | 71 ++++++++
code/modules/newscaster/news_datum.dm | 1 +
.../newscaster}/newscaster.dm | 171 ------------------
code/modules/newscaster/wanted_message.dm | 8 +
8 files changed, 183 insertions(+), 175 deletions(-)
create mode 100644 code/modules/newscaster/feed_channel.dm
create mode 100644 code/modules/newscaster/feed_comment.dm
create mode 100644 code/modules/newscaster/feed_message.dm
create mode 100644 code/modules/newscaster/feed_network.dm
create mode 100644 code/modules/newscaster/news_datum.dm
rename code/{game/machinery => modules/newscaster}/newscaster.dm (88%)
create mode 100644 code/modules/newscaster/wanted_message.dm
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 5ff1cbceb1..459212aad0 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -112,7 +112,6 @@
else
return ..()
-
/obj/structure/bookcase/attack_hand(mob/user)
. = ..()
if(.)
@@ -129,6 +128,17 @@
choice.forceMove(drop_location())
update_icon()
+/obj/structure/bookcase/attack_ghost(mob/dead/observer/user)
+ . = ..()
+ if(!length(contents))
+ to_chat(user, "It's empty!")
+ return
+ var/obj/item/book/choice = input("Which book would you like to read?") as null|obj in contents
+ if(choice)
+ if(!istype(choice)) //spellbook, cult tome, or the one weird bible storage
+ to_chat(user,"A mysterious force is keeping you from reading that.")
+ return
+ choice.attack_ghost(user)
/obj/structure/bookcase/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/mineral/wood(loc, 4)
@@ -203,13 +213,17 @@
to_chat(user, "You skim through the book but can't comprehend any of it.")
return
if(dat)
- user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
+ show_to(user)
user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "book_nerd", /datum/mood_event/book_nerd)
- onclose(user, "book")
else
to_chat(user, "This book is completely blank!")
+/obj/item/book/attack_ghost(mob/dead/observer/O)
+ . = ..()
+ show_to(O)
+
+/obj/item/book/proc/show_to(mob/user)
+ user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
/obj/item/book/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pen))
diff --git a/code/modules/newscaster/feed_channel.dm b/code/modules/newscaster/feed_channel.dm
new file mode 100644
index 0000000000..98c8d35493
--- /dev/null
+++ b/code/modules/newscaster/feed_channel.dm
@@ -0,0 +1,34 @@
+/datum/newscaster/feed_channel
+ var/channel_name = ""
+ var/list/datum/newscaster/feed_message/messages = list()
+ var/locked = FALSE
+ var/author = ""
+ var/censored = 0
+ var/list/authorCensorTime = list()
+ var/list/DclassCensorTime = list()
+ var/authorCensor
+ var/is_admin_channel = 0
+
+/datum/newscaster/feed_channel/proc/returnAuthor(censor)
+ if(censor == -1)
+ censor = authorCensor
+ var/txt = "[GLOB.news_network.redactedText]"
+ if(!censor)
+ txt = author
+ return txt
+
+/datum/newscaster/feed_channel/proc/toggleCensorDclass()
+ if(censored)
+ DclassCensorTime.Add(GLOB.news_network.lastAction*-1)
+ else
+ DclassCensorTime.Add(GLOB.news_network.lastAction)
+ censored = !censored
+ GLOB.news_network.lastAction ++
+
+/datum/newscaster/feed_channel/proc/toggleCensorAuthor()
+ if(authorCensor)
+ authorCensorTime.Add(GLOB.news_network.lastAction*-1)
+ else
+ authorCensorTime.Add(GLOB.news_network.lastAction)
+ authorCensor = !authorCensor
+ GLOB.news_network.lastAction ++
diff --git a/code/modules/newscaster/feed_comment.dm b/code/modules/newscaster/feed_comment.dm
new file mode 100644
index 0000000000..f5f847ab8e
--- /dev/null
+++ b/code/modules/newscaster/feed_comment.dm
@@ -0,0 +1,4 @@
+/datum/newscaster/feed_comment
+ var/author = ""
+ var/body = ""
+ var/time_stamp = ""
diff --git a/code/modules/newscaster/feed_message.dm b/code/modules/newscaster/feed_message.dm
new file mode 100644
index 0000000000..1930177555
--- /dev/null
+++ b/code/modules/newscaster/feed_message.dm
@@ -0,0 +1,47 @@
+/datum/newscaster/feed_message
+ var/author =""
+ var/body =""
+ var/list/authorCensorTime = list()
+ var/list/bodyCensorTime = list()
+ var/is_admin_message = 0
+ var/icon/img = null
+ var/time_stamp = ""
+ var/list/datum/newscaster/feed_comment/comments = list()
+ var/locked = FALSE
+ var/caption = ""
+ var/creationTime
+ var/authorCensor
+ var/bodyCensor
+ var/photo_file
+
+/datum/newscaster/feed_message/proc/returnAuthor(censor)
+ if(censor == -1)
+ censor = authorCensor
+ var/txt = "[GLOB.news_network.redactedText]"
+ if(!censor)
+ txt = author
+ return txt
+
+/datum/newscaster/feed_message/proc/returnBody(censor)
+ if(censor == -1)
+ censor = bodyCensor
+ var/txt = "[GLOB.news_network.redactedText]"
+ if(!censor)
+ txt = body
+ return txt
+
+/datum/newscaster/feed_message/proc/toggleCensorAuthor()
+ if(authorCensor)
+ authorCensorTime.Add(GLOB.news_network.lastAction*-1)
+ else
+ authorCensorTime.Add(GLOB.news_network.lastAction)
+ authorCensor = !authorCensor
+ GLOB.news_network.lastAction ++
+
+/datum/newscaster/feed_message/proc/toggleCensorBody()
+ if(bodyCensor)
+ bodyCensorTime.Add(GLOB.news_network.lastAction*-1)
+ else
+ bodyCensorTime.Add(GLOB.news_network.lastAction)
+ bodyCensor = !bodyCensor
+ GLOB.news_network.lastAction ++
diff --git a/code/modules/newscaster/feed_network.dm b/code/modules/newscaster/feed_network.dm
new file mode 100644
index 0000000000..12a211891e
--- /dev/null
+++ b/code/modules/newscaster/feed_network.dm
@@ -0,0 +1,71 @@
+GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
+
+/datum/newscaster/feed_network
+ var/list/datum/newscaster/feed_channel/network_channels = list()
+ var/datum/newscaster/wanted_message/wanted_issue
+ var/lastAction
+ var/redactedText = "\[REDACTED\]"
+
+/datum/newscaster/feed_network/New()
+ CreateFeedChannel("Station Announcements", "SS13", 1)
+ wanted_issue = new /datum/newscaster/wanted_message
+
+/datum/newscaster/feed_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0)
+ var/datum/newscaster/feed_channel/newChannel = new /datum/newscaster/feed_channel
+ newChannel.channel_name = channel_name
+ newChannel.author = author
+ newChannel.locked = locked
+ newChannel.is_admin_channel = adminChannel
+ network_channels += newChannel
+
+/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1)
+ var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message
+ newMsg.author = author
+ newMsg.body = msg
+ newMsg.time_stamp = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
+ newMsg.is_admin_message = adminMessage
+ newMsg.locked = !allow_comments
+ if(picture)
+ newMsg.img = picture.picture_image
+ newMsg.caption = picture.caption
+ newMsg.photo_file = save_photo(picture.picture_image)
+ for(var/datum/newscaster/feed_channel/FC in network_channels)
+ if(FC.channel_name == channel_name)
+ FC.messages += newMsg
+ break
+ for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
+ NEWSCASTER.newsAlert(channel_name)
+ lastAction ++
+ newMsg.creationTime = lastAction
+
+/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = 0, newMessage = 0)
+ wanted_issue.active = 1
+ wanted_issue.criminal = criminal
+ wanted_issue.body = body
+ wanted_issue.scannedUser = scanned_user
+ wanted_issue.isAdminMsg = adminMsg
+ if(picture)
+ wanted_issue.img = picture.picture_image
+ wanted_issue.photo_file = save_photo(picture.picture_image)
+ if(newMessage)
+ for(var/obj/machinery/newscaster/N in GLOB.allCasters)
+ N.newsAlert()
+ N.update_icon()
+
+/datum/newscaster/feed_network/proc/deleteWanted()
+ wanted_issue.active = 0
+ wanted_issue.criminal = null
+ wanted_issue.body = null
+ wanted_issue.scannedUser = null
+ wanted_issue.img = null
+ for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
+ NEWSCASTER.update_icon()
+
+/datum/newscaster/feed_network/proc/save_photo(icon/photo)
+ var/photo_file = copytext_char(md5("\icon[photo]"), 1, 6)
+ if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
+ //Clean up repeated frames
+ var/icon/clean = new /icon()
+ clean.Insert(photo, "", SOUTH, 1, 0)
+ fcopy(clean, "[GLOB.log_directory]/photos/[photo_file].png")
+ return photo_file
diff --git a/code/modules/newscaster/news_datum.dm b/code/modules/newscaster/news_datum.dm
new file mode 100644
index 0000000000..3c42d04734
--- /dev/null
+++ b/code/modules/newscaster/news_datum.dm
@@ -0,0 +1 @@
+/datum/newscaster
diff --git a/code/game/machinery/newscaster.dm b/code/modules/newscaster/newscaster.dm
similarity index 88%
rename from code/game/machinery/newscaster.dm
rename to code/modules/newscaster/newscaster.dm
index a9b4461085..e9458666f3 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/modules/newscaster/newscaster.dm
@@ -1,175 +1,5 @@
-GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
GLOBAL_LIST_EMPTY(allCasters)
-/datum/newscaster
-
-/datum/newscaster/feed_comment
- var/author = ""
- var/body = ""
- var/time_stamp = ""
-
-/datum/newscaster/feed_message
- var/author =""
- var/body =""
- var/list/authorCensorTime = list()
- var/list/bodyCensorTime = list()
- var/is_admin_message = 0
- var/icon/img = null
- var/time_stamp = ""
- var/list/datum/newscaster/feed_comment/comments = list()
- var/locked = FALSE
- var/caption = ""
- var/creationTime
- var/authorCensor
- var/bodyCensor
- var/photo_file
-
-/datum/newscaster/feed_message/proc/returnAuthor(censor)
- if(censor == -1)
- censor = authorCensor
- var/txt = "[GLOB.news_network.redactedText]"
- if(!censor)
- txt = author
- return txt
-
-/datum/newscaster/feed_message/proc/returnBody(censor)
- if(censor == -1)
- censor = bodyCensor
- var/txt = "[GLOB.news_network.redactedText]"
- if(!censor)
- txt = body
- return txt
-
-/datum/newscaster/feed_message/proc/toggleCensorAuthor()
- if(authorCensor)
- authorCensorTime.Add(GLOB.news_network.lastAction*-1)
- else
- authorCensorTime.Add(GLOB.news_network.lastAction)
- authorCensor = !authorCensor
- GLOB.news_network.lastAction ++
-
-/datum/newscaster/feed_message/proc/toggleCensorBody()
- if(bodyCensor)
- bodyCensorTime.Add(GLOB.news_network.lastAction*-1)
- else
- bodyCensorTime.Add(GLOB.news_network.lastAction)
- bodyCensor = !bodyCensor
- GLOB.news_network.lastAction ++
-
-/datum/newscaster/feed_channel
- var/channel_name = ""
- var/list/datum/newscaster/feed_message/messages = list()
- var/locked = FALSE
- var/author = ""
- var/censored = 0
- var/list/authorCensorTime = list()
- var/list/DclassCensorTime = list()
- var/authorCensor
- var/is_admin_channel = 0
-
-/datum/newscaster/feed_channel/proc/returnAuthor(censor)
- if(censor == -1)
- censor = authorCensor
- var/txt = "[GLOB.news_network.redactedText]"
- if(!censor)
- txt = author
- return txt
-
-/datum/newscaster/feed_channel/proc/toggleCensorDclass()
- if(censored)
- DclassCensorTime.Add(GLOB.news_network.lastAction*-1)
- else
- DclassCensorTime.Add(GLOB.news_network.lastAction)
- censored = !censored
- GLOB.news_network.lastAction ++
-
-/datum/newscaster/feed_channel/proc/toggleCensorAuthor()
- if(authorCensor)
- authorCensorTime.Add(GLOB.news_network.lastAction*-1)
- else
- authorCensorTime.Add(GLOB.news_network.lastAction)
- authorCensor = !authorCensor
- GLOB.news_network.lastAction ++
-
-/datum/newscaster/wanted_message
- var/active
- var/criminal
- var/body
- var/scannedUser
- var/isAdminMsg
- var/icon/img
- var/photo_file
-
-/datum/newscaster/feed_network
- var/list/datum/newscaster/feed_channel/network_channels = list()
- var/datum/newscaster/wanted_message/wanted_issue
- var/lastAction
- var/redactedText = "\[REDACTED\]"
-
-/datum/newscaster/feed_network/New()
- CreateFeedChannel("Station Announcements", "SS13", 1)
- wanted_issue = new /datum/newscaster/wanted_message
-
-/datum/newscaster/feed_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0)
- var/datum/newscaster/feed_channel/newChannel = new /datum/newscaster/feed_channel
- newChannel.channel_name = channel_name
- newChannel.author = author
- newChannel.locked = locked
- newChannel.is_admin_channel = adminChannel
- network_channels += newChannel
-
-/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1)
- var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message
- newMsg.author = author
- newMsg.body = msg
- newMsg.time_stamp = STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)
- newMsg.is_admin_message = adminMessage
- newMsg.locked = !allow_comments
- if(picture)
- newMsg.img = picture.picture_image
- newMsg.caption = picture.caption
- newMsg.photo_file = save_photo(picture.picture_image)
- for(var/datum/newscaster/feed_channel/FC in network_channels)
- if(FC.channel_name == channel_name)
- FC.messages += newMsg
- break
- for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
- NEWSCASTER.newsAlert(channel_name)
- lastAction ++
- newMsg.creationTime = lastAction
-
-/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = 0, newMessage = 0)
- wanted_issue.active = 1
- wanted_issue.criminal = criminal
- wanted_issue.body = body
- wanted_issue.scannedUser = scanned_user
- wanted_issue.isAdminMsg = adminMsg
- if(picture)
- wanted_issue.img = picture.picture_image
- wanted_issue.photo_file = save_photo(picture.picture_image)
- if(newMessage)
- for(var/obj/machinery/newscaster/N in GLOB.allCasters)
- N.newsAlert()
- N.update_icon()
-
-/datum/newscaster/feed_network/proc/deleteWanted()
- wanted_issue.active = 0
- wanted_issue.criminal = null
- wanted_issue.body = null
- wanted_issue.scannedUser = null
- wanted_issue.img = null
- for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
- NEWSCASTER.update_icon()
-
-/datum/newscaster/feed_network/proc/save_photo(icon/photo)
- var/photo_file = copytext_char(md5("\icon[photo]"), 1, 6)
- if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
- //Clean up repeated frames
- var/icon/clean = new /icon()
- clean.Insert(photo, "", SOUTH, 1, 0)
- fcopy(clean, "[GLOB.log_directory]/photos/[photo_file].png")
- return photo_file
-
/obj/item/wallframe/newscaster
name = "newscaster frame"
desc = "Used to build newscasters, just secure to the wall."
@@ -177,7 +7,6 @@ GLOBAL_LIST_EMPTY(allCasters)
materials = list(MAT_METAL=14000, MAT_GLASS=8000)
result_path = /obj/machinery/newscaster
-
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
diff --git a/code/modules/newscaster/wanted_message.dm b/code/modules/newscaster/wanted_message.dm
new file mode 100644
index 0000000000..de67bbeaf5
--- /dev/null
+++ b/code/modules/newscaster/wanted_message.dm
@@ -0,0 +1,8 @@
+/datum/newscaster/wanted_message
+ var/active
+ var/criminal
+ var/body
+ var/scannedUser
+ var/isAdminMsg
+ var/icon/img
+ var/photo_file
From 134b7b811d95acad395043d5ee33481e71628c97 Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:04:11 -0700
Subject: [PATCH 013/224] repath that
---
code/modules/newscaster/feed_network.dm | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/code/modules/newscaster/feed_network.dm b/code/modules/newscaster/feed_network.dm
index 12a211891e..b1e8ad19ae 100644
--- a/code/modules/newscaster/feed_network.dm
+++ b/code/modules/newscaster/feed_network.dm
@@ -1,16 +1,17 @@
-GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
+GLOBAL_DATUM_INIT(news_network, /datum/news_network, new)
-/datum/newscaster/feed_network
+/// Contains all the news datum of a newscaster system.
+/datum/news_network
var/list/datum/newscaster/feed_channel/network_channels = list()
var/datum/newscaster/wanted_message/wanted_issue
var/lastAction
var/redactedText = "\[REDACTED\]"
-/datum/newscaster/feed_network/New()
+/datum/news_network/New()
CreateFeedChannel("Station Announcements", "SS13", 1)
wanted_issue = new /datum/newscaster/wanted_message
-/datum/newscaster/feed_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0)
+/datum/news_network/proc/CreateFeedChannel(channel_name, author, locked, adminChannel = 0)
var/datum/newscaster/feed_channel/newChannel = new /datum/newscaster/feed_channel
newChannel.channel_name = channel_name
newChannel.author = author
@@ -18,7 +19,7 @@ GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
newChannel.is_admin_channel = adminChannel
network_channels += newChannel
-/datum/newscaster/feed_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1)
+/datum/news_network/proc/SubmitArticle(msg, author, channel_name, datum/picture/picture, adminMessage = 0, allow_comments = 1)
var/datum/newscaster/feed_message/newMsg = new /datum/newscaster/feed_message
newMsg.author = author
newMsg.body = msg
@@ -38,7 +39,7 @@ GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
lastAction ++
newMsg.creationTime = lastAction
-/datum/newscaster/feed_network/proc/submitWanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = 0, newMessage = 0)
+/datum/news_network/proc/submitWanted(criminal, body, scanned_user, datum/picture/picture, adminMsg = 0, newMessage = 0)
wanted_issue.active = 1
wanted_issue.criminal = criminal
wanted_issue.body = body
@@ -52,7 +53,7 @@ GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
N.newsAlert()
N.update_icon()
-/datum/newscaster/feed_network/proc/deleteWanted()
+/datum/news_network/proc/deleteWanted()
wanted_issue.active = 0
wanted_issue.criminal = null
wanted_issue.body = null
@@ -61,7 +62,7 @@ GLOBAL_DATUM_INIT(news_network, /datum/newscaster/feed_network, new)
for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
NEWSCASTER.update_icon()
-/datum/newscaster/feed_network/proc/save_photo(icon/photo)
+/datum/news_network/proc/save_photo(icon/photo)
var/photo_file = copytext_char(md5("\icon[photo]"), 1, 6)
if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
//Clean up repeated frames
From 38536cd02d5b7c7c2278d31b3afec3169ef3937a Mon Sep 17 00:00:00 2001
From: kevinz000 <2003111+kevinz000@users.noreply.github.com>
Date: Thu, 6 Feb 2020 00:05:07 -0700
Subject: [PATCH 014/224] repath that
---
code/__HELPERS/roundend.dm | 6 +-
code/game/objects/items/devices/PDA/cart.dm | 12 ++--
code/modules/admin/admin.dm | 18 +++---
code/modules/admin/holder2.dm | 6 +-
code/modules/admin/topic.dm | 30 ++++-----
code/modules/library/lib_machines.dm | 2 +-
code/modules/newscaster/feed_channel.dm | 10 +--
code/modules/newscaster/feed_comment.dm | 2 +-
code/modules/newscaster/feed_message.dm | 12 ++--
code/modules/newscaster/feed_network.dm | 12 ++--
code/modules/newscaster/news_datum.dm | 2 +-
code/modules/newscaster/newscaster.dm | 70 ++++++++++-----------
code/modules/newscaster/wanted_message.dm | 2 +-
13 files changed, 92 insertions(+), 92 deletions(-)
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 19ee2b2a5a..3f33214668 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -139,19 +139,19 @@
var/list/file_data = list()
var/pos = 1
for(var/V in GLOB.news_network.network_channels)
- var/datum/newscaster/feed_channel/channel = V
+ var/datum/news/feed_channel/channel = V
if(!istype(channel))
stack_trace("Non-channel in newscaster channel list")
continue
file_data["[pos]"] = list("channel name" = "[channel.channel_name]", "author" = "[channel.author]", "censored" = channel.censored ? 1 : 0, "author censored" = channel.authorCensor ? 1 : 0, "messages" = list())
for(var/M in channel.messages)
- var/datum/newscaster/feed_message/message = M
+ var/datum/news/feed_message/message = M
if(!istype(message))
stack_trace("Non-message in newscaster channel messages list")
continue
var/list/comment_data = list()
for(var/C in message.comments)
- var/datum/newscaster/feed_comment/comment = C
+ var/datum/news/feed_comment/comment = C
if(!istype(comment))
stack_trace("Non-message in newscaster message comments list")
continue
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index b186c29539..7b66f68a79 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -562,22 +562,22 @@ Code:
if (53) // Newscaster
menu = "




"
- else
- dat+="None"
- else
- dat+="Apart from some uninteresting classified ads, there's nothing on this page..."
- if(scribble_page==curr_page)
- dat+="
"
+ else
+ dat+="None"
+ else
+ dat+="Apart from some uninteresting classified ads, there's nothing on this page..."
+ if(scribble_page==curr_page)
+ dat+="
d&a~b9I4(6 zd4}1`OH@r?tk-99Ly*JhGfkMO>UFTN60O??y%pp(~}} z8tpa`a%TdXn{2MDkkI*qJmRo#Bh2=(LcM!{o&O_Sy8`PQUg+yz)FHm5uaQ-Hy{_ip zPxE&*U$r$F6C2H;%u!u62Y#fHMI2w*NG0-#qH$0xo}QTUR8%*?CHi>F>~Aa*`1oKO zrTIM}9m|y2UFI9}r+Cl^=DbsOTUXS~w|3#SC@RN{;kpI&Kha|GT((##gQI8v@E!NW zP_~i=jWLJ0T`E$gpbXq^wrW)z>DBqo6(W#K3@IrQ=1A25Ko7i@k$mTwxu50bN&5b_ zK1ao2MoR%%at2w39M3-Y~f?St1%5N}}hnImB8)%v_9;gj)h7B_+}5Sx%Jm#;&9^ zk5HJOQze93CH0_pu|9nQYd_aqqD%h%?!A^9_~W59vDMB|UM_qjv{jaP= +l%@ERi&v53g>*2nSGG z?mI8(lqLzEIIyr$7o1%PhXbFOe=7?-+w%Y3y3a==z)m?uWQEW->a>EUAtWkId$1#K z)@d;Y#8WdfgGm{sI!UFBMsIG_zlI9ou HH2)|K$4MRcI zIuE|N%K7Xf&WANtBB9kG tG))1#)1M@BY*0d7ziyB6pv7z?qPsex+s14J$7g`n%w?_W+Tkm9vz{mncwTpg zHm@+s0f6DHjqYfEg|WPU`|Xtw@>5hgdl^!E{{;j2-167IRdanujMOB!iHr~X6C2fw ze}>bD1l@`{(uD=DOz0tG0O=&-#Q^6DrpK7BEk+bOM=cecthidfL`E+$iSv_E+lolU zPSG?1g2)0RX)r!ZG-R;3uW 8UPv|SjhlKly5>4H1Ljv`S1SY#LvBV)Bof0>8?J*ZT#6S2#fWAwS-ZM-U z`PclhdXQs%SFIi!QHf?bBjt-$=au(375bj *Jse72{v`gzZ=Gvq*J&gg_gCp>+XaEAb4>o? z=!&SY?xQ|Ovd-RXb>6y30H}wYuw3rXthpI{e}$Zy95aTd9zQV9yG@zXl_93aAVCYU z=1Aw;tB$f5YJNf4&JvQmXd9V1uNTD79@pwg1}mJJ9A)qvlcn%7$eBV;1C4)m@w}55 zFqwQ*vbTJTRgcMydMmO`(w+slqf4V2G5f5b0UAh32O{{G<}@Q($Z6A8j~uf(3+}J{ z&@;tOVBC}p*QY_8ZY&?0(zLw@|NQv_ENh^afRFXX_gpogaQqH!jV)d*v>jzfqm-+w z!E&wFA=r;Sq$45GN6}qpr%#e-SrvYvg$)dAW6%#x29O(|Zw_be{kh++1DwZ#=&e?$ zFj1wf@*)9Z@RND zR3|=pW!nq=S2)_*A7a#)#FOdF! zav-0Kjex*hzSA?DnH}Z5sfw|PnWUnqnc9K7p3-Ss|D7+-gt;@uUAZ&J>5&!a9e<5* ze#OQ~Jsxgy?=9lZs #!(>}t!yo9Hj$1=jP#Tcb@DH*Wt`-@O^v zboq+Svw8P6W)Pb)j_h~mw3C_nmiX-&{_DBGdyLBFYj!>kMYnKpIT&!MzC?UoM@_a# z ornTZv39>-s$uk2i>u=Ty%BmN2RPT>1 zVG#f^F9A<=v(uVf&iID9&THsy{+=t_3v!$cj>k92Qa^AtikXx)qtsf9zj(m6@~wdY zgkDo9*sG 5_t%s>&2y#KR7oPq8SxH8sWp+Bkv?Zt^CkR=1uI! QV;PR1{%$V@H1F Fqy_1i!F+x#= Dd5W6c;j*# z3h5H^R}W8SVXugP_US+4kT6`t^}Sm`fBKAxURXU$IwfaXRS0vCSD_wIbhlNHuN3B Da}`^Af23Ut3jC~6)y=+#>zEl!b&bT_o-`zM?M zoxYO7C`95HmD(?~)wO>`Cij?18ZJh+uf=E^>F>LFGpp%Vlg&KSo5`rF{lG@cnT7{w zx1Y0+I-jyAV+80`q*I1lcq-@4ReT4~r9&tooy1SrWgxnZ=zJ@eojNbb7rk{ICLU$z z3#U`JHaffQu3mH|+ijE;U+`yD^%u4q_F$@+7zEluN05KD-2{1&pzESiLiBSwiSuh- z-z6;{@KQ9Dumr)4Z^n!7bfM`C+XRzV(DK^a$*ng*G=Zpt;%B @N! zB(8ip|EZ2xw`ch^O;U SrL28Ck zof?ZLqJC-lFTK1D59;dr%;lqJW@cJDN%(#Z52vt?59SztQtX|eX8uJ+FIV|>x~<}k zdv}tEIkDw&?vl8Ngd|Io#`Au1Yt@4h1-kIkiZ7q=94h2Dn|FYKLxZJN*D}{`)<6Cg zXliT%5Uz5`7pvn^sE_xLB-s(k$;r#E3*Um~lPTYv-4>`Eevhbt?&M7RBs7iLBAm5M z8_%FZzu*gX2-lBob8Q%fccow$-Ou10MW&B#tQ~b Cg$kK+AA*sAoqIJLi0uP_0?{ng3=O2sxkb!37Ovg zW8f*B(o$ytW;VZe&CgyHIGKnz^}U0qk7(o-Z-Mu{{kw{#p(uRtx;H@G@y}G^3`aU# zEcvC7W8%&V=(nCjzxUU-8M>D_4RC392G`1-Pf?oXp)$di7^y~lK$FIHhSs%JzwADG z>VSp~)u;gGiWj@1;0?jf6>?%pumt^e5bGI$wGuNMEMa43#rkP}AvgFSM}#7F&dK3m zVJ#8T)FK&{2mxId@)J9(9eHCA1s g z5Z_>jCKX;Ydx+8hxN>Z3$aU?KIqfp&(o5Jg1S+>CEPijyJObT%Z;=}j=GCRR+mh(y z(iE=62*SvOZ)6y}84o}EBC5Uu>}TnHJ`uf#5&KGu#G?#HdEMs*tPp0R!vpbiX%U}R zEBnk6cApX*-iKDnSvs+U)Op;Msvsds5&Iwek+E>*d*Wdf7=f|diQYi@i(er=FdU=3 zF3``@p0T%=Q;pbBN7FUD-ufn_9?EwmU+U=wm$!#KQh*hH)U}6x1!8FgQvA4`1&I$2 z=y+d}yza-cKl{;sL`v&(|LW;8pYQA>5_QE&=~61N4e8m6KbN-7A}?NI=H07o|GCQQ z%A=d*{&B{npK8{%x0F+?`RB=)KLothmc87Qd5NGZ(96^yQISd{NMc43ag-}tH;)#* z*B8z^Y6&y-Z`21DC~ruM*2fPMFun-V*sr1rc>}wbZEO%1hsLwM(C-ql42iORaADjE z*v7gxRO%BNe{51!71~%;t(%E!C;bl*tL UppS`O2fJt5vDK8b7N!12H z9k+ocOU@p#tIs8ZBawawC=Rj_CUWCvEkhmN37)cqRw^m=O3XNfrq^x}<{!1^h(Zq4 z(1a0fXaM0^i}erClWR2m*ds87^%%?j&0ZKi)M(bPPuAha6-UaF*oZLXHxN8+*hP}q zmyPLq`5LHC_HttZYUlh}e61myZ?Pjdi=Bs6*XlQF3H=&dWB!d#m=>@Kkw2fBo*mU} zVW`wSxv7EyfO4skB^W0kWe_?ck #6*{?W 0#twm$TnH zo%4oME?*ptAy_aZzibw1-kH5_8DvE&1J4nmz%L{~jXQrc@o>daT0@%HbmLgDEB8|j z$=$tOGW~p?q{-wA57C$77^lNMb`KDRuR>?2xjHPJNMu)d_{Jxnzi>w?gK0KH_rq4Q zR;r<<;W+%*9-^s9J|0$h_MdCehm?a^*k>a5KbQT`PEN7wSwpKq0tQpXLZwv13U>g< zz4s(2W4IOHUX4ZRO#H2(8BS*MJ{b)?=h~~G{$8~kc-5+c5wH_z8>tn48Rh|FC&x)4 zC9gI$uhNcB6(~6JWc*7(;giMj$rV+*!W8vuC5IuMe!u2_LMgNy9C4!`S2DG?*B(oo zviu{`i%vIQ0p@0l5x0J$_tLX;iw7hBU>8wO>nd$EJ)g`vuZ-d8kj5C`4=EC)()XK( zpRe @pd^9co?12RP7;hH7pg18ZqeB^8W6A@;%VtMYUE8dzNG>WmG1M~iT9L2VU zXlqTY9v_U}S@&xi*7lMKZ)#8HFr~ dy8>1M=aE`xrW_9=;Od95ImFmX>TDtR1prVOq<7WW}jpkv*vAvB4vo%!z z?vH G zQ|wiu;SU3Gd+7PO$>+;+lO50dWJ~V*%_i+}DV&vCK3g@PR?TXqj|Wa~xs&v !H5yVlw;% m}|RgwT8&_U w>t1hykTRE4x;SOWgPWt$43$H8F*)> z5u7JZozf{EjcCcE#(FqZ+6$hPjnWZb&g?44z;|TC^7}pvj{*QVGH>+mDtE*=a^PJ# zaM1gGV)E{CDTmlD1?ya{_m|Aq4Q^;)R~SXst{hx2FHS`7UbMVz^B3TFc_qG9F=HaV z@~)uaJqkdTVFLgsED?=PhJ5y!S~1s2GN38xzK}aidL6k5x9*3EGzv@=ZZM*7d YDQjJN UQ7Ej=)4kb|r@&&ELX` znlU<_1KDeqP^~in3NIq3_(JU!*Jl(=cf-xV9F4kh3Uv!cas{?KGR5(bC5|NJc__s@ z&uYmnZoUW*X; M(HE1Rfle1xOs?7cOCqs)95~-3NxcI&p*DbX@hH(_t&WhlS=vcV$;Fer zxvE^{$*q*!@Y6BRuXqkSA}Z?_{Y_CFlivHdMUX>7`+&VT6(!&Gq={<8cOv0#d}SGn z*lW!XQV{2nxD=hY&s^B;x$a>DU}XB~CiFaYL?W*UL32hvc!=@=%q*h!_w7 k7|0*1%4k zGDW__lWjtw_`4_?$srd$zmV1h_bDYfv)k+}81_bhSdaz8f&mebkJlrw-sIVYcvB08 zMM9oYr?X1hDf+$zvuMl^$Bw |3umQ)2q;Y% zrxDZG-~Y*b?Zyy~;W{2L&O|Hk33PspGR$ApMKr+A?l8O#Ou(4*DC4gz*E|$)6Q%W5 zkKe&~q R&`z7LjX(`pdxTmF?dbZ!?bZ6qTCa z!PQLfTXHJ ^|&GV~{PVKBK#L3j2D{0Y}j`xJ#i*CF9~RXP0z#uHL_!!&ijj z7kvAMRYN `Um!@!_%^Vf)SmF{flw+KYpAF%n6y9(c9bG#zvo( z#@6k*J`e`sN^$jlAY9$24Iy0X50am;HGF#)r1HCn*Wfq0l^WoncTVhv=z5lU_I|$u zX$ow%nqV~zCX9A;`j?hq;K%I5r1;Ml4-4u98*4 ~lgzo3AKjBLY}?|Vngs_*LuK>9_1*)7X{qb)~6@RTW3`_Z?CmsmpbQ!%iL z$HUo>TPXoKBM}t9(F$hq_kj)SH$lMf1MGoO)X8kIo(FQH(2=Ep8rWarEd4?G``7p5 zI)4!I5dS_h!nOGD{#sX~aK{-W9R49hf)KMPO-CL?DG~jYCEH~IQfWj}pN#hW-lPte zFZ3Dz3J+9P3v*o8!Zvw?Vp?f?#a&U32GBM;BLl_ yCgzI+#i{DYHY^B;_P z*vPZx3v`?wWPo>xQtPnKa-$HNz2@g!pjk{BBi4n%QDW3O{=VRpSvlpaUfSDNe#G8M z#-%qYdDmq83|`TQi3c5EJ5v5){Dd_?M@MI0a~#ZQ_Z4MBTw1>pvT5k(u z7)ua-Tz%K=KOm`H)bx$4VV<9Ye2}$*<8+}q=l$!{!Lpjeu3>1Igt{|wH6VDIT$STY zm||^j(^Ezu7BQ85Rem2RXS)Q+^=dWdKg{tU5W%w;EV^%16>=QR{3a4S_4l6f1M2Z# z>P_RhmZc}c!c-{SM3)m;`^Aq#%$u8=9rv Lq+@f>3U1 z?>o z9S67$nF6(tn`!yC4oH;SrW)ys4vF#}4XtqJy1jHlx+oI? >;xV17YV8-l1~bMyS`+-nY6N!j zBtUTZA=S>j=lg&7q5#@S=Jj=rbbO$}kdK>i=$Ojvit^Rf>RhEP&4&>tqj7 -N2y4w-71YL0x2Ie`AnOFj7hVWSVUV9nL zi#5(p6i>r>0mEV*euzO$x| qKAwg7O7RN@pD=0MeQP(eK$=`l~N+H z{)n2xm^!u h_Y5BZuf(C 6*`6yoU?SI_sFpO<1BNKxA4k8 8yK9_Y1cvvvbtuicepD{mvR@Na@{xvxT)x z;~(6=t*4Bo7Ko*J)kGfwC%K=rvpg`h*5^=o*$941!vrJp{rf{lL6z>gwJKf8;q8@C zO>Y_IpTD%J?4LT}a1g5FrbcVk2O>`#F+DIs)jeDwfx5UHLA9>( B zD(F <7U@2&V@Ewl+m&q^@nV!*uH-tc1^WmdQ&%V|kfZp5X zFKvZe%T>nbWB>-!RG$ChB1V39AbpwkWwF}$DDJ`kJ)YeYUI=CRIW$tHQI5Dcy8Lr- zIKlz%8TNuN-On)nhokG48iGQLTj6lHpAO$!UBf^UjBV(}Xw{nM*^N{WL|IzM{Q#X` zRDx44>xMN{nP8ji?EMazAv9BP-Mvm$S-NQ-^G8wMW5k`rEHq89bO-w5lrmt2Yo43n z@@lHnvF{ZSaDVUSC!`;GcwOA$=?7VLYhJA Nppe{?283d-rRh~WtD(%VOdJ7fb})d 1T*rmL2XX0)tJM&NE*Bc{m5 z{E`pz#T&%dKM>3L1)LLzL34rR7WXFK?-5YVfRIQC{k7f@#yC{%L*v%`uOGFo$eiRA zKZAn2u1g Xwn+bxQPlw-K4rkWXrdz%@ JcVDb+sPYJ9g8Grs%t$y&~+_%|U&KYEp^zb(Gl z7<`n0O&c8EFu%iFJ%?`2X?SQt>f FT6R;DSDfv1^p-3Uj!(GF%*d&6CJIl(i04D$T^=hh`B$j_ zrh( xQcf_3F;d3vGQ4Zaz^U%Eb`7rTd(iXs%V; zwjceq41}Z=i{1s*Y&b77mb^)V E(K`M0jll@Sq32#J zuCplltVE5lv;G!ehDq+5p@UWw{}LwyOF(~re|T&x{(7BNq$DFxLQ-a~`p1EKk16Dp zS@;*(J=Y4q1Vy)Jxbm*0=lFeZjCZlfh;W&BuMCX?T)V=2V0A(148J5~)by-WfY7Yt zo10M5|E{ea9!z2LME%|2FUu_Uemb4Zl^LG
I@>1 aXA zakneMh(&*Za_#BTz|-z*!-&{v53encjd2aOMGk|m*#|;fh|7TsbcF*x$pwz<8XzWf zUWz0K$zXMT$Fil(52U0%*|DA14wqw7)+>{rV+- 0q2>V=&dhbkMQyoUZeLgZXX(h!{3k8lp0{tIk=_H@5eCJmWB3*{oz_Wkqc-ogf zAKO^gVjXS88DBlB+7*A+9G;M2JFRn|*2C10J&3XQ> XOcu>i%J+qH^$u4X=u`Q{&xAlO^Pfsx>8t08xOjCl;RlV0F8=D159x!8JjejH zBtH-!Fm 8erk#yx0L>eTG~nbdShb=`4+L}DKB zN3+x|?=J8FCzex7*Zt`#6q4uHa5<4rZ9Z3~yOZCl&oHXN$qGU)QRmNhxAu9{9NZDV zVM! e2{|T**gvw%uUAoYDY{*%^Q5c{^0=BDX z7jAQs&ENgu)ViL(!2q_nnH(d&AGQ@06+K@T3m)_DmyAEOzYvy6o&=G2D9B8;x;)gU z^M*(cl-aA#zUycSHi+-FR&iLHv-fjRS-)+5CFfgxKRnC}1Pob7tC%K6Eu0P_HFOoA zA$Tl@zcPHnaB%qig~w8z5?LvY3kh*M1$|crn=*nFG7iuj-h&&Qo`G&wrCs^8GQLd* zBtXGwozpmU->#ZgOh^YhIv~E()5>1fUMuKaT9MpqIEeX89smklcO#iXiL w;Z%+YP%*Q~AQ7;H0rIGxd#~Fb>cTr#_G+#}Hh;;64=AuB3(-nS zOQmgWzL#X>m6zkce*OBhd&m7+vF07Yu+rI5*O!IU>N3N&SyhVVFC*e*9rIl~t+k0c z^(*rktvR3FPAB+rvq?E;{TqmK9}pkE{rSh*2@;#g0CB;LStGSp11)_=cDF_Csc*#5 z*ZccQE?&6iwBi~X8YVR}`UATDLLHaTi@!NZ(eR)HI-s1= #$Jd_| z&G`PZI 2BkseOynJ=J7PbO*{M4(ftHv+C81qs&frFupk?Zc8 zkeZ&J#suti_4KI06V%n!NB{ms2TIDz +quTCGBT3V8au;4i9Pb(u9K{R3lFSva=7sWknvMttY9^)v@r z>gJ(}b6wH8oVf-}psvqW^e+oWWIk$K!ue2lOc$jH$w#M;roSRuYgfgEgs^^Ac$C=+ zsyo@)W|hQ94h$#Zp&?*;S15pKpB!*e+fnyy99m`%e9Vn2i0_)6Rl|8YzA>j8T{&a7 zO* U z*^-Y>g!K;$#;0yA8tVDz*HeD5v}~DQZvUK>#SSA%vWCd-w>&)7S-*cPS-+-BiJda? zA_q}Q)HC*4!t#G$sn-Pj`zMNcq2;&l_*wzr*W+X6jJ_U7J&efy*};~WobGL}Y9lhE z@9*{5`HPkQFL#e${A2NQaYZ?PKEmG5_O^GnLl5Xhnav)Xt $~%-nTtdytvS7$*}n1l(!2KA+$L_SdBI1u{|)YQhvb8&!qF|- z2pT!z0Seg2Ydpknvl2(%zZNxBj8*FAaUIUxrAH? TW2Ty$jE3A12*Z+Dd30#&$3RVrUutR!iUmm8I7!i{X*y z2z4$9WN$p65vLK6+5J4J?rDqP?+@tojbju7Z=(1gEgR?)QzA0>KaM*wa_LoM#r&X5 z!;G>eiRze7eg-#iVhi{mA>d9j!xZ@tQtsmL$fsF5+}FRQinueFIB>y*_%W?O<8t @AzaGdZsN!MyrQ!J?&C6o9e8t#Af8Gx7>zi1T{knNDJbNt{>Q7w=o5$?83q z$1CfIwLj-?(4XJV>KsS}e!6# FS5(%NsX28ik;SZ2CxI<`HQ5^7~dZF2jzz_8{{zCrFLbgljt6oYMj&~6a!$su+ z<|PR?=SgIaG2!$#>#2n93{TerKEQ)k4}_n^wdo!k>D=(7X9dfCWb!Xhsr9PPxo)Cj zl#iu{qcygYlPp6AwUpP}i4$i=6K9~qY8eM$zSwo@>>>U4Ger7h{m4`&AuGIxRuXB4 z`Hi(dI}EXKbePN0>X<)nT7A6|Mt5=qfgW9^cMXAFh#0d|j+r&PTjt?Jh$sBsA4|f} zYllx~ic|#-N`Nq_)<02istXC7+Z0#7#1Vtp1=~qp6xuc3JZN&PlBn&|6p@Z~C0g03 zRp91W%NP(AW9jj^9A qW`^*b*eeO+61`5EG>4ga#FE_rF9O)g_?1k@TJEq1e$ePyn zKU*+Z3_MBjw6sjFm;%LonBVi7*iW!fRY}RnnqCF|&~JKam;FKk_Qw`-yx1j0? EHRM57v6Tj4Kg+1&ws>0|iHq9T#ka_fAq^zv0?fw1r4Q@)@R$o<6 zQK>^hlyC{F02Mu0=@t)q%{Ol%wKj&)iRcfm9AN#7T#_|lmtGfZ7y(I1N%4>uPY ssuxavj;63R{|N*p{Qr{eX)fhawiR&R{3O>kV~(N91#^YwY2|- zq}nCK0YQYAg#A{L{^ULavmW7Su`!U`Y>c=M-pQ$5f*yG2;M{GF``TP?+*cGKj^c{r z`AQIF`zh)CO0+@%%9??epXUH ri-UjRLBrg^69nwa z1NJPn%iv^M{CH^BN8c{0ev1BOHFawDX=>NOVP$?X6ZVLq$ge_N4GJCX;>QlMGG#;^ z#;_a_k8=Bi*}9||J2_QVf+NV?q5aO)i!g5l#m|+WVF@WI=!FO3ddJ}1VSp`Uakv~~ z^Yrv!?c^5*Y_w=gRc3!DqI0kzuCD@`O z5-b}<&O)A;mPR>!a2bC&ay%+cfF}F9_VhmI)y_@fq15CpeB|
6>@`jIhB3%6#qF +2bwJVDyo zxvzkhmX*oc+Onk$&q@ZPM_gisG$XD(y#v0L4PB5ywz7RVe0=L~2>91w;y!Z~3V`LS z3w(ag4E9?rAR~3iy}uNlKLby$fJn2H3=0d(>f^_Un{ke$aht`brTyB}A}PCeu(b{D z{~+bzA&{S+uPrh`;aq?F-#2W^XF_BA1P|FEHD9L1KwcGZga<2E&Z*v&ZW*00a%tVA znN{&ZUfNA_rPijTkV9dAuvZr0#w7bt@so;dNDjYr<0%1-;|3l1a<8oIj0@1{G^Tqw zZDc2M_X+?#XwL1QI8CgpON i6T{pUX7#1^CRvtI+6o!qCDu%!9h=GPJn>)tNF&`MEIJc9fWJF z>xeUL2{AM2A4jyjX 1bUTE?SAI|gSG-runGb9N>g{HU>haB92Z*v5W(1ai*99)6XJmhz_5 zY=jSwIT2Y$Z@vA~xJF9(;np9KiPZA?(Y^Ikt*mo1Gdq7wx0{=VEAEI8v!`@+K@0w? zOHepp+Y?s6o$dLdf~u4hGN
u7BhT_b~hJbw-5fy!g+(AaH3ZAUKq2ta3aYbgrne@t$n@xh5e;%_q{+wV=Z+ zao8jBdqf&MEkU3`K_rDN=|hM_dJOuM-EpFC*N0XRrrmnKV$!LfWFw05Uss0;Z%Bzc zYl6dQeZwQe!#f5mTK7+2zT2H)%rvf^8x9rmM~1=IwbZ|7hC8km?B+bMu}&;{5cLNl z8~nOYL!QTR`evpJa#P382$|ODa=T8e?RLWG&i9rXIz?I|fu6-{H~!YpJ+PZex3#d` zLd83Sf_BG+>nBgKao-+(@uT4TFs=6Zl`krHLPCd^8P{`LURtkhqVIKOWRD&_%HOcD zu>r9+Vcx_JN2?VBEwg99OG-RSZfDd1C~F@EoqulsQrCmN7X~Y|Oxf-ROL;wZx)N0Y zIT_ho@Il%i I*Q|N~HE P6lUote8VraII49S1b4Z|NJs+}Wx`~2}i zJ;QqpR}YVsZ4a=tAQh$!^xtA8<&^ivOxSlY5{OE*wf;RbbEW?R^(3n^KSRItosDj4 zH4X!b97{W05=kB8M(|~W`nUfTnAV}>6UJP}r&-Dq^q8G%5#pkq@S@EHkvQF}Ug5E& zKh^o>liO! &vvrgGW=!vhx+a)Z7|ciMr*(CWiom8BRTNzuX*yVMGhtP`H+&PA@Te=y=4a@b#-Lck9 aojN)aHU9U92i{-kwwQUWx8>%WfMNFw4kq6XG?W zz3MILqc1?(42PGW8wvZwTTB+r9s+3Cq_R&`Fup#*s}#< 0!RDcU^ )6P84FcD8*VL_;;6 z-)cTGeQD|-FCff P@dpOsZ5x?@8 Z5;qH-x}^F1wN zM>3n%ZeuXDGu8%Ne3PiLaPa$WQd(XxNd%_%^5vX;vBk)jn9Ne=O0Plk?M!?@7N$te z7X{1%5nsEX0v#2_{-Kf%0ShL5AtxlcQ+rM`$*Crj+e-U)7EIq?kau_Yto~YIjI3Bm z2!efkDvg?t=RJ8bJBHPPNnfqHP32Q&<*vS6 pqp-Xt%UpJ_ghflmMD|B<8A_XQZfOgS zMKCQ5ds#_onY4$cK)z|dF@FXT9d%s942j80DkNY}pfv_$IG+|57c{jaVZFvm6Sd{P z81D7>a8G;GYW94?RhV0d1N(UveppLc?vk)#=QirD9lq-}gX63{N-oL ^#RIWuKD@;$7HLISACMSuQFJ|?AT z(LXnPEQ|!Iw#_F(8KIvy(9BI=qUVE>M$H+ChNU%nOs%`dE~ajanurvFy1wNU4mLSl zr4I7~^zWKm4Pko*4E;Aav|kOqPaK|HG@LM<9cIa2TwbnzR^;qmj>c_8bYhf<8Q>NF zj7Tt(TRp|$>}nueGFAFZd9Lfj?Kx`vZtC4nyO#xJb$E1;JMLA}H9|Uyu)8LYm6`*i z {@SRem9p{;*K014lrW} z;Kznz-c6eI3CW2voTG1Fcnj|HcdL_*E6efD&{SUivBt;^#>YYzy`0PX_3M{}i( n^c2 zJ?U=s*?LPraS7Eby8dGt{rho5v}Ewu^mIr@@j?i+?T!_cJdBNv2iE`PSITkc8ED^^ z7=ACr46DXXRcR+h+$>8!E*HktNP2{#LG1K1Umgi4&Gtu6 x!cVvz7R^;A;Ij6unj94eLlZejfS(0L7{tJ03#T1UiGx68s z;;98ihM9=yZwOzxe+${0vHz`jo&Q(ydi{SYUeTNH?a?Y58YsBAxdpvWzxLr!5R;Ig zv@9G76?|HbT>2qCi~{V>H4t2cT^c*SfN0I`;(IeRY6~a!u6tc5;;;o#xW-}to{{j& zw%132?mccACqw)vLYhl7Wj_lUyJ6Oi8@-4V9Uar&@Fmds`<{)y*o~;8_9O3vzT%Cd zN}`MaqruZu UgEc=uEp2 _bg2KD z{n8v;%CDlcw)1DD!;% ew5n6 zrwS7~3YKsPx-u6n zbYF0xkx||$D+F;bY%J$OQVryO>tsXV7CzHUFsM#$(@|8cUp+w<{%-I;z461mCmbZ3 zJIA@F(lBGkMHOT9zb1oe4{0KSn@wpC9V|4i71uPb+tjqN_S7Qt+6bq9iM=AOs;wTv z{*2LHDk1TWRwR_k!AQU#^ZRgZ)a;@@qKE^+(dK36V@dJ2s_NH#BN0WmOYC8Hs!?vQ zO^@Ykl;g!gm$yr0(&IslK^ z8>B~kW!5{LLdqYltY*Uy_YN5yv)g&Kql@84-1m^2@9mO=O$8lJJ70ipdE;k9^jd<_ zp)O(BQA {+4bRZe-R+71{gKZ|$IMCT{@yV^@;bI 2B+uzzHp2Nlt$C$Q^^h zO*pq9Y%!t7;-?D^#ZSAxKW#ktkrc$hAg=IcObAbol7;CvK2y8?F=cEVbzBR=NKDVe zAa09DjRhevIVGw3mh$G-jCpP%mIu$k^ZJTWa-j;@=GOAzoxLc{MgdSLzCS`d$oMK{ z(52@n_s5-H&&I1iEEGZq74sL5DwHnQspmoc_XIK~5clei3!wKKrN0AZ$@nFhFT1wb zP0jn@zI?z)L5FGP0TKP#Q>W~S*xqz1dOxn=k0qgtD_;lZMBKiVig#vi9U%dC4lClH z3F2ttmUsnr9gE1_s!q0}V F1}0DMptCS3u&b+`*|?Q`j`w2D*tx2wWb{g`G 8EPr)kC)p%w6XwhTW+!R4>2s-ongM}x{xI;v9y?#=2VX^{T@ zYq(&-R0*xZqNDiH<8|;ce0y7lCe!LGv;LRtScJP yjUa!8_7j@daf4WE3W# zz%Y(BY{C)&sJ(Y1{qlwJ;REIU N!%nselU0gJT+aJ8`1p&bA zPi@?y-}psNd6`GcRc;a@p0LBVqK$m6!J!Y&%gdjvLn8OxUF!h~E}sR$pFcVM&4{%f zWLfg5NS2_^rkDUIO(Caz_`d*mRIweg%zmi;sVSRxK3ZBbAHwj~W_3@jm&koHRuhR9 z{zL^H&``c|VsO9EmOPk6TUhT00yu4UO#m)_7Nod&AG(WE>WV1%z4?u}%kwTuir_PR znl7T`dma!tns5rmHao~wBmX2LUuoisn`FiGfjQ|Yt^^$zv2gwnm7x25R^GY^O2R#s z#O#*Zv&bYNFPYyi_7
beR%Ih|?S8lI~kxY2bmX!e(cC+GJC_5{*%XIwm5cHg9z8AEBFD>5?j z@+bg4-S;l7M9#i%m?Q%ulWUqxxlxKznr0*n!onwtAxJ|+3D@r1jvwZY0zga=EntWc z0dj9Pv;crfC9|7v$}lFOK#pO+Dx|Fj$6HNXw=v+f7_qeIl)-?=#;nIgn}breT)jVm zJL!N?!h6TSOLm(e2)Jh`AzPR8wvi3_U2rf%iL`hh*7EJ^*Qe`<6N2rX9Z3TN(Si0C z($dn5;F~!K{C>jY6$70fVc#7)t#l^|z!8^>ecARyNaLbcmVKb6^<77Lmm@YbdkJr) z;QPY|BJvovBK=s8xEugzZHj=lK4@zm^IfdYx0)zqt`bJ)Ka>wPV-#dOfH4)Tx z9$mX40@W}b)K3fzf0ZkeOP?WMpR!e;4mBhN^wW?MQKO!a3*GxDp{7xO#QyTuI7=mL zY5fj;>1Z){tuJ=M_LrV6AyR;iLzqhOPl!02w3v;pYGEZ{>_d={FcnN)T@A8{n~#T% ztMa<@6NRCa{u^w3I>CSuF*s#nky4;av9#BX0A>8=py@_!-bn%D|D%fY3~OTR+HjCw zL@*$|Dg>0?JBS2CI(TRTp$aHfdI>~|5L&1r9TP-Qnj)RhduRa>>4LN%O+c#1Hy+P> zzW4nz*UUA4X3t)Gtvzd=`&q bO%aXKSiySnZMj->01%pk;r&hggd%zO)U4$# 7S;GbHD~X@0i_92Jz%Y@Z(N*<~E^ z03L4aSIp6{4;x!~bDyi4aGRjBFZlkJ% j7#3N=C=yKT~$ccCK3%J7bDdSBZL4Af4$P#uCB#}wotGWm|h{`!4n^!$PL(d zBzM#oUOr!@{Odc?X&rkSbd;8nfVQ99>_bu1wwf@Or=nt~2F1X~Nk@f~^aJzUaQTgd zg3gz^7|SE!Ihj<^B4amHxKgGlGW)}mt4~}}o&BHAH#;Q-c_T=Kxo;w7nW(8_ivB45 zpP%^q5s`v2l}*d`rIqEUk>XeCVI*9-`S3vg?%46~&-6{(4(JuueHG@_GKU^Uj^kBj zCD1$2Mg7-cGI-Q-p}D8o71})4J26AZB+e5>3`yh)Zqo3)H~Jro08`4>XA3Kn3IMMB z2)BB9^W+1IPtb_$ALY~%*X_P`vmJ~FmYW!~YgAArJ{#Q5T{(uc!J@|AQ1~CndA~2E z2HDCSX$6o$NMkyQAZuG;Jru4f#6_?e+t^W_9!HIsp}PLEUk^|Aq(80>eVf{6k=zSf zfcytI*k`Il57c@%j`&opjl|jhAr!X5@i2)1?{~Y_g$a7~*M-wWGE_gh_>HQINwM5b z#4Pw3PtF5c#7}mdkGK34&q}@(3LHk8tF_k4v-{gDzaA&388Ptk^4f~6Pf1l6T5`;d zYPoFGiE6uQ3x-&kCyPG9ffH;b02tv8QZ#_e78QLY=>VR;0FZ^Sa^4fzi36#RnE$N# z6eGvE(a*UW5O(5tW2r9P+Jeq?Bd#swQSkTR5EK}aZ3zPP s0^T&4=@+%<#XqI^-83p#P8Z{ z2n3+(Z)~lFg;78%S%$(m%aUyroZp%6F0t*LewBc08iRV1*l;b(^6Y{q(VPTdxx7)W z`Zy+8>x~z =(ZqpWN_78YVfI bScN3G(z+l#^gt=3_iSgz=Zb2*=a+WKU)aRXZ(z; z@gs?KF{!N5{#dYH+vu`fuFIodCzYRi_2|ru=WWF^9JHCuWY~N&%|!VCD}1~-?%Rmt zKw#XlQu}YR!|a}iO$F;jo4v)3NstG_noi@@vGMUal}p5J-D$=4F)>P(TK^3r>j4 z^*=B&)HC`L!bEtEIh8qj4r1xGJ8^c}GD< RCA_vw*RoBB&2!nf0OzGKJWX%O zYi}%55Ialrw`h-ZbblaPsT-~wC)y4@V16e_@PmiB;+;aN?V`pW@T6bGz8&fNHhIP? z9AP$M;@Mmoa)wkj9#MG$saanMaDq`wBC3i5u>dUm&O8ZI 0I7Cdz;>l<=XColXiYZsPzLm+nr++uZ(^Apkj*BG9bEG5JU?%>Pd#RSTBX}DD%E`yUP#BJ zcANPB=?{V)i-?{zJ#)W2mwd8mN- 2 zx-w?*)|^iP>C3=3c+}B_WOyT2{KaWD`V8j!H=ObxFOP!@vcYTP9r7xFoIDH m>Qd73-{+bpX*qqo=v>^;Q}g$UC?9fp^hBeLScEohi?K4Rp?oqhQYLp|uP{ z>ydrtp!K!bij`r}z}&WDHKS hsgu8G;Do5n?GJY|CETrl{(E!p@hY1F9eXo(A}$$iDH_>V{(QKSm}`N1O+{w_ ZzJ+{lPY@28tacCDPHq;^FB^PWA@Fn4&^gUo8u)|QOa1Wcub`u< zaobwA>5<>s!@;aZ$w2oxRR&7iM^?ON6rn}=Mpw2m9wgj%Uqd*WR?TikK(eQ&TABt- zu%KZOC>1> *&!4mWd&DpF7w<9t%h=VGf$Z zT7eTbA_*ts5geJ?&O{(O^%oKAk6?`~-70zZK2C`?C<)6V28w!iD>(CTi)wz|i`%p^ zMz2z<%m(!=mV)Nqy@+xw$3rZqGDG*YXd?19rt|4_c+T4Dgh|x_Dc|o|->dN)g)uO! zI`kxjy3IFpHU#;y?hBIJu@sAVV%mnoJzriS@stB_zD&i+Mw$S0+BUJ$cd$&sF(qi( zz=uA)w7k5#DYkv2;9`B^$1xaCNS-SEn1?Jrwtm9p2R<;ZJ6TbuhDnwkUR(F`Ree50 z(0E{QF+6-Z??7+P!H0XS#Cbf+CnoY*>a!$|TsK1Z1ZHlebaNeyto0xV!oa48$z7tY zaE+Sl$moT(^8k$ubD=Dxu&z3V(ZIuTy~v7OoOuxpRtA0eJhe3{&tBr{@et~XXa_wA zQB3gm1}-%-hkB+RW@hN$PF{yr#)ym1F7z>99vm8S3Sf5rhg3IMURixp8+WHaY6Iwl zigOF*|LYF(s{3sFI==C0Myu&{I+rJ`gUI5;7A-5wzIu8N+3d8Ou%Z@9NVWoFVuy^s z1---GPyP`3w@t>5%@q>D;@7sU&(Grp-yNK}X8lsqTz(;tbSrtVMD%NqM_ng_6QbSr z%M^>au1> q${}A)*PSy!tM83Tz$YOu7ach048r(gmL&lpg%X^79*7s=R)a!=){E4u8 z7}dE|ufiG4c0$p(fT0WFyAu7hM?gp6WHqYV>Z!x&-V$ce?KBEkv7G*DYtUHg?F3oO zIPKesXD^worgt0{I4yOzD#Fv+kw|9yYM$DW@G_ebO<%m`b%R-uEux(pM+>r+VH-|F zH;EK;e(OnEOeyim T(I@Zs_fNm*)b4#6 z4+fz9W%TMS7ASVy;&*CJKX$p3loV6k{GB($lqOV}P&f}{uVv{$aRtSEvx@vEFO_Az z0M)4A`Wv)>+M0sw$edDJ5+{UJv60SQVwck*tJh}rdq#j;T_^h;PdleLiMGW}rm2>8 zyDt8sY63PdQACA>_cFa$O~Ca}ZmZB>Vj40jkdn8FTiuMfgmeZZ>CxhEN1kJeCu|hY zL#BEmOu`1Xrqo76p}&oDGMd60yfjbM=1&NgNA@RxjR2KsIV|>t0SvW*))1O_BMC z99HH=H}j&Gg54TTSW%Z|HL62b%0-O%%ep%$=wN!QIgx^$7NU#SUUw;v?ss(Duk$;4 zZ{pnLQZ*9<4^+qR^~{gX#NW e{0~t?X@QE-b~o4b7?*wSmy_V%mTv4G#cpsGN1W&hA#ygdWC>gAi=L zCb)WR{`D5nBM14a5^ThLUhAfEL=*tqf-WBM*!UvFZw)g#HAiyazn1FXm-glH0nHio zu>0V|R!(t!FeE+Ag})-~;6?itkehE`5!*p9`&4zBEM14wI%%dlmmQ+tQRBz_jzx%7 z5#?b^Lxhzsd`U229a!FK3l3$Ihb^UIJ@qXYpwr 7hZrg-(6E-qmcaMde3=gUzFNcT;f=NPTl3-foFioYpoN|&eg6=_Y>G^m zn?7n%&-i;^mQuU1gvqZwFe04}_f4mqGrh&O<&CLHHwPOmM`2p<{KTHqG$6TL|Ib_g zz7NXXKE7Z8lg5lwrlp7?K(?_+qD}ugOk=(#yn9m^K4~&On{YQTNjX64)ruU#7 #}$FhD#M5hm^Q-${Aig|pi0po$a^Ij#l?pe(HIo;mpx*N(#8fNDX zi}|Jmd%V=SStJx?!Ao90okhQpYgEBe@wnywp#Zzf1-$~qIL#hEji&}S44RKY=Hkm0 z$F`@$P_1ZrR4*Bp(>sNJ(?J@f0c{+%EAxCzy!18Y6Qt;}ho)b{TK?u=*4AZ)XiuMs zjYCe2jT)?~eHG#7(KS=IqNI_B7f(BG5zS&Nso3Uiu7F;&)WzwUq`mKaJ#`YQKC9=J z6rbSr?#Lh>UvYs72UH#PD;+!tlPl}IqqBJ2wy;2`(kd0~Lq7s2hPS*XLI}$8FG^BM z9c+z-a`ho9vv77|`xE%n*Zf^y84x@n1eb8z&}K7Ci~8B}ap0y4=EyW^=$YL^$(~oe zU+!YpwCpbFRgpqI|2jub(iZ~M63~vBSK@EbS+AG!g9a+6WL@-81)fu|b6*hK4_&lk z_t)H6DZcJrX{rUkrmP{o|AzbStE NGD6_w8}!1&B@B_>LmB9$ z5!%bR+YQ{2^&&TKW~?0^rRg{X1mi^^tjTGRPBM^lL0GGHEbJ$0gDPCQM2+o;8g!4? zp?AgSQpeQ+brp-X*X_C_a>(6|*$Lcd<-)u*FBXNegM`Ljg(|nf=GA~;euaECkBrhH zN29jsM5uYxuduTRVv?cFEtf!5?h$-`^tF11sd2y~)#^1{VB%5po^P_Lrb1R9(la@` z6X#S$!t1?H!e^crpjhX4&_c0tN}C ^%eqOv?8Am>#5uN63+K8UoO7mHNA2B z8fhPzE^7n{d3@rSr~0@8TAt)gezU@oD#;Q2_8Q#A_XcbWrbux8up?V=G{u7+M ;8a&jIS+i+l2likpNg{za5q7ZRTMhlqv9OaXNkA~wFg(Z55w$9 R0o!1ZHdJ4uLftmv{{YB;Je>dl literal 22382 zcmc$`bySq!`}aF^m!zbEl#)s#4T7`?(yerhGz>~N0@4lA-92=Qba!_*Gt8Wu&*%Gl z;;i2}&tGSq#bPmg&&=-ox?cOeuT6-mvMe4pB{m2I!h0_#tp)-ii37jSFwudWp3g<6 zKw`~9UCUYe%U4q;O9y95dpi)wE%jG?hg}XAVc^Iq$tO>l;%Gk4p)bFzen~;GEv(Qh z$ZU9A_~kR&Fk*U@EbhD+#`#wid(8qpuXgrM;4(+)H+Nt%`&13xt6S?|<`^G?lx?TF zghqt;Y{~QJL{*JyHC)rLQcm|dMywbNY&DY1BSzaNE=X^LMoKSAw$mf6iU*ZG*p+p` z TwF7X)<1jg82{+TP#U>bxIl)H6~UKQFGtXL8(eDl~tx zzx5Pe_%kKxodK>6%c%)1JIQQ>4f()#>zu;A8gAUV04u4E2Gl3#Rklh!q@TXwZd{|f zX1g~nvSO`cvP79Ly~c{C4}9LNYr0Mx^vTO- Yz&@S+Z0>g@rb?er}Fp8e~+x3=T5LVGwajdbkitr z^u#ciVFCT7>8EY1H29)}c %$| zpM!>Qy;qk#{mTNcAxat~auTZbd0%1}YW8&Q(J5MAVB=TbaEW(E$>?qyOt=Qv9Tst2 zLQp35A)+lGr{&`OgtU2)lM4dxxXY Z{}Tbj!S; zf3oG^>+2iszv%kf90FD>npm0;0e+IwjrT9!y5}|fXj~m6Z=^ISXsW3pV+TlvNN3mh zfPfcc*e`uauo+FVkma&e>B;`TPOuFOi*%zVW01C2`-U{$puuD?&1*Oy)9_kpJfic2 z@$sKc;u(I}Mv0O>&ct6&OkLvI$~FQm&!{`DN3MR$-1WdP{Jspub8r6gq+vtoIejJI zmiDh9=@cJD^I#coS#-y}294B<(A98Cu-uKL@kh;7n-k2-%Uj&}p=w^%dLfv%m-`gO z*#<|6c!>1sY@SYxst1&mtj%65smT2i3`yAW`8{9`<|A~&bBMxLA?k(S9FE;1`Bt6L zNVqCkiT^zjcDw2D)!o==Lv)lOov?W8YX;&g&Jt7cWT?D7^T!9#dKjhK^^azOd=uKz zOSF#^4w4Ns;V5NDYBfQ+456ry<#YzEkr&&{T5UUj*gwnRah+_w*UOqP-n~9b_Q7A= zt{@YAxKcsmQXD(SV7YOp|8A7vSt|!#X >h-$lBXcoPzvwdZhupIQ%sf>SjXI8ihx zhOQ; won(C6Wkl;?`L8j*TzshyD6XT zd^h|qC85aMS5o4T{c)XSsX<@(|F{k6e1jV6-grU#9e*LK>sr={&i#d!Pjiob`6v2W zb{|g$4b%f-h0#%UG|=qz7SrKeb>B&gx+QW#eB>nB$7p#4+5KRZwJ1?7dhry9U9U=t z%igW!1jke-zhCe;G@73O#7wFCW{tf3v)EulaaZw8QMz;JH2-7;P z!vnvJu2d$N@Ngtk_tph@wlDy*P4&JL2ULdapmFm}mBrSxjk>+zcqa40t8f8)V?DY@ z25Hp^ULE=h8UJ0oX{>kmT>aB0WN~p`asBu2LkzJ3kXcBlbqNhSE?F;W6f?50iP}UC zX28W))v7;a?UsiHe>2iq)3;~94$5&ssg+j}O@;VMP2UrFt>X
T$^)`R=@jceSpPNM*S922eFb6-4hH+%3H i!o#IEFdp< Jb%YCuF{Qp@t@Eehz~v7fM-*uGXW68Z8scl}cZX>=l{X_a98yrv z3}nzcoGYo86_42+=W#YM39+>#jGs@FkY9ARuBlMkmn_<8GU{ SMrGor@kdH!n|5B&jOW0-Z7QXL+V!axZv&w1 zVr$f5tli^rhb*y-fmf_u#$g%5%bd3({I|O~sGxTCq4m?frRoQ4*PVxmAThv^h5Eu^ zthcvawQ}#3ByDQ&gV@EY%AE-FENv`$hwK0T=&4#P-(hVU!~|(IiBvc=zWpSCax>hP zl7@b<7l_iLDd;efS}5o@qxm4^Xd8W+bCz^m%#4Cf?uVU;J<1?B#ULz9_0;c;+l>j| z?={I3P93V`II$LN_pL3%u $k?{wj zSD(nj(C+R&HkHqqDmhlJtgVR;Y_s>zwFEp=#@j6a=)*P#f#Nwlp2(!S$#)^G#=q)A z%c1ZgK0Gge>8le=c$WVQGeGi)lO$b2slnTUEG(cteR>6$eg$3AG&+?sWrG&chGAW| z1Iq_IX1>PB=^`x@^+ZjsA-W2X6WB`!j_Jpa+)X!=|4GuBFC^m$ENz>foL8oTU#qF# zl}__n0qc*}@043JzvALhQ$wbC2}@zIrrfn;&+P7M-8d&NSzVu0SBR WCr~9a#Y-_C_H>DoUQ%pcqf#-9T3A9tg5Siqd~7F8 z6PAbtDt9MMCD=_$`upLH;VU0#Li3ZZ6hwr?HDs@~{`8g|>Rt!&QV*embA5D4e-Wv! zr-3d}13yF41^M%qsj@VmHvTx$#X*?A5{48>H4cB}#c&Of9n*Mso$kr*LI9#!nH(^{ z&aVZ7w9a ?WfgN}o1K=A!-pnR z`o68f;%;jP+jq7aZ3q(IR_lvxU{T@JoR$V-bD@ibA5ay6Kp~a`4L&Z6Wf}S*-8G-n zBZPI>-T{Lnx+8ke=$m!glkg-(jt)0OdL^z}1yxL!7gUT`3?#itm(;NW=l;I#3-wen z23m7ESA+ywtQEE&HWC~<>2#s5nKtQSR8J3>MjyfFXs#kSXKLz^nyuNSXW~+Glvng_ z>S@2xF)DrddN(9%8ZDYz2o*}2Vcso8-z_!kXDk^(%d5r5-a7Oz*|9CLl~ibjmRHt= zn14jk*hW&Lr>e#HJ~=z8j@#HQVSSV#OdcuhU{rmK)el)*%9I*_)ShFGn9*|SX&@f$ zi+uN!X(gjamxcO&0$3t_tj@F`hE!px|2Ux7o8@8Ai iIf?)uR>VA?V9pc)gJtWBQyB$g^I)uTV(m`>&gxqFd+IsKs+)i@V>pYg%x?2No8< zz6e9&Ycyy|+vAd43(vHQ7+8IC-bI-Zyo;3nkFT2%cy%liAgh@X6sK<3_ywupl9V+! z`lHX?==sEX5YzKUnok1GlI0CIB>0HY(2gT96SXp|Vu+YZX-QW$to40vf>;dt^X`Uk zaD~G+;M+s$v_vJ#hD1C}38c$i|F#>uKrhF}N8_oR`L@Y}5M z9i-qA_uOvPqQ(!roLByEHTSQpd?`dKkNH&F)5X?We9dW2$EwQ+hFOEM#a!~}fbH)d zd}k#BI(b+@b@BICEFj5xm>Q}Yyu=hY#_+hWQ7l3?p$QyJ$6;%1E8i8Ogs&419xo*O zGY=E>1fQzosL{2OgGMV%c!8cM+f=1Pps3A&dvD2k8^8bo+~ZHrm&<}p%8RZ&gx5Y3 zIB67)5zz4Mt_8j-V92_er1d~($aPMZM4|Czao%P5VwRFvYvgWg*5K}Q=*m`rXIBPK zmUO`{vHd&ZB~4bOfFZ`oLGaYe8~lDc%)uO
Mmg{?bz-DGZu5*ph}HSu)>1H`se z$DQfGEsYl4JmUi}gbi$6*ER6RKMwonSMm1+(Xp1jxq8GPSKHMfJOuixV4ng&BDxB; z#teZv@eq>&d?kXJ%SE~gq}p_#p(RS_K)(+%rNajytvkz3B=x-f9*>XDg7ednjI^|f z)MLM-q5p;pAg{UI9u5ru<6fyG)IoHwQolpZR)&@R?wq@jmW!zyEdNfXb{rJLiTIFj zR~LB}Ti 6F*_O#X0y4{Vk9i`*SXWbc)djagQ<1gp%F;cj~J}B zX+cCY9U3=xR66?T%4FoNo|xo(6R^4a>HW)(OUYE~ja}O}GPd}wHsY{~vP))-&Yoy$ z)WXujUuhwnahtzlE#JXT-={)dWq=6|;4`e@;~9v2#mU)P(oh5YsSiIqwE2wtcXcTY zuq-&X=jqxsz?Zlk2sx-c@jVe^?Go9Ki=XQGW?n~JMuo}zCa+D<*E_6Nv@N3|f9? TH}ywGhkjE7R3y;j|)@zPb(gCksRKFaRZ<8(8~Vg&Ntf zp70Pf7ThuJ;{DUSgNMV7ScQTF#8Bz?DAr)?)vrA#na+LnqQoc5hTp?_-3)hR*WYTw zA`gRJiW$q?&8H)#7deF*$^H&J31eu9A1daY-l*oE)W>+(54)<`7(a({AnsLg+${5y z3^sV%o@~ZtEYxFyY-L*x13_Q5>b2Nf<|#FI`>)P_y>hoCBO`T>DEA*u;m i&%?ZG%(N`i7ejdb=!ek4I)i(e0>iE-BFw?7n&-3q89HJ!YA zQ{tfZ%Te=G@`IcS%P%2%FjlcUn}N?}=Yo9%8UB_5E9)m0I^6rh!l2d7d^7`@{*3e3 zk?GTD&nKKWU$0NaOsk^aZY6-{Yb^WwDcCGWC{n*qmA?&3u}cjIP_lcjSMBs$lc=an zltUL6V4t_B%E3Vh>Jx?*K|#T)lvPcYCNhTJNEDC@{To-IFfED%Xc@)2v2crhc>#rd z87h*m(n)JTpZ(lO^~2qq{Nia)Qj6R2Gsn0RRKTdAtU`w >2-|Di**Fy)+2eSD$1lpS@;t`d_Z4kgRAM*kB6P;B1pbu@ z^hii30+FOqfBSM?rEir}?4=7R83ov1kP)O%UjDhB30ywU_!izVN~{!o-)24+X>Gs+ zJS?6dig_YGK6B@OsOBI}Ijyr{Nh=8Cur|4}0a&tYw Y>#o_Zfv-9Lh*YsX^=7>cdidDP6%g#B_U95%d zsS0+T;pw*i8uB%30Vug2n=3I6GuSD*1j(n)3gpWNvQ50(frA!3R~w)D(jjGddwjl2 zf$+AQ&(xi7`~CbPv-wZuw{14feNjp;^&9SXB&7p_OUI!OH=NQ%jg6 reu z$*^$S4A}1tx*nao0U45$T1b+of<*V6bP*Ew(Rs%QpA9lH>nSrShYgMm?0k0;loh=; zb8)^PNTt37k0`$TRCfF6vn1H*B hrJcW$|#7FLw_o01*sq@M;z8fuV )iW~m?VV?;ndEn${qdcD?R5H& z+QBo*(ua?6Qr+)vDa+tn!T99#e4R56mz*STIP{3(zOo1ORVIQEY=*_+yu&DgQ2l3( zvL;29S-&ZqTv77iQeEI_Zgf(qsfBg{Jy>yNRw0n@H$4xD!BhJ6td6nmQ6?jifALHZ zTQN(O#a#Gbtds=Ah%9Ng|0Y2%M3gK{AS>V+2>7x`YCL|+vbM+w03e4Mjz+_Uc)(Zw zkVn{IS8x3K*XBA2aX0?*U;JTLch5d0x=u 7@wdlNO>>gPIA zOZ*RPek1Y%D%w7|(H~q!5XiQJeE _IWJ{wpiu<9_+h-|Iodivi1> z)v6&%Zk=RU|3gE;8TrA)x5gp%Lhq%Iz}ZDe*Wndjy#brm!B=I&M_FY}`tCd5^?k>y z-q878rrxkXg&qQp7c fszF-4DN&$Ym{Z-xr?*gD^8kWEj#q|dr62YTz5FLivL z|KAW)Vq>f`iGtT7?(nwn+Ag7n=B)$atI!p-jmjUr_nQ0+yu2DNuu|FFkr7J^i}o6f ziz&B~Oh<%l2J1^i-T0fBy1+p67MGzbtGDs{a@a-)W9?(VEDedaXn*XV25 DmEK}K;V{DChyDuL ezx`wZ3Hp$wSC zQL>_7JW0Z}_4!9fo;CP5)Qdhm$L&b}Q{xGCaD1eII#tG52>3mcA|N`b>169{VPh5^ zxyJ>*dLB18Qrd&|q|E=)XKy#*c^j)$1yN+lJyn_i?5tLIHz12gynOqd;vZosOC7!p zdkDi`{f>eG(x=P(4o+@*lzgIinnZoO3l*K7F%);2KEwqM1*95HIW{G^#%25~3CSz> zJdu3&DS^Y|H9$6iS|YXBK4yV|m_=#aX~vxB#yc$DRTqE$xx4mwX5P1RtIGO@lM6T8 zPd_^7u>fOAl=TYh`dgyN$12KwS~(v}iAVexioo(knVlJb6Z(q!?pG&61UJ&}t@FW? zeim6>n9%YAjr%bJ{|bk8KQKhZDTE)8NU&$wCyv`?4_3DSWl?|Cc5G~%%De`x>&85I zE*7Kz|AMd8kN8^VJ7 |B&MYe+imF^82qK(r%&Br z4$w+IKR>S^k~-GrWE38(I195!a{GH0E6Ii@`0N#RMIW^!LX;Q@r1352bcA4WguNb} zB|fjn4kJ8`!E?=W%G}1}t<%@Vpr{03I3h;8kp5Gf{1EsjV_@Jub$7ke&SD11Kf9G# zuF9Z>FY`3BclBQ$^(Q{i4qWY81HY3e0&los>pS!5{l&6M6ane^MgHmr!3;ekFIMH4 z5Op1_zim(=F|RV~DgTNP4w-^m9HO%GX@mXs(jiZx3P1H~>)`j4ZN=fIEp7XB#tgpo zdi=z?Gu}bK8oKNe5KykKe$=@3c6Zy^C(KPIf>y51V~e{|pPD*$SsPYN7`4qk5T9t^ zFY?gP(9Aj`PEN(j!3Q%JpPw%M3O=a>Xqfv2h6EsG tlkrFe54){aRA`eAa&yN5ZnZqs}HZlOk_u33bXlo8t z+yqps+;N=v?2UVhK3|YM%5%P+syV^LDwYDEMW?L>Ba$wAU~bM9!|c0gzXrELHtAiz z+Dru1-a^)Ue1fQm?v+Np*==u^Hp%CZf`C_vZ|1!p_GfGpp?&-?d<@@(ADSc(% sb8{Fr#<)T%3gqaS=nP*;U}J|S0{e Vk==5lMfzM<$njGaPQ_WqL7^~nW! z#^0?agxz_VQ_P(n{*Ck+!=Kr1w?9d1-rWh0Fy6<1bWVx*?Rsr&sF0$9Z~`Mb;cpvD zg|%Nvyo;iZ80t+&0X019q1ozthha^Qv*9EW+R^3Wwqh|iVU(wo5*Qxd5px~h@l@+! zu)1NdS6gd#ldO~Xm8J)2*8cuR6~c6LbJGnom5=}-xGd`i@b71^oI-}dkFZ{r1@Vpq zqoZZR=gqx|{Eo=>r_y-mOv=&h {_{>_ncy(0RuF8zo%DD zukMqn FEwv6e+H)>Ompg}y= Ut1T^j2zeIt4tkfu^qd)KRnu zrkX}Q3IZlR4@nd#-dkz4GQq^H9|_!e(BN7W1*q8#tl^5Qk|o?`nK09Ovsu<{v>|#C zkPGH^{4@k%$e~X05%sr$%DD(BWU9~3bg4OFM&gbzwSK0{RBfOBbse0{f5x!3yk0l} zurn%Xmh7sCY8Yn7!-Ug(qj_rOziH4gX8|Y%aX#0A>AH=$&^9QM^^7;BuNdJIJNS3n z=TH1v5Mp9Hdauj)*Kofeq`iVq9m)gXm2NGDqLOoB S!6qq(k6=Ad-jZ_kkB^`fWUaLH%crv_{W z0gVCGXPR$LP0n5dZq{_;w)u(FD}=OSx3o-A UvYr(vHJfu>`cB48_&HpZw86s8%&dAbPi;K4N-|O)K zXFo<0u>2H{dp!12WzmuNm!qH8(~tooExYKg!t(`Yw}p)!1L#>?Hy)Y=9>Cdh=N*RF zNmPA!os3=gt1-sjZph?vi>lwJ0fiTPC?yQrE&CS*@zI;em 0s< LA_>hw47%meTa956OvN_*TfBw4371RBqGH<$YG zpSb$mnE$M4a-*qZUw9{mAe4j|IscUeuW2`QGcEr7 5`5Kthrv5W~eY<6#2<$@K1A`NK&t~)14vW zoN)W0w>qkiE*-HP2rZ)x!BZJF>y$v%wOSxdq0aGWqfyH8ZhMzY&*}@PzRwwX-!t+L z*0~a((bvL0l9!LS!oSc?{NzEc96om?x<(&h){~BYBIv)#!bRhci8o0iflS(Q${@sw zx8pp6*8R@oA%Y6qKNS@EKQWi&L{Yy*zJ9H6u4o2TI3`e)2=~o3O$_4hRR|R}fY*Rp z7Bl|D?~W}-&Q|3&j~-T*x=-md`U10bX;kkI>X%$2CxgE@hsgejk0WP|8RmbvlZpV& z=UL(SqG#R2RfB9VeK%37|4}@t0~j*?RXmdcJ7jxy;CAD>*%+1T)%^MSKkBH{XcbH^ z6sLTz_P2CEPg}kzAtD0lUWh$aXWT`Rht{4lG~NCq51tHtX}Ki}L j znAT`EPjBsv^N)Si!1%6c6Ym$(V8Uk5lK50mZQ0U8FP>eux1UG?;8nOU&VS))9X$68 z{U$S3ymKr2+g->hZn!3bu0Dvu-90evm$HVJ(?z3=ufgl|=?PW%!nxs}R;#iZf$yj5 zE+;_=*7`m_9C~_P` taguQw{83EgLc+tt3!MN$0%*g?InB~N_F2ot z=szI+`TO^s@=Zqz;1O6>wnT%}1^Sc#O%+I1b+@ag`Q6s-r9xx> U{cE)59P8~@A}dW%#QK9O>{mqf zzD;RVZCLBWfoEpzTo&=&{?p=-aSEgqdu%MNfhAo`$;veaPhX$g?K&AwYbj@7Tus6u z2F4bJJFo+)Iw4hQm+?^4VKKG8B_&m|<3(w;Q6<~W!SjLlDl4YmfJQ!+4O`qUThvK@ zqK1x-26CRIHh54O;w#!uc;&SWL-9QzCwKT+bo`K4RP=IJRH_g*C1z_ngYwn=u8!O7 z*6+b$tp1|2xoQ3M+}8B;pgdpZ;vA!RDpbVt+6d;hRl6?YxjE&+_z$3x2x~Bu|L+Q` zm1wn&` Glx^Wy~!VJlF=AJ^JcDs58{<-Q#qr1CI%{44E#K(N)FWG?> z^}-92g&&{dBKJnpgn }veBhsUoj|s9 z`yiZ^mxs>E${OR+?s@S>9Y)YE4+w#8nzv+hD@|lLMSShsX4M0=W%$oJ zmF=uL8u@R<7!Nk{$Z!**S(;&Litgt$HhQn6E=fUr97$_Lns|pU!r|{2Z1|{RVq!)Y z7sI!=%?wh1GRV>k3MNHxk^@eMS0 Em zq6tSruX1~~OqBID;(RP2J1YxILs!VSe&J_yG$?ieHD@e1HbuvXhw^9QE?MXOy$8ss zOGih?2>3vJd|-S$8A$xg7sjgUYGWSC59j9w8F23oQW4f*ifg95y*;j!;X{!d9oB5* z27shVM6YvKlH|8o$-{a&i%T5?BK0@{22U_E{_u0=Rz71&^RCf545SKhn|ZpE5yiXF zaA!nfLoJsHb1i$B60RU`x$0R)a`KPoGalQ#s1K(@@suB^BnFko1N{&v!x$jYSx&aE zPJMgri)M&!8c1igEmDHg+FF8lwG5W|djPX}De`aIRj^8ACo462jEKyfVZ*v?Sx=`& zY=<9)r#~<6-HbWsOJ6|yr4>6B9~c<;xrCa=XG{6|HF^%a56${QUUh8JKwSL)Gg9|N z$3e1>(LP_fqmq8(1c9pV-*)z%on~x!`|G~HYaEtSxY-#br7(UIYke^t#B6?E{Ry70 zoHiIvv1SK#snuq@*tM$e^yyz>{!DGTqYsrohyc1gvEy|K0rrKqV$2|BwdSeP{S>oH z$lHOV2@u6Q=jUsxhST6F{$Vb?Wi%9DitOMeb(%H)r&Ft;VvReBz4-)P<|CrPui!l7 zhKK_hJu!qvO`2e6IbzFu+4Px>$oX3)yo?}QL%U91&6QPGQCj5PewMzx41%mq(U>&l zCoH7bR~72iKNzHzpX8jMJ8f=)NUvl2U(?D4EQx?QhurjDD*;CV<(?<3+949_pJr9E zha1AKR?M77j)wXv7GJ^Nzfl*URJa#!8GC~~L{xsfZ5}j?WL X~IN{Tm)Yq`nB#SD1KOP>+Qa+4@f$64J#?@f31As zu5|3z@gHVJ>(L*5*kR(&tYMw9eiMr;?qF@WsH0Od07C3DcAP 4b@ zo6G;fezrow^=8SH8w=~qqSPMa{`5%ySQMOIT1*SG{;r=`SEc6R^fecnV6qYOw7~~n zTym-p%wAm}vjz$-`t{y~F*=voq}vsSL^t8|Zo`e*Ol!!r?(j`KqI2E0Nt<7PtCFO< z>Hz1He?x6?&XHY8G(Ti9Xn-6~7O W*61PZ{G)YE*R FEWUQgYY)EvdU(6X!Sp8lckEc`z z*!@n$!WoaSHtn`h?XisYe0f|dzPNkM{uzV^QNrRUkgg{KM`Nikp0MsIVf$l<8?aLc zl#R~gjGNXQR=XI?iJ`d&?Og=aYQzi1NDcFpvZ5SN{>fx*Ke_-%oJH|}1K)NX{c%U> zo=KJu7^=+RH^TL~HRinH^qY_8z};9pxi^X^ac(=um65jg)v>3d+k?;eR4wJu{naH_ zvxKQ$BbGf+4rr6V8kS?;d!DqOTqMyiiGe2To$0^r+B;nS87jJM_1U#oT{&+uv|LzN zAR;Hv7tmLVXbIU75)@`qW$D;%IxypIY&^!}mRDfEg N+CpR4I z@rEvk-CgXw0f8HJ)t(?~dUq{uGO0sM`BKh?I3fM>WEt4c7(X{2H)-R7AZXnyHIrZq z32DMpy&G$;U;@*A5n}&;Ls2Ec81I0HjXlQyEkJcwdY9|-*?JEx!?(6bgm6mc)=V7? z*mV#KVLmZ?q_+3+@+LuWq|D-CoZ;bNV<@9KGCQPhYi1rYuZo0=0?=HZn_c{(C1?%w zZ$8*w5{;`{8wmA{jgQY0(D(NCp7p|Nl^80wy{o-mSs0awCNu+T^zps}J!5BAswrnm z{ZFj~=>H}BbNRdP7v?*g|4luk`QU$le_wGJw=MZ^5p=kpuaMG*(=yk5r%%MLR35DN zApB>nzK?|WE|R)XU?WF1DsVW35C~fYs8iHSpkzATG@#_utEQ$!Xz`p4- g zF3TB|{+&B?a(7dwbbDJf<6th#J5h1)igfL=SLwq@GOvPco3FmUe#M;4q2brBZ-j(} z0Z|SssH+2t6NG4U5^&nYgt0=p)<$m!rX&u|t&f1(n@Ijz)tZc?i%^L9w5*5U9L{ar zNI5?A_4J%wqr@uc>FKr8{g{Sh5s2PqGMSLQ%s>ppwh??I&z|1-Pa~ph$!0SMzOHwN zs9ML=is_nUD8Xx)#>EgoT*oxrlUN(sf~QF(ng4%9oye8qva)wT8|BO$5%33%gP`?$ z6-7l YqDpTl(l2zZ?|IyV=Rm`E|b4D=jiUixnlh`IZR8*AZ`%S-3wWmu>8y=RKtO*yYl zLdJa*8zNuc&;(?pdQ3e9?d)
_6ouqdV>P;@$4Zj+M$U@#src3jDH>0&y(8o2389P47G(6x#Qi?h}ifL zolRNeHl@u%9p22=PI0=c)-{q&=_jLmXHa|MhYbchLVA)4l??nhHSP$hwTr0BbBr*c zaMKm|LkVV)((L1wdT?%JmfI8rTBx(_;+@gU@qim^qvQg+b`+wHW#7k#6ieH{XX}^2 zFz`qNiT9J~7tDbpqV3n$E|Aw{g@tFYXs+mVEcAW$#i|}|_(Wa(nRF!_Ws?CkbaU)~ zKJX%P&Zd_W0?Qsucm8>7XkEhr^l}dFNu_Q6!{Mfj7{8GUcfHht7Y8t8weJqjKO%k} z0Z-0LUwe+1m~L|e`YPpEVf;UU13233b0vTK@k9w5t(9(z$vWpOdy|^aX0`0;=4jC^ z1%yC^yK0vdXhl!GUGHrTU7PUqL`dT|1Z&UJuRRy*Sr4b%*~o#Rt8*QG1aJGLWn|X2 zG!3rr+(mEO{lf8uTF&b=cg 1Y07JZ VXo sCU}hkP4|dk(!)7-5_IPkh=hxtEZ`kWovsyV^#NVspc1Jz!eI#fGA} zIkSP*-H#d0QPT@rQ_yPTPR7Thu ^Izqy#+V`aBN#VgqyFZ54 zBsa#eceA8y;uelZDTpJ#&5x>JIJ>y4&bqEV=aUa|0~Ox0917@%955ROJvQC_PGe ` z!11vE!=JP_3GQdV$x)t2e7$)w Mv}~(oXGh!K({r=Jt3IDSG3&3$YIwHe)dK4r(yIPsu(C(2kTLq$ z#w7P0MXzR4^LBczmGMx8OI+ooMZ;ebObpkx-?Gz;N3FincNzIkZFNQ+>E9}O;l|`R z3w&{<|3KG+ZAy+Z3#9UO6*2U@1x4?6iD6%l#H5M@yTAO8IChJ7xp9W-An1!k$C7Dp z5z9Z%v?q-Gv-{J~r9S*^!0AH*xg5Qe@|2ZL8NX!8A!^jzUSI9VV6={KG6t>_2(6-` z1R}lblgTM5CFTq4_^$k_9mFl 7%P^T+JGe5CJZ7iocjBl0kNshons#lcg%<|{s?iO=1Cr#W8igT#YgrqKBP zdAHep?Hne(*FJq6qxkMcliqD%D-JG21L%dc%ySL8fJ+PFYv$i;Ro_ugN4p3@;$=#R z(_s$(#wHd#+1q0FYR-;+AMwq2^P%{g6A+O#E*tixhuO^*ng83Ydd8Dj!DmUKnFNn@ zoAv&A+TZ$`oJ#D0L@0rnqc@;uD4q* _m6(fHzr6APfA%L*M)5R*rE9~~z{h>o`} z#H)$)Iab}Qg(L0U=&YB2`9x;%z46g8+E^O#a6tkY9l^}C{` e S(UogPpJgb+B|1tBG&d`!6~z^HhHqvu ztr~oV@wd&KZ(@28H(>~k3zy@4u*C1B0C{rX0v2Cm(C%t@XlIl@eyZstgS@@3L3z-G zvFzKfXI-DA{kpJZUDNSFLc7tQM>l-C0)VK3?8-u!GtZ9~ifJ#`oQUAQnjGwsW8=SC z9PDp_P*7lb1V*v|n+}45gY?%^4nM%R&A{~>H)OeK&`1LtPPzA&53p6WMerBC !pQHR=sjYyot2F-2VI{D -RH1v8M! z8ijJ_*z3G5OF>|QjP52zj5>dlo3^(j6};7F9TJP>#nlF4AFGPw!~2`55zMy)27Aa% z29AQ^3w3MAy5y-jvTMYCPp6obJ8bp~E!p&HG8Yi2?-6>DNhJb^ryoZiNQw&{!#%bm zfO`r*fdfS#%GF|nd Yb&y z%-De1;SbOco^Ax_-F;_IKGik4hLYki8^8E#ZK$n9)RMX6-5ydtzXIo9@{HCO-FxX( zt>G0p=GtfFaHe|ZgKgKu?JDw0;ZN`_O|fk+KY_9-E%=*vJN<0}Mn3mLYz}vgeaxm> zyM}$qIC~<*H|Z{4_;l;s{6m9-XbB(H%i@<~I_ISOoDf`sw_ak8CIvJK7DtC)3@|Oa zP2kNwOisu(?4cjR?f3ymbLji?)TZrV*@L`G_VaTQ2AZoYyxT$;bIaNG$`@!o{3L_u z$SLb;h?DDLzu2*Jmca)2z@uf09D)0}B@q7wdJ3YU9uXV4fHd3Gt03BT>ocRECLfH} zoZL$s(2rBR`GxT|C-5-b%AHp81V4U7FE76jTB+@jV*^9{Ki6S-)zoDP$1O}oAfv7g zD-(l8ZbOsX^~N!9d*R0)0b<7@3M2@Q+6cf4j_OLvOSdFAy7P3%uEO%Yq1 Xag&{tL|5V0kgB>_2 zrh0Qefj`)H&rFGzM>)0B!@Z>trm{v8d(kGZO&60Wz1&YhPmpq7yvQsqL`zx$2Yn18 z$P!^hyUyuz_#lC#$HDxUx~iShwwH>|XII0^A6`tnPPDWbzFDT6_i%vNPeu33M|6J% z!W vE^Zfu%Ip~|tUoE0V0#mb$=JTpxHn47$jIr*%R?6~8vMhP8FB}qBz%Ey z%q#9xAFZ09-pQ0_OM4RqigKNe%FJzU7fO1w^#nde_LuiwYH+ZRJqj_eRgK-{m}%mR zHH0sI;`pqu4alP4Vn{3t2+Y{DS?+{uDe&2Mm #6%ND0@x&+qw=O znA(&cYb(fgE3r7Kt;z2l4J^d=;!5@;efqGFV!b>``p3zhc42-Q$=vI0)pU7Zz)ot8 z@Yz&CLDk%;yF6VB^qg(dWk33LJ;lO4r85>fP2MhE0Y>yRM9d|%FaSlUCXxmxWjHVl zdeaqhtsFJb9}3HO8}c#*j|{_45hO%oR8lBmV^d-UZ#=!v NgMn*$Gh{K;a6yRc zg#?T)K@Y*OARIlZ8r0_E`X-0d7xB7XS~uSc{;SG)EVgK8K;|(r_zsM} zHc*0cX(zus=H>3`p)-Vs $nB`mNdS}8cOJ}9)fJzn@mU^CW za-W*Ov=ejC(yMu2(l$79q>Ji1F}2*I_Wlm*cwTSBI&;Rv?dXu9bBEK!Que`_7qpVo zZjyS$EAF&D?aqO*UtHuHjwDcDM(L3sHa9k3Hl%ZgWhM&d2d!4SBjiM0TjBaFXq9&* zSxt5`XN&ORJBHtV(aI60NJ4?+TZZR8koclEx;nSOuU)`@db Leq5#Qnop zd>o7;pt|B4g=5&`UdkS9Wi5-RS71(|_w(m>gtK$Is0*9(iZ_P7BCZv`H@0394ml{t zAc`aZrj1Y#(Dky{DXOXhvw=VNMTZ&B^mxUYu4DFS7Cn!14PEYo!ryjvfR(<`lt7`G zdE-Z2O@=~E*~!&A460IBJ7q_X+Y$gYWpi(-T2 zR9qiga~NJW4M&c#56@0MB-zO+%Gd;vdh0H587&GN?pJ-EtHo(j;6MU-X=~u1_ 8`=@?v&2AmWLT^_8T7y z=Z&5Xe-TU_<`plV!fsv)jAaJ*oDymG57HumC^|vl-PlM-Mq#MDoo(RK=icw#FBV7j zv*fL<{i;i8GVlhw+a*xWpbPdrBG<~P;Ep>MXdUhjU=(w6v*wP)!v}()`S1@l>_vIt zCB_7nYtDd*cv731YtG)|2U0EQH6^HB3Hs7uqAfJ@xP=-Q@mp4T0|4eeI?$Mdi9&GX zIVPuwlg@Zl2~!1OAyZ{}UX|YWt bY=7^2n~jkH-WD z{cG5Vt(&iLITiwF%&i>5a9G~UOSrUpMox@;K<9b)^mM2(sUIRrhl12nd4JNdvy70~ z7%B$^y>eLZeh)iNE Xv(eU}Xw96b}LgnEj I<`SU;fqQ)wG9<$=V@%SSi7PQUi2d$hE1&1E3j^@ZNs*;T9Fp|5uw zxiN+62(FVZ3tSQuC@5SS=nOgiy%Hy3yR5nH1>2taMSosU$fv@`<6ZClo-m;F^NcNP zIxH&4CW1PuilIVo4EITu++u(7Bs(>&L)K!jMz(|4M~Rk|Bt;xBcb9_B70*jqHEOi@ z`5?3_BPs0P7YtwWnL+OAQ*)THC$Qj{%t#0{bO6{LzhN_QsecWdRb?33af(#8br1f% zpU% 0V!RF-uox(n?2q|(7veU@LD=${%sKvTlb5DMd_ag zO!LDTK|A*=DSL;FV!4ecUzbq`r8gL7IEOXvl)?qwfz%B4JkC7Qj@9mOii~ 4ynWgTmhtqe*Sj;km77qno)Dm6TVSTwb=XiZZ(dg 4#u9CvAxp;m)OmTVjU%W0q? zpfF2#nSb$ye5bhe%A|}hU=Xi2E$2&7L&NLV=eTx6NfgQ=g;uzgFeZ_Xed0^WMpisQ zof1-;>+-H{fJC`ojqmkM?q!5l-7Hx;0yigW)sisVgrUc(I_Qz?9SU4RjjWse@_@8h z uv7 zwgaYg5A7${pe)(f(jsV38rsZnj9b_$8-1E*=2;%tS-l9C^U~QHxJuKM0R|>Md;TzL z+h_gQ9}prdwS>2cwSaW$E0^NUFQWl`jpeIq{9?lgo_C`apw4ra50?32a!2skA|Ncl zV*JG}TR7&x7cw)g;V^!04e*ax2iRG;D+vjz3AhBO2l>Q#!K|R``AWUfoKWxK)wUze zM?6h(eh0Ax?|Zw=nbTezQ^Gt#wUH(+5PseBEBV6#>Rzx+k7i5PozWR9PCD&_!-Kb( z%BF?*gNL7m{p=kbArOeh_zMd-$CQJ8Rpo^01^brUM}-Ij9YeCp{EliZZZ0S{-8?_a zTi#Z7og|p;yR+R@I{^%+_T|E)%l4?721T>dSs$@2oRx+@<&d(d%egT+ijz?_b1Wh| zXw|(SmHp|pW5G}`+)4Ec=CXMfuTEum!xhn0yK! zn-~0M_ zUsVIlz0PwcZTIJGe@?AbCL;ger}l4%NUDKcg~Oh(L256U%j3T^X2$RND`kfd$jE~k zt25io7YIQap?i0iADNg8VRXkph9p0-@)h#3d8&nc>kf>N?^}t@u3$why*z4%M?{9h zYrwv7UvgP9gs|iEql=||`$#|*zvSi5s#m#IXlOUWZF02y<=|XO_qvUYij9X0=4I$@ zK`~W>SXWea8TC!&Mpia}MV6G51Vm1fMLDL5E+1aZ&D>af`nM4?k*~9Et`%tVl@kND z!0BN7pm8v#X?&Sm^}+bjkNn?Dp?TUpBL&mmMDJ+muREbv3O~Vb3i_L5$4^%h9Q>KZ zvV|A?YzQYSz7k(mlrmHQ9>8Y5!YQvBvsO~yw1lz_VO)2uAs ;^EdV>c3br;5B~x?l}pJ15Ylb@a=bIfy=g|TMpEGCPxS@?wI*M8J1&P`v@T#-9w;B+fd5O zDb6t_cGTFj9A)#unkR~t6}@_Z&Z>H@AsUOXL-+i#^&~vf18ioDG&52`9~o#b&Re#h zJ^iDrF-8fv=n(p9k8ic4R|?R9uE`HuU<$_lN=ZELij^9)5j&6kjXRnq8=F^!r|g5f zH#EbCUz#SW*U17R7Y&~Yd03wIK&1nyN#Am;RS80NGG#oen7Ljz$7m ^hfFWj zxB6BI!ke1ib$mZnduRvWNnV+0!$|!v%w%cmR=c6>3v$@Sng7>6@64KZJW|6iJ*4`C zrJ$~?Zh4!9Uhw09w4gf{$!p-D(%#5I1w3O&cE)E0iu@xeKsgrdRs4R((!l{z(<|ek zD#bsWTmGU|T>x5)e?3XseoXR{ZZibhn#m&jV4_wr(`m!2GD{~$0wSUHb&GH>Mxs_m zEum=Pxx#K22c5j(?gi=fWB;D_h$_X*0glOj4f4qS=DT0%O^%>%o;Cj2%0%{T9an7~ zM@(-Svay6+h=^1*HguIu=SSO`5_>V25?>gmt~7dhZrn=5%=7CGA}27U{jRMcNfAP% zqc7IwZOR@Pa!H!-JwLOcbq(4xBJ}0~=_n~fN4Ld#z3N(tAcNl#vBEFNL1z<| 3uT5v0)R0lXFmxY9wTobnU8buZ5|!}R$Kebs+Fic4_sQ{N*ucf+b1?y z6IvRO8Ll ?Z_R9c+(Vx*pLVw@bzx#4q zVZ>KcZ!~_JtZc7}Z{!D20IN{iI&RNplA6U8H}xj#qPOnU6oeukMhwK8bD7*2ED^)3 zc*p}XW(P`qe_NAoB5~#UM}10eSW9{fKFwOs*N7Fg$ptn(0#)&AFGl5!W|1yB>C@N5 zXl493WzH`sAQu!AEHef2SaM37=s_q442f9QxCdxpXo&Hc^A?b$@`^gWaepMqN|t~G z?H)d6^H>(4rwX>H;9`qG-|r%?WXiQ@$r$aN4_dWn_rfVVvNf5!I0~K1M0(*knk;w4 zDe2N$0t`ZZ wT6gWb*eR_O}anoC~*R9IN2AJeP>vrM;HDqex^KYKn;n$L_kM9XLFhpuO zlpdiTSX=XWwh$Nf^iD4WYN!r!> }th1rBSw^%r(4{`yptq#j?bGORa3M!=)zSv6%D6g9>i& z`xU%}X)2n|qs3pd0qep3OP9m7slNStw=f^>Dut1Y@bd6uYyHZ&&R|%uuv^p)nCkWM zRzH(={l0Hnv?VD=Gd< AGle(xd%2^c8ej? zcxeGEgX?>@)w#eQ*W)`GK(0G)LphK9x#nvV<*s%K9=?jsjg#!Km(25AAe1Td;mEZK zmg>+Vw_nUt>oL^SYQ9oa?pVS@b~`vhHP~k%T#=21^`>>0;g9@Cvzlhj2KL8}3_t0! zO4NN$Py-xBsa0#@Zugve+=VPxmGjhc0`%R_03sQyUqPqU zC493~Goy@QyUOs{opQY9^U0qz=RN#VG9>iesEPfFGiw+tryaa_7;wNf)z{bgF&X>_ z&Hq>}MCOj81Ib%~<+;FKI9Jzl2|*|&GKE$MVgn-SxXMN)&t 7^{gL~MeZhIsV@mSBd=8(aB zcReLbD4PmCkSlQcEbwJ Yzf22 A^3H@m~{8yKqQrm5H*CnrrupG}c*9PYSnZaWzlk8hS6t>pNmBg*Gg0R0CntRA=<> zDRVy1Y{K3mn|S4lnP`#TCF$Ivy)tjz*fs=`95-?$#eHgb0_6>}Gh8{0NxZVw_gq5d zhl57T_A`+b=JRjJbdF
5(EI<9ue!cO-F1+HZ*?W`ylPP$ARoKjytqf29v!sR*8F)_P`k%c3 zO0Dq4{O_-edU8Z0z6M09=B+|tHj-vP+l;9!S>Iq?nI @#X zl%k$}^QW&ruTs!}Z0KQzk_Z*sgW6ONDgPvMmmdMB0M0b<8%{Slr?E3OY^S2*-?04j z+JV)$8Wju47fKZDEUyP6I JYF5Be Gul@s1egnP$ From 1e2562ed0206c567273bfc86eccdd31d4abcfb57 Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 8 Feb 2020 18:59:00 -0500 Subject: [PATCH 029/224] Update organic.dm --- code/modules/cargo/packs/organic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/packs/organic.dm b/code/modules/cargo/packs/organic.dm index 7d28ceefef..79853e1aaf 100644 --- a/code/modules/cargo/packs/organic.dm +++ b/code/modules/cargo/packs/organic.dm @@ -214,7 +214,7 @@ /datum/supply_pack/organic/fakemeat name = "Meat Crate 'Synthetic'" - desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 9 slabs of meat product, 3 carb meat and 4 slabs of *carp*." + desc = "Run outta meat already? Keep the lizards content with this freezer filled with cruelty-free chemically compounded meat! Contains 9 slabs of meat product, 3 crab meat and 4 slabs of *carp*." cost = 1200 // Buying 3 food crates nets you 9 meat for 900 points, plus like, 6 bags of rice, flour, and egg boxes. This is 12 for 500, but you -only- get meat and carp. contains = list(/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, /obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, From d49a53e19388920e915784eb9ceeca8f9739daca Mon Sep 17 00:00:00 2001 From: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Date: Sat, 8 Feb 2020 22:17:58 -0500 Subject: [PATCH 030/224] Update costumes_toys.dm --- code/modules/cargo/packs/costumes_toys.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm index 4a64979502..c559e7925a 100644 --- a/code/modules/cargo/packs/costumes_toys.dm +++ b/code/modules/cargo/packs/costumes_toys.dm @@ -63,6 +63,7 @@ /obj/item/toy/cards/deck/syndicate, /obj/item/reagent_containers/food/drinks/bottle/absinthe, /obj/item/clothing/under/syndicate/tacticool, + /obj/item/clothing/under/syndicate/skirt, /obj/item/clothing/under/syndicate, /obj/item/suppressor, /obj/item/storage/fancy/cigarettes/cigpack_syndicate, From c5bbce09287955c200320b4d634f863f74e5adc7 Mon Sep 17 00:00:00 2001 From: Linzolle Date: Sun, 9 Feb 2020 18:36:36 -0600 Subject: [PATCH 031/224] add the BOW --- code/game/objects/items/storage/belt.dm | 15 +++++++++++++++ icons/mob/back.dmi | Bin 99516 -> 100372 bytes icons/mob/belt.dmi | Bin 19659 -> 19900 bytes icons/obj/clothing/belts.dmi | Bin 12732 -> 13099 bytes icons/obj/storage.dmi | Bin 72459 -> 71397 bytes tgstation.dme | 4 ++++ 6 files changed, 19 insertions(+) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 082cbe245d..1be9df5c30 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -612,6 +612,21 @@ /obj/item/ammo_casing )) +/obj/item/storage/belt/quiver + name = "leather quiver" + desc = "A quiver made from the hide of some animal. Used to hold arrows." + icon_state = "quiver" + item_state = "quiver" + +/obj/item/storage/belt/quiver/ComponentInitialize() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 15 + STR.display_numerical_stacking = TRUE + STR.can_hold = typecacheof(list( + /obj/item/ammo_casing/caseless/arrow + )) + /obj/item/storage/belt/medolier name = "medolier" desc = "A medical bandolier for holding smartdarts." diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 26f81b70df8aea4933205e22b563896cc7a5df41..7a2882790336d8b3a09057cf678e82aad792afbf 100644 GIT binary patch delta 37154 zcmY(qbwE_n7B@PGNJ&YHfQWR7bayLANtbkkbRJM(kW`Q^0THCTyOHh~U eJ0%HLko{N>U2uaCaIL@WQsAdjO#f_3=qyW$s#Ki@nUfgVh( zWQTY)n|By})CHUSlONUNP6qgWbU9fuIj$_yEXY^camat9;%gCOT)vvJ3Dq_JB1O&+ z{4h$6miLi{`YFa|n=U4&9-cH~E^>ya6mgD~s Sk;vc(0X*7>TBz9C%G;w{*wL0KdaP4jN zv0Lg7D~qmjhgj;9B@RsU&`+Ygl^ne%{r#-bB@~HTf4|}R6IO{x4N&XF9;IH}yN!L( z8&us7|07A* bUd9eh3bS|FtMt*oU_Jbb(2o JN{i`b4?CW!cg$0dd*@!_l0FM2 zif*&_iKal^Zh3XEN0ichG|Qc*Jmjc0J%PL@1khy$IRk(ALsxK|aK}yULS-h{8b5v- z6zssA#3gh5O+3`6;4m#M+77;Ge=Ne7Pu{eRe!AVPGNa6moA48mM>6H$FZl(*fhklx z&;Ka^@n?0ErsU~EXavV*r590c@-@EHL`JO4RW{G=Llqh+J=TYlUrXHDtjWDn(JL_y zaOV-y&|Z>9e^OLl`3PU9TG=K#O|TFDqL2F6GJ7IoOtHEDwjPVx>#0M3!gi#$_vmG_ z dclhH(z`@ewiX5NLtjpUpf|k8!xS7_frcQd Lgr}RNteu zyJg3^c(ACd<%jmC!16WvUAjYvRHbAmVcb`Y2aFHD);v*c? S#lVo)riYv z?scThSWWt^Q&|`#kJa-%-`3-3>IW_}9S0-JH!YHY*iEfU+W~8!>Z-Xt+5BzGjE uU+w|jTn}+p>Ue@iG!wy^QBZd _)oO4#7*y7W6FY#v*^-zAIN|vc@$@r%Ag!;YVqE(+kNyb5W z8nj_Y@1qiSoQiTtZT8tk?2dNXz=cGzw@kE^;j!r&-l~V480t3AX58YY@ABdA@hFwv z%ZDDnM>w<4Q9Xrs(8`F{&p5;_Zdr?%yU2@BS!-KCw1G8RPkB3lC(SZ4^rS|$ip?`p z#AIxN2K)+J)I}bgr+x=5(0C@bW#rki-vP_=dsWq#>W>@BKa=A~O=@jeepwV7Harm$ z5{ih4%sq*j7ADt^JW}I)qwYVS!$AHEixT+nI@M(B&dPx%pv