From 30779d1204fa9537dae5e3c8624f4ff582755df3 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 24 May 2018 10:03:13 -0400 Subject: [PATCH 001/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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/218] 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 b455abf2b61e551c73f280a3eb6012b9910b5ab9 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Tue, 5 Jun 2018 20:29:59 -0700 Subject: [PATCH 018/218] 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 019/218] 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 020/218] 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 021/218] 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 022/218] 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 023/218] 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 024/218] 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: