From 6259abd7daf2d9c0cfa0dfa5d226a87e3ec95314 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 17 Aug 2020 00:43:40 +0000 Subject: [PATCH 01/28] Automatic changelog compile [ci skip] --- html/changelog.html | 31 +++++++++++----------- html/changelogs/.all_changelog.yml | 13 +++++++++ html/changelogs/AutoChangeLog-pr-12739.yml | 12 --------- html/changelogs/AutoChangeLog-pr-13177.yml | 4 --- 4 files changed, 28 insertions(+), 32 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12739.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13177.yml diff --git a/html/changelog.html b/html/changelog.html index 261c23fc60..2159cfd50c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,21 @@ -->
+

17 August 2020

+

DeltaFire15 updated:

+ +

Strazyplus updated:

+ +

16 August 2020

kiwedespars updated:

- -

15 June 2020

-

Anturk, kevinz000 updated:

- -

kevinz000 updated:

- -

kevinz000 (port from VOREStation) updated:

-
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d984c0c092..1efccd666e 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26931,3 +26931,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. zeroisthebiggay: - rscadd: tips - rscdel: tips +2020-08-17: + DeltaFire15: + - bugfix: Cogscarabs are no longer always Pogscarabs + Strazyplus: + - rscadd: Added drakeborgs + - rscadd: Added drakeplushies + - imageadd: added drakeborg sprites + - imageadd: added drakeplushie sprites + - code_imp: changed some code - added drakeplushies to backpack loadout Removed + duplicate voresleeper belly sprites from engdrake & jantidrake. [CC BY-NC-SA + 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/) + - rscadd: Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg moved drakeborg.dmi + to icon/mob/cyborg diff --git a/html/changelogs/AutoChangeLog-pr-12739.yml b/html/changelogs/AutoChangeLog-pr-12739.yml deleted file mode 100644 index 324309ddc6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12739.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "Strazyplus" -delete-after: True -changes: - - rscadd: "Added drakeborgs" - - rscadd: "Added drakeplushies" - - imageadd: "added drakeborg sprites" - - imageadd: "added drakeplushie sprites" - - code_imp: "changed some code - added drakeplushies to backpack loadout -Removed duplicate voresleeper belly sprites from engdrake & jantidrake. -[CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/)" - - rscadd: "Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg -moved drakeborg.dmi to icon/mob/cyborg" diff --git a/html/changelogs/AutoChangeLog-pr-13177.yml b/html/changelogs/AutoChangeLog-pr-13177.yml deleted file mode 100644 index e55e4973e9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13177.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "Cogscarabs are no longer always Pogscarabs" From bf361337a525784d7e35790ca42c9cdd65112f16 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 18 Aug 2020 00:42:53 +0000 Subject: [PATCH 02/28] Automatic changelog compile [ci skip] --- html/changelog.html | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 2159cfd50c..45e1cb502c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1380,28 +1380,6 @@ - -

16 June 2020

-

Ghommie updated:

- -

Trilbyspaceclone updated:

- -

kevinz000 updated:

- -

timothyteakettle updated:

- GoonStation 13 Development Team From e88b244a16824fdfd61b893bd8dd5a769fdfbf55 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 19 Aug 2020 00:43:13 +0000 Subject: [PATCH 03/28] Automatic changelog compile [ci skip] --- html/changelog.html | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 45e1cb502c..10486f510a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1369,17 +1369,6 @@
  • medbots can now be tipped over
  • added more medbot sounds
  • - -

    17 June 2020

    -

    SmArtKar updated:

    -
      -
    • New ID icons
    • -
    • Sutures and Meshes
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • Gin export takes gin now
    • -
    GoonStation 13 Development Team From 7ec14370e2d90c232e5d77908cbaabc21a5abf93 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 20 Aug 2020 00:43:05 +0000 Subject: [PATCH 04/28] Automatic changelog compile [ci skip] --- html/changelog.html | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 10486f510a..d747335411 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1351,24 +1351,6 @@
  • Adds the stray cargo pod event, where a cargo pod crashes into the station.
  • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
  • - -

    18 June 2020

    -

    Detective-Google updated:

    -
      -
    • cog is now less the suck
    • -
    • couple little derpy bits
    • -
    • malf disk and illegal tech disk moved from ashwalker base (guaranteed) to tendrils (chance based)
    • -
    -

    SmArtKar updated:

    -
      -
    • Ported shuttles from beestation
    • -
    -

    timothyteakettle updated:

    -
      -
    • embeds got reworked, sticky tape was added, more bullets that ricochet also added
    • -
    • medbots can now be tipped over
    • -
    • added more medbot sounds
    • -
    GoonStation 13 Development Team From bb1d191647d65143e4651b4df2795a2fd620f7a1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 21 Aug 2020 00:44:26 +0000 Subject: [PATCH 05/28] Automatic changelog compile [ci skip] --- html/changelog.html | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d747335411..2c1266a37e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1321,36 +1321,6 @@
    • Removed unsavory things from the vent clog event
    - -

    19 June 2020

    -

    Bhijn updated:

    -
      -
    • Atmos can no longer become completely bricked
    • -
    -

    Funce updated:

    -
      -
    • Square root circuit should now actually work.
    • -
    -

    SmArtKar updated:

    -
      -
    • Fixed my runtimes
    • -
    -

    TheSpaghetti updated:

    -
      -
    • more insectoid insects
    • -
    -

    kevinz000 updated:

    -
      -
    • bay/polaris style say_emphasis has been added. You can now |italicize| _underline_ and +bold+ your messages.
    • -
    -

    timothyteakettle updated:

    -
      -
    • Adds the brain trauma event, where one player gets a random brain trauma!
    • -
    • Adds the wisdom cow event, where the wisdom cow appears on the station!
    • -
    • Adds the fake virus event, where people get fake virus symptoms.
    • -
    • Adds the stray cargo pod event, where a cargo pod crashes into the station.
    • -
    • Adds the fugitives event, where fugitives are loose on the station, and it's the hunters jobs to capture them.
    • -
    GoonStation 13 Development Team From 376c38ec7e81f9def19e8185c5f17c41e3a88d9a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 22 Aug 2020 00:44:08 +0000 Subject: [PATCH 06/28] Automatic changelog compile [ci skip] --- html/changelog.html | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 2c1266a37e..4f0689d846 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1309,18 +1309,6 @@
    • calculations for punch hit chance has been drastically buffed in favor of the attacker.
    - -

    20 June 2020

    -

    LetterN updated:

    -
      -
    • Asset cache from tg
    • -
    • Made the map viewer not look bad
    • -
    • Admin matrix right-bracket
    • -
    -

    bunny232 updated:

    -
      -
    • Removed unsavory things from the vent clog event
    • -
    GoonStation 13 Development Team From 00984a08f007f108b67237439aed42970166c655 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 23 Aug 2020 00:45:43 +0000 Subject: [PATCH 07/28] Automatic changelog compile [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 4f0689d846..199e36277f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1303,12 +1303,6 @@
    • Adds IV bags.
    - -

    21 June 2020

    -

    kevinz000 updated:

    -
      -
    • calculations for punch hit chance has been drastically buffed in favor of the attacker.
    • -
    GoonStation 13 Development Team From 2bee3dd72e8eeeb3341d344d3b4d119e9ab1b237 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 24 Aug 2020 00:45:35 +0000 Subject: [PATCH 08/28] Automatic changelog compile [ci skip] --- html/changelog.html | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 199e36277f..4068dacf38 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1284,25 +1284,6 @@
  • bonfires/grills no longer produce infinite quantities of food
  • slime's alter form ability now updates their hair colour when changing their body colour
  • - -

    22 June 2020

    -

    Ghommie (porting PRs by zxaber, Ryll-Ryll, AnturK) updated:

    -
      -
    • Certain small items purchased through cargo now get grouped into a single box. They also are immune to the 10% private account fee.
    • -
    • Added single-order options for several existing products in the Cargo Catalog.
    • -
    • Medkit listings are now single-pack items, and considered small items that get grouped into single boxes. Price for medkits is as close to unchanged as is reasonable.
    • -
    • You can now beat on vending machines to try and knock loose free stuff! You can also almost kill yourself doing it, so it's your call if your life is worth ten bucks.
    • -
    • Cigarette packets now have coupons on the back for small cargo items! Smoking DOES pay!
    • -
    • Some single/small items in cargo have been rebranded as goodies, come in lockboxes rather than crates, and can only be purchased with private accounts.
    • -
    -

    kevinz000 updated:

    -
      -
    • Life() is split into BiologicalLife() and PhysicalLife. A component signal has been added that can prevent either from ticking.
    • -
    -

    shellspeed1 updated:

    -
      -
    • Adds IV bags.
    • -
    GoonStation 13 Development Team From cd7293a9a247e1bc0d1d5ff5ee3bbf7ba9373363 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 24 Aug 2020 03:19:36 +0100 Subject: [PATCH 09/28] limbs --- code/__DEFINES/loadout.dm | 13 ++++ code/controllers/subsystem/ticker.dm | 1 + code/datums/traits/negative.dm | 65 +++++-------------- code/game/objects/items/miscellaneous.dm | 1 - code/modules/client/preferences.dm | 63 +++++++++++++++++- code/modules/client/preferences_savefile.dm | 2 + .../modules/mob/dead/new_player/new_player.dm | 2 + 7 files changed, 96 insertions(+), 51 deletions(-) diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 94059c0880..767894050d 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -54,3 +54,16 @@ //donator items #define LOADOUT_CATEGORY_DONATOR "Donator" + +//how many prosthetics can we have +#define MAXIMUM_LOADOUT_PROSTHETICS 2 + +//what limbs can be amputated or be prosthetic +#define LOADOUT_ALLOWED_LIMB_TARGETS list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) + +//options for modifiying limbs +#define LOADOUT_LIMB_NORMAL "Normal" +#define LOADOUT_LIMB_PROSTHETIC "Prosthetic" +#define LOADOUT_LIMB_AMPUTATED "Amputated" + +#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though \ No newline at end of file diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 0bc4e6665a..9af86653f4 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -396,6 +396,7 @@ SUBSYSTEM_DEF(ticker) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N) + N.client.prefs.post_copy_to(player) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 68b5d6f987..a1ff38862b 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -211,24 +211,27 @@ GLOBAL_LIST_EMPTY(family_heirlooms) H.gain_trauma(T, TRAUMA_RESILIENCE_ABSOLUTE) /datum/quirk/paraplegic/on_spawn() - if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. - quirk_holder.buckled.unbuckle_mob(quirk_holder) + if(quirk_holder.client) + modified_limbs = quirk_holder.client.prefs.modified_limbs + if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character)) + if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. + quirk_holder.buckled.unbuckle_mob(quirk_holder) - var/turf/T = get_turf(quirk_holder) - var/obj/structure/chair/spawn_chair = locate() in T + var/turf/T = get_turf(quirk_holder) + var/obj/structure/chair/spawn_chair = locate() in T - var/obj/vehicle/ridden/wheelchair/wheels = new(T) - if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking - wheels.setDir(spawn_chair.dir) + var/obj/vehicle/ridden/wheelchair/wheels = new(T) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) - wheels.buckle_mob(quirk_holder) + wheels.buckle_mob(quirk_holder) - // During the spawning process, they may have dropped what they were holding, due to the paralysis - // So put the things back in their hands. + // During the spawning process, they may have dropped what they were holding, due to the paralysis + // So put the things back in their hands. - for(var/obj/item/I in T) - if(I.fingerprintslast == quirk_holder.ckey) - quirk_holder.put_in_hands(I) + for(var/obj/item/I in T) + if(I.fingerprintslast == quirk_holder.ckey) + quirk_holder.put_in_hands(I) /datum/quirk/poor_aim name = "Poor Aim" @@ -244,42 +247,6 @@ GLOBAL_LIST_EMPTY(family_heirlooms) mob_trait = TRAIT_PROSOPAGNOSIA medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." -/datum/quirk/prosthetic_limb - name = "Prosthetic Limb" - desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" - value = -1 - var/slot_string = "limb" - -/datum/quirk/prosthetic_limb/on_spawn() - var/mob/living/carbon/human/H = quirk_holder - var/limb_slot - if(HAS_TRAIT(H, TRAIT_PARA))//Prevent paraplegic legs being replaced - limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - else - limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/obj/item/bodypart/old_part = H.get_bodypart(limb_slot) - var/obj/item/bodypart/prosthetic - switch(limb_slot) - if(BODY_ZONE_L_ARM) - prosthetic = new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder) - slot_string = "left arm" - if(BODY_ZONE_R_ARM) - prosthetic = new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder) - slot_string = "right arm" - if(BODY_ZONE_L_LEG) - prosthetic = new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder) - slot_string = "left leg" - if(BODY_ZONE_R_LEG) - prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder) - slot_string = "right leg" - prosthetic.replace_limb(H) - qdel(old_part) - H.regenerate_icons() - -/datum/quirk/prosthetic_limb/post_add() - to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ - you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") - /datum/quirk/insanity name = "Reality Dissociation Syndrome" desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. This is not a license to grief." diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 6f1aec287b..ac2206863a 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -272,4 +272,3 @@ icon_state = "skub" w_class = WEIGHT_CLASS_BULKY attack_verb = list("skubbed") - diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 778b5175a7..380e5c5412 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -163,6 +163,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) ) var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races + var/modified_limbs = list() /// Security record note section var/security_records @@ -425,12 +426,16 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Gender:[gender == MALE ? "Male" : (gender == FEMALE ? "Female" : (gender == PLURAL ? "Non-binary" : "Object"))]
    " if(gender != NEUTER && pref_species.sexes) dat += "Body Model:[features["body_model"] == MALE ? "Masculine" : "Feminine"]
    " + dat += "Limb Modification:
    " + dat += "Modify Limbs
    " + for(var/modification in modified_limbs) + dat += "[modification]: [modified_limbs[modification]]
    " + dat += "
    " dat += "Species:[pref_species.name]
    " dat += "Custom Species Name:[custom_species ? custom_species : "None"]
    " dat += "Random Body:Randomize!
    " dat += "Always Random Body:[be_random_body ? "Yes" : "No"]
    " dat += "
    Cycle background:[bgstate]
    " - var/use_skintones = pref_species.use_skintones if(use_skintones) dat += APPEARANCE_CATEGORY_COLUMN @@ -1223,6 +1228,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) for(var/V in all_quirks) var/datum/quirk/T = SSquirks.quirks[V] bal -= initial(T.value) + for(var/modification in modified_limbs) + if(modified_limbs[modification] == "Prosthetic") + return bal + 1 //max 1 point regardless of how many prosthetics return bal /datum/preferences/proc/GetPositiveQuirkCount() @@ -1475,6 +1483,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("cycle_bg") bgstate = next_list_item(bgstate, bgstate_options) + if("modify_limbs") + var/limb_type = input(user, "Choose the limb to modify:", "Character Preference") as null|anything in LOADOUT_ALLOWED_LIMB_TARGETS + if(limb_type) + var/modification_type = input(user, "Choose the modification to the limb:", "Character Preference") as null|anything in LOADOUT_LIMBS + if(modification_type) + if(modification_type == LOADOUT_LIMB_PROSTHETIC) + var/number_of_prosthetics = 0 + for(var/modification in modified_limbs) + if(modified_limbs[modification] == LOADOUT_LIMB_PROSTHETIC) + number_of_prosthetics += 1 + if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS) + to_chat(user, "You can only have up to two prosthetic limbs!") + return + else + if(modification_type == LOADOUT_LIMB_NORMAL) + modified_limbs -= limb_type + ShowChoices(user) + return 1 + modified_limbs[limb_type] = modification_type + if("underwear") var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list if(new_underwear) @@ -2544,6 +2572,27 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(custom_speech_verb != "default") character.dna.species.say_mod = custom_speech_verb + //limb stuff + character.regenerate_limbs() //possible optimisation: check for changes before regenerating? + for(var/modified_limb in modified_limbs) + var/modification = modified_limbs[modified_limb] + var/obj/item/bodypart/old_part = character.get_bodypart(modified_limb) + if(modification == LOADOUT_LIMB_PROSTHETIC) + var/obj/item/bodypart/new_limb + switch(modified_limb) + if(BODY_ZONE_L_ARM) + new_limb = new/obj/item/bodypart/l_arm/robot/surplus(character) + if(BODY_ZONE_R_ARM) + new_limb = new/obj/item/bodypart/r_arm/robot/surplus(character) + if(BODY_ZONE_L_LEG) + new_limb = new/obj/item/bodypart/l_leg/robot/surplus(character) + if(BODY_ZONE_R_LEG) + new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character) + new_limb.replace_limb(character) + qdel(old_part) + + if(length(modified_limbs)) + character.regenerate_icons() SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) @@ -2552,6 +2601,18 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.update_body() character.update_hair() +/datum/preferences/proc/post_copy_to(mob/living/carbon/human/character) + //if no legs, and not a paraplegic or a slime, give them a free wheelchair + if(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character)) + if(character.buckled) + character.buckled.unbuckle_mob(character) + var/turf/T = get_turf(character) + var/obj/structure/chair/spawn_chair = locate() in T + var/obj/vehicle/ridden/wheelchair/wheels = new(T) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) + wheels.buckle_mob(character) + /datum/preferences/proc/get_default_name(name_id) switch(name_id) if("human") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a8183e4940..ecf11f180b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,6 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] + S["modified_limbs"] >> modified_limbs //Custom names @@ -870,6 +871,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars3"] , scars_list["3"]) WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) + WRITE_FILE(S["modified_limbs"] , modified_limbs) //gear loadout if(chosen_gear.len) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 768c4c943e..7cbdd3afb6 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -414,6 +414,8 @@ give_magic(humanc) if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) + if(humanc.client) + humanc.client.prefs.post_copy_to(humanc) GLOB.joined_player_list += character.ckey GLOB.latejoiners += character From 237a3fc68235ff41e7eadb44691b652183cec1dd Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 24 Aug 2020 03:22:42 +0100 Subject: [PATCH 10/28] fuck --- code/datums/traits/negative.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index a1ff38862b..5edbf32002 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -212,8 +212,8 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/paraplegic/on_spawn() if(quirk_holder.client) - modified_limbs = quirk_holder.client.prefs.modified_limbs - if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character)) + var/modified_limbs = quirk_holder.client.prefs.modified_limbs + if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character))) if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) From ffcceb687f32878310feb14d9f6695754a592e21 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 24 Aug 2020 03:23:45 +0100 Subject: [PATCH 11/28] fuck2 --- code/datums/traits/negative.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 5edbf32002..322fba0a33 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -213,7 +213,7 @@ GLOBAL_LIST_EMPTY(family_heirlooms) /datum/quirk/paraplegic/on_spawn() if(quirk_holder.client) var/modified_limbs = quirk_holder.client.prefs.modified_limbs - if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !character.has_quirk(/datum/quirk/paraplegic) && !isjellyperson(character))) + if(!(modified_limbs[BODY_ZONE_L_LEG] == LOADOUT_LIMB_AMPUTATED && modified_limbs[BODY_ZONE_R_LEG] == LOADOUT_LIMB_AMPUTATED && !isjellyperson(quirk_holder))) if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. quirk_holder.buckled.unbuckle_mob(quirk_holder) From 79fa9277a31d29ee5c7f3ad9911dae6279dce115 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 25 Aug 2020 15:23:11 +0100 Subject: [PATCH 12/28] yes --- code/modules/jobs/job_types/_job.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 1238b37919..d43a7acdd5 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -80,6 +80,8 @@ if(mind_traits) for(var/t in mind_traits) ADD_TRAIT(H.mind, t, JOB_TRAIT) + if(/datum/quirk/paraplegic in blacklisted_quirks) + H.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection /datum/job/proc/announce(mob/living/carbon/human/H) if(head_announce) From 2fa40f588e12dd5531fceda63e2f48582d8680dd Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 25 Aug 2020 15:26:03 +0100 Subject: [PATCH 13/28] let them stand --- code/modules/jobs/job_types/_job.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index d43a7acdd5..0ffe77fce5 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -82,6 +82,7 @@ ADD_TRAIT(H.mind, t, JOB_TRAIT) if(/datum/quirk/paraplegic in blacklisted_quirks) H.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection + set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs /datum/job/proc/announce(mob/living/carbon/human/H) if(head_announce) From 5a33c049a7b7b11b36a22ce5df16f91d567e3f7a Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 25 Aug 2020 16:59:26 +0100 Subject: [PATCH 14/28] wops --- code/modules/jobs/job_types/_job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 0ffe77fce5..0feceaf1a8 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -82,7 +82,7 @@ ADD_TRAIT(H.mind, t, JOB_TRAIT) if(/datum/quirk/paraplegic in blacklisted_quirks) H.regenerate_limbs() //if you can't be a paraplegic, attempt to regenerate limbs to stop amputated limb selection - set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs + H.set_resting(FALSE, TRUE) //they probably shouldn't be on the floor because they had no legs then suddenly had legs /datum/job/proc/announce(mob/living/carbon/human/H) if(head_announce) From 73bffe5ee4a04498b9c25f4f20ee371f0993f618 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 26 Aug 2020 00:44:33 +0000 Subject: [PATCH 15/28] Automatic changelog compile [ci skip] --- html/changelog.html | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 4068dacf38..5eb42c6b75 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1267,23 +1267,6 @@
  • wataur bottle item
  • wataur bottle and overlay
  • - -

    24 June 2020

    -

    DeltaFire15 updated:

    -
      -
    • Choosing a random item in your uplink will no longer sometimes reroll your contract.
    • -
    • Syndicate crate event cannot fire as a random event anymore.
    • -
    -

    Detective-Google updated:

    -
      -
    • singulos no longer succ infinite rods out of the ice
    • -
    • one of the directions for the diag hudpatch was blu instead of orang
    • -
    -

    timothyteakettle updated:

    -
      -
    • bonfires/grills no longer produce infinite quantities of food
    • -
    • slime's alter form ability now updates their hair colour when changing their body colour
    • -
    GoonStation 13 Development Team From 222c345e56a953b821f684b0dcbcfd566777783a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 27 Aug 2020 00:44:49 +0000 Subject: [PATCH 16/28] Automatic changelog compile [ci skip] --- html/changelog.html | 31 ------------------------------- 1 file changed, 31 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 5eb42c6b75..09f7352122 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1236,37 +1236,6 @@
    • soap cleans blood again
    - -

    25 June 2020

    -

    Anonymous updated:

    -
      -
    • Added kepi and orvilike kepi. Available through loadout.
    • -
    -

    Detective Google updated:

    -
      -
    • Medigygax
    • -
    -

    Detective-Google updated:

    -
      -
    • malf AIs can no longer yeet the station while shunted
    • -
    • SMESes can now properly use self charging cells
    • -
    • ghosts now show up when the round ends
    • -
    • away missions
    • -
    -

    Funce updated:

    -
      -
    • Mentor SQL queries are now deleted properly.
    • -
    -

    Linzolle updated:

    -
      -
    • analyze function on chem master is no longer broken
    • -
    • organs now decay inside dead bodies again
    • -
    -

    dapnee updated:

    -
      -
    • wataur bottle item
    • -
    • wataur bottle and overlay
    • -
    GoonStation 13 Development Team From bc2c65839543825c1b8c2a458c221b7c9a2a3358 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 27 Aug 2020 18:01:08 +0100 Subject: [PATCH 17/28] json --- code/modules/client/preferences_savefile.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ecf11f180b..f253592765 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,7 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] - S["modified_limbs"] >> modified_limbs + json_decode(S["modified_limbs"]) >> modified_limbs //Custom names @@ -871,7 +871,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars3"] , scars_list["3"]) WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) - WRITE_FILE(S["modified_limbs"] , modified_limbs) + WRITE_FILE(S["modified_limbs"] , json_encode(modified_limbs)) //gear loadout if(chosen_gear.len) From 8586a05c80bd50f40fad2e5269f8566b26879a03 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 27 Aug 2020 18:59:57 +0100 Subject: [PATCH 18/28] fuck --- tgstation.dme | 1 - 1 file changed, 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index de6ee1a6bf..79c4274722 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -96,7 +96,6 @@ #include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" #include "code\__DEFINES\robots.dm" -#include "code\__DEFINES\rockpaperscissors.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\say.dm" From 31f22bc5bdd3f12109096bed268d4b4be62121d4 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 27 Aug 2020 22:28:18 +0100 Subject: [PATCH 19/28] Update tgstation.dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 79c4274722..de6ee1a6bf 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -96,6 +96,7 @@ #include "code\__DEFINES\reagents_specific_heat.dm" #include "code\__DEFINES\research.dm" #include "code\__DEFINES\robots.dm" +#include "code\__DEFINES\rockpaperscissors.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rust_g.dm" #include "code\__DEFINES\say.dm" From 594fd17f23961d0a3ee31f03ea6ddf31ca86cad1 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 2 Sep 2020 15:34:13 +0100 Subject: [PATCH 20/28] test --- code/_globalvars/lists/flavor_misc.dm | 5 ++- code/modules/client/preferences.dm | 36 +++++++++++------- code/modules/client/preferences_savefile.dm | 6 ++- .../augmentation/customized_prosthetics.dmi | Bin 0 -> 23106 bytes 4 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 icons/mob/augmentation/customized_prosthetics.dmi diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 71c2b2e13b..09d4aadf50 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -279,7 +279,8 @@ GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) //parts in either of the above two lists that require a second option that allows them to be coloured GLOBAL_LIST_INIT(colored_mutant_parts, list("insect_wings" = "wings_color", "deco_wings" = "wings_color", "horns" = "horns_color")) -//species ids that have greyscale sprites +//body ids that have greyscale sprites GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant","jelly","slime","golem","lum","stargazer","mush","ethereal","snail","c_golem","b_golem","mammal","xeno","ipc","insect","synthliz","avian","aquatic")) -//species ids that need snowflake coloring applied +//body ids that have prosthetic sprites +GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon")) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 48b86c68dd..44567a0306 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -431,7 +431,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Limb Modification:
    " dat += "Modify Limbs
    " for(var/modification in modified_limbs) - dat += "[modification]: [modified_limbs[modification]]
    " + if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) + dat += "[modification]: prosthetic - [modified_limbs[modification][2]]
    " + else + dat += "[modification]: [modified_limbs[modification]]
    " dat += "
    " dat += "Species:[pref_species.name]
    " dat += "Custom Species Name:[custom_species ? custom_species : "None"]
    " @@ -1237,7 +1240,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/datum/quirk/T = SSquirks.quirks[V] bal -= initial(T.value) for(var/modification in modified_limbs) - if(modified_limbs[modification] == "Prosthetic") + if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) return bal + 1 //max 1 point regardless of how many prosthetics return bal @@ -1497,19 +1500,22 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/modification_type = input(user, "Choose the modification to the limb:", "Character Preference") as null|anything in LOADOUT_LIMBS if(modification_type) if(modification_type == LOADOUT_LIMB_PROSTHETIC) - var/number_of_prosthetics = 0 - for(var/modification in modified_limbs) - if(modified_limbs[modification] == LOADOUT_LIMB_PROSTHETIC) - number_of_prosthetics += 1 - if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS) - to_chat(user, "You can only have up to two prosthetic limbs!") - return + var/prosthetic_type = input(user, "Choose the type of prosthetic", "Character Preference") as null|anything in (list("old_prosthetic") + GLOB.prosthetic_limb_types) + if(prosthetic_type) + var/number_of_prosthetics = 0 + for(var/modification in modified_limbs) + if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) + number_of_prosthetics += 1 + if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS) + to_chat(user, "You can only have up to two prosthetic limbs!") + else + //save the actual prosthetic data + modified_limbs[limb_type] = list(modification_type, prosthetic_type) else if(modification_type == LOADOUT_LIMB_NORMAL) modified_limbs -= limb_type - ShowChoices(user) - return 1 - modified_limbs[limb_type] = modification_type + else + modified_limbs[limb_type] = list(modification_type) if("underwear") var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list @@ -2588,7 +2594,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //limb stuff character.regenerate_limbs() //possible optimisation: check for changes before regenerating? for(var/modified_limb in modified_limbs) - var/modification = modified_limbs[modified_limb] + var/modification = modified_limbs[modified_limb][1] var/obj/item/bodypart/old_part = character.get_bodypart(modified_limb) if(modification == LOADOUT_LIMB_PROSTHETIC) var/obj/item/bodypart/new_limb @@ -2601,6 +2607,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_limb = new/obj/item/bodypart/l_leg/robot/surplus(character) if(BODY_ZONE_R_LEG) new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character) + var/prosthetic_type = modified_limbs[modified_limb][2] + if(prosthetic_type != "old_prosthetic") //lets just leave the old sprites as they are + new_limb.icon = 'icons/mob/augmentation/customized_prosthetics.dmi' + new_limb.icon_state = "[prosthetic_type]_[modified_limb]" new_limb.replace_limb(character) qdel(old_part) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c0a578862a..093d87f15a 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,7 +514,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] - json_decode(S["modified_limbs"]) >> modified_limbs + if(S["modified_limbs"]) + json_decode(S["modified_limbs"]) >> modified_limbs S["chosen_limb_id"] >> chosen_limb_id //Custom names @@ -871,7 +872,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars3"] , scars_list["3"]) WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) - WRITE_FILE(S["modified_limbs"] , json_encode(modified_limbs)) + if(modified_limbs) + WRITE_FILE(S["modified_limbs"] , json_encode(modified_limbs)) WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) //gear loadout diff --git a/icons/mob/augmentation/customized_prosthetics.dmi b/icons/mob/augmentation/customized_prosthetics.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ee5e74b93f5be4605de5614f9e8cafd8c690582a GIT binary patch literal 23106 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 R5Mo0k&Kh076rXmw`){HUeC_}M literal 0 HcmV?d00001 From 9e2ee588c915a678298cbbf0d4b1afb75e6ef3a7 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 3 Sep 2020 22:05:21 +0100 Subject: [PATCH 21/28] rp prosthetics --- code/controllers/subsystem/ticker.dm | 2 +- code/modules/client/preferences.dm | 52 ++++++++++-------- .../modules/mob/dead/new_player/new_player.dm | 2 +- .../cosmetic_prosthetic/bishop.dmi | Bin 0 -> 3523 bytes .../cosmetic_prosthetic/cybersolutions.dmi | Bin 0 -> 1390 bytes .../cosmetic_prosthetic/grayson.dmi | Bin 0 -> 1168 bytes .../cosmetic_prosthetic/hephaestus.dmi | Bin 0 -> 3296 bytes .../cosmetic_prosthetic/nanotrasen.dmi | Bin 0 -> 2606 bytes .../cosmetic_prosthetic/talon.dmi | Bin 0 -> 2839 bytes .../augmentation/cosmetic_prosthetic/ward.dmi | Bin 0 -> 1400 bytes .../augmentation/cosmetic_prosthetic/xion.dmi | Bin 0 -> 2957 bytes .../augmentation/customized_prosthetics.dmi | Bin 23106 -> 0 bytes 12 files changed, 30 insertions(+), 26 deletions(-) create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/talon.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/ward.dmi create mode 100644 icons/mob/augmentation/cosmetic_prosthetic/xion.dmi delete mode 100644 icons/mob/augmentation/customized_prosthetics.dmi diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 9af86653f4..c1db343448 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -396,7 +396,7 @@ SUBSYSTEM_DEF(ticker) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N) - N.client.prefs.post_copy_to(player) + N.client.prefs.post_copy_to(player, initial_spawn = TRUE) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 44567a0306..2156f8a01d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -434,7 +434,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) dat += "[modification]: prosthetic - [modified_limbs[modification][2]]
    " else - dat += "[modification]: [modified_limbs[modification]]
    " + dat += "[modification]: [modified_limbs[modification][1]]
    " dat += "
    " dat += "Species:[pref_species.name]
    " dat += "Custom Species Name:[custom_species ? custom_species : "None"]
    " @@ -2496,7 +2496,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) ShowChoices(user) return 1 -/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE) +/datum/preferences/proc/copy_to(mob/living/carbon/human/character, icon_updates = 1, roundstart_checks = TRUE, initial_spawn = FALSE) if(be_random_name) real_name = pref_species.random_name(gender) @@ -2591,28 +2591,32 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(custom_speech_verb != "default") character.dna.species.say_mod = custom_speech_verb - //limb stuff - character.regenerate_limbs() //possible optimisation: check for changes before regenerating? - for(var/modified_limb in modified_limbs) - var/modification = modified_limbs[modified_limb][1] - var/obj/item/bodypart/old_part = character.get_bodypart(modified_limb) - if(modification == LOADOUT_LIMB_PROSTHETIC) - var/obj/item/bodypart/new_limb - switch(modified_limb) - if(BODY_ZONE_L_ARM) - new_limb = new/obj/item/bodypart/l_arm/robot/surplus(character) - if(BODY_ZONE_R_ARM) - new_limb = new/obj/item/bodypart/r_arm/robot/surplus(character) - if(BODY_ZONE_L_LEG) - new_limb = new/obj/item/bodypart/l_leg/robot/surplus(character) - if(BODY_ZONE_R_LEG) - new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character) - var/prosthetic_type = modified_limbs[modified_limb][2] - if(prosthetic_type != "old_prosthetic") //lets just leave the old sprites as they are - new_limb.icon = 'icons/mob/augmentation/customized_prosthetics.dmi' - new_limb.icon_state = "[prosthetic_type]_[modified_limb]" - new_limb.replace_limb(character) - qdel(old_part) + //limb stuff, only done when initially spawning in + if(initial_spawn) + //delete any existing prosthetic limbs to make sure no remnant prosthetics are left over + for(var/obj/item/bodypart/part in character.bodyparts) + if(part.status == BODYPART_ROBOTIC) + qdel(part) + character.regenerate_limbs() //regenerate limbs so now you only have normal limbs + for(var/modified_limb in modified_limbs) + var/modification = modified_limbs[modified_limb][1] + var/obj/item/bodypart/old_part = character.get_bodypart(modified_limb) + if(modification == LOADOUT_LIMB_PROSTHETIC) + var/obj/item/bodypart/new_limb + switch(modified_limb) + if(BODY_ZONE_L_ARM) + new_limb = new/obj/item/bodypart/l_arm/robot/surplus(character) + if(BODY_ZONE_R_ARM) + new_limb = new/obj/item/bodypart/r_arm/robot/surplus(character) + if(BODY_ZONE_L_LEG) + new_limb = new/obj/item/bodypart/l_leg/robot/surplus(character) + if(BODY_ZONE_R_LEG) + new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character) + var/prosthetic_type = modified_limbs[modified_limb][2] + if(prosthetic_type != "old_prosthetic") //lets just leave the old sprites as they are + new_limb.icon = file("icons/mob/augmentation/cosmetic_prosthetic/[prosthetic_type].dmi") + new_limb.replace_limb(character) + qdel(old_part) if(length(modified_limbs)) character.regenerate_icons() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 7cbdd3afb6..bd2c03ea6f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -415,7 +415,7 @@ if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) if(humanc.client) - humanc.client.prefs.post_copy_to(humanc) + humanc.client.prefs.post_copy_to(humanc, initial_spawn = TRUE) GLOB.joined_player_list += character.ckey GLOB.latejoiners += character diff --git a/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi b/icons/mob/augmentation/cosmetic_prosthetic/bishop.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8641ef2d3cc8ffc4393b5e3e4c479262c431832d GIT binary patch literal 3523 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 Juc7ehzX96;o^b#G literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi b/icons/mob/augmentation/cosmetic_prosthetic/cybersolutions.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eeed0d0c0107044d551c1ccbb75835c00773fd96 GIT binary patch literal 1390 zcmV-!1(EuRP)005u}0{{R3yb+fl00018P)t-sz`(!} z5fLdVDK#}UK0ZD_KR-%JN)!|nRaI4PZf+mW9A-bR5&!@I0d!JMQvg8b z*k%9#0ET*0Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1C^0t`#5P2z zDvD1m$|a~OhbUD=@j0pKM3_a4s*Kdc6kLjw68#xeNwl+xP#Nvje@o)RIgIE!*jLZU3lT>4_YZ^5FAoWf+EG z{7bCY>s#VbkPGM|1P~n{I7BW!U`bzo@)wvlmviJfr$@5j^gmC z9k2R4dLq6Ak*{O8`m(-N0Nmhn`36Q{i5Gzb7hjeBmhytaqOZs+qgp{9w7Cxs9TAnE zjKCVN0-5+M5MzwIz!F48V8Y-uf#n9=&<6MpUZ!~D1o|_Ps}L^(ngWyB!Bv^SvIrb) zxcH@mT)YU36@C@W;if<@F0KoKz&QuRt%2Y|$sf2Gu4}XuN2!D75iNoI;{FXccaXmo zf^*Ta`d0NN1bqme8&G5Opr*hcg>wgmc!(~t`ijC3%2(j0ILrfDagWp^aHYM@mkM&6 zsefUtHVP&WrIMu~#5^Y?~KI zT?UE@G|dq&c(1RNv@Zs`EGQip8u?Ry>Y^jH1tw3dF?0nG8u?SYqJ!0^YW_AclYb@n zI)9(J^(#a3V%o;pTR{J}z-!ufHu~CWml23ffmh^4YEGrLM*8pa*ZF(>!IuQh(WoT3 zLg1@J*V%8JKqblh3FICbi+OmBMCK0~hG7_nVHk#Cybq85{tNwM?{E<}c|HQ3JZlj@ z1Rk&OLO+B@pW@|Q!do;*u}A2jD3F%1`foxONSwgVP4LpNB`%&%F%CTnVPH4m&KsTY zI6VN^-emr#2oMG4I|>}u9g_@@1~!N}3(=d2u+~2hTqofwFr|BT5L`zG$0%)t&e`V$ z75xRkRu>p0fw?S_dkS=U)Cb`Q3fye@1^U8>!i!N6nC~YLY0Mo{yai%4lsk|Q-b#7I z(Acp^ia_>X@|;VOd-V`8_dKXDZ!Bwjf$!}sQQ0u{UK$={{mQZ4&ER+YnS?p|EJc+oRrUz(wcQh z0g`+ejPC!b^|NZ;0I=>9xTv{Xn*XQP*ZnWp@~hZI#obcV-#%b9W}$jKr=8^|4*skW6!}z>^^naY8{jdsP%j7Ih=jKW}rHM znn1CD*@H&83vhc=Ts{{}k89vGO_BnfP>w5~$7?5>Y2as?o+shtw9kZMd{+hT`6Gq) zRp9Q;3cu|42Rb~n1-=~jM?5|sg~Qu+UvYmpaq-h(k6(9hZ(*LM3Toc=G-hf#nwa{$rA+aQcp7d{@sUI~}>3g!<=2AjYcze(xC)cd*)f wf!xt^FY$VO-G^^#F$}{n48t%C!}x#r34328qWj#Dr2qf`07*qoM6N<$f`vGJegFUf literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi b/icons/mob/augmentation/cosmetic_prosthetic/grayson.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9ed6c5f06f899667d4bc91c32c399a96f3bc4b0a GIT binary patch literal 1168 zcmV;B1aJF^P)005u_0{{R3dEt5<0000gP)t-sz`(#+ zR#GM=CO|+yI5;>nGc##wYVbZjtTHlaXlPbeRv{rF7Z(@6z`#2C)(!vw00DGTPE!Ct z=GbNc004!0R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+CqA(#SBZ-=C9|j)q=}0&ttc@!6~s0~ zR+W>QPEb`5QDzkpWmZONVhTY;$r-7|CAd^6E4cc(fWrg;^TbaCobq0e000AnNkl{Ff0jj@~$C>@&{ITerU+STC8uDv@{u}xO3sYwIE-&hFp|Q_DX|JyoYu^ z2R0N<9@cPXyfsE>HxF!>hBlO;4TGOUF=$2cP0On zQ9pcJp|s_qYNhlZoJ-AtNd(>L1ijU_W^EBCO%Vw|Q8@y*jjEAJ%US+HKLJ z(1s1+d9T#yAc#bgmIn?=)0Hh(oCKDZEfK1EIXSSN?5Ci1? zbb9V#ct2F1I^x08{Ikt+uMtWi$y6)x2s6jr+rPZT9USKa6X+^6f+T37 z+sXO`$MgrTik&WiyJWj=X!mn&kBa&)6uOj3p18l%@Dg;P3yWgz&he7I9*s2|&HdES z7eQSLehx$bJzQT5_-4mPm(!^`DJtsT3o>SpwVCN4)?O5?CH6LyONM@@Wc(&zM2Lb3 zTt*0PU7ke8XRTteOy?>z121S@(lXl+4Db@7$5hkK<(RLwlnIL43UNJ8BZ(rg$=eZ*;)VO8L{vL!}RA&s8us%cpeS_0000@t literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi b/icons/mob/augmentation/cosmetic_prosthetic/hephaestus.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4bb6b72fd0f90ac427c6630db5863fbfeaf4df50 GIT binary patch literal 3296 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 literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi b/icons/mob/augmentation/cosmetic_prosthetic/nanotrasen.dmi new file mode 100644 index 0000000000000000000000000000000000000000..18c7738ba390387d611ab5d4542a51f6e18b0f56 GIT binary patch literal 2606 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 bngIcDuv-h|6x9?uJHajXPDF_0A zj#`+*?EqW+&j;oQR>FvnI$-X_Iyj@@sBo_^-w?EKa1aO-oqvD$xnP&par~Fd3#!l$ zZtSJllNRa1tLmAaX;!j`mq%jvMMSJ`^+`xa$L04E@@}e_*__Ljj?%(U77nQ;OLpp> zc?GxduPGW`rX-Bb^^$89j@j92@oP6vU$WH_@j&E`>!iNzP}OvKi}xa=PIqgLd*!RI z%q||~W!dmG22}ze1x+pBMh?;WtCLpO6kH?(HZmduZovo1eeZ7HZaET^tNhD%SfW*D z!qK%PpX}kS6W(vM_TTR^vhPE9sd_?AQA(!S8vNplTFyb^N!CwaiX~pG^7-;H_v-i> zb>R7~!w^>hrgAZYO2Vl|s39usVBkYjn@MpXt&d_?Jd;6()cC}l9^6)u=Wgo*p zw@(}b*8r|RAqgp+At;=?~4+eABb%BzudVY7LEA3wXbd0p-x)D2l&;=i7p!lt_-?1Pdd7eo0&#bRJ{-I^DmRz?|DhfLLKf9GIY`)E6|;!UsTu>?dj|5e{h6Bi$wQ|U0q#; z5u?m)nhktBsQGS6CEd?fIYUmq6s>0khc`4de0ckcPDe1zR=<9|pnm@RM;6W&mi?WR zuu*5JY@B0>_xARt6&B^>9Eq z+1ZP+t{UXVj;{tIWuIgRrgS8aE}xkpE7A<7jL}V{=GC8S2Zn}(U9uv4)E@bBCz@6r zY8}f=%R(#4Q7&i<#DeUfd z-ASA_$KYOQ(j`r`F(ZWrWkeanPw(ZI6#ci~-qXhe*J4suzA(y=jHT5D?w zVEh`9rnHxWa%@M6Nfs&{*`Ci{Szmv%xf!PQ zbLy75@FCq|-Hz}&29v|##BW5$#9ZESN&w2Vi}hbB_QxEgyyL+X7QgwD@$1PH5wn`L2e#VV^q?P$L*nBZa$)7v7+KO-P z43ahXrAHYLus-$gYtmzjZ9enVI8yo&WtpMl{EfG;e8GW%=}cN@mL_HpWZ%{3#`v?g zR(-}Rfny>#MI?9N8k(CWAnh$JV47!+a7hi~?D56vY5C~*;9z2W8~cpaB?0qC5=@*u zmjx%2f7Q`3fj47|?*=7$hQS^Vdne{>3=9amxw}W+A5-pn@`6V^?j(DDIFH&dW%ZMc zq>ymhOP>7P+)_H7?zy9O`a~||IMA@3`Nb8QQ7Dwoteiw9t^F>4I+Y2n=3Pxc^gWVu zaCU69Aa-^#R+W^x6I8i-q?t#AXqGmn7$Z>DkJPjTfAR3}*rzfh4|=d$z$5PTMiqT} z-66wTn&>cnv-B&f!DYa^0gc5LXtU1L1Wr@|{W!Cx$hu;wBA6?Q)#t{~0-3WZ?=wQ5 z#(OtZZ8sgi+3K2>JFI*I{0}qN)&PV;ocZ`Q8wqB>Df#80k&%kNzCJrIFRuW7c0I>X z1%}prjlT?mC=S-&n}qa-O4Xkyh=_{bAK(9|>%bmODPn! z)kdgKSeSMT3Tf!od2U588!GrBbo`6lLA(SJq&gKNeV<4?Chn^*=co~d!9c_-I>jgP zbcyTP@)5iHV7;!6mXu8*}v;J)u&nCkdUz8Qpkj5%F7;LV{omm2%K@ z)1u8NYW?$>g-_TP8}Q>U=)bGtk8A9IX{pY29?LKs|5`BBT_|S0&1AO}~ z58_)20jYWJ;A_gzu0UorT{SN6;t8*mGgn9k)1~GxT${V{KJU(3pwI%ED-jp)?M(^w zX8Es39ZgN%>|V}K?`1~O!?&K8XJllUGOMK%A9ib%uQRe9aiZan8H+B1O^17Ok)SyT z*PWC%>UR&mDgrN#J3%l3c#GYhCtPda2@^g@(GiMtYo>ScK^T$X6k2P4Al~B5O|qf(8h7-;QAmbNAt;Vd*Sd^>)Om^2s2IWdDnCaxjQx3`d8A zc(U)!CMNRA%L@`wVk&aql^@xJ;fB5u>Z&z%FUf(Y9?Xcywjbg7&)Mt$U>Qf$!XbPh U+Tut<8 literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi b/icons/mob/augmentation/cosmetic_prosthetic/ward.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b2622ef6a18caf213efb91559d551e7be815cba5 GIT binary patch literal 1400 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 literal 0 HcmV?d00001 diff --git a/icons/mob/augmentation/customized_prosthetics.dmi b/icons/mob/augmentation/customized_prosthetics.dmi deleted file mode 100644 index ee5e74b93f5be4605de5614f9e8cafd8c690582a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23106 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 R5Mo0k&Kh076rXmw`){HUeC_}M From 4f82f063db6ca4186ed260bbaa2149037fa24001 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 3 Sep 2020 22:09:50 +0100 Subject: [PATCH 22/28] dummies --- code/modules/mob/dead/new_player/preferences_setup.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 9a0d9f9242..b77fae68c8 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -41,7 +41,7 @@ var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) // Apply the Dummy's preview background first so we properly layer everything else on top of it. mannequin.add_overlay(mutable_appearance('modular_citadel/icons/ui/backgrounds.dmi', bgstate, layer = SPACE_LAYER)) - copy_to(mannequin) + copy_to(mannequin, initial_spawn = TRUE) if(previewJob && equip_job) mannequin.job = previewJob.title From 798e11c4072e201d7bb9229ff9533e435000cce4 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 3 Sep 2020 22:36:38 +0100 Subject: [PATCH 23/28] logic --- code/modules/client/preferences.dm | 8 ++++---- code/modules/mob/living/carbon/human/dummy.dm | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2156f8a01d..88aba167f6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Modify Limbs
    " for(var/modification in modified_limbs) if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) - dat += "[modification]: prosthetic - [modified_limbs[modification][2]]
    " + dat += "[modification]: [modified_limbs[modification][2]]
    " else dat += "[modification]: [modified_limbs[modification][1]]
    " dat += "
    " @@ -1500,13 +1500,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/modification_type = input(user, "Choose the modification to the limb:", "Character Preference") as null|anything in LOADOUT_LIMBS if(modification_type) if(modification_type == LOADOUT_LIMB_PROSTHETIC) - var/prosthetic_type = input(user, "Choose the type of prosthetic", "Character Preference") as null|anything in (list("old_prosthetic") + GLOB.prosthetic_limb_types) + var/prosthetic_type = input(user, "Choose the type of prosthetic", "Character Preference") as null|anything in (list("prosthetic") + GLOB.prosthetic_limb_types) if(prosthetic_type) var/number_of_prosthetics = 0 for(var/modification in modified_limbs) if(modified_limbs[modification][1] == LOADOUT_LIMB_PROSTHETIC) number_of_prosthetics += 1 - if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS) + if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS && !(limb_type in modified_limbs && modified_limbs[limb_type][1] == LOADOUT_LIMB_PROSTHETIC)) to_chat(user, "You can only have up to two prosthetic limbs!") else //save the actual prosthetic data @@ -2613,7 +2613,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(BODY_ZONE_R_LEG) new_limb = new/obj/item/bodypart/r_leg/robot/surplus(character) var/prosthetic_type = modified_limbs[modified_limb][2] - if(prosthetic_type != "old_prosthetic") //lets just leave the old sprites as they are + if(prosthetic_type != "prosthetic") //lets just leave the old sprites as they are new_limb.icon = file("icons/mob/augmentation/cosmetic_prosthetic/[prosthetic_type].dmi") new_limb.replace_limb(character) qdel(old_part) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 2f5c94b784..f8894e67d1 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -18,6 +18,9 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/Life() return +/mob/living/carbon/human/dummy/update_resting() + return + /mob/living/carbon/human/dummy/proc/wipe_state() delete_equipment() icon_render_key = null From fc0e8e31fc3df443a3b6ff30a9f612c46ceee2e8 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 3 Sep 2020 22:51:56 +0100 Subject: [PATCH 24/28] yeah dont brick data again holy shit --- code/modules/client/preferences_savefile.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9097569c90..4b2db724cb 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -875,7 +875,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) if(modified_limbs) - WRITE_FILE(S["modified_limbs"] , json_encode(modified_limbs)) + WRITE_FILE(S["modified_limbs"] , safe_json_encode(modified_limbs)) WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) From cdaef63fa1200a6054fef3fa82ae782da3dd3a31 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 3 Sep 2020 23:07:19 +0100 Subject: [PATCH 25/28] sorry travis --- code/controllers/subsystem/ticker.dm | 2 +- code/modules/mob/dead/new_player/new_player.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index c1db343448..9af86653f4 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -396,7 +396,7 @@ SUBSYSTEM_DEF(ticker) SSjob.EquipRank(N, player.mind.assigned_role, 0) if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character)) SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N) - N.client.prefs.post_copy_to(player, initial_spawn = TRUE) + N.client.prefs.post_copy_to(player) CHECK_TICK if(captainless) for(var/mob/dead/new_player/N in GLOB.player_list) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index bd2c03ea6f..312449064f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -415,7 +415,7 @@ if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) if(humanc.client) - humanc.client.prefs.post_copy_to(humanc, initial_spawn = TRUE) + humanc.client.prefs.post_copy_to(humanc) GLOB.joined_player_list += character.ckey GLOB.latejoiners += character @@ -569,7 +569,7 @@ client.prefs.scars_list["[cur_scar_index]"] = valid_scars client.prefs.save_character() - client.prefs.copy_to(H) + client.prefs.copy_to(H, initial_spawn = TRUE) H.dna.update_dna_identity() if(mind) if(transfer_after) From 4bbec8eae121f57de34ffd0831f0b23c8cec9141 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 4 Sep 2020 12:45:23 +0100 Subject: [PATCH 26/28] travis lets be friends --- code/modules/client/preferences_savefile.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4b2db724cb..dfa58209de 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,7 +514,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] - if(S["modified_limbs"]) + if(length(S["modified_limbs"])) safe_json_decode(S["modified_limbs"]) >> modified_limbs S["chosen_limb_id"] >> chosen_limb_id S["hide_ckey"] >> hide_ckey //saved per-character @@ -874,7 +874,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars3"] , scars_list["3"]) WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) - if(modified_limbs) + if(length(modified_limbs)) WRITE_FILE(S["modified_limbs"] , safe_json_encode(modified_limbs)) WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) From 2bb19003a03a00466dad5f937f5e93d89e1eb8f8 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 7 Sep 2020 01:47:30 +0100 Subject: [PATCH 27/28] thanks kevin --- code/modules/client/preferences_savefile.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index dfa58209de..5856a7b6e1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,8 +514,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] - if(length(S["modified_limbs"])) - safe_json_decode(S["modified_limbs"]) >> modified_limbs + var/limbmodstr + S["modified_limbs"] >> limbmodstr + if(length(limbmodstr)) + modified_limbs = safe_json_decode(limbmodstr) + else + modified_limbs = list() S["chosen_limb_id"] >> chosen_limb_id S["hide_ckey"] >> hide_ckey //saved per-character @@ -874,7 +878,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars3"] , scars_list["3"]) WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) - if(length(modified_limbs)) + if(islist(modified_limbs)) WRITE_FILE(S["modified_limbs"] , safe_json_encode(modified_limbs)) WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) From 744792742bf331a165bbf16170d1f0964724a412 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 12 Sep 2020 22:32:06 +0100 Subject: [PATCH 28/28] please fix it --- code/modules/mob/living/carbon/human/dummy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index f8894e67d1..ed1ba3852f 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -18,7 +18,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/Life() return -/mob/living/carbon/human/dummy/update_resting() +/mob/living/carbon/human/dummy/update_mobility() return /mob/living/carbon/human/dummy/proc/wipe_state()