From f9e6199bfebce169797ee4d099cfc882675f282e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 3 Oct 2020 00:55:14 +0000 Subject: [PATCH 01/62] 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 264f32ef3f..281bb297e2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -685,23 +685,6 @@
  • combat mode now has weaker buffs in terms of damage dealt and took for being or not being in the mode
  • damage debuff for laying down has been decreased from 0.5x to 0.7x
  • - -

    01 August 2020

    -

    dapnee updated:

    - -

    silicons updated:

    - -

    timothyteakettle updated:

    - GoonStation 13 Development Team From 6ce4b68496a0676824d5b862f7572e163f31853f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 4 Oct 2020 00:58:39 +0000 Subject: [PATCH 02/62] Automatic changelog compile [ci skip] --- html/changelog.html | 43 ------------------------------------------- 1 file changed, 43 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 281bb297e2..8dcdef4cbf 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -642,49 +642,6 @@
  • explosive stand bombs can now be examined from any distance
  • explosive stand bombs are now a component.
  • - -

    02 August 2020

    -

    Auris456852 updated:

    - -

    Hatterhat updated:

    - -

    KeRSedChaplain updated:

    - -

    MrJWhit updated:

    - -

    Seris02 updated:

    - -

    dapnee updated:

    - -

    ike709 and bobbahbrown updated:

    - -

    kappa-sama updated:

    - -

    timothyteakettle updated:

    - GoonStation 13 Development Team From 40f781aeecb550986676bc3730bb49e5643e6ec1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 5 Oct 2020 00:56:59 +0000 Subject: [PATCH 03/62] 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 8dcdef4cbf..8f860af519 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -620,28 +620,6 @@
    • prefs for headpat wagging
    - -

    03 August 2020

    -

    KeRSedChaplain updated:

    -
      -
    • fixed clockwork guardians being able to reflect ranged weapons
    • -
    -

    Linzolle updated:

    -
      -
    • uv penlight no longer invisible
    • -
    -

    dapnee updated:

    -
      -
    • active turfs on box and xenohive, maintenance bar APC not being stringed correctly, turned a monitor to face a direction that makes sense, changed tag of camera in gravgen being misnamed
    • -
    -

    silicons updated:

    -
      -
    • shoves have been buffed to apply a status effect rather than a 0.85 movespeed modifier, meaning repeatedly shoving someone now renews the debuff
    • -
    • shoves now stagger for 3.5 seconds.
    • -
    • war operatives now actually time 20 minutes since roundstart to depart instead of 15.
    • -
    • explosive stand bombs can now be examined from any distance
    • -
    • explosive stand bombs are now a component.
    • -
    GoonStation 13 Development Team From cc072234800ea3c0f6cd8c7472dc145c20235e70 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 6 Oct 2020 00:57:07 +0000 Subject: [PATCH 04/62] Automatic changelog compile [ci skip] --- html/changelog.html | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 8f860af519..7e035648d9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -606,20 +606,6 @@
    • nukies can buy holoparasites
    - -

    04 August 2020

    -

    Seris02 updated:

    -
      -
    • lizard spines
    • -
    -

    timothyteakettle updated:

    -
      -
    • due to further advancements in medical technology, you can now have holes poked into your body for fun and enjoyment
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • prefs for headpat wagging
    • -
    GoonStation 13 Development Team From ea8cc3759aabaa5269f40f96aefbe691dd183725 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 8 Oct 2020 00:47:52 +0000 Subject: [PATCH 05/62] Automatic changelog compile [ci skip] --- html/changelog.html | 49 --------------------------------------------- 1 file changed, 49 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 7e035648d9..6b6415f702 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -557,55 +557,6 @@
  • holoparasites can now play music
  • lethal blood now causes damaging bleeding instead of outright gibbing
  • - -

    06 August 2020

    -

    Auris456852 updated:

    -
      -
    • Added B.O.O.P. Remote Control cartridges to the PTech.
    • -
    -

    Hatterhat updated:

    -
      -
    • Proto-kinetic glaives! Essentially a proto-kinetic crusher with a different blade, handguard, and goliath hide grip. Expensive, but elegant.
    • -
    • Door charges no longer knock people out.
    • -
    -

    Ludox235 updated:

    -
      -
    • You can now buy damaged AI upload modules in the traitor's uplink.
    • -
    -

    Seris02 updated:

    -
      -
    • fixed ghost chilis
    • -
    -

    Trilbyspaceclone updated:

    -
      -
    • 4 New blends of tea have been shipped to the station, and how to make them has been leaked!
    • -
    -

    b1tt3r1n0 updated:

    -
      -
    • Added the warp implant
    • -
    -

    dapnee updated:

    -
      -
    • added a hallway to telecoms for engineers to get there on meta
    • -
    -

    kappa-sama updated:

    -
      -
    • dildo circuit assemblies
    • -
    -

    lolman360 updated:

    -
      -
    • The Tendril-Mother on Lavaland has remembered how to make ashwalkers who know how to speak Draconic again.
    • -
    -

    timothyteakettle updated:

    -
      -
    • nanotrasen has decided to fire all disabled members of the security division and confiscate certain sentimental items from doctors
    • -
    • the custom tongue preference now passes through cloning so you spawn with your selected tongue
    • -
    • several changes to travelling traders so they look better and spawn slightly less often
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • nukies can buy holoparasites
    • -
    GoonStation 13 Development Team From 84b7384f023514a66f70258fe5fab3ceaebfd419 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 9 Oct 2020 00:58:18 +0000 Subject: [PATCH 06/62] Automatic changelog compile [ci skip] --- html/changelog.html | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 6b6415f702..62addad62c 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -537,26 +537,6 @@
  • cuts make you bleed 25% less now
  • more items in the loadout and loadout has subcategories now for easier searching
  • - -

    07 August 2020

    -

    dapnee updated:

    -
      -
    • fixed active tufs on some space ruins, murderdome VR, and a few on pubby, changed cargo autolathe to techfab, messed with pipe room leading to monastery.
    • -
    -

    lolman360 updated:

    -
      -
    • vendors are now unanchored when tipped. it just fell over it's not bolted to the ground anymore.
    • -
    • podpeople no fat when sunbathing.
    • -
    -

    silicons updated:

    -
      -
    • explosions only recurse one level into storage before dropping 1 level per storage layer.
    • -
    • volumetric storage is now minimum 16 pixels per item because 8 was ridiculous
    • -
    • shieldbash balanace --> balance
    • -
    • attempting to send too long of an emote will now reflect it back to you instead of cutting it off and discarding the overflow.
    • -
    • holoparasites can now play music
    • -
    • lethal blood now causes damaging bleeding instead of outright gibbing
    • -
    GoonStation 13 Development Team From e223229eac15b4bb82c85c22c3a9a96f0c2e13e5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 10 Oct 2020 00:58:28 +0000 Subject: [PATCH 07/62] Automatic changelog compile [ci skip] --- html/changelog.html | 37 ------------------------------------- 1 file changed, 37 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 62addad62c..43a400a813 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -500,43 +500,6 @@
  • immovable rods no longer drop down chasms
  • fun removal: squeaking objects now have an 1 second cooldown between squeaks, and will have a 33% chance of interrupting any other squeaking object when Cross()ing, meaning no more ear-fuck conveyor belts.
  • - -

    08 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • Roundstart cultists now start with a replica fabricator - no brass though, make your own.
    • -
    • Kindle cast time: 10 > 15, mute after stun end: 2 > 5, slur after mute end: 3 > 5
    • -
    • The ratvarian spear no longer adds negative vitality under very specific circumstances.
    • -
    • The Ratvarian Spear can parry now! Short parries with low leeway, but low cooldown.
    • -
    • The brass claw, a implant-based weapon which gains combo on consecutive hits against the same target.
    • -
    • The sigil of rites, a sigil used to perform various rites with a cost of power and materials
    • -
    • The Rite of Advancement: Used to add a organ or cyberimplant to a clockie without need for surgery.
    • -
    • The Rite of Woundmending: Used to heal all wounds on another cultist, causing toxins damage in return.
    • -
    • The Rite of the Claw: Used to summon a brass claw implant. Maximum of 4 uses per round.
    • -
    -

    Hatterhat updated:

    -
      -
    • You can now buy a toolbox's worth of Mosin-Nagant ammo for a fairly discounted price.
    • -
    • Revolvers from the dedicated kit now have reskinning capabilities.
    • -
    • You can now actually buy the riflery primer, which lets you pump shotguns and work the Mosin's bolt faster.
    • -
    • Bulldog slug magazines now have a unique sprite.
    • -
    -

    Ludox235 updated:

    -
      -
    • Removed an abductee objective that told you to remove all oxygen.
    • -
    • Added a new abductee objective to replace the removed one.
    • -
    -

    Sishen1542 updated:

    -
      -
    • 🅱️oneless
    • -
    • squishy slime emotes
    • -
    -

    timothyteakettle updated:

    -
      -
    • heparin makes you bleed half as much now
    • -
    • cuts make you bleed 25% less now
    • -
    • more items in the loadout and loadout has subcategories now for easier searching
    • -
    GoonStation 13 Development Team From 9e2a370ee60bb97338a961100f26e67b7020f21e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 11 Oct 2020 01:01:19 +0000 Subject: [PATCH 08/62] Automatic changelog compile [ci skip] --- html/changelog.html | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 43a400a813..7cba3cd27e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -485,21 +485,6 @@
    • speech verbs copy through dna copying now
    - -

    09 August 2020

    -

    Hatterhat updated:

    -
      -
    • Proto-kinetic glaives (not crushers) can parry now.
    • -
    -

    MrJWhit updated:

    -
      -
    • Adds a second shutter on the top of the hop line
    • -
    -

    silicons updated:

    -
      -
    • immovable rods no longer drop down chasms
    • -
    • fun removal: squeaking objects now have an 1 second cooldown between squeaks, and will have a 33% chance of interrupting any other squeaking object when Cross()ing, meaning no more ear-fuck conveyor belts.
    • -
    GoonStation 13 Development Team From 792328fd0eb126632012d078e37a0071f616b077 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 12 Oct 2020 00:59:56 +0000 Subject: [PATCH 09/62] Automatic changelog compile [ci skip] --- html/changelog.html | 63 --------------------------------------------- 1 file changed, 63 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 7cba3cd27e..8063621669 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -422,69 +422,6 @@
    • volaju two
    - -

    10 August 2020

    -

    Hatterhat updated:

    -
      -
    • Parry counterattack text now shows up.
    • -
    • Sterilized gauze is now better at stopping bleeding, and applies slightly faster. Very slightly faster.
    • -
    • Ointment and sutures now hold more in a stack (12 and 15, respectively).
    • -
    • Sterilized gauze can now be made by just pouring 10u sterilizine onto standard medical gauze, instead of having to craft it. Why you had to craft it, I will honestly never know.
    • -
    • Proto-kinetic glaives are more expensive, stagger/cooldown on failed parries increased slightly, perfect parries required for counterattack.
    • -
    • New item: Temporal Katana. 2 points for wizards, timestops upon successful parry, bokken quickparry stats (100 force on melee counter!).
    • -
    • Also you can *smirk. This has no mechanical effect, other than being smug.
    • -
    -

    KeRSedChaplain updated:

    -
      -
    • Added a guide for romerol usage
    • -
    • made infectious zombies not enter softcrit and take no stamina damage
    • -
    -

    LetterN updated:

    -
      -
    • clocktheme color
    • -
    • Ports TGUI-4
    • -
    -

    Lynxless updated:

    -
      -
    • Ports TG #51879
    • -
    -

    Owai-Seek updated:

    -
      -
    • Meatballs now spawn raw from food processors.
    • -
    -

    Putnam3145 updated:

    -
      -
    • Ethereals
    • -
    • (Hexa)crocin
    • -
    • (Hexa)camphor
    • -
    • Tweaked wording for marking tickets IC issue.
    • -
    • Rerolling your traitor goals will ONLY give you "proper" objectives.
    • -
    -

    Seris02 updated:

    -
      -
    • borgs being able to select and use a module when it's too damaged
    • -
    -

    Sishen1542 updated:

    -
      -
    • gave chairs active block/parry in exchange for removal of block_chance
    • -
    • replaces box whiteship tbaton with truncheon
    • -
    -

    kappa-sama updated:

    -
      -
    • made the Dirty Magazines crate cost 4000 instead of 12000 credits
    • -
    • MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP
    • -
    -

    silicons updated:

    -
      -
    • player made areas are no longer valid for malf hacking
    • -
    • default space levels is 4 again.
    • -
    • rats now swarm instead of stacking on one spot.
    • -
    • getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded.
    • -
    -

    timothyteakettle updated:

    -
      -
    • speech verbs copy through dna copying now
    • -
    GoonStation 13 Development Team From 1e2a1dc252fe860d7c760ddd4c2d6450c6145a99 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 13 Oct 2020 01:00:24 +0000 Subject: [PATCH 10/62] Automatic changelog compile [ci skip] --- html/changelog.html | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 8063621669..0d3ca8d5d4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -408,20 +408,6 @@
  • hair and some sechuds
  • ce hardsuit radproofing
  • - -

    11 August 2020

    -

    Hatterhat updated:

    -
      -
    • PDA uplinks can now steal from pens. Properly. Just make sure to have a pen in your PDA, first.
    • -
    -

    kappa-sama updated:

    -
      -
    • tracer no longer gives you full stamheals per use
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • volaju two
    • -
    GoonStation 13 Development Team From f5d310e924492f0a5bd11a1d9eeda31db19d753e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 14 Oct 2020 00:59:40 +0000 Subject: [PATCH 11/62] Automatic changelog compile [ci skip] --- html/changelog.html | 56 --------------------------------------------- 1 file changed, 56 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 0d3ca8d5d4..8f40c22db1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -352,62 +352,6 @@
    • Removes fermisleepers and reverts them to tg ones
    - -

    12 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • hellgun single-pack classification: goodies -> armory
    • -
    -

    Detective-Google updated:

    -
      -
    • hallway table hallway table
    • -
    -

    Hatterhat updated:

    -
      -
    • The temporal katana is now slightly more worthy of the 2 spell point cost, with a smaller, antimagic respecting timestop, less force, and no random blockchance. Society has progressed past the need for blockchance.
    • -
    -

    LetterN updated:

    -
      -
    • Mafia Component
    • -
    • Fixed missing icons and handtele
    • -
    -

    Putnam3145 updated:

    -
      -
    • a whole lot of jank regarding funny part sprite display.
    • -
    -

    Toriate updated:

    -
      -
    • Opossums have migrated into the maintenance tunnels! Seek them out at your own peril!
    • -
    -

    ancientpower updated:

    -
      -
    • Doors added to the west side of box medbay to make things a bit more manageable.
    • -
    -

    kappa-sama updated:

    -
      -
    • smuggler satchel cost 2->1
    • -
    • radio jammer cost 5->2
    • -
    • smuggler satchel uplink description now implies that persistence is disabled
    • -
    -

    lolman360 updated:

    -
      -
    • renameable necklace (accessory, attaches to suit) and ring (glove slot.)
    • -
    • custom rename is now 2048 characters? i think it's characters.
    • -
    -

    silicons updated:

    -
      -
    • You can now use anything as an emoji by doing :/obj/item/path/to/item:. This works for any /atom or subtype.
    • -
    -

    timothyteakettle updated:

    -
      -
    • syndicate agents now have access to mechanical aim enhancers which allow them to aim bullets to bounce off walls
    • -
    • ricochets work properly now for the bullets that support them
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • hair and some sechuds
    • -
    • ce hardsuit radproofing
    • -
    GoonStation 13 Development Team From 5ef71fc15df7f29affb21b9ce27abe1d1ba7f639 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 15 Oct 2020 01:00:48 +0000 Subject: [PATCH 12/62] 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 8f40c22db1..5c5ee2d4e6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -346,12 +346,6 @@
    • abductors can buy things
    - -

    13 August 2020

    -

    LetterN updated:

    -
      -
    • Removes fermisleepers and reverts them to tg ones
    • -
    GoonStation 13 Development Team From 5f353bb634c4db40c40f9976da19ddf45c0a9a72 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 16 Oct 2020 01:01:22 +0000 Subject: [PATCH 13/62] 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 5c5ee2d4e6..7ee946227e 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -340,12 +340,6 @@
  • the 8 rotation limit from clockwork chairs has been removed. please don't abuse this.
  • ethereals can now wear underwear
  • - -

    14 August 2020

    -

    silicons updated:

    -
      -
    • abductors can buy things
    • -
    GoonStation 13 Development Team From 2c6e8fd87d98e1fbd1ed67f923fca20d529acc8d Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 16 Oct 2020 22:28:00 +0100 Subject: [PATCH 14/62] what if color was cool --- code/__DEFINES/citadel_defines.dm | 10 ++++ code/modules/client/preferences.dm | 36 +++++++++++++ code/modules/client/preferences_savefile.dm | 25 ++++++++- .../sprite_accessories/_sprite_accessories.dm | 1 + .../sprite_accessories/body_markings.dm | 5 ++ .../new_player/sprite_accessories/ears.dm | 47 ++++++++++++++++ .../new_player/sprite_accessories/frills.dm | 1 + .../sprite_accessories/ipc_synths.dm | 1 + .../sprite_accessories/legs_and_taurs.dm | 6 +++ .../new_player/sprite_accessories/snouts.dm | 53 ++++++++++++++++--- .../new_player/sprite_accessories/spines.dm | 1 + .../new_player/sprite_accessories/synthliz.dm | 10 ++++ .../new_player/sprite_accessories/tails.dm | 18 ++++++- .../mob/living/carbon/human/species.dm | 42 ++++++++++----- 14 files changed, 234 insertions(+), 22 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 923355b340..107e182f8d 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -114,3 +114,13 @@ //special species definitions #define MINIMUM_MUTANT_COLOR "#202020" //this is how dark players mutant parts and skin can be + +//defines for different matrix sections +#define MATRIX_RED "red" +#define MATRIX_GREEN "green" +#define MATRIX_BLUE "blue" +#define MATRIX_RED_GREEN "red_green" +#define MATRIX_RED_BLUE "red_blue" +#define MATRIX_BLUE_GREEN "blue_green" +#define MATRIX_ALL "red_green_blue" +#define MATRIX_NONE "none" \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d817cc3a53..7832c79e18 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -552,6 +552,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button if(color_type) dat += "    Change
    " + else + //is it matrixed or does it have extra parts to be coloured? + var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] + var/find_part_list = GLOB.mutant_reference_list[mutant_part] + if(find_part && find_part_list) + var/datum/sprite_accessory/accessory = find_part_list[find_part] + if(accessory) + if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future + var/primary_feature = "[mutant_part]_primary" + dat += "Primary Color
    " + dat += "    Change
    " + if(accessory.color_src == MATRIXED || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) + var/secondary_feature = "[mutant_part]_secondary" + dat += "Secondary Color
    " + dat += "    Change
    " + if(accessory.color_src == MATRIXED || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) + var/tertiary_feature = "[mutant_part]_tertiary" + dat += "Tertiary Color
    " + dat += "    Change
    " + mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) dat += "" @@ -2034,6 +2054,22 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_dors) features["xenodorsal"] = new_dors + //every single primary/secondary/tertiary colouring done at once + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary"."xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary"."frills_secondary","frills_tertiary","ipcantenna_primary","ipcantenna_secondary","ipcantenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiaty","spines_primary","spines_secondary","spines_tertiary") + var/the_feature = features[href_list["preference"]] + if(!the_feature) + features[href_list["preference"]] = "FFFFFF" + the_feature = "FFFFFF" + var/new_feature_color = input(user, "Choose your character's mutant part colour:", "Character Preference","#"+features[href_list["preference"]]) as color|null + if(new_feature_color) + var/temp_hsv = RGBtoHSV(new_feature_color) + if(new_feature_color == "#000000") + features[href_list["preference"]] = pref_species.default_color + else if(ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) + features[href_list["preference"]] = sanitize_hexcolor(new_feature_color, 6) + else + to_chat(user,"Invalid color. Your color is not bright enough.") + //Genital code if("cock_color") var/new_cockcolor = input(user, "Penis color:", "Character Preference","#"+features["cock_color"]) as color|null diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3bad31a919..1f3762f8ad 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 38 +#define SAVEFILE_VERSION_MAX 39 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,6 +226,29 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" + if(current_version < 39) //extreme changes to how things are coloured + for(var/feature in features) + var/feature_type = features[feature] + var/ref_list = GLOB.mutant_reference_list[feature_type] + if(ref_list) + message_admins("ref list found") + var/datum/sprite_accessory/accessory = ref_list[feature] + if(accessory) + var/primary_string = "[feature_type]_primary" + var/secondary_string = "[feature_type]_secondary]" + var/tertiary_string = "[feature_type]_tertiary]" + if(accessory.color_src == MATRIXED) + features[primary_string] = features["mcolor"] + features[secondary_string] = features["mcolor2"] + features[tertiary_string] = features["mcolor3"] + else if(accessory.color_src == MUTCOLORS) + features[primary_string] = features["mcolor"] + else if(accessory.color_src == MUTCOLORS2) + features[secondary_string] = features["mcolor2"] + else if(accessory.color_src == MUTCOLORS3) + features[tertiary_string] = features["mcolor3"] + + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index 4cb8d080ff..86b0d5bb00 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -63,6 +63,7 @@ var/list/relevant_layers //list of layers that this accessory uses. As of now only used in species.handle_mutant_bodyparts(), but that's where most sprite accessories are anyway. var/mutant_part_string //Also used in species.handle_mutant_bodyparts() to generate the overlay icon state. var/alpha_mask_state + var/matrixed_sections = MATRIX_NONE //if color_src is MATRIXED, how many sections does it have? 1-3 //Special / holdover traits for Citadel specific sprites. var/extra = FALSE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 5286acb33a..3fb73ce80e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -5,6 +5,7 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) + mutant_part_string = "bodymarkings" /datum/sprite_accessory/body_markings/none name = "None" @@ -21,6 +22,7 @@ icon_state = "guilmon" color_src = MATRIXED icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/body_markings/ltiger name = "Light Tiger Body" @@ -47,6 +49,8 @@ gender_specific = 0 icon = 'modular_citadel/icons/mob/mam_markings.dmi' recommended_species = list("mammal", "xeno", "slimeperson", "podweak") + mutant_part_string = "bodymarkings" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/mam_body_markings/none name = "None" @@ -54,6 +58,7 @@ ckeys_allowed = list("yousshouldnteverbeseeingthisyoumeme") icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' relevant_layers = null + matrixed_sections = 0 /datum/sprite_accessory/mam_body_markings/redpanda name = "Redpanda" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index cae1b2e482..d5db676b73 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -26,18 +26,21 @@ icon_state = "bear" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/human/bigwolf name = "Big Wolf" icon_state = "bigwolf" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/human/bigwolfinner name = "Big Wolf (ALT)" icon_state = "bigwolfinner" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED extra = TRUE extra_color_src = NONE @@ -46,12 +49,14 @@ icon_state = "bigwolfdark" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/human/bigwolfinnerdark name = "Dark Big Wolf (ALT)" icon_state = "bigwolfinnerdark" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED extra = TRUE extra_color_src = NONE @@ -59,6 +64,7 @@ name = "Bunny" icon_state = "bunny" color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/cat @@ -73,6 +79,7 @@ icon_state = "cow" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/human/curled name = "Curled Horn" @@ -84,6 +91,7 @@ name = "Dog, Floppy" icon_state = "lab" color_src = MATRIXED + matrixed_sections = MATRIX_RED icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/eevee @@ -91,12 +99,14 @@ icon_state = "eevee" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/human/elephant name = "Elephant" icon_state = "elephant" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/human/elf name = "Elf" @@ -109,17 +119,20 @@ icon_state = "fennec" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/fish name = "Fish" icon_state = "fish" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/fox name = "Fox" icon_state = "fox" color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/jellyfish @@ -132,17 +145,20 @@ icon_state = "murid" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/human/otie name = "Otusian" icon_state = "otie" color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/rabbit name = "Rabbit" icon_state = "rabbit" color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' /datum/sprite_accessory/ears/human/pede @@ -150,30 +166,35 @@ icon_state = "pede" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/human/sergal name = "Sergal" icon_state = "sergal" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/human/skunk name = "skunk" icon_state = "skunk" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/squirrel name = "Squirrel" icon_state = "squirrel" icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/wolf name = "Wolf" icon_state = "wolf" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_ears.dmi' + matrixed_sections = MATRIX_RED_BLUE /****************************************** *************** Furry Ears **************** @@ -197,38 +218,46 @@ /datum/sprite_accessory/ears/mam_ears/axolotl name = "Axolotl" icon_state = "axolotl" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/bat name = "Bat" icon_state = "bat" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/bear name = "Bear" icon_state = "bear" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/bigwolf name = "Big Wolf" icon_state = "bigwolf" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/mam_ears/bigwolfinner name = "Big Wolf (ALT)" icon_state = "bigwolfinner" extra = TRUE extra_color_src = NONE + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/bigwolfdark //alphabetical sort ignored here for ease-of-use name = "Dark Big Wolf" icon_state = "bigwolfdark" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/mam_ears/bigwolfinnerdark name = "Dark Big Wolf (ALT)" icon_state = "bigwolfinnerdark" extra = TRUE extra_color_src = NONE + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/bunny name = "Bunny" icon_state = "bunny" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/cat name = "Cat" @@ -241,10 +270,12 @@ /datum/sprite_accessory/ears/mam_ears/catbig name = "Cat, Big" icon_state = "catbig" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/cow name = "Cow" icon_state = "cow" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/curled name = "Curled Horn" @@ -259,6 +290,7 @@ /datum/sprite_accessory/ears/mam_ears/eevee name = "Eevee" icon_state = "eevee" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/elf name = "Elf" @@ -268,22 +300,27 @@ /datum/sprite_accessory/ears/mam_ears/elephant name = "Elephant" icon_state = "elephant" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/fennec name = "Fennec" icon_state = "fennec" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/mam_ears/fish name = "Fish" icon_state = "fish" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/fox name = "Fox" icon_state = "fox" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/husky name = "Husky" icon_state = "wolf" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/ears/mam_ears/jellyfish name = "Jellyfish" @@ -293,39 +330,49 @@ /datum/sprite_accessory/ears/mam_ears/kangaroo name = "kangaroo" icon_state = "kangaroo" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/lab name = "Dog, Long" icon_state = "lab" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/ears/mam_ears/murid name = "Murid" icon_state = "murid" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/otie name = "Otusian" icon_state = "otie" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/rabbit name = "Rabbit" icon_state = "rabbit" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/pede name = "Scolipede" icon_state = "pede" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/sergal name = "Sergal" icon_state = "sergal" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/skunk name = "skunk" icon_state = "skunk" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/squirrel name = "Squirrel" icon_state = "squirrel" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/ears/mam_ears/wolf name = "Wolf" icon_state = "wolf" + matrixed_sections = MATRIX_RED_BLUE diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index c7a59da028..1458694746 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -1,6 +1,7 @@ /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) + mutant_part_string = "frills" /datum/sprite_accessory/frills/is_not_visible(var/mob/living/carbon/human/H, var/tauric) var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index 6019245b80..1c434c9c2d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -132,6 +132,7 @@ color_src = MUTCOLORS2 relevant_layers = list(BODY_ADJ_LAYER) recommended_species = list("ipc") + mutant_part_string = "ipcantenna" /datum/sprite_accessory/antenna/none name = "None" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm index 6f7b955d8f..c525a13ef8 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/legs_and_taurs.dm @@ -29,6 +29,7 @@ var/taur_mode = NONE //Must be a single specific tauric suit variation bitflag. Don't do FLAG_1|FLAG_2 var/alt_taur_mode = NONE //Same as above. var/hide_legs = USE_QUADRUPED_CLIP_MASK + mutant_part_string = "taur" /datum/sprite_accessory/taur/is_not_visible(var/mob/living/carbon/human/H, var/tauric) return (!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))) @@ -67,6 +68,7 @@ name = "Cow (Spotted)" icon_state = "cow_spotted" color_src = MATRIXED + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/taur/deer name = "Deer" @@ -88,6 +90,7 @@ icon_state = "drake_old" color_src = MATRIXED extra = FALSE + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/taur/drider name = "Drider" @@ -114,17 +117,20 @@ icon_state = "horse" taur_mode = STYLE_HOOF_TAURIC alt_taur_mode = STYLE_PAW_TAURIC + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/taur/naga name = "Naga" icon_state = "naga" taur_mode = STYLE_SNEK_TAURIC hide_legs = USE_SNEK_CLIP_MASK + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/taur/otie name = "Otie" icon_state = "otie" taur_mode = STYLE_PAW_TAURIC + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/taur/pede name = "Scolipede" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 69016d2890..6c04e27783 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -7,11 +7,6 @@ var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD) return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.is_robotic_limb(FALSE)) -/datum/sprite_accessory/snout/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - /datum/sprite_accessory/snouts/round name = "Round" icon_state = "round" @@ -174,10 +169,12 @@ /datum/sprite_accessory/snouts/mam_snouts/bird name = "Beak" icon_state = "bird" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/snouts/mam_snouts/bigbeak name = "Big Beak" icon_state = "bigbeak" + matrixed_sections = MATRIX_BLUE /datum/sprite_accessory/snouts/mam_snouts/bug name = "Bug" @@ -191,52 +188,64 @@ icon_state = "elephant" extra = TRUE extra_color_src = MUTCOLORS3 + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/husky name = "Husky" icon_state = "husky" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/rhino name = "Horn" icon_state = "rhino" extra = TRUE - extra = MUTCOLORS3 + extra_color_src = MUTCOLORS3 + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/snouts/mam_snouts/rodent name = "Rodent" icon_state = "rodent" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/lcanid name = "Mammal, Long" icon_state = "lcanid" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/lcanidalt name = "Mammal, Long ALT" icon_state = "lcanidalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/scanid name = "Mammal, Short" icon_state = "scanid" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/scanidalt name = "Mammal, Short ALT" icon_state = "scanidalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/scanidalt2 name = "Mammal, Short ALT 2" icon_state = "scanidalt2" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/wolf name = "Mammal, Thick" icon_state = "wolf" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/wolfalt name = "Mammal, Thick ALT" icon_state = "wolfalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/otie name = "Otie" icon_state = "otie" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/round name = "Round" @@ -251,18 +260,22 @@ /datum/sprite_accessory/snouts/mam_snouts/pede name = "Scolipede" icon_state = "pede" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/sergal name = "Sergal" icon_state = "sergal" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/shark name = "Shark" icon_state = "shark" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/hshark name = "hShark" icon_state = "hshark" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/sharp name = "Sharp" @@ -279,18 +292,22 @@ icon_state = "skulldog" extra = TRUE extra_color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/toucan name = "Toucan" icon_state = "toucan" + matrixed_sections = MATRIX_RED_BLUE //one single pixel of red. one. /datum/sprite_accessory/snouts/mam_snouts/redpanda name = "WahCoon" icon_state = "wah" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/snouts/mam_snouts/redpandaalt name = "WahCoon ALT" icon_state = "wahalt" + matrixed_sections = MATRIX_RED_GREEN /****************************************** **************** Snouts ******************* @@ -299,10 +316,12 @@ /datum/sprite_accessory/snouts/mam_snouts/fbird name = "Beak (Top)" icon_state = "fbird" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/snouts/mam_snouts/fbigbeak name = "Big Beak (Top)" icon_state = "fbigbeak" + matrixed_sections = MATRIX_BLUE /datum/sprite_accessory/snouts/mam_snouts/fbug name = "Bug (Top)" @@ -316,52 +335,64 @@ icon_state = "felephant" extra = TRUE extra_color_src = MUTCOLORS3 + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/frhino name = "Horn (Top)" icon_state = "frhino" extra = TRUE extra = MUTCOLORS3 + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/snouts/mam_snouts/fhusky name = "Husky (Top)" icon_state = "fhusky" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/flcanid name = "Mammal, Long (Top)" icon_state = "flcanid" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/flcanidalt name = "Mammal, Long ALT (Top)" icon_state = "flcanidalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fscanid name = "Mammal, Short (Top)" icon_state = "fscanid" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fscanidalt name = "Mammal, Short ALT (Top)" icon_state = "fscanidalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fscanidalt2 name = "Mammal, Short ALT 2 (Top)" icon_state = "fscanidalt2" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/fwolf name = "Mammal, Thick (Top)" icon_state = "fwolf" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fwolfalt name = "Mammal, Thick ALT (Top)" icon_state = "fwolfalt" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fotie name = "Otie (Top)" icon_state = "fotie" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/frodent name = "Rodent (Top)" icon_state = "frodent" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/fround name = "Round (Top)" @@ -376,14 +407,17 @@ /datum/sprite_accessory/snouts/mam_snouts/fpede name = "Scolipede (Top)" icon_state = "fpede" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fsergal name = "Sergal (Top)" icon_state = "fsergal" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/fshark name = "Shark (Top)" icon_state = "fshark" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/snouts/mam_snouts/fsharp name = "Sharp (Top)" @@ -398,7 +432,14 @@ /datum/sprite_accessory/snouts/mam_snouts/ftoucan name = "Toucan (Top)" icon_state = "ftoucan" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/snouts/mam_snouts/fredpanda name = "WahCoon (Top)" icon_state = "fwah" + matrixed_sections = MATRIX_ALL + +/datum/sprite_accessory/snouts/mam_snouts/fredpanda/alt + name = "WahCoon ALT (Top)" + icon_state = "fwahalt" + matrixed_sections = MATRIX_RED_GREEN diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm index 5d7207c934..cf74963ce1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -1,6 +1,7 @@ /datum/sprite_accessory/spines icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER) + mutant_part_string = "spines" /datum/sprite_accessory/spines/is_not_visible(var/mob/living/carbon/human/H, var/tauric) return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index 9addd15dca..bc4d4dd00d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -11,35 +11,41 @@ color_src = MATRIXED name = "Synthetic Lizard - Snout Under" icon_state = "synthliz_under" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tert icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MATRIXED name = "Synthetic Lizard - Snout Tertiary" icon_state = "synthliz_tert" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tertunder icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi' color_src = MATRIXED name = "Synthetic Lizard - Snout Tertiary Under" icon_state = "synthliz_tertunder" + matrixed_sections = MATRIX_ALL //Synth body markings /datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecs icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs" icon_state = "synthlizpecs" + matrixed_sections = MATRIX_GREEN /datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs Light" icon_state = "synthlizpecslight" + matrixed_sections = MATRIX_GREEN_BLUE /datum/sprite_accessory/mam_body_markings/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Plates" icon_state = "synthlizscutes" + matrixed_sections = MATRIX_GREEN //Synth tails /datum/sprite_accessory/tails/mam_tails/synthliz @@ -81,6 +87,7 @@ color_src = MATRIXED name = "Synthetic Lizard - Horns Light" icon_state = "synth_hornslight" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/antenna/synthliz/synth_short icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' @@ -99,6 +106,7 @@ color_src = MATRIXED name = "Synthetic Lizard - Sharp Light" icon_state = "synth_sharplight" + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/antenna/synthliz/synthliz_thick icon = 'modular_citadel/icons/mob/synthliz_antennas.dmi' @@ -111,6 +119,7 @@ color_src = MATRIXED name = "Synthetic Lizard - Thick Light" icon_state = "synth_thicklight" + matrixed_sections = MATRIX_RED_BLUE //Synth Taurs (Ported from Virgo) /datum/sprite_accessory/taur/synthliz @@ -118,6 +127,7 @@ icon_state = "synthlizard" taur_mode = STYLE_PAW_TAURIC recommended_species = list("synthliz") + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/taur/synthliz/inv name = "Virgo - Synthetic Lizard (Inverted)" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index d9e2de1525..554549c0c3 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -8,7 +8,7 @@ /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tailwag" + mutant_part_string = "tail" //keep this the same, ALWAYS, this is incredibly important for colouring! relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /****************************************** @@ -34,12 +34,14 @@ icon_state = "axolotl" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/lizard/axolotl name = "Axolotl" icon_state = "axolotl" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/lizard/dtiger name = "Dark Tiger" @@ -54,12 +56,14 @@ icon_state = "guilmon" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/lizard/guilmon name = "Guilmon" icon_state = "guilmon" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/lizard/ltiger name = "Light Tiger" @@ -107,12 +111,14 @@ icon_state = "axolotl" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/axolotl name = "Axolotl" icon_state = "axolotl" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/batl name = "Bat (Long)" @@ -139,12 +145,14 @@ icon_state = "bee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/bee name = "Bee" icon_state = "bee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/cat name = "Cat" @@ -163,24 +171,28 @@ icon_state = "catbig" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/catbig name = "Cat, Big" icon_state = "catbig" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/twocat name = "Cat, Double" icon_state = "twocat" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/twocat name = "Cat, Double" icon_state = "twocat" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/corvid name = "Corvid" @@ -195,12 +207,14 @@ icon_state = "cow" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/cow name = "Cow" icon_state = "cow" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/dtiger name = "Dark Tiger" @@ -538,7 +552,7 @@ /datum/sprite_accessory/tails_animated/mam_tails_animated color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - mutant_part_string = "tailwag" + mutant_part_string = "tail" //KEEP IT THE SAME relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 126d4401e0..2ec5b84cb9 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -775,6 +775,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) + var/primary_string = "[S.mutant_part_string]_primary" + var/secondary_string = "[S.mutant_part_string]_secondary" + var/tertiary_string = "[S.mutant_part_string]_tertiary" + if(!husk) if(!forced_colour) switch(S.color_src) @@ -784,20 +788,27 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(fixed_mut_color) accessory_overlay.color = "#[fixed_mut_color]" else - accessory_overlay.color = "#[H.dna.features["mcolor"]]" + accessory_overlay.color = "#[H.dna.features[primary_string]]" if(MUTCOLORS2) if(fixed_mut_color2) accessory_overlay.color = "#[fixed_mut_color2]" else - accessory_overlay.color = "#[H.dna.features["mcolor2"]]" + accessory_overlay.color = "#[H.dna.features[primary_string]]" if(MUTCOLORS3) if(fixed_mut_color3) accessory_overlay.color = "#[fixed_mut_color3]" else - accessory_overlay.color = "#[H.dna.features["mcolor3"]]" + accessory_overlay.color = "#[H.dna.features[primary_string]]" if(MATRIXED) - accessory_overlay.color = list(colorlist) + var/list/accessory_colorlist = list() + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[primary_string]]00") + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[secondary_string]]00") + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[tertiary_string]]00") + accessory_colorlist += husk ? list(0, 0, 0) : list(0, 0, 0, hair_alpha) + for(var/index in 1 to accessory_colorlist.len) + accessory_colorlist[index] /= 255 + accessory_overlay.color = list(accessory_colorlist) if(HAIR) if(hair_color == "mutcolor") @@ -820,7 +831,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(bodypart == "tail") accessory_overlay.icon_state = "m_tail_husk_[layertext]" if(S.color_src == MATRIXED) - accessory_overlay.color = colorlist + var/list/accessory_colorlist = list() + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[primary_string]]00") + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[secondary_string]]00") + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[tertiary_string]]00") + accessory_colorlist += husk ? list(0, 0, 0) : list(0, 0, 0, hair_alpha) + for(var/index in 1 to accessory_colorlist.len) + accessory_colorlist[index] /= 255 + accessory_overlay.color = list(accessory_colorlist) if(OFFSET_MUTPARTS in H.dna.species.offset_features) accessory_overlay.pixel_x += H.dna.species.offset_features[OFFSET_MUTPARTS][1] @@ -837,23 +855,22 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(S.center) extra_accessory_overlay = center_image(extra_accessory_overlay, S.dimension_x, S.dimension_y) - switch(S.extra_color_src) //change the color of the extra overlay if(MUTCOLORS) if(fixed_mut_color) extra_accessory_overlay.color = "#[fixed_mut_color]" else - extra_accessory_overlay.color = "#[H.dna.features["mcolor"]]" + extra_accessory_overlay.color = "#[H.dna.features[secondary_string]]" if(MUTCOLORS2) if(fixed_mut_color2) extra_accessory_overlay.color = "#[fixed_mut_color2]" else - extra_accessory_overlay.color = "#[H.dna.features["mcolor2"]]" + extra_accessory_overlay.color = "#[H.dna.features[secondary_string]]" if(MUTCOLORS3) if(fixed_mut_color3) extra_accessory_overlay.color = "#[fixed_mut_color3]" else - extra_accessory_overlay.color = "#[H.dna.features["mcolor3"]]" + extra_accessory_overlay.color = "#[H.dna.features[secondary_string]]" if(HAIR) if(hair_color == "mutcolor") extra_accessory_overlay.color = "#[H.dna.features["mcolor3"]]" @@ -889,17 +906,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(fixed_mut_color) extra2_accessory_overlay.color = "#[fixed_mut_color]" else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]" + extra2_accessory_overlay.color = "#[H.dna.features[tertiary_string]]" if(MUTCOLORS2) if(fixed_mut_color2) extra2_accessory_overlay.color = "#[fixed_mut_color2]" else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor2"]]" + extra2_accessory_overlay.color = "#[H.dna.features[tertiary_string]]" if(MUTCOLORS3) if(fixed_mut_color3) extra2_accessory_overlay.color = "#[fixed_mut_color3]" else - extra2_accessory_overlay.color = "#[H.dna.features["mcolor3"]]" + extra2_accessory_overlay.color = "#[H.dna.features[tertiary_string]]" if(HAIR) if(hair_color == "mutcolor3") extra2_accessory_overlay.color = "#[H.dna.features["mcolor"]]" @@ -916,7 +933,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += extra2_accessory_overlay - H.overlays_standing[layernum] = standing H.apply_overlay(BODY_BEHIND_LAYER) From 4f5465c39ed59e11a0f0c59e6eaaf1e8f1e54ee6 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 17 Oct 2020 01:00:04 +0100 Subject: [PATCH 15/62] fixes --- code/__DEFINES/citadel_defines.dm | 2 +- code/modules/client/preferences.dm | 25 +++- code/modules/client/preferences_savefile.dm | 16 ++- .../new_player/sprite_accessories/tails.dm | 132 +++++++++++++++--- icons/mob/mutant_bodyparts.dmi | Bin 34380 -> 34374 bytes 5 files changed, 148 insertions(+), 27 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 107e182f8d..89e44fc215 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -121,6 +121,6 @@ #define MATRIX_BLUE "blue" #define MATRIX_RED_GREEN "red_green" #define MATRIX_RED_BLUE "red_blue" -#define MATRIX_BLUE_GREEN "blue_green" +#define MATRIX_GREEN_BLUE "green_blue" #define MATRIX_ALL "red_green_blue" #define MATRIX_NONE "none" \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 7832c79e18..2dfcde2949 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -561,14 +561,29 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/primary_feature = "[mutant_part]_primary" + var/secondary_feature = "[mutant_part]_secondary" + var/tertiary_feature = "[mutant_part]_tertiary" + var/matrixed_sections = accessory.matrixed_sections + if(accessory.color_src == MATRIXED && !matrixed_sections) + message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + else if(accessory.color_src == MATRIXED) + switch(matrixed_sections) + if(MATRIX_GREEN) //only composed of a green section + primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section + if(MATRIX_BLUE) + primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section + if(MATRIX_RED_BLUE) //composed of a red and blue section + secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary + if(MATRIX_GREEN_BLUE) //composed of a green and blue section + primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary + secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary dat += "Primary Color
    " dat += "    Change
    " - if(accessory.color_src == MATRIXED || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) - var/secondary_feature = "[mutant_part]_secondary" + if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) dat += "Secondary Color
    " dat += "    Change
    " - if(accessory.color_src == MATRIXED || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) - var/tertiary_feature = "[mutant_part]_tertiary" + if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) dat += "Tertiary Color
    " dat += "    Change
    " @@ -2055,7 +2070,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary"."xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary"."frills_secondary","frills_tertiary","ipcantenna_primary","ipcantenna_secondary","ipcantenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiaty","spines_primary","spines_secondary","spines_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipcantenna_primary","ipcantenna_secondary","ipcantenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiaty","spines_primary","spines_secondary","spines_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 1f3762f8ad..4097bad5eb 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -228,6 +228,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(current_version < 39) //extreme changes to how things are coloured for(var/feature in features) + message_admins("[feature]") var/feature_type = features[feature] var/ref_list = GLOB.mutant_reference_list[feature_type] if(ref_list) @@ -237,6 +238,20 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/primary_string = "[feature_type]_primary" var/secondary_string = "[feature_type]_secondary]" var/tertiary_string = "[feature_type]_tertiary]" + if(accessory.matrixed_sections) + switch(accessory.matrixed_sections) + if(MATRIX_GREEN) //only composed of a green section + primary_string = secondary_string //swap primary for secondary, so it properly assigns the second colour, reserved for the green section + if(MATRIX_BLUE) + primary_string = tertiary_string //same as above, but the tertiary feature is for the blue section + if(MATRIX_RED_BLUE) //composed of a red and blue section + secondary_string = tertiary_string //swap secondary for tertiary, as blue should always be tertiary + if(MATRIX_GREEN_BLUE) //composed of a green and blue section + primary_string = secondary_string //swap primary for secondary, as first option is green, which is linked to the secondary + secondary_string = tertiary_string //swap secondary for tertiary, as second option is blue, which is linked to the tertiary + else if(accessory.color_src != MATRIXED) + message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue if(accessory.color_src == MATRIXED) features[primary_string] = features["mcolor"] features[secondary_string] = features["mcolor2"] @@ -248,7 +263,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else if(accessory.color_src == MUTCOLORS3) features[tertiary_string] = features["mcolor3"] - /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 554549c0c3..b3a89d9115 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -120,26 +120,6 @@ color_src = MATRIXED matrixed_sections = MATRIX_RED -/datum/sprite_accessory/tails/mam_tails/batl - name = "Bat (Long)" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - icon_state = "batl" - -/datum/sprite_accessory/tails_animated/mam_tails_animated/batl - name = "Bat (Long)" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - icon_state = "batl" - -/datum/sprite_accessory/tails/mam_tails/bats - name = "Bat (Short)" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - icon_state = "bats" - -/datum/sprite_accessory/tails_animated/mam_tails_animated/bats - name = "Bat (Short)" - icon = 'modular_citadel/icons/mob/mam_tails.dmi' - icon_state = "bats" - /datum/sprite_accessory/tails/human/bee name = "Bee" icon_state = "bee" @@ -229,60 +209,70 @@ icon_state = "datashark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/tails_animated/human/datashark name = "datashark" icon_state = "datashark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_BLUE /datum/sprite_accessory/tails/human/eevee name = "Eevee" icon_state = "eevee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/eevee name = "Eevee" icon_state = "eevee" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/fennec name = "Fennec" icon_state = "fennec" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/fennec name = "Fennec" icon_state = "fennec" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/fish name = "Fish" icon_state = "fish" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/fish name = "Fish" icon_state = "fish" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/fox name = "Fox" icon_state = "fox" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/fox name = "Fox" icon_state = "fox" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/horse name = "Horse" @@ -301,36 +291,42 @@ icon_state = "husky" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/husky name = "Husky" icon_state = "husky" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/insect name = "Insect" icon_state = "insect" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/insect name = "Insect" icon_state = "insect" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/kitsune name = "Kitsune" icon_state = "kitsune" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/kitsune name = "Kitsune" icon_state = "kitsune" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/ltiger name = "Light Tiger" @@ -345,108 +341,126 @@ icon_state = "murid" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_GREEN /datum/sprite_accessory/tails_animated/human/murid name = "Murid" icon_state = "murid" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_GREEN /datum/sprite_accessory/tails/orca name = "Orca" icon_state = "orca" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/orca name = "Orca" icon_state = "orca" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/otie name = "Otusian" icon_state = "otie" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/otie name = "Otusian" icon_state = "otie" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/rabbit name = "Rabbit" icon_state = "rabbit" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/rabbit name = "Rabbit" icon_state = "rabbit" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/ailurus name = "Red Panda" icon_state = "wah" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/ailurus name = "Red Panda" icon_state = "wah" icon = 'modular_citadel/icons/mob/mam_tails.dmi' color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/pede name = "Scolipede" icon_state = "pede" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/pede name = "Scolipede" icon_state = "pede" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/sergal name = "Sergal" icon_state = "sergal" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/sergal name = "Sergal" icon_state = "sergal" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/shark name = "Shark" icon_state = "shark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/shark name = "Shark" icon_state = "shark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/skunk name = "skunk" icon_state = "skunk" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails_animated/human/skunk name = "skunk" icon_state = "skunk" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails/human/smooth name = "Smooth" @@ -477,60 +491,70 @@ icon_state = "squirrel" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/squirrel name = "Squirrel" icon_state = "squirrel" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/tamamo_kitsune name = "Tamamo Kitsune Tails" //Tamamo-no-Tiro, let it be known! icon_state = "9sune" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/human/tamamo_kitsune name = "Tamamo Kitsune Tails" icon_state = "9sune" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/human/tentacle name = "Tentacle" icon_state = "tentacle" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/tentacle name = "Tentacle" icon_state = "tentacle" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/human/tiger name = "Tiger" icon_state = "tiger" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails_animated/human/tiger name = "Tiger" icon_state = "tiger" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails/human/wolf name = "Wolf" icon_state = "wolf" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/wolf name = "Wolf" icon_state = "wolf" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED /****************************************** ************** Furry Tails **************** @@ -566,34 +590,42 @@ /datum/sprite_accessory/tails/mam_tails/axolotl name = "Axolotl" icon_state = "axolotl" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/axolotl name = "Axolotl" icon_state = "axolotl" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/batl name = "Bat (Long)" icon_state = "batl" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/batl name = "Bat (Long)" icon_state = "batl" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/bats name = "Bat (Short)" icon_state = "bats" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/bats name = "Bat (Short)" icon_state = "bats" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/bee name = "Bee" icon_state = "bee" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/bee name = "Bee" icon_state = "bee" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/cat name = "Cat" @@ -608,34 +640,42 @@ /datum/sprite_accessory/tails/mam_tails/catbig name = "Cat, Big" icon_state = "catbig" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/catbig name = "Cat, Big" icon_state = "catbig" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/twocat name = "Cat, Double" icon_state = "twocat" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/twocat name = "Cat, Double" icon_state = "twocat" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/corvid name = "Corvid" icon_state = "crow" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/corvid name = "Corvid" icon_state = "crow" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tail/cow name = "Cow" icon_state = "cow" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/cow name = "Cow" icon_state = "cow" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/dtiger name = "Dark Tiger" @@ -652,42 +692,52 @@ /datum/sprite_accessory/tails/mam_tails/eevee name = "Eevee" icon_state = "eevee" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/eevee name = "Eevee" icon_state = "eevee" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/fennec name = "Fennec" icon_state = "fennec" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/fennec name = "Fennec" icon_state = "fennec" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/human/fish name = "Fish" icon_state = "fish" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/human/fish name = "Fish" icon_state = "fish" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/fox name = "Fox" icon_state = "fox" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/fox name = "Fox" icon_state = "fox" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/hawk name = "Hawk" icon_state = "hawk" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/hawk name = "Hawk" icon_state = "hawk" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/horse name = "Horse" @@ -702,42 +752,52 @@ /datum/sprite_accessory/tails/mam_tails/husky name = "Husky" icon_state = "husky" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/husky name = "Husky" icon_state = "husky" + matrixed_sections = MATRIX_RED_GREEN datum/sprite_accessory/tails/mam_tails/insect name = "Insect" icon_state = "insect" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/insect name = "Insect" icon_state = "insect" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/kangaroo name = "kangaroo" icon_state = "kangaroo" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/kangaroo name = "kangaroo" icon_state = "kangaroo" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/kitsune name = "Kitsune" icon_state = "kitsune" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/kitsune name = "Kitsune" icon_state = "kitsune" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/lab name = "Lab" icon_state = "lab" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/lab name = "Lab" icon_state = "lab" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/ltiger name = "Light Tiger" @@ -754,84 +814,104 @@ datum/sprite_accessory/tails/mam_tails/insect /datum/sprite_accessory/tails/mam_tails/murid name = "Murid" icon_state = "murid" + matrixed_sections = MATRIX_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/murid name = "Murid" icon_state = "murid" + matrixed_sections = MATRIX_GREEN /datum/sprite_accessory/tails/mam_tails/orca name = "Orca" icon_state = "orca" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/orca name = "Orca" icon_state = "orca" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/otie name = "Otusian" icon_state = "otie" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/otie name = "Otusian" icon_state = "otie" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/rabbit name = "Rabbit" icon_state = "rabbit" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/rabbit name = "Rabbit" icon_state = "rabbit" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/ailurus name = "Red Panda" icon_state = "wah" extra = TRUE + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus name = "Red Panda" icon_state = "wah" extra = TRUE + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/pede name = "Scolipede" icon_state = "pede" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/pede name = "Scolipede" icon_state = "pede" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/sergal name = "Sergal" icon_state = "sergal" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/sergal name = "Sergal" icon_state = "sergal" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/shark name = "Shark" icon_state = "shark" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/shark name = "Shark" icon_state = "shark" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/shepherd name = "Shepherd" icon_state = "shepherd" + matrixed_sections = MATRIX_GREEN_BLUE /datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd name = "Shepherd" icon_state = "shepherd" + matrixed_sections = MATRIX_GREEN_BLUE /datum/sprite_accessory/tails/mam_tails/skunk name = "Skunk" icon_state = "skunk" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails_animated/mam_tails_animated/skunk name = "Skunk" icon_state = "skunk" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails/mam_tails/smooth name = "Smooth" @@ -860,47 +940,59 @@ datum/sprite_accessory/tails/mam_tails/insect /datum/sprite_accessory/tails/mam_tails/straighttail name = "Straight Tail" icon_state = "straighttail" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/straighttail name = "Straight Tail" icon_state = "straighttail" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/squirrel name = "Squirrel" icon_state = "squirrel" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/squirrel name = "Squirrel" icon_state = "squirrel" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/tamamo_kitsune name = "Tamamo Kitsune Tails" icon_state = "9sune" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails_animated/mam_tails_animated/tamamo_kitsune name = "Tamamo Kitsune Tails" icon_state = "9sune" + matrixed_sections = MATRIX_RED_GREEN /datum/sprite_accessory/tails/mam_tails/tentacle name = "Tentacle" icon_state = "tentacle" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/tentacle name = "Tentacle" icon_state = "tentacle" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails/mam_tails/tiger name = "Tiger" icon_state = "tiger" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails_animated/mam_tails_animated/tiger name = "Tiger" icon_state = "tiger" + matrixed_sections = MATRIX_ALL /datum/sprite_accessory/tails/mam_tails/wolf name = "Wolf" icon_state = "wolf" + matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/wolf name = "Wolf" icon_state = "wolf" + matrixed_sections = MATRIX_RED diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index 1334ce9e0e8e546373d183919d8612d069f276b8..8d34fb8dc3e6240b5586a2660199e7daa3c5acda 100644 GIT binary patch delta 12441 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 delta 12360 zcmaL72Ut_t_C9<9jEIVeIHI&DD99+qLX#2{5v8iAC>;@LQcR>nPV5B*F^p7+g{BCI zNEd=_0FfdsK!6}sT7Uq7kaGSzpmS&L_xrBTgZq?ycJ|qOt#`faUFWZR0$=Y5JlM8T zF7)J?%ZJ=>u2@h1%btF|5EPtT9v`z`4ZfKyFfbhxD`Q%5lF~exU-E~aJIgQCp|D$C<;|G=7&5?|IL2Ny8@SEKFJ6-Eyq_^D7c5sa?^c9{ywEEx~1unaLprHNR zEm-x`H>jYM!Vp$Sl0EQrrr`GN6`292lRnYg#CO#D-<}kyo}Lc#5n!D$roLU9l~l%N zSsk_vs}?dnc%dWaqwPxZeFp{J1s*wgB&bc}{a$5!q|N!qy0h^`4sx3%ZkK&zuGG7% z&XBv4J-5SbNV&=R8VB=8;l#Gf@4fSCf6Els`YNZ_-(oZC1|xF{gC?OVxh z+UPlzZMWq`Ht)WQ?r$XDun$^HwvMn2vMFz!oT(s*3EhghJo;ksbU>@M)v0; z8c@n1V)6L)qb3rnuzJ$OG z0u9feh!ioTD?4YiCNCfy*37f~$qBk(0}0bm2#a-nEhS6aG#gCSI`Ob!GsV&VScmM> zMFzrnR;|;81c6D*WG|}lqHdiZnH#uBFPm%63g)=gs?CqIzJ2 zyNlSHm{D04v`N8@Ha35S;uxkv-JqSeIDduTachPtcb37Or!_p{(%;-ve6O75PxYbD zhdojo2$=ySuOO-T6Q*DRVEB^676z}1>uY({d)#QhwiU7+p(rksP+y9&8$l?b7dFivyty~syhVUmP`#@4tV!wVP9=*V* zRdX`G>I8G=rr00o`!v!vu`7M=A5U*{of{q#!*HfPADWsdqTzRoMwKF$$Vo)!grcXw z7J$j9ExzT!n4!sJJ(T506-_4lyCs$Wz6t3%K;xvw9@M~;E&Bb@6QTB&yqDCpFQIi- zb&9@CArxkocSmeV)3fsK3SYk^t(_#S%yoJEteex`YISv}cxOeJIc-)6W+*AAZ3smA)s0F_ zFo=JA_oSD0AzJ?hiZ0oSAPSStLEK~u6{YAd*ReDG701k& z9W`_jzwrImM811NA=sdg7lT}O+~QCbk-{3Xg9F89kfzGAzN({CS>gc`1WQZ$TVE?+ zwOK_LJRc&aEJZ&|5xH4I!o_wrpo}QYDdj z;0dHT2iUy*_Xt`uBs>G$&4;|u7b%IpT86L_OwS#T;FVP@^sQ!T^F5gsZDlo}%j>Xvro)lNG|}1-hcTl^=}w*#+jqgMZo#&>rv+RzGyMdNy|} z_XbP~Gd;?LH)NCA0v(DTdtto=zN(~G`i$ZbKE%a2;S(y@bY1Hwhr!Q|U0{+Tm{a_Xa4xmXJ! zDIsG6LR~0!LbmVN<5x@Hmg$Fgb1Le#YFOZTk{S%yyV3@VbHCAl!y|`CT{B^fdR_PO zE5QLF%FTP5ARFiTkIlEvOP}wNODJ;xQC~DZ7C=cgqR;7^f3tl)d|#zc^Rk&v{fy{we=x`@2k%?QAU@(=$#*$^k;nQ^4#0NTr849Zs(g#~ z?=0HJr++y_*4EbID8RI#4!01Y{hba3>$;MZm_kqD75fcD2OC)dT|?q~4|$2I2gvIq z1&Kc$q*uHPB}H^RFGGA_|C_}Ao19z5FI$E9KBO2AMfa|4BwE^RC6aA~)f6ki*!#BD z3KjnzL%*!9zw8Pyb%3VHKb&^+CfK#>oX%=J7d3dO>k)CxO#wFJv5jAJC^RYrfV~Rl2u&dODO?GAABJEKkFXf2jY)f?(Hq0Gs0tUoYFi zK9s{f_J(XHI`%qxT+F(;bo?RW;$<7>z`&SWj5T?WEIt}L?<6MCD^gHgUtR9@226{( zogG+HVS&w!7MZ$^eT5q+%ZTyD-0Ye>-CWwWFMz4xm(|%;cL`2TY*V4kSy)hiq}#S- zfA+Q;aD2W?)L#XCIU^CvRY03v29Mq7y4Ctt)o1`8-`VE#rHf5IMb+$V&9$2yyOumx z^Z-8jZQjmOVLp_#IrX02o^OgJMJ7YXFjXO8=X(@OC{}!IGnC-0B|dfC4#03Lyr~rm z0;~D*!TPwMyDK#WAn2{frI3&ix)j)-EoJHwy+;6vE#P1O@M|O8*S$Cmw)AxTuU%gw z-?|C_l)nS3DC7NDc8%Q94cSi(x@d&fnmyb5g1PgOg}Yj%oz1IW#UJ8Gg0`4h%fSo|onIbeZ3>jcNol~Ayqy38A1*CI(WRZ7f;Gq$)7=*}3nTiw zgisJ+nyFbSMVtAy(3G$C;Gy&us1lze5!Em23`R=ypDi*3Fm8Bg3HTGA@PF_LagCiU zQOr&X{0Z;ZJ^=6}acLbajd?}J|EIU)d>$MeEb)d`x|i7dY9-Y@D|Ea6JJIR9)EW)c z3hnowKO6s9E47n2ZHE>NBHSY8*+>gp5KxxAYo~ziORvllQLhx~LdgLqkzT=n;)*U& z+d+D1;OSBMS~qii;c{_R-Fm9o9Wa2sj(w1hK3;!tUG&FoJn@gc(DQsCMv z%GlXQ5+hMwrpi8=NuRMLT`6TzT|-~UW2OGAAO|JnPBqz_fmTF3YcS|&L&4k)|Ia}NSdSb;9)7{<%kH#lAmN1RJ&UK(K=^lQ?I>Vr;nbs**LQ1yTr#mtp!{Qk) z#JvrS>B@$0%aHOT)&%Pso^QdVAQ&PoruYTC>Ikp@5O>XO?06C+crSLw*Z-3;?o*=G zpE!r-j!?#iGNuuDK;zX%gAz=?S9>7;CpoasPUC0s0RcdhOtwyGlETf{h34v6?{|vbq}CwK>Vd#dD#L<+aG=brK$m+PZ#pf&T6eP^ST}(vJooR=* z4%u$FAYdNy)8>HxJeTU73)Md*8#G#~+9Ep#M*dOi8%E!cB_ir9D>I(kL*(^ohA<)X zu)aVym}7yh8(IC%!jZF|5~DRtcrit;1D%uo?PMp=?6u)RkoC?`0T{fE=BV)iScYA3 zwLW!3f(|1(J|cJMXrp~IxjMSza1K|scJRc^YUui@Ss`t&nX;^#0h`VVw5WCznK2>5 z%bzU?&#jQq0!!3zB6MP7GdZw^r{|>y`^&JQ%D0aD=P;Z&v4LHZMzw=`s5FCHtzHEn zVM*Q__GSCLrV1QaJ3-c~S7C3SYYxk9&5``1lSAjbNueJSJ^40a#=`7<oH%p1su8FsR1V8e>GW>EiQE@Nxm)oW%8I5YlYd;jgwE) zR;%6Y5RRwPKl1=6TtD2Gep`d|hdVO{Q!C$+gIe)qm5M{~?pHKnd3(a~xbC2X8J&nc zy-M6$&Ut4QyE3N1UEGTT3ATDnf2#Fi3hw*x)hCFQW+Mmjf~$&)i&v6gt&`|&LPu;`pEq>Exa*O)x9X`+KAZp7iEEt( z|5eHybFK3wdOaH2ieArTY(pXjFev{a1J7@DEJ=(*9ZkGiU(!h)`q%HVTO8 zc6MP6DR!ts46FM5hlsyu&~dLbw;~3XNGVCjk`Pk_5K!#<0@;brCOMNJ%&pnYE#t%D zbJq4W^!&9!Y(fC0LB~^$yZsDZsKAT~B0iv|ONck|P~QkkmjtM1{UuB(6TYeI!4If! z_&oHD8SmB$Plv!7L|r4>tijmdE^ywZqsW*!+zL>3J~rSLo_q!bg%=G$ASHb+-5bkz z-0Q8~4(3-@&BHH+NJ*xKPkv%sT3p$SEYBpsIh9*G8gWG)KoqHi z_w`sMDJco7$wj7kk!o0BABp=a%aj&goGwil%t;R@@f?jTODsC&Gxn(eLq(y_+pP3} zT2`@j6xr@-_1J|~Er6oBXHNgg4VTxfD92+G-iX(;Ql__w`uokFolrg?wl^I?}-IiTTsXdgIFe~l>++oL`M1spsVx!|qBFS19Ht$?w!i>pFcK`oQ_<#7P z59z3MF9;^Li^VN9=1V~yxwI~EA!}H}PAQz)t;pB_2@YYX-QwgDVcuX3S>|upu0eh* zxn$D0Ybz7KB#&+OOgc<_V7GyoVzYwibAF9@9b@ejpp;Py0w$SnvHywZs!?tZ3{^fQ5@Iv`Pl8=BrBY)I7Va&2Bw0v!V&0t^O zxk9m9xQBm-?q4B%sb!rH6E41?7@XtY&DJ$Mo{|-Zyd7{-WQh^^t>mu*&_>3RMW$BL zA<@Xo!o*-tStW3|)af66ex3h!UzPva7k(t-Z>s$1OSA^XApry>Vx#Xy;Bo7=?9g!c zBmf3}uEhT4f^6pQA&%_p9YOGk#ofpbvY_ToqKfAxxK^Q2nY+n0whVF|aBL`%%dg%F zQowjubo4t>1q%Lli9x@-Z`ExLG(WjqCcWqCs<1q=-A|Hoy)$25Kz4BZk34Lyduklb z?=HwJPiLKKQ<8nw%_>uFdR%EeV8ATPp&r)0vu1=O@DR~HjuG_2Fs-p18l1-LhfC}) z_z|ATvC9)Nf!oL~7tmZf+_0f{UrYvEo|r)>Q6fYk zFt%K})ex;!9qAjM`Os3VuxqEgN{LGG*A_g8C{wpkr_( z`eVymRs9ZhMtXqPbmztr6YLMG-EIkxRmiQ2^YvyU{P<_pnEtAKpsX58wzC++Hn&*! z;*l4F=XR%IUYXTYO(|o|3EuIX9{416oA$8K>qmef<1DUPKnaZe!}Q%CO)-Xj0x1;_ z(oiXVSBq%VAk&xc6nRRXQU82p6RY-9dS*lrCjLq4s{sQrsm<6+mtxYru6p;JF36^~ zXe~TTnOuA6$8SeR7HbZwir3>Z5?#B~d#VDXYZLtj+Roo?kSd{kuZY;XovP3neE!)f ztY7rkr}(HDX7xLeh?ACNJ;n3vjY~Li=U+H*-J1Y5^Ish7e}(0rh_HK3Q?33b34%5Kb)-*7^U2>E|~=kti-s38|_b#FlkjywI_A7-dg%v6BHB z$=bDPCZq>lH3^n3^ zwbr7nTk%jXW$akcDOFX~3sjwY&m439O55_ble6~xUWKSv{nMeBeHA-|?vw51tu>4t z9*wIVEWDw36;-T2tnrlvFdz!I zK7iwCs3`2bQd+ELQr(A1f`xmIu7!2SMa{@TtTJ*(n^(IHabb`iasF;k8u64c{N$wY zMwv{PPZW1cU&Y3}A!`5;9$J_{;~eff+<1RXkqZdWyD9GWpC&df6Vv|yg+?-Bl?bWD z5#9VYz;pLz2PL)mkCjAoJ%V_CFC*4JV7E^Kp?U7$n_ro6Cb!+HW*Uy`j7D@qD|Mo{ z&y^~(%?q_H>$&oM27vln586{Ql`3P;QSduDXxTuus%l2_RVwBS7lByozuAI%>Z390 zHN{Hqu@@&n~R$$DdpBd|!sFkDrl| z3|XXPg{+DX6Zo;9W@BLm(K?`c^ucfVTYt`ska-bb#CW&aj-L{%zD&0wF@D>CJ*;x& z#cjoH8H8MoN-3xGJs>R~k>7J7TgNs+s17L9K`dbV)2mADQc-j zND8%_`KkbwxL8w+<1?LPik8N_v^XW3nL)7PZQe#GYhf6R$e7S4Vsu&>F7>1&?gfk= zXjs>Y%k_e1-yp%Q#`w6q)Bh1$sOi--g+{|81rc^Ts$%}uDt(gH$-}>-uO)rWoJg=n z!yi&bU!&9Oa|e9vu|5SmLZsvDr6DMF-zC9!py;6DAk>`? zjSa+L>^Ar&2# z$qn`_u>Q?8%$1i-17J{f3P<+7tS+FrmDqdXQP7qruOxbH6L^3GL(n>#HW7adkSVJI zslc?NH$&qMCbxUSD#{lmN>d)1=tJ0^=eX4(9It98L7Dc@ za)Tg|d?}$$v zzkmIR44VcxBAz=(8L3qxhv#+Wj1`W}?XNpk3obj_+uO5m5I_;c2W=3pZ6~_@0hu$1 zD6krezADe~P1+=6_Q$ut`Gebvc$V-B$%HiE2`nd@&%x5@y^5*i}8I z$k`7&0(Mv)0Q%<(+$vBlFnw&DxfKR4?jNgzz9Jnun|(+{f0Z&q9U%FgB|g7=5amW3 zy1Y$Aw-Ty6K7<$Em4?n(n^qy*PDbKRNYjLN^7(JjS>+n?HjM$GF+ehI^(I8EfGw*q z0+Qc9VDme6=@DH5Hm-jJmWDafoRPoFdzBT*z^6~2cqc&hw{pRa-@g&x1;_{skMr58 z8<7?urPzb2eXmPseh4QFV9a^VjJ4`eqs$~!$S!`loru- zj*(Ng&!zMbodY*2nXCfDQNHQ7FrjY@Ops{7owpVWty0E0J}-eR9QCH-;zpeLet84p z<3MS6yq}>)u_s;9@l*67pa{?FETG0}^$+s|pVSe|2+9iSN1;GrB8Z ztHG9hEfw7h#UM@-SlYWicNo6W1A7y`*4BJsrH^tIR5 z#RfVje215uOK2N1^Wblc9-i(bk@F%Z8fe8h?pjum7cM8j*T;^EFtkTxd!N!4!hn}B zzkj@y9}y8CQa{ah1PjUrh3pJ9n9N~(#sW&1LmBHREa$-6U{)<+!XWu2Fx0Mbs)o^n z;y=g>b$*3T++pP53DXf4!X9sfo3-R}c|}MfZ`cV5kf<^w*CXu6hUUo%1m6~bXT85R zK}JU4Bg&$~$CKD?^T}rqX^zA>&jrcb>4+GF&U%!E$$!b7ov?%dcGZ9REjS4>jW{mV ztK<|>z(q8ZVo#XzCxFcs2?4L!Ua?5yd7CPyVQf{KTeEUECN#u4vS+jk`IE3VRpwS9 zJes@TBGRWt?%?Gjv!oN?BAdj!HJa3mu3%kYPx5B1tW7;%E5DBbll1|2Nie5s){i$q z&JMLR_hk58p`)+eS@^TPDsd)@{QM$?_&r1dK0ca!mE)&dSieKm-xQ|iE#Qc>Bunn<&GrY(!9~gqEiMup8 zT*&Lkw~X~Q7}}cwr;RL{A`)Kv5I#EqQ}b9RUWD)V_=TaQiLLi1o+5G>DK4zis8xVv zBvC;G(hFah>T>Hc6bd7`V!xw z@O)F~>+5?(j@HU>LKZ3cDp|mtK^h)9`{Q^X^)!!FP1a+OEq}H-1)MAGiV?!aFrttK zW63Z4O>tzw*rw>9$7T^?M|dG|e?H`x$^Qoi8Dx4ar(AGNa&4+aFYj8(4Wg6jjDbL_ zU-JnoymAdji4|wU7x2(aZNVeVI_khA{slYX{#W-P%x zH`e-BzXRjfoR+Kpr3V1t*kAjGNC=a)3B-E54=uM8#|u1F;?wM3OF|fNV{cAf89jDS zgQ9B)^kJaWZ%4R5R^7##{3*!(;=P;s9AlxcPrizzQlC5t8F!`w0Z~f(^b?03l-zq= z!+%SDKzy*RLEo;^twaS2Xa4*_u-a(n(BKCc`r6i2^(Xj&?=x%Y1}FuhE@M4mc4G zD)2@gC)?EC+X505cF^(AMX)Dz9T~A01O(;dYVzI~URZmYsxM_jVfJm;prrr%xq2@ z@LxcGufZ!e6;seEaU*K@nWTw|6-9_U{MNqSp|j)h^O2zEpc1f;A2ObV+vHZ12EVcQ z&2@|jn6lf80GOTYtFdvK;0|l(nl#h;?t{XD^1@PzpV+&k_$B&JDKx5Kf~Wc(=hGsP z2wb#IQx2XM{f1_eC3*X^yLs68wQ$QorpQ!MG&&H`m5BU%5jtrA=Tjf0j0F!YpC?RFbO>dzSsT1%E{4Dujzpr;)EZD7wr89Dr8nk zU-CWV)9HhMyt>ocnpg1~DB`zgr4QZeZ+(PhuFxLE(ZCY_HRn|3<$>3BP+^f;AWRr@ z*DQ|KvVHhYF`T+s0~3{8ESVA6a>7c&k`?X3or8;FneUH^PHEA?`#&Vgf1S=wC36@0 zWnj&$+Zxt|yak5J>j|v2CNBpiW=whsY1pdPxa*-9Oc-DMVuBtVa%*FQ!9Tvk(Akk z;WlGHr}Fz}kjb>m<>I>OBD(X81_vXNF*q*iKCQJC1{EJ=f00^}R|uc6xn@u^nO0p;8W7GyA31&jj`*cd+lrYzeO1gFOS#|t|uT0LGG97 ziX&aMfc|cOg_&X54670t<@_)W%)34`V|LTGQTFht{wm$` z3S&Tn!GP50M(dQ@q?&sa(pWdA!tPVzl@L#YU|DIYE#LWu7G6hRz9jpiEzj20hFM#H zo`r+zNjjT$QnU^~Qk=h^%j;S{J!A{JX8slNg#7(a-K0z{a@g^C2WL5{-c^Sxj-h(B zBV31ZWEH-V8pHj%X(5d0V2Q2g>MGyC`zoPz_Y{kL7{c0*S8Up{MY25pa)AX8%J>G^ zY#F}cj~JVY(@^8yxo7E$KZ0m5d10aoeXABJLc?8$c;F3_!DoJf^gWp;KT*8B@Q5VA z(}Qr0%6)d%UXt@4kBa_wFu&@xUj^$h^ZwnI_&w!aTIA>5oN?QN%Mu&3?}J6}9-?&9 znTL=^mc5s8U7S>V+z@)?uvx0@m6>mlu%^w7^oXT@WDtH35mp%@*`-pp*oJalavG2$ z(Fcka7I5_e6BsrPEa%s01RzX}4pI5K58Rj&)Dtq?wH<0q|9m!%&JlLsTO+i<_mL#T z?=CqEx7nH(=6`SfJb68HZoL=ySjXtTFJayRvWjrw6v6BwVU=8D-r02f1iXD>Y~Du_ z6j*A2BV%XL9YND!0Rb8v{o66D8mmH5IOAw&|9vecuMU{356sLbrO{x7H$NQl>c(hn zA)+6`IL{VCro`N76qrFIT|^japqS~p^Z~?I&o^rC6W?^mGT1Z(Kb=qF?$QrqUVPor z#(8M%$p)U%+DEi9NN_zKv^YStdV^*I(D?JHVrAK)=j+IGy#|Vv5cHMLUfUMHS53#{ n$$X?RB&OfE17K#uMjl*oaE01Qw2T74ALyvD<)NH|&R72*u7qmz From d5a1834788e20c28216d30049f1e64f4f44e4886 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 17 Oct 2020 01:40:02 +0100 Subject: [PATCH 16/62] more fixes --- code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_savefile.dm | 69 +++++++++++---------- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2dfcde2949..b53a2f3c30 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -580,7 +580,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary dat += "Primary Color
    " dat += "    Change
    " - if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) + if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) dat += "Secondary Color
    " dat += "    Change
    " if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4097bad5eb..edb98a7e64 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 39 +#define SAVEFILE_VERSION_MAX 45 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,42 +226,43 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 39) //extreme changes to how things are coloured + if(current_version < 390) //extreme changes to how things are coloured for(var/feature in features) message_admins("[feature]") var/feature_type = features[feature] - var/ref_list = GLOB.mutant_reference_list[feature_type] - if(ref_list) - message_admins("ref list found") - var/datum/sprite_accessory/accessory = ref_list[feature] - if(accessory) - var/primary_string = "[feature_type]_primary" - var/secondary_string = "[feature_type]_secondary]" - var/tertiary_string = "[feature_type]_tertiary]" - if(accessory.matrixed_sections) - switch(accessory.matrixed_sections) - if(MATRIX_GREEN) //only composed of a green section - primary_string = secondary_string //swap primary for secondary, so it properly assigns the second colour, reserved for the green section - if(MATRIX_BLUE) - primary_string = tertiary_string //same as above, but the tertiary feature is for the blue section - if(MATRIX_RED_BLUE) //composed of a red and blue section - secondary_string = tertiary_string //swap secondary for tertiary, as blue should always be tertiary - if(MATRIX_GREEN_BLUE) //composed of a green and blue section - primary_string = secondary_string //swap primary for secondary, as first option is green, which is linked to the secondary - secondary_string = tertiary_string //swap secondary for tertiary, as second option is blue, which is linked to the tertiary - else if(accessory.color_src != MATRIXED) - message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") - continue - if(accessory.color_src == MATRIXED) - features[primary_string] = features["mcolor"] - features[secondary_string] = features["mcolor2"] - features[tertiary_string] = features["mcolor3"] - else if(accessory.color_src == MUTCOLORS) - features[primary_string] = features["mcolor"] - else if(accessory.color_src == MUTCOLORS2) - features[secondary_string] = features["mcolor2"] - else if(accessory.color_src == MUTCOLORS3) - features[tertiary_string] = features["mcolor3"] + if(feature_type) + var/ref_list = GLOB.mutant_reference_list[feature_type] + if(ref_list) + message_admins("ref list found [ref_list]") + var/datum/sprite_accessory/accessory = ref_list[feature] + if(accessory) + var/primary_string = "[feature_type]_primary" + var/secondary_string = "[feature_type]_secondary]" + var/tertiary_string = "[feature_type]_tertiary]" + if(accessory.matrixed_sections) + switch(accessory.matrixed_sections) + if(MATRIX_GREEN) //only composed of a green section + primary_string = secondary_string //swap primary for secondary, so it properly assigns the second colour, reserved for the green section + if(MATRIX_BLUE) + primary_string = tertiary_string //same as above, but the tertiary feature is for the blue section + if(MATRIX_RED_BLUE) //composed of a red and blue section + secondary_string = tertiary_string //swap secondary for tertiary, as blue should always be tertiary + if(MATRIX_GREEN_BLUE) //composed of a green and blue section + primary_string = secondary_string //swap primary for secondary, as first option is green, which is linked to the secondary + secondary_string = tertiary_string //swap secondary for tertiary, as second option is blue, which is linked to the tertiary + else if(accessory.color_src != MATRIXED) + message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + if(accessory.color_src == MATRIXED) + features[primary_string] = features["mcolor"] + features[secondary_string] = features["mcolor2"] + features[tertiary_string] = features["mcolor3"] + else if(accessory.color_src == MUTCOLORS) + features[primary_string] = features["mcolor"] + else if(accessory.color_src == MUTCOLORS2) + features[secondary_string] = features["mcolor2"] + else if(accessory.color_src == MUTCOLORS3) + features[tertiary_string] = features["mcolor3"] /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) From 3051a85de29c927ad2db4f09ad39344614685d8d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 17 Oct 2020 01:00:51 +0000 Subject: [PATCH 17/62] 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 7ee946227e..62cf4aa27d 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -328,18 +328,6 @@
    • tips
    - -

    15 August 2020

    -

    LetterN updated:

    -
      -
    • missing anomaly core icons
    • -
    • wrong state. blame the tg vertion i copied
    • -
    -

    silicons updated:

    -
      -
    • the 8 rotation limit from clockwork chairs has been removed. please don't abuse this.
    • -
    • ethereals can now wear underwear
    • -
    GoonStation 13 Development Team From 04e1d9fc392a87f442dcb48ff479cdca294f16f1 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 17 Oct 2020 03:42:14 +0100 Subject: [PATCH 18/62] more fixes --- code/modules/client/preferences.dm | 6 ++++++ code/modules/client/preferences_savefile.dm | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b53a2f3c30..2d2f6e1e00 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -578,12 +578,18 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(MATRIX_GREEN_BLUE) //composed of a green and blue section primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary + if(!features[primary_feature]) + features[primary_feature] = "FFFFFF" dat += "Primary Color
    " dat += "    Change
    " if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) + if(!features[secondary_feature]) + features[secondary_feature] = "FFFFFF" dat += "Secondary Color
    " dat += "    Change
    " if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) + if(!features[tertiary_feature]) + features[tertiary_feature] = "FFFFFF" dat += "Tertiary Color
    " dat += "    Change
    " diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index edb98a7e64..7d5af1ff81 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -231,10 +231,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car message_admins("[feature]") var/feature_type = features[feature] if(feature_type) - var/ref_list = GLOB.mutant_reference_list[feature_type] + var/ref_list = GLOB.mutant_reference_list[feature] if(ref_list) message_admins("ref list found [ref_list]") - var/datum/sprite_accessory/accessory = ref_list[feature] + var/datum/sprite_accessory/accessory = ref_list[feature_type] if(accessory) var/primary_string = "[feature_type]_primary" var/secondary_string = "[feature_type]_secondary]" From 5e780064c12df4490b4723d9567e30fb74cdf420 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 17 Oct 2020 19:47:46 +0100 Subject: [PATCH 19/62] fixes and a toggle --- code/__DEFINES/citadel_defines.dm | 6 +- code/modules/client/preferences.dm | 92 +++++++++++-------- code/modules/client/preferences_savefile.dm | 15 +-- .../mob/living/carbon/human/species.dm | 15 +-- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 89e44fc215..541b50e9bd 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -123,4 +123,8 @@ #define MATRIX_RED_BLUE "red_blue" #define MATRIX_GREEN_BLUE "green_blue" #define MATRIX_ALL "red_green_blue" -#define MATRIX_NONE "none" \ No newline at end of file +#define MATRIX_NONE "none" + +//defines for the two colour schemes, advanced and old +#define OLD_CHARACTER_COLORING "old_color_system" +#define ADVANCED_CHARACTER_COLORING "advanced_color_system" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2d2f6e1e00..a804dfacd2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -166,7 +166,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, - "body_size" = RESIZE_DEFAULT_SIZE + "body_size" = RESIZE_DEFAULT_SIZE, + "color_scheme" = OLD_CHARACTER_COLORING ) 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 @@ -470,6 +471,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!use_skintones) dat += APPEARANCE_CATEGORY_COLUMN + dat += "

    Advanced Coloring

    " + dat += "
    [(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) ? "Enabled" : "Disabled"]" + dat += "

    Body Colors

    " dat += "Primary Color:
    " @@ -553,45 +557,46 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(color_type) dat += "    Change
    " else - //is it matrixed or does it have extra parts to be coloured? - var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] - var/find_part_list = GLOB.mutant_reference_list[mutant_part] - if(find_part && find_part_list) - var/datum/sprite_accessory/accessory = find_part_list[find_part] - if(accessory) - if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future - var/primary_feature = "[mutant_part]_primary" - var/secondary_feature = "[mutant_part]_secondary" - var/tertiary_feature = "[mutant_part]_tertiary" - var/matrixed_sections = accessory.matrixed_sections - if(accessory.color_src == MATRIXED && !matrixed_sections) - message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") - continue - else if(accessory.color_src == MATRIXED) - switch(matrixed_sections) - if(MATRIX_GREEN) //only composed of a green section - primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section - if(MATRIX_BLUE) - primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section - if(MATRIX_RED_BLUE) //composed of a red and blue section - secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary - if(MATRIX_GREEN_BLUE) //composed of a green and blue section - primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary - secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary - if(!features[primary_feature]) - features[primary_feature] = "FFFFFF" - dat += "Primary Color
    " - dat += "    Change
    " - if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) - if(!features[secondary_feature]) - features[secondary_feature] = "FFFFFF" - dat += "Secondary Color
    " - dat += "    Change
    " - if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) - if(!features[tertiary_feature]) - features[tertiary_feature] = "FFFFFF" - dat += "Tertiary Color
    " - dat += "    Change
    " + if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system + //is it matrixed or does it have extra parts to be coloured? + var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] + var/find_part_list = GLOB.mutant_reference_list[mutant_part] + if(find_part && find_part_list) + var/datum/sprite_accessory/accessory = find_part_list[find_part] + if(accessory) + if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future + var/primary_feature = "[mutant_part]_primary" + var/secondary_feature = "[mutant_part]_secondary" + var/tertiary_feature = "[mutant_part]_tertiary" + var/matrixed_sections = accessory.matrixed_sections + if(accessory.color_src == MATRIXED && !matrixed_sections) + message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + else if(accessory.color_src == MATRIXED) + switch(matrixed_sections) + if(MATRIX_GREEN) //only composed of a green section + primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section + if(MATRIX_BLUE) + primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section + if(MATRIX_RED_BLUE) //composed of a red and blue section + secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary + if(MATRIX_GREEN_BLUE) //composed of a green and blue section + primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary + secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary + if(!features[primary_feature]) + features[primary_feature] = "FFFFFF" + dat += "Primary Color
    " + dat += "    Change
    " + if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) + if(!features[secondary_feature]) + features[secondary_feature] = "FFFFFF" + dat += "Secondary Color
    " + dat += "    Change
    " + if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) + if(!features[tertiary_feature]) + features[tertiary_feature] = "FFFFFF" + dat += "Tertiary Color
    " + dat += "    Change
    " mutant_category++ if(mutant_category >= MAX_MUTANT_ROWS) @@ -2091,6 +2096,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + //advanced color mode toggle + if("color_scheme") + if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) + features["color_scheme"] = OLD_CHARACTER_COLORING + else + features["color_scheme"] = ADVANCED_CHARACTER_COLORING + //Genital code if("cock_color") var/new_cockcolor = input(user, "Penis color:", "Character Preference","#"+features["cock_color"]) as color|null diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7d5af1ff81..4dda3323ab 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -239,18 +239,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/primary_string = "[feature_type]_primary" var/secondary_string = "[feature_type]_secondary]" var/tertiary_string = "[feature_type]_tertiary]" - if(accessory.matrixed_sections) - switch(accessory.matrixed_sections) - if(MATRIX_GREEN) //only composed of a green section - primary_string = secondary_string //swap primary for secondary, so it properly assigns the second colour, reserved for the green section - if(MATRIX_BLUE) - primary_string = tertiary_string //same as above, but the tertiary feature is for the blue section - if(MATRIX_RED_BLUE) //composed of a red and blue section - secondary_string = tertiary_string //swap secondary for tertiary, as blue should always be tertiary - if(MATRIX_GREEN_BLUE) //composed of a green and blue section - primary_string = secondary_string //swap primary for secondary, as first option is green, which is linked to the secondary - secondary_string = tertiary_string //swap secondary for tertiary, as second option is blue, which is linked to the tertiary - else if(accessory.color_src != MATRIXED) + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections) message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(accessory.color_src == MATRIXED) @@ -264,6 +253,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else if(accessory.color_src == MUTCOLORS3) features[tertiary_string] = features["mcolor3"] + features["color_scheme"] = OLD_CHARACTER_COLORING //advanced is off + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2ec5b84cb9..2ce5e74c56 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -746,14 +746,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) ) var/g = (H.dna.features["body_model"] == FEMALE) ? "f" : "m" - var/list/colorlist = list() var/husk = HAS_TRAIT(H, TRAIT_HUSK) - colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor"]]00") - colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor2"]]00") - colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features["mcolor3"]]00") - colorlist += husk ? list(0, 0, 0) : list(0, 0, 0, hair_alpha) - for(var/index in 1 to colorlist.len) - colorlist[index] /= 255 for(var/layer in relevant_layers) var/list/standing = list() @@ -775,9 +768,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(S.center) accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y) - var/primary_string = "[S.mutant_part_string]_primary" - var/secondary_string = "[S.mutant_part_string]_secondary" - var/tertiary_string = "[S.mutant_part_string]_tertiary" + var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) + + var/primary_string = advanced_color_system ? "[S.mutant_part_string]_primary" : "mcolor" + var/secondary_string = advanced_color_system ? "[S.mutant_part_string]_secondary" : "mcolor2" + var/tertiary_string = advanced_color_system ? "[S.mutant_part_string]_tertiary" : "mcolor3" if(!husk) if(!forced_colour) From 87387f45d1053386533bbc68a14c489ada7a3272 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sat, 17 Oct 2020 23:32:08 +0100 Subject: [PATCH 20/62] fixes --- code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_savefile.dm | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a804dfacd2..23e61f551f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -561,7 +561,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) //is it matrixed or does it have extra parts to be coloured? var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] var/find_part_list = GLOB.mutant_reference_list[mutant_part] - if(find_part && find_part_list) + if(find_part && find_part != "None" && find_part_list) var/datum/sprite_accessory/accessory = find_part_list[find_part] if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4dda3323ab..27b1870e9b 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 45 +#define SAVEFILE_VERSION_MAX 600 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,7 +226,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 390) //extreme changes to how things are coloured + if(current_version < 3900) //extreme changes to how things are coloured (the introduction of the advanced coloring system) + message_admins("good morning a") + features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) message_admins("[feature]") var/feature_type = features[feature] @@ -597,6 +599,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_arachnid_mandibles"] >> features["arachnid_mandibles"] S["feature_horns_color"] >> features["horns_color"] S["feature_wings_color"] >> features["wings_color"] + S["feature_color_scheme"] >> features["color_scheme"] S["persistent_scars"] >> persistent_scars S["scars1"] >> scars_list["1"] S["scars2"] >> scars_list["2"] @@ -954,6 +957,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) + WRITE_FILE(S["feature_color_scheme"], features["color_scheme"]) + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this From bea11aa878dff3548aa46bcafbb63bde620ff493 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 18 Oct 2020 01:03:50 +0000 Subject: [PATCH 21/62] 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 62cf4aa27d..e2f1fb9fd8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -316,18 +316,6 @@
  • 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/)
  • Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg moved drakeborg.dmi to icon/mob/cyborg
  • - -

    16 August 2020

    -

    kiwedespars updated:

    -
      -
    • nerfed hypereut chaplain weapon.
    • -
    • 50% rng blockchance -> 0%
    • -
    • parry made much worse because it's an actual weapon and a roundstart one at that.
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • tips
    • -
    GoonStation 13 Development Team From 40efc4b8c809a0cfa35bc1b11f858396cfccad56 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 18:05:59 +0100 Subject: [PATCH 22/62] cleanup and migration fix --- code/modules/client/preferences_savefile.dm | 23 +++++++++------------ 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 27b1870e9b..8cafc65356 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 600 +#define SAVEFILE_VERSION_MAX 39 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,22 +226,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 3900) //extreme changes to how things are coloured (the introduction of the advanced coloring system) - message_admins("good morning a") + if(current_version < 39) //extreme changes to how things are coloured (the introduction of the advanced coloring system) features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) - message_admins("[feature]") - var/feature_type = features[feature] - if(feature_type) + var/feature_value = features[feature] + if(feature_value) var/ref_list = GLOB.mutant_reference_list[feature] if(ref_list) - message_admins("ref list found [ref_list]") - var/datum/sprite_accessory/accessory = ref_list[feature_type] + var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[feature_type]_primary" - var/secondary_string = "[feature_type]_secondary]" - var/tertiary_string = "[feature_type]_tertiary]" - if(accessory.color_src == MATRIXED && !accessory.matrixed_sections) + var/primary_string = "[feature]_primary" + var/secondary_string = "[feature]_secondary]" + var/tertiary_string = "[feature]_tertiary]" + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(accessory.color_src == MATRIXED) @@ -255,7 +252,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car else if(accessory.color_src == MUTCOLORS3) features[tertiary_string] = features["mcolor3"] - features["color_scheme"] = OLD_CHARACTER_COLORING //advanced is off + features["color_scheme"] = OLD_CHARACTER_COLORING //advanced is off by default /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) From bfb3546ccc68d773ffbd40ab4798e0bfc18ee49b Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 18:16:29 +0100 Subject: [PATCH 23/62] save/load --- code/modules/client/preferences_savefile.dm | 43 +++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 8cafc65356..325bbd2a91 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -674,6 +674,28 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_visibility"] >> features["vag_visibility"] //womb features S["feature_has_womb"] >> features["has_womb"] + + //load every advanced coloring mode thing in one go + for(var/feature in features) + var/feature_value = features[feature] + if(feature_value) + var/ref_list = GLOB.mutant_reference_list[feature] + if(ref_list) + var/datum/sprite_accessory/accessory = ref_list[feature_value] + if(accessory) + var/primary_string = "[feature]_primary" + var/secondary_string = "[feature]_secondary]" + var/tertiary_string = "[feature]_tertiary]" + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") + message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + if(features[primary_string]) + S["feature_[primary_string]"] >> features[primary_string] + if(features[secondary_string]) + S["feature_[secondary_string]"] >> features[secondary_string] + if(features[tertiary_string]) + S["feature_[tertiary_string]"] >> features[tertiary_string] + //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. @@ -956,6 +978,27 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_color_scheme"], features["color_scheme"]) + //save every advanced coloring mode thing in one go + for(var/feature in features) + var/feature_value = features[feature] + if(feature_value) + var/ref_list = GLOB.mutant_reference_list[feature] + if(ref_list) + var/datum/sprite_accessory/accessory = ref_list[feature_value] + if(accessory) + var/primary_string = "[feature]_primary" + var/secondary_string = "[feature]_secondary]" + var/tertiary_string = "[feature]_tertiary]" + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") + message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + if(features[primary_string]) + WRITE_FILE(S["feature_[primary_string]"], features[primary_string]) + if(features[secondary_string]) + WRITE_FILE(S["feature_[secondary_string]"], features[secondary_string]) + if(features[tertiary_string]) + WRITE_FILE(S["feature_[tertiary_string]"], features[tertiary_string]) + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this From bb46fa319ce2baa3ae0383a9c02682a73781bc2b Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 18:34:07 +0100 Subject: [PATCH 24/62] fix --- code/modules/client/preferences_savefile.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 325bbd2a91..853620c174 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -238,7 +238,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/primary_string = "[feature]_primary" var/secondary_string = "[feature]_secondary]" var/tertiary_string = "[feature]_tertiary]" - if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(accessory.color_src == MATRIXED) @@ -686,7 +686,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/primary_string = "[feature]_primary" var/secondary_string = "[feature]_secondary]" var/tertiary_string = "[feature]_tertiary]" - if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(features[primary_string]) @@ -989,7 +989,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/primary_string = "[feature]_primary" var/secondary_string = "[feature]_secondary]" var/tertiary_string = "[feature]_tertiary]" - if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature != "None") + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(features[primary_string]) From 2ac3bbbaf3a0cc7f950e4d1316976265bf2c3f14 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 21:09:20 +0100 Subject: [PATCH 25/62] fix --- code/modules/client/preferences_savefile.dm | 43 +++++++++++---------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 853620c174..edd3689ed6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -675,27 +675,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //womb features S["feature_has_womb"] >> features["has_womb"] - //load every advanced coloring mode thing in one go - for(var/feature in features) - var/feature_value = features[feature] - if(feature_value) - var/ref_list = GLOB.mutant_reference_list[feature] - if(ref_list) - var/datum/sprite_accessory/accessory = ref_list[feature_value] - if(accessory) - var/primary_string = "[feature]_primary" - var/secondary_string = "[feature]_secondary]" - var/tertiary_string = "[feature]_tertiary]" - if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") - message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") - continue - if(features[primary_string]) - S["feature_[primary_string]"] >> features[primary_string] - if(features[secondary_string]) - S["feature_[secondary_string]"] >> features[secondary_string] - if(features[tertiary_string]) - S["feature_[tertiary_string]"] >> features[tertiary_string] - //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. @@ -853,6 +832,28 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["silicon_flavor_text"] = copytext(features["silicon_flavor_text"], 1, MAX_FLAVOR_LEN) features["ooc_notes"] = copytext(features["ooc_notes"], 1, MAX_FLAVOR_LEN) + //load every advanced coloring mode thing in one go + //THIS MUST BE DONE AFTER ALL FEATURE SAVES OR IT WILL NOT WORK + for(var/feature in features) + var/feature_value = features[feature] + if(feature_value) + var/ref_list = GLOB.mutant_reference_list[feature] + if(ref_list) + var/datum/sprite_accessory/accessory = ref_list[feature_value] + if(accessory) + var/primary_string = "[feature]_primary" + var/secondary_string = "[feature]_secondary]" + var/tertiary_string = "[feature]_tertiary]" + if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") + message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") + continue + if(features[primary_string]) + S["feature_[primary_string]"] >> features[primary_string] + if(features[secondary_string]) + S["feature_[secondary_string]"] >> features[secondary_string] + if(features[tertiary_string]) + S["feature_[tertiary_string]"] >> features[tertiary_string] + persistent_scars = sanitize_integer(persistent_scars) scars_list["1"] = sanitize_text(scars_list["1"]) scars_list["2"] = sanitize_text(scars_list["2"]) From 8e2345d2f7da8b2a5041458eb434b7c5640d66a4 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 21:36:17 +0100 Subject: [PATCH 26/62] FUCK --- code/modules/client/preferences_savefile.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index edd3689ed6..3cbc009947 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -841,17 +841,19 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) + message_admins("loading feature [feature] and value [feature_value]") var/primary_string = "[feature]_primary" var/secondary_string = "[feature]_secondary]" var/tertiary_string = "[feature]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue - if(features[primary_string]) + if(S["feature_[primary_string]"]) + message_admins("we have feature_[primary_string] that we load into [primary_string], its value is [S["feature_[primary_string]"]]") S["feature_[primary_string]"] >> features[primary_string] - if(features[secondary_string]) + if(S["feature_[secondary_string]"]) S["feature_[secondary_string]"] >> features[secondary_string] - if(features[tertiary_string]) + if(S["feature_[tertiary_string]"]) S["feature_[tertiary_string]"] >> features[tertiary_string] persistent_scars = sanitize_integer(persistent_scars) @@ -994,10 +996,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(features[primary_string]) + message_admins("primary is [primary_string] and has value [features[primary_string]] this is written to feature_[primary_string]") WRITE_FILE(S["feature_[primary_string]"], features[primary_string]) if(features[secondary_string]) + message_admins("secondary is [secondary_string]") WRITE_FILE(S["feature_[secondary_string]"], features[secondary_string]) if(features[tertiary_string]) + message_admins("tertiary is [tertiary_string]") WRITE_FILE(S["feature_[tertiary_string]"], features[tertiary_string]) //Custom names From f965b78960e87efbfe03f3f214843ddfe8f60797 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 21:36:51 +0100 Subject: [PATCH 27/62] remove debug messages --- code/modules/client/preferences_savefile.dm | 5 ----- 1 file changed, 5 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 3cbc009947..e08e213b64 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -841,7 +841,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - message_admins("loading feature [feature] and value [feature_value]") var/primary_string = "[feature]_primary" var/secondary_string = "[feature]_secondary]" var/tertiary_string = "[feature]_tertiary]" @@ -849,7 +848,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(S["feature_[primary_string]"]) - message_admins("we have feature_[primary_string] that we load into [primary_string], its value is [S["feature_[primary_string]"]]") S["feature_[primary_string]"] >> features[primary_string] if(S["feature_[secondary_string]"]) S["feature_[secondary_string]"] >> features[secondary_string] @@ -996,13 +994,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue if(features[primary_string]) - message_admins("primary is [primary_string] and has value [features[primary_string]] this is written to feature_[primary_string]") WRITE_FILE(S["feature_[primary_string]"], features[primary_string]) if(features[secondary_string]) - message_admins("secondary is [secondary_string]") WRITE_FILE(S["feature_[secondary_string]"], features[secondary_string]) if(features[tertiary_string]) - message_admins("tertiary is [tertiary_string]") WRITE_FILE(S["feature_[tertiary_string]"], features[tertiary_string]) //Custom names From c53eeff33f184286112f01bcd2c07205a7890c9b Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 21:51:36 +0100 Subject: [PATCH 28/62] travis segfaulted --- code/modules/client/preferences_savefile.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e08e213b64..e3a1aca52f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -623,6 +623,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Jobs S["joblessrole"] >> joblessrole //Load prefs + S["job_preferences"] >> job_preferences //Quirks From f5cc216a4c487630ecb050b4af9485c50c0d89b2 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 18 Oct 2020 21:51:58 +0100 Subject: [PATCH 29/62] travis segfaulted --- 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 e3a1aca52f..8ab9b6c464 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -622,8 +622,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Jobs S["joblessrole"] >> joblessrole - //Load prefs + //Load prefs S["job_preferences"] >> job_preferences //Quirks From 3861a2cf79b18e03ed44ad30528c582408992f64 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 19 Oct 2020 01:03:06 +0000 Subject: [PATCH 30/62] Automatic changelog compile [ci skip] --- html/changelog.html | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index e2f1fb9fd8..d0d704b1b1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -301,21 +301,6 @@
  • snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter
  • meat type and horns can now be selected by any species
  • - -

    17 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • Cogscarabs are no longer always Pogscarabs
    • -
    -

    Strazyplus updated:

    -
      -
    • Added drakeborgs
    • -
    • Added drakeplushies
    • -
    • added drakeborg sprites
    • -
    • added drakeplushie sprites
    • -
    • 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/)
    • -
    • Added CC BY-NC-SA 3.0 license details to icon/mob/cyborg moved drakeborg.dmi to icon/mob/cyborg
    • -
    GoonStation 13 Development Team From 8ad159aeaca1140a6fbd7e00b7708f909a2bcd69 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 20 Oct 2020 01:02:20 +0000 Subject: [PATCH 31/62] Automatic changelog compile [ci skip] --- html/changelog.html | 65 --------------------------------------------- 1 file changed, 65 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d0d704b1b1..d68ed49325 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -236,71 +236,6 @@
    • Ethereal hair is now their body color instead of accidentally white
    - -

    18 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • kindle cast time: 15ds -> 25ds
    • -
    • Moved the Belligerent Scripture to where it should be in the code
    • -
    -

    Detective-Google updated:

    -
      -
    • glass floors
    • -
    • uncrowbarrable plasma floors tweak:disco inferno's plasma floors can no longer be crowbarred.
    • -
    • ghost cafe has funky fresh art
    • -
    • you can actually remove glass floors now
    • -
    • get_equipped_items is hopefully less gross
    • -
    • plasma cutters are no longer gay
    • -
    -

    Hatterhat updated:

    -
      -
    • Slaughter demons (and laughter demons, being a subtype) are MOB_SIZE_LARGE, with one of the more immediate effects being able to mark them with a crusher and backstab them.
    • -
    • The funny blyat men have stumbled upon another surplus of Mosin-Nagants and are starting to pack them into crates again.
    • -
    • Vehicle riders can now, by default, get shot in the face and/or chest.
    • -
    • Adminspawn only .357 DumDum rounds! Because sometimes the other guy just really needs to hurt.
    • -
    • Bluespace beakers now have a chemical window through the side that shows chemical overlays.
    • -
    • Plant DNA manipulators now let you chuck things over them. Or they WOULD, if LETPASSTHROW worked half a damn.
    • -
    -

    LetterN updated:

    -
      -
    • uplink implant states
    • -
    • tweaks how role assigning works
    • -
    -

    MrJWhit updated:

    -
      -
    • Gives ashwalkers nightvision
    • -
    • Makes tesla blast people, not the environment, to save the server.
    • -
    -

    TheObserver-sys updated:

    -
      -
    • moves Garlic sprites from growing.dmi to growing_vegetable.dmi
    • -
    • Removes the unused Electric Lime mutation, it just takes up space with no actual function nor sprites.
    • -
    • Gives Catnip growing sprites
    • -
    • Removes redundant images in growing.dmi
    • -
    -

    kiwedespars updated:

    -
      -
    • 10 force to a fucking rubber cock.
    • -
    -

    lolman360 updated:

    -
      -
    • shotgun stripper clip nerf. ammoboxes can now accept a load_delay that happens when they attack a magazine, internal or external.
    • -
    -

    ported from tg updated:

    -
      -
    • bronze airlocks and windows can now be built
    • -
    • i also tweaked bronze flooring to be cheaper.
    • -
    -

    silicons updated:

    -
      -
    • stamina draining projectiles without stamina for their primary damage type now has their stamina damage taken into account for shield blocking, rather than the block being done for free for that.
    • -
    -

    timothyteakettle updated:

    -
      -
    • snowflake code tidyup
    • -
    • snowflake code for mutant bodypart selection has been rewritten to be ~14x shorter
    • -
    • meat type and horns can now be selected by any species
    • -
    GoonStation 13 Development Team From ab35f8cf66bb3d53c44148b80bacbaf505d564b0 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 21 Oct 2020 15:47:42 +0100 Subject: [PATCH 32/62] include literally everything --- code/modules/client/preferences.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 23e61f551f..a11b0229e1 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2081,7 +2081,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipcantenna_primary","ipcantenna_secondary","ipcantenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiaty","spines_primary","spines_secondary","spines_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xenohead_primary","xenohead_secondary","xenohead_tertiary","tail_primary","tail_secondary","tail_tertiary","xenotail_primary","xenotail_secondary","xenotail_tertiary","mam_body_markings_primary","mam_body_markings_secondary","mam_body_markings_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","mam_snouts_primary","mam_snouts_secondary","mam_snouts_tertiary","mam_ears_primary","mam_ears_secondary","mam_ears_tertiary","spines_primary","spines_secondary","spines_tertiary","tail_lizard_primary","tail_lizard_secondary","tail_lizard_tertiary","tail_human_primary","tail_human_secondary","tail_human_tertiary","mam_tail_primary","mam_tail_secondary","mam_tail_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" From 06bbddd248310b836f2b09e1395ce4e14eb3cb9c Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 21 Oct 2020 18:20:14 +0100 Subject: [PATCH 33/62] Update preferences_savefile.dm --- 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 8ab9b6c464..af0b062686 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 39 +#define SAVEFILE_VERSION_MAX 40 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,7 +226,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 39) //extreme changes to how things are coloured (the introduction of the advanced coloring system) + if(current_version < 40) //extreme changes to how things are coloured (the introduction of the advanced coloring system) features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) var/feature_value = features[feature] From 4a3afae9d166a594ac2720586e08dd3e183da7f0 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 21 Oct 2020 23:59:15 +0100 Subject: [PATCH 34/62] WHAT IF WE FIXED EVERYTHING IN ONE COMMIT --- code/modules/client/preferences.dm | 6 ++--- code/modules/client/preferences_savefile.dm | 22 +++++++++---------- .../sprite_accessories/alienpeople.dm | 4 ++-- .../sprite_accessories/body_markings.dm | 5 +++-- .../new_player/sprite_accessories/ears.dm | 2 +- .../new_player/sprite_accessories/snouts.dm | 4 ++-- .../new_player/sprite_accessories/tails.dm | 4 ++-- .../mob/living/carbon/human/species.dm | 22 ++++++++++++++++--- 8 files changed, 43 insertions(+), 26 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a11b0229e1..bcd71399b9 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -565,9 +565,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/datum/sprite_accessory/accessory = find_part_list[find_part] if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future - var/primary_feature = "[mutant_part]_primary" - var/secondary_feature = "[mutant_part]_secondary" - var/tertiary_feature = "[mutant_part]_tertiary" + var/primary_feature = "[accessory.mutant_part_string]_primary" + var/secondary_feature = "[accessory.mutant_part_string]_secondary" + var/tertiary_feature = "[accessory.mutant_part_string]_tertiary" var/matrixed_sections = accessory.matrixed_sections if(accessory.color_src == MATRIXED && !matrixed_sections) message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index af0b062686..2fa936e72e 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 40 +#define SAVEFILE_VERSION_MAX 41 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,7 +226,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 40) //extreme changes to how things are coloured (the introduction of the advanced coloring system) + if(current_version < 41) //extreme changes to how things are coloured (the introduction of the advanced coloring system) features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) var/feature_value = features[feature] @@ -235,9 +235,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[feature]_primary" - var/secondary_string = "[feature]_secondary]" - var/tertiary_string = "[feature]_tertiary]" + var/primary_string = "[accessory.mutant_part_string]_primary" + var/secondary_string = "[accessory.mutant_part_string]_secondary]" + var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -842,9 +842,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[feature]_primary" - var/secondary_string = "[feature]_secondary]" - var/tertiary_string = "[feature]_tertiary]" + var/primary_string = "[accessory.mutant_part_string]_primary" + var/secondary_string = "[accessory.mutant_part_string]_secondary]" + var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -988,9 +988,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[feature]_primary" - var/secondary_string = "[feature]_secondary]" - var/tertiary_string = "[feature]_tertiary]" + var/primary_string = "[accessory.mutant_part_string]_primary" + var/secondary_string = "[accessory.mutant_part_string]_secondary]" + var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index 3972bdc2c3..4b0962e710 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -27,7 +27,7 @@ *******************************************/ /datum/sprite_accessory/xeno_tail icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' - mutant_part_string = "tail" + mutant_part_string = "xenotail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_tail/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -46,7 +46,7 @@ *******************************************/ /datum/sprite_accessory/xeno_head icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' - mutant_part_string = "xhead" + mutant_part_string = "xenohead" relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 3fb73ce80e..383bdf4b7c 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) - mutant_part_string = "bodymarkings" + mutant_part_string = "body_markings" /datum/sprite_accessory/body_markings/none name = "None" @@ -49,7 +49,7 @@ gender_specific = 0 icon = 'modular_citadel/icons/mob/mam_markings.dmi' recommended_species = list("mammal", "xeno", "slimeperson", "podweak") - mutant_part_string = "bodymarkings" + mutant_part_string = "mam_body_markings" matrixed_sections = MATRIX_ALL /datum/sprite_accessory/mam_body_markings/none @@ -234,6 +234,7 @@ icon = 'icons/mob/wings.dmi' color_src = 0 relevant_layers = list(BODY_FRONT_LAYER) + mutant_part_string = "insect_fluff" /datum/sprite_accessory/insect_fluff/is_not_visible(var/mob/living/carbon/human/H, var/tauric) return (!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index d5db676b73..c4045d9afc 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -203,7 +203,7 @@ /datum/sprite_accessory/ears/mam_ears icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED - mutant_part_string = "ears" + mutant_part_string = "mam_ears" relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 6c04e27783..084e06dd93 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -1,6 +1,6 @@ /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "snout" + mutant_part_string = "snouts" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -153,7 +153,7 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' recommended_species = list("mammal", "slimeperson", "insect", "podweak", "lizard") - mutant_part_string = "snout" + mutant_part_string = "mam_snouts" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index b3a89d9115..97c6114e8d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -1,6 +1,6 @@ /datum/sprite_accessory/tails icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tail" + mutant_part_string = "tails" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -8,7 +8,7 @@ /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tail" //keep this the same, ALWAYS, this is incredibly important for colouring! + mutant_part_string = "tails" //keep this the same, ALWAYS, this is incredibly important for colouring! relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /****************************************** diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2ce5e74c56..bfd3b2873a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -773,6 +773,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/primary_string = advanced_color_system ? "[S.mutant_part_string]_primary" : "mcolor" var/secondary_string = advanced_color_system ? "[S.mutant_part_string]_secondary" : "mcolor2" var/tertiary_string = advanced_color_system ? "[S.mutant_part_string]_tertiary" : "mcolor3" + //failsafe: if there's no value for any of these, set it to white + if(!H.dna.features[primary_string]) + H.dna.features[primary_string] = "FFFFFF" + if(!H.dna.features[secondary_string]) + H.dna.features[secondary_string] = "FFFFFF" + if(!H.dna.features[tertiary_string]) + H.dna.features[tertiary_string] = "FFFFFF" if(!husk) if(!forced_colour) @@ -797,9 +804,18 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(MATRIXED) var/list/accessory_colorlist = list() - accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[primary_string]]00") - accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[secondary_string]]00") - accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[tertiary_string]]00") + if(S.matrixed_sections == MATRIX_RED || S.matrixed_sections == MATRIX_RED_GREEN || S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_ALL) + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[primary_string]]00") + else + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("00000000") + if(S.matrixed_sections == MATRIX_GREEN || S.matrixed_sections == MATRIX_RED_GREEN || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_ALL) + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[secondary_string]]00") + else + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("00000000") + if(S.matrixed_sections == MATRIX_BLUE || S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_ALL) + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("[H.dna.features[tertiary_string]]00") + else + accessory_colorlist += husk ? ReadRGB("#a3a3a3") : ReadRGB("00000000") accessory_colorlist += husk ? list(0, 0, 0) : list(0, 0, 0, hair_alpha) for(var/index in 1 to accessory_colorlist.len) accessory_colorlist[index] /= 255 From 20854dd63970b80a89a7c12fa6d71a28dbff2da6 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 22 Oct 2020 00:01:41 +0100 Subject: [PATCH 35/62] extra qol --- code/modules/mob/living/carbon/human/species.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index bfd3b2873a..28aa6eeb66 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -775,11 +775,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/tertiary_string = advanced_color_system ? "[S.mutant_part_string]_tertiary" : "mcolor3" //failsafe: if there's no value for any of these, set it to white if(!H.dna.features[primary_string]) - H.dna.features[primary_string] = "FFFFFF" + H.dna.features[primary_string] = advanced_color_system ? H.dna.features["mcolor"] : "FFFFFF" if(!H.dna.features[secondary_string]) - H.dna.features[secondary_string] = "FFFFFF" + H.dna.features[secondary_string] = advanced_color_system ? H.dna.features["mcolor2"] : "FFFFFF" if(!H.dna.features[tertiary_string]) - H.dna.features[tertiary_string] = "FFFFFF" + H.dna.features[tertiary_string] = advanced_color_system ? H.dna.features["mcolor3"] : "FFFFFF" if(!husk) if(!forced_colour) From a9a4d00171c8dc19fb7194503fa6bf449008a187 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 22 Oct 2020 00:08:33 +0100 Subject: [PATCH 36/62] second qol --- code/modules/client/preferences.dm | 13 +++++++------ .../mob/dead/new_player/sprite_accessories/tails.dm | 6 ++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bcd71399b9..73bded4f7c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -568,6 +568,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/primary_feature = "[accessory.mutant_part_string]_primary" var/secondary_feature = "[accessory.mutant_part_string]_secondary" var/tertiary_feature = "[accessory.mutant_part_string]_tertiary" + if(!features[primary_feature]) + features[primary_feature] = features["mcolor"] + if(!features[secondary_feature]) + features[secondary_feature] = features["mcolor2"] + if(!features[tertiary_feature]) + features[tertiary_feature] = features["mcolor3"] + var/matrixed_sections = accessory.matrixed_sections if(accessory.color_src == MATRIXED && !matrixed_sections) message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") @@ -583,18 +590,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(MATRIX_GREEN_BLUE) //composed of a green and blue section primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary - if(!features[primary_feature]) - features[primary_feature] = "FFFFFF" dat += "Primary Color
    " dat += "    Change
    " if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) - if(!features[secondary_feature]) - features[secondary_feature] = "FFFFFF" dat += "Secondary Color
    " dat += "    Change
    " if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) - if(!features[tertiary_feature]) - features[tertiary_feature] = "FFFFFF" dat += "Tertiary Color
    " dat += "    Change
    " diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 97c6114e8d..00e770fdc1 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -1,6 +1,6 @@ /datum/sprite_accessory/tails icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tails" + mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -8,7 +8,7 @@ /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tails" //keep this the same, ALWAYS, this is incredibly important for colouring! + mutant_part_string = "tail" //keep this the same, ALWAYS, this is incredibly important for colouring! relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /****************************************** @@ -564,7 +564,6 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect") - mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails/mam_tails/none @@ -576,7 +575,6 @@ /datum/sprite_accessory/tails_animated/mam_tails_animated color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' - mutant_part_string = "tail" //KEEP IT THE SAME relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric) From f778ec0199d80148232e9c2126dff6c66ab53a3e Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 22 Oct 2020 01:33:53 +0100 Subject: [PATCH 37/62] yeah lets maybe render stuff --- code/modules/client/preferences.dm | 2 +- .../dead/new_player/sprite_accessories/alienpeople.dm | 4 ++-- .../dead/new_player/sprite_accessories/body_markings.dm | 3 +-- .../mob/dead/new_player/sprite_accessories/ears.dm | 1 - .../mob/dead/new_player/sprite_accessories/ipc_synths.dm | 2 +- .../mob/dead/new_player/sprite_accessories/snouts.dm | 3 +-- .../mob/dead/new_player/sprite_accessories/tails.dm | 2 +- code/modules/mob/living/carbon/human/species.dm | 9 ++++++--- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 73bded4f7c..124fecfc2e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2082,7 +2082,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xenohead_primary","xenohead_secondary","xenohead_tertiary","tail_primary","tail_secondary","tail_tertiary","xenotail_primary","xenotail_secondary","xenotail_tertiary","mam_body_markings_primary","mam_body_markings_secondary","mam_body_markings_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","mam_snouts_primary","mam_snouts_secondary","mam_snouts_tertiary","mam_ears_primary","mam_ears_secondary","mam_ears_tertiary","spines_primary","spines_secondary","spines_tertiary","tail_lizard_primary","tail_lizard_secondary","tail_lizard_tertiary","tail_human_primary","tail_human_secondary","tail_human_tertiary","mam_tail_primary","mam_tail_secondary","mam_tail_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","antenna_primary","antenna_secondary","antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm index 4b0962e710..3972bdc2c3 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/alienpeople.dm @@ -27,7 +27,7 @@ *******************************************/ /datum/sprite_accessory/xeno_tail icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' - mutant_part_string = "xenotail" + mutant_part_string = "tail" relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/xeno_tail/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -46,7 +46,7 @@ *******************************************/ /datum/sprite_accessory/xeno_head icon = 'modular_citadel/icons/mob/xeno_parts_greyscale.dmi' - mutant_part_string = "xenohead" + mutant_part_string = "xhead" relevant_layers = list(BODY_ADJ_LAYER) /datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 383bdf4b7c..649a48f333 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) - mutant_part_string = "body_markings" + mutant_part_string = "bodymarkings" /datum/sprite_accessory/body_markings/none name = "None" @@ -49,7 +49,6 @@ gender_specific = 0 icon = 'modular_citadel/icons/mob/mam_markings.dmi' recommended_species = list("mammal", "xeno", "slimeperson", "podweak") - mutant_part_string = "mam_body_markings" matrixed_sections = MATRIX_ALL /datum/sprite_accessory/mam_body_markings/none diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index c4045d9afc..e09a0386ee 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -203,7 +203,6 @@ /datum/sprite_accessory/ears/mam_ears icon = 'modular_citadel/icons/mob/mam_ears.dmi' color_src = MATRIXED - mutant_part_string = "mam_ears" relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index 1c434c9c2d..1c332c3f34 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -132,7 +132,7 @@ color_src = MUTCOLORS2 relevant_layers = list(BODY_ADJ_LAYER) recommended_species = list("ipc") - mutant_part_string = "ipcantenna" + mutant_part_string = "antenna" /datum/sprite_accessory/antenna/none name = "None" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 084e06dd93..75b62e8c0f 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -1,6 +1,6 @@ /datum/sprite_accessory/snouts icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "snouts" + mutant_part_string = "snout" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) @@ -153,7 +153,6 @@ color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_snouts.dmi' recommended_species = list("mammal", "slimeperson", "insect", "podweak", "lizard") - mutant_part_string = "mam_snouts" relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER) /datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index 00e770fdc1..0b06fd4f45 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -8,7 +8,7 @@ /datum/sprite_accessory/tails_animated icon = 'icons/mob/mutant_bodyparts.dmi' - mutant_part_string = "tail" //keep this the same, ALWAYS, this is incredibly important for colouring! + mutant_part_string = "tailwag" //keep this the same, ALWAYS, this is incredibly important for colouring! relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER) /****************************************** diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 28aa6eeb66..2553ce59e6 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -770,9 +770,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) - var/primary_string = advanced_color_system ? "[S.mutant_part_string]_primary" : "mcolor" - var/secondary_string = advanced_color_system ? "[S.mutant_part_string]_secondary" : "mcolor2" - var/tertiary_string = advanced_color_system ? "[S.mutant_part_string]_tertiary" : "mcolor3" + var/mutant_string = S.mutant_part_string + if(mutant_string == "tailwag") //wagging tails should be coloured the same way as your tail + mutant_string = "tail" + var/primary_string = advanced_color_system ? "[mutant_string]_primary" : "mcolor" + var/secondary_string = advanced_color_system ? "[mutant_string]_secondary" : "mcolor2" + var/tertiary_string = advanced_color_system ? "[mutant_string]_tertiary" : "mcolor3" //failsafe: if there's no value for any of these, set it to white if(!H.dna.features[primary_string]) H.dna.features[primary_string] = advanced_color_system ? H.dna.features["mcolor"] : "FFFFFF" From f9d9eff986c858e062ec9091ef0197366d15f72a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 22 Oct 2020 01:04:03 +0000 Subject: [PATCH 38/62] 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 d68ed49325..d2d9c82b69 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -217,25 +217,6 @@
  • two snouts can once again be chosen in customization
  • lizard snouts work again
  • - -

    20 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • The cooking oil damage formula is no longer scuffed.
    • -
    • Changed the clockie help-link to lead to our own wiki.
    • -
    -

    Fikou updated:

    -
      -
    • admins can now do html in ahelps properly
    • -
    -

    Hatterhat updated:

    -
      -
    • Pirate threats are now announced as "business propositions", and their arrivals are now also announced properly.
    • -
    -

    tiramisuapimancer updated:

    -
      -
    • Ethereal hair is now their body color instead of accidentally white
    • -
    GoonStation 13 Development Team From c76205b7ec7731ff07006f98bdeb8fa08fb61c1a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 23 Oct 2020 01:04:38 +0000 Subject: [PATCH 39/62] Automatic changelog compile [ci skip] --- html/changelog.html | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index d2d9c82b69..218ffda134 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -196,27 +196,6 @@
  • plumbing
  • automatic hydro trays
  • - -

    21 August 2020

    -

    LetterN updated:

    -
      -
    • Updates and adds some of the tips
    • -
    -

    Putnam3145 updated:

    -
      -
    • added reftracking as a compile flag
    • -
    -

    SmArtKar updated:

    -
      -
    • RSD limitation is now 500 tiles
    • -
    • Fixed broken RSD sprites
    • -
    • Removed that shuttle limit
    • -
    -

    timothyteakettle updated:

    -
      -
    • two snouts can once again be chosen in customization
    • -
    • lizard snouts work again
    • -
    GoonStation 13 Development Team From f17bf787e7e56bf353b154048eef1115fcd4ef05 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 23 Oct 2020 20:19:25 +0100 Subject: [PATCH 40/62] render antennas --- .../mob/dead/new_player/sprite_accessories/ipc_synths.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm index 1c332c3f34..8bda196faa 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc_synths.dm @@ -132,7 +132,7 @@ color_src = MUTCOLORS2 relevant_layers = list(BODY_ADJ_LAYER) recommended_species = list("ipc") - mutant_part_string = "antenna" + mutant_part_string = "ipc_antenna" /datum/sprite_accessory/antenna/none name = "None" From b90dd5477d04cdc7c54ae7a326d61d1ea597fe86 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 24 Oct 2020 01:03:58 +0000 Subject: [PATCH 41/62] Automatic changelog compile [ci skip] --- html/changelog.html | 7 ------- 1 file changed, 7 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 218ffda134..3a8e397e5f 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -189,13 +189,6 @@
  • suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
  • twilight isnt earrape
  • - -

    22 August 2020

    -

    Time-Green (copypasta'd by lolman360) updated:

    -
      -
    • plumbing
    • -
    • automatic hydro trays
    • -
    GoonStation 13 Development Team From 7c72d121da1df01f73c88922f8020f22b9c78c6a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 25 Oct 2020 01:07:02 +0000 Subject: [PATCH 42/62] Automatic changelog compile [ci skip] --- html/changelog.html | 53 --------------------------------------------- 1 file changed, 53 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 3a8e397e5f..b214acd1f4 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -136,59 +136,6 @@
    • contraband black evening gloves in kinkvend
    - -

    23 August 2020

    -

    DeltaFire15 updated:

    -
      -
    • silicons and clockies can now access APCs properly
    • -
    -

    EmeraldSundisk updated:

    -
      -
    • Medbay now has a smartfridge for organ storage
    • -
    • Slight enhancements to the station's electrical wiring layout
    • -
    • Very small library renovation
    • -
    • Exterior airlocks have been given proper air systems for safety's sake
    • -
    -

    Ghommie updated:

    -
      -
    • Stops shielded hardsuits from slowly turning the wearer into a big glowing ball of stacked energy shield overlays.
    • -
    • the shielding overlay is merely visual as result. Aim your clicks.
    • -
    -

    Ludox235 updated:

    -
      -
    • no more 10 pop xenos (25pop now)
    • -
    -

    MrJWhit updated:

    -
      -
    • Increases the majority of airlocks by 1 tile.
    • -
    • Minor adjustments to the TEG engine.
    • -
    -

    Putnam3145 updated:

    -
      -
    • Simplemobs no longer count in dynamic.
    • -
    • "Story" storyteller no longer starts at a ludicrously low threat, always.
    • -
    • Blob threat now scales with coverage.
    • -
    • One person with their pref on no longer overpowers 40 people who might not even know there is one.
    • -
    • Negative-weight rulesets are no longer put into the list.
    • -
    -

    kiwedespars updated:

    -
      -
    • removed durathread from armwraps recipe.
    • -
    -

    lolman360 updated:

    -
      -
    • breath mask balaclava
    • -
    -

    timothyteakettle updated:

    -
      -
    • lizards are now a recommended species for mam snouts
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • new sprites for the temporal katana
    • -
    • suiciding with the temporal katana omae wa mou shinderius you into the shadow realm
    • -
    • twilight isnt earrape
    • -
    GoonStation 13 Development Team From 4304ac556c18c96bc6ca628fb44145e53d238b64 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 26 Oct 2020 01:06:27 +0000 Subject: [PATCH 43/62] Automatic changelog compile [ci skip] --- html/changelog.html | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index b214acd1f4..700dbde2c6 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -116,26 +116,6 @@
    • I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
    - -

    24 August 2020

    -

    MrJWhit updated:

    -
      -
    • Fixes areas on expanded airlocks
    • -
    -

    silicons updated:

    -
      -
    • wormhole jaunters work
    • -
    • wormhole jaunters no longer get interference from bags of holding
    • -
    • airlocks now only shock on pulse/wirecutters instead of on tgui panel open.
    • -
    -

    timothyteakettle updated:

    -
      -
    • three new items are in the loadout for all donators
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • contraband black evening gloves in kinkvend
    • -
    GoonStation 13 Development Team From f73437e97e22641e8089d40a2c6e1fce2d2c15aa Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 27 Oct 2020 01:06:41 +0000 Subject: [PATCH 44/62] 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 700dbde2c6..712327b88a 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -94,28 +94,6 @@
  • hierophant vortex blasts now have 50% armor penetration vs mecha
  • ventcrawling now kicks off every attached/buckled mob, even for non humans.
  • - -

    25 August 2020

    -

    Hatterhat updated:

    -
      -
    • Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them.
    • -
    -

    Literallynotpickles updated:

    -
      -
    • You can now equip handheld crew monitors on all medical-related winter coats.
    • -
    -

    Putnam3145 updated:

    -
      -
    • vore now ejects occupants on death
    • -
    -

    raspy-on-osu updated:

    -
      -
    • Thermoelectric Generator power output
    • -
    -

    timothyteakettle updated:

    -
      -
    • I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them.
    • -
    GoonStation 13 Development Team From a9f2b86da987fa3d423102a67c20ba9aa3023605 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 27 Oct 2020 21:32:08 +0000 Subject: [PATCH 45/62] tonne of fixes --- code/modules/client/preferences.dm | 3 ++- icons/mob/human_parts_greyscale.dmi | Bin 93083 -> 93018 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 124fecfc2e..792114050c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2082,7 +2082,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","antenna_primary","antenna_secondary","antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" @@ -2772,6 +2772,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.species.eye_type = eye_type if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids)) character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id + character.dna.species.limbs_id = chosen_limb_id //just to be safe when cloning character.dna.real_name = character.real_name character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 814ac9a396978778417364e269581257ef74347c..d196a04cd4f5a8e7da1802fe94a08684cbf1b12f 100644 GIT binary patch delta 33144 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 From a987420d223c34f0fd7420d2073f382d3380ebd9 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 27 Oct 2020 21:40:07 +0000 Subject: [PATCH 46/62] fix for mam markings --- code/modules/client/preferences.dm | 9 ++++--- code/modules/client/preferences_savefile.dm | 27 ++++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 792114050c..0e7f089f8c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -565,9 +565,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/datum/sprite_accessory/accessory = find_part_list[find_part] if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future - var/primary_feature = "[accessory.mutant_part_string]_primary" - var/secondary_feature = "[accessory.mutant_part_string]_secondary" - var/tertiary_feature = "[accessory.mutant_part_string]_tertiary" + var/mutant_string = accessory.mutant_part_string + if(!mutant_string) + mutant_string = "[accessory]" + var/primary_feature = "[mutant_string]_primary" + var/secondary_feature = "[mutant_string]_secondary" + var/tertiary_feature = "[mutant_string]_tertiary" if(!features[primary_feature]) features[primary_feature] = features["mcolor"] if(!features[secondary_feature]) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 2fa936e72e..07f98e3538 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -235,9 +235,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[accessory.mutant_part_string]_primary" - var/secondary_string = "[accessory.mutant_part_string]_secondary]" - var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" + var/mutant_string = accessory.mutant_part_string + if(!mutant_string) + mutant_string = "[accessory]" + var/primary_string = "[mutant_string]_primary" + var/secondary_string = "[mutant_string]_secondary]" + var/tertiary_string = "[mutant_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -842,9 +845,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[accessory.mutant_part_string]_primary" - var/secondary_string = "[accessory.mutant_part_string]_secondary]" - var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" + var/mutant_string = accessory.mutant_part_string + if(!mutant_string) + mutant_string = "[accessory]" + var/primary_string = "[mutant_string]_primary" + var/secondary_string = "[mutant_string]_secondary]" + var/tertiary_string = "[mutant_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -988,9 +994,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(ref_list) var/datum/sprite_accessory/accessory = ref_list[feature_value] if(accessory) - var/primary_string = "[accessory.mutant_part_string]_primary" - var/secondary_string = "[accessory.mutant_part_string]_secondary]" - var/tertiary_string = "[accessory.mutant_part_string]_tertiary]" + var/mutant_string = accessory.mutant_part_string + if(!mutant_string) + mutant_string = "[accessory]" + var/primary_string = "[mutant_string]_primary" + var/secondary_string = "[mutant_string]_secondary]" + var/tertiary_string = "[mutant_string]_tertiary]" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue From 87be4581d782d709cd7e3cba1447aec0feae1c7b Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 27 Oct 2020 22:14:35 +0000 Subject: [PATCH 47/62] better --- icons/mob/human_parts_greyscale.dmi | Bin 93087 -> 92836 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index fb864385c741d8dbea7de5752edeabdcbd00551e..3b97c3b38be5579bde4ed66e7c7df59e307a7f64 100644 GIT binary patch delta 34083 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

    3>l`l|r@xWY_GT$T=qcZ2p*Nw&J z2J<|Zm5Cdf{D%f-G3IWF&4K)ip(h~T#jp}^I~c;i1ZF-!QX+qDdEIkm_Htp<6EGdv z4}(0RzPkDrt>{hvi#{9Hf{Cj@(*zJThyT|( zfCZm?BTi#G4YZs9VbvDzrM#Q`huM=lIttOzwf; zd}e;WV(35Y%PJoV<(ba_l>~tA;1aW5Df+@VrC!R`=LsFp2L9+-ubH?6aWVF2utxm2 z_t&Z2Xr>(MbX9+&q+wb*&(f8A>IQZ{1gv~~{2L?>2v`w3AI47+#3<3im*zU*n1CUK zX5Sp86GWmwT$0MDwhaD<)K7r>7+qZ7;3}zP0M2)$8pX8Ouz(YilBF1Zs7yhU(OfSV zr1uBrLjQ%rQE;acRTM17m;`7UrVTdIKiu6t4xv#q0w#N`BU7iQ{mrK+25uY!!|%mp zLBYXOf_(@=b}#7q*c!+4L*%)Qz@>$MJQNMYSsyT0@sfAe6LJyPEqw_Y#sFPH6$A z^u$zuZ<_(&3vyctFuRQn&t+jSo1VfCirMhx1&wn0Fo|HQK&NG7ZoKFD12xp_W3<;X zf-o1h)p+ge2Qb1w3L-u61^oY%{yP}*tByavA2h_0N=wTW7{+(rgl79vNZo^&L0@S% zH+}o22}Cd`;wsb`#0=mdM#jR%8)5pW&I2ZGmE-r150LpZTa236L`N;yGBmMK>PFHzP3gH>z z@Xf2??*4&wfrn?eGl^O8A#Z{lTwU3?7)zx#aIJzmGG{N!C;;=Tc<`ApV2@r_9NEvy zE49y~yfLdkeg3YKhorF+=X%iu9h>xut+vhu;9U#~_fpZrr=P z;yv*#`8!bMPO+DGu)m2>8E>{jx4AL;jORVrn2OyXF-4eEenAw7dDl7nG0g3{HrR?= zOQ)3IrKozzv>iIphpMI^6^#faIB)x$(pOoS_V~jWnN-qq9TF=lq(NF`$CnqUU_`ND z{*jjiUJ}HGdSamG^03eDE&4zjbrKCU<`CxyEoOnk9^d%3R&nZIF}qiYqU!X6Lxbx- zJ@MZuwEG><671N3-N!+om-RuC2B#DU&yERr2v@|iNv{fuEw$enkx-px+hD&y-EI>J z1h3*?`LQ-zd1D=GSQ2nEks{tG8c1aEhF$(EW-FKX zg?~W!qu_`tSOtKkKMYql^{urPyXlUzjBqVHSWaB?6$6r(HR{ILDi>N#(eKphQh!!Wu@v_xHzOaQt~)hykGk8k!>*u-?7gl>ML Yq#4+Fu}=+ViAhUcU+vAgO;_*#KSv%&82|tP delta 34359 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 From f4f322dd0e0db017928d3501caff58194b9c47e2 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:39:43 +0000 Subject: [PATCH 48/62] better fix --- code/modules/client/preferences.dm | 3 ++- code/modules/client/preferences_savefile.dm | 9 ++++++--- code/modules/surgery/bodyparts/_bodyparts.dm | 12 +++++++++++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0e7f089f8c..1c4bc8cd9d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -567,7 +567,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - mutant_string = "[accessory]" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) + mutant_string = "mam_body_markings" var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index aa7eeb9ad3..3d653efbc1 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -237,7 +237,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(accessory) var/mutant_string = accessory.mutant_part_string if(!mutant_string) - mutant_string = "[accessory]" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) + mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" var/secondary_string = "[mutant_string]_secondary]" var/tertiary_string = "[mutant_string]_tertiary]" @@ -848,7 +849,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(accessory) var/mutant_string = accessory.mutant_part_string if(!mutant_string) - mutant_string = "[accessory]" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) + mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" var/secondary_string = "[mutant_string]_secondary]" var/tertiary_string = "[mutant_string]_tertiary]" @@ -998,7 +1000,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(accessory) var/mutant_string = accessory.mutant_part_string if(!mutant_string) - mutant_string = "[accessory]" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) + mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" var/secondary_string = "[mutant_string]_secondary]" var/tertiary_string = "[mutant_string]_tertiary]" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index beef8559a4..d530b5a4de 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -685,7 +685,17 @@ else body_markings = "plain" aux_marking = "plain" - markings_color = list(colorlist) + var/color_scheme = H.dna.features["color_scheme"] + if(color_scheme == ADVANCED_CHARACTER_COLORING) + var/alt_colorlist = list() + alt_colorlist.Cut() + alt_colorlist += ReadRGB("[H.dna.features["primary_mam_body_markings"]]00") + alt_colorlist += ReadRGB("[H.dna.features["secondary_mam_body_markings"]]00") + alt_colorlist += ReadRGB("[H.dna.features["tertiary_mam_body_markings"]]00") + alt_colorlist += list(0,0,0, S.hair_alpha) + markings_color = list(alt_colorlist) + else + markings_color = list(colorlist) else body_markings = null aux_marking = null From e78383f4fa686fe2c7d995f784205efd15559459 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 30 Oct 2020 19:42:02 +0000 Subject: [PATCH 49/62] typo --- code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index d530b5a4de..4ebc1e05b1 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -687,7 +687,7 @@ aux_marking = "plain" var/color_scheme = H.dna.features["color_scheme"] if(color_scheme == ADVANCED_CHARACTER_COLORING) - var/alt_colorlist = list() + var/list/alt_colorlist = list() alt_colorlist.Cut() alt_colorlist += ReadRGB("[H.dna.features["primary_mam_body_markings"]]00") alt_colorlist += ReadRGB("[H.dna.features["secondary_mam_body_markings"]]00") From 22823f629d8780086e210b99828f6c5aaccf78a7 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 1 Nov 2020 20:40:08 +0000 Subject: [PATCH 50/62] an actual fix --- code/modules/client/preferences.dm | 2 +- .../mob/living/carbon/human/species.dm | 1 + .../mob/living/carbon/human/update_icons.dm | 3 +++ code/modules/surgery/bodyparts/_bodyparts.dm | 19 +++++-------------- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1c4bc8cd9d..6f548363f4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2101,6 +2101,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + //advanced color mode toggle if("color_scheme") if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) @@ -2776,7 +2777,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.species.eye_type = eye_type if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids)) character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id - character.dna.species.limbs_id = chosen_limb_id //just to be safe when cloning character.dna.real_name = character.real_name character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2553ce59e6..c4fe0a3f5c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -175,6 +175,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Called when cloning, copies some vars that should be kept /datum/species/proc/copy_properties_from(datum/species/old_species) + mutant_bodyparts["limbs_id"] = old_species.mutant_bodyparts["limbs_id"] return //Please override this locally if you want to define when what species qualifies for what rank if human authority is enforced. diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7d7d420128..731cda3d86 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -708,6 +708,9 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if . += "-[BP.dmg_overlay_type]" if(BP.body_markings) . += "-[BP.body_markings]" + if(length(BP.markings_color) && length(BP.markings_color[1])) + for(var/color in BP.markings_color[1]) + . += "-[color]" else . += "-no_marking" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 4ebc1e05b1..8c07fe765d 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -638,11 +638,12 @@ species_flags_list = H.dna.species.species_traits //body marking memes + var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) var/list/colorlist = list() colorlist.Cut() - colorlist += ReadRGB("[H.dna.features["mcolor"]]00") - colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") - colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 @@ -685,17 +686,7 @@ else body_markings = "plain" aux_marking = "plain" - var/color_scheme = H.dna.features["color_scheme"] - if(color_scheme == ADVANCED_CHARACTER_COLORING) - var/list/alt_colorlist = list() - alt_colorlist.Cut() - alt_colorlist += ReadRGB("[H.dna.features["primary_mam_body_markings"]]00") - alt_colorlist += ReadRGB("[H.dna.features["secondary_mam_body_markings"]]00") - alt_colorlist += ReadRGB("[H.dna.features["tertiary_mam_body_markings"]]00") - alt_colorlist += list(0,0,0, S.hair_alpha) - markings_color = list(alt_colorlist) - else - markings_color = list(colorlist) + markings_color = list(colorlist) else body_markings = null aux_marking = null From ede19dd47dc865df4a2c03640e4fac882186180e Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 1 Nov 2020 23:25:09 +0000 Subject: [PATCH 51/62] Update preferences_savefile.dm --- 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 3d653efbc1..d7698cdd78 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 41 +#define SAVEFILE_VERSION_MAX 42 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,7 +226,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 41) //extreme changes to how things are coloured (the introduction of the advanced coloring system) + if(current_version < 42) //extreme changes to how things are coloured (the introduction of the advanced coloring system) features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) var/feature_value = features[feature] From f34882cf60267eb1c315eb17a2d25ace50c9f3b9 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 1 Nov 2020 23:27:34 +0000 Subject: [PATCH 52/62] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d7698cdd78..1e839961eb 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -245,15 +245,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue - if(accessory.color_src == MATRIXED) + var/primary_exists = features[primary_string] + var/secondary_exists = features[secondary_string] + var/tertiary_exists = features[tertiary_string] + if(accessory.color_src == MATRIXED && !primary_exists && !secondary_exists && !tertiary_exists) features[primary_string] = features["mcolor"] features[secondary_string] = features["mcolor2"] features[tertiary_string] = features["mcolor3"] - else if(accessory.color_src == MUTCOLORS) + else if(accessory.color_src == MUTCOLORS && !primary_exists) features[primary_string] = features["mcolor"] - else if(accessory.color_src == MUTCOLORS2) + else if(accessory.color_src == MUTCOLORS2 && !secondary_exists) features[secondary_string] = features["mcolor2"] - else if(accessory.color_src == MUTCOLORS3) + else if(accessory.color_src == MUTCOLORS3 && !tertiary_exists) features[tertiary_string] = features["mcolor3"] features["color_scheme"] = OLD_CHARACTER_COLORING //advanced is off by default From 8126eb5a12077e2f0f70ffe8df820e49dc4ba73c Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 2 Nov 2020 23:07:27 +0000 Subject: [PATCH 53/62] fixes a lot of things --- code/modules/client/preferences.dm | 12 ++++++------ .../new_player/sprite_accessories/body_markings.dm | 2 +- code/modules/mob/living/carbon/human/update_icons.dm | 2 ++ code/modules/surgery/bodyparts/_bodyparts.dm | 7 +++---- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6f548363f4..bd73a6cb3c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -567,8 +567,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) - mutant_string = "mam_body_markings" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) + continue var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" @@ -1603,10 +1603,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) 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) + for(var/modified_limb in modified_limbs) + if(modified_limbs[modified_limb][1] == LOADOUT_LIMB_PROSTHETIC && modified_limb != limb_type) number_of_prosthetics += 1 - if(number_of_prosthetics >= MAXIMUM_LOADOUT_PROSTHETICS && !(limb_type in modified_limbs && modified_limbs[limb_type][1] == LOADOUT_LIMB_PROSTHETIC)) + 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 @@ -2086,7 +2086,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index 649a48f333..6c510807b4 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -5,7 +5,7 @@ /datum/sprite_accessory/body_markings icon = 'icons/mob/mutant_bodyparts.dmi' relevant_layers = list(BODY_ADJ_LAYER) - mutant_part_string = "bodymarkings" + mutant_part_string = "body_markings" /datum/sprite_accessory/body_markings/none name = "None" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 731cda3d86..e9a313ce98 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -711,6 +711,8 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if if(length(BP.markings_color) && length(BP.markings_color[1])) for(var/color in BP.markings_color[1]) . += "-[color]" + if(BP.icon) + . += "-[BP.icon]" else . += "-no_marking" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 8c07fe765d..beef8559a4 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -638,12 +638,11 @@ species_flags_list = H.dna.species.species_traits //body marking memes - var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) var/list/colorlist = list() colorlist.Cut() - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 From 022f996cfadf5f3aecb4e4e7e4a994022ecbb662 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Thu, 5 Nov 2020 17:28:32 +0000 Subject: [PATCH 54/62] better fix --- code/__DEFINES/citadel_defines.dm | 3 + code/modules/client/preferences.dm | 75 ++------------------ code/modules/client/preferences_savefile.dm | 1 + code/modules/surgery/bodyparts/_bodyparts.dm | 6 +- 4 files changed, 11 insertions(+), 74 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 541b50e9bd..a916d00943 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -128,3 +128,6 @@ //defines for the two colour schemes, advanced and old #define OLD_CHARACTER_COLORING "old_color_system" #define ADVANCED_CHARACTER_COLORING "advanced_color_system" + +//define for the default feature list used in preferences, because you can't get it using initial +#define DEFAULT_FEATURE_LIST list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bd73a6cb3c..c97344ccff 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -101,74 +101,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", - "mcolor2" = "FFFFFF", - "mcolor3" = "FFFFFF", - "tail_lizard" = "Smooth", - "tail_human" = "None", - "snout" = "Round", - "horns" = "None", - "horns_color" = "85615a", - "ears" = "None", - "wings" = "None", - "wings_color" = "FFF", - "frills" = "None", - "deco_wings" = "None", - "spines" = "None", - "body_markings" = "None", - "legs" = "Plantigrade", - "insect_wings" = "Plain", - "insect_fluff" = "None", - "insect_markings" = "None", - "arachnid_legs" = "Plain", - "arachnid_spinneret" = "Plain", - "arachnid_mandibles" = "Plain", - "mam_body_markings" = "Plain", - "mam_ears" = "None", - "mam_snouts" = "None", - "mam_tail" = "None", - "mam_tail_animated" = "None", - "xenodorsal" = "Standard", - "xenohead" = "Standard", - "xenotail" = "Xenomorph Tail", - "taur" = "None", - "genitals_use_skintone" = FALSE, - "has_cock" = FALSE, - "cock_shape" = DEF_COCK_SHAPE, - "cock_length" = COCK_SIZE_DEF, - "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, - "cock_color" = "ffffff", - "cock_taur" = FALSE, - "has_balls" = FALSE, - "balls_color" = "ffffff", - "balls_shape" = DEF_BALLS_SHAPE, - "balls_size" = BALLS_SIZE_DEF, - "balls_cum_rate" = CUM_RATE, - "balls_cum_mult" = CUM_RATE_MULT, - "balls_efficiency" = CUM_EFFICIENCY, - "has_breasts" = FALSE, - "breasts_color" = "ffffff", - "breasts_size" = BREASTS_SIZE_DEF, - "breasts_shape" = DEF_BREASTS_SHAPE, - "breasts_producing" = FALSE, - "has_vag" = FALSE, - "vag_shape" = DEF_VAGINA_SHAPE, - "vag_color" = "ffffff", - "has_womb" = FALSE, - "balls_visibility" = GEN_VISIBLE_NO_UNDIES, - "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, - "cock_visibility" = GEN_VISIBLE_NO_UNDIES, - "vag_visibility" = GEN_VISIBLE_NO_UNDIES, - "ipc_screen" = "Sunburst", - "ipc_antenna" = "None", - "flavor_text" = "", - "silicon_flavor_text" = "", - "ooc_notes" = "", - "meat_type" = "Mammalian", - "body_model" = MALE, - "body_size" = RESIZE_DEFAULT_SIZE, - "color_scheme" = OLD_CHARACTER_COLORING - ) + var/list/features = DEFAULT_FEATURE_LIST 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() //prosthetic/amputated limbs @@ -567,8 +500,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) - continue + if(istype(accessory, /datum/sprite_accessory/mam_body_markings) + mutant_string = "mam_body_markings" var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" @@ -2086,7 +2019,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","bodymarkings_primary","bodymarkings_secondary","bodymarkings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 1e839961eb..7517fe19ef 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -524,6 +524,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE + features = DEFAULT_FEATURE_LIST S.cd = "/" if(!slot) slot = default_slot diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index beef8559a4..0b86d3a191 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -640,9 +640,9 @@ //body marking memes var/list/colorlist = list() colorlist.Cut() - colorlist += ReadRGB("[H.dna.features["mcolor"]]00") - colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") - colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor1"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 From a7e0bafde37e708851f30808fabee2add77c4b04 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 01:46:43 +0000 Subject: [PATCH 55/62] fixes --- code/modules/client/preferences.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c97344ccff..8d39c0b352 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings) + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) mutant_string = "mam_body_markings" var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 0b86d3a191..57b56e0231 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -639,6 +639,7 @@ //body marking memes var/list/colorlist = list() + var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor1"]]00") colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") From 2fb9dc88e73d7d80f4f1b6e83785f70e8927cee4 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 02:23:55 +0000 Subject: [PATCH 56/62] Revert "fixes" This reverts commit a7e0bafde37e708851f30808fabee2add77c4b04. --- code/modules/client/preferences.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8d39c0b352..c97344ccff 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) + if(istype(accessory, /datum/sprite_accessory/mam_body_markings) mutant_string = "mam_body_markings" var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 57b56e0231..0b86d3a191 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -639,7 +639,6 @@ //body marking memes var/list/colorlist = list() - var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor1"]]00") colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") From 48ecffa8f44f262309e5a243d8b937f605b6f322 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 12:48:00 +0000 Subject: [PATCH 57/62] Revert "Revert "fixes"" This reverts commit 2fb9dc88e73d7d80f4f1b6e83785f70e8927cee4. --- code/modules/client/preferences.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c97344ccff..8d39c0b352 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -500,7 +500,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings) + if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) mutant_string = "mam_body_markings" var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 0b86d3a191..57b56e0231 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -639,6 +639,7 @@ //body marking memes var/list/colorlist = list() + var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor1"]]00") colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") From d358a170fadf595e01c71c00c576bedf56b98a92 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 14:32:10 +0000 Subject: [PATCH 58/62] fixes --- code/modules/client/preferences.dm | 2 -- code/modules/mob/living/carbon/human/update_icons.dm | 1 + code/modules/surgery/bodyparts/_bodyparts.dm | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8d39c0b352..2885f1480a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2771,8 +2771,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_limb.replace_limb(character) qdel(old_part) - character.regenerate_icons() - SEND_SIGNAL(character, COMSIG_HUMAN_PREFS_COPIED_TO, src, icon_updates, roundstart_checks) //let's be sure the character updates diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e9a313ce98..f85efcf7f6 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -669,6 +669,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if //produces a key based on the human's limbs /mob/living/carbon/human/generate_icon_render_key() . = "[dna.species.mutant_bodyparts["limbs_id"]]" + . += "[dna.features["color_scheme"]]" if(dna.check_mutation(HULK)) . += "-coloured-hulk" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 57b56e0231..4d7d63f320 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -641,7 +641,7 @@ var/list/colorlist = list() var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor1"]]00") + colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) From 7a82f53e75c4724d440ed349ac137cbf298f98b4 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 16:45:32 +0000 Subject: [PATCH 59/62] attempte fixes --- code/__DEFINES/citadel_defines.dm | 3 --- code/modules/client/preferences.dm | 3 ++- code/modules/client/preferences_savefile.dm | 3 ++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index a916d00943..541b50e9bd 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -128,6 +128,3 @@ //defines for the two colour schemes, advanced and old #define OLD_CHARACTER_COLORING "old_color_system" #define ADVANCED_CHARACTER_COLORING "advanced_color_system" - -//define for the default feature list used in preferences, because you can't get it using initial -#define DEFAULT_FEATURE_LIST list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2885f1480a..54824696f8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -101,7 +101,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = DEFAULT_FEATURE_LIST + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + 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() //prosthetic/amputated limbs diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 7517fe19ef..30ea524aef 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -524,7 +524,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE - features = DEFAULT_FEATURE_LIST + features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + S.cd = "/" if(!slot) slot = default_slot From 185939a09f650643c5e16c34af97bd99bfd77bf7 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 16:49:49 +0000 Subject: [PATCH 60/62] stable version --- code/modules/client/preferences.dm | 5 ++--- code/modules/surgery/bodyparts/_bodyparts.dm | 12 ++++++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 54824696f8..ab6eef1971 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -500,9 +500,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string - if(!mutant_string) - if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) - mutant_string = "mam_body_markings" + if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) + continue var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 4d7d63f320..59e3cc0699 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -639,14 +639,18 @@ //body marking memes var/list/colorlist = list() - var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) + //var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") - colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") + //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") + //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") + //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") + colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 + message_admins("[source] update to [colorlist[index]]") if(S.use_skintones) skin_tone = H.skin_tone From b6aa8c352ea3ea94e8067e54996b9ce49602e91a Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 8 Nov 2020 16:50:09 +0000 Subject: [PATCH 61/62] remove message --- code/modules/surgery/bodyparts/_bodyparts.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 59e3cc0699..f706dd10d9 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -650,7 +650,6 @@ colorlist += list(0,0,0, S.hair_alpha) for(var/index=1, index<=colorlist.len, index++) colorlist[index] = colorlist[index]/255 - message_admins("[source] update to [colorlist[index]]") if(S.use_skintones) skin_tone = H.skin_tone From 9cfecfa507dfe9809564d653337e15dc0c4c6a55 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 10 Nov 2020 23:07:01 +0000 Subject: [PATCH 62/62] Update preferences_savefile.dm --- code/modules/client/preferences_savefile.dm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 30ea524aef..b332c64a6f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 42 +#define SAVEFILE_VERSION_MAX 43 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -226,7 +226,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car left_eye_color = "#BAB99E" right_eye_color = "#BAB99E" - if(current_version < 42) //extreme changes to how things are coloured (the introduction of the advanced coloring system) + if(current_version < 43) //extreme changes to how things are coloured (the introduction of the advanced coloring system) features["color_scheme"] = OLD_CHARACTER_COLORING //disable advanced coloring system by default for(var/feature in features) var/feature_value = features[feature] @@ -240,8 +240,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" - var/secondary_string = "[mutant_string]_secondary]" - var/tertiary_string = "[mutant_string]_tertiary]" + var/secondary_string = "[mutant_string]_secondary" + var/tertiary_string = "[mutant_string]_tertiary" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (migration from [current_version] to 39): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -857,8 +857,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" - var/secondary_string = "[mutant_string]_secondary]" - var/tertiary_string = "[mutant_string]_tertiary]" + var/secondary_string = "[mutant_string]_secondary" + var/tertiary_string = "[mutant_string]_tertiary" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (loading data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue @@ -1008,8 +1008,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(istype(accessory, /datum/sprite_accessory/mam_body_markings)) mutant_string = "mam_body_markings" var/primary_string = "[mutant_string]_primary" - var/secondary_string = "[mutant_string]_secondary]" - var/tertiary_string = "[mutant_string]_tertiary]" + var/secondary_string = "[mutant_string]_secondary" + var/tertiary_string = "[mutant_string]_tertiary" if(accessory.color_src == MATRIXED && !accessory.matrixed_sections && feature_value != "None") message_admins("Sprite Accessory Failure (saving data): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") continue