From 30779d1204fa9537dae5e3c8624f4ff582755df3 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 24 May 2018 10:03:13 -0400 Subject: [PATCH 001/267] Prometheans can now be revived as originally intended. --- code/modules/organs/internal/brain.dm | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 0dc2fd1fc4..ee01d7ae1e 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -137,10 +137,103 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) icon_state = "green slime extract" parent_organ = BP_TORSO clone_source = TRUE + flags = OPENCONTAINER /obj/item/organ/internal/brain/slime/is_open_container() return 1 +/obj/item/organ/internal/brain/slime/New() + ..() + create_reagents(50) + +/obj/item/organ/internal/brain/slime/proc/reviveBody() + var/datum/dna2/record/R = new /datum/dna2/record() + R.dna = brainmob.dna + R.ckey = brainmob.ckey + R.id = copytext(md5(brainmob.real_name), 2, 6) + R.name = R.dna.real_name + R.types = DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE + R.languages = brainmob.languages + R.flavor = list() + for(var/datum/modifier/mod in brainmob.modifiers) + if(mod.flags & MODIFIER_GENETIC) + R.genetic_modifiers.Add(mod.type) + + var/datum/mind/clonemind = brainmob.mind + + if(!istype(clonemind, /datum/mind)) //not a mind + return 0 + if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body + return 0 + if(clonemind.active) //somebody is using that mind + if(ckey(clonemind.key) != R.ckey) + return 0 + else + for(var/mob/observer/dead/G in player_list) + if(G.ckey == R.ckey) + if(G.can_reenter_corpse) + break + else + return 0 + + for(var/modifier_type in R.genetic_modifiers) //Can't be revived. Probably won't happen...? + if(istype(modifier_type, /datum/modifier/no_clone)) + return 0 + + var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(src), R.dna.species) + + if(!R.dna) + H.dna = new /datum/dna() + H.dna.real_name = H.real_name + else + H.dna = R.dna + + H.UpdateAppearance() + H.sync_organ_dna() + if(!R.dna.real_name) //to prevent null names + R.dna.real_name = "promethean ([rand(0,999)])" + H.real_name = R.dna.real_name + + H.nutrition = 260 //Enough to try to regenerate ONCE. + H.adjustBruteLoss(40) + H.adjustFireLoss(40) + H.Paralyse(4) + H.updatehealth() + for(var/obj/item/organ/external/E in H.organs) //They've still gotta congeal, but it's faster than the clone sickness they'd normally get. + if(E && E.organ_tag == BP_L_ARM || E.organ_tag == BP_R_ARM || E.organ_tag == BP_L_LEG || E.organ_tag == BP_R_LEG) + E.removed() + qdel(E) + E = null + H.regenerate_icons() + clonemind.transfer_to(H) + for(var/modifier_type in R.genetic_modifiers) + H.add_modifier(modifier_type) + + for(var/datum/language/L in R.languages) + H.add_language(L.name) + H.flavor_texts = R.flavor.Copy() + qdel(src) + return 1 + +/datum/chemical_reaction/promethean_brain_revival + name = "Promethean Revival" + id = "prom_revival" + result = null + required_reagents = list("phoron" = 40) + result_amount = 1 + +/datum/chemical_reaction/promethean_brain_revival/can_happen(var/datum/reagents/holder) + if(holder.my_atom && istype(holder.my_atom, /obj/item/organ/internal/brain/slime)) + return ..() + return FALSE + +/datum/chemical_reaction/promethean_brain_revival/on_reaction(var/datum/reagents/holder) + var/obj/item/organ/internal/brain/slime/brain = holder.my_atom + if(brain.reviveBody()) + brain.visible_message("[brain] bubbles, surrounding itself with a rapidly expanding mass of slime!") + else + brain.visible_message("[brain] shifts strangely, but falls still.") + /obj/item/organ/internal/brain/golem name = "chem" desc = "A tightly furled roll of paper, covered with indecipherable runes." From f4645449b45db5e4078af969e7e8061576d10888 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Fri, 25 May 2018 15:36:55 -0500 Subject: [PATCH 002/267] Adds armor to certain mobs, mercs have knives --- .../mob/living/simple_animal/aliens/drone.dm | 1 + .../simple_animal/humanoids/mechamobs.dm | 4 +- .../simple_animal/humanoids/syndicate.dm | 10 ++++- html/changelogs/Anewbe - More Merc PoIs.yml | 37 +++++++++++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 html/changelogs/Anewbe - More Merc PoIs.yml diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm index 35e09030dd..e51dfd82a7 100644 --- a/code/modules/mob/living/simple_animal/aliens/drone.dm +++ b/code/modules/mob/living/simple_animal/aliens/drone.dm @@ -27,6 +27,7 @@ destroy_surroundings = 0 hovering = TRUE + armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 100) // Some level of armor plating makes sense //Drones aren't affected by atmos. min_oxy = 0 max_oxy = 0 diff --git a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm index c7645d2352..9f8c737894 100644 --- a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm +++ b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm @@ -31,6 +31,8 @@ attacktext = list("slashed") attack_sound = 'sound/weapons/bladeslice.ogg' + armor = list(melee = 40, bullet = 40, laser = 50, energy = 45, bomb = 20, bio = 100, rad = 100) // As close to the actual Dark Gygax as possible + min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -43,7 +45,7 @@ ranged = 1 rapid = 1 - projectiletype = /obj/item/projectile/beam + projectiletype = /obj/item/projectile/beam/midlaser projectilesound = 'sound/weapons/laser.ogg' speak_chance = 1 diff --git a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm index dc57fd00f9..9a11178e66 100644 --- a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm +++ b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm @@ -29,10 +29,14 @@ response_harm = "hits" harm_intent_damage = 5 - melee_damage_lower = 10 + melee_damage_lower = 15 //Tac Knife damage melee_damage_upper = 15 environment_smash = 1 - attacktext = list("punched") + attack_sharp = 1 + attack_edge = 1 + attacktext = list("slashed", "stabbed") + + armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities min_oxy = 5 max_oxy = 0 @@ -119,6 +123,8 @@ speed = 0 + armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit + min_oxy = 0 max_oxy = 0 min_tox = 0 diff --git a/html/changelogs/Anewbe - More Merc PoIs.yml b/html/changelogs/Anewbe - More Merc PoIs.yml new file mode 100644 index 0000000000..d13768b1e0 --- /dev/null +++ b/html/changelogs/Anewbe - More Merc PoIs.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Certain mobs, namely robots and mercs, now have some amount of armor." + - rscadd: "Ranged mercs will now knife people when cornered, rather than punch them really hard." From da2bb9567e08781f8bec9046ec5b04ea6ba2910d Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 27 May 2018 14:01:43 -0400 Subject: [PATCH 003/267] Prevent autosay() from creating/deleting AIs Now it gets one dedicated AI it can move around instead. --- code/_helpers/global_lists.dm | 1 + code/game/objects/items/devices/radio/radio.dm | 4 +--- code/modules/mob/living/silicon/ai/ai.dm | 13 ++++++++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 95f8dcdbe7..97c1338deb 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -9,6 +9,7 @@ var/global/list/player_list = list() //List of all mobs **with clients attach var/global/list/mob_list = list() //List of all mobs, including clientless var/global/list/human_mob_list = list() //List of all human mobs and sub-types, including clientless var/global/list/silicon_mob_list = list() //List of all silicon mobs, including clientless +var/global/list/ai_list = list() //List of all AIs, including clientless var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player var/global/list/listening_objects = list() //List of all objects which care about receiving messages (communicators, radios, etc) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index f5f85fe8f5..801b7e60cf 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -247,14 +247,12 @@ var/global/list/default_medbay_channels = list( if (!connection) return - var/mob/living/silicon/ai/A = new /mob/living/silicon/ai(src, null, null, 1) + var/static/mob/living/silicon/ai/announcer/A = new /mob/living/silicon/ai/announcer(src, null, null, 1) A.SetName(from) Broadcast_Message(connection, A, 0, "*garbled automated announcement*", src, message, from, "Automated Announcement", from, "synthesized voice", 4, 0, list(0), connection.frequency, "states") - qdel(A) - return // Interprets the message mode when talking into a radio, possibly returning a connection datum /obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, message, message_mode) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 2b11059ff9..927216190a 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1,7 +1,6 @@ #define AI_CHECK_WIRELESS 1 #define AI_CHECK_RADIO 2 -var/list/ai_list = list() var/list/ai_verbs_default = list( // /mob/living/silicon/ai/proc/ai_recall_shuttle, /mob/living/silicon/ai/proc/ai_emergency_message, @@ -789,5 +788,17 @@ var/list/ai_verbs_default = list( // If that is ever fixed please update this proc. return TRUE +//Special subtype kept around for global announcements +/mob/living/silicon/ai/announcer/initialize() + . = ..() + mob_list -= src + living_mob_list -= src + dead_mob_list -= src + ai_list -= src + silicon_mob_list -= src + +/mob/living/silicon/ai/announcer/Life() + return + #undef AI_CHECK_WIRELESS #undef AI_CHECK_RADIO From 0001b3fe38dc0d0b31d2a5659712e4d9d52d54d9 Mon Sep 17 00:00:00 2001 From: Heroman3003 Date: Mon, 28 May 2018 09:51:32 +1000 Subject: [PATCH 004/267] Fixed arcades dispensing their own boards. --- code/game/machinery/computer/arcade.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index bdf4e95fe0..0724cd15be 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -45,7 +45,7 @@ qdel(src) /obj/machinery/computer/arcade/proc/prizevend() - if(!contents.len) + if(!(contents-circuit).len) var/prizeselect = pickweight(prizes) new prizeselect(src.loc) @@ -53,7 +53,7 @@ new /obj/item/clothing/head/syndicatefake(src.loc) else - var/atom/movable/prize = pick(contents) + var/atom/movable/prize = pick(contents-circuit) prize.loc = src.loc /obj/machinery/computer/arcade/attack_ai(mob/user as mob) @@ -272,7 +272,7 @@ /obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user) if(!emagged) to_chat(user, span("notice","You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Hyper-Lethal Mode.")) - + temp = "If you die in the game, you die for real!" player_hp = 30 player_mp = 10 @@ -407,7 +407,7 @@ if(emagged) var/mob/living/M = user M.adjust_fire_stacks(5) - M.IgniteMob() //flew into a star, so you're on fire + M.IgniteMob() //flew into a star, so you're on fire to_chat(user,span("danger", "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames.")) dat += "

OK...

" From fb9bfd863959cee224d5bd489a50aef86c71b6b0 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 29 May 2018 13:34:44 -0400 Subject: [PATCH 005/267] Move character join log statement Was only logging latejoins due to where this line was placed. Moved it into job controller to catch any time anyone is assigned a job period. --- code/game/jobs/job_controller.dm | 1 + code/modules/mob/new_player/new_player.dm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 75e17bd792..04dbaffb53 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -419,6 +419,7 @@ var/global/datum/controller/occupations/job_master H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." H.job = rank + log_game("JOINED [key_name(H)] as \"[rank]\"") // If they're head, give them the account info for their department if(H.mind && job.head_position) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 99036e2e9d..ceced1549f 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -349,7 +349,6 @@ var/mob/living/character = create_character(T) //creates the human and transfers vars and mind character = job_master.EquipRank(character, rank, 1) //equips the human UpdateFactionList(character) - log_game("JOINED [key_name(character)] as \"[rank]\"") // AIs don't need a spawnpoint, they must spawn at an empty core if(character.mind.assigned_role == "AI") From 48bf825472470a2bc6f43cd49d0441e8f3bf62fb Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 29 May 2018 14:40:54 -0400 Subject: [PATCH 006/267] Fix surgery breaking bones when performed correctly I have to believe this is somehow misplaced. "Whoops!" --- code/modules/surgery/encased.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 2ab82cd2ae..7bc33d7500 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -103,10 +103,6 @@ affected.open = 3 - // Whoops! - if(prob(10)) - affected.fracture() - /datum/surgery_step/open_encased/retract/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) return From 77a00e53d168eb85c9da8035833a4298232b9ef1 Mon Sep 17 00:00:00 2001 From: Heroman3003 Date: Thu, 31 May 2018 13:01:40 +1000 Subject: [PATCH 007/267] fixed xenoarch multitool being unmakeable --- code/modules/research/designs.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1484cff07f..ca5a88db4b 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1819,7 +1819,7 @@ CIRCUITS BELOW build_path = /obj/item/device/universal_translator/ear sort_string = "HABQB" -/datum/design/obj/item/device/xenoarch_multi_tool +/datum/design/item/xenoarch_multi_tool name = "xenoarcheology multitool" id = "xenoarch_multitool" req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3) @@ -1827,13 +1827,14 @@ CIRCUITS BELOW materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500) sort_string = "HABQC" -/datum/design/excavationdrill +/datum/design/item/excavationdrill name = "Excavation Drill" id = "excavationdrill" req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3) build_type = PROTOLATHE materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) build_path = /obj/item/weapon/pickaxe/excavationdrill + sort_string = "HABQD" /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert From 4c6f5add29443e2bc9123356742c7e52c4f8ba49 Mon Sep 17 00:00:00 2001 From: SubberTheFabulous Date: Fri, 1 Jun 2018 23:15:25 +0700 Subject: [PATCH 008/267] Two new unbranded prosthesis --- code/modules/organs/robolimbs.dm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 2e7d9ad6ed..bf987eb0d3 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -57,6 +57,18 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ monitor_styles = standard_monitor_styles unavailable_to_build = 1 +/datum/robolimb/unbranded_alt1 + company = "Unbranded - Protez" + desc = "A simple robotic limb with retro design. Seems rather stiff." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi' + unavailable_to_build = 1 + +/datum/robolimb/unbranded_alt2 + company = "Unbranded - Mantis Prosis" + desc = "This limb has a casing of sleek black metal and repulsive insectile design." + icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi' + unavailable_to_build = 1 + /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." From 987172b625e6af9a111e54bbed2ccaca930c5142 Mon Sep 17 00:00:00 2001 From: SubberTheFabulous Date: Fri, 1 Jun 2018 23:18:15 +0700 Subject: [PATCH 009/267] Two new unbranded prosthesis --- .../cyberlimbs/unbranded/unbranded_alt1.dmi | Bin 0 -> 1426 bytes .../cyberlimbs/unbranded/unbranded_alt2.dmi | Bin 0 -> 1850 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi create mode 100644 icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi diff --git a/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi b/icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi new file mode 100644 index 0000000000000000000000000000000000000000..76bd5844a23d8489fe7d323e21e4292883c20e42 GIT binary patch literal 1426 zcmY*Zdpy%?82_#4lru*{j@6J{K4r%w9F>DGY%b-ll!-$V#bE$ z9smH6xxnP^ow9X|;uIv?5NBPy5N&O3W@cu7etsMdhtKCzsZ?16g+guh9tVzZ?Y*a{ zgjX~*H6@Wq3972;>FGob4O?4VGKqx4;hdeFy}iACeS8=@Xx_3iP_&1eCtx!(5-J1L zcrU+b`w(0(HY_SSEbJw7p>+;;cdarLV7X>74hld8^8MZqC@?#1Y?FBOHa z^mbQ-L)V0?c@xIAWmb+3%MTY_F^b^8lM}oM=>zT^y z^?wX%Sz~HKk(Mr_NDCg2#fQg&;7psyt<#myHb=N6Mu#!16>JMGgS1p+U9+WqzRQuU z95C|$%9-AGP~uz{S|TqLq1BZmiABg3vnNFb4r}}1msrf^UG?z;5;>_%@$U?s z))N&o#U&{3zWEbnGZyCRr$S^{lv%k=lBbFG5T*F!WV5q*Y6JLJO5(=SAY{A?Z&@^L3}{j z>(k|Iqug<6yB;ac6QyTB*MIlRWrnq8zIbl!LjV%nM8x@-*6yIj-@UnDPL}1lK7N4- zLv`sYACcdTZ;>7fsx`gdhp_9lGJiTi5FU}tEq5lt%>4G8Tg<0tmMovle%_Kha65mR zQO&ruD*7}0jb&euIiGlZX@$jU{#aERqjnS$3R)oqk{^yso#lhX-0Y==1$Nl)hT&03 zCt9Bj-{gEjXVjH~=>B8*BxNJbag8cLe_q@g{6eb#z@!_thg@<%u$U|iu(YsJSQGv5 zosIyI0#B)JImHxJSwO*%=qjOzawW4f!W`nT+~hknKR>izPxh|SE+;W2bXX4GEI9U8 zOQ8y0%w_c6{)0XdxEH?b?W)o~*@1b@tGR~?Q=M&V+i-gfzge5Q_WI|qk)@g{&{Phk zUG9uEP4J*~m;cMBx7KXhbZ_jmEt#BUtwM#QfylaZg#_`NZW|q!CE?UY-bN&Tn0#N= z$_Rd=tZYng|G|WQv_We-#uZD+nvF4*#KarRAC&yXOq1R#|Ei%^ZDIKN1=w+$KUwI- zw|IL|dpIXbv2Jy0!)@vRHwV@!xEAZl;OuowIP{T-sArfPdjM58@IFJ%G1)FDb2El# z3B;=BtACiego>yZ6eKsE;TAVK1*c`+t*>CJZ2tG-Fg3>ncNVPWt?CI4i=Unz4H<_W zqw8(D=En68PPkLDA^wIvG!P~)<>#FZ_lu=v8;QJ-D?E2bFWZ_L7dAg=?K%d#(Y{tu z9sylJBCO^FH5@yv{}uFXmq`q73j*<+goQooPFmrXICSyqD3>Mghe=H(jWht+?8QSf zP?brC=a87oNk0+X3U_={eA`>^ytNiAiK~BRR+BS8dm$K}@TO#<{GAvA$W`|6U<7l7 z(;#JTSkA`g5AI#OE=3bXY7eH6j0nz#_zSM2bHitx1~MkBHimYwid4DTQ_y5< XkOl&JXOzl1x006-8E{TFc@$+ z9En8g>FGH;I}->5GMSuNbTTs%%LRk$^GRqldeh0+*tjyCh(4eS0)P+2cn=6fXIoZP zxNMrkdn<(BH^+Fndjs|#UsE=R_C%t8jAQ6Ia&&l9OnBs30H9Uoj@l?ZM8o9YPGU3g ztE1ehTEleMbJfdzB509%$jeb4rtuD)A(zM93^H=d*8IGz_x-#mnak?loram&?Qo_YOQo2+>T51h z8a!EyMh;prZZIE`8KwqpcN2BzHEhWNc@9FaoldWD6HUqU55Og;twER8{M#}t0LVSV zJ02v`Duve;qIuS^jH5Dpb&MGI@gbN};a42xAkUKLE?dA@G`d>Fsm95->F**ToZkEn z0N}g(mO{snsjH2hi#itEH(-hFnU)RcmI&GVyjWjo;C!47S$5zni&qrn1XlH0$V|uT zbWXEZ^ST#Sl!}*_OSj|e-8xmC0{;2^)+w)3DEVi!pu7GC2Vd$)qQiLwD5$4aHgwh{ zzt0>GN&(k3)+B8{scjYI7NwhVqI7GuySaXydUaE84CvKA?1p))+dOaK5_)k35_QY( z4ZZx;V^6c-qv!yZXybcRe!v6xT4_YA!PBEYQD79kXW}|03T*F~3l!@cT=2JXt-d&Z zhF_WWvZ}pw-cLg#?M)S-WF|^Dl?$qmUt(~U)VQKw(4z)|vfPxqJ1Hz`!Vh^i<+JMW z?R=k7F#WI5Am_Lpeyn7xHlko*Esi(y%Y2GlS;d0#`gDz)+&OnT=`TJ~Gtz!w!>sc- zfmWO08l{9C_$pa#`Te52Hd+P3J>8RI{waXY>egkU4^uXTnPW2{vtKNXL&MZ+{sSuv zjdu!FlbD|mK9N@-O1>xF@^6y2C?iSzbTD`1ACGp5PwGfRTyjW}TN@5BCzi{+`J3X4 zs>B50_#s~>1SmU!)R&{7H#F78*iP&H+q!$LgWK?7)X!B_%=f!Z;VTc-rPI;&{48q2 ze%!@MwJo!v5;OirC@P|P(uh_!Y@Lx_R*zTknFn%!<>B)NGV&#*x)7|cH+eSgW*WAn z=Lsz`W$|TN?OAFii|VhQpsYCi^ASUF+krzF{e8A>W<%f72uV>Yc&+kdn)Sntfep6G z*Lqd|w9VXcdGJJd$EC8~@@KEkf4sk#uF<%fXyPD+&BeSZnl6-OpUPxY{!G5L1R;B@ z`ZZcwO26)0pMF%*?tRU0(fMBXz3q5Wf<|k}q@fri5_)kUuDq7zp4$>d%58h!Uf6uE z+z)m7gpo3384sDU;b3!Y^ox50%Wj*k>&wV&1y?p)BmB(v}&sRTVjhV9EUQDFk@j0u8 z9WGhz^r@^gRfnp$eWwQrmvfK@w~q_b6b(^r=G0GQnnLwyHGyu><6C3TY~GLPbnG=` zZ0ih5{j3hVDXwaH9HRaA=b@SdySC}o4oy*~5#11BOa8m!W42Mnk%2t{52|%ctLWd% zT|X|rEVlblPiY|?`r$|bAP(h9zDT>fu%ya<>4gM^1@VAMGlwM5u0UyBS`csV$fJ73 zzwRznojMVogk6oyUA{a{e-usKiMw$N%Z%On$0Ys8K-Y}83<#+cm5d9{A+q%?b4&_9 z#Nbmq%27?6wc_Odqd^BhIF*<2hYvOGdGfBFsNikpc%^ID+oDFBN-mZp7nf}B4kd8~H}nhj3L5TvG20*?WVZ%Zu!zU&Ieq}V2`XI?b+vGq=#@3t z`hzn`8|l|s^^&g>k}uh{Ead-$N*z==*7SwITj_3Vh8CYK4kG_iJ{s8mUgsZ|U(+gP z2^a)L{&~0x_Z~E-4yNd$@u8EZFA2{Q?8$8I9Au!6c#jwtD38?)u=RB-S8P<_CtJDS zpV|Lm-#}v018b*L$Bwf+={JpIbk2+AiU|Q{R(d`!ncsn>zpG(!;3A7dtVmBLDCaqD UQB4sZlYIBUA9i Date: Fri, 1 Jun 2018 23:51:34 -0400 Subject: [PATCH 010/267] Radiation closet hood fix --- .../structures/crates_lockers/closets/utility_closets.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 5b98c87f42..4b20c5a955 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -152,7 +152,8 @@ icon_closed = "radsuitcloset" starts_with = list( - /obj/item/clothing/suit/radiation = 4, + /obj/item/clothing/suit/radiation = 2, + /obj/item/clothing/head/radiation = 2, /obj/item/device/geiger = 2) /* From d8eebde5a2a1ffb031c32352be920df21758c635 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 2 Jun 2018 10:42:32 -0400 Subject: [PATCH 011/267] Planet controller startup delay --- code/controllers/Processes/planet.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm index 770b3a5e87..18043f9270 100644 --- a/code/controllers/Processes/planet.dm +++ b/code/controllers/Processes/planet.dm @@ -8,6 +8,7 @@ var/datum/controller/process/planet/planet_controller = null name = "planet controller" planet_controller = src schedule_interval = 1 MINUTE + start_delay = 20 SECONDS var/list/planet_datums = typesof(/datum/planet) - /datum/planet for(var/P in planet_datums) From 6d8c60785061b91ddf27128b6ae50cb345c7ca5e Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 2 Jun 2018 11:27:46 -0400 Subject: [PATCH 012/267] Fix the New() on this interfering with my work! --- code/game/objects/effects/decals/Cleanable/humans.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 90f708ff9d..0369b91d63 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -248,6 +248,6 @@ var/global/list/image/splatter_cache=list() //This version should be used for admin spawns and pre-mapped virus vectors (e.g. in PoIs), this version does not dry /obj/effect/decal/cleanable/mucus/mapped/New() - ...() + ..() virus2 = new /datum/disease2/disease virus2.makerandom() From 237db1e90e15549e9e0636a0e928b669a0b5d4a8 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Fri, 25 May 2018 16:05:09 -0500 Subject: [PATCH 013/267] Wallet money spawns as a bundle. --- code/game/objects/items/weapons/storage/wallets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index cd3a450631..60a253c87c 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -82,10 +82,10 @@ ..() var/amount = rand(50, 100) + rand(50, 100) // Triangular distribution from 100 to 200 var/obj/item/weapon/spacecash/SC = null + SC = new(src) for(var/i in list(100, 50, 20, 10, 5, 1)) if(amount < i) continue - SC = new(src) while(amount >= i) amount -= i SC.adjust_worth(i, 0) From 462effc1d20ae5e6aeffe87f6019ba767be59593 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 2 Jun 2018 19:09:35 -0400 Subject: [PATCH 014/267] Creates SSplanets subsystem For SPEEDYNESS It probably works. I mean it's hard to sit there for 8 hours and test it. But it seems to work okay. At worst if it doesn't you'll have weather that doesn't make sense. ;v --- code/__defines/subsystems.dm | 2 + code/controllers/Processes/planet.dm | 96 --------- code/controllers/subsystems/planets.dm | 183 ++++++++++++++++++ code/controllers/verbs.dm | 3 - .../objects/items/devices/communicator/UI.dm | 21 +- .../game/turfs/simulated/outdoors/outdoors.dm | 12 +- code/game/turfs/simulated/outdoors/sky.dm | 2 +- code/game/turfs/unsimulated/planetary.dm | 6 +- code/modules/admin/verbs/debug.dm | 4 +- code/modules/events/gravity.dm | 5 +- code/modules/planet/planet.dm | 5 +- code/modules/planet/sif.dm | 4 +- polaris.dme | 2 +- 13 files changed, 212 insertions(+), 133 deletions(-) delete mode 100644 code/controllers/Processes/planet.dm create mode 100644 code/controllers/subsystems/planets.dm diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index d790514614..44137b0431 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -30,6 +30,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_DEFAULT 0 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_PLANETS -4 #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XENOARCH -20 @@ -42,6 +43,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define FIRE_PRIORITY_AIRFLOW 30 #define FIRE_PRIORITY_AIR 35 #define FIRE_PRIORITY_DEFAULT 50 +#define FIRE_PRIORITY_PLANETS 75 #define FIRE_PRIORITY_MACHINES 100 #define FIRE_PRIORITY_OVERLAYS 500 diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm deleted file mode 100644 index 18043f9270..0000000000 --- a/code/controllers/Processes/planet.dm +++ /dev/null @@ -1,96 +0,0 @@ -var/datum/controller/process/planet/planet_controller = null - -/datum/controller/process/planet - var/list/planets = list() - var/list/z_to_planet = list() - -/datum/controller/process/planet/setup() - name = "planet controller" - planet_controller = src - schedule_interval = 1 MINUTE - start_delay = 20 SECONDS - - var/list/planet_datums = typesof(/datum/planet) - /datum/planet - for(var/P in planet_datums) - var/datum/planet/NP = new P() - planets.Add(NP) - - allocateTurfs() - -/datum/controller/process/planet/proc/allocateTurfs() - for(var/turf/simulated/OT in outdoor_turfs) - for(var/datum/planet/P in planets) - if(OT.z in P.expected_z_levels) - P.planet_floors |= OT - OT.vis_contents |= P.weather_holder.visuals - break - outdoor_turfs.Cut() //Why were you in there INCORRECTLY? - - for(var/turf/unsimulated/wall/planetary/PW in planetary_walls) - for(var/datum/planet/P in planets) - if(PW.type == P.planetary_wall_type) - P.planet_walls |= PW - break - planetary_walls.Cut() - -/datum/controller/process/planet/proc/unallocateTurf(var/turf/T) - for(var/planet in planets) - var/datum/planet/P = planet - if(T.z in P.expected_z_levels) - P.planet_floors -= T - T.vis_contents -= P.weather_holder.visuals - -/datum/controller/process/planet/doWork() - if(outdoor_turfs.len || planetary_walls.len) - allocateTurfs() - - for(var/datum/planet/P in planets) - P.process(schedule_interval / 10) - SCHECK //Your process() really shouldn't take this long... - - //Sun light needs changing - if(P.needs_work & PLANET_PROCESS_SUN) - P.needs_work &= ~PLANET_PROCESS_SUN - // Remove old value from corners - var/list/sunlit_corners = P.sunlit_corners - var/old_lum_r = -P.sun["lum_r"] - var/old_lum_g = -P.sun["lum_g"] - var/old_lum_b = -P.sun["lum_b"] - if(old_lum_r || old_lum_g || old_lum_b) - for(var/C in P.sunlit_corners) - var/datum/lighting_corner/LC = C - LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) - SCHECK - sunlit_corners.Cut() - - // Calculate new values to apply - var/new_brightness = P.sun["brightness"] - var/new_color = P.sun["color"] - var/lum_r = new_brightness * GetRedPart (new_color) / 255 - var/lum_g = new_brightness * GetGreenPart(new_color) / 255 - var/lum_b = new_brightness * GetBluePart (new_color) / 255 - var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. - for(var/I in P.planet_floors) - var/turf/simulated/T = I - if(!T.lighting_corners_initialised) - T.generate_missing_corners() - for(var/C in T.get_corners()) - var/datum/lighting_corner/LC = C - if(LC.update_gen != update_gen && LC.active) - sunlit_corners += LC - LC.update_gen = update_gen - LC.update_lumcount(lum_r, lum_g, lum_b) - SCHECK - update_gen-- - P.sun["lum_r"] = lum_r - P.sun["lum_g"] = lum_g - P.sun["lum_b"] = lum_b - - //Temperature needs updating - if(P.needs_work & PLANET_PROCESS_TEMP) - P.needs_work &= ~PLANET_PROCESS_TEMP - //Set new temperatures - for(var/W in P.planet_walls) - var/turf/unsimulated/wall/planetary/wall = W - wall.set_temperature(P.weather_holder.temperature) - SCHECK diff --git a/code/controllers/subsystems/planets.dm b/code/controllers/subsystems/planets.dm new file mode 100644 index 0000000000..2bb09050f4 --- /dev/null +++ b/code/controllers/subsystems/planets.dm @@ -0,0 +1,183 @@ +SUBSYSTEM_DEF(planets) + name = "Planets" + init_order = INIT_ORDER_PLANETS + priority = FIRE_PRIORITY_PLANETS + wait = 2 SECONDS + flags = SS_BACKGROUND + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/new_outdoor_turfs = list() + var/list/new_outdoor_walls = list() + + var/list/planets = list() + var/list/z_to_planet = list() + + var/list/currentrun = list() + + var/list/needs_sun_update = list() + var/list/needs_temp_update = list() + +/datum/controller/subsystem/planets/Initialize(timeofday) + admin_notice("Initializing planetary weather.", R_DEBUG) + createPlanets() + allocateTurfs(TRUE) + ..() + +/datum/controller/subsystem/planets/proc/createPlanets() + var/list/planet_datums = subtypesof(/datum/planet) + for(var/P in planet_datums) + var/datum/planet/NP = new P() + planets.Add(NP) + for(var/Z in NP.expected_z_levels) + if(Z > z_to_planet.len) + z_to_planet.len = Z + if(z_to_planet[Z]) + admin_notice("Z[Z] is shared by more than one planet!", R_DEBUG) + continue + z_to_planet[Z] = NP + +/datum/controller/subsystem/planets/proc/addTurf(var/turf/T,var/is_edge) + if(is_edge) + new_outdoor_walls |= T + else + new_outdoor_turfs |= T + +/datum/controller/subsystem/planets/proc/removeTurf(var/turf/T,var/is_edge) + if(is_edge) + new_outdoor_walls -= T + else + new_outdoor_turfs -= T + + if(z_to_planet.len >= T.z) + var/datum/planet/P = z_to_planet[T.z] + if(!P) + return + if(is_edge) + P.planet_floors -= T + else + P.planet_walls -= T + +/datum/controller/subsystem/planets/proc/allocateTurfs(var/initial = FALSE) + var/list/currentlist = new_outdoor_turfs + while(currentlist.len) + var/turf/simulated/OT = currentlist[currentlist.len] + currentlist.len-- + if(istype(OT) && z_to_planet[OT.z]) + var/datum/planet/P = z_to_planet[OT.z] + P.planet_floors |= OT + OT.vis_contents |= P.weather_holder.visuals + if(!initial && MC_TICK_CHECK) + return + + currentlist = new_outdoor_walls + while(currentlist.len) + var/turf/unsimulated/wall/planetary/PW = currentlist[currentlist.len] + currentlist.len-- + if(istype(PW) && z_to_planet[PW.z]) + var/datum/planet/P = z_to_planet[PW.z] + P.planet_walls |= PW + if(!initial && MC_TICK_CHECK) + return + +/datum/controller/subsystem/planets/proc/unallocateTurf(var/turf/simulated/T) + if(istype(T) && z_to_planet[T.z]) + var/datum/planet/P = z_to_planet[T.z] + P.planet_floors -= T + T.vis_contents -= P.weather_holder.visuals + + +/datum/controller/subsystem/planets/fire(resumed = 0) + if(new_outdoor_turfs.len || new_outdoor_walls.len) + allocateTurfs() + + if(!resumed) + src.currentrun = planets.Copy() + + var/list/needs_sun_update = src.needs_sun_update + while(needs_sun_update.len) + var/datum/planet/P = needs_sun_update[needs_sun_update.len] + needs_sun_update.len-- + updateSunlight(P) + if(MC_TICK_CHECK) + return + + var/list/needs_temp_update = src.needs_temp_update + while(needs_temp_update.len) + var/datum/planet/P = needs_temp_update[needs_temp_update.len] + needs_temp_update.len-- + updateTemp(P) + if(MC_TICK_CHECK) + return + + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/planet/P = currentrun[currentrun.len] + currentrun.len-- + + P.process(last_fire) + + //Sun light needs changing + if(P.needs_work & PLANET_PROCESS_SUN) + P.needs_work &= ~PLANET_PROCESS_SUN + needs_sun_update |= P + + //Temperature needs updating + if(P.needs_work & PLANET_PROCESS_TEMP) + P.needs_work &= ~PLANET_PROCESS_TEMP + needs_temp_update |= P + + if(MC_TICK_CHECK) + return + +/datum/controller/subsystem/planets/proc/updateSunlight(var/datum/planet/P) + // Remove old value from corners + var/list/sunlit_corners = P.sunlit_corners + var/old_lum_r = -P.sun["lum_r"] + var/old_lum_g = -P.sun["lum_g"] + var/old_lum_b = -P.sun["lum_b"] + if(old_lum_r || old_lum_g || old_lum_b) + for(var/C in sunlit_corners) + var/datum/lighting_corner/LC = C + LC.update_lumcount(old_lum_r, old_lum_g, old_lum_b) + CHECK_TICK + sunlit_corners.Cut() + + // Calculate new values to apply + var/new_brightness = P.sun["brightness"] + var/new_color = P.sun["color"] + var/lum_r = new_brightness * GetRedPart (new_color) / 255 + var/lum_g = new_brightness * GetGreenPart(new_color) / 255 + var/lum_b = new_brightness * GetBluePart (new_color) / 255 + var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs. + for(var/I in P.planet_floors) + var/turf/simulated/T = I + if(!T.lighting_corners_initialised) + T.generate_missing_corners() + for(var/C in T.get_corners()) + var/datum/lighting_corner/LC = C + if(LC.update_gen != update_gen && LC.active) + sunlit_corners += LC + LC.update_gen = update_gen + LC.update_lumcount(lum_r, lum_g, lum_b) + CHECK_TICK + update_gen-- + P.sun["lum_r"] = lum_r + P.sun["lum_g"] = lum_g + P.sun["lum_b"] = lum_b + +/datum/controller/subsystem/planets/proc/updateTemp(var/datum/planet/P) + //Set new temperatures + for(var/W in P.planet_walls) + var/turf/unsimulated/wall/planetary/wall = W + wall.set_temperature(P.weather_holder.temperature) + CHECK_TICK + +/datum/controller/subsystem/planets/proc/weatherDisco() + var/count = 100000 + while(count > 0) + count-- + for(var/planet in planets) + var/datum/planet/P = planet + if(P.weather_holder) + P.weather_holder.change_weather(pick(P.weather_holder.allowed_weather_types)) + sleep(3) diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 8d02fda2eb..f1249cfe0c 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -133,8 +133,5 @@ if("Vote") debug_variables(vote) feedback_add_details("admin_verb", "DVote") - if("Planets") - debug_variables(planet_controller) - feedback_add_details("admin_verb", "DPlanets") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") return diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm index 4d6ff75c50..fca4cf4866 100644 --- a/code/game/objects/items/devices/communicator/UI.dm +++ b/code/game/objects/items/devices/communicator/UI.dm @@ -69,17 +69,16 @@ im_list_ui[++im_list_ui.len] = list("address" = I["address"], "to_address" = I["to_address"], "im" = I["im"]) //Weather reports. - if(planet_controller) - for(var/datum/planet/planet in planet_controller.planets) - if(planet.weather_holder && planet.weather_holder.current_weather) - var/list/W = list( - "Planet" = planet.name, - "Time" = planet.current_time.show_time("hh:mm"), - "Weather" = planet.weather_holder.current_weather.name, - "Temperature" = planet.weather_holder.temperature - T0C, - "High" = planet.weather_holder.current_weather.temp_high - T0C, - "Low" = planet.weather_holder.current_weather.temp_low - T0C) - weather[++weather.len] = W + for(var/datum/planet/planet in SSplanets.planets) + if(planet.weather_holder && planet.weather_holder.current_weather) + var/list/W = list( + "Planet" = planet.name, + "Time" = planet.current_time.show_time("hh:mm"), + "Weather" = planet.weather_holder.current_weather.name, + "Temperature" = planet.weather_holder.temperature - T0C, + "High" = planet.weather_holder.current_weather.temp_high - T0C, + "Low" = planet.weather_holder.current_weather.temp_low - T0C) + weather[++weather.len] = W injection = "
Test
" diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 969c77f4fb..861b34d9ea 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -1,5 +1,4 @@ var/list/turf_edge_cache = list() -var/list/outdoor_turfs = list() /turf/ // If greater than 0, this turf will apply edge overlays on top of other turfs cardinally adjacent to it, if those adjacent turfs are of a different icon_state, @@ -24,24 +23,21 @@ var/list/outdoor_turfs = list() /turf/simulated/floor/New() if(outdoors) - outdoor_turfs.Add(src) + SSplanets.addTurf(src) ..() /turf/simulated/floor/Destroy() if(outdoors) - planet_controller.unallocateTurf(src) + SSplanets.removeTurf(src) return ..() /turf/simulated/proc/make_outdoors() outdoors = TRUE - outdoor_turfs.Add(src) + SSplanets.addTurf(src) /turf/simulated/proc/make_indoors() outdoors = FALSE - if(planet_controller) - planet_controller.unallocateTurf(src) - else // This is happening during map gen, if there's no planet_controller (hopefully). - outdoor_turfs -= src + SSplanets.removeTurf(src) /turf/simulated/post_change() ..() diff --git a/code/game/turfs/simulated/outdoors/sky.dm b/code/game/turfs/simulated/outdoors/sky.dm index c329fc2e4d..468b893b33 100644 --- a/code/game/turfs/simulated/outdoors/sky.dm +++ b/code/game/turfs/simulated/outdoors/sky.dm @@ -14,7 +14,7 @@ /turf/simulated/sky/initialize() . = ..() - outdoor_turfs.Add(src) + SSplanets.addTurf(src) set_light(2, 2, "#FFFFFF") /turf/simulated/sky/north diff --git a/code/game/turfs/unsimulated/planetary.dm b/code/game/turfs/unsimulated/planetary.dm index 613638ec80..35cd7aa4a8 100644 --- a/code/game/turfs/unsimulated/planetary.dm +++ b/code/game/turfs/unsimulated/planetary.dm @@ -1,7 +1,5 @@ // This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters // are opened or other strange things occur. -var/list/planetary_walls = list() - /turf/unsimulated/wall/planetary name = "railroading" desc = "Choo choo!" @@ -21,10 +19,10 @@ var/list/planetary_walls = list() /turf/unsimulated/wall/planetary/New() ..() - planetary_walls.Add(src) + SSplanets.addTurf(src) /turf/unsimulated/wall/planetary/Destroy() - planetary_walls.Remove(src) + SSplanets.removeTurf(src) ..() /turf/unsimulated/wall/planetary/proc/set_temperature(var/new_temperature) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 3582aab0c7..91dc377bd3 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -637,7 +637,7 @@ if(!check_rights(R_DEBUG)) return - var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in planet_controller.planets + var/datum/planet/planet = input(usr, "Which planet do you want to modify the weather on?", "Change Weather") in SSplanets.planets var/datum/weather/new_weather = input(usr, "What weather do you want to change to?", "Change Weather") as null|anything in planet.weather_holder.allowed_weather_types if(new_weather) planet.weather_holder.change_weather(new_weather) @@ -653,7 +653,7 @@ if(!check_rights(R_DEBUG)) return - var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in planet_controller.planets + var/datum/planet/planet = input(usr, "Which planet do you want to modify time on?", "Change Time") in SSplanets.planets var/datum/time/current_time_datum = planet.current_time var/new_hour = input(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) as null|num diff --git a/code/modules/events/gravity.dm b/code/modules/events/gravity.dm index e0cd38dcfb..4d0881294f 100644 --- a/code/modules/events/gravity.dm +++ b/code/modules/events/gravity.dm @@ -6,9 +6,8 @@ endWhen = rand(15, 60) // Setup which levels we will disrupt gravit on. zLevels = using_map.station_levels.Copy() - if (planet_controller) - for(var/datum/planet/P in planet_controller.planets) - zLevels -= P.expected_z_levels + for(var/datum/planet/P in SSplanets.planets) + zLevels -= P.expected_z_levels /datum/event/gravity/announce() command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system \ diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm index 061ae73398..8fb7604417 100644 --- a/code/modules/planet/planet.dm +++ b/code/modules/planet/planet.dm @@ -30,9 +30,10 @@ current_time = current_time.make_random_time() update_sun() -/datum/planet/proc/process(amount) +/datum/planet/proc/process(last_fire) if(current_time) - current_time = current_time.add_seconds(amount) + var/difference = world.time - last_fire + current_time = current_time.add_seconds(difference SECONDS) update_weather() // We update this first, because some weather types decease the brightness of the sun. if(sun_last_process <= world.time - sun_process_interval) update_sun() diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 8717245b24..3e7dc2c27a 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -184,7 +184,7 @@ datum/weather/sif ) /datum/weather/sif/snow/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in cardinal) var/turf/simulated/floor/T = get_step(S, dir_checked) @@ -207,7 +207,7 @@ datum/weather/sif ) /datum/weather/sif/blizzard/process_effects() - for(var/turf/simulated/floor/outdoors/snow/S in outdoor_turfs) + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either if(S.z in holder.our_planet.expected_z_levels) for(var/dir_checked in cardinal) var/turf/simulated/floor/T = get_step(S, dir_checked) diff --git a/polaris.dme b/polaris.dme index 2004271237..f9d457a941 100644 --- a/polaris.dme +++ b/polaris.dme @@ -171,7 +171,6 @@ #include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\obj.dm" -#include "code\controllers\Processes\planet.dm" #include "code\controllers\Processes\radiation.dm" #include "code\controllers\Processes\scheduler.dm" #include "code\controllers\Processes\sun.dm" @@ -189,6 +188,7 @@ #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\overlays.dm" +#include "code\controllers\subsystems\planets.dm" #include "code\controllers\subsystems\shuttles.dm" #include "code\controllers\subsystems\xenoarch.dm" #include "code\datums\ai_law_sets.dm" From e537e9b8e870958bd358fc0c698912a808ce1630 Mon Sep 17 00:00:00 2001 From: elgeonmb Date: Sat, 2 Jun 2018 17:56:47 -0700 Subject: [PATCH 015/267] you made me do this --- code/game/objects/items/weapons/tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 5fbba12e35..7cd6925f8d 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -684,7 +684,7 @@ /obj/item/weapon/weldingtool/experimental name = "experimental welding tool" - desc = "An experimental welder capable of self-fuel generation. It can output a flame hotter than regular welders." + desc = "An experimental welder capable of synthesizing its own fuel from waste compounds. It can output a flame hotter than regular welders." icon_state = "exwelder" max_fuel = 40 w_class = ITEMSIZE_NORMAL From b8008e454b6a517017ae63727ac47f10c8b6faa3 Mon Sep 17 00:00:00 2001 From: Cameron653 Date: Sun, 3 Jun 2018 15:32:42 -0400 Subject: [PATCH 016/267] Changes Setup Character" to "Character Setup" Since that's what is used everywhere else. --- code/modules/mob/new_player/new_player.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index ceced1549f..6181c47c79 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -28,7 +28,7 @@ /mob/new_player/proc/new_player_panel_proc() var/output = "
" output +="
" - output += "

Setup Character

" + output += "

Character Setup

" if(!ticker || ticker.current_state <= GAME_STATE_PREGAME) if(ready) From 35e974e3a09ec8a7a9f761e977115d936e1479be Mon Sep 17 00:00:00 2001 From: Mechoid Date: Mon, 4 Jun 2018 13:13:10 -0700 Subject: [PATCH 017/267] Ion Rifle returned to original radius. (#5326) * Return ion rifles to their intended 3x3 rather than 5x5. * Changelog --- .../modules/projectiles/projectile/special.dm | 2 +- html/changelogs/Mechoid - Ionrifle.yml | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/Mechoid - Ionrifle.yml diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index f7ecddb0eb..2e27d125ef 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -15,7 +15,7 @@ var/sev1_range = 0 var/sev2_range = 1 var/sev3_range = 1 - var/sev4_range = 2 + var/sev4_range = 1 /obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0) empulse(target, sev1_range, sev2_range, sev3_range, sev4_range) diff --git a/html/changelogs/Mechoid - Ionrifle.yml b/html/changelogs/Mechoid - Ionrifle.yml new file mode 100644 index 0000000000..3be45359a2 --- /dev/null +++ b/html/changelogs/Mechoid - Ionrifle.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Mechoid + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Ion rifles hit the correct 3x3 instead of 5x5" From 350b6f5ea85670406704624d2bec0704a4e80ab8 Mon Sep 17 00:00:00 2001 From: Granodd Date: Tue, 5 Jun 2018 14:13:11 -0400 Subject: [PATCH 018/267] New sprites for Virgo. --- .../vore/appearance/sprite_accessories_vr.dm | 52 ++++++++++++++++++ icons/mob/vore/ears_vr.dmi | Bin 17569 -> 19252 bytes 2 files changed, 52 insertions(+) diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 13c2f7b2da..a58fc9f6ff 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -88,16 +88,58 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/oni_h1 name = "oni horns" desc = "" icon_state = "oni-h1" +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/demon_horns1 name = "demon horns" desc = "" icon_state = "demon-horns1" +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/demon_horns2 name = "demon horns, colorable(outward)" desc = "" @@ -105,6 +147,13 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/foxears name = "highlander zorren ears" desc = "" @@ -413,6 +462,7 @@ desc = "" icon_state = "spider-legs" color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/wing/moth name = "moth wings" desc = "" @@ -682,12 +732,14 @@ icon_state = "fantail" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/wagtail name = "avian wagtail, colorable" desc = "" icon_state = "wagtail" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/crossfox name = "cross fox" desc = "" diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 126f2ba4268085c7eb3dfcea4e30518c5eb9d3f6..37bf23b17475c85997ff7ec4839f8178a35a89d7 100644 GIT binary patch literal 19252 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 F{{a@+!ioR@ From b455abf2b61e551c73f280a3eb6012b9910b5ab9 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Tue, 5 Jun 2018 20:29:59 -0700 Subject: [PATCH 019/267] Fix https://github.com/PolarisSS13/Polaris/issues/5321 --- code/modules/hydroponics/seed_storage.dm | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 6b2d1d1695..6ee9fde05c 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -445,6 +445,27 @@ piles -= N qdel(N) break + if(hacked || emagged) + for (var/datum/seed_pile/N in piles_contra) + if (N.ID == ID) + if (task == "vend") + var/obj/O = pick(N.seeds) + if (O) + --N.amount + N.seeds -= O + if (N.amount <= 0 || N.seeds.len <= 0) + piles_contra -= N + qdel(N) + O.loc = src.loc + else + piles_contra -= N + qdel(N) + else if (task == "purge") + for (var/obj/O in N.seeds) + qdel(O) + piles_contra -= N + qdel(N) + break updateUsrDialog() /obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob) @@ -477,6 +498,23 @@ else if((istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) && panel_open) wires.Interact(user) +/obj/machinery/seed_storage/emag_act(var/remaining_charges, var/mob/user) + if(!src.emagged) + emagged = 1 + if(lockdown) + to_chat(user, "\The [src]'s control panel thunks, as its cover retracts.") + lockdown = 0 + if(req_access || req_one_access) + req_access = list() + req_one_access = list() + to_chat(user, "\The [src]'s access mechanism shorts out.") + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, get_turf(src)) + sparks.start() + visible_message("\The [src]'s panel sparks!") + qdel(sparks) + return 1 + /obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj, var/contraband = 0) if (istype(O.loc, /mob)) var/mob/user = O.loc @@ -489,6 +527,8 @@ var/newID = 0 if(contraband) + var/datum/seed_pile/final_pile = piles[piles.len] + newID = final_pile.ID + 1 for (var/datum/seed_pile/N in piles_contra) if (N.matches(O)) ++N.amount From d15952889929bc2694d9696b270d32378821a497 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Tue, 5 Jun 2018 20:59:12 -0700 Subject: [PATCH 020/267] Fix #5316 and #5220 --- code/modules/xenoarcheaology/artifacts/replicator.dm | 3 +++ code/modules/xenoarcheaology/tools/equipment.dm | 1 + 2 files changed, 4 insertions(+) diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index c14bbb12a3..c4324b30ec 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -125,6 +125,9 @@ user << browse(dat, "window=alien_replicator") /obj/machinery/replicator/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + if(!W.canremove || !user.canUnEquip(W)) //No armblades, no grabs. No other-thing-I-didn't-think-of. + to_chat(user, "You cannot put \the [W] into the machine.") + return user.drop_item() W.loc = src stored_materials.Add(W) diff --git a/code/modules/xenoarcheaology/tools/equipment.dm b/code/modules/xenoarcheaology/tools/equipment.dm index 1c2b1f9773..186745a277 100644 --- a/code/modules/xenoarcheaology/tools/equipment.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -1,6 +1,7 @@ /obj/item/clothing/suit/bio_suit/anomaly name = "Anomaly suit" desc = "A sealed bio suit capable of insulating against exotic alien energies." + icon = 'icons/obj/clothing/spacesuits.dmi' icon_state = "engspace_suit" item_state = "engspace_suit" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) From 7d23980df4ba3c4ae71c75d6a85ffa189ce087df Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 6 Jun 2018 18:09:07 -0500 Subject: [PATCH 021/267] Mining turf overlays should be properly placed now --- code/modules/mining/mine_turfs.dm | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index e6400992da..7170b12d32 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -153,7 +153,7 @@ var/list/mining_overlay_cache = list() if(excav_overlay) add_overlay(excav_overlay) - + //We are a sand floor else name = "sand" @@ -167,12 +167,6 @@ var/list/mining_overlay_cache = list() for(var/direction in cardinal) if(istype(get_step(src, direction), /turf/space) && !istype(get_step(src, direction), /turf/space/cracked_asteroid)) add_overlay(get_cached_border("asteroid_edge",direction,icon,"asteroid_edges", 0)) - - //Or any time - else - var/turf/simulated/mineral/M = get_step(src, direction) - if(istype(M) && M.density) - add_overlay(get_cached_border("rock_side",direction,'icons/turf/walls.dmi',"rock_side")) if(overlay_detail) add_overlay('icons/turf/flooring/decals.dmi',overlay_detail) From ee6a7125cf992cc8b8f01a1090ce4b8ce5be86d7 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Wed, 6 Jun 2018 16:59:17 -0700 Subject: [PATCH 022/267] Ater forgot to remove debug code --- code/game/machinery/computer3/component.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/machinery/computer3/component.dm b/code/game/machinery/computer3/component.dm index 4f798dfbc5..3c8d972825 100644 --- a/code/game/machinery/computer3/component.dm +++ b/code/game/machinery/computer3/component.dm @@ -193,7 +193,6 @@ // user: The mob inserting the card // slot: Which slot to insert into (1->Reader, 2->Writer, 3->Auto) Default 3 /obj/item/part/computer/cardslot/dual/insert(var/obj/item/weapon/card/card, var/mob/user, var/slot = 3) - world << "User is [user]" if(slot != 2) if(..(card, user)) return 1 @@ -228,4 +227,4 @@ if(D.files.len > 3) return 0 D.files += F - return 1 \ No newline at end of file + return 1 From 17a295b579d4535ed4c5f1f396aea63aa12ec552 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 6 Jun 2018 20:20:23 -0500 Subject: [PATCH 023/267] Ports some Bay hair code --- code/__defines/items_clothing.dm | 4 + .../mob/living/carbon/human/human_powers.dm | 32 +++++ .../carbon/human/species/station/station.dm | 3 + .../mob/new_player/sprite_accessories.dm | 112 ++++++++++++++++-- code/modules/organs/organ_icon.dm | 24 ++-- 5 files changed, 157 insertions(+), 18 deletions(-) diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm index 4428f8ee34..de0a271ae6 100644 --- a/code/__defines/items_clothing.dm +++ b/code/__defines/items_clothing.dm @@ -219,3 +219,7 @@ #define SUIT_SENSOR_BINARY 1 #define SUIT_SENSOR_VITAL 2 #define SUIT_SENSOR_TRACKING 3 + +// Hair Defines +#define HAIR_VERY_SHORT 0x1 +#define HAIR_TIEABLE 0x4 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 8a9db8a349..018f0e1926 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -1,6 +1,38 @@ // These should all be procs, you can add them to humans/subspecies by // species.dm's inherent_verbs ~ Z +/mob/living/carbon/human/proc/tie_hair() + set name = "Tie Hair" + set desc = "Style your hair." + set category = "IC" + + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + + if(h_style) + var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style] + var/selected_string + if(!(hair_style.flags & HAIR_TIEABLE)) + to_chat(src, "Your hair isn't long enough to tie.") + return + else + var/list/datum/sprite_accessory/hair/valid_hairstyles = list() + for(var/hair_string in hair_styles_list) + var/list/datum/sprite_accessory/hair/test = hair_styles_list[hair_string] + if(test.flags & HAIR_TIEABLE) + valid_hairstyles.Add(hair_string) + selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles + if(incapacitated()) + to_chat(src, "You can't mess with your hair right now!") + return + else if(selected_string && h_style != selected_string) + h_style = selected_string + regenerate_icons() + visible_message("[src] pauses a moment to style their hair.") + else + to_chat(src, "You're already using that style.") + /mob/living/carbon/human/proc/tackle() set category = "Abilities" set name = "Tackle" diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index f605529211..2f2c1452c0 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -23,6 +23,9 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + inherent_verbs = list( + /mob/living/carbon/human/proc/tie_hair) + /datum/species/human/get_bodytype(var/mob/living/carbon/human/H) return SPECIES_HUMAN diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 8a2f769018..5141eed979 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -47,60 +47,80 @@ icon = 'icons/mob/Human_face_m.dmi' // default icon for all hairs var/icon_add = 'icons/mob/human_face.dmi' + var/flags bald name = "Bald" icon_state = "bald" gender = MALE + flags = HAIR_VERY_SHORT species_allowed = list(SPECIES_HUMAN,SPECIES_UNATHI,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_VOX) short name = "Short Hair" // try to capatilize the names please~ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you + flags = HAIR_VERY_SHORT short2 name = "Short Hair 2" icon_state = "hair_shorthair3" + flags = HAIR_VERY_SHORT short3 name = "Short Hair 3" icon_state = "hair_shorthair4" + flags = HAIR_VERY_SHORT twintail name = "Twintail" icon_state = "hair_twintail" + flags = HAIR_TIEABLE cut name = "Cut Hair" icon_state = "hair_c" + flags = HAIR_VERY_SHORT flair name = "Flaired Hair" icon_state = "hair_flair" + flags = HAIR_TIEABLE long name = "Shoulder-length Hair" icon_state = "hair_b" + flags = HAIR_TIEABLE - /*longish +/* + longish name = "Longer Hair" - icon_state = "hair_b2"*/ - + icon_state = "hair_b2" + flags = HAIR_TIEABLE +*/ longer name = "Long Hair" icon_state = "hair_vlong" + flags = HAIR_TIEABLE + + longeralt2 + name = "Long Hair Alt 2" + icon_state = "hair_longeralt2" + flags = HAIR_TIEABLE longest name = "Very Long Hair" icon_state = "hair_longest" + flags = HAIR_TIEABLE longfringe name = "Long Fringe" icon_state = "hair_longfringe" + flags = HAIR_TIEABLE longestalt name = "Longer Fringe" icon_state = "hair_vlongfringe" + flags = HAIR_TIEABLE halfbang name = "Half-banged Hair" @@ -113,57 +133,72 @@ ponytail1 name = "Ponytail 1" icon_state = "hair_ponytail" + flags = HAIR_TIEABLE ponytail2 name = "Ponytail 2" icon_state = "hair_pa" + flags = HAIR_TIEABLE ponytail3 name = "Ponytail 3" icon_state = "hair_ponytail3" + flags = HAIR_TIEABLE ponytail4 name = "Ponytail 4" icon_state = "hair_ponytail4" + flags = HAIR_TIEABLE ponytail5 name = "Ponytail 5" icon_state = "hair_ponytail5" + flags = HAIR_TIEABLE ponytail6 name = "Ponytail 6" icon_state = "hair_ponytail6" + flags = HAIR_TIEABLE fringetail name = "Fringetail" icon_state = "hair_fringetail" + flags = HAIR_TIEABLE sideponytail name = "Side Ponytail" icon_state = "hair_stail" + flags = HAIR_TIEABLE sideponytail4 //Not happy about this... but it's for the save files. name = "Side Ponytail 2" icon_state = "hair_ponytailf" + flags = HAIR_TIEABLE sideponytail2 name = "One Shoulder" icon_state = "hair_oneshoulder" + flags = HAIR_TIEABLE sideponytail3 name = "Tress Shoulder" icon_state = "hair_tressshoulder" + flags = HAIR_TIEABLE spikyponytail name = "Spiky Ponytail" icon_state = "hair_spikyponytail" + flags = HAIR_TIEABLE zieglertail name = "Zieglertail" icon_state = "hair_ziegler" + flags = HAIR_TIEABLE + wisp name = "Wisp" icon_state = "hair_wisp" + flags = HAIR_TIEABLE parted name = "Parted" @@ -176,6 +211,7 @@ sleeze name = "Sleeze" icon_state = "hair_sleeze" + flags = HAIR_VERY_SHORT quiff name = "Quiff" @@ -192,32 +228,39 @@ bedhead3 name = "Bedhead 3" icon_state = "hair_bedheadv3" + flags = HAIR_TIEABLE bedheadlong name = "Bedhead Long" icon_state = "hair_long_bedhead" + flags = HAIR_TIEABLE beehive name = "Beehive" icon_state = "hair_beehive" + flags = HAIR_TIEABLE beehive2 name = "Beehive 2" icon_state = "hair_beehive2" + flags = HAIR_TIEABLE bobcurl name = "Bobcurl" icon_state = "hair_bobcurl" species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) + flags = HAIR_TIEABLE bob name = "Bob" icon_state = "hair_bobcut" species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) + flags = HAIR_TIEABLE bobcutalt name = "Chin Length Bob" icon_state = "hair_bobcutalt" + flags = HAIR_TIEABLE bun name = "Bun" @@ -238,15 +281,18 @@ buzz name = "Buzzcut" icon_state = "hair_buzzcut" + flags = HAIR_VERY_SHORT species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI) shavehair name = "Shaved Hair" icon_state = "hair_shaved" + flags = HAIR_VERY_SHORT crew name = "Crewcut" icon_state = "hair_crewcut" + flags = HAIR_VERY_SHORT combover name = "Combover" @@ -271,6 +317,7 @@ curls name = "Curls" icon_state = "hair_curls" + flags = HAIR_TIEABLE afro name = "Afro" @@ -287,14 +334,17 @@ rows name = "Rows" icon_state = "hair_rows1" + flags = HAIR_VERY_SHORT rows2 name = "Rows 2" icon_state = "hair_rows2" + flags = HAIR_TIEABLE sargeant name = "Flat Top" icon_state = "hair_sargeant" + flags = HAIR_VERY_SHORT emo name = "Emo" @@ -307,10 +357,12 @@ longemo name = "Long Emo" icon_state = "hair_emolong" + flags = HAIR_TIEABLE fringeemo name = "Emo Fringe" icon_state = "hair_emofringe" + flags = HAIR_TIEABLE veryshortovereyealternate name = "Overeye Very Short, Alternate" @@ -327,6 +379,7 @@ longovereye name = "Overeye Long" icon_state = "hair_longovereye" + flags = HAIR_TIEABLE flowhair name = "Flow Hair" @@ -335,6 +388,7 @@ feather name = "Feather" icon_state = "hair_feather" + flags = HAIR_TIEABLE hitop name = "Hitop" @@ -356,6 +410,7 @@ gentle name = "Gentle" icon_state = "hair_gentle" + flags = HAIR_TIEABLE spiky name = "Spiky" @@ -369,51 +424,63 @@ kagami name = "Pigtails" icon_state = "hair_kagami" + flags = HAIR_TIEABLE himecut name = "Hime Cut" icon_state = "hair_himecut" + flags = HAIR_TIEABLE shorthime name = "Short Hime Cut" icon_state = "hair_shorthime" + flags = HAIR_TIEABLE grandebraid name = "Grande Braid" icon_state = "hair_grande" + flags = HAIR_TIEABLE mbraid name = "Medium Braid" icon_state = "hair_shortbraid" + flags = HAIR_TIEABLE braid2 name = "Long Braid" icon_state = "hair_hbraid" + flags = HAIR_TIEABLE braid name = "Floorlength Braid" icon_state = "hair_braid" + flags = HAIR_TIEABLE odango name = "Odango" icon_state = "hair_odango" + flags = HAIR_TIEABLE ombre name = "Ombre" icon_state = "hair_ombre" + flags = HAIR_TIEABLE updo name = "Updo" icon_state = "hair_updo" + flags = HAIR_TIEABLE skinhead name = "Skinhead" icon_state = "hair_skinhead" + flags = HAIR_VERY_SHORT balding name = "Balding Hair" icon_state = "hair_e" gender = MALE + flags = HAIR_VERY_SHORT familyman name = "The Family Man" @@ -434,10 +501,13 @@ poofy name = "Poofy" icon_state = "hair_poofy" + flags = HAIR_TIEABLE poofy2 name = "Poofy2" icon_state = "hair_poofy2" + flags = HAIR_TIEABLE + crono name = "Chrono" icon_state = "hair_toriyama" @@ -461,6 +531,7 @@ nitori name = "Nitori" icon_state = "hair_nitori" + flags = HAIR_TIEABLE joestar name = "Joestar" @@ -469,6 +540,7 @@ volaju name = "Volaju" icon_state = "hair_volaju" + flags = HAIR_TIEABLE eighties name = "80's" @@ -486,14 +558,6 @@ name = "Modern" icon_state = "hair_modern" - bald - name = "Bald" - icon_state = "bald" - - longeralt2 - name = "Long Hair Alt 2" - icon_state = "hair_longeralt2" - shortbangs name = "Short Bangs" icon_state = "hair_shortbangs" @@ -505,10 +569,12 @@ bun name = "Casual Bun" icon_state = "hair_bun" + flags = HAIR_TIEABLE doublebun name = "Double-Bun" icon_state = "hair_doublebun" + flags = HAIR_TIEABLE oxton name = "Oxton" @@ -518,93 +584,113 @@ name = "Low Fade" icon_state = "hair_lowfade" gender = MALE + flags = HAIR_VERY_SHORT medfade name = "Medium Fade" icon_state = "hair_medfade" + flags = HAIR_VERY_SHORT highfade name = "High Fade" icon_state = "hair_highfade" gender = MALE + flags = HAIR_VERY_SHORT baldfade name = "Balding Fade" icon_state = "hair_baldfade" gender = MALE + flags = HAIR_VERY_SHORT nofade name = "Regulation Cut" icon_state = "hair_nofade" gender = MALE + flags = HAIR_VERY_SHORT trimflat name = "Trimmed Flat Top" icon_state = "hair_trimflat" gender = MALE + flags = HAIR_VERY_SHORT trimmed name = "Trimmed" icon_state = "hair_trimmed" gender = MALE + flags = HAIR_VERY_SHORT tightbun name = "Tight Bun" icon_state = "hair_tightbun" gender = FEMALE + flags = HAIR_VERY_SHORT | HAIR_TIEABLE coffeehouse name = "Coffee House Cut" icon_state = "hair_coffeehouse" gender = MALE + flags = HAIR_VERY_SHORT undercut1 name = "Undercut" icon_state = "hair_undercut1" gender = MALE + flags = HAIR_VERY_SHORT undercut2 name = "Undercut Swept Right" icon_state = "hair_undercut2" gender = MALE + flags = HAIR_VERY_SHORT undercut3 name = "Undercut Swept Left" icon_state = "hair_undercut3" gender = MALE + flags = HAIR_VERY_SHORT partfade name = "Parted Fade" icon_state = "hair_shavedpart" gender = MALE + flags = HAIR_VERY_SHORT hightight name = "High and Tight" icon_state = "hair_hightight" + flags = HAIR_VERY_SHORT rowbun name = "Row Bun" icon_state = "hair_rowbun" + flags = HAIR_TIEABLE rowdualbraid name = "Row Dual Braid" icon_state = "hair_rowdualtail" + flags = HAIR_TIEABLE rowbraid name = "Row Braid" icon_state = "hair_rowbraid" + flags = HAIR_TIEABLE regulationmohawk name = "Regulation Mohawk" icon_state = "hair_shavedmohawk" + flags = HAIR_VERY_SHORT topknot name = "Topknot" icon_state = "hair_topknot" + flags = HAIR_TIEABLE ronin name = "Ronin" icon_state = "hair_ronin" + flags = HAIR_TIEABLE bowlcut2 name = "Bowl2" @@ -613,18 +699,22 @@ thinning name = "Thinning" icon_state = "hair_thinning" + flags = HAIR_VERY_SHORT thinningfront name = "Thinning Front" icon_state = "hair_thinningfront" + flags = HAIR_VERY_SHORT thinningback name = "Thinning Back" icon_state = "hair_thinningrear" + flags = HAIR_VERY_SHORT manbun name = "Manbun" icon_state = "hair_manbun" + flags = HAIR_TIEABLE shy name = "Shy" diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 971af563ee..b76b52e1c0 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -51,10 +51,10 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/head/get_icon() ..() - + //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item cut_overlays() - + //Every 'addon' below requires information from species if(!owner || !owner.species) return @@ -78,7 +78,7 @@ var/global/list/limb_icon_cache = list() eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) add_overlay(eyes_icon) mob_icon.Blend(eyes_icon, ICON_OVERLAY) - + //Lip color/icon if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") @@ -94,6 +94,12 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons icon_cache_key += "[M][markings[M]["color"]]" + overlays |= get_hair_icon() + + return mob_icon + +/obj/item/organ/external/head/proc/get_hair_icon() + var/image/res = image('icons/mob/human_face.dmi',"bald_s") //Facial hair if(owner.f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] @@ -101,20 +107,24 @@ var/global/list/limb_icon_cache = list() var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - add_overlay(facial_s) + res.overlays |= facial_s //Head hair if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[owner.h_style] + var/style = owner.h_style + var/datum/sprite_accessory/hair/hair_style = hair_styles_list[style] + if(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)) + if(!(hair_style.flags & HAIR_VERY_SHORT)) + hair_style = hair_styles_list["Short Hair"] if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s") if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) hair_s.Blend(hair_s_add, ICON_ADD) - add_overlay(hair_s) + res.overlays |= hair_s - return mob_icon + return res /obj/item/organ/external/proc/get_icon(var/skeletal) From 284b60212b7c6d08064fc17fc4fc963be3763721 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 6 Jun 2018 21:33:30 -0500 Subject: [PATCH 024/267] Cult robes use the right sprite again --- code/game/gamemodes/cult/cult_items.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 9d8eb8dc91..082404b271 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -84,7 +84,6 @@ /obj/item/clothing/suit/cultrobes/alt icon_state = "cultrobesalt" - item_state = "cultrobes" /obj/item/clothing/suit/cultrobes/magusred name = "magus robes" From 4b2c98f919680960bcdf1b3f2a4d770cf45a77e1 Mon Sep 17 00:00:00 2001 From: atermonera Date: Fri, 8 Jun 2018 12:14:11 -0700 Subject: [PATCH 025/267] Updates changelog --- html/changelog.html | 17 +++++++++ html/changelogs/.all_changelog.yml | 16 ++++++++ html/changelogs/Anewbe - Merc PoIs.yml | 39 -------------------- html/changelogs/Anewbe - More Merc PoIs.yml | 37 ------------------- html/changelogs/Mechoid - EventBox.yml | 7 ---- html/changelogs/Mechoid - Ionrifle.yml | 36 ------------------ html/changelogs/Mechoid - Seedvendorhack.yml | 7 ---- 7 files changed, 33 insertions(+), 126 deletions(-) delete mode 100644 html/changelogs/Anewbe - Merc PoIs.yml delete mode 100644 html/changelogs/Anewbe - More Merc PoIs.yml delete mode 100644 html/changelogs/Mechoid - EventBox.yml delete mode 100644 html/changelogs/Mechoid - Ionrifle.yml delete mode 100644 html/changelogs/Mechoid - Seedvendorhack.yml diff --git a/html/changelog.html b/html/changelog.html index d93e00f98c..9c933a1741 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,23 @@ -->
+

08 June 2018

+

Anewbe updated:

+
    +
  • Merc mobs in PoIs no longer drop gear. This is to help us balance the PoIs that contain them, and by extension every other PoI.
  • +
  • Merc mobs have been shuffled around in their PoIs. At some point, this may actually be randomized, but for now, expect slightly different placements.
  • +
  • Adds a laser rifle and ion rifle version of the Merc mob, for variety.
  • +
  • PoI turrets are lethal again, and will likely shoot crawlers.
  • +
  • Certain mobs, namely robots and mercs, now have some amount of armor.
  • +
  • Ranged mercs will now knife people when cornered, rather than punch them really hard.
  • +
+

Mechoid updated:

+
    +
  • Added some background things for Events.
  • +
  • Ion rifles hit the correct 3x3 instead of 5x5
  • +
  • Seed Storage Vendors are now hackable. Can choose from various lists of concerning plants.
  • +
+

24 May 2018

Anewbe updated: