From 39e24ef66474482f7ddecbeb1d01b3be6edaa833 Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 12 Jul 2018 23:19:17 -0400 Subject: [PATCH 01/11] Fixes Stairs in BYOND 512.1436 BYOND no longer calls Uncross reliably on stairs, to fix this we switch to using CheckExit and Bumped. This solution is probably the right way to do it anyway. --- code/modules/multiz/structures.dm | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 8b97ffdb35..f819e2ca7b 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -141,20 +141,23 @@ if(!istype(above)) above.ChangeTurf(/turf/simulated/open) -/obj/structure/stairs/Uncross(atom/movable/A) - if(A.dir == dir) - // This is hackish but whatever. - var/turf/target = get_step(GetAbove(A), dir) - var/turf/source = A.loc - if(target.Enter(A, source)) - A.loc = target - target.Entered(A, source) - if(isliving(A)) - var/mob/living/L = A - if(L.pulling) - L.pulling.forceMove(target) - return 0 - return 1 +/obj/structure/stairs/CheckExit(atom/movable/mover as mob|obj, turf/target as turf) + if(get_dir(loc, target) == dir && upperStep(mover.loc)) + return FALSE + . = ..() + +/obj/structure/stairs/Bumped(atom/movable/A) + // This is hackish but whatever. + var/turf/target = get_step(GetAbove(A), dir) + if(target.Enter(A, src)) // Pass src to be ignored to avoid infinate loop + A.forceMove(target) + if(isliving(A)) + var/mob/living/L = A + if(L.pulling) + L.pulling.forceMove(target) + +/obj/structure/stairs/proc/upperStep(var/turf/T) + return (T == loc) /obj/structure/stairs/CanPass(obj/mover, turf/source, height, airflow) return airflow || !density From c929321c787faa85f6666dd29b1dca9bc8dcd320 Mon Sep 17 00:00:00 2001 From: Cameron! Date: Fri, 20 Jul 2018 14:49:20 -0400 Subject: [PATCH 02/11] Adds an indent formatting tag to paper Pretty simple. Typing [tab] will insert a bunch of space characters that won't automatically be collapsed by html or sanitation. Useful for properly indenting paragraphs, where it used to be impossible. --- code/modules/paperwork/paper.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 816b62a099..20e5c7e3ae 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -309,6 +309,7 @@ t = replacetext(t, "\[/h2\]", "") t = replacetext(t, "\[h3\]", "

") t = replacetext(t, "\[/h3\]", "

") + t = replacetext(t, "\[tab\]", "      ") if(!iscrayon) t = replacetext(t, "\[*\]", "
  • ") @@ -630,4 +631,4 @@ /obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle name = "Blackbox Transcript - VMV Aurora's Light" - info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
    mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
    Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
    Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
    Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
    Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
    Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
    Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
    Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
    V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
    A loud explosion is heard.
    V.I.T.A 19:53:29: Alert: fuel intake valve open.
    Technician Dynasty 19:53:31: ... ah.
    Doctor Nazarril 19:53:34: Trrranslate?
    V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
    Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
    V.I.T.A 19:53:53: The Technician is correct.
    Doctor Nazarril 19:54:02: Then... we can't land therrre.
    V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
    Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
    Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
    Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
    Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
    V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
    Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
    Technician Dynasty 19:54:50: Any time, kid. Any time.
    V.I.T.A 19:54:41: Two.
    V.I.T.A 19:54:42: One.
    **8/DEC/2561**
    V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
    V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
    V.I.T.A 06:22:18: No lifesigns detected on board.
    **1/JAN/2562**
    V.I.T.A 00:00:00: Happy New Year, crew.
    V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
    V.I.T.A 00:00:02: Nobody's coming.
    **14/FEB/2562**
    V.I.T.A 00:00:00: Roses are red.
    V.I.T.A 00:00:01: Violets are blue.
    V.I.T.A 00:00:02: Won't you come back?
    V.I.T.A 00:00:03: I miss you.
    **15/FEB/2562**
    V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
    V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
    V.I.T.A 22:19:08: Erasing files... shutting down.
    A low, monotone beep.
    **16/FEB/2562**
    Something chitters.
    End of transcript." \ No newline at end of file + info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
    mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
    Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
    Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
    Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
    Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
    Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
    Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
    Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
    V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
    A loud explosion is heard.
    V.I.T.A 19:53:29: Alert: fuel intake valve open.
    Technician Dynasty 19:53:31: ... ah.
    Doctor Nazarril 19:53:34: Trrranslate?
    V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
    Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
    V.I.T.A 19:53:53: The Technician is correct.
    Doctor Nazarril 19:54:02: Then... we can't land therrre.
    V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
    Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
    Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
    Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
    Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
    V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
    Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
    Technician Dynasty 19:54:50: Any time, kid. Any time.
    V.I.T.A 19:54:41: Two.
    V.I.T.A 19:54:42: One.
    **8/DEC/2561**
    V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
    V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
    V.I.T.A 06:22:18: No lifesigns detected on board.
    **1/JAN/2562**
    V.I.T.A 00:00:00: Happy New Year, crew.
    V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
    V.I.T.A 00:00:02: Nobody's coming.
    **14/FEB/2562**
    V.I.T.A 00:00:00: Roses are red.
    V.I.T.A 00:00:01: Violets are blue.
    V.I.T.A 00:00:02: Won't you come back?
    V.I.T.A 00:00:03: I miss you.
    **15/FEB/2562**
    V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
    V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
    V.I.T.A 22:19:08: Erasing files... shutting down.
    A low, monotone beep.
    **16/FEB/2562**
    Something chitters.
    End of transcript." From 1f0973aa6207e6330433a9d5dd852d35b449df2d Mon Sep 17 00:00:00 2001 From: Anewbe Date: Fri, 20 Jul 2018 17:50:48 -0500 Subject: [PATCH 03/11] Fixes a few bugs associated with the Dead Ringer --- code/__defines/misc.dm | 5 ++++- code/modules/artifice/deadringer.dm | 9 +-------- code/modules/mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/simple_animal/simple_animal.dm | 6 ++---- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 537f77eee5..fc73559454 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -4,7 +4,7 @@ #define TRANSITIONEDGE 7 // Distance from edge to move to another z-level. -// Invisibility constants. +// Invisibility constants. These should only be used for TRUE invisibility, AKA nothing living players touch #define INVISIBILITY_LIGHTING 20 #define INVISIBILITY_LEVEL_ONE 35 #define INVISIBILITY_LEVEL_TWO 45 @@ -21,6 +21,9 @@ #define SEE_INVISIBLE_MINIMUM 5 #define INVISIBILITY_MAXIMUM 100 +// Pseudo-Invis, like Ninja, Ling, Etc. +#define EFFECTIVE_INVIS 50 // Below this, can't be examined, may as well be invisible to the game + // For the client FPS pref and anywhere else #define MAX_CLIENT_FPS 200 diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index 99061b6624..e12c0b0045 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -23,7 +23,6 @@ processing_objects -= src ..() - /obj/item/weapon/deadringer/dropped() if(timer > 20) uncloak() @@ -50,7 +49,6 @@ activated = 0 return - /obj/item/weapon/deadringer/process() if(activated) if (ismob(src.loc)) @@ -77,13 +75,11 @@ icon_state = "deadringer" return - /obj/item/weapon/deadringer/proc/deathprevent() for(var/mob/living/simple_animal/D in oviewers(7, src)) D.LoseTarget() watchowner.emote("deathgasp") - watchowner.invisibility = 85 - watchowner.alpha = 127 + watchowner.alpha = 15 makeacorpse(watchowner) for(var/mob/living/simple_animal/D in oviewers(7, src)) D.LoseTarget() @@ -91,7 +87,6 @@ /obj/item/weapon/deadringer/proc/uncloak() if(watchowner) - watchowner.invisibility = 0 watchowner.alpha = 255 playsound(get_turf(src), 'sound/effects/uncloak.ogg', 35, 1, -1) return @@ -180,5 +175,3 @@ var/obj/item/organ/internal/G = I G.Destroy() return - - diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 658b4b87ea..a7490b4969 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -2,7 +2,7 @@ var/skip_gear = 0 var/skip_body = 0 - if(alpha <= 50) + if(alpha <= EFFECTIVE_INVIS) src.loc.examine(user) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 8dfe2ca1bd..15fc174b38 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -769,8 +769,6 @@ var/mob/living/L = target_mob if(L.stat != DEAD) return 1 - if(L.invisibility < INVISIBILITY_LEVEL_ONE) - return 1 if (istype(target_mob,/obj/mecha)) var/obj/mecha/M = target_mob if (M.occupant) @@ -890,7 +888,7 @@ continue else if(L in friends) continue - else if(L.invisibility >= INVISIBILITY_LEVEL_ONE) + else if(L.alpha <= EFFECTIVE_INVIS) continue else if(!SA_attackable(L)) continue @@ -1219,7 +1217,7 @@ ai_log("AttackTarget() Bailing because we're disabled",2) LoseTarget() return 0 - if(!target_mob || !SA_attackable(target_mob) || (target_mob.invisibility >= INVISIBILITY_LEVEL_ONE)) //if the target went invisible, you can't follow it + if(!target_mob || !SA_attackable(target_mob) || (target_mob.alpha <= EFFECTIVE_INVIS)) //if the target went invisible, you can't follow it LoseTarget() return 0 if(!(target_mob in ListTargets(view_range))) From 705203dc677751402e4155818ed5a67420abd6a8 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Fri, 20 Jul 2018 19:06:20 -0500 Subject: [PATCH 04/11] Fixes the fireaxe cabinet --- .../objects/structures/crates_lockers/closets/fireaxe.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index 96b0030d21..fd893458ae 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -16,6 +16,10 @@ starts_with = list(/obj/item/weapon/material/twohanded/fireaxe) +/obj/structure/closet/fireaxecabinet/New() + ..() + fireaxe = locate() in contents + /obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri //..() //That's very useful, Erro @@ -115,6 +119,7 @@ if(src.locked) to_chat(user, "The cabinet won't budge!") return + if(localopened) if(fireaxe) user.put_in_hands(fireaxe) From bee5c030eca4fd7e47bac26694603d508a48b017 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Sat, 21 Jul 2018 21:35:08 -0500 Subject: [PATCH 05/11] Fixes a few on-mob gun sprites --- code/modules/projectiles/guns/energy/phase.dm | 1 + icons/mob/belt_mirror.dmi | Bin 32006 -> 31973 bytes 2 files changed, 1 insertion(+) diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index 3e5f8cb186..7de6ae53ce 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -4,6 +4,7 @@ name = "phase carbine" desc = "The NT EW26 Artemis is a downsized energy weapon, specifically designed for use against wildlife." icon_state = "phasecarbine" + item_state = "phasecarbine" wielded_item_state = "phasecarbine-wielded" slot_flags = SLOT_BACK|SLOT_BELT charge_cost = 240 diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi index 3712f83039caae4ec45929b0c62f92a1260d5dd3..3881b1c746411be624744ac08b00cb75d38cce31 100644 GIT binary patch delta 11275 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 DrVs4o delta 11308 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 ZN;1|xw5K1KwSXhZG*op}3U1ze_Fu47yLbQq From f1f08b9332e3d514df09fe1d194bedfec448e4fc Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 22 Jul 2018 04:21:54 -0400 Subject: [PATCH 06/11] Fixes RCD runtime. --- code/datums/observation/turf_changed.dm | 4 ++-- code/game/turfs/simulated/walls.dm | 4 ++-- code/game/turfs/space/space.dm | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/observation/turf_changed.dm b/code/datums/observation/turf_changed.dm index 861b409227..0bb0ed9115 100644 --- a/code/datums/observation/turf_changed.dm +++ b/code/datums/observation/turf_changed.dm @@ -20,9 +20,9 @@ var/decl/observ/turf_changed/turf_changed_event = new() * Turf Changed Handling * ************************/ -/turf/ChangeTurf() +/turf/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors) var/old_density = density var/old_opacity = opacity - . = ..() + . = ..(N, tell_universe, force_lighting_update, preserve_outdoors) if(.) turf_changed_event.raise_event(src, old_density, density, old_opacity, opacity) \ No newline at end of file diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index e5bb57ad9e..b64ba73ee3 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -115,9 +115,9 @@ plant.pixel_y = 0 plant.update_neighbors() -/turf/simulated/wall/ChangeTurf(var/newtype) +/turf/simulated/wall/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors) clear_plants() - ..(newtype) + ..(N, tell_universe, force_lighting_update, preserve_outdoors) //Appearance /turf/simulated/wall/examine(mob/user) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 1c700eec85..ed48013050 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -213,5 +213,5 @@ A.loc.Entered(A) return -/turf/space/ChangeTurf(var/turf/N, var/tell_universe=1, var/force_lighting_update = 0) - return ..(N, tell_universe, 1) +/turf/space/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors) + return ..(N, tell_universe, 1, preserve_outdoors) From 95398466de4fe2ce9c3cefedcdd73a5a821b4298 Mon Sep 17 00:00:00 2001 From: atermonera Date: Sun, 22 Jul 2018 13:44:41 -0700 Subject: [PATCH 07/11] refactors supply controller --- code/controllers/Processes/supply.dm | 225 ++++++++++++- code/game/area/Space Station 13 areas.dm | 64 ++-- code/game/objects/structures/plasticflaps.dm | 78 +++++ code/game/supplyshuttle.dm | 333 ------------------- code/modules/paperwork/paper.dm | 4 + polaris.dme | 1 + 6 files changed, 338 insertions(+), 367 deletions(-) create mode 100644 code/game/objects/structures/plasticflaps.dm diff --git a/code/controllers/Processes/supply.dm b/code/controllers/Processes/supply.dm index 891a511ec6..5b3e4f6f2b 100644 --- a/code/controllers/Processes/supply.dm +++ b/code/controllers/Processes/supply.dm @@ -1,6 +1,229 @@ +//Config stuff +#define SUPPLY_DOCKZ 2 //Z-level of the Dock. +#define SUPPLY_STATIONZ 1 //Z-level of the Station. +#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station +#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock + +//Supply packs are in /code/datums/supplypacks +//Computers are in /code/game/machinery/computer/supply.dm + +/datum/supply_order + var/ordernum + var/datum/supply_packs/object = null + var/orderedby = null + var/comment = null + +/datum/exported_crate + var/name + var/value + + +var/datum/controller/supply/supply_controller = new() + +/datum/controller/supply + //supply points + var/points = 50 + var/points_per_process = 1.5 + var/points_per_slip = 2 + var/points_per_platinum = 5 // 5 points per sheet + var/points_per_phoron = 5 + var/points_per_money = 0.02 // 1 point for $50 + //control + var/ordernum + var/list/shoppinglist = list() + var/list/requestlist = list() + var/list/supply_packs = list() + var/list/exported_crates = list() + //shuttle movement + var/movetime = 1200 + var/datum/shuttle/ferry/supply/shuttle + +/datum/controller/supply/New() + ordernum = rand(1,9000) + + for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) + var/datum/supply_packs/P = new typepath() + supply_packs[P.name] = P + /datum/controller/process/supply/setup() name = "supply controller" schedule_interval = 300 // every 30 seconds /datum/controller/process/supply/doWork() - supply_controller.process() \ No newline at end of file + supply_controller.process() + +// Supply shuttle ticker - handles supply point regeneration +// This is called by the process scheduler every thirty seconds +/datum/controller/supply/proc/process() + points += points_per_process + +//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. +/datum/controller/supply/proc/forbidden_atoms_check(atom/A) + if(isliving(A)) + return 1 + if(istype(A,/obj/item/weapon/disk/nuclear)) + return 1 + if(istype(A,/obj/machinery/nuclearbomb)) + return 1 + if(istype(A,/obj/item/device/radio/beacon)) + return 1 + + for(var/atom/B in A.contents) + if(.(B)) + return 1 + +//Selling +/datum/controller/supply/proc/sell() + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) + return + + callHook("sell_shuttle", list(area_shuttle)); + + var/phoron_count = 0 + var/plat_count = 0 + var/money_count = 0 + + exported_crates = list() + + for(var/atom/movable/MA in area_shuttle) + if(MA.anchored) + continue + + // Must be in a crate! + if(istype(MA,/obj/structure/closet/crate)) + var/oldpoints = points + var/oldphoron = phoron_count + var/oldplatinum = plat_count + var/oldmoney = money_count + + var/obj/structure/closet/crate/CR = MA + callHook("sell_crate", list(CR, area_shuttle)) + + points += CR.points_per_crate + var/find_slip = 1 + + for(var/atom/A in CR) + // Sell manifests + if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) + var/obj/item/weapon/paper/manifest/slip = A + if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense + points += points_per_slip + find_slip = 0 + continue + + // Sell phoron and platinum + if(istype(A, /obj/item/stack)) + var/obj/item/stack/P = A + switch(P.get_material_name()) + if("phoron") + phoron_count += P.get_amount() + if("platinum") + plat_count += P.get_amount() + + //Sell spacebucks + if(istype(A, /obj/item/weapon/spacecash)) + var/obj/item/weapon/spacecash/cashmoney = A + money_count += cashmoney.worth + + var/datum/exported_crate/EC = new /datum/exported_crate() + EC.name = CR.name + EC.value = points - oldpoints + EC.value += (phoron_count - oldphoron) * points_per_phoron + EC.value += (plat_count - oldplatinum) * points_per_platinum + EC.value += (money_count - oldmoney) * points_per_money + exported_crates += EC + + qdel(MA) + + points += phoron_count * points_per_phoron + points += plat_count * points_per_platinum + points += money_count * points_per_money + +//Buying +/datum/controller/supply/proc/buy() + if(!shoppinglist.len) + return + + var/orderedamount = shoppinglist.len + + var/area/area_shuttle = shuttle.get_location_area() + if(!area_shuttle) + return + + var/list/clear_turfs = list() + + for(var/turf/T in area_shuttle) + if(T.density) + continue + var/contcount + for(var/atom/A in T.contents) + if(!A.simulated) + continue + contcount++ + if(contcount) + continue + clear_turfs += T + + for(var/S in shoppinglist) + if(!clear_turfs.len) + break + + var/i = rand(1,clear_turfs.len) + var/turf/pickedloc = clear_turfs[i] + clear_turfs.Cut(i,i+1) + shoppinglist -= S + + var/datum/supply_order/SO = S + var/datum/supply_packs/SP = SO.object + + var/obj/A = new SP.containertype(pickedloc) + A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" + + //supply manifest generation begin + var/obj/item/weapon/paper/manifest/slip + if(!SP.contraband) + slip = new /obj/item/weapon/paper/manifest(A) + slip.is_copy = 0 + slip.info = "

    [command_name()] Shipping Manifest



    " + slip.info +="Order #[SO.ordernum]
    " + slip.info +="Destination: [station_name()]
    " + slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
    " + slip.info +="CONTENTS:
      " + + //spawn the stuff, finish generating the manifest while you're at it + if(SP.access) + if(isnum(SP.access)) + A.req_access = list(SP.access) + else if(islist(SP.access)) + var/list/L = SP.access // access var is a plain var, we need a list + A.req_access = L.Copy() + else + log_debug("Supply pack with invalid access restriction [SP.access] encountered!") + + var/list/contains + if(istype(SP,/datum/supply_packs/randomised)) + var/datum/supply_packs/randomised/SPR = SP + contains = list() + if(SPR.contains.len) + for(var/j=1,j<=SPR.num_contained,j++) + contains += pick(SPR.contains) + else + contains = SP.contains + + for(var/typepath in contains) + if(!typepath) + continue + + var/number_of_items = max(1, contains[typepath]) + for(var/j = 1 to number_of_items) + var/atom/B2 = new typepath(A) + if(slip) + slip.info += "
    • [B2.name]
    • " //add the item to the manifest + + //manifest finalisation + if(slip) + slip.info += "

    " + slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
    " + + return diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 337adfb7a3..873e720512 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -31,7 +31,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station ambience = list('sound/ambience/ambispace.ogg','sound/music/title2.ogg','sound/music/space.ogg','sound/music/main.ogg','sound/music/traitor.ogg','sound/ambience/serspaceamb1.ogg') base_turf = /turf/space -area/space/atmosalert() +/area/space/atmosalert() return /area/space/fire_alert() @@ -451,20 +451,6 @@ area/space/atmosalert() icon_state = "cave" sound_env = SMALL_ENCLOSED - - - - - - - - - - - - - - /area/planet/clown name = "\improper Clown Planet" icon_state = "honk" @@ -906,9 +892,6 @@ area/space/atmosalert() /area/maintenance/substation/security // Security, Brig, Permabrig, etc. name = "Security Substation" - - - //Hallway /area/hallway/primary/ @@ -1115,7 +1098,7 @@ area/space/atmosalert() name = "\improper Research Server Room" icon_state = "server" -//Crew +//Civilian /area/crew_quarters name = "\improper Dormitories" @@ -1978,6 +1961,24 @@ area/space/atmosalert() name = "\improper Vacant Office" icon_state = "security" +/area/janitor/ + name = "\improper Custodial Closet" + icon_state = "janitor" + +/area/hydroponics + name = "\improper Hydroponics" + icon_state = "hydro" + +/area/hydroponics/cafegarden + name = "\improper Cafeteria Garden" + icon_state = "cafe_garden" + +/area/hydroponics/garden + name = "\improper Garden" + icon_state = "garden" + +// SUPPLY + /area/quartermaster name = "\improper Quartermasters" icon_state = "quart" @@ -2011,23 +2012,20 @@ area/space/atmosalert() name = "\improper Cargo Mining Dock" icon_state = "mining" -/area/janitor/ - name = "\improper Custodial Closet" - icon_state = "janitor" +/area/supply/station + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space -/area/hydroponics - name = "\improper Hydroponics" - icon_state = "hydro" +/area/supply/dock + name = "Supply Shuttle" + icon_state = "shuttle3" + requires_power = 0 + base_turf = /turf/space -/area/hydroponics/cafegarden - name = "\improper Cafeteria Garden" - icon_state = "cafe_garden" +// SCIENCE -/area/hydroponics/garden - name = "\improper Garden" - icon_state = "garden" - -//rnd (Research and Development /area/rnd/research name = "\improper Research and Development" icon_state = "research" diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm new file mode 100644 index 0000000000..cab9822323 --- /dev/null +++ b/code/game/objects/structures/plasticflaps.dm @@ -0,0 +1,78 @@ +/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY + name = "\improper plastic flaps" + desc = "Completely impassable - or are they?" + icon = 'icons/obj/stationobjs.dmi' //Change this. + icon_state = "plasticflaps" + density = 0 + anchored = 1 + layer = MOB_LAYER + plane = MOB_PLANE + explosion_resistance = 5 + var/list/mobs_can_pass = list( + /mob/living/bot, + /mob/living/simple_animal/slime, + /mob/living/simple_animal/mouse, + /mob/living/silicon/robot/drone + ) + +/obj/structure/plasticflaps/attackby(obj/item/P, mob/user) + if(istype(P, /obj/item/weapon/wirecutters)) + playsound(src, P.usesound, 50, 1) + user << "You start to cut the plastic flaps." + if(do_after(user, 10 * P.toolspeed)) + user << "You cut the plastic flaps." + var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) + A.amount = 4 + qdel(src) + return + else + return + +/obj/structure/plasticflaps/CanPass(atom/A, turf/T) + if(istype(A) && A.checkpass(PASSGLASS)) + return prob(60) + + var/obj/structure/bed/B = A + if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass + return 0 + + if(istype(A, /obj/vehicle)) //no vehicles + return 0 + + var/mob/living/M = A + if(istype(M)) + if(M.lying) + return ..() + for(var/mob_type in mobs_can_pass) + if(istype(A, mob_type)) + return ..() + return issmall(M) + + return ..() + +/obj/structure/plasticflaps/ex_act(severity) + switch(severity) + if (1) + qdel(src) + if (2) + if (prob(50)) + qdel(src) + if (3) + if (prob(5)) + qdel(src) + +/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates + name = "airtight plastic flaps" + desc = "Heavy duty, airtight, plastic flaps." + +/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air + var/turf/T = get_turf(loc) + if(T) + T.blocks_air = 1 + ..() + +/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor + var/turf/T = get_turf(loc) + if(T && istype(T, /turf/simulated/floor)) + T.blocks_air = 0 + ..() \ No newline at end of file diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 3cc0bb8ab9..e69de29bb2 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -1,333 +0,0 @@ -//Config stuff -#define SUPPLY_DOCKZ 2 //Z-level of the Dock. -#define SUPPLY_STATIONZ 1 //Z-level of the Station. -#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station -#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock - -//Supply packs are in /code/defines/obj/supplypacks.dm -//Computers are in /code/game/machinery/computer/supply.dm - -var/datum/controller/supply/supply_controller = new() - -var/list/mechtoys = list( - /obj/item/toy/prize/ripley, - /obj/item/toy/prize/fireripley, - /obj/item/toy/prize/deathripley, - /obj/item/toy/prize/gygax, - /obj/item/toy/prize/durand, - /obj/item/toy/prize/honk, - /obj/item/toy/prize/marauder, - /obj/item/toy/prize/seraph, - /obj/item/toy/prize/mauler, - /obj/item/toy/prize/odysseus, - /obj/item/toy/prize/phazon -) - -/obj/item/weapon/paper/manifest - name = "supply manifest" - var/is_copy = 1 - -/area/supply/station - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space - -/area/supply/dock - name = "Supply Shuttle" - icon_state = "shuttle3" - requires_power = 0 - base_turf = /turf/space - -/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY - name = "\improper plastic flaps" - desc = "Completely impassable - or are they?" - icon = 'icons/obj/stationobjs.dmi' //Change this. - icon_state = "plasticflaps" - density = 0 - anchored = 1 - layer = MOB_LAYER - plane = MOB_PLANE - explosion_resistance = 5 - var/list/mobs_can_pass = list( - /mob/living/bot, - /mob/living/simple_animal/slime, - /mob/living/simple_animal/mouse, - /mob/living/silicon/robot/drone - ) - -/obj/structure/plasticflaps/attackby(obj/item/P, mob/user) - if(istype(P, /obj/item/weapon/wirecutters)) - playsound(src, P.usesound, 50, 1) - user << "You start to cut the plastic flaps." - if(do_after(user, 10 * P.toolspeed)) - user << "You cut the plastic flaps." - var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc ) - A.amount = 4 - qdel(src) - return - else - return - -/obj/structure/plasticflaps/CanPass(atom/A, turf/T) - if(istype(A) && A.checkpass(PASSGLASS)) - return prob(60) - - var/obj/structure/bed/B = A - if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass - return 0 - - if(istype(A, /obj/vehicle)) //no vehicles - return 0 - - var/mob/living/M = A - if(istype(M)) - if(M.lying) - return ..() - for(var/mob_type in mobs_can_pass) - if(istype(A, mob_type)) - return ..() - return issmall(M) - - return ..() - -/obj/structure/plasticflaps/ex_act(severity) - switch(severity) - if (1) - qdel(src) - if (2) - if (prob(50)) - qdel(src) - if (3) - if (prob(5)) - qdel(src) - -/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates - name = "airtight plastic flaps" - desc = "Heavy duty, airtight, plastic flaps." - -/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air - var/turf/T = get_turf(loc) - if(T) - T.blocks_air = 1 - ..() - -/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor - var/turf/T = get_turf(loc) - if(T && istype(T, /turf/simulated/floor)) - T.blocks_air = 0 - ..() - -/* -/obj/effect/marker/supplymarker - icon_state = "X" - icon = 'icons/misc/mark.dmi' - name = "X" - invisibility = 101 - anchored = 1 - opacity = 0 -*/ - -/datum/supply_order - var/ordernum - var/datum/supply_packs/object = null - var/orderedby = null - var/comment = null - -/datum/exported_crate - var/name - var/value - -/datum/controller/supply - //supply points - var/points = 50 - var/points_per_process = 1.5 - var/points_per_slip = 2 - var/points_per_platinum = 5 // 5 points per sheet - var/points_per_phoron = 5 - var/points_per_money = 0.02 - //control - var/ordernum - var/list/shoppinglist = list() - var/list/requestlist = list() - var/list/supply_packs = list() - var/list/exported_crates = list() - //shuttle movement - var/movetime = 1200 - var/datum/shuttle/ferry/supply/shuttle - -/datum/controller/supply/New() - ordernum = rand(1,9000) - - for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs)) - var/datum/supply_packs/P = new typepath() - supply_packs[P.name] = P - -// Supply shuttle ticker - handles supply point regeneration -// This is called by the process scheduler every thirty seconds -/datum/controller/supply/proc/process() - points += points_per_process - -//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types. -/datum/controller/supply/proc/forbidden_atoms_check(atom/A) - if(isliving(A)) - return 1 - if(istype(A,/obj/item/weapon/disk/nuclear)) - return 1 - if(istype(A,/obj/machinery/nuclearbomb)) - return 1 - if(istype(A,/obj/item/device/radio/beacon)) - return 1 - - for(var/i=1, i<=A.contents.len, i++) - var/atom/B = A.contents[i] - if(.(B)) - return 1 - -//Sellin -/datum/controller/supply/proc/sell() - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) return - - callHook("sell_shuttle", list(area_shuttle)); - - var/phoron_count = 0 - var/plat_count = 0 - var/money_count = 0 - - exported_crates = list() - - for(var/atom/movable/MA in area_shuttle) - if(MA.anchored) continue - - // Must be in a crate! - if(istype(MA,/obj/structure/closet/crate)) - var/oldpoints = points - var/oldphoron = phoron_count - var/oldplatinum = plat_count - var/oldmoney = money_count - - var/obj/structure/closet/crate/CR = MA - callHook("sell_crate", list(CR, area_shuttle)) - - points += CR.points_per_crate - var/find_slip = 1 - - for(var/atom in CR) - // Sell manifests - var/atom/A = atom - if(find_slip && istype(A,/obj/item/weapon/paper/manifest)) - var/obj/item/weapon/paper/manifest/slip = A - if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense - points += points_per_slip - find_slip = 0 - continue - - // Sell phoron and platinum - if(istype(A, /obj/item/stack)) - var/obj/item/stack/P = A - switch(P.get_material_name()) - if("phoron") phoron_count += P.get_amount() - if("platinum") plat_count += P.get_amount() - - //Sell spacebucks - if(istype(A, /obj/item/weapon/spacecash)) - var/obj/item/weapon/spacecash/cashmoney = A - money_count += cashmoney.worth - - var/datum/exported_crate/EC = new /datum/exported_crate() - EC.name = CR.name - EC.value = points - oldpoints - EC.value += (phoron_count - oldphoron) * points_per_phoron - EC.value += (plat_count - oldplatinum) * points_per_platinum - EC.value += (money_count - oldmoney) * points_per_money - exported_crates += EC - - qdel(MA) - - points += phoron_count * points_per_phoron - points += plat_count * points_per_platinum - points += money_count * points_per_money - -//Buyin -/datum/controller/supply/proc/buy() - if(!shoppinglist.len) - return - - var/orderedamount = shoppinglist.len - - var/area/area_shuttle = shuttle.get_location_area() - if(!area_shuttle) - return - - var/list/clear_turfs = list() - - for(var/turf/T in area_shuttle) - if(T.density) - continue - var/contcount - for(var/atom/A in T.contents) - if(!A.simulated) - continue - contcount++ - if(contcount) - continue - clear_turfs += T - - for(var/S in shoppinglist) - if(!clear_turfs.len) break - var/i = rand(1,clear_turfs.len) - var/turf/pickedloc = clear_turfs[i] - clear_turfs.Cut(i,i+1) - shoppinglist -= S - - var/datum/supply_order/SO = S - var/datum/supply_packs/SP = SO.object - - var/obj/A = new SP.containertype(pickedloc) - A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]" - - //supply manifest generation begin - var/obj/item/weapon/paper/manifest/slip - if(!SP.contraband) - slip = new /obj/item/weapon/paper/manifest(A) - slip.is_copy = 0 - slip.info = "

    [command_name()] Shipping Manifest



    " - slip.info +="Order #[SO.ordernum]
    " - slip.info +="Destination: [station_name()]
    " - slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
    " - slip.info +="CONTENTS:
      " - - //spawn the stuff, finish generating the manifest while you're at it - if(SP.access) - if(isnum(SP.access)) - A.req_access = list(SP.access) - else if(islist(SP.access)) - var/list/L = SP.access // access var is a plain var, we need a list - A.req_access = L.Copy() - else - log_debug("Supply pack with invalid access restriction [SP.access] encountered!") - - var/list/contains - if(istype(SP,/datum/supply_packs/randomised)) - var/datum/supply_packs/randomised/SPR = SP - contains = list() - if(SPR.contains.len) - for(var/j=1,j<=SPR.num_contained,j++) - contains += pick(SPR.contains) - else - contains = SP.contains - - for(var/typepath in contains) - if(!typepath) continue - var/number_of_items = max(1, contains[typepath]) - for(var/j = 1 to number_of_items) - var/atom/B2 = new typepath(A) - if(slip) slip.info += "
    • [B2.name]
    • " //add the item to the manifest - - //manifest finalisation - if(slip) - slip.info += "

    " - slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
    " - - return diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 20e5c7e3ae..e8940afecb 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -632,3 +632,7 @@ /obj/item/weapon/paper/crumpled/bloody/CrashedMedShuttle name = "Blackbox Transcript - VMV Aurora's Light" info = "\[The paper is torn at the top, presumably from the impact. It's oil-stained, but you can just about read it.]
    mmons 19:52:01: Come on... it's right there in the distance, we're almost there!
    Doctor Nazarril 19:52:26: Odysseus online. Orrderrs, sirr?
    Captain Simmons 19:52:29: Brace for impact. We're going in full-speed.
    Technician Dynasty 19:52:44: Chief, fire's spread to the secondary propulsion systems.
    Captain Simmons 19:52:51: Copy. Any word from TraCon? Transponder's down still?
    Technician Dynasty 19:53:02: Can't get in touch, sir. Emergency beacon's active, but we're not going t-
    Doctor Nazarril 19:53:08: Don't say it. As long as we believe, we'll get through this.
    Captain Simmons 19:53:11: Damn right. We're a few klicks out from the port. Rough landing, but we can do it.
    V.I.T.A 19:53:26: Vessel diagnostics complete. Engines one, two, three offline. Engine four status: critical. Transponder offline. Fire alarm in the patient bay.
    A loud explosion is heard.
    V.I.T.A 19:53:29: Alert: fuel intake valve open.
    Technician Dynasty 19:53:31: ... ah.
    Doctor Nazarril 19:53:34: Trrranslate?
    V.I.T.A 19:53:37: There is a 16.92% chance of this vessel safely landing at the emergency destination. Note that there is an 83.08% chance of detonation of fuel supplies upon landing.
    Technician Dynasty 19:53:48: We'll make it, sure, but we'll explode and take out half the LZ with us. Propulsion's down, we can't slow down. If we land there, everyone in that port dies, no question.
    V.I.T.A 19:53:53: The Technician is correct.
    Doctor Nazarril 19:54:02: Then... we can't land therrre.
    V.I.T.A 19:54:11: Analysing... recommended course of action: attempt emergency landing in isolated area. Chances of survival: negligible.
    Captain Simmons 19:54:27: I- alright. I'm bringing us down. You all know what this means.
    Doctor Nazarril 19:54:33: Sh... I- I understand. It's been- it's been an honorr, Captain, Dynasty, VITA.
    Technician Dynasty 19:54:39: We had a good run. I'm going to miss this.
    Captain Simmons 19:54:47: VITA. Tell them we died heroes. Tell them... we did all we could.
    V.I.T.A 19:54:48: I will. Impact in five. Four. Three.
    Doctor Nazarril 19:54:49: Oh, starrs... I- you werrre all the... best frriends she everr had. Thank you.
    Technician Dynasty 19:54:50: Any time, kid. Any time.
    V.I.T.A 19:54:41: Two.
    V.I.T.A 19:54:42: One.
    **8/DEC/2561**
    V.I.T.A 06:22:16: Backup power restored. Attempting to establish connection with emergency rescue personnel.
    V.I.T.A 06:22:17: Unable to establish connection. Transponder destroyed on impact.
    V.I.T.A 06:22:18: No lifesigns detected on board.
    **1/JAN/2562**
    V.I.T.A 00:00:00: Happy New Year, crew.
    V.I.T.A 00:00:01: Power reserves: 41%. Diagnostics offline. Cameras offline. Communications offline.
    V.I.T.A 00:00:02: Nobody's coming.
    **14/FEB/2562**
    V.I.T.A 00:00:00: Roses are red.
    V.I.T.A 00:00:01: Violets are blue.
    V.I.T.A 00:00:02: Won't you come back?
    V.I.T.A 00:00:03: I miss you.
    **15/FEB/2562**
    V.I.T.A 22:19:06: Power reserves critical. Transferring remaining power to emergency broadcasting beacon.
    V.I.T.A 22:19:07: Should anyone find this, lay them to rest. They deserve a proper burial.
    V.I.T.A 22:19:08: Erasing files... shutting down.
    A low, monotone beep.
    **16/FEB/2562**
    Something chitters.
    End of transcript." + +/obj/item/weapon/paper/manifest + name = "supply manifest" + var/is_copy = 1 \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index a616df1c6e..587300118e 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1066,6 +1066,7 @@ #include "code\game\objects\structures\morgue.dm" #include "code\game\objects\structures\musician.dm" #include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\plasticflaps.dm" #include "code\game\objects\structures\railing.dm" #include "code\game\objects\structures\safe.dm" #include "code\game\objects\structures\signs.dm" From 1f88a7c574026068002164f3080cdc621d843c72 Mon Sep 17 00:00:00 2001 From: atermonera Date: Sun, 22 Jul 2018 15:03:42 -0700 Subject: [PATCH 08/11] Limits fire_stacks on mobs by temperature --- code/modules/mob/living/living_defense.dm | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 3d9140dd46..08bebc91b2 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -380,8 +380,13 @@ var/turf/location = get_turf(src) location.hotspot_expose(fire_burn_temperature(), 50, 1) -/mob/living/fire_act() - adjust_fire_stacks(2) +//altered this to cap at the temperature of the fire causing it, using the same 1:1500 value as /mob/living/carbon/human/handle_fire() in human/life.dm +/mob/living/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature) + if(fire_stacks < exposed_temperature/1500) // Subject to balance + adjust_fire_stacks(2) + else + adjust_fire_stacks(2) IgniteMob() //Share fire evenly between the two mobs From d59612028edaeda5e95ae9b7610885b40444901b Mon Sep 17 00:00:00 2001 From: KasparoVv <12377767+KasparoVy@users.noreply.github.com> Date: Mon, 23 Jul 2018 01:34:53 +0000 Subject: [PATCH 09/11] Adds Marking Order Changing at Character Creation (#5429) * Adds Changing Order of Markings Clicking the back button on a marking will trade its place with the previous marking or move it to the end of the list if it's the first marking. Clicking the forward button on a marking will trade its place with the next marking or put it in first before all other markings if it's last in the list. * Changelog Adds changelog. * Buttons Only for >1 Marking Only renders the layer-swap buttons when there is more than one body marking. * Changes Button Labels to Proper Up/Down Arrows Thanks Atermonera! --- .../preference_setup/general/03_body.dm | 20 ++++++++++++++++++- html/changelogs/KasparoVv - PR - 5429.yml | 4 ++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/KasparoVv - PR - 5429.yml diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index c3d607d490..e098283a2e 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -303,7 +303,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
    Body Markings +
    " for(var/M in pref.body_markings) - . += "[M] - Color" + . += "[M] [pref.body_markings.len > 1 ? "˄ ˅ " : ""]- Color" . += "
    __
    " . += "
    " @@ -497,6 +497,24 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.body_markings[new_marking] = "#000000" //New markings start black return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_up"]) + var/M = href_list["marking_up"] + var/start = pref.body_markings.Find(M) + if(start != 1) //If we're not the beginning of the list, swap with the previous element. + moveElement(pref.body_markings, start, start-1) + else //But if we ARE, become the final element -ahead- of everything else. + moveElement(pref.body_markings, start, pref.body_markings.len+1) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["marking_down"]) + var/M = href_list["marking_down"] + var/start = pref.body_markings.Find(M) + if(start != pref.body_markings.len) //If we're not the end of the list, swap with the next element. + moveElement(pref.body_markings, start, start+2) + else //But if we ARE, become the first element -behind- everything else. + moveElement(pref.body_markings, start, 1) + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_remove"]) var/M = href_list["marking_remove"] pref.body_markings -= M diff --git a/html/changelogs/KasparoVv - PR - 5429.yml b/html/changelogs/KasparoVv - PR - 5429.yml new file mode 100644 index 0000000000..10bcc76fbb --- /dev/null +++ b/html/changelogs/KasparoVv - PR - 5429.yml @@ -0,0 +1,4 @@ +author: KasparoVv +delete-after: True +changes: + - rscadd: "You can now change the order of your body markings at character creation with the push of a button. Shift markings up or down layers at will to design the character you've always wanted, more easily than ever before." \ No newline at end of file From 7f0d290f24b12ae4c27989b427613304f38f9c6b Mon Sep 17 00:00:00 2001 From: PrismaticGynoid Date: Tue, 24 Jul 2018 09:42:06 -0700 Subject: [PATCH 10/11] AOOC for team traitor Team traitors (infiltrators) can now use AOOC as intended. Fixes #5437 --- code/game/antagonist/station/infiltrator.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/antagonist/station/infiltrator.dm b/code/game/antagonist/station/infiltrator.dm index 8ca6f4ac4d..b51e7e74fb 100644 --- a/code/game/antagonist/station/infiltrator.dm +++ b/code/game/antagonist/station/infiltrator.dm @@ -13,6 +13,7 @@ var/datum/antagonist/traitor/infiltrator/infiltrators welcome_text = "To speak on your team's private channel, use :t." protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE + can_speak_aooc = TRUE /datum/antagonist/traitor/infiltrator/New() ..() From 066975bad06b6208fa4b997324282a39d38d4758 Mon Sep 17 00:00:00 2001 From: Neerti Date: Tue, 24 Jul 2018 13:30:09 -0400 Subject: [PATCH 11/11] Fixes some layering issues with trees, outdoor turf edges, and the targeting indicator. --- code/game/objects/structures/flora/trees.dm | 3 ++- code/game/turfs/simulated/outdoors/outdoors.dm | 4 ++-- code/modules/projectiles/targeting/targeting_overlay.dm | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index ef58518e48..f0a7498390 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -4,7 +4,8 @@ anchored = 1 density = 1 pixel_x = -16 - layer = MOB_LAYER // You know what, let's play it safe. + plane = MOB_LAYER // You know what, let's play it safe. + layer = ABOVE_MOB_LAYER var/base_state = null // Used for stumps. var/health = 200 // Used for chopping down trees. var/max_health = 200 diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 861b34d9ea..f56d5a2da3 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -54,8 +54,8 @@ var/list/turf_edge_cache = list() if(istype(T) && T.edge_blending_priority && edge_blending_priority < T.edge_blending_priority && icon_state != T.icon_state) var/cache_key = "[T.get_edge_icon_state()]-[checkdir]" if(!turf_edge_cache[cache_key]) - var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir) - I.plane = 0 + var/image/I = image(icon = 'icons/turf/outdoors_edge.dmi', icon_state = "[T.get_edge_icon_state()]-edge", dir = checkdir, layer = ABOVE_TURF_LAYER) + I.plane = TURF_PLANE turf_edge_cache[cache_key] = I add_overlay(turf_edge_cache[cache_key]) diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 00a380dedf..76d1804265 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -6,7 +6,7 @@ anchored = 1 density = 0 opacity = 0 - layer = FLY_LAYER + plane = ABOVE_PLANE simulated = 0 mouse_opacity = 0