From 30779d1204fa9537dae5e3c8624f4ff582755df3 Mon Sep 17 00:00:00 2001 From: fludd12 Date: Thu, 24 May 2018 10:03:13 -0400 Subject: [PATCH 001/147] 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 0dc2fd1fc4f..ee01d7ae1ea 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 dbccc8ef6d9e8974ae1ca7f7bf264c2a47748fff Mon Sep 17 00:00:00 2001 From: Verkister Date: Fri, 25 May 2018 17:39:58 +0300 Subject: [PATCH 002/147] Borg belly tweaks and fixes. -Fixes UI autoupdated firing off the popups after closing the window. -Fixes mob digestion order for clean cycle. Dead mobs will no longer linger on the mercy of the rng against other loose crap. -Makes the gurgledamages draw water from mobs as well. -Removes redundant mob_energy corpse gain since corpse handling now comes after the damage gains. -Sanitizes a whole bunch of UI update stuff. -The UI window now starts with a less cluttery size. -Makes clean cycle actually finish the limbo when nothing but protected stuff is left. -Also fixed runtimes on digest_act for protected items while at it. --- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 142 +++++++----------- code/modules/vore/eating/digest_act_vr.dm | 18 +-- 2 files changed, 65 insertions(+), 95 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 39236a824fb..44ace0a1895 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -11,7 +11,6 @@ var/min_health = -100 var/cleaning = 0 var/patient_laststat = null - var/mob_energy = -100 //Energy gained from digesting dead mobs (including PCs) var/list/injection_chems = list("inaprovaline", "dexalin", "bicaridine", "kelotane","anti_toxin", "alkysine", "imidazoline", "spaceacillin", "paracetamol") //The borg is able to heal every damage type. As a nerf, they use 750 charge per injection. var/eject_port = "ingestion" var/list/items_preserved = list() @@ -70,8 +69,6 @@ for(var/T in tech_item.origin_tech) to_chat(user, "\The [tech_item] has level [tech_item.origin_tech[T]] in [CallTechName(T)].") update_patient() - if(UI_open == TRUE) - sleeperUI(usr) return else if(ishuman(target)) @@ -90,8 +87,6 @@ user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.") playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() - if(UI_open == TRUE) - sleeperUI(usr) return return @@ -107,8 +102,6 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() - if(UI_open == TRUE) - sleeperUI(usr) return if(istype(target, /mob/living/simple_animal/mouse)) //Edible mice, dead or alive whatever. Mostly for carcass picking you cruel bastard :v @@ -120,8 +113,6 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.") playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() - if(UI_open == TRUE) - sleeperUI(usr) return else if(ishuman(target)) @@ -140,8 +131,6 @@ user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() - if(UI_open == TRUE) - sleeperUI(usr) return return else if(ishuman(target)) @@ -167,8 +156,6 @@ user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.") message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) - if(UI_open == TRUE) - sleeperUI(usr) /obj/item/device/dogborg/sleeper/proc/go_out(var/target) hound = src.loc @@ -208,10 +195,9 @@ if(..()) return sleeperUI(user) - UI_open = TRUE /obj/item/device/dogborg/sleeper/proc/sleeperUI(mob/user) - var/dat + var/dat = "[name] Console
" if(islist(injection_chems)) //Only display this if we're a drug-dispensing doggo. dat += "

Injector

" @@ -295,10 +281,10 @@ dat += "
[R.name]:
[round(R.volume, 0.1)] units

" dat += "" - var/datum/browser/popup = new(user, "sleeper", "[name] Console", 520, 540) //Set up the popup browser window - //popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) //I have no idea what this is, but it feels irrelevant and causes runtimes idk. + var/datum/browser/popup = new(user, "sleeper_b", "[name] Console", 400, 500, src) popup.set_content(dat) popup.open() + UI_open = TRUE return /obj/item/device/dogborg/sleeper/Topic(href, href_list) @@ -328,7 +314,6 @@ drain(startdrain) processing_objects |= src update_patient() - sleeperUI(usr) if(patient) to_chat(patient, "[hound.name]'s [src.name] fills with caustic enzymes around you!") return @@ -392,6 +377,8 @@ //For if the dogborg's existing patient uh, doesn't make it. /obj/item/device/dogborg/sleeper/proc/update_patient() hound = src.loc + if(UI_open == TRUE) + sleeperUI(hound) //Well, we HAD one, what happened to them? if(patient in contents) @@ -411,8 +398,6 @@ //Update icon hound.updateicon() //Return original patient - if(UI_open == TRUE) - sleeperUI(usr) return(patient) //Check for a new patient @@ -433,8 +418,6 @@ patient_laststat = patient.stat //Update icon and return new patient hound.updateicon() - if(UI_open == TRUE) - sleeperUI(usr) return(C) //Cleaning looks better with red on, even with nobody in it @@ -455,8 +438,6 @@ patient_laststat = null patient = null hound.updateicon() - if(UI_open == TRUE) - sleeperUI(usr) return //Gurgleborg process @@ -470,7 +451,7 @@ var/list/touchable_items = contents - items_preserved //Belly is entirely empty - if(!length(contents)) + if(!length(touchable_items)) var/finisher = pick( 'sound/vore/death1.ogg', 'sound/vore/death2.ogg', @@ -508,7 +489,9 @@ if(air_master.current_cycle%3==1 && length(touchable_items)) //Burn all the mobs or add them to the exclusion list + var/volume = 0 for(var/mob/living/T in (touchable_items)) + touchable_items -= T //Exclude mobs from loose item picking. if((T.status_flags & GODMODE) || !T.digestable) items_preserved += T else @@ -520,66 +503,55 @@ var/actual_burn = T.getFireLoss() - old_burn var/damage_gain = actual_brute + actual_burn drain(-25 * damage_gain) //25*total loss as with voreorgan stats. - update_patient() + water.add_charge(damage_gain) + if(T.stat == DEAD) + if(ishuman(T)) + message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") + to_chat(hound, "You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.") + to_chat(T, "You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.") + var/deathsound = pick( + 'sound/vore/death1.ogg', + 'sound/vore/death2.ogg', + 'sound/vore/death3.ogg', + 'sound/vore/death4.ogg', + 'sound/vore/death5.ogg', + 'sound/vore/death6.ogg', + 'sound/vore/death7.ogg', + 'sound/vore/death8.ogg', + 'sound/vore/death9.ogg', + 'sound/vore/death10.ogg') + playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) + if(is_vore_predator(T)) + for(var/belly in T.vore_organs) + var/obj/belly/B = belly + for(var/atom/movable/thing in B) + thing.forceMove(src) + if(ismob(thing)) + to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]") + for(var/obj/item/I in T) + if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain)) + var/obj/item/organ/internal/mmi_holder/MMI = I + var/atom/movable/brain = MMI.removed() + if(brain) + hound.remove_from_mob(brain,src) + brain.forceMove(src) + items_preserved += brain + else + T.drop_from_inventory(I, src) + if(ishuman(T)) + var/mob/living/carbon/human/Prey = T + volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier + water.add_charge(volume) + if(T.reagents) + volume = T.reagents.total_volume + water.add_charge(volume) + qdel(T) //Pick a random item to deal with (if there are any) - var/atom/target = pick(touchable_items) - var/volume = 0 + if(length(touchable_items)) + var/atom/target = pick(touchable_items) - //Handle the target being a mob - if(isliving(target)) - var/mob/living/T = target - - //Mob is now dead - if(T.stat == DEAD) - if(ishuman(target)) - message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") - to_chat(hound, "You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.") - to_chat(T, "You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.") - drain(mob_energy) //Fueeeeellll - var/deathsound = pick( - 'sound/vore/death1.ogg', - 'sound/vore/death2.ogg', - 'sound/vore/death3.ogg', - 'sound/vore/death4.ogg', - 'sound/vore/death5.ogg', - 'sound/vore/death6.ogg', - 'sound/vore/death7.ogg', - 'sound/vore/death8.ogg', - 'sound/vore/death9.ogg', - 'sound/vore/death10.ogg') - playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) - if(is_vore_predator(T)) - for(var/belly in T.vore_organs) - var/obj/belly/B = belly - for(var/atom/movable/thing in B) - thing.forceMove(src) - if(ismob(thing)) - to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]") - for(var/obj/item/I in T) - if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain)) - var/obj/item/organ/internal/mmi_holder/MMI = I - var/atom/movable/brain = MMI.removed() - if(brain) - hound.remove_from_mob(brain,src) - brain.forceMove(src) - items_preserved += brain - else - T.drop_from_inventory(I, src) - if(ishuman(T)) - var/mob/living/carbon/human/Prey = T - volume = (Prey.bloodstr.total_volume + Prey.ingested.total_volume + Prey.touching.total_volume + Prey.weight) * Prey.size_multiplier - water.add_charge(volume) - if(T.reagents) - volume = T.reagents.total_volume - water.add_charge(volume) - qdel(T) - update_patient() - if(UI_open == TRUE) - sleeperUI(hound) - - //Handle the target being anything but a /mob/living - else + //Handle the target being anything but a /mob/living var/obj/item/T = target if(istype(T)) if(T.reagents) @@ -618,10 +590,8 @@ drain(-100) else items_preserved |= target - if(UI_open == TRUE) - update_patient() - sleeperUI(hound) - return + update_patient() + return /obj/item/device/dogborg/sleeper/process() diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm index 20d570075d5..cc247b5497f 100644 --- a/code/modules/vore/eating/digest_act_vr.dm +++ b/code/modules/vore/eating/digest_act_vr.dm @@ -19,23 +19,23 @@ ///////////// // Some indigestible stuff ///////////// -/obj/item/weapon/hand_tele/digest_act(...) +/obj/item/weapon/hand_tele/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/weapon/card/id/gold/captain/spare/digest_act(...) +/obj/item/weapon/card/id/gold/captain/spare/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/device/aicard/digest_act(...) +/obj/item/device/aicard/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/device/paicard/digest_act(...) +/obj/item/device/paicard/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/weapon/gun/digest_act(...) +/obj/item/weapon/gun/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/weapon/pinpointer/digest_act(...) +/obj/item/weapon/pinpointer/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/blueprints/digest_act(...) +/obj/item/blueprints/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/weapon/disk/nuclear/digest_act(...) +/obj/item/weapon/disk/nuclear/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/device/perfect_tele_beacon/digest_act(...) +/obj/item/device/perfect_tele_beacon/digest_act(var/atom/movable/item_storage = null) return FALSE //Sorta important to not digest your own beacons. ///////////// From f4645449b45db5e4078af969e7e8061576d10888 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Fri, 25 May 2018 15:36:55 -0500 Subject: [PATCH 003/147] 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 35e09030ddb..e51dfd82a76 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 c7645d2352a..9f8c7378942 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 dc57fd00f90..9a11178e666 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 00000000000..d13768b1e0b --- /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 7c892fa9895e7a2cb72b70415b927bcf8f86ebf9 Mon Sep 17 00:00:00 2001 From: Verkister Date: Sat, 26 May 2018 16:39:54 +0300 Subject: [PATCH 004/147] fixes pupdozer belly water lines --- .../modules/mob/living/silicon/robot/robot_modules/station_vr.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 2adb7f063b7..0bc16ccc3b6 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -480,6 +480,7 @@ MD.glass = glass MD.wood = wood MD.plastic = plastic + MD.water = water src.modules += MD var/obj/item/stack/material/cyborg/steel/M = new (src) From da2bb9567e08781f8bec9046ec5b04ea6ba2910d Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 27 May 2018 14:01:43 -0400 Subject: [PATCH 005/147] 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 95f8dcdbe73..97c1338debc 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 f5f85fe8f5b..801b7e60cfa 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 2b11059ff9c..927216190ac 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 006/147] 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 bdf4e95fe06..0724cd15bed 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 007/147] 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 75e17bd7922..04dbaffb539 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 99036e2e9d4..ceced1549ff 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 008/147] 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 2ab82cd2aea..7bc33d75000 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 009/147] 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 1484cff07fe..ca5a88db4ba 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 010/147] 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 2e7d9ad6ed4..bf987eb0d30 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 011/147] 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 012/147] 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 5b98c87f42d..4b20c5a955c 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 013/147] 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 770b3a5e873..18043f92702 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 014/147] 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 90f708ff9df..0369b91d63b 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 015/147] 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 cd3a4506319..60a253c87c2 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 016/147] 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 d7905146141..44137b0431b 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 18043f92702..00000000000 --- 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 00000000000..2bb09050f46 --- /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 8d02fda2ebb..f1249cfe0c3 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 4d6ff75c50a..fca4cf4866d 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 969c77f4fb5..861b34d9ead 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 c329fc2e4d1..468b893b335 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 613638ec804..35cd7aa4a80 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 3582aab0c78..91dc377bd31 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 e0cd38dcfbd..4d0881294f4 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 061ae73398f..8fb76044178 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 8717245b246..3e7dc2c27a2 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 2004271237d..f9d457a9413 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 017/147] 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 5fbba12e356..7cd6925f8d4 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 0adf41ba3fca0e2fcffa2bb33886dc1e6dd4396f Mon Sep 17 00:00:00 2001 From: Verkister Date: Sun, 3 Jun 2018 15:42:29 +0300 Subject: [PATCH 018/147] Some more tweaks and an unfinished feature. -Fixes recycling stack materials resulting in double material output for some reason. -Fixes and streamlines some sleeperbelly functions. -Adds unfinished cargo delivery belly. Not implemented currently, still under testing, but was too far in to remove for the other small updates while waiting for the PR to get merged already in vain. --- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 196 ++++++++++-------- .../silicon/robot/robot_modules/station_vr.dm | 30 +-- 2 files changed, 126 insertions(+), 100 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 44ace0a1895..f6c2028fec5 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -18,6 +18,12 @@ var/compactor = FALSE var/analyzer = FALSE var/decompiler = FALSE + var/delivery = FALSE + var/delivery_tag = "Fuel" + var/list/deliverylists = list() + var/list/deliveryslot_1 = list() + var/list/deliveryslot_2 = list() + var/list/deliveryslot_3 = list() var/datum/research/techonly/files //Analyzerbelly var. var/synced = FALSE var/startdrain = 500 @@ -49,48 +55,11 @@ return if(target in hound.module.modules) return - if(length(contents) > (max_item_count - 1)) + if(length(contents) >= max_item_count) to_chat(user, "Your [src.name] is full. Eject or process contents to continue.") return - if(analyzer == TRUE) - if(istype(target, /obj/item)) - var/obj/target_obj = target - if(target_obj.w_class > ITEMSIZE_LARGE) - to_chat(user, "\The [target] is too large to fit into your [src.name]") - return - user.visible_message("[hound.name] is ingesting [target.name] into their [src.name].", "You start ingesting [target] into your [src.name]...") - if(do_after(user, 30, target) && length(contents) < max_item_count) - target.forceMove(src) - user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.") - playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) - if(istype(target,/obj/item)) - var/obj/item/tech_item = target - for(var/T in tech_item.origin_tech) - to_chat(user, "\The [tech_item] has level [tech_item.origin_tech[T]] in [CallTechName(T)].") - update_patient() - return - - else if(ishuman(target)) - var/mob/living/carbon/human/trashman = target - if(patient) - to_chat(user, "Your [src.name] is already occupied.") - return - if(trashman.buckled) - to_chat(user, "[trashman] is buckled and can not be put into your [src.name].") - return - user.visible_message("[hound.name] is ingesting [trashman] into their [src.name].", "You start ingesting [trashman] into your [src.name]...") - if(do_after(user, 30, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) - trashman.forceMove(src) - trashman.reset_view(src) - processing_objects |= src - user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.") - playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) - update_patient() - return - return - - if(compactor == TRUE) + if(compactor) if(istype(target, /obj/item) || istype(target, /obj/effect/decal/remains)) var/obj/target_obj = target if(target_obj.w_class > ITEMSIZE_LARGE) @@ -99,8 +68,16 @@ user.visible_message("[hound.name] is ingesting [target.name] into their [src.name].", "You start ingesting [target] into your [src.name]...") if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) - user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") + user.visible_message("[hound.name]'s [src.name] groans lightly as [target.name] slips inside.", "Your [src.name] groans lightly as [target] slips inside.") playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) + if(analyzer && istype(target,/obj/item)) + var/obj/item/tech_item = target + for(var/T in tech_item.origin_tech) + to_chat(user, "\The [tech_item] has level [tech_item.origin_tech[T]] in [CallTechName(T)].") + if(delivery) + if(islist(deliverylists[delivery_tag])) + deliverylists[delivery_tag] |= target + to_chat(user, "\The [target.name] added to cargo compartment slot: [delivery_tag].") update_patient() return @@ -110,8 +87,12 @@ if(do_after(user, 30, trashmouse) && length(contents) < max_item_count) trashmouse.forceMove(src) trashmouse.reset_view(src) - user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.") + user.visible_message("[hound.name]'s [src.name] groans lightly as [trashmouse] slips inside.", "Your [src.name] groans lightly as [trashmouse] slips inside.") playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) + if(delivery) + if(islist(deliverylists[delivery_tag])) + deliverylists[delivery_tag] |= trashmouse + to_chat(user, "\The [trashmouse] added to cargo compartment slot: [delivery_tag].") update_patient() return @@ -128,11 +109,18 @@ trashman.forceMove(src) trashman.reset_view(src) processing_objects |= src - user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") + user.visible_message("[hound.name]'s [src.name] groans lightly as [trashman] slips inside.", "Your [src.name] groans lightly as [trashman] slips inside.") + message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) + if(delivery) + if(islist(deliverylists[delivery_tag])) + deliverylists[delivery_tag] |= trashman + to_chat(user, "\The [trashman] added to cargo compartment slot: [delivery_tag].") + to_chat(trashman, "[hound.name] has added you to their cargo compartment slot: [delivery_tag].") update_patient() return return + else if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.buckled) @@ -143,48 +131,38 @@ return user.visible_message("[hound.name] is ingesting [H.name] into their [src.name].", "You start ingesting [H] into your [src]...") if(!patient && !H.buckled && do_after (user, 50, H)) - - if(!proximity) return //If they moved away, you can't eat them. - - if(patient) return //If you try to eat two people at once, you can only eat one. - + if(!proximity) + return //If they moved away, you can't eat them. + if(patient) + return //If you try to eat two people at once, you can only eat one. else //If you don't have someone in you, proceed. H.forceMove(src) H.reset_view(src) update_patient() processing_objects |= src - user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.") + user.visible_message("[hound.name]'s [src.name] lights up as [H.name] slips inside.", "Your [src] lights up as [H] slips inside. Life support functions engaged.") message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) /obj/item/device/dogborg/sleeper/proc/go_out(var/target) hound = src.loc + items_preserved.Cut() + cleaning = 0 + for(var/list/dlist in deliverylists) + dlist.Cut() if(length(contents) > 0) hound.visible_message("[hound.name] empties out their contents via their [eject_port] port.", "You empty your contents via your [eject_port] port.") - if(target) - if(ishuman(target)) - var/mob/living/carbon/human/person = target + for(var/C in contents) + if(ishuman(C)) + var/mob/living/carbon/human/person = C person.forceMove(get_turf(src)) person.reset_view() else - var/obj/T = target + var/obj/T = C T.loc = hound.loc - else - for(var/C in contents) - if(ishuman(C)) - var/mob/living/carbon/human/person = C - person.forceMove(get_turf(src)) - person.reset_view() - else - var/obj/T = C - T.loc = hound.loc - items_preserved.Cut() - cleaning = 0 playsound(loc, 'sound/effects/splat.ogg', 50, 1) update_patient() else //You clicked eject with nothing in you, let's just reset stuff to be sure. - items_preserved.Cut() - cleaning = 0 update_patient() /obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov) @@ -220,15 +198,33 @@ dat += "Self-Clean" else dat += "Self-Clean" + if(delivery) + dat += "

Cargo Compartment


" + dat += "Active Slot: [delivery_tag]" + if(islist(deliverylists[delivery_tag])) + dat += "Eject Slot" dat += "
" - if(compactor == TRUE && length(contents))//garbage counter for trashpup - var/obj/item/device/dogborg/sleeper/compactor/garbo = src - dat += "Current load: [length(contents)] / [garbo.max_item_count] objects.
" + if(!delivery && compactor && length(contents))//garbage counter for trashpup + dat += "Current load: [length(contents)] / [max_item_count] objects.
" dat += "([list2text(contents,", ")])

" - if(analyzer == TRUE && synced == FALSE) + if(delivery && length(contents)) + dat += "Current load: [length(contents)] / [max_item_count] objects.
" + dat += "Cargo compartment slot: Cargo 1.
" + if(length(deliveryslot_1)) + dat += "([list2text(deliveryslot_1,", ")])
" + dat += "Cargo compartment slot: Cargo 2.
" + if(length(deliveryslot_2)) + dat += "([list2text(deliveryslot_2,", ")])
" + dat += "Cargo compartment slot: Cargo 3.
" + if(length(deliveryslot_3)) + dat += "([list2text(deliveryslot_3,", ")])
" + dat += "Cargo compartment slot: Fuel.
" + dat += "([list2text(contents - (deliveryslot_1 + deliveryslot_2 + deliveryslot_3),", ")])

" + + if(analyzer && synced) dat += "Sync Files
" //Cleaning and there are still un-preserved items @@ -328,7 +324,29 @@ eject_port = "ingestion" sleeperUI(usr) return - + if(href_list["deliveryslot"]) + var/tag = input("Select active delivery slot.") as null|anything in deliverylists + if(!tag) + return 0 + delivery_tag = tag + sleeperUI(usr) + return + if(href_list["slot_eject"]) + if(length(deliverylists[delivery_tag]) > 0) + hound.visible_message("[hound.name] empties out their cargo compartment via their [eject_port] port.", "You empty your cargo compartment via your [eject_port] port.") + for(var/C in deliverylists[delivery_tag]) + if(ishuman(C)) + var/mob/living/carbon/human/person = C + person.forceMove(get_turf(src)) + person.reset_view() + else + var/obj/T = C + T.loc = hound.loc + playsound(loc, 'sound/effects/splat.ogg', 50, 1) + update_patient() + deliverylists[delivery_tag].Cut() + sleeperUI(usr) + return if(href_list["sync"]) synced = TRUE var/success = 0 @@ -380,6 +398,13 @@ if(UI_open == TRUE) sleeperUI(hound) + //Cleaning looks better with red on, even with nobody in it + if(cleaning || (length(contents) > 10) || (decompiler && (length(contents) > 5)) || (analyzer && (length(contents) > 1))) + hound.sleeper_r = TRUE + hound.sleeper_g = FALSE + hound.updateicon() + return + //Well, we HAD one, what happened to them? if(patient in contents) if(patient_laststat != patient.stat) @@ -420,18 +445,8 @@ hound.updateicon() return(C) - //Cleaning looks better with red on, even with nobody in it - if(cleaning || (length(contents) > 11)) - hound.sleeper_r = TRUE - hound.sleeper_g = FALSE - - //Letting analyzer gut swell if overloaded. - if(analyzer == TRUE && (length(contents) > 1)) - hound.sleeper_r = TRUE - hound.sleeper_g = FALSE - //Couldn't find anyone, and not cleaning - else if(!cleaning && !patient && !length(contents)) + if(!cleaning && !patient) hound.sleeper_r = FALSE hound.sleeper_g = FALSE @@ -448,7 +463,7 @@ if(!(I in contents)) items_preserved -= I - var/list/touchable_items = contents - items_preserved + var/list/touchable_items = contents - items_preserved - (deliveryslot_1 + deliveryslot_2 + deliveryslot_3) //Belly is entirely empty if(!length(touchable_items)) @@ -493,7 +508,7 @@ for(var/mob/living/T in (touchable_items)) touchable_items -= T //Exclude mobs from loose item picking. if((T.status_flags & GODMODE) || !T.digestable) - items_preserved += T + items_preserved |= T else var/old_brute = T.getBruteLoss() var/old_burn = T.getFireLoss() @@ -535,7 +550,7 @@ if(brain) hound.remove_from_mob(brain,src) brain.forceMove(src) - items_preserved += brain + items_preserved |= brain else T.drop_from_inventory(I, src) if(ishuman(T)) @@ -568,12 +583,12 @@ drain(-50 * digested) if(volume) water.add_charge(volume) - if(!analyzer && compactor && T.matter) + if(!analyzer && !delivery && compactor && T.matter) for(var/material in T.matter) var/total_material = T.matter[material] if(istype(T,/obj/item/stack)) var/obj/item/stack/stack = T - total_material *= stack.get_amount() + total_material *= (0.5 * stack.get_amount()) if(material == DEFAULT_WALL_MATERIAL) metal.add_charge(total_material) if(material == "glass") @@ -641,4 +656,11 @@ desc = "A mounted matter decompiling unit with fuel processor." icon_state = "decompiler" max_item_count = 10 - decompiler = TRUE \ No newline at end of file + decompiler = TRUE + +/obj/item/device/dogborg/sleeper/compactor/delivery //Unfinished and unimplemented, still testing. + name = "Cargo Belly" + desc = "A mounted cargo bay unit for tagged deliveries." + icon_state = "decompiler" + max_item_count = 20 + delivery = TRUE \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 0bc16ccc3b6..56d0bb0182a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -148,7 +148,7 @@ var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water synths += water @@ -159,6 +159,7 @@ var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src) //Eat criminals. Bring them to the brig. B.water = water + src.modules += B R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' @@ -216,7 +217,7 @@ var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water synths += water @@ -227,6 +228,7 @@ var/obj/item/device/dogborg/sleeper/B = new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them B.water = water + src.modules += B R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' @@ -260,7 +262,7 @@ var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water synths += water @@ -271,6 +273,7 @@ var/obj/item/device/dogborg/sleeper/K9/B = new /obj/item/device/dogborg/sleeper/K9(src) B.water = water + src.modules += B R.icon = 'icons/mob/64x64robot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' @@ -301,17 +304,17 @@ var/datum/matter_synth/metal = new /datum/matter_synth/metal() metal.name = "Steel reserves" metal.recharge_rate = 0 - metal.max_energy = 100000 + metal.max_energy = 50000 metal.energy = 0 var/datum/matter_synth/glass = new /datum/matter_synth/glass() glass.name = "Glass reserves" glass.recharge_rate = 0 - glass.max_energy = 100000 + glass.max_energy = 50000 glass.energy = 0 var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water @@ -383,7 +386,7 @@ var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water synths += water @@ -394,6 +397,7 @@ var/obj/item/device/dogborg/sleeper/compactor/analyzer/B = new /obj/item/device/dogborg/sleeper/compactor/analyzer(src) B.water = water + src.modules += B R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' @@ -426,7 +430,7 @@ src.modules += new /obj/item/device/t_scanner(src) src.modules += new /obj/item/taperoll/engineering(src) src.modules += new /obj/item/weapon/inflatable_dispenser/robot(src) - src.modules += new /obj/item/device/geiger(src) + src.modules += new /obj/item/weapon/pickaxe(src) src.modules += new /obj/item/weapon/dogborg/jaws/small(src) src.modules += new /obj/item/device/dogborg/boop_module(src) src.emag = new /obj/item/weapon/dogborg/pounce(src) @@ -435,27 +439,27 @@ var/datum/matter_synth/metal = new /datum/matter_synth/metal() metal.name = "Steel reserves" metal.recharge_rate = 50 - metal.max_energy = 100000 + metal.max_energy = 50000 metal.energy = 5000 var/datum/matter_synth/glass = new /datum/matter_synth/glass() glass.name = "Glass reserves" glass.recharge_rate = 50 - glass.max_energy = 100000 + glass.max_energy = 50000 glass.energy = 5000 var/datum/matter_synth/wood = new /datum/matter_synth/wood() wood.name = "Wood reserves" wood.recharge_rate = 50 - wood.max_energy = 100000 + wood.max_energy = 50000 wood.energy = 5000 var/datum/matter_synth/plastic = new /datum/matter_synth/plastic() plastic.name = "Plastic reserves" plastic.recharge_rate = 50 - plastic.max_energy = 100000 + plastic.max_energy = 50000 plastic.energy = 5000 var/datum/matter_synth/water = new /datum/matter_synth() water.name = "Water reserves" water.recharge_rate = 0 - water.max_energy = 1000 + water.max_energy = 500 water.energy = 0 R.water_res = water From b8008e454b6a517017ae63727ac47f10c8b6faa3 Mon Sep 17 00:00:00 2001 From: Cameron653 Date: Sun, 3 Jun 2018 15:32:42 -0400 Subject: [PATCH 019/147] 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 ceced1549ff..6181c47c794 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 020/147] 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 f7ecddb0eb8..2e27d125ef3 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 00000000000..3be45359a23 --- /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 021/147] 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 6b2d1d1695d..6ee9fde05c8 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 022/147] 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 c14bbb12a3f..c4324b30ece 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 1c2b1f97730..186745a2771 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 023/147] 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 e6400992dac..7170b12d32b 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 024/147] 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 4f798dfbc53..3c8d9728258 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 025/147] 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 4428f8ee34a..de0a271ae6b 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 8a9db8a349d..018f0e1926b 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 f605529211e..2f2c1452c04 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 8a2f7690182..5141eed9792 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 971af563ee4..b76b52e1c03 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 026/147] 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 9d8eb8dc914..082404b2713 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 027/147] 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 d93e00f98cf..9c933a1741d 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: