diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 8efb2617bd..2af7ec5c49 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -43,6 +43,8 @@ // /atom signals //from base of atom/proc/Initialize(): sent any time a new atom is created #define COMSIG_ATOM_CREATED "atom_created" +//from SSatoms InitAtom - Only if the atom was not deleted or failed initialization +#define COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE "atom_init_success" #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index db1fced637..b9a4785f49 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -90,6 +90,8 @@ SUBSYSTEM_DEF(atoms) qdeleted = TRUE else if(!(A.flags_1 & INITIALIZED_1)) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + else + SEND_SIGNAL(A,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) return qdeleted || QDELING(A) diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index b6de85cab0..0ada00a2e8 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -45,8 +45,9 @@ /datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName) var/obj/item/master = comp.parent - master.AddElement(/datum/element/tactical) - comp.appliedElements += list(/datum/element/tactical) + var/list/dat = list(/datum/element/tactical) + master._AddElement(dat) + comp.appliedElements += list(dat) return "tactical [newName]" /datum/fantasy_affix/pyromantic diff --git a/code/datums/elements/decal.dm b/code/datums/elements/decal.dm index 5ddd5bd03e..a20d46c813 100644 --- a/code/datums/elements/decal.dm +++ b/code/datums/elements/decal.dm @@ -41,19 +41,27 @@ var/atom/A = target num_decals_per_atom[A]-- if(!num_decals_per_atom[A]) - UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS)) + UnregisterSignal(A, list(COMSIG_ATOM_DIR_CHANGE, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, + COMSIG_COMPONENT_CLEAN_ACT, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_UPDATE_OVERLAYS)) LAZYREMOVE(num_decals_per_atom, A) apply(A) return ..() /datum/element/decal/proc/apply(atom/target) - target.update_icon() + if(target.flags_1 & INITIALIZED_1) + target.update_icon() //could use some queuing here now maybe. + else if(!QDELETED(target) && num_decals_per_atom[target] == 1) + RegisterSignal(target, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, .proc/late_update_icon) if(isitem(target)) addtimer(CALLBACK(target, /obj/item/.proc/update_slot_icon), 0, TIMER_UNIQUE) +/datum/element/decal/proc/late_update_icon(atom/source) + source.update_icon() + UnregisterSignal(source,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) + /datum/element/decal/proc/apply_overlay(atom/source, list/overlay_list) if(first_dir) - pic.dir = turn(first_dir, -dir2angle(source.dir)) + pic.dir = first_dir == SOUTH ? source.dir : turn(first_dir, dir2angle(source.dir)-180) //Never turn a dir by 0. for(var/i in 1 to num_decals_per_atom[source]) overlay_list += pic diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index b280851888..5f312f2bf3 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -46,4 +46,5 @@ var/turf/T = loc if(!istype(T)) //you know this will happen somehow CRASH("Turf decal initialized in an object/nullspace") - T.AddElement(/datum/element/decal, icon, icon_state, dir, CLEAN_GOD, color, null, null, alpha) + var/turn_dir = 180 - dir2angle(T.dir) //Turning a dir by 0 results in a roulette of random dirs. + T.AddElement(/datum/element/decal, icon, icon_state, turn_dir ? turn(dir, turn_dir) : dir, CLEAN_GOD, color, null, null, alpha) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 758f824727..877d236e84 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -13,7 +13,7 @@ var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" - thermal_conductivity = 0.040 + thermal_conductivity = 0.004 heat_capacity = 10000 intact = 1 var/broken = 0 diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index 03045674e4..42b4707b50 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -3,7 +3,7 @@ name = "reinforced floor" desc = "Extremely sturdy." icon_state = "engine" - thermal_conductivity = 0.025 + thermal_conductivity = 0.0025 heat_capacity = INFINITY floor_tile = /obj/item/stack/rods footstep = FOOTSTEP_PLATING diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index ed48c24462..5d928f377e 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -90,7 +90,7 @@ icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" sheet_type = /obj/item/stack/sheet/mineral/plasma - thermal_conductivity = 0.04 + thermal_conductivity = 0.004 canSmoothWith = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma) /turf/closed/wall/mineral/plasma/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 2b43319904..0c6ca13e86 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -1,6 +1,6 @@ /turf //used for temperature calculations - var/thermal_conductivity = 0.05 + var/thermal_conductivity = 0.005 var/heat_capacity = 1 var/temperature_archived @@ -270,7 +270,7 @@ /turf/proc/super_conduct() var/conductivity_directions = conductivity_directions() - + archive() if(conductivity_directions) //Conduct with tiles around me for(var/direction in GLOB.cardinals) @@ -331,6 +331,7 @@ var/heat = thermal_conductivity*delta_temperature* \ (heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM)) temperature -= heat/heat_capacity + temperature = max(temperature,T0C) //otherwise we just sorta get stuck at super cold temps forever /turf/open/proc/temperature_share_open_to_solid(turf/sharer) sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) @@ -344,3 +345,5 @@ temperature -= heat/heat_capacity sharer.temperature += heat/sharer.heat_capacity + temperature = max(temperature,T0C) + sharer.temperature = max(sharer.temperature,T0C) diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index e86b249be6..e498ff05c9 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -188,7 +188,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) //Performs air sharing calculations between two gas_mixtures assuming only 1 boundary length //Returns: amount of gas exchanged (+ if sharer received) -/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient) +/datum/gas_mixture/proc/temperature_share(datum/gas_mixture/sharer, conduction_coefficient,temperature=null,heat_capacity=null) //Performs temperature sharing calculations (via conduction) between two gas_mixtures assuming only 1 boundary length //Returns: new temperature of the sharer diff --git a/code/modules/cargo/packs/goodies.dm b/code/modules/cargo/packs/goodies.dm index 5d07e85bac..423d2fc743 100644 --- a/code/modules/cargo/packs/goodies.dm +++ b/code/modules/cargo/packs/goodies.dm @@ -52,8 +52,8 @@ cost = 300 contains = list(/obj/item/storage/toolbox/mechanical) -/datum/supply_pack/goody/electrical_toolbox // mostly just to water down coupon probability - name = "Mechanical Toolbox" +/datum/supply_pack/goody/electrical_toolbox + name = "Electrical Toolbox" desc = "A fully stocked electrical toolbox, for when you're too lazy to just print them out." cost = 300 contains = list(/obj/item/storage/toolbox/electrical) diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 18cd104ff8..f8292738ee 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -267,7 +267,7 @@ mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON|USE_TAUR_CLIP_MASK /obj/item/clothing/under/costume/christmas/croptop/green - name = "green feminine christmas suit" + name = "green croptop christmas suit" desc = "A simple green christmas suit. Smells minty!" icon_state = "christmasfemaleg" item_state = "christmasfemaleg" diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 515e0fe1b3..e69af1df13 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -22,7 +22,7 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 - startWhen = rand(90, 180) // Apparently it is by 2 seconds, so 90 is actually 180 seconds, and 180 is 360 seconds. So this is 3-6 minutes + startWhen = 150 // 5 minutes if(GLOB.singularity_counter) startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index aab741edd6..3f11d88668 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -23,6 +23,7 @@ a_intent = INTENT_HARM //so we always get pushed instead of trying to swap sight = SEE_TURFS | SEE_MOBS | SEE_OBJS see_in_dark = 8 + deathsound = 'sound/voice/scream/android_scream.ogg' hud_type = /datum/hud/ai med_hud = DATA_HUD_MEDICAL_BASIC sec_hud = DATA_HUD_SECURITY_BASIC diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c6aee397e4..944b909463 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -13,6 +13,7 @@ mob_biotypes = MOB_ROBOTIC rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE speech_span = SPAN_ROBOT + deathsound = 'sound/voice/borg_deathsound.ogg' flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 vore_flags = NO_VORE diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index b71584982c..be631513bd 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -70,7 +70,6 @@ return /obj/item/reagent_containers/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) - . = ..() if(user.a_intent == INTENT_HARM) return ..() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 9172ce00bc..f23a03da5b 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -265,10 +265,6 @@ var/C = input(owner, "Select Color", "Select color", "#ffffff") as color|null if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user) return - var/list/hsv = ReadHSV(RGBtoHSV(C)) - if(hsv[2] > 125) - to_chat(user, "A color that saturated? Surely not!") - return var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num if(!isnum(range)) return @@ -276,14 +272,24 @@ set_distance(clamp(range, 0, max_light_beam_distance)) assume_rgb(C) +#define MAX_SATURATION 192 +#define MAX_LIGHTNESS 256 + /obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor) - current_color_string = newcolor - eye_color = RGB2EYECOLORSTRING(current_color_string) + eye_color = RGB2EYECOLORSTRING(newcolor) + var/list/hsv = ReadHSV(RGBtoHSV(newcolor)) + hsv[2] = clamp(hsv[2], 0, MAX_SATURATION) + hsv[3] = clamp(hsv[3], 0, MAX_LIGHTNESS) + var/new_hsv = hsv(hsv[1], hsv[2], hsv[3]) + current_color_string = HSVtoRGB(new_hsv) sync_light_effects() cycle_mob_overlay() if(!QDELETED(owner) && ishuman(owner)) //Other carbon mobs don't have eye color. owner.dna.species.handle_body(owner) +#undef MAX_SATURATION +#undef MAX_LIGHTNESS + /obj/item/organ/eyes/robotic/glow/proc/cycle_mob_overlay() remove_mob_overlay() mob_overlay.color = current_color_string diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 09e6f0ef42..929b42f96d 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -12,7 +12,7 @@ var/taste_sensitivity = 15 // lower is more sensitive. maxHealth = TONGUE_MAX_HEALTH var/list/initial_accents //the ones the tongue starts with, not what it currently has - var/list/accents //done in order of priority (please always apply abductor accent and stuttering last) + var/list/accents = list() //done in order of priority (please always apply abductor accent and stuttering last) var/static/list/languages_possible_base = typecacheof(list( /datum/language/common, /datum/language/draconic, @@ -31,6 +31,8 @@ /obj/item/organ/tongue/Initialize(mapload) . = ..() + for(var/accent in initial_accents) + accents += new accent low_threshold_passed = "Your [name] feels a little sore." low_threshold_cleared = "Your [name] soreness has subsided." high_threshold_passed = "Your [name] is really starting to hurt." @@ -38,16 +40,14 @@ now_failing = "Your [name] feels like it's about to fall out!." now_fixed = "The excruciating pain of your [name] has subsided." languages_possible = languages_possible_base - for(var/accent in initial_accents) - initial_accents += new accent -/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) //this wont proc unless there's initial_accents - for(var/datum/accent/speech_modifier in initial_accents) +/obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) //this wont proc unless there's initial_accents on the tongue + for(var/datum/accent/speech_modifier in accents) speech_args = speech_modifier.modify_speech(speech_args, source, owner) /obj/item/organ/tongue/applyOrganDamage(d, maximum = maxHealth) . = ..() - if (damage >= maxHealth) + if(damage >= maxHealth) to_chat(owner, "Your tongue is singed beyond recognition, and disintegrates!") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Tongues lost to Fermi") qdel(src) @@ -56,7 +56,7 @@ ..() if(say_mod && M.dna && M.dna.species) M.dna.species.say_mod = say_mod - if(initial_accents) + if(length(initial_accents) || length(accents)) RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) M.UnregisterSignal(M, COMSIG_MOB_SAY) @@ -166,8 +166,8 @@ var/list/phomeme_types = list(/datum/accent/span/sans, /datum/accent/span/papyrus) /obj/item/organ/tongue/bone/Initialize() - . = ..() initial_accents += pick(phomeme_types) + . = ..() /obj/item/organ/tongue/bone/applyOrganDamage(var/d, var/maximum = maxHealth) if(d < 0) @@ -205,9 +205,6 @@ /obj/item/organ/tongue/robot/could_speak_language(language) return ..() || electronics_magic -/obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args) - ..() - /obj/item/organ/tongue/fluffy name = "fluffy tongue" desc = "OwO what's this?" @@ -220,6 +217,7 @@ name = "cybernetic tongue" desc = "A state of the art robotic tongue that can detect the pH of anything drank." icon_state = "tonguecybernetic" + initial_accents = list(/datum/accent/span/robot) taste_sensitivity = 10 maxHealth = 60 //It's robotic! organ_flags = ORGAN_SYNTHETIC @@ -231,10 +229,6 @@ var/errormessage = list("Runtime in tongue.dm, line 39: Undefined operation \"zapzap ow my tongue\"", "afhsjifksahgjkaslfhashfjsak", "-1.#IND", "Graham's number", "inside you all along", "awaiting at least 1 approving review before merging this taste request") owner.say("The pH is appropriately [pick(errormessage)].", forced = "EMPed synthetic tongue") -/obj/item/organ/tongue/cybernetic/handle_speech(datum/source, list/speech_args) - speech_args[SPEECH_SPANS] |= SPAN_ROBOT - ..() - /obj/item/organ/tongue/robot/ipc name = "positronic voicebox" say_mod = "beeps" diff --git a/html/changelog.html b/html/changelog.html index be6d0ce44e..2b6b76f920 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,31 @@ -->
+

09 September 2020

+

Putnam3145 updated:

+ +

timothyteakettle updated:

+ + +

08 September 2020

+

Ghommie updated:

+ +

KeRSedChaplain updated:

+ +

silicons updated:

+ +

07 September 2020

DeltaFire15 updated:

GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ba87bb6648..f8f47e456e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -27261,3 +27261,17 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. harm them a bit, one will heal the target a small bit - How nice! Last one will give them a few statis affects like a taser bolt but without as much power or tasing affect +2020-09-08: + Ghommie: + - spellcheck: fixed names of the Electrical Toolbox goodie pack and green croptop + christmas suit. + - bugfix: Fixed turf visuals for real. Original PR by AnturK on tgstation. + KeRSedChaplain: + - soundadd: added borg_deathsound.ogg and android_scream.ogg + silicons: + - balance: meteor waves now have a static 5 minute timer. +2020-09-09: + Putnam3145: + - bugfix: Made superconductivity work for the first time literally ever. + timothyteakettle: + - bugfix: accents work better diff --git a/html/changelogs/AutoChangeLog-pr-13378.yml b/html/changelogs/AutoChangeLog-pr-13378.yml new file mode 100644 index 0000000000..c367629476 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13378.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - balance: "Superconducting turfs now can't go below 0 celsius." diff --git a/sound/voice/borg_deathsound.ogg b/sound/voice/borg_deathsound.ogg new file mode 100644 index 0000000000..bb11022abe Binary files /dev/null and b/sound/voice/borg_deathsound.ogg differ diff --git a/sound/voice/scream/android_scream.ogg b/sound/voice/scream/android_scream.ogg new file mode 100644 index 0000000000..d3f179a84a Binary files /dev/null and b/sound/voice/scream/android_scream.ogg differ