Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit e8c09e2

Browse filesBrowse files
More cybernetic organs and additional organ functions (yogstation13#13089)
* someone fucking broke tails again thanks guys * adds "organ efficiency", a modifier for how strong an organ is in generic organ-related activities gives higher organ efficiency to several upgraded cybernetic organs, alongside with the generic organ-related activities it does stuff with adds ghetto craftable organs, currently just the lungs and heart, which have lower max health and organ efficiency adds cybernetic stomachs and ears redoes the sprite for the cybernetic heart and makes it actually beat switches the nanite heart to use the nanite organ icon * did not mean to remove that * Update organ_internal.dm * Update code/modules/surgery/organs/lungs.dm Co-authored-by: Hopekz <hopekxx@gmail.com> * Update code/modules/surgery/organs/heart.dm Co-authored-by: Hopekz <hopekxx@gmail.com> Co-authored-by: Hopekz <hopekxx@gmail.com>
1 parent b846d40 commit e8c09e2
Copy full SHA for e8c09e2

14 files changed

+163-33Lines changed: 163 additions & 33 deletions

File tree

Expand file treeCollapse file tree
Open diff view settings
Filter options
Expand file treeCollapse file tree
Open diff view settings
Collapse file

‎code/datums/components/crafting/recipes.dm‎

Copy file name to clipboardExpand all lines: code/datums/components/crafting/recipes.dm
+21-1Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,26 @@
426426
time = 10 SECONDS
427427
category = CAT_MISC
428428

429+
/datum/crafting_recipe/ghetto_heart
430+
name = "Makeshift Heart"
431+
result = /obj/item/organ/heart/ghetto
432+
reqs = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1,
433+
/obj/item/stack/cable_coil = 3,
434+
/obj/item/weaponcrafting/receiver = 1, //it recieves the blood
435+
/obj/item/reagent_containers/hypospray/medipen/pumpup = 1)
436+
tools = list(TOOL_WIRECUTTER, TOOL_WELDER)
437+
time = 15 SECONDS
438+
category = CAT_MISC
439+
440+
/datum/crafting_recipe/ghetto_lungs
441+
name = "Makeshift Lungs"
442+
result = /obj/item/organ/lungs/ghetto
443+
reqs = list(/obj/item/tank/internals/emergency_oxygen = 2,
444+
/obj/item/weaponcrafting/receiver = 1) //it recieves the oxygen
445+
tools = list(TOOL_WELDER)
446+
time = 15 SECONDS
447+
category = CAT_MISC
448+
429449
/datum/crafting_recipe/mousetrap
430450
name = "Mouse Trap"
431451
result = /obj/item/assembly/mousetrap
@@ -806,7 +826,7 @@
806826
result = /obj/item/reagent_containers/glass/bucket/wooden
807827
category = CAT_PRIMAL
808828

809-
/datum/crafting_recipe/cleanleather
829+
/datum/crafting_recipe/cleanleather
810830
name = "Clean Leather"
811831
result = /obj/item/stack/sheet/wetleather
812832
reqs = list(/obj/item/stack/sheet/hairlesshide = 1, /datum/reagent/water = 20)
Collapse file

‎code/modules/mob/living/blood.dm‎

Copy file name to clipboardExpand all lines: code/modules/mob/living/blood.dm
+4-1Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
//Blood regeneration if there is some space
3434
if(blood_volume < BLOOD_VOLUME_NORMAL(src) && !HAS_TRAIT(src, TRAIT_NOHUNGER))
35+
var/obj/item/organ/heart = getorganslot(ORGAN_SLOT_HEART)
36+
var/heart_ratio = heart ? heart.get_organ_efficiency() : 0.5 //slower blood regeneration without a heart, or with a broken one </3
3537
var/nutrition_ratio = 0
3638
switch(nutrition)
3739
if(0 to NUTRITION_LEVEL_STARVING)
@@ -46,8 +48,9 @@
4648
nutrition_ratio = 1
4749
if(satiety > 80)
4850
nutrition_ratio *= 1.25
51+
nutrition_ratio *= heart_ratio
4952
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
50-
blood_volume = min(BLOOD_VOLUME_NORMAL(src), blood_volume + 0.5 * nutrition_ratio)
53+
blood_volume = min(BLOOD_VOLUME_NORMAL(src), blood_volume + 0.5 * nutrition_ratio * heart_ratio)
5154

5255
//Effects of bloodloss
5356
var/word = pick("dizzy","woozy","faint")
Collapse file

‎code/modules/mob/living/carbon/life.dm‎

Copy file name to clipboardExpand all lines: code/modules/mob/living/carbon/life.dm
+3-7Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,12 @@
5454
/mob/living/carbon/handle_breathing(times_fired)
5555
var/next_breath = 4
5656
var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS)
57-
var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART)
5857
if(L)
59-
if(L.damage > L.high_threshold)
60-
next_breath--
61-
if(H)
62-
if(H.damage > H.high_threshold)
63-
next_breath--
58+
if(L.damage)
59+
next_breath *= L.get_organ_efficiency()
6460

6561
if((times_fired % next_breath) == 0 || failed_last_breath)
66-
breathe() //Breathe per 4 ticks if healthy, down to 2 if our lungs or heart are damaged, unless suffocating
62+
breathe() //Breathe per 4 ticks if healthy, down to 1 based on lung damage, unless suffocating
6763
if(failed_last_breath)
6864
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation)
6965
else
Collapse file

‎code/modules/research/designs/medical_designs.dm‎

Copy file name to clipboardExpand all lines: code/modules/research/designs/medical_designs.dm
+33Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,39 @@
543543
category = list("Cybernetics", "Medical Designs")
544544
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
545545

546+
/datum/design/cybernetic_ears
547+
name = "Cybernetic Ears"
548+
desc = "A pair of cybernetic ears"
549+
id = "cybernetic_ears"
550+
build_type = PROTOLATHE | MECHFAB
551+
construction_time = 40
552+
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
553+
build_path = /obj/item/organ/ears/cybernetic
554+
category = list("Cybernetics", "Medical Designs")
555+
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
556+
557+
/datum/design/cybernetic_stomach
558+
name = "Cybernetic stomach"
559+
desc = "A cybernetic stomach"
560+
id = "cybernetic_stomach"
561+
build_type = PROTOLATHE | MECHFAB
562+
construction_time = 40
563+
materials = list(/datum/material/iron = 500, /datum/material/glass = 500)
564+
build_path = /obj/item/organ/stomach/cybernetic
565+
category = list("Cybernetics", "Medical Designs")
566+
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
567+
568+
/datum/design/cybernetic_stomach_u
569+
name = "Cybernetic Ears"
570+
desc = "An upgraded cybernetic stomach"
571+
id = "cybernetic_stomach_u"
572+
build_type = PROTOLATHE | MECHFAB
573+
construction_time = 50
574+
materials = list(/datum/material/iron = 500, /datum/material/glass = 500, /datum/material/silver = 500, /datum/material/gold=200)
575+
build_path = /obj/item/organ/stomach/cybernetic/upgraded
576+
category = list("Cybernetics", "Medical Designs")
577+
departmental_flags = DEPARTMENTAL_FLAG_MEDICAL
578+
546579
/datum/design/cybernetic_appendix
547580
name = "Cybernetic Appendix"
548581
desc = "A replacement for those who lost a part of themselfs."
Collapse file

‎code/modules/research/techweb/all_nodes.dm‎

Copy file name to clipboardExpand all lines: code/modules/research/techweb/all_nodes.dm
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@
521521
display_name = "Cybernetic Organs"
522522
description = "We have the technology to rebuild him."
523523
prereq_ids = list("adv_biotech")
524-
design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_appendix")
524+
design_ids = list("cybernetic_heart", "cybernetic_liver", "cybernetic_lungs", "cybernetic_stomach", "cybernetic_ears", "cybernetic_appendix")
525525
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000)
526526
export_price = 5000
527527

@@ -530,7 +530,7 @@
530530
display_name = "Upgraded Cybernetic Organs"
531531
description = "We have the technology to upgrade him."
532532
prereq_ids = list("cyber_organs")
533-
design_ids = list("cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u")
533+
design_ids = list("cybernetic_heart_u", "cybernetic_liver_u", "cybernetic_lungs_u", "cybernetic_stomach_u")
534534
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1500)
535535
export_price = 5000
536536

Collapse file

‎code/modules/surgery/organs/ears.dm‎

Copy file name to clipboardExpand all lines: code/modules/surgery/organs/ears.dm
+9-1Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
else if(!(organ_flags & ORGAN_FAILING)) // if this organ is failing, do not clear deaf stacks.
4040
deaf = max(deaf - 1, 0)
4141
if(prob(damage / 20) && (damage > low_threshold))
42-
adjustEarDamage(0, 4)
42+
adjustEarDamage(0, 2)
4343
SEND_SOUND(C, sound('sound/weapons/flash_ring.ogg'))
4444
to_chat(C, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment."))
4545
else if((organ_flags & ORGAN_FAILING) && (deaf == 0))
@@ -110,6 +110,14 @@
110110
H.dna.species.mutant_bodyparts -= "ears"
111111
H.update_body()
112112

113+
/obj/item/organ/ears/cybernetic
114+
name = "cybernetic hearing apparatus"
115+
desc = "A set of complex electronics that can mimic the functions of an ear. Slightly more resistant to damage."
116+
icon_state = "ears-c"
117+
damage_multiplier = 0.8
118+
status = ORGAN_ROBOTIC
119+
organ_flags = ORGAN_SYNTHETIC
120+
113121
/obj/item/organ/ears/penguin
114122
name = "penguin ears"
115123
desc = "The source of a penguin's happy feet."
Collapse file

‎code/modules/surgery/organs/heart.dm‎

Copy file name to clipboardExpand all lines: code/modules/surgery/organs/heart.dm
+18-4Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
var/failed = FALSE //to prevent constantly running failing code
2121
var/operated = FALSE //whether the heart's been operated on to fix some of its damages
2222

23+
/obj/item/organ/heart/Initialize()
24+
. = ..()
25+
icon_base = icon_state
26+
update_icon()
27+
2328
/obj/item/organ/heart/update_icon()
2429
if(beating)
2530
icon_state = "[icon_base]-on"
@@ -46,12 +51,12 @@
4651
/obj/item/organ/heart/proc/Stop()
4752
beating = 0
4853
update_icon()
49-
return 1
54+
return TRUE
5055

5156
/obj/item/organ/heart/proc/Restart()
5257
beating = 1
5358
update_icon()
54-
return 1
59+
return TRUE
5560

5661
/obj/item/organ/heart/prepare_eat()
5762
var/obj/S = ..()
@@ -175,6 +180,14 @@
175180
priority = 100 //it's an indicator you're dying, so it's very high priority
176181
colour = "red"
177182

183+
/obj/item/organ/heart/ghetto
184+
name = "so called 'maintenance heart'"
185+
desc = "A haphazardly constructed device that can supposedly pump blood. Used by the desperate or insane."
186+
icon_state = "heart-g"
187+
maxHealth = 0.5 * STANDARD_ORGAN_THRESHOLD
188+
organ_efficiency = 0.5
189+
organ_flags = ORGAN_SYNTHETIC
190+
178191
/obj/item/organ/heart/cybernetic
179192
name = "cybernetic heart"
180193
desc = "An electronic device designed to mimic the functions of an organic human heart."
@@ -189,8 +202,9 @@
189202

190203
/obj/item/organ/heart/cybernetic/upgraded
191204
name = "upgraded cybernetic heart"
192-
desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma, regenerates after use."
205+
desc = "An electronic device designed to mimic the functions of an organic human heart. Fitted with a blood synthesizer, it also holds an emergency epinephrine synthesizer that supplies a dosage if the body is critically damaged."
193206
icon_state = "heart-c-u"
207+
organ_efficiency = 1.5
194208
var/dose_available = TRUE
195209
var/rid = /datum/reagent/medicine/epinephrine
196210
var/ramount = 10
@@ -207,7 +221,7 @@
207221

208222
/obj/item/organ/heart/cybernetic/upgraded/emp_act()
209223
. = ..()
210-
addtimer(CALLBACK(src, .proc/Restart), 80) //Can restart itself after an EMP so it isnt an insta death
224+
addtimer(CALLBACK(src, .proc/Restart), 8 SECONDS) //Can restart itself after an EMP so it isnt an insta death
211225

212226
/obj/item/organ/heart/freedom
213227
name = "heart of freedom"
Collapse file

‎code/modules/surgery/organs/lungs.dm‎

Copy file name to clipboardExpand all lines: code/modules/surgery/organs/lungs.dm
+34-14Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
return FALSE
9393

9494
var/gas_breathed = 0
95+
var/eff = get_organ_efficiency()
9596

9697
//Partial pressures in our breath
9798
var/O2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/oxygen))
@@ -121,7 +122,7 @@
121122
else
122123
H.failed_last_breath = FALSE
123124
if(H.health >= H.crit_threshold)
124-
H.adjustOxyLoss(-5)
125+
H.adjustOxyLoss(-5 * eff)
125126
gas_breathed = breath.get_moles(/datum/gas/oxygen)
126127
H.clear_alert("not_enough_oxy")
127128

@@ -149,7 +150,7 @@
149150
else
150151
H.failed_last_breath = FALSE
151152
if(H.health >= H.crit_threshold)
152-
H.adjustOxyLoss(-5)
153+
H.adjustOxyLoss(-5 * eff)
153154
gas_breathed = breath.get_moles(/datum/gas/nitrogen)
154155
H.clear_alert("nitro")
155156

@@ -186,7 +187,7 @@
186187
else
187188
H.failed_last_breath = FALSE
188189
if(H.health >= H.crit_threshold)
189-
H.adjustOxyLoss(-5)
190+
H.adjustOxyLoss(-5 * organ_efficiency)
190191
gas_breathed = breath.get_moles(/datum/gas/carbon_dioxide)
191192
H.clear_alert("not_enough_co2")
192193

@@ -216,7 +217,7 @@
216217
else
217218
H.failed_last_breath = FALSE
218219
if(H.health >= H.crit_threshold)
219-
H.adjustOxyLoss(-5)
220+
H.adjustOxyLoss(-5 * eff)
220221
gas_breathed = breath.get_moles(/datum/gas/plasma)
221222
H.clear_alert("not_enough_tox")
222223

@@ -281,7 +282,7 @@
281282
H.adjustFireLoss(nitryl_pp/4)
282283
gas_breathed = breath.get_moles(/datum/gas/nitryl)
283284
if (gas_breathed > gas_stimulation_min)
284-
H.reagents.add_reagent(/datum/reagent/nitryl,1)
285+
H.reagents.add_reagent(/datum/reagent/nitryl,1*eff)
285286

286287
breath.adjust_moles(/datum/gas/nitryl, -gas_breathed)
287288

@@ -299,7 +300,7 @@
299300
H.adjustFireLoss(freon_pp/4)
300301
gas_breathed = breath.get_moles(/datum/gas/freon)
301302
if (gas_breathed > gas_stimulation_min)
302-
H.reagents.add_reagent(/datum/reagent/freon,1)
303+
H.reagents.add_reagent(/datum/reagent/freon,1*eff)
303304

304305
breath.adjust_moles(/datum/gas/freon, -gas_breathed)
305306

@@ -309,7 +310,7 @@
309310
if(healium_pp > SA_sleep_min)
310311
var/existing = H.reagents.get_reagent_amount(/datum/reagent/healium)
311312
ADD_TRAIT(H, TRAIT_SURGERY_PREPARED, "healium")
312-
H.reagents.add_reagent(/datum/reagent/healium,max(0, 1 - existing))
313+
H.reagents.add_reagent(/datum/reagent/healium,max(0, 1*eff - existing))
313314
H.adjustFireLoss(-7)
314315
H.adjustToxLoss(-5)
315316
H.adjustBruteLoss(-5)
@@ -350,7 +351,7 @@
350351
gas_breathed = breath.get_moles(/datum/gas/stimulum)
351352
if (gas_breathed > gas_stimulation_min)
352353
var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum)
353-
H.reagents.add_reagent(/datum/reagent/stimulum,max(0, 1 - existing))
354+
H.reagents.add_reagent(/datum/reagent/stimulum,max(0, 1*eff - existing))
354355
breath.adjust_moles(/datum/gas/stimulum, -gas_breathed)
355356

356357
// Miasma
@@ -460,6 +461,18 @@
460461
failed = FALSE
461462
return
462463

464+
/obj/item/organ/lungs/attackby(obj/item/W, mob/user, params)
465+
if(!(organ_flags & ORGAN_SYNTHETIC) && organ_efficiency == 1 && W.tool_behaviour == TOOL_CROWBAR)
466+
user.visible_message(span_notice("[user] extends [src] with [W]!"), span_notice("You use [W] to extend [src]!"), "You hear something stretching.")
467+
name = "extended [name]"
468+
icon_state += "-crobar" //shh! don't tell anyone i handed you this card
469+
safe_oxygen_min *= 2 //SCREAM LOUDER i dont know maybe eventually
470+
safe_toxins_min *= 2
471+
safe_nitro_min *= 2 //BREATHE HARDER
472+
safe_co2_min *= 2
473+
organ_efficiency = 2 //HOLD YOUR BREATH FOR REALLY LONG
474+
maxHealth *= 0.5 //This procedure is not legal but i will do it for you
475+
463476
/obj/item/organ/lungs/prepare_eat()
464477
var/obj/S = ..()
465478
S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5)
@@ -487,11 +500,10 @@
487500

488501
/obj/item/organ/lungs/xeno/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) //handling this externally so I don't have to nerf pluoxium, can't handle it internally without removing perpetual pluox or requiring plasma for breathing
489502
. = ..()
490-
if(!breath.total_moles())
491-
return .
492-
var/breath_amt = breath.get_moles(/datum/gas/plasma)
493-
breath.adjust_moles(/datum/gas/plasma, -breath_amt)
494-
breath.adjust_moles(/datum/gas/oxygen, breath_amt)
503+
if(breath)
504+
var/breath_amt = breath.get_moles(/datum/gas/plasma)
505+
breath.adjust_moles(/datum/gas/plasma, -breath_amt)
506+
breath.adjust_moles(/datum/gas/oxygen, breath_amt)
495507

496508
/obj/item/organ/lungs/slime
497509
name = "vacuole"
@@ -505,6 +517,13 @@
505517
var/plasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma))
506518
owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you.
507519

520+
/obj/item/organ/lungs/ghetto
521+
name = "oxygen tanks welded to a modular reciever"
522+
desc = "A pair of oxygen tanks which have been attached to a modular (oxygen) receiver. They are incapable of supplying air, but can work as a replacement for lungs."
523+
icon_state = "lungs_g"
524+
organ_efficiency = 0.5
525+
organ_flags = ORGAN_SYNTHETIC //the moment i understood the weakness of flesh, it disgusted me, and i yearned for the certainty, of steel
526+
508527
/obj/item/organ/lungs/cybernetic
509528
name = "cybernetic lungs"
510529
desc = "A cybernetic version of the lungs found in traditional humanoid entities. Slightly more effecient than organic lungs."
@@ -521,9 +540,10 @@
521540

522541
/obj/item/organ/lungs/cybernetic/upgraded
523542
name = "upgraded cybernetic lungs"
524-
desc = "A more advanced version of the stock cybernetic lungs, for use in hazardous environments. Features higher temperature tolerances and the ability to filter out most potentially harmful gases."
543+
desc = "A more advanced version of the stock cybernetic lungs, more efficient at, well, breathing. Features higher temperature tolerances and the ability to filter out most potentially harmful gases."
525544
icon_state = "lungs-c-u"
526545
maxHealth = 2 * STANDARD_ORGAN_THRESHOLD
546+
organ_efficiency = 1.5
527547
safe_oxygen_min = 10
528548
safe_co2_max = 20
529549
safe_toxins_max = 20 //Higher resistance to most harmful gasses
Collapse file

‎code/modules/surgery/organs/organ_internal.dm‎

Copy file name to clipboardExpand all lines: code/modules/surgery/organs/organ_internal.dm
+8-2Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
// DO NOT add slots with matching names to different zones - it will break internal_organs_slot list!
1111
var/organ_flags = 0
1212
var/maxHealth = STANDARD_ORGAN_THRESHOLD
13-
var/damage = 0 //total damage this organ has sustained
13+
///total damage this organ has sustained
14+
var/damage = 0
15+
///how functional this organ is, higher numbers = stronger lower = garbage, scales multiplicitively with health (50% health = *50% efficiency)
16+
var/organ_efficiency = 1
1417
///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick
1518
var/healing_factor = 0 //fraction of maxhealth healed per on_life(), set to 0 for generic organs
1619
var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs
@@ -102,7 +105,6 @@
102105
damage = max(0, damage - ((maxHealth * healing_factor) * (C.satiety / MAX_SATIETY) * 4))
103106
check_damage_thresholds(C)
104107
prev_damage = damage
105-
return
106108

107109
/** check_damage_thresholds
108110
* input: M (a mob, the owner of the organ we call the proc on)
@@ -191,6 +193,10 @@
191193
/obj/item/organ/item_action_slot_check(slot,mob/user)
192194
return //so we don't grant the organ's action to mobs who pick up the organ.
193195

196+
///returns an organ's efficiency, a percent value (rounded to the 10s) based on its damage and organ_efficiency
197+
/obj/item/organ/proc/get_organ_efficiency()
198+
return damage < low_threshold ? organ_efficiency : round(organ_efficiency * (damage/maxHealth), 0.1)
199+
194200
///Adjusts an organ's damage by the amount "d", up to a maximum amount, which is by default max damage
195201
/obj/item/organ/proc/applyOrganDamage(var/d, var/maximum = maxHealth) //use for damaging effects
196202
if(maximum < d + damage)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.