From d1743bd54c705f84524b22cd9ac0045f63993235 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Sun, 8 May 2016 14:34:03 +0300 Subject: [PATCH 01/20] Fixes broken logs --- code/modules/mob/hear_say.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 375b1e1e13..7e146358cd 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -184,9 +184,9 @@ var/formatted if(language) - formatted = language.format_message_radio(message, verb) + formatted = "[language.format_message_radio(message, verb)]" else - formatted = "[verb], \"[message]\"" + formatted = "[verb], \"[message]\"" if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" From 1848682784b5e59258bdb6c9944f073d8f76aab9 Mon Sep 17 00:00:00 2001 From: Kelenius Date: Sun, 8 May 2016 17:05:27 +0300 Subject: [PATCH 02/20] Satisfies Travis --- code/game/machinery/telecomms/broadcaster.dm | 10 +++++----- code/modules/mob/hear_say.dm | 6 +++--- code/modules/mob/living/carbon/metroid/say.dm | 2 +- code/modules/mob/living/simple_animal/parrot.dm | 2 +- code/modules/mob/new_player/new_player.dm | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 30c92af922..7d27c94b65 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -390,33 +390,33 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if (length(heard_masked)) for (var/mob/R in heard_masked) - R.hear_radio(message,verbage, speaking, part_a, part_b, M, 0, name) + R.hear_radio(message,verbage, speaking, part_a, part_b, part_c, M, 0, name) /* --- Process all the mobs that heard the voice normally (understood) --- */ if (length(heard_normal)) for (var/mob/R in heard_normal) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 0, realname) /* --- Process all the mobs that heard the voice normally (did not understand) --- */ if (length(heard_voice)) for (var/mob/R in heard_voice) - R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname) + R.hear_radio(message,verbage, speaking, part_a, part_b, part_c, M,0, vname) /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ // Displays garbled message (ie "f*c* **u, **i*er!") if (length(heard_garbled)) for (var/mob/R in heard_garbled) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, vname) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 1, vname) /* --- Complete gibberish. Usually happens when there's a compressed message --- */ if (length(heard_gibberish)) for (var/mob/R in heard_gibberish) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 1) return 1 diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 7e146358cd..4f14216747 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -81,7 +81,7 @@ var/time = say_timestamp() src << "[time] [message]" -/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") +/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") if(!client) return @@ -184,9 +184,9 @@ var/formatted if(language) - formatted = "[language.format_message_radio(message, verb)]" + formatted = "[language.format_message_radio(message, verb)][part_c]" else - formatted = "[verb], \"[message]\"" + formatted = "[verb], \"[message]\"[part_c]" if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm index cd07f6bf3b..7c7ad76240 100644 --- a/code/modules/mob/living/carbon/metroid/say.dm +++ b/code/modules/mob/living/carbon/metroid/say.dm @@ -31,7 +31,7 @@ speech_buffer.Add(lowertext(html_decode(message))) ..() -/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") +/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") if (speaker in Friends) speech_buffer = list() speech_buffer.Add(speaker) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 8b9271a40c..1e6752ab77 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -727,7 +727,7 @@ -/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) +/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0) if(prob(50)) parrot_hear("[pick(available_channels)] [message]") ..(message,verb,language,part_a,part_b,speaker,hard_to_hear) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index e9aa06068b..a88bc7786f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -501,7 +501,7 @@ /mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) return -/mob/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) +/mob/new_player/hear_radio() return /mob/new_player/MayRespawn() From 8ed4698b765a019656ec12ca1ca549ea5fdd4861 Mon Sep 17 00:00:00 2001 From: redstryker Date: Wed, 11 May 2016 16:16:31 -0400 Subject: [PATCH 03/20] I'm an idiot. Fixed problem. --- .../preference_setup/loadout/loadout_suit.dm | 12 ++++++++ code/modules/clothing/suits/miscellaneous.dm | 26 ++++++++++++++++++ icons/mob/suit.dmi | Bin 395036 -> 398474 bytes icons/obj/clothing/suits.dmi | Bin 137926 -> 139032 bytes 4 files changed, 38 insertions(+) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 494f5d9a84..a86f0e214f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -244,3 +244,15 @@ display_name = "winter coat, mining" path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner allowed_roles = list("Shaft Miner") + +/datum/gear/suit/varsity + display_name = "varsity jacket selection" + path = /obj/item/clothing/suit/varsity + +/datum/gear/suit/varsity/New() + ..() + var/list/varsities = list() + for(var/varsity_style in typesof(/obj/item/clothing/suit/varsity)) + var/obj/item/clothing/suit/varsity/varsity = varsity_style + varsities[initial(varsity.name)] = varsity + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(varsities)) \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index a260d83513..ed80f4dd61 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -656,3 +656,29 @@ name = "mining winter coat" icon_state = "coatminer" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/suit/varsity + name = "black varsity jacket" + desc = "A favorite of jocks everywhere from Sol to Nyx." + icon_state = "varsity" + item_state = "leather_jacket" + +/obj/item/clothing/suit/varsity/red + name = "red varsity jacket" + icon_state = "varsity_red" + +/obj/item/clothing/suit/varsity/purple + name = "purple varsity jacket" + icon_state = "varsity_purple" + +/obj/item/clothing/suit/varsity/green + name = "green varsity jacket" + icon_state = "varsity_green" + +/obj/item/clothing/suit/varsity/blue + name = "blue varsity jacket" + icon_state = "varsity_blue" + +/obj/item/clothing/suit/varsity/brown + name = "brown varsity jacket" + icon_state = "varsity_brown" \ No newline at end of file diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 9e74afd5abe1f3b62d45548c405f77df3308ff81..a94deb0f131fd79a85e3b93553321a6b498bfb72 100644 GIT binary patch delta 24754 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 From 9d45ace220e2cf0bd257e8cbcb03db47924cf717 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Fri, 13 May 2016 22:31:40 +0100 Subject: [PATCH 04/20] Updates changelog --- html/changelog.html | 16 ++++++++ html/changelogs/.all_changelog.yml | 15 ++++++++ .../HarpyEagle - lightingadditions.yml | 38 ------------------- html/changelogs/Yoshax - carpetfix.yml | 37 ------------------ .../Yoshax - changelingflavortext.yml | 36 ------------------ html/changelogs/Yoshax - dionarights.yml | 36 ------------------ html/changelogs/Yoshax - surgeryfix.yml | 36 ------------------ 7 files changed, 31 insertions(+), 183 deletions(-) delete mode 100644 html/changelogs/HarpyEagle - lightingadditions.yml delete mode 100644 html/changelogs/Yoshax - carpetfix.yml delete mode 100644 html/changelogs/Yoshax - changelingflavortext.yml delete mode 100644 html/changelogs/Yoshax - dionarights.yml delete mode 100644 html/changelogs/Yoshax - surgeryfix.yml diff --git a/html/changelog.html b/html/changelog.html index 3ef596ac8c..07fb9c343c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,22 @@ -->
+

13 May 2016

+

HarpyEagle updated:

+
    +
  • Shotgun flare illumination now lasts longer, around 3-4 minutes.
  • +
  • Fixed attack animation playing when using flashes even if the flash was not actually used due to being broken or recharging.
  • +
  • Fixed lightswitches layering over darkness. Now only the light layers above shadow. Lightswitch illumination is now much more subtle.
  • +
+

Yoshax updated:

+
    +
  • Processing strata floor can now be pried up with a crowbar.
  • +
  • Blue carpet can now also be removed with a crowbar, and has had it's ability to burn and have corners restored.
  • +
  • Changelings will now store and apply the flavor text of their victims when they absorb and transform into them.
  • +
  • Gives Diona a starting funds wage the same as Tajaran and Unathi.
  • +
  • Brain damage no longer prevent implant removal surgery.
  • +
+

12 May 2016

Yoshax updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 2e9cb1594e..090b42444c 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2271,3 +2271,18 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. some more smoke to make a heavier cloud. - bugfix: Smoke from smoke bombs now properly does a small amount of oxygen loss damage. This damage is per cloud of smoke. +2016-05-13: + HarpyEagle: + - tweak: Shotgun flare illumination now lasts longer, around 3-4 minutes. + - bugfix: Fixed attack animation playing when using flashes even if the flash was + not actually used due to being broken or recharging. + - bugfix: Fixed lightswitches layering over darkness. Now only the light layers + above shadow. Lightswitch illumination is now much more subtle. + Yoshax: + - bugfix: Processing strata floor can now be pried up with a crowbar. + - bugfix: Blue carpet can now also be removed with a crowbar, and has had it's ability + to burn and have corners restored. + - rscadd: Changelings will now store and apply the flavor text of their victims + when they absorb and transform into them. + - rscadd: Gives Diona a starting funds wage the same as Tajaran and Unathi. + - bugfix: Brain damage no longer prevent implant removal surgery. diff --git a/html/changelogs/HarpyEagle - lightingadditions.yml b/html/changelogs/HarpyEagle - lightingadditions.yml deleted file mode 100644 index 8cf4b825e3..0000000000 --- a/html/changelogs/HarpyEagle - lightingadditions.yml +++ /dev/null @@ -1,38 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: HarpyEagle - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - tweak: "Shotgun flare illumination now lasts longer, around 3-4 minutes." - - bugfix: "Fixed attack animation playing when using flashes even if the flash was not actually used due to being broken or recharging." - - bugfix: "Fixed lightswitches layering over darkness. Now only the light layers above shadow. Lightswitch illumination is now much more subtle." diff --git a/html/changelogs/Yoshax - carpetfix.yml b/html/changelogs/Yoshax - carpetfix.yml deleted file mode 100644 index c295d9a0d2..0000000000 --- a/html/changelogs/Yoshax - carpetfix.yml +++ /dev/null @@ -1,37 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Yoshax - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "Processing strata floor can now be pried up with a crowbar." - - bugfix: "Blue carpet can now also be removed with a crowbar, and has had it's ability to burn and have corners restored." diff --git a/html/changelogs/Yoshax - changelingflavortext.yml b/html/changelogs/Yoshax - changelingflavortext.yml deleted file mode 100644 index 430ab2d979..0000000000 --- a/html/changelogs/Yoshax - changelingflavortext.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Yoshax - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Changelings will now store and apply the flavor text of their victims when they absorb and transform into them." diff --git a/html/changelogs/Yoshax - dionarights.yml b/html/changelogs/Yoshax - dionarights.yml deleted file mode 100644 index 705a4dbbaa..0000000000 --- a/html/changelogs/Yoshax - dionarights.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Yoshax - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - rscadd: "Gives Diona a starting funds wage the same as Tajaran and Unathi." \ No newline at end of file diff --git a/html/changelogs/Yoshax - surgeryfix.yml b/html/changelogs/Yoshax - surgeryfix.yml deleted file mode 100644 index af529c37df..0000000000 --- a/html/changelogs/Yoshax - surgeryfix.yml +++ /dev/null @@ -1,36 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Yoshax - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "Brain damage no longer prevent implant removal surgery." From 76d9cfb51014650e4a6eac5bd3528bae7179b757 Mon Sep 17 00:00:00 2001 From: ParadoxSpace Date: Fri, 13 May 2016 15:39:03 -0600 Subject: [PATCH 05/20] Update station.dm --- code/modules/mob/language/station.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 438b680f67..0e20458291 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -23,7 +23,16 @@ colour = "soghun" key = "o" flags = WHITELISTED - syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh") + space_chance = 40 + syllables = list( + "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", + "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", + "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", + "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", + "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + ) /datum/language/unathi/get_random_name() From 846272f3ee9f5dc6de75f7b202f65e1c3dc58526 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 13 May 2016 20:10:02 -0400 Subject: [PATCH 06/20] Fixes #21 - Prevents making oversize stacks in autolathe. - Previously when making stack'd items in autolathe, it lets you make as big a stack as you have materials loaded, even if it is larger than the maximum stack size for that material. - Now autolathe recipies remember this, and autolathe respects maximum stack size. --- code/game/machinery/autolathe.dm | 1 + code/game/machinery/autolathe_datums.dm | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 051223d6fe..5d80030337 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -102,6 +102,7 @@ //Build list of multipliers for sheets. if(R.is_stack) if(max_sheets && max_sheets > 0) + max_sheets = min(max_sheets, R.max_stack) // Limit to the max allowed by stack type. multiplier_string += "
    " for(var/i = 5;i Date: Sat, 14 May 2016 17:50:12 -0400 Subject: [PATCH 07/20] Fixes Loyalty Implants Why would you define a proc on /mob/living/carbon/human for implanting something then ask to be passed your own src? Also why would you try to pass /job/datums as something to implant? Silly. --- code/datums/mind.dm | 2 +- code/game/antagonist/outsider/deathsquad.dm | 2 +- code/game/jobs/job/captain.dm | 2 +- code/game/jobs/job/civilian.dm | 2 +- code/game/jobs/job/security.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 14 +++++++------- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index fb5a2e754c..824b52a2fe 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -344,7 +344,7 @@ log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].") if("add") H << "You somehow have become the recepient of a loyalty transplant, and it just activated!" - H.implant_loyalty(H, override = TRUE) + H.implant_loyalty(override = TRUE) log_admin("[key_name_admin(usr)] has loyalty implanted [current].") else else if (href_list["silicon"]) diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 4cc8afff6c..3a61152ab2 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -49,7 +49,7 @@ var/datum/antagonist/deathsquad/deathsquad player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand) player.equip_to_slot_or_del(new /obj/item/weapon/rig/ert/assetprotection(player), slot_back) player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_s_store) - player.implant_loyalty(player) + player.implant_loyalty() var/obj/item/weapon/card/id/id = create_id("Asset Protection", player) if(id) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index d3a9246238..015441f32f 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -44,7 +44,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) - H.implant_loyalty(src) + H.implant_loyalty() return 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 64dc22615e..f4c3ca9e1b 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -263,7 +263,7 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) - H.implant_loyalty(H) + H.implant_loyalty() return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 31884169f6..dfb3659e0d 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -41,7 +41,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store) else H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack) - H.implant_loyalty(H) + H.implant_loyalty() return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 56482186b4..47853089cf 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -150,21 +150,21 @@ update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message) if(update) UpdateDamageIcon() -/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default. +/mob/living/carbon/human/proc/implant_loyalty(override = FALSE) // Won't override by default. if(!config.use_loyalty_implants && !override) return // Nuh-uh. - var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M) - L.imp_in = M + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src) + L.imp_in = src L.implanted = 1 - var/obj/item/organ/external/affected = M.organs_by_name[BP_HEAD] + var/obj/item/organ/external/affected = src.organs_by_name[BP_HEAD] affected.implants += L L.part = affected L.implanted(src) -/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M) - for(var/L in M.contents) +/mob/living/carbon/human/proc/is_loyalty_implanted() + for(var/L in src.contents) if(istype(L, /obj/item/weapon/implant/loyalty)) - for(var/obj/item/organ/external/O in M.organs) + for(var/obj/item/organ/external/O in src.organs) if(L in O.implants) return 1 return 0 From 373afab6a3709eba081a9c12fe9ef4cafee025e9 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 14 May 2016 22:23:31 -0400 Subject: [PATCH 08/20] Makes Teshari admin-spawnable like all other species Just adds them to the same list as all other species, so they can be spawned by admins for events or to replace bodies for players or whatever. --- code/modules/mob/living/carbon/human/human_species.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index 113377b933..4aad06fd7a 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -17,6 +17,10 @@ /mob/living/carbon/human/diona/New(var/new_loc) ..(new_loc, "Diona") +/mob/living/carbon/human/teshari/New(var/new_loc) + h_style = "Teshari Default" + ..(new_loc, "Teshari") + /mob/living/carbon/human/machine/New(var/new_loc) h_style = "blue IPC screen" ..(new_loc, "Machine") From e0a77f7d2fc94aa523891c53c76e1fabc151013b Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 14 May 2016 23:23:11 -0400 Subject: [PATCH 09/20] =?UTF-8?q?Fix=20the=20letter=20=C3=BF=20in=20nano-u?= =?UTF-8?q?i=20displays?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Particularly noticable on the cartridge button of the PDA, any time we transmit a name containing \improper or \proper using nanoui it shows up as ÿ * This is becuase BYOND internally handles these escapes by simply using character 0xFF etc. * We'd better strip them out before sending them as JSON data so they aren't rendered as ÿ when treated as utf-8 encoding. --- code/_helpers/text.dm | 7 +++++++ code/modules/nano/nanoui.dm | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index be836248a6..68cb5276fa 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -324,4 +324,11 @@ proc/TextPreview(var/string,var/len=40) return 1 return 0 +/** + * Strip out the special beyond characters for \proper and \improper + * from text that will be sent to the browser. + */ +/proc/strip_improper(var/text) + return replacetext(replacetext(text, "\proper", ""), "\improper", "") + #define gender2text(gender) capitalize(gender) \ No newline at end of file diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm index e270185414..29a2623984 100644 --- a/code/modules/nano/nanoui.dm +++ b/code/modules/nano/nanoui.dm @@ -345,10 +345,11 @@ nanoui is used to open and update nano browser uis var/template_data_json = "{}" // An empty JSON object if (templates.len > 0) - template_data_json = json_encode(templates) + template_data_json = strip_improper(json_encode(templates)) var/list/send_data = get_send_data(initial_data) var/initial_data_json = replacetext(replacetext(json_encode(send_data), """, "&#34;"), "'", "'") + initial_data_json = strip_improper(initial_data_json); var/url_parameters_json = json_encode(list("src" = "\ref[src]")) @@ -459,7 +460,7 @@ nanoui is used to open and update nano browser uis var/list/send_data = get_send_data(data) //user << list2json(data) // used for debugging - user << output(list2params(list(json_encode(send_data))),"[window_id].browser:receiveUpdateData") + user << output(list2params(list(strip_improper(json_encode(send_data)))),"[window_id].browser:receiveUpdateData") /** * This Topic() proc is called whenever a user clicks on a link within a Nano UI From 718b249b1d8ef8ee3a5acef85419d65dcd0ae041 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sun, 15 May 2016 23:31:34 +0100 Subject: [PATCH 10/20] Uplink changes and additions (#1645) * Splits uplink categories into separate files and moves other files around * Corrects an incorrect description * Puts uplink categories in uplink_categories into the same order as they are individual files * Mercenaries now spawn with their own private uplink. * Adds a random discount to uplink items that is applied every 15 minutes no message no message * Adds changelog * Fakes announcements are now once again purchasable from the uplink and actually work * Removes a debug line * Adds several existing items to the antag uplink including stun rounds for shotguns, metal foam grenades and more * Refactors boxes.dm to use absolute pathing and for loops for contents Adds changelog --- code/datums/uplink/ammunition.dm | 67 ++ code/datums/uplink/announcements.dm | 109 +++ code/datums/uplink/armor.dm | 15 + code/datums/uplink/badassery.dm | 78 ++ code/datums/uplink/grenades.dm | 35 + code/datums/uplink/hardsuit_modules.dm | 40 + code/datums/uplink/implants.dm | 25 + code/datums/uplink/medical.dm | 36 + code/datums/uplink/stealth_items.dm | 45 + code/datums/uplink/stealthy_weapons.dm | 35 + code/datums/uplink/tools.dm | 85 ++ .../uplink}/uplink_categories.dm | 98 +-- code/datums/uplink/uplink_items.dm | 174 ++++ code/datums/uplink/visible_weapons.dm | 91 ++ code/game/antagonist/outsider/mercenary.dm | 5 +- code/game/objects/items/devices/uplink.dm | 36 +- .../objects/items/devices/uplink_items.dm | 782 ------------------ .../items/devices/uplink_random_lists.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 524 +++++------- html/changelogs/yoshax - uplinkchanges.yml | 39 + nano/templates/uplink.tmpl | 20 +- polaris.dme | 16 +- 22 files changed, 1177 insertions(+), 1180 deletions(-) create mode 100644 code/datums/uplink/ammunition.dm create mode 100644 code/datums/uplink/announcements.dm create mode 100644 code/datums/uplink/armor.dm create mode 100644 code/datums/uplink/badassery.dm create mode 100644 code/datums/uplink/grenades.dm create mode 100644 code/datums/uplink/hardsuit_modules.dm create mode 100644 code/datums/uplink/implants.dm create mode 100644 code/datums/uplink/medical.dm create mode 100644 code/datums/uplink/stealth_items.dm create mode 100644 code/datums/uplink/stealthy_weapons.dm create mode 100644 code/datums/uplink/tools.dm rename code/{game/objects/items/devices => datums/uplink}/uplink_categories.dm (87%) create mode 100644 code/datums/uplink/uplink_items.dm create mode 100644 code/datums/uplink/visible_weapons.dm delete mode 100644 code/game/objects/items/devices/uplink_items.dm create mode 100644 html/changelogs/yoshax - uplinkchanges.yml diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm new file mode 100644 index 0000000000..b45cf3be3c --- /dev/null +++ b/code/datums/uplink/ammunition.dm @@ -0,0 +1,67 @@ +/************* +* Ammunition * +*************/ +/datum/uplink_item/item/ammo + item_cost = 2 + category = /datum/uplink_category/ammunition + +/datum/uplink_item/item/ammo/a357 + name = ".357" + path = /obj/item/ammo_magazine/a357 + +/datum/uplink_item/item/ammo/mc9mm + name = "9mm" + path = /obj/item/ammo_magazine/mc9mm + +/datum/uplink_item/item/ammo/c45m + name = ".45" + path = /obj/item/ammo_magazine/c45m + +/datum/uplink_item/item/ammo/darts + name = "Darts" + path = /obj/item/ammo_magazine/chemdart + +/datum/uplink_item/item/ammo/sniperammo + name = "14.5mm" + path = /obj/item/weapon/storage/box/sniperammo + +/datum/uplink_item/item/ammo/a556 + name = "5.56mm" + path = /obj/item/ammo_magazine/a556 + +/datum/uplink_item/item/ammo/a556/ap + name = "5.56mm AP" + path = /obj/item/ammo_magazine/a556/ap + +/datum/uplink_item/item/ammo/a10mm + name = "10mm" + path = /obj/item/ammo_magazine/a10mm + +/datum/uplink_item/item/ammo/a762 + name = "7.62mm" + path = /obj/item/ammo_magazine/a762 + +/datum/uplink_item/item/ammo/a762/ap + name = "7.62mm AP" + path = /obj/item/ammo_magazine/a762/ap + +/datum/uplink_item/item/ammo/g12 + name = "12 gauge" + path = /obj/item/ammo_magazine/g12 + +/datum/uplink_item/item/ammo/g12/beanbag + name = "12 gauge beanbag" + path = /obj/item/ammo_magazine/g12/beanbag + item_cost = 1 // Discount due to it being LTL. + +/datum/uplink_item/item/ammo/g12/pellet + name = "12 gauge pellet" + path = /obj/item/ammo_magazine/g12/pellet + +/datum/uplink_item/item/ammo/g12/stun + name = "12 gauge stun" + path = /obj/item/weapon/storage/box/stunshells + +/datum/uplink_item/item/ammo/g12/flash + name = "12 gauge flash" + path = /obj/item/weapon/storage/box/flashshells \ No newline at end of file diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm new file mode 100644 index 0000000000..1b3cf75462 --- /dev/null +++ b/code/datums/uplink/announcements.dm @@ -0,0 +1,109 @@ +/**************** +* Announcements * +*****************/ +/datum/uplink_item/abstract/announcements + category = /datum/uplink_category/services + +/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user) + . = ..() + if(.) + log_and_message_admins("has triggered a falsified [src]", user) + +/datum/uplink_item/abstract/announcements/fake_centcom + item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2 + +/datum/uplink_item/abstract/announcements/fake_centcom/New() + ..() + name = "[command_name()] Update Announcement" + desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." + +/datum/uplink_item/abstract/announcements/fake_centcom/extra_args(var/mob/user) + var/title = sanitize(input("Enter your announcement title.", "Announcement Title") as null|text) + if(!title) + return + var/message = sanitize(input("Enter your announcement message.", "Announcement Title") as null|text) + if(!message) + return + return list("title" = title, "message" = message) + +/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) + command_announcement.Announce(args["message"], args["title"]) + return 1 + +/datum/uplink_item/abstract/announcements/fake_crew_arrival + name = "Crew Arrival Announcement/Records" + desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!" + item_cost = 4 + +/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) + if(!user) + return 0 + + var/obj/item/weapon/card/id/I = user.GetIdCard() + var/datum/data/record/random_general_record + var/datum/data/record/random_medical_record + if(data_core.general.len) + random_general_record = pick(data_core.general) + random_medical_record = find_medical_record("id", random_general_record.fields["id"]) + + var/datum/data/record/general = data_core.CreateGeneralRecord(user) + if(I) + general.fields["age"] = I.age + general.fields["rank"] = I.assignment + general.fields["real_rank"] = I.assignment + general.fields["name"] = I.registered_name + general.fields["sex"] = I.sex + else + var/mob/living/carbon/human/H + if(istype(user,/mob/living/carbon/human)) + H = user + general.fields["age"] = H.age + else + general.fields["age"] = initial(H.age) + var/assignment = GetAssignment(user) + general.fields["rank"] = assignment + general.fields["real_rank"] = assignment + general.fields["name"] = user.real_name + general.fields["sex"] = capitalize(user.gender) + + general.fields["species"] = user.get_species() + var/datum/data/record/medical = data_core.CreateMedicalRecord(general.fields["name"], general.fields["id"]) + data_core.CreateSecurityRecord(general.fields["name"], general.fields["id"]) + + if(!random_general_record) + general.fields["citizenship"] = random_general_record.fields["citizenship"] + general.fields["faction"] = random_general_record.fields["faction"] + general.fields["fingerprint"] = random_general_record.fields["fingerprint"] + general.fields["home_system"] = random_general_record.fields["home_system"] + general.fields["religion"] = random_general_record.fields["religion"] + if(random_medical_record) + medical.fields["b_type"] = random_medical_record.fields["b_type"] + medical.fields["b_dna"] = random_medical_record.fields["b_type"] + + if(I) + general.fields["fingerprint"] = I.fingerprint_hash + medical.fields["b_type"] = I.blood_type + medical.fields["b_dna"] = I.dna_hash + + AnnounceArrivalSimple(general.fields["name"], general.fields["rank"]) + return 1 + +/datum/uplink_item/abstract/announcements/fake_ion_storm + name = "Ion Storm Announcement" + desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." + item_cost = 1 + +/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc) + ion_storm_announcement() + return 1 + +/datum/uplink_item/abstract/announcements/fake_radiation + name = "Radiation Storm Announcement" + desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." + item_cost = 3 + +/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc) + var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0) + new/datum/event/radiation_storm/syndicate(EM) + return 1 + diff --git a/code/datums/uplink/armor.dm b/code/datums/uplink/armor.dm new file mode 100644 index 0000000000..30a41d8edb --- /dev/null +++ b/code/datums/uplink/armor.dm @@ -0,0 +1,15 @@ +/******** +* Armor * +********/ +/datum/uplink_item/item/armor + category = /datum/uplink_category/armor + +/datum/uplink_item/item/armor/combat + name = "Combat Armor Set" + item_cost = 5 + path = /obj/item/weapon/storage/box/syndie_kit/combat_armor + +/datum/uplink_item/item/armor/heavy_vest + name = "Heavy Armor Vest" + item_cost = 4 + path = /obj/item/clothing/suit/storage/vest/heavy/merc diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm new file mode 100644 index 0000000000..b837625c8a --- /dev/null +++ b/code/datums/uplink/badassery.dm @@ -0,0 +1,78 @@ +/************ +* Badassery * +************/ +/datum/uplink_item/item/badassery + category = /datum/uplink_category/badassery + +/datum/uplink_item/item/badassery/balloon + name = "For showing that You Are The BOSS (Useless Balloon)" + item_cost = DEFAULT_TELECRYSTAL_AMOUNT + path = /obj/item/toy/syndicateballoon + +/datum/uplink_item/item/badassery/balloon/NT + name = "For showing that you love NT SOO much (Useless Balloon)" + path = /obj/item/toy/nanotrasenballoon + +/************** +* Random Item * +**************/ +/datum/uplink_item/item/badassery/random_one + name = "Random Item" + desc = "Buys you one random item." + +/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user) + var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses) + return item.buy(U, user) + +/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U) + return default_uplink_selection.get_random_item(U.uses, U) != null + +/datum/uplink_item/item/badassery/random_many + name = "Random Items" + desc = "Buys you as many random items you can afford. Convenient packaging NOT included." + +/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals) + return max(1, telecrystals) + +/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc) + var/list/bought_items = list() + for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc)) + UI.purchase_log(U) + var/obj/item/I = UI.get_goods(U, loc) + if(istype(I)) + bought_items += I + + return bought_items + +/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U) + feedback_add_details("traitor_uplink_items_bought", "[src]") + log_and_message_admins("used \the [U.loc] to buy \a [src]") + +/**************** +* Surplus Crate * +****************/ +/datum/uplink_item/item/badassery/surplus + name = "Surplus Crate" + item_cost = 40 + var/item_worth = 60 + var/icon + +/datum/uplink_item/item/badassery/surplus/New() + ..() + desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers." + +/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc) + var/obj/structure/largecrate/C = new(loc) + var/random_items = get_random_uplink_items(null, item_worth, C) + for(var/datum/uplink_item/I in random_items) + I.purchase_log(U) + I.get_goods(U, C) + + return C + +/datum/uplink_item/item/badassery/surplus/log_icon() + if(!icon) + var/obj/structure/largecrate/C = /obj/structure/largecrate + icon = image(initial(C.icon), initial(C.icon_state)) + + return "\icon[icon]" \ No newline at end of file diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm new file mode 100644 index 0000000000..f7c6d1a072 --- /dev/null +++ b/code/datums/uplink/grenades.dm @@ -0,0 +1,35 @@ +/*********** +* Grenades * +************/ +/datum/uplink_item/item/grenades + category = /datum/uplink_category/grenades + +/datum/uplink_item/item/grenades/anti_photon + name = "5xPhoton Disruption Grenades" + item_cost = 2 + path = /obj/item/weapon/storage/box/anti_photons + +/datum/uplink_item/item/grenades/emp + name = "5xEMP Grenades" + item_cost = 3 + path = /obj/item/weapon/storage/box/emps + +/datum/uplink_item/item/grenades/smoke + name = "7xSmoke Grenades" + item_cost = 2 + path = /obj/item/weapon/storage/box/smokes + +/datum/uplink_item/item/grenades/frags + name = "5xFrag Grenades" + item_cost = 6 + path = /obj/item/weapon/storage/box/frags + +/datum/uplink_item/item/grenades/flashbnags + name = "7xFlashbangs" + item_cost = 4 + path = /obj/item/weapon/storage/box/flashbangs + +/datum/uplink_item/item/grenades/metalfoam + name = "7xMetal Foam Grenades" + item_cost = 3 + path = /obj/item/weapon/storage/box/metalfoam \ No newline at end of file diff --git a/code/datums/uplink/hardsuit_modules.dm b/code/datums/uplink/hardsuit_modules.dm new file mode 100644 index 0000000000..66ecfb6bf9 --- /dev/null +++ b/code/datums/uplink/hardsuit_modules.dm @@ -0,0 +1,40 @@ +/******************* +* Hardsuit Modules * +*******************/ +/datum/uplink_item/item/hardsuit_modules + category = /datum/uplink_category/hardsuit_modules + +/datum/uplink_item/item/hardsuit_modules/thermal + name = "Thermal Scanner" + item_cost = 2 + path = /obj/item/rig_module/vision/thermal + +/datum/uplink_item/item/hardsuit_modules/energy_net + name = "Net Projector" + item_cost = 3 + path = /obj/item/rig_module/fabricator/energy_net + +/datum/uplink_item/item/ewar_voice + name = "Electrowarfare Suite and Voice Synthesiser" + item_cost = 4 + path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice + +/datum/uplink_item/item/hardsuit_modules/maneuvering_jets + name = "Maneuvering Jets" + item_cost = 4 + path = /obj/item/rig_module/maneuvering_jets + +/datum/uplink_item/item/hardsuit_modules/egun + name = "Mounted Energy Gun" + item_cost = 6 + path = /obj/item/rig_module/mounted/egun + +/datum/uplink_item/item/hardsuit_modules/power_sink + name = "Power Sink" + item_cost = 6 + path = /obj/item/rig_module/power_sink + +/datum/uplink_item/item/hardsuit_modules/laser_canon + name = "Mounted Laser Cannon" + item_cost = 8 + path = /obj/item/rig_module/mounted diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm new file mode 100644 index 0000000000..c4302464b6 --- /dev/null +++ b/code/datums/uplink/implants.dm @@ -0,0 +1,25 @@ +/*********** +* Implants * +***********/ +/datum/uplink_item/item/implants + category = /datum/uplink_category/implants + +/datum/uplink_item/item/implants/imp_freedom + name = "Freedom Implant" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom + +/datum/uplink_item/item/implants/imp_compress + name = "Compressed Matter Implant" + item_cost = 4 + path = /obj/item/weapon/storage/box/syndie_kit/imp_compress + +/datum/uplink_item/item/implants/imp_explosive + name = "Explosive Implant (DANGER!)" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive + +/datum/uplink_item/item/implants/imp_uplink + name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)" + item_cost = 5 //Original cost: 10 + path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm new file mode 100644 index 0000000000..8e3f534004 --- /dev/null +++ b/code/datums/uplink/medical.dm @@ -0,0 +1,36 @@ +/********** +* Medical * +**********/ +/datum/uplink_item/item/medical + category = /datum/uplink_category/medical + +/datum/uplink_item/item/medical/sinpockets + name = "Box of Sin-Pockets" + item_cost = 1 + path = /obj/item/weapon/storage/box/sinpockets + +/datum/uplink_item/item/medical/surgery + name = "Surgery kit" + item_cost = 6 + path = /obj/item/weapon/storage/firstaid/surgery + +/datum/uplink_item/item/medical/combat + name = "Combat medical kit" + item_cost = 6 + path = /obj/item/weapon/storage/firstaid/combat + +/datum/uplink_item/item/medical/combat + name = "Portable Freezer" + item_cost = 2 + path = /obj/item/weapon/storage/box/freezer + +/datum/uplink_item/item/medical/ambrosiaseeds + name = "Box of 7x ambrosia seed packets" + item_cost = 1 + path = /obj/item/weapon/storage/box/ambrosia + +/datum/uplink_item/item/medical/ambrosiadeusseeds + name = "Box of 7x ambrosia deus seed packets" + item_cost = 2 + path = /obj/item/weapon/storage/box/ambrosiadeus + diff --git a/code/datums/uplink/stealth_items.dm b/code/datums/uplink/stealth_items.dm new file mode 100644 index 0000000000..31364a0953 --- /dev/null +++ b/code/datums/uplink/stealth_items.dm @@ -0,0 +1,45 @@ +/******************************* +* Stealth and Camouflage Items * +*******************************/ +/datum/uplink_item/item/stealth_items + category = /datum/uplink_category/stealth_items + +/datum/uplink_item/item/stealth_items/id + name = "Agent ID card" + item_cost = 2 + path = /obj/item/weapon/card/id/syndicate + +/datum/uplink_item/item/stealth_items/syndigaloshes + name = "No-Slip Shoes" + item_cost = 2 + path = /obj/item/clothing/shoes/syndigaloshes + +/datum/uplink_item/item/stealth_items/spy + name = "Bug Kit" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/spy + +/datum/uplink_item/item/stealth_items/chameleon_kit + name = "Chameleon Kit" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/chameleon + +/datum/uplink_item/item/stealth_items/chameleon_projector + name = "Chameleon-Projector" + item_cost = 4 + path = /obj/item/device/chameleon + +/datum/uplink_item/item/stealth_items/chameleon_projector + name = "Chameleon-Projector" + item_cost = 4 + path = /obj/item/device/chameleon + +/datum/uplink_item/item/stealth_items/voice + name = "Voice Changer" + item_cost = 4 + path = /obj/item/clothing/mask/gas/voice + +/datum/uplink_item/item/stealth_items/camera_floppy + name = "Camera Network Access - Floppy" + item_cost = 6 + path = /obj/item/weapon/disk/file/cameras/syndicate diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm new file mode 100644 index 0000000000..ead34c5646 --- /dev/null +++ b/code/datums/uplink/stealthy_weapons.dm @@ -0,0 +1,35 @@ +/************************************* +* Stealthy and Inconspicuous Weapons * +*************************************/ +/datum/uplink_item/item/stealthy_weapons + category = /datum/uplink_category/stealthy_weapons + +/datum/uplink_item/item/stealthy_weapons/soap + name = "Subversive Soap" + item_cost = 1 + path = /obj/item/weapon/soap/syndie + +/datum/uplink_item/item/stealthy_weapons/concealed_cane + name = "Concealed Cane Sword" + item_cost = 1 + path = /obj/item/weapon/cane/concealed + +/datum/uplink_item/item/stealthy_weapons/detomatix + name = "Detomatix PDA Cartridge" + item_cost = 3 + path = /obj/item/weapon/cartridge/syndicate + +/datum/uplink_item/item/stealthy_weapons/parapen + name = "Paralysis Pen" + item_cost = 3 + path = /obj/item/weapon/pen/reagent/paralysis + +/datum/uplink_item/item/stealthy_weapons/cigarette_kit + name = "Cigarette Kit" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/cigarette + +/datum/uplink_item/item/stealthy_weapons/random_toxin + name = "Random Toxin - Beaker" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/toxin diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm new file mode 100644 index 0000000000..fb1b52c068 --- /dev/null +++ b/code/datums/uplink/tools.dm @@ -0,0 +1,85 @@ +/******************** +* Devices and Tools * +********************/ +/datum/uplink_item/item/tools + category = /datum/uplink_category/tools + +/datum/uplink_item/item/tools/toolbox + name = "Fully Loaded Toolbox" + item_cost = 1 + path = /obj/item/weapon/storage/toolbox/syndicate + +/datum/uplink_item/item/tools/plastique + name = "C-4 (Destroys walls)" + item_cost = 2 + path = /obj/item/weapon/plastique + +/datum/uplink_item/item/tools/encryptionkey_radio + name = "Encrypted Radio Channel Key" + item_cost = 2 + path = /obj/item/device/encryptionkey/syndicate + +/datum/uplink_item/item/tools/encryptionkey_binary + name = "Binary Translator Key" + item_cost = 3 + path = /obj/item/device/encryptionkey/binary + +/datum/uplink_item/item/tools/emag + name = "Cryptographic Sequencer" + item_cost = 3 + path = /obj/item/weapon/card/emag + +/datum/uplink_item/item/tools/clerical + name = "Morphic Clerical Kit" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/clerical + +/datum/uplink_item/item/tools/space_suit + name = "Space Suit" + item_cost = 3 + path = /obj/item/weapon/storage/box/syndie_kit/space + +/datum/uplink_item/item/tools/thermal + name = "Thermal Imaging Glasses" + item_cost = 3 + path = /obj/item/clothing/glasses/thermal/syndi + +/datum/uplink_item/item/tools/powersink + name = "Powersink (DANGER!)" + item_cost = 5 + path = /obj/item/device/powersink + +/datum/uplink_item/item/tools/ai_module + name = "Hacked AI Upload Module" + item_cost = 7 + path = /obj/item/weapon/aiModule/syndicate + +/datum/uplink_item/item/tools/supply_beacon + name = "Hacked Supply Beacon (DANGER!)" + item_cost = 7 + path = /obj/item/supply_beacon + +/datum/uplink_item/item/tools/teleporter + name = "Teleporter Circuit Board" + item_cost = 20 + path = /obj/item/weapon/circuitboard/teleporter + +/datum/uplink_item/item/tools/money + name = "Operations Funding" + item_cost = 3 + path = /obj/item/weapon/storage/secure/briefcase/money + desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." + +/datum/uplink_item/item/tools/crystal + name = "Tradable Crystal" + item_cost = 1 + path = /obj/item/device/telecrystal + desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone." + +/datum/uplink_item/item/tools/hacking_tool + name = "Door Hacking Tool" + item_cost = 2 + path = /obj/item/device/multitool/hacktool + desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ + When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ + This device will also be able to immediately access the last 6 to 8 hacked airlocks." \ No newline at end of file diff --git a/code/game/objects/items/devices/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm similarity index 87% rename from code/game/objects/items/devices/uplink_categories.dm rename to code/datums/uplink/uplink_categories.dm index 68ed72a6fb..6e222b764b 100644 --- a/code/game/objects/items/devices/uplink_categories.dm +++ b/code/datums/uplink/uplink_categories.dm @@ -1,49 +1,49 @@ -/datum/uplink_category - var/name = "" - var/list/datum/uplink_item/items - -/datum/uplink_category/New() - ..() - items = list() - -/datum/uplink_category/proc/can_view(obj/item/device/uplink/U) - for(var/datum/uplink_item/item in items) - if(item.can_view(U)) - return 1 - return 0 - -/datum/uplink_category/ammunition - name = "Ammunition" - -/datum/uplink_category/grenades - name = "Grenades and Thrown Objects" - -/datum/uplink_category/visible_weapons - name = "Highly Visible and Dangerous Weapons" - -/datum/uplink_category/stealthy_weapons - name = "Stealthy and Inconspicuous Weapons" - -/datum/uplink_category/stealth_items - name = "Stealth and Camouflage Items" - -/datum/uplink_category/armor - name = "Armor" - -/datum/uplink_category/tools - name = "Devices and Tools" - -/datum/uplink_category/implants - name = "Implants" - -/datum/uplink_category/medical - name = "Medical" - -/datum/uplink_category/hardsuit_modules - name = "Hardsuit Modules" - -/datum/uplink_category/services - name = "Services" - -/datum/uplink_category/badassery - name = "Badassery" +/datum/uplink_category + var/name = "" + var/list/datum/uplink_item/items + +/datum/uplink_category/New() + ..() + items = list() + +/datum/uplink_category/proc/can_view(obj/item/device/uplink/U) + for(var/datum/uplink_item/item in items) + if(item.can_view(U)) + return 1 + return 0 + +datum/uplink_category/ammunition + name = "Ammunition" + +/datum/uplink_category/services + name = "Services" + +/datum/uplink_category/armor + name = "Armor" + +/datum/uplink_category/badassery + name = "Badassery" + +/datum/uplink_category/grenades + name = "Grenades and Thrown Objects" + +/datum/uplink_category/hardsuit_modules + name = "Hardsuit Modules" + +/datum/uplink_category/implants + name = "Implants" + +/datum/uplink_category/medical + name = "Medical" + +/datum/uplink_category/stealth_items + name = "Stealth and Camouflage Items" + +/datum/uplink_category/stealthy_weapons + name = "Stealthy and Inconspicuous Weapons" + +/datum/uplink_category/tools + name = "Devices and Tools" + +/datum/uplink_category/visible_weapons + name = "Highly Visible and Dangerous Weapons" \ No newline at end of file diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm new file mode 100644 index 0000000000..32a7d0cffb --- /dev/null +++ b/code/datums/uplink/uplink_items.dm @@ -0,0 +1,174 @@ +var/datum/uplink/uplink = new() + +/datum/uplink + var/list/items_assoc + var/list/datum/uplink_item/items + var/list/datum/uplink_category/categories + +/datum/uplink/New() + items_assoc = list() + items = init_subtypes(/datum/uplink_item) + categories = init_subtypes(/datum/uplink_category) + categories = dd_sortedObjectList(categories) + + for(var/datum/uplink_item/item in items) + if(!item.name) + items -= item + continue + + items_assoc[item.type] = item + + for(var/datum/uplink_category/category in categories) + if(item.category == category.type) + category.items += item + + for(var/datum/uplink_category/category in categories) + category.items = dd_sortedObjectList(category.items) + +/datum/uplink_item + var/name + var/desc + var/item_cost = 0 + var/datum/uplink_category/category // Item category + var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all. + +/datum/uplink_item/item + var/path = null + +/datum/uplink_item/New() + ..() + antag_roles = list() + + + +/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) + var/extra_args = extra_args(user) + if(!extra_args) + return + + if(!can_buy(U)) + return + + if(U.CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE) + return + + var/cost = cost(U.uses, U) + + var/goods = get_goods(U, get_turf(user), user, extra_args) + if(!goods) + return + + purchase_log(U) + user.mind.tcrystals -= cost + U.used_TC += cost + return goods + +// Any additional arguments you wish to send to the get_goods +/datum/uplink_item/proc/extra_args(var/mob/user) + return 1 + +/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U) + if(cost(U.uses, U) > U.uses) + return 0 + + return can_view(U) + +/datum/uplink_item/proc/can_view(obj/item/device/uplink/U) + // Making the assumption that if no uplink was supplied, then we don't care about antag roles + if(!U || !antag_roles.len) + return 1 + + // With no owner, there's no need to check antag status. + if(!U.uplink_owner) + return 0 + + for(var/antag_role in antag_roles) + var/datum/antagonist/antag = all_antag_types[antag_role] + if(antag.is_antagonist(U.uplink_owner)) + return 1 + return 0 + +/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U) + . = item_cost + if(U) + . = U.get_item_cost(src, .) + +/datum/uplink_item/proc/description() + return desc + +// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying +/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc) + return 0 + +/datum/uplink_item/proc/log_icon() + return + +/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U) + feedback_add_details("traitor_uplink_items_bought", "[src]") + log_and_message_admins("used \the [U.loc] to buy \a [src]") + U.purchase_log[src] = U.purchase_log[src] + 1 + +datum/uplink_item/dd_SortValue() + return cost(INFINITY) + +/******************************** +* * +* Physical Uplink Entries * +* * +********************************/ +/datum/uplink_item/item/buy(var/obj/item/device/uplink/U, var/mob/user) + var/obj/item/I = ..() + if(!I) + return + + if(istype(I, /list)) + var/list/L = I + if(L.len) I = L[1] + + if(istype(I) && ishuman(user)) + var/mob/living/carbon/human/A = user + A.put_in_any_hand_if_possible(I) + return I + +/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc) + var/obj/item/I = new path(loc) + return I + +/datum/uplink_item/item/description() + if(!desc) + // Fallback description + var/obj/temp = src.path + desc = initial(temp.desc) + return ..() + +/datum/uplink_item/item/log_icon() + var/obj/I = path + return "\icon[I]" + +/******************************** +* * +* Abstract Uplink Entries * +* * +********************************/ +/datum/uplink_item/abstract + var/static/image/default_abstract_uplink_icon + +/datum/uplink_item/abstract/log_icon() + if(!default_abstract_uplink_icon) + default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn") + + return "\icon[default_abstract_uplink_icon]" + +/**************** +* Support procs * +****************/ +/proc/get_random_uplink_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc) + var/list/bought_items = list() + while(remaining_TC) + var/datum/uplink_item/I = default_uplink_selection.get_random_item(remaining_TC, U, bought_items) + if(!I) + break + bought_items += I + remaining_TC -= I.cost(remaining_TC, U) + + return bought_items diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm new file mode 100644 index 0000000000..4c9ac49ee1 --- /dev/null +++ b/code/datums/uplink/visible_weapons.dm @@ -0,0 +1,91 @@ +/*************************************** +* Highly Visible and Dangerous Weapons * +***************************************/ +/datum/uplink_item/item/visible_weapons + category = /datum/uplink_category/visible_weapons + +/datum/uplink_item/item/visible_weapons/energy_sword + name = "Energy Sword" + item_cost = 4 + path = /obj/item/weapon/melee/energy/sword + +/datum/uplink_item/item/visible_weapons/dartgun + name = "Dart Gun" + item_cost = 5 + path = /obj/item/weapon/gun/projectile/dartgun + +/datum/uplink_item/item/visible_weapons/crossbow + name = "Energy Crossbow" + item_cost = 5 + path = /obj/item/weapon/gun/energy/crossbow + +/datum/uplink_item/item/visible_weapons/silenced_45 + name = "Silenced .45" + item_cost = 5 + path = /obj/item/weapon/gun/projectile/silenced + +/datum/uplink_item/item/visible_weapons/riggedlaser + name = "Exosuit Rigged Laser" + item_cost = 6 + path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser + +/datum/uplink_item/item/visible_weapons/revolver + name = "Revolver" + item_cost = 6 + path = /obj/item/weapon/gun/projectile/revolver + +/datum/uplink_item/item/visible_weapons/heavysniper + name = "Anti-materiel Rifle" + item_cost = DEFAULT_TELECRYSTAL_AMOUNT + path = /obj/item/weapon/gun/projectile/heavysniper + +//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. +/datum/uplink_item/item/visible_weapons/submachinegun + name = "Submachine Gun" + item_cost = 6 + path = /obj/item/weapon/gun/projectile/automatic/c20r + +/datum/uplink_item/item/visible_weapons/assaultrifle + name = "Assault Rifle" + item_cost = 7 + path = /obj/item/weapon/gun/projectile/automatic/sts35 + +/datum/uplink_item/item/visible_weapons/combatshotgun + name = "Combat Shotgun" + item_cost = 7 + path = /obj/item/weapon/gun/projectile/shotgun/pump/combat + +/datum/uplink_item/item/visible_weapons/egun + name = "Energy Gun" + item_cost = 5 + path = /obj/item/weapon/gun/energy/gun + +/datum/uplink_item/item/visible_weapons/lasercannon + name = "Laser Cannon" + item_cost = 6 + path = /obj/item/weapon/gun/energy/lasercannon + +/datum/uplink_item/item/visible_weapons/lasercarbine + name = "Laser Carbine" + item_cost = 7 + path = /obj/item/weapon/gun/energy/laser + +/datum/uplink_item/item/visible_weapons/ionrifle + name = "Ion Rifle" + item_cost = 5 + path = /obj/item/weapon/gun/energy/ionrifle + +/datum/uplink_item/item/visible_weapons/xray + name = "Xray Gun" + item_cost = 7 + path = /obj/item/weapon/gun/energy/xray + +/datum/uplink_item/item/visible_weapons/tactknife + name = "Tactical Knife" + item_cost = 1 + path = /obj/item/weapon/material/hatchet/tacknife + +/datum/uplink_item/item/visible_weapons/combatknife + name = "Combat Knife" + item_cost = 3 + path = /obj/item/weapon/material/hatchet/tacknife/combatknife \ No newline at end of file diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 8e460d38b6..c27d510d8b 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -46,9 +46,8 @@ var/datum/antagonist/mercenary/mercs player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT player.mind.accept_tcrystals = 1 - if (player.mind == leader) - var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT) - player.put_in_hands(U) + var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT) + player.put_in_hands(U) player.update_icons() diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index df28d4d3d7..5462868256 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -1,11 +1,3 @@ -//This could either be split into the proper DM files or placed somewhere else all together, but it'll do for now -Nodrak - -/* - -A list of items and costs is stored under the datum of every game mode, alongside the number of crystals, and the welcoming message. - -*/ - /obj/item/device/uplink var/welcome = "Welcome, Operative" // Welcoming menu message var/uses // Numbers of crystals @@ -18,6 +10,10 @@ A list of items and costs is stored under the datum of every game mode, alongsid var/list/purchase_log = new var/datum/mind/uplink_owner = null var/used_TC = 0 + var/offer_time = 15 MINUTES //The time increment per discount offered + var/next_offer_time //The time a discount will next be offered + var/datum/uplink_item/discount_item //The item to be discounted + var/discount_amount //The amount as a percent the item will be discounted by /obj/item/device/uplink/nano_host() return loc @@ -28,10 +24,22 @@ A list of items and costs is stored under the datum of every game mode, alongsid purchase_log = list() world_uplinks += src uses = owner.tcrystals + processing_objects += src /obj/item/device/uplink/Destroy() world_uplinks -= src - ..() + processing_objects -= src + return ..() + +/obj/item/device/uplink/process() + if(world.time > next_offer_time) + discount_item = default_uplink_selection.get_random_item(INFINITY) + discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) + next_offer_time = world.time + offer_time + nanomanager.update_uis(src) + +/obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost) + return (discount_item && (item_type == discount_item)) ? max(1, round(item_cost*discount_amount)) : item_cost // HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it. /* How to create an uplink in 3 easy steps! @@ -107,6 +115,11 @@ A list of items and costs is stored under the datum of every game mode, alongsid /obj/item/device/uplink/hidden/interact(mob/user) ui_interact(user) +/obj/item/device/uplink/hidden/CanUseTopic() + if(!active) + return STATUS_CLOSE + return ..() + // The purchasing code. /obj/item/device/uplink/hidden/Topic(href, href_list) if(..()) @@ -139,11 +152,14 @@ A list of items and costs is stored under the datum of every game mode, alongsid if(category.can_view(src)) categories[++categories.len] = list("name" = category.name, "ref" = "\ref[category]") nanoui_data["categories"] = categories + nanoui_data["discount_name"] = discount_item ? discount_item.name : "" + nanoui_data["discount_amount"] = (1-discount_amount)*100 + nanoui_data["offer_expiry"] = worldtime2text(next_offer_time - world.time) else if(nanoui_menu == 1) var/items[0] for(var/datum/uplink_item/item in category.items) if(item.can_view(src)) - var/cost = item.cost(uses) + var/cost = item.cost(uses, src) if(!cost) cost = "???" items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
    "), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]") nanoui_data["items"] = items diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm deleted file mode 100644 index b0ee3689a1..0000000000 --- a/code/game/objects/items/devices/uplink_items.dm +++ /dev/null @@ -1,782 +0,0 @@ -var/datum/uplink/uplink = new() - -/datum/uplink - var/list/items_assoc - var/list/datum/uplink_item/items - var/list/datum/uplink_category/categories - -/datum/uplink/New() - items_assoc = list() - items = init_subtypes(/datum/uplink_item) - categories = init_subtypes(/datum/uplink_category) - categories = dd_sortedObjectList(categories) - - for(var/datum/uplink_item/item in items) - if(!item.name) - items -= item - continue - - items_assoc[item.type] = item - - for(var/datum/uplink_category/category in categories) - if(item.category == category.type) - category.items += item - - for(var/datum/uplink_category/category in categories) - category.items = dd_sortedObjectList(category.items) - -/datum/uplink_item - var/name - var/desc - var/item_cost = 0 - var/datum/uplink_category/category // Item category - var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all. - -/datum/uplink_item/item - var/path = null - -/datum/uplink_item/New() - ..() - antag_roles = list() - - - -/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) - var/extra_args = extra_args(user) - if(!extra_args) - return - - if(!can_buy(U)) - return - - var/cost = cost(U.uses) - - var/goods = get_goods(U, get_turf(user), user, extra_args) - if(!goods) - return - - purchase_log(U) - user.mind.tcrystals -= cost - U.used_TC += cost - return goods - -// Any additional arguments you wish to send to the get_goods -/datum/uplink_item/proc/extra_args(var/mob/user) - return 1 - -/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U) - if(cost(U.uses) > U.uses) - return 0 - - return can_view(U) - -/datum/uplink_item/proc/can_view(obj/item/device/uplink/U) - // Making the assumption that if no uplink was supplied, then we don't care about antag roles - if(!U || !antag_roles.len) - return 1 - - // With no owner, there's no need to check antag status. - if(!U.uplink_owner) - return 0 - - for(var/antag_role in antag_roles) - var/datum/antagonist/antag = all_antag_types[antag_role] - if(antag.is_antagonist(U.uplink_owner)) - return 1 - return 0 - -/datum/uplink_item/proc/cost(var/telecrystals) - return item_cost - -/datum/uplink_item/proc/description() - return desc - -// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying -/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc) - return 0 - -/datum/uplink_item/proc/log_icon() - return - -/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U) - feedback_add_details("traitor_uplink_items_bought", "[src]") - log_and_message_admins("used \the [U.loc] to buy \a [src]") - U.purchase_log[src] = U.purchase_log[src] + 1 - -datum/uplink_item/dd_SortValue() - return cost(INFINITY) - -/******************************** -* * -* Physical Uplink Entries * -* * -********************************/ -/datum/uplink_item/item/buy(var/obj/item/device/uplink/U, var/mob/user) - var/obj/item/I = ..() - if(!I) - return - - if(istype(I, /list)) - var/list/L = I - if(L.len) I = L[1] - - if(istype(I) && ishuman(user)) - var/mob/living/carbon/human/A = user - A.put_in_any_hand_if_possible(I) - return I - -/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc) - var/obj/item/I = new path(loc) - return I - -/datum/uplink_item/item/description() - if(!desc) - // Fallback description - var/obj/temp = src.path - desc = initial(temp.desc) - return ..() - -/datum/uplink_item/item/log_icon() - var/obj/I = path - return "\icon[I]" - -/************* -* Ammunition * -*************/ -/datum/uplink_item/item/ammo - item_cost = 2 - category = /datum/uplink_category/ammunition - -/datum/uplink_item/item/ammo/a357 - name = ".357" - path = /obj/item/ammo_magazine/a357 - -/datum/uplink_item/item/ammo/mc9mm - name = "9mm" - path = /obj/item/ammo_magazine/mc9mm - -/datum/uplink_item/item/ammo/c45m - name = ".45" - path = /obj/item/ammo_magazine/c45m - -/datum/uplink_item/item/ammo/darts - name = "Darts" - path = /obj/item/ammo_magazine/chemdart - -/datum/uplink_item/item/ammo/sniperammo - name = "14.5mm" - path = /obj/item/weapon/storage/box/sniperammo - -/datum/uplink_item/item/ammo/a556 - name = "5.56mm" - path = /obj/item/ammo_magazine/a556 - -/datum/uplink_item/item/ammo/a556/ap - name = "5.56mm AP" - path = /obj/item/ammo_magazine/a556/ap - -/datum/uplink_item/item/ammo/a10mm - name = "10mm" - path = /obj/item/ammo_magazine/a10mm - -/datum/uplink_item/item/ammo/a762 - name = "7.62mm" - path = /obj/item/ammo_magazine/a762 - -/datum/uplink_item/item/ammo/a762/ap - name = "7.62mm AP" - path = /obj/item/ammo_magazine/a762/ap - -/datum/uplink_item/item/ammo/g12 - name = "12 gauge" - path = /obj/item/ammo_magazine/g12 - -/datum/uplink_item/item/ammo/g12/beanbag - name = "12 gauge beanbag" - path = /obj/item/ammo_magazine/g12/beanbag - item_cost = 1 // Discount due to it being LTL. - -/datum/uplink_item/item/ammo/g12/pellet - name = "12 gauge pellet" - path = /obj/item/ammo_magazine/g12/pellet - -/*************************************** -* Highly Visible and Dangerous Weapons * -***************************************/ -/datum/uplink_item/item/visible_weapons - category = /datum/uplink_category/visible_weapons - -/datum/uplink_item/item/visible_weapons/energy_sword - name = "Energy Sword" - item_cost = 4 - path = /obj/item/weapon/melee/energy/sword - -/datum/uplink_item/item/visible_weapons/dartgun - name = "Dart Gun" - item_cost = 5 - path = /obj/item/weapon/gun/projectile/dartgun - -/datum/uplink_item/item/visible_weapons/crossbow - name = "Energy Crossbow" - item_cost = 5 - path = /obj/item/weapon/gun/energy/crossbow - -/datum/uplink_item/item/visible_weapons/silenced_45 - name = "Silenced .45" - item_cost = 5 - path = /obj/item/weapon/gun/projectile/silenced - -/datum/uplink_item/item/visible_weapons/riggedlaser - name = "Exosuit Rigged Laser" - item_cost = 6 - path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser - -/datum/uplink_item/item/visible_weapons/revolver - name = "Revolver" - item_cost = 6 - path = /obj/item/weapon/gun/projectile/revolver - -/datum/uplink_item/item/visible_weapons/heavysniper - name = "Anti-materiel Rifle" - item_cost = DEFAULT_TELECRYSTAL_AMOUNT - path = /obj/item/weapon/gun/projectile/heavysniper - -//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. -/datum/uplink_item/item/visible_weapons/submachinegun - name = "Submachine Gun" - item_cost = 6 - path = /obj/item/weapon/gun/projectile/automatic/c20r - -/datum/uplink_item/item/visible_weapons/assaultrifle - name = "Assault Rifle" - item_cost = 7 - path = /obj/item/weapon/gun/projectile/automatic/sts35 - -/datum/uplink_item/item/visible_weapons/combatshotgun - name = "Combat Shotgun" - item_cost = 7 - path = /obj/item/weapon/gun/projectile/shotgun/pump/combat - -/datum/uplink_item/item/visible_weapons/egun - name = "Energy Gun" - item_cost = 5 - path = /obj/item/weapon/gun/energy/gun - -/datum/uplink_item/item/visible_weapons/lasercannon - name = "Laser Cannon" - item_cost = 6 - path = /obj/item/weapon/gun/energy/lasercannon - -/datum/uplink_item/item/visible_weapons/lasercarbine - name = "Laser Carbine" - item_cost = 7 - path = /obj/item/weapon/gun/energy/laser - -/datum/uplink_item/item/visible_weapons/ionrifle - name = "Ion Rifle" - item_cost = 5 - path = /obj/item/weapon/gun/energy/ionrifle - -/datum/uplink_item/item/visible_weapons/xray - name = "Xray Gun" - item_cost = 7 - path = /obj/item/weapon/gun/energy/xray - -/************************************* -* Stealthy and Inconspicuous Weapons * -*************************************/ -/datum/uplink_item/item/stealthy_weapons - category = /datum/uplink_category/stealthy_weapons - -/datum/uplink_item/item/stealthy_weapons/soap - name = "Subversive Soap" - item_cost = 1 - path = /obj/item/weapon/soap/syndie - -/datum/uplink_item/item/stealthy_weapons/concealed_cane - name = "Concealed Cane Sword" - item_cost = 1 - path = /obj/item/weapon/cane/concealed - -/datum/uplink_item/item/stealthy_weapons/detomatix - name = "Detomatix PDA Cartridge" - item_cost = 3 - path = /obj/item/weapon/cartridge/syndicate - -/datum/uplink_item/item/stealthy_weapons/parapen - name = "Paralysis Pen" - item_cost = 3 - path = /obj/item/weapon/pen/reagent/paralysis - -/datum/uplink_item/item/stealthy_weapons/cigarette_kit - name = "Cigarette Kit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/cigarette - -/datum/uplink_item/item/stealthy_weapons/random_toxin - name = "Random Toxin - Beaker" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/toxin - -/******************************* -* Stealth and Camouflage Items * -*******************************/ -/datum/uplink_item/item/stealth_items - category = /datum/uplink_category/stealth_items - -/datum/uplink_item/item/stealth_items/id - name = "Agent ID card" - item_cost = 2 - path = /obj/item/weapon/card/id/syndicate - -/datum/uplink_item/item/stealth_items/syndigaloshes - name = "No-Slip Shoes" - item_cost = 2 - path = /obj/item/clothing/shoes/syndigaloshes - -/datum/uplink_item/item/stealth_items/spy - name = "Bug Kit" - item_cost = 2 - path = /obj/item/weapon/storage/box/syndie_kit/spy - -/datum/uplink_item/item/stealth_items/chameleon_kit - name = "Chameleon Kit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/chameleon - -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - -/datum/uplink_item/item/stealth_items/voice - name = "Voice Changer" - item_cost = 4 - path = /obj/item/clothing/mask/gas/voice - -/datum/uplink_item/item/stealth_items/camera_floppy - name = "Camera Network Access - Floppy" - item_cost = 6 - path = /obj/item/weapon/disk/file/cameras/syndicate - -/******** -* Armor * -********/ -/datum/uplink_item/item/armor - category = /datum/uplink_category/armor - -/datum/uplink_item/item/armor/combat - name = "Combat Armor Set" - item_cost = 5 - path = /obj/item/weapon/storage/box/syndie_kit/combat_armor - -/datum/uplink_item/item/armor/heavy_vest - name = "Heavy Armor Vest" - item_cost = 4 - path = /obj/item/clothing/suit/storage/vest/heavy/merc - -/******************** -* Devices and Tools * -********************/ -/datum/uplink_item/item/tools - category = /datum/uplink_category/tools - -/datum/uplink_item/item/tools/toolbox - name = "Fully Loaded Toolbox" - item_cost = 1 - path = /obj/item/weapon/storage/toolbox/syndicate - -/datum/uplink_item/item/tools/plastique - name = "C-4 (Destroys walls)" - item_cost = 2 - path = /obj/item/weapon/plastique - -/datum/uplink_item/item/tools/encryptionkey_radio - name = "Encrypted Radio Channel Key" - item_cost = 2 - path = /obj/item/device/encryptionkey/syndicate - -/datum/uplink_item/item/tools/encryptionkey_binary - name = "Binary Translator Key" - item_cost = 3 - path = /obj/item/device/encryptionkey/binary - -/datum/uplink_item/item/tools/emag - name = "Cryptographic Sequencer" - item_cost = 3 - path = /obj/item/weapon/card/emag - -/datum/uplink_item/item/tools/hacking_tool - name = "Door Hacking Tool" - item_cost = 2 - path = /obj/item/device/multitool/hacktool - desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ - When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ - This device will also be able to immediately access the last 6 to 8 hacked airlocks." - -/datum/uplink_item/item/tools/clerical - name = "Morphic Clerical Kit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/clerical - -/datum/uplink_item/item/tools/space_suit - name = "Space Suit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/space - -/datum/uplink_item/item/tools/thermal - name = "Thermal Imaging Glasses" - item_cost = 3 - path = /obj/item/clothing/glasses/thermal/syndi - -/datum/uplink_item/item/tools/powersink - name = "Powersink (DANGER!)" - item_cost = 5 - path = /obj/item/device/powersink - -/datum/uplink_item/item/tools/ai_module - name = "Hacked AI Upload Module" - item_cost = 7 - path = /obj/item/weapon/aiModule/syndicate - -/datum/uplink_item/item/tools/supply_beacon - name = "Hacked Supply Beacon (DANGER!)" - item_cost = 7 - path = /obj/item/supply_beacon - -/datum/uplink_item/item/tools/teleporter - name = "Teleporter Circuit Board" - item_cost = 20 - path = /obj/item/weapon/circuitboard/teleporter - -/datum/uplink_item/item/tools/money - name = "Operations Funding" - item_cost = 3 - path = /obj/item/weapon/storage/secure/briefcase/money - desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." - -/datum/uplink_item/item/tools/crystal - name = "Tradable Crystal" - item_cost = 1 - path = /obj/item/device/telecrystal - desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone." - -/*********** -* Implants * -***********/ -/datum/uplink_item/item/implants - category = /datum/uplink_category/implants - -/datum/uplink_item/item/implants/imp_freedom - name = "Freedom Implant" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom - -/datum/uplink_item/item/implants/imp_compress - name = "Compressed Matter Implant" - item_cost = 4 - path = /obj/item/weapon/storage/box/syndie_kit/imp_compress - -/datum/uplink_item/item/implants/imp_explosive - name = "Explosive Implant (DANGER!)" - item_cost = 6 - path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive - -/datum/uplink_item/item/implants/imp_uplink - name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)" - item_cost = 5 //Original cost: 10 - path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink - -/********** -* Medical * -**********/ -/datum/uplink_item/item/medical - category = /datum/uplink_category/medical - -/datum/uplink_item/item/medical/sinpockets - name = "Box of Sin-Pockets" - item_cost = 1 - path = /obj/item/weapon/storage/box/sinpockets - -/datum/uplink_item/item/medical/surgery - name = "Surgery kit" - item_cost = 6 - path = /obj/item/weapon/storage/firstaid/surgery - -/datum/uplink_item/item/medical/combat - name = "Combat medical kit" - item_cost = 6 - path = /obj/item/weapon/storage/firstaid/combat - -/******************* -* Hardsuit Modules * -*******************/ -/datum/uplink_item/item/hardsuit_modules - category = /datum/uplink_category/hardsuit_modules - -/datum/uplink_item/item/hardsuit_modules/thermal - name = "Thermal Scanner" - item_cost = 2 - path = /obj/item/rig_module/vision/thermal - -/datum/uplink_item/item/hardsuit_modules/energy_net - name = "Net Projector" - item_cost = 3 - path = /obj/item/rig_module/fabricator/energy_net - -/datum/uplink_item/item/ewar_voice - name = "Electrowarfare Suite and Voice Synthesiser" - item_cost = 4 - path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice - -/datum/uplink_item/item/hardsuit_modules/maneuvering_jets - name = "Maneuvering Jets" - item_cost = 4 - path = /obj/item/rig_module/maneuvering_jets - -/datum/uplink_item/item/hardsuit_modules/egun - name = "Mounted Energy Gun" - item_cost = 6 - path = /obj/item/rig_module/mounted/egun - -/datum/uplink_item/item/hardsuit_modules/power_sink - name = "Power Sink" - item_cost = 6 - path = /obj/item/rig_module/power_sink - -/datum/uplink_item/item/hardsuit_modules/laser_canon - name = "Mounted Laser Cannon" - item_cost = 8 - path = /obj/item/rig_module/mounted - -/*********** -* Grenades * -************/ -/datum/uplink_item/item/grenades - category = /datum/uplink_category/grenades - -/datum/uplink_item/item/grenades/anti_photon - name = "5xPhoton Disruption Grenades" - item_cost = 2 - path = /obj/item/weapon/storage/box/anti_photons - -/datum/uplink_item/item/grenades/emp - name = "5xEMP Grenades" - item_cost = 3 - path = /obj/item/weapon/storage/box/emps - -/datum/uplink_item/item/grenades/smoke - name = "5xSmoke Grenades" - item_cost = 2 - path = /obj/item/weapon/storage/box/smokes - -/************ -* Badassery * -************/ -/datum/uplink_item/item/badassery - category = /datum/uplink_category/badassery - -/datum/uplink_item/item/badassery/balloon - name = "For showing that You Are The BOSS (Useless Balloon)" - item_cost = DEFAULT_TELECRYSTAL_AMOUNT - path = /obj/item/toy/syndicateballoon - -/datum/uplink_item/item/badassery/balloon/NT - name = "For showing that you love NT SOO much (Useless Balloon)" - path = /obj/item/toy/nanotrasenballoon - -/************** -* Random Item * -**************/ -/datum/uplink_item/item/badassery/random_one - name = "Random Item" - desc = "Buys you one random item." - -/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user) - var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses) - return item.buy(U, user) - -/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U) - return default_uplink_selection.get_random_item(U.uses, U) != null - -/datum/uplink_item/item/badassery/random_many - name = "Random Items" - desc = "Buys you as many random items you can afford. Convenient packaging NOT included." - -/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals) - return max(1, telecrystals) - -/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc) - var/list/bought_items = list() - for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc)) - UI.purchase_log(U) - var/obj/item/I = UI.get_goods(U, loc) - if(istype(I)) - bought_items += I - - return bought_items - -/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U) - feedback_add_details("traitor_uplink_items_bought", "[src]") - log_and_message_admins("used \the [U.loc] to buy \a [src]") - -/**************** -* Surplus Crate * -****************/ -/datum/uplink_item/item/badassery/surplus - name = "Surplus Crate" - item_cost = 40 - var/item_worth = 60 - var/icon - -/datum/uplink_item/item/badassery/surplus/New() - ..() - desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers." - -/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc) - var/obj/structure/largecrate/C = new(loc) - var/random_items = get_random_uplink_items(null, item_worth, C) - for(var/datum/uplink_item/I in random_items) - I.purchase_log(U) - I.get_goods(U, C) - - return C - -/datum/uplink_item/item/badassery/surplus/log_icon() - if(!icon) - var/obj/structure/largecrate/C = /obj/structure/largecrate - icon = image(initial(C.icon), initial(C.icon_state)) - - return "\icon[icon]" - -/******************************** -* * -* Abstract Uplink Entries * -* * -********************************/ -var/image/default_abstract_uplink_icon -/datum/uplink_item/abstract/log_icon() - if(!default_abstract_uplink_icon) - default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn") - - return "\icon[default_abstract_uplink_icon]" - -/**************** -* Announcements * -*****************/ -/datum/uplink_item/abstract/announcements - category = /datum/uplink_category/services - -/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user) - . = ..() - if(.) - log_and_message_admins("has triggered a falsified [src]", user) - -/datum/uplink_item/abstract/announcements/fake_centcom - item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2 - -/datum/uplink_item/abstract/announcements/fake_centcom/New() - ..() - name = "[command_name()] Update Announcement" - desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." - -/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) - command_announcement.Announce(args.["message"], args.["title"]) - return 1 - -/datum/uplink_item/abstract/announcements/fake_crew_arrival - name = "Crew Arrival Announcement/Records" - desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!" - item_cost = 4 - -/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) - if(!user) - return 0 - - var/obj/item/weapon/card/id/I = user.GetIdCard() - var/datum/data/record/random_general_record - var/datum/data/record/random_medical_record - if(data_core.general.len) - random_general_record = pick(data_core.general) - random_medical_record = find_medical_record("id", random_general_record.fields["id"]) - - var/datum/data/record/general = data_core.CreateGeneralRecord(user) - if(I) - general.fields["age"] = I.age - general.fields["rank"] = I.assignment - general.fields["real_rank"] = I.assignment - general.fields["name"] = I.registered_name - general.fields["sex"] = I.sex - else - var/mob/living/carbon/human/H - if(istype(user,/mob/living/carbon/human)) - H = user - general.fields["age"] = H.age - else - general.fields["age"] = initial(H.age) - var/assignment = GetAssignment(user) - general.fields["rank"] = assignment - general.fields["real_rank"] = assignment - general.fields["name"] = user.real_name - general.fields["sex"] = capitalize(user.gender) - - general.fields["species"] = user.get_species() - var/datum/data/record/medical = data_core.CreateMedicalRecord(general.fields["name"], general.fields["id"]) - data_core.CreateSecurityRecord(general.fields["name"], general.fields["id"]) - - if(!random_general_record) - general.fields["citizenship"] = random_general_record.fields["citizenship"] - general.fields["faction"] = random_general_record.fields["faction"] - general.fields["fingerprint"] = random_general_record.fields["fingerprint"] - general.fields["home_system"] = random_general_record.fields["home_system"] - general.fields["religion"] = random_general_record.fields["religion"] - if(random_medical_record) - medical.fields["b_type"] = random_medical_record.fields["b_type"] - medical.fields["b_dna"] = random_medical_record.fields["b_type"] - - if(I) - general.fields["fingerprint"] = I.fingerprint_hash - medical.fields["b_type"] = I.blood_type - medical.fields["b_dna"] = I.dna_hash - - AnnounceArrivalSimple(general.fields["name"], general.fields["rank"]) - return 1 - -/datum/uplink_item/abstract/announcements/fake_ion_storm - name = "Ion Storm Announcement" - desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." - item_cost = 1 - -/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc) - ion_storm_announcement() - return 1 - -/datum/uplink_item/abstract/announcements/fake_radiation - name = "Radiation Storm Announcement" - desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." - item_cost = 3 - -/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc) - var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0) - new/datum/event/radiation_storm/syndicate(EM) - return 1 - - -/**************** -* Support procs * -****************/ -/proc/get_random_uplink_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc) - var/list/bought_items = list() - while(remaining_TC) - var/datum/uplink_item/I = default_uplink_selection.get_random_item(remaining_TC, U, bought_items) - if(!I) - break - bought_items += I - remaining_TC -= I.cost(remaining_TC) - - return bought_items diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm index 70cca95105..00860eb30c 100644 --- a/code/game/objects/items/devices/uplink_random_lists.dm +++ b/code/game/objects/items/devices/uplink_random_lists.dm @@ -27,7 +27,7 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra if(!prob(RI.keep_probability)) continue var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item] - if(I.cost(telecrystals) > telecrystals) + if(I.cost(telecrystals, U) > telecrystals) continue if(bought_items && (I in bought_items) && !prob(RI.reselect_probability)) continue diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 47a2f00b21..f8b21af190 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -51,31 +51,24 @@ new src.foldable(get_turf(src)) qdel(src) -/obj/item/weapon/storage/box/survival/ - New() - ..() - new /obj/item/clothing/mask/breath( src ) - new /obj/item/weapon/tank/emergency_oxygen( src ) +/obj/item/weapon/storage/box/survival/New() + ..() + new /obj/item/clothing/mask/breath(src) + new /obj/item/weapon/tank/emergency_oxygen(src) -/obj/item/weapon/storage/box/engineer/ - New() - ..() - new /obj/item/clothing/mask/breath( src ) - new /obj/item/weapon/tank/emergency_oxygen/engi( src ) +/obj/item/weapon/storage/box/engineer/New() + ..() + new /obj/item/clothing/mask/breath(src) + new /obj/item/weapon/tank/emergency_oxygen/engi(src) /obj/item/weapon/storage/box/gloves name = "box of latex gloves" desc = "Contains white gloves." icon_state = "latex" - New() - ..() - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/gloves/latex(src) +/obj/item/weapon/storage/box/gloves/New() + ..() + for(var/i = 1 to 7) new /obj/item/clothing/gloves/latex(src) /obj/item/weapon/storage/box/masks @@ -83,75 +76,50 @@ desc = "This box contains masks of sterility." icon_state = "sterile" - New() - ..() +/obj/item/weapon/storage/box/masks/New() + ..() + for(var/i = 1 to 7) new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - new /obj/item/clothing/mask/surgical(src) - /obj/item/weapon/storage/box/syringes name = "box of syringes" desc = "A box full of syringes." icon_state = "syringe" - New() - ..() - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) - new /obj/item/weapon/reagent_containers/syringe( src ) +/obj/item/weapon/storage/box/syringes/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/reagent_containers/syringe(src) /obj/item/weapon/storage/box/syringegun name = "box of syringe gun cartridges" desc = "A box full of compressed gas cartridges." icon_state = "syringe" - New() - ..() - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - new /obj/item/weapon/syringe_cartridge( src ) - +/obj/item/weapon/storage/box/syringegun/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/syringe_cartridge(src) /obj/item/weapon/storage/box/beakers name = "box of beakers" icon_state = "beaker" - New() - ..() - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) - new /obj/item/weapon/reagent_containers/glass/beaker( src ) +/obj/item/weapon/storage/box/beakers/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/reagent_containers/glass/beaker(src) /obj/item/weapon/storage/box/injectors name = "box of DNA injectors" desc = "This box contains injectors it seems." - New() - ..() - new /obj/item/weapon/dnainjector/h2m(src) - new /obj/item/weapon/dnainjector/h2m(src) +/obj/item/weapon/storage/box/injectors/New() + ..() + for(var/i = 1 to 3) new /obj/item/weapon/dnainjector/h2m(src) + for(var/i = 1 to 3) new /obj/item/weapon/dnainjector/m2h(src) - new /obj/item/weapon/dnainjector/m2h(src) - new /obj/item/weapon/dnainjector/m2h(src) - /obj/item/weapon/storage/box/blanks name = "box of blank shells" @@ -159,14 +127,9 @@ icon_state = "blankshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) - new /obj/item/ammo_casing/shotgun/blank(src) +/obj/item/weapon/storage/box/blanks/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/blank(src) /obj/item/weapon/storage/box/beanbags @@ -175,14 +138,9 @@ icon_state = "beanshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) - new /obj/item/ammo_casing/shotgun/beanbag(src) +/obj/item/weapon/storage/box/beanbags/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/beanbag(src) /obj/item/weapon/storage/box/shotgunammo @@ -191,14 +149,9 @@ icon_state = "lethalshellshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun(src) - new /obj/item/ammo_casing/shotgun(src) - new /obj/item/ammo_casing/shotgun(src) - new /obj/item/ammo_casing/shotgun(src) - new /obj/item/ammo_casing/shotgun(src) - new /obj/item/ammo_casing/shotgun(src) +/obj/item/weapon/storage/box/shotgunammo/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun(src) /obj/item/weapon/storage/box/shotgunshells @@ -207,14 +160,9 @@ icon_state = "lethalslug_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/pellet(src) - new /obj/item/ammo_casing/shotgun/pellet(src) - new /obj/item/ammo_casing/shotgun/pellet(src) - new /obj/item/ammo_casing/shotgun/pellet(src) - new /obj/item/ammo_casing/shotgun/pellet(src) - new /obj/item/ammo_casing/shotgun/pellet(src) +/obj/item/weapon/storage/box/shotgunshells/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/pellet(src) /obj/item/weapon/storage/box/flashshells @@ -223,14 +171,9 @@ icon_state = "illumshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/flash(src) - new /obj/item/ammo_casing/shotgun/flash(src) - new /obj/item/ammo_casing/shotgun/flash(src) - new /obj/item/ammo_casing/shotgun/flash(src) - new /obj/item/ammo_casing/shotgun/flash(src) - new /obj/item/ammo_casing/shotgun/flash(src) +/obj/item/weapon/storage/box/flashshells/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/flash(src) /obj/item/weapon/storage/box/stunshells @@ -239,14 +182,9 @@ icon_state = "stunshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/stunshell(src) - new /obj/item/ammo_casing/shotgun/stunshell(src) - new /obj/item/ammo_casing/shotgun/stunshell(src) - new /obj/item/ammo_casing/shotgun/stunshell(src) - new /obj/item/ammo_casing/shotgun/stunshell(src) - new /obj/item/ammo_casing/shotgun/stunshell(src) +/obj/item/weapon/storage/box/stunshells/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/stunshell(src) /obj/item/weapon/storage/box/practiceshells @@ -255,28 +193,18 @@ icon_state = "blankshot_box" item_state = "syringe_kit" - New() - ..() - new /obj/item/ammo_casing/shotgun/practice(src) - new /obj/item/ammo_casing/shotgun/practice(src) - new /obj/item/ammo_casing/shotgun/practice(src) - new /obj/item/ammo_casing/shotgun/practice(src) - new /obj/item/ammo_casing/shotgun/practice(src) - new /obj/item/ammo_casing/shotgun/practice(src) +/obj/item/weapon/storage/box/practiceshells/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/shotgun/practice(src) /obj/item/weapon/storage/box/sniperammo name = "box of 14.5mm shells" desc = "It has a picture of a gun and several warning symbols on the front.
    WARNING: Live ammunition. Misuse may result in serious injury or death." - New() - ..() - new /obj/item/ammo_casing/a145(src) - new /obj/item/ammo_casing/a145(src) - new /obj/item/ammo_casing/a145(src) - new /obj/item/ammo_casing/a145(src) - new /obj/item/ammo_casing/a145(src) - new /obj/item/ammo_casing/a145(src) +/obj/item/weapon/storage/box/sniperammo/New() + ..() + for(var/i = 1 to 7) new /obj/item/ammo_casing/a145(src) /obj/item/weapon/storage/box/flashbangs @@ -284,14 +212,9 @@ desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." icon_state = "flashbang" - New() - ..() - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) - new /obj/item/weapon/grenade/flashbang(src) +/obj/item/weapon/storage/box/flashbangs/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/grenade/flashbang(src) /obj/item/weapon/storage/box/emps @@ -299,41 +222,29 @@ desc = "A box containing 5 military grade EMP grenades.
    WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur." icon_state = "emp" - New() - ..() - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) - new /obj/item/weapon/grenade/empgrenade(src) +/obj/item/weapon/storage/box/emps/New() + ..() + for(var/i = 1 to 5) + new /obj/item/weapon/grenade/empgrenade(src) /obj/item/weapon/storage/box/empslite name = "box of low yield emp grenades" desc = "A box containing 5 low yield EMP grenades.
    WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur." icon_state = "emp" - New() - ..() - new /obj/item/weapon/grenade/empgrenade/low_yield(src) - new /obj/item/weapon/grenade/empgrenade/low_yield(src) - new /obj/item/weapon/grenade/empgrenade/low_yield(src) - new /obj/item/weapon/grenade/empgrenade/low_yield(src) +/obj/item/weapon/storage/box/empslite/New() + ..() + for(var/i = 1 to 5) new /obj/item/weapon/grenade/empgrenade/low_yield(src) /obj/item/weapon/storage/box/smokes name = "box of smoke bombs" - desc = "A box containing 5 smoke bombs." + desc = "A box containing 7 smoke bombs." icon_state = "flashbang" - /obj/item/weapon/storage/box/smokes/New() - ..() - new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/grenade/smokebomb(src) - new /obj/item/weapon/grenade/smokebomb(src) + ..() + for(var/i = 1 to 7) new /obj/item/weapon/grenade/smokebomb(src) /obj/item/weapon/storage/box/anti_photons @@ -342,11 +253,8 @@ icon_state = "flashbang" /obj/item/weapon/storage/box/anti_photons/New() - ..() - new /obj/item/weapon/grenade/anti_photon(src) - new /obj/item/weapon/grenade/anti_photon(src) - new /obj/item/weapon/grenade/anti_photon(src) - new /obj/item/weapon/grenade/anti_photon(src) + ..() + for(var/i = 1 to 5) new /obj/item/weapon/grenade/anti_photon(src) /obj/item/weapon/storage/box/frags @@ -354,73 +262,63 @@ desc = "A box containing 5 military grade fragmentation grenades.
    WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use." icon_state = "frag" +/obj/item/weapon/storage/box/frags/New() + ..() + for(var/i = 1 to 5) + new /obj/item/weapon/grenade/explosive(src) - New() - ..() - new /obj/item/weapon/grenade/explosive(src) - new /obj/item/weapon/grenade/explosive(src) - new /obj/item/weapon/grenade/explosive(src) - new /obj/item/weapon/grenade/explosive(src) - new /obj/item/weapon/grenade/explosive(src) +/obj/item/weapon/storage/box/metalfoam + name = "box of metal foam grenades." + desc = "A box containing 7 metal foam grenades." + icon_state = "flashbang" + +/obj/item/weapon/storage/box/metalfoam/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/grenade/chem_grenade/metalfoam /obj/item/weapon/storage/box/trackimp name = "boxed tracking implant kit" desc = "Box full of scum-bag tracking utensils." icon_state = "implant" - New() - ..() +/obj/item/weapon/storage/box/trackimp/New() + ..() + for(var/i = 1 to 4) new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implantcase/tracking(src) - new /obj/item/weapon/implanter(src) - new /obj/item/weapon/implantpad(src) - new /obj/item/weapon/locator(src) + new /obj/item/weapon/implanter(src) + new /obj/item/weapon/implantpad(src) + new /obj/item/weapon/locator(src) /obj/item/weapon/storage/box/chemimp name = "boxed chemical implant kit" desc = "Box of stuff used to implant chemicals." icon_state = "implant" - New() - ..() +/obj/item/weapon/storage/box/chemimp/New() + ..() + for(var/i = 1 to 5) new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implantcase/chem(src) - new /obj/item/weapon/implanter(src) - new /obj/item/weapon/implantpad(src) - - + new /obj/item/weapon/implanter(src) + new /obj/item/weapon/implantpad(src) /obj/item/weapon/storage/box/rxglasses name = "box of prescription glasses" desc = "This box contains nerd glasses." icon_state = "glasses" - New() - ..() - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) - new /obj/item/clothing/glasses/regular(src) +/obj/item/weapon/storage/box/rxglasses/New() + ..() + for(var/i = 1 to 7) new /obj/item/clothing/glasses/regular(src) /obj/item/weapon/storage/box/drinkingglasses name = "box of drinking glasses" desc = "It has a picture of drinking glasses on it." - New() - ..() - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) - new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) +/obj/item/weapon/storage/box/drinkingglasses/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src) /obj/item/weapon/storage/box/cdeathalarm_kit @@ -429,57 +327,38 @@ icon_state = "implant" item_state = "syringe_kit" - New() - ..() - new /obj/item/weapon/implanter(src) - new /obj/item/weapon/implantcase/death_alarm(src) - new /obj/item/weapon/implantcase/death_alarm(src) - new /obj/item/weapon/implantcase/death_alarm(src) - new /obj/item/weapon/implantcase/death_alarm(src) - new /obj/item/weapon/implantcase/death_alarm(src) +/obj/item/weapon/storage/box/cdeathalarm_kit/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/implantcase/death_alarm(src) + new /obj/item/weapon/implanter(src) /obj/item/weapon/storage/box/condimentbottles name = "box of condiment bottles" desc = "It has a large ketchup smear on it." - New() - ..() +/obj/item/weapon/storage/box/condimentbottles/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - new /obj/item/weapon/reagent_containers/food/condiment(src) - - /obj/item/weapon/storage/box/cups name = "box of paper cups" desc = "It has pictures of paper cups on the front." - New() - ..() - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src ) +/obj/item/weapon/storage/box/cups/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src) /obj/item/weapon/storage/box/donkpockets name = "box of donk-pockets" desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes." icon_state = "donk_kit" - New() - ..() - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) +/obj/item/weapon/storage/box/donkpockets/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src) /obj/item/weapon/storage/box/sinpockets @@ -487,13 +366,9 @@ desc = "Instructions: Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes." icon_state = "donk_kit" - New() - ..() - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) - new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) +/obj/item/weapon/storage/box/sinpockets/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src) /obj/item/weapon/storage/box/monkeycubes @@ -502,112 +377,88 @@ icon = 'icons/obj/food.dmi' icon_state = "monkeycubebox" can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube) - New() - ..() - if(src.type == /obj/item/weapon/storage/box/monkeycubes) - for(var/i = 1 to 5) - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src) + +/obj/item/weapon/storage/box/monkeycubes/New() + ..() + if(src.type == /obj/item/weapon/storage/box/monkeycubes) + for(var/i = 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src) /obj/item/weapon/storage/box/monkeycubes/farwacubes name = "farwa cube box" desc = "Drymate brand farwa cubes, shipped from Ahdomai. Just add water!" - New() - ..() - for(var/i = 1 to 5) - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src) + +/obj/item/weapon/storage/box/monkeycubes/farwacubes/New() + ..() + for(var/i = 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src) /obj/item/weapon/storage/box/monkeycubes/stokcubes name = "stok cube box" desc = "Drymate brand stok cubes, shipped from Moghes. Just add water!" - New() - ..() - for(var/i = 1 to 5) - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src) + +/obj/item/weapon/storage/box/monkeycubes/stokcubes/New() + ..() + for(var/i = 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src) /obj/item/weapon/storage/box/monkeycubes/neaeracubes name = "neaera cube box" desc = "Drymate brand neaera cubes, shipped from Jargon 4. Just add water!" - New() - ..() - for(var/i = 1 to 5) - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src) + +/obj/item/weapon/storage/box/monkeycubes/neaeracubes/New() + ..() + for(var/i = 1 to 4) + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src) /obj/item/weapon/storage/box/ids name = "box of spare IDs" desc = "Has so many empty IDs." icon_state = "id" - New() - ..() +/obj/item/weapon/storage/box/ids/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - new /obj/item/weapon/card/id(src) - /obj/item/weapon/storage/box/seccarts name = "box of spare R.O.B.U.S.T. Cartridges" desc = "A box full of R.O.B.U.S.T. Cartridges, used by Security." icon_state = "pda" - New() - ..() +/obj/item/weapon/storage/box/seccarts/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - new /obj/item/weapon/cartridge/security(src) - /obj/item/weapon/storage/box/handcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." icon_state = "handcuff" - New() - ..() +/obj/item/weapon/storage/box/handcuffs/New() + ..() + for(var/i = 1 to 7) new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - new /obj/item/weapon/handcuffs(src) - /obj/item/weapon/storage/box/mousetraps name = "box of Pest-B-Gon mousetraps" desc = "WARNING: Keep out of reach of children." icon_state = "mousetraps" - New() - ..() - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) - new /obj/item/device/assembly/mousetrap( src ) +/obj/item/weapon/storage/box/mousetraps/New() + ..() + for(var/i = 1 to 7) + new /obj/item/device/assembly/mousetrap(src) /obj/item/weapon/storage/box/pillbottles name = "box of pill bottles" desc = "It has pictures of pill bottles on its front." - New() - ..() - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - new /obj/item/weapon/storage/pill_bottle( src ) - +/obj/item/weapon/storage/box/pillbottles/New() + ..() + for(var/i = 1 to 7) + new /obj/item/weapon/storage/pill_bottle(src) /obj/item/weapon/storage/box/snappops name = "snap pop box" @@ -615,10 +466,11 @@ icon = 'icons/obj/toy.dmi' icon_state = "spbox" can_hold = list(/obj/item/toy/snappop) - New() - ..() - for(var/i = 1 to 8) - new /obj/item/toy/snappop(src) + +/obj/item/weapon/storage/box/snappops/New() + ..() + for(var/i = 1 to 8) + new /obj/item/toy/snappop(src) /obj/item/weapon/storage/box/matches name = "matchbox" @@ -630,28 +482,29 @@ slot_flags = SLOT_BELT can_hold = list(/obj/item/weapon/flame/match) - New() - ..() - for(var/i=1 to 10) - new /obj/item/weapon/flame/match(src) +/obj/item/weapon/storage/box/matches/New() + ..() + for(var/i=1 to 10) + new /obj/item/weapon/flame/match(src) - attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) - if(istype(W) && !W.lit && !W.burnt) - W.lit = 1 - W.damtype = "burn" - W.icon_state = "match_lit" - processing_objects.Add(W) - W.update_icon() - return +/obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob) + if(istype(W) && !W.lit && !W.burnt) + W.lit = 1 + W.damtype = "burn" + W.icon_state = "match_lit" + processing_objects.Add(W) + W.update_icon() + return /obj/item/weapon/storage/box/autoinjectors name = "box of injectors" desc = "Contains autoinjectors." icon_state = "syringe" - New() - ..() - for (var/i = 1 to 7) - new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) + +/obj/item/weapon/storage/box/autoinjectors/New() + ..() + for (var/i = 1 to 7) + new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src) /obj/item/weapon/storage/box/lights name = "box of replacement bulbs" @@ -666,7 +519,7 @@ /obj/item/weapon/storage/box/lights/bulbs/New() ..() - for(var/i = 0; i < 21; i++) + for(var/i = 1 to 24) new /obj/item/weapon/light/bulb(src) /obj/item/weapon/storage/box/lights/tubes @@ -675,7 +528,7 @@ /obj/item/weapon/storage/box/lights/tubes/New() ..() - for(var/i = 0; i < 21; i++) + for(var/i = 1 to 24) new /obj/item/weapon/light/tube(src) /obj/item/weapon/storage/box/lights/mixed @@ -684,9 +537,9 @@ /obj/item/weapon/storage/box/lights/mixed/New() ..() - for(var/i = 0; i < 14; i++) + for(var/i = 1 to 16) new /obj/item/weapon/light/tube(src) - for(var/i = 0; i < 7; i++) + for(var/i = 1 to 8) new /obj/item/weapon/light/bulb(src) /obj/item/weapon/storage/box/freezer @@ -701,3 +554,20 @@ max_storage_space = 21 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try +/obj/item/weapon/storage/box/ambrosia + name = "ambrosia seeds box" + desc = "Contains the seeds you need to get a little high." + +/obj/item/weapon/storage/box/ambrosia/New() + ..() + for(var/i = 1 to 7) + new /obj/item/seeds/ambrosiavulgarisseed(src) + +/obj/item/weapon/storage/box/ambrosiadeus + name = "ambrosia deus seeds box" + desc = "Contains the seeds you need to get a proper healthy high." + +/obj/item/weapon/storage/box/ambrosiadeus/New() + ..() + for(var/i = 1 to 7) + new /obj/item/seeds/ambrosiadeusseed(src) \ No newline at end of file diff --git a/html/changelogs/yoshax - uplinkchanges.yml b/html/changelogs/yoshax - uplinkchanges.yml new file mode 100644 index 0000000000..6ad0968665 --- /dev/null +++ b/html/changelogs/yoshax - uplinkchanges.yml @@ -0,0 +1,39 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Yoshax + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Uplinks now have a discounted item every 15 minutes. This is per uplink, and random, the discount is also random, but weighted as such that a low discount such as 10% off, or 20% off has a higher chance of happening than a high discount such as 90% of. An item will never cost less than 1." + - tweak: "Mercenaries now spawn with their own, personal uplinks." + - bugfix: "Faked announcements are now once again purchasable from the uplink, and actually work." + - rscadd: "Adds several new items to the uplink including tactical knives, metal foam grenades, ambrosia seeds and much more." \ No newline at end of file diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl index a92fe95c6e..ed799677bc 100644 --- a/nano/templates/uplink.tmpl +++ b/nano/templates/uplink.tmpl @@ -29,6 +29,17 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{if data.menu == 0}} + {{if data.discount_amount < 100}} +
+
+ Currently discounted: +
+
+ {{:data.discount_name}} - {{:data.discount_amount}}% off. Offer will expire at: {{:data.offer_expiry}} +
+
+ {{/if}} +

Categories:

{{for data.categories}}
@@ -43,12 +54,9 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{:helper.link(value.name, 'gear', {'buy_item' : value.ref}, value.can_buy ? null : 'disabled')}} - {{:value.cost}}
- - {{if value.can_buy}} -
- {{:value.description}} -
- {{/if}} +
+ {{:value.description}} +
{{/for}} {{else data.menu == 2}}

Information Record List:

diff --git a/polaris.dme b/polaris.dme index fa49981699..1ab16549c5 100644 --- a/polaris.dme +++ b/polaris.dme @@ -186,6 +186,20 @@ #include "code\datums\repositories\cameras.dm" #include "code\datums\repositories\crew.dm" #include "code\datums\repositories\repository.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\armor.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\stealth_items.dm" +#include "code\datums\uplink\stealthy_weapons.dm" +#include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" +#include "code\datums\uplink\visible_weapons.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" @@ -632,8 +646,6 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_categories.dm" -#include "code\game\objects\items\devices\uplink_items.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" #include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm" From 48ab0fbc578d3a078cdf8a48e39fc751671388a2 Mon Sep 17 00:00:00 2001 From: ParadoxSpace Date: Sun, 15 May 2016 16:32:31 -0600 Subject: [PATCH 11/20] Gives Cult Cultist Language (Again) (#1651) * Spooky Speak 2.0 --- code/__defines/species_languages.dm | 1 + code/game/antagonist/station/cultist.dm | 7 +++++++ code/modules/mob/language/outsider.dm | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 27fc17055c..143c7aa251 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -31,6 +31,7 @@ #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" #define LANGUAGE_SCHECHI "Schechi" +#define LANGUAGE_CULT "Cult" // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index aba2115d15..6bb049dcb0 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -110,6 +110,13 @@ var/datum/antagonist/cultist/cult . = ..() if(.) player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back." + if(player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.add_language(LANGUAGE_CULT) + +/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + . = ..() + if(. && player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.remove_language(LANGUAGE_CULT) /datum/antagonist/cultist/can_become_antag(var/datum/mind/player) if(!..()) diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 562c578986..d427dcbfb6 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -38,7 +38,7 @@ ..(speaker,message,speaker_mask) /datum/language/cultcommon - name = "Cult" + name = LANGUAGE_CULT desc = "The chants of the occult, the incomprehensible." speech_verb = "intones" ask_verb = "intones" @@ -52,8 +52,8 @@ "mah'weyh", "pleggh", "at", "e'ntrath", "tok-lyr", "rqa'nap", "g'lt-ulotf", "ta'gh", "fara'qha", "fel", "d'amar det", \ "yu'gular", "faras", "desdae", "havas", "mithum", "javara", "umathar", "uf'kal", "thenar", "rash'tla", \ "sektath", "mal'zua", "zasan", "therium", "viortia", "kla'atu", "barada", "nikt'o", "fwe'sh", "mah", "erl", "nyag", "r'ya", \ - "gal'h'rfikk", "harfrandid", "mud'gib", "fuu", "ma'jin", "dedo", "ol'btoh", "n'ath", "reth", "sh'yro", "eth", \ - "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis") + "gal'h'rfikk", "harfrandid", "mud'gib", "il", "fuu", "ma'jin", "dedo", "ol'btoh", "n'ath", "reth", "sh'yro", "eth", \ + "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis", "spiri", "malum") /datum/language/cult name = "Occult" From be6ab03d13065013deae8e25bd8f6d2becdb9de1 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 16 May 2016 01:12:01 +0100 Subject: [PATCH 12/20] Fixes a problem with discount never being displayed correctly on uplinks --- code/game/objects/items/devices/uplink.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index 5462868256..571b0462df 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -31,13 +31,6 @@ processing_objects -= src return ..() -/obj/item/device/uplink/process() - if(world.time > next_offer_time) - discount_item = default_uplink_selection.get_random_item(INFINITY) - discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) - next_offer_time = world.time + offer_time - nanomanager.update_uis(src) - /obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost) return (discount_item && (item_type == discount_item)) ? max(1, round(item_cost*discount_amount)) : item_cost @@ -60,7 +53,6 @@ var/datum/uplink_category/category = 0 // The current category we are in var/exploit_id // Id of the current exploit record we are viewing - // The hidden uplink MUST be inside an obj/item's contents. /obj/item/device/uplink/hidden/New() spawn(2) @@ -70,6 +62,14 @@ nanoui_data = list() update_nano_data() +/obj/item/device/uplink/hidden/process() + if(world.time > next_offer_time) + discount_item = default_uplink_selection.get_random_item(INFINITY) + discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1) + next_offer_time = world.time + offer_time + update_nano_data() + nanomanager.update_uis(src) + // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() active = !active @@ -154,7 +154,7 @@ nanoui_data["categories"] = categories nanoui_data["discount_name"] = discount_item ? discount_item.name : "" nanoui_data["discount_amount"] = (1-discount_amount)*100 - nanoui_data["offer_expiry"] = worldtime2text(next_offer_time - world.time) + nanoui_data["offer_expiry"] = worldtime2text(next_offer_time) else if(nanoui_menu == 1) var/items[0] for(var/datum/uplink_item/item in category.items) From 6549358c31210c71fd30c06cf828f998f95fc341 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 16 May 2016 01:17:29 +0100 Subject: [PATCH 13/20] Updates changelog --- html/changelog.html | 9 +++++ html/changelogs/.all_changelog.yml | 11 ++++++ html/changelogs/yoshax - uplinkchanges.yml | 39 ---------------------- 3 files changed, 20 insertions(+), 39 deletions(-) delete mode 100644 html/changelogs/yoshax - uplinkchanges.yml diff --git a/html/changelog.html b/html/changelog.html index 07fb9c343c..f164041dd8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,15 @@ -->
+

16 May 2016

+

Yoshax updated:

+
    +
  • Uplinks now have a discounted item every 15 minutes. This is per uplink, and random, the discount is also random, but weighted as such that a low discount such as 10% off, or 20% off has a higher chance of happening than a high discount such as 90% of. An item will never cost less than 1.
  • +
  • Mercenaries now spawn with their own, personal uplinks.
  • +
  • Faked announcements are now once again purchasable from the uplink, and actually work.
  • +
  • Adds several new items to the uplink including tactical knives, metal foam grenades, ambrosia seeds and much more.
  • +
+

13 May 2016

HarpyEagle updated: