From edb552c480ea2dc69f35f6f8c779e99c5a5ec4b1 Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Sat, 23 Jan 2016 22:26:12 +0000 Subject: [PATCH 01/26] Makes the surgery computer useful Adds nanoUI to it, and makes the surgery computer announce the patient's health and beep when it degrades past certain thresholds. Also lets you customize those tresholds and mute them individually if you want to. This is my first PR and I did it more so I could get familiar with byond and git, please tell if something's wrong --- code/game/machinery/computer/Operating.dm | 193 ++++++++++++++---- ...atacolada-pr-usefulishsurgerycomputers.yml | 37 ++++ nano/templates/op_computer.tmpl | 171 ++++++++++++++++ 3 files changed, 360 insertions(+), 41 deletions(-) create mode 100644 html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml create mode 100644 nano/templates/op_computer.tmpl diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index f3e6de46321..7620059b64c 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -7,10 +7,16 @@ icon_keyboard = "med_key" icon_screen = "crew" circuit = /obj/item/weapon/circuitboard/operating - var/mob/living/carbon/human/victim = null var/obj/machinery/optable/table = null - + var/mob/living/carbon/human/victim = null light_color = LIGHT_COLOR_PURE_BLUE + var/verbose = 1 //general speaker toggle + var/patientName = null + var/oxyAlarm = 30 //oxy damage at which the computer will beep + var/choice = 0 //just for going into and out of the options menu + var/healthAnnounce = 1 //healther announcer toggle + var/crit = 1 //crit beeping toggle + /obj/machinery/computer/operating/New() ..() @@ -24,7 +30,7 @@ add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) return - interact(user) + ui_interact(user) /obj/machinery/computer/operating/attack_hand(mob/user) @@ -36,45 +42,116 @@ add_fingerprint(user) - interact(user) + ui_interact(user) + + +///obj/machinery/computer/operating/interact(mob/user) +// if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) ) +// if (!istype(user, /mob/living/silicon)) +// user.unset_machine() +// user << browse(null, "window=op") +// return +// +// user.set_machine(src) +// var/dat = "Operating Computer\n" +// dat += "Close

" //| Update" +// if(src.table && (src.table.check_victim())) +// src.victim = src.table.victim +// dat += {" +//Patient Information:
+//
+//Name: [src.victim.real_name]
+//Age: [src.victim.age]
+//Blood Type: [src.victim.b_type]
+//
+//Health: [src.victim.health]
+//Brute Damage: [src.victim.getBruteLoss()]
+//Toxins Damage: [src.victim.getToxLoss()]
+//Fire Damage: [src.victim.getFireLoss()]
+//Suffocation Damage: [src.victim.getOxyLoss()]
+//Patient Status: [src.victim.stat ? "Non-Responsive" : "Awake"]
+//Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
+//"} +// else +// src.victim = null +// dat += {" +//Patient Information:
+//
+//No Patient Detected +//"} +// user << browse(dat, "window=op") +// onclose(user, "op") + +/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)//ui is mostly copy pasta from the sleeper ui + var/data[0] + var/mob/living/carbon/human/occupant = src.table.victim + data["hasOccupant"] = occupant ? 1 : 0 + var/occupantData[0] + + if (occupant) + occupantData["name"] = occupant.name + occupantData["stat"] = occupant.stat + occupantData["health"] = occupant.health + occupantData["maxHealth"] = occupant.maxHealth + occupantData["minHealth"] = config.health_threshold_dead + occupantData["bruteLoss"] = occupant.getBruteLoss() + occupantData["oxyLoss"] = occupant.getOxyLoss() + occupantData["toxLoss"] = occupant.getToxLoss() + occupantData["fireLoss"] = occupant.getFireLoss() + occupantData["paralysis"] = occupant.paralysis + occupantData["hasBlood"] = 0 + occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations + // Because we can put simple_animals in here, we need to do something tricky to get things working nice + occupantData["temperatureSuitability"] = 0 // 0 is the baseline + if (ishuman(occupant) && occupant.species) + var/datum/species/sp = occupant.species + if (occupant.bodytemperature < sp.cold_level_3) + occupantData["temperatureSuitability"] = -3 + else if (occupant.bodytemperature < sp.cold_level_2) + occupantData["temperatureSuitability"] = -2 + else if (occupant.bodytemperature < sp.cold_level_1) + occupantData["temperatureSuitability"] = -1 + else if (occupant.bodytemperature > sp.heat_level_3) + occupantData["temperatureSuitability"] = 3 + else if (occupant.bodytemperature > sp.heat_level_2) + occupantData["temperatureSuitability"] = 2 + else if (occupant.bodytemperature > sp.heat_level_1) + occupantData["temperatureSuitability"] = 1 + else if (istype(occupant, /mob/living/simple_animal)) + var/mob/living/simple_animal/silly = occupant + if (silly.bodytemperature < silly.minbodytemp) + occupantData["temperatureSuitability"] = -3 + else if (silly.bodytemperature > silly.maxbodytemp) + occupantData["temperatureSuitability"] = 3 + // Blast you, imperial measurement system + occupantData["btCelsius"] = occupant.bodytemperature - T0C + occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32 + + + if (ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) + occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) + occupantData["hasBlood"] = 1 + occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount("blood")) + occupantData["bloodMax"] = occupant.max_blood + occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount("blood")/occupant.max_blood), 0.01) //copy pasta ends here + + data["occupant"] = occupantData + data["verbose"]=verbose + data["oxyAlarm"]=oxyAlarm + data["choice"]=choice + data["health"]=healthAnnounce + data["crit"]=crit + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 655) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) -/obj/machinery/computer/operating/interact(mob/user) - if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=op") - return - user.set_machine(src) - var/dat = "Operating Computer\n" - dat += "Close

" //| Update" - if(src.table && (src.table.check_victim())) - src.victim = src.table.victim - dat += {" -Patient Information:
-
-Name: [src.victim.real_name]
-Age: [src.victim.age]
-Blood Type: [src.victim.b_type]
-
-Health: [src.victim.health]
-Brute Damage: [src.victim.getBruteLoss()]
-Toxins Damage: [src.victim.getToxLoss()]
-Fire Damage: [src.victim.getFireLoss()]
-Suffocation Damage: [src.victim.getOxyLoss()]
-Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
-Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
-"} - else - src.victim = null - dat += {" -Patient Information:
-
-No Patient Detected -"} - user << browse(dat, "window=op") - onclose(user, "op") /obj/machinery/computer/operating/Topic(href, href_list) @@ -82,9 +159,43 @@ return 1 if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) + + if(href_list["verboseOn"]) + verbose=1 + if(href_list["verboseOff"]) + verbose=0 + if(href_list["healthOn"]) + healthAnnounce=1 + if(href_list["healthOff"]) + healthAnnounce=0 + if(href_list["critOn"]) + crit=1 + if(href_list["critOff"]) + crit=0 + if(href_list["oxy_adj"]!=0) + oxyAlarm=oxyAlarm+text2num(href_list["oxy_adj"]) + if(href_list["choiceOn"]) + choice=1 + if(href_list["choiceOff"]) + choice=0 return /obj/machinery/computer/operating/process() - if(..()) - src.updateDialog() + + if(src.table && src.table.check_victim()) + if(verbose) + if(patientName!=src.table.victim.name) + patientName=src.table.victim.name + atom_say("New patient detected, loading stats") + src.victim = src.table.victim + sleep(10) + atom_say("[src.victim.real_name], [src.victim.b_type] blood, [src.victim.stat ? "Non-Responsive" : "Awake"]") + atom_say("[round(src.victim.health)]") + if(src.victim.health <= -50 && crit) + playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0) + if(src.victim.getOxyLoss()>oxyAlarm) + playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0) + if(healthAnnounce) + atom_say("[round(src.victim.health)]") + sleep(60) \ No newline at end of file diff --git a/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml b/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml new file mode 100644 index 00000000000..70246bcf1fd --- /dev/null +++ b/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. Remove the quotation mark and put in your name when copy+pasting the example changelog. +author: "pinatacolada" + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds NanoUI to the operating computer" + - rscadd: "Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off" + diff --git a/nano/templates/op_computer.tmpl b/nano/templates/op_computer.tmpl new file mode 100644 index 00000000000..252c8f5fd75 --- /dev/null +++ b/nano/templates/op_computer.tmpl @@ -0,0 +1,171 @@ + +

Patient Monitor

+ +
+ {{if data.choice==0}} + {{if !data.hasOccupant}} +
No Patient Detected
+ {{else}} +
+ {{:data.occupant.name}} =>  + {{if data.occupant.stat == 0}} + Conscious + {{else data.occupant.stat == 1}} + Unconscious + {{else}} + DEAD + {{/if}} +
+ +
+
Health:
+ {{if data.occupant.health >= data.occupant.maxHealth}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} + {{else data.occupant.health > 0}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'average')}} + {{else data.occupant.health >= data.minhealth}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}} + {{else}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'bad alignRight')}} + {{/if}} +
{{:helper.round(data.occupant.health)}}
+
+ +
+
Brute Damage:
+ {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.bruteLoss)}}
+
+ +
+
Resp. Damage:
+ {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.oxyLoss)}}
+
+ +
+
Toxin Damage:
+ {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.toxLoss)}}
+
+ +
+
Burn Severity:
+ {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}} +
{{:helper.round(data.occupant.fireLoss)}}
+
+ +
+
Patient Temperature:
+ {{if data.occupant.temperatureSuitability == -3}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == -2}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == -1}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 0}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'good')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 1}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 2}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 3}} + {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}} +
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{/if}} +
+ {{if data.occupant.hasBlood}} +
+
+
Blood Level:
+ {{if data.occupant.bloodPercent <= 60}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'bad')}} +
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
+ {{else data.occupant.bloodPercent <= 90}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'average')}} +
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
+ {{else}} + {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'good')}} +
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl +
+ {{/if}} +
+
+
Pulse:
{{:data.occupant.pulse}} bpm
+
+ {{/if}} + +
+
+ {{/if}} +
+
+ {{:helper.link('Options', 'gear', {'choiceOn' : 1})}} +
+
+ {{else}} +
+
+ Loudspeaker: +
+
+ {{:helper.link('On', 'power-off', {'verboseOn' : 1}, data.verbose ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'verboseOff' : 1}, data.verbose ? null : 'selected')}} +
+
+ +
+
+ Health Announcer: +
+
+ {{:helper.link('On', 'power-off', {'healthOn' : 1}, data.health ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'healthOff' : 1}, data.health ? null : 'selected')}} +
+
+ +
+
+ Critical Alert: +
+
+ {{:helper.link('On', 'power-off', {'critOn' : 1}, data.crit ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'critOff' : 1}, data.crit ? null : 'selected')}} +
+
+ +
+
+
Oxygen Alert Threshold:
+ {{:helper.link('-', null, {'oxy_adj' : -100}, (data.oxyAlarm >= 100) ? null : 'disabled')}} + {{:helper.link('-', null, {'oxy_adj' : -10}, (data.oxyAlarm >= 10) ? null : 'disabled')}} + {{:helper.link('-', null, {'oxy_adj' : -1}, (data.oxyAlarm >= 0) ? null : 'disabled')}} + {{:helper.displayBar( data.oxyAlarm, 0, 200, 'good')}} + {{:helper.link('+', null, {'oxy_adj' : 1}, (data.oxyAlarm < 200) ? null : 'disabled')}} + {{:helper.link('+', null, {'oxy_adj' : 10}, (data.oxyAlarm <= 190) ? null : 'disabled')}} + {{:helper.link('+', null, {'oxy_adj' : 100}, (data.oxyAlarm <= 100) ? null : 'disabled')}} +
 {{: data.oxyAlarm }}  
+
+
+ +
+
+ {{:helper.link('Return', 'arrow-left', {'choiceOff' : 1})}} +
+
+ {{/if}} +
\ No newline at end of file From feacb84b3a482be8ff44089eff3299c0116d7219 Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Sun, 24 Jan 2016 14:19:21 +0000 Subject: [PATCH 02/26] updated to reflect what Fox pointed out also added a thing to show the blood type on the UI that I left out as an oversight --- code/game/machinery/computer/Operating.dm | 34 ++++++++++++----------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 7620059b64c..1c45a8b404c 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -1,4 +1,5 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 +#define OP_COMPUTER_COOLDOWN 60 /obj/machinery/computer/operating name = "operating computer" @@ -16,7 +17,7 @@ var/choice = 0 //just for going into and out of the options menu var/healthAnnounce = 1 //healther announcer toggle var/crit = 1 //crit beeping toggle - + var/nextTick = OP_COMPUTER_COOLDOWN /obj/machinery/computer/operating/New() ..() @@ -128,7 +129,6 @@ occupantData["btCelsius"] = occupant.bodytemperature - T0C occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32 - if (ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD)) occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL) occupantData["hasBlood"] = 1 @@ -136,6 +136,8 @@ occupantData["bloodMax"] = occupant.max_blood occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount("blood")/occupant.max_blood), 0.01) //copy pasta ends here + occupantData["bloodType"]=occupant.b_type + data["occupant"] = occupantData data["verbose"]=verbose data["oxyAlarm"]=oxyAlarm @@ -143,6 +145,7 @@ data["health"]=healthAnnounce data["crit"]=crit + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 655) @@ -183,19 +186,18 @@ /obj/machinery/computer/operating/process() - if(src.table && src.table.check_victim()) + if(table && table.check_victim()) if(verbose) - if(patientName!=src.table.victim.name) - patientName=src.table.victim.name + if(patientName!=table.victim.name) + patientName=table.victim.name atom_say("New patient detected, loading stats") - src.victim = src.table.victim - sleep(10) - atom_say("[src.victim.real_name], [src.victim.b_type] blood, [src.victim.stat ? "Non-Responsive" : "Awake"]") - atom_say("[round(src.victim.health)]") - if(src.victim.health <= -50 && crit) - playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0) - if(src.victim.getOxyLoss()>oxyAlarm) - playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0) - if(healthAnnounce) - atom_say("[round(src.victim.health)]") - sleep(60) \ No newline at end of file + victim = table.victim + atom_say("[victim.real_name], [victim.b_type] blood, [victim.stat ? "Non-Responsive" : "Awake"]") + if(nextTick < world.time) + nextTick=world.time + OP_COMPUTER_COOLDOWN + if(victim.health <= -50 && crit) + playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0) + if(src.victim.getOxyLoss()>oxyAlarm) + playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0) + if(healthAnnounce) + atom_say("[round(victim.health)]") From 6349e3118f6725a918e2c08a0db34dd168a4b43b Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Sun, 24 Jan 2016 14:20:53 +0000 Subject: [PATCH 03/26] updated to add blood type to the UI --- nano/templates/op_computer.tmpl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nano/templates/op_computer.tmpl b/nano/templates/op_computer.tmpl index 252c8f5fd75..e34ccd8d85a 100644 --- a/nano/templates/op_computer.tmpl +++ b/nano/templates/op_computer.tmpl @@ -102,6 +102,9 @@ Used In File(s): \code\game\machinery\computer\Operating.dm
{{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl
+
+
Blood Type:
{{:data.occupant.bloodType}}
+
{{/if}}
@@ -168,4 +171,4 @@ Used In File(s): \code\game\machinery\computer\Operating.dm
{{/if}} - \ No newline at end of file + From 2c7fb828ec38e3aa1f323bc5b7855fc99b74381b Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Wed, 27 Jan 2016 17:49:19 +0000 Subject: [PATCH 04/26] Adds a threshold for the health announcer also fixes a minor bug where blood type wouldn't show if the patient had less than 60%, and made it a bit more organized overall --- nano/templates/op_computer.tmpl | 54 +++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/nano/templates/op_computer.tmpl b/nano/templates/op_computer.tmpl index e34ccd8d85a..027fdf3443b 100644 --- a/nano/templates/op_computer.tmpl +++ b/nano/templates/op_computer.tmpl @@ -102,10 +102,10 @@ Used In File(s): \code\game\machinery\computer\Operating.dm
{{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl
+ {{/if}}
Blood Type:
{{:data.occupant.bloodType}}
- {{/if}}
Pulse:
{{:data.occupant.pulse}} bpm
@@ -130,7 +130,7 @@ Used In File(s): \code\game\machinery\computer\Operating.dm {{:helper.link('Off', 'close', {'verboseOff' : 1}, data.verbose ? null : 'selected')}}
- +
Health Announcer: @@ -142,15 +142,39 @@ Used In File(s): \code\game\machinery\computer\Operating.dm
-
- Critical Alert: -
-
- {{:helper.link('On', 'power-off', {'critOn' : 1}, data.crit ? 'selected' : null)}} - {{:helper.link('Off', 'close', {'critOff' : 1}, data.crit ? null : 'selected')}} +
+
Health Announcer Threshold:
+ {{:helper.link('-', null, {'health_adj' : -100}, (data.healthAlarm >= 0) ? null : 'disabled')}} + {{:helper.link('-', null, {'health_adj' : -10}, (data.healthAlarm >= -90) ? null : 'disabled')}} + {{:helper.link('-', null, {'health_adj' : -1}, (data.healthAlarm > -100) ? null : 'disabled')}} + + {{if data.healthAlarm >= 100}} + {{:helper.displayBar(data.healthAlarm, 0, 100, 'good')}} + {{else data.healthAlarm > 0}} + {{:helper.displayBar(data.healthAlarm, 0, 100, 'average')}} + {{else data.healthAlarm >= -100}} + {{:helper.displayBar(data.healthAlarm, 0, -100, 'average alignRight')}} + {{else}} + {{:helper.displayBar(data.healthAlarm, 0, -100, 'bad alignRight')}} + {{/if}} + + {{:helper.link('+', null, {'health_adj' : 1}, (data.healthAlarm < 100) ? null : 'disabled')}} + {{:helper.link('+', null, {'health_adj' : 10}, (data.healthAlarm <= 90) ? null : 'disabled')}} + {{:helper.link('+', null, {'health_adj' : 100}, (data.healthAlarm <= 0) ? null : 'disabled')}} +
 {{: data.healthAlarm }}  
- +
+
+
+ Oxygen Alarm: +
+
+ {{:helper.link('On', 'power-off', {'oxyOn' : 1}, data.oxy ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'oxyOff' : 1}, data.oxy ? null : 'selected')}} +
+
+
Oxygen Alert Threshold:
@@ -164,7 +188,17 @@ Used In File(s): \code\game\machinery\computer\Operating.dm
 {{: data.oxyAlarm }}  
- +
+
+
+ Critical Alert: +
+
+ {{:helper.link('On', 'power-off', {'critOn' : 1}, data.crit ? 'selected' : null)}} + {{:helper.link('Off', 'close', {'critOff' : 1}, data.crit ? null : 'selected')}} +
+
+
{{:helper.link('Return', 'arrow-left', {'choiceOff' : 1})}} From 8d7011cd3831a834d8172982fae18da7f4fe16f9 Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Wed, 27 Jan 2016 17:49:57 +0000 Subject: [PATCH 05/26] Adds a threshold for the health announcer --- code/game/machinery/computer/Operating.dm | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 1c45a8b404c..5251898e7c7 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -18,6 +18,8 @@ var/healthAnnounce = 1 //healther announcer toggle var/crit = 1 //crit beeping toggle var/nextTick = OP_COMPUTER_COOLDOWN + var/healthAlarm = 50 + var/oxy = 1 //oxygen beeping toggle /obj/machinery/computer/operating/New() ..() @@ -144,11 +146,12 @@ data["choice"]=choice data["health"]=healthAnnounce data["crit"]=crit - + data["healthAlarm"]=healthAlarm + data["oxy"]=oxy ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 655) + ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 455) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -175,12 +178,18 @@ crit=1 if(href_list["critOff"]) crit=0 + if(href_list["oxyOn"]) + oxy=1 + if(href_list["oxyOff"]) + oxy=0 if(href_list["oxy_adj"]!=0) oxyAlarm=oxyAlarm+text2num(href_list["oxy_adj"]) if(href_list["choiceOn"]) choice=1 if(href_list["choiceOff"]) choice=0 + if(href_list["health_adj"]!=0) + healthAlarm=healthAlarm+text2num(href_list["health_adj"]) return @@ -195,9 +204,9 @@ atom_say("[victim.real_name], [victim.b_type] blood, [victim.stat ? "Non-Responsive" : "Awake"]") if(nextTick < world.time) nextTick=world.time + OP_COMPUTER_COOLDOWN - if(victim.health <= -50 && crit) + if(crit && victim.health <= -50 ) playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0) - if(src.victim.getOxyLoss()>oxyAlarm) + if(oxy && victim.getOxyLoss()>oxyAlarm) playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0) - if(healthAnnounce) + if(healthAnnounce && victim.health <= healthAlarm) atom_say("[round(victim.health)]") From 9072a7075dd24031c72bf338e60ec29fad462cd4 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Thu, 28 Jan 2016 20:17:00 -0800 Subject: [PATCH 06/26] Skrell's alcohol weakness is tracked on the liver --- .../reagents/oldchem/reagents/drink/reagents_alcohol.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm index ee5b8ac050a..e2892ee3b89 100644 --- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm +++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm @@ -36,7 +36,8 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly. + var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"] + if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara"))) d*=5 M.dizziness += dizzy_adj. From 98dfd5f90d39e801429e7aa3b92692c12c4efb2b Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Thu, 28 Jan 2016 23:40:37 -0500 Subject: [PATCH 07/26] Magic Eight Ball Adds in a new toy: Magic Eight Ball! - Discern your fate with the wondrous Magic Eight Ball! - Obtainable from Claw Game prize balls Adds in the mighty MAGIC CONCH SHELL. - Submit to the will of the all-knowing Magic Conch. - Admin-spawn only (too powerful) --- code/game/objects/items/toys.dm | 31 +++++++++++++++++++++++++++- code/modules/arcade/arcade_prize.dm | 2 +- icons/obj/toy.dmi | Bin 70519 -> 71006 bytes 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index ecdb2ac28ad..6a3493fc0ea 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -1753,4 +1753,33 @@ obj/item/toy/cards/deck/syndicate/black /obj/item/toy/figure/warden name = "Warden action figure" icon_state = "warden" - toysay = "Execute him for breaking in!" \ No newline at end of file + toysay = "Execute him for breaking in!" + +////////////////////////////////////////////////////// +// Magic 8-Ball / Conch // +////////////////////////////////////////////////////// + +/obj/item/toy/eight_ball + name = "Magic 8-Ball" + desc = "Mystical! Magical! Ages 8+!" + icon = 'icons/obj/toy.dmi' + icon_state = "eight-ball" + var/use_action = "shakes the ball" + var/cooldown = 0 + var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") + +/obj/item/toy/eight_ball/attack_self(mob/user as mob) + if(!cooldown) + var/answer = pick(possible_answers) + user.visible_message("[user] focuses on their question and [use_action]...") + user.visible_message("\icon[src] The [src] says \"[answer]\"") + spawn(30) + cooldown = 0 + return + +/obj/item/toy/eight_ball/conch + name = "Magic Conch Shell" + desc = "All hail the Magic Conch!" + icon_state = "conch" + use_action = "pulls the string" + possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.") \ No newline at end of file diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm index 30374d31a52..960ead4a0b6 100644 --- a/code/modules/arcade/arcade_prize.dm +++ b/code/modules/arcade/arcade_prize.dm @@ -17,7 +17,7 @@ playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10) icon_state = "prizeconfetti" src.color = pick(random_color_list) - var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure) //will add ticket bundles later + var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later spawn(10) user.unEquip(src) new prize_inside(user.loc) diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi index 39b795fdc04f3df4630cfaf4e800f2df9e56602d..6e6d268c9bda68cca254c7b2c2eda4f909834856 100644 GIT binary patch delta 10567 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 Date: Thu, 28 Jan 2016 23:48:00 -0800 Subject: [PATCH 08/26] Re-adds syndicate borg access to places --- code/modules/nano/interaction/default.dm | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm index ae999cbcf03..bd5ba3ee0c8 100644 --- a/code/modules/nano/interaction/default.dm +++ b/code/modules/nano/interaction/default.dm @@ -30,21 +30,6 @@ return STATUS_INTERACTIVE // interactive (green visibility) return STATUS_DISABLED // no updates, completely disabled (red visibility) -/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object) - . = ..() - if(. != STATUS_INTERACTIVE) - return - - if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level - return STATUS_INTERACTIVE - if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle - return STATUS_INTERACTIVE - if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery - var/obj/machinery/Machine = src_object - if(Machine.emagged) - return STATUS_INTERACTIVE - return STATUS_UPDATE - /mob/living/silicon/ai/default_can_use_topic(var/src_object) . = shared_nano_interaction() if(. != STATUS_INTERACTIVE) From 0ef973b37ef451226e6edbc6ab26145b69333cad Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Fri, 29 Jan 2016 10:51:07 -0800 Subject: [PATCH 09/26] People with squishy limbs can now squish --- code/modules/mob/living/carbon/human/emote.dm | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 132965764c4..93b57850974 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -32,9 +32,19 @@ else //Everyone else fails, skip the emote attempt return if("squish") + var/found_slime_bodypart = 0 + if(species.name == "Slime People") //Only Slime People can squish - on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm - else //Everyone else fails, skip the emote attempt + on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm' + found_slime_bodypart = 1 + else + for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too! + if(L.dna.species in list("Slime People")) + on_CD = handle_emote_CD() + found_slime_bodypart = 1 + break + + if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt return if("scream", "fart", "flip", "snap") on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm From 9ff52f91a891f9ea5bea77b7803209e889e9c44b Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 29 Jan 2016 22:54:07 -0500 Subject: [PATCH 10/26] Updates Summon Guns --- code/datums/spell.dm | 4 +- code/game/gamemodes/wizard/rightandwrong.dm | 66 ++++++++++++++------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index ec1c34fee60..236b7c8e9b1 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin caster.reset_view(0) return 0 - if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel + return 0 + if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages") return 0 if(!skipcharge) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index d0c6f059f26..b6052320615 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,15 +1,19 @@ /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg") - var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo") + var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam") + var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") + usr << "You summoned [summon_type ? "magic" : "guns"]!" message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!") + for(var/mob/living/carbon/human/H in player_list) - if(H.stat == 2 || !(H.client)) continue + if(H.stat == 2 || !(H.client)) + continue if(H.mind) - if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue + if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") + continue var/randomizeguns = pick(gunslist) var/randomizemagic = pick(magiclist) var/randomizemagicspecial = pick(magicspeciallist) @@ -25,43 +29,65 @@ new /obj/item/weapon/gun/projectile/revolver(get_turf(H)) if("detective") new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H)) - if("c20r") - new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) - if("nuclear") - new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("deagle") new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) if("gyrojet") new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H)) if("pulse") new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H)) - if("silenced") + if("suppressed") new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H)) new /obj/item/weapon/suppressor(get_turf(H)) - if("cannon") - new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) if("doublebarrel") new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H)) if("shotgun") - new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H)) + new /obj/item/weapon/gun/projectile/shotgun(get_turf(H)) if("combatshotgun") new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H)) - if("bulldog") - new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) if("arg") new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H)) if("mateba") new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H)) + if("boltaction") + new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("uzi") + new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H)) + if("cannon") + new /obj/item/weapon/gun/energy/lasercannon(get_turf(H)) + if("crossbow") + new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H)) + if("nuclear") + new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H)) if("sabr") new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H)) - if("crossbow") - new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H)) + if("bulldog") + new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) + if("c20r") + new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H)) if("saw") new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H)) if("car") new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H)) - if("boltaction") - new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H)) + if("turret") + new /obj/item/weapon/gun/energy/gun/turret(get_turf(H)) + if("pulsecarbine") + new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H)) + if("decloner") + new /obj/item/weapon/gun/energy/decloner(get_turf(H)) + if("mindflayer") + new /obj/item/weapon/gun/energy/mindflayer(get_turf(H)) + if("hyperkinetic") + new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H)) + if("advplasmacutter") + new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H)) + if("wormhole") + new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H)) + if("wt550") + new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H)) + if("grenadelauncher") + new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H)) + if("medibeam") + new /obj/item/weapon/gun/medbeam(get_turf(H)) else switch (randomizemagic) if("fireball") @@ -80,6 +106,8 @@ new /obj/item/weapon/spellbook/oneuse/horsemask(get_turf(H)) if("charge") new /obj/item/weapon/spellbook/oneuse/charge(get_turf(H)) + if("summonitem") + new /obj/item/weapon/spellbook/oneuse/summonitem(get_turf(H)) if("wandnothing") new /obj/item/weapon/gun/magic/wand(get_turf(H)) if("wanddeath") @@ -109,10 +137,8 @@ H.see_in_dark = 8 H.see_invisible = SEE_INVISIBLE_LEVEL_TWO H << "The walls suddenly disappear." - if("voodoo") new /obj/item/voodoo(get_turf(H)) - if("special") magiclist -= "special" //only one super OP item per summoning max switch (randomizemagicspecial) From bb15d5f133316efe06d2e43ec7cb482711d4d6b5 Mon Sep 17 00:00:00 2001 From: VampyrBytes Date: Sat, 30 Jan 2016 08:49:56 +0000 Subject: [PATCH 11/26] Fixes #3425 There were a couple of things going on... the spawn(-1) which should have meant that the door shut straight away was being negated by the sleeps. Also, If the door had just been used, it would still be marked as operating and so wouldn't shut --- code/game/machinery/doors/airlock.dm | 8 ++++---- code/modules/shuttle/shuttle.dm | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a211c7d0fda..83e1f3f723e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -882,8 +882,8 @@ About the new airlock wires panel: src.closeOther.close() return ..() -/obj/machinery/door/airlock/close(var/forced=0) - if(operating || welded || locked) +/obj/machinery/door/airlock/close(var/forced=0, var/override = 0) + if((operating & !override) || welded || locked) return if(!forced) //despite the name, this wire is for general door control. @@ -918,11 +918,11 @@ About the new airlock wires panel: operating = 1 do_animate("closing") src.layer = 3.1 - sleep(5) + if (!override) sleep(5) src.density = 1 if(!safe) crush() - sleep(5) + if(!override) sleep(5) update_icon() if(visible && !glass) set_opacity(1) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 1808e62ed11..260438fbed8 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -402,12 +402,14 @@ var/obj/machinery/door/Door = O spawn(-1) if(Door) - Door.close() if(istype(Door, /obj/machinery/door/airlock)) var/obj/machinery/door/airlock/A = Door + A.close(0,1) if(A.id_tag == "s_docking_airlock") A.lock() door_unlock_list += A + else + Door.close() else if (istype(AM,/mob)) var/mob/M = AM if(!M.move_on_shuttle) From 7027c217bf1db5e70e65c061af6ec62d53de6699 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sat, 30 Jan 2016 15:03:10 -0500 Subject: [PATCH 12/26] Some items has plasma typo in origin tech --- code/game/objects/items/stacks/sheets/glass.dm | 4 ++-- code/game/objects/items/weapons/tools.dm | 2 +- .../mob/living/simple_animal/hostile/retaliate/drone.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 17e35850d8c..d0477eead0d 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -271,7 +271,7 @@ singular_name = "glass sheet" icon_state = "sheet-plasmaglass" materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmabasic var/full_window = /obj/structure/window/full/plasmabasic @@ -360,7 +360,7 @@ singular_name = "reinforced plasma glass sheet" icon_state = "sheet-plasmarglass" materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2) - origin_tech = "materials=3;plasma=2" + origin_tech = "materials=3;plasmatech=2" var/created_window = /obj/structure/window/plasmareinforced var/full_window = /obj/structure/window/full/plasmareinforced diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index fa10ce2daf8..ac5897367f8 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -461,7 +461,7 @@ max_fuel = 40 w_class = 3.0 materials = list(MAT_METAL=70, MAT_GLASS=120) - origin_tech = "engineering=4;plasma=3" + origin_tech = "engineering=4;plasmatech=3" var/last_gen = 0 change_icons = 0 can_off_process = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index e91719c5915..6c4986541a6 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -258,7 +258,7 @@ if(spawnees & 128) C = new(src.loc) C.name = "Drone plasma overcharge counter" - C.origin_tech = "plasma=[rand(3,6)]" + C.origin_tech = "plasmatech=[rand(3,6)]" if(spawnees & 256) C = new(src.loc) From 6c61bff09edae24e0edcc15bb2bea60e5c5ac3b6 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sat, 30 Jan 2016 19:11:41 -0500 Subject: [PATCH 13/26] Automatic changelog generation for PR #3435 --- html/changelogs/AutoChangeLog-pr-3435.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3435.yml diff --git a/html/changelogs/AutoChangeLog-pr-3435.yml b/html/changelogs/AutoChangeLog-pr-3435.yml new file mode 100644 index 00000000000..beda6bf8456 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3435.yml @@ -0,0 +1,5 @@ +author: FalseIncarnate +delete-after: True +changes: + - rscadd: "Adds in the Magic Eight Ball toy, found in Claw Game prize orbs." + - rscadd: "Adds in the Magic Conch Shell, an admin-only shell of power." From ef79569075480917962b845c3ac3e19fd9033dc6 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sat, 30 Jan 2016 20:33:45 -0500 Subject: [PATCH 14/26] Fixed continuous rounds --- code/controllers/configuration.dm | 4 +-- code/datums/spells/lichdom.dm | 6 ++--- code/game/gamemodes/gameticker.dm | 26 ++++--------------- .../game/gamemodes/malfunction/malfunction.dm | 2 +- code/game/gamemodes/revolution/revolution.dm | 8 ++---- code/game/gamemodes/wizard/wizard.dm | 4 --- code/game/gamemodes/xenos/xenos.dm | 10 +------ 7 files changed, 14 insertions(+), 46 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 30b12c88e81..e65ced5c08c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -36,7 +36,7 @@ var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard var/traitor_scaling = 0 //if amount of traitors scales based on amount of players var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other - var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. var/Ticklag = 0.9 @@ -449,7 +449,7 @@ config.gateway_delay = text2num(value) if("continuous_rounds") - config.continous_rounds = 1 + config.continuous_rounds = 1 if("ghost_interaction") config.ghost_interaction = 1 diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm index 31c09813863..a115406548c 100644 --- a/code/datums/spells/lichdom.dm +++ b/code/datums/spells/lichdom.dm @@ -20,9 +20,9 @@ action_icon_state = "skeleton" /obj/effect/proc_holder/spell/targeted/lichdom/New() - if(!config.continous_rounds) + if(!config.continuous_rounds) existence_stops_round_end = 1 - config.continous_rounds = 1 + config.continuous_rounds = 1 ..() /obj/effect/proc_holder/spell/targeted/lichdom/Destroy() @@ -31,7 +31,7 @@ if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src) return ..() if(existence_stops_round_end) - config.continous_rounds = 0 + config.continuous_rounds = 0 return ..() /obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index bbdbea1c724..69403bc5d8e 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -7,7 +7,6 @@ var/round_start_time = 0 var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o var/datum/game_mode/mode = null - var/post_game = 0 var/event_time = null var/event = 0 @@ -386,16 +385,13 @@ var/round_start_time = 0 //emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER - var/game_finished = 0 - var/mode_finished = 0 - if (config.continous_rounds) - game_finished = (mode.station_was_nuked) - mode_finished = (!post_game && mode.check_finished()) + var/game_finished = shuttle_master.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked + if (config.continuous_rounds) + mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result else - game_finished = (mode.check_finished()) - mode_finished = game_finished + game_finished |= mode.check_finished() - if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game)) + if(!mode.explosion_in_progress && game_finished) current_state = GAME_STATE_FINISHED auto_toggle_ooc(1) // Turn it on spawn @@ -409,18 +405,6 @@ var/round_start_time = 0 else world.Reboot("Round ended.", "end_proper", "proper completion") - else if (mode_finished) - post_game = 1 - - mode.cleanup() - - //call a transfer shuttle vote - spawn(50) - if(!round_end_announced) // Spam Prevention. Now it should announce only once. - world << "\red The round has ended!" - round_end_announced = 1 - vote.autotransfer() - return 1 proc/getfactionbyname(var/name) diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index 4d436e29ca9..cc38ef0ef9f 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -148,7 +148,7 @@ if (station_captured && !to_nuke_or_not_to_nuke) return 1 if (is_malf_ai_dead()) - if(config.continous_rounds) + if(config.continuous_rounds) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 malf_mode_declared = 0 diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 345114a4088..74e81484c97 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -203,15 +203,11 @@ //Checks if the round is over// /////////////////////////////// /datum/game_mode/revolution/check_finished() - if(config.continous_rounds) + if(config.continuous_rounds) if(finished != 0) if(shuttle_master && shuttle_master.emergencyNoEscape) shuttle_master.emergencyNoEscape = 0 - return ..() - if(finished != 0) - return 1 - else - return 0 + return finished != 0 /////////////////////////////////////////////////// //Deals with converting players to the revolution// diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 2f34c567dd3..37a6c801573 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -203,10 +203,6 @@ /datum/game_mode/wizard/check_finished() - - if(config.continous_rounds) - return ..() - var/wizards_alive = 0 var/traitors_alive = 0 for(var/datum/mind/wizard in wizards) diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm index f30debb7e98..4ae05c7dd21 100644 --- a/code/game/gamemodes/xenos/xenos.dm +++ b/code/game/gamemodes/xenos/xenos.dm @@ -135,15 +135,7 @@ return ..() /datum/game_mode/xenos/check_finished() - if(config.continous_rounds) - if(result) - return ..() - if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE) - return ..() - if(result || station_was_nuked) - return 1 - else - return 0 + return result != 0 /datum/game_mode/xenos/proc/xenos_alive() var/list/livingxenos = list() From c7e80ac4b207b18f68ee04f95c4c254d4f293430 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sat, 30 Jan 2016 21:21:31 -0500 Subject: [PATCH 15/26] Automatic changelog generation for PR #3439 --- html/changelogs/AutoChangeLog-pr-3439.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3439.yml diff --git a/html/changelogs/AutoChangeLog-pr-3439.yml b/html/changelogs/AutoChangeLog-pr-3439.yml new file mode 100644 index 00000000000..f01e07d7320 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3439.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - rscadd: "People with slime people limbs can now *squish" From 1d40ba8e148f4a002ff139e8f74e43a1c57ea958 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sat, 30 Jan 2016 21:21:52 -0500 Subject: [PATCH 16/26] Automatic changelog generation for PR #3440 --- html/changelogs/AutoChangeLog-pr-3440.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3440.yml diff --git a/html/changelogs/AutoChangeLog-pr-3440.yml b/html/changelogs/AutoChangeLog-pr-3440.yml new file mode 100644 index 00000000000..3295b84f92a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3440.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - tweak: "Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking" From c714f14b28cca21f69b201d3183db017b37702b9 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sat, 30 Jan 2016 22:28:51 -0500 Subject: [PATCH 17/26] Shuttle fixes --- code/__DEFINES/stat.dm | 6 ---- code/controllers/Processes/shuttles.dm | 4 +-- code/game/gamemodes/miniantags/borer/borer.dm | 5 +--- .../game/machinery/computer/communications.dm | 2 +- .../spacesuits/rig/modules/computer.dm | 7 ----- .../spacesuits/rig/modules/modules.dm | 7 ----- code/modules/mob/dead/observer/observer.dm | 7 ++--- code/modules/mob/living/carbon/alien/alien.dm | 5 +--- code/modules/mob/living/carbon/brain/brain.dm | 8 ++--- code/modules/mob/living/carbon/human/human.dm | 8 ++--- code/modules/mob/living/living.dm | 7 +++++ code/modules/mob/living/silicon/silicon.dm | 18 ++--------- code/modules/mob/mob.dm | 30 +++++++++++++++++++ 13 files changed, 51 insertions(+), 63 deletions(-) diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 0aa113b0f68..756ae54765f 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -27,12 +27,6 @@ #define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station #define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure. -//Shuttle moving status -#define SHUTTLE_IDLE 0 -#define SHUTTLE_WARMUP 1 -#define SHUTTLE_INTRANSIT 2 -#define SHUTTLE_STRANDED 3 - //Ferry shuttle processing status #define IDLE_STATE 0 #define WAIT_LAUNCH 1 diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm index c7ef656bff2..f16d5b1c396 100644 --- a/code/controllers/Processes/shuttles.dm +++ b/code/controllers/Processes/shuttles.dm @@ -120,7 +120,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1) else emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0) @@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 return if(ticker.mode.name == "meteor") return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) if(emergency.timeLeft(1) < emergencyCallTime * 0.25) return else diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm index 34ec44a4245..6926c7f6067 100644 --- a/code/game/gamemodes/miniantags/borer/borer.dm +++ b/code/game/gamemodes/miniantags/borer/borer.dm @@ -111,10 +111,7 @@ ..() statpanel("Status") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() if (client.statpanel == "Status") stat("Chemicals", chemicals) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 9dede30f469..ea2dadda3b4 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -437,7 +437,7 @@ user << "Under directive 7-10, [station_name()] is quarantined until further notice." return - if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. + if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. shuttle_master.emergency.request(null, 0.5, null, " Automatic Crew Transfer", 1) else shuttle_master.emergency.request(null, 1, null, " Automatic Crew Transfer", 0) diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 23d2bcb7bdf..44bb65e9e10 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -57,13 +57,6 @@ else integrated_ai.get_rig_stats = 0 -/mob/living/Stat() - . = ..() - if(. && get_rig_stats) - var/obj/item/weapon/rig/rig = get_rig() - if(rig) - SetupStat(rig) - /obj/item/rig_module/ai_container/proc/update_verb_holder() if(!verb_holder) verb_holder = new(src) diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 183255ca635..6e19fab742c 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -225,13 +225,6 @@ /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) return 0 -/mob/living/carbon/human/Stat() - . = ..() - - if(. && istype(back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/R = back - SetupStat(R) - /mob/proc/SetupStat(var/obj/item/weapon/rig/R) if(R && (R.flags & NODROP) && R.installed_modules.len && statpanel("Hardsuit Modules")) var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2716ba0a439..90b568110b3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -210,7 +210,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ..() statpanel("Status") if (client.statpanel == "Status") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker) if(ticker.mode) //world << "DEBUG: ticker not null" @@ -218,10 +218,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp //world << "DEBUG: malf mode ticker test" if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/dead/observer/verb/reenter_corpse() set category = "Ghost" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 956453c4640..e58b3420c93 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -181,10 +181,7 @@ if (client.statpanel == "Status") stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_emergency_shuttle_eta() /mob/living/carbon/alien/Stun(amount) if(status_flags & CANSTUN) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 3fe57ec2acc..8e6da1eca78 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -83,12 +83,8 @@ I'm using this for Stat to give it a more nifty interface to work with ..() if(has_synthetic_assistance()) statpanel("Status") - stat(null, "Station Time: [worldtime2text()]") - - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + show_stat_station_time() + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") //Knowing how well-off your mech is doing is really important as an MMI diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d82376c2f86..57c29c3d51d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -252,15 +252,13 @@ stat(null, "Intent: [a_intent]") stat(null, "Move Mode: [m_intent]") - stat(null, "Station Time: [worldtime2text()]") + show_stat_station_time() if(ticker && ticker.mode && ticker.mode.name == "AI malfunction") if(ticker.mode:malf_mode_declared) stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]") - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") + + show_stat_emergency_shuttle_eta() if(client.statpanel == "Status") if(locate(/obj/item/device/assembly/health) in src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 49488f529ac..8f078f18f90 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -2,6 +2,13 @@ /mob/living/Destroy() ..() return QDEL_HINT_HARDDEL_NOW + +/mob/living/Stat() + . = ..() + if(. && get_rig_stats) + var/obj/item/weapon/rig/rig = get_rig() + if(rig) + SetupStat(rig) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 83f12db46dd..f1f5f7862b3 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -142,25 +142,11 @@ return 0 -// this function displays the station time in the status panel -/mob/living/silicon/proc/show_station_time() - stat(null, "Station Time: [worldtime2text()]") - - -// this function displays the shuttles ETA in the status panel if the shuttle has been called -/mob/living/silicon/proc/show_emergency_shuttle_eta() - if(shuttle_master.emergency.mode >= SHUTTLE_RECALL) - var/timeleft = shuttle_master.emergency.timeLeft() - if(timeleft > 0) - stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]") - - - // This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms /mob/living/silicon/Stat() if(statpanel("Status")) - show_station_time() - show_emergency_shuttle_eta() + show_stat_station_time() + show_stat_emergency_shuttle_eta() show_system_integrity() show_malf_ai() ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 623905c75e7..e1b2ce1477d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -990,6 +990,36 @@ var/list/slot_equipment_priority = list( \ statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs +// this function displays the station time in the status panel +/mob/proc/show_stat_station_time() + stat(null, "Station Time: [worldtime2text()]") + +// this function displays the shuttles ETA in the status panel if the shuttle has been called +/mob/proc/show_stat_emergency_shuttle_eta() + var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency + + if(E.mode >= SHUTTLE_RECALL) + var/message = "" + + var/timeleft = E.timeLeft() + message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + + switch(E.mode) + if(SHUTTLE_RECALL, SHUTTLE_ESCAPE) + message = "ETR-[message]" + if(SHUTTLE_CALL) + message = "ETA-[message]" + if(SHUTTLE_DOCKED) + if(timeleft < 5) + message = "Departing..." + else + message = "ETD-[message]" + if(SHUTTLE_STRANDED) + message = "ETA-ERR" + if(SHUTTLE_ENDGAME) + return + + stat(null, message) /mob/proc/add_stings_to_statpanel(var/list/stings) for(var/obj/effect/proc_holder/changeling/S in stings) From f0d9c6cb12df870337561b8a8923946b087ca574 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sat, 30 Jan 2016 23:05:14 -0500 Subject: [PATCH 18/26] Automatic changelog generation for PR #3458 --- html/changelogs/AutoChangeLog-pr-3458.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3458.yml diff --git a/html/changelogs/AutoChangeLog-pr-3458.yml b/html/changelogs/AutoChangeLog-pr-3458.yml new file mode 100644 index 00000000000..403bc6e073b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3458.yml @@ -0,0 +1,5 @@ +author: Tastyfish +delete-after: True +changes: + - rscadd: "The emergency shuttle status in the Status tab now has ETA/ETD/etc like before." + - tweak: "Code Gamma+ now has a 5 minute emergency shuttle call, like Red." From b3e7e9595b6933059f5f68a975a5583d23d2b901 Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 31 Jan 2016 00:40:56 -0500 Subject: [PATCH 19/26] Better species suicide support --- code/game/verbs/suicide.dm | 100 +++++++++--------- .../mob/living/carbon/human/species/golem.dm | 3 + .../mob/living/carbon/human/species/shadow.dm | 5 + .../living/carbon/human/species/skeleton.dm | 7 +- .../living/carbon/human/species/species.dm | 5 + .../living/carbon/human/species/station.dm | 52 +++++++++ 6 files changed, 123 insertions(+), 49 deletions(-) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index fa525e22e1f..cca76f4b42b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -1,5 +1,54 @@ /mob/var/suiciding = 0 +/mob/living/carbon/human/proc/do_suicide(damagetype, byitem) + var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2 + var/dmgamt = maxHealth - threshold + + var/damage_mod = 1 + switch(damagetype) //Sorry about the magic numbers. + //brute = 1, burn = 2, tox = 4, oxy = 8 + if(15) //4 damage types + damage_mod = 4 + + if(6, 11, 13, 14) //3 damage types + damage_mod = 3 + + if(3, 5, 7, 9, 10, 12) //2 damage types + damage_mod = 2 + + if(1, 2, 4, 8) //1 damage type + damage_mod = 1 + + else //This should not happen, but if it does, everything should still work + damage_mod = 1 + + //Do dmgamt damage divided by the number of damage types applied. + if(damagetype & BRUTELOSS) + adjustBruteLoss(dmgamt / damage_mod) + + if(damagetype & FIRELOSS) + adjustFireLoss(dmgamt / damage_mod) + + if(damagetype & TOXLOSS) + adjustToxLoss(dmgamt / damage_mod) + + if(damagetype & OXYLOSS) + adjustOxyLoss(dmgamt / damage_mod) + + // Failing that... + if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS)) + if(species.flags & NO_BREATHE) + // the ultimate fallback + take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0) + else + adjustOxyLoss(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + + var/obj/item/organ/external/affected = get_organ("head") + if(affected) + affected.add_autopsy_data(byitem ? "Suicide by [byitem]" : "Suicide", dmgamt) + + updatehealth() + /mob/living/carbon/human/verb/suicide() set hidden = 1 @@ -24,56 +73,11 @@ if(held_item) var/damagetype = held_item.suicide_act(src) if(damagetype) - var/damage_mod = 1 - switch(damagetype) //Sorry about the magic numbers. - //brute = 1, burn = 2, tox = 4, oxy = 8 - if(15) //4 damage types - damage_mod = 4 - - if(6, 11, 13, 14) //3 damage types - damage_mod = 3 - - if(3, 5, 7, 9, 10, 12) //2 damage types - damage_mod = 2 - - if(1, 2, 4, 8) //1 damage type - damage_mod = 1 - - else //This should not happen, but if it does, everything should still work - damage_mod = 1 - - //Do 175 damage divided by the number of damage types applied. - if(damagetype & BRUTELOSS) - adjustBruteLoss(175/damage_mod) - - if(damagetype & FIRELOSS) - adjustFireLoss(175/damage_mod) - - if(damagetype & TOXLOSS) - adjustToxLoss(175/damage_mod) - - if(damagetype & OXYLOSS) - adjustOxyLoss(175/damage_mod) - - //If something went wrong, just do normal oxyloss - if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS)) - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide by [held_item]", 175) - - updatehealth() + do_suicide(damagetype, held_item) return - - viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \ - "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \ - "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \ - "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.") - adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) - - var/obj/item/organ/external/affected = get_organ("head") - affected.add_autopsy_data("Suicide", 175) + viewers(src) << "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide." + do_suicide(0) updatehealth() diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index ae11d2e8746..799226ea321 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -17,6 +17,9 @@ has_organ = list( "brain" = /obj/item/organ/brain/golem ) + suicide_messages = list( + "is crumbling into dust!", + "is smashing their body apart!") /datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) if(H.mind) diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index 3727bd8de0a..635eb9ede3e 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -20,6 +20,11 @@ bodyflags = FEET_NOSLIP dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race reagent_tag = PROCESS_ORG + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is staring into the closest light source!") /datum/species/shadow/handle_death(var/mob/living/carbon/human/H) H.dust() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 82c7864dd46..7c813b4b1be 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -30,4 +30,9 @@ heat_level_1 = 999999999 heat_level_2 = 999999999 heat_level_3 = 999999999 - heat_level_3_breathe = 999999999 \ No newline at end of file + heat_level_3_breathe = 999999999 + + suicide_messages = list( + "is snapping their own bones!", + "is collapsing into a pile!", + "is twisting their skull off!") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 20b1ecdfba3..cfb04c5427d 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -88,6 +88,11 @@ //Death vars. var/death_message = "seizes up and falls limp, their eyes dead and lifeless..." + var/list/suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their thumbs into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") // Language/culture vars. var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index ff9ae6ff835..349b28b6efb 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -55,6 +55,12 @@ flesh_color = "#34AF10" reagent_tag = PROCESS_ORG base_color = "#066000" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/unathi/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -100,6 +106,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#AFA59E" base_color = "#333333" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/tajaran/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -135,6 +147,12 @@ reagent_tag = PROCESS_ORG flesh_color = "#966464" base_color = "#B43214" + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -206,6 +224,13 @@ flesh_color = "#808D11" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is deeply inhaling oxygen!") /datum/species/vox/handle_death(var/mob/living/carbon/human/H) H.stop_tail_wagging(1) @@ -292,6 +317,13 @@ "eyes" = /obj/item/organ/eyes, "stack" = /obj/item/organ/stack/vox ) + + suicide_messages = list( + "is attempting to bite their tongue off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!", + "is huffing oxygen!") /datum/species/kidan name = "Kidan" @@ -311,6 +343,12 @@ dietflags = DIET_HERB blood_color = "#FB9800" reagent_tag = PROCESS_ORG + + suicide_messages = list( + "is attempting to bite their antenna off!", + "is jamming their claws into their eye sockets!", + "is twisting their own neck!", + "is holding their breath!") /datum/species/slime name = "Slime People" @@ -333,6 +371,10 @@ has_organ = list( "brain" = /obj/item/organ/brain/slime ) + + suicide_messages = list( + "is melting into a puddle!", + "is turning a dull, brown color and melting into a puddle!") /datum/species/grey name = "Grey" @@ -433,6 +475,10 @@ "l_foot" = list("path" = /obj/item/organ/external/diona/foot), "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) ) + + suicide_messages = list( + "is losing branches!", + "is pulling themselves apart!") /datum/species/diona/can_understand(var/mob/other) var/mob/living/simple_animal/diona/D = other @@ -526,6 +572,12 @@ "l_foot" = list("path" = /obj/item/organ/external/foot/ipc), "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc) ) + + suicide_messages = list( + "is powering down!", + "is smashing their own monitor!", + "is twisting their own neck!", + "is blocking their ventilation port!") /datum/species/machine/handle_death(var/mob/living/carbon/human/H) H.h_style = "" From 57073340cfe347282fbe2376cafc6cde38a92b01 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 31 Jan 2016 01:04:27 -0500 Subject: [PATCH 20/26] you shall not cast --- code/game/gamemodes/wizard/raginmages.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index 7092469efd1..77703c53715 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -1,5 +1,5 @@ /datum/game_mode/wizard/raginmages - name = "Ragin' Mages" + name = "ragin' mages" config_tag = "raginmages" required_players = 1 required_players_secret = 15 diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 1f91e489934..83c23311297 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -412,6 +412,12 @@ cost = 0 log_name = "SG" +/datum/spellbook_entry/summon/guns/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(0) @@ -427,6 +433,12 @@ cost = 0 log_name = "SU" +/datum/spellbook_entry/summon/magic/IsAvailible() + if(ticker.mode.name == "ragin' mages") + return 0 + else + return 1 + /datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book) feedback_add_details("wizard_spell_learned",log_name) user.rightandwrong(1) From 134b407499682b5a0cc26fbd6911b5dc39b4578a Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Sun, 31 Jan 2016 01:34:07 -0500 Subject: [PATCH 21/26] Fixes Game Options Config --- config/example/game_options.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/example/game_options.txt b/config/example/game_options.txt index 9ccb4871aef..69847e0a6b6 100644 --- a/config/example/game_options.txt +++ b/config/example/game_options.txt @@ -69,8 +69,7 @@ BOMBCAP 20 ### ROUNDSTART SILICON LAWS ### ## This controls what the AI's laws are at the start of the round. -## Set to 0/commented for "off", silicons will just start with Asimov. -## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.) -## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm. +## Set to 0/commented for "off", silicons will just start with Crewsimov. +## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm. -DEFAULT_LAWS 2 \ No newline at end of file +DEFAULT_LAWS 1 \ No newline at end of file From ff348fefd86d4d83a99bca8e4e3b00b8c0a22044 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sun, 31 Jan 2016 18:44:13 -0500 Subject: [PATCH 22/26] Automatic changelog generation for PR #3445 --- html/changelogs/AutoChangeLog-pr-3445.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3445.yml diff --git a/html/changelogs/AutoChangeLog-pr-3445.yml b/html/changelogs/AutoChangeLog-pr-3445.yml new file mode 100644 index 00000000000..45122dd2391 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3445.yml @@ -0,0 +1,5 @@ +author: Fox McCloud +delete-after: True +changes: + - rscadd: "Updates Summon Guns and Magic to include many of the new guns" + - tweak: "Summon Guns/Magic can no longer be used during Ragin' Mages" From 29827ea2526cc6d549b0c5da303d1a64684ed3f8 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sun, 31 Jan 2016 18:45:59 -0500 Subject: [PATCH 23/26] Automatic changelog generation for PR #3437 --- html/changelogs/AutoChangeLog-pr-3437.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3437.yml diff --git a/html/changelogs/AutoChangeLog-pr-3437.yml b/html/changelogs/AutoChangeLog-pr-3437.yml new file mode 100644 index 00000000000..1e3f8bc77a3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3437.yml @@ -0,0 +1,4 @@ +author: Crazylemon64 +delete-after: True +changes: + - bugfix: "Syndicate borgs can now interact with station machinery" From 8df9725ea002df5c04317da78c36cbf878abd2a9 Mon Sep 17 00:00:00 2001 From: pinatacolada Date: Mon, 1 Feb 2016 01:24:16 +0000 Subject: [PATCH 24/26] Fixes #3465 Swarmers become unable to eat space pods --- code/game/gamemodes/miniantags/bot_swarm/swarmer.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 99f0f98e256..7b056987953 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -262,6 +262,9 @@ /obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting." +/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) + S << "Destroying this vehicle would destroy us. Aborting." + /mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) S.DisperseTarget(src) From 454d5731fbf3809f4356079bcdfcbbe79f5fe5c8 Mon Sep 17 00:00:00 2001 From: TheDZD Date: Sun, 31 Jan 2016 22:15:58 -0500 Subject: [PATCH 25/26] Updates Changelog --- html/changelog.html | 28 ++++++++++++++ html/changelogs/.all_changelog.yml | 21 +++++++++++ html/changelogs/AutoChangeLog-pr-3435.yml | 5 --- html/changelogs/AutoChangeLog-pr-3437.yml | 4 -- html/changelogs/AutoChangeLog-pr-3439.yml | 4 -- html/changelogs/AutoChangeLog-pr-3440.yml | 4 -- html/changelogs/AutoChangeLog-pr-3445.yml | 5 --- html/changelogs/AutoChangeLog-pr-3458.yml | 5 --- ...atacolada-pr-usefulishsurgerycomputers.yml | 37 ------------------- 9 files changed, 49 insertions(+), 64 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3435.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3437.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3439.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3440.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3445.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3458.yml delete mode 100644 html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml diff --git a/html/changelog.html b/html/changelog.html index 866190c8971..56172c88974 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,34 @@ -->
+

31 January 2016

+

Crazylemon64 updated:

+
    +
  • Syndicate borgs can now interact with station machinery
  • +
  • People with slime people limbs can now *squish
  • +
  • Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
  • +
+

FalseIncarnate updated:

+
    +
  • Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
  • +
  • Adds in the Magic Conch Shell, an admin-only shell of power.
  • +
+

Fox McCloud updated:

+
    +
  • Updates Summon Guns and Magic to include many of the new guns
  • +
  • Summon Guns/Magic can no longer be used during Ragin' Mages
  • +
+

Tastyfish updated:

+
    +
  • The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
  • +
  • Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
  • +
+

pinatacolada updated:

+
    +
  • Adds NanoUI to the operating computer
  • +
  • Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
  • +
+

29 January 2016

Crazylemon updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 18a867d7ab6..70cedd14768 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -358,3 +358,24 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. bullets to reach a state of what our scientists refer to as "enough dakka," Syndicate High Command has decided to restore the Syndicate Strike Team arsenal to using standard-issue L6 SAW ammunition. +2016-01-31: + Crazylemon64: + - bugfix: Syndicate borgs can now interact with station machinery + - rscadd: People with slime people limbs can now *squish + - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver + transplant will let them take alcohol like a champ - lacking a liver will have + the same effect as being a skrell, when drinking + FalseIncarnate: + - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs. + - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power. + Fox McCloud: + - rscadd: Updates Summon Guns and Magic to include many of the new guns + - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages + Tastyfish: + - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like + before. + - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red. + pinatacolada: + - rscadd: Adds NanoUI to the operating computer + - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the + computer, with a menu to selectively turn them on and off diff --git a/html/changelogs/AutoChangeLog-pr-3435.yml b/html/changelogs/AutoChangeLog-pr-3435.yml deleted file mode 100644 index beda6bf8456..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3435.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: FalseIncarnate -delete-after: True -changes: - - rscadd: "Adds in the Magic Eight Ball toy, found in Claw Game prize orbs." - - rscadd: "Adds in the Magic Conch Shell, an admin-only shell of power." diff --git a/html/changelogs/AutoChangeLog-pr-3437.yml b/html/changelogs/AutoChangeLog-pr-3437.yml deleted file mode 100644 index 1e3f8bc77a3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3437.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - bugfix: "Syndicate borgs can now interact with station machinery" diff --git a/html/changelogs/AutoChangeLog-pr-3439.yml b/html/changelogs/AutoChangeLog-pr-3439.yml deleted file mode 100644 index f01e07d7320..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3439.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - rscadd: "People with slime people limbs can now *squish" diff --git a/html/changelogs/AutoChangeLog-pr-3440.yml b/html/changelogs/AutoChangeLog-pr-3440.yml deleted file mode 100644 index 3295b84f92a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3440.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Crazylemon64 -delete-after: True -changes: - - tweak: "Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking" diff --git a/html/changelogs/AutoChangeLog-pr-3445.yml b/html/changelogs/AutoChangeLog-pr-3445.yml deleted file mode 100644 index 45122dd2391..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3445.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Fox McCloud -delete-after: True -changes: - - rscadd: "Updates Summon Guns and Magic to include many of the new guns" - - tweak: "Summon Guns/Magic can no longer be used during Ragin' Mages" diff --git a/html/changelogs/AutoChangeLog-pr-3458.yml b/html/changelogs/AutoChangeLog-pr-3458.yml deleted file mode 100644 index 403bc6e073b..00000000000 --- a/html/changelogs/AutoChangeLog-pr-3458.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Tastyfish -delete-after: True -changes: - - rscadd: "The emergency shuttle status in the Status tab now has ETA/ETD/etc like before." - - tweak: "Code Gamma+ now has a 5 minute emergency shuttle call, like Red." diff --git a/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml b/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml deleted file mode 100644 index 70246bcf1fd..00000000000 --- a/html/changelogs/pinatacolada-pr-usefulishsurgerycomputers.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. Remove the quotation mark and put in your name when copy+pasting the example changelog. -author: "pinatacolada" - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. -# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Adds NanoUI to the operating computer" - - rscadd: "Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off" - From 8d38e190e4ed34be640419054cc6b7bbaf80b93b Mon Sep 17 00:00:00 2001 From: TheDZD Date: Mon, 1 Feb 2016 01:54:51 -0500 Subject: [PATCH 26/26] Automatic changelog generation for PR #3461 --- html/changelogs/AutoChangeLog-pr-3461.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3461.yml diff --git a/html/changelogs/AutoChangeLog-pr-3461.yml b/html/changelogs/AutoChangeLog-pr-3461.yml new file mode 100644 index 00000000000..ca27ae1f755 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3461.yml @@ -0,0 +1,5 @@ +author: Tastyfish +delete-after: True +changes: + - bugfix: "Species that don't breathe can kill themselves now!" + - rscadd: "Suicide messages are now catered to your species."