From 6b438412bf1543d996df10d20a18215a4cd46433 Mon Sep 17 00:00:00 2001 From: listerla <57296132+listerla@users.noreply.github.com> Date: Tue, 22 Mar 2022 11:31:22 -0400 Subject: [PATCH 01/30] Ports Vaurca autohiss from Aurora to Zaddat --- code/modules/mob/living/autohiss.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 7a3999ea36..a51616a56f 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -55,6 +55,18 @@ ) autohiss_exempt = list(LANGUAGE_SIIK,LANGUAGE_AKHANI) +/datum/species/zaddat + autohiss_basic_map = list( + "f" = list("v","vh"), + "ph" = list("v", "vh") + ) + autohiss_extra_map = list( + "s" = list("z", "zz", "zzz"), + "ce" = list("z", "zz"), + "ci" = list("z", "zz"), + "v" = list("vv", "vvv") + ) + autohiss_exempt = list(LANGUAGE_ZADDAT) /datum/species/proc/handle_autohiss(message, datum/language/lang, mode) if(!autohiss_basic_map) From 19b59f306b967977a222ddfd6db24fcbe7057588 Mon Sep 17 00:00:00 2001 From: Verkister Date: Thu, 31 Mar 2022 20:29:43 +0300 Subject: [PATCH 02/30] Fixes runtime with turrets and viscerators Fixes viscerators runtiming their ally check when shot by something that's not a mob. --- .../living/simple_mob/subtypes/mechanical/viscerator.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm index 915c14e9f7..6c1d5b738b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/viscerator.dm @@ -57,14 +57,14 @@ // Used for a special grenade, to ensure they don't attack the wrong thing. /mob/living/simple_mob/mechanical/viscerator/mercenary/IIsAlly(mob/living/L) . = ..() - if(!.) // Not friendly, see if they're a baddie first. + if(!. && isliving(L)) // Not friendly, see if they're a baddie first. if(L.mind && mercs.is_antagonist(L.mind)) return TRUE // Similar to above but for raiders. /mob/living/simple_mob/mechanical/viscerator/raider/IIsAlly(mob/living/L) . = ..() - if(!.) // Not friendly, see if they're a baddie first. + if(!. && isliving(L)) // Not friendly, see if they're a baddie first. if(L.mind && raiders.is_antagonist(L.mind)) return TRUE @@ -83,7 +83,7 @@ /mob/living/simple_mob/mechanical/viscerator/station/IIsAlly(mob/living/L) . = ..() - if(!.) + if(!. && isliving(L)) if(isrobot(L)) // They ignore synths. return TRUE if(istype(L, /mob/living/simple_mob/mechanical/ward/monitor/crew)) // Also ignore friendly monitor wards @@ -97,4 +97,4 @@ movement_cooldown = 0.5 /decl/mob_organ_names/viscerator - hit_zones = list("chassis", "rotor blades", "sensor array") \ No newline at end of file + hit_zones = list("chassis", "rotor blades", "sensor array") From 56a8fd834e7fb525c56e2a09cbc98b8754aad727 Mon Sep 17 00:00:00 2001 From: atermonera Date: Sat, 2 Apr 2022 19:13:04 -0800 Subject: [PATCH 03/30] C4 still explodes if the turf its placed upon changes --- code/datums/wires/explosive.dm | 2 +- code/game/objects/items/weapons/explosives.dm | 18 ++++++++++++------ code/modules/power/cells/esoteric_cells.dm | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index 52b0150b66..f523a0ee99 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -31,4 +31,4 @@ /datum/wires/explosive/c4/explode() var/obj/item/weapon/plastique/P = holder - P.explode(get_turf(P)) + P.detonate(get_turf(P)) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 75411925a8..07743ddff5 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -11,6 +11,7 @@ var/datum/wires/explosive/c4/wires = null var/timer = 10 var/atom/target = null + var/list/location = list() var/open_panel = 0 var/image_overlay = null var/blast_dev = -1 @@ -54,9 +55,11 @@ to_chat(user, "Planting explosives...") user.do_attack_animation(target) - if(do_after(user, 50) && in_range(user, target)) + if(do_after(user, 5 SECONDS) && in_range(user, target)) user.drop_item() src.target = target + var/turf/T = get_turf(target) + location = list(T.x, T.y, T.z) // Saving coordinates in case the reference becomes invalid loc = null if (ismob(target)) @@ -68,16 +71,19 @@ target.overlays += image_overlay to_chat(user, "Bomb has been planted. Timer counting down from [timer].") - spawn(timer*10) - explode(get_turf(target)) + addtimer(CALLBACK(src, .proc/detonate), timer SECONDS) -/obj/item/weapon/plastique/proc/explode(var/location) +/obj/item/weapon/plastique/proc/detonate() if(!target) target = get_atom_on_turf(src) if(!target) target = src - if(location) - explosion(location, blast_dev, blast_heavy, blast_light, blast_flash) + var/turf/T = get_turf(src) + if(!istype(T) && location.len == 3) + T = locate(location[1], location[2], location[3]) + + if(istype(T)) + explosion(T, blast_dev, blast_heavy, blast_light, blast_flash) if(target) if (istype(target, /turf/simulated/wall)) diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm index b9bb06bf68..830c964b6b 100644 --- a/code/modules/power/cells/esoteric_cells.dm +++ b/code/modules/power/cells/esoteric_cells.dm @@ -69,6 +69,6 @@ C4.visible_message("The current fries \the [C4]!") if(prob(10)) - C4.explode(get_turf(src)) + C4.detonate() else qdel(C4) From 4a2e2cfae3675fc4bdb95417a0efd935a5e70fda Mon Sep 17 00:00:00 2001 From: atermonera Date: Sat, 2 Apr 2022 19:24:14 -0800 Subject: [PATCH 04/30] Spiderlings die if they have 0 health --- code/game/objects/effects/spiders.dm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 660065352f..4d7a34eb16 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -57,9 +57,12 @@ health -= Proj.get_structure_damage() healthcheck() +/obj/effect/spider/proc/die() + qdel(src) + /obj/effect/spider/proc/healthcheck() if(health <= 0) - qdel(src) + die() /obj/effect/spider/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) if(exposed_temperature > 300 + T0C) @@ -175,13 +178,14 @@ /obj/effect/spider/spiderling/proc/die() visible_message("[src] dies!") new /obj/effect/decal/cleanable/spiderling_remains(src.loc) - qdel(src) + ..() /obj/effect/spider/spiderling/healthcheck() if(health <= 0) die() /obj/effect/spider/spiderling/process() + healthcheck() if(travelling_in_vent) if(istype(src.loc, /turf)) travelling_in_vent = 0 From fd30a1a6f6a6f173d9a221f203c8293235b0311c Mon Sep 17 00:00:00 2001 From: atermonera Date: Sat, 2 Apr 2022 19:34:47 -0800 Subject: [PATCH 05/30] Removes ERT Rangers items from loadout --- code/modules/clothing/head/hardhat.dm | 34 ------------------ code/modules/clothing/head/misc.dm | 38 +++++++++++++++++++- code/modules/clothing/shoes/miscellaneous.dm | 16 ++++----- code/modules/clothing/under/miscellaneous.dm | 16 ++++----- 4 files changed, 53 insertions(+), 51 deletions(-) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index f974c321c0..c78749f6f8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -37,37 +37,3 @@ /obj/item/clothing/head/hardhat/dblue name = "blue hard hat" icon_state = "hardhat0_dblue" - -/obj/item/clothing/head/hardhat/ranger - var/hatcolor = "white" - name = "ranger helmet" - desc = "A special helmet designed for the Go Go ERT-Rangers, able to withstand a pressureless environment, filter gas and provide air. It has thermal vision and sometimes \ - mesons to find breaches, as well as an integrated radio... well, only in the show, of course. This one has none of those features- it just has a flashlight instead." - icon = 'icons/obj/clothing/ranger.dmi' - icon_state = "ranger_helmet" - light_overlay = "helmet_light" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR - -/obj/item/clothing/head/hardhat/ranger/Initialize() - . = ..() - if(icon_state == "ranger_helmet") - name = "[hatcolor] ranger helmet" - icon_state = "[hatcolor]_ranger_helmet" - -/obj/item/clothing/head/hardhat/ranger/black - hatcolor = "black" - -/obj/item/clothing/head/hardhat/ranger/pink - hatcolor = "pink" - -/obj/item/clothing/head/hardhat/ranger/green - hatcolor = "green" - -/obj/item/clothing/head/hardhat/ranger/cyan - hatcolor = "cyan" - -/obj/item/clothing/head/hardhat/ranger/orange - hatcolor = "orange" - -/obj/item/clothing/head/hardhat/ranger/yellow - hatcolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index ba20ceb2f5..5f1abd977e 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -502,4 +502,40 @@ desc = "A marine helmet prop from the popular game 'Ruin'." icon_state = "marine" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR - body_parts_covered = HEAD|FACE|EYES \ No newline at end of file + body_parts_covered = HEAD|FACE|EYES + +/obj/item/clothing/head/ranger + var/hatcolor = "white" + name = "ranger helmet" + desc = "A special helmet designed for the Go Go ERT-Rangers, able to withstand a pressureless environment, filter gas and provide air. It has thermal vision and sometimes \ + mesons to find breaches, as well as an integrated radio... well, only in the show, of course." + icon = 'icons/obj/clothing/ranger.dmi' + icon_state = "ranger_helmet" + light_overlay = "helmet_light" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR + drop_sound = 'sound/items/drop/helm.ogg' + pickup_sound = 'sound/items/pickup/helm.ogg' + +/obj/item/clothing/head/ranger/Initialize() + . = ..() + if(icon_state == "ranger_helmet") + name = "[hatcolor] ranger helmet" + icon_state = "[hatcolor]_ranger_helmet" + +/obj/item/clothing/head/ranger/black + hatcolor = "black" + +/obj/item/clothing/head/ranger/pink + hatcolor = "pink" + +/obj/item/clothing/head/ranger/green + hatcolor = "green" + +/obj/item/clothing/head/ranger/cyan + hatcolor = "cyan" + +/obj/item/clothing/head/ranger/orange + hatcolor = "orange" + +/obj/item/clothing/head/ranger/yellow + hatcolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index b8151b7743..e264d8887d 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -174,7 +174,7 @@ drop_sound = 'sound/items/drop/clothing.ogg' pickup_sound = 'sound/items/pickup/clothing.ogg' -/obj/item/clothing/shoes/boots/ranger +/obj/item/clothing/shoes/ranger var/bootcolor = "white" name = "ranger boots" desc = "The Rangers special lightweight hybrid magboots-jetboots perfect for EVA. If only these functions were so easy to copy in reality.\ @@ -182,26 +182,26 @@ icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_boots" -/obj/item/clothing/shoes/boots/ranger/Initialize() +/obj/item/clothing/shoes/ranger/Initialize() . = ..() if(icon_state == "ranger_boots") name = "[bootcolor] ranger boots" icon_state = "[bootcolor]_ranger_boots" -/obj/item/clothing/shoes/boots/ranger/black +/obj/item/clothing/shoes/ranger/black bootcolor = "black" -/obj/item/clothing/shoes/boots/ranger/pink +/obj/item/clothing/shoes/ranger/pink bootcolor = "pink" -/obj/item/clothing/shoes/boots/ranger/green +/obj/item/clothing/shoes/ranger/green bootcolor = "green" -/obj/item/clothing/shoes/boots/ranger/cyan +/obj/item/clothing/shoes/ranger/cyan bootcolor = "cyan" -/obj/item/clothing/shoes/boots/ranger/orange +/obj/item/clothing/shoes/ranger/orange bootcolor = "orange" -/obj/item/clothing/shoes/boots/ranger/yellow +/obj/item/clothing/shoes/ranger/yellow bootcolor = "yellow" \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index bcca912dcc..6a20a80d3e 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -1275,7 +1275,7 @@ Uniforms and such //Ranger uniforms //On-mob sprites go in icons\mob\uniform.dmi with the format "white_ranger_uniform_s" - with 'white' replaced with green, cyan, etc... of course! Note the _s - this is not optional. //Item sprites go in icons\obj\clothing\ranger.dmi with the format "white_ranger_uniform" -/obj/item/clothing/under/color/ranger +/obj/item/clothing/under/ranger var/unicolor = "white" name = "ranger uniform" desc = "Made from a space-proof fibre and tight fitting, this uniform usually gives the agile Rangers all kinds of protection while not inhibiting their movement. \ @@ -1283,26 +1283,26 @@ Uniforms and such icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_uniform" -/obj/item/clothing/under/color/ranger/Initialize() +/obj/item/clothing/under/ranger/Initialize() . = ..() if(icon_state == "ranger_uniform") //allows for custom items name = "[unicolor] ranger uniform" icon_state = "[unicolor]_ranger_uniform" -/obj/item/clothing/under/color/ranger/black +/obj/item/clothing/under/ranger/black unicolor = "black" -/obj/item/clothing/under/color/ranger/pink +/obj/item/clothing/under/ranger/pink unicolor = "pink" -/obj/item/clothing/under/color/ranger/green +/obj/item/clothing/under/ranger/green unicolor = "green" -/obj/item/clothing/under/color/ranger/cyan +/obj/item/clothing/under/ranger/cyan unicolor = "cyan" -/obj/item/clothing/under/color/ranger/orange +/obj/item/clothing/under/ranger/orange unicolor = "orange" -/obj/item/clothing/under/color/ranger/yellow +/obj/item/clothing/under/ranger/yellow unicolor = "yellow" \ No newline at end of file From 7eedbedba569cc08bb447da4dfddcbebe02c1228 Mon Sep 17 00:00:00 2001 From: spookerton Date: Sun, 27 Mar 2022 17:32:31 +0100 Subject: [PATCH 06/30] removes some legacy procs, adds some other procs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NUFC removed add_lspace — unused removed add_tspace — unused removed invertHTML — unused removed hsl2rgb — unimplemented removed hex2num — replaced with define removed num2hex — replaced with define removed add_zero — replaced with pad_left removed add_zero2 — replaced with pad_left removes hex2rgb — replaced with behavior of rgb2num() removes hex2rgb_r — replaced with behavior of rgb2num() removes hex2rgb_g — replaced with behavior of rgb2num() removes hex2rgb_b — replaced with behavior of rgb2num() removes assorted inline list(rgb) > hex — replaced with behavior of rgb() removes assorted inline rand > hex — replace with random_hex_text added hex2num define added num2hex define added random_hex_text added generate_padding added pad_left added pad_right --- code/_helpers/text.dm | 65 +++++++++++++---- code/_helpers/time.dm | 4 +- code/_helpers/type2type.dm | 71 ------------------- code/_helpers/unsorted.dm | 26 +------ code/_macros.dm | 9 +++ .../emergency_shuttle_controller.dm | 4 +- code/datums/datacore.dm | 5 +- code/game/dna/dna2.dm | 4 +- code/game/dna/dna2_helpers.dm | 9 --- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/status_display.dm | 6 +- code/modules/admin/player_panel.dm | 4 +- code/modules/events/money_hacker.dm | 2 +- .../event2/events/command/money_hacker.dm | 2 +- code/modules/hydroponics/seed_controller.dm | 9 ++- .../human/species/species_shapeshift.dm | 2 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/silicon/pai/pai.dm | 2 +- code/modules/mob/mob_helpers.dm | 7 -- code/modules/organs/internal/eyes.dm | 2 +- code/modules/planet/sif.dm | 4 +- code/modules/shieldgen/directional_shield.dm | 4 +- code/modules/tgui/modules/communications.dm | 2 +- code/modules/virus2/disease2.dm | 10 +-- code/modules/xenobio2/controller.dm | 9 ++- 25 files changed, 99 insertions(+), 167 deletions(-) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 770881e49a..00648bfb2e 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -213,23 +213,58 @@ t = replacetext(t, char, repl_chars[char]) return t -//Adds 'u' number of zeros ahead of the text 't' -/proc/add_zero(t, u) - while (length(t) < u) - t = "0[t]" - return t -//Adds 'u' number of spaces ahead of the text 't' -/proc/add_lspace(t, u) - while(length(t) < u) - t = " [t]" - return t +/// Returns a string of hexadecimal characters of length size, uppercased if uppercase is truthy +/proc/random_hex_text(size, uppercase) + if (!ISINTEGER(size)) + return + var/list/result = list() + for (var/i = size to 1 step -1) + result += num2hex(rand(0, 0xF)) + result = jointext(result, null) + if (uppercase) + return uppertext(result) + return result -//Adds 'u' number of spaces behind the text 't' -/proc/add_tspace(t, u) - while(length(t) < u) - t = "[t] " - return t + +/// Builds a string of padding repeated until its character count meets or exceeds size +/proc/generate_padding(size, padding) + var/padding_size = length_char(padding) + if (!padding_size) + return "" + var/padding_count = CEILING(size / padding_size, 1) + var/list/result = list() + for (var/i = padding_count to 1 step -1) + result += padding // pow2 strategies could be used here at the cost of complexity + return result.Join(null) + + +/// Pads the matter of padding onto the start of text until the result length is size +/proc/pad_left(text, size, padding) + var/text_length = length_char(text) + if (text_length >= size) + return text + if (!text_length) + text = "" + var/result = "[generate_padding(size - text_length, padding)][text]" + var/length_difference = length_char(result) - size + if (!length_difference) + return result + return copytext_char(result, length_difference + 1) + + +/// Pads the matter of padding onto the start of text until the result length is size +/proc/pad_right(text, size, padding) + var/text_length = length_char(text) + if (text_length >= size) + return text + if (!text_length) + text = "" + var/result = "[text][generate_padding(size - text_length, padding)]" + var/length_difference = length_char(result) - size + if (!length_difference) + return result + return copytext_char(result, 1, -length_difference) //Returns a string with reserved characters and spaces before the first letter removed /proc/trim_left(text) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 0dc857baea..212d17fcc5 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -110,8 +110,8 @@ GLOBAL_VAR_INIT(round_start_time, 0) var/mins = round((mills % 36000) / 600) var/hours = round(mills / 36000) - mins = mins < 10 ? add_zero(mins, 1) : mins - hours = hours < 10 ? add_zero(hours, 1) : hours + mins = pad_left("[mins]", 2, "0") + hours = pad_left("[hours]", 2, "0") last_round_duration = "[hours]:[mins]" next_duration_update = world.time + 1 MINUTES diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm index 3e6c3e9854..f1fff0ff74 100644 --- a/code/_helpers/type2type.dm +++ b/code/_helpers/type2type.dm @@ -1,55 +1,3 @@ -/* - * Holds procs designed to change one type of value, into another. - * Contains: - * hex2num & num2hex - * text2list & list2text - * file2list - * angle2dir - * angle2text - * worldtime2text - */ - -// Returns an integer given a hexadecimal number string as input. -/proc/hex2num(hex) - if (!istext(hex)) - return - - var/num = 0 - var/power = 1 - var/i = length(hex) - - while (i) - var/char = text2ascii(hex, i) - switch(char) - if(48) // 0 -- do nothing - if(49 to 57) num += (char - 48) * power // 1-9 - if(97, 65) num += power * 10 // A - if(98, 66) num += power * 11 // B - if(99, 67) num += power * 12 // C - if(100, 68) num += power * 13 // D - if(101, 69) num += power * 14 // E - if(102, 70) num += power * 15 // F - else - return - power *= 16 - i-- - return num - -// Returns the hex value of a number given a value assumed to be a base-ten value -/proc/num2hex(num, padlength) - var/global/list/hexdigits = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F") - - . = "" - while(num > 0) - var/hexdigit = hexdigits[(num & 0xF) + 1] - . = "[hexdigit][.]" - num >>= 4 //go to the next half-byte - - //pad with zeroes - var/left = padlength - length(.) - while (left-- > 0) - . = "0[.]" - /proc/text2numlist(text, delimiter="\n") var/list/num_list = list() for(var/x in splittext(text, delimiter)) @@ -151,25 +99,6 @@ if (rights & R_EVENT) . += "[seperator]+EVENT" return . -// Converts a hexadecimal color (e.g. #FF0050) to a list of numbers for red, green, and blue (e.g. list(255,0,80) ). -/proc/hex2rgb(hex) - // Strips the starting #, in case this is ever supplied without one, so everything doesn't break. - if(findtext(hex,"#",1,2)) - hex = copytext(hex, 2) - return list(hex2rgb_r(hex), hex2rgb_g(hex), hex2rgb_b(hex)) - -// The three procs below require that the '#' part of the hex be stripped, which hex2rgb() does automatically. -/proc/hex2rgb_r(hex) - var/hex_to_work_on = copytext(hex,1,3) - return hex2num(hex_to_work_on) - -/proc/hex2rgb_g(hex) - var/hex_to_work_on = copytext(hex,3,5) - return hex2num(hex_to_work_on) - -/proc/hex2rgb_b(hex) - var/hex_to_work_on = copytext(hex,5,7) - return hex2num(hex_to_work_on) // heat2color functions. Adapted from: http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ /proc/heat2color(temp) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 9884581036..91bf996be7 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -14,30 +14,6 @@ locate(min(CENTER.x+(RADIUS),world.maxx), min(CENTER.y+(RADIUS),world.maxy), CENTER.z) \ ) -//Inverts the colour of an HTML string -/proc/invertHTML(HTMLstring) - - if (!( istext(HTMLstring) )) - CRASH("Given non-text argument!") - else - if (length(HTMLstring) != 7) - CRASH("Given non-HTML argument!") - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - var/r = hex2num(textr) - var/g = hex2num(textg) - var/b = hex2num(textb) - textr = num2hex(255 - r) - textg = num2hex(255 - g) - textb = num2hex(255 - b) - if (length(textr) < 2) - textr = text("0[]", textr) - if (length(textg) < 2) - textr = text("0[]", textg) - if (length(textb) < 2) - textr = text("0[]", textb) - return text("#[][][]", textr, textg, textb) //Returns the middle-most value /proc/dd_range(var/low, var/high, var/num) @@ -1279,7 +1255,7 @@ var/list/WALLITEMS = list( return colour /proc/color_square(red, green, blue, hex) - var/color = hex ? hex : "#[num2hex(red, 2)][num2hex(green, 2)][num2hex(blue, 2)]" + var/color = hex || rgb(red, green, blue) return "___" var/mob/dview/dview_mob = new diff --git a/code/_macros.dm b/code/_macros.dm index d122d9045f..a725086194 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -38,6 +38,15 @@ #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) + +/// Given a hexadeximal text, returns the corresponding integer +#define hex2num(hex) (text2num(hex, 16) || 0) + + +/// Given an integer number, returns a hexadecimal representation +#define num2hex(num) num2text(num, 1, 16) + + #define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } #define WORLD_ICON_SIZE 32 //Needed for the R-UST port diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index fde8227376..191d4d89f5 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -228,14 +228,14 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle = new if (online()) if (shuttle.has_arrive_time()) var/timeleft = emergency_shuttle.estimate_arrival_time() - return "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]" + return "ETA-[(timeleft / 60) % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]" if (waiting_to_leave()) if (shuttle.moving_status == SHUTTLE_WARMUP) return "Departing..." var/timeleft = emergency_shuttle.estimate_launch_time() - return "ETD-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]" + return "ETD-[(timeleft / 60) % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]" return "" /* diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 1aaf8d66f3..2d957ecf38 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -416,7 +416,8 @@ var/global/list/PDA_Manifest = list() return /proc/generate_record_id() - return add_zero(num2hex(rand(1, 65535)), 4) //no point generating higher numbers because of the limitations of num2hex + return "000[random_hex_text(3, TRUE)]" + /datum/datacore/proc/CreateGeneralRecord(var/mob/living/carbon/human/H, var/id, var/hidden) ResetPDAManifest() @@ -431,7 +432,7 @@ var/global/list/PDA_Manifest = list() side = icon('html/images/no_image32.png') if(!id) - id = text("[]", add_zero(num2hex(rand(1, 65536)), 4)) + id = generate_record_id() var/datum/data/record/G = new /datum/data/record() G.name = "Employee Record #[id]" G.fields["name"] = "New Record" diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 7a8d2f5d89..430145671f 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -328,8 +328,8 @@ var/global/list/datum/dna/gene/dna_genes[0] SetSEBlock(block,newBlock,defer) -/proc/EncodeDNABlock(var/value) - return add_zero2(num2hex(value,1), 3) +/proc/EncodeDNABlock(value) + return pad_left(num2hex(value), 3, "0") /datum/dna/proc/UpdateUI() src.uni_identity="" diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 2287d3477c..2b7b00f303 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -2,15 +2,6 @@ // Helpers for DNA2 ///////////////////////////// -// Pads 0s to t until length == u -/proc/add_zero2(t, u) - var/temp1 - while (length(t) < u) - t = "0[t]" - temp1 = t - if (length(t) > u) - temp1 = copytext(t,2,u+1) - return temp1 // DNA Gene activation boundaries, see dna2.dm. // Returns a list object with 4 numbers. diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index f32858d8fa..8a002dc6b4 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -224,7 +224,7 @@ if ("issue") if (giver) - var/number = add_zero("[rand(0,9999)]", 4) + var/number = pad_left("[rand(1, 9999)]", 4, "0") var/entry = "\[[stationtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: " for (var/i=1 to accesses.len) var/A = accesses[i] diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index c7cb351e70..1d486ab5e3 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -210,7 +210,7 @@ var/timeleft = emergency_shuttle.estimate_arrival_time() if(timeleft < 0) return "" - return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + return "[pad_left(num2text(timeleft / 60 % 60), 2, "0")]:[pad_left(num2text(timeleft % 60), 2, "0")]" /obj/machinery/status_display/proc/get_shuttle_timer_departure() if(!emergency_shuttle) @@ -218,7 +218,7 @@ var/timeleft = emergency_shuttle.estimate_launch_time() if(timeleft < 0) return "" - return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + return "[pad_left(num2text(timeleft / 60 % 60), 2, "0")]:[pad_left(num2text(timeleft % 60), 2, "0")]" /obj/machinery/status_display/proc/get_supply_shuttle_timer() var/datum/shuttle/autodock/ferry/supply/shuttle = SSsupply.shuttle @@ -229,7 +229,7 @@ var/timeleft = round((shuttle.arrive_time - world.time) / 10,1) if(timeleft < 0) return "Late" - return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]" + return "[pad_left(num2text(timeleft / 60 % 60), 2, "0")]:[pad_left(num2text(timeleft % 60), 2, "0")]" return "" /obj/machinery/status_display/proc/remove_display() diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 459d5b2bc7..c309ebdf53 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -393,11 +393,11 @@ else if (emergency_shuttle.wait_for_launch) var/timeleft = emergency_shuttle.estimate_launch_time() - dat += "ETL: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" + dat += "ETL: [(timeleft / 60) % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]
" else if (emergency_shuttle.shuttle.has_arrive_time()) var/timeleft = emergency_shuttle.estimate_arrival_time() - dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" + dat += "ETA: [(timeleft / 60) % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]
" dat += "Send Back
" if (emergency_shuttle.shuttle.moving_status == SHUTTLE_WARMUP) diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 025bcc6901..86f7be0e49 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -52,7 +52,7 @@ GLOBAL_VAR_INIT(account_hack_attempted, 0) var/date2 = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], [rand(1000,3000)]" T.date = pick("", current_date_string, date1, date2) var/time1 = rand(0, 99999999) - var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" + var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? pad_left("[time1 / 600 % 60]", 2, "0") : time1 / 600 % 60]" T.time = pick("", stationtime2text(), time2) T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") diff --git a/code/modules/gamemaster/event2/events/command/money_hacker.dm b/code/modules/gamemaster/event2/events/command/money_hacker.dm index b365fdaef2..a0831495a8 100644 --- a/code/modules/gamemaster/event2/events/command/money_hacker.dm +++ b/code/modules/gamemaster/event2/events/command/money_hacker.dm @@ -103,7 +103,7 @@ T.date = pick("", current_date_string, date1, date2,"Nowhen") var/time1 = rand(0, 99999999) - var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" + var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? pad_left("[time1 / 600 % 60]", 2, "0") : time1 / 600 % 60]" T.time = pick("", stationtime2text(), time2, "Never") T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD","Angessa's Pearl","Nowhere") diff --git a/code/modules/hydroponics/seed_controller.dm b/code/modules/hydroponics/seed_controller.dm index 85c6a5f51e..6a5012f514 100644 --- a/code/modules/hydroponics/seed_controller.dm +++ b/code/modules/hydroponics/seed_controller.dm @@ -97,11 +97,10 @@ var/global/datum/controller/plants/plant_controller // Set in New(). var/list/plant_traits = ALL_GENES while(plant_traits && plant_traits.len) var/gene_tag = pick(plant_traits) - var/gene_mask = "[uppertext(num2hex(rand(0,255), 2))]" - - while(gene_mask in used_masks) - gene_mask = "[uppertext(num2hex(rand(0,255), 2))]" - + var/gene_mask + do + gene_mask = random_hex_text(2, TRUE) + while (gene_mask in used_masks) var/decl/plantgene/G for(var/D in gene_datums) diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index 79d19b66db..1691d87bb2 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -322,7 +322,7 @@ var/list/wrapped_species_by_ref = list() /mob/living/carbon/human/proc/shapeshifter_set_eye_color(var/new_eyes) - var/list/new_color_rgb_list = hex2rgb(new_eyes) + var/list/new_color_rgb_list = rgb2num(new_eyes) // First, update mob vars. r_eyes = new_color_rgb_list[1] g_eyes = new_color_rgb_list[2] diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b0373cbcef..67a57e4f33 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -938,7 +938,7 @@ var/B = 0 for(var/C in colors_to_blend) - var/RGB = hex2rgb(C) + var/RGB = rgb2num(C) R = between(0, R + RGB[1], 255) G = between(0, G + RGB[2], 255) B = between(0, B + RGB[3], 255) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index fcc1fd62df..dff56aef72 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -133,7 +133,7 @@ /mob/living/silicon/pai/proc/show_silenced() if(src.silence_time) var/timeleft = round((silence_time - world.timeofday)/10 ,1) - stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]") + stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]") /mob/living/silicon/pai/Stat() diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index c908b7952b..2383700ed3 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -86,13 +86,6 @@ return check_rights(R_ADMIN|R_EVENT, 0, user) != 0 -/proc/hsl2rgb(h, s, l) - return //TODO: Implement - -/* - Miss Chance -*/ - /proc/check_zone(zone) if(!zone) return BP_TORSO switch(zone) diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index e7e8c5f135..18307d69a9 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -40,7 +40,7 @@ var/new_color = input("Pick a new color for your eyes.","Eye Color", current_color) as null|color if(new_color && owner) // input() supplies us with a hex color, which we can't use, so we convert it to rbg values. - var/list/new_color_rgb_list = hex2rgb(new_color) + var/list/new_color_rgb_list = rgb2num(new_color) // First, update mob vars. owner.r_eyes = new_color_rgb_list[1] owner.g_eyes = new_color_rgb_list[2] diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index b418a42db0..867fc829f0 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -81,12 +81,12 @@ var/datum/planet/sif/planet_sif = null if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color) new_color = weather_holder.current_weather.light_color else - var/list/low_color_list = hex2rgb(low_color) + var/list/low_color_list = rgb2num(low_color) var/low_r = low_color_list[1] var/low_g = low_color_list[2] var/low_b = low_color_list[3] - var/list/high_color_list = hex2rgb(high_color) + var/list/high_color_list = rgb2num(high_color) var/high_r = high_color_list[1] var/high_g = high_color_list[2] var/high_b = high_color_list[3] diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index 469adeb887..c383ebd2f3 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -158,12 +158,12 @@ // This is done at the projector instead of the shields themselves to avoid needing to calculate this more than once every update. var/interpolate_weight = shield_health / max_shield_health - var/list/low_color_list = hex2rgb(low_color) + var/list/low_color_list = rgb2num(low_color) var/low_r = low_color_list[1] var/low_g = low_color_list[2] var/low_b = low_color_list[3] - var/list/high_color_list = hex2rgb(high_color) + var/list/high_color_list = rgb2num(high_color) var/high_r = high_color_list[1] var/high_g = high_color_list[2] var/high_b = high_color_list[3] diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm index d30f3a8a17..8ae0a48435 100644 --- a/code/modules/tgui/modules/communications.dm +++ b/code/modules/tgui/modules/communications.dm @@ -152,7 +152,7 @@ if(emergency_shuttle.has_eta()) var/timeleft = emergency_shuttle.estimate_arrival_time() data["esc_status"] = emergency_shuttle.online() ? "ETA:" : "RECALLING:" - data["esc_status"] += " [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]" + data["esc_status"] += " [timeleft / 60 % 60]:[pad_left(num2text(timeleft % 60), 2, "0")]" return data /datum/tgui_module/communications/proc/setCurrentMessage(mob/user, value) diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 08d52b1706..c6932b4df6 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -14,7 +14,7 @@ var/resistance = 10 // % chance a disease will resist cure, up to 100 /datum/disease2/disease/New() - uniqueID = rand(0,10000) + uniqueID = rand(1, 9999) ..() /datum/disease2/disease/proc/makerandom(var/severity=1) @@ -25,7 +25,7 @@ holder.getrandomeffect(severity, excludetypes) excludetypes += holder.effect.type effects += holder - uniqueID = rand(0,10000) + uniqueID = rand(1, 9999) switch(severity) if(1) infectionchance = 1 @@ -135,13 +135,13 @@ BITSET(mob.hud_updateflag, STATUS_HUD) /datum/disease2/disease/proc/minormutate() - //uniqueID = rand(0,10000) + //uniqueID = rand(1, 9999) var/datum/disease2/effectholder/holder = pick(effects) holder.minormutate() //infectionchance = min(50,infectionchance + rand(0,10)) /datum/disease2/disease/proc/majormutate() - uniqueID = rand(0,10000) + uniqueID = rand(1, 9999) var/datum/disease2/effectholder/holder = pick(effects) var/list/exclude = list() for(var/datum/disease2/effectholder/D in effects) @@ -208,7 +208,7 @@ var/global/list/virusDB = list() /datum/disease2/disease/proc/name() - .= "stamm #[add_zero("[uniqueID]", 4)]" + .= "stamm #[pad_left(uniqueID, 8, "0")]" if ("[uniqueID]" in virusDB) var/datum/data/record/V = virusDB["[uniqueID]"] .= V.fields["name"] diff --git a/code/modules/xenobio2/controller.dm b/code/modules/xenobio2/controller.dm index 584d820cb2..22f5e70b3e 100644 --- a/code/modules/xenobio2/controller.dm +++ b/code/modules/xenobio2/controller.dm @@ -34,11 +34,10 @@ var/global/datum/controller/xenobio/xenobio_controller // Set in New(). var/list/xenobio_traits = ALL_XENO_GENES while(xenobio_traits && xenobio_traits.len) var/gene_tag = pick(xenobio_traits) - var/gene_mask = "[uppertext(num2hex(rand(0,255), 2))]" - - while(gene_mask in used_masks) - gene_mask = "[uppertext(num2hex(rand(0,255), 2))]" - + var/gene_mask + do + gene_mask = random_hex_text(2, TRUE) + while (gene_mask in used_masks) used_masks += gene_mask xenobio_traits -= gene_tag gene_tag_masks[gene_tag] = gene_mask \ No newline at end of file From 4368e990557348b6550d04026ec32030e755b576 Mon Sep 17 00:00:00 2001 From: atermonera Date: Mon, 4 Apr 2022 23:02:21 -0800 Subject: [PATCH 07/30] fiddlybits --- code/datums/wires/explosive.dm | 3 ++- code/game/objects/items/weapons/explosives.dm | 21 +++++++++++++------ code/modules/power/cells/esoteric_cells.dm | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm index f523a0ee99..234f75a9e8 100644 --- a/code/datums/wires/explosive.dm +++ b/code/datums/wires/explosive.dm @@ -31,4 +31,5 @@ /datum/wires/explosive/c4/explode() var/obj/item/weapon/plastique/P = holder - P.detonate(get_turf(P)) + P.set_target(get_turf(P)) + P.detonate() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 07743ddff5..a5e647547e 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -57,9 +57,7 @@ if(do_after(user, 5 SECONDS) && in_range(user, target)) user.drop_item() - src.target = target - var/turf/T = get_turf(target) - location = list(T.x, T.y, T.z) // Saving coordinates in case the reference becomes invalid + set_target(target) // Saving coordinates in case the reference becomes invalid loc = null if (ismob(target)) @@ -73,16 +71,27 @@ to_chat(user, "Bomb has been planted. Timer counting down from [timer].") addtimer(CALLBACK(src, .proc/detonate), timer SECONDS) +/obj/item/weapon/plastique/proc/set_target(var/atom/T) + if(!isatom(T)) + return + target = T + location = list(T.x, T.y, T.z) + /obj/item/weapon/plastique/proc/detonate() if(!target) target = get_atom_on_turf(src) if(!target) target = src - var/turf/T = get_turf(src) - if(!istype(T) && location.len == 3) + + var/turf/T = null + if(isturf(get_turf(target)) + T = get_turf(target) + if(LAZYLEN(location) == 3) T = locate(location[1], location[2], location[3]) + else + T = get_turf(target) - if(istype(T)) + if(isturf(T)) explosion(T, blast_dev, blast_heavy, blast_light, blast_flash) if(target) diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm index 830c964b6b..346d3b3ad1 100644 --- a/code/modules/power/cells/esoteric_cells.dm +++ b/code/modules/power/cells/esoteric_cells.dm @@ -69,6 +69,7 @@ C4.visible_message("The current fries \the [C4]!") if(prob(10)) + C4.set_target(src) C4.detonate() else qdel(C4) From 859f35ba02f2718f0e0fce7540236590c4a571a7 Mon Sep 17 00:00:00 2001 From: atermonera Date: Sat, 2 Apr 2022 20:02:19 -0800 Subject: [PATCH 08/30] typo --- code/game/objects/effects/spiders.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4d7a34eb16..dcb04b4d31 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -175,7 +175,7 @@ else ..() -/obj/effect/spider/spiderling/proc/die() +/obj/effect/spider/spiderling/die() visible_message("[src] dies!") new /obj/effect/decal/cleanable/spiderling_remains(src.loc) ..() From ce72d7a54440726c031363d34cfe024ff51c45f8 Mon Sep 17 00:00:00 2001 From: atermonera Date: Sat, 2 Apr 2022 21:45:01 -0800 Subject: [PATCH 09/30] git commit -m "Spiderlings can grow up to be big and strong" --- code/game/objects/effects/spiders.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index dcb04b4d31..dbd040a797 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -144,7 +144,7 @@ layer = HIDING_LAYER health = 3 var/last_itch = 0 - var/amount_grown = -1 + var/amount_grown = 0 var/obj/machinery/atmospherics/unary/vent_pump/entry_vent var/travelling_in_vent = 0 var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter) From 9a1aed60c635f2f424fde72b729be5a0ee13e2cc Mon Sep 17 00:00:00 2001 From: atermonera Date: Mon, 4 Apr 2022 23:06:41 -0800 Subject: [PATCH 10/30] undoes unintended nerfs, but keeps intended ones --- code/modules/clothing/head/misc.dm | 1 + code/modules/clothing/shoes/miscellaneous.dm | 2 ++ code/modules/clothing/under/miscellaneous.dm | 1 + 3 files changed, 4 insertions(+) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 5f1abd977e..925d6cae31 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -515,6 +515,7 @@ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' + w_class = ITEMSIZE_NORMAL /obj/item/clothing/head/ranger/Initialize() . = ..() diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index e264d8887d..ef7d53d5e6 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -181,6 +181,8 @@ These ones are just a well-made pair of boots in appropriate colours." icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_boots" + step_volume_mod = 1.2 + drop_sound = 'sound/items/drop/boots.ogg' /obj/item/clothing/shoes/ranger/Initialize() . = ..() diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 6a20a80d3e..7dc219e833 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -1282,6 +1282,7 @@ Uniforms and such This costume is instead made from genuine cotton fibre and is based on the season three uniform." icon = 'icons/obj/clothing/ranger.dmi' icon_state = "ranger_uniform" + rolled_sleeves = FALSE /obj/item/clothing/under/ranger/Initialize() . = ..() From f63d33eafdde3cd7a8f7ad7f753d493f9e11d715 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Wed, 6 Apr 2022 16:35:22 -0800 Subject: [PATCH 11/30] Update code/game/objects/items/weapons/explosives.dm Co-authored-by: Spookerton --- code/game/objects/items/weapons/explosives.dm | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index a5e647547e..bd24c3c366 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -83,15 +83,10 @@ if(!target) target = src - var/turf/T = null - if(isturf(get_turf(target)) - T = get_turf(target) - if(LAZYLEN(location) == 3) + var/turf/T = get_turf(target) + if (!T && length(location)) T = locate(location[1], location[2], location[3]) - else - T = get_turf(target) - - if(isturf(T)) + if (T) explosion(T, blast_dev, blast_heavy, blast_light, blast_flash) if(target) From 3fd5296682cc2c1292e47feb8f0de625f3043376 Mon Sep 17 00:00:00 2001 From: Rykka Date: Thu, 7 Apr 2022 01:00:23 -0600 Subject: [PATCH 12/30] TGMC Ammo HUD Port Ports over TGMC's Ammo HUD and all relevant code, adapted to work for Polaris's guns. This took me several days, but hey, I learned a bunch. <: Time to port Aim Mode + Mentorhelp. :3c - All guns now have an ammo HUD sprite. If one lacks one, it will be ??? or blank, at which point, make an issue report, as all guns should be working by now. - Guns will display how many rounds they have left until ammunition runs dry. - Ammo will only count the casings that CURRENTLY have a projectile in them. This is slightly unrealistic, yes, but it is better and more intuitive for the player. This also enables guns like the revolver to work, given they recycle casings. - Up to 4 ammo HUDs can be displayed at once, but given we lack TGMC's attachments and guncode, you'll only ever usually see 2. TBD on porting over TGMC guncode. <: - Ammunition for multiple guns has different colors in the HUD based on what you currently have loaded. - If you're looking at this later on to add new things. DON'T USE _FLASH IN THE HUD_STATE_EMPTY. THE _FLASH IS ADDED ON BY CODE. - Grenades have a hud_state, pending us ever porting over a grenade launcher. Rockets ALSO have a hud_state. Example of Laser/Energy Weapons: https://i.imgur.com/MGvqGxh.mp4 Captain's Gun: https://i.imgur.com/Wd0SS3C.gif Full Test of all weapons: https://streamable.com/usp4dy Upstream port of https://github.com/CHOMPStation2/CHOMPStation2/pull/4033 --- code/_onclick/hud/_defines.dm | 6 ++ code/_onclick/hud/hud.dm | 40 ++++++++- code/_onclick/hud/screen_objects.dm | 77 ++++++++++++++++ .../items/weapons/grenades/explosive.dm | 1 + .../objects/items/weapons/grenades/grenade.dm | 2 + .../items/weapons/grenades/smokebomb.dm | 1 + code/modules/power/cell.dm | 6 ++ code/modules/projectiles/gun.dm | 30 +++++++ code/modules/projectiles/guns/energy.dm | 27 +++++- code/modules/projectiles/guns/projectile.dm | 85 ++++++++++++++++++ .../projectiles/guns/projectile/shotgun.dm | 7 ++ code/modules/projectiles/projectile.dm | 4 + code/modules/projectiles/projectile/beams.dm | 28 +++++- .../modules/projectiles/projectile/bullets.dm | 49 +++++++++- code/modules/projectiles/projectile/energy.dm | 24 ++++- .../projectiles/projectile/explosive.dm | 3 + .../projectiles/projectile/magnetic.dm | 12 +++ .../modules/projectiles/projectile/special.dm | 19 +++- icons/mob/screen_ammo.dmi | Bin 0 -> 5633 bytes 19 files changed, 409 insertions(+), 12 deletions(-) create mode 100644 icons/mob/screen_ammo.dmi diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index af1527eed4..806ee7ca54 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -103,6 +103,12 @@ #define ui_alien_fire "EAST-1:28,NORTH-3:25" #define ui_alien_oxygen "EAST-1:28,NORTH-4:25" +// Goes above HUD, mid-right +#define ui_ammo_hud1 "EAST-1:28,CENTER+1:25" +#define ui_ammo_hud2 "EAST-1:28,CENTER+2:27" +#define ui_ammo_hud3 "EAST-1:28,CENTER+3:29" +#define ui_ammo_hud4 "EAST-1:28,CENTER+4:31" + //Middle right (status indicators) #define ui_temp "EAST-1:28,CENTER-2:13" #define ui_health "EAST-1:28,CENTER-1:15" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 71e32197ff..a6597f9b13 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,3 +1,4 @@ +#define MAX_AMMO_HUD_POSSIBLE 4 // Cap the amount of HUDs at 4. /* The global hud: Uses the same visual objects for all players. @@ -182,6 +183,9 @@ var/list/global_huds = list( var/icon/ui_style var/ui_color var/ui_alpha + + // TGMC Ammo HUD Port + var/list/obj/screen/ammo_hud_list = list() var/list/minihuds = list() @@ -210,6 +214,7 @@ var/list/global_huds = list( other = null hotkeybuttons = null // item_action_list = null // ? + QDEL_LIST(ammo_hud_list) mymob = null /datum/hud/proc/hidden_inventory_update() @@ -446,4 +451,37 @@ var/list/global_huds = list( client.screen += client.void /mob/new_player/add_click_catcher() - return \ No newline at end of file + return + +/* TGMC Ammo HUD Port + * These procs call to screen_objects.dm's respective procs. + * All these do is manage the amount of huds on screen and set the HUD. +*/ +///Add an ammo hud to the user informing of the ammo count of G +/datum/hud/proc/add_ammo_hud(mob/living/user, obj/item/weapon/gun/G) + if(length(ammo_hud_list) >= MAX_AMMO_HUD_POSSIBLE) + return + var/obj/screen/ammo/ammo_hud = new + ammo_hud_list[G] = ammo_hud + ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[length(ammo_hud_list)] + ammo_hud.add_hud(user, G) + ammo_hud.update_hud(user, G) + +///Remove the ammo hud related to the gun G from the user +/datum/hud/proc/remove_ammo_hud(mob/living/user, obj/item/weapon/gun/G) + var/obj/screen/ammo/ammo_hud = ammo_hud_list[G] + if(isnull(ammo_hud)) + return + ammo_hud.remove_hud(user, G) + qdel(ammo_hud) + ammo_hud_list -= G + var/i = 1 + for(var/key in ammo_hud_list) + ammo_hud = ammo_hud_list[key] + ammo_hud.screen_loc = ammo_hud.ammo_screen_loc_list[i] + i++ + +///Update the ammo hud related to the gun G +/datum/hud/proc/update_ammo_hud(mob/living/user, obj/item/weapon/gun/G) + var/obj/screen/ammo/ammo_hud = ammo_hud_list[G] + ammo_hud?.update_hud(user, G) \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 2006f53adc..e8bb2bb7f4 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -833,3 +833,80 @@ icon_state = null plane = PLANE_HOLOMAP_ICONS appearance_flags = KEEP_TOGETHER + +// Begin TGMC Ammo HUD Port +/obj/screen/ammo + name = "ammo" + icon = 'icons/mob/screen_ammo.dmi' + icon_state = "ammo" + screen_loc = ui_ammo_hud1 + var/warned = FALSE + var/static/list/ammo_screen_loc_list = list(ui_ammo_hud1, ui_ammo_hud2, ui_ammo_hud3 ,ui_ammo_hud4) + +/obj/screen/ammo/proc/add_hud(var/mob/living/user, var/obj/item/weapon/gun/G) + + if(!user?.client) + return + + if(!G) + CRASH("/obj/screen/ammo/proc/add_hud() has been called from [src] without the required param of G") + + if(!G.has_ammo_counter()) + return + + user.client.screen += src + +/obj/screen/ammo/proc/remove_hud(var/mob/living/user) + user?.client?.screen -= src + +/obj/screen/ammo/proc/update_hud(var/mob/living/user, var/obj/item/weapon/gun/G) + if(!user?.client?.screen.Find(src)) + return + + if(!G || !istype(G) || !G.has_ammo_counter() || !G.get_ammo_type() || isnull(G.get_ammo_count())) + remove_hud() + return + + var/list/ammo_type = G.get_ammo_type() + var/rounds = G.get_ammo_count() + + var/hud_state = ammo_type[1] + var/hud_state_empty = ammo_type[2] + + overlays.Cut() + + var/empty = image('icons/mob/screen_ammo.dmi', src, "[hud_state_empty]") + + if(rounds == 0) + if(warned) + overlays += empty + else + warned = TRUE + var/obj/screen/ammo/F = new /obj/screen/ammo(src) + F.icon_state = "frame" + user.client.screen += F + flick("[hud_state_empty]_flash", F) + spawn(20) + user.client.screen -= F + qdel(F) + overlays += empty + else + warned = FALSE + overlays += image('icons/mob/screen_ammo.dmi', src, "[hud_state]") + + rounds = num2text(rounds) + //Handle the amount of rounds + switch(length(rounds)) + if(1) + overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[1]]") + if(2) + overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[2]]") + overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[1]]") + if(3) + overlays += image('icons/mob/screen_ammo.dmi', src, "o[rounds[3]]") + overlays += image('icons/mob/screen_ammo.dmi', src, "t[rounds[2]]") + overlays += image('icons/mob/screen_ammo.dmi', src, "h[rounds[1]]") + else //"0" is still length 1 so this means it's over 999 + overlays += image('icons/mob/screen_ammo.dmi', src, "o9") + overlays += image('icons/mob/screen_ammo.dmi', src, "t9") + overlays += image('icons/mob/screen_ammo.dmi', src, "h9") \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/explosive.dm b/code/game/objects/items/weapons/grenades/explosive.dm index 076a7accce..77e07e2c5f 100644 --- a/code/game/objects/items/weapons/grenades/explosive.dm +++ b/code/game/objects/items/weapons/grenades/explosive.dm @@ -12,6 +12,7 @@ //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern var/spread_range = 7 loadable = null + hud_state = "grenade_frag" // TGMC Ammo HUD Port /obj/item/weapon/grenade/explosive/detonate() ..() diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 209e47b253..9bdf650c64 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -13,6 +13,8 @@ var/det_time = 50 var/loadable = TRUE var/arm_sound = 'sound/weapons/armbomb.ogg' + var/hud_state = "grenade_he" // TGMC Ammo HUD Port + var/hud_state_empty = "grenade_empty" // TGMC Ammo HUD Port /obj/item/weapon/grenade/proc/clown_check(var/mob/living/user) if((CLUMSY in user.mutations) && prob(50)) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 51ec50d182..d3b417b6a7 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -6,6 +6,7 @@ det_time = 20 item_state = "flashbang" slot_flags = SLOT_BELT + hud_state = "grenade_smoke" var/datum/effect_system/smoke_spread/bad/smoke var/smoke_color var/smoke_strength = 8 diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index a1d31cdfa1..7fd8688a2c 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -53,6 +53,12 @@ if(self_recharge) if(world.time >= last_use + charge_delay) give(charge_amount) + // TGMC Ammo HUD - Update the HUD every time we're called to recharge. + if(istype(loc, /obj/item/weapon/gun/energy)) // Are we in a gun currently? + var/obj/item/weapon/gun/energy/gun = loc + var/mob/living/user = gun.loc + if(istype(user)) + user?.hud_used.update_ammo_hud(user, gun) // Update the HUD else return PROCESS_KILL diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d19e6d6ca9..0bb9c643bb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -401,6 +401,8 @@ if(muzzle_flash) set_light(0) + + user.hud_used.update_ammo_hud(user, src) // Similar to the above proc, but does not require a user, which is ideal for things like turrets. /obj/item/weapon/gun/proc/Fire_userless(atom/target) @@ -493,6 +495,7 @@ /obj/item/weapon/gun/proc/handle_click_empty(mob/user) if (user) user.visible_message("*click click*", "*click*") + user.hud_used.update_ammo_hud(user, src) else src.visible_message("*click click*") playsound(src, 'sound/weapons/empty.ogg', 100, 1) @@ -724,8 +727,35 @@ var/datum/firemode/new_mode = firemodes[sel_mode] new_mode.apply_to(src) to_chat(user, "\The [src] is now set to [new_mode.name].") + user.hud_used.update_ammo_hud(user, src) return new_mode /obj/item/weapon/gun/attack_self(mob/user) switch_firemodes(user) + +/* TGMC Ammo HUD Port Begin */ +/obj/item/weapon/gun + var/hud_enabled = TRUE + +/obj/item/weapon/gun/proc/has_ammo_counter() + return FALSE + +/obj/item/weapon/gun/proc/get_ammo_type() + return FALSE + +/obj/item/weapon/gun/proc/get_ammo_count() + return FALSE + +/obj/item/weapon/gun/equipped(mob/living/user, slot) // When a gun is equipped to your hands, we'll add the HUD to the user. Pending porting over TGMC guncode where wielding is far more sensible. + if(slot == slot_l_hand || slot == slot_r_hand) + user.hud_used.add_ammo_hud(user, src) + else + user.hud_used.remove_ammo_hud(user, src) + + return ..() + +/obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti. + user.hud_used.remove_ammo_hud(user, src) + + ..() \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 245aad9a95..91ca21f48e 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -90,6 +90,9 @@ power_supply.give(rechargeamt) //... to recharge 1/5th the battery update_icon() + var/mob/living/M = loc // TGMC Ammo HUD + if(istype(M)) // TGMC Ammo HUD + M?.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD else charge_tick = 0 return 1 @@ -109,6 +112,9 @@ if(!power_supply) return null if(!ispath(projectile_type)) return null if(!power_supply.checked_use(charge_cost)) return null + var/mob/living/M = loc // TGMC Ammo HUD + if(istype(M)) // TGMC Ammo HUD + M?.hud_used.update_ammo_hud(M, src) return new projectile_type(src) /obj/item/weapon/gun/energy/proc/load_ammo(var/obj/item/C, mob/user) @@ -130,6 +136,7 @@ playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() update_held_icon() + user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD else to_chat(user, "This cell is not fitted for [src].") return @@ -146,6 +153,7 @@ playsound(src, 'sound/weapons/empty.ogg', 50, 1) update_icon() update_held_icon() + user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD else to_chat(user, "[src] does not have a power cell.") @@ -231,4 +239,21 @@ results += ..() - return results \ No newline at end of file + return results + +// TGMC AMMO HUD +/obj/item/weapon/gun/energy/has_ammo_counter() + return TRUE + +/obj/item/weapon/gun/energy/get_ammo_type() + if(!projectile_type) + return list("unknown", "unknown") + else + var/obj/item/projectile/P = projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + +/obj/item/weapon/gun/energy/get_ammo_count() + if(!power_supply) + return 0 + else + return FLOOR(power_supply.charge / max(charge_cost, 1), 1) \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index a8b1ab929d..8ce418b5f1 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -54,6 +54,10 @@ chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len] if(handle_casings != HOLD_CASINGS) ammo_magazine.stored_ammo -= chambered + + var/mob/living/M = loc + if(istype(M)) + M?.hud_used.update_ammo_hud(M, src) if (chambered) return chambered.BB @@ -98,6 +102,10 @@ if(handle_casings != HOLD_CASINGS) chambered = null + + var/mob/living/M = loc + if(istype(M)) + M?.hud_used.update_ammo_hud(M, src) //Attempts to load A into src, depending on the type of thing being loaded and the load_method @@ -117,6 +125,7 @@ AM.loc = src ammo_magazine = AM user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].") + user.hud_used.update_ammo_hud(user, src) playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) if(SPEEDLOADER) if(loaded.len >= max_shells) @@ -131,8 +140,10 @@ loaded += C AM.stored_ammo -= C //should probably go inside an ammo_magazine proc, but I guess less proc calls this way... count++ + user.hud_used.update_ammo_hud(user, src) if(count) user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].") + user.hud_used.update_ammo_hud(user, src) playsound(src, 'sound/weapons/empty.ogg', 50, 1) AM.update_icon() else if(istype(A, /obj/item/ammo_casing)) @@ -168,6 +179,7 @@ sleep(1 SECOND) update_icon() + user.hud_used.update_ammo_hud(user, src) //attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled /obj/item/weapon/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump=1) @@ -177,6 +189,7 @@ playsound(src, 'sound/weapons/empty.ogg', 50, 1) ammo_magazine.update_icon() ammo_magazine = null + user.hud_used.update_ammo_hud(user, src) else if(loaded.len) //presumably, if it can be speed-loaded, it can be speed-unloaded. if(allow_dump && (load_method & SPEEDLOADER)) @@ -195,9 +208,11 @@ user.put_in_hands(C) user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].") playsound(src, 'sound/weapons/empty.ogg', 50, 1) + user.hud_used.update_ammo_hud(user, src) else to_chat(user, "[src] is empty.") update_icon() + user.hud_used.update_ammo_hud(user, src) /obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob) ..() @@ -228,6 +243,7 @@ ammo_magazine.update_icon() ammo_magazine = null update_icon() //make sure to do this after unsetting ammo_magazine + user.hud_used.update_ammo_hud(user, src) /obj/item/weapon/gun/projectile/examine(mob/user) . = ..() @@ -256,3 +272,72 @@ unload_ammo(usr) */ + +// TGMC Ammo HUD Insertion +/obj/item/weapon/gun/projectile/has_ammo_counter() + return TRUE + +/obj/item/weapon/gun/projectile/get_ammo_type() + if(load_method & MAGAZINE) + if(chambered) // Do we have an ammo casing chambered + var/obj/item/ammo_casing/A = chambered + var/obj/item/projectile/P = A.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + else if(ammo_magazine && ammo_magazine.stored_ammo.len) // Do we have a mag, and have ammo in the mag, but nothing chambered? + var/obj/item/ammo_casing/A = ammo_magazine.stored_ammo[1] + var/obj/item/projectile/P = A.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + else if(src.projectile_type) // Else, we're entirely empty, and irregardless of the mag we have loaded (as it's empty, or it would've passed the length check above), return the DEFAULT projectile_type on the gun, if set. + var/obj/item/projectile/P = src.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + else + return list("unknown", "unknown") // Safety, this shouldn't happen, but just in case + else if(load_method & (SINGLE_CASING|SPEEDLOADER)) // Do we load with single casings OR speedloaders? + if(chambered) // Do we have an ammo casing loaded in the chamber? All casings still have a projectile_type var. + var/obj/item/ammo_casing/A = chambered + var/obj/item/projectile/P = A.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) // Return the casing's projectile_type ammo hud state + else if(loaded.len) // Else, is the gun loaded, but no ammo casings in chamber currently? + var/obj/item/ammo_casing/A = loaded[1] + var/obj/item/projectile/P = A.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) // Return the ammunition loaded in the gun's hud_state + else if(src.projectile_type) // Else, we're entirely empty, and have nothing loaded in the gun, and nothing in the chamber. Return the DEFAULT projectile_type on the gun, if set. + var/obj/item/projectile/P = src.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + else + return list("unknown", "unknown") // Safety, this shouldn't happen, but just in case + else if(src.projectile_type) // Failsafe if we somehow don't pass the above. Return the DEFAULT projectile_type on the gun, if set. + var/obj/item/projectile/P = src.projectile_type + return list(initial(P.hud_state), initial(P.hud_state_empty)) + else // Failsafe if we somehow fail all three methods + return list("unknown", "unknown") + +/obj/item/weapon/gun/projectile/get_ammo_count() + if(ammo_magazine) // Do we have a magazine loaded? + var/shots_left + if(chambered && chambered.BB) // Do we have a bullet in the currently-chambered casing, if any? + shots_left++ + for(var/obj/item/ammo_casing/bullet in ammo_magazine.stored_ammo) + if(bullet.BB) + shots_left++ + + if(shots_left > 0) + return shots_left + else + return 0 // No ammo left or failsafe. + else if(loaded) // Do we use internal ammunition + var/shots_left + if(chambered && chambered.BB) // Do we have a bullet in the currently-chambered casing, if any? + shots_left++ + for(var/obj/item/ammo_casing/bullet in loaded) + if(bullet.BB) // Only increment how many shots we have left if we're loaded. + shots_left++ + + if(shots_left > 0) + return shots_left + else + return 0 // No ammo left or failsafe. + else if(chambered) // If we don't have a magazine or internal ammunition loaded, but we have a casing in chamber, return the amount. + return chambered.BB ? 1 : 0 + else // Failsafe, or completely unloaded + return 0 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 4f6cb0b018..161f3ea29e 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -1,3 +1,7 @@ +/* + * Shotgun + */ + /obj/item/weapon/gun/projectile/shotgun/pump name = "shotgun" desc = "The mass-produced MarsTech Meteor 29 shotgun is a favourite of police and security forces on many worlds. Uses 12g rounds." @@ -39,12 +43,14 @@ else chambered.loc = get_turf(src) // Eject casing chambered = null + M.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD Port // Load next shell if(loaded.len) var/obj/item/ammo_casing/AC = loaded[1] // load next casing. loaded -= AC // Remove casing from loaded list. chambered = AC + M.hud_used.update_ammo_hud(M, src) // TGMC Ammo HUD Port if(pump_animation) // This affects all bolt action and shotguns. flick("[pump_animation]", src) // This plays any pumping @@ -125,6 +131,7 @@ burst = 2 user.visible_message("The shotgun goes off!", "The shotgun goes off in your face!") Fire_userless(user) + user.hud_used.update_ammo_hud(user, src) // TGMC Ammo HUD Port burst = burstsetting return if(do_after(user, 30)) //SHIT IS STEALTHY EYYYYY diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b06e33db76..1686a6e6e1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -135,6 +135,10 @@ var/impact_effect_type = null var/list/impacted_mobs = list() + + // TGMC Ammo HUD Port + var/hud_state = "unknown" // What HUD state we use when we have ammunition. + var/hud_state_empty = "unknown" // The empty state. DON'T USE _FLASH IN THE NAME OF THE EMPTY STATE STRING, THAT IS ADDED BY THE CODE. /obj/item/projectile/proc/Range() range-- diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 559fb2a12b..829d660c81 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -23,6 +23,9 @@ tracer_type = /obj/effect/projectile/tracer/laser impact_type = /obj/effect/projectile/impact/laser + hud_state = "laser" + hud_state_empty = "battery_empty" + /obj/item/projectile/beam/practice name = "laser" icon_state = "laser" @@ -31,23 +34,28 @@ damage_type = BURN check_armour = "laser" eyeblur = 2 + hud_state = "laser" /obj/item/projectile/beam/weaklaser name = "weak laser" icon_state = "laser" damage = 15 + hud_state = "laser" /obj/item/projectile/beam/smalllaser damage = 25 + hud_state = "laser" /obj/item/projectile/beam/burstlaser damage = 30 armor_penetration = 10 + hud_state = "laser" /obj/item/projectile/beam/midlaser damage = 40 armor_penetration = 10 + hud_state = "laser" /obj/item/projectile/beam/mininglaser name = "pulsating laser" @@ -74,6 +82,7 @@ muzzle_type = /obj/effect/projectile/muzzle/laser_heavy tracer_type = /obj/effect/projectile/tracer/laser_heavy impact_type = /obj/effect/projectile/impact/laser_heavy + hud_state = "laser_overcharge" /obj/item/projectile/beam/heavylaser/fakeemitter name = "emitter beam" @@ -81,6 +90,7 @@ fire_sound = 'sound/weapons/emitter.ogg' light_color = "#00CC33" excavation_amount = 140 // 2 shots to dig a standard rock turf. Superior due to being a mounted tool beam, to make it actually viable. + hud_state = "laser_overcharge" muzzle_type = /obj/effect/projectile/muzzle/emitter tracer_type = /obj/effect/projectile/tracer/emitter @@ -90,6 +100,7 @@ damage = 80 armor_penetration = 50 light_color = "#FF0D00" + hud_state = "laser_overcharge" /obj/item/projectile/beam/xray name = "xray beam" @@ -98,6 +109,7 @@ damage = 25 armor_penetration = 50 light_color = "#00CC33" + hud_state = "laser_sniper" muzzle_type = /obj/effect/projectile/muzzle/xray tracer_type = /obj/effect/projectile/tracer/xray @@ -111,6 +123,7 @@ armor_penetration = 90 irradiate = 20 light_color = "#00CC33" + hud_state = "laser_sniper" muzzle_type = /obj/effect/projectile/muzzle/xray tracer_type = /obj/effect/projectile/tracer/xray @@ -122,6 +135,7 @@ fire_sound = 'sound/weapons/eluger.ogg' damage = 40 light_color = "#00C6FF" + hud_state = "laser_disabler" muzzle_type = /obj/effect/projectile/muzzle/laser_omni tracer_type = /obj/effect/projectile/tracer/laser_omni @@ -134,6 +148,7 @@ damage = 100 //Badmin toy, don't care armor_penetration = 100 light_color = "#0066FF" + hud_state = "pulse" muzzle_type = /obj/effect/projectile/muzzle/laser_pulse tracer_type = /obj/effect/projectile/tracer/laser_pulse @@ -151,6 +166,7 @@ damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm light_color = "#00CC33" excavation_amount = 70 // 3 shots to mine a turf + hud_state = "laser_overcharge" muzzle_type = /obj/effect/projectile/muzzle/emitter tracer_type = /obj/effect/projectile/tracer/emitter @@ -164,13 +180,14 @@ no_attack_log = 1 damage_type = BURN check_armour = "laser" + hud_state = "monkey" combustion = FALSE /obj/item/projectile/beam/lasertag/blue icon_state = "bluelaser" light_color = "#0066FF" - + hud_state = "monkey" muzzle_type = /obj/effect/projectile/muzzle/laser_blue tracer_type = /obj/effect/projectile/tracer/laser_blue impact_type = /obj/effect/projectile/impact/laser_blue @@ -185,6 +202,7 @@ /obj/item/projectile/beam/lasertag/red icon_state = "laser" light_color = "#FF0D00" + hud_state = "monkey" /obj/item/projectile/beam/lasertag/red/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) @@ -196,6 +214,7 @@ /obj/item/projectile/beam/lasertag/omni//A laser tag bolt that stuns EVERYONE icon_state = "omnilaser" light_color = "#00C6FF" + hud_state = "monkey" muzzle_type = /obj/effect/projectile/muzzle/laser_omni tracer_type = /obj/effect/projectile/tracer/laser_omni @@ -215,6 +234,7 @@ damage = 50 armor_penetration = 10 light_color = "#00CC33" + hud_state = "laser_sniper" muzzle_type = /obj/effect/projectile/muzzle/xray tracer_type = /obj/effect/projectile/tracer/xray @@ -231,12 +251,15 @@ light_color = "#FFFFFF" hitsound = 'sound/weapons/zapbang.ogg' + combustion = FALSE muzzle_type = /obj/effect/projectile/muzzle/stun tracer_type = /obj/effect/projectile/tracer/stun impact_type = /obj/effect/projectile/impact/stun + hud_state = "taser" // TGMC Ammo HUD port + /obj/item/projectile/beam/stun/weak name = "weak stun beam" icon_state = "stun" @@ -277,6 +300,7 @@ agony = 15 eyeblur = 2 hitsound = 'sound/weapons/zapbang.ogg' + hud_state = "taser" /obj/item/projectile/beam/shock/weak damage = 5 @@ -294,7 +318,7 @@ damage_type = ELECTROCUTE //You should be safe inside a voidsuit sharp = FALSE //"Wide" spectrum beam light_color = COLOR_GOLD - + hud_state = "monkey" excavation_amount = 200 // Good at shooting rocks muzzle_type = /obj/effect/projectile/muzzle/pointdefense diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 812bc8b829..113f7d7387 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -12,6 +12,8 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect excavation_amount = 20 var/mob_passthrough_check = 0 + hud_state = "pistol_lightap" + hud_state_empty = "pistol_empty" // Just in case we somehow have no hud_state_empty defined muzzle_type = /obj/effect/projectile/muzzle/bullet @@ -96,30 +98,38 @@ /obj/item/projectile/bullet/pistol // 9mm pistols and most SMGs. Sacrifice power for capacity. fire_sound = 'sound/weapons/gunshot2.ogg' damage = 20 + hud_state = "pistol" + hud_state_empty = "pistol_empty" /obj/item/projectile/bullet/pistol/ap damage = 15 armor_penetration = 30 + hud_state = "pistol_light_ap" /obj/item/projectile/bullet/pistol/hp damage = 25 armor_penetration = -50 + hud_state = "pistol_ap" /obj/item/projectile/bullet/pistol/medium // .45 (and maybe .40 if it ever gets added) caliber security pistols. Balance between capacity and power. fire_sound = 'sound/weapons/gunshot3.ogg' // Snappier sound. damage = 25 + hud_state = "pistol" /obj/item/projectile/bullet/pistol/medium/ap damage = 20 armor_penetration = 15 + hud_state = "pistol_light_ap" /obj/item/projectile/bullet/pistol/medium/hp damage = 30 armor_penetration = -50 + hud_state = "pistol_ap" /obj/item/projectile/bullet/pistol/strong // .357 and .44 caliber stuff. High power pistols like the Mateba or Desert Eagle. Sacrifice capacity for power. fire_sound = 'sound/weapons/gunshot4.ogg' damage = 60 + hud_state = "pistol_heavy" /obj/item/projectile/bullet/pistol/rubber/strong // "Rubber" bullets for high power pistols. fire_sound = 'sound/weapons/gunshot3.ogg' // Rubber shots have less powder, but these still have more punch than normal rubber shot. @@ -128,6 +138,7 @@ embed_chance = 0 sharp = 0 check_armour = "melee" + hud_state = "pistol_special" /obj/item/projectile/bullet/pistol/rubber // "Rubber" bullets for all other pistols. name = "rubber bullet" @@ -136,6 +147,7 @@ embed_chance = 0 sharp = 0 check_armour = "melee" + hud_state = "pistol_special" fire_sound ='sound/weapons/Gunshot_pathetic.ogg' // Rubber shots have less powder in the casing. /* shotgun projectiles */ @@ -145,6 +157,8 @@ fire_sound = 'sound/weapons/Gunshot_shotgun.ogg' damage = 50 armor_penetration = 20 + hud_state = "shotgun_slug" + hud_state_empty = "shotgun_empty" /obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets name = "beanbag" @@ -153,6 +167,7 @@ embed_chance = 0 sharp = 0 check_armour = "melee" + hud_state = "shotgun_beanbag" //Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance. //Overall less damage than slugs in exchange for more damage at very close range and more embedding @@ -163,12 +178,14 @@ pellets = 6 range_step = 1 spread_step = 10 + hud_state = "shotgun_buckshot" /obj/item/projectile/bullet/pellet/shotgun/flak damage = 2 //The main weapon using these fires four at a time, usually with different destinations. Usually. range_step = 2 spread_step = 30 armor_penetration = 10 + hud_state = "shotgun_flechette" //EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. //Not currently used /obj/item/projectile/bullet/shotgun/ion @@ -178,6 +195,7 @@ embed_chance = 0 sharp = 0 check_armour = "melee" + hud_state = "shotgun_ion" combustion = FALSE @@ -193,46 +211,57 @@ fire_sound = 'sound/weapons/Gunshot_generic_rifle.ogg' armor_penetration = 15 penetrating = 1 + hud_state = "rifle" + hud_state_empty = "rifle_empty" /obj/item/projectile/bullet/rifle/a762 fire_sound = 'sound/weapons/Gunshot_heavy.ogg' damage = 35 + hud_state = "rifle_heavy" /obj/item/projectile/bullet/rifle/a762/sniper // Hitscan specifically for sniper ammo; to be implimented at a later date, probably for the SVD. -Ace fire_sound = 'sound/weapons/Gunshot_sniper.ogg' hitscan = 1 //so the ammo isn't useless as a sniper weapon + hud_state = "hivelo" /obj/item/projectile/bullet/rifle/a762/ap damage = 30 armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds. + hud_state = "rifle_ap" /obj/item/projectile/bullet/rifle/a762/hp damage = 40 armor_penetration = -50 penetrating = 0 + hud_state = "hivelo_iff" /obj/item/projectile/bullet/rifle/a762/hunter // Optimized for killing simple animals and not people, because Balance(tm) damage = 20 SA_bonus_damage = 50 // 70 total on animals. SA_vulnerability = SA_ANIMAL + hud_state = "rifle_heavy" /obj/item/projectile/bullet/rifle/a545 fire_sound = 'sound/weapons/Gunshot_light.ogg' damage = 25 + hud_state = "rifle" /obj/item/projectile/bullet/rifle/a545/ap damage = 20 armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds. + hud_state = "rifle_ap" /obj/item/projectile/bullet/rifle/a545/hp damage = 35 armor_penetration = -50 penetrating = 0 + hud_state = "hivelo_iff" /obj/item/projectile/bullet/rifle/a545/hunter damage = 15 SA_bonus_damage = 35 // 50 total on animals. SA_vulnerability = SA_ANIMAL + hud_state = "rifle_heavy" /obj/item/projectile/bullet/rifle/a145 // 14.5�114mm is bigger than a .50 BMG round. fire_sound = 'sound/weapons/Gunshot_cannon.ogg' // This is literally an anti-tank rifle caliber. It better sound like a fucking cannon. @@ -242,6 +271,7 @@ penetrating = 5 armor_penetration = 80 hitscan = 1 //so the PTR isn't useless as a sniper weapon + hud_state = "sniper" icon_state = "bullet_alt" tracer_type = /obj/effect/projectile/tracer/cannon @@ -252,10 +282,12 @@ weaken = 0 penetrating = 15 armor_penetration = 90 + hud_state = "sniper_flak" /obj/item/projectile/bullet/rifle/a44rifle fire_sound = 'sound/weapons/gunshot4.ogg' damage = 50 + hud_state = "revolver" /* Mech rounds */ @@ -274,18 +306,21 @@ name = "co bullet" damage = 20 damage_type = OXY + hud_state = "pistol_tranq" /obj/item/projectile/bullet/cyanideround name = "poison bullet" damage = 40 damage_type = TOX + hud_state = "pistol_tranq" /obj/item/projectile/bullet/burstbullet name = "exploding bullet" fire_sound = 'sound/effects/Explosion1.ogg' damage = 20 embed_chance = 0 - edge = 1 + edge = TRUE + hud_state = "pistol_fire" /obj/item/projectile/bullet/burstbullet/on_hit(var/atom/target, var/blocked = 0) if(isturf(target)) @@ -301,6 +336,7 @@ damage_type = BURN incendiary = 0.5 flammability = 2 + hud_state = "pistol_fire" /obj/item/projectile/bullet/incendiary/flamethrower name = "ball of fire" @@ -313,12 +349,14 @@ agony = 30 range = 4 vacuum_traversal = 0 + hud_state = "flame" /obj/item/projectile/bullet/incendiary/flamethrower/large damage = 5 incendiary = 3 flammability = 2 range = 6 + hud_state = "flame" /obj/item/projectile/bullet/incendiary/flamethrower/tiny damage = 2 @@ -328,11 +366,13 @@ modifier_duration = 20 SECONDS range = 6 agony = 0 + hud_state = "flame" /* Practice rounds and blanks */ /obj/item/projectile/bullet/practice damage = 5 + hud_state = "smg_light" /obj/item/projectile/bullet/pistol/cap // Just the primer, such as a cap gun. name = "cap" @@ -341,7 +381,8 @@ damage = 0 nodamage = 1 embed_chance = 0 - sharp = 0 + sharp = FALSE + hud_state = "monkey" combustion = FALSE @@ -356,7 +397,8 @@ damage = 0 nodamage = 1 embed_chance = 0 - sharp = 0 + sharp = FALSE + hud_state = "smg_light" /obj/item/projectile/bullet/blank/cap/process() loc = null @@ -370,6 +412,7 @@ embed_chance = 0 sharp = FALSE silenced = TRUE + hud_state = "pistol_light" /obj/item/projectile/bullet/pellet/shotgun/bb // Shotgun name = "BB" diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 35e4c61ea4..3be445f264 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -8,6 +8,8 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect hitsound_wall = 'sound/weapons/effects/searwall.ogg' hitsound = 'sound/weapons/zapbang.ogg' + hud_state = "plasma" + hud_state_empty = "battery_empty" var/flash_strength = 10 @@ -22,6 +24,7 @@ var/flash_range = 0 var/brightness = 7 var/light_colour = "#ffffff" + hud_state = "grenade_dummy" /obj/item/projectile/energy/flash/on_impact(var/atom/A) var/turf/T = flash_range? src.loc : get_turf(A) @@ -59,6 +62,7 @@ flash_range = 1 brightness = 15 flash_strength = 20 + hud_state = "grenade_dummy" /obj/item/projectile/energy/flash/flare/on_impact(var/atom/A) light_colour = pick("#e58775", "#ffffff", "#90ff90", "#a09030") @@ -77,15 +81,18 @@ light_range = 2 light_power = 0.5 light_color = "#FFFFFF" + hud_state = "taser" //Damage will be handled on the MOB side, to prevent window shattering. /obj/item/projectile/energy/electrode/strong agony = 55 + hud_state = "taser" /obj/item/projectile/energy/electrode/stunshot name = "stunshot" damage = 5 agony = 80 + hud_state = "taser" /obj/item/projectile/energy/declone name = "declone" @@ -100,6 +107,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser combustion = FALSE + hud_state = "plasma_pistol" /obj/item/projectile/energy/excavate name = "kinetic blast" @@ -113,6 +121,7 @@ vacuum_traversal = 0 combustion = FALSE + hud_state = "plasma_blast" /obj/item/projectile/energy/dart name = "dart" @@ -121,6 +130,7 @@ damage_type = TOX agony = 120 check_armour = "energy" + hud_state = "pistol_tranq" combustion = FALSE @@ -131,10 +141,12 @@ damage_type = TOX agony = 40 stutter = 10 + hud_state = "electrothermal" /obj/item/projectile/energy/bolt/large name = "largebolt" damage = 20 + hud_state = "electrothermal" /obj/item/projectile/energy/acid //Slightly up-gunned (Read: The thing does agony and checks bio resist) variant of the simple alien mob's projectile, for queens and sentinels. name = "acidic spit" @@ -155,6 +167,7 @@ agony = 80 check_armour = "bio" armor_penetration = 25 // It's acid-based + hud_state = "electrothermal" combustion = FALSE @@ -164,6 +177,7 @@ damage = 20 damage_type = BIOACID agony = 20 + hud_state = "electrothermal" check_armour = "bio" armor_penetration = 25 // It's acid-based @@ -193,6 +207,7 @@ light_power = 0.5 light_color = "#33CC00" impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser + hud_state = "plasma_rifle" combustion = FALSE @@ -206,6 +221,7 @@ agony = 55 damage_type = BURN vacuum_traversal = 0 //Projectile disappears in empty space + hud_state = "plasma_rifle_blast" /obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M) @@ -250,6 +266,7 @@ embed_chance = 0 muzzle_type = /obj/effect/projectile/muzzle/pulse impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser + hud_state = "plasma_sphere" /obj/item/projectile/energy/phase name = "phase wave" @@ -258,17 +275,20 @@ range = 6 damage = 5 SA_bonus_damage = 45 // 50 total on animals - SA_vulnerability = SA_ANIMAL + hud_state = "laser_heat" /obj/item/projectile/energy/phase/light range = 4 SA_bonus_damage = 35 // 40 total on animals + hud_state = "laser_heat" /obj/item/projectile/energy/phase/heavy range = 8 SA_bonus_damage = 55 // 60 total on animals + hud_state = "laser_heat" /obj/item/projectile/energy/phase/heavy/cannon range = 10 damage = 15 - SA_bonus_damage = 60 // 75 total on animals \ No newline at end of file + SA_bonus_damage = 60 // 75 total on animals + hud_state = "laser_heat" \ No newline at end of file diff --git a/code/modules/projectiles/projectile/explosive.dm b/code/modules/projectiles/projectile/explosive.dm index 307febc8bc..76da8f3e3a 100644 --- a/code/modules/projectiles/projectile/explosive.dm +++ b/code/modules/projectiles/projectile/explosive.dm @@ -7,6 +7,8 @@ icon_state = "missile" damage = 30 //Meaty whack. *Chuckles* does_spin = 0 + hud_state = "rocket_he" + hud_state_empty = "rocket_empty" /obj/item/projectile/bullet/srmrocket/on_hit(atom/target, blocked=0) if(!isliving(target)) //if the target isn't alive, so is a wall or something @@ -24,6 +26,7 @@ /obj/item/projectile/bullet/srmrocket/weak //Used in the jury rigged one. damage = 10 + hud_state = "rocket_he" /obj/item/projectile/bullet/srmrocket/weak/on_hit(atom/target, blocked=0) explosion(target, 0, 0, 2, 4)//No need to have a question. diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm index 12452d4618..3ccc8618da 100644 --- a/code/modules/projectiles/projectile/magnetic.dm +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -8,12 +8,14 @@ weaken = 1 penetrating = 5 armor_penetration = 70 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/slug name = "slug" icon_state = "gauss_silenced" damage = 75 armor_penetration = 90 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/flechette name = "flechette" @@ -21,6 +23,7 @@ fire_sound = 'sound/weapons/rapidslice.ogg' damage = 20 armor_penetration = 100 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/flechette/small name = "small flechette" @@ -28,12 +31,14 @@ fire_sound = 'sound/weapons/rapidslice.ogg' damage = 12 armor_penetration = 100 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/flechette/hunting name = "shredder slug" armor_penetration = 30 SA_bonus_damage = 40 SA_vulnerability = SA_ANIMAL + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/heated name = "slug" @@ -45,6 +50,7 @@ embed_chance = 0 armor_penetration = 40 penetrating = 1 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/heated/weak icon_state = "gauss_silenced" @@ -53,6 +59,7 @@ embed_chance = 0 armor_penetration = 30 penetrating = 0 + hud_state = "alloy_spike" /obj/item/projectile/bullet/magnetic/fuelrod name = "fuel rod" @@ -67,6 +74,7 @@ embed_chance = 0 armor_penetration = 40 range = 20 + hud_state = "rocket_he" var/searing = 0 //Does this fuelrod ignore shields? var/detonate_travel = 0 //Will this fuelrod explode when it reaches maximum distance? @@ -113,6 +121,7 @@ flammability = -1 armor_penetration = 50 penetrating = 3 + hud_state = "rocket_ap" /obj/item/projectile/bullet/magnetic/fuelrod/phoron name = "blazing fuel rod" @@ -124,6 +133,7 @@ penetrating = 5 irradiate = 20 detonate_mob = 1 + hud_state = "rocket_fire" /obj/item/projectile/bullet/magnetic/fuelrod/supermatter name = "painfully incandescent fuel rod" @@ -140,6 +150,7 @@ detonate_travel = 1 detonate_mob = 1 energetic_impact = 1 + hud_state = "rocket_thermobaric" /obj/item/projectile/bullet/magnetic/fuelrod/supermatter/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) //You cannot touch the supermatter without disentigrating. Assumedly, this is true for condensed rods of it flying at relativistic speeds. if(istype(target,/turf/simulated/wall) || istype(target,/mob/living)) @@ -160,6 +171,7 @@ check_armour = "melee" irradiate = 20 range = 6 + hud_state = "plasma_rifle_blast" /obj/item/projectile/bullet/magnetic/bore/Initialize(loc, range_mod) // i'm gonna be real honest i dunno how this works but it does . = ..() diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 9c06241ecf..fff673befc 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -9,6 +9,8 @@ light_range = 2 light_power = 0.5 light_color = "#55AAFF" + hud_state = "plasma_blast" + hud_state_empty = "battery_empty" combustion = FALSE impact_effect_type = /obj/effect/temp_visual/impact_effect/ion @@ -41,8 +43,9 @@ icon_state= "bolter" damage = 50 check_armour = "bullet" - sharp = 1 - edge = 1 + sharp = TRUE + edge = TRUE + hud_state = "rocket_fire" /obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0) explosion(target, -1, 0, 2) @@ -62,6 +65,7 @@ light_power = 0.5 light_color = "#55AAFF" impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser + hud_state = "water" combustion = FALSE @@ -93,6 +97,7 @@ /obj/item/projectile/temp/hot name = "heat beam" target_temperature = 1000 + hud_state = "flame" combustion = TRUE @@ -104,6 +109,7 @@ damage_type = BRUTE nodamage = 1 check_armour = "bullet" + hud_state = "monkey" /obj/item/projectile/meteor/Bump(atom/A as mob|obj|turf|area) if(A == firer) @@ -140,6 +146,7 @@ impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser combustion = FALSE + hud_state = "electrothermal" /obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target @@ -182,6 +189,7 @@ nodamage = 1 check_armour = "energy" var/decl/plantgene/gene = null + hud_state = "electrothermal" /obj/item/projectile/energy/florayield name = "beta somatoray" @@ -195,6 +203,7 @@ light_power = 0.5 light_color = "#FFFFFF" impact_effect_type = /obj/effect/temp_visual/impact_effect/monochrome_laser + hud_state = "electrothermal" /obj/item/projectile/energy/florayield/on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target @@ -212,6 +221,7 @@ name = "flayer ray" combustion = FALSE + hud_state = "electrothermal" /obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0) if(ishuman(target)) @@ -227,6 +237,7 @@ nodamage = 1 damage_type = HALLOSS muzzle_type = /obj/effect/projectile/muzzle/bullet + hud_state = "monkey" /obj/item/projectile/bola name = "bola" @@ -235,6 +246,7 @@ embed_chance = 0 //Nada. damage_type = HALLOSS muzzle_type = null + hud_state = "monkey" combustion = FALSE @@ -254,7 +266,7 @@ embed_chance = 0 //Nada. damage_type = BRUTE muzzle_type = null - + hud_state = "monkey" combustion = FALSE /obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0) @@ -276,6 +288,7 @@ light_range = 4 light_power = 3 light_color = "#3300ff" + hud_state = "alloy_spike" muzzle_type = /obj/effect/projectile/muzzle/tungsten tracer_type = /obj/effect/projectile/tracer/tungsten diff --git a/icons/mob/screen_ammo.dmi b/icons/mob/screen_ammo.dmi new file mode 100644 index 0000000000000000000000000000000000000000..57ab8e772e95e5c28da09592b8f1c4b0afc4d4bc GIT binary patch literal 5633 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 Ylv|rU=grWjbN`+ncXT^ibr^m5UtS#DF#rGn literal 0 HcmV?d00001 From 100e915cbd7bf9f7c8c7c64b99c66a882d219456 Mon Sep 17 00:00:00 2001 From: spookerton Date: Fri, 8 Apr 2022 00:44:08 +0100 Subject: [PATCH 13/30] replace the crazy global vars decl, hide vchatdb /database is a curse but only here --- code/controllers/globals.dm | 6 ++ .../view_variables/view_variables_global.dm | 74 +++++++++++-------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index c92d42d82a..7e088b6449 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -43,6 +43,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) return FALSE return ..() + +/datum/controller/global_vars/VV_hidden() + return list( + "vchatdb" + ) + /datum/controller/global_vars/Initialize() gvars_datum_init_order = list() gvars_datum_protected_varlist = list(NAMEOF(src, gvars_datum_protected_varlist) = TRUE) diff --git a/code/modules/admin/view_variables/view_variables_global.dm b/code/modules/admin/view_variables/view_variables_global.dm index 1f6f2d52d6..3d7302caf2 100644 --- a/code/modules/admin/view_variables/view_variables_global.dm +++ b/code/modules/admin/view_variables/view_variables_global.dm @@ -1,40 +1,49 @@ -/proc/readglobal(which) - . = global.vars[which] - -/proc/writeglobal(which, newval) - global.vars[which] = newval +GLOBAL_DATUM(debug_real_globals, /debug_real_globals) // :3c -/proc/getallglobals() - . = list() - for(var/some_global in global.vars) - . += some_global -/var/decl/global_vars/global_vars_ +/debug_real_globals/vv_get_header() + return list("Debug: Real Globals
") -/decl/global_vars - var/name = "Global Variables" -/decl/global_vars/get_view_variables_options() - return "" // Ensuring changes to the base proc never affect us +/debug_real_globals/get_variables() + var/static/list/cache + if (!cache) + cache = list() + var/list/hidden = VV_hidden() + for (var/name in global.vars) + if (name in hidden) + continue + cache |= name + cache = sortList(cache) + if (!usr || !check_rights(R_ADMIN|R_DEBUG, FALSE)) + var/static/list/locked + if (!locked) + locked = VV_locked() + return (cache - locked) + return cache.Copy() -/decl/global_vars/get_variables() - . = getallglobals() - VV_hidden() - if(!usr || !check_rights(R_ADMIN|R_DEBUG, FALSE)) - . -= VV_secluded() -/decl/global_vars/get_variable_value(varname) - return readglobal(varname) +/debug_real_globals/make_view_variables_variable_entry(name, value) + return {"(E) "} -/decl/global_vars/set_variable_value(varname, value) - writeglobal(varname, value) -/decl/global_vars/make_view_variables_variable_entry(varname, value) - return "(E) " +/debug_real_globals/set_variable_value(name, value) + global.vars[name] = value -/decl/global_vars/VV_locked() + +/debug_real_globals/get_variable_value(name) + return global.vars[name] + + +/debug_real_globals/get_view_variables_options() + return "" + + +/debug_real_globals/VV_locked() return vars -/decl/global_vars/VV_hidden() + +/debug_real_globals/VV_hidden() return list( "forumsqladdress", "forumsqldb", @@ -79,13 +88,14 @@ "adminlogs", "cardinal", "cardinalz", - "IClog" + "IClog", + "vchatdb" ) + /client/proc/debug_global_variables() set category = "Debug" - set name = "View Global Variables" - - if(!global_vars_) - global_vars_ = new() - debug_variables(global_vars_) \ No newline at end of file + set name = "View Real Globals" + if (!GLOB.debug_real_globals) + GLOB.debug_real_globals = new + debug_variables(GLOB.debug_real_globals) From b20117b3068c8fd5f961bc34487cec3f13bf8c89 Mon Sep 17 00:00:00 2001 From: Sypsoti Date: Fri, 8 Apr 2022 16:26:21 -0500 Subject: [PATCH 14/30] adds late init --- code/game/machinery/computer/message.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index e5074c06f0..2b408982ab 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -69,11 +69,15 @@ ..() /obj/machinery/computer/message_monitor/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/computer/message_monitor/LateInitialize() + . = ..() //Is the server isn't linked to a server, and there's a server available, default it to the first one in the list. if(!linkedServer) if(message_servers && message_servers.len > 0) linkedServer = message_servers[1] - return ..() /obj/machinery/computer/message_monitor/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) From 11dcaf97b8e9264c1af31bed0cff1063d1e41582 Mon Sep 17 00:00:00 2001 From: spookerton Date: Tue, 5 Apr 2022 20:11:05 +0100 Subject: [PATCH 15/30] updated get_atom_on_turf accounts for bad cases (non-movable subject, subject with a bad loc) gently improves loop test performance --- code/_helpers/turfs.dm | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index 109f29a4f9..ad4c343d9c 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -1,10 +1,20 @@ -// Returns the atom sitting on the turf. -// For example, using this on a disk, which is in a bag, on a mob, will return the mob because it's on the turf. -/proc/get_atom_on_turf(var/atom/movable/M) - var/atom/mloc = M - while(mloc && mloc.loc && !istype(mloc.loc, /turf/)) - mloc = mloc.loc - return mloc +/** +* Returns a best attempt at the least-nested containing movable of subject, or subject. +* eg, if subject is an item in a bag on a mob in a locker in the world, returns the locker. +*/ +/proc/get_atom_on_turf(atom/movable/subject) + var/atom/parent = subject?.loc + if (!parent || !ismovable(subject) || isarea(parent)) + return subject + var/atom/current = subject + do + parent = current.loc + if (isturf(parent)) + return current + current = parent + while (current) + return subject + /proc/iswall(turf/T) return (istype(T, /turf/simulated/wall) || istype(T, /turf/unsimulated/wall) || istype(T, /turf/simulated/shuttle/wall)) From 5bea34d56aea96c534dd56f463d16e0ecb4fadb0 Mon Sep 17 00:00:00 2001 From: spookerton Date: Sun, 3 Apr 2022 11:15:18 +0100 Subject: [PATCH 16/30] human/get_visible_gender applies user perspective Changed the signature of atom/get_visible_gender to support human* mob use human/get_visible_gender accepts a user and a force var force can be used to force PLURAL, the examinee's id gender, or bio gender human/get_visible_gender takes the examinee's clothing into account human/get_visible_gender handles ambiguous_gender when there is a user: - if also human*, same species gets id gender, otherwise plural - if observer / silicon, id gender fixes #7207 --- code/__defines/mobs.dm | 12 +++++++- code/game/atoms.dm | 2 +- .../mob/living/carbon/human/examine.dm | 22 ++++----------- code/modules/mob/living/carbon/human/human.dm | 28 ++++++++++++++----- 4 files changed, 39 insertions(+), 25 deletions(-) diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 39fd330f8b..589d529bee 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -442,4 +442,14 @@ #define DEATHGASP_NO_MESSAGE "no message" -#define RESIST_COOLDOWN 2 SECONDS \ No newline at end of file +#define RESIST_COOLDOWN 2 SECONDS + + +/// Used by human/get_visible_gender(user, force) to return PLURAL +#define VISIBLE_GENDER_FORCE_PLURAL 1 + +/// Used by human/get_visible_gender(user, force) to return the mob's identifying gender +#define VISIBLE_GENDER_FORCE_IDENTIFYING 2 + +/// Used by human/get_visible_gender(user, force) to return the mob's biological gender +#define VISIBLE_GENDER_FORCE_BIOLOGICAL 3 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 29632a7bfb..ea7326f51e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -649,5 +649,5 @@ var/global/list/pre_init_created_atoms // atom creation ordering means some stuf . = ..() SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc) -/atom/proc/get_visible_gender() +/atom/proc/get_visible_gender(mob/user, force) return gender diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index efa90d3116..ba0d770728 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -76,22 +76,12 @@ BP_L_LEG = skip_body & EXAMINE_SKIPLEGS, BP_R_LEG = skip_body & EXAMINE_SKIPLEGS) - var/datum/gender/T = gender_datums[get_visible_gender()] - - if((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) //big suits/masks/helmets make it hard to tell their gender - T = gender_datums[PLURAL] - - else if(species && species.ambiguous_genders) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.species && !istype(species, H.species)) - T = gender_datums[PLURAL]// Species with ambiguous_genders will not show their true gender upon examine if the examiner is not also the same species. - if(!(issilicon(user) || isobserver(user))) // Ghosts and borgs are all knowing - T = gender_datums[PLURAL] - - if(!T) - // Just in case someone VVs the gender to something strange. It'll runtime anyway when it hits usages, better to CRASH() now with a helpful message. - CRASH("Gender datum was null; key was '[((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE)) ? PLURAL : gender]'") + + var/gender_hidden = (skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE) + var/gender_key = get_visible_gender(user, gender_hidden) + var/datum/gender/T = gender_datums[gender_key] + if (!T) + CRASH({"Null gender datum on examine: mob="[src]",hidden="[gender_hidden]",key="[gender_key]",bio="[gender]",id="[identifying_gender]""}) var/name_ender = "" if(!((skip_gear & EXAMINE_SKIPJUMPSUIT) && (skip_body & EXAMINE_SKIPFACE))) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b0b2a7c8ae..20e5469e75 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -849,13 +849,27 @@ remoteview_target = null reset_view(0) -/mob/living/carbon/human/get_visible_gender() - if(wear_suit && wear_suit.flags_inv & HIDEJUMPSUIT && ((head && head.flags_inv & HIDEMASK) || wear_mask)) - return PLURAL //plural is the gender-neutral default - if(species) - if(species.ambiguous_genders) - return PLURAL // regardless of what you're wearing, your gender can't be figured out - return get_gender() + +/mob/living/carbon/human/get_visible_gender(mob/user, force) + switch (force) + if (VISIBLE_GENDER_FORCE_PLURAL) + return PLURAL + if (VISIBLE_GENDER_FORCE_IDENTIFYING) + return get_gender() + if (VISIBLE_GENDER_FORCE_BIOLOGICAL) + return gender + else + if ((wear_mask || (head?.flags_inv & HIDEMASK)) && (wear_suit?.flags_inv & HIDEJUMPSUIT)) + return PLURAL + if (species?.ambiguous_genders && user) + if (ishuman(user)) + var/mob/living/carbon/human/human = user + if (!istype(human.species, species)) + return PLURAL + else if (!isobserver(user) && !issilicon(user)) + return PLURAL + return get_gender() + /mob/living/carbon/human/proc/increase_germ_level(n) if(gloves) From c82c18769f8c5e17da932dbf7e00e8dfc7948173 Mon Sep 17 00:00:00 2001 From: spookerton Date: Thu, 7 Apr 2022 19:36:55 +0100 Subject: [PATCH 17/30] improved fire loop behavior of SSai & SSaifast --- code/__defines/ai.dm | 9 ++++ code/controllers/subsystems/ai.dm | 57 ++++++++++++++++++-------- code/controllers/subsystems/aifast.dm | 59 ++++++++++++++++++--------- code/modules/ai/ai_holder.dm | 8 ---- polaris.dme | 1 + 5 files changed, 89 insertions(+), 45 deletions(-) create mode 100644 code/__defines/ai.dm diff --git a/code/__defines/ai.dm b/code/__defines/ai.dm new file mode 100644 index 0000000000..2f7d9db3a0 --- /dev/null +++ b/code/__defines/ai.dm @@ -0,0 +1,9 @@ + +/// Used in ai/manage_processing to indicate that the AI should be dequeued from slow and fast AI processing +#define AI_NO_PROCESS 0 + +/// Used in ai/manage_processing to indicate that the AI should be queued for slow AI processing, and for related subsystem checks +#define AI_PROCESSING (1 << 0) + +/// Used in ai/manage_processing to indicate that the AI should be queued for fast AI processing, and for related subsystem checks +#define AI_FASTPROCESSING (1 << 1) diff --git a/code/controllers/subsystems/ai.dm b/code/controllers/subsystems/ai.dm index 57bd5cc1ac..46b078cde9 100644 --- a/code/controllers/subsystems/ai.dm +++ b/code/controllers/subsystems/ai.dm @@ -1,32 +1,53 @@ SUBSYSTEM_DEF(ai) name = "AI" - init_order = INIT_ORDER_AI - priority = FIRE_PRIORITY_AI - wait = 2 SECONDS flags = SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + priority = FIRE_PRIORITY_AI + wait = 2 SECONDS + + /// The list of AI datums to be processed. + var/static/tmp/list/queue = list() + + /// The list of AI datums currently being processed. + var/static/tmp/list/current = list() - var/list/processing = list() - var/list/currentrun = list() /datum/controller/subsystem/ai/stat_entry(msg_prefix) var/list/msg = list(msg_prefix) - msg += "P:[processing.len]" + msg += "P:[queue.len]" ..(msg.Join()) + +/datum/controller/subsystem/ai/Recover() + current.Cut() + + /datum/controller/subsystem/ai/fire(resumed, no_mc_tick) if (!resumed) - src.currentrun = processing.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/ai_holder/A = currentrun[currentrun.len] - --currentrun.len - if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick + current = queue.Copy() + var/datum/ai_holder/subject + for (var/i = current.len to 1 step -1) + subject = current[i] + if (QDELETED(subject) || subject.busy) continue - A.handle_strategicals() - - if(MC_TICK_CHECK) + subject.handle_strategicals() + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + current.Cut(i) return + current.Cut() + + +/// Convenience define for safely enqueueing an AI datum for slow processing. +#define START_AIPROCESSING(DATUM) \ +if (!(DATUM.process_flags & AI_PROCESSING)) {\ + DATUM.process_flags |= AI_PROCESSING;\ + SSai.queue += DATUM;\ +} + + +/// Convenience define for safely dequeueing an AI datum from slow processing. +#define STOP_AIPROCESSING(DATUM) \ +DATUM.process_flags &= ~AI_PROCESSING; \ +SSai.queue -= DATUM; diff --git a/code/controllers/subsystems/aifast.dm b/code/controllers/subsystems/aifast.dm index 6ce841855d..d4a70a3853 100644 --- a/code/controllers/subsystems/aifast.dm +++ b/code/controllers/subsystems/aifast.dm @@ -1,32 +1,53 @@ SUBSYSTEM_DEF(aifast) - name = "AI (Fast)" - init_order = INIT_ORDER_AI_FAST - priority = FIRE_PRIORITY_AI - wait = 0.25 SECONDS + name = "AI Fast" flags = SS_NO_INIT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + priority = FIRE_PRIORITY_AI + wait = 0.25 SECONDS + + /// The list of AI datums to be processed. + var/static/tmp/list/queue = list() + + /// The list of AI datums currently being processed. + var/static/tmp/list/current = list() - var/list/processing = list() - var/list/currentrun = list() /datum/controller/subsystem/aifast/stat_entry(msg_prefix) var/list/msg = list(msg_prefix) - msg += "P:[processing.len]" + msg += "P:[queue.len]" ..(msg.Join()) + +/datum/controller/subsystem/aifast/Recover() + current.Cut() + + /datum/controller/subsystem/aifast/fire(resumed, no_mc_tick) if (!resumed) - src.currentrun = processing.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/ai_holder/A = currentrun[currentrun.len] - --currentrun.len - if(!A || QDELETED(A) || A.busy) // Doesn't exist or won't exist soon or not doing it this tick + current = queue.Copy() + var/datum/ai_holder/subject + for (var/i = current.len to 1 step -1) + subject = current[i] + if (QDELETED(subject) || subject.busy) continue - A.handle_tactics() - - if(MC_TICK_CHECK) + subject.handle_tactics() + if (no_mc_tick) + CHECK_TICK + else if (MC_TICK_CHECK) + current.Cut(i) return + current.Cut() + + +/// Convenience define for safely enqueueing an AI datum for fast processing. +#define START_AIFASTPROCESSING(DATUM) \ +if (!(DATUM.process_flags & AI_FASTPROCESSING)) {\ + DATUM.process_flags |= AI_FASTPROCESSING;\ + SSaifast.queue += DATUM;\ +} + + +/// Convenience define for safely dequeueing an AI datum from fast processing. +#define STOP_AIFASTPROCESSING(DATUM) \ +DATUM.process_flags &= ~AI_FASTPROCESSING; \ +SSaifast.queue -= DATUM; diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm index 21d9cd8588..a285225286 100644 --- a/code/modules/ai/ai_holder.dm +++ b/code/modules/ai/ai_holder.dm @@ -1,14 +1,6 @@ // This is a datum-based artificial intelligence for simple mobs (and possibly others) to use. // The neat thing with having this here instead of on the mob is that it is independant of Life(), and that different mobs // can use a more or less complex AI by giving it a different datum. -#define AI_NO_PROCESS 0 -#define AI_PROCESSING (1<<0) -#define AI_FASTPROCESSING (1<<1) - -#define START_AIPROCESSING(Datum) if (!(Datum.process_flags & AI_PROCESSING)) {Datum.process_flags |= AI_PROCESSING;SSai.processing += Datum} -#define STOP_AIPROCESSING(Datum) Datum.process_flags &= ~AI_PROCESSING;SSai.processing -= Datum -#define START_AIFASTPROCESSING(Datum) if (!(Datum.process_flags & AI_FASTPROCESSING)) {Datum.process_flags |= AI_FASTPROCESSING;SSaifast.processing += Datum} -#define STOP_AIFASTPROCESSING(Datum) Datum.process_flags &= ~AI_FASTPROCESSING;SSaifast.processing -= Datum /mob/living var/datum/ai_holder/ai_holder = null diff --git a/polaris.dme b/polaris.dme index 2279763bc2..88fbdc7fab 100644 --- a/polaris.dme +++ b/polaris.dme @@ -26,6 +26,7 @@ #include "code\__defines\_protect.dm" #include "code\__defines\_tick.dm" #include "code\__defines\admin.dm" +#include "code\__defines\ai.dm" #include "code\__defines\appearance.dm" #include "code\__defines\atmos.dm" #include "code\__defines\callbacks.dm" From 192d01ee5bdf1f936980d7dbe3b3f3ae2da6d0ef Mon Sep 17 00:00:00 2001 From: Rykka Date: Sun, 10 Apr 2022 11:08:36 -0600 Subject: [PATCH 18/30] Fixes 6 year old bug with icon filepaths being override in update_icon Specific to mining turfs, but I imagine others might have this. The reason we don't directly pull from 'icon' is to allow turf making folk to have some fun to play with it, make the icon change only on update, etc. If preferred, icon_path var can just be set to grab the turf's base icon path, but I prefer the var imo. --- code/modules/mining/mine_turfs.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 2c537bd4c8..30fe22fc78 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -23,6 +23,8 @@ var/list/mining_overlay_cache = list() var/rock_side_icon_state = "rock_side" var/sand_icon_state = "asteroid" var/rock_icon_state = "rock" + var/sand_icon_path = 'icons/turf/flooring/asteroid.dmi' // Override this on a subtype turf if you want a custom icon + var/rock_icon_path = 'icons/turf/walls.dmi' // Override this on a subtype turf if you want a custom icon var/random_icon = 0 var/ore/mineral @@ -30,6 +32,7 @@ var/list/mining_overlay_cache = list() var/mined_ore = 0 var/last_act = 0 var/overlay_detail + var/overlay_detail_icon_path = 'icons/turf/flooring/decals.dmi' // Override this on a subtype turf if you want a custom icon var/datum/geosample/geologic_data var/excavation_level = 0 @@ -266,7 +269,7 @@ var/list/mining_overlay_cache = list() else name = "rock" - icon = 'icons/turf/walls.dmi' + icon = rock_icon_path icon_state = rock_icon_state //Apply overlays if we should have borders @@ -284,7 +287,7 @@ var/list/mining_overlay_cache = list() //We are a sand floor else name = floor_name - icon = 'icons/turf/flooring/asteroid.dmi' + icon = sand_icon_path icon_state = sand_icon_state if(sand_dug) @@ -299,11 +302,11 @@ var/list/mining_overlay_cache = list() else var/turf/T = get_step(src, direction) if(istype(T) && T.density) - add_overlay(get_cached_border(rock_side_icon_state,direction,'icons/turf/walls.dmi',rock_side_icon_state)) + add_overlay(get_cached_border(rock_side_icon_state,direction,rock_icon_path,rock_side_icon_state)) if(overlay_detail) if(overlay_detail in icon_states(icon)) - add_overlay('icons/turf/flooring/decals.dmi',overlay_detail) + add_overlay(overlay_detail_icon_path,overlay_detail) if(update_neighbors) for(var/direction in alldirs) From 68bc068df52e957e380a7d2f9d303264f9ecefc9 Mon Sep 17 00:00:00 2001 From: Cerebulon Date: Mon, 11 Apr 2022 04:56:18 +0100 Subject: [PATCH 19/30] New holobadges, holsters, and sprites --- .../loadout/loadout_accessories.dm | 27 +++++- .../clothing/under/accessories/accessory.dm | 14 +++ .../clothing/under/accessories/badges.dm | 84 +++++++++++++++--- .../clothing/under/accessories/holster.dm | 18 +++- icons/mob/ties.dmi | Bin 86935 -> 89852 bytes icons/obj/clothing/ties.dmi | Bin 64237 -> 67840 bytes 6 files changed, 126 insertions(+), 17 deletions(-) diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 4a271fde93..e26a98cc25 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -121,6 +121,18 @@ ..() gear_tweaks += gear_tweak_free_color_choice +/datum/gear/accessory/bowtie + display_name = "bowtie selection" + path = /obj/item/clothing/accessory/bowtie + cost = 1 + +/datum/gear/accessory/bowtie/New() + ..() + var/list/bowties = list() + for(var/obj/item/clothing/accessory/bowtie_type as anything in typesof(/obj/item/clothing/accessory/bowtie)) + bowties[initial(bowtie_type.name)] = bowtie_type + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bowties)) + /datum/gear/accessory/jacket display_name = "suit jacket selection" path = /obj/item/clothing/accessory/jacket @@ -306,4 +318,17 @@ for(var/pridepin in typesof(/obj/item/clothing/accessory/pride)) var/obj/item/clothing/accessory/pridepin_type = pridepin pridepins[initial(pridepin_type.name)] = pridepin_type - gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins)) \ No newline at end of file + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(pridepins)) + +/datum/gear/accessory/corpbadge + display_name = "investigator holobadge (IAA)" + path = /obj/item/clothing/accessory/badge/holo/investigator + allowed_roles = list("Internal affairs agent") + +/datum/gear/accessory/pressbadge + display_name = "corporate press pass" + path = /obj/item/clothing/accessory/badge/press + +/datum/gear/accessory/pressbadge + display_name = "freelance press pass" + path = /obj/item/clothing/accessory/badge/press/independent \ No newline at end of file diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index c6a886d26d..29e5c57526 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -157,6 +157,20 @@ desc = "A neosilk clip-on tie. This one is disgusting." icon_state = "horribletie" +/obj/item/clothing/accessory/bowtie + name = "red bow tie" + desc = "Snazzy!" + icon_state = "redbowtie" + slot = ACCESSORY_SLOT_TIE + +/obj/item/clothing/accessory/bowtie/black + name = "black bow tie" + icon_state = "blackbowtie" + +/obj/item/clothing/accessory/bowtie/white + name = "white bow tie" + icon_state = "whitebowtie" + /obj/item/clothing/accessory/stethoscope name = "stethoscope" desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 75e8dc8e4d..06a0889bf9 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -6,19 +6,14 @@ /obj/item/clothing/accessory/badge name = "detective's badge" - desc = "Security Department detective's badge, made from gold." - icon_state = "badge" + desc = "NanoTrasen Security Department detective's badge, made from gold." + icon_state = "marshalbadge" slot_flags = SLOT_BELT | SLOT_TIE slot = ACCESSORY_SLOT_MEDAL var/stored_name var/badge_string = "Corporate Security" -/obj/item/clothing/accessory/badge/old - name = "faded badge" - desc = "A faded badge, backed with leather. It bears the emblem of the Forensic division." - icon_state = "badge_round" - /obj/item/clothing/accessory/badge/proc/set_name(var/new_name) stored_name = new_name name = "[initial(name)] ([stored_name])" @@ -48,8 +43,8 @@ /obj/item/clothing/accessory/badge/sheriff name = "sheriff badge" desc = "This town ain't big enough for the two of us, pardner." - icon_state = "sheriff" - item_state = "goldbadge" + icon_state = "sheriff_toy" + item_state = "sheriff_toy" /obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob) user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\ @@ -61,10 +56,10 @@ user.do_attack_animation(M) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam -//.Holobadges. +//Security Holobadges /obj/item/clothing/accessory/badge/holo name = "holobadge" - desc = "This glowing blue badge marks the holder as THE LAW." + desc = "This glowing blue badge marks the holder as law enforcement." icon_state = "holobadge" var/emagged //Emagging removes Sec check. @@ -111,9 +106,16 @@ desc = "A box claiming to contain holobadges." starts_with = list( /obj/item/clothing/accessory/badge/holo = 4, + /obj/item/clothing/accessory/badge/holo/officer = 2, /obj/item/clothing/accessory/badge/holo/cord = 2 ) +/obj/item/clothing/accessory/badge/holo/officer + name = "officer's badge" + desc = "A bronze corporate security badge. Stamped with the words 'Security Officer.'" + icon_state = "bronzebadge" + slot_flags = SLOT_TIE | SLOT_BELT + /obj/item/clothing/accessory/badge/holo/warden name = "warden's holobadge" desc = "A silver corporate security badge. Stamped with the words 'Warden.'" @@ -122,7 +124,7 @@ /obj/item/clothing/accessory/badge/holo/hos name = "head of security's holobadge" - desc = "An immaculately polished gold security badge. Labeled 'Head of Security.'" + desc = "An immaculately polished gold security badge. Stamped with the words 'Head of Security.'" icon_state = "goldbadge" slot_flags = SLOT_TIE | SLOT_BELT @@ -141,9 +143,65 @@ /obj/item/clothing/accessory/badge/holo/detective = 2, /obj/item/clothing/accessory/badge/holo/hos = 1, /obj/item/clothing/accessory/badge/holo/cord = 1 - + ) +/obj/item/clothing/accessory/badge/holo/investigator + name = "\improper Internal Investigations holobadge" + desc = "This badge marks the holder as an internal affairs investigator." + icon_state = "invbadge" + badge_string = "Internal Investigations" + slot_flags = SLOT_TIE | SLOT_BELT + +/obj/item/clothing/accessory/badge/holo/sheriff + name = "sheriff badge" + desc = "A star-shaped brass badge denoting who the law is around these parts." + icon_state = "sheriff" + slot_flags = SLOT_TIE | SLOT_BELT + +//Other badges + +/obj/item/clothing/accessory/badge/old + name = "faded badge" + desc = "A faded law enforcement badge in an older design." + icon_state = "badge_round" + +/obj/item/clothing/accessory/badge/solid + name = "\improper SolGov ID badge" + desc = "A descriptive identification badge with the holder's credentials. This one is blue with the emblem of the SCG." + icon_state = "solbadge" + badge_string = null + +/obj/item/clothing/accessory/badge/ntid + name = "\improper NT ID badge" + desc = "A descriptive identification badge with the holder's credentials. This one has red marks with the NanoTrasen logo on it." + icon_state = "ntbadge" + badge_string = null + +/obj/item/clothing/accessory/badge/press + name = "corporate press pass" + desc = "A corporate reporter's pass, emblazoned with the NanoTrasen logo." + icon_state = "pressbadge" + item_state = "pbadge" + badge_string = "Corporate Reporter" + w_class = ITEMSIZE_TINY + + drop_sound = 'sound/items/drop/rubber.ogg' + pickup_sound = 'sound/items/pickup/rubber.ogg' + +/obj/item/clothing/accessory/badge/press/independent + name = "press pass" + desc = "A freelance journalist's pass, certified by Oculum Broadcast." + icon_state = "pressbadge-i" + badge_string = "Freelance Journalist" + +/obj/item/clothing/accessory/badge/press/plastic + name = "plastic press pass" + desc = "A journalist's 'pass' shaped, for whatever reason, like a security badge. It is made of plastic." + icon_state = "pbadge" + badge_string = "Sicurity Journelist" + w_class = ITEMSIZE_SMALL + // Synthmorph bag / Corporation badges. Primarily used on the robobag, but can be worn. Default is NT. /obj/item/clothing/accessory/badge/corporate_tag diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 72cbcb91ae..e99a816e86 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -135,22 +135,34 @@ desc = "A worn-out handgun holster. Perfect for concealed carry" icon_state = "holster" +/obj/item/clothing/accessory/holster/armpit/black + icon_state = "holster_b" + /obj/item/clothing/accessory/holster/waist name = "waist holster" desc = "A handgun holster. Made of expensive leather." - icon_state = "holster" + icon_state = "holster_low" overlay_state = "holster_low" concealed_holster = 0 +/obj/item/clothing/accessory/holster/waist/black + icon_state = "holster_b_low" + /obj/item/clothing/accessory/holster/hip name = "hip holster" - desc = "A handgun holster slung low on the hip, draw pardner!" + desc = "No one dared to ask his business, no one dared to make a slip. The stranger there among them had a big iron on his hip." icon_state = "holster_hip" concealed_holster = 0 +/obj/item/clothing/accessory/holster/hip/black + icon_state = "holster_b_hip" + /obj/item/clothing/accessory/holster/leg name = "leg holster" - desc = "A tacticool handgun holster. Worn on the upper leg." + desc = "A drop leg holster worn on the upper leg." icon_state = "holster_leg" overlay_state = "holster_leg" concealed_holster = 0 + +/obj/item/clothing/accessory/holster/leg/black + icon_state = "holster_b_leg" \ No newline at end of file diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index db8f1bda59d32d6bd67ef736180dab56bcab170a..f701e0ebcdda3cde702b5617ea3990996a6bf430 100644 GIT binary patch literal 89852 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 literal 86935 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