From eb4743e5a9a36de018e7d58bdfe64f5f3fa5a011 Mon Sep 17 00:00:00 2001 From: Naksu Date: Tue, 8 May 2018 12:56:51 +0300 Subject: [PATCH 01/63] every fucking time --- code/modules/atmospherics/gasmixtures/reactions.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 689abbc388..15c2f1e4a6 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -191,7 +191,7 @@ //fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again. /datum/gas_reaction/fusion - exclude = FALSE + exclude = TRUE priority = 2 name = "Plasmic Fusion" id = "fusion" From a4410b2aec3c2e1f5077d78d9d38cd9661211209 Mon Sep 17 00:00:00 2001 From: FrozenGuy5 <31222036+praisenarsie@users.noreply.github.com> Date: Tue, 8 May 2018 19:21:22 +0100 Subject: [PATCH 03/63] Makes eye of god lava & fire proof (#37710) * Makes eye of god lava & fire proof * eye of god is fire and lava proof --- code/modules/clothing/glasses/_glasses.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index eaeedee36c..effe54aa51 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -365,6 +365,7 @@ scan_reagents = 1 flags_1 = NODROP_1 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + resistance_flags = LAVA_PROOF | FIRE_PROOF /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) From baee4dead58dd0acf1d11d8450acc7d3a9751bc0 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Tue, 8 May 2018 14:37:05 -0400 Subject: [PATCH 05/63] Merge pull request #37396 from KorPhaeron/mrcitruswantsyoutoclockin Track admin observer time --- code/__DEFINES/preferences.dm | 1 + code/modules/jobs/job_exp.dm | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 7ba693be0a..0dc8a38899 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -64,6 +64,7 @@ #define EXP_TYPE_ANTAG "Antag" #define EXP_TYPE_SPECIAL "Special" #define EXP_TYPE_GHOST "Ghost" +#define EXP_TYPE_ADMIN "Admin" //Flags in the players table in the db #define DB_FLAG_EXEMPT 1 diff --git a/code/modules/jobs/job_exp.dm b/code/modules/jobs/job_exp.dm index 3aad52e596..b4679ae479 100644 --- a/code/modules/jobs/job_exp.dm +++ b/code/modules/jobs/job_exp.dm @@ -226,9 +226,14 @@ GLOBAL_PROTECT(exp_to_update) if(!rolefound) play_records["Unknown"] += minutes else - play_records[EXP_TYPE_GHOST] += minutes - if(announce_changes) - to_chat(src,"You got: [minutes] Ghost EXP!") + if(holder && !holder.deadmined) + play_records[EXP_TYPE_ADMIN] += minutes + if(announce_changes) + to_chat(src,"You got: [minutes] Admin EXP!") + else + play_records[EXP_TYPE_GHOST] += minutes + if(announce_changes) + to_chat(src,"You got: [minutes] Ghost EXP!") else if(isobserver(mob)) play_records[EXP_TYPE_GHOST] += minutes if(announce_changes) From 003eced6af6d11b4c5a93dae2681aaa1c960cb8b Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Wed, 9 May 2018 00:39:59 +0300 Subject: [PATCH 07/63] [s] Removes some stationloving-related failure surface (#37727) COMSIG_TRY_STORAGE_TAKE fails, leaving the disk out-of-bounds. forceMove HAS to be good enough here. --- code/datums/components/stationloving.dm | 8 +------- code/game/objects/items.dm | 15 +++++++++++++++ code/modules/mob/inventory.dm | 5 ++++- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/code/datums/components/stationloving.dm b/code/datums/components/stationloving.dm index a999624c32..54f8b107e0 100644 --- a/code/datums/components/stationloving.dm +++ b/code/datums/components/stationloving.dm @@ -28,13 +28,7 @@ CRASH("Unable to find a blobstart landmark") var/atom/movable/AM = parent - if(ismob(AM.loc)) - var/mob/M = AM.loc - M.transferItemToLoc(AM, targetturf, TRUE) //nodrops disks when? - else if(AM.loc.SendSignal(COMSIG_CONTAINS_STORAGE)) - AM.loc.SendSignal(COMSIG_TRY_STORAGE_TAKE, src, targetturf, TRUE) - else - AM.forceMove(targetturf) + AM.forceMove(targetturf) // move the disc, so ghosts remain orbiting it even if it's "destroyed" return targetturf diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4e298032db..e5335049ec 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -766,3 +766,18 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // Returns a numeric value for sorting items used as parts in machines, so they can be replaced by the rped /obj/item/proc/get_part_rating() return 0 + +/obj/item/doMove(atom/destination) + if (ismob(loc)) + var/mob/M = loc + var/hand_index = M.get_held_index_of_item(src) + if(hand_index) + M.held_items[hand_index] = null + M.update_inv_hands() + if(M.client) + M.client.screen -= src + layer = initial(layer) + plane = initial(plane) + appearance_flags &= ~NO_CLIENT_COLOR + dropped(M) + return ..() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index a7b28dd658..48951e4cd3 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -326,7 +326,10 @@ I.plane = initial(I.plane) I.appearance_flags &= ~NO_CLIENT_COLOR if(!no_move && !(I.flags_1 & DROPDEL_1)) //item may be moved/qdel'd immedietely, don't bother moving it - I.forceMove(newloc) + if (isnull(newloc)) + I.moveToNullspace() + else + I.forceMove(newloc) I.dropped(src) return TRUE From b0496f63a660c6c98e9f29c92ed59889dc2ea803 Mon Sep 17 00:00:00 2001 From: TheDreamweaver Date: Tue, 8 May 2018 18:07:29 -0700 Subject: [PATCH 09/63] [READY] Properly Adds a suicide action to the hand tele --- code/game/objects/items/teleportation.dm | 14 +++ config/admins.txt | 139 +++++++++++++++++++++++ 2 files changed, 153 insertions(+) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index cc7e3249d4..dc6fbfe25b 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -219,3 +219,17 @@ if(active_portal_pairs[i] == P) return DESTINATION_PORTAL return FALSE + +/obj/item/hand_tele/suicide_act(mob/user) + if(iscarbon(user)) + user.visible_message("[user] is creating a weak portal and sticking [user.p_their()] head through! It looks like [user.p_theyre()] trying to commit suicide!") + var/mob/living/carbon/itemUser = user + var/obj/item/bodypart/head/head = itemUser.get_bodypart(BODY_ZONE_HEAD) + if(head) + head.drop_limb() + var/list/safeLevels = SSmapping.levels_by_any_trait(list(ZTRAIT_SPACE_RUINS, ZTRAIT_LAVA_RUINS, ZTRAIT_STATION, ZTRAIT_MINING)) + head.forceMove(locate(rand(1, world.maxx), rand(1, world.maxy), pick(safeLevels))) + itemUser.visible_message("The portal snaps closed taking [user]'s head with it!") + else + itemUser.visible_message("[user] looks even further depressed as they realize they do not have a head...and suddenly dies of shame!") + return (BRUTELOSS) diff --git a/config/admins.txt b/config/admins.txt index ca77fd3f4a..6ac30f8ac3 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -1,3 +1,4 @@ +<<<<<<< HEAD ############################################################################################### # Basically, ckey goes first. Rank goes after the "=" # # Case is not important for ckey. # @@ -7,3 +8,141 @@ # NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### +======= +############################################################################################### +# Basically, ckey goes first. Rank goes after the "=" # +# Case is not important for ckey. # +# Case IS important for the rank. # +# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. # +# Ranks can be anything defined in admin_ranks.txt # +# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # +# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # +# If SQL-based admin loading is enabled, admins listed here will always be loaded first # +# and will override any duplicate entries in the database. # +############################################################################################### +Optimumtact = Host +NewSta = Game Master +Expletives = Game Master +kingofkosmos = Game Master +MrStonedOne = Lazy Master +microscopics = Game Master +Gun Hog = Game Master +KorPhaeron = Game Master +razharas = Game Master +Lordpidey = Game Master +Niknakflak = Game Master +rolan7 = Game Master +quarxink = Game Master +adrix89 = Game Master +tle = Game Master +xsi = Game Master +scaredofshadows = Game Master +neofite = Game Master +trubblebass = Game Master +mport2004 = Game Master +deuryn = Game Master +agouri = Game Master +errorage = Game Master +superxpdude = Game Master +petethegoat = Game Master +nodrak = Game Master +carnwennan = Game Master +ikarrus = Game Master +cheridan = Game Master +giacomand = Game Master +rockdtben = Game Master +sieve = Game Master +aranclanos = Game Master +intigracy = Game Master +dumpdavidson = Game Master +kazeespada = Game Master +malkevin = Game Master +incoming = Game Master +demas = Game Master +fleure = Game Master +ricotez = Game Master +misterperson = Game Master +crimsonvision = Game Master +iamgoofball = Game Master +zelacks = Game Master +androidsfv = Game Master +miggles = Game Master +jordie0608 = Game Master +s0ldi3rkr4s0 = Game Master +ergovisavi = Game Master +vistapowa = Game Master +miauw62 = Game Master +rumia29 = Game Master +bobylein = Game Master +sirbayer = Game Master +hornygranny = Game Master +yota = Game Master +firecage = Game Master +donkieyo = Game Master +argoneus = Game Master +paprka = Game Master +cookingboy3 = Game Master +limeliz = Game Master +steelpoint = Game Master +phil235 = Game Master +CorruptComputer = Game Master +xxnoob = Game Master +tkdrg = Game Master +Cuboos = Game Master +thunder12345 = Game Master +wjohnston = Game Master +mandurrh = Game Master +thurgatar = Game Master +xerux = Game Master +dannno = Game Master +lo6a4evskiy = Game Master +vekter = Game Master +Ahammer18 = Game Master +ACCount12 = Game Master +fayrik = Game Master +shadowlight213 = Game Master +drovidicorv = Game Master +Dunc = Game Master +MMMiracles = Game Master +bear1ake = Game Master +CoreOverload = Game Master +Jalleo = Game Master +ChangelingRain = Game Master +FoxPMcCloud = Game Master +Xhuis = Game Master +Astralenigma = Game Master +Tokiko1 = Game Master +SuperSayu = Game Master +Lzimann = Game Master +As334 = Game Master +neersighted = Game Master +Swankcookie = Game Master +Ressler = Game Master +Folix = Game Master +Bawhoppennn = Game Master +Anturke = Host +Lumipharon = Game Master +bgobandit = Game Master +coiax = Game Master +RandomMarine = Game Master +PKPenguin321 = Game Master +TechnoAlchemist = Game Master +Aloraydrel = Game Master +Quiltyquilty = Game Master +SnipeDragon = Game Master +Fjeld = Game Master +kevinz000 = Game Master +Tacolizard = Game Master +TrustyGun = Game Master +Cyberboss = Game Master +PJB3005 = Game Master +Sweaterkittens = Game Master +Feemjmeem = Game Master +JStheguy = Game Master +excessiveuseofcobby = Game Master +Plizzard = Game Master +octareenroon91 = Game Master +Serpentarium = Game Master +Averagejoe82 = Game Master +The Dreamweaver = Game Master +>>>>>>> 9ba7aa4... [READY] Properly Adds a suicide action to the hand tele (#37438) From b873222eba87d2f5d2e1afe15d89b6657b81bdfa Mon Sep 17 00:00:00 2001 From: PKPenguin321 Date: Tue, 8 May 2018 22:44:41 -0700 Subject: [PATCH 10/63] Integrated Circuits: String parsing update (#37571) * circuit tweaks two new variants of concatenators: small and large. each have corresponding complexity and inputs find text circuit now has two pulse outs, one for if it finds the text, one for if it does not. may break some old circuits but should be easy to fix * readds after search pulse out * adds length circuit for strings * null delimiter in exploder returns list of all chars * adds indexer circuit * actual null check * better descs * addresses review removed unneeded var * moves concatenator pin setup to initialize --- .../subtypes/converters.dm | 93 ++++++++++++++++--- 1 file changed, 78 insertions(+), 15 deletions(-) diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index 5f7dd24ad9..6937857be0 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -142,21 +142,18 @@ /obj/item/integrated_circuit/converter/concatenator name = "concatenator" - desc = "This joins many strings together to get one big string." + desc = "This can join up to 8 strings together to get one big string." complexity = 4 - inputs = list( - "A" = IC_PINTYPE_STRING, - "B" = IC_PINTYPE_STRING, - "C" = IC_PINTYPE_STRING, - "D" = IC_PINTYPE_STRING, - "E" = IC_PINTYPE_STRING, - "F" = IC_PINTYPE_STRING, - "G" = IC_PINTYPE_STRING, - "H" = IC_PINTYPE_STRING - ) + inputs = list() outputs = list("result" = IC_PINTYPE_STRING) activators = list("concatenate" = IC_PINTYPE_PULSE_IN, "on concatenated" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/number_of_pins = 8 + +/obj/item/integrated_circuit/converter/concatenator/Initialize() + for(var/i = 1 to number_of_pins) + inputs["input [i]"] = IC_PINTYPE_STRING + . = ..() /obj/item/integrated_circuit/converter/concatenator/do_work() var/result = null @@ -169,6 +166,18 @@ push_data() activate_pin(2) +/obj/item/integrated_circuit/converter/concatenator/small + name = "small concatenator" + desc = "This can join up to 4 strings together to get one big string." + complexity = 2 + number_of_pins = 4 + +/obj/item/integrated_circuit/converter/concatenator/large + name = "large concatenator" + desc = "This can join up to 16 strings together to get one very big string." + complexity = 6 + number_of_pins = 16 + /obj/item/integrated_circuit/converter/separator name = "separator" desc = "This splits as single string into two at the relative split point." @@ -203,6 +212,32 @@ activate_pin(2) +/obj/item/integrated_circuit/converter/indexer + name = "indexer" + desc = "This circuit takes a string and an index value, then returns the character found at in the string at the given index." + extended_desc = "Make sure the index is not longer or shorter than the string length. If you don't, the circuit will return empty." + icon_state = "split" + complexity = 4 + inputs = list( + "string to index" = IC_PINTYPE_STRING, + "index" = IC_PINTYPE_NUMBER, + ) + outputs = list( + "found character" = IC_PINTYPE_STRING + ) + activators = list("index" = IC_PINTYPE_PULSE_IN, "on indexed" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/converter/indexer/do_work() + var/strin = get_pin_data(IC_INPUT, 1) + var/ind = get_pin_data(IC_INPUT, 2) + if(ind > 0 && ind <= length(strin)) + set_pin_data(IC_OUTPUT, 1, strin[ind]) + else + set_pin_data(IC_OUTPUT, 1, "") + push_data() + activate_pin(2) + /obj/item/integrated_circuit/converter/findstring name = "find text" desc = "This gives position of sample in the string. Or returns 0." @@ -216,14 +251,38 @@ outputs = list( "position" = IC_PINTYPE_NUMBER ) - activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT) + activators = list("search" = IC_PINTYPE_PULSE_IN, "after search" = IC_PINTYPE_PULSE_OUT, "found" = IC_PINTYPE_PULSE_OUT, "not found" = IC_PINTYPE_PULSE_OUT) spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/converter/findstring/do_work() + var/position = findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) - set_pin_data(IC_OUTPUT, 1, findtext(get_pin_data(IC_INPUT, 1),get_pin_data(IC_INPUT, 2)) ) + set_pin_data(IC_OUTPUT, 1, position) + push_data() + + activate_pin(2) + if(position) + activate_pin(3) + else + activate_pin(4) + +/obj/item/integrated_circuit/converter/stringlength + name = "get length" + desc = "This circuit will return the number of characters in a string." + complexity = 1 + inputs = list( + "string" = IC_PINTYPE_STRING + ) + outputs = list( + "length" = IC_PINTYPE_NUMBER + ) + activators = list("get length" = IC_PINTYPE_PULSE_IN, "on acquisition" = IC_PINTYPE_PULSE_OUT) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/converter/stringlength/do_work() + set_pin_data(IC_OUTPUT, 1, length(get_pin_data(IC_INPUT, 1))) push_data() activate_pin(2) @@ -232,7 +291,8 @@ name = "string exploder" desc = "This splits a single string into a list of strings." extended_desc = "This circuit splits a given string into a list of strings based on the string and given delimiter. \ - For example, 'eat this burger' will be converted to list('eat','this','burger')." + For example, 'eat this burger' will be converted to list('eat','this','burger'). Leave the delimiter null to get a list \ + of every individual character." icon_state = "split" complexity = 4 inputs = list( @@ -248,7 +308,10 @@ /obj/item/integrated_circuit/converter/exploders/do_work() var/strin = get_pin_data(IC_INPUT, 1) var/delimiter = get_pin_data(IC_INPUT, 2) - set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) + if(delimiter == null) + set_pin_data(IC_OUTPUT, 1, string2charlist(strin)) + else + set_pin_data(IC_OUTPUT, 1, splittext(strin, delimiter)) push_data() activate_pin(2) From 694726e89dc05a33af6230722488639db4326157 Mon Sep 17 00:00:00 2001 From: Firecage Date: Wed, 9 May 2018 07:48:57 +0200 Subject: [PATCH 12/63] Replaces the Roman Shield and Roman Helmets in the autodrobe with fake versions with no block chance nor armour values. (#37683) * removes the block chance from the Roman Shield. * replaces the Roman Shield in the autodrobe with a toy version with no block chance. * replaces the armoured roman helmets from the autodrobe with fake ones. --- code/game/objects/items/shields.dm | 5 +++++ code/modules/clothing/head/helmet.dm | 8 ++++++++ code/modules/vending/autodrobe.dm | 6 +++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index dd8d8f8a10..367a10d21f 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -45,6 +45,11 @@ lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' +/obj/item/shield/riot/roman/fake + desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." + block_chance = 0 + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/shield/riot/buckler name = "wooden buckler" desc = "A medieval wooden buckler." diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2e9b7f83f2..4bf68c3bd0 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -158,12 +158,20 @@ strip_delay = 100 dog_fashion = null +/obj/item/clothing/head/helmet/roman/fake + desc = "An ancient helmet made of plastic and leather." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/head/helmet/roman/legionaire name = "roman legionaire helmet" desc = "An ancient helmet made of bronze and leather. Has a red crest on top of it." icon_state = "roman_c" item_state = "roman_c" +/obj/item/clothing/head/helmet/roman/legionaire/fake + desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index 889b159762..c0cfe661d7 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -114,11 +114,11 @@ /obj/item/clothing/mask/muzzle = 2) premium = list(/obj/item/clothing/suit/pirate/captain = 2, /obj/item/clothing/head/pirate/captain = 2, - /obj/item/clothing/head/helmet/roman = 1, - /obj/item/clothing/head/helmet/roman/legionaire = 1, + /obj/item/clothing/head/helmet/roman/fake = 1, + /obj/item/clothing/head/helmet/roman/legionaire/fake = 1, /obj/item/clothing/under/roman = 1, /obj/item/clothing/shoes/roman = 1, - /obj/item/shield/riot/roman = 1, + /obj/item/shield/riot/roman/fake = 1, /obj/item/skub = 1) refill_canister = /obj/item/vending_refill/autodrobe From 51b6a296d3bdd7228bf88df57590dd896372309b Mon Sep 17 00:00:00 2001 From: Tlaltecuhtli <33834933+Tlaltecuhtli@users.noreply.github.com> Date: Tue, 8 May 2018 15:50:37 +0200 Subject: [PATCH 14/63] fixes a money loop :cl: fix: fixes a possible money exploit /:cl: why: if you buy the barrier crate, open it, spam all the grenades in vertical mode u ll get more money that the crate is worth before: 4 grenades -> 12 barriers * 375 credits -> 4500 + 500 (crate) + 200 (manifest) -> 5200 which is a +3200 net gain now: 4 grenades -> 12 barriers * 100 credits -> 1200+ 500 (crate) + 200 (manifest) -> 1900 which is a -100 net loss --- code/modules/cargo/exports/large_objects.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 37afb31a6b..9eec36f53a 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -101,7 +101,7 @@ export_types = list(/obj/machinery/iv_drip) /datum/export/large/barrier - cost = 325 + cost = 100 unit_name = "security barrier" export_types = list(/obj/item/grenade/barrier, /obj/structure/barricade/security) From 566ca84c21b97a94b4239ce91d30a3bb87f8986d Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 6 May 2018 22:33:41 -0700 Subject: [PATCH 16/63] edge case --- code/game/objects/items/pinpointer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index a6d0d285bf..514b2a5b55 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -87,7 +87,7 @@ return FALSE var/turf/there = get_turf(H) - return (H.z != 0 || (there && there.z == H.z)) + return (H.z != 0 || (there && there.z == here.z)) return FALSE From b29f3991573856f5b4f9ef89854b3d3f08d979e7 Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Sat, 5 May 2018 23:18:22 +0200 Subject: [PATCH 18/63] Fixes singuloth not disappeared after a set amount of time. --- code/game/machinery/computer/arcade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index e90f69bf23..1ed6e90d61 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -614,7 +614,7 @@ L.Stun(200, ignore_canstun = TRUE) //you can't run :^) var/S = new /obj/singularity/academy(usr.loc) addtimer(CALLBACK(src, /atom/movable/proc/say, "[S] winks out, just as suddenly as it appeared."), 50) - QDEL_IN(src, 50) + QDEL_IN(S, 50) else event = null turns += 1 From 6edd272d762c5b416e92371a427fd1096ba670e3 Mon Sep 17 00:00:00 2001 From: Denton Date: Sun, 6 May 2018 10:50:06 +0200 Subject: [PATCH 20/63] drone masks for holidays --- code/modules/holiday/holidays.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 4f740f4e61..701167c853 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -70,6 +70,7 @@ begin_month = DECEMBER end_day = 2 end_month = JANUARY + drone_hat = /obj/item/clothing/head/festive /datum/holiday/new_year/getStationPrefix() return pick("Party","New","Hangover","Resolution") @@ -78,6 +79,7 @@ name = "Groundhog Day" begin_day = 2 begin_month = FEBRUARY + drone_hat = /obj/item/clothing/head/helmet/space/chronos /datum/holiday/valentines name = VALENTINES @@ -92,6 +94,7 @@ name = "Birthday of Space Station 13" begin_day = 16 begin_month = FEBRUARY + drone_hat = /obj/item/clothing/head/festive /datum/holiday/birthday/greet() var/game_age = text2num(time2text(world.timeofday, "YY")) - 3 @@ -202,6 +205,7 @@ name = "UFO Day" begin_day = 2 begin_month = JULY + drone_hat = /obj/item/clothing/mask/facehugger/dead /datum/holiday/UFO/getStationPrefix() //Is such a thing even possible? return pick("Ayy","Truth","Tsoukalos","Mulder") //Yes it is! @@ -272,11 +276,13 @@ name = "Smiling Day" begin_day = 7 begin_month = OCTOBER + drone_hat = /obj/item/clothing/head/papersack/smiley /datum/holiday/boss name = "Boss' Day" begin_day = 16 begin_month = OCTOBER + drone_hat = /obj/item/clothing/head/that /datum/holiday/halloween name = HALLOWEEN @@ -305,6 +311,7 @@ name = "Flowers Day" begin_day = 19 begin_month = NOVEMBER + drone_hat = /obj/item/reagent_containers/food/snacks/grown/moonflower /datum/holiday/hello name = "Saying-'Hello' Day" @@ -312,7 +319,7 @@ begin_month = NOVEMBER /datum/holiday/hello/greet() - return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..() + return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy", "Ni hao", "Guten Tag", "Konnichiwa", "G'day cunt"))]! " + ..() /datum/holiday/human_rights name = "Human-Rights Day" @@ -323,6 +330,7 @@ name = "Monkey Day" begin_day = 14 begin_month = DECEMBER + drone_hat = /obj/item/clothing/mask/gas/monkeymask /datum/holiday/thanksgiving name = "Thanksgiving in the United States" From 2c33868d8ab616520f22691f71d3af3076478ada Mon Sep 17 00:00:00 2001 From: Lexorion Date: Tue, 8 May 2018 22:36:14 +0200 Subject: [PATCH 22/63] makes the cultblade use the right inhand files --- code/modules/antagonists/cult/cult_items.dm | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a1c16aa078..35399dc8e0 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -33,10 +33,8 @@ desc = "A sword humming with unholy energy. It glows with a dim red light." icon_state = "cultblade" item_state = "cultblade" - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 sharpness = IS_SHARP w_class = WEIGHT_CLASS_BULKY From cc8fb19166544191e810456167c9448bc4f3e8ef Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 9 May 2018 15:54:30 -0500 Subject: [PATCH 24/63] Anomaly Armour Research --- code/game/objects/effects/anomalies.dm | 1 + code/modules/assembly/signaler.dm | 1 + code/modules/clothing/suits/armor.dm | 3 + .../modules/clothing/suits/reactive_armour.dm | 235 ++++++++++++++++++ code/modules/research/designs/misc_designs.dm | 14 ++ code/modules/research/techweb/all_nodes.dm | 10 +- tgstation.dme | 1 + 7 files changed, 264 insertions(+), 1 deletion(-) create mode 100644 code/modules/clothing/suits/reactive_armour.dm diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index b3cb0ff9c4..3103fb63a3 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -26,6 +26,7 @@ aSignal = new(src) aSignal.name = "[name] core" aSignal.code = rand(1,100) + aSignal.anomaly_type = type aSignal.frequency = rand(MIN_FREE_FREQ, MAX_FREE_FREQ) if(ISMULTIPLE(aSignal.frequency, 2))//signaller frequencies are always uneven! diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 20bcf25138..07b1fca7ec 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -186,6 +186,7 @@ Code: item_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + var/anomaly_type = /obj/effect/anomaly /obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal) if(!signal) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 37d48b484e..f020528625 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -165,6 +165,7 @@ . = ..() allowed = GLOB.detective_vest_allowed +<<<<<<< HEAD //Reactive armor /obj/item/clothing/suit/armor/reactive name = "reactive armor" @@ -345,6 +346,8 @@ /obj/item/clothing/suit/armor/reactive/table/emp_act() return +======= +>>>>>>> fb42bf3... Anomaly Armour Research (#37558) //All of the armor below is mostly unused /obj/item/clothing/suit/armor/centcom diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm new file mode 100644 index 0000000000..e80a2fff14 --- /dev/null +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -0,0 +1,235 @@ +/obj/item/reactive_armour_shell + name = "reactive armour shell" + desc = "An experimental suit of armour, awaiting installation of an anomaly core." + icon_state = "reactiveoff" + icon = 'icons/obj/clothing/suits.dmi' + w_class = WEIGHT_CLASS_BULKY + +/obj/item/reactive_armour_shell/attackby(obj/item/I, mob/user, params) + ..() + var/static/list/anomaly_armour_types = list( + /obj/effect/anomaly/grav = /obj/item/clothing/suit/armor/reactive/repulse, + /obj/effect/anomaly/flux = /obj/item/clothing/suit/armor/reactive/tesla, + /obj/effect/anomaly/bluespace = /obj/item/clothing/suit/armor/reactive/teleport, + /obj/effect/anomaly/pyro = /obj/item/clothing/suit/armor/reactive/fire) + + if(istype(I, /obj/item/assembly/signaler/anomaly)) + var/obj/item/assembly/signaler/anomaly/A = I + var/armour_path = anomaly_armour_types[A.anomaly_type] + if(!armour_path) + armour_path = /obj/item/clothing/suit/armor/reactive/stealth //Lets not cheat the player if an anomaly type doesnt have its own armour coded + to_chat(user, "You insert [A] into the chest plate, and the armour gently hums to life.") + new armour_path(get_turf(src)) + qdel(src) + qdel(A) + +//Reactive armor +/obj/item/clothing/suit/armor/reactive + name = "reactive armor" + desc = "Doesn't seem to do much for some reason." + var/active = 0 + var/reactivearmor_cooldown_duration = 0 //cooldown specific to reactive armor + var/reactivearmor_cooldown = 0 + icon_state = "reactiveoff" + item_state = "reactiveoff" + blood_overlay_type = "armor" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100) + actions_types = list(/datum/action/item_action/toggle) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + hit_reaction_chance = 50 + +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) + active = !(active) + if(active) + to_chat(user, "[src] is now active.") + icon_state = "reactive" + item_state = "reactive" + else + to_chat(user, "[src] is now inactive.") + icon_state = "reactiveoff" + item_state = "reactiveoff" + add_fingerprint(user) + return + +/obj/item/clothing/suit/armor/reactive/emp_act(severity) + active = 0 + icon_state = "reactiveoff" + item_state = "reactiveoff" + reactivearmor_cooldown = world.time + 200 + ..() + +//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!) +/obj/item/clothing/suit/armor/reactive/teleport + name = "reactive teleport armor" + desc = "Someone separated our Research Director from his own head!" + var/tele_range = 6 + var/rad_amount= 15 + reactivearmor_cooldown_duration = 100 + +/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/carbon/human/H = owner + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive teleport system is still recharging! It fails to teleport [H]!") + return + owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process!") + var/list/turfs = new/list() + for(var/turf/T in orange(tele_range, H)) + if(T.density) + continue + if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe reactive incendiary armor on [owner] activates, but fails to send out flames as it is still recharging its flame jets!") + return + owner.visible_message("[src] blocks [attack_text], sending out jets of flame!") + for(var/mob/living/carbon/C in range(6, owner)) + if(C != owner) + C.fire_stacks += 8 + C.IgniteMob() + owner.fire_stacks = -20 + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + return 0 + +//Stealth + +/obj/item/clothing/suit/armor/reactive/stealth + name = "reactive stealth armor" + desc = "An experimental suit of armor that renders the wearer invisible on detection of imminent harm, and creates a decoy that runs away from the owner. You can't fight what you can't see." + +/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive stealth system on [owner] activates, but is still recharging its holographic emitters!") + return + var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) + E.Copy_Parent(owner, 50) + E.GiveTarget(owner) //so it starts running right away + E.Goto(owner, E.move_to_delay, E.minimum_distance) + owner.alpha = 0 + owner.visible_message("[owner] is hit by [attack_text] in the chest!") //We pretend to be hit, since blocking it would stop the message otherwise + spawn(40) + owner.alpha = initial(owner.alpha) + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + +//Tesla + +/obj/item/clothing/suit/armor/reactive/tesla + name = "reactive tesla armor" + desc = "An experimental suit of armor with sensitive detectors hooked up to a huge capacitor grid, with emitters strutting out of it. Zap." + siemens_coefficient = -1 + var/tesla_power = 25000 + var/tesla_range = 20 + var/tesla_boom = FALSE + var/tesla_stun = FALSE + +/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + owner.visible_message("The tesla capacitors on [owner]'s reactive tesla armor are still recharging! The armor merely emits some sparks.") + return + owner.visible_message("[src] blocks [attack_text], sending out arcs of lightning!") + tesla_zap(owner,tesla_range,tesla_power,tesla_boom, tesla_stun) + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + + +//Repulse + +/obj/item/clothing/suit/armor/reactive/repulse + name = "reactive repulse armor" + desc = "An experimental suit of armor that violently throws back attackers." + +/obj/item/clothing/suit/armor/reactive/repulse/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + if(world.time < reactivearmor_cooldown) + owner.visible_message("The repulse generator is still recharging!") + return 0 + owner.visible_message("[src] blocks [attack_text], converting the attack into a wave of force!") + var/turf/T = get_turf(owner) + var/list/thrown_items = list() + for(var/atom/movable/A in range(T, 7)) + if(A == owner || A.anchored || thrown_items[A]) + continue + var/throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(A, src))) + A.throw_at(throwtarget,10,1) + thrown_items[A] = A + + reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration + return 1 + +/obj/item/clothing/suit/armor/reactive/table + name = "reactive table armor" + desc = "If you can't beat the memes, embrace them." + var/tele_range = 10 + +/obj/item/clothing/suit/armor/reactive/table/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + if(!active) + return 0 + if(prob(hit_reaction_chance)) + var/mob/living/carbon/human/H = owner + if(world.time < reactivearmor_cooldown) + owner.visible_message("The reactive table armor's fabricators are still on cooldown!") + return + owner.visible_message("The reactive teleport system flings [H] clear of [attack_text] and slams them into a fabricated table!") + owner.visible_message("[H] GOES ON THE TABLE!!!") + owner.Knockdown(40) + var/list/turfs = new/list() + for(var/turf/T in orange(tele_range, H)) + if(T.density) + continue + if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.y Date: Wed, 9 May 2018 16:02:23 -0500 Subject: [PATCH 25/63] Adds a French beret! HONH HONH HONH! (#37457) This is very similar to the Italian Moustache, but it's a beret. This will be part of a series of language items. Happy to entertain suggestions as to whether it should be a roundstart item or randomly scattered about maint/cargo crate restricted. In the spirit of atomizing PRs, this one will just be for the French Beret. Ready for merge. --- code/modules/clothing/head/misc.dm | 25 ++++- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/jobs/job_types/civilian.dm | 2 +- code/modules/mob/living/carbon/say.dm | 3 +- strings/french_replacement.json | 91 +++++++++++++++++++ ...lacement.json => italian_replacement.json} | 7 +- 6 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 strings/french_replacement.json rename strings/{word_replacement.json => italian_replacement.json} (99%) diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 74d8a43347..2c03997a4a 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -321,4 +321,27 @@ name = "headress of Nemes" desc = "Lavish space tomb not included." icon_state = "nemes_headdress" - icon_state = "nemes_headdress" \ No newline at end of file + icon_state = "nemes_headdress" + +/obj/item/clothing/head/frenchberet + name = "french beret" + desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage military conflict, for some reason." + icon_state = "beretblack" + +/obj/item/clothing/head/frenchberet/speechModification(M) + if(copytext(M, 1, 2) != "*") + M = " [M]" + var/list/french_words = strings("french_replacement.json", "french") + + for(var/key in french_words) + var/value = french_words[key] + if(islist(value)) + value = pick(value) + + M = replacetextEx(M, " [uppertext(key)]", " [uppertext(value)]") + M = replacetextEx(M, " [capitalize(key)]", " [capitalize(value)]") + M = replacetextEx(M, " [key]", " [value]") + + if(prob(3)) + M += pick(" Honh honh honh!"," Honh!"," Zut Alors!") + return trim(M) \ No newline at end of file diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 53bd5f32a4..96b8517e92 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -47,7 +47,7 @@ /obj/item/clothing/mask/fakemoustache/italian/speechModification(M) if(copytext(M, 1, 2) != "*") M = " [M]" - var/list/italian_words = strings("word_replacement.json", "italian") + var/list/italian_words = strings("italian_replacement.json", "italian") for(var/key in italian_words) var/value = italian_words[key] diff --git a/code/modules/jobs/job_types/civilian.dm b/code/modules/jobs/job_types/civilian.dm index 3c36247c6d..e0202db132 100644 --- a/code/modules/jobs/job_types/civilian.dm +++ b/code/modules/jobs/job_types/civilian.dm @@ -91,7 +91,7 @@ Mime uniform = /obj/item/clothing/under/rank/mime mask = /obj/item/clothing/mask/gas/mime gloves = /obj/item/clothing/gloves/color/white - head = /obj/item/clothing/head/beret + head = /obj/item/clothing/head/frenchberet suit = /obj/item/clothing/suit/suspenders backpack_contents = list(/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing=1) diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 83d943ccbf..8a8c99bf32 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -13,7 +13,8 @@ message = T.TongueSpeech(message) if(wear_mask) message = wear_mask.speechModification(message) - + if(head) + message = head.speechModification(message) return message /mob/living/carbon/can_speak_vocal(message) diff --git a/strings/french_replacement.json b/strings/french_replacement.json new file mode 100644 index 0000000000..4c89d98812 --- /dev/null +++ b/strings/french_replacement.json @@ -0,0 +1,91 @@ +{ + + "french": { + "yes": "oui", + "no": "non", + "I'm": "j'", + "am": "suis", + "a": "un", + "and": "et", + "the": "l'", + "I": "j'", + "for": "pour", + "with": "avec", + "of": "de", + + + "assistant": "ravageur", + "assistants": "ravageurs", + "baby": [ + "enfant", + "petit baguette" + ], + "bad": "mal", + "bye": [ + "bon voyage", + "adieu", + "au revoir" + ], + "cake": "gateau", + "captain": "capitaine", + "changeling": "changeur", + "cheese": [ + "brie", + "roquefort", + "camembert" + ], + "cigarette": "clope", + "cook": "cuisinier", + "dad": "papa", + "enemy": "silly english dog", + "friend": "ami", + "good": "bon", + "greytide": "les gitans", + "greytider": "les gitans", + "greytiders": "les gitans", + "hardsuit": "burkini", + "hello": [ + "'allo", + "bonjour", + "salut" + ], + "maint": "les banlieues", + "meat": [ + "coq au vin", + "boeuf" + ], + "mom": "maman", + "my": "mon", + "nuke": [ + "grand bombe", + "la baguette ultime" + ], + "op": "boche", + "operative": "boche", + "operatives": "boches", + "ops": "boches", + "urity": "urite", + "security": "securite", + "shit": "merde", + "shitcurity": [ + "gendarmerie", + "les keufs" + ], + "shitsec": [ + "gendarmerie", + "les keufs" + ], + "spaghetti": "macaroni", + "spicy": "epice", + "thanks": "merci", + "tomato": "tomate", + "traitor": "collaborateur", + "want": "envie", + "what's": "quel est", + "who's": "qui est", + "why": "porquois", + "wine": "vin", + "wizard": "sorcier" + } + +} \ No newline at end of file diff --git a/strings/word_replacement.json b/strings/italian_replacement.json similarity index 99% rename from strings/word_replacement.json rename to strings/italian_replacement.json index 9565ebe94a..42bef05a22 100644 --- a/strings/word_replacement.json +++ b/strings/italian_replacement.json @@ -1,4 +1,5 @@ { + "italian": { "I'm": "I'm-a", "am": "am-a", @@ -62,5 +63,7 @@ "whose": "whose-a", "why": "for-a what reason", "wine": "vino" - } -} + } + + +} \ No newline at end of file From c34cf3d67f67869d07638e4d36b4269388e06909 Mon Sep 17 00:00:00 2001 From: Denton Date: Sun, 6 May 2018 18:23:39 +0200 Subject: [PATCH 27/63] Hit it! They call me Cuban Pete I'm the king of the Rumba beat When I play the maracas I go Chic-chic-ky-boom Chic-chic-ky-boom Yes sir, I'm Cuban Pete I'm the craze of my native street When I start to dance everything goes Chic-chic-ky-boom Chic-chic-ky-boom The senioritas they sing And they swing with "terampero" It's very nice! So full of spice! And when they dance in they bring A happy ring that "era keros" Are singing a song All the day long So if you like the beat Take a lesson from Cuban Pete And I'll teach you to Chic-chic-ky-boom Chic-chic-ky-boom Chic-chic-ky-boom He's a really modest guy Although he's the hottest guy In Havana, in Havana Si, senorita I know That you would like a Chic-ky-boom-chick It's very nice - so full of spice I'll place my hand on your hip And if you will just give me your hand Then we shall try Just you and I "Iy-yi-yi!" "Shake your booty, daddy, wow! See ya'!" --- code/game/machinery/computer/arcade.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index e90f69bf23..ca0b6ab459 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -291,6 +291,7 @@ /obj/machinery/computer/arcade/battle/emag_act(mob/user) if(obj_flags & EMAGGED) return + to_chat(user, "A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!") temp = "If you die in the game, you die for real!" player_hp = 30 player_mp = 10 From 44dac8038364fe3ff7829bbfbb14a325dfe1a3ec Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sat, 5 May 2018 11:17:07 -0700 Subject: [PATCH 29/63] Makes it a bit easier to see radiation --- code/modules/clothing/glasses/engine_goggles.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 439197f285..347bc809a3 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -93,7 +93,7 @@ MA.alpha = 180 MA.maptext = "[strength]k" MA.color = "#64C864" - MA.layer = AREA_LAYER + MA.layer = FLY_LAYER pic.appearance = MA flick_overlay(pic, list(user.client), 8) From a1db36f31629901adc939c139fd51a05fc3bc57b Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Sun, 6 May 2018 16:23:56 -0700 Subject: [PATCH 31/63] Distinguish between DNA and ID when failing to enter a mech --- code/game/mecha/mecha.dm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 616cd27a2d..b00212b0de 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -812,16 +812,18 @@ to_chat(usr, "The [name] is already occupied!") log_append_to_last("Permission denied.") return - var/passed if(dna_lock) + var/passed = FALSE if(user.has_dna()) var/mob/living/carbon/C = user if(C.dna.unique_enzymes==dna_lock) - passed = 1 - else if(operation_allowed(user)) - passed = 1 - if(!passed) - to_chat(user, "Access denied.") + passed = TRUE + if (!passed) + to_chat(user, "Access denied. [name] is secured with a DNA lock.") + log_append_to_last("Permission denied.") + return + if(!operation_allowed(user)) + to_chat(user, "Access denied. Insufficient operation keycodes.") log_append_to_last("Permission denied.") return if(user.buckled) From 325b31f11eba8f5ea6b4939fc68305c22a7df3b7 Mon Sep 17 00:00:00 2001 From: Tlaltecuhtli <33834933+Tlaltecuhtli@users.noreply.github.com> Date: Wed, 9 May 2018 23:23:14 +0200 Subject: [PATCH 33/63] fixes some inconsistency in the bulldog shotgun ammo (#37548) the default bulldog shotgun ammo makes sense now --- code/game/objects/items/storage/backpack.dm | 4 ++-- code/game/objects/items/storage/uplink_kits.dm | 4 ++-- .../boxes_magazines/external/shotgun.dm | 16 ++++++++-------- code/modules/uplink/uplink_items.dm | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 89ce133fcc..e62b918f19 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -453,7 +453,7 @@ /obj/item/storage/backpack/duffelbag/syndie/ammo/shotgun/PopulateContents() for(var/i in 1 to 6) new /obj/item/ammo_box/magazine/m12g(src) - new /obj/item/ammo_box/magazine/m12g/buckshot(src) + new /obj/item/ammo_box/magazine/m12g/stun(src) new /obj/item/ammo_box/magazine/m12g/slug(src) new /obj/item/ammo_box/magazine/m12g/dragon(src) @@ -479,7 +479,7 @@ /obj/item/storage/backpack/duffelbag/syndie/bulldogbundle/PopulateContents() new /obj/item/ammo_box/magazine/m12g(src) new /obj/item/gun/ballistic/automatic/shotgun/bulldog(src) - new /obj/item/ammo_box/magazine/m12g/buckshot(src) + new /obj/item/ammo_box/magazine/m12g/stun(src) new /obj/item/clothing/glasses/thermal/syndi(src) /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index ec92961387..05d6338235 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -111,8 +111,8 @@ new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc new /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc - new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc - new /obj/item/ammo_box/magazine/m12g/buckshot(src) // 2 tc + new /obj/item/ammo_box/magazine/m12g(src) // 2 tc + new /obj/item/ammo_box/magazine/m12g(src) // 2 tc new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/grenade/plastic/c4 (src) // 1 tc new /obj/item/card/emag(src) // 6 tc diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm index dc8d0175ba..bb04446129 100644 --- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -1,8 +1,8 @@ /obj/item/ammo_box/magazine/m12g - name = "shotgun magazine (12g taser slugs)" + name = "shotgun magazine (12g buckshot slugs)" desc = "A drum magazine." - icon_state = "m12gs" - ammo_type = /obj/item/ammo_casing/shotgun/stunslug + icon_state = "m12gb" + ammo_type = /obj/item/ammo_casing/shotgun/buckshot caliber = "shotgun" max_ammo = 8 @@ -10,14 +10,14 @@ ..() icon_state = "[initial(icon_state)]-[CEILING(ammo_count(0)/8, 1)*8]" -/obj/item/ammo_box/magazine/m12g/buckshot - name = "shotgun magazine (12g buckshot slugs)" - icon_state = "m12gb" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot +/obj/item/ammo_box/magazine/m12g/stun + name = "shotgun magazine (12g taser slugs)" + icon_state = "m12gs" + ammo_type = /obj/item/ammo_casing/shotgun/stunslug /obj/item/ammo_box/magazine/m12g/slug name = "shotgun magazine (12g slugs)" - icon_state = "m12gb" + icon_state = "m12gb" //this may need an unique sprite ammo_type = /obj/item/ammo_casing/shotgun /obj/item/ammo_box/magazine/m12g/dragon diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 92ce23c6c4..6a8ccefd19 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -453,7 +453,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/ammo/shotgun/buck name = "12g Buckshot Drum" desc = "An additional 8-round buckshot magazine for use with the Bulldog shotgun. Front towards enemy." - item = /obj/item/ammo_box/magazine/m12g/buckshot + item = /obj/item/ammo_box/magazine/m12g /datum/uplink_item/ammo/shotgun/slug name = "12g Slug Drum" @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) name = "12g Stun Slug Drum" desc = "An alternative 8-round stun slug magazine for use with the Bulldog shotgun. \ Saying that they're completely non-lethal would be lying." - item = /obj/item/ammo_box/magazine/m12g + item = /obj/item/ammo_box/magazine/m12g/stun include_modes = list(/datum/game_mode/nuclear) /datum/uplink_item/ammo/shotgun/dragon From 111ad79eab7c2c911f46cb66dedede90f7d923b9 Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Wed, 9 May 2018 19:34:57 -0700 Subject: [PATCH 35/63] Use spritesheets to reduce time spent sending PNG assets by 90+% --- .travis.yml | 3 +- code/__DEFINES/misc.dm | 9 + code/controllers/subsystem/assets.dm | 7 +- code/game/objects/items/RPD.dm | 4 +- code/game/objects/items/devices/PDA/PDA.dm | 78 ++--- code/game/objects/items/devices/PDA/cart.dm | 37 ++- code/modules/client/asset_cache.dm | 290 ++++++++++++++---- code/modules/emoji/emoji_parse.dm | 6 +- code/modules/goonchat/browserOutput.dm | 3 +- .../browserassets/html/browserOutput.html | 1 + code/modules/language/language.dm | 3 +- code/modules/paperwork/paper.dm | 7 +- code/modules/research/designs.dm | 5 +- code/modules/research/rdconsole.dm | 2 + rust_g.dll | Bin 240128 -> 410624 bytes tgui/src/interfaces/rpd.ract | 22 ++ tools/travis/build_dependencies.sh | 7 +- 17 files changed, 351 insertions(+), 133 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6581931961..fa42ba3aef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ env: - BYOND_MAJOR="512" - BYOND_MINOR="1418" - NODE_VERSION="4" - - RUST_G_VERSION="0.2.0" + - RUST_G_VERSION="0.3.0" - BUILD_TOOLS=false - BUILD_TESTING=false - DM_MAPFILE="loadallmaps" @@ -32,6 +32,7 @@ addons: - gcc-multilib - python3 - python3-pip + - libssl-dev:i386 install: - tools/travis/install_build_tools.sh diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 3267a43d5a..47ab3580cb 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -445,3 +445,12 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define NO_INIT_PARAMETER "no-init" #define EGG_LAYING_MESSAGES list("lays an egg.","squats down and croons.","begins making a huge racket.","begins clucking raucously.") +<<<<<<< HEAD +======= + +// Used by PDA and cartridge code to reduce repetitiveness of spritesheets +#define PDAIMG(what) {""} + +//Filters +#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-2, size=4, border=4, color="#04080FAA") +>>>>>>> cf6f064... Use spritesheets to reduce time spent sending PNG assets by 90+% (#37399) diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index fd27c9424f..7285298283 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -6,9 +6,10 @@ SUBSYSTEM_DEF(assets) var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) - for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple)) - var/datum/asset/A = new type() - A.register() + for(var/type in typesof(/datum/asset)) + var/datum/asset/A = type + if (type != initial(A._abstract)) + get_asset_datum(type) preload = cache.Copy() //don't preload assets generated during the round diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index b005d0dd64..2c977e9d09 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -138,7 +138,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( return "makepipe=[id]&type=[dirtype]" /datum/pipe_info/meter - icon_state = "meterX" + icon_state = "meter" dirtype = PIPE_ONEDIR /datum/pipe_info/meter/New(label) @@ -228,7 +228,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list( datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/icon_states/multiple_icons/pipes) + var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes) assets.send(user) ui = new(user, src, ui_key, "rpd", name, 300, 550, master_ui, state) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index d2324aa56c..ad6859f174 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -178,20 +178,20 @@ GLOBAL_LIST_EMPTY(PDAs) . = ..() - var/datum/asset/assets = get_asset_datum(/datum/asset/simple/pda) + var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda) assets.send(user) user.set_machine(src) var/dat = "Personal Data Assistant" + dat += assets.css_tag() - - dat += "Refresh" + dat += "[PDAIMG(refresh)]Refresh" if ((!isnull(cartridge)) && (mode == 0)) - dat += " | Eject [cartridge]" + dat += " | [PDAIMG(eject)]Eject [cartridge]" if (mode) - dat += " | Return" + dat += " | [PDAIMG(menu)]Return" if (mode == 0) dat += "
" @@ -205,7 +205,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!owner) dat += "Warning: No owner information entered. Please swipe card.

" - dat += "Retry" + dat += "[PDAIMG(refresh)]Retry" else switch (mode) if (0) @@ -221,38 +221,38 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "

General Functions

" dat += "" if (cartridge.access & CART_ENGINE) dat += "

Engineering Functions

" dat += "" if (cartridge.access & CART_MEDICAL) dat += "

Medical Functions

" dat += "" if (cartridge.access & CART_SECURITY) dat += "

Security Functions

" dat += "" if(cartridge.access & CART_QUARTERMASTER) dat += "

Quartermaster Functions:

" dat += "" dat += "" @@ -260,25 +260,25 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "" if (1) - dat += "

Notekeeper V2.2

" + dat += "

[PDAIMG(notes)] Notekeeper V2.2

" dat += "Edit
" if(notescanned) dat += "(This is a scanned image, editing it may cause some text formatting to change.)
" dat += "
[(!notehtml ? note : notehtml)]" if (2) - dat += "

SpaceMessenger V3.9.6

" - dat += "Ringer: [silent == 1 ? "Off" : "On"] | " - dat += "Send / Receive: [toff == 1 ? "Off" : "On"] | " - dat += "Set Ringtone | " - dat += "Messages
" + dat += "

[PDAIMG(mail)] SpaceMessenger V3.9.6

" + dat += "[PDAIMG(bell)]Ringer: [silent == 1 ? "Off" : "On"] | " + dat += "[PDAIMG(mail)]Send / Receive: [toff == 1 ? "Off" : "On"] | " + dat += "[PDAIMG(bell)]Set Ringtone | " + dat += "[PDAIMG(mail)]Messages
" if(cartridge) dat += cartridge.message_header() - dat += "

Detected PDAs

" + dat += "

[PDAIMG(menu)] Detected PDAs

" dat += "